ubuntu下mmdetection項目中Faster R-CNN模型進行肺結節檢測

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 <module>
    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 <listcomp>
    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[0] 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程序會給出檢測的統計結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章