像素级的物体识别和分割是Computer Vision中很重要的一个功能, 也是利用Deep Learning来进行上手的重要一步.
1. 环境准备
1.1 安装Detectron
依据这个链接步骤进行安装: https://github.com/facebookresearch/Detectron/blob/master/INSTALL.md
1.2 使用COCO 2017数据集进行training的测试
下载coco2017数据集, 并存放在 ./detectron/detectron/datasets/data/coco目录下面。下载后的数据集有三个目录,分别是train2017, val2017, annotations
修改文件 ./detectron/detectron/datasets/dataset_catalog.py, 添加对这个新的数据集的定义。
'coco_train2017': {
_IM_DIR:
_DATA_DIR + '/coco/train2017',
_ANN_FN:
_DATA_DIR + '/coco/annotations/instances_train2017.json'
},
'coco_val2017': {
_IM_DIR:
_DATA_DIR + '/coco/val2017',
_ANN_FN:
_DATA_DIR + '/coco/annotations/instances_val2017.json'
},
修改配置文件: configs/getting_started/tutorial_1gpu_e2e_faster_rcnn_R-50-FPN.yaml, 把“TRAIN”的“DATASETS"改成"coco_train2017", 把"TEST"的"DATASETS"改成"coco_val2017"
执行命令:
python tools/train_net.py --cfg configs/getting_started/tutorial_1gpu_e2e_faster_rcnn_R-50-FPN.yaml OUTPUT_DIR ./train_output
2. 准备训练数据
2.1 使用LabelMe标注多边形数据
网上有许多LabelMe的安装方法, 这里就不再重复。在win7下面完成安装,在cmd窗口输入
labelme
就可以进入LableMe的窗口。
标注后,每张图片会生成一个json文件。
2.2 把LabelMe的数据转换为coco数据格式
LabelMe产生的Json文件需要进行转换,才能被Detectron所训练。该链接的python文件可以完成转换:https://github.com/lindylin1817/labelme2coco
在./mydata目录下存放所有LabelMe产生的标注.json文件,运行如下命令完成转换。
python labelme2coco.py
转换后的文件为new.json。该数据集可用为训练数据,因此把new.json重命名为train.json
2.3 生成验证数据validation
重复上面的步骤,把训练数据集中的一部分图片标注,作为验证数据集。通过labelme2coco.py,生成validate.json
3. 使用Detectron进行数据训练
在./detectron/detectron/datasets/data下面创建目录mytrain,用于存放所有的训练数据和验证数据。
建立目录./detectron/detectron/datasets/data/mytrain/train , 把所有用于训练的.jpg文件拷贝到该路径下。
建立目录./detectron/detectron/datasets/data/mytrain/validation , 把所有用于验证的.jpg文件拷贝到该路径下。
建立目录./detectron/detectron/datasets/data/mytrain/annotations , 把train.json和validation.json拷贝到该路径下。
修改文件 ./detectron/detectron/datasets/dataset_catalog.py, 添加对这个新的数据集的定义。
'my_train': {
_IM_DIR:
_DATA_DIR + '/mytrain/train',
_ANN_FN:
_DATA_DIR + '/mytrain/annotations/train.json'
},
'my_validation': {
_IM_DIR:
_DATA_DIR + '/mytrain/validation',
_ANN_FN:
_DATA_DIR + '/mytrain/annotations/validation.json'
}
修改配置文件: configs/getting_started/tutorial_1gpu_e2e_faster_rcnn_R-50-FPN.yaml, 把“TRAIN”的“DATASETS"改成"my_train", 把"TEST"的"DATASETS"改成"my_validation"
执行命令:
python tools/train_net.py --cfg configs/12_2017_baselines/e2e_mask_rcnn_R-50-FPN_1x.yaml OUTPUT_DIR ./mytrain_output
"e2e_mask_rcnn_R-50-FPN_1x.yaml"该配置文件定义了训练的选项, 包括使用MaskRCNN, Resnet50, 等
4. 调整训练参数
为了能获得合理的训练结果, 我们需要对训练中出现的不同问题进行解决. 解决的重要方法就是调整训练参数. 以下罗列分别在不同情况下,该如何调整.
4.1 调整GPU数量
如果我们机器只有一块GPU, 那我们通过修改e2e_mask_rcnn_R-50-FPN_1x.yaml, 可以把GPU数量进行调整.
NUM_GPUS: 1
4.2 调整迭代次数
在一开始训练时, 我们不建议进行很多次的迭代. 我们尽量使用短一些的时间, 检验整个训练的配置是否合理. 我们可以通过修改e2e_mask_rcnn_R-50-FPN_1x.yaml来减少迭代次数.
MAX_ITER: 10000
在缺省设置中, 该参数被设为90000次. 改为10000次后, 在P100 GPU的环境下, 可以1个小时左右完成整个训练.
4.3 调整Learning Rate
当我们使用自己的数据来进行训练时, 它的数据量和数据分布都和COCO数据集有着极大的差距. 所以, 如果保留缺省learning rate的值(0.02), 很容易出现NaN的问题(俗称跑飞了), 而导致训练终止. 所以我们需要通过修改e2e_mask_rcnn_R-50-FPN_1x.yaml来把learning rate的初始值减少.
BASE_LR: 0.002
5. 检查训练后得到的检验结果
因为我们在训练中指定了validation的数据, 在训练结束时, detectron会自动对我们放在validation目录下的图片进行测试。并把测试结果放在文件mytrain_output/test/my_validation/generalized_rcnn/detections.pkl 中。
运行如下命令就可以生成可视化的检测结果:
python tools/visualize_results.py --dataset my_validation --detections mytrain_output/test/my_validation/generalized_rcnn/detections.pkl --output-dir mytrain_output/
生成的结果缺省是pdf文件,如下图
6. 用训练好的模型测试自己新的图片
完成了上面的步骤, 基本上就完成了整个训练过程。下面就是要测试自己的图片了。假设我们的测试图片都存放在mytest目录下:
python tools/infer_simple.py --cfg configs/12_2017_baselines/e2e_mask_rcnn_R-50-FPN_1x.yaml --output-dir /tmp/detectron-visualizations --image-ext jpg --wts mytrain_output/train/my_train\:my_validation/generalized_rcnn/model_final.pkl --output-dir mytest_output/ mytest
测试生成的图片存放在 mytest_output 目录下