赞
踩
本项目用yolov5识别口罩,然后用pyqt5做ui形成程序界面,适合快速入门 yolov5 pyqt5 和交大作业 及轻度毕设的小伙伴们~~
项目包含很少的编码,只说必要的点,仅需一点python基础和一丁点的模型训练基础 即可完成,成品我放在最后了(打包下载即可运行)。
支持图片和摄像头实时监测。
实现效果图:
yolov5实际上就是个小框架,用来做图像分类的,先把这个小框架下载下来 github地址:https://github.com/ultralytics/yolov5
本项目使用的是 5.0的版本 :
下载下来之后的压缩包解压,然后将整个文件拖到pycharm里。
拖进去之后会有一堆文件,我们只看下面这两个文件。
我们要做的就是运行这俩文件做到不报错就算环境配置完成了。
所需要的库都在这个记事本里。
可以在终端输入 pip3 install -r requirements.txt
来安装这个记事本里的全部需要的库,不过不建议windows系统下这么做。
windows系统下 这里有个坑 就是pycocotools 这个库。
没有办法通过pip直接安装这个库。
两个解决办法
在配置环境过程中遇到的一些问题,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这个用于训练的文件只需要知道三个。
然后就是 detect.py 这个用于识别的文件,有两个需要知道的参数。
上面这些参数 需要修改的话 就直接填在 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
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。最近一直在读论文,没啥心情弄了,等我啥时候没事了我就过来再弄~~~~~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。