项目入口:


facebookresearch/maskrcnn-benchmarkgithub.com


anaconda pytorch训练数据集 pytorch maskrcnn训练自己的数据集_mmdetection训练自己的数据


别人的经验:


黄钦建:MaskRCNN-Benchmark(Pytorch版本)训练自己的数据以及避坑指南zhuanlan.zhihu.com

anaconda pytorch训练数据集 pytorch maskrcnn训练自己的数据集_mmdetection训练自己的数据_02

Slumbers:使用pytorch mask-rcnn进行目标检测/分割训练zhuanlan.zhihu.com


anaconda pytorch训练数据集 pytorch maskrcnn训练自己的数据集_json_03


安装简易完全按照下面这个链接来,不建议在win10下使用,在ubantu16.04环境下无错安装

facebookresearch/maskrcnn-benchmarkgithub.com

anaconda pytorch训练数据集 pytorch maskrcnn训练自己的数据集_mmdetection训练自己的数据


训练的入口是:

maskrcnn-benchmarktoolstrain_net.py 如果只是简单的替换一下数据集,基本不需要修改什么东西

原生的这个项目支持VOC和COCO格式的数据,所以只要把自己的数据整理成这两个格式就可以接上这个项目需要的数据格式了

预训练的权重会存在~/.torch里,比如~/.torch/R-50 (前提是你已经训练过一次了,第一次训练会自动从网上下载)

使用自己数据训练:

mask rcnn benchmark支持两种格式 1. voc数据集形式(xml格式的标注) 2. coco数据集(json格式的标注)

COCO格式:

以下代码只适合我自己的数据标注方式,如果能直接标成coco json的格式就可以省去这一步

下面这些代码是用来把txt的标注形式转成coco json的格式,但是具体格式不一样,只能作为一个参考


#!/usr/bin/env python


VOC格式:

(VOC格式的好像不支持mask的训练,有待验证,要训练mask的话,还是转成coco格式吧)

1.在项目根目录下创建:/datasets/ 文件夹。你自己数据集就放在这个路径下面。

2.


anaconda pytorch训练数据集 pytorch maskrcnn训练自己的数据集_数据_05


Annotations里面放所有的标注文件,图片名称.xml(图片名称和JPEGImages是一一对应的)

ImageSets里面的Main文件夹下面放的是训练集,验证集和测试集的txt文件。分别存储了划到训练集,验证集和测试集的图片的名称。比如train.txt里面可能存了,如下的行。那么就代表了JPEGImages里的1.jpg 2. jpg.....会被项目拿去训练


1
2
3
4


3. 打开configs/xxxx.yaml,比如configse2e_mask_rcnn_R_50_FPN_1x.yaml。这个文件是训练和测试用到的配置文件。(有一点注意,就是configs/xxxx.yaml和maskrcnn-benchmarkmaskrcnn_benchmarkconfigdefaults.py的关系。如果在configs/xxxx.yaml中没有出现的参数配置信息,训练和测试的时候就会默认用defaults.py里的补全)

做如下修改:


MODEL


4. 打开maskrcnn-benchmarkmaskrcnn_benchmarkconfigpaths_catalog.py文件,做如下修改(目的是添加自己数据集的路径)


"voc_2012_train": {
            "data_dir": "voc/VOC2012",
            "split": "train"
        },
        "voc_2012_train_cocostyle": {
            "img_dir": "voc/VOC2012/JPEGImages",
            "ann_file": "voc/VOC2012/Annotations/pascal_train2012.json"
        },
        "voc_2012_val": {
            "data_dir": "voc/VOC2012",
            "split": "val"
        },
        "voc_2012_val_cocostyle": {
            "img_dir": "voc/VOC2012/JPEGImages",
            "ann_file": "voc/VOC2012/Annotations/pascal_val2012.json"
        },
        "voc_2012_test": {
            "data_dir": "voc/VOC2012",
            "split": "test"
            # PASCAL VOC2012 doesn't made the test annotations available, so there's no json annotation
        },

#######################
        'voc_我的数据集名称_train': {
            "data_dir": "我的数据集路径",
            "split": "train" #如果是test,那么就是"test"
            # PASCAL VOC2012 doesn't made the test annotations available, so there's no json annotation
        },
#######################


5. 训练


python tools/train_net.py --config-file "configs/e2e_mask_rcnn_R_50_FPN_1x.yaml" SOLVER.IMS_PER_BATCH 2 SOLVER.BASE_LR 0.0025 SOLVER.MAX_ITER 720000 SOLVER.STEPS "(480000, 640000)" TEST.IMS_PER_BATCH 1 MODEL.RPN.FPN_POST_NMS_TOP_N_TRAIN 2000


关于configs/xxxx.yaml文件的补充:

WEIGHT_DECAY代表的是对网络参数的惩罚,可以看做是正则。

STEPS: (60000, 80000) 代表的是学习率的两个变化点。整个项目学习率的变化是三个阶段:1. warm up:从 0升到一个固定的学习率(八卡:BASE_LR=0.02,单卡:0.0025)

2. 在60000下降一次

3. 在80000再下降一次。这两个数字可以调,依据总的iteration数量(比如原yaml文件里是MAX_ITER: 90000)

跑前向的时候如何选择刚训练好的模型呢?

首先,前向的代码可以参考/demo/predictor.py这个代码