使用mmdetection訓練自己的coco數據集(免費分享自制數據集文件)


📖 首先需要准備好數據集,這里有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

否則會遇到bug:# AssertionError: The `num_classes` (3) in Shared2FCBBoxHead of MMDataParallel does not matches the length of `CLASSES` 80) in CocoDataset - 一屆書生 - 博客園 (cnblogs.com)

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,我再測試測試。

我自己標注的數據集鏈接放在這:「螺絲螺母標注數據集全文件」

可視化結果展示:

24epochs
480epochs

同時我們的 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

顯示結果如下圖:

Figure_1

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM