目标类别,材料类别的区别
stuff 91类包括了 object80类 如果仅仅做目标检测,基本只用object80 ,如果做图像分割(Mask R-cnn)的任务用stuff91类的 其中stuff91比object80 多出来的11类 是帽子,鞋,眼镜(太多的例子) 镜子,窗户,门,路标(含糊不清 难以标注)盘子 桌子(容易与碗和餐桌进行混淆),还有搅拌机,发刷(太少的例子) 一般是指没有明确边界的对象.
与PASCAL VOC进行对比
MS COCO 包含了 PASCAL VOC 的所有类别 并且每种类别所标注的目标个数都比PASCAL VOC 多,比较建议在MS COCO数据集上进行一个预训练,之后再基于迁移学习的办法再PASCAL VOC上进行一个再训练或者建议在MS COCO数据集上训练好的权重迁移到自己的模型上
如果仅仅针对于 目标检测 object80而言 会有一些空图.坏图,没有标注信息或者标注信息是错误的
要筛选出有问题的图片
从python中读取图片,
import json
json_path = "./instance_val2017.json"
json_lables = json.load(open(json_path,'r'))
# json_lables 是一个字典格式 其中有一个key annotations
# 他存储每个对象的信息,当然一个图片有若干个对象
# 其属性 bbox 对应的信息 左上角 x的位置 y的位置 一起宽度 和 高度
# 他们的类别索引都是针对于 stuff91的类别 当我们目标检测用的是object80的类别 需要映射一下
# 1-91~1-80
使用pycocotools 读取我们的标注文件
对于每个图片,先拿到里面有多少个对象,对每个对象,挨个读取标注文件,知道每个对象的位置(xml文件size节点),最后画出矩形框即可
import os
from pycocotools.coco import COCO
from PIL import Image, ImageDraw
import matplotlib.pyplot as plt
json_path = "../annotations_trainval2017/annotations/instances_val2017.json"
img_path = "../val2017/"
# os.path.exists(json_path) os.getcwd()
# load coco data
coco = COCO(annotation_file=json_path)
# get all image index info
# ids是图片的序号 coco.img.keys() 返回所有图片的索引
ids = list(sorted(coco.imgs.keys()))
print("number of images: {}".format(len(ids)))
# get all coco class labels
# for id, name in coco.cats.items():
# coco_classes = dict(name["id"], name["name"])
# coco.cats : 每一项 1 : {'supercategory': 'person', 'id': 1, 'name': 'person'}
coco_classes = dict([(v["id"], v["name"]) for k, v in coco.cats.items()])
# 遍历前三张图像
for img_id in ids[:3]:
# 获取对应图像id的所有annotations idx信息 获取目标索引
ann_ids = coco.getAnnIds(imgIds=img_id)
# 根据annotations idx信息获取所有标注信息
targets = coco.loadAnns(ann_ids)
# get image file name
# coco.loadImgs(img_id) 返回字典对象的列表
path = coco.loadImgs(img_id)[0]['file_name']
# read image
img = Image.open(os.path.join(img_path, path)).convert('RGB')
draw = ImageDraw.Draw(img)
# draw box to image
for target in targets:
x, y, w, h = target["bbox"]
x1, y1, x2, y2 = x, y, int(x + w), int(y + h)
# 把左上点 和右下点 标注好
draw.rectangle((x1, y1, x2, y2))
# 在左上角标注好类别
draw.text((x1, y1), coco_classes[target["category_id"]], fill='red')
# show image
plt.imshow(img)
plt.show()