coco数据集seg转yolo
时间: 2024-12-29 16:25:57 浏览: 17
### 将COCO数据集的分割标签转换为YOLO格式
#### COCO到YOLO格式转换概述
COCO 数据集中,实例分割是以多边形顶点列表的形式存储在 JSON 文件中的。而 YOLO 格式的实例分割则采用不同的表示方法,通常会将这些多边形简化成边界框加上一系列相对位置坐标来描述对象轮廓。
对于每个多边形,在 COCO 中定义为一串连续的 (x, y) 对,而在 YOLO 的 seg 版本中,则需要计算出该物体包围盒的位置并记录下相对于图像尺寸的比例坐标[^1]。
#### 转换过程详解
具体来说,要完成这种转换需执行以下几个操作:
- **解析输入JSON文件**:读取包含所有标注信息的标准 COCO JSON 文件。
- **提取必要字段**:获取类别 ID、图片宽度高度等基本信息用于后续处理。
- **遍历每个目标区域**:针对每一个被标记的对象,先求得其外接矩形作为基础定位依据;接着按照一定间隔采样原始多边形上的点,并将其转化为相对于整个图像大小的比例值。
- **保存至txt文件**:最终把上述得到的信息写入对应于各张原图的新文本文件里,遵循 YOLO 所规定的命名习惯与内部结构。
以下是实现此功能的一个简单 Python 函数示例:
```python
import json
from pathlib import Path
def coco_to_yolo(coco_json_path: str, output_dir: str):
with open(coco_json_path) as f:
data = json.load(f)
images_info = {img['id']: img for img in data['images']}
for annotation in data['annotations']:
image_id = annotation["image_id"]
category_id = annotation["category_id"]
segmentation = annotation.get('segmentation', [])
if not segmentation or isinstance(segmentation[0], list): continue
points = []
for i in range(0, len(segmentation), 2):
x, y = segmentation[i:i+2]
points.append((float(x), float(y)))
min_x = min(p[0] for p in points)
max_x = max(p[0] for p in points)
min_y = min(p[1] for p in points)
max_y = max(p[1] for p in points)
width = max_x - min_x
height = max_y - min_y
center_x = (min_x + width / 2.) / images_info[image_id]['width']
center_y = (min_y + height / 2.) / images_info[image_id]['height']
norm_width = width / images_info[image_id]['width']
norm_height = height / images_info[image_id]['height']
file_name = Path(images_info[image_id]["file_name"]).stem + ".txt"
out_file = Path(output_dir).joinpath(file_name)
line = " ".join(map(str, [
int(category_id),
round(center_x, 6),
round(center_y, 6),
round(norm_width, 6),
round(norm_height, 6)]))
with open(out_file, 'a') as txt_f:
txt_f.write(line + '\n')
```
这段代码实现了从标准 COCO JSON 到适用于 YOLO 训练所需的 .txt 文件之间的基本转换逻辑。
阅读全文