目标检测框架——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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章