基于Tensorflow的猫狗识别的研究

基于Tensorflow的猫狗识别的研究

代码运行环境

  1. Windows 11 专业版 22H2 22621.1
  2. Anaconda3-2021.05-Windows-x86_64
  3. python 3.6.2 tensorflow2.0.0   keras 2.2.5

运行环境安装

1.Anaconda3-2021.05-Windows-x86_64安装包下载

安装包
安装完成后一直next即可。

注意:将所有的选项都打上勾。

2.tensorflow环境的配置

  tensorflow的配置请看这篇文章tensorflow的安装配置详细

模型构建过程

1. 准备工作

数据文件下载:
链接:https://pan.baidu.com/s/1ZlJZRraCyhTL-BRfd7HkgQ
提取码:zidq
数据集解释:
数据集描述

2. 读入数据与预训练模型
import os
from tensorflow.keras import layers
from tensorflow.keras import Model
from tensorflow.keras.applications.inception_v3 import InceptionV3
base = 'D:/kaggle'
# 导入InceptionV3权重文件(注意文件的路径)
local_weights_file = 'InceptionV3文件路径'
# 定义输入的形状,将顶层网络冻结,因为要重新训练模型
pre_trained_model = InceptionV3(input_shape = (150, 150, 3), 
                                include_top = False, 
                                weights = None)
# 加载权重文件
pre_trained_model.load_weights(local_weights_file)
# 冻结中间网络,中间网络不再进行训练
for layer in pre_trained_model.layers:
  layer.trainable = False
# 输出模型信息
pre_trained_model.summary()
# 选取InceptionV3中的7层进行训练
last_layer = pre_trained_model.get_layer('mixed7')
# 输出一些模型信息
print('last layer output shape: ', last_layer.output_shape)
last_output = last_layer.output
print(last_output)

在这里插入图片描述

3.为模型添加新的层
from tensorflow.keras.optimizers import RMSprop
# # 对我们的输出进行平铺操作
x = layers.Flatten()(last_output)
# 添加一个全连接层,将relu作为激活函数
x = layers.Dense(1024, activation='relu')(x)
# 设置随机失活函数,防止过拟合
x = layers.Dropout(0.2)(x)    
# 把输出设置成sigmoid函数              
x = layers.Dense  (1, activation='sigmoid')(x)    
# 初始化我们自己的模型       
model = Model( pre_trained_model.input, x) 
model.compile(optimizer = RMSprop(lr=0.0001), 
              loss = 'binary_crossentropy', 
              metrics = ['acc'])
4.读入数据并进行数据增强和自动标签
from tensorflow.keras.preprocessing.image import ImageDataGenerator

import os
# 读取数据
base_dir = 'cats_and_dogs_filtered文件路径'
train_dir = os.path.join(base_dir, 'train')
validation_dir = os.path.join(base_dir, 'validation')
train_cats_dir = os.path.join(train_dir, 'cats') 
train_dogs_dir = os.path.join(train_dir, 'dogs') 
validation_cats_dir = os.path.join(validation_dir, 'cats') 
validation_dogs_dir = os.path.join(validation_dir, 'dogs')
train_cat_fnames = os.listdir(train_cats_dir)
train_dog_fnames = os.listdir(train_dogs_dir)
# 自动为数据打上标签并进行归一化处理和数据增强。
train_datagen = ImageDataGenerator(rescale = 1./255., # 归一化处理
                                   rotation_range = 40, # 旋转角度
                                   width_shift_range = 0.2, # 宽度变化范围
                                   height_shift_range = 0.2, # 高度变化范围
                                   shear_range = 0.2, # 剪切范围(类似于倾斜并拉伸)
                                   zoom_range = 0.2, # 水平翻转
                                   horizontal_flip = True)
# 对我们的测试集打上标签并进行归一化处理
test_datagen = ImageDataGenerator( rescale = 1.0/255. )
# 利用我们的ImageDataGenerator来读取数据
train_generator = train_datagen.flow_from_directory(train_dir,
                                                    batch_size = 20,
                                                    class_mode = 'binary',
                                                    target_size = (150, 150))

validation_generator =  test_datagen.flow_from_directory( validation_dir,
                                                          batch_size  = 20,
                                                          class_mode  = 'binary', 
                                                          target_size = (150, 150))

在这里插入图片描述

5.进行训练
history = model.fit_generator(
            train_generator,   # 训练数据
            validation_data = validation_generator, # 测试数据
            steps_per_epoch = 100,  # 一次训练100个
            epochs = 20,  # 训练20次
            validation_steps = 50,  # 测试的步长
            verbose = 2) # 显示输出信息
            

在这里插入图片描述

6.绘制精度曲线
import matplotlib.pyplot as plt
# 设置横纵坐标
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']
# 重定义横坐标坐标值
epochs = range(len(acc))
plt.plot(epochs, acc, 'r', label='Training accuracy')
plt.plot(epochs, val_acc, 'b', label='Validation accuracy')
plt.title('Training and validation accuracy')
plt.legend(loc=0)
plt.figure()
plt.show()

在这里插入图片描述

7.数据预测
import numpy as np
from keras.preprocessing import image
import tensorflow as tf
import os
base = 'E:/Download/PetImages'
filePath = base + '/Dog'
# 获取所有文件名
keys = os.listdir(filePath)
model = tf.keras.models.load_model('model_pre_trained.h5')
# 对图片进行预测
# 读取图片
for fn in keys:
  path = base + '/Dog/' + fn
  img = image.load_img(path, target_size=(150, 150))
  x = image.img_to_array(img)
  # 在第0维添加维度变为1x150x150x3,和我们模型的输入数据一样
  x = np.expand_dims(x, axis=0)
  x = x / 255
  # np.vstack:按垂直方向(行顺序)堆叠数组构成一个新的数组,我们一次只有一个数据所以不这样也可以
  images = np.vstack([x])
  # batch_size批量大小,程序会分批次地预测测试数据,这样比每次预测一个样本会快。因为我们也只有一个测试所以不用也可以
  classes = model.predict(images, batch_size=1)
  if classes[0]>0.5:
    print(fn + " is a dog")
  else:
    print(fn + " is a cat")

在这里插入图片描述

可视化界面设计

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, QFileDialog
from PyQt5.Qt import *
from keras.models import model_from_json
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
import os
from keras.preprocessing import image
import tensorflow as tf
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import Qt
font = QtGui.QFont()
font.setFamily('黑体')
font.setBold(True)
font.setPointSize(15)
font.setWeight(5)


def load_model():
    # 载入模型
    model = tf.keras.models.load_model('model_pre_trained.h5')
    return model


class Ui_MainWindow(object):
    def __init__(self):
        self.img_dir = None

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1600, 950)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(440, 700, 150, 50))
        self.pushButton.setObjectName("pushButton")
        self.pushButton.clicked.connect(self.classify)
        self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
        self.textBrowser.setGeometry(QtCore.QRect(1050, 650, 400, 200))
        self.textBrowser.setObjectName("textBrowser")
        self.textBrowser.setFont(font)
        self.textBrowser.setAlignment(Qt.AlignCenter)
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(1210, 600, 150, 50))
        self.label.setObjectName("label")
        self.label.setFont(font)
        self.graphicsView = QtWidgets.QLabel(self.centralwidget)
        self.graphicsView.setGeometry(QtCore.QRect(150, 150, 850, 480))
        self.graphicsView.setObjectName("graphicsView")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(500, 100, 150, 50))
        self.label_2.setObjectName("label_2")
        self.label_2.setFont(font)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.menuBar = QtWidgets.QMenuBar(MainWindow)
        self.menuBar.setGeometry(QtCore.QRect(0, 0, 800, 50))
        self.menuBar.setObjectName("menuBar")
        self.menuBar.setFont(font)
        self.menu = QtWidgets.QMenu(self.menuBar)
        self.menu.setObjectName("menu")
        MainWindow.setMenuBar(self.menuBar)
        self.localfile_action = QAction(MainWindow)
        self.localfile_action.setCheckable(False)
        self.localfile_action.setObjectName('localFileAction')
        self.localfile_action.triggered.connect(self.openImg)
        self.localfile_action.setText('输入图片')
        self.menuBar.addAction(self.localfile_action)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "识别"))
        self.label.setText(_translate("MainWindow", "结果"))
        self.label_2.setText(_translate("MainWindow", "图片"))

    def openImg(self):
        file_name, _ = QFileDialog.getOpenFileName(
            None, '选择图片', 'E:\\Download', 'Image files(*.jpg *.gif *.png *.jpeg)')
        self.graphicsView.setPixmap(QPixmap(file_name))
        self.img_dir = file_name

    def classify(self, img_dir):
        model = load_model()
        img_dir = self.img_dir
        img = image.load_img(img_dir, target_size=(150, 150))
        x = image.img_to_array(img)
        x = np.expand_dims(x, axis=0)
        x = x / 255
        images = np.vstack([x])
        classes = model.predict(images)
        if classes[0]>0.5:
            name = "狗"
        else:
            name = "猫"
        self.textBrowser.setText('预测结果为:'+name)
        self.textBrowser.setFont()

if __name__ == '__main__':
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
    app = QApplication(sys.argv)
    MainWindow = QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

在这里插入图片描述
至此实验结束,需要论文的可以去基于卷积神经网络的猫狗识别的增强实验的研究下载。

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Galactus_hao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值