项目仓库地址:https://github.com/open-mmlab/mmdetection
香港中文大学-商汤科技联合实验室开源了基于 PyTorch 的检测库——mmdetection。商汤科技和港中大组成的团队在 2018年的COCO 比赛的物体检测(Detection)项目中夺得冠军,而 mmdetection 正是基于 COCO 比赛时的 codebase 重构。
这个开源库提供了已公开发表的多种视觉检测核心模块。通过这些模块的组合,可以迅速搭建出各种著名的检测框架,比如 Faster RCNN,Mask RCNN,R-FCN,RetinaNet , Cascade R-CNN及ssd 等,以及各种新型框架,从而大大加快检测技术研究的效率。遗憾的是现在还没有出yolo网络。
相比 FAIR 此前开源的 Detectron,mmdetection 有以下几大优势:
与 mmdetection 一起开源的还有一个基础库——mmcv。 mmcv 基础库主要分为两个部分:一部分是和 deep learning framework 无关的一些工具函数,比如 IO/Image/Video 相关的一些操作;另一部分是为 PyTorch 写的一套训练工具,可以大大减少用户需要写的代码量,同时让整个流程的定制变得容易。项目仓库地址为:https://github.com/open-mmlab/mmcv
建议也把mmcv仓库下载到本地,方便后面debug的时候查看源码。
最好按照官方仓库的安装说明进行,很多博客里面的安装方法都或多或少有点小问题,可能是官方仓库一直在更新但是博客没有更新的缘故。官方安装说明地址:https://github.com/open-mmlab/mmdetection/blob/master/INSTALL.md
简单来说,该仓库目前只支持在linux系统上运行,不支持window; PyTorch的版本要求为:PyTorch 1.0+ or PyTorch-nightly,且要根据其官网的安装命令安装,避免版本冲突问题。
因为博主之前使用别的博客的demo代码的时候出现错误,找了半天不知道是什么原因,而当我好好看官方说明的时候才知道这个代码在说明中有,而且已经更新过,所以为了保险期间,这里就不直接贴出代码了,给地址你们自己去看。
测试的demo代码地址为:https://github.com/open-mmlab/mmdetection/blob/master/GETTING_STARTED.md#high-level-apis-for-testing-images 。将代码写入py文件,并存放到mmdetection文件夹目录下,然后运行。但是运行官方代码的前提是你已经下载了相关模型的checkpoint的pth文件,并放在mmdetection文件夹目录下的checkpoints文件夹下。官方提供的所有训练好的pth模型文件下载地址都在MODEL_ZOO.md中。另外随便照一张图片重命名为test.jpg放到mmdetection目录下就可以了。
相信大家用这个mmdetection都不只是为了尝尝鲜试一下的吧,所以这里分享下我训练自定义的数据集的过程记录。
先给大家看一下我的整个mmdetection文件夹的内容。
需要说明的是官方提供的所有代码都默认使用的是coco格式的数据集,所以不想太折腾的话就把自己的数据集转化成coco数据集格式吧。各种类型数据转coco格式脚本见:转换工具箱 。我使用的是其中的labelme2coco.py文件,亲测没有问题。
制作好数据集之后,官方推荐coco数据集按照以下的目录形式存储:
mmdetection
├── mmdet
├── tools
├── configs
├── data
│ ├── coco
│ │ ├── annotations
│ │ ├── train2017
│ │ ├── val2017
│ │ ├── test2017
推荐以软连接的方式创建data文件夹,下面是创建软连接的步骤
cd mmdetection
mkdir data
ln -s $COCO_ROOT data
其中,$COCO_ROOT需改为你的coco数据集根目录
首先说明的是我的数据集类别一共有4个,分别是:‘Glass_Insulator’, ‘Composite_Insulator’, ‘Clamp’, ‘Drainage_Plate’。且我跑的模型是’configs/faster_rcnn_r50_fpn_1x.py’。
官方提供的代码中都使用的是coco数据集,虽然我们自定义的数据集也已经转换成coco标准格式了,但是像class_name和class_num这些参数是需要修改的,不然跑出来的模型就不会是你想要的。
一些博客例如这个,所提供的方法是按照官方给的定义coco数据集的相关文件,新建文件重新定义自己的数据集和类等,但是其实这是有风险的,我之前按照他们的方法走到最后发现会出现错误,所以最简单便捷且保险的方法是直接修改coco数据集定义文件(官方也是这样建议的)。
1、定义数据种类,需要修改的地方在mmdetection/mmdet/datasets/coco.py。把CLASSES的那个tuple改为自己数据集对应的种类tuple即可。例如:
CLASSES = ('Glass_Insulator', 'Composite_Insulator', 'Clamp', 'Drainage_Plate')
2、接着在mmdetection/mmdet/core/evaluation/class_names.py修改coco_classes数据集类别,这个关系到后面test的时候结果图中显示的类别名称。例如:
def coco_classes():
return [
'Glass_Insulator', 'Composite_Insulator', 'Clamp', 'Drainage_Plate'
]
3、修改configs/faster_rcnn_r50_fpn_1x.py中的model字典中的num_classes、data字典中的img_scale和optimizer中的lr(学习率)。例如:
num_classes=5,#类别数+1
img_scale=(640,478), #输入图像尺寸的最大边与最小边(train、val、test这三处都要修改)
optimizer = dict(type='SGD', lr=0.0025, momentum=0.9, weight_decay=0.0001) #当gpu数量为8时,lr=0.02;当gpu数量为4时,lr=0.01;我只要一个gpu,所以设置lr=0.0025
4、在mmdetection的目录下新建work_dirs文件夹
python tools/train.py configs/faster_rcnn_r50_fpn_1x.py --gpus 1 --validate --work_dir work_dirs
展示下开始训练的界面:
训练完之后work_dirs文件夹中会保存下训练过程中的log日志文件、每个epoch的pth文件(这个文件将会用于后面的test测试)
有两个方法可以进行测试。
1、如果只是想看一下效果而不要进行定量指标分析的话,可以运行之前那个demo.py文件,但是要改一下checkpoint_file的地址路径,使用我们上一步跑出来的work_dirs下的pth文件。例如:
checkpoint_file = 'work_dirs/epoch_100.pth'
2、使用test命令。例如:
python tools/test.py configs/faster_rcnn_r50_fpn_1x.py work_dirs/epoch_100.pth --out ./result/result_100.pkl --eval bbox --show
但是使用这个测试命令的时候会报错,报错的情况我也在官方库的issue上提交了,可以查看我的error描述,看看与你的是否一致。
根据我的问题描述可以知道使用demo.py来测试是可以出结果的,但是会出现”warnings.warn('Class names are not saved in the checkpoint’s ’ "的警告信息。使用这一步的test命令的时候会报错,程序中断,但是其实问题是一致的,应该是训练中保存下来的pth文件中没有CLASSES信息,所以show不了图片结果。因此需要按照下面的步骤修改下官方代码才可以。
(1) 修改mmdetection/mmdet/tools/test.py中的第29行为:
if show:
model.module.show_result(data, result, dataset.img_norm_cfg, dataset='coco')
最后展示效果如下:
此处的格式化输出称为检测评价矩阵(detection evaluation metrics)。此处摘录COCO数据集文档中对该评价矩阵的简要说明:
Average Precision (AP):
AP % AP at IoU=.50:.05:.95 (primary challenge metric)
APIoU=.50 % AP at IoU=.50 (PASCAL VOC metric)
APIoU=.75 % AP at IoU=.75 (strict metric)
AP Across Scales:
APsmall % AP for small objects: area < 322
APmedium % AP for medium objects: 322 < area < 962
APlarge % AP for large objects: area > 962
Average Recall (AR):
ARmax=1 % AR given 1 detection per image
ARmax=10 % AR given 10 detections per image
ARmax=100 % AR given 100 detections per image
AR Across Scales:
ARsmall % AR for small objects: area < 322
ARmedium % AR for medium objects: 322 < area < 962
ARlarge % AR for large objects: area > 962
如果大家按照我的步骤走下来出现什么问题的话欢迎在评论去留言,不知道我有没记录漏了哪个步骤!
log_config = dict(
interval=10, # 每10个batch输出一次信息
hooks=[
dict(type='TextLoggerHook'), # 控制台输出信息的风格
dict(type='TensorboardLoggerHook') # 需要安装tensorflow and tensorboard才可以使用
])
为了更好地理解mmdetection,现在好的资料还比较少,但还是有的,下面给大家推荐一些可能会对你有帮助的。