目标检测的模型还是很多的,要挨个挨个学还是有点吃力(精力旺盛可忽略),所以这里总结一下当前流行的目标检测的框架:darknet yolov4,mmdetection2.0,detectron2.0。至于这三个框架怎么去选择,我的答案是只有你真正懂了,上手试了这几个框架之后你才能比较它们之间的优劣。
我的环境:WIN10,CUDA10.1,cuDNN7.6.4,Anaconda,VS2019(这个必须有),OpenCV3.4.10,GTX1660(6G内存)
至于为什么要创建一个虚拟环境,起作用主要有以下几个:
创建一个没有存在过的虚拟环境:
conda create -n mmd2 python=3.7
激活虚拟环境:
conda activate mmd2
conda install pytorch=1.3 torchvision cudatoolkit=10.1
这里pytorch只能是1.3版本的,太高会运行不成功,这也是为什么要创建虚拟环境的原因。
pip install cython opencv-python pillow matplotlib numpy==1.17.5
修改C:\Users\lee\Anaconda3\envs\mmd2\Lib\site-packages\torch\utils\cpp_extension.py
185行: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
mmcv这个库就是用于计算机视觉研究的基础 Python 库,支持 MMLAB 中的许多研究项目(本文用的mmdetection)
pip install mmcv
或者
git clone https://github.com/open-mmlab/mmcv.git
cd mmcv
pip install -e .
这个库就不用我多说了,做目标检测没人不知道他吧
两种办法:(我用的第二种)
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
pip install -r requirements.txt
setup.py
文件中CUDAExtension
中extra_compile_args
相关代码,增加cxx
的:"-DMS_WIN64","-MD"
python setup.py develop
测试一张图(记得自己改图片地址)
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
这里只展示Mask-Rcnn的训练过程,其他网络的训练都差不多。
新建一个data
文件夹,如下:
mmdetection
├── mmdet
├── tools
├── configs
├── data
│ ├── coco
│ │ ├── annotations
│ │ ├── train2017
│ │ ├── val2017
│ │ ├── test2017
│ ├── cityscapes
│ │ ├── annotations
│ │ ├── leftImg8bit
│ │ │ ├── train
│ │ │ ├── val
│ │ ├── gtFine
│ │ │ ├── train
│ │ │ ├── val
│ ├── VOCdevkit
│ │ ├── VOC2007
│ │ ├── VOC2012
将你的训练数据和验证数据分别放在train2014
和val2014
文件夹下,使用labelme来为自己的训练集和验证集数据打标签,并放在各自的同一目录。
COCO数据集格式
labelme制作的json文件并不能直接使用,需要转换工具转换成COCO数据集一个大的json文件的格式。GitHub下载labelme2coco.py
文件,并在train2014
和val2014
文件夹下运行labelme2coco.py
各自生成两个COCO数据集的文件。然后将instances_train2014.json
和instances_val2014.json
两个文件放进annotations
文件夹里面。
写一个适合自己目标检测类别的权重文件:
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)
mmdetection2.0\mmdet\utils\collect_env.py
注释42-44行。C:\mmdetection\mmdetection2.0_tutorials\mmdetection2.0\configs\_base_\models\mask_rcnn_r50_fpn.py
其中 num_class
为你要训练数据的类别数(不用加1)C:\mmdetection\mmdetection2.0_tutorials\mmdetection2.0\configs\_base_\schedules\schedule_1x.py
其中total_epochs
训练次数 lr
学习率.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)]
C:\mmdetection\mmdetection2.0_tutorials\mmdetection2.0\mmdet\datasets\coco.py
当中的 CLASSES
改成你自己的类别。训练
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