Yolov5自学笔记之一–从入门到入狱,功能强大不要乱用(实现yolov5的基本功能使用流程及训练自己的数据集)

 

1、下载安装

前提是安装好Anaconda3和pytorch等一大堆AI学习相关环境

1.1、下载YOLO5源码

  • Yolov5 Github地址:https://github.com/ultralytics/yolov5
  • 自己的网盘地址:
  • 链接:https://pan.baidu.com/s/1fY_JVs5LiZ428aOdv0BEJQ 
    提取码: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就是个现成、免费、好用的轮子!

    来源:阿尔法羊

    物联沃分享整理
    物联沃-IOTWORD物联网 » Yolov5自学笔记之一–从入门到入狱,功能强大不要乱用(实现yolov5的基本功能使用流程及训练自己的数据集)

    发表评论