智能安规考核系统:AI(YOLO+讯飞语音)赋能千人千面
前言项目介绍近期,完成了“千人千面智能安规考核系统”的研发与部署工作。该系统旨在通过人工智能技术实现电力、建筑等行业安全规程考核的自动化、智能化与个性化,全面提升考核效率与公正性。系统基于PyQt5框架进行桌面端封装,具备良好的用户交互界面与跨平台兼容性。通过融合多种前沿深度学习模型,构建了一套多模态智能考评体系,涵盖的技术如下:姿态估计(YOLOPose):用于精准识别考生在实操过程中的身体姿态与动作规范性,如登高作业姿势、设备操作流程等,确保动作符合安全规程要求。人脸识别:实现考生身份自动核验,防止替考,保障考核过程的真实性与可追溯性。目标检测(YOLOv11):对考核场景中的关键安全装备进行实时检测,包括安全帽佩戴、工作服着装规范、35kV绝缘手套使用、布控球安装状态等,确保个人防护与设备操作符合标准。语音识别:集成科大讯飞高精度语音识别接口,自动识别并评估考生对安全规程的口述背诵内容,实现“听、看、做”一体化智能评分。为提升系统的部署灵活性与运行效率,项目进行了深度优化:所有PyTorch训练模型(.pt)均被转换为ONNX(Open Neural Network Exchange)格式,实现模型的跨框架兼容与轻量化部署。利用ONNX Runtime结合GPU(CUDA)加速,显著提升推理速度,确保在复杂场景下仍能实现实时、低延迟的多任务并行处理。整个系统通过PyInstaller打包为独立的.exe可执行文件,无需安装复杂环境,一键式部署,极大降低了现场运维门槛,适用于对安全性要求较高的工业现场。选择 ONNX 的理由为何要将pt格式文件转换为ONNX格式呢,原因如下:特性/方面PyTorch (PT)ONNX框架类型深度学习开发框架模型交换格式适用阶段研发、训练阶段部署阶段推理性能原生支持一般,可通过 TorchScript 或 JIT 提升支持通过 ONNX Runtime 及其他高性能引擎优化推理性能跨平台兼容性主要针对特定环境(如 Python),需要额外工作实现跨平台设计用于跨平台兼容,支持多种硬件和操作系统互操作性有限,主要在 PyTorch 生态内高,支持与 TensorFlow, MXNet 等多个框架互操作部署复杂度相对较高,尤其是跨框架或跨平台时较低,简化了跨框架和跨平台的部署流程社区和支持强大的社区支持和活跃的开发者群体良好的社区支持,特别是对于工业级应用和生产部署|应用场景| 适用于研究、原型设计以及小规模应用 | 更适合大规模部署、跨平台应用及需要高性能推理的场景 |跨平台兼容性:ONNX 支持多种深度学习框架和硬件平台,使得模型可以在不同的环境中高效运行。简化部署流程:通过使用 ONNX 格式,可以减少因框架差异导致的部署难题。性能优化:利用 ONNX Runtime 或者其他支持 ONNX 的高性能引擎可以获得比原生框架更好的推理速度。团队协作:ONNX 作为一种开放标准,促进了不同背景的开发者之间的协作,提高了模型共享和重用的效率。千人千面安全规范考核系统系统流程图如下:接下来,博主将根据技术栈进行系统介绍:系统 UI 与功能设计整个系统使用PyQt5进行开发,各个界面及其功能如下:系统首页该界面是主界面,后续的页面都是一个个widget,不断的切换到这个主界面中。主界面代码如下:classExamHomePage(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle("千人千面考试系统")self.setWindowFlags(Qt.FramelessWindowHint)self.setWindowIcon(QIcon(resource_path("images/logo.ico")))screen=QApplication.primaryScreen()screen_geometry=screen.availableGeometry()self.width=screen_geometry.width()self.height=screen_geometry.height()self.setGeometry(0,0,self.width,self.height)self.setFixedSize(self.width,self.height)self.user_id=""self.id_card=""self.name=""self.api_data=[]self.selected_items=[]# 页面容器self.stacked_widget=QStackedWidget(self)self.setCentralWidget(self.stacked_widget)# 创建一个 QLabel 用于背景self.bg_label=QLabel(self.stacked_widget)self.bg_label.setGeometry(self.stacked_widget.rect())bg_pixmap=QPixmap(resource_path("images/bg.jpg"))self.bg_label.setPixmap(bg_pixmap)self.bg_label.setScaledContents(True)# 图片随 label 缩放self.bg_label.lower()# 将背景 label 放在最底层# 首页self.home_page=QWidget()self.init_home_page()self.stacked_widget.addWidget(self.home_page)# 人脸匹配页self.face_match_page=FaceMatchPage(parent=self)self.stacked_widget.addWidget(self.face_match_page)# index 1#考试项目选择self.exam_select_page=ExamSelectionPage(parent=self)self.stacked_widget.addWidget(self.exam_select_page)# index 2# 考试页面self.exam_page=ExamApp(exam_name="",selected_items="",parent=self)self.stacked_widget.addWidget(self.exam_page)# index 3在主界面加载完成后,即可初始化首页:definit_home_page(self):layout=QVBoxLayout()layout.setAlignment(Qt.AlignCenter)# 背景图background=QLabel(self.home_page)background.setPixmap(QPixmap(resource_path("images/img.jpg")).scaled(self.width,self.height+150))background.setStyleSheet("background-color: rgba(0, 0, 0, 120);")background.resize(self.width,self.height)container=QWidget(self.home_page)container.setStyleSheet(""" background-color: rgba(40, 40, 40, 180); border-radius: 20px; padding: 30px; """)container.setFixedSize(int(self.width*0.4),int(self.height*0.5))layout_container=QVBoxLayout()layout_container.setAlignment(Qt.AlignTop)title=QLabel("考试须知",self.home_page)title.setAlignment(Qt.AlignCenter)title.setStyleSheet("font-size: 48px; font-weight: bold; color: white; margin-bottom: 20px;")layout_container.addWidget(title)notice_text=QLabel(""" style.notice {color:white;font-size:30px;line-height:1.2;text-align:left;}/style div p1. 请确保摄像头和麦克风正常工作。/p p2. 确保考试环境安静且无干扰。/p p3. 准备好有效身份证件以备查验。/p p4. 不得使用任何参考资料或电子设备。/p p5. 保持面部清晰可见,不得遮挡五官。/p p6. 违反考试规则将取消考试资格。/p /div """)notice_text.setWordWrap(True)layout_container.addWidget(notice_text)layout_container.addSpacing(20)start_button=QPushButton("进入考试",self.home_page)start_button.setFixedSize(int(container.width()*0.5),int(self.height*0.06))start_button.setStyleSheet(""" QPushButton { background-color: #4CAF50; border: none; color: white; font-size: 42px; padding: 10px; border-radius: 15px; } QPushButton:hover { background-color: #32CD32; color: white; border: 2px solid #8FBC8F; } """)start_button.clicked.connect(self.goto_face_match_page)layout_container.addWidget(start_button,alignment=Qt.AlignCenter)container.setLayout(layout_container)x=(self.width-container.width())//2y=(self.height-container.height())//2container.move(x,y)layout.addWidget(container)self.home_page.setLayout(layout)人脸认证人脸识别是一种通过分析人脸图像或视频来识别个体身份的技术,其基本原理可以分为以下几个关键步骤:人脸检测 (Face Detection):首先,系统需要在图像或视频流中找到人脸的位置。这通常通过检测人脸的轮廓、五官(如眼睛、鼻子、嘴巴)的相对位置和特征来实现,将人脸区域从背景中分割出来,并用一个矩形框标记。关键点定位与对齐 (Landmark Detection Alignment):在检测到的人脸区域内,系统会定位关键的面部特征点(如眼角、鼻尖、嘴角等)。这些点用于对人脸进行几何校正(对齐),例如旋转、缩放,以消除姿态、角度变化带来的影响,确保后续分析的准确性。特征提取 (Feature Extraction):这是核心步骤。系统利用深度学习模型(如卷积神经网络CNN)分析对齐后的人脸图像,将其转换成一个高维度的数字向量(称为“特征向量”或“嵌入向量”Embedding)。这个向量是人脸的数学化表示,它高度浓缩了能区分不同个体的独特面部特征(如五官的形状、相对距离、纹理等),同时尽量忽略光照、表情、发型等非本质变化。特征比对与识别 (Feature Comparison Recognition):识别 (Recognition/Identification):将提取出的特征向量与数据库中存储的已知身份的特征向量进行比对。计算它们之间的相似度(通常用余弦相似度或欧氏距离衡量)。系统会找到最相似的向量,并将对应的身份作为识别结果。验证 (Verification):判断当前人脸特征向量是否与某个特定身份(如ID)的特征向量匹配(“1:1比对”),回答“是不是某人”的问题。核心思想:人脸识别的本质是将复杂的、直观的人脸视觉信息,转化为计算机易于存储、计算和比较的数字特征。通过深度学习,模型学习到如何生成这种特征向量,使得同一个人在不同照片下的特征向量距离很近,而不同人的特征向量距离很远,从而实现准确的身份识别。这里,博主直接使用OpenCV中的库实现人脸识别:人脸库构建首先是人脸库构建,这里博主使用的是anno构建的方式,因为先前使用faiss方式构建时,在使用pyinstaller打包时会失败。这里下面的人脸检测模型(face_detection.onnx)与特征提取模型(face_recognition.onnx)是使用的OpenCV中自带的人脸库实现的。importcv2importosimportnumpyasnpfromannoyimportAnnoyIndex# 加载模型face_detector=cv2.FaceDetectorYN_create("D:/workspace/qianren/onnx_inference/models/face_detection.onnx","",(320,320))face_recognizer=cv2.FaceRecognizerSF_create("D:/workspace/qianren/onnx_inference/models/face_recognition.onnx","")# 人脸库目录dataset_dir="D:/faces/faces"# 每个人一个文件夹,如 faces_dataset/person_001/*.jpgfeature_list=[]name_list=[]forperson_nameinos.listdir(dataset_dir):person_path=os.path.join(dataset_dir,person_name)ifnotos.path.isdir(person_path):continueforimg_fileinos.listdir(person_path):img_path=os.path.join(person_path,img_file)img=cv2.imread(img_path)h,w=img.shape[:2]face_detector.setInputSize((w,h))_,faces=face_detector.detect(img)iffacesisnotNoneandlen(faces)0:aligned_face=face_recognizer.alignCrop(img,faces[0])embedding=face_recognizer.feature(aligned_face).flatten().astype('float32')# 对特征向量进行 L2 归一化(余弦相似度需要)embedding/=np.linalg.norm(embedding)feature_list.append(embedding)name_list.append(person_name)# 转换为 numpy 数组feature_array=np.array(feature_list).astype('float32')# 获取维度dimension=feature_array.shape[1]# 创建 Annoy 索引(使用余弦相似度)annoy_index=AnnoyIndex(dimension,metric='angular')# angular 表示余弦距离# 添加向量到索引fori,vectorinenumerate(feature_array):annoy_index.add_item(i,vector)# 构建索引(n_trees 是搜索速度与准确率之间的权衡)annoy_index.build(n_trees=10)# 保存索引和名字列表annoy_index.save("ann_face_index.ann")np.save("../datasets/ann_name_list.npy",np.array(name_list))print("人脸库构建完成!")人脸识别人脸识别代码如下:importcv2# 加载模型face_detector=cv2.FaceDetectorYN_create("D:/workspace/qianren/onnx_inference/models/face_detection.onnx","",(320,320))face_recognizer=cv2.FaceRecognizerSF_create("D:/workspace/qianren/onnx_inference/models/face_recognition.onnx","")# 加载注册图像reference_img=cv2.imread("face.jpg")h,w=reference_img.shape[:2]face_detector.setInputSize((w,h))# 检测人脸_,faces=face_detector.detect(reference_img)iffacesisNone:print("人脸特征不明显,无法开启摄像...")aligned_face=face_recognizer.alignCrop(reference_img,faces[0])ref_embedding=face_recognizer.feature(aligned_face)print("已加载参考图像特征,启动摄像头...")# 打开摄像头cap=cv2.VideoCapture(0)whileTrue:ret,frame=cap.read()ifnotret:breakh,w=frame.shape[:2]face_detector.setInputSize((w,h))_,faces=face_detector.detect(frame)iffacesisnotNoneandlen(faces)0:foridx,faceinenumerate(faces):# 获取当前人脸 bounding boxbox=list(map(int,face[:4]))# x, y, width, heightaligned=face_recognizer.alignCrop(frame,face)embedding=face_recognizer.feature(aligned)# 计算相似度cosine_score=cv2.matchTemplate(ref_embedding,embedding,cv2.TM_CCOEFF_NORMED)[0]

相关新闻

T3MP3ST 网络侦察引擎原理:从 DNS 枚举到服务指纹识别的底层技术

T3MP3ST 网络侦察引擎原理:从 DNS 枚举到服务指纹识别的底层技术

T3MP3ST 网络侦察引擎原理:从 DNS 枚举到服务指纹识别的底层技术 【免费下载链接】T3MP3ST autonomous red teaming platform; multi-agent offensive-security meta-harness 项目地址: https://gitcode.com/gh_mirrors/t3/T3MP3ST T3MP3ST 作为一款自主红队…

2026/10/18 23:11:11 阅读更多 →
如何高效使用SpotiFLAC封面下载功能:从技术原理到实战应用完整指南

如何高效使用SpotiFLAC封面下载功能:从技术原理到实战应用完整指南

如何高效使用SpotiFLAC封面下载功能:从技术原理到实战应用完整指南 【免费下载链接】SpotiFLAC Get Spotify tracks in true FLAC from Tidal, Qobuz & Amazon Music — no account required. 项目地址: https://gitcode.com/GitHub_Trending/sp/SpotiFLAC …

2026/10/16 7:12:05 阅读更多 →
Tox21毒性预测案例:Chainer Chemistry多任务学习最佳实践

Tox21毒性预测案例:Chainer Chemistry多任务学习最佳实践

Tox21毒性预测案例:Chainer Chemistry多任务学习最佳实践 【免费下载链接】chainer-chemistry Chainer Chemistry: A Library for Deep Learning in Biology and Chemistry 项目地址: https://gitcode.com/gh_mirrors/ch/chainer-chemistry Chainer Chemistr…

2026/10/16 7:23:00 阅读更多 →

最新新闻

SSTI服务端模板注入实战:Jinja2漏洞原理、绕过与防御

SSTI服务端模板注入实战:Jinja2漏洞原理、绕过与防御

1. 漏洞本质与攻击面梳理1.1 模板引擎为什么成了攻击目标SSTI(Server-Side Template Injection,服务端模板注入)这个漏洞,我第一次真正意识到它的危害,是在一次授权渗透测试中遇到一个用Flask写的内部管理系统。那个系…

2026/10/19 5:40:26 阅读更多 →
Java版jieba分词实战:Trie+DAG+HMM构建中文分词引擎

Java版jieba分词实战:Trie+DAG+HMM构建中文分词引擎

简介:这是基于Python版jieba分词封装的Java实现项目,面向需要在Java服务端或桌面应用中进行中文分词的开发者。项目包含完整源码、词典文件与Eclipse工程配置,解压后可直接导入运行。包内共30个文件,以java源码、class编译文件及t…

2026/10/19 5:40:26 阅读更多 →
Pico一体机Unity工程解析:从交互链路到APK部署的完整指南

Pico一体机Unity工程解析:从交互链路到APK部署的完整指南

简介:面向Pico一体机开发的Unity工程包,基于Unity 5.6.1f1搭建,适合VR开发者、Unity初学者及需要快速上手Pico手柄交互的团队。工程内已按项目开发场景划分好文件夹结构,并写好手柄射线检测方法,使用者只需调用Pvr_Con…

2026/10/19 5:40:26 阅读更多 →
Kiterunner与Postman联动,打造持续运转的API安全测试闭环

Kiterunner与Postman联动,打造持续运转的API安全测试闭环

UI 刚迭代完,某后台系统的接口权限验证又漏了新加的导出接口,这种场景干安全的同行应该都熟。API 安全测试最尴尬的处境不是漏洞多,而是测完一轮之后,下个版本一来,之前的结论全部作废。我自己的解法是:用 …

2026/10/19 5:40:26 阅读更多 →
CSV解析器实战:状态机与流式读取如何解决脏数据与陷阱

CSV解析器实战:状态机与流式读取如何解决脏数据与陷阱

简介:面向C#开发者的CSV解析示例程序包,聚焦CSV(逗号分隔值)文件的读取、字段分割与引号转义处理。源代码使用C#编写,配合Windows窗体演示了解析全过程,适合需要实现数据导入导出、批量处理表格数据的.NET初…

2026/10/19 5:40:26 阅读更多 →
开源真实世界数据集AGIBOT WORLD 2026:具身智能数据瓶颈与解法解析

开源真实世界数据集AGIBOT WORLD 2026:具身智能数据瓶颈与解法解析

如果问当前具身智能领域最缺什么,很多一线研发者会不约而同回答两个字:数据。语言模型和视觉模型这些年吃掉了海量互联网文本和图片,收益肉眼可见;但机器人操作模型完全不是这个玩法,它依赖的是机械臂在真实任务中记录…

2026/10/19 5:39:26 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →