草庐IT

使用Pytorch实现图像花朵分类

魔鬼面具 2023-04-16 原文

基于pytorch-classifier这个源码进行实现的图像分类

代码的介绍在这个链接里面,这篇博客主要是为了带着大家通过实践的方式熟悉一下代码的使用,并且了解相关功能。

1. 下载相关资料

这里我提供了一个花朵数据集,里面总共有十个类别的花朵作为本次实验的数据集。
我们下载代码数据集到本地,然后我们在下图创建一个名字为dataset的文件夹,然后把花朵数据集放到里面并重命名为train,具体如下:

至此,完成第一步。

2. 配置环境

  1. 首先推荐使用anaconda作为你的python环境,代码工具可以使用vscode或者pycharm,这个根据使用者爱好,这边我使用的是pycharm,那么这里默认各位已经准备好anaconda和(vscode或者pycharm),不会安装的话可以百度一下,这方面的教程都非常丰富。
  2. 安装torch和torchvision
    你可以在这个pytorch官网中找到对应的安装命令,这里版本要求torch==1.12.0+,下面贴出torch==1.12.0的各项安装命令,各位看官可以根据自己的电脑情况进行选择
    CUDA 11.6
    pip install torch==1.12.0+cu116 torchvision==0.13.0+cu116 --extra-index-url https://download.pytorch.org/whl/cu116
    CUDA 11.3
    pip install torch==1.12.0+cu113 torchvision==0.13.0+cu113 --extra-index-url https://download.pytorch.org/whl/cu113
    CUDA 10.2
    pip install torch==1.12.0+cu102 torchvision==0.13.0+cu102 --extra-index-url https://download.pytorch.org/whl/cu102
    CPU only
    pip install torch==1.12.0+cpu torchvision==0.13.0+cpu --extra-index-url https://download.pytorch.org/whl/cpu
  3. 安装成功后,进入到代码路径进行pip install -r requirements.txt

至此,完成第二步。

3.分割数据集

在第一步中我们已经放好数据集,但是还没有划分验证集和测试集,这个代码中的processing.py提供了分割数据集的功能,其主要参数如下

其中–val_size --test_size就是验证集和测试集的比例,这里的分割思想是,先在全部数据集上分出–test_size比例的数据,然后再从剩下的分出-val_size比例的数据。具体参数解释可以看Readme.md文件。

那么我们默认参数即可,如果各位看官需要修改,可以自行修改即可,那么我们的运行命令就是:

python processing.py

如果需要更改参数,可以直接在命令后面指定,比如我想验证集比例是0.1:

python processing.py --val_size 0.1

运行成功后你可以看到下图所示:

至此,完成第三步。

4. 训练模型

在本次实验中我们训练ghostnet,其中训练的代码在main.py中,具体参数解释请看Readme.md,都已经解释得比较详细了。那么这里我们直接上命令并附带一些解释:

python main.py --model_name ghostnet --pretrained --config config/config.py --save_path runs/ghostnet_flower --lr 1e-4 --warmup --amp --imagenet_meanstd  --Augment AutoAugment 

运行后,你可以看到以下信息:

其中会输出所有参数的设置信息,可以通过这个表格观看你的参数设置是否有误。我们也可以看到其在下载预训练权重到本地路径,有些看官的网络不好的话,其可能会卡在这里不动,那我们可以手动复制这个链接:

https://github.com/z1069614715/pretrained-weights/releases/download/ghostnet_1x_v1.0/ghostnet_1x-f97d70db.pth

到迅雷或者浏览器上进行下载到:

C:\Users\Admin/.cache\torch\hub\checkpoints\ghostnet_1x-f97d70db.pth

上述的下载链接和路径在各位看官的输出信息中都可以找到。
然后就会开始训练:

我们可以看到显示了你选择的模型是ghostnet,也显示了这个模型的flops和参数量,然后就开始训练,并显示训练的进度条和每个epoch的log信息。然后我们就可以等待训练结束。

我们从图中可以看到其训练到83个epoch就停止,是因为代码中有一个–patience参数,默认值为30,也就是经过30个epoch没有提升,模型就会认为已经收敛,就停止训练。训练完成后我们可以打开刚设定好的–save_path路径:

其中我们可以看到以下的可视化:

  1. 曲线迭代图
  2. 学习率曲线变化图
  3. 训练过程中的图像可视化

这里就只展示两张图,默认是生成五张。
当然你对上述曲线可视化不满意,可以自行读取–save_path中的train.log文件进行自定义可视化。这个文件相当于记录了曲线上的值,方便后期各位美工图像等等…

我们还看到有一个best.pt和last.pt,后续的测试和预测的步骤,都会读取best.pt作为我们的模型进行测试和预测,其余文件有兴趣可以看看Readme.md中的Some explanation的第八点。
至此,完成第四步

5. 测试

我们在第四步中使用了训练集进行训练,验证集测试,那么剩下测试集就是用训练好的模型进行检测,那么这里我演示如何使用我们的metrice.py进行检测。

python metrice.py --task test --save_path runs/ghostnet_flower

–task 就是任务的意思 其支持train、val、test、fps。这里我们演示的是test,就是使用测试集进行测试计算指标。运行后的截图如下:

我们可以看到其会显示你当前的模型类型,显示你这个模型训练过程最好精度的指标,然后下面就是显示精度,类别平均精度,以及每个类别的preciesion、recall、f1-score、Kappa、accuracy.
你还可以在–save_path中的test文件夹中找到混淆矩阵,其中csv文件就是数据的存储,如果有作图、美工的需求,可以自行读取。


当然我们的测试过程是支持tta(详情可看Readme.md文件中的第10点)的,只需要额外加一个参数即可

python metrice.py --task test --save_path runs/ghostnet_flower --test_tta


我们可以看到使用tta可以增加精度,但是会增加一点时间。
我们的metrice.py中还支持可视化数据集的识别情况和tsne可视化,也是只需要添加两个参数即可。

python metrice.py --task test --save_path runs/ghostnet_flower --visual --tsne

当然这个过程也支持test_tta,但是为了节省时间就不加了。运行结束后,我们可以在–save_path路径中找到对应的数据文件:


其中tsne的坐标信息也保存到tsne.csv中,方便后期美工。
还有生成了correct.csv,incorrect.csv这两个csv文件,其中里面记录了文件路径,预测的类别,正确的类别,预测的类别对应的概率,以方便后期进行错误预测的分析。
至此,完成第五步。

6. 预测

预测的代码文件是predict.py,其支持输入单张图片或者一个文件夹,那么这里我们就展示一个文件夹的预测。
假如我们把测试集中其中一类的文件进行预测,我们可以运行以下命令:

python predict.py --source dataset/test/00 --save_path runs/ghostnet_flower

当然此过程也是支持test_tta,也是只需要在后面添加参数即可。
这是运行成功的截图:

我们可以打开–save_path的predict文件夹:

我们随便打开一张图像:

我们可以看到图像的预测类别和对应预测类别的概率。
你以为结束了吗?并没有,我们的predict.py文件结合pytorch_grad_cam库实现了热力图可视化,并支持多种热力图计算方法详情请看–cam_type参数和Some explanation第十二点,也是只需要加一个参数:

python predict.py --source dataset/test/00 --save_path runs/ghostnet_flower --cam_visual --cam_type GradCAMPlusPlus

运行成功后依然在–save_path的predict文件夹中可以找到对应保存的图像,这里我们也是随便打开一张图像:

我们可以看到在图像中添加了这个热力图可视化。
你们在文件夹中还可以找到一个result.csv文件,其记录了文件的路径,预测的类别,预测的类别对应的概率信息。
至此,完成第六步。

总结

整个程序的功能演示就到此结束,当然程序的功能不仅仅于此,具体可以看Readme.md中的具体解释,其还支持知识蒸馏,有兴趣的可以看一下代码中的Knowledge_Distillation.md,使用起来也是比较简单的,但是知识蒸馏的参数设置比较吃经验,需要使用者自行尝试。
如果遇到bug等等问题可以留言或者私信作者。
本次实验的代码数据模型全部文件:百度云链接

最后致敬bubbliiing的开源精神!

如果内容对你有帮助,麻烦点个赞,谢谢!

有计算机视觉合作项目可以私信作者!

有关使用Pytorch实现图像花朵分类的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  5. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  6. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  7. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  8. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  9. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  10. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

随机推荐