深度学习记录(四):YOLOv5 7.0实战

深度学习记录(四):YOLOv5 7.0实战

狮子阿儒 Lv4

​ 官方更新了最新的YOLOv5 7.0版本,体验一下

YOLOv5环境安装

环境

anaconda

配置

过程请见深度学习记录(一):PyTorch安装

YOLOv5使用预训练模型进行检测

下载项目

下载YOLOv5项目文件,地址:GitHub-YOLOv5官方项目

使用命令:

1
git clone https://github.com/ultralytics/yolov5.git

安装依赖

文件夹中有requirements.txt,列举项目所需依赖,

打开终端,安装依赖包

1
pip install -r requirements.txt

具体依赖如下,注意torch>=1.7.0,numpy可以选择==1.18.5

小试牛刀

终端输入 python detect.py,先运行一下项目测试用例,看是否能生成检测图片。

默认是使用yolov5s.pt模型检测,由于我训练过一次了,所以本地有该文件,初次训练会自动从GitHub下载,网速慢尽量挂VPN。

运行结果放到runs文件夹下

样例图bus.jpg

样例图zidane.jpg

参数

该部分位于detect.py文件中:

关键参数
  • weights:权重文件(训练好的模型文件),default为yolov5s.pt,模型越大,精度越高,运算速度越慢
    • yolov5s.pt 小型模型
    • yolov5m.pt 中型模型
    • yolov5l.pt 大型模型
    • yolov5x.pt 超大型模型
  • source:检测目标,可以是单张图片、文件夹、屏幕或者摄像头等。
  • conf-thres:置信度阈值,越低框越多,越高框越少。default为0.25,大于default都会进行标记
  • iou-thres:IOU阈值,越低框越少,越高框越多。default默认为0.45,过大容易一个物体会被识别出多个框,过小则识别不出物体
  • save-txt:把检测的目标的坐标文件输出为txt文件。

推理检测

知道上述参数之后,我们该如何使用自己想要的参数去训练模型呢

打开终端——输入 python detect.py --参数 value

如下将模型文件换成了yolov5m.pt

1
python detect.py --weights yolov5m.pt

初次训练自动下载yolov5m.pt文件。

训练完成后查看结果,注意与之前的yolov5s模型训练结果对比:

如果想推理其他图片,可以将想检测的放入项目文件夹data/images中,

我从网络上下载了一张狂飙电视剧剧照,然后测试

1
python detect.py --weights yolov5m.pt --source data/images/狂飙.jpg

检测效果如下:

检测当前屏幕中存在的对象

1
python detect.py --weights yolov5m.pt --source screen

推理结果会输出一段加速的视频,效果如下:

更改置信度阈值的话会发生什么呢?

输入命令,将置信度改为0.05:

1
python detect.py --weights yolov5m.pt --source data/images/bus.jpg --conf-thres 0.05

检测效果如下,可以看到原来的bus.jpg图片中检测到了比之前更多的对象,

如果更改同样的IOU阈值呢?

输入命令,将IOU阈值调成0.05,

1
python detect.py --weights yolov5m.pt --source data/images/bus.jpg --iou-thres 0.05

检测结果如下,框减少:

基于torch.hub的检测方法

可以直接运行py文件,而不需要终端手动输入命令执行了。

1
2
3
4
5
6
7
8
9
10
11
12
13
import torch

#Model,指定了本地源
model = torch.hub.load('./','yolov5s',source='local')

#Images,确定检测图片
img = './data/images/zidane.jpg'

#Inference,调用模型
results = model(img)

#Result,展示结果
results.show()

YOLOv5构建自定义数据集

准备工作

数据收集
  • 图片类型数据

  • 视频类型数据

    • 使用opencv进行视频抽帧

      将一段完整视频抽成多个一帧一帧的图片,以下利用死神VS火影(带土:卡卡西)的一段游戏视频演示:

      原视频:NSUNS4带土VS鸣人

      目录结构:

      新建一个jupyter Notebook,命名extract.ipynb,导入opencv模块与matplotlib模块

      1
      2
      import cv2
      import matplotlib.pyplot as plt

      ret返回类型为bool类型,如果读取到了视频,就会返回true;未读取到,返回false。frame返回一帧图片

      1
      2
      3
      4
      5
      #打开视频文件
      video = cv2.VideoCapture('./BVN.mp4')

      #读取一帧
      ret,frame = video.read()

      使用plt.imshow(frame)显示读取到帧图片,注意这样显示的图片与原视频颜色不一致,是因为输出颜色为BGR格式

      切换到原来颜色可以使用 plt.imshow(cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)),BGR转换RGB格式

      上述是将第一帧图片显示,如果想对整个视频的每帧图片进行读取并保存,需要怎么做呢?

      以下程序是捕获视频——对视频循环读取——每30帧输出一张图片(一个视频总帧数太多,全部图片会特别多)——将图片按格式写入images文件夹中。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      video = cv2.VideoCapture('./BVN.mp4')
      num = 0 #计数器
      save_step = 30 #间隔帧
      while True:
      ret,frame = video.read()
      if not ret:
      break
      num += 1
      if num % save_step == 0:
      cv2.imwrite('./images/'+str(num)+'.jpg',frame)

      结果如下:

标注工具
  • labelimg

    安装命令:pip install labelimg

    终端输入labelimg,打开labelimg

    界面介绍:

    导入图片后进行标注(注意如果标注框一直强制正方形,请按快捷键 CTRL+SHIFT+R 或 点击‘Edit’->‘Draw Squares’ ):

    结果保存到了labels文件夹中:

YOLOv5训练自定义数据集

数据调整

  • images:存放图片
    • train:训练集图片
    • val:验证集图片
  • labels:存放标签
    • train:训练集标签文件,要与训练集图片名称一一对应
    • val:验证集标签文件,要与验证集图片名称一一对应

classes.txt要从labels文件夹移到datasets文件夹下,然后images和labels分别划分训练集(多)、验证集(少),两文件夹的内容应当对应。

目录结构:

关键参数

  • weights:预训练的权重文件
  • data:数据集描述文件

训练模型

在data文件夹下创建bvn.yaml配置文件,规定对应标签。

1
2
3
4
5
6
7
8
9
10
11
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../yolov5-master/datasets # dataset root dir
train: images/train # train images (relative to 'path') 128 images
val: images/val # val images (relative to 'path') 128 images
test: # test images (optional)

# Classes
names:
0: daitu
1: mingren

打开train.py文件,修改参数–data为’data/bvn.yaml’

点击运行即可训练。

默认是训练100epoch,慢慢等

最后训练好的结果会保存到runs/train中。

打开detect.py文件,输入命令

1
python detect.py --weights runs/train/exp2/weights/best.pt --source datasets/BVN.mp4 --view-img

这样会边推理边播放视频,播放完后视频生成。

检测效果视频如下:

YOLOv5利用PyQT5实现可视化界面

环境搭建

  • Pyside6安装:pip install pyside6
  • pyside6 designer:打开 <虚拟环境位置>\Lib\site-packages\PySide6
  • Qt for Vscode:Vscode扩展

实现过程

打开PySide6的designer.exe,对图形界面设计。

以下是我绘制的GUI,具体元素如图:

image-20230625220804629

其中Label工具属性设置如下:

image-20230625221011179

Ctrl+S将图形界面保存,文件名为main_windows.ui,其实它就是一个标准XML格式的文本文件。

为了将它做成后续的检测界面,需要用Qt for Vscode插件对ui文件转换,如下:

image-20230625221708626

上述转换为一个名为main_window_ui.py的文件,里面有个Ui_MainWindow类,一会儿我们会用到,如图所示:

image-20230625221947422

新建一个base_ui.py用于写GUI主程序,

用到了前面的基于torch.hub方法,用模型是本文开始的自定义数据集训练的best.pt模型文件。

整体分为图片检测与视频检测两部分。

原理为

  • (图片)点击按钮,打开文件路径,选中图片打开后,执行image_pred函数,将检测结果以图像形式显示出来。
  • (视频)点击按钮,打开文件路径,选中视频打开后,执行video_pred函数,对原视频按一定时间间隔抽帧并对每帧图片检测,最后将所有帧的检测结果连续地显示出来。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import cv2
import sys
import torch
from PySide6.QtWidgets import QMainWindow,QApplication,QFileDialog
from PySide6.QtGui import QPixmap,QImage
from PySide6.QtCore import QTimer

from main_window_ui import Ui_MainWindow

#图像绘制
def conver2QImage(img):
height,width,channel = img.shape
return QImage(img, width, height, width*channel, QImage.Format_RGB888)

#创建视图类
class MainWindow(QMainWindow,Ui_MainWindow):
def __init__(self):
super(MainWindow,self).__init__() #多继承
self.setupUi(self)
#训练好的本地模型
self.model = torch.hub.load('./','custom',path='runs/train/exp2/weights/best.pt',source='local')
self.timer = QTimer() #计时器
self.timer.setInterval(1) #1ms间隔
self.video = None
self.bind_slots()

#图片检测
def image_pred(self,file_path):
results = self.model(file_path)
image = results.render()[0]
return conver2QImage(image)

def open_image(self):
print('点击了检测图片')
file_path = QFileDialog.getOpenFileName(self,dir='./datasets/images/train',filter='*.jpg;*.png;*.jpeg')
if file_path[0]:
self.timer.stop()
file_path = file_path[0]
print(file_path)
qimage = self.image_pred(file_path)
self.input.setPixmap(QPixmap(file_path))
self.output.setPixmap(QPixmap.fromImage(qimage))

#视频检测
def video_pred(self):
ret, frame = self.video.read()
if not ret:
self.timer.stop()
else:
frame = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
self.input.setPixmap(QPixmap.fromImage(conver2QImage(frame)))
results = self.model(frame)
image = results.render()[0]
self.output.setPixmap(QPixmap.fromImage(conver2QImage(image)))

def open_video(self):
print('点击了检测视频')
file_path = QFileDialog.getOpenFileName(self,dir='./datasets',filter='*.mp4;*avi;*.flv;*.mpg;*.mov;*.wmv')
if file_path[0]:
file_path = file_path[0]
self.video = cv2.VideoCapture(file_path)
self.timer.start()

#事件绑定
def bind_slots(self):
self.det_image.clicked.connect(self.open_image)
self.det_video.clicked.connect(self.open_video)
self.timer.timeout.connect(self.video_pred)

if __name__ == "__main__":
app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec()

效果

功能上基本满足,界面适应性上还有点问题,无法自动适配任意大小,

image-20230625225105755

YOLOv5利用Gradio搭建Web GUI

image-20231008114257720

Gradio是一个机器学习模型可视化的Python库,简单来说Gradio可以通过python生成一套html页面,其中包含大部分组件,通过设置相关组件可以实现丰富的交互功能,让机器学习模型拥有用户友好的图形界面。

image-20231008114143706

Gradio与Hugging Face合作密切,很多机器学习爱好者与研究员常常会将gradio的模型部署到 HuggingFace的 Space托管空间中,实现外界免费访问

Gradio常用于测试AI模型的效果,如图像识别,姿态估计,图像分割。在将训练完成的模型加载之后,可以对测试数据集进行实时检测。

Gradio的主要优点包括:

  1. 简单易用,只需要几行代码就可以创建界面。无需前端开发经验。

  2. 支持丰富的交互组件,如滑块、单选框、文本框等。可以快速构建复杂的界面。

  3. 可以为TensorFlow、PyTorch等多种框架的模型构建界面。

  4. 支持在线部署。可以通过链接与他人分享你的模型。

  5. 支持在Jupyter Notebook中嵌入组件,使Notebook更加交互式。

  6. 开源免费。社区活跃,文档丰富。

    Gradio官方网站:www.gradio.app ,参考文档:Gradio — 文档 官方Github:gradio-app/gradio:构建和分享令人愉快的机器学习应用程序

该部分是基于Gradio来搭建YoLov5模型的WebUI系统,分别实现本地与外网访问,所用模型为上述火影忍者训练集训练好的模型。如果想实现特定的人或物的检测,可以更换其他模型。

-

  • 操作如下:
  1. 如果环境中没有Gradio库的话,需要先行安装,

    1
    pip install gradio
  2. 创建Gradio_demo.py文件用于编写WebUI程序

  3. 示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import torch
import gradio as gr

model = torch.hub.load('./','custom',path='runs/train/exp2/weights/best.pt',source='local') #模型加载,该模型为训练效果最好的模型

title = '基于Gradio的YOLOv5演示项目'
desc = '这是一个基于Gradio的图像识别WebUI演示项目,非常简洁方便'

base_conf,base_iou = 0.25,0.45

# det_image函数为将滑动条与模型conf与iou关联,并实现对img的检测与渲染
def det_image(img,conf_thres,iou_thres):
model.conf = conf_thres
model.iou = iou_thres
return model(img).render()[0]

# 'image'字符串为gr.Image()的映射,使用效果相同, gr.Slider()为gradio自带滑动条
# 参数live为是否将示例实时检测
# 参数fn为所用模型及渲染
# 参数example为示例图像
interface = gr.Interface(inputs=['image',gr.Slider(minimum=0,maximum=1,value=base_conf),gr.Slider(minimum=0,maximum=1,value=base_iou)],
outputs=['image'],
fn=det_image,
title = title,
description= desc,
live= True,
examples=[["./datasets/images/train/30.jpg",base_conf,base_iou],["./datasets/images/train/90.jpg",base_conf,base_iou]]
)

#其中interface.launch()方法返回三个值
# app,为 Gradio 演示提供支持的 FastAPI 应用程序
# local_url,本地地址
# share_url,公共地址,当share=True时生成
if __name__ == "__main__":
app,local_url,share_url = interface.launch(share=True)

效果图:

image-20231008113809902

VSCode与AutoDL服务器连接

进行深度学习模型训练时,常常需要用到GPU进行加速,但是由于自己用的电脑GPU算力较低,所以跑模型一般常借助GPU服务器来帮助训练,以下是使用VSCode和AutoDL(服务器提供商)来完成在服务器上的模型训练。

打开VScode插件

image-20231010161610637
  • 安装Remote-SSH远程连接插件

image-20231010161451924

打开远程连接窗口

  • 在VScode左下角
image-20231010161657180

连接服务器

  • 连接主机
image-20231010161754197
  • 添加新的服务器
image-20231010161855610image-20231010161936542 image-20231010162012524
  • 这个地方默认选择第一个,会将SSH configuration存到本地。
image-20231010162306620
  • 然后这时候重新打开运程连接工具,新加的服务器链接就有了。这时候点击新加的这个。
image-20231010162433472
  • 选择服务器的操作系统
image-20231010162546357
  • 输入服务器密码
image-20231010162618472

使用服务器

  • 这时打开文件夹,这显示的便是服务器中的文件。
image-20231010162752393
  • 再打开一个项目测试时,可能会出现安装Python扩展提示,因为之前的Python扩展是安装在本地,在服务器使用VScode,需要重新安装扩展。
image-20231010163202982
  • 运行需要选择一个解释器,服务器中有多个,其中Base为Anaconda默认的,另一个为深度学习专用虚拟环境
image-20231010163546332
  • 标题: 深度学习记录(四):YOLOv5 7.0实战
  • 作者: 狮子阿儒
  • 创建于 : 2023-05-13 22:29:26
  • 更新于 : 2024-03-03 21:31:26
  • 链接: https://c200108.github.io/blog/2023/05/13/深度学习记录(四):YOLOv5 7.0实战/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论