Как конвертировать PASCAL VOC в 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 darknet
2 0.750000 0.501111 0.315000 0.993333
отметить начальную
2
это категория
5 ответов
Используя математику: (также может быть полезно для 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)}`);
Мы с одноклассниками создали пакет Python под названием PyLabel, чтобы помочь другим с этой задачей и другими задачами маркировки.
Это будет базовый код для преобразования вокала в кокос:
!pip install pylabel
from pylabel import importer
dataset = importer.ImportVOC(path=path_to_annotations)
dataset.exporter.ExportToYoloV5()
Вы можете найти образцы записных книжек и исходный код здесь https://github.com/pylabel-project/pylabel
И еще один инструмент:
pip install pascal-voc
from pascal import annotation_from_xml
# read xml file
ann = annotation_from_xml(ann_file)
label_map = {"car": 1, "dog": 0, "person": 2, "train": 3}
# get ann str
yolo_ann = ann.to_yolo(label_map)
# save yolo format file
with open("yolo_ann.txt", "w") as f:
f.write(yolo_ann)
Этот сценарий мне помог. Вам придется изменить
dirs
и
classes
аргументы, соответствующие вашим обучающим / тестовым изображениям и классификационным меткам (соответственно).
https://gist.github.com/Amir22010/a99f18ca19112bc7db0872a36a03a1ec
Я использую следующий фрагмент для преобразования 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: https://christianbernecker.medium.com/convert-bounding-boxes-from-coco-to-pascal-voc-to-yolo-and-back-660dc6178742
Веселиться!