目录
1、创建python环境
我的机器配置是,windows10系统下的cpu,毫无gpu。
跑通yolo,需要用到python语言。这里先介绍下安装python环境,如果已经有了直接跳到下一步。
python解释器下载https://www.python.org/downloads/
点击上面链接,选择windows系统,下载python解释器的安装包。
我这里选择的是python版本3.9.7,64位操作系统。
点击 windows installer(64-bit)后,下载的是个exe文件。双击该exe文件,图中两个选项勾选上,选择自定义安装路径(根据自己的习惯选择安装目录)。
下一步,最后等待安装,记得添加环境变量,按自己习惯选择安装目录。
安装成功后,win+r 打开终端,输入python,如下图,就表示安装成功了。
如果不成功,或者想进一步了解python解释器的,可移步到我的另一篇文章。
2、yolov5-7.0下载
可通过下面链接,从官网下载yolov5-7.0版本的代码。
yolov5-7.0链接https://github.com/ultralytics/yolov5/tree/v7.0
我这里下载的是zip包,使用git工具下载也可。
下载解压后,进入yolov5-7.0目录下,直接在该目录下敲入cmd命令,这样可直接以此目录打开终端,省去了win+r打开终端后,在cd进入该目录。
弹出终端后(默认大家已经安装了python解释器),输入下面命令,pip工具一键安装依赖包,这里加上了清华镜像源,速度会比较快。
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
yolov5-7.0版本中,有目标检测,分类,分割三部分的内容。接下来我会分别讲解
3、yolo目标检测
在主目录yolov5-7.0下,这些没有进一步划分目录的文件,大都是目标检测的相关文件。(备注:我这里用的是Pycharm集成工具,大家可自行安装)
首次运行detect.py(yolo目标检测的测试文件),会自动下载yolov5s.pt预训练权重文件,比较慢。大家点击下载链接,这样下载速度较快。
yolov5s.pt模型下载https://github.com/ultralytics/yolov5/releases/download/v7.0/yolov5s.pt
我这里为了方便管理,主目录下新建了目录pre_weights,将下载的预训练权重文件都放在该目录下。对应修改detect.py文件中的默认参数,设备使用的是cpu。
再次运行detect.py,成功后,会将测试图片结果存放于 runs/detect/exp 目录下。
在上面测试中,用的是yolo自己的模型yolov5s,接下来大家可以用自己的数据集训练自己的检测模型。
3.1 数据集准备
数据集分为两种情况,一种是完全未标注的数据,只有原始图片的那种,一般具有私有属性;另外一种是开源数据集,一般都是标注好的。
如果是完全未标注的数据集,可使用labelimg这个工具进行标注。
3.1.1 Labelimg工具标注
labelimg是一个开源的标注工具,在python环境内,安装命令如下:
pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple
安装成功后,以命令方式启动。打开cmd终端,这里python是基础环境,所以无需激活进入虚拟环境。输入labelimg,即可启动。启动后的界面,如下图所示。
点击工具栏中的Open Dir ,选择待标注图片的目录,这里我测试过具有文件夹穿透功能,尽量将所有图片放到同一目录下,且该目录是最后一层目录。点击Change Save Dir,选择标注后存放标签的目录。
设置好后,选择YOLO的标签格式,该工具包含三种标签格式:
YOLO格式(txt文档),可直接用于yolo代码中进行训练
VOC格式(xml文档),如果你有数据和对应的VOC格式的标签,可转成yolo格式,再去训练
CreateMl(json文档),这种格式我见得比较少,大家有需要可自行了解
接下来可对所有图片进行标注,w是画框的快捷键,画完框后可为每个框内物体定义类名,全部标注后记得save。
在保存目录下会生成n个标签文档,1个classes文档 ,标签文档以对应图片的名称命名。我这只标注了一张图像,所以只有一个标签文档。
其中,classes文档中记录了所有标签 (本次标注过程中出现的所有标签)。
每一个标签文档 m行5列,m表示该图片中的目标框个数。每一行的固定格式如下,标签号,表示框位置的坐标(x,y,w,h)。yolo中训练时会将标签全部映射为序号进行训练,所以这里的标签号等同于标签。坐标都是基于图片大小进行归一化后的。
3.2 检测训练
将标注好的数据(图片和标签),放到yolov5.0-7.0目录下。我这里是在data目录下创建了一个新目录mydata,该目录下又新建了images(存放图片文件)和labels(存放yolo格式的标签文档)目录,大家可按自己的习惯创建目录,后面代码中写清楚就行。
3.2.1 划分训练和测试集
接下来,需要生成训练、验证以及测试集的文档,比例以8:1:1。我这还是按照上面目录,大家需要根据自己的目录,自行更改。
import os
import random
#数据集根目录,大家可根据自己的目录路径修改
root_path = 'F:\Amode\yolov5-7.0\data\mydata'
#训练,验证和测试比例,8:1:1
train_precent = 0.8
val_percent = 0.1
test_percent = 0.1
#图片目录和标签目录
img_path = os.path.join(root_path,'images')
txt_path = os.path.join(root_path,'labels')
#图片总数量,图片和标签一一对应,数量一致,命名一致
imgname_list = os.listdir(img_path)
nums = len(imgname_list)
#根据比例确定不同集合的数据数量
train_num = int(nums * train_precent)
val_num = int(nums * val_percent)
test_num = int(nums * test_percent)
#根据数量,随机分配数据
train_index = random.sample(range(nums),train_num)
vt_index = set(range(nums))-set(train_index)
val_index = random.sample(list(vt_index),val_num)
test_index = list(set(vt_index)-set(val_index))
#分别写入
with open(os.path.join(root_path,'train.txt'),'w') as f:
for i in train_index:
name = imgname_list[i]
path = os.path.join(img_path,name)
f.write(path)
f.write('\n')
with open(os.path.join(root_path,'val.txt'),'w') as f:
for i in val_index:
name = imgname_list[i]
path = os.path.join(img_path, name)
f.write(path)
f.write('\n')
with open(os.path.join(root_path,'test.txt'),'w') as f:
for i in test_index:
name = imgname_list[i]
path = os.path.join(img_path, name)
f.write(path)
f.write('\n')
执行完上面代码,会将生成的文件放置于数据目录 data/mydata下。
在每个txt文档中,描述的是每张图片的绝对路径 。
3.2.2 创建yaml训练文件
在data目录下,创建一个新的yaml文件(复制该目录下的coco.yaml文件重新命名即可),我这里命名为mydata.yaml。
该yaml文件只需要如下图片中的内容,其余的都可注释掉。这里的相对路径以及类别标签,大家还是得根据自己的情况修改。
如果和我创建的目录一致,图中上面红框中的内容直接照抄就可了,下面的类别标签呢,按照你数据集中label目录下的classes文档依次填写,前面的序号保留。
path: 数据集的根目录,相对于yolov5.0-7.0主目录的相对路径
train/val/test:是相对于path的路径
3.2.3 修改模型配置文件
yolo的模型配置文件在models目录下,提供了x,s,n,m,l五个版本,是逐渐增大的(模型越大,训练时间也越长),根据要使用的预训练权重文件,更改其中的nc(类别数量)参数。
我们之前下载过yolov5s,也是准备要用的,所以修改的是对应的yolov5s.yaml文件,nc为3。
3.2.4 训练和测试
主目录下的train.py,就是目标检测的训练脚本。
两种方式,一种是直接其中的默认参数;另一种则是在运行train.py文件时,直接用命令的方式进行赋值,其中:
--weights :加载预训练权重文件的路径
--data:训练数据集的yaml文件
--epoch:训练轮数,如果只是测试,设置小点就行
--batch-size:每一轮训练,分几个批次喂数据,和机器配置有关,尽量小点
下图是直接train.py中修改参数的默认值,修改后,可直接执行train.py脚本就行。
下面是使用命令的方式执行train.py脚本,并对参数进行赋值。
python train.py --weights=./'model'/'yolov5s.pt' --cfg=./data/mydata.yaml'
训练之后的文件默认是放在 run/train/exp 目录下,模型放在该目录下的weights目录下。
如果想测序下新模型的效果,执行主目录下的detect.py脚本 ,前面有讲解过。里面一些参数可能需要修改。
weights是要用到的推理模型路径,用我们自己新训练出来的模型,source是要测试的图片路径。
4、yolo目标分类
主目录下的classify文件夹中的所有文件都是用于分类的。其中,predict.py就是预测,也是测试。
和目标检测一样的套路,大家可以先运行测试脚本,会自动下载预训练模型,还是推荐手动下载。
yolov5s-cls模型https://github.com/ultralytics/yolov5/releases/download/v7.0/yolov5s-cls.pt我这里还是将下载的模型放在了自己创建的pre_weights目录下,上面已经说过了。
4.1 数据集准备
数据呢,还是分两种,私有和开源数据集。分类数据集不同于目标检测数据集需要标注,分类的只需要人工将同一类的数据挑选出来放置到同一文件夹内,并为该类定义一个类名。
接下来我就以手写数字识别开源数据集mnist为例。
mnist数据集https://github.com/ultralytics/yolov5/releases/download/v1.0/mnist.zip大家想下载一些开源的分类数据集,修改classify/train.py 中的data参数,执行该脚本,会自动下载数据集,这种速度比较慢,大家可点击链接直接下载。图中链接后面表示将数据压缩包,下载到该指定文件夹。
我这里就直接按图中提示的目录,放置并解压下载到的数据集mnist。
打开mnist数据集目录,有train和test。无论是训练还是测试,里面都按文件夹序号归好类了,mnist数据集比较特殊,本身就是手写数字0-9的分类识别,所以文件夹的命名正好是类名。
4.2 分类训练
yolo分类训练比较简单,不需要yaml文件,直接执行train.py脚本即可。这里还是需要修改一些参数,比如预训练权重路径,一开始没有自己的模型,都是用yolo官方的模型作为预训练权重。
epochs和batch-size根据自己的硬件性能设置。
训练后的模型,默认存在 runs/train-cls/weights 目录下。
训练后的模型,大家可用predict进行测试。不同于目标检测,分类训练无需yaml文件,但是测试需要yaml文件。
这里给大家解释下为什么?
训练时,送入的分类数据集的类名多以序号(0,1,2,...)命名,模型学习和推理的其实是当前目标属于第几类的概率,所以模型最终能告诉你的是第几类,而不是真正的类名。
这时就需要有个类名映射文件,将模型推理出来的第几类,转换成真正的类名输出。
yolo这里的分类yaml文件,参考data/coco128.yaml文件。直接复制该文件重新命名,我这里命名为mnist.yaml,并修改其中的内容。
mnist数据集比较特殊,类名和序号一致。
修改好mnist.yaml文件后,开始测试,记得修改predict中的 要用的weights参数(模型路径),测试图,以及data参数。
我这里模型和测试图片懒得改了,大家要改成自己训练出来的模型路径,以及测试的手写数字图像,要不分类模型看不到效果。
5、yolo目标分割
这部分内容后期会补上,大家有兴趣的可自行上手,其实和检测,分类步骤类似。