Detectron2流程
数据集
1.数据格式
通常使用Labelme进行数据标注;
然后使用官网自带的脚本转化为coco格式
训练部分
1.注册数据集
在detectron2\detectron2\data\datasets中的builtin.py注册新的数据
把下方代码,放在第一张图代码的上方即可。
# # 新增注册
import cv2
from detectron2.data.datasets import load_coco_json
# from detectron2.utils.visualizer import Visualizer
# 声明类别,尽量保持
CLASS_NAMES =["1"]
# 数据集路径
DATASET_ROOT = 'D:\Multi_Data\JY'
ANN_ROOT = os.path.join(DATASET_ROOT, 'COCOformat')
TRAIN_PATH = os.path.join(DATASET_ROOT, 'train_JPEGImages')
VAL_PATH = os.path.join(DATASET_ROOT, 'val_JPEGImages')
TRAIN_JSON = os.path.join(ANN_ROOT, 'train.json')
#VAL_JSON = os.path.join(ANN_ROOT, 'val.json')
VAL_JSON = os.path.join(ANN_ROOT, 'val.json')
# 声明数据集的子集
PREDEFINED_SPLITS_DATASET = {
"coco_my_train": (TRAIN_PATH, TRAIN_JSON),
"coco_my_val": (VAL_PATH, VAL_JSON),
}
#注册数据集(这一步就是将自定义数据集注册进Detectron2)
def register_dataset():
"""
purpose: register all splits of dataset with PREDEFINED_SPLITS_DATASET
"""
for key, (image_root, json_file) in PREDEFINED_SPLITS_DATASET.items():
register_dataset_instances(name=key,
json_file=json_file,
image_root=image_root)
#注册数据集实例,加载数据集中的对象实例
def register_dataset_instances(name, json_file, image_root):
"""
purpose: register dataset to DatasetCatalog,
register metadata to MetadataCatalog and set attribute
"""
DatasetCatalog.register(name, lambda: load_coco_json(json_file, image_root, name))
MetadataCatalog.get(name).set(json_file=json_file,
image_root=image_root,
evaluator_type="coco")
# 注册数据集和元数据
def plain_register_dataset():
#训练集
DatasetCatalog.register("coco_my_train", lambda: load_coco_json(TRAIN_JSON, TRAIN_PATH))
MetadataCatalog.get("coco_my_train").set(thing_classes=CLASS_NAMES, # 可以选择开启,但是不能显示中文,这里需要注意,中文的话最好关闭
evaluator_type='coco', # 指定评估方式
json_file=TRAIN_JSON,
image_root=TRAIN_PATH)
#DatasetCatalog.register("coco_my_val", lambda: load_coco_json(VAL_JSON, VAL_PATH, "coco_2017_val"))
#验证/测试集
DatasetCatalog.register("coco_my_val", lambda: load_coco_json(VAL_JSON, VAL_PATH))
MetadataCatalog.get("coco_my_val").set(thing_classes=CLASS_NAMES, # 可以选择开启,但是不能显示中文,这里需要注意,中文的话最好关闭
evaluator_type='coco', # 指定评估方式
json_file=VAL_JSON,
image_root=VAL_PATH)
2.训练
训练tools\trian_net.py,把下面模块进行完全修改,直接复制就好,修改完以后输入 cd tools/train_net.py --num-gpus 8 --config-file …/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml
注意(–config-file其实不用写,在下方设置也可以)
setup是为了修改 config-file中的底层参数
参数根据自身需求自行修改!
def setup(args):
"""
Create configs and perform basic setups.
"""
cfg = get_cfg()
args.config_file = "../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"
cfg.merge_from_file(args.config_file) # 从config file 覆盖配置
cfg.merge_from_list(args.opts) # 从CLI参数 覆盖配置
# 更改配置参数
cfg.DATASETS.TRAIN = ("coco_my_train",) # 训练数据集名称
cfg.DATASETS.TEST = ("coco_my_val",)
cfg.DATALOADER.NUM_WORKERS = 4 # 单线程
cfg.INPUT.CROP.ENABLED = True
cfg.INPUT.MAX_SIZE_TRAIN = 850 # 训练图片输入的最大尺寸
cfg.INPUT.MAX_SIZE_TEST = 850 # 测试数据输入的最大尺寸
cfg.INPUT.MIN_SIZE_TRAIN = (150, 850) # 训练图片输入的最小尺寸,可以设定为多尺度训练
cfg.INPUT.MIN_SIZE_TEST = 640
#cfg.INPUT.MIN_SIZE_TRAIN_SAMPLING,其存在两种配置,分别为 choice 与 range :
# range 让图像的短边从 512-768随机选择
#choice : 把输入图像转化为指定的,有限的几种图片大小进行训练,即短边只能为 512或者768
cfg.INPUT.MIN_SIZE_TRAIN_SAMPLING = 'range'
cfg.MODEL.RETINANET.NUM_CLASSES = 1 # 类别数+1(因为有background)
#cfg.MODEL.WEIGHTS="/home/yourstorePath/.pth"
# cfg.MODEL.WEIGHTS = "/home/yourstorePath/model_final_5bd44e.pkl" # 预训练模型权重 第一次训练直接用.yaml文件中的模型预训练模型就行
cfg.SOLVER.IMS_PER_BATCH = 4 # batch_size=2; iters_in_one_epoch = dataset_imgs/batch_size
# 根据训练数据总数目以及batch_size,计算出每个epoch需要的迭代次数
#9000为你的训练数据的总数目,可自定义
ITERS_IN_ONE_EPOCH = int(220 / cfg.SOLVER.IMS_PER_BATCH)
# 指定最大迭代次数
cfg.SOLVER.MAX_ITER = (ITERS_IN_ONE_EPOCH * 50) - 1 # 50 epochs,
# 初始学习率
cfg.SOLVER.BASE_LR = 0.002
# 优化器动能
cfg.SOLVER.MOMENTUM = 0.9
#权重衰减
cfg.SOLVER.WEIGHT_DECAY = 0.0001
cfg.SOLVER.WEIGHT_DECAY_NORM = 0.0
# 学习率衰减倍数
cfg.SOLVER.GAMMA = 0.1
# 迭代到指定次数,学习率进行衰减
cfg.SOLVER.STEPS = (700,)
# 在训练之前,会做一个热身运动,学习率慢慢增加初始学习率
cfg.SOLVER.WARMUP_FACTOR = 1.0 / 1000
# 热身迭代次数
cfg.SOLVER.WARMUP_ITERS = 300
cfg.SOLVER.WARMUP_METHOD = "linear"
# 保存模型文件的命名数据减1
cfg.SOLVER.CHECKPOINT_PERIOD = ITERS_IN_ONE_EPOCH - 1
# 迭代到指定次数,进行一次评估
cfg.TEST.EVAL_PERIOD = ITERS_IN_ONE_EPOCH
#cfg.TEST.EVAL_PERIOD = 100
#cfg.merge_from_file(args.config_file)
#cfg.merge_from_list(args.opts)
cfg.freeze()
default_setup(cfg, args)
return cfg
3.验证
./train_net.py --config-file …/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml
–eval-only MODEL.WEIGHTS /path/to/checkpoint_file
官网给的验证,加入eval-only就行,没试过。
推理测试部分
1.在demo/demo.py进行几处修改
–config-file:训练好的config.yaml,此文件一般在output里
注意:此配置文件输入不对,会造成结果无法输出!
–input:单张图片或文件夹
–opts:训练好的权重
参数例子:
--config-file
..\tools\output\config.yaml
--input
D:\Multi_Data\JY\val_JPEGImages\JPEGImages\*.jpg
--output
kkk
--opts
MODEL.WEIGHTS
..\tools\output\model_final.pth
2.若想修改输出结果为二值化图可进行以下修改
在demo/predictor.py中
然后再demo.py中进行修改
3.原图与修改后的二值化图