📖 首先需要准備好數據集,這里有labelme標簽數據轉coco數據集標簽的說明:labelme轉coco數據集 - 一屆書生 - 博客園 (cnblogs.com)
1. 准備工作目錄
我們的工作目錄,也就是mmdetection目錄,如下所示:
|-- configs
| |-- _base_
| |--- .......
|-- data
| |--- coco
| | |--- annotations
| | |--- train2017
| | |--- val2017
| | |--- visualization
|-- mmdet
| |--- core
| |--- datasets
| |--- .......
|-- tools
-
configs就是我們的配置文件,里邊包含所有的文件。
-
data就是我們的數據集文件,文件目錄如上。
-
mmdet是我們所需要修改的目錄。
-
tools是我們的mmdetection提供的工具箱,里邊包含我們要用的訓練和測試文件。
2. 修改mmdetection模型的配置
1️⃣ 如果自己的GPU顯存不夠用,修改下面文件里的img_scale=(1333, 800)
,改成小一點的數值。三個文件都要改。
configs/_base_/datasets/coco_detection.py
configs/_base_/datasets/coco_instance.py
configs/_base_/datasets/coco_instance_semantic.py
2️⃣ 選擇你要訓練的模型對應的配置文件修改,假如我要訓練的模型是mask_rcnn_r101_fpn_2x_coco.py,我打開configs/mask_rcnn/mask_rcnn_r101_fpn_2x_coco.py,內容如下:
然后我們找到這個目錄下的文件,修改文件里的 num_classes=80
,修改成自己的類別數目。
configs/_base_/models/mask_rcnn_r50_fpn.py
3️⃣ 修改我們的類別名,兩個文件需要修改,第一個文件是:
mmdet/core/evaluation/class_names.py
修改里邊的def coco_classes():
,將return內容修改成自己的類別。
第二個文件:
mmdet/datasets/coco.py
修改里邊的class CocoDataset(CustomDataset):
,將 CLASSES = () 修改成自己的類別。
至此,修改結束,我們還需要重新編譯一遍,這樣才能生效,在我們的mmdetection目錄下運行:
python setup.py install
3. 開始訓練
1️⃣ 單GPU訓練
python tools/train.py configs/mask_rcnn/mask_rcnn_r101_fpn_2x_coco.py
- configs/mask_rcnn/mask_rcnn_r101_fpn_2x_coco.py 就是我們要訓練的模型
2️⃣ 多GPU訓練
bash ./tools/dist_train.sh configs/mask_rcnn/mask_rcnn_r101_fpn_2x_coco.py 2
- configs/mask_rcnn/mask_rcnn_r101_fpn_2x_coco.py 就是我們要訓練的模型
- 2 是我們的GPU數目
3️⃣ 我們可以剛開始訓練便停止,對訓練的一些配置進行修改。它會在你的mmdetection目錄下自動生成一個work_dirs文件夾,里邊包含你模型的配置文件,打開里邊的.py文件,例如我的:
mmdetection/work_dirs/mask_rcnn_r101_fpn_2x_coco/mask_rcnn_r101_fpn_2x_coco.py
一般我們進行修改的就是下面這些,官方給的配置文件中所有參數的解釋說明:mmdetection-readthedocs-io-zh_CN-latest.pdf
runner = dict(type='EpochBasedRunner', max_epochs=24)
# 最大的epochs,根據自己的情況來調整。
checkpoint_config = dict(interval=1)
# 模型權重的保存的間隔,建議調大一點,否則會保存大量模型權重,占用存儲空間,例如interval=8。模型會默認保存最后一次訓練的權重
log_config = dict(interval=50, hooks=[dict(type='TextLoggerHook')])
# 日志的輸出間隔,建議調小一點,例如interval=4
需要注意的是,修改完配置文件,再訓練的時候,訓練語句指定的配置文件就是你剛剛修改的了,也就是work_dirs目錄下面的。
修改完配置文件后,單 GPU訓練
python tools/train.py work_dirs/mask_rcnn_r101_fpn_2x_coco/mask_rcnn_r101_fpn_2x_coco.py
修改完配置文件后,多GPU訓練
bash ./tools/dist_train.sh work_dirs/mask_rcnn_r101_fpn_2x_coco/mask_rcnn_r101_fpn_2x_coco.py 2
4. 模型測試
python tools/test.py work_dirs/mask_rcnn_r101_fpn_2x_coco/mask_rcnn_r101_fpn_2x_coco.py work_dirs/mask_rcnn_r101_fpn_2x_coco/latest.pth --show-dir work_dirs/mask_rcnn_r101_fpn_2x_coco/test_show
我是一共有十張圖片,7張圖片用於訓練,3張圖片用於測試。有個缺點我沒解決,就是螺母的中間,應該為背景,我在用labelme標注過程中都已經標注為_background_,訓練的時候,我是用的num_classes=2,我再測試測試。
我自己標注的數據集鏈接放在這:「螺絲螺母標注數據集全文件」
可視化結果展示:
![]() |
![]() |
同時我們的 work_dirs/mask_rcnn_r101_fpn_2x_coco/ 目錄下還會有個json文件,可以可視化我們的一些評價指標的變化情況。
python tools/analysis_tools/analyze_logs.py plot_curve work_dirs/mask_rcnn_r101_fpn_2x_coco/20211015_112915.log.json --keys bbox_mAP segm_mAP
顯示結果如下圖:

⭐ 文章到此結束了,還有一些小bug,例如上邊提到的螺母中間的標注問題,以及最終的評價指標的橫坐標epoch顯示過於緊密。后續改后對文章繼續修改。