赞
踩
PaddlePaddle/PaddleDetection
release/2.2
注意:安装用 conda
conda install paddlepaddle-gpu==2.2.2 cudatoolkit=11.2 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/ -c conda-forge
在该路径下: PaddleDetection-release-2.2/dataset/voc/
annations:存放xml的标签文件
images: 存放对应的图片文件
创建生成相关文件的代码 get_list.py
# -- coding: UTF-8 -- import os import random trainval_percent = 0.9 train_percent = 0.9 xml = "/app/yyq/slifeProject/paddle/PaddleDetection-release-2.2/dataset/voc/annotations" save_path = "/app/yyq/slifeProject/paddle/PaddleDetection-release-2.2/dataset/voc/ImageSets/Main" if not os.path.exists(save_path): os.makedirs(save_path) total_xml = os.listdir(xml) 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) print("train and val size", tv) print("traub size", tr) ftrainval = open(os.path.join(save_path, 'trainval.txt'), 'w') ftest = open(os.path.join(save_path, 'test.txt'), 'w') ftrain = open(os.path.join(save_path, 'train.txt'), 'w') fval = open(os.path.join(save_path, '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()
得到结果如下图:
voc数据集是20个类别
# -- coding: UTF-8 -- import os import os.path as osp import re import random devkit_dir = './' 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, 'images') 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') 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, 'trainval.txt'), 'w') as ftrainval: for item in trainval_list: ftrainval.write(item[0] + ' ' + item[1] + '\n') with open(osp.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, '.')
运行create_list.py会生成test.txt和traintval.txt
以下是trainval.txt的文件截图
PaddleDetection-release-2.2/configs/yolov3/yolov3_mobilenet_v1_270e_voc.yml配置文件摘要
从上图看到yolov3_mobilenet_v1_270e_voc.yml配置需要依赖其他的配置文件。在该例子中需要依赖:
voc.yml
runtime.yml
optimizer_270e.yml
yolov3_mobilenet_v1.yml
yolov3_reader.yml
yolov3_mobilenet_v1_270e_voc 文件入口
voc 主要说明了训练数据和验证数据的路径
runtime.yml 主要说明了公共的运行参数,比如说是否使用GPU、每多少个epoch存储checkpoint等
optimizer_270e.yml 主要说明了学习率和优化器的配置。
yolov3_mobilenet_v1.yml 主要说明模型、和主干网络的情况。
yolov3_reader.yml 主要说明数据读取器配置,如batch size,并发加载子进程数等,同时包含读取后预处理操作,如resize、数据增强等等
yolov3_mobilenet_v1_270e_voc.yml1:主配置文件入口
voc.yml:定义训练数据的路径
runtime.yml:定义公共参数
optimizer_270e.yml:定义优化器的策略
yolov3_mobilenet_v1.yml:定义模型和主干网络
yolov3_reader.yml:定义数据预处理方式
训练可视化
当打开use_vdl开关后,为了方便用户实时查看训练过程中状态,PaddleDetection集成了VisualDL可视化工具,当打开use_vdl开关后,记录的数据包括:
1.loss变化趋势
2.mAP变化趋势
python tools/train.py -c configs/yolov3/yolov3_mobilenet_v1_270e_voc.yml --use_vdl=true --vdl_log_dir=vdl_dir/scalar
使用如下命令启动VisualDL查看日志
# 下述命令会在127.0.0.1上启动一个服务,支持通过前端web页面查看,可以通过--host这个参数指定实际ip地址
visualdl --logdir vdl_dir/scalar/
在浏览器输入提示的网址,效果如下:
python tools/eval.py -c configs/yolov3/yolov3_mobilenet_v1_270e_voc.yml -o weights=output/yolov3_mobilenet_v1_270e_voc/model_final.pdparams
python tools/infer.py -c configs/yolov3/yolov3_mobilenet_v1_270e_voc.yml --infer_img=demo/005767.jpg -o weights=output/yolov3_mobilenet_v1_270e_voc/model_final.pdparams
参考官网
注:更换主干网络的配置文件,暂时不用修改其他参数
# 训练
python tools/train.py -c configs/yolov3/yolov3_darknet53_270e_voc.yml --use_vdl=true --vdl_log_dir=vdl_dir/scalar
# 评估
python tools/eval.py -c configs/yolov3/yolov3_darknet53_270e_voc.yml -o weights=output/yolov3_darknet53_270e_voc/model_final.pdparams
# 预测
python tools/infer.py -c configs/yolov3/yolov3_darknet53_270e_voc.yml --infer_img=demo/005767.jpg -o weights=output/yolov3_darknet53_270e_voc/model_final.pdparams
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。