一、测试平台

python:3.6.5
tensorflow:1.6.0
keras:2.1.5

二、前期准备

1、数据收集:本例收集了25000张小猫、小狗的图片,二者各占一半,当然,训练集数据多多益善;
2、数据集预处理:

①猫和狗的图片分别重命名,命名格式为:“cat.number”/“dog.number”,其中number=1,2,3,4……n。文件重命名这一块如果有问题请参考:图片批量重命名;

②将猫和狗的图片放在文件夹:“./data/image/pre_train/”这个文件夹下,并在同一目录创建文件夹train(“./data/image/train/”);

③将预训练的数据集中的图片resize成需要的大小(本例中Alexnet模型input的图片大小为(-1,224,224,3)),所以我们将pre_train文件夹下的图片resize成(224,224),并存储在train文件夹下;这一步如果有疑问,请参考文章:resize训练集图片大小并存储的方法

④在data文件夹下新建空的dataset.txt文件,根据train文件夹中已训练好的数据集制作label,格式为"cat.number.jpg;0"/“dog.number.jpg;1”

③、④步代码块如下:

#coding=utf-8[1]'''
对收集到的数据进行预处理,以减小训练时间;
1、我们将搜集到的图片存放在与软件脚本同一根目录下的'./data/image/pre_train/'文件夹下;
2、我们使用Image模块从pre_train文件夹读取图片,resize,并存储入'./data/image/train/'文件夹;
'''from PIL import Image
import ossrc_path = './data/image/pre_train/'
dst_path = './data/image/train/'filelist=os.listdir(src_path)
for img in filelist:image=Image.open(src_path+img)image_resize=image.resize((224,224),resample=2)'''# image.resize(size,resample=0)  #sesam用于表示改变图像过程中的插值方法,0:双线性插值;1:最邻近插值;2:双三次插值;3|面积插值法# 参考:python: PIL的Image.resize()函数:'''image_resize.save(dst_path+img)[2]'''
生成标签label
'''
import osphotos=os.listdir('./data/image/train/')  #os.listdir:用于返回一个由文件名和目录组成的列表
with open('./data/dataset.txt','w') as f:for photo in photos:name=photo.split('.')[0]if name=='cat':f.write(photo+';0\n')  #\n:换行elif name=='dog':f.write(photo+';1\n')
f.close()

三、训练
Alexnet模型如下所示

注释:
1、一张原始图片被resize到(224,224,3);
2、使用步长为4x4,大小为11的卷积核对图像进行卷积,输出的特征层为96层,输出的shape为(55,55,96);
3、使用步长为2的最大池化层进行池化,此时输出的shape为(27,27,96)
4、使用步长为1x1,大小为5的卷积核对图像进行卷积,输出的特征层为256层,输出的shape为(27,27,256);
5、使用步长为2的最大池化层进行池化,此时输出的shape为(13,13,256);
6、使用步长为1x1,大小为3的卷积核对图像进行卷积,输出的特征层为384层,输出的shape为(13,13,384);
7、使用步长为1x1,大小为3的卷积核对图像进行卷积,输出的特征层为384层,输出的shape为(13,13,384);
8、使用步长为1x1,大小为3的卷积核对图像进行卷积,输出的特征层为256层,输出的shape为(13,13,256);
9、使用步长为2的最大池化层进行池化,此时输出的shape为(6,6,256);
10、两个全连接层,最后输出为1000类

代码块:

from keras.callbacks import TensorBoard, ModelCheckpoint, ReduceLROnPlateau, EarlyStopping
from keras.utils import np_utils
from keras.optimizers import Adam
from model.AlexNet import AlexNetimport numpy as np
import utils
import cv2
from keras import backend as KK.set_image_dim_ordering('tf')# K.image_data_format()=="channel_first"def generate_arrays_from_file(lines, batch_size):# 获取总长度n = len(lines)i = 0while 1:X_train = []Y_train = []# 获取一个batch_size大小的数据for b in range(batch_size):if i == 0:np.random.shuffle(lines)     #shuffle:洗牌name = lines[i].split(';')[0]# 从文件中读取图像img = cv2.imread(r".\data\image\train" + '/' + name)img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)img = img / 255X_train.append(img)Y_train.append(lines[i].split(';')[1])# 读完一个周期后重新开始i = (i + 1) % n  #取模,返回除法的余数# 处理图像X_train=np.array(X_train)#X_train = utils.resize_image(X_train, (224, 224))#X_train = X_train.reshape(-1, 224, 224, 3)  #-1是模糊控制的意思,n,h,w,c,n=-1代表取值不固定Y_train = np_utils.to_categorical(np.array(Y_train), num_classes=2)#np_utils.to_categorical(y_train,2)将原来标签(sample,label)转化为一行两列的 独热码yield (X_train, Y_train)  #并发编程中完成一个“并发”程序if __name__ == "__main__":# 模型保存的位置log_dir = "./logs/"# 打开数据集的txtwith open(r".\data\dataset.txt", "r") as f:lines = f.readlines()# 打乱行,这个txt主要用于帮助读取数据来训练# 打乱的数据更有利于训练np.random.seed(10101)  #预先使用random.seed(x)设定好种子之后,其中x可以是任意数字,比如10,先调用它的情况下,使用random生成的随数将会是同一个,设置的seed()值仅有一个有效np.random.shuffle(lines)np.random.seed(None)# 90%用于训练,10%用于估计。num_val = int(len(lines) * 0.1)num_train = len(lines) - num_val# 建立AlexNet模型model = AlexNet()# 保存的方式,3世代保存一次checkpoint_period1 = ModelCheckpoint(   #checkpoint:检查站log_dir + 'ep{epoch:03d}-loss{loss:.3f}-val_loss{val_loss:.3f}.h5',monitor='acc',   #monitor:三代保存一次save_weights_only=False,save_best_only=True,period=3  #period:周期)# 学习率下降的方式,acc三次不下降就下降学习率继续训练reduce_lr = ReduceLROnPlateau(   #plateau:稳定水平,达到平衡时期monitor='acc',factor=0.5,  #factor:要素patience=3,  #patience:耐心verbose=1    #verboss:冗长的)# 是否需要早停,当val_loss一直不下降的时候意味着模型基本训练完毕,可以停止early_stopping = EarlyStopping(monitor='val_loss',min_delta=0,patience=10,verbose=1)# 交叉熵model.compile(loss='categorical_crossentropy',   #compile:编译;     categorical_crossentropy:交叉熵optimizer=Adam(lr=1e-3),   #optimizer:优化器metrics=['accuracy'])      #metrics:度量;  accuracy:精度,准确度# 一次的训练集大小batch_size = 128  #batch:一批print('Train on {} samples, val on {} samples, with batch size {}.'.format(num_train, num_val, batch_size))# 开始训练model.fit_generator(generate_arrays_from_file(lines[:num_train], batch_size),steps_per_epoch=max(1, num_train // batch_size),'''#由于generator()函数循环没有终止条件,fit_generator也不知道一个epoch什么时候结束,所以我们需要动手指定steps_per_epoch参数一般的数值即为len(y)//batch_size.如果过数据集大小不能整除batch_size,而且你打算使用最后一个batch的数据(该batch比batch_size要小),此时使用np.ceil(len(y)//batch_size)'''validation_data=generate_arrays_from_file(lines[num_train:], batch_size),validation_steps=max(1, num_val // batch_size),epochs=50,initial_epoch=0,callbacks=[checkpoint_period1, reduce_lr])model.save_weights(log_dir + 'last1.h5')

训练结束后,“./logs/”文件夹将生成last1.h5文件,预测环节将调用这个文件

四、预测

1、在"./data/model/"文件夹下,新建text文件,并命名为“index_word”,写入:

预测时,可以通过下面四行代码,调用index_word文件。

#coding=utf-8#读index_word.txt文档,给预测提供结果def print_answer(argmax):with open("./data/model/index_word.txt", "r", encoding='utf-8') as f:synset = [l.split(";")[1][:-1] for l in f.readlines()]   #[:-1]从0到位置为-1的数,这里主要是为了过滤换行符“\n”#print(synset[argmax])return synset[argmax]

2、预测新图片时,我们不能保证输入图片的尺寸一定是满足要求的,所以还是要对输入的图片resize,

import numpy as np
import utils
import cv2
from keras import backend as K
from model.AlexNet import AlexNetK.set_image_dim_ordering('tf')   #tf1版本的用法,'tf'的意思是;数据按照nhwc分布#将预测图片resize成(224,224)
def resize_image(image,size):with tf.name_scpoe('resize image'):images=[]for i in image:i=cv2.resize(i,size)images.append(i)images=np.array(images)return imagesif __name__ == "__main__":model = AlexNet()model.load_weights("./logs/last1.h5")  #调用last1.h5文件img = cv2.imread("./Test.jpg")img_RGB = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)img_nor = img_RGB/255img_nor = np.expand_dims(img_nor,axis = 0)img_resize = resize_image(img_nor,(224,224))#utils.print_answer(np.argmax(model.predict(img)))print(utils.print_answer(np.argmax(model.predict(img_resize))))cv2.imshow("ooo",img)cv2.waitKey(0)

使用Alexnet模型识别猫和狗相关推荐

  1. DL之AlexNet:利用卷积神经网络类AlexNet实现猫狗分类识别(图片数据增强→保存h5模型)

    DL之AlexNet:利用卷积神经网络类AlexNet实现猫狗分类识别(图片数据增强→保存h5模型) 目录 利用卷积神经网络类AlexNet实现猫狗分类识别(图片数据增强→保存h5模型) 设计思路 处 ...

  2. 使用PYTORCH复现ALEXNET实现猫狗识别

    完整代码链接:https://github.com/SPECTRELWF/pytorch-cnn-study 网络介绍: Alexnet网络是CV领域最经典的网络结构之一了,在2012年横空出世,并在 ...

  3. python狗图像识别_TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片

    本文是Python通过TensorFlow卷积神经网络实现猫狗识别的姊妹篇,是加载上一篇训练好的模型,进行猫狗识别 本文逻辑: 我从网上下载了十几张猫和狗的图片,用于检验我们训练好的模型. 处理我们下 ...

  4. AlexNet 实现猫狗分类(keras and pytorch)

    AlexNet 实现猫狗分类 前言 在训练网络过程中遇到了很多问题,先在这里抱怨一下,没有硬件条件去使用庞大的ImageNet2012 数据集 .所以在选择合适的数据集上走了些弯路,最后选择有kagg ...

  5. 用Tensorflow实现AlexNet识别猫狗数据集(猫狗大战)【附代码】

    AlexNet识别猫狗数据集 一.下载猫狗数据集 二.AlexNet实现 1.划分训练集和测试集 2.将训练集和测试集图片放缩为224x224 3.AlexNet实现 4.训练过程 5.模型测试 三. ...

  6. Pytorch采用AlexNet实现猫狗数据集分类(训练与预测)

    Pytorch采用AlexNet实现猫狗数据集分类(训练与预测) 介绍 AlexNet网络模型 猫狗数据集 AlexNet网络训练 训练全代码 预测 预测图片 介绍 AlexNet模型是CNN网络中经 ...

  7. python 图片比较 猫_TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片

    本文逻辑: 我从网上下载了十几张猫和狗的图片,用于检验我们训练好的模型. 处理我们下载的图片 加载模型 将图片输入模型进行检验 代码如下: #coding=utf-8 import tensorflo ...

  8. 猫、狗与Java的多态

    多态(Polymorphism)按字面的意思就是"多种状态".在面向对象语言中,接口的多种不同的实现方式即为多态.引用Charlie Calverts对多态的描述--多态性是允许你 ...

  9. 怎样教一台计算机区分猫和狗?一文零基础入坑机器学习

    导读:机器学习是一个快速发展的研究领域,主要关注设计和分析能让计算机学习的算法.作为一门新兴学科,尽管有待发掘的知识比已经掌握的知识要多得多,但当前的机器学习方法已经被用于教计算机执行各种各样有用的任 ...

最新文章

  1. HTTP协议中的chunked编码解析
  2. numpy 中的三个特别的索引操作 c_, r_, s_
  3. 使用async/await——Nodejs+ExpressJs+Babel
  4. java线程池_Java多线程并发:线程基本方法+线程池原理+阻塞队列原理技术分享...
  5. CRMEB微信商城源码下载
  6. beautiful sentences
  7. Scrapy+ Selenium处理广告
  8. bootstrap API地址
  9. 强化顶层设计 巩固网络安全
  10. Jsp+Servlet+Mysql实现的二手物品在线商城源码
  11. 瑞银报告 | 美国银行业科技支出:凡有的,还要加给他,叫他有余...
  12. python之---子类父类属性之间的关系
  13. 2021-08-06MATLAB深度学习简单应用
  14. 基于springboot社区疫情防控管理系统
  15. 2021数学建模E题
  16. 2022新版小额借贷系统源码+新增APP下载页面/内附教程
  17. ROS 教程2 机器人雷达建图 蒙特卡洛定位 导航 路径规划 仿真
  18. 飞腾S2500平台PCIe SWITCH下热插拔验证
  19. 【Google论文】The Google File System 译文
  20. 移动硬盘无法读取怎么修复?

热门文章

  1. Unity--四元数详解
  2. 一键自动生成幻灯片的AI PPT软件,让你轻松制作PPT
  3. (一) OpenMP介绍
  4. 【Anolis OS】龙蜥操作系统(Anolis OS) 8.6安装指南
  5. Java验证字符串是否含有特殊符号
  6. python损失函数实现_在Keras中实现自定义损失函数
  7. Mip22:一款高级网络钓鱼安全测试工具
  8. jquery中unbind和bind的用法
  9. hive金额怎么转换千位分隔符_sql 数据转换 千位分隔符
  10. KANO模型——确定需求优先级的神器