基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)

文章目录

    • 选题背景
    • 意义分析
    • 第一阶段进展
      • 爬取数据
      • 数据增强
      • QT完成基本的界面
        • Why QT?
        • 基本登录界面
        • 基本的功能选择界面
        • 基本的功能界面
      • 下一阶段计划
    • 第二阶段进展
      • 图形界面的美化
        • 登录界面
        • 其他功能界面预览
          • 功能选择页面
          • 档案管理页面
          • 修改档案页面
          • 新建档案页面
          • 种类识别页面
      • 连接MySQL数据库
        • 创建连接
        • 创建表
        • 登录验证
        • 管理猫咪信息
        • 数据库界面
    • 第三阶段进展
      • 猫咪识别功能实现
        • InceptionV3
        • 训练模型
    • 模型与UI结合
    • 实现效果
      • 选择猫咪
      • 识别结果

选题背景

目前随着猫咖、猫店等网红店铺的兴起,养猫这一爱好逐渐进入了大众的视野。从原本小众化的兴趣爱好变身为时尚潮流,意味着越来越多的爱猫养猫人士其实对猫咪品种其实并不熟悉。

猫咪品种种类纷繁复杂,对于刚刚接触的人来说,想要分清并不容易。一方面可能在买猫时会被店家宰割,本来是一只较便宜的土猫,在店家的口中摇身一变变成了进口的波斯猫。另一方面,猫的品种也决定了猫的生活习性和喜好,我们应该根据猫的品种来对猫咪进行照顾。

这一系列的现实原因使得我们萌生了通过开发软件,来对猫的种类进行识别的想法,从而解决了猫咪主人与店家的信息不对称和如何更好的照顾猫咪等问题。

基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第1张图片

意义分析

对于顾客方面,我们想要开发的软件解决了猫咪主人与店家的信息不对称和如何根据猫的品种更好的照顾猫咪的问题。我们可以对识别出的猫咪快速在系统内实现备案,方便用户记录猫咪的生活照顾情况。
对于店家方面,通过识别系统店家可以快速对店内的猫咪实现管理,对于用户或进货方送往店家的猫咪可以快速进行档案的建立和修改,从而满足管理的需要。

我们选用迁移学习这一训练方法的意义:

  • 训练成本可以很低:如果采用导出特征向量的方法进行迁移学习,后期的训练成本非常低,用 CPU 都完全无压力,没有深度学习机器也可以做。

  • 适用于小数据集:对于数据集本身很小的情况,从头开始训练具有几千万参数的大型神经网络是不现实的,因为越大的模型对数据量的要求越大,过拟合无法避免。这时候如果还想用上大型神经网络的超强特征提取能力,只能靠迁移学习。

第一阶段进展

  • 爬取数据

    ​ 利用爬虫在Google image 爬取到1500张图片作为数据集,计划将数据集8:2分为训练集和测试集,以防止大型的网络由于数据集过小而出现过拟合的情况 。

    基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第2张图片

  • 数据增强

    在深度学习训练过程中,训练数据是很重要的,在样本量方便,一是要有尽量多的训练样本,二是要保证样本的分布够均匀,也就是各个类别下的样本量都要足够,不能有的很多,有的特别少。但是在我们实际采集猫数据的过程中,虽然已经找到了约1500张,但还是不够多,这就很容易导致训练出的模型过拟合,泛化能力不足。

    于是我们使用了数据增强方法,从已有的图像样本中生造出更多的样本数据,使用一些方法,来随机变换生成一些可信图像,这些通过随机变换生成的图像,要保证从逻辑上不会给模型辨认带来困扰,也就是从分类的角度应该依然属于其原本图像同一类,但是又要与原本的图像有一些区别,这样模型在训练时就不会两次看到完全相同的图像,这样就能够观察到更多的内容,也就提升了泛化能力。

    ImageDataGenerator是keras.preprocessing.image包下的一个类,可以设置图像的这些随机扰动来生成新的图像数据,简单的代码如下所示:

    # -- coding: utf-8 --
    import numpy as np
    from keras.preprocessing import Image
    from keras.preprocessing.image import ImageDataGenerator
    import cv2 as cv
    import os
    
    img = cv.imread("./photo.png")
    img = Image.img_to_array(img)
    img = img.reshape((1,) + img.shape)
    datagen = ImageDataGenerator(width_shift_range=0.2, height_shift_range=0.2, fill_mode='wrap')
    i = 0
    for batch in datagen.flow(img, batch_size=1):
        img_name = "./image_%d.jpg" % (i)
        cv.imwrite(img_name, batch[0])
        i += 1
        if i % 4 == 0:
            break
    
  • QT完成基本的界面

    • Why QT?

      • 工具丰富
      • 功能丰富
        除了提供了界面库之外,还提供了音频库,3d库,数据库SDK,WebEngine,网络库等,让我们做跨平台程序变得简便。
      • 开源并跨平台
        除了了可以自己通过QT源码进行移植之外,qt官方就已经提供了再windows,Android,ios,linux中运行的SDK。
      • 架构的优势
        界面源码与用户源码的隔离,Qt的策略是没有界面都会生成一个对应的源码,比如有一个界面设计文件xps.ui 它会解析其中的xml生成一个对应了ui_xps.h 文件,这个文件你不需要修改,如果要调用界面中的控件直接通过 Ui::XPSClass ui; 这个对象定义也是写在ui_xps.h中。也就是你的业务逻辑就和界面控件对象的创建和设置做了隔离。
      • 事件处理的便捷(灵活的信号槽机制),qt提供了信号槽机制,可以很好的降低耦合,提升代码的复用性。
        基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第3张图片
    • 基本登录界面

      基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第4张图片

    • 基本的功能选择界面

      基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第5张图片

    • 基本的功能界面

      基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第6张图片

      基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第7张图片

      基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第8张图片

  • 下一阶段计划

    1. 利用训练集进行训练
    2. 完善图形界面的布局
    3. 完成图形界面按钮功能的实现
    4. 完成数据库方面的功能

第二阶段进展

  • 图形界面的美化

    • 登录界面

      基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第9张图片

      对各个按钮及输入框进行了美化,输入框增加长度限制、透明度调整等,按钮添加hover样式及颜色调整。

    • 其他功能界面预览

      • 功能选择页面

        基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第10张图片

      • 档案管理页面

        基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第11张图片

      • 修改档案页面

        基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第12张图片

      • 新建档案页面

        基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第13张图片

      • 种类识别页面

        基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第14张图片

  • 连接MySQL数据库

    • 创建连接

      QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");//添加一个默认连接,数据库驱动为QMYSQL
          db.setHostName("localhost");//设置主机名
          db.setPort(3306);//设置端口
          db.setDatabaseName("helloworld");//数据库名(这个数据库必须是已经存在的数据库)
          db.setUserName("root");//用户名
          db.setPassword("787963445");//设置密码
          if(!db.open())
          {
              QMessageBox::critical(0,"Cannot open database",
                                    "Unable to establish a database connection.",QMessageBox::Cancel);//提示出错
              qDebug()<
    • 创建表

       //创建登录表
          QSqlQuery query(db);
          // 使数据库支持中文
          query.exec("SET NAMES 'Latin1'");
          query.exec("create table log_in (user_name varchar(30) primary key,pwd varchar(6))");
          query.exec("insert into log_in values('xx','000')");
          query.exec("insert into log_in values('hh','000')");
      
      
          //创建猫咪信息表
          query.exec("create table cat_info (user_name varchar(30) default NULL,"
                                             "cat_id int,"
                                             "kind varchar(30),"
                                             "cat_name varchar(20),"
                                             "cat_condition varchar(100),"
                                             "primary key(cat_id))");
      
          query.exec("insert into cat_info  values('xx','1','波斯猫','Mikky','healthy')");
          query.exec("insert into cat_info  values('hh','2','加菲猫','Tommy','healthy')");
          query.exec("insert into cat_info  values('hh','3','橘猫','Jacky','sick')");
      
          query.exec("select * from log_in  ");
          while(query.next())
          {
                  qDebug()<
    • 登录验证

      void Login::on_Log_clicked()
      {
          QString user;
          QString u_pwd;
          user = ui->Name_in->text();//获取用户名
          username_extern=user;
          u_pwd = ui->Password_in->text();//获取密码
          if(user == "")
             ui->Tip->setText("error");
          else if(u_pwd == "")
             ui->Tip->setText("error");
          else
          {
              QString S =QString("select * from log_in where user_name='%1' and pwd='%2' ").arg(user).arg(u_pwd);
              QSqlQuery query;
              query.exec(S);
              if(query.first())
              {
                  this->close();
                  Menu mu;
                  mu.exec();
              }
              else
              {
                  ui->Tip->setText("error");
              }
          }
      }
      
    • 管理猫咪信息

      QSqlQuery query;
          int max;
          query.exec(QString("select max(cat_id) from cat_info where user_name='%1'").arg(username_extern));
          if(query.first())
          {
              max=query.value(0).toInt();
          }
      
          while(i!=max+1)
          {
             query.exec(QString("select * from cat_info where cat_id='%1' and user_name='%2'").arg(i).arg(username_extern));
             if(query.first())
             {
                 name=query.value(3).toString();                      //修改赋给这四个变量的值为 (数据库中该用户拥有的猫的资料;按猫的编号递增)
                 number=query.value(1).toString();                       //查找完后,即编号最大时,编号保持不变
                 kind=query.value(2).toString();
                 condition=query.value(4).toString();
      
                 ui->Name_out->setText(name);
                 ui->Number_out->setText(number);
                 ui->Kind_out->setText(kind);
                 ui->Condition_out->setText(condition);
      
                 i++;
                 break;
             }
             else
             {
                 i++;
             }
          }
      
    • 数据库界面

      基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第15张图片

第三阶段进展

  • 猫咪识别功能实现

    • InceptionV3

      Inception 网络是 CNN 分类器发展史上一个重要的里程碑。在 Inception 出现之前,大部分流行 CNN 仅仅是把卷积层堆叠得越来越多,使网络越来越深,以此希望能够得到更好的性能。 Inception_V3中使用了称为Inception model的结构,Inception model本身如同大网络中的小网络,其结构可以反复堆叠一起形成大大网络。

    • 训练模型

      用第一阶段爬取到的数据训练模型,由于训练量可能不足,使用迁移学习的方式在前人已训练好的模型基础上进行训练。

      数组是表示属于每种结果的概率,选出最大的概率对应的label,在dict里面查他对应的名字

      输入图片:

      基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第16张图片

      对应结果:

      基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第17张图片

      输入图片:

      基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第18张图片

      对应结果:

      基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第19张图片

      输入图片:

      基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第20张图片

      对应结果:

      基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第21张图片

  • 模型与UI结合

    Vs项目迁移到qt需要注意:

    注意!tensorflow只能用在64位环境

    img

    要关联文件夹底下的include和lib

    基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第22张图片

    基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第23张图片

    需要关联静态编译文件.lib 在连接器中 如图所示的三个,均在lib文件夹下

    基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第24张图片

    执行文件exe所在位置需要包含动态链接库,即dll

    基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第25张图片

    编程的时候需要注意!

    Load cats.pd模型,整个程序只需要加载一次!之后直接进行预测就可以了,不要每次预测一张图片就载入一次,会很慢!最开始载入一次模型,之后结果都是秒出。

  • 实现效果

    • 选择猫咪

      基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第26张图片

      基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第27张图片

      基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第28张图片

    • 识别结果

      基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第29张图片

      基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第30张图片

      基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段)_第31张图片

你可能感兴趣的:(基于InceptionV3和迁移学习的 猫咪种类识别和管理系统(第一阶段))