本文分析了coco128-seg数据集,并且提供了由labelme转coco128代码,敬请享用。
简述
配置文件
使用数据集一般会配套使用coco128-seg.yaml 数据配置,内容如下,或者查看coco128-seg.yaml
# Ultralytics YOLO 🚀, GPL-3.0 license
# COCO128-seg dataset https://www.kaggle.com/ultralytics/coco128 (first 128 images from COCO train2017) by Ultralytics
# Example usage: python train.py --data coco128.yaml
# parent
# ├── yolov5
# └── datasets
# └── coco128-seg ← downloads here (7 MB)
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../datasets/coco128-seg # dataset root dir
train: images/train2017 # train images (relative to 'path') 128 images
val: images/train2017 # val images (relative to 'path') 128 images
test: # test images (optional)
# Classes
names:
0: person
1: bicycle
2: car
.
.中间不再冗余叙述
.
75: vase
.
.
.
78: hair drier
79: toothbrush
# Download script/URL (optional)
download: https://ultralytics.com/assets/coco128-seg.zip
数据集
数据集下载,结构如下,可点击下载
coco128-seg
|——images
|——001.jpg
|——002.jpg
|——......
|——labels
|——001.txt
|——002.txt
|——...
选择查看一个:如查看000000000030.jpg,与其对应的label的txt


如图所示,txt中红色边框标注为label,75对应这yaml文件中的vase(花瓶),而黑色横线标记的就是一个坐标如(0.616156,0.364042),为了得到对应真实坐标,需要分别乘以宽和高,得到(0.616156*w,0.364042*h),即为标注的一个点;把后面坐标依次相连可的标注区域。
代码验证
我把txt提取出来,转换成真实坐标,并绘制出坐标点,得到相应图像。
import cv2
#以下为花瓶对应坐标
bbox="0.616156 0.364042 0.631188 0.395514 0.631188 0.462921 0.608641 0.561799 0.569562 0.602243 0.551531 0.653925 0.544016 0.676402 0.554531 0.710117 0.581594 0.730327 0.599625 0.755047 0.581594 0.793248 0.510953 0.817967 0.462859 0.820234 0.422297 0.788762 0.417781 0.773037 0.416281 0.764042 0.456859 0.728084 0.461359 0.638201 0.438812 0.606752 0.39975 0.548318 0.371188 0.447196 0.407266 0.510117 0.446328 0.489883 0.498937 0.480888 0.516969 0.460678 0.528984 0.408995 0.545516 0.397757 0.586094 0.386519 0.578578 0.431472 0.587594 0.429206 0.596609 0.4 0.608641 0.37528 0.614656 0.368528"
image=cv2.imread("000000000030.jpg")
(h,w)=image.shape[:2]
bbox=bbox.split()
bbox=[float(i) for i in bbox]
print(bbox)
#得到每一个横坐标
bb_w=[int(bbox[i]*w) for i in range(len(bbox)-1) if i%2==0]
#得到每一纵坐标
bb_h=[int(bbox[i]*h) for i in range(len(bbox)-1) if i%2==1]
print(bb_w,bb_h)
for i in range(len(bb_w)-1):
#绘制圆点
cv2.circle(image,(bb_w[i],bb_h[i]),3,(0,0,0),6)
#显示图片
cv2.imshow("a",image)
cv2.waitKey(0)
如图:
可见黑色区域即为花瓶标注区域

重头戏:labelme to coco128-seg
import json
import os
import cv2
json_filepath="D:\Shanmh\DeskTop/vase"#包含json文件的目录
image_filepath="D:\Shanmh\DeskTop/vase"#包含原图文件的目录
txt_savapath="D:\Shanmh\DeskTop/vase"#txt保存目录
json_files=[i for i in os.listdir(json_filepath) if i.endswith("json")]
for i in json_files:
#新建一个数据list
info_list=[]
json_path=os.path.join(json_filepath,i)
with open(json_path,"r") as r:
json_info=json.load(r)
r.close()
imagePath=json_info["imagePath"]
#得到图像宽高
h,w=cv2.imread(os.path.join(image_filepath,imagePath)).shape[:2]
shapes=json_info["shapes"]
for shape in shapes:#每一个区域
row_str=""#初始化一行
label=shape["label"]
row_str+=label
points=shape["points"]
for point in points:
x=round(float(point[0])/w,6)#小数保留6位
y = round(float(point[1]) / h, 6) # 小数保留6位
row_str+=" "+str(x)+" "+str(y)
row_str+="\n"
info_list.append(row_str)
with open(os.path.join(txt_savapath,i.replace(".json",".txt")),"w") as w:
w.writelines(info_list)
w.close()
print(f"已保存文件{i.replace('.json','.txt')}")