如何将 PASCAL VOC 转换为 YOLO
How to convert PASCAL VOC to YOLO
我正在尝试开发一些在格式之间转换注释的方法,但很难找到信息,但这里我有:
这个是 PASCAL VOC
<width>800</width>
<height>450</height>
<depth>3</depth>
<bndbox>
<xmin>474</xmin>
<ymin>2</ymin>
<xmax>726</xmax> <!-- shape_width = 252 -->
<ymax>449</ymax> <!-- shape_height = 447 -->
</bndbox>
转换为 YOLO 暗网
2 0.750000 0.501111 0.315000 0.993333
注意首字母2
这是一个类别
使用一些数学知识:(对 COCO 也很有用)
categ_index [(xmin + xmax) / 2 / image_width] [(ymin + ymax) / 2 / image_height] [(xmax - xmin) / image_width] [(ymax - ymin) / image_height]
在js代码中
const categ_index = 2;
const { width: image_width, height: image_height } = {
width: 800,
height: 450,
};
const { xmin, ymin, xmax, ymax } = {
xmin: 474,
ymin: 2,
xmax: 727,
ymax: 449,
};
const x_coord = (xmin + xmax) / 2 / image_width;
const y_coord = (ymin + ymax) / 2 / image_height;
const shape_width = (xmax - xmin) / image_width;
const shape_height = (ymax - ymin) / image_height;
console.log(`${categ_index} ${x_coord.toFixed(7)} ${y_coord.toFixed(7)} ${shape_width.toFixed(7)} ${shape_height.toFixed(7)}`);
// output
// 2 0.7506250 0.5011111 0.3162500 0.9933333
我和我的同学创建了一个名为 PyLabel 的 python 包来帮助其他人完成此任务和其他标记任务。
这是将 voc 转换为 coco 的基本代码:
!pip install pylabel
from pylabel import importer
dataset = importer.ImportVOC(path=path_to_annotations)
dataset.exporter.ExportToYoloV5()
您可以在此处找到示例笔记本和源代码 https://github.com/pylabel-project/pylabel
我使用以下代码片段将 Pascal_VOC 转换为 YOLO。 Yolo 使用归一化坐标,因此拥有图像的高度和宽度很重要。否则无法计算。
这是我的片段:
# Convert Pascal_Voc bb to Yolo
def pascal_voc_to_yolo(x1, y1, x2, y2, image_w, image_h):
return [((x2 + x1)/(2*image_w)), ((y2 + y1)//(2*image_h)), (x2 - x1)/image_w, (y2 - y1)/image_h]
我写了一篇关于对象检测格式以及如何转换它们的文章。您可以在 Medium 上查看我的博客 post:https://christianbernecker.medium.com/convert-bounding-boxes-from-coco-to-pascal-voc-to-yolo-and-back-660dc6178742
玩得开心!
我正在尝试开发一些在格式之间转换注释的方法,但很难找到信息,但这里我有:
这个是 PASCAL VOC
<width>800</width>
<height>450</height>
<depth>3</depth>
<bndbox>
<xmin>474</xmin>
<ymin>2</ymin>
<xmax>726</xmax> <!-- shape_width = 252 -->
<ymax>449</ymax> <!-- shape_height = 447 -->
</bndbox>
转换为 YOLO 暗网
2 0.750000 0.501111 0.315000 0.993333
注意首字母2
这是一个类别
使用一些数学知识:(对 COCO 也很有用)
categ_index [(xmin + xmax) / 2 / image_width] [(ymin + ymax) / 2 / image_height] [(xmax - xmin) / image_width] [(ymax - ymin) / image_height]
在js代码中
const categ_index = 2;
const { width: image_width, height: image_height } = {
width: 800,
height: 450,
};
const { xmin, ymin, xmax, ymax } = {
xmin: 474,
ymin: 2,
xmax: 727,
ymax: 449,
};
const x_coord = (xmin + xmax) / 2 / image_width;
const y_coord = (ymin + ymax) / 2 / image_height;
const shape_width = (xmax - xmin) / image_width;
const shape_height = (ymax - ymin) / image_height;
console.log(`${categ_index} ${x_coord.toFixed(7)} ${y_coord.toFixed(7)} ${shape_width.toFixed(7)} ${shape_height.toFixed(7)}`);
// output
// 2 0.7506250 0.5011111 0.3162500 0.9933333
我和我的同学创建了一个名为 PyLabel 的 python 包来帮助其他人完成此任务和其他标记任务。
这是将 voc 转换为 coco 的基本代码:
!pip install pylabel
from pylabel import importer
dataset = importer.ImportVOC(path=path_to_annotations)
dataset.exporter.ExportToYoloV5()
您可以在此处找到示例笔记本和源代码 https://github.com/pylabel-project/pylabel
我使用以下代码片段将 Pascal_VOC 转换为 YOLO。 Yolo 使用归一化坐标,因此拥有图像的高度和宽度很重要。否则无法计算。
这是我的片段:
# Convert Pascal_Voc bb to Yolo
def pascal_voc_to_yolo(x1, y1, x2, y2, image_w, image_h):
return [((x2 + x1)/(2*image_w)), ((y2 + y1)//(2*image_h)), (x2 - x1)/image_w, (y2 - y1)/image_h]
我写了一篇关于对象检测格式以及如何转换它们的文章。您可以在 Medium 上查看我的博客 post:https://christianbernecker.medium.com/convert-bounding-boxes-from-coco-to-pascal-voc-to-yolo-and-back-660dc6178742
玩得开心!