BSTLD 数据集yaml文件转换训练用xml后缀文件教程

首先要准备两个东西

BSTLD数据集

下载地址:(打开迅雷复制进行就可以下载)

6b77e9bb941a2da928f0e1221a9c4ffbbfdaf936

BSTLD github官方工具

地址:

https://github.com/bosch-ros-pkg/bstld

1.数据集处理

本文只是用了BSTLD数据集中dataset_train中的图像数据

下载完的数据集应该是如下图1所示:

图1 BSTLD数据集

 注释:因为自己课题中使用到的是yolov5来训练识别红绿灯 所以只需要使用rgb属性的图片即可

首先解压好数据集:

打开dataset_train_rgb.zip.001 只要打开这一个压缩包即可 将数据解压出来

得到下面图2所示

图2 BSTLD train数据集

2.使用官方工具来转换yaml文件

从github上下载的程序打开后如下图3所示:

 图3 BSTLD 官方工具代码

首先,我们先处理yaml文件。官方提供的yaml文件是所有训练图片位置信息和状态信息的一个集合。使用记事本打开会看到下面内容图4中所展示。(注释:官方给的train.yaml在目录label_files文件夹中)

  图4 BSTLD train.yaml文件

我们现在要做的任务就是将这么多集合在一起的信息给拆分开。其步骤如下所示:

打开官方提供的程序bosch_to_pascal.py文件会看到如图5所示的程序(注释:这里我直接注释了因为不知道咋用)

 图5 注释

 自己添加了一行下面的程序

out_dir = 'hyj' #这里是目录里新建的空的文件夹名字 随便定义
images = yaml.safe_load(open('label_files/train.yaml', 'rb').read())#读取标签文件
for image in images:
    write_xml(out_dir, image, 1280, 720, depth=3, pose="Unspecified") #这里在生产xml文件

总程序如下所示:

#!/usr/bin/env python
"""
This script Converts Yaml annotations to Pascal .xml Files
of the Bosch Small Traffic Lights Dataset.
Example usage:
    python bosch_to_pascal.py input_yaml out_folder
"""

import os
import sys
import yaml
from lxml import etree
import os.path
import xml.etree.cElementTree as ET


def write_xml(savedir, image, imgWidth, imgHeight,
              depth=3, pose="Unspecified"):

    boxes = image['boxes']
    impath = image['path']
    imagename = impath.split('/')[-1]
    currentfolder = savedir.split("\\")[-1]
    annotation = ET.Element("annotation")
    ET.SubElement(annotation, 'folder').text = str(currentfolder)
    ET.SubElement(annotation, 'filename').text = str(imagename)
    imagename = imagename.split('.')[0]
    size = ET.SubElement(annotation, 'size')
    ET.SubElement(size, 'width').text = str(imgWidth)
    ET.SubElement(size, 'height').text = str(imgHeight)
    ET.SubElement(size, 'depth').text = str(depth)
    ET.SubElement(annotation, 'segmented').text = '0'
    for box in boxes:
        obj = ET.SubElement(annotation, 'object')
        ET.SubElement(obj, 'name').text = str(box['label'])
        ET.SubElement(obj, 'pose').text = str(pose)
        ET.SubElement(obj, 'occluded').text = str(box['occluded'])
        ET.SubElement(obj, 'difficult').text = '0'

        bbox = ET.SubElement(obj, 'bndbox')
        ET.SubElement(bbox, 'xmin').text = str(box['x_min'])
        ET.SubElement(bbox, 'ymin').text = str(box['y_min'])
        ET.SubElement(bbox, 'xmax').text = str(box['x_max'])
        ET.SubElement(bbox, 'ymax').text = str(box['y_max'])

    xml_str = ET.tostring(annotation)
    root = etree.fromstring(xml_str)
    xml_str = etree.tostring(root, pretty_print=True)
    save_path = os.path.join(savedir, imagename + ".xml")
    with open(save_path, 'wb') as temp_xml:
        temp_xml.write(xml_str)



out_dir = 'hyj'
images = yaml.safe_load(open('label_files/train.yaml', 'rb').read())
for image in images:
    write_xml(out_dir, image, 1280, 720, depth=3, pose="Unspecified")

运行以后 在自己建立的hyj文件夹里就会有生产的xml后缀的标签文件 如下图6所示:

图6 标签文件

关于dataset_stats.py文件是用来统计标签文件里有哪些类别的使用方法如下:

k = quick_stats('label_files/train.yaml')

跟上面方法一样 把最后if 这一段注释了 然后加上这个运行 就可以看到数据集里对于的类别和数量了。

还有两个read_label_file.py和show_label_images.py 这两个是用来展示标定的图片的使用方法如下所示:

如果打开read_label_file.py文件发生报错,如下图7所示:

 图7 报错

只需要删除前面的bstld.就好变成

from tf_object_detection import constants

read_label_file.py中还有28行改成这样才不会报错

   with open(input_yaml, 'rb') as iy_handle:
        images = yaml.safe_load(iy_handle)

接着如图8所示,把解压出来的图2中文件放到一下根目录中即可:(注释:rgb和train不可缺少!)

 图8 根目录内容

打开show_label_images.py文件 如下代码即可运行

#!/usr/bin/env python
"""
Quick sample script that displays the traffic light labels within
the given images.
If given an output folder, it draws them to file.

Example usage:
    python write_label_images input.yaml [output_folder]
"""
import sys
import os
import cv2
from read_label_file import get_all_labels


def ir(some_value):
    """Int-round function for short array indexing """
    return int(round(some_value))


def show_label_images(input_yaml, output_folder=None):
    """
    Shows and draws pictures with labeled traffic lights.
    Can save pictures.

    :param input_yaml: Path to yaml file
    :param output_folder: If None, do not save picture. Else enter path to folder
    """
    images = get_all_labels(input_yaml)

    if output_folder is not None:
        if not os.path.exists(output_folder):
            os.makedirs(output_folder)

    for i, image_dict in enumerate(images):
        image = cv2.imread(image_dict['path'])
        if image is None:
            raise IOError('Could not open image path', image_dict['path'])

        for box in image_dict['boxes']:
            cv2.rectangle(image,
                          (ir(box['x_min']), ir(box['y_min'])),
                          (ir(box['x_max']), ir(box['y_max'])),
                          (0, 255, 0))

        cv2.imshow('labeled_image', image)
        cv2.waitKey(10)
        if output_folder is not None:
            cv2.imwrite(os.path.join(output_folder, str(i).zfill(10) + '_'
                        + os.path.basename(image_dict['path'])), image)

k = 'label_files/train.yaml'

h = show_label_images(k)

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值