import tensorflow as tf
from tensorflow import keras
import cv2
import numpy as np
import glob
import os
import sys
import imutils
import random
import pymssql
import pyodbc
from PIL import Image, ImageTk
from tensorflow.keras import losses,layers,optimizers
from tensorflow.keras.callbacks import EarlyStopping
from PyQt5.QtWidgets import QApplication, QMainWindow, QDockWidget, QTextEdit, QLabel, QWidget, QPushButton, QVBoxLayout, QListWidget, QLineEdit, QStyleFactory
from PyQt5.QtCore import Qt, QTimer
from PyQt5 import QtCore, QtGui, QtWidgets, uic
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtSql import QSqlDatabase , QSqlQuery
from pathlib import Path, PureWindowsPath
QApplication.setStyle(QStyleFactory.create('Fusion'))
#定义目标文件夹为全局变量,给各个函数进行调用
targetfilePath = ''
isPredicting = True
temp = ''
count = 0
model = object
trainingfilePath = ''
mynet = object
Camera_status = False
saveImage = object
#---------------------------------------------------------------------------------训练模块---------------------------------------------------------------------------------------------------#
#训练参数设置
tf.random.set_seed(2222)
np.random.seed(2222)
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
assert tf.__version__.startswith('2.')
#预处理训练图片
def preprocessTraining(x,y):
x = tf.image.resize(x,[244,244])
x = tf.image.random_flip_left_right(x)
x = tf.image.random_crop(x,[224,224,3])
x = tf.cast(x, dtype=tf.float32) / 255.
x = normalize(x)
y = tf.convert_to_tensor(y)
y = tf.one_hot(y, depth=5)
return x,y
#加载训练图片以及Resize转换
def Data_Generation(filePath):
X_data = []
Y_data = []
path_data = []
path_label = []
files = os.listdir(filePath)
#循环加载文件
for file in files:
if os.path.exists(trainingfilePath + '\\' + file+ '\\') == True:
for path in glob.glob(trainingfilePath + '\\' + file + '\*.*'):
if 'jpg' or 'png' or 'jpeg' in path:
path_data.append(path)
else:
for path in glob.glob(trainingfilePath + '\*.*'):
if 'jpg' or 'png' or 'jpeg' in path:
path_data.append(path)
#打乱数据
random.shuffle(path_data)
#按照图片分类进行label标记
for paths in path_data:
#print(paths)
if 'Normal' in paths:
path_label.append(0)
elif 'BKG' in paths:
path_label.append(1)
img = cv2.imdecode(np.fromfile(paths, dtype=np.uint8), -1)
#img = cv2.imread(paths)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
img = cv2.resize(img,(224,224))
X_data.append(img)
L = len(path_data)
Y_data = path_label
X_data = np.array(X_data,dtype=float)
Y_data = np.array(Y_data,dtype='uint8')
X_train = X_data[0:int(L*0.6)]
Y_train = Y_data[0:int(L*0.6)]
X_valid = X_data[int(L*0.6):int(L*0.8)]
Y_valid = Y_data[int(L*0.6):int(L*0.8)]
X_test = X_data[int(L*0.8):]
Y_test = Y_data[int(L*0.8):]
return X_train,Y_train,X_valid,Y_valid,X_test,Y_test,L
#获取训练集,测试集
def trainingModel(self):
#文件加载路径
trainingfilePath = targetfilePath
if len(trainingfilePath) == 0:
self.logText.setText('请先选择文件夹再开始训练!')
return
else:
self.logText.setText('开始训练!')
X_train,Y_train,X_valid,Y_valid,X_test,Y_test,L = Data_Generation(trainingfilePath)
batchsz = 32
#print(shape(X_data), shape(Y_data))
train_db = tf.data.Dataset.from_tensor_slices((X_train,Y_train))
train_db = train_db.shuffle(10000).map(preprocessTraining).batch(batchsz)
valid_db = tf.data.Dataset.from_tensor_slices((X_valid,Y_valid))
valid_db = valid_db.map(preprocessTraining).batch(batchsz)
test_db = tf.data.Dataset.from_tensor_slices((X_test,Y_test))
test_db = test_db.map(preprocessTraining).batch(batchsz)
#这里使用了自带的DenseNet121网络 你也可以用keras.Sequential DIY模型
net = keras.applications.DenseNet121(weights='imagenet',include_top=False,pooling='max')
net.trainable = False
global mynet
mynet = keras.Sequential([
net,
layers.Dense(1024,activation='relu'),
layers.BatchNormalization(), #BN层 标准化数据
layers.Dropout(rate=0.2),
layers.Dense(5)])
mynet.build(input_shape=(4,224,224,3))
mynet.summary()
#防止过拟合
early_stopping = EarlyStopping(monitor='val_accuracy', min_delta=0.01, patience=3)
mynet.compile(optimizer=optimizers.Adam(lr=1e-3), loss=losses.CategoricalCrossentropy(from_logits=True), metrics=['accuracy'])
history = mynet.fit(train_db, validation_data=valid_db, validation_freq=1, epochs=50, callbacks=[early_stopping])
history = history.history
mynet.evaluate(test_db)
self.logText.setText('训练完成!')
#保存模型
def saveModel(self):
FolderName = QtWidgets.QFileDialog.getExistingDirectory()
if '/' in FolderName :
# 用\替换/,注意'\\'的用法,
FolderName.replace('/', '\\')
#训练结束以后保存mmodel文件到本地方便做图片分类的时候直接调用
#保存model成 .h5格式 里面包含了模型结构和训练好的模型参数
if len(FolderName) == 0:
self.logText.setText('未保存模型文件!')
else:
mynet.save(FolderName + '\densenet.h5')
self.logText.setText('模型文件已保存!')
#---------------------------------------------------------------------------------识别模块---------------------------------------------------------------------------------------------------#
#图片归一化
def normalize(x):
img_mean = tf.constant([0.485, 0.456, 0.406])
img_std = tf.constant([0.229, 0.224, 0.225])
x = (x - img_mean)/img_std
return x
#初始化图片
def preprocess(x):
x = tf.expand_dims(x,axis=0)
x = tf.cast(x, dtype=tf.float32) / 255.
x = normalize(x)
return x
#加载模型
def loadModel(self):
File = QtWidgets.QFileDialog.getOpenFileName()
modelFile = File[0]
if '/' in modelFile:
# 用\替换/,注意'\\'的用法,
modelFile.replace('/', '\\')
if len(modelFile) == 0:
self.logText.setText('未加载模型文件!')
else:
self.modelSelectText.setText(modelFile)
network = keras.models.load_model(modelFile)
network.summary()
self.logText.setText('检测模型加载成功:' + modelFile)
global model
model = network
#打开目标文件夹
def openFileFolder(self):
FolderName = QtWidgets.QFileDialog.getExistingDirectory()
if '/' in FolderName :
# 用\替换/,注意'\\'的用法,
FolderName.replace('/', '\\')
if len(FolderName) == 0 :
self.logText.setText('未选择文件夹路径!')
else :
#print('目标文件夹:',FolderName)
self.fileSelectText.setText(FolderName)
self.logText.setText('目标文件夹:' + FolderName)
#全局定义目标文件夹路径,更新路径
global targetfilePath
targetfilePath = FolderName
#图片识别主函数入口
def prediction(self, file, model):
global temp
global count
#\\mysw1pda2002\PDASImages7\101\2023_06\MA836103\MRS1\0981_MRS1_1_MA836103_0161_102_0362_0007_1.PNG
if model == object:
self.logText.setText('未加载模型!')
return
label = ['Normal','BKG']
image = cv2.imdecode(np.fromfile(file, dtype=np.uint8), -1)
img = image.copy()
img = cv2.resize(img,(224,224))
img = cv2.cvtCo
Python image classify code
需积分: 0 140 浏览量
更新于2023-06-15
收藏 24KB RAR 举报
在IT领域,图像识别是一项关键的技术,特别是在人工智能和机器学习的应用中。本项目"Python image classify code"聚焦于使用Python编程语言以及TensorFlow框架进行图像分类。TensorFlow是由Google开发的一个开源库,它广泛用于机器学习和深度学习任务,包括图像识别。
Python是目前最流行的编程语言之一,尤其在数据科学和AI领域。它的简洁语法和丰富的库生态系统使得它成为开发机器学习模型的理想选择。在图像识别方面,Python结合TensorFlow可以创建强大的神经网络模型,如卷积神经网络(CNNs),这些模型能够理解和解析图像内容。
在压缩包中,我们看到三个文件名:"AST Stain Classify Tool"、"Image Classify Tool"和"Water Stain Classify Tool"。这可能表示项目包含了针对特定类型图像识别的工具或模型。例如:
1. "AST Stain Classify Tool":AST可能是指一种特定的染色技术或在医学图像分析中使用的术语,如组织切片的酸性磷酸酶染色。这个工具可能是专门设计来识别和分类这类图像的。
2. "Image Classify Tool":这是一个通用的图像分类工具,可能包含了一个基础的CNN模型,可以对各种类型的图像进行分类。
3. "Water Stain Classify Tool":这个工具可能专注于识别和区分水渍或潮湿相关的图像,可能应用于建筑维护、灾害评估或者环境监测等领域。
在实际应用中,这些工具的开发可能包括以下步骤:
- 数据收集:需要大量标记的图像数据集,每个图像都已知其对应的类别。
- 数据预处理:包括调整图像尺寸、归一化像素值、数据增强等,以提高模型的泛化能力。
- 构建模型:使用TensorFlow构建CNN模型,可能包括多层卷积、池化和全连接层,以及适当的激活函数(如ReLU)。
- 训练与优化:通过反向传播和梯度下降法调整模型参数,以最小化预测错误。可能会使用Adam优化器和交叉熵损失函数。
- 模型评估:在验证集上测试模型性能,衡量指标如准确率、精确率、召回率和F1分数。
- 模型部署:将训练好的模型封装成工具或服务,供用户使用。
"Python image classify code"项目提供了基于Python和TensorFlow的图像识别解决方案,覆盖了多种特定场景的图像分类任务。这些工具的实现不仅展示了深度学习在图像识别领域的强大能力,也反映了Python在数据科学和AI领域的广泛应用。
JL295235943
- 粉丝: 0
- 资源: 25
最新资源
- 自考02197概率论与数理统计(二)试卷及答案解释2016-2021
- java毕设项目之游戏分享网站lw(完整前后端+说明文档+mysql).zip
- java毕设项目之ssm助学贷款+jsp(完整前后端+说明文档+mysql+lw).zip
- IBM Instana应用性能监视.pptx
- webview+H5来实现的android短视频(短剧)音视频播放依赖控件资源
- 黑马最新Hive存储压缩与优化课程总结
- 商城系统项目源代码全套技术资料.zip
- 番茄图像目标检测数据【已标注,约4,300张数据,YOLO 标注格式】
- 校园生活相关项目源代码全套技术资料.zip
- C语言上机实验_1.pptx
- 基于遗传算法求解TSP问题的研究 50个样本点
- 基于XGBoost的振动数据预警模型与参数优化技术-构建一个基于XGBoost的振动信息数据集预警模型 首先引入算法实现动态阈值设置,然后进行参数优化
- sublimeText 4
- 西红柿叶片缺陷分类数据集【已标注,约500张数据】
- 自考00023《高等数学(工本)》试题及答案及复习资料
- 智能点阵笔项目源代码全套技术资料.zip