基于CNN算法自定义模型的动物识别项目1

  • 资源文件
  • 一、数据集介绍
  • 二、开发步骤
    • 1.引入库
    • 2.定义模型
    • 3.定义优化器
    • 4.训练数据增强
    • 5.测试数据归一化
    • 6.数据生成
    • 7.查看类别定义
    • 8.训练模型
    • 9.模型可视化
    • 10.显示指定层
    • 11.预测每一层输出
    • 12.可视化单层网络输出
    • 13.增强可视化效果
    • 14.可视化所有中间网络层
    • 15.验证模型预测结果

资源文件

15种常见动物识别数据集


一、数据集介绍

(1)数据集分为训练集train、测试集test两部分
(2)动物类别:bird、cat、cattle、chicken、dog、dolphin、duck、elephant、giraffe、monkey、pig、rabbit、rat、sheep、tiger。
(3)train数据集中每类动物有200张图片
(4)test数据集中每类动物有20张图片

二、开发步骤

1.引入库

from keras.models import Sequential
from keras.layers import Conv2D,MaxPool2D,Dropout,Flatten,Dense
from keras.optimizers import Adam
from keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt
from keras_preprocessing.image import img_to_array,load_img
from keras.models import load_model
from keras import models
from keras.preprocessing import image
import numpy as np

2.定义模型

#定义模型
model = Sequential()
# 150*150*3的彩色图片 32个卷积核 卷积核大小3*3 RELU激活函数
model.add(Conv2D(input_shape=(150,150,3),filters=32,kernel_size=3,padding='same',activation='relu'))
model.add(Conv2D(filters=32,kernel_size=3,padding='same',activation='relu'))
# 池化大小2  池化步长2
model.add(MaxPool2D(pool_size=2,strides=2))model.add(Conv2D(filters=64,kernel_size=3,padding='same',activation='relu'))
model.add(Conv2D(filters=64,kernel_size=3,padding='same',activation='relu'))
model.add(MaxPool2D(pool_size=2,strides=2))model.add(Conv2D(filters=128,kernel_size=3,padding='same',activation='relu'))
model.add(Conv2D(filters=128,kernel_size=3,padding='same',activation='relu'))
model.add(MaxPool2D(pool_size=2,strides=2))
# 得到二维特征图
# 转换变成一维
model.add(Flatten())
model.add(Dense(64,activation='relu')) # 全连接层
model.add(Dropout(0.5))  #抵抗过拟合
model.add(Dense(15,activation='softmax'))  #15为15分类,一般用在分类任务的输出层
model.summary()


3.定义优化器

#定义优化器,交叉熵计算准确率,optimizer梯度下降的优化方法
adam = Adam(lr=1e-4)
model.compile(optimizer=adam,loss='categorical_crossentropy',metrics=['accuracy'])

4.训练数据增强

train_datagen = ImageDataGenerator(rotation_range=40,width_shift_range=0.2, #随机旋转度数height_shift_range=0.2, #随机水平位移rescale=1/255, #数据归一化shear_range=0.2, #随机裁剪zoom_range=0.2, #随机放大horizontal_flip=True, #水平翻转fill_mode='nearest', #填充方式
)

5.测试数据归一化

test_data = ImageDataGenerator(rescale=1/255, #数据归一化
)

6.数据生成

# 定义数据生成
batch_size = 32  #每次传32张照片#生成训练数据
train_generator = train_datagen.flow_from_directory('/BASICCNN/image/train',target_size=(150,150),batch_size=batch_size,
)#生成测试数据
test_generator = test_data.flow_from_directory('/BASICCNN/image/test',target_size=(150,150),batch_size=batch_size,
)

7.查看类别定义

print(train_generator.class_indices)


8.训练模型

#训练模型 20个周期 测试集数据
history=model.fit_generator(train_generator,epochs=20,validation_data=test_generator)
model.save('/BASICCNN/TrainModel_h5/model_CNNTrain.h5')


9.模型可视化

#训练模型可视化
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('Model_Accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epochs')
plt.legend(['Train_Accuracy','Valid_Accuracy'],loc='upper left')
plt.savefig('/BASICCNN/TrainImage/CNNTrain_accuracy.png')
plt.show()plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model_Loss')
plt.ylabel('Loss')
plt.xlabel('Epochs')
plt.legend(['Train_Loss','Valid_Loss'],loc='upper left')
plt.savefig('/BASICCNN/TrainImage/CNNTrain_loss.png')
plt.show()


10.显示指定层

#通过model的属性layers查询模型中的各层
model.layers
print(len(model.layers))
#通过各层的属性output获取各层输出张量
layer_outputs = [layer.output for layer in model.layers[:9]]
#创建新的模型,一个输入,多个输出
new_model = models.Model(inputs=model.input,outputs=layer_outputs)

11.预测每一层输出

#加载测试图片
img_path = '/BASICCNN/image/test/duck/duck.1010.jpg'
img = image.load_img(img_path,target_size=(150,150))
plt.imshow(img)
#图片预处理
#(1)将image转化为数组
img_tensor_3D = image.img_to_array(img)
#(2)由3D扩展为4D
img_tensor_4D = np.expand_dims(img_tensor_3D,axis=0)
#(3)归一化处理
img_tensor_4D = img_tensor_4D/255.
print(img_tensor_4D.shape)
img_tensor_4D
#将第二部分处理后的图片张量作为输入,得到各层实际输出张量值,使用model.predict()
activations = new_model.predict(img_tensor_4D)
#(1)查看第1层输出的张量值,输出张量空间大小可与model.summary()比对
first_layer_activation = activations[0]
print(first_layer_activation.shape)
print(first_layer_activation[0][0][0][0])
print(activations[2].shape)

12.可视化单层网络输出

plt.imshow(first_layer_activation[0,:,:,0],cmap='viridis')
plt.matshow(first_layer_activation[0,:,:,3],cmap='viridis')

13.增强可视化效果

characters = activations[0][0,:,:,0]
characters -= characters.mean() #平均值
characters /= characters.std()  #标准差
characters *=64
characters +=128
characters = np.clip(characters,0,255).astype('uint8')plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
ax1 = plt.subplot(121)
ax1.set_title('原始数据可视化效果')
ax1.imshow(activations[0][0,:,:,0],cmap='viridis')
ax2 = plt.subplot(122)
ax2.set_title('处理后数据可视化效果')
ax2.imshow(characters,cmap='viridis')
plt.savefig('/BASICCNN/TrainImage/CNN_TestGen_layer1.png')
characters


14.可视化所有中间网络层

layer_name = []
for i in model.layers[:9]:layer_name.append(i.name)
print(layer_name)images_per_row = 16
for name,act in zip(layer_name,activations):n_features = act.shape[-1]rows = n_features//images_per_rowsize = act.shape[1]display_grid = np.zeros((size*rows,size*images_per_row))for r in range(rows):for k in range(images_per_row):channel_img = act[0,:,:,r*images_per_row+k]channel_img -= channel_img.mean() #平均值# channel_img /= channel_img.std()channel_img *=64channel_img +=128channel_img = np.clip(channel_img,0,255).astype('uint8')display_grid[r*size:(r+1)*size,k*size:(k+1)*size] = channel_imgscale = 1./sizescale = 1./sizefig = plt.figure(figsize=(scale*display_grid.shape[1],scale*display_grid.shape[0]))plt.title(name)plt.grid(False)plt.imshow(display_grid,aspect='auto',cmap='viridis')plt.axis('off')fig.savefig('/BASICCNN/TrainImage/CNNintlayer' + str(k) + '.png')plt.show()plt.cla()plt.close('all')

15.验证模型预测结果

label = np.array(['bird', 'cat', 'cattle', 'chicken', 'dog', 'dolphin', 'duck', 'elephant','giraffe', 'monkey', 'pig', 'rabbit', 'rat', 'sheep', 'tiger'])
# 载入模型
model = load_model('/BASICCNN/TrainModel_h5/model_CNNTrain.h5')
# 导入图片
image = load_img('image/test/bird/bird.1010.jpg')
image = image.resize((150,150))
image = img_to_array(image)
image = image/255
image = np.expand_dims(image,0)
image.shapeprint(label[model.predict_classes(image)])

基于CNN算法自定义模型的动物识别项目1相关推荐

  1. 基于CNN的MINIST手写数字识别项目代码以及原理详解

    文章目录 项目简介 项目下载地址 项目开发软件环境 项目开发硬件环境 前言 一.数据加载的作用 二.Pytorch进行数据加载所需工具 2.1 Dataset 2.2 Dataloader 2.3 T ...

  2. 【智能算法】基于CNN算法深度学习车辆识别

    目录 1.基于CNN算法深度学习车辆识别 2.文件准备 3.结果展示 1.基于CNN算法深度学习车辆识别 // The contents of this file are in the public ...

  3. [当人工智能遇上安全] 5.基于机器学习算法的主机恶意代码识别研究

    您或许知道,作者后续分享网络安全的文章会越来越少.但如果您想学习人工智能和安全结合的应用,您就有福利了,作者将重新打造一个<当人工智能遇上安全>系列博客,详细介绍人工智能与安全相关的论文. ...

  4. Deep Learning:基于pytorch搭建神经网络的花朵种类识别项目(内涵完整文件和代码)—超详细完整实战教程

    基于pytorch的深度学习花朵种类识别项目完整教程(内涵完整文件和代码) 相关链接:: 超详细--CNN卷积神经网络教程(零基础到实战) 大白话pytorch基本知识点及语法+项目实战 文章目录 基 ...

  5. gcn在图像上的应用_每日摘要|基于CNN 特征的图像卷积网络识别杂草和作物

    文章信息 标题:CNN feature based graph convolutional network for weed and crop recognition in smart farming ...

  6. Ubuntu22 Docker运行SRS流媒体服务,推拉流,yolov5训练自定义模型进行视频流识别

    首先安装docker,设置系统启动 sudo apt-get install -y docker.io sudo systemctl start docker 查看docker进程 ps -ef|gr ...

  7. 深度学习案例之基于 CNN 的 MNIST 手写数字识别

    一.模型结构 本文只涉及利用Tensorflow实现CNN的手写数字识别,CNN的内容请参考:卷积神经网络(CNN) MNIST数据集的格式与数据预处理代码input_data.py的讲解请参考 :T ...

  8. 毕设:基于CNN卷积神经网络的猫狗识别、狗品种识别(Tensorflow、Keras、Kaggle竞赛)

    基于卷积神经网络的图像识别算法及其应用研究 毕业快一年了,拿出来分享给大家,我和网上唯一的区别就是,我能够同时实现两个方案(猫狗识别和狗品种识别),我当时也是网上各种查,花了2,3个月的时间,一个萝卜 ...

  9. 基于神经网络算法LSTM模型对股票指数进行预测

    资源下载地址:https://download.csdn.net/download/sheziqiong/86813208 资源下载地址:https://download.csdn.net/downl ...

最新文章

  1. 拼音转汉字 和 字符编码测试
  2. maven项目下tomcat直接启动不了(LifecycleException)。报错如下截图
  3. POJ3267The Cow Lexicon
  4. 强大而优雅,API 研发管理 EOLINKER 新版正式发布!
  5. java反射 获取局部变量_Java反射:如何获取变量的名称?
  6. rem 前端字体_web前端入门到实战:一次搞懂CSS字体单位:px、em、rem和%
  7. 计算机硬件在线修复,计算机硬件维修
  8. 基于asp.net的网上书店商城设计与实现
  9. bootstrap 按钮样式单选效果_【20201117】Bootstrap前端框架学习笔记
  10. 莫烦python学习笔记之tuple,list,字典
  11. 杭电 hdu 2002
  12. XML Schema快速入门(三)语法之复杂类型
  13. ArcGIS栅格数据图层空间相关性分析方法
  14. 福昕高级PDF编辑器Mac版PDF编辑器注册机激活下载版
  15. 2012年8月11日
  16. 在ubuntu18.04系统上使用ROS跑ORB-SLAM3时遇到的问题总结
  17. mysqli被遗弃了_在您的申请中被遗忘的权利
  18. 思维改变生活:很多事情亲身经历之后才会明白
  19. 邻接矩阵的定义和例子
  20. 阿里云服务器选购指南(图文教程详解)

热门文章

  1. app的崩溃率标准,优秀,合格,轻微隐患,严重隐患
  2. 使用 Eclipse TPTP 测试 Web 应用的方法与扩展
  3. 【JZOJ 4598】准备食物
  4. DELL R510服务器RAID配置,Dell服务器硬RAID配置
  5. Postman 实用接口测试执行顺序
  6. SpringMVC——MVC思想、前端控制器、SpringMVC概述、编写第一个SpringMVC程序
  7. 普通人现在入局做抖音短视频晚么 选择项目的标准是什么
  8. 任正非:华为没有 996,更没有 007!
  9. 《Linux命令行与shell脚本大全》笔记
  10. [转载]只需要读内存实现的Dota全图