当前位置:   article > 正文

图片分类的入门:二分类_图像二分类

图像二分类

作为深度学习的入门,先来讲一下简单的猫狗分类。

深度学习:训练数据集,让计算机精准识别这个是猫还是狗。

猫狗识别:

1、数据预处理:准备训练集和测试集

2、卷积神经网络模型:构建网络架构

3、数据增强:图像数据增强方法与效果

4、迁移学习

准备数据

       在当前py文件所在位置创建一个data文件夹,里面放入train、test俩个子文件夹,train和test中放入收集到的猫和狗图片,注意图片大小要归一化,这里将其改为64*64。

  1. #数据所在文件夹
  2. base_dir = './data'
  3. train_dir = os.path.join(base_dir,'train')
  4. test_dir = os.path.join(base_dir,'test')
  5. #训练集
  6. train_cats_dir = os.path.join(train_dir,'cats')
  7. train_dogs_dir = os.path.join(train_dir,'dogs')
  8. #测试集
  9. test_cats_dir = os.path.join(test_dir,'cats')
  10. test_dogs_dir = os.path.join(test_dir,'dogs')

构建卷积神经网络模型

  1. model = Sequential()
  2. model.add(Conv2D(filters=6, kernel_size=(5, 5), padding='same', input_shape=(64643), activation='tanh'))
  3. model.add(MaxPooling2D(pool_size=(2, 2)))
  4. model.add(Conv2D(filters=16, kernel_size=(5, 5), padding='same', activation='tanh'))
  5. model.add(MaxPooling2D(pool_size=(2, 2)))
  6. model.add(Flatten()) #为全连接层准备,把特征图拉成一个向量
  7. model.add(Dense(120, activation='tanh'))
  8. model.add(Dense(84, activation='tanh'))
  9. model.add(Dense(1, activation='sigmoid'))
  10. sgd = SGD(lr=0.001, decay=1e-6, momentum=0.9, nesterov=True)

filiters:特征图的个数,filiters个不同的卷积核

kernel_size:卷积核尺寸

padding:填充,same保证输出特征图大小和输入相等

strides:步长,不写默认为1

输入model.summary()可以查看模型参数

卷积核的第三个维度和输入图像的第三个维度一致。

灰度图为1,RGB图像为3。

配置训练器

model.compile(optimizer=sgd, loss='binary_crossentropy', metrics=['accuracy'])

数据预处理

读入的数据自动转化为tensor(float32)格式,分别准备训练和测试。

图像数据归一化(0-1),这边类似为手写数据集的预处理。

  1. train_datagen = ImageDataGenerator(rescale=1./255)
  2. test_datagen = ImageDataGenerator(rescale=1./255)
  3. train_generator = train_datagen.flow_from_directory(
  4. train_dir, #文件夹路径
  5. target_size = (64,64), #指定resize成的大小
  6. batch_size = 32,
  7. class_mode='binary')
  8. test_generator = test_datagen.flow_from_directory(
  9. test_dir, #文件夹路径
  10. target_size = (64,64), #指定resize成的大小
  11. batch_size = 32,
  12. class_mode='binary')

图像生成器:告诉机器到哪里去一个batch一个batch的读取数据。

训练网络模型

fit_generator相当于一个生成器,动态产生所需要的batch数据

steps_per_epoch相当于给定一个停止条件。

  1. history = model.fit_generator(
  2. train_generator,
  3. step_per_epoch = 100,
  4. epoch = 20,
  5. test_data = test_generator,
  6. test_steps = 50,
  7. verbose=2)

当然也可以用softmax进行二分类,具体代码如下:

第一步:打标签,关于如何打标签,先看上一篇博文。

  1. data = []
  2. labels = []
  3. # 拿到图像数据路径,方便后续读取
  4. imagePaths = sorted(list(utils_paths.list_images('./dataset')))
  5. random.seed(42)
  6. random.shuffle(imagePaths)
  7. # 遍历读取数据
  8. for imagePath in imagePaths:
  9. # 读取图像数据
  10. image = cv2.imread(imagePath,1) #读取灰度图像
  11. image = cv2.resize(image, (96, 96))
  12. data.append(image)
  13. # 读取标签
  14. label = imagePath.split(os.path.sep)[-2] #文件路径的倒数第二个就是文件夹的名字被定义为标签
  15. labels.append(label)
  16. # 对图像数据做scale操作
  17. data = np.array(data, dtype="float") / 255.0
  18. labels = np.array(labels)
  19. print(labels)
  20. # 数据集切分
  21. (trainX, testX, trainY, testY) = train_test_split(data,labels, test_size=0.2, random_state=42)
  22. from keras.utils import to_categorical
  23. lb = LabelBinarizer()
  24. trainY = lb.fit_transform(trainY)
  25. trainY1 = to_categorical(trainY, 2)#修改
  26. testY = lb.transform(testY)
  27. testY1 = to_categorical(testY,2)

第二步,构建模型,和上文一致,这里不过多阐述了。

第三部,训练模型并输出相关评价指标。

  1. from sklearn.metrics import precision_score,recall_score,f1_score,roc_auc_score,roc_curve,auc,plot_roc_curve
  2. import numpy as np
  3. from sklearn.metrics import accuracy_score
  4. y_true = np.argmax(testY1, axis=1)
  5. print(y_true) #one-hot编码: 0表示为:10(两个状态位)
  6. #y_true = list(np.concatenate(testY.reshape((-1, 1), order="F")))
  7. y_pred1 = model.predict(testX)
  8. print(y_pred1)
  9. #y_pred = model.predict_classes(testX)
  10. #y_pred = list(np.concatenate(y_pred.reshape((-1, 1), order="F")))
  11. y_pred = np.argmax(y_pred1, axis=1)
  12. print(y_true)
  13. print(y_pred)
  14. accuracy = accuracy_score(y_true, y_pred)
  15. print('Accuracy: {}%'.format(accuracy * 100))
  16. print('Error rate: {:.2f}%'.format((1 - accuracy) * 100))
  17. #plot_roc_curve(y_true, y_probas)
  18. #print('accuracy_score: {:.2f}'.format(accuracy_score(y_true, y_pred)))
  19. print('precision_score: {:.2f}'.format(precision_score(y_true, y_pred)))
  20. print('recall_score: {:.2f}'.format(recall_score(y_true, y_pred)))
  21. print('f1_score: {:.2f}'.format(f1_score(y_true, y_pred)))
  1. from sklearn.metrics import confusion_matrix
  2. confusion_matrix(y_true, y_pred)
  3. #print(np.confusion_matrix)
  4. import seaborn as sn
  5. import matplotlib.pyplot as plt
  6. plt.figure(figsize=(10, 6),dpi=100)
  7. sn.heatmap(confusion_matrix(y_true, y_pred), annot=True)
  8. plt.show()
  9. # 绘制Roc
  10. y_pred_keras = model.predict(testX)[:, 1]
  11. #y_pred_keras = model.predict_proba(testX)[:, 1]
  12. print(y_pred_keras.shape)
  13. #y_pred_keras= [0.54, 0.567]
  14. fpr, tpr, thresholds = roc_curve(y_true,y_pred_keras)
  15. roc_auc = auc(fpr, tpr)
  16. plt.title('Receiver Operating Characteristic')
  17. plt.plot(fpr, tpr, '#9400D3',label=u'AUC = %0.3f'% roc_auc)
  18. plt.legend(loc='lower right')
  19. plt.plot([0,1],[0,1],'r--')
  20. plt.xlim([-0.1,1.1])
  21. plt.ylim([-0.1,1.1])
  22. plt.ylabel('True Positive Rate')
  23. plt.xlabel('False Positive Rate')
  24. plt.grid(linestyle='-.')
  25. plt.grid(True)
  26. plt.show()
  27. print(roc_auc)

PR曲线

  1. y_pred_keras = y_pred1[:, 1]
  2. print(y_pred1)
  3. print(y_pred_keras)
  4. import matplotlib.pyplot as plt
  5. from sklearn.metrics import precision_recall_curve,auc
  6. precision, recall, thresholds=precision_recall_curve(y_true, y_pred_keras)
  7. pr_auc=auc(recall, precision)
  8. plt.plot(precision, recall,'#9400D3', label=u'AUC = %0.4f' % pr_auc)
  9. plt.legend(loc='lower left')
  10. #plt.plot([1,0],[0,1],'r--')
  11. plt.ylim([-0.1, 1.1])
  12. plt.xlim([-0.1, 1.1])
  13. plt.ylabel('Precision')
  14. plt.xlabel('Recall')
  15. plt.grid(linestyle='-.')
  16. plt.grid(True)
  17. plt.show()
  18. print(auc(recall, precision))

DET

  1. import matplotlib.pyplot as plt
  2. fpr_det, fnr_det, thresholds_det = metrics.det_curve(y_true, y_pred_keras, pos_label=1)
  3. #FAR(FPR)
  4. plt.title('Detection Error Tradeoff')
  5. #display = metrics.DetCurveDisplay(fpr=fpr_det, fnr=fnr_det)
  6. #a= compute_eer(y_true, y_pred)
  7. #print(a)
  8. #display = metrics.DetCurveDisplay(fpr=fpr_det, fnr=fnr_det)
  9. #display.plot()
  10. plt.plot(fpr_det, fnr_det)
  11. plt.legend(loc='lower right') # 图例出现在左下角
  12. #plt.plot([0, 1], [0, 1], 'r--')
  13. #plt.xlim([0, 1])
  14. #plt.ylim([0, 1])
  15. plt.ylabel('False Rejection Rate')
  16. plt.xlabel('False Acceptance Rate')
  17. plt.grid(linestyle='-.')
  18. plt.grid(True)
  19. plt.show()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/581904
推荐阅读
相关标签
  

闽ICP备14008679号