此篇是初始篇
mmdetection是非常知名的目标检测的框架,他集成了很多知名的深度神经网络,简单来讲就是可以通过配置文件的配置来使用各种不同的网络。
不过使用起来是很方便,但是对于初学者来说,他把各种网络都封装起来了,就很难找到相应的实现代码,不太利于学习。
mmdetection的安装:
一般从github上下载下来就可以了,他有比较详细的install.md,写的还是比较详细的,以上的链接是目前最新的,我当时安装的版本是2.1的版本,安装的时候有一些环境的问题,在git上没有明说,还是要安装的时候看报错。不过这些方法也不是不可解的,在文件包中,也提供了一个Dockerfile,可以直接安装docker,不过这种类似的提供的Dockerfile的项目不少,但是能用其顺利安装的没多少,不是这有问题就是那有问题,而且往往会因为大家懂的原因,很多环境利用他的代码是装不上的。不过可以明确的是,docker的环境安装都是从空白系统中开始一步步安装的,所以完全可以参考这个dockerfile文件来安装。具体可以按照当前的文件来,只要执行RUN之后的语句就可以了,以下是当初2.1的版本的安装脚本,不同版本可以根据install.md来修改,比如目前最新版不再需要mmcv,而是mmcv-full,总之各种结合看看,不过个人觉得还是利用dockerfile还是会简单很多。
sudo apt-get update && apt-get install -y git ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6
sudo apt-get clean
sudo rm -rf /var/lib/apt/lists/*
pip install --upgrade cython mmcv==0.6.2 opencv-python==4.2.0.34 numpy==1.16.4 torch torchvision flask requests --no-cache-dir
pip install "git+https://github.com.cnpmjs.org/open-mmlab/cocoapi.git#subdirectory=pycocotools"
pip install --no-cache-dir -e .
其中,mmcv是当时mmdetection的指定版本,numpy可以用更高的版本,只不过似乎是用太高的版本似乎是对其他的项目有不兼容的情况,flask和requests是我的任务需要,可以不需要;--no-cache-dir是pip安装时避免生成缓存。
mmdetection的配置文件:
他的配置文件一般是放在文件夹中的configs,想具体使用什么网络,通过文件名就可知道。具体的说明在每个文件夹中有一个readme.md可以查看,比如1x,3x,20e等,这三个都指的是训练次数和学习率衰减的step设置,他们在模型设置上应该是一样的
以cascade_mask_rcnn_r50_fpn_1x_coco.py为例,其内容为
_base_ = [
'../_base_/models/cascade_mask_rcnn_r50_fpn.py',
'../_base_/datasets/coco_instance.py',
'../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py'
]
可见其主要是集成了一些基础文件,具体的介绍网上可以查的到,这里只是简要说明一下。
他的模型文件以字典的形式,每个字段中,type表示该字段会使用这个函数,函数需要先注册才能被识别到,在新增分支的时候需要用到,type下其他的字段都是该函数的参数,他就是利用这样的方式来利用配置文件来使用不同的网络的。至于其是如何实现的可以不用去查看,其调用还是很复杂的。
mmdetection的数据格式:
mmdetection有提供一些教程,不过其写的有一点简略。
这部分主要对教程该部分的简单的说明,有兴趣的,可以仔细看看这部分
https://mmdetection.readthedocs.io/en/latest/tutorials/new_dataset.html
mmdetection主要是支持coco和voc数据集格式,一般情况下,自己的数据集转成这两个格式就行了,不过这两个就是很麻烦嘛,所以mmdetection也提供了一个中间格式。具体的可以参考教程,只是教程写的很模糊,虽然没有什么用,但是还是简要提一下。
[
{
'filename': 'a.jpg',
'width': 1280,
'height': 720,
'ann': {
'bboxes': <np.ndarray, float32> (n, 4),
'labels': <np.ndarray, int64> (n, ),
'bboxes_ignore': <np.ndarray, float32> (k, 4),
'labels_ignore': <np.ndarray, int64> (k, ) (optional field)
}
},
...
]
这个中间格式,所有文件都放在一个列表中,其中每张图片是一个字典,基本字段基本上看名字就懂,主要是,ann字段中,bboxes,格式是numpy,size是n*4,n是具体有多个框,4是两个点的坐标,一般是左上角和右下角
labels就不用提了,都是一一对应的
我也加过masks字段,不过似乎有点问题。
按照教程的流程来说,后面说的是,自己的数据可以在代码中直接转换成这个格式,然后用CustomDataset来读取,或者是直接转成这个格式在使用CustomDataset来读取。
是的CustomDataset就是type。
其他的,教程中还提供了一些例子,不过那些例子说的都比较简单,感觉价值不大,后面我会再提,然后他还提了些数据集的联合之类的,不过后面自定义数据类型,自定义加载方式,这些都不太重要了,有需要也可以直接看源码。
非常麻烦的是,比如我的数据除了这些常用的字段外,还有其他的自己的数据,此时只能通过自己写的代码来加载读取了,具体就请看下文吧。