数据准备工作
- 原始数据分两个文件夹,images(彩色图片)、mask(掩膜照片,一定要转换成灰度图
- images的名字若为“ABC.jpg”,mask里的掩膜照片应该这样命名“ABC_type_num.png”(这里的type是训练集的分类,我这里只有一种分类‘polyp’,一般从数据集json文件里的label就可以看到分类;num是从0开始的序列0, 1, …)
生成coco数据集
用coco转换代码将数据集转换成coco类型(即生成一个json文件,其中包含掩膜照片的信息,所以训练时不需要掩膜照片)
- 首先安装pycocotools,https://pypi.org/project/pycocotools/#files 下载文件pip安装
- 安装cpython
pip install cpython
- 安装git
pip install git
- 安装pycococreator,
pip install git+https://github.com/waspinator/pycococreator.git
- 数据集放置及代码设置如下,程序路径分train、val、test三次运行,即可,其中annotations放置的是掩膜照片。运行三次会生成三个json文件,文件名改成下图所示。
运行mmdetection代码
- 将转换好的coco格式文件如下放在mmdetection文件夹中
- 新建一个data/coco文件夹,如下图再创建四个文件夹,其中annotations文件夹下放置上步生成的三个json文件,剩下三个文件夹放置训练、验证、测试所用的彩色照片
- 代码修改
(1)datasets/coco.py修改成自己的分类,如下图,只有一个分类的时候别忘了逗号
(2)mmdet/core/evaluation/class_names.py修改成自己的分类,如下图
(3)configs/base/models/mask_rcnn_r50_fpn.py修改num_classes的值为分类的数量(千万不要+1),我这里是改成1,有的模型是有四个num_classes,四个全都要改,可以用Ctrl+F查找一下。
(4) 补充:首先查看自己的配置文件,2.7版本和网上有的教程不一样,配置文件只有如下信息
从图中可以看出我们的配置文件分为四个部分,我们需要分别打开,修改其中信息
(4.1) 修改./configs_base_\dataset\coco_instance.py 在train_pipeline和test_pipeline中间添加val_pipeline(据说是添加验证步骤,具体有没有用我还不清楚,但是不会报错)
val_pipeline =[
dict(type='LoadImageFromFile'),
dict(type='LoadAnnotations', with_bbox=True),
dict(type='Resize', img_scale=(1333, 800), keep_ratio=True),
dict(type='RandomFlip', flip_ratio=0.5),
dict(type='Normalize', **img_norm_cfg),
dict(type='Pad',size_divisor=32),
dict(type='DefaultFormatBundle'),
dict(type='Collect',keys=['img', 'gt_bboxes', 'gt_labels']),
]
(4.2) 然后在configs_base_\schedules\schedule_1x.py中修改epoch和学习率(原文件是8个GPU学习率是0.02,我这只有1个GPU所以是0.02/8=0.0025)
(4.3) 最后修改configs_base_\default_runtime.py
首先第一行修改成checkpoint_config = dict(create_symlink=False)
,避免FileNotFoundError: [Errno 2] No such file or directory: ‘epoch_1.pth’ 这个错误。
然后取消第八行的注释,这是为了可以在训练以后通过tensorboard查看训练结果。
最后在最后一行修改成workflow = [('train', 1), ('val', 1)]
,据说也是为了验证。
- 运行代码(后面路径部分根据自己想要的模型来写)
python tools/train.py configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py
python tools/test.py configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py work_dirs/mask_rcnn_r50_fpn_1x_coco/latest.pth --eval bbox segm