基于pytorch-classifier这个源码进行实现的图像分类
代码的介绍在这个链接里面,这篇博客主要是为了带着大家通过实践的方式熟悉一下代码的使用,并且了解相关功能。
1. 下载相关资料
这里我提供了一个花朵数据集,里面总共有十个类别的花朵作为本次实验的数据集。
我们下载代码和数据集到本地,然后我们在下图创建一个名字为dataset的文件夹,然后把花朵数据集放到里面并重命名为train,具体如下:
至此,完成第一步。
2. 配置环境
- 首先推荐使用anaconda作为你的python环境,代码工具可以使用vscode或者pycharm,这个根据使用者爱好,这边我使用的是pycharm,那么这里默认各位已经准备好anaconda和(vscode或者pycharm),不会安装的话可以百度一下,这方面的教程都非常丰富。
- 安装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 - 安装成功后,进入到代码路径进行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路径:
其中我们可以看到以下的可视化:
- 曲线迭代图
- 学习率曲线变化图
- 训练过程中的图像可视化
这里就只展示两张图,默认是生成五张。
当然你对上述曲线可视化不满意,可以自行读取–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等等问题可以留言或者私信作者。
本次实验的代码数据模型全部文件:百度云链接