Yolov5自学笔记之一–从入门到入狱,功能强大不要乱用(实现yolov5的基本功能使用流程及训练自己的数据集)
1、下载安装
前提是安装好Anaconda3和pytorch等一大堆AI学习相关环境
1.1、下载YOLO5源码
提取码:ig02
–来自百度网盘超级会员V3的分享
1.2、下载Yolov5预训练模型:
Github地址:
自己的网盘地址(主要的五个模型:):yolov5l.pt yolov5m.pt yolov5n.pt yolov5s.pt yolov5x.pt
链接:https://pan.baidu.com/s/16Y8RGVvfAPKE9W9dsAtwGA
提取码:iysu
–来自百度网盘超级会员V3的分享
不同模型训练的效果和精度不一样,其中yolov5s文件最小只有14M,速度最快,但是精度较低,其实应付一般的使用也足够了。yolov5x精度最高,当然文件也大,速度也慢。以下是官方给出的效率图:
1.3、安装
源码下完后,解压YOLOV5源文件,这个直接就是一些py文件,可以直接用了。目录如下:
然后开始安装Yolov5所需模块,从Anaconda3进入命令行,进入上面的 YOLOV5目录,里面有个requirements.txt文件,集成了所需的环境模块,直接pip install -r requirements.txt,等待安装完成即可。
python -m pip install -r requirements.txt
这个过程可能比较长,尤其网络要好,其中还要装cuda,可以参考网上一些cuda的安装教程,最好提前先安装好。
2、测试
都安装完毕后,可以调用官方的detect.py文件看看是否工作(先要把权重文件放在yolov5目录下,我这里用的yolov5s.pt)
python detect.py --source 0 # webcam
file.jpg # image
file.mp4 # video
path/ # directory
path/*.jpg # glob
'https://youtu.be/NUsoVlDFqZg' # YouTube video
'rtsp://example.com/media.mp4' # RTSP, RTMP,
这其中,source表示准备输入预测的文件源,0是本机摄像头,file.jpg是图片,file.mp4是视频
还可以支持视频流,比如YouTube的视频,RTMP的视频
2.1、测试图片
两种方式:
一种是命令行:
python detect.py --source ./data/image/bus.jpg
调用官方image文件夹里自带的 bus.jpg,看下效果
英文单词是类别,后面的数字是置信度,即它是这个类别的可能性
另一种,直接在VSCODE等环境里运行 detect,会把image文件夹下所有图片都识别一下。
程序会在runs文件夹下生成 detect/exp 文件夹,生成的图片就放在这个文件夹下:
当然,第二次使用就会输出exp2,然后exp3,exp4,exp5…….等等,要看清楚输出的图片在哪个文件夹下。
2.2、视频测试:
视频识别方法和图片一样,注意要设好放视频的文件夹(我这里新建了一个文件夹videos),视频格式好像只支持MP4,我录了一段哈利波特手游里面跳舞的镜头,这里人物众多,看看效果
python detect.py --source ./data/videos/tiaowu.mp4
生成的视频:
yolov5识别哈利波特跳舞
2.3、摄像头测试:
使用本机摄像头测试Yolov5实时检测(两块绿色补丁是我扣掉的,请忽略):
python detect.py --source 0
3、训练自己的数据集
官方的模型可以识别大概80种物体,一般的玩玩就可以了,但是要实现特定目的,那还是要在此基础上训练自己的数据,才能实现自己的目标。
比如上面那个哈利波特的跳舞视频,用官方的模型文件,可以检测出 person 等,但是我想要检测那个圆圈(为啥要识别那个,大家都懂吧,哈哈),那就只能自建数据集来识别。
3.1准备数据
还是上面那个视频,我用openCV把它分解成4000多张图片
import cv2
cap = cv2.VideoCapture("tiaowu.mp4")
isOpened = cap.isOpened # 判断是否打开‘
print(isOpened)
fps = cap.get(cv2.CAP_PROP_FPS) #帧率
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
print(fps,width,height)
i = 0
while(isOpened):
if i == 5000:
break
else:
i += 1
(flag,frame) = cap.read() # 读取每一张 flag frame
fileName = 'xulie/image'+str(i)+'.jpg'
print(fileName)
if flag == True:
cv2.imwrite(fileName,frame,[cv2.IMWRITE_JPEG_QUALITY,100])
然后就要对这些图片进行标注,能够用来打标签的工具有很多,这里我选用Make Sense
登录网站https://www.makesense.ai/, 点击右下角GetStarted
点击下图中间 Drop images,弹出一个文件对话框,在这里导入想要标注的图片文件,可以多选
选好之后点左下方 Object Detection, 弹出下面的界面:
如果已经有了标签文件,就选Load labels from file,我们第一次,点击中间空白处或者左上角加号,都可以进入标签编辑页面:
我们给标签起个名字circle(注意这里不能用中文),然后 Accept
如果要定义多个标签,就点加号或回车添加,然后再Accept
就进入了标注界面:
标注很简单,就用鼠标把想要标注的东西框起来就好了,注意尽量准确,这样模型训练起来比较容易,框好第一个图之后,在右上角选择标签内容,之前输入过,点选就行了
然后再标注第二个的时候,标签就会默认用前面的,如果有多个标签多个不同物体,那就要分别选择一下对应的标签,我这里就检测一个内容,所以标签选一次后面就不用选了。
按照一样的方法,把所有图都标注好,我这里是700多张,一般简单物体一两百张就够了,复杂的不好说,可能要上千张,这个还是要费一点时间的,得有耐心。
然后选择左上角菜单,Actions里面的Export Annotations
弹出下面的对话框,选第一个YOLO模式,
然后Export, 得到一个压缩文件,解压之后是一堆txt文件:
这就是记录了物体位置的label文件了。
我们在yolov5文件夹下,新建个datasets文件夹,然后在datasets下新建images、labels、test、train、val等5个文件夹。(images和labels文件夹是为了存放文件方便,不要也可以)然后:
images文件夹下放刚刚参与标注的所有图片文件
labels文件夹下放刚刚解压的标签文件
train就是训练用文件夹,把准备训练的图片(images文件夹里面选部分,一般90%以上)和对应的label文件,一起放进来,注意图片和txt文件的名字要对应上
剩下的文件(images和labels文件夹中去掉训练用的文件)分别在test和val中放一些,注意跟上面一样,图片和txt文件要对应起来。
好,到这里,数据集就划分好了,下面开始进行训练
3.2训练自己的数据
这里要对yolov5的原始文件做一些修改
3.2.1、修改yaml文件
打开 data文件夹下有个 coco128.yaml文件
将这里的 path、train、val、test几个路径改成上面自己建好的目录的路径,比如:
path: ../datasets # dataset root dir #这里改成自建的datasets路径
train: train # train images (relative to 'path') 128 images #这里要和上面的path相配合,即接着 ../datasets后面,完整路径应该是 ../datasets/train
val: val # val images (relative to 'path') 128 images #同上 ../datasets/val
test: test # test images (optional) #同上 ../datasets/test
下面的nc(number of classes)是识别种类数目,因为原始的yolov5s模型是检测80种类东西,所以这里是80,如果自己想要检测几类东西,就改为几,我这里只要检测那个圆,所以这里改为1
下面这个names就是种类名称,这个跟上面是对应的,原始yolov5s模型检测80种东西,所以这里就列出了80种东西的名称,这里改成自己要检测的东西的类名,就是前面咱们标注的时候用的label,检测几个类就写几个,用逗号隔开。我这里只要检测那个圆,所以只写一个 circle
最下面download这一行对我们没用,要把它注释掉
修改完的coco128文件如下:
3.2.2、修改预训练模型文件
打开上面下载的模型文件,如果用哪个就改哪个,这里我打算用yolov5s.pt作为预训练模型
打开对应的配置文件 yolov5s.yaml, 这里只要改一个地方,就是把nc改为需要训练的种类数
我只训练一个种类,所以改为 nc:1
3.2.3、开始训练
修改完两个yaml文件后,就可以开始训练了,
一样从Anaconda3进命令行,然后用下面的命令启动训练:
python train.py --cfg models/yolov5s.yaml --data data/coco128.yaml --weights yolov5s.pt --epoch 150 --batch-size 4
说明:这里指定了所用的预训练模型是yolov5s, 数据配置文件coco128.yaml 权重文件 yolov5s.pt
epoch是指训练轮数,可以从可视化图表看收敛情况,一般100以上吧,也有的简单的50轮就有效果了。我这里150其实多了。(为了方便演示,我下面的截图是用的epoch=10,实际模型我训练了150,那个要好久好久,其实没必要,这种简单的圆形,二三十次就收敛的很好了)
batch-size是一次放入训练的数量,4就是一次放4张图去训练。这个跟电脑性能有关,主要是显卡,我试了试,我这台笔记本最多跑到4,如果设为8就崩了,好的电脑可以到32、64啥的。
好了,启动训练,训练界面大概是这样的:
完成训练后的界面是这样的:
可以看到,它最终是保存了两个结果,last.pt 和 best.pt 顾名思义就是最后一次和最佳一次
结果保存在 runs\train\exp10\weights\ 这个路径下,大小都是14M左右,和原始的5s大小相当
在 runs\train\exp10\ 文件夹下,还保存了一些可视化训练情况的图表,比如有个results.png:
从这里可以看到模型收敛情况,多看看这些统计数据,可以帮助我们更好地找到最佳训练参数
4、应用到自己的实际工作中
训练出来的东西效果怎么样呢?我们来测试一下
首先找到 runs\train\exp10\weights\best.pt, 这个路径下的 best.pt, 我们就选最佳的吧
然后我们来找张图,比如我从游戏里截了个图(文件名image1919.jpg)放在 data/images:
然后从Anaconda3进入命令行,输入以下命令:
python detect.py --weights runs/train/exp10/weights/best.pt --source data/images/image1919.jpg
这里weights就是我们刚刚训练好的 best.pt source就是我们打算用来检测的图片文件路径
回车,检测后结果如下:
可以看到,3个圆圈都被准确地检测到了
那么视频效果如何呢?我把第1章我用来测试的视频放进去检测
python detect.py --weights runs/train/exp10/weights/best.pt --source data/video/tiaowu.mp4
训练的结果如下:
yolov5检测哈利波特跳舞圆圈
可以看到,效果还是不错的,基本上都能跟住圆圈。这玩意有什么用?哈哈,能检测到圆圈,那再加上自动控制鼠标点击,那不就是个自动玩跳舞的WG了嘛。我下一篇帖子就来实现一下利用yolov5自动检测并玩哈利波特跳舞的小游戏。声明:以上功能仅用于学习,如果用来做别的什么违法乱纪的事情,与我无关啊!
当然当然,这只是个小例子,以验证yolov5的强大功能,用途还是要用到正经工作中去的,什么演唱会抓逃犯啦,什么车牌检测啦,什么自动驾驶啦等等,不要学我,只知道拿来打游戏哈!
好了,到此为止,一个完整的yolov5的流程就学完了。如果想要深入应用,可以仔细研究它的代码,它完全是开源的,如果愿意,修改输入路径改输出路径等各种参数,把代码嫁接到自己的代码中去,在此基础上再进行自己想要的训练等等,都是可以的。
不要重复造轮子,yolov5就是个现成、免费、好用的轮子!
来源:阿尔法羊