DEFRCN训练自己的数据集
这里写目录标题
问题描述
博主最近有一个数据集,想用来做个小样本检测写篇小论文,决定用DEFRCN做baseline,DEFRCN复现的博客见我的另一篇博客链接: DEFRCN代码复现记录。我想达到的效果就是使用coco数据集作为base类,而我自定义的数据集作为novel类(我的数据集7类)。记录一下实现的过程。
数据集准备
coco数据集制作
想要实现这个目标coco数据集比voc数据集要简单一点(我是这么觉得),所以要先把数据集转化为coco数据集,这个过程教程挺多,就不多赘述了。
合并数据集标注文件
要实现使用coco数据集作为base类,并在自定义数据集做微调,经过多次尝试,发现最方便的方法还是将自己的数据集与coco2014数据集进行合并。下面来讲讲合并的过程。
下面这是coco数据集合并json文件的脚本 combine.py
。
import json
json1_file = 'coco数据集原来的标注文件'
json2_file = '自己的coco数据集标注文件'
# 读取原始的COCO标注文件
with open(json1_file, 'r') as f:
coco_data = json.load(f)
# 读取您的标注文件
with open(json2_file, 'r') as f:
your_data = json.load(f)
# 将您的标注文件内容添加到原始的COCO标注文件中
coco_data['images'].extend(your_data['images'])
coco_data['annotations'].extend(your_data['annotations'])
coco_data['categories'].extend(your_data['categories'])
# 保存更新后的COCO标注文件
with open(json1_file, 'w') as f:
json.dump(coco_data, f)
使用上面的脚本分别合并自己的数据集以及coco数据集的val.json和val.json文件,DEFRCN源码中的还需要用到cocosplit,其中有两个json文件,分别是trainvalno5k.json和5k.json。cocosplit的说明看这链接: cocosplit。根据我的理解,trainvalno5k.json类似于训练集的分割,5k.json是验证集的分割。我们要做的操作就是将自己数据集的训练集的标注文件与trainvalno5k.json合并,并用自己的验证集替代5k.json。合并后需要使用脚本修改一下类别id,图片id以及标注框id等数据避免与coco数据集原有的数据集重复冲突。
生成自己的seeds
为了进行不同shots的小样本训练,需要使用脚本分割训练集。脚本源码在这链接: prepare_coco_few_shot.py。懒得看源码可以直接复制以下代码 prepare_coco_few_shot.py
。
import argparse
import json
import os
import random
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument(
"--seeds", type=int, nargs="+", default=[1, 10], help="Range of seeds"
)
args = parser.parse_args()
return args
def generate_seeds(args):
data_path = "datasets/cocosplit/datasplit/trainvalno5k.json"
data = json.load(open(data_path))
new_all_cats = []
for cat in data["categories"]:
new_all_cats.app