一、配置训练集文件:
1、在paddledetection文件夹下的dataset创建my_data文件夹
2、按图示创建对应的Annotations(存放标注后的xml)
3、JPEGImages存放照片
4、label_list.txt照片分类的种类
5、利用create_data_list.py生成trainval.txt和test.txt(test空的不要紧,但trainval必须要这种格式) 代码在最下面!!!!!!!!
- 修改voc.yml的路径
使用的是yolov3_mobilenet_v1_270e_voc.yml
位置在PaddleDetection/configs/yolov3/yolov3_mobilenet_v1_270e_voc.yml
1、需要修改voc.yml()
位置在PaddleDetection\configs\datasets\voc.yml
只需要改框中对应的路径。
num_classes 表示分类的种类数量。跟前面的label_list.txt数量对应。
2.修改yolov3_reader.yml
其位置在
PaddleDetection\configs\yolov3\_base_\yolov3_reader.yml
根据显卡的性能更改batch_size的数量为(2,4,8……)我的3050ti最多一次4张。
- 开始训练
1.进入搭好的环境及文件夹
1、在终端中输入
python tools/train.py -c configs/yolov3/yolov3_mobilenet_v1_270e_voc.yml
出现下图即成功,若只停在[ppdet.utils.checkpoint INFO: Finish loading modelweights:C:\Users\26026/.cache/paddle/weights\MobileNetV1_pretrained.pdparams]则说明batch_size需要改小。
第一次训练会出现报错!
这个报错缺少zlibwapi.dll
需要下载:http://www.winimage.com/zLibDll/
然后解压缩
这个都会吧?
然后把 zlib123dllx64\dll_x64\zlibwapi.dll 移到 cuda的目录下,我的目录是 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\bin
训练结束后:
会生成在paddledetection/output/yolov3_mobilenet_v1_270e_生成model_final.pdparams文件
- 使用训练集
- 将要分类的照片存放在paddledetection/demo中
2.输入python tools/infer.py -c configs/yolov3/yolov3_mobilenet_v1_270e_voc.yml -o weights=output/yolov3_mobilenet_v1_270e_voc/model_final.pdparams --infer_dir=demo
结束后可在output中找到已分类的照片
出现以下图片即成功。
因为我们训练的较少,所以效果不是很好。
create_data_list.py:
import os
import random
import xml.etree.ElementTree
from tqdm import tqdm
# 打乱数据
def shuffle_data(data_list_path):
with open(data_list_path, 'r', encoding='utf-8') as f:
lines = f.readlines()
random.shuffle(lines)
with open(data_list_path, 'w', encoding='utf-8') as f:
f.writelines(lines)
# 生成图像列表
def create(images_dir, annotations_dir, train_list_path, test_list_path, label_file):
f_train = open(train_list_path, 'w', encoding='utf-8')
f_test = open(test_list_path, 'w', encoding='utf-8')
f_label = open(label_file, 'w', encoding='utf-8')
label = set()
images = os.listdir(images_dir)
i = 0
for image in tqdm(images):
i += 1
annotation_path = os.path.join(annotations_dir, image[:-3] + 'xml').replace('\\', '/')
image_path = os.path.join(images_dir, image).replace('\\', '/')
if not os.path.exists(annotation_path):
continue
root = xml.etree.ElementTree.parse(annotation_path).getroot()
for object in root.findall('object'):
label.add(object.find('name').text)
if i % 20 == 0:
f_test.write(
"%s %s\n" % (image_path[image_path.find('/') + 1:], annotation_path[annotation_path.find('/') + 1:]))
else:
f_train.write(
"%s %s\n" % (image_path[image_path.find('/') + 1:], annotation_path[annotation_path.find('/') + 1:]))
for l in label:
f_label.write("%s\n" % l)
f_train.close()
f_test.close()
f_label.close()
# 打乱训练数据
shuffle_data(train_list_path)
print('create data list done!')
if __name__ == '__main__':
create('./JPEGImages', './Annotations', './trainval.txt', './test.txt', './label_list.txt')