将图像分割数据集转化成voc格式的目标检测数据集

       在目标检测寻找数据集的过程中可能发现有的图像分割数据集可以满足自己的要求,却没有相应的目标检测格式的标签,接下来是转换代码:

import cv2
import numpy as np
import pandas as pd
import os


def get_coor(img):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 变为灰度图
    # cv2.imshow('1', gray)
    # cv2.waitKey(0)
    ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)  ## 阈值分割得到二值化图片
    # cv2.imshow('2', binary)
    contours, heriachy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    print(len(contours))

    arr = np.empty(shape=[0,4])
    print(arr)


    for i, contour in enumerate(contours):
        #if i == len(contours) - 1:
        #print('i:', i)
        a = sorted(contour[:, 0], key=lambda x: x[0])  # 所有坐标按x轴从小到大排序
        x_min = a[0][0]
        x_max = a[-1][0]
        b = sorted(contour[:, 0], key=lambda x: x[1])  # 所有坐标按y轴从小到大排序
        y_min = b[0][1]
        y_max = b[-1][1]
        rec = img
            # cv2.drawContours(img, contours, i, (0, 0, 255), 5)
            # 第一个参数指在哪幅图上绘制轮廓信息,第二个参数是轮廓本身,第三个参数是指定绘制哪条轮廓
            # 第四个参数是绘图的颜色,第五个参数是绘制的线宽 输入-1则表示填充
        cv2.rectangle(rec, (x_min, y_min), (x_max, y_max), (0, 255, 0), 3)

        # cv2.imshow('rectangle', rec)
        # cv2.waitKey()
        a = np.array([str(x_min), str(y_min), str(x_max), str(y_max)])

        arr = np.append(arr, [a], axis=0)

    return arr


def save_xml(src_xml_dir, img_name, h, w, arr):
    xml_file = open((src_xml_dir + '/' + img_name + '.xml'), 'w')
    xml_file.write("<annotation>\r\n")
    xml_file.write("    <folder>VOC2007</folder>\r\n")

    xml_file.write('"    <filename>' + str(img_name) + '.jpg' + '</filename>\r\n')

    xml_file.write("    <size>\r\n")
    xml_file.write('        <width>' + str(w) + '</width>\r\n')
    xml_file.write('        <height>' + str(h) + '</height>\r\n')
    xml_file.write('        <depth>3</depth>\r\n')
    xml_file.write('    </size>\r\n')

    # d = str(arr[0][0])
    # f = str(arr[1][1])
    for i in (range(len(arr))):
    # write the region of image on xml file
        print("i:", i)
        xml_file.write('    <object>\r\n')
        xml_file.write('        <name>' + 'strawberry' + '</name>\r\n')#你自己的类别名
        xml_file.write('        <pose>Unspecified</pose>\r\n')
        xml_file.write('        <truncated>0</truncated>\r\n')
        xml_file.write('        <difficult>0</difficult>\r\n')
        xml_file.write('        <bndbox>\r\n')
        xml_file.write('            <xmin>' + str(arr[i][0]) + '</xmin>\r\n')
        xml_file.write('            <ymin>' + str(arr[i][1]) + '</ymin>\r\n')
        xml_file.write('            <xmax>' + str(arr[i][2]) + '</xmax>\r\n')
        xml_file.write('            <ymax>' + str(arr[i][3]) + '</ymax>\r\n')
        xml_file.write('        </bndbox>\r\n')
        xml_file.write('    </object>\r\n')

    xml_file.write('</annotation>')


file_dir = r'H:\StrawDI_Db1\train\label'#图像分割的png格式标签
save_xml_dir = r'H:\StrawDI_Db1\train\voc'#输出的voc格式的标签
for name in os.listdir(file_dir):
    print(name)
    img_path = os.path.join(file_dir, name)
    img = cv2.imread(img_path)
    # img = cv2.imdecode(np.fromfile(img_path), dtype=np.uint8), -1)
    h, w = img.shape[:-1]
    #x1, y1, x2, y2 = get_coor(img)
    arr1 = get_coor(img)
    print(arr1)
    print(arr1[0][3])
    img_name = name.split('.')[0]
    save_xml(save_xml_dir, img_name, h, w, arr1)

注意,这是比较粗糙的转换,针对一幅图片里面多个同类别的转换,还没实现多个类别的转换,有时候多个物体重叠会被判定为一个框,需要自己后期检查更正。

参考文章:(21条消息) 分割数据集label转换为目标检测boundingbox_分割标签转目标检测格式_TryRestart的博客-CSDN博客

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 将CCPD数据集换成VOC格式需要进行以下步骤: 1. 首先,我们需要将CCPD数据集中的图像和标注框信息加载到内存中。 2. 然后,创建一个VOC格式的文件夹结构,包括Annotations、ImageSets、JPEGImages、SegmentationClass和SegmentationObject等文件夹。 3. 遍历所有CCPD数据集的图像,将其复制到JPEGImages文件夹中,并将图像文件名保存到ImageSets/Main文件夹中的训练集(train.txt)和验证集(val.txt)中。 4. 对于每个图像,读取其对应的CCPD标注文件,并解析出车牌的位置信息和标签等。 5. 将解析出的车牌位置信息和标签等保存到Annotations文件夹中,每个图像对应一个XML文件。 6. 如果需要使用分割图像,将图像复制到SegmentationClass文件夹,并使用图像编辑软件手动绘制分割图像,将分割图像保存到SegmentationObject文件夹中。 7. 最后,将创建的文件夹结构打包成一个VOC格式的压缩文件,以便后续的使用。 以上是将CCPD数据集换成VOC格式的大致步骤,具体换过程中还需要注意标注文件的格式和内容的对应关系。同时,可以借助一些开源的数据集换工具或脚本来简化换过程。 ### 回答2: 将CCPD数据集换成VOC格式可以通过以下步骤完成: 1. 解析CCPD数据集的标注文件:CCPD数据集的标注文件通常以JSON格式存储,其中包含每个图像的路径、车牌号码、车牌区域的坐标等信息。我们可以使用Python的json库来解析标注文件,提取所需的信息。 2. 创建VOC格式的标注文件:VOC格式的标注文件以XML格式存储,其中包含了图像的路径、尺寸信息以及每个目标物体的类别、边界框等。我们可以使用Python的xml.etree.ElementTree库来创建XML文件,并依照VOC格式的要求填充相应的字段。 3. 换图像格式:CCPD数据集中的图像通常以JPEG格式存储。在换成VOC格式时,需要将图像的格式换为PNG或者JPEG,以便与VOC标注文件对应。 4. 保存换后的文件:将换后的VOC格式标注文件和图像保存在指定的文件夹中,以便后续使用。 值得注意的是,换CCPD数据集VOC格式时,需要根据具体的需求进行适当的调整。例如,可能需要手动调整车牌区域的坐标以适应VOC格式的要求,或者添加新的字段来记录车牌的颜色、字符等信息。 ### 回答3: 将CCPD数据集换成VOC格式需要经过以下几个步骤: 1. 了解CCPD数据集的结构:CCPD数据集是用于车牌检测和识别的数据集,其中包含了大量车辆图像和对应的车牌信息。 2. 创建VOC格式的文件夹结构:VOC格式包括JPEGImages、Annotations、ImageSets三个文件夹。 3. 将CCPD数据集中的车辆图像复制到JPEGImages文件夹中:将CCPD数据集中的所有车辆图像文件复制到JPEGImages文件夹中。 4. 根据CCPD数据集中的车牌信息创建标注文件:对于每个图像,根据CCPD数据集中的车牌信息,创建一个XML文件,用于描述图像中的车牌位置和类别等信息。XML文件的格式遵循VOC的标准。 5. 将标注文件保存到Annotations文件夹中:将创建的XML文件保存到Annotations文件夹中。 6. 创建ImageSets文件夹,并在其中创建Main文件夹:创建一个名为Main的文件夹,并在其中创建train.txt、val.txt、test.txt等文件,用于记录训练集、验证集和测试集的图像文件名。 7. 将图片文件名写入对应的txt文件中:根据划分的训练集、验证集和测试集,将对应的图像文件名写入train.txt、val.txt、test.txt等文件中。 8. VOC格式换完成。 通过以上步骤,我们可以将CCPD数据集换成VOC格式,使其可以与其他遵循VOC格式数据集进行统一处理和使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值