目標檢測框架——mmdetection2.0

前言

目標檢測的模型還是很多的,要挨個挨個學還是有點喫力(精力旺盛可忽略),所以這裏總結一下當前流行的目標檢測的框架:darknet yolov4,mmdetection2.0,detectron2.0。至於這三個框架怎麼去選擇,我的答案是隻有你真正懂了,上手試了這幾個框架之後你才能比較它們之間的優劣。

1. mmdetection2.0 配置

我的環境:WIN10,CUDA10.1,cuDNN7.6.4,Anaconda,VS2019(這個必須有),OpenCV3.4.10,GTX1660(6G內存)

1.1 虛擬環境

至於爲什麼要創建一個虛擬環境,起作用主要有以下幾個:

  1. 虛擬環境可以搭建獨立的python運行環境, 使得單個項目的運行環境與其它項目互不影響。
  2. 可以避免一個環境造成得安裝包過的多,導致環境加載緩慢。

創建一個沒有存在過的虛擬環境:

conda create -n mmd2 python=3.7

激活虛擬環境:

conda activate mmd2

1.2 安裝pytorch

conda install pytorch=1.3 torchvision cudatoolkit=10.1

這裏pytorch只能是1.3版本的,太高會運行不成功,這也是爲什麼要創建虛擬環境的原因。

1.3 安裝一些依賴包

pip install cython opencv-python pillow  matplotlib numpy==1.17.5

1.4 修改文件內部的一些參數(非常重要)

修改C:\Users\lee\Anaconda3\envs\mmd2\Lib\site-packages\torch\utils\cpp_extension.py185行:match = re.search(r'(\d+)\.(\d+)\.(\d+)', compiler_info.decode("utf8","ignore").strip())

下面這一步如果你是VS2019可以不用更改
C:\Users\lee\Anaconda3\envs\mmd2\Lib\site-packages\torch\include\c10\util替換 flat_hash_map.h
C:\Users\lee\Anaconda3\envs\mmd2\Lib\site-packages\torch\include\c10\util替換 order_preserving_flat_hash_map.h

1.5 安裝mmcv

mmcv這個庫就是用於計算機視覺研究的基礎 Python 庫,支持 MMLAB 中的許多研究項目(本文用的mmdetection)

pip install mmcv

或者

git clone https://github.com/open-mmlab/mmcv.git
cd mmcv
pip install -e .

1.6 安裝pycocotools

這個庫就不用我多說了,做目標檢測沒人不知道他吧
兩種辦法:(我用的第二種)

pip install git+https://github.com/philferriere/cocoapi.git#subdirectory=PythonAPI

或者https://github.com/philferriere/cocoapi下載源碼,並進行解壓。以管理員身份打開 CMD 終端,並切換到 cocoapi\PythonAPI目錄。運行以下指令:

python setup.py build_ext install

1.7 安裝mmdetection

  1. GitHub下載mmdetection
  2. 進入mmdetection,執行:pip install -r requirements.txt
  3. 修改setup.py文件中CUDAExtensionextra_compile_args相關代碼,增加cxx的:"-DMS_WIN64","-MD"
  4. 執行python setup.py develop

1.8 測試

測試一張圖(記得自己改圖片地址)

python demo/image_demo.py demo/demo.jpg configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py checkpoints/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth

測試攝像頭

python demo/webcam_demo.py configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py checkpoints/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth 

2. mmdetection2.0 訓練自己的數據集

這裏只展示Mask-Rcnn的訓練過程,其他網絡的訓練都差不多。

2.1 數據集準備

新建一個data文件夾,如下:

mmdetection
├── mmdet
├── tools
├── configs
├── data
│   ├── coco
│   │   ├── annotations
│   │   ├── train2017
│   │   ├── val2017
│   │   ├── test2017
│   ├── cityscapes
│   │   ├── annotations
│   │   ├── leftImg8bit
│   │   │   ├── train
│   │   │   ├── val
│   │   ├── gtFine
│   │   │   ├── train
│   │   │   ├── val
│   ├── VOCdevkit
│   │   ├── VOC2007
│   │   ├── VOC2012

將你的訓練數據和驗證數據分別放在train2014val2014文件夾下,使用labelme來爲自己的訓練集和驗證集數據打標籤,並放在各自的同一目錄。

COCO數據集格式

labelme製作的json文件並不能直接使用,需要轉換工具轉換成COCO數據集一個大的json文件的格式。GitHub下載labelme2coco.py文件,並在train2014val2014文件夾下運行labelme2coco.py各自生成兩個COCO數據集的文件。然後將instances_train2014.jsoninstances_val2014.json兩個文件放進annotations文件夾裏面。

2.2 構造自己模型的權重文件

寫一個適合自己目標檢測類別的權重文件:

import torch
pretrained_weights  = torch.load('checkpoints/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth')

num_class = 1
pretrained_weights['state_dict']['roi_head.bbox_head.fc_cls.weight'].resize_(num_class+1, 1024)
pretrained_weights['state_dict']['roi_head.bbox_head.fc_cls.bias'].resize_(num_class+1)
pretrained_weights['state_dict']['roi_head.bbox_head.fc_reg.weight'].resize_(num_class*4, 1024)
pretrained_weights['state_dict']['roi_head.bbox_head.fc_reg.bias'].resize_(num_class*4)

torch.save(pretrained_weights, "mask_rcnn_r50_fpn_1x_%d.pth"%num_class)

num_class爲你要訓練數據的類別數(不用加1)

2.3 修改配置文件

  1. mmdetection2.0\mmdet\utils\collect_env.py 註釋42-44行。
  2. 修改C:\mmdetection\mmdetection2.0_tutorials\mmdetection2.0\configs\_base_\models\mask_rcnn_r50_fpn.py 其中 num_class爲你要訓練數據的類別數(不用加1)
  3. 修改C:\mmdetection\mmdetection2.0_tutorials\mmdetection2.0\configs\_base_\schedules\schedule_1x.py其中total_epochs訓練次數 lr學習率.
  4. 修改C:\mmdetection\mmdetection2.0_tutorials\mmdetection2.0\configs\_base_\default_runtime.py
checkpoint_config = dict(interval=1) #訓練多少次保存一次權重
# yapf:disable
log_config = dict(
    interval=50,  #填寫你的val2014文件夾圖片數目
    hooks=[
        dict(type='TextLoggerHook'),
        # dict(type='TensorboardLoggerHook')
    ])
# yapf:enable
dist_params = dict(backend='nccl')
log_level = 'INFO'
load_from = None #上面change.py生成的權重文件
resume_from = None
workflow = [('train', 1)]
  1. 修改C:\mmdetection\mmdetection2.0_tutorials\mmdetection2.0\mmdet\datasets\coco.py當中的 CLASSES改成你自己的類別。

2.4 訓練和測試

訓練

python tools/train.py configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py

測試(記得自己修改測試圖片的路徑)

python demo/image_demo.py data/coco/test2014/2.jpg configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py work_dirs/mask_rcnn_r50_fpn_1x_coco/epoch_5.pth
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章