PyTorch 深度学习实战 | 基于 ResNet 的花卉图片分类

news/2024/4/29 1:44:32/文章来源:https://blog.csdn.net/qq_41640218/article/details/129707844

“工欲善其事,必先利其器”。如果直接使用 Python 完成模型的构建、导出等工作,势必会耗费相当多的时间,而且大部分工作都是深度学习中共同拥有的部分,即重复工作。所以本案例为了快速实现效果,就直接使用将这些共有部分整理成框架的 TensorFlow 和 Keras 来完成开发工作。TensorFlow 是 Google 公司开源的基于数据流图的科学计算库,适合用于机器学习、深度学习等人工智能领域。Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow、CNTK 或 Theano 作为后端运行。Keras 的开发重点是支持快速的实验,所以,本案例中,大部分与模型有关的工作都是基于 Keras API 来完成的。而现在版本的 TensorFlow 已经将 Keras 集成了进来,所以只需要安装 TensorFlow 即可。注意,由于本案例采用的 ResNet 网络较深,所以模型训练需要消耗的资源较多,需要 GPU 来加速训练过程。

1、环境安装


安装 TensorFlow 的 GPU 版本是相对比较繁杂的事情,需要找对应的驱动,安装合适版本的 CUDA 和 cuDNN。而一种比较方便的办法就是使用 Anaconda 来进行 tensorflow-gpu 的安装。具体的安装过程可以参考本书的附录 A.2 部分。其他需要安装的依赖包的名称及版本号如下:

其他依赖包可以在 Anaconda 界面上进行选择安装,也可以将其添加到 requirements.txt 文件,然后使用 conda install -yes -file requirements.txt 命令进行安装。另外,Conda 可以创建不同的环境来支持不同的开发要求。例如,有些工程需要 TensorFlow 1.15.0 环境来进行开发,而另外一些工程需要 TensorFlow 2.1.0 来进行开发,替换整个工作环境或者重新安装 TensorFlow 都不是很好的选择。所以,本案例使用 Conda 创建虚拟环境来解决。

2、数据集简介


在进行模型构建和训练之前,需要进行数据收集。为了简化收集工作,本案例采用已标记好的花卉数据集 Oxford 102 Flowers。数据集可以从 VGG 官方网站上进行下载。单击如图 1 所示的 Downloads 区域的 1、4 和 5 对应的超链接就可以下载所需要的文件。

■ 图 1 Oxford 102 Flowers 数据集下载网站

该数据集由牛津大学工程科学系于 2008 年发布,是一个英国本土常见花卉的图片数据集,包含 102 个类别,每类包含 40 ~ 258 张图片。在基于深度学习的图像分类任务中,这样较为少量的图片还是比较有挑战性的。Oxford 102 Flowers 的分类细节和部分类别的图片及对应的数量如图 2 所示。

■ 图 2 Oxford 102 Flowers 的分类细节和部分类别的图片及对应的数量

除了图片文件(dataset images),数据集中还包含图片分割标记文件(image segmentations)、分类标记文件(the image iabels)和数据集划分文件(the data splits)。由于本案例中不涉及图片分割,所以使用的是图片、分类标记和数据集划分文件。

3、数据集的下载与处理


Python urllib 库提供了 urlretrieve()函数可以直接将远程数据下载到本地。可以使用 urlretrieve()函数下载所需文件;然后把压缩的图片文件进行解压,并解析分类标记文件和数据集划分文件;再根据数据集划分文件并分成训练集、验证集和测试集;最后,向不同类别的数据集中按图片所标识的花的种类分类存放图片文件。代码及详细注释如代码清单 1 所示。

代码清单 1

import os
from urllib.request import urlretrieve
import tarfile
from scipy. io import loadmat2
from shutil import copyfile
import glob
import numpy as np"""
函数说明:按照分类(labels)复制未分组的图片到指定的位置10
Parameters:data path - 数据存放目录labels - 数据对应的标签,需要按标签放到不同的目录
"""def copy_data_files(data path, labels) :
if not os. path, exists( data path) :os.mkdir(data path)# 创建分类目录
for i in range(0,102) :
os.mkdir(os.path.join( data path, str(i)))for label in labels:
src path = str(label[0])
dst path = os.path. join(data path, label[1], src path. split(os. sep)[ - 1])
copyfile(src path, dst path)if_name_ _== '_main_':# 检查本地数据集目录是否存在,若不存在,则需创建 data set path = "./data'if not os. path. exists( data set path) :os.mkdir(data set path)#下载 102 Category Elower 数据集并解压 
flowers archive file = "102flowers.tgz'
flowers_url frefix = "https://www,robots.ox.ac.uk/~vgg/data/flowers/102/'
flowers archive path = os.path, join(data set path, flowers archive file)
if not os path.exists(flowers archive path) :
print("正在下载图片文件...")
urlretrieve(flowers url frefix + flowers archive file, flowers archive path)
print("图片文件下载完成.")
print("正在解压图片文件...")
tarfile. open(flowers archive path)..extractall(path = data set_path)
print("图片文件解压完成,")# 下载标识文件,标识不同文件的类别
flowers labels file = "imagelabels.mat'
flowers labels path = os.path. join(data set path, flowers labels file)if not os.path.exists(flowers labels path) :print("正在下载标识文件...")
urlretrieve(flowers url frefix + flowers labels file, flowers labels path)
print("标识文件下载完成")
flower_labels = loadmat(flowers_labels_path)['labels'][0] - 1#下载数据集分类文件,包含训练集、验证集和测试集
sets splits file = "setid.mat"
sets splits_path = os.path. join(data set path, sets splits file)
if not os.path,exists( sets splits path) :
print("正在下载数据集分类文件...")
urlretrieve(flowers url frefix + sets splits file, sets splits path)
print("数据集分类文件下载完成")
sets_splits = loadmat( sets splits path)# 由于数据集分类文件中测试集数量比训练集多,所以进行了对调
train set = sets splits['tstid'][0] - 1
valid set = sets splits[ 'valid'][0] - 1
test_set = sets splits['trnid'][0] - 1# 获取图片文件名并找到图片对应的分类标识
image files = sorted(glob.glob(os.path. join(data set path, 'jpg', ' x .jpg')))
image labels = np.array([i for i in zip(image files, flower labels)])# 将训练集、验证集和测试集分别放在不同的目录下
print("正在进行训练集的复制...")
copy_data files(os.path. join(data set path, 'train'), image labels[train set, :]print("已完成训练集的复制,开始复制验证集...")
copy_data files(os.path. join(data_set_path, 'valid'), image labels[valid set, :]print("已完成验证集的复制,开始复制测试集...")
copy_data files(os.path, join(data set_path, 'test'), image labels[test set, :] print("已完成测试集的复制,所有的图片下载和预处理工作已完成.")

下载的图片数据有 330MB 左右。国外的网站有时候下载比较慢,可以用下载工具下载,或者使用参考书前言中提供的二维码进行下载。

需要说明的是,分类标记文件 imagelabels.mat 和数据集划分文件 setid.mat 是 MATLAB 的数据存储的标准格式,可以用 MATLAB 程序打开进行查看。本案例中使用 scipy 库的 loadmat()函数对 .mat 文件进行读取。图片分类后的目录结构如图 3 所示。

■ 图 3 图片分类后的目录结构

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

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

相关文章

【C++初阶】六、模板初阶(函数模板+类模板)

文章目录泛型编程函数模板函数模板的概念函数模板的格式函数模板的原理函数模板的实例化模板参数的匹配原则类模板类模板的定义格式类模板的实例化泛型编程 引入 - 通用的交换函数 如果让你编写一个函数,用于两个数的交换。在C语言中,我们会用如下方法…

我让Chat GPT准备了几份SAP 顾问英文面试自我介绍的模板,大家感受一下

有个朋友说有个面试要用英文来做自我介绍,我灵机一动,不如让Chat GPT准备了几份SAP 顾问英文面试自我介绍的模板,大家感受一下。我看下来感觉写的还是中规中矩,可以一用,。 模板1 Sure, I can help you with that! Her…

【Java学习笔记】39.Java 多线程编程

Java 多线程编程 Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。 这里定义和…

navigator 拓宽前端视野

前言💐 写本文的起因是最近做了一个共享屏幕在线演示ppt的需求,发现了navigator的新大陆。原来web端开启屏幕共享是如此的简单,在接触之前还以为是多么高大上的功能,需求评审时内心还有些慌张。 人总是对自己不了解的东西心生恐惧&#x1f6…

VMware虚拟机卸载详细教程

安装过VMware虚拟机的小伙伴,90%可能都会遇到这样的问题:安装容易,卸载难。而且卸载不干净,就会导致后续安装和使用出现各种Bug。今天就给大家详细说说如何彻底干净的从本机卸载VMware。 1. 卸载之前,需要先关闭VMware…

【ChatGPT】Notion AI 从注册到体验:如何免费使用

欢迎关注【youcans的GPT学习笔记】原创作品,火热更新中 【ChatGPT】Notion AI 从注册到体验1. Notion AI 介绍1.1 Notion AI 简介1.2 Notion AI 的核心能力1.3 Notion AI 与 ChatGPT 的比较2. Notion AI 国内用户注册2.1 PC 端用户注册2.2 移动端用户注册3. Notion …

如何用C语言实现渣男通讯录

注意:纯属玩笑,博大家一乐,切勿当真📖首先我们要知道一个渣男通讯录有哪些信息要包含哪些功能1.你的通讯录要装多少个女朋友你得规定吧;2.每个女朋友的姓名,年龄,电话,爱好这些要有吧…

springboot项目中外卖用户下单业务功能之需求分析+数据模型+功能开发(详细步骤)

一、需求分析 移动端用户将菜品或者套餐加入到购物车后,可以点击购物车种的 去结算 按钮,页面跳转到订单确认页面,点击 去支付 按钮则完成下单操作。 二、数据模型 用户下单业务对应的数据表为orders表和order_detail表: order…

ESP32-CAM 环境搭建(离线)

云盘:Arduino IDE链接:https://pan.baidu.com/s/1yk_tKH8eK8okp5z9qv1TLg 提取码:pz2h内含:IDE arduino-ide_nightly-20230322_Windows_64bit.zipSDK esp32_package_2.0.5_arduinocn.exe步骤1,IDE为绿色版,…

57、C语言程序设计谭浩强第五章习题

1、输入两个正整数m和n,求其最大公约数和最小公倍数 辗转相除法&#xff1a; #include <stdio.h>int main(){int m,n,temp;scanf("%d %d",&m,&n);if(m<n){tempm;mn;ntemp;}int dn*m;int r;while(rm%n){mn;nr;}printf("最大公因数为:%d&#…

ONES 入选北大光华 MBA 整合实践项目,推动校企合作

近日&#xff0c;ONES 旗下开源问答社区软件 Answer 入选北京大学光华管理学院 MBA 整合实践项目&#xff0c;并受邀出席项目启动会。同时入选的还有国电投清洁能源基金、京东零售、瑞尔集团、美国丹纳赫集团、大众汽车&#xff08;中国&#xff09;和贝壳找房六家国内外知名企…

队列----数据结构

队列&#x1f506;队列的概念&#x1f506;队列的结构&#x1f506;队列的实现&#x1f506;设计循环队列&#x1f506;循环队列的结构&#x1f506;循环队列的实现&#x1f506;结语&#x1f506;队列的概念 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端…

5G、工业4.0、车载以太网……TSN时间敏感网络能给我们带来哪些市场机会?

TSN是一项面向未来的新兴技术&#xff0c;它定义了以太网数据传输的时间敏感机制&#xff0c;为标准以太网增加了确定性和可靠性&#xff0c;以确保数据实时、确定和可靠地传输。这些扩展使得以太网能够应用于更加广泛的行业中&#xff0c;进而带来了更多新的市场机会。 1. 5G…

电力行业等保定级评级依据是什么?分为几个等级?

最近看到不少电力行业小伙伴在问&#xff0c;电力行业等保定级评级依据是什么&#xff1f;分为几个等级&#xff1f;今天我们小编就来给大家简单回答一下&#xff0c;仅供参考哦&#xff01; 电力行业等保定级评级依据是什么&#xff1f;分为几个等级&#xff1f; 【回答】&a…

【2023.3.18 美团校招】

文章目录1. 小美剪彩带2. 最多修改两个字符&#xff0c;生成字典序最小的回文串1. 小美剪彩带 题意&#xff1a;找出区间内不超过k种数字子数组的最大长度 使用双指针的方式&#xff0c;用哈希表来统计每个数出现次数。在双指针移动的过程中&#xff0c;动态的维护区间内不同数…

bean的作用域和生命周期和后置处理器以及作用域对生命周期的影响~

scope属性可以指定bean的作用范围&#xff1a; 在spring中可以通过配置bean标签的scope属性来指定bean的作用域范围&#xff0c;各取值含义参照表如下&#xff1a; 编写spring_test.xml文件&#xff1a; <?xml version"1.0" encoding"UTF-8"?> &…

Spring Quartz项目实现Job的动态控制

一、简单介绍 Quartz可以对job进行简单控制&#xff0c;但不支持分布式&#xff0c;也没有管理界面和任务分片&#xff0c;但使用起来比较简易。 二、创建简单Demo 我们开始简单使用一下&#xff0c;首先创建Demo&#xff0c;在pom文件中加入以下依赖。 <parent><g…

golang项目实战2023/03/21

初始化项目首先建立一个文件夹在文件夹下面建一个main.go文件执行初始化命令行go mod init page // page 为自己的项目名称 go mod tidy 安装框架 go get gorm.io/gorm // gorm go get gorm.io/driver/mysql // 这里是用的sql数据库 go get -u github.com/gin-gonic/gin // 这…

Numpy 广播域

NumPy广播(Broadcast)&#xff0c;广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式&#xff0c; 对数组的算术运算通常在相应的元素上进行。不同形状指的是&#xff0c;大小不同当然不是指的维度&#xff0c;但是要求数组各维度的长度相同例如&#xff1a;…

ICG-MAL,吲哚菁绿-马来酰亚胺,CAS:2143933-81-5,科研级别试剂

ICG-MAL,吲哚菁绿-马来酰亚胺 中文名称&#xff1a;吲哚菁绿-马来酰亚胺 英文名称&#xff1a;ICG-MAL 性状&#xff1a;粉末或固体 CAS&#xff1a;2143933-81-5 分子式&#xff1a;C51H56N4O6S 分子量&#xff1a;853.09 溶剂&#xff1a;溶于二氯甲烷等常规性有机溶…