将 CSV 数据集转换为 yolo 格式

时间:2021-06-02 16:06:12

标签: python pandas csv annotations yolo

我试图在 yolov4 中训练数据集,但在训练时出现了一些关于我的注释格式错误的错误。

数据集的注释格式为 CSV 格式

(x_min, x_max, y_min, y_max)

我检查了图片的属性,每张图片的大小都是 1280x720,所以我又做了两列宽度和高度。

         img_id                            x_min    x_max   y_min   y_max             
0   94a69b66-23f0-11e9-a78e-2f2b7983ac0d    438     529     0       132     
1   94a6a3a4-23f0-11e9-a78f-ebd9c88ef3e8    433     529     0       131     
2   94a6a430-23f0-11e9-a790-2b5f72f1667a    440     529     0       132     
3   94a6a48a-23f0-11e9-a791-fb958b6ab6b3    452     550     0       154     
4   94a6a4da-23f0-11e9-a792-f320b734bd9b    462     550     0       153 

我要更改为 yolo 格式的代码是:

convert_dict = {'x_min': float,
                'x_max': float,
                'y_min': float,
                'y_max': float
               }
df["width"] = 1280
df["height"] = 720

df = df.astype(convert_dict)
xcen = ((df.x_min + df.x_max)) / 2 / df['width']
ycen = ((df.y_min + df.y_max)) / 2 / df['height'] 
df['width'] = ((df.x_max - df.x_min)) / df['width']
df['height']  = ((df.y_max - df.y_min)) / df['height']
df['xcen'] = xcen
df['ycen'] = ycen

df = df.drop(columns=['x_min', 'x_max','y_min','y_max'])

我不确定我上面的数学是否正确,但我会得到结果并将它们与显示的结果分开放入 .txt 中,例如表中的第一个 img_id:

0 0.377734375 0.09166666666666666 0.07109375 0.18333333333333332

这是 yolov4 声明的格式

<object_class> <x_center> <y_center> <width> <height> 

但是在训练时,我收到了很多图像和注释文件的错误,例如:

data/obj/da5d62ac-db28-11ea-95b0-8fa5e97cd019.txt Wrong annotation: x = 0 or y = 0

这是包含在该文本文件中的内容

0 0.256640625 1.0763888888888888 0.35859375 0.12222222222222222
2 0.560546875 0.6451388888888889 0.22578125 0.24305555555555555
2 0.6125 0.7430555555555556 0.2015625 0.18333333333333332
0 0.755859375 0.8152777777777778 0.33671875 0.6138888888888889
0 0.91640625 0.4423611111111111 0.1640625 0.44305555555555554

该 img id 的 CSV 数据如下

                       img_id                  x_min    x_max   y_min   y_max   label_l1    width   height
219661  da5d62ac-db28-11ea-95b0-8fa5e97cd019    99      558     731     819     0   1280    720
219662  da5d62ac-db28-11ea-95b0-8fa5e97cd019    573     862     377     552     2   1280    720
219663  da5d62ac-db28-11ea-95b0-8fa5e97cd019    655     913     469     601     2   1280    720
219664  da5d62ac-db28-11ea-95b0-8fa5e97cd019    752     1183    366     808     0   1280    720
219665  da5d62ac-db28-11ea-95b0-8fa5e97cd019    1068    1278    159     478     0   1280    720

我转换为 yolo 格式的代码是错误的吗?或者这是数据集中图像的问题还是与路径有关?

我将尝试在 google collab 中运行此程序,看看是否会遇到同样的问题。

1 个答案:

答案 0 :(得分:1)

我认为你在计算 x 和 y 时搞砸了:

YOLO 使用 x_min 位置和 y_min 位置(标准化,<1),即边界框的左上角。加上盒子沿 x 轴 (w) 和 y 轴 (h) 的距离。

我认为 x 是我们代码中的平均值 (xcen = ((df.x_min + df.x_max)) / 2 / df['width']) xcen+w 可以大于 1,可能会出错

你的第一行数据中究竟发生了什么

0 0.256640625 ***1.0763888888888888*** 0.35859375 0.12222222222222222

你能试试这个吗:

x = xmin / width
y = ymin / height
w = (xmax - xmin) / width
h = (ymax - ymin) / height

从这里How can I convert form [xmin ymin xmax ymax] to [x y width height] normalized in image?

如果有帮助请告诉我