mmdetection为香港中文大学和商汤科技用于目标检测和实例分割的开源项目,地址为https://github.com/open-mmlab/mmdetection
一、安装。下载该项目后,命令行进入进入mmdetection目录,运行compile.sh程序,然后运行setup.py程序,我是在anaconda环境下进行的,在anaconda的相关目录下会生成mmdetection项目相关程序,实际运行的时候会运行anaconda下的该项目的程序,故而每次修改mmdetection中相关程序后,需要重新运行setup.py来更新anaconda下mmdetection项目相关程序,如果不重新运行setup.py会报错,涉及到的命令如下:
cd mmdetection
./compile.sh
python setup.py install
该项目使用的框架是pytorch,我安装的是pytroch1.1,现在已经支持,之前的版本只支持0.4。我选择python3.6,还需安装cython,mmcv。
二、模型的一些参数配置文件在configs目录下,各个模型也有不同的模型配置,比如我使用的faster rcnn共有6个不同的配置,我使用的是faster_rcnn_r50_fpn_1x.py这种配置,里面的具体参数也做一些修改,pascal_voc目录下faster_rcnn_r50_fpn_1x_voc0712.py是对应的pascal voc标注文件的配置形式,使用该pascal voc格式数据集来运行的时候应该使用该配置文件,或者转换成coco格式,使用configs目录下的python文件,识别肺结节为二分类,总共只有肺结节和背景两类,所以修改配置文件中的num_classes为2,若是coco格式,需要将mmdetection/mmdet/datasets下的coco.py中的CocoDataset类的CLASSES元组类型类别变量改为肺结节一类,我这里修改为:
CLASSES = ('nodule')
将mmdetection/mmdet/core/evaluation下的class_names.py中的coco_classes()函数的返回值类别列表修改为肺结节一类,我这里修改为:
return ['nodule']
如果是pascal voc格式,那么需要将mmdetection/mmdet/datasets下的voc.py中的VOCDataset类的CLASSES元组类型类别变量改为肺结节一类,需要注意的是,如果检测的类别只有一类,需要加上逗号,多类则不需要,我这里修改为:
CLASSES = ('nodule',)
将mmdetection/mmdet/core/evaluation下的class_names.py中的voc_classes()函数的返回值类别列表修改为肺结节一类,我这里修改为:
return ['nodule']
三、关于配置文件和代码解读,可以参考配置文件解读和代码解读这两个网站
四、使用的数据集是LUNA16数据集,共10个文件夹888个CT图像,根据annotation.csv标注文件找肺结节切片,将同一张切片上的肺结节用一个xml文件标注,一共得到1175张图片,其中800多个肺结节直径小于平均直径,300多个肺结节直径大于平均直径,0~799共800张图片用于训练,800~1174共375张图片用于测试,实际1175张图片发现有24张图片对应的xml文件(根据annotation.csv和mhd中数据文件转换得到)的肺结节坐标全为负数,后来舍弃了,只剩1151张图片,前800张图片中去掉了19张,后375张中去掉了5张,初始学习率设置为0.005,学习率的衰减step设置为[20,40],imgs_per_gpu(batch_size)设置为2,epoch设置为500。测试的时候,直接运行mmdetection/tools目录下的test.py(使用的是coco格式)测试并显示,其中具体参数以自己的项目为准:
python tools/test.py weights/epoch_500.pth --out ./result/result_500.pkl --eval bbox --show
能够显示测试集所有图片的检测效果图,但是无法显示检测统计结果,会报错如下:
loading annotations into memory...
Done (t=0.00s)
creating index...
index created!
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 200/200, 4.5 task/s, elapsed: 45s, ETA: 0s
writing results to ./result/result_500.pkl
Starting evaluate bbox
Loading and preparing results...
DONE (t=0.01s)
creating index...
index created!
Running per image evaluation...
Evaluate annotation type *bbox*
Traceback (most recent call last):
File "tools/test.py", line 197, in
main()
File "tools/test.py", line 186, in main
coco_eval(result_file, eval_types, dataset.coco)
File "/home/hhm/anaconda3/envs/pytorch/lib/python3.6/site-packages/mmdet-0.6.0+unknown-py3.6.egg/mmdet/core/evaluation/coco_utils.py", line 36, in coco_eval
cocoEval.evaluate()
File "/home/hhm/anaconda3/envs/pytorch/lib/python3.6/site-packages/pycocotools-2.0.0-py3.6-linux-x86_64.egg/pycocotools/cocoeval.py", line 156, in evaluate
for catId in catIds
File "/home/hhm/anaconda3/envs/pytorch/lib/python3.6/site-packages/pycocotools-2.0.0-py3.6-linux-x86_64.egg/pycocotools/cocoeval.py", line 158, in
for imgId in p.imgIds
File "/home/hhm/anaconda3/envs/pytorch/lib/python3.6/site-packages/pycocotools-2.0.0-py3.6-linux-x86_64.egg/pycocotools/cocoeval.py", line 252, in evaluateImg
if g['ignore'] or (g['area']aRng[1]):
KeyError: 'area'
这里的问题并没有解决,后来使用test.py生成pkl文件,然后使用mmdetection/tools目录下的voc_eval.py程序来预测统计,这时需要先用coco格式数据集来运行test.py程序,然后以pascal voc格式数据集来运行voc_eval.py程序,其中具体参数以自己的项目为准,操作如下:
python tools/test.py configs/faster_rcnn_r50_fpn_1x.py weights/epoch_500.pth --out ./result/voc_eval_result/result_500.pkl
python tools/voc_eval.py result/voc_eval_result/result_500.pkl configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712.py
这样,voc_eval.py程序会给出检测的统计结果。