目录
针对刚刚入门,本文旨在以最简单粗暴的方式跑起YOLOV5的模型训练与预测代码,暂时不对其原理做解析。针对学习的内容进行的总结,后续根据情况会持续更新。
操作系统:win10
python:3.8.10(64bit)
开发环境:eclipse
yoloV5:github原下载地址
图片标注标注工具:labelImg——labelImg工具原github下载地址
无需配置环境,可直接使用的labelImg.exe文件包——下载地址
注意,原VOLO作者关于python版本有提到:
python必须是大于等于3.7版本,pyTorch在下面执行自动安装库时,会自动安装最新版本的,所以不用担心。
打开yoloV5文件夹,找到requirements.txt文件,里面有需要下载的库
然后打开cmd
cmd——cd 到requirements.txt所在文件——执行pip install -r requirements.txt
就能自动完成安装。本文为了方便管理库,我是把requirements.txt复制粘贴到了
C:Users…AppDataLocalProgramsPythonPython38Libsite-packages中进行的安装
图片标注——labelImg工具的使用:
点击Open dir选择我们训练图片所在的文件夹images,选择之后会弹窗让你选择labels所在的文件夹。labels文件夹需要自己建立,名字随意,目的是用来存储图片标注后的信息。如果第二个弹窗没有弹出或者选错了,可以点击change save dir进行修改。以下是本文案例样式。
最后A.yaml是YOLO训练数据的信息文件,也是需要自己建立,里面内容后面讲解。
常用快捷键:w,a,d
w——创建一个检测box,就是方框
a——前一张图片
d——下一张图片
Ctrl + s——保存结果,先前View中勾选了Auto Save mode后,只需框选,然后下一张,就能自动保存
框选错误可以通过EditRectBox来删除,选中错误框后,按delete
标记完成后,我们就能在labels文件夹下面看到标注的数据了。
最后还需要编辑A.yaml文件
编辑内容:
# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: D:/mvsd/yolo_test/images
val: D:/mvsd/yolo_test/images
# number of classes
nc: 1
# class names
names: ['A dog']
其中需要自己修改的内容为:
train与val后的地址,地址均指向训练图集的文件夹。以及names后的内容,类名这些。
至此训练模型的数据就准备好了。
3.1eclipse打开VOLO的工作站
找到yolov5-master文件夹即可
3.2在yolov5-master工作站中新建py文件,并执行代码
import train
if __name__ == '__main__':
train.run(data='C:\yolov5-master\tese_data\yolo_dog\A.yaml',
batch=8,epochs=300,single_cls=True,
weights='C:\yolov5-master\tese_data\yolo_dog\yolov5s.pt')
train中部分参数详解:
data 数据集配置文件路径
imgsz 训练测试图片分辨率
single_cls 训练集是否只有一个类别
训练参数只能参考,具体还需根据自身情况经行调整。
模型训练完后,会显示结果保存的地方,如图:
我这里虽然有乱码,但保存的地方就是yolov5-master uns rainexp463
模型保存地方也就是weights这文件夹里。我的模型训练样本数有150张狗狗的照片。
import detect
if __name__ == '__main__':
detect.run(weights="C:\yolov5-master\runs\train\exp463\weights\best.pt",
data="C:\yolov5-master\tese_data\yolo_dog\A.yaml",
conf_thres=0.25,view_img=True,nosave=True,
source='D:\mvsd\test\0.JPG')
while 1:
pass
weights:训练的权重
source:测试数据,可以是图片/视频路径,也可以是’0’(电脑自带摄像头),也可以是rtsp等视频流
output:网络预测之后的图片/视频的保存路径
img-size:网络输入图片大小
conf-thres:置信度阈值(检测精度,作者是设置的0.25)
iou-thres:做nms的iou阈值(),从这些框框中选出最优最准确的框。
device:设置设备
view-img:是否展示预测之后的图片/视频,默认False
save_txt:是否将预测的框坐标以txt文件形式保存,默认False
save_conf:是否将预测的置信度以txt文件形式保存,默认Falses
save_crop:是否将框中图片保存,默认False
nosave:是否保存结果,默认False
classes:设置只保留某一部分类别,形如0或者0 2 3
agnostic-nms:进行nms是否也去除不同类别之间的框,默认False
augment:推理的时候进行多尺度,翻转等操作(TTA)推理
update:如果为True,则对所有模型进行strip_optimizer操作,去除pt文件中的优化器等信息,默认为False
效果如图:
原detect代码里面有保存结果的参数,即save_txt以及save_conf等,将这两个参数设置为True后,能在预测的文件里面找到中心坐标以及置信度了,比如:
保存的地方就是yolov5-master unsdetectexp系列的文件里面。
如果要单独提取结果,就需要对源代码进行部分修改,首先我们在detect.py里面找到:
其中xywh就是框坐标的内容,即中心xy以及宽高。conf就是置信度。但要注意,原代码是建立在save_txt=True的基础上,也就意味着每次调用detect代码,都会在runsdetect里面新建exp文件,随着时间增加就会越建越多,需要清理。所以在不需要将结果保存到文件夹里面时,最好的办法就是将:
代码放在if前面,同时nosave=True即可。我的做法是添加代码:
xywh_result = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(-1).tolist() # normalized xywh
xywh_result.append(conf.item())
即:
最后可以在代码末端加入return xywh_result就能直接返回结果了。(上传的yoloV5分流文件中已经做好了修改)
通过上述方法返回的中心坐标是经过转换过后的坐标,不是原图片上的坐标。就和我们标注过后储存在labels里面的坐标一样,是有一定的差别需要转换的。
以下是我补充的内容:找寻框坐标,即框中图片范围以数字形式表示出来。这个内容用参数save_crop也能提取出框的图片。
找到代码:
这里xyxy参数就是我们框在原图中的实际范围。 print一下该参数能得到类似以下的列表:
[tensor(258.), tensor(26.), tensor(601.), tensor(352.)]
tensor里面的数据就是框的范围,含义如图:
图片左上角为原点,列表[左上y,左上x,右下y,右下x]
这个数据可以由以下代码验证:
#pip install matplotlib
import matplotlib.pyplot as plt # plt 用于显示图片
import matplotlib.image as mpimg # mpimg 用于读取图片
st='D:\mvsd\test\0.JPG'
lena = mpimg.imread(st)
lena=lena[26:352,258:601]
plt.imshow(lena)
plt.show()
效果如图:
打包exe文件用的是pyinstaller库,具体打包方法就不赘述了,在打包过程中我遇到的坑,进行一下介绍。
打包过程中出现报错:
问题原因是出在编码错误 ,在确认自己写的主文件中无乱码时,尝试了各种办法,包括首行添加代码:# coding: utf-8,均无效。经排查发现,原代码detect.py中开头注释出现了乱码:
删掉该注释才能成功打包成exe文件。
同样在train.py中也有, 如果自己的主代码有引用train.py,同样也要删除才能成功打包。