coco 格式是一种最常见的数据标记格式,
其整体文件夹组织结构为:
coco/
annotations/
instances_train2017.json
instances_val2017.json
images/
datau8ahdbg_1.jpg
...
asdh74ahafta_3.jpg
...
train2017/
val2017
.json文件中的主要字典格式为:
image{
"id": int,
"width": int,
"height": int,
"file_name": str,
"license": int,
"flickr_url": str,
"coco_url": str,
"date_captured": datetime,
}
annotation{
"id": int,
"image_id": int,
"category_id": int,
"segmentation": RLE or [polygon],
"area": float,
"bbox": [x,y,width,height],
"iscrowd": 0 or 1,
}
在具体使用时,主要利用以下代码来解析(仅针对目标检测任务来说)
首先需要安装好coco库:
pip install pycocotools
然后进行解析,获取图像文件以及其对应的bounding box值:
from pycocotools.coco import COCO
import numpy as np
import cv2
import os
source = 'D:/xx/val.json' #json文件的路径
folder = 'D:/img_all/' # 放图像的文件夹
coco = COCO(source)#实例化
records = coco.getImgIds() #获取所有图像的唯一id,结果是一个list格式
index = 5 #索引号,要小于len(records)
record = records[index] #获取其中一个记录即图像id
# 读取图像信息
img_dicc = coco.loadImgs([record]) #结果是一个list,其元素是字典:
'''
{
'file_name': '59e2513a3c4fdb25ff.png',
'height': 1024,
'width': 1024,
'id': 2021000001
}
'''
#--------------------------------打开图像----------------------------------
img_name = img_dicc[0]['file_name']
image_path = os.path.join(folder,img_name)
img = cv2.imread(image_path, cv2.IMREAD_COLOR)
#读取标签信息
annIds = coco.getAnnIds(imgIds= record) #获取图像 ID 对应的标注框id
anns_dicc = coco.loadAnns(annIds) # 标注框字典构成的list,每个list元素是一个字典:
'''
anns_dicc[0] ={
'area': 5776,
'bbox': [1, 0, 76, 76],
'category_id': 1,
'id': 1,
'ignore': 0,
'image_id': 2021000001,
'iscrowd': 0,
'segmentation': []
}
'''
def load_gt(dict_input, key_box):
#获取gtboxes
if len(dict_input) < 1:
return np.empty([0, 5])
else:
assert key_box in dict_input[0]
bboxes = np.array([i[key_box] for i in dict_input]).astype(np.int32)
tag = np.array([i['category_id'] for i in dict_input]).reshape((-1,1))
bboxes = np.hstack((bboxes, tag)) # [x,y,w,h,class]
return bboxes
gtboxes = load_gt(anns_dicc, 'bbox')
# ------------进行可视化查看:标签叠加在图像上并保存---------------------------
#x1,y1,x2,y2 ==> x1,y1,w,h
gtboxes[:, 2:4] += gtboxes[:,:2]
width = img.shape[1]
height = img.shape[0]
for i in range(len(gtboxes)):
one_box = gtboxes[i]
one_box = np.array([max(one_box[0], 0), max(one_box[1], 0),
min(one_box[2], width - 1), min(one_box[3], height - 1)])
x1,y1,x2,y2 = np.array(one_box[:4]).astype(int)
line_thick=1
color = (0,0,255) #红色
cv2.rectangle(img, (x1,y1), (x2,y2), color, line_thick)
#---------------------------保存可视化图像--------------------------------
out_file ='D:/visual.jpg'
cv2.imwrite(out_file, img, [int(cv2.IMWRITE_JPEG_QUALITY), 95])
最后进行可视化展示。
563

被折叠的 条评论
为什么被折叠?



