数据集yolo和coco格式
时间: 2024-12-30 08:25:08 浏览: 20
### YOLO 和 COCO 数据集格式说明
#### YOLO 格式
YOLO (You Only Look Once) 是一种流行的实时目标检测算法。其标注文件通常采用简单的文本格式,每张图片对应一个`.txt` 文件。每一行代表一个对象的边界框及其类别标签。
- **文件结构**: `class_id center_x center_y width height`
- 所有数值均为相对于图像尺寸的比例值(0到1之间)
- 坐标系原点位于左上角[^1]
```text
# Example of a line in .txt file for an image with one object
0 0.723489 0.567890 0.234567 0.123456
```
#### COCO 格式
COCO (Common Objects in Context) 是一个多用途的目标检测、分割和字幕生成数据集。JSON格式用于存储元数据,包括但不限于:
- 图像信息 (`images`)
- 类别定义 (`categories`)
- 注解详情 (`annotations`)
其中注解部分会给出每个实例的具体位置以及所属分类编号等重要参数。
- 边界框表示方式为 `[x_min, y_min, width, height]`, 即最小外接矩形四个顶点中的最左侧坐标加上宽度高度来描述。
```json
{
"info": {},
"licenses": [],
"images": [
{
"id": 1,
"width": 640,
"height": 480,
"file_name": "image_000001.jpg"
}
],
"annotations": [
{
"id": 1,
"image_id": 1,
"category_id": 1,
"bbox": [100, 50, 150, 200],
"area": 30000,
"iscrowd": 0
}
],
"categories": [
{"id": 1, "name": "person", ...}
]
}
```
### 转换方法
实现从YOLO至COCO格式转换的关键在于解析源格式并构建符合目的格式要求的数据结构。下面提供了一个Python脚本作为示范,该脚本能读取指定目录下的YOLO格式标注文件,并将其转化为单个COCO JSON文件输出。
```python
import os
from pathlib import Path
import json
def convert_bbox(yolo_bbox, img_width, img_height):
"""Converts bounding box from YOLO format to COCO format."""
class_id, cx_rel, cy_rel, w_rel, h_rel = map(float, yolo_bbox.split())
# Convert relative coordinates back into absolute values.
bbox_w = int(w_rel * img_width)
bbox_h = int(h_rel * img_height)
# Calculate top-left corner position based on the center point given by YOLO.
x_min = max(int(cx_rel * img_width - bbox_h / 2), 0)
return {'category_id': int(class_id)+1, 'bbox': [x_min, y_min, bbox_w, bbox_h], 'area': bbox_w*bbox_h}
def main(input_dir='.', output_file='coco_annotations.json'):
images = []
annotations = []
annotation_id = 1
for idx, txt_path in enumerate(Path(input_dir).glob('*.txt')):
stem = txt_path.stem
# Assuming that there is corresponding JPEG or PNG file next to TXT files.
img_info = {
"id": idx + 1,
"file_name": f"{stem}.jpg",
"width": 640, # Replace these two lines according to your dataset's actual dimensions.
"height": 480
}
images.append(img_info)
with open(txt_path) as fp:
for line in fp.readlines():
ann = convert_bbox(line.strip(), img_info['width'], img_info['height'])
ann.update({
"id": annotation_id,
"image_id": idx + 1,
"iscrowd": 0
})
annotations.append(ann)
annotation_id += 1
coco_format_data = {
"images": images,
"annotations": annotations,
"categories": [{"supercategory":"none","id":i,"name":f"class_{i}"} for i in range(1, 81)] # Adjust category list accordingly.
}
with open(output_file, 'w') as out_fp:
json.dump(coco_format_data, out_fp)
if __name__ == '__main__':
main()
```
此代码片段展示了如何遍历给定路径下所有的YOLO格式标注文件(`.txt`),并将它们的信息整理成适合写入COCO JSON文件的形式。注意,在实际应用中可能还需要调整一些细节以适应特定需求,比如处理不同分辨率的输入图片或是自定义类别的映射关系等.
阅读全文