2: Train with customized datasets訓(xùn)練自定義數(shù)據(jù)集
In this note, you will know how to inference, test, and train predefined models with customized datasets.
在這個(gè)本章中,你將知道如何用自己的數(shù)據(jù)集訓(xùn)練、測(cè)試和預(yù)訓(xùn)練模型
We use the balloon dataset as an example to describe the whole process.
我們使用balloon dataset作為例子來(lái)描述這整個(gè)過(guò)程
The basic steps are as below:
基本步驟如下:
Prepare the customized dataset準(zhǔn)備自定義的數(shù)據(jù)集
Prepare a config準(zhǔn)備config文件
Train, test, inference models on the customized dataset.訓(xùn)練贡歧、測(cè)試、推斷在自定義的數(shù)據(jù)集上
Prepare the customized dataset準(zhǔn)備自己的數(shù)據(jù)集
There are three ways to support a new dataset in MMDetection:
reorganize the dataset into COCO format.將數(shù)據(jù)集重新組織成coco格式
reorganize the dataset into a middle format.將數(shù)據(jù)集重新組織成中間的格式
implement a new dataset.實(shí)現(xiàn)一個(gè)新的數(shù)據(jù)集
Usually we recommend to use the first two methods which are usually easier than the third.
In this note, we give an example for converting the data into COCO format.
通常我們建議使用前兩種方法角溃,這兩種方法通常比第三種方法簡(jiǎn)單。
在本文中篮撑,我們給出了一個(gè)將數(shù)據(jù)轉(zhuǎn)換為coco格式的示例开镣。
Note: MMDetection only supports evaluating mask AP of dataset in COCO format for now. So for instance segmentation task users should convert the data into coco format.
注意:MMDetection目前只支持對(duì)COCO格式數(shù)據(jù)集的mask AP進(jìn)行評(píng)估。
因此咽扇,例如分割任務(wù)邪财,用戶(hù)應(yīng)該將數(shù)據(jù)轉(zhuǎn)換為coco格式陕壹。
COCO annotation format coco標(biāo)注形式
The necessary keys of COCO format for instance segmentation is as below, for the complete details, please refer here.以下是實(shí)例分割所需的COCO格式,完整的細(xì)節(jié)請(qǐng)參考
>{
"images": [image],
"annotations": [annotation],
"categories": [category]
}
image = {
"id": int,
"width": int,
"height": int,
"file_name": str,
}
annotation = {
"id": int,
"image_id": int,
"category_id": int,
"segmentation": RLE or [polygon],
"area": float,
"bbox": [x,y,width,height],
"iscrowd": 0 or 1,
}
categories = [{
"id": int,
"name": str,
"supercategory": str,
}]
Assume we use the balloon dataset.
假設(shè)我們使用balloon數(shù)據(jù)集
After downloading the data, we need to implement a function to convert the annotation format into the COCO format. Then we can use implemented COCODataset to load the data and perform training and evaluation.
下載數(shù)據(jù)之后树埠,我們需要實(shí)現(xiàn)一個(gè)函數(shù)來(lái)將annotation格式轉(zhuǎn)換為COCO格式糠馆。然后我們可以使用實(shí)現(xiàn)的COCODataset加載數(shù)據(jù),并執(zhí)行訓(xùn)練和評(píng)估怎憋。
If you take a look at the dataset, you will find the dataset format is as below:
如果你看一下數(shù)據(jù)集又碌,你會(huì)發(fā)現(xiàn)數(shù)據(jù)集的格式如下:
>{'base64_img_data': '',
'file_attributes': {},
'filename': '34020010494_e5cb88e1c4_k.jpg',
'fileref': '',
'regions': {'0': {'region_attributes': {},
'shape_attributes': {'all_points_x': [1020,
1000,
994,
1003,
1023,
1050,
1089,
1134,
1190,
1265,
1321,
1361,
1403,
1428,
1442,
1445,
1441,
1427,
1400,
1361,
1316,
1269,
1228,
1198,
1207,
1210,
1190,
1177,
1172,
1174,
1170,
1153,
1127,
1104,
1061,
1032,
1020],
'all_points_y': [963,
899,
841,
787,
738,
700,
663,
638,
621,
619,
643,
672,
720,
765,
800,
860,
896,
942,
990,
1035,
1079,
1112,
1129,
1134,
1144,
1153,
1166,
1166,
1150,
1136,
1129,
1122,
1112,
1084,
1037,
989,
963],
'name': 'polygon'}}},
'size': 1115004}
The annotation is a JSON file where each key indicates an image's all annotations. The code to convert the balloon dataset into coco format is as below.
annotation是一個(gè)JSON文件,其中每個(gè)鍵都表示圖像的所有annotation绊袋。
將 balloon 數(shù)據(jù)集轉(zhuǎn)換為coco格式的代碼如下所示毕匀。
>import os.path as osp
def convert_balloon_to_coco(ann_file, out_file, image_prefix):
data_infos = mmcv.load(ann_file)
annotations = []
images = []
obj_count = 0
for idx, v in enumerate(mmcv.track_iter_progress(data_infos.values())):
filename = v['filename']
img_path = osp.join(image_prefix, filename)
height, width = mmcv.imread(img_path).shape[:2]
images.append(dict(
id=idx,
file_name=filename,
height=height,
width=width))
bboxes = []
labels = []
masks = []
for _, obj in v['regions'].items():
assert not obj['region_attributes']
obj = obj['shape_attributes']
px = obj['all_points_x']
py = obj['all_points_y']
poly = [(x + 0.5, y + 0.5) for x, y in zip(px, py)]
poly = [p for x in poly for p in x]
x_min, y_min, x_max, y_max = (
min(px), min(py), max(px), max(py))
data_anno = dict(
image_id=idx,
id=obj_count,
category_id=0,
bbox=[x_min, y_min, x_max - x_min, y_max - y_min],
area=(x_max - x_min) * (y_max - y_min),
segmentation=[poly],
iscrowd=0)
annotations.append(data_anno)
obj_count += 1
coco_format_json = dict(
images=images,
annotations=annotations,
categories=[{'id':0, 'name': 'balloon'}])
mmcv.dump(coco_format_json, out_file)
Using the function above, users can successfully convert the annotation file into json format, then we can use CocoDataset
to train and evaluate the model.
通過(guò)上面的函數(shù),用戶(hù)可以成功地將annotation文件轉(zhuǎn)換成json格式癌别,然后我們可以使用‘CocoDataset’對(duì)模型進(jìn)行訓(xùn)練和評(píng)估皂岔。
Prepare a config 準(zhǔn)備一個(gè)config
The second step is to prepare a config thus the dataset could be successfully loaded. Assume that we want to use Mask R-CNN with FPN, the config to train the detector on balloon dataset is as below. Assume the config is under directory configs/balloon/
and named as mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_balloon.py
, the config is as below.
第二步是準(zhǔn)備一個(gè)config,這樣數(shù)據(jù)集就可以成功加載展姐。假設(shè)我們想使用帶有FPN的Mask R-CNN躁垛,在balloon數(shù)據(jù)集上訓(xùn)練detector的配置如下。假設(shè)配置在' configs/balloon/ '目錄下圾笨,命名為' mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_balloon.py '教馆,配置如下所示。
># The new config inherits a base config to highlight the necessary modification
_base_ = 'mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py'
# We also need to change the num_classes in head to match the dataset's annotation
model = dict(
roi_head=dict(
bbox_head=dict(num_classes=1),#這里的num_classes需要根據(jù)你的自定義數(shù)據(jù)集類(lèi)別來(lái)更改
mask_head=dict(num_classes=1)))
# Modify dataset related settings
dataset_type = 'COCODataset'#更改成你自定義的數(shù)據(jù)集的路徑
classes = ('balloon',)
data = dict(
train=dict(
img_prefix='balloon/train/',
classes=classes,
ann_file='balloon/train/annotation_coco.json'),
val=dict(
img_prefix='balloon/val/',
classes=classes,
ann_file='balloon/val/annotation_coco.json'),
test=dict(
img_prefix='balloon/val/',
classes=classes,
ann_file='balloon/val/annotation_coco.json'))
# We can use the pre-trained Mask RCNN model to obtain higher performance
load_from = 'checkpoints/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth'
#選擇一個(gè)已經(jīng)訓(xùn)練好的模型來(lái)訓(xùn)練你自定義的數(shù)據(jù)集
Train a new model 訓(xùn)練一個(gè)新的模型
To train a model with the new config, you can simply run要用新的config訓(xùn)練模型擂达,您可以簡(jiǎn)單地運(yùn)行
>python tools/train.py configs/balloon/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_balloon.py
For more detailed usages, please refer to the Case 1.
Test and inference測(cè)試和推理
To test the trained model, you can simply run要測(cè)試訓(xùn)練過(guò)的模型土铺,您可以簡(jiǎn)單地運(yùn)行
>python tools/test.py configs/balloon/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_balloon.py work_dirs/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_balloon.py/latest.pth --eval bbox segm
For more detailed usages, please refer to the Case 1.