YOLO(You Only Look Once)是一种流行的目标检测和实例分割算法,其数据格式被广泛用于训练和评估模型。YOLO格式使用简单的文本文件存储标注信息,每个图像对应一个标签文件。
- 每图一标签:每个图像(如
image.jpg)对应一个同名的.txt标签文件(如image.txt)。 - 归一化坐标:所有坐标值均归一化到
[0, 1]区间,相对于图像的宽度和高度。 - 独立的类别文件:类别名称存储在一个独立的文本文件(如
classes.names)中,每行一个类别。 - 支持检测与分割:
- 检测格式:使用边界框(bounding box)表示目标。
- 分割格式:使用多边形(polygon)顶点表示目标的精确轮廓。
标签文件是一个纯文本文件,每行代表图像中的一个标注实例。每行的格式取决于标注类型:
class_id x_center y_center width height
class_id:整数,表示目标的类别索引(从0开始)。x_center:浮点数,边界框中心点的 x 坐标(归一化)。y_center:浮点数,边界框中心点的 y 坐标(归一化)。width:浮点数,边界框的宽度(归一化)。height:浮点数,边界框的高度(归一化)。
归一化公式:
x_center = (x_min + width/2) / image_width
y_center = (y_min + height/2) / image_height
width = bbox_width / image_width
height = bbox_height / image_height
class_id x1 y1 x2 y2 ...
class_id:整数,表示目标的类别索引(从0开始)。x1 y1 x2 y2 ...:一系列浮点数,表示多边形顶点的归一化坐标,顺序为x1, y1, x2, y2, ...。- 至少需要 3 个点(6个坐标值)才能构成一个有效的多边形。
归一化公式:
x_i = original_x_i / image_width
y_i = original_y_i / image_height
类别文件是一个纯文本文件,每行一个类别名称,顺序与 class_id 对应。
示例:
person
car
bicycle
traffic light
- 图像文件:
image.jpg(尺寸:640×480 像素)
标签文件 image.txt:
0 0.512500 0.400000 0.175000 0.300000
1 0.200000 0.600000 0.100000 0.150000
解释:
- 第一行:类别
0(person),中心点位于(0.5125*640, 0.4*480) = (328, 192),宽度0.175*640=112,高度0.3*480=144。 - 第二行:类别
1(car),中心点位于(0.2*640, 0.6*480) = (128, 288),宽度0.1*640=64,高度0.15*480=72。
标签文件 image.txt:
0 0.3 0.2 0.5 0.2 0.5 0.6 0.3 0.6
解释:
- 类别
0(person),多边形顶点(归一化):(0.3,0.2),(0.5,0.2),(0.5,0.6),(0.3,0.6)。 - 对应原始坐标(640×480):
(192,96),(320,96),(320,288),(192,288)。
classes.names:
person
car
bicycle
traffic light
YOLO 使用归一化坐标,使标注与图像尺寸无关。归一化坐标的计算方式为:
normalized_x = original_x / image_width
normalized_y = original_y / image_height
- 原始格式:
[x_min, y_min, width, height],其中x_min, y_min为左上角坐标。 - YOLO 格式:
[x_center, y_center, width, height],均为归一化值。
- 多边形顶点按顺序列出,形成闭合区域。
- 坐标值必须为偶数个(每对表示一个点)。
- 坐标范围:归一化坐标应在
[0, 1]范围内,超出范围的坐标可能被截断或导致错误。 - 图像尺寸:在读取标签时通常需要图像的实际尺寸(宽度、高度)以进行坐标反归一化。
- 分割标注:分割格式要求至少 3 个点(6个坐标值)。如果点数不足,该标注可能被视为无效。
- 类别索引:
class_id必须与类别文件中的行号对应(从0开始计数)。如果索引超出范围,标注可能被忽略。 - 文件编码:建议使用 UTF-8 编码保存标签文件和类别文件,以确保兼容性。