图像分割数据集——将(image、label)等格式的数据集转换成VOC格式的数据集

前言

我上传一下,我平时用的还算比较多的一些代码,这个代码简单的来说就是数据集的格式之间的变换。下边详细的讲解一下。

原本的数据集文件夹格式

需要的数据集文件夹格式为:

或者下边这种

转化过程如下:

1、将原本的格式

手动改成

JPEGImages:数据集的原图.jpg格式

SegmentationClass:数据集的标签.png格式

ImageSets:里面还有个文件夹如下

然后这个文件夹里面是空文件,运行代码后,会生成对应的txt文件。

然后代码如下:

import os
import random

import numpy as np
from PIL import Image
from tqdm import tqdm

# -------------------------------------------------------#
#   想要增加测试集修改trainval_percent
#   修改train_percent用于改变验证集的比例 9:1
#
#   当前该库将测试集当作验证集使用,不单独划分测试集
# -------------------------------------------------------#
trainval_percent = 1
train_percent = 0.9
# -------------------------------------------------------#
#   指向VOC数据集所在的文件夹
#   默认指向根目录下的VOC数据集
# -------------------------------------------------------#
VOCdevkit_path = r'D:\第九届互联网+\第九届资料整理汇总\第九届资料整理汇总\dataset\dataset\data\Blowhole\VOCdevkit'

if __name__ == "__main__":
    random.seed(0)
    print("Generate txt in ImageSets.")
    segfilepath = os.path.join(VOCdevkit_path, 'VOC2007/SegmentationClass')
    saveBasePath = os.path.join(VOCdevkit_path, 'VOC2007/ImageSets/Segmentation')

    temp_seg = os.listdir(segfilepath)
    total_seg = []
    for seg in temp_seg:
        if seg.endswith(".png"):
            total_seg.append(seg)

    num = len(total_seg)
    list = range(num)
    tv = int(num * trainval_percent)
    tr = int(tv * train_percent)
    trainval = random.sample(list, tv)
    train = random.sample(trainval, tr)

    print("train and val size", tv)
    print("traub suze", tr)
    ftrainval = open(os.path.join(saveBasePath, 'trainval.txt'), 'w')
    ftest = open(os.path.join(saveBasePath, 'test.txt'), 'w')
    ftrain = open(os.path.join(saveBasePath, 'train.txt'), 'w')
    fval = open(os.path.join(saveBasePath, 'val.txt'), 'w')

    for i in list:
        name = total_seg[i][:-4] + '\n'
        if i in trainval:
            ftrainval.write(name)
            if i in train:
                ftrain.write(name)
            else:
                fval.write(name)
        else:
            ftest.write(name)

    ftrainval.close()
    ftrain.close()
    fval.close()
    ftest.close()
    print("Generate txt in ImageSets done.")

    print("Check datasets format, this may take a while.")
    print("检查数据集格式是否符合要求,这可能需要一段时间。")
    classes_nums = np.zeros([256], np.int)
    for i in tqdm(list):
        name = total_seg[i]
        png_file_name = os.path.join(segfilepath, name)
        if not os.path.exists(png_file_name):
            raise ValueError("未检测到标签图片%s,请查看具体路径下文件是否存在以及后缀是否为png。" % (png_file_name))

        png = np.array(Image.open(png_file_name), np.uint8)
        if len(np.shape(png)) > 2:
            print("标签图片%s的shape为%s,不属于灰度图或者八位彩图,请仔细检查数据集格式。" % (name, str(np.shape(png))))
            print("标签图片需要为灰度图或者八位彩图,标签的每个像素点的值就是这个像素点所属的种类。" % (
            name, str(np.shape(png))))

        classes_nums += np.bincount(np.reshape(png, [-1]), minlength=256)

    print("打印像素点的值与数量。")
    print('-' * 37)
    print("| %15s | %15s |" % ("Key", "Value"))
    print('-' * 37)
    for i in range(256):
        if classes_nums[i] > 0:
            print("| %15s | %15s |" % (str(i), str(classes_nums[i])))
            print('-' * 37)

    if classes_nums[255] > 0 and classes_nums[0] > 0 and np.sum(classes_nums[1:255]) == 0:
        print("检测到标签中像素点的值仅包含0与255,数据格式有误。")
        print("二分类问题需要将标签修改为背景的像素点值为0,目标的像素点值为1。")
    elif classes_nums[0] > 0 and np.sum(classes_nums[1:]) == 0:
        print("检测到标签中仅仅包含背景像素点,数据格式有误,请仔细检查数据集格式。")

    print("JPEGImages中的图片应当为.jpg文件、SegmentationClass中的图片应当为.png文件。")
 

然后,转换就完毕了,大家有问题直接评论就可以了。

参考文献

voc数据集划分-CSDN博客

### 使用YOLO框架训练自定义VOC格式数据集 #### 准备工作 为了使用YOLO框架训练自定义的VOC格式数据集,首先要确保安装并配置好YOLO环境。对于YOLOv3版本,这通常涉及克隆Darknet项目文件,并根据本地开发环境调整`Makefile`以便成功编译[^3]。 #### 数据准备与标签换 针对VOC格式数据集,在开始训练之前需完成几个重要步骤: - **整理图像和标注文件**:确认所有JPEG图片位于同一目录下;对应的XML标注文件也应放置在同一路径内。 - **创建必要的索引列表**:按照VOC标准构建训练集(`train.txt`)、验证集(`val.txt`)以及测试集(`test.txt`)的文本清单,每行记录一张图片的位置信息。 - **换标签至YOLO格式**:由于原始VOC采用XML存储边界框坐标,而YOLO期望接收`.txt`形式的目标描述——即每个对象占据单独一行,依次列出类别ID及其相对位置(x_center, y_center, width, height),因此需要编写脚本来实现这种变。此过程可以通过Roboflow平台自动化处理,支持一键导出为适合YOLO使用的格式[^2]。 ```bash # 示例命令用于生成YOLO所需的label txt文件 python convert_voc_to_yolo.py --input_dir ./Annotations/ --output_dir ./labels/ ``` #### 配置文件设置 接下来要编辑YOLO模型的相关配置文件(cfg): - **指定类目数量**:依据个人定制化需求更新`classes= N`字段内的数值N代表总共有多少种类别的物体待识别。 - **设定锚点尺寸**:基于前期聚类分析得出最优k-means anchors值填入相应区域,有助于提升检测精度。 - **指明数据源路径**:在cfg文档里声明指向上述已建立好的image sets分割文件(train,val,test).txt的具体地址。 此外还需同步维护data文件夹下的`.names`文件罗列全部分类名称,配合修改后的.cfg共同作用于后续操作中。 #### 开始训练 一切就绪之后就可以着手执行训练指令了。假设已经下载官方预训练权重作为初始化起点,则可参照如下方式启动进程: ```bash ./darknet detector train path/to/voc.data path/to/yolov3-voc.cfg yolov3.weights -dont_show ``` 此处`path/to/voc.data`对应先前提及过的包含各类映射关系(data files paths)的小型配置文件; `path/to/yolov3-voc.cfg`则是经过适当调整后适用于当前项目的网络架构说明书[-^3]. #### 调整超参数优化性能 当初步收敛完成后,可以尝试微调一些影响最终表现的关键因素比如batch size、subdivisions大小或是learning rate衰减策略等来进一步提高泛化能力。同时密切监控loss变化趋势图,及时发现过拟合迹象加以遏制[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值