yolov5 + pyqt5 口罩识别系统实战 (yolov5、pyqt5 快速入门 ,大作业项目)

前言

本项目用yolov5识别口罩,然后用pyqt5做ui形成程序界面,适合快速入门 yolov5 pyqt5 和交大作业 及轻度毕设的小伙伴们~~

项目包含很少的编码,只说必要的点,仅需一点python基础和一丁点的模型训练基础 即可完成,成品我放在最后了(打包下载即可运行)。

支持图片和摄像头实时监测。
实现效果图:
在这里插入图片描述

yolov5部分

环境配置

yolov5实际上就是个小框架,用来做图像分类的,先把这个小框架下载下来 github地址:https://github.com/ultralytics/yolov5

本项目使用的是 5.0的版本 :

下载下来之后的压缩包解压,然后将整个文件拖到pycharm里。

拖进去之后会有一堆文件,我们只看下面这两个文件。
在这里插入图片描述
在这里插入图片描述
我们要做的就是运行这俩文件做到不报错就算环境配置完成了。

所需要的库都在这个记事本里。

在这里插入图片描述
可以在终端输入 pip3 install -r requirements.txt 来安装这个记事本里的全部需要的库,不过不建议windows系统下这么做。

windows系统下 这里有个坑 就是pycocotools 这个库。

没有办法通过pip直接安装这个库。

两个解决办法

  • 直接运行pip3 install pycocotools-windows,这个方法有个小缺陷,就是在某些情况下系统依旧会显示警告信息–找不到pycocotools库,但是程序可以正常运行,
  • 第二种方法就是自行下载 pycocotools库,安装包https://pan.baidu.com/s/1nWQdPRtGwNnOO2DkxRuGuA提取码:i5d7 。下载下来之后解压,解压下来的文件, conda环境 放到 \Lib\site-packages之中,python环境 放到 site-packages中。

在配置环境过程中遇到的一些问题,warning级别错误直接无视,报红色的错复制到百度也都有解决办法 这里就不一 一说了。

程序结构

说一下yolov5的程序结构, 大体流程非常简单的说就是 我们将标注好的图片打包给 train.py这个文件,叫这个文件去训练,训练完成之后程序会将一些学习好的参数保存下来,然后将需要识别的图片和刚才保存好的参数给 detect.py文件让他去识别。

什么叫标注好的图片呢?就是我们通过人工的手段去给图片分类,比如下面这样:

通过一些工具将图片中的车和人手动的用矩形框框起来了,这样N张不同的图片打包在一起输出一些特定的数据格式,就变成数据集了。
在这里插入图片描述
现在的思路就很简单了,我们只需要一个数据集,就是一个打包了 N张已经人工标注好的口罩图片,吧这个数据集扔给train.py去训练,吧训练好的参数 + 一个需要识别的图片扔给 detect.py去识别就完成了。

介绍一些必须知道的几个参数。

首先看 train.py这个文件, 直接拉到457行左右 的main函数里,可以看到里面有一堆 parser.add_argument 这个东西。
像下面这样:

    parser.add_argument('--weights', type=str, default='yolov5s.pt', help='initial weights path')
    parser.add_argument('--cfg', type=str, default='models/yolov5s.yaml', help='model.yaml path')
    parser.add_argument('--data', type=str, default='data/coco128.yaml', help='data.yaml path')


第一个是参数,第二个类型,第三个默认值,第四个帮助信息。

train.py这个用于训练的文件只需要知道三个。

  • 第一个 --weights 就是告诉程序你要设置怎样的预参数,就是训练之前要设置什么参数。这里可以看到我设置的是使用yolov5s.pt的参数作为程序的预参数。
  • 第二个 --cfg 这里就是告诉程序你要用什么网络模型去训练。我用的 yolov5s的网络模型。
  • 第三个 – data 这里是告诉程序你要训练什么数据集,我设置的coco128用来测试程序,我们这次要训练口罩数据集,所以后面要改地址。

然后就是 detect.py 这个用于识别的文件,有两个需要知道的参数。

  • 第一个 --weights 上面已经说过了 在这个文件中 基本意思也是一样的, 这是告诉程序要使用什么样的参数进行识别。
  • 第二个 --source 这个参数就是告诉程序 你要识别的图片或者视频在哪里,填入一个文件地址。

上面这些参数 需要修改的话 就直接填在 default 后面就行了。
其他的参数本项目中可以不了解。

程序测试

这里我先用已经训练好的口罩数据来测试一下程序。
口罩数据集可以在网上找一下下载下来自己训练,不过比较费时间。训练好的文件我会放到最后,大家直接拿来用就可以了。

看一下我的程序目录结构:

本次用到的图片:

在这里插入图片描述

可以看到我将要识别的图片放到了 images下面。

然后再detect.py里修改下面的代码

    parser.add_argument('--source', type=str, default=r'./data/images/R-C.jpg', help='source')  # file/folder, 0 for webcam

运行后 程序识别结果保存在 runs\detect\exp 下 ,可以看到程序结果。

在这里插入图片描述
上面这是图片检测,如果想用本地电脑摄像头实时检测,则将 --source 里面的default设置成 0,然后再去 utils里的 datasets的279行 将两个url强转成str 型 就行了。

detect.py里改:

    parser.add_argument('--source', type=str, default='0', help='source')  # file/folder, 0 for webcam

utils里改:

            if 'youtube.com/' in str(url) or 'youtu.be/' in str(url):  # if source is YouTube video

到这里yolov5的程序就ok了 ,下面开始给程序打包做可视化界面。

pyqt5部分:

环境配置

先安装一下pyqt5

pip install PyQt5
pip install PyQt5-tools

然后打开pycharm里配置一下。

在这里插入图片描述

添加下面俩个工具件:

Program D:\Anaconda3\Lib\site-packages\qt5_applications\Qt\bin\designer.exe

Arauments : $FileName$

Working directory :$FileDir$
在这里插入图片描述
这里的Program 找你环境 的安装地址,如果是 conda则在这里…Lib\site-packages\qt5_applications\Qt\bin\designer.exe。

然后再添加一个 :

在这里插入图片描述
Arguments : $FileName$ -o $FileNameWithoutExtension$.py

环境配置到这就算基本完成了。

程序结构

下面讲一下必要的点,因为pyqt5是个工具包 ,不想yolo那样的小框架,所以没有原始代码。这里建议去后面下载下来我写好的代码来看后面的讲解。

打开main.py文件:
看下面这四行代码:

layout = QVBoxLayout()
self.btn = QPushButton("加载图片")
self.btn.clicked.connect(self.getfile)
layout.addWidget(self.btn)

QVBoxLayout():表示垂直布局。

self.btn = QPushButton("加载图片") :这就是设置了一个按钮。

self.btn.clicked.connect(self.getfile) :表示当按下 btn这个按钮之后要触发的事件放到 getfile函数里了。

layout.addWidget(self.btn) 将按钮btn加入到了前面设置的垂直布局中了。

同理我们再添加一个按钮用于摄像头检测.

self.btn1 = QPushButton("加载本地摄像头")
self.btn1.clicked.connect(self.getfiles)
layout.addWidget(self.btn1)

顺便设置一下标题:self.setWindowTitle("口罩识别系统")

做完之后运行测试一下是这样的:

设计触发事件的函数:

按下 加载图片按钮的 触发事件函数:
首先先写这两行。

self.fname, _  = QFileDialog.getOpenFileName(self, 'Open file',r'C:\Users\Administrator\Desktop\yolov5-5.0\data\images',"Image files (*.jpg *.gif)")
self.le.setPixmap(QPixmap(self.fname))

getOpenFileName():返回用户所选择文件的名称,并打开该文件
第一个参数用于指定父组件
第二个参数指定对话框标题
第三个参数指定目录
第四个参数是文件扩展名过滤器

此时 fname 里保存的就是用户上传上来的图片所保存的路径。

然后我们编辑出来文件路径 用os库运行yolov5的图片识别文件。

str=(r'python C:\Users\Administrator\Desktop\yolov5-5.0\detect2.py --source ' + self.fname+ ' --exist-ok ')
os.system(str)  # 运行图片识别文件

str就是拼接好的文件路径。
简单说一下str里的参数
第一个参数 python 不解释啦~
第二个参数 告诉程序要运行的文件路径
后面的参数是这个文件接受的参数。

–source 这个参数上面说过了,表示要识别的文件路径,

–exist-ok 表示每次都存放在 exp下,不然每次运行都是 exp1 exp2 exp3 这样递增 很麻烦。

然后我们还要将识别好的图片拿出来进行展示。
我这里用PIL库展示图片。

path = os.listdir(r'C:\Users\Administrator\Desktop\yolov5-5.0\runs\detect\exp')
s = path[0]
pathend = r'C:\Users\Administrator\Desktop\yolov5-5.0\runs\detect\exp'+ '\\'+ s
I = Image.open(pathend)
I.show()

os.listdir 用来读取文件路径下的文件名

我们拼接一下路径。
然后用PIL里的open方法读取图片,show展示出来就行了。

def getfiles(self):   # 加载摄像头
        str=(r'python C:\Users\Administrator\Desktop\yolov5-5.0\detect.py ')   # python命令 + B.py + 参数:IC.txt'
        os.environ['CUDA_LAUNCH_BLOCKING'] = '1' # 不加这个可能会报错
        os.system(str)

再设计一下摄像头的触发函数。

这个就比较简单了,像上面一样 str拼接命令 给os然后运行文件就行啦。

def getfiles(self):   # 加载摄像头
        str=(r'python C:\Users\Administrator\Desktop\yolov5-5.0\detect.py ')   # python命令 + B.py + 参数:IC.txt'
        os.environ['CUDA_LAUNCH_BLOCKING'] = '1' # 不加这个可能会报错
        os.system(str)

小总结

其实我这里仅仅说了一些该项目用得到的点,yolov5和pyqt5远没有这么简单,勉强作为入门吧。

最后这个pyqt5的触发事件写的比较笨哈哈,我是直接复制了两个detect文件,其实可以直接修改source参数 一个就是摄像头一个是图片识别,也不知道昨天怎么想的,我也懒得改了,就这样吧哈哈。

这个项目作为大作业妥妥的,我觉得再加点功能,美化美化ui啥的,可以作为本科轻量级毕设了呀~。。。

完整代码 Github地址:https://github.com/shitbro6/yolov5-pyqt5–mask-recognition-system/releases/tag/1.0(记得右上角点一下star~)

训练好的口罩数据:https://download.csdn.net/download/qq_38737428/81917395




---------------------------------时隔50天修改----------------------------------------------

有小伙伴反映一个BUG,多次图片检测的时候都只显示了第一次检测的结果。

我去测试了一下,发现确实是这样,于是定位了一下bug,发现图片识别的过程和文件存储的识别结果都在exp里没有问题,问题出在最后show文件的时候,path读取的总是exp里第一张图片,这就导致上述bug的发生。

我直接上了一个简单粗暴的修改方法,在多次图片检测中,每一次检测之前先删除exp文件夹及其子内容。

在main.py的第58行加入下面代码:

import shutil
shutil.rmtree('./runs/detect/exp')

改这个bug的方法有很多,可以改show文件的路径,或者直接用qt5套件做图片流程等,都比我这个方法优美,不过程序嘛,结果最重要,优不优美的吧。

还有小伙伴让我打包成exe程序,害,我做这个小东西只是为了入门一下yolov5,pyqt5我都是现学的,打包成exe的话 ,我可能得去现学一下pyinstall。最近一直在读论文,没啥心情弄了,等我啥时候没事了我就过来再弄~~~~~

评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深度不学习!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值