https://github.com/open-mmlab/mmdetection
根据官网配置好mmdetection所需环境,我用的pytorch1.4.0,cuda10,按照官方文档要求配置就可以https://github.com/open-mmlab/mmdetection/blob/master/docs/install.md
主要介绍如何将VIA标注的数据集转换成HTC需要的格式,在VIAhttp://www.robots.ox.ac.uk/~vgg/software/via/via-1.0.6.html
上使用多边形标注将自己的数据集标注好,我的数据集TRAIN-2477张图片,VAL-788张图片,对应json文件分别为train_end.json和val_end.json
一,将via标注的数据集转换为常用的coco格式,转换工具https://download.csdn.net/download/qq_37754309/12710210
二,转换为常用coco格式的json文件后还需要生成htc需要的stuffthingmaps文件夹下面的图片
1,进入https://github.com/nightrome/cocostuffapi下载后将PythonAPI/pycocotools/cocostuffhelper.py中第140行到150行改为
# Create label map
#labelMap = cocoSegmentationToSegmentationMap(coco, imgId, includeCrowd=includeCrowd)
labelMap = cocoSegmentationToSegmentationMap(coco, imgId, checkUniquePixelLabel=False, includeCrowd=includeCrowd)
labelMap = labelMap.astype(np.int8)
labelMap = labelMap + 91
# Get color map and convert to PIL's format
cmap = getCMap()
cmap = (cmap * 255).astype(int)
padding = np.zeros((256-cmap.shape[0], 3), np.int8)
cmap = np.vstack((cmap, padding))
cmap = cmap.reshape((-1))
cmap = np.uint8(cmap).tolist()
assert len(cmap) == 768, 'Error: Color map must have exactly 256*3 elements!'
2,将PythonAPI/cocostuff/cocoSegmentationToPngDemo.py复制到PythonAPI下,即PythonAPI/cocoSegmentationToPngDemo.py
将PythonAPI/cocoSegmentationToPngDemo.py中第75行到88行注释掉并将annPath设置为我们在第一步中转换好的json文件
def cocoSegmentationToPngDemo(dataDir='coco/', dataTypeAnn='train2017', dataTypeRes='examples', \
pngFolderName='export_png', isAnnotation=True, exportImageLimit=2477):
# Define paths
annPath = '/home/fst/work/dataset/instances_train2017.json'
if isAnnotation:
pngFolder = '%s/annotations/%s' % (dataDir, pngFolderName)
根据上图路径生成的图片放在PythonAPI/coco/annotations/export_png文件夹下面,但此图片是彩色的,而stuffthingmaps中所需要的图片为灰度图,使用opencv对export_png下的图片进行灰度化,生成stuffthingmaps下的train2017和val2017文件夹下的图片
mmdetection
├── mmdet
├── tools
├── configs
├── data
│ ├── coco
│ │ ├── annotations
│ │ │ ├── instances_train2017.json(第一步中转换出的coco格式的json文件)
│ │ │ ├── instances_val2017.json(第一步中转换出的coco格式的json文件)
│ │ ├── train2017(原图)
│ │ ├── val2017(原图)
| | ├── stuffthingmaps
│ │ │ ├── train2017(第二步灰度化后的图片)
│ │ │ ├── val2017(第二步灰度化后的图片)
准备好数据集以后就可以开始训练了
sudo python3 train.py /mmdetection-master/configs/htc/htc_x101_32x4d_fpn_16x1_20e_coco.py
我的htc_x101_32x4d_fpn_16x1_20e_coco.py配置如下
_base_ = './htc_r50_fpn_1x_coco.py'
model = dict(
pretrained='open-mmlab://resnext101_32x4d',
backbone=dict(
type='ResNeXt',
depth=101,
groups=32,
base_width=4,
num_stages=4,
out_indices=(0, 1, 2, 3),
frozen_stages=1,
norm_cfg=dict(type='BN', requires_grad=True),
norm_eval=True,
style='pytorch'))
data = dict(samples_per_gpu=2, workers_per_gpu=1)
optimizer = dict(type='SGD', lr=0.001, momentum=0.9, weight_decay=0.0001)
optimizer_config = dict(grad_clip=dict(max_norm=5, norm_type=2))
# learning policy
lr_config = dict(step=[16, 19])
total_epochs = 20
等待它训练完就可以进行测试啦。
如果想要对训练过程进行可视化,只需在配置文件中加入如下代码即可,使用tensorboard进行可视化
log_config = dict(
interval=50,
hooks=[
dict(type='TextLoggerHook'),
dict(type='TensorboardLoggerHook')
])
如果训练意外中断,需要继续训练时,可使用以下语句
python3 tools/train.py configs下的配置文件 --resume-from work_dirs下之前训练好的模型
测试代码
import os
import cv2
from mmdet.apis import init_detector, inference_detector, show_result_pyplot
import mmcv
import time
config_file = '/mmdetection-master/work_dirs/htc_x101_32x4d_fpn_16x1_20e_coco0810/htc_x101_32x4d_fpn_16x1_20e_coco.py'##训练后生成的配置文件
checkpoint_file = '/mmdetection-master/work_dirs/htc_x101_32x4d_fpn_16x1_20e_coco0810/epoch_20.pth'#训练后生成的模型文件
# build the model from a config file and a checkpoint file
model = init_detector(config_file, checkpoint_file, device='cuda:0')
img_path = '/test/0813/'#测试图片路径
for filename in os.listdir(img_path):
img = os.path.join(img_path, filename)
result = inference_detector(model, img)
img = model.show_result(img, result, score_thr=0.6, show=False)
# visualize the results in a new window
cv2.imwrite('/test_result/0813/'+filename, img)