目前随着猫咖、猫店等网红店铺的兴起,养猫这一爱好逐渐进入了大众的视野。从原本小众化的兴趣爱好变身为时尚潮流,意味着越来越多的爱猫养猫人士其实对猫咪品种其实并不熟悉。
猫咪品种种类纷繁复杂,对于刚刚接触的人来说,想要分清并不容易。一方面可能在买猫时会被店家宰割,本来是一只较便宜的土猫,在店家的口中摇身一变变成了进口的波斯猫。另一方面,猫的品种也决定了猫的生活习性和喜好,我们应该根据猫的品种来对猫咪进行照顾。
这一系列的现实原因使得我们萌生了通过开发软件,来对猫的种类进行识别的想法,从而解决了猫咪主人与店家的信息不对称和如何更好的照顾猫咪等问题。
对于顾客方面,我们想要开发的软件解决了猫咪主人与店家的信息不对称和如何根据猫的品种更好的照顾猫咪的问题。我们可以对识别出的猫咪快速在系统内实现备案,方便用户记录猫咪的生活照顾情况。
对于店家方面,通过识别系统店家可以快速对店内的猫咪实现管理,对于用户或进货方送往店家的猫咪可以快速进行档案的建立和修改,从而满足管理的需要。
我们选用迁移学习这一训练方法的意义:
训练成本可以很低:如果采用导出特征向量的方法进行迁移学习,后期的训练成本非常低,用 CPU 都完全无压力,没有深度学习机器也可以做。
适用于小数据集:对于数据集本身很小的情况,从头开始训练具有几千万参数的大型神经网络是不现实的,因为越大的模型对数据量的要求越大,过拟合无法避免。这时候如果还想用上大型神经网络的超强特征提取能力,只能靠迁移学习。
利用爬虫在Google image 爬取到1500张图片作为数据集,计划将数据集8: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
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++;
}
}
Inception 网络是 CNN 分类器发展史上一个重要的里程碑。在 Inception 出现之前,大部分流行 CNN 仅仅是把卷积层堆叠得越来越多,使网络越来越深,以此希望能够得到更好的性能。 Inception_V3中使用了称为Inception model的结构,Inception model本身如同大网络中的小网络,其结构可以反复堆叠一起形成大大网络。
用第一阶段爬取到的数据训练模型,由于训练量可能不足,使用迁移学习的方式在前人已训练好的模型基础上进行训练。
数组是表示属于每种结果的概率,选出最大的概率对应的label,在dict里面查他对应的名字
输入图片:
对应结果:
输入图片:
对应结果:
输入图片:
对应结果:
Vs项目迁移到qt需要注意:
注意!tensorflow只能用在64位环境
要关联文件夹底下的include和lib
需要关联静态编译文件.lib 在连接器中 如图所示的三个,均在lib文件夹下
执行文件exe所在位置需要包含动态链接库,即dll
编程的时候需要注意!
Load cats.pd模型,整个程序只需要加载一次!之后直接进行预测就可以了,不要每次预测一张图片就载入一次,会很慢!最开始载入一次模型,之后结果都是秒出。