【搞事情】利用PyQt为目标检测SSD300添加界面(二)

2024-04-25 19:08

本文主要是介绍【搞事情】利用PyQt为目标检测SSD300添加界面(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【原创文章】欢迎正常授权转载(联系作者)
【反对恶意复制粘贴,如有发现必维权】
【微信公众号原文传送门】


上篇详细介绍实现利用PyQt给SSD加界面的三种方案(没学的赶快点进来学呀,哈哈)。这篇将详细介绍方案1的实现代码(代码获取见文章末尾)。

下载好的代码中项目文件构成如下:
文件目录
其中 “ssd” 文件夹中是SSD检测的关键文件,关于这部分之前写文章了,里面详细介绍了如何训练一个属于自己的SSD300,有代码、有预训练的权值文件,不清楚的请移步这里

接下来详细介绍实现,先看看流程图,实现的关键在于 检测循环显示

在这里插入图片描述

01 绘制界面

这里推荐一个非常方便的PyQt开发IDE—— eric,整体开发过程有点像MFC的感觉,可以直观看见控件的动作信号,并直接创建对应的槽函数,开发非常有效率,可以节省大把时间。
创建一个对话框窗口或者主窗口,拖拽一个QLabel在主窗口中用于显示,两个QPushButton用于控制开始/停止,一个QTextEdit用于显示检测结果。当然添加什么控件还是按照自己的需求来。为了讲解下面的代码,这里我把用到的控件和名称列在下面。界面的布置如下图。

界面控件
控件类型ObjectName作用
QLabellabel_imgshow画面显示
QPushButtonpushButton_start开始
QPushButtonpushButton_end结束
QTextEdittextEdit显示检测结果

在这里插入图片描述
绘制好ui文件(对应文件:MainWindow.ui)后将其转为.py文件(Ui_MainWindow.py)。eric 可以十分方便的完成转化,唯一麻烦的是,每次ui文件改变了都需要重新再“转化更新”一次。

02 界面显示

界面显示主要是要将opencv的图像数据(numpy.array)显示在界面的QLabel(label_imgshow)中,项目中构建了一个类成员函数实现。

def show_img(self, img):showImg = QImage(img.data, img.shape[1], img.shape[0],img.shape[1] * 3,     # 每行数据个数,3通道 所以width*3QImage.Format_RGB888)self.label_imgshow.setPixmap(QPixmap.fromImage(showImg))  # 展示图片

代码非常简单,就是先将numpy.array的数据转为QImage,再通过Qlabel控件的setPixmap将图像显示出来。每次更新显示时将opencv的图像数据作为参数,调用一次函数就行。

03 帧循环实现

接下来就是最复杂(其实超简单)的帧循环了。在窗口实例化时,将SSD300模型建立并导入训练好的权值,点击‘开始’后时开始帧循环检测(循环在点击‘开始’的槽函数中),点击‘结束’后结束帧循环(通过控制循环条件实现)。

下面详细介绍构造函数及“开始/结束按钮点击的槽函数

构造函数

功能:主要完成SSD的初始化以及一些依赖变量的初始化。

这里建议那些利用该方案来给自己搭建的网络添加界面的同学,建议将网络单独封装成类,界面类中使用时会非常便利。

def __init__(self, parent=None):super(MainWindow, self).__init__(parent)  # 父类初始化self.setupUi(self)      # 窗口‘穿衣服’,变成我们设计的样子# 初始化界面# 设置图片自适应显示self.label_imgshow.setScaledContents(True)# 创建一幅白色图片,在停止的时候显示self.img_none = np.ones((420, 720, 3), dtype=np.uint8)*255self.show_img(self.img_none)# 初始化SSD# 目标名称,按顺序self.obj_names = ['Aeroplane', 'Bicycle', 'Bird', 'Boat', 'Bottle','Bus', 'Car', 'Cat', 'Chair', 'Cow', 'Diningtable','Dog', 'Horse', 'Motorbike', 'Person', 'Pottedplant','Sheep', 'Sofa', 'Train', 'Tvmonitor']# 需要显示的目标list, 用于过滤self.include_class = self.obj_names# 导入权值文件,关联检测目标类别名self.ssd = SSD_test(weight_path='./ssd/weights/weights_SSD300.hdf5', class_nam_list=self.obj_names)# 摄像头索引号或者视频文件路径self.camera_index = 0      # 电脑连接的摄像头默认为0# opencv 支持 ip摄像头# self.camera_index = './Voc_test.avi'# 主循环flg,控制循环, False时循环停止self.video_flg = True

‘开始’点击槽函数

功能:获取图像数据流,之后开始帧循环检测

帧循环基本流程:读入图片–>预处理–>SSD检测–>处理检测结果–>结果绘制在图像上–>更新显示

@pyqtSlot()
def on_pushButton_start_clicked(self):# 获取图像数据流self.cap = cv2.VideoCapture(self.camera_index)# 判断数据流是否打开if self.cap.isOpened():# ‘开始’按钮设置为不可用# 以免二次误点造成错误self.pushButton_start.setEnabled(False)# 开始帧循环self.video_flg = Truewhile self.video_flg:# 按帧读取图像ret, self.img_scr = self.cap.read()# opencv中图像为BGR,这里转为RGB# 因为我的SSD训练时用的是RGB图像,顺序错误会影响检测准确性self.img_scr = cv2.cvtColor(self.img_scr, cv2.COLOR_BGR2RGB)# SSD检测self.preds = self.ssd.Predict(self.img_scr)# 对检测结果过滤self.preds = self.filter(self.preds, inclued_class=self.include_class)# 将检测结果绘制到图像self.img_scr = self.draw_img(self.img_scr, self.preds)# 将检测结果显示在QTextEdit控件上h, w = self.img_scr.shape[:2]self.text = self.decode_preds(self.preds, w=w, h=h)self.textEdit.setText(self.text)# 更新显示图像self.show_img(self.img_scr)# 强制更新UI# 如果没有,界面就‘假死’了,因为一直处于循环里QApplication.processEvents()else:self.textEdit.setText('摄像头未打开!!!\n请检查')

‘结束’点击槽函数

功能:改变帧循环条件停止循环;为下一次开始做准备

@pyqtSlot()def on_pushButton_end_clicked(self):# 改变循环条件,停止循环self.video_flg = False# 显示空白图片self.show_img(self.img_none)# 清除TextEdit中的显示self.textEdit.clear()# 释放摄像头/数据流# 先判断是不是当前实例是不是有‘cap’成员# 防止摄像头已经释放完了,再次点击时报错if hasattr(self, 'cap'):# 释放摄像头self.cap.release()# 删除成员变量del self.cap# 将‘开始’设置为可以点击,为再开始做准备self.pushButton_start.setEnabled(True)

关注下方公众号,回复关键字即可获取下载地址。
  • 方案1源代码下载:

    回复“SSD界面1”获取。


如果你读后有收获,欢迎关注我的微信公众号
上面有更多完全免费教程,我也会不定期更新
ღ ღ ღ 打开微信扫描下方二维码关注 ღ ღ ღ

在这里插入图片描述

这篇关于【搞事情】利用PyQt为目标检测SSD300添加界面(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/935540

相关文章

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

[数据集][目标检测]血细胞检测数据集VOC+YOLO格式2757张4类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2757 标注数量(xml文件个数):2757 标注数量(txt文件个数):2757 标注类别数:4 标注类别名称:["Platelets","RBC","WBC","sickle cell"] 每个类别标注的框数:

一款支持同一个屏幕界面同时播放多个视频的视频播放软件

GridPlayer 是一款基于 VLC 的免费开源跨平台多视频同步播放工具,支持在一块屏幕上同时播放多个视频。其主要功能包括: 多视频播放:用户可以在一个窗口中同时播放任意数量的视频,数量仅受硬件性能限制。支持多种格式和流媒体:GridPlayer 支持所有由 VLC 支持的视频格式以及流媒体 URL(如 m3u8 链接)。自定义网格布局:用户可以配置播放器的网格布局,以适应不同的观看需求。硬

Temu官方宣导务必将所有的点位材料进行检测-RSL资质检测

关于饰品类产品合规问题宣导: 产品法规RSL要求 RSL测试是根据REACH法规及附录17的要求进行测试。REACH法规是欧洲一项重要的法规,其中包含许多对化学物质进行限制的规定和高度关注物质。 为了确保珠宝首饰的安全性,欧盟REACH法规规定,珠宝首饰上架各大电商平台前必须进行RSLReport(欧盟禁限用化学物质检测报告)资质认证,以确保产品不含对人体有害的化学物质。 RSL-铅,

Python知识点:如何使用Python开发桌面应用(Tkinter、PyQt)

Python 提供了多个库来开发桌面应用程序,其中最常见的两个是 Tkinter 和 PyQt。这两者各有优点,选择取决于你的需求。以下我会介绍如何使用 Tkinter 和 PyQt 开发简单的桌面应用程序。 1. 使用 Tkinter 开发桌面应用 Tkinter 是 Python 的标准库,它非常轻量级且跨平台。它适合开发简单的桌面应用,入门较容易。 安装 Tkinter Tkinte