PaddleDetection训练自己的数据集遇到的问题及解决办法

PaddleDetection训练自己的数据集遇到的问题及解决办法

1.使用labelImg标注工具标注自己的数据集得到.xml文件
2.自动创建train.txt、val.txt,这两个文件中储存训练集、验证集 图像的路径信息和对应的xml文件
参考https://blog.csdn.net/yzl819819/article/details/104336990的博客

import os
import random

train_precent=0.7
xml="VOC2012/Annotations"
save="VOC2012/ImageSets/Main"
total_xml=os.listdir(xml)

num=len(total_xml)
tr=int(num*train_precent)
train=range(0,tr)

ftrain=open("VOC2012/ImageSets/Main/train.txt","w")
ftest=open("VOC2012/ImageSets/Main/val.txt","w")

for i in range(num):
    name=total_xml[i][:-4]+"\n"
    if i in train:
        ftrain.write(name)
    else:
        ftest.write(name)

ftrain.close()
ftest.close()
# 备注:在Main文件夹中生成的train.txt文件和val.txt文件仅仅是对数据集的划分,还需要进一步的利用如下代码
# (create_list.py,该代码是paddle提供的)生成含有路径信息以及图像和xml文件一一对应的文件。

import os
import os.path as osp
import re
import random

devkit_dir = 'VOC2012'
years = ['2007', '2012']


def get_dir(devkit_dir,  type):
    return osp.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 = []
    test_list = []
    added = set()

    for _, _, files in os.walk(filelist_dir):
        for fname in files:
            img_ann_list = []
            if re.match('train\.txt', fname):
                img_ann_list = trainval_list
            elif re.match('val\.txt', fname):
                img_ann_list = test_list
            else:
                continue
            fpath = osp.join(filelist_dir, fname)
            for line in open(fpath):
                name_prefix = line.strip().split()[0]
                if name_prefix in added:
                    continue
                added.add(name_prefix)
                ann_path = osp.join(annotation_dir, name_prefix + '.xml')
                img_path = osp.join(img_dir, name_prefix + '.jpg')
                # ann_path = osp.join(name_prefix + '.xml')
                # img_path = osp.join(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))

    return trainval_list, test_list


def prepare_filelist(devkit_dir, output_dir):
    trainval_list = []
    test_list = []
    trainval, test = walk_dir(devkit_dir)
    trainval_list.extend(trainval)
    test_list.extend(test)
    random.shuffle(trainval_list)
    with open(osp.join(output_dir, 'train.txt'), 'w') as ftrainval:
        for item in trainval_list:
            ftrainval.write(item[0] + ' ' + item[1] + '\n')

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


if __name__ == '__main__':
    prepare_filelist(devkit_dir, 'VOC2012/ImageSets/Main')

PaddleDetection训练自己的数据集遇到的问题及解决办法_第1张图片
PaddleDetection训练自己的数据集遇到的问题及解决办法_第2张图片
文件内容大概是这样的
PaddleDetection训练自己的数据集遇到的问题及解决办法_第3张图片
关于路径设置是个需要注意的问题
.yml文件中设置数据集路径如图
PaddleDetection训练自己的数据集遇到的问题及解决办法_第4张图片
查找路径是dataset_dir+anno_path
PaddleDetection训练自己的数据集遇到的问题及解决办法_第5张图片
此外,label_list文件的路径也要注意,首先在PaddleDetection/ppdet/data/source/voc.py这个路径找到voc.py文件,修改路径
PaddleDetection训练自己的数据集遇到的问题及解决办法_第6张图片
查找路径是dataset_dir+label_list

在notebook中训练时,路径要设置为work的上一级

%cd ~/    #进入/home/aistudio

3.遇到的一个错误
PaddleDetection训练自己的数据集遇到的问题及解决办法_第7张图片
错误原因:yml文件中
关键字: 值
注意: 冒号后有空格
4.使用CoCo格式数据集,Infer结果图片中标注的类型错误(使用了默认的类型)在%cd PaddleDetection/路径下
原因是测试集的路径错误,下图为正确写法
PaddleDetection训练自己的数据集遇到的问题及解决办法_第8张图片

你可能感兴趣的:(百度飞桨,学习分享,python,深度学习,机器学习)