pytorch环境之mask-rcnn源码实现
1.下载源码及配置环境
1.1 mask-rcnn源码下载
mask-rcnn,pytorch版本
链接:https://github.com/open-mmlab/mmdetectionpytorch
相关环境文章配置链接:https://blog.csdn.net/m0_46926492/article/details/129544634- 使用
pycharm
打开源码,并选择pytorch
虚拟环境的python
解释器
1.2 安装项目依赖包
- 在虚拟环境中安装相关项目库
pip install openmim mim install mmcv-full pip install mmdet
1.3 coco2017数据集下载
- 官网链接:https://cocodataset.org/
- 创建
data/coco2017
文件夹,将文件解压到coco2017
中 - 将
annotations_trainval2017/annotations
文件夹剪切到与train2017,val2017
同目录
- 将
train2017.zip,val2017.zip,annotations_trainval2017.zip,annotations_trainval2017
,四个文件都可以删除了 - 将
data
整个文件放入项目的根目录
1.4 气球数据集下载
- 官网链接:https://github.com/matterport/Mask_RCNN/releases
- 将气球VIA格式的数据集改为coco数据集
- 相关文章链接:VIA数据集格式转COCO格式(以气球数据集为例)
2. coco2017数据集训练模型
2.1 修改数据集类别名称和类别数量
- 需要修改为自己数据的类别名称,才能预测
- 修改文件位置
mmdetection-master/mmdet/datasets/coco.py
mmdetection-master/mmdet/core/evaluation/class_name.py
- 我使用的是
coco2017
数据集,所以现在不用修改
2.2 修改配置文件
-
找到配置文件目录
mmdetection-master/configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py
-
修改
mask_rcnn_r50_fpn.py
文件类别数,将80改为自己的分类个数coco2017
数据集不用修改
-
修改
coco_instance.py
文件,data_root
数据集路径- 数据集文件路径放的位置是固定的,但是
coco2017
这个名称可以根据自己的名称修改即可,其他的不需要动
- 为什么需要加
../
,因为train.py
数据集在tools
文件夹中,不在根目录,需要找到根目录位置
- 数据集文件路径放的位置是固定的,但是
-
修改
coco_instance.py
文件数据集路径,查看自己的文件名称,进行相应修改
-
修改
schedule_1x.py
文件中的学习率修改自己的数值
-
修改
default_runtime.py
文件,不知道为什么修改
-
添加
train.py
文件参数
2.3. 代码运行报错问题解决
- 运行
train.py
代码- 报错了
ImportError: Please run pip install future tensorboard to install the dependencies to use torch.utils.tensorboard (applicable to PyTorch 1.1 or higher)
- 根据提示命令安装
pip install future tensorboard
- 根据提示命令安装
- 再次运行,又报错了
AttributeError: module distutils has no attribute version
- 查阅资料表示
setuptools
版本太高,采用低版本的setuptools
pip install setuptools==59.5.0
- 查阅资料表示
- 报错了
- 重新运行,成功训练
- 数据集太大,没有跑完,所以下面使用
balloon
数据集测试是否正常跑通
- 数据集太大,没有跑完,所以下面使用
4.气球数据集训练模型
4.1 修改数据集类别名称和类别数量
- 需要修改为自己数据的类别名称,才能预测
- 修改文件位置
mmdetection-master/mmdet/datasets/coco.py
mmdetection-master/mmdet/core/evaluation/class_name.py
4.2 修改配置文件
-
找到配置文件目录
mmdetection-master/configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py
-
修改
mask_rcnn_r50_fpn.py
文件类别数,将80改为自己的分类个数,我改为1
-
修改
coco_instance.py
文件,data_root
数据集路径- 路径根据自己的数据集修改
- 路径根据自己的数据集修改
-
修改
coco_instance.py
文件数据集路径,查看自己的文件名称,进行相应修改- 注意自己的json文件名称,我修改为了
train.json,val.json
- 注意自己的json文件名称,我修改为了
-
在训练过
coco2017
数据集之后修改了其他的配置,其他都不需修改
4.3 代码运行
- 运行
train.py
代码,成功训练
4.5 优化模型
4.5.1 查看算法指标图
- 代码运行成功,但是效果非常差
- 原超参数
batch_size=2,epoch=12
- 使用
balloon
数据集train
数据集个数为63
,val
数据集个数为13
,数据及太小了,所以要根据自己的数据集修改超参数- 打印出来显示的是这样的,惊呆了,,,
- 打印出来显示的是这样的,惊呆了,,,
4.5.2 调整超参数batch_size
- 最终调整的超参数值samples_per_gpu=1
- 电脑只有一个
gpu
,源码有8
个gpu
,所以他的samples_per_gpu=2
,实际batch_size
为16
,实际调整的参数是samples_per_gpu
samples_per_gpu
这个值调试了很多次- 我将
samples_per_gpu
改为16
,报错显示内存溢出 - 改为
8
使用训练集测试,一个图片都没有检测出来【不知道什么问题】- 网上说
batch_size
太大,会影响模型的泛化能力,我的数据集比较少,可能会是这个原因 - 文章链接: BatchSize的数值并不是设置的越大越好
- 网上说
- 改为了
4
,有检测出来的,但是还有没有检测出来的
- 改为
2
,下面这张图片没有预测出来
- 想想就这样吧,最后改为
1
试了一下,预测出了一个气球,只能这样了,数据集小了
- 我将
- 参数修改文件
4.5.3 调整超参数epoch和学习率
- 前期
sample_per_gpu
修改时,epoch
也修改了,改过200,150
,都没有什么效果 - 原因:数据集太小,应该是不需要这么多批次,最后就设置了
100
,没有设置更低的,但是觉得80
可能效果也差不多,不想再试了,,, - 学习率改为
0.0025
【网上说的使用的gpu
越少,学习率就要越低】
4.5.4 迭代次数interval
- 没有什么对模型实际的影响,该不该都行,只是在终端会打印loss信息,但是也看不出来什么,看图比较明显
- 我是改为了
4
4.5.5 运行test文件测试数据
-
设置保存图片路径【检测出的图片】
-
在
test.py
中加入参数
../configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py
../tools/work_dirs/mask_rcnn_r50_fpn_1x_coco/epoch_150.pth
--show
--eval
bbox
segm
-
使用
val
数据集测试
-
预测问题,一个物体出现多个框
-
调整相关非极大值抑制参数
- 修改
nms
参数,红线行数数值修改了,默认值是注释的值 - 也调好几次,这是最后的值
- 修改
-
测试结果图
-
一张图片测试结果还好
-
多个气球不重叠的效果还好
-
多个气球重叠的效果还不是很好
- 测试错误的,把像气球的形状也测出来了
-
4.6 再次查看算法指标图
- 查看
loss
,使用tensorboard
- 在终端项目根目录输入命令
logdir
为输出的日志路径
tensorboard --logdir=tools/work_dirs/mask_rcnn_r50_fpn_1x_coco/
- 在终端项目根目录输入命令
- 学习率
- 训练集指标图
- 精准率大约为
93.5%
- 其他损失也都在缓慢下降
- 总体看效果是不错的
- 精准率大约为
- 校验集指标图
- 不知道是什么意思,但是感觉效果不错
- 以后知道都是什么指标再更新
5.总结
- 第一次实战,踩了很多坑
- 原先使用的tensorflow框架,环境搞不好,弄了一周放弃了【代码都没有正常运行出来,无语】
- 原先使用的coco2017数据集,真的太大了,训练时间太久了,再调参更可怕,不适合学习
- 实在没有办法了,就是用了balloon数据集,原先就想使用的,但是格式不一样,后期没有办法了,就搜了怎么转换的文章,幸运的是找到了相关代码可以使用,没有很浪费时间
- 这次给我最大的教训,就是不可以一次调多个参数,效果变好变坏都不知道到底是哪个参数导致的
- 调参真的需要经验,希望以后知道怎么调参数,,,