前言
前言以及为什么写这篇的原因:
国庆的时间在网络上查找如何使用Detectron2注册数据集,并使用了2位博主的相关代码,除了官方文档https://detectron2.readthedocs.io/以外,再次非常感谢2位博主的文章https://blog.csdn.net/qq_29750461,以及https://blog.csdn.net/weixin_39916966对我的帮助和启发。
但目前我所看到的大家写的方法都是直接在tools/train_net.py
上直接添加相应的函数并且配置cfg的参数(这一部分可以在yaml中配置,更耦合)。
因此我想的是如何直接在Detectron2框架中的对应的python文件中修改对应部分的代码,使得train_net.py上不是那么冗余
,使得添加的代码更加规范,更利于重构,并且进行下一步的修改会更加简单,这便是我写这篇博客的目的
~
学会注册数据集之前应该至少会点什么:
1. 制作好自己的数据集,如annatation的coco-json格式或者voc-xml格式,以及train和val的图片数量与路径等。(如果使用标准的数据集忽略这一步)
2. 安装好Detectron2或AdelaiDet,至少熟悉了Detectron2或AdelaiDet的INSTALL.md和GETTING_STARTED.md。AdelaiDet在安装的时候有一个小坑,具体可以看下另一篇文章AdelaiDet安装教程。(截至2020.1130)
3. 配置好数据集,查阅github上的datasets/readme.md,如何Use Builtin Datasets。
AdelaiDet
# AdelaiDet需要以下命令:
git clone https://github.com/facebookresearch/detectron2.git
cd detectron2
git checkout -f 9eb4831 # 官方提示
cd ..
python -m pip install -e detectron2
git clone https://github.com/aim-uofa/AdelaiDet.git
cd AdelaiDet
python setup.py build develop
AdelaiDet是什么? AdelaiDet可以算是Detectron2的一个扩展包,基本和Detectron2类似。由于Detectron2中做detection的只有faster-rcnn的anchor-based模型,而AdelaiDet中含有了FCOS等比较新的anchor-free模型,AdelaiDet中的FCOS是采用coco format,因此我需要将训练的pascalraw数据集从voc format 转化成 coco format。并且raw数据集只有3个class。
另外要特别说明的是,根据buildin.py文件中的COCO_CATEGORIES文件中的列表中展示的。 id都是从1开始的。因此在自己制作json文件时候,也要检查json中的catagories_id是不是从1开始的。
1.如何注册数据集
借用之前博主的言语,只要熟悉了这几个函数,基本就能够明白注册的流程了。
data/datasets/builtin.py/register_all_coco(root="datasets")
data/datasets/builtin_meta.py/_get_builtin_metadata(dataset_name)
data/datasets/builtin_meta.py/_get_coco_instances_meta()
data/datasets/register_coco.py/register_coco_instances(name, metadata, json_file, image_root)
#上面4个都和register dataset息息相关,一定要掌握上面4个函数
data/datasets/coco.py/load_coco_json(json_file, image_root, dataset_name=None, extra_annotation_keys=None)
首先还是要把训练集按照文档的要求放置。
详细的操作请看Detectron2的datasets目录下的readme.md
#COCO-format
coco/
annotations/
instances_{
train,val}2017.json
person_keypoints_{
train,val}2017.json
{
train,val}2017/
# image files that are mentioned in the corresponding json
#VOC-format
VOC20{
07,12}/
Annotations/
ImageSets/
Main/
trainval.txt
test.txt
# train.txt or val.txt, if you use these splits
JPEGImages/
1.1 detectron2/detectron2/data/datasets/builtin.py
1.1.1 字典_PREDEFINED_SPLITS_COCO
_PREDEFINED_SPLITS_COCO字典中,添加你的your_dataset_name : (image/root, json_file)
_PREDEFINED_SPLITS_COCO = {
}
_PREDEFINED_SPLITS_COCO["coco"] = {
"coco_2014_train": ("coco/train2014", "coco/annotations/instances_train2014.json"),
"coco_2014_val": ("coco/val2014", "coco/annotations/instances_val2014.json"),
"coco_2014_minival": ("coco/val2014", "coco/annotations/instances_minival2014.json"),
"coco_2014_minival_100": ("coco/val2014", "coco/annotations/instances_minival2014_100.json"),
"coco_2014_valminusminival": (
"coco/val2014",
"coco/annotations/instances_valminusminival2014.json",
),
"coco_2017_train": ("coco/train2017", "coco/annotations/instances_train2017.json"),
"coco_2017_val": ("coco/val2017", "coco/annotations/instances_val2017.json"),
"coco_2017_test": ("coco/test2017", "coco/annotations/image_info_test2017.json"),
"coco_2017_test-dev": ("coco/test2017"