当你第一次拿到COCO数据集时,可能会被它复杂的JSON结构吓到。这个文件就像是一个装满各种标签的百宝箱,里面包含了图像信息、物体检测框、分割掩码,还有我们最关心的关键点标注。而YOLOv8-Pose需要的TXT格式则像是一份简洁明了的清单,只保留最核心的信息。
COCO的JSON文件采用树状结构组织数据,主要包含三个关键部分:
相比之下,YOLOv8-Pose的TXT格式则采用扁平化的行存储方式,每行对应一个实例的所有信息,包括:
这种差异就像是从一本厚厚的百科全书变成了便于快速查阅的便签条。在实际转换过程中,我们需要特别注意坐标系的转换。COCO使用绝对像素坐标,而YOLOv8需要的是相对于图像宽高的归一化值(0-1之间)。这个转换看似简单,但一旦出错会导致模型完全无法学习到正确的位置信息。
写转换脚本就像是在做数据翻译工作,我们需要准确理解源语言(COCO)和目标语言(YOLOv8)的语法规则。下面这个Python函数是转换过程的核心:
python复制def convert_bbox_keypoints(ann, img_w, img_h):
# COCO bbox格式: [x_min, y_min, width, height]
x_min, y_min, w, h = ann['bbox']
# 转换为YOLO格式的中心点坐标和宽高
x_center = (x_min + w/2) / img_w
y_center = (y_min + h/2) / img_h
w_norm = w / img_w
h_norm = h / img_h
# 处理关键点
keypoints = ann['keypoints'] # [x1,y1,v1,x2,y2,v2,...]
kpts_norm = []
for i in range(0, len(keypoints), 3):
x = keypoints[i] / img_w
y = keypoints[i+1] / img_h
v = keypoints[i+2] # 可见性标志
kpts_norm.extend([x, y, v])
return [x_center, y_center, w_norm, h_norm] + kpts_norm
在实际项目中,我遇到过几个典型的坑需要特别注意:
转换完成后,最保险的验证方式就是把TXT标签重新绘制到原图上检查。这个步骤就像是在校对翻译稿,任何错误都会直观地暴露出来。
python复制def plot_yolo_pose(img_path, txt_path):
img = cv2.imread(img_path)
h, w = img.shape[:2]
with open(txt_path) as f:
for line in f.readlines():
parts = list(map(float, line.strip().split()))
# 解析bbox
x_center, y_center = parts[1] * w, parts[2] * h
box_w, box_h = parts[3] * w, parts[4] * h
x1 = int(x_center - box_w/2)
y1 = int(y_center - box_h/2)
x2 = int(x_center + box_w/2)
y2 = int(y_center + box_h/2)
cv2.rectangle(img, (x1,y1), (x2,y2), (0,255,0), 2)
# 解析关键点
kpts = []
for i in range(5, len(parts), 3):
x = int(parts[i] * w)
y = int(parts[i+1] * h)
v = int(parts[i+2])
if v > 0: # 只绘制有效点
cv2.circle(img, (x,y), 3, (0,0,255), -1)
kpts.append((x,y,v))
# 绘制骨架连线
skeleton = [(16,14),(14,12),(17,15),(15,13),(12,13),
(6,12),(7,13),(6,7),(6,8),(7,9),
(8,10),(9,11),(2,3),(1,2),(1,3),
(2,4),(3,5),(4,6),(5,7)]
for (i,j) in skeleton:
if kpts[i-1][2] > 0 and kpts[j-1][2] > 0:
cv2.line(img, kpts[i-1][:2], kpts[j-1][:2], (255,0,0), 1)
cv2.imshow('Verification', img)
cv2.waitKey(0)
在可视化检查时,要特别关注以下几点:
一个健壮的数据处理流程应该像工厂的流水线一样可靠。根据我的项目经验,完整的处理步骤应该是:
数据准备阶段
格式转换阶段
验证阶段
训练准备阶段
这里分享几个实用技巧:
处理COCO这样的复杂数据集时,建议先在小样本上测试整个流程。我曾经在一个项目中因为直接处理全部数据,结果发现转换脚本有bug,导致不得不重新处理数万张图片,浪费了大量时间。现在我的工作流程一定是:小样本测试 → 修正问题 → 中等样本验证 → 全量处理。这种渐进式的方法虽然看起来慢,但实际上是最稳妥高效的。