视觉检测缺陷——YOLOv5+Deepsort+Pyqt5应用于流水线产品计数及错漏反检测问题

一、背景

        在工厂里面,流水线上产品经常出现“错漏反”的问题或者产品外观出现瑕疵。(错:指的是产品零件、产品型号、包装配件等装错、放错等问题;漏:指的是漏放产品、漏放配件等问题;反:通常指的是产品零件装反、标贴贴反等问题)。为了防范以上问题,流水线上通常都要安排质检岗位,人工检查产品质量,但是人并不能保持百分百的精神专注,将问题产品百分百拦截下来,特别是流水线产能比较高时,如每小时都要检查上千个产品,质检员工就容易出现疲劳,这时问题产品可能就会漏检并流出市场,引发客户投诉。为此可借助计算机视觉,辅助质检岗位检查问题产品,减少问题产品的流出。

    网图,侵删  

        本篇博客内容主要是对漏放产品问题进行检测。因为被检产品的体积较小且流水线产能较高,员工偶尔会漏放产品,直接出厂一个空包装盒给客户从而导客诉。所以为减少此类问题,采用YOLOv5+Deepsort方案对漏放产品进行检测与计数,用Pyqt5进行开发图形界面。采用400万像素的USB摄像头进行实时拍摄,外加一个USB喇叭通过警报音提醒员工产品出现了漏放,效果图如下(关键信息打了马赛克),当检测到None时,即发现了有产品漏放,程序就会通过警报声报警,经验证检测效果还不错。

 二、开发过程

1、YOLOv5模型训练

关于YOLOv5模型的使用与训练过程在这就不展开了,网上有很多的教程。在github上下载ultralytics/yolov5的代码后,第一步的是采集图像数据,使用labelimg标注图片,将图片标注分为4类:“a.已包装好的彩盒”,b.“放了产品但未包装的纸托”,“c.漏放产品的纸托”,“d.漏放产品说明书的纸托”,其中c、d类才是重点。分类完毕后进行训练,设置了300epochs,batch 16 ,用CPU进行训练,大致24h便可训练出模型。

2、整合deepsort代码

将deepsort代码整合到YOLOv5中,以实现目标检测与流水计数。Deepsort的了解与如何整合到YOLOv5,推荐点击下方两个链接进行了解。计算机视觉流水计数可用来统计单位时间内的大概产能,为什么说是大概呢,因为视频计数的识别准确度不是100%,总会有些统计失误,但用来得到整体数量是没什么问题的。

DeepSort论文学习_cdknight_happy的专栏-CSDN博客_deepsort

用 YOLO v5+DeepSORT,打造实时多目标跟踪模型

3、pyqt5开发图形界面

 使用的QtDesigner设计整体的界面,网上教程也挺多,在这也不展开。

 4、高级设置项介绍

Yolov5的代码有以下参数要设置,为了提高识别准确度以及方便设置,将一些参数的设置开放出来

   parser = argparse.ArgumentParser()
        parser.add_argument('--deep_sort_weights', type=str,
                            default='deep_sort_pytorch/deep_sort/deep/checkpoint/ckpt.t7', help='ckpt.t7 path')
        parser.add_argument("--config_deepsort", type=str, default="deep_sort_pytorch/configs/deep_sort.yaml")
        parser.add_argument('--weights', nargs='+', type=str, default='yolov5s.pt', help='model.pt path(s)')
        parser.add_argument('--source', type=str, default='data/images', help='source')  # file/folder, 0 for self.webcam
        parser.add_argument('--img-size', type=int, default=640, help='inference size (pixels)')
        parser.add_argument('--conf-thres', type=float, default=GlobalSetting.detectThrehold, help='object confidence threshold')  # 置信度阈值
        parser.add_argument('--iou-thres', type=float, default=0.45, help='IOU threshold for NMS')  # 做nms的iou阈值
        parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
        parser.add_argument('--view-img', action='store_true', help='display results')  # 是否展示预测之后的图片/视频 默认false
        parser.add_argument('--save-txt', action='store_true',
                            help='save results to *.txt')  # 是否将预测的框坐标以txt文件形式保存 默认false
        parser.add_argument('--save-conf', action='store_true', help='save confidences in --save-txt labels')
        parser.add_argument('--classes', nargs='+', type=int,
                            help='filter by class: --class 0, or --class 0 2 3')  # 设置只保留一部分类别,形如0 2 3
        parser.add_argument('--agnostic-nms', action='store_true',
                            help='class-agnostic NMS')  # 进行nms是否也去除不同类别之间的框,默认false
        parser.add_argument('--augment', action='store_true', help='augmented inference')  # 推理的时候进行多尺度,翻转等操作(TTA)推理
        parser.add_argument('--update', action='store_true',
                            help='update all models')  # 如果为True,则对所有模型进行strip_optimizer操作,去除pt文件中的优化器等信息
        parser.add_argument('--project', default='runs/detect', help='save results to project/name')
        parser.add_argument('--name', default='exp', help='save results to project/name')
        parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')

1、设置检测阈值

2、设置数据源是来自摄像头还是视频文件

 

3、设置检测目标检测到多少帧后才判断为真,此设置项是为了减少误判报警的次数

4、设置检测边缘,第一张效果图中,检测图像是是有个红框的,如果检测到的目标坐标中心在红框内,检测才有效,红框的大小由下方设置。为什么要有这个设置项呢?因为经过实战验证后,发现图像边缘部分的目标检测误报率比较高,因为边缘部分的彩盒都是显露一部分,对于这部分,目标类别不是特别明显,人眼也经常无法判断是属于哪一类,程序当然也会判断不出。所以为了减少误判率,特别加了这个红框限制。

 

 三、小结

 暂时介绍到这里,后续有时间再讲关键代码讲解贴上来。

  • 0
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论
### 回答1: Qt界面设计是指使用Qt框架进行界面设计的过程。Qt是一个跨平台的C++图形用户界面用程序开发框架,它提供了丰富的UI组件和工具,方便开发人员创建各种类型的界面。 以下是一个使用Qt界面设计的实例: 假设我们要开发一个音乐播放器的界面,我们首先需要打开Qt创建一个新的项目。然后,在Qt的设计模式下,我们可以选择使用Qt Designer来设计图形用户界面。 在Qt Designer中,我们可以通过拖放控件的方式来构建界面。我们可以选择音乐播放器所需的各种UI组件,例如按钮、滑块、进度条等。然后,我们可以对这些组件进行布局和调整,以满足我们的需求。 接下来,我们可以为每个组件添加功能。例如,我们可以为播放按钮添加点击事件,当用户点击播放按钮时,音乐播放器就会开始播放音乐。我们还可以为滑块添加拖动事件,当用户拖动滑块时,可以控制音乐的播放进度。 在Qt Designer中,我们还可以自定义界面的外观。我们可以选择不同的主题、颜色和字体,以使界面更加美观和符合用户的喜好。我们还可以添加背景图片或图标,使界面更具个性。 最后,我们可以通过Qt的编程语言C++来编写界面的逻辑代码。我们可以在代码中连接各个组件,处理用户的操作并对界面做出相。例如,当音乐播放完成时,我们可以自动切换到下一首歌曲。 总之,Qt界面设计是一个使用Qt框架进行界面开发的过程。通过Qt Designer的可视化设计和Qt的编程语言,我们可以创建出功能丰富、美观的界面,满足用户的需求。 ### 回答2: Qt是一个跨平台的C++图形用户界面开发框架,可以用来创建各种类型的用户界面。在Qt中,界面设计是一个重要的环节,设计出美观、易用且功能强大的界面对于提升用户体验和软件质量至关重要。 下面我以一个简单的登录界面设计为例来说明Qt界面设计的操作步骤和实现方法。 首先,在Qt Creator中创建一个新的Qt Widgets Application项目。然后,在主窗口上拖放所需的控件,例如标签、文本框和按钮等,布局控件的位置和大小。 接下来,通过Qt的设计工具——Qt Designer进行界面设计。打开.ui文件,从工具栏中选择所需的控件,拖放到主窗口上,并进行相的大小、位置和样式的调整。 在编辑界面的过程中,可以使用Qt Designer提供的属性编辑器来设置控件的属性,例如文本内容、字体颜色和背景颜色等,还可以连接信号和槽函数,以实现响式功能。 完成界面设计后,需要在代码中实现界面的功能。打开对的源文件,编写槽函数,将控件和槽函数进行连接,以实现界面逻辑的交互。 在我们的登录界面设计中,通过点击登录按钮,连接登录按钮的clicked信号和自定义的槽函数,实现登录功能。在槽函数中获取用户名和密码,并与事先存储的正确的用户名和密码进行比较验证。如果验证通过,则显示登录成功的提示信息,否则显示登录失败的提示信息。 最后,编译和运行项目,查看界面的显示效果。可以通过调试和测试,进一步完善界面的交互和功能。 通过以上步骤,我们可以实现一个简单的登录界面的Qt界面设计。同时,Qt还提供了丰富的控件和功能,可以根据实际需求进行界面设计,开发出更加复杂和丰富的用程序。 ### 回答3: Qt界面设计是指使用Qt框架进行用户界面设计的过程。Qt是一种跨平台的用程序框架,它提供了丰富的工具和组件,使开发者可以方便地创建各种精美、功能强大的用户界面。 下面是一个Qt界面设计的实例: 假设我们要设计一个简单的计算器用程序。首先,我们需要创建一个新的Qt项目并选择合适的界面布局。 在界面设计中,我们可以使用Qt的UI设计器来添加所需的控件,例如按钮、标签和文本输入框。我们可以通过拖拽和放置的方式将这些控件添加到布局上。 为了实现计算器的基本功能,我们需要添加数字按钮、运算符按钮和一个文本显示框。我们可以使用Qt的信号槽机制来连接按钮的点击事件和相的逻辑处理函数。例如,当用户点击数字按钮时,我们可以将对的数字追加到文本显示框的内容中。 此外,我们还可以为计算器添加一些额外的功能,例如添加删除按钮和清除按钮,以及实现基本的计算操作,如加法、减法、乘法和除法等。 在设计界面时,我们还该考虑使用合适的颜色和字体来提升用户体验。Qt提供了丰富的样式和主题选择,以及自定义样式的能力,使得界面可以根据用户的喜好进行调整。 最后,我们需要确保界面的布局和控件的操作方式符合用户的直觉和习惯,以提供良好的用户体验。 综上所述,Qt界面设计能够帮助我们创建出实用、美观、易用的用程序界面。通过合理利用Qt的工具和组件,我们可以在短时间内完成复杂的界面设计,并为用户提供出色的操作体验。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

雾起、夜未央

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

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

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

打赏作者

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

抵扣说明:

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

余额充值