基于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相关资料,希望能帮助到所有小伙伴们。

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

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

相关文章

NVMe前世今生

NVMe前世今生 1 NVMe的由来2 NVMe工作原理3 NVMe优点4 NVMe适用场景 本文属于《 NVMe协议基础系列教程》之一,欢迎查看其它文章。 1 NVMe的由来 目前机械硬盘大多数使用 SATA (Serial ATA Advanced Host Controller Interface) 接口,接口协议为 AHCI&a…

vue + element 项目表格多选根据状态来禁用

首先如图效果 对elementUI中table表格的多选框进行 可勾选 和 不可勾选 的处理 给 type 属性为 selection 的加一个事件:selectableselected’ <el-table-column type"selection" width"55" :selectable"selected"> </el-table-colum…

运维知识点-Kubernetes_K8s

Kubernetes RBAC配置不当攻击场景攻击过程 RBAC配置不当 Service Account本质是服务账号&#xff0c;是Pod连接K8s集群的凭证。 在默认情况下&#xff0c;系统会为创建的Pod提供一个默认的Service Account&#xff0c; 用户也可以自定义Service Account&#xff0c;与Service…

目标检测——YOLO算法解读(通俗易懂版)

论文&#xff1a;You Only Look Once: Unified, Real-Time Object Detection 作者&#xff1a;Joseph Redmon, Santosh Divvala, Ross Girshick, Ali Farhadi 链接&#xff1a;https://arxiv.org/abs/1506.02640 代码&#xff1a;http://pjreddie.com/yolo/ yolo系列检测算法开…

Excel小技能:excel如何将数字20231211转化成指定日期格式2023/12/11

给了一串数字20231211&#xff0c;想要转成指定格式的日期格式&#xff0c;发现设置单元格格式为指定日期格式不生效&#xff0c;反而变成很长很长的一串#这个&#xff0c;如图所示&#xff1a; 其实&#xff0c;正确的做法如下&#xff1a; 1&#xff09;打开数据功能界面&am…

谷达冠楠科技:抖音店铺被退店是什么意思

随着互联网的普及和发展&#xff0c;电商平台已经成为了人们购物的主要渠道之一。在众多的电商平台中&#xff0c;抖音作为短视频领域的佼佼者&#xff0c;也吸引了大量的商家入驻。然而&#xff0c;有些商家可能会遇到抖音店铺被退店的情况&#xff0c;那么这究竟是什么意思呢…

病案管理的定义、流程及应用分析

病案管理是指针对病人的基本信息&#xff0c;病历&#xff0c;就诊记录等进行收集、整理、存储、分析和应用的一项管理工作。它在医院、医疗机构和医疗行业中具有重要的作用&#xff0c;能够提高医疗服务的质量、效率和安全性。本文将就病案管理的定义、流程以及其在医疗健康领…

React实现全局Loading

css #__loading {position:fixed;top: 0;left: 0;z-index: 99999;display: flex;align-items: center;justify-content: center;width: 100%;height: 100%;background: rgba(0, 0, 0, 0); } 页面代码 使用了antd的Spin组件 import React from react import ReactDOM from re…

编程序中的魔法语句|循环-使用频率高的优雅代码

一. print和import的更多信息 1.1 使用逗号输出 A.打印多个表达式,用逗号隔开,会在每个参数之间插入一个空格符: 复制代码代码如下: >>> print age:,42 age: 42 B.同时输出文本和变量值,却又不希望使用字符串格式化: 复制代码代码如下: >>> name = Pe…

emmc存储大小解决方案

当发现emmc space 0.2G或者为0 的时候说名emmc有问题了&#xff0c;正常情况下是3.98G。 所以需要做如下处理&#xff1a; 输入&#xff1a;第一步&#xff1a;mkfs.ext4 /dev/mmcblk0p1 &#xff08;格式&#xff1a;mkfs.ext4 参数 设备名 原文链接&#xff1a;mkfs.ext4 命…

(c语言)字符逆序——非递归

#include<stdio.h> #include<string.h> int main(int argc, char* argv[]) {char a[10000];char b[10000];gets(a);int i, c;c (int)strlen(a);for (i 0; i < c; i){b[i] a[c-i-1]; //将\0之前的元素赋值给b[]}b[c] \0; //之后在所有元素后加上\0,将…

优思学院|调优操作(EVOP)是什么?

EVOP是Evolutionary Operation的缩写&#xff0c;中文多译作&#xff0c;调优操作&#xff0c;意思是进化地操作&#xff0c;也是实验设计方法中的其中一种&#xff0c;可以应用于六西格玛流程DMAIC里的改进阶段。 调优操作&#xff08;EVOP&#xff09;是一种用于改善过程或产…

Mac安装Nginx

一起学习 1、确认你的电脑是否安装homebrew&#xff0c;打开电脑终端 输入&#xff1a; /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"2、确认homebrew是否安装成功&#xff0c;在终端输入&#xff1a; br…

怎么远程控制电脑?两种方法轻松实现!

不知道电脑远程控制怎么弄&#xff1f;本文将分享两种简单又实用的远程控制方法&#xff0c;能够让你轻松的远程控制电脑。远程控制一直是一个备受关注的话题&#xff0c;无论在何种场合都能发挥作用。掌握了远程控制的方法&#xff0c;不仅能够快速解决紧急问题&#xff0c;还…

【老牌期刊】IF:6+,2天预审,3-5个月录用!

期刊简介 1区计算机智能类SCI 【期刊概况】IF&#xff1a;6.0-7.0&#xff0c;JCR1区&#xff0c;中科院2区&#xff1b; 【终审周期】走期刊部系统&#xff0c;3个月左右录用&#xff1b; 【检索情况】SCI检索&#xff1b; 【WOS收录年份】2018年&#xff1b; 【自引率】…

用友 CRM help2.php存在任意文件读取漏洞

文章目录 产品简介漏洞概述指纹识别漏洞利用修复建议 产品简介 用友CRM&#xff08;Customer Relationship Management&#xff0c;客户关系管理&#xff09;是由用友公司开发的一款软件&#xff0c;专门设计用于帮助企业管理与客户相关的业务活动。这款软件通常包括客户信息管…

windows 安装jenkins

下载jenkins 官方下载地址&#xff1a;Jenkins 的安装和设置 清华源下载地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/jenkins/windows-stable/ 最新支持java8的版本时2.346.1版本&#xff0c;在清华源中找不到&#xff0c;在官网中没找到windows的下载历史&#xff…

UE5 Landscape地貌制作 - 学习笔记

P2. 创建地形 https://www.bilibili.com/video/BV1mD4y1D7D6?p2&spm_id_frompageDriver&vd_source707ec8983cc32e6e065d5496a7f79ee6 新建一个Basic场景选择Landscape Mode 生成预览网格&#xff08;绿色网格&#xff09;从文件导入&#xff1a;可以导入dem高度图地貌…

使用小程序实现App灰度测试的好处

灰度测试&#xff08;Gray Testing&#xff09;是一种软件测试策略&#xff0c;也被称为渐进性测试或部分上线测试。在灰度测试中&#xff0c;新的软件版本或功能并非一次性推送给所有用户&#xff0c;而是仅在一小部分用户中进行测试。这可以帮助开发团队逐步暴露新功能或版本…

vscode如何开发微信小程序?(保姆级教学)

1.安装“微信小程序开发工具”扩展 2.安装“vscode weapp api”扩展 3.安装“vscode wxml”扩展 4.安装“vscode-wechat”扩展 5.在终端执行命令&#xff1a; vue create -p dcloudio/uni-preset-vue uniapp-test uniapp-test就是我这里的项目名称了 6.如果遇到了这个错误&a…