前面的文章介绍了在Detic中基于COCO数据集实现OVD检测的操作方法,但是要在其他数据集上迁移,还是要了解COCO数据集是如何被利用的,这里针对数据集的属性进行说明。
COCO数据集的标签形式做过目标检测的应该都很熟悉,图像名称、宽高、标签框、分割边界点、类别名等属性,那在OVD检测中,哪些属性信息是被利用的?哪些属性还要进一步拓展?根据Detic中的数据集内容的特点来进行相应说明。
1、必需的标签属性:
A. 基础检测属性:
# 1. 边界框信息
bbox = {"x": float, # 左上角x坐标"y": float, # 左上角y坐标"width": float, # 宽度"height": float # 高度
}# 2. 类别信息
category = {"id": int, # 类别ID"name": str # 类别名称
}# 3. 图像信息
image = {"id": int, # 图像ID"file_name": str, # 图像文件名"height": int, # 图像高度"width": int # 图像宽度
}# 4. 分割掩码
segmentation = {"polygon": [[x1,y1,x2,y2,...]], # 多边形点集"counts": str # RLE编码
}
这个标签属性好整,下载的COCO标签文件直接就有,自己制作采用常规的标注软件就可获取,或者公开数据集进行标签格式转换
2、 OVD特有的标签属性:
A. 类别划分信息:
# 1. 类别划分
category_split = {"split": str, # 'seen' 或 'unseen'"embedding": {"GloVE": array, # GloVe词向量"BertEmb": array # BERT词向量}
}# 2. 类别映射
category_mapping = {"synset": str, # WordNet同义词集"coco_cat_id": int # COCO类别ID
}
这个类别划分信息在标签文件里出现,如 instances_val2017_unseen_2.json,好像是有的配置文件会用到的标签,不是都会用到
主要是如下形式:
{"categories": [{"id": int,"name": str,"synset": str,"split": str, # category_split"embedding": {"GloVE": array,"BertEmb": array}}],"images": [...],"annotations": [...]
}
为什么要用到GloVE和BertEmb,查找信息表示,代码会把这两种特征进行融合用于类别名称的表示,GloVe提供基础语义,BERT提供上下文信息,同时表示类别,便于和其他类别名称建立关联,比如输入哈士奇,可以推理检测目标是狗,这个应该是可以自己根据类别名称用文本编码器处理生成的。
# 1. 准确率提升
- 常见类别: GloVe优势
- 复杂类别: BERT优势
- 整体性能: 互补提升# 2. 鲁棒性提升
- 处理一词多义
- 适应不同场景
- 提高泛化能力
category_mapping没有直接出现在标签文件,
B. 文本描述信息:
{"images": [{"id": int, # 图像ID"file_name": str, # 图像文件名"height": int, # 图像高度"width": int, # 图像宽度"captions": [str], # 图像描述文本列表"pos_category_ids": [int] # 图像中出现的类别ID列表}],"categories": [...] # 类别信息
}
这是coco_caption_train_tags数据集的标签内容形式 "coco_caption_train_tags": ("coco/train2017/", "coco/annotations/captions_train2017_tags_allcaps.json"),}
captions是对应图像的描述,pos_category_ids是通过分析图像描述或标注信息生成的,数字表示具体的类别ID,对应数据集中的类别
3、不需要的标签属性
# 1. 图像元数据
image_metadata = {"license": int, # 许可证信息"url": str, # 图像URL"date_captured": str # 拍摄日期
}# 2. 标注元数据
annotation_metadata = {"id": int, # 标注ID"area": float, # 区域面积"iscrowd": int # 是否人群
}