基于python+ResNet50算法实现一个图像分类识别系统入门

news2024/11/24 18:51:59

一、目录

  • ResNet50介绍
  • 图片模型训练预测
  • 项目扩展

在本文中将介绍使用Python语言,基于TensorFlow搭建ResNet50卷积神经网络对四种动物图像数据集进行训练,观察其模型训练效果。

二、ResNet50介绍

ResNet50是一种基于深度卷积神经网络(Convolutional Neural Network,CNN)的图像分类算法。它是由微软研究院的Kaiming He等人于2015年提出的,是ResNet系列中的一个重要成员。ResNet50相比于传统的CNN模型具有更深的网络结构,通过引入残差连接(residual connection)解决了深层网络训练过程中的梯度消失问题,有效提升了模型的性能。

  1. 深度卷积神经网络(CNN) CNN是一种专门用于图像处理的神经网络结构,具有层次化的特征提取能力。它通过交替使用卷积层、池化层和激活函数层,逐层地提取图像的特征,从而实现对图像的分类、检测等任务。然而,当网络结构变得非常深时,CNN模型容易面临梯度消失和模型退化的问题。
  2. 残差连接(Residual Connection) 残差连接是ResNet50的核心思想之一。在传统的CNN模型中,网络层之间的信息流是依次通过前一层到后一层,而且每一层的输出都需要经过激活函数处理。这种顺序传递信息的方式容易导致梯度消失的问题,尤其是在深层网络中。ResNet50通过在网络中引入残差连接,允许信息在网络层之间直接跳跃传递,从而解决了梯度消失的问题。
  3. 残差块(Residual Block) ResNet50中的基本构建块是残差块。每个残差块由两个卷积层组成,这两个卷积层分别称为主路径(main path)和跳跃连接(shortcut connection)。主路径中的卷积层用于提取特征,而跳跃连接直接将输入信息传递到主路径的输出上。通过将输入与主路径的输出相加,实现了信息的残差学习。此外,每个残差块中还使用批量归一化(Batch Normalization)和激活函数(如ReLU)来进一步提升模型的性能。
  4. ResNet50网络结构 ResNet50网络由多个残差块组成,其中包括了一些附加的层,如池化层和全连接层。整个网络的结构非常深,并且具有很强的特征提取能力。在ResNet50中,使用了50个卷积层,因此得名ResNet50。这些卷积层以不同的尺寸和深度对图像进行特征提取,使得模型能够捕捉到不同层次的特征。

三、模型训练预测

在本文中选取了常见的四种动物数据(猫、狗、马、鸡),文件夹结构如下图所示。

image-20230716184921484

image-20230716184939701

在完成数据集的收集准备后,打开jupyter notebook平台,导入数据集通过以下代码可以计算出数据集的总图片数量。本次使用的数据集总图片为4000张。

import pathlib

data_dir = "./dataset/"
data_dir = pathlib.Path(data_dir)
image_count = len(list(data_dir.glob('*/*')))
print("图片总数为:",image_count)

然后划分TensorFlow的image_dataset_from_directory方法划分测试集和训练集。再构建模型。在本文中如下图所示

# 加载resnet50模型
model = keras.applications.ResNet50(weights='imagenet', include_top=True)

这段代码的目的是使用Keras库加载预训练的ResNet50模型,并将其应用于图像分类任务。

具体解释如下:

  • keras.applications.ResNet50: 这是Keras库中的一个函数,用于加载ResNet50模型。ResNet50是一个已经定义好的模型架构,包含了数十个卷积层、池化层和全连接层,用于图像分类任务。

  • weights='imagenet': 这个参数指定了模型所使用的权重。'imagenet’是一个大规模的图像数据集,ResNet50在该数据集上进行了预训练,因此通过设置这个参数,我们可以加载已经在该数据集上训练好的权重。这样的预训练权重可以提供较好的特征表示能力,有助于提升模型在图像分类任务上的性能。

  • include_top=True: 这个参数指定是否包含模型的顶层(即全连接层)。当设置为True时,加载的模型将包含原始ResNet50模型的所有层,包括最后的全连接层,用于输出分类结果。如果我们只需要使用ResNet50的特征提取能力而不需要分类层,则可以将该参数设置为False。

然后开始训练,其训练过程如下图所示

image-20230716185849191

通过上图可知,通过20轮迭代训练,在最后一轮迭代完成后,模型在测试集上面的精度为0.9875,精度还是非常高的。接下来就是打印下ACC曲线图和LOSS曲线图以及混淆矩阵图等。通过图片可知,算法的拟合度还是比较理想的。

image-20230716190205600 image-20230716190227657 image-20230716190238279

三、项目扩展

在完成模型训练后,通过model.save方法保存模型为本地文件,然后就可以基于改模型开发出非常多的应用了,比如开发出API接口给别人调用等。

在本项目中基于Django框架开发了一个网页版的动物识别界面,在该网页界面系统中,用户可以点击鼠标上传一张动物图片,然后点击按钮进行检测。同时可以将相关识别的相关信息保存在数据库中,管理员通过登录后台可以查看所有的识别信息,为模型优化提供数据支持。

其效果图和演示界面如下所示,大家可以根据所学知识进行实现或访问:https://www.yuque.com/ziwu/yygu3z/ohtysy62ob1glubc。联系作者获取

  • 效果图片
image-20230716192115159

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT助力DevOps的优势与局限

一、前言 DevOps 是一种方法论,旨在提高软件开发和 IT 运营团队的协作和效率。DevOps 涉及各种任务和流程的自动化,例如规划、编码、测试、部署、监控和故障排除。然而,其中一些任务和流程仍然有大量任务需要人工手动处理,而这会…

Debian 系统安装中文输入法-iTOP3588开发板

Debian 系统烧写完成之后,并没有中文输入功能。本文档将介绍如何安装 ibus pinyin 输入法。 首先安装 fcitx 对应的工具,如下图所示: apt-get install fcitx fcitx-tools fcitx-config* fcitx-frontend* fcitx-module* fcitx-ui-* presage …

TDengine 的查询性能与老牌时序数据库相比如何?来看看

在上一篇文章《IoT 场景下写入性能:TDengine16.2 x InfluxDB》中,我们基于 IoT 场景下的 TSBS 时序数据库(Time Series Database)性能基准测试报告对三大数据库写入性能进行了相关解读,较为直观地展现出了 TDengine 的…

springboot @Async 异步调用接口处理数据

Async 异步背景 新增的数据需要分发给下游业务系统,由于下游业务系统状态未知,所以需要异步发送数据给下游业务系统。 系统生效按钮--->controller新增-->异步调用servcie--->数据集成 在springboot框架中实现步骤 首先在启动类上加上Enable…

数据分析:扩展企业微信、钉钉、飞书等告警通知渠道

本章节主要讲述如何扩展告警的通知渠道,以便将告警发送到第三方应用中 企业微信 实现目标 ●在鸿鹄中创建的告警被触发后,将告警通知发送至指定的企业微信群聊 配置步骤 1、打开“企业微信”,点击告警群右上角的“...”按钮 2、点击“群机器人…

opencv双目视觉标定、匹配和测量

双目视觉原理方面参照《学习Opencv》和大牛博客 http://blog.csdn.net/chenyusiyuan/article/details/5970799中16-19系列博客。本文主要记录我自己在双目视觉标定,立体匹配,测量中遇到的问题和解决方法,并附有代码,文末有代码下载的地址,欢迎交流。 博主使用的相机是USB双…

Android P 之Zygote进程源码分析

init进程是用户空间的第一个进程,而zygote进程则是第一个java进程。zygote进程是init进程的子进程,init进程通过解析rc文件,运行了zygote进程。 zygote是Android系统中一个相当重要的进程,它的主要功能就是执行Android应用程序。…

python 安装、配置、使用 xlrd模块、numpy模块

目录 一、xlrd模块 (一)安装xlrd模块 (二) pycharm 配置xlrd (三) 读取xls格式 (四)xlrd读取时间日期时,会是float类型,需要转换。 二、numpy模块 (一)n…

Docker 安装 MongoDB开启认证,创建只读用户权限。

创建带认证的mongdb容器 docker run -itd --name mongo -p 27017:27017 mongo --auth --auth 就是开启mongodb权限认证。如果不加 --auth 则是无权限认证,连接成功后任何用户都可以对数据库进行读写操作。 进入容器并创建用户 docker run -itd --name mongo -p 27…

九州云参与编写的《电力行业边缘计算白皮书》正式发布

近日,由中国通信标准化协会算网融合产业及标准推进委员会(CCSA TC621)牵头组织的2023算网融合产业发展峰会在北京成功召开。 会上,由中国信息通信研究院牵头联合北京航空航天大学、 国网信息通信产业集团、中国电力科学研究院、九…

区块链-java学习和劝退

字面意思:按照区域划分,每个区域通过可信的账本进行结算,将各个区域链接,形成小中心,大整体的财务结算认证体系; 1、学习前准备 您最好掌握一定的财务基本知识; 2、学习步骤 1)区…

❤️创意网页:如何创建一个漂亮的3D正六边形

✨博主:命运之光 🌸专栏:Python星辰秘典 🐳专栏:web开发(简单好用又好看) ❤️专栏:Java经典程序设计 ☀️博主的其他文章:点击进入博主的主页 前言:欢迎踏入…

Windows系统如何查看物理cpu核数?

Step1:WinR 打开cmd; Step2:输入dxdiag后,回车; Step3:即可查看:

Word字间距怎么调整?2023最新方法总结!

“作为一个Word新手,里面的好多功能我都没有弄清楚。今天正好写了一篇文章,但不知道应该怎么调整字间距。有朋友知道Word字间距怎么调的吗?快教教我!” Word作为一个便捷的办公软件,让我们的工作更方便。学习好Word的使…

CentOS 安装字体 微软雅黑

fc-list命令查看已经安装的字体 fc-list :langzh命令可以查看已安装的中文字体 找到windows系统里面的字体 上传到服务器 /usr/share/fonts/winFonts 下,winFonts目录是自己建立的,名称无要求 如果C:\Windows\Fonts下的字体没法直接传输将这个文件夹复…

vulnhub靶场noob:1

靶机下载地址:Noob: 1 ~ VulnHub Arp发现主机 arp-scan -l 扫描端口 nmap --min-rate 10000 -p- 192.168.21.132 扫描端口的服务版本号以及操作系统 nmap -sV -sT -sC -O -p21,80 192.168.21.132 可以看到ftp里面有文件,web是php 扫描基础漏洞 nma…

12 从0开始学PyTorch| PyTorch全连接网络:建立区分鸟和飞机的模型

上一小节我们终于开始搭建神经网络了,只不过它很简单,并且对我们更早的时候做的温度计转换模型做了一次迭代,甚至连效果都没有太大的变化,这一小节我们开始处理一些有意思的事情:做一个图像分类的模型。 小图像数据集…

Flink数据流

文章目录 一.基本概念二.Flink和Spark三. Flink配置文件四. yarn部署flink4.1 session-cluster模式4.2 pre-job-cluster模式 五.Flink运行时架构5.1 任务提交流程5.2 如何实现并行计算5.3 并行任务需要占用多少slot5.4 一个流处理包含多少任务 一.基本概念 官网介绍 Apache F…

css 禁止多次点击导致的选中了目标div的文字

像下面这样的情况,就可以用这种方法避免掉 禁止多次点击,导致的,选中了目标div的文字 或者 禁止多次点击,导致,html结构被选中显示出来 .targetDiv {-webkit-user-select: none;-moz-user-select: none;-ms-user-sel…

Vue3卡片(Card)

可自定义设置以下属性: 卡片宽度(width),类型:number | string,默认 ‘auto’是否有边框(bordered),类型:boolean,默认 true卡片右上角的操作区域…