当前位置: 首页 > news >正文

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

系列文章目录

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

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

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

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

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

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


目录

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


在这里插入图片描述

前言

本项目以卷积神经网络(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也可下载)

对数据集进行预处理,包括修改图片名、调整格式及大小,将图片按比例划分为训练集和测试集。

import os     #导入各种模块
from PIL import Image 
import argparse
from tqdm import tqdm
class PrepareData:   #准备数据类def __init__(self, options):  #初始化self.moudle_name = "prepare data"self.options = optionsself.src_images_dir = self.options.src_images_dirself.save_img_with = self.options.out_img_size[0]self.save_img_height = self.options.out_img_size[1]self.save_dir = self.options.save_dir#统一图片类型def renameJPG(self, filePath, kind):  #图片重命名#filePath:图片文件的路径,kind: 图片的种类标签images = os.listdir(filePath)for name in images:if (name.split('_')[0] in ['0', '1', '2', '3']):continueelse:os.rename(filePath + name, filePath + kind + '_' + str(name).split('.')[0] + '.jpg')#调用图片处理def handle_rename_covert(self):  #重命名处理save_dir = self.save_dir#调用统一图片类型list_name = list(os.listdir(self.src_images_dir))print(list_name)train_dir = os.path.join(save_dir, "train")test_dir = os.path.join(save_dir, "test")#1.如果已经有存储文件夹,执行则退出if not os.path.exists(save_dir):os.mkdir(save_dir)os.mkdir(train_dir)os.mkdir(test_dir)list_source = [x for x in os.listdir(self.src_images_dir)]#2.获取所有图片总数count_imgs = 0for i in range(len(list_name)):count_imgs += len(os.listdir(os.path.join(self.src_images_dir, list_name[i])))#3.开始遍历文件夹,并处理每张图片for i in range(len(list_name)):count = 1count_of_each_kind = len(os.listdir(os.path.join(self.src_images_dir, list_name[i])))handle_name = os.path.join(self.src_images_dir, list_name[i] + '/')self.renameJPG(handle_name, str(i))#调用统一图片格式img_src_dir = os.path.join(self.src_images_dir, list_source[i])for jpgfile in tqdm(os.listdir(handle_name)):img = Image.open(os.path.join(img_src_dir, jpgfile))try:new_img = img.resize((self.save_img_with, self.save_img_height), Image.BILINEAR)if (count > int(count_of_each_kind * self.options.split_rate)):new_img.save(os.path.join(test_dir, os.path.basename(jpgfile)))else:new_img.save(os.path.join(train_dir, os.path.basename(jpgfile)))count += 1except Exception as e:print(e)
#参数设置
def main_args():parser = argparse.ArgumentParser()parser.add_argument('--src_images_dir', type=str, default='../dataOrig/',help="训练集和测试集的源图片路径")parser.add_argument("--split_rate", type=int, default=0.9, help='将训练集二和测试集划分的比例,0.9表示训练集占90%')parser.add_argument('--out_img_size', type=tuple, default=(100, 100),help='保存图片的大小,如果使用简单网络结构参数大小为(100,100),如果使用resnet大小参数为(224,224)')parser.add_argument("--save_dir", type=str, default='../cat_data_100', help='训练数据的保存位置')options = parser.parse_args()return options
if __name__ == "__main__":  #获取参数对象options = main_args()#获取类对象pd_obj = PrepareData(options)pd_obj.handle_rename_covert()

2. 数据增强

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

from keras.preprocessing.image import ImageDataGenerator, img_to_array, load_img
import argparse, os
from PIL import Image
from tqdm import tqdm  #进度条模块
datagen = ImageDataGenerator(rotation_range=40,  #整数,数据提升时图片随机转动的角度width_shift_range=0.2,#浮点数,图片宽度的某个比例,数据提升时图片水平偏移的幅度height_shift_range=0.2,#浮点数,图片高度的某个比例,数据提升时图片竖直偏移的幅度rescale=1. / 255,   #重放缩因子,默认为Noneshear_range=0.2,        #浮点数,剪切强度(逆时针方向的剪切变换角度)zoom_range=0.2,         #浮点数或形如[lower,upper]的列表,随机缩放的幅度#若为浮点数,则相当于[lower,upper] = [1 - zoom_range, 1+zoom_range]horizontal_flip=True,  #布尔值,进行随机水平翻转vertical_flip=False,   #布尔值,进行随机竖直翻转fill_mode='nearest',   #‘constant’,‘nearest’,‘reflect’或‘wrap’之一,#进行变换时超出边界的点将根据本参数给定的方法进行处理cval=0,  #浮点数或整数,当fill_mode=constant时,指定要向超出边界的点填充值channel_shift_range=0,  #随机通道转换的范围
)
def data_aug(img_path, save_to_dir, agu_num):img = load_img(img_path)#获取被扩充图片的文件名部分,作为扩充结果图片的前缀save_prefix = os.path.basename(img_path).split('.')[0]x = img_to_array(img)x = x.reshape((1,) + x.shape)i = 0for batch in datagen.flow(x, batch_size=1, save_to_dir=save_to_dir,save_prefix=save_prefix, save_format='jpg'):i += 1#保存agu_num张数据增强图片if i >= agu_num:break
#读取文件夹下的图片,并进行数据增强,将结果保存到dataAug文件夹下
def handle_muti_aug(options):src_images_dir = options.src_images_dirsave_dir = options.save_dirlist_name = list(os.listdir(src_images_dir))for name in list_name:if not os.path.exists(os.path.join(save_dir, name)):os.mkdir(os.path.join(save_dir, name))for i in range(len(list_name)):handle_name = os.path.join(src_images_dir, list_name[i] + '/')#tqdm()为数据增强添加进度条for jpgfile in tqdm(os.listdir(handle_name)):#将被扩充的图片保存到增强的文件夹下
Image.open(handle_name+jpgfile).save(save_dir+'/'+list_name[i]+'/'+jpgfile)#调用数据增强过程函数data_aug(handle_name+jpgfile, os.path.join(options.save_dir, list_name[i]), options.agu_num)
def main_args():parser = argparse.ArgumentParser()parser.add_argument('--src_images_dir', type=str, default='../source_images/', help="需要被增强训练集的源图片路径")parser.add_argument("--agu_num", type=int, default=19, help='每张训练图片需要被增强的数量,这里设置为19,加上本身的1张,每张图片共计变成20张')parser.add_argument("--save_dir", type=str, default='../dataAug', help='增强数据的保存位置')options = parser.parse_args()return options
if __name__ == "__main__":options = main_args()handle_muti_aug(options)

数据增强进度如图所示。

在这里插入图片描述

数据集拓展为原来的20倍,如图所示。

在这里插入图片描述

其他相关博客

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

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

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

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

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

工程源代码下载

详见本人博客资源下载页


其它资料下载

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

相关文章:

  • Halcon深度学习相关术语介绍
  • 02.Git常用基本操作
  • Spring boot+nacos+mysql通过修改配置密码自动刷新数据库连接
  • C++核心编程思路(1):①程序的内存模型②引用的作用
  • Debian系统设置SSH密钥登陆
  • 15 使用v-model绑定单选框
  • 基于Spring Boot 框架的试卷自动生成系统的设计与实现
  • C语言—每日选择题—Day52
  • EasyExcel合并相同内容单元格及动态标题功能的实现
  • 华为云CodeArts Pipeline常见问答汇总
  • 智能优化算法应用:基于学校优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码
  • 【golang】go执行shell命令行的方法( exec.Command )
  • 机器人制作开源方案 | 智能落叶清扫机器人
  • 【unity实战】一个通用的FPS枪支不同武器射击控制脚本
  • 如何保证架构的质量
  • axios 和 cookie 的那些事
  • C++入门教程(10):for 语句
  • CSS 提示工具(Tooltip)
  • Java Agent 学习笔记
  • Js基础知识(四) - js运行原理与机制
  • php ci框架整合银盛支付
  • SQLServer插入数据
  • 从零开始学习部署
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 基于Android乐音识别(2)
  • 力扣(LeetCode)22
  • 聊聊directory traversal attack
  • 排序算法学习笔记
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 国内开源镜像站点
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • $NOIp2018$劝退记
  • (NSDate) 时间 (time )比较
  • (附源码)springboot教学评价 毕业设计 641310
  • (过滤器)Filter和(监听器)listener
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (十六)Flask之蓝图
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • ... 是什么 ?... 有什么用处?
  • .equals()到底是什么意思?
  • .form文件_一篇文章学会文件上传
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • /usr/bin/env: node: No such file or directory
  • ::什么意思
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • [1] 平面(Plane)图形的生成算法
  • [2017][note]基于空间交叉相位调制的两个连续波在few layer铋Bi中的全光switch——
  • [APIO2015]巴厘岛的雕塑
  • [AutoSAR 存储] 汽车智能座舱的存储需求
  • [BUUCTF 2018]Online Tool