基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(三)

news2024/7/31 13:34:16

系列文章目录

基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(一)

基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(二)

基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(三)

基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(四)

基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(五)

基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(六)


目录

  • 系列文章目录
  • 前言
  • 总体设计
    • 系统整体结构图
    • 系统流程图
  • 运行环境
  • 模块实现
    • 1. 数据预处理
    • 2. 数据增强
    • 3. 普通CNN模型
      • 1)模型结构
      • 2)模型优化
      • 3)模型训练
      • 4)模型保存
  • 其他相关博客
  • 工程源代码下载
  • 其它资料下载


在这里插入图片描述

前言

本项目以卷积神经网络(CNN)模型为基础,对收集到的猫咪图像数据进行训练。通过采用数据增强技术和结合残差网络的方法,旨在提高模型的性能,以实现对不同猫的种类进行准确识别。

首先,项目利用CNN模型,这是一种专门用于图像识别任务的深度学习模型。该模型通过多个卷积和池化层,能够有效地捕捉图像中的特征,为猫的种类识别提供强大的学习能力。

其次,通过对收集到的数据进行训练,本项目致力于建立一个能够准确辨识猫的种类的模型。包括各种猫的图像,以确保模型能够泛化到不同的种类和场景。

为了进一步提高模型性能,采用了数据增强技术。数据增强通过对训练集中的图像进行旋转、翻转、缩放等操作,生成更多的变体,有助于模型更好地适应不同的视角和条件。

同时,引入残差网络的思想,有助于解决深层网络训练中的梯度消失问题,提高模型的训练效果。这种结合方法使得模型更具鲁棒性和准确性。

最终,通过本项目,实现了对猫的种类进行精准识别的目标。这对于宠物领域、动物学研究等方面都具有实际应用的潜力,为相关领域提供了一种高效而可靠的工具。

总体设计

本部分包括系统整体结构图和系统流程图。

系统整体结构图

系统整体结构如图所示。

在这里插入图片描述

系统流程图

系统流程如图所示。

在这里插入图片描述

运行环境

本部分包括计算型云服务器、Python环境、TensorFlow环境和MySQL环境。

详见博客。

模块实现

本项目包括5个模块:数据预处理、数据增强、普通CNN模型、残差网络模型、模型生成。下面分别给出各模块的功能介绍及相关代码。

1. 数据预处理

打开浏览器,分别搜索布偶猫、孟买猫、暹罗猫和英国短毛猫的图片。用批量下载器下载图片,筛选出特征明显的图片作为数据集。使用的图片包含101张布偶猫、97张孟买猫、101张逼罗猫以及85张英国短毛猫,共计384张图片。(其中在工程代码中/cat_kind_model/cat_data_100/cat_kind_model/cat_data_224也可下载)

详见博客。

2. 数据增强

所谓数据增强,是通过翻转、旋转、比例缩放、随机裁剪、移位、添加噪声等操作对现有数据集进行拓展。本项目中数据量较小,无法提取图片的深层特征,使用深层的残差网络时易造成模型过拟合。

详见博客。

3. 普通CNN模型

处理图片数据格式后,转换为数组作为模型的输入,并根据文件名提取标签,定义模型结构、优化器、损失函数和性能指标。本项目使用Keras提供类似VGG的卷积神经网络。

1)模型结构

模型结构相关代码如下:

#首先导入相应库
import os
from PIL import Image
import numpy as np
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.optimizers import SGD, RMSprop, Adam
from keras.layers import Conv2D, MaxPooling2D
import argparse
#将图片转换为数组,并提取标签
def convert_image_array(filename, src_dir):
    img = Image.open(os.path.join(src_dir, filename)).convert('RGB')
    return np.array(img)
def prepare_data(train_or_test_dir):
    x_train_test = []
    #将训练或者测试集图片转换为数组
    ima1 = os.listdir(train_or_test_dir)
    for i in ima1:
        x_train_test.append(convert_image_array(i, train_or_test_dir))
    x_train_test = np.array(x_train_test)
    #根据文件名提取标签
    y_train_test = []
    for filename in ima1:
        y_train_test.append(int(filename.split('_')[0]))
    y_train_test = np.array(y_train_test)
    #将标签转换格式
    y_train_test = np_utils.to_categorical(y_train_test)
    #将特征点从0~255转换成0~1,提高特征提取精度
    x_train_test = x_train_test.astype('float32')
    x_train_test /= 255
    #返回训练和测试数据
    return x_train_test, y_train_test

搭建网络模型。定义的架构为4个卷积层,每两层卷积后都连接1个池化层,进行数据的降维;一个dropout层,防止模型过拟合;加上Flatten层,把多维的输入一维化;最后是全连接层。

def train_model():
    #搭建卷积神经网络
    model = Sequential()
       model.add(Conv2D(32,(3,3),activation='relu',input_shape=(100,100,3)))  #提取图像的特征
    model.add(Conv2D(32, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))  #随机扔掉25%的节点权重,防止模型过拟合
    model.add(Conv2D(64, (3, 3), activation='relu'))
    model.add(Conv2D(64, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))
    model.add(Flatten())  
#Flatten层输入“压平”,把多维的输入一维化,常用在从卷积层到全连接层的过渡
    model.add(Dense(256, activation='relu'))  #Dense是常用的全连接层
    model.add(Dropout(0.5))
    model.add(Dense(4, activation='softmax'))

2)模型优化

确定模型架构之后,使用compile()方法对模型进行编译,这是多类别的分类问题,因此需要使用交叉熵作为损失函数。由于所有标签都带有相似的权重,通常使用精确度作为性能指标,使用随机梯度下降算法来优化模型参数。

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)#SGD优化器
#完成模型搭建后,使用.compile()方法编译
model.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=['accuracy'])
return model

3)模型训练

定义模型架构和编译模型后,使用训练集训练模型,使模型可以识别不同种类的猫。这里,将使用训练集和测试集拟合并保存模型。

def main_args():  #初始化用到的参数
    parser = argparse.ArgumentParser()
    parser.add_argument('--train_dir', type=str, default='./cat_data_100/train', help="the path to the training imgs")
    parser.add_argument('--test_dir', type=str, default='./cat_data_100/test', help='the path to the testing imgs')
    parser.add_argument("--save_model", type=str, default='./models/cat_weight.h5', help='the path and the model name')
    parser.add_argument("--batch_size", type=int, default=10, help='the training batch size of data')
    parser.add_argument("--epochs", type=int, default=32, help='the training epochs')
    options = parser.parse_args()
    return options
#开始模型生成
if __name__ == "__main__":
    #调用函数获取用户参数
    options = main_args()
    #调用函数获取模型
    model = train_model()
    #调用函数获取训练数据和标签
    x_train, y_train = prepare_data(options.train_dir)
    x_test, y_test = prepare_data(options.test_dir)
#训练数据上按batch进行一定次数的迭代训练网络 
model.fit(x_train, y_train, shuffle=True, batch_size=options.batch_size, epochs=options.epochs)
#使用一行代码对模型进行评估,看模型的指标是否满足要求
score = model.evaluate(x_test, y_test, batch_size=10)
print("Testing loss:{0},Testing acc:{1}".format(score[0], score[1]))

其中,一个batch就是在一次前向/后向传播过程用到的训练样例数量,每次读入10张图片作为一个批量大小,数据集循环迭代32次。

通过观察训练集和测试集的损失函数、准确率的大小来评估模型的训练程度,进行进一步决策。一般来说,训练集和测试集的损失函数(或准确率)不变且基本相等为模型训练的最佳状态。

4)模型保存

将模型文件保存为.h5格式,以便于移植到其他环境中使用。

#保存训练完成的模型文件
save_model = options.save_model
save_model_path = os.path.dirname(save_model)
save_model_name = os.path.basename(save_model)
if not os.path.exists(save_model_path):
    os.mkdir(save_model_path)
model.save_weights(save_model, overwrite=True)

其他相关博客

基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(一)

基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(二)

基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(四)

基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(五)

基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(六)

工程源代码下载

详见本人博客资源下载页


其它资料下载

如果大家想继续了解人工智能相关学习路线和知识体系,欢迎大家翻阅我的另外一篇博客《重磅 | 完备的人工智能AI 学习——基础知识学习路线,所有资料免关注免套路直接网盘下载》
这篇博客参考了Github知名开源平台,AI技术平台以及相关领域专家:Datawhale,ApacheCN,AI有道和黄海广博士等约有近100G相关资料,希望能帮助到所有小伙伴们。

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

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

相关文章

智能优化算法应用:基于平衡优化器算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于平衡优化器算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于平衡优化器算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.平衡优化器算法4.实验参数设定5.算法…

Leetcode—1502.判断能否形成等差数列【简单】

2023每日刷题&#xff08;五十九&#xff09; Leetcode—1502.判断能否形成等差数列 实现代码 class Solution { public:bool canMakeArithmeticProgression(vector<int>& arr) {sort(arr.begin(), arr.end());int diff abs(arr[1] - arr[0]);for(int i 1; i <…

PyQt6 表单布局Form Layout (QFormLayout)

锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计43条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话版…

react经验7:高亮关键字

预期效果&#xff1a; 实现原理 将需要高亮的关键词做成正则表达式 new RegExp((${word}), "gi")使用上述正则表达式切割目标字符串 origin.split(new RegExp((${word}), "gi"))切割结果会包含正则匹配到的词 过滤掉空字符&#xff0c;并对关键词包裹…

实在智能“数字员工”荣获工信部赛宝信创“全栈优秀解决方案奖”

近日&#xff0c;由工信部和中国通信企业协会主办的“2023&#xff08;第四届&#xff09;数字化转型推动高质量发展大会”在海口成功举办&#xff0c;大会现场重磅发布了中国赛宝信息技术应用创新优秀解决方案获奖名单&#xff0c;实在智能《信创RPA-统计局数智办公解决方案》…

24年五年制专转本招生院校有可能发生变动

据悉&#xff0c;24年五年制专转本院校可能将发生改变&#xff0c;南京传媒学院有可能停止招生 将新增一所招生大学&#xff1a;南京航空航天大学金城学院 南京航空航天大学金城学院始建于1999年&#xff0c;是南京航空航天大学联合社会力量创办的独立学院。学校位于江苏省南京…

Vue学习计划-Vue2--VueCLi(五)全局事件总线、消息订阅与发布(pubsub)

抛出问题:我们多级组件&#xff0c;或者任意不想关的子组件如何传递数据呢&#xff1f; 1. 全局事件总线&#xff08;$bus&#xff09; 一种组件间通信的方式&#xff0c;适用于任意组件间通信 全局事件总线示意图&#xff1a; 安装全局事件总线&#xff1a; new Vue({..…

代码随想录二刷 | 二叉树 | 110.平衡二叉树

代码随想录二刷 &#xff5c; 二叉树 &#xff5c; 110.平衡二叉树 题目描述解题思路递归迭代 代码实现递归法迭代法 题目描述 110.平衡二叉树 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉…

首发卡密引流系统源码

程序特色&#xff1a; 支持个人和企业小程序广告获取卡密。 支持短视频点赞和关注获取卡密。 搭建教程&#xff1a; 环境要求&#xff1a;Nginx、MySQL 5.6、PHP 5.6 步骤&#xff1a; 将压缩包解压至网站根目录。 打开域名/install&#xff0c;按照提示填写数据库信息进行…

【Android】使用 Glide 给 ImageView 加载图像的简单案例

前言 Android Glide是一个用于在Android应用中加载和显示图片的流行开源库。它提供了简单易用的API&#xff0c;可以帮助开发者高效地加载远程图片、本地图片以及GIF动画&#xff0c;并提供了缓存、内存管理等功能&#xff0c;使得图片加载在移动应用中更加流畅和高效。Glide还…

智慧健康监测设备行业分析:中国市场发展潜力巨大

中国智慧健康行业市场规模呈逐年快速增长态势&#xff0c;年均复合增长率超过40%。其中智能可穿戴设备出货量巨大。国务院办公厅印发《“十四五”国民健康规划》。规划提出&#xff0c;促进健康与养老、旅游、互联网、健身休闲、食品等产业融合发展&#xff0c;壮大健康新业态、…

谁能更好地检测深度伪造?人还是机器?

不知您是否听说过深度伪造&#xff08;Deepfakes&#xff09;这种欺诈应用&#xff1f;由它产生的各种虚假信息已威胁到了人类社会的方方面面。随着人工智能技术的进步&#xff0c;我们亟待提升识别虚假内容的能力。那么在实际检测假新闻可信度等用例时&#xff0c;到底是人类还…

营销投放下半场,游戏行业如何寻觅进化空间?

摘要&#xff1a;微博&#xff0c;游戏行业突围市场新利器 游戏行业&#xff0c;格局永远在变。 从2017年互联网大厂集体盯上游戏大蛋糕&#xff0c;到2021年行业收缩&#xff0c;再到今年上半年实际销售收入继去年首次出现同比下滑…几经过山车式行情的游戏行业&#xff0c;…

Vue3上传图片和删除图片

<div class"illness-img"><van-uploader:after-read"onAfterRead"delete"onDeleteImg"v-model"fileList"max-count"9":max-size"5 * 1024 * 1024"upload-icon"photo-o"upload-text"上传图…

Attention机制学习

写在前面 注意力机制是一个很不错的科研创新点方向&#xff0c;但是没有系统记录过学习过程&#xff0c;这里记录科研中遇到的各种注意力机制。 Attention机制解释 本质上来说用到attention的任务都有Query&#xff0c;Key&#xff0c;Value三个关键components&#xff0c;目标…

LeetCode 300最长递增子序列 674最长连续递增序列 718最长重复子数组 | 代码随想录25期训练营day52

动态规划算法10 LeetCode 300 最长递增子序列 2023.12.15 题目链接代码随想录讲解[链接] int lengthOfLIS(vector<int>& nums) {//创建变量result存储最终答案,设默认值为1int result 1;//1确定dp数组&#xff0c;dp[i]表示以nums[i]为结尾的子数组的最长长度ve…

“文思助手”苏哒智能加入飞桨技术伙伴计划,共同打造“大模型+企业办公”新模式

近日&#xff0c;厦门苏哒智能科技有限公司正式加入飞桨技术伙伴计划&#xff0c;双方将发挥各自的专业优势&#xff0c;共同致力于在智能办公和创作领域实现技术突破和业务创新&#xff0c;帮助企业、知识工作者大幅提高生产力。 厦门苏哒智能科技有限公司 厦门苏哒智能科技有…

前端自定义icon的方法(Vue项目)

第一步&#xff1a;进入在线的编辑器进行设计 好用&#xff1a;百度字体编辑器 比如先导入有个ttf文件 添加新字体 双击每个模块进入编辑区域 更改相应的信息&#xff0c;比如name 编辑完了进行导出文件(各种格式就行了)就行了 第二步&#xff1a;在项目中asset文件储存这些文…

TCP为什么可靠之“拥塞控制”

拥塞控制是对网络层面的控制&#xff0c;主要是为了避免发送方发送过多的数据导致网络阻塞&#xff0c;以及出现网络阻塞时能够调整数据发送速率&#xff0c;达到对网络阻塞的一个控制。 拥塞窗口 拥塞窗口cwnd&#xff0c;是发送方维护的一个状态变量&#xff0c;会根据网络…

Vue组件封装知识总结

一、为什么要封装组件 首先&#xff0c;一个好问题&#xff0c;面试要考的&#xff01;为什么要封装组件呢&#xff1f; 提高代码的复用性&#xff1a;通过封装&#xff0c;可以将一段代码或一部分功能抽象为一个独立的组件&#xff0c;并在不同的项目或场景中重复使用。这样可…