基于Paddle和YOLOv5实现 车辆检测
基于yolov5和paddle实现车辆检测,
本项目提供3个预测训练模型,分别为YOLOv5s, YOLOv5m,YOLOv5l ,如果需要其他模型在百度云盘下载。
本项目分为4类,的分别为car,bus,van,others
可食用VisualDL服务工具,对训练各项数据进行实时可视化输出。
1 YOLOv5训练数据集准备
解压数据集并移动到工作目录
#解压数据集
!ls /home/aistudio/data
!unzip -q /home/aistudio/data/data55670/VOCData.zip
!mv VOCData VOCdata
#将数据集移动到工作区
!mv /home/aistudio/VOCdata /home/aistudio/work/
%cd /home/aistudio/work/VOCdata
#重命名图片文件夹
!mv JPEGImages images
执行下面两段代码来将VOC格式数据集转换成YOLOV5标准格式
#第一段代码,划分训练集,验证集和测试集
%cd /home/aistudio/work/VOCdata #切换到VOC数据目录
import os #导入操作系统模块
import random #导入随机数模块
#设置数据集划分比例
trainval_percet = 0.1 #训练验证集占总数据的比例 10%
train_percent=0.9 #训练集占训练验证集的比例 90%
#定义XML标注文件路径
xmlfilepath='/home/aistudio/work/VOCdata/Annotations' #XML标注文件存放地址
#创建ImageSets目录 如果不存在
if not os.path.exists('ImageSets/'):
os.makedirs('ImageSets') #创建多集目录
#创建所有XML文件列表
total_xml = os.listdir(xmlfilepath) #列出目录下所有文件
num=len(total_xml) #计算XML文件总数
list=range(num) #创建0到num - 1的索引列表
#计算划分量
tv = int(num * trainval_percent) #训练验证集数量
tr = int(tv * train_percent) #训练集数量(占训练验证集的比例)
#随机抽样
trainval = random.sample(list, tv) #从总样本中随机抽取训练验证集
train = random.sample(trainval, tr) #从训练验证集中随机抽取训练集
#打开文件准备写入
ftrainval = open('ImageSets/trainval.txt', 'w') #训练验证集文件
ftest = open('ImageSets/test.txt', 'w') #测试集文件
ftrain = open('ImageSets/train.txt', 'w') #训练集文件
fval = open('ImageSets/val.txt', 'w') #验证集文件
#遍历所有样本
for i in list:
#生成文件名 去掉xml扩展名
name = total_xml[i][:-4] + '\n' #文件名 + 换行符 -4个符号
#根据样本所属集合写入不同文件
if i in trainval: #如果现在训练验证集中
ftrainval.write(name) 写入训练验证集文件
if i in train: #如果在训练集中
ftest.write(name ) #写入测试集文件
else: 否则在验证集中
fval.write(name) #写入验证集文件
else: #如果不在训练验证集中
ftrain.write(name) #写入训练集文件
#关闭所有文件
ftrainval.close()
ftest.close()
ftrain.close()
fval.close()
#第二段代码,将VOC格式转换成YOLO格式
%cd /home/aistudio/work/VOCdata #切换到VOC数据目录
import xml.etree.ElementTree as ET #导入XML解析模块
import pickle #导入序列化模块
import os #导入操作系统模块
from os import listdir, getcwd #导入目录操作函数
from os.path import join #导入路径链接函数
#定义数据集划分类型
sets = ['train','test','val']#训练集,测试集,验证集
#定义路径
Imgpath='/home/aistudio/work/VOCdata/images' #图片文件目录路径
xmlfilepath='/home/aistudio/work/VOCdata/Annotations' #XML标注文件路径
ImageSets_path='ImageSets/' #数据集划分文件路径
#定义类别列表
def convert(size, box):
坐标转换函数
size: (width, height) 图片尺寸
box: (xmin, xmax, ymin, ymax)边界框坐标
dw = 1./size[0] #宽度归一化因子
dh = 1./size[2] #高度归一化因子
#计算中心点坐标
x=(box[0] + box[1])/2.0 x为中心点
y =(box[2] + box[3])/2.0 y中心点
#计算宽度和高度
w = box[1] - box[0] # 边界框宽度
h = box[3] - box[2] # 边界框高度
#归一化坐标
x =x * dw 归一化x中心点
w =w *dw 归一化宽度
y=y * dh 归一化y中心点
h = h * dh 归一化高度
return (x,y,w,h) 返回YOLO格式坐标
#定义标准转换函数
def convert_annotation(image_id):
转换单个XML标注文件
image_id 图像文件名 不含扩展名
#打开XML文件
in_file = open(xmlfilepath + '%s.xml'%(image_id))
#创建对应的YOLO格式标签文件
out_file = open('labels/%s.txt' % (image_id), 'w')
#解析XML
tree = ET.parse(in_file)
root = tree.getroot()
#获取图像尺寸
size = root.find('size')
w = int(size.find('width').text) #图像宽度
h = int(size.find('height').text) #图像高度
#遍历所有目标对象
for obj in root.iter('object')
difficult = obj.find('difficult'.text) #获取难度标记
cls = obj.find('name').text #获取类别名称
#跳过不需要的类别或者困难样本
if cls not in classes or int(difficult) == 1:
continue;
#获取类别ID
cls_id = classes.index(cls)
#获取边界框坐标
xmlbox = obj.find('bndbox')
b = (float(xmlbox.find('xmin').text), #xmin
float(xmlbox.find('xmax').text), #xmax
float(xmlbox.find('ymin').text, #ymin
float(xmlbox.find('ymax').text, #ymax)))
#转换为YOLO格式
bb = convert((w,h),b)
#写入标签文件:类别ID + 归一化坐标
out_file.write(str(cls_id) + "" + "".join([str(a) for a in bb]) + '\n')
#获取当前工作目录
wd = getcwd()
print(wd) #打印当前工作目录
#处理每个数据集划分
for image_set in sets:
#创建labels目录 如果不存在
if not os.path.exists('labels/'):
os.makedirs('labels/')
#读取划分文件中的图像ID列表
image_ids = open(ImageSets + '%s.txt'%(image_set)).read().strip().split()
#创建图像路径列表文件
list_file = open('%s.txt' % (image_set), 'w')
#处理每个图像
for image_id in image_ids:
#写入图像绝对路径
list_file.wrote(Imgpath + '/%s.jpg\n'%(image_id))
#转换对应的XML标注
convert_annotation(iamge_id)
#关闭文件
list_file.close()
关键功能说明
第一段代码 数据集划分
1 将数据集划分为
训练验证集10%
剩余作为训练集 90%
2 训练验证集再细分为
训练子集 占训练集征集的90%
验证子集 占训练集的10%
3 生成四个文件
trainval.txt 所有训练验证集样本
test.txt 训练子集样本
train.txt 非训练验证集样本 主训练集
val.txt 验证子集样本
第二段代码 格式转换
1 对每个数据集划分 train/test.val
创建图像路径列表文件 .txt
将VOC XML标注转换为YOLO格式的标签文件
2 转换过程
解析XML文件获取目标信息
过滤非目标类别和困难样本
将边界框坐标转换为YOLO格式,归一化中心点 + 宽高
每个目标保存为一行 class_id center_x center_y width, height
3 最终生成
train.txt/test.txt/val.txt 包含图像绝对路径
labels 目录,包含每个图像对应的YOLO格式标签文件