PaddleDetection——使用(jpg + xml)制作VOC数据集并建立PD包

因为模型需要VOC训练集,而数据集只有图片和已制作好的xml文件,那么只能自己进行VOC数据集的再加工,好,开工!

voc数据集格式

文件夹目录如图所示:

---VOC
    ------creat_txt.py
    ------txt_write.py
    ------Annotations
    	 ---------n个xml文件
    ------ImagesSet
         ---------Main
              --------trainval.txt
              --------train.txt
              --------test.txt
              --------val.txt
    ------JPEGImages
    	 ---------n个img文件

生成VOC数据集的txt文件

分别将两个python文件放在VOC文件夹下。

生成Main文件下的txt文件

运行creat_txt.py将会生成Main文件夹下的trainval.txt、train.txt、val.txt、test.txt四个txt文件。
creat_txt.py

import os
import random
#需要根据自己的目录进行修改
trainval_percent = 0.95  # 训练集验证集总占比
train_percent = 0.9  # 训练集在trainval_percent里的train占比
xmlfilepath = r'G:\科创及比赛\智能车\数据集\VOC格式数据集\7_17\标志物0717\data\limit\VOC2007\Annotations'
txtsavepath = r'G:\科创及比赛\智能车\数据集\VOC格式数据集\7_17\标志物0717\data\limit\VOC2007\ImageSets/Main'
total_xml = os.listdir(xmlfilepath)

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

ftrainval = open(r'G:\科创及比赛\智能车\数据集\VOC格式数据集\7_17\标志物0717\data\limit\VOC2007\ImageSets\Main\trainval.txt', 'w')
ftest = open(r'G:\科创及比赛\智能车\数据集\VOC格式数据集\7_17\标志物0717\data\limit\VOC2007\ImageSets\Main\test.txt', 'w')
ftrain = open(r'G:\科创及比赛\智能车\数据集\VOC格式数据集\7_17\标志物0717\data\limit\VOC2007\ImageSets\Main\train.txt', 'w')
fval = open(r'G:\科创及比赛\智能车\数据集\VOC格式数据集\7_17\标志物0717\data\limit\VOC2007\ImageSets\Main\val.txt', 'w')

for i in list:
    name = total_xml[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()
生成包含jpg和xml信息的txt文件

运行txt_write.py根据在Main文件夹中划分好的数据集进行位置索引,生成含有图像及对应的XML文件的地址信息的文件。
txt_write.py(不需要修改路径)

import os
import re
import random

devkit_dir = './'
output_dir = './'

def get_dir(devkit_dir,  type):
    return os.path.join(devkit_dir, type)

def walk_dir(devkit_dir):
    filelist_dir = get_dir(devkit_dir, 'ImageSets/Main')
    annotation_dir = get_dir(devkit_dir, 'Annotations')
    img_dir = get_dir(devkit_dir, 'JPEGImages')
    trainval_list = []
    train_list = []
    val_list = []
    test_list = []

    added = set()

    for _, _, files in os.walk(filelist_dir):
        for fname in files:
            print(fname)
            img_ann_list = []
            if re.match('trainval.txt', fname):
                img_ann_list = trainval_list
            elif re.match('train.txt', fname):
                img_ann_list = train_list
            elif re.match('val.txt', fname):
                img_ann_list = val_list
            elif re.match('test.txt', fname):
                img_ann_list = test_list
            else:
                continue
            fpath = os.path.join(filelist_dir, fname)
            for line in open(fpath):
                name_prefix = line.strip().split()[0]
                print(name_prefix)

                added.add(name_prefix)
                #ann_path = os.path.join(annotation_dir, name_prefix + '.xml')
                ann_path = annotation_dir + '/' + name_prefix + '.xml'
                print(ann_path)
                #img_path = os.path.join(img_dir, name_prefix + '.jpg')
                img_path = img_dir + '/' + name_prefix + '.jpg'
                assert os.path.isfile(ann_path), 'file %s not found.' % ann_path
                assert os.path.isfile(img_path), 'file %s not found.' % img_path
                img_ann_list.append((img_path, ann_path))
            print(img_ann_list)

    return trainval_list, train_list, val_list, test_list


def prepare_filelist(devkit_dir, output_dir):
    trainval_list = []
    train_list = []
    val_list = []
    test_list = []

    trainval, train, val, test = walk_dir(devkit_dir)

    trainval_list.extend(trainval)
    train_list.extend(train)
    val_list.extend(val)
    test_list.extend(test)
    #print(trainval)
    with open(os.path.join(output_dir, 'trainval.txt'), 'w') as ftrainval:
        for item in trainval_list:
            ftrainval.write(item[0] + ' ' + item[1] + '\n')

    with open(os.path.join(output_dir, 'train.txt'), 'w') as ftrain:
        for item in train_list:
            ftrain.write(item[0] + ' ' + item[1] + '\n')

    with open(os.path.join(output_dir, 'val.txt'), 'w') as fval:
        for item in val_list:
            fval.write(item[0] + ' ' + item[1] + '\n')

    with open(os.path.join(output_dir, 'test.txt'), 'w') as ftest:
        for item in test_list:
            ftest.write(item[0] + ' ' + item[1] + '\n')


if __name__ == '__main__':
    prepare_filelist(devkit_dir, output_dir)

创建label_list

在这里插入图片描述

下载PaddleDetection包

git clone https://gitee.com/paddlepaddle/PaddleDetection.git

PD0.2完整资源包

修改预训练模型的Configs配置

在PaddleDetection文件夹中操作。

修改num_classes

修改所用模型ssd_mobilenet_v1_voc.yml配置文件,在PaddleDetection-release-0.2\configs\ssd路径下找到配置文件,修改为自己数据集的的num_classes:
num_classes = (label_class) + 1(background)
在这里插入图片描述

修改pascalvoc_label

修改voc.py运行文件,在PaddleDetection-release-0.2\ppdet\data\source路径下找到配置文件,修改
修改为自己模型的label:
在这里插入图片描述到这里就完成了数据集的创建!

上传至AI studio进行训练

在这里插入图片描述

模型训练

PaddleDetcion——红绿灯检测:PaddleDetection-SSD_Mobilenet-VOCdataset

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值