• Paddlepaddle使用自己的VOC数据集训练目标检测(0废话简易教程)


    一 安装paddlepaddle和paddledection(略)

    笔者使用的是自己的数据集

    二 在dataset目录下新建自己的数据集文件,如下:

    其中

    xml文件内容如下:

    另外新建一个createList.py文件

    1. # -- coding: UTF-8 --
    2. import os
    3. import os.path as osp
    4. import re
    5. import random
    6. devkit_dir = '../smoke/'
    7. years = ['2007', '2012']
    8. def get_dir(devkit_dir, type):
    9. return osp.join(devkit_dir, type)
    10. def walk_dir(devkit_dir):
    11. filelist_dir = get_dir(devkit_dir, 'ImageSets/Main')
    12. annotation_dir = get_dir(devkit_dir, 'annotations')
    13. img_dir = get_dir(devkit_dir, 'images')
    14. trainval_list = []
    15. test_list = []
    16. added = set()
    17. for _, _, files in os.walk(filelist_dir):
    18. for fname in files:
    19. img_ann_list = []
    20. if re.match('train\.txt', fname):
    21. img_ann_list = trainval_list
    22. elif re.match('val\.txt', fname):
    23. img_ann_list = test_list
    24. else:
    25. continue
    26. fpath = osp.join(filelist_dir, fname)
    27. for line in open(fpath):
    28. name_prefix = line.strip().split()[0]
    29. if name_prefix in added:
    30. continue
    31. added.add(name_prefix)
    32. ann_path = osp.join(annotation_dir, name_prefix + '.xml')
    33. img_path = osp.join(img_dir, name_prefix + '.jpg')
    34. assert os.path.isfile(ann_path), 'file %s not found.' % ann_path
    35. assert os.path.isfile(img_path), 'file %s not found.' % img_path
    36. img_ann_list.append((img_path, ann_path))
    37. return trainval_list, test_list
    38. def prepare_filelist(devkit_dir, output_dir):
    39. trainval_list = []
    40. test_list = []
    41. trainval, test = walk_dir(devkit_dir)
    42. trainval_list.extend(trainval)
    43. test_list.extend(test)
    44. random.shuffle(trainval_list)
    45. with open(osp.join(output_dir, 'trainval.txt'), 'w') as ftrainval:
    46. for item in trainval_list:
    47. ftrainval.write(item[0] + ' ' + item[1] + '\n')
    48. with open(osp.join(output_dir, 'test.txt'), 'w') as ftest:
    49. for item in test_list:
    50. ftest.write(item[0] + ' ' + item[1] + '\n')
    51. if __name__ == '__main__':
    52. prepare_filelist(devkit_dir, '../smoke')

    一个data2tarin.py文件:

    1. # -- coding: UTF-8 --
    2. import os
    3. import random
    4. trainval_percent = 0.9
    5. train_percent = 0.9
    6. xml = r"D:\Coding\PaddleDetection-release-2.7\dataset\smoke\annotations"
    7. save_path = r"D:\Coding\PaddleDetection-release-2.7\dataset\smoke\ImageSets\Main"
    8. if not os.path.exists(save_path):
    9. os.makedirs(save_path)
    10. total_xml = os.listdir(xml)
    11. num = len(total_xml)
    12. list = range(num)
    13. tv = int(num * trainval_percent)
    14. tr = int(tv * train_percent)
    15. trainval = random.sample(list, tv)
    16. train = random.sample(trainval, tr)
    17. print("train and val size", tv)
    18. print("traub size", tr)
    19. ftrainval = open(os.path.join(save_path, 'trainval.txt'), 'w')
    20. ftest = open(os.path.join(save_path, 'test.txt'), 'w')
    21. ftrain = open(os.path.join(save_path, 'train.txt'), 'w')
    22. fval = open(os.path.join(save_path, 'val.txt'), 'w')
    23. for i in list:
    24. name = total_xml[i][:-4]+'\n'
    25. if i in trainval:
    26. ftrainval.write(name)
    27. if i in train:
    28. ftrain.write(name)
    29. else:
    30. fval.write(name)
    31. else:
    32. ftest.write(name)
    33. ftrainval.close()
    34. ftrain.close()
    35. fval.close()
    36. ftest .close()

    运行以上两个脚本,结果如图:

    新建label_list.txt文件,内容如下,为标签文件:

    三 新建smoke.yml文件

    内容如下:

    1. metric: VOC
    2. map_type: 11point
    3. num_classes: 4
    4. TrainDataset:
    5. name: VOCDataSet
    6. dataset_dir: dataset/smoke
    7. anno_path: trainval.txt
    8. label_list: label_list.txt
    9. data_fields: ['image', 'gt_bbox', 'gt_class', 'difficult']
    10. EvalDataset:
    11. name: VOCDataSet
    12. dataset_dir: dataset/smoke
    13. anno_path: test.txt
    14. label_list: label_list.txt
    15. data_fields: ['image', 'gt_bbox', 'gt_class', 'difficult']
    16. TestDataset:
    17. name: ImageFolder
    18. anno_path: dataset/smoke/label_list.txt

    主要修改num_classes以及dataset_dir和anno_path

    四 修改yolov3.yml文件,内容如下:

    主要修改第一行

    五 运行

    六 大功告成

    七 推理

    修改yolov3.yml文件

    主要修改weights文件地址

    运行

    输出到output文件夹中

  • 相关阅读:
    AI 绘画 | Stable Diffusion 高清修复、细节优化
    15-55V输入自动升降压 光伏MPPT自动跟踪充电方案 大功率300瓦
    代码层面探索前端性能
    c#设计模式-行为型模式 之 状态模式
    调试工具记录
    Java_题目_身份证号码信息查看
    解决Redis、MySQL缓存双写不一致问题
    我赢助手小技巧:学会这三招,爆款内容视频完播率提高50%(下)
    k8s 1.28版本二进制安装
    【代码随想录】二刷-双指针法
  • 原文地址:https://blog.csdn.net/Candy_Rainbow_/article/details/136195490