基于卷积神经网络(CNN)的猫狗识别

目录

引言

1.什么是卷积神经网络?

1.1什么是神经网络?

1.2什么是卷积?

2.准备工作

2.1一些知识:

2.2keras

2.3Conv2D

2.4 MaxPooling2D

3.基于卷积神经网络的猫狗识别

3.1导入必要库

3.2模型定义

3.3实例化模型并训练

3.4获取验证的图片

3.5进行验证

3.6显示预测结果

 4.总结

5.代码及数据集


引言

首先,我们看几张图片:

作为人类,我们很轻松就能识别出第一张是猫,后两张是狗。为什么我们知道呢?因为从小我们的爸妈,我们的老师,周围的所有人都指着狗对我们说它是狗,指着猫对我们说它是猫。换句话来说,是别人教我们的,所以我们现在才能识别出猫狗。而对于计算机呢?没有人教它,这些丰富多彩的图片在它眼里,无非都是一个个像素点构成的数字矩阵。该怎么让他识别出来呢?这就是今天所用的卷积神经网络。


1.什么是卷积神经网络?

1.1什么是神经网络?

顾名思义,神经网络是类似于人脑神经元的一种东西。学过生物的我们都知道,神经元彼此之间相互联系,传入一个信号后,可以在神经元之间不断传递,最终促使肌体做出反应,比如被针扎了之后会马上缩手。你也可以笼统的认为神经网络就是一个函数,传入一个或多个参数后,经过一系列变换,输出一个或多个参数。最简单的以y=x+1为例,传入一个值就能输出一个值,当传入x=2的时候输出3,x=3的时候输出4。不过,真正的神经网络要复杂的多。这里以BP神经网络为例:

 目前,你只需要知道神经网络是一个大函数就行,传入输入,传出输出。

想要继续深入学习可以参考:到底什么是神经网络?

1.2什么是卷积?

首先,给出卷积的公式:

积看出来了,f(t)和g(t)的积,那卷在哪里呢?笔者认为,卷在两个方面:

第一卷是如果将f(t)和g(t)的图像放在同一垂直面上,对应点之间的连线是相互交织在一起的,如果将g函数翻转一下,是不是就舒服很多了呢?

 第二卷是g函数不等于卷积核,g函数要旋转180度之后才是卷积核。

可参考:卷积神经网络卷在哪里? 

强烈推荐:从“卷积”、到“图像卷积操作”、再到“卷积神经网络”,“卷积”意义的3次改变

2.准备工作

2.1一些知识:

1.眼睛只完成图像的摄取功能,识别的关键在于人脑。而人脑对图像的识别是层层抽像的。

2.人工神经元及神经网络模拟了大脑的神经元及其连接。

3.计算机看到的图片是一个个代表明暗的数字。彩色图片是由RGB三色组成的。

4.神经网络需要训练来得到最佳的模型参数。

5.卷积神经网络主要的设计思想是更好的利用图片的性质。

  • 图片的模式比图片小的多

  • 图片中的模式出现在图像的不同区域

  • 缩放不影响图片中的物体

6.卷积层就是在图片中扫描特征

7.最大池化层就是在缩放图片,减少参数。

8.多次的卷积和池化后,再经过flatten连接一个全连接层

2.2keras

  1. keras是一个用python编写的高级神经网络APL

  2. sequential模型

import keras
from keras import layers
model = keras.Sequential()  #建立模型
model.add(layers.Dense(20,activation="relu",input_shape=(10,))) # 加了一个全连接层 (神经元数量,激活函数,输入的参数值数量:10个参数)
model.add(layers.Dense(20,activation="relu"))  # 再加一个全连接层
model.add(layers.Dense(10,activation="softmax")) # 同上
model.fit(x,y,epochs=10,batch_size=32)  #模型训练: x是图片,y是图形标签 epochs:每张图片看、训练10遍 batch_size:一次只传入32张图片
  • keras. Sequential() 建立函数

  • model.add() 添加层

  • model.fit() 训练模型

2.3Conv2D

keras.layers.Conv2D(filters,kernel_size,strides=(1,1),padding="valid",data_formt=None))
  • filters:整数,输出空间的维度,卷积核的数量

  • kernel_size:一个整数,或者2个整数代表的元组或列表,指明2D卷积窗口的宽度和高度,可以是一个整数,为所有空间维度指定相同的值。

  • strides:一个整数,或者2个整数代表的元组或列表,指明卷积沿宽度和高度方向的步长。可以是一个整数,为所有空间维度指定相同的值。

  • padding:"valid"或者"same",大小写敏感,用于边缘处理部分。

2.4 MaxPooling2D

keras.layers.MaxPooling2D(pool_size=(2,2),strides=None,padding="valid",data_format =None)
  • pool_size:整数,或者2个整数表示的元组,沿(垂直,水平)方向缩小比例的因数。(2,2)会把输入张量的两个维度都缩小一半。如果只使用一个整数,那么两个维度都会使用同样的窗口长度。

  • strides:整数,2个整数表示的元组,或者是None。表示步长值。如果是None,那么默认值是pool_size。

  • padding:"valid"或者“same"

3.基于卷积神经网络的猫狗识别

3.1导入必要库

import sys
from matplotlib import pyplot
from keras.utils import to_categorical
from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPool2D
from keras.layers import Dense
from keras.layers import Flatten
from keras.optimizers import SGD
from keras.preprocessing.image import ImageDataGenerator
from keras.models import load_model
import tensorflow as tf
tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)

 这一部分自己安装就可以,pip install 对应库名,受网络问题可能会有点慢。

3.2模型定义

def define_cnn_model():# 使用Sequential序列模型model = Sequential()# 卷积层model.add(Conv2D(32,(3,3),activation="relu",padding="same",input_shape=(200,200,3)))  # 第一层即为卷积层,要设置输入进来图片的样式  3是颜色通道个数# 最大池化层model.add(MaxPool2D((2,2)))  # 池化窗格# Flatten层model.add(Flatten())# 全连接层model.add(Dense(128,activation="relu"))  # 128为神经元的个数model.add(Dense(1,activation="sigmoid"))# 编译模型opt = SGD(lr= 0.001,momentum=0.9)  # 随机梯度model.compile(optimizer=opt,loss="binary_crossentropy",metrics=["accuracy"])return model

首先创建一个Sequential模型

添加一个卷积层,第一个参数是卷积核的数量,第二个是卷积核的规格,(3,3)即为3*3的,第三个参数是激活函数类型,第四个是边缘的处理办法,第五个因为第一层即为卷积层,要定义输入图片的规格(200,200,3)即为200*200,3说明是彩色图片。

再添加一个池化层,(2,2)说明每2*2化作一个窗格。

再添加一个Flatten层,将池化后的结果展开;

再添加一个全连接层,第一个参数是神经元个数,第二个参数是激活函数的类型;

最后再添加一个全连接层输出结果,注意我们的结果需判断猫狗就行,因此一个神经元就行。

最后用随机梯度编译模型,这一块感兴趣的同学可以自己查阅资料学习。

3.3实例化模型并训练

def train_cnn_model():# 实例化模型model = define_cnn_model()# 创建图片生成器datagen = ImageDataGenerator(rescale=1.0/255.0)train_it = datagen.flow_from_directory("./ma1ogo3ushu4ju4ji2/dogs_cats/data/train/",class_mode="binary",batch_size=64,target_size=(200, 200))  # batch_size:一次拿出多少张照片 targe_size:将图片缩放到一定比例# 训练模型model.fit_generator(train_it,steps_per_epoch=len(train_it),epochs=5,verbose=1)model.save("my_model.h5")

首先调用3.2的函数实例化模型,紧接着创建图片生成器:这个作用就是把文件夹中的图片传入模型中训练,知道就行。里面的参数batch_size是规定一次只能传入64张图片,这样可以有效地避免内存的问题。训练模型中一个重要参数epochs,这里设置为5,说明传入的图片他要学习5次。比如,这里我总共传入了2500张图片,它学习了五次,也就是12500张图片。这样的重复学习,可以有效提高进度,但是当你值调整比较大时,会非常耗时。最后将训练好的模型保存到项目文件夹下。

3.4获取验证的图片

def read_random_image():folder = r"./ma1ogo3ushu4ju4ji2/dogs_cats/data/test/"file_path = folder + random.choice(os.listdir(folder))pil_im = Image.open(file_path, 'r')return pil_im

3.5进行验证

def get_predict(pil_im,model):# 首先更改图片的大小name = ''pil_im = pil_im.resize((200,200))# 将格式转为numpy array格式array_im = np.asarray(pil_im)# array_im = array_im.resize((4,4))array_im = array_im[np.newaxis,:]#对图像检测result = model.predict([[array_im]])if result[0][0]>0.5:name = "它是狗!"print("预测结果是:狗")else:name = "它是猫!"print("预测结果是:猫")return name

注意一行代码:

array_im = array_im[np.newaxis,:]

上一行的array_im 是一个三维数组,不符合运行规范,这里要将其转化为四位数组,否则会报错!

3.6显示预测结果

pil_im =read_random_image()
imshow(np.asarray(pil_im))
plt.title(get_predict(pil_im,model))
pylab.show()

到这里就大功告成啦!看一下我们的预测结果:

总体来看,预测效果还是不错的,学习次数在5次的情况下,准确度可以达到70%,感兴趣的话,也可以将学习次数调大一点,看看效果!红色警告是由于GPU和CPU的处理问题,你可以暂时忽略。

 4.总结

这个猫狗项目只是一个入门项目,但是它的思想很重要。想想看,只要我们有数据,有模型是不是就能让计算机认识任何我们想要认识的东西。手机的人脸识别,支付宝的人脸支付,甚至在未来有没有可能在无人机上装个摄像头去帮我们抓捕犯罪嫌疑人?人工智能的世界很开阔,未来等着我们去探索!

笔者为入门初学者,所以难免会有错误,欢迎大家指正,感兴趣的话可以在评论区一起交流!

5.代码及数据集

第一部分代码为:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project :神经网络猫狗识别 
@File    :CNN.py
@IDE     :PyCharm 
@Author  :咋
@Date    :2022/10/2 10:37 
"""
import sys
from matplotlib import pyplot
from keras.utils import to_categorical
from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPool2D
from keras.layers import Dense
from keras.layers import Flatten
from keras.optimizers import SGD
from keras.preprocessing.image import ImageDataGenerator
from keras.models import load_model
import tensorflow as tf
tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)def define_cnn_model():# 使用Sequential序列模型model = Sequential()# 卷积层model.add(Conv2D(32,(3,3),activation="relu",padding="same",input_shape=(200,200,3)))  # 第一层即为卷积层,要设置输入进来图片的样式  3是颜色通道个数# 最大池化层model.add(MaxPool2D((2,2)))  # 池化窗格# Flatten层model.add(Flatten())# 全连接层model.add(Dense(128,activation="relu"))  # 128为神经元的个数model.add(Dense(1,activation="sigmoid"))# 编译模型opt = SGD(lr= 0.001,momentum=0.9)  # 随机梯度model.compile(optimizer=opt,loss="binary_crossentropy",metrics=["accuracy"])return modeldef train_cnn_model():# 实例化模型model = define_cnn_model()# 创建图片生成器datagen = ImageDataGenerator(rescale=1.0/255.0)train_it = datagen.flow_from_directory("./ma1ogo3ushu4ju4ji2/dogs_cats/data/train/",class_mode="binary",batch_size=64,target_size=(200, 200))  # batch_size:一次拿出多少张照片 targe_size:将图片缩放到一定比例# 训练模型model.fit_generator(train_it,steps_per_epoch=len(train_it),epochs=5,verbose=1)model.save("my_model.h5")
train_cnn_model()

第二部分代码:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project :神经网络猫狗识别 
@File    :CNN_test.py
@IDE     :PyCharm 
@Author  :咋
@Date    :2022/10/2 12:12 
"""import os,random
import matplotlib.pyplot as plt
from keras.models import load_model
from matplotlib.pyplot import imshow
import numpy as np
from PIL import Image
model_path = "my_model.h5"
model = load_model(model_path)
import pylab
plt.rcParams['font.sans-serif']=['SimHei']
def read_random_image():folder = r"./ma1ogo3ushu4ju4ji2/dogs_cats/data/test/"file_path = folder + random.choice(os.listdir(folder))pil_im = Image.open(file_path, 'r')return pil_imdef get_predict(pil_im,model):# 首先更改图片的大小name = ''pil_im = pil_im.resize((200,200))# 将格式转为numpy array格式array_im = np.asarray(pil_im)# array_im = array_im.resize((4,4))array_im = array_im[np.newaxis,:]#对图像检测result = model.predict([[array_im]])if result[0][0]>0.5:name = "它是狗!"print("预测结果是:狗")else:name = "它是猫!"print("预测结果是:猫")return name
pil_im =read_random_image()
imshow(np.asarray(pil_im))
plt.title(get_predict(pil_im,model))
pylab.show()

 数据集下载链接:猫狗数据集

视频教学连接:基于卷积神经网络的猫狗识别

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/48870.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用卷积神经网络构建图像分类模型检测肺炎

在本篇文章中,我将概述如何使用卷积神经网络构建可靠的图像分类模型,以便从胸部x光图像中检测肺炎的存在。 肺炎是一种常见的感染,它使肺部的气囊发炎,引起呼吸困难和发烧等症状。尽管肺炎并不难治疗,但及时诊断是至关…

实验3:卷积神经网络图像分类

卷积神经网络图像分类 1 理解卷积神经网络1.1 搭建环境1.2 猫狗分析实例 2 卷积神经网络2.1 网络模型搭建2.2 使用图像生成器读取图片 本次实验将完成以下任务: 按照 python笔记本深度学习,利用TensorFlow和Keras,自己搭建卷积神经网络完成狗猫数据集的分…

Python-猫狗数据集两阶段分类 原始数据直接训练;数据增强后训练

本博客运行环境为Jupyter Notebook-Python3.7。 由于我使用的是Anaconda3配置的jupyter环境,我也将直接在anaconda下搭建keras环境。 博客目录 下载tensorflow、keras下载数据集并重新划分数据预处理训练数据增强 由于我电脑性能不是很好,又是AMD显卡的…

python+基于Jupyter notebook完成卷积神经网络笑脸识别

一、用卷积神经网络实现,做笑脸、非笑脸等表情识别 1.数据集 2.将下载里面的datasets,放到D盘新建的smile中, 1.根据猫狗数据集训练的方法来训练笑脸数据集 1.首先将train_folder文件夹下俩个文件夹内的图片的名字做修改。(修…

使用预先训练网络和特征抽取大力提升图像识别率

神经网络在项目实践中遇到的一大问题是数据不足。任何人工智能项目,在数据不足面前都会巧妇难为无米之炊,算法再精巧,只要数据量不足,最后的效果都不尽如人意,我们目前正在做的图像识别就是如此,要想让网络…

笑脸数据集、口罩数据集划分、训练、测试(jupyter notebook)

一、HOG,Dlib,卷积神经网络介绍 1、HoG ①方法简介 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的描述子。通过计算和统计局部区域的梯度方向直方图来构成特征。Ho…

Deep Learning with Python 系列笔记(三):计算机视觉

计算机视觉的深度学习 我们将深入探讨卷积的原理以及为什么它们在计算机视觉任务中如此成功。但首先,让我们来看看一个非常简单的“convnet”示例,我们将使用我们的convnet来对MNIST数字进行分类。 下面的6行代码展示了基本的convnet是什么样子的。它是…

基于Keras实现Kaggle2013--Dogs vs. Cats12500张猫狗图像的精准分类

【下载数据集】 下载链接–百度网盘 【整理数据集】 将训练数据集分割成训练集、验证集、测试集,目录结构如图所示: 在Pycharm中新建项目,创建split_dataset.pyimport os, shutil# 数据集解压之后的目录 original_dataset_dir = D:\kaggle\dogsvscats\\train # 存放小数据集…

使用tensorflow搭建分类神经网络以及迁移学习(训练过程)

*************************************************** 码字不易,收藏之余,别忘了给我点个赞吧! *************************************************** ---------Start 本文不涉及tensorflow环境配置过程,只讲解整个项目代码…

基于卷积神经网络的图像识别技术从入门到深爱(理论思想与代码实践齐飞)

基于卷积神经网络的图像识别技术从入门到深爱(理论与代码实践齐飞!) 零、前言一、手写数字识别入门神经网络(入门篇)1. 手写数字数据集及神经网络数据概念介绍1.1 手写数字数据集1.2 神经网络数据集1.3 基于tensorflow…

卷积神经网络实现人脸识别微笑检测

一:卷积神经网络介绍: 1. 定义: 卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习&a…

【053】ImageDataGenerator() 介绍

内容目录 一、ImageDataGenerator() 介绍二、数据增强处理和类的构造函数参数1、数据增强处理(data augmentation)2、ImageDataGenerator类的构造函数参数三、一般的对图像的处理流程四、ImageDataGenerator的所有方法介绍1、fit方法2、flow方法3、flow_…

2020中国华录杯·数据湖算法大赛—定向算法赛(吸烟打电话检测)baseline-tensorflow2.3-python3.6

文章目录 1.赛事背景1.主办方2.赛事介绍 2.baseline2.1 文件夹结构2.2 demo1. 01_train_test_split.py2. 02_tf2_mobilev2_classes.py3. 03_predict.py 3.问题及改进4.修改记录 1.赛事背景 1.主办方 赛事链接训练集测试集验证集 2.赛事介绍 1. 【赛题描述】行为规范&#xf…

卷积神经网络实现表情识别

卷积神经网络实现表情识别 CNN人脸表情识别图片预处理原本效果处理后效果 图片数据集效果 CNN人脸识别创建模型归一化与数据增强创建网络 摄像头人脸识别图片识别 参考 CNN人脸表情识别 图片预处理 import dlib # 人脸识别的库dlib import numpy as np # 数据处理的库numpy…

Tensorflow 2.5 model.evaluate报错Invalid argument: required broadcastable shapes at loc(unknown)

Tensorflow 2.5使用model.evaluate进行模型评估时报错Invalid argument: required broadcastable shapes at loc unknown 1.软件环境⚙️2.问题描述🔍3.解决方法🐡4.结果预览🤔 ⚡插播一条老家自产的糖心苹果,多个品种&#xff0c…

推荐收藏!3.5万字图解 Pandas!

↓推荐关注↓ 大家好,在 Python 各个工具包中,最频繁使用的应该就是 Pandas 了。今天我以图解的方式给大家介绍 Pandas 中各种常用的操作,内容有点长,喜欢记得点赞、收藏、关注。 第一部分:Pandas 展示 请看下表: 它描…

ONLYOFFICE 文档 7.4 版本现已发布:新增绘图、雷达图、合并文档、另存为图片等功能

您现在可以使用我们最新版本的在线编辑器了,更新的功能包括:绘图、雷达图、合并文档、将某个对象或者整个文档/工作表保存为图片、更强大的编辑区域保护等等。继续阅读本文了解所有的更新。 在编辑器中绘图 尽情发挥创造力,使用画笔或荧光笔…

四十不惑-重头再来

四十不惑-重头再来 重装系统系统版本 卸载老毛桃自动安装的软件安装必备软件安装Docker DeskTop安装Docker Desktop后重启系统运行Power Shell切换环境重新运行PS DockerDesktop导入镜像启动DockeDesktop启动PS 新建容器搭建ChatGPT(pengzhile_pandora_latest_43f234c4e8a8)搭建…

大学生必备神器

大学生要掌握的办公软件因专业和工作需求而异,但是以下是一些普遍适用于大学生的办公软件,可以帮助提高学习和工作效率,今天就给大家推荐几款大学生常用的软件。 1.OneDrive 这是微软出品的云存储产品,与百度网盘有些类似&#…

北极九章CEO刘沂鑫:从自然语言一步直达数据洞察——数据驱动增长的新范式|量子位·视点分享回顾...

视点 发自 凹非寺量子位 | 公众号 QbitAI 今天,尽管人人都在谈论大数据,但数据实际价值和现有价值有巨大落差。 尽管企业采集和储存、计算数据的能力越来越强,但数据分析能力始终增长缓慢。据Forrester调研,约70%的企业数据从未被…