当前位置: 首页 > news >正文

物体识别系统(识别图片中的物体)

      这是一个基于 PyTorch 和 PyQt5 的物体识别程序,使用 Faster R-CNN 模型来识别图片中的物体,并通过图形界面展示识别结果。

1.用户界面

  • 主窗口:包含加载图片、识别、清除按钮,以及图片显示区域和结果展示区域。
  • 图片显示:支持显示原始图片和处理后的图片(标注了识别结果)。
  • 结果显示:显示识别到的物体类别和置信度。

2. 核心功能

  • 加载图片:用户可以通过点击“加载图片”按钮选择本地图片文件。
  • 物体识别:使用 Faster R-CNN 模型识别图片中的物体。
  • 标注结果:在图片上绘制矩形框,并标注物体类别和置信度。
  • 显示结果:在界面中显示所有识别到的物体及其类别和置信度。
  • 清除显示:点击“清除”按钮,清空图片和结果显示区域。

3. 技术细节

  • Faster R-CNN 模型:使用 PyTorch 提供的预训练 Faster R-CNN 模型(基于 COCO 数据集)。
  • 图片处理:使用 OpenCV 进行图片的加载、格式转换和标注。
  • 类别映射:将模型输出的类别 ID 映射为 COCO 数据集的类别名称(如 person, car, dog 等)。
  • 置信度过滤:只显示置信度大于 0.5 的物体。
import sys
import cv2
import torch
import torchvision
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QFileDialog)
from PyQt5.QtGui import QPixmap, QImage
from PyQt5.QtCore import Qtclass ObjectDetector(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("物体识别系统")self.setGeometry(100, 100, 800, 600)# 初始化UIself.init_ui()# 加载预训练的Faster R-CNN模型self.model = torchvision.models.detection.fasterrcnn_resnet50_fpn(weights=torchvision.models.detection.FasterRCNN_ResNet50_FPN_Weights.DEFAULT)self.model.eval()# COCO数据集类别名称self.coco_class_names = ['person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light','fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow','elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee','skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard','tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple','sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch','potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone','microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear','hair drier', 'toothbrush']# 验证 COCO 和模型匹配性print(f"COCO 类别数量: {len(self.coco_class_names)}")  # 应为 80def init_ui(self):"""初始化用户界面"""# 创建主窗口部件和布局central_widget = QWidget()self.setCentralWidget(central_widget)layout = QVBoxLayout(central_widget)# 创建顶部按钮区域button_layout = QHBoxLayout()# 添加按钮self.btn_load = QPushButton("加载图片", self)self.btn_load.clicked.connect(self.load_image)button_layout.addWidget(self.btn_load)self.btn_detect = QPushButton("识别", self)self.btn_detect.clicked.connect(self.detect_objects)button_layout.addWidget(self.btn_detect)self.btn_clear = QPushButton("清除", self)self.btn_clear.clicked.connect(self.clear_display)button_layout.addWidget(self.btn_clear)layout.addLayout(button_layout)# 创建显示区域display_layout = QHBoxLayout()# 原始图片显示self.image_label = QLabel()self.image_label.setMinimumSize(400, 400)self.image_label.setAlignment(Qt.AlignCenter)self.image_label.setStyleSheet("border: 2px solid black;")display_layout.addWidget(self.image_label)# 处理后的图片显示self.processed_label = QLabel()self.processed_label.setMinimumSize(400, 400)self.processed_label.setAlignment(Qt.AlignCenter)self.processed_label.setStyleSheet("border: 2px solid black;")display_layout.addWidget(self.processed_label)layout.addLayout(display_layout)# 结果显示self.result_label = QLabel("识别结果将在这里显示")self.result_label.setAlignment(Qt.AlignCenter)self.result_label.setStyleSheet("""QLabel {font-size: 24px;margin: 20px;padding: 10px;background-color: #f0f0f0;border-radius: 5px;}""")layout.addWidget(self.result_label)# 初始化变量self.current_image = Noneself.processed_image = Nonedef load_image(self):"""加载图片"""file_name, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "Image Files (*.png *.jpg *.jpeg *.bmp)")if file_name:# 读取图片self.current_image = cv2.imread(file_name)if self.current_image is None:self.result_label.setText("无法加载图片!")return# 显示原始图片self.display_image(self.current_image, self.image_label)def display_image(self, image, label):"""显示图片到指定的标签"""height, width = image.shape[:2]bytes_per_line = 3 * widthq_image = QImage(image.data, width, height, bytes_per_line, QImage.Format_RGB888).rgbSwapped()pixmap = QPixmap.fromImage(q_image)scaled_pixmap = pixmap.scaled(label.size(), Qt.KeepAspectRatio)label.setPixmap(scaled_pixmap)def detect_objects(self):"""识别图片中的物体"""if self.current_image is None:self.result_label.setText("请先加载图片!")return# 将OpenCV的BGR图片转换为RGBimage_rgb = cv2.cvtColor(self.current_image, cv2.COLOR_BGR2RGB)# 将NumPy数组转换为PyTorch Tensorimage_tensor = torch.from_numpy(image_rgb).permute(2, 0, 1).float() / 255.0# 添加batch维度image_tensor = image_tensor.unsqueeze(0)# 使用Faster R-CNN模型进行物体识别with torch.no_grad():results = self.model(image_tensor)# 打印模型输出的类别 IDprint(f"模型输出的类别 ID: {results[0]['labels']}")# 处理识别结果self.processed_image = self.current_image.copy()for box, label, score in zip(results[0]['boxes'], results[0]['labels'], results[0]['scores']):if score > 0.5:  # 只显示置信度大于0.5的物体if 1 <= label <= 80:  # 检查类别 ID 是否在有效范围内x1, y1, x2, y2 = map(int, box)cv2.rectangle(self.processed_image, (x1, y1), (x2, y2), (0, 255, 0), 2)class_name = self.coco_class_names[label - 1]  # COCO类别ID从1开始cv2.putText(self.processed_image, f"{class_name}: {score:.2f}", (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)else:print(f"警告: 无效的类别 ID: {label}")# 显示处理后的图片self.display_image(self.processed_image, self.processed_label)# 显示识别结果detected_objects = []for label, score in zip(results[0]['labels'], results[0]['scores']):if score > 0.5:if 1 <= label <= 80:  # 检查类别 ID 是否在有效范围内class_name = self.coco_class_names[label - 1]  # COCO类别ID从1开始detected_objects.append(f"类别: {class_name}, 置信度: {score:.2f}")else:print(f"警告: 无效的类别 ID: {label}")if detected_objects:self.result_label.setText("识别结果:\n" + "\n".join(detected_objects))else:self.result_label.setText("未识别到物体!")def clear_display(self):"""清除显示"""self.image_label.clear()self.processed_label.clear()self.result_label.setText("识别结果将在这里显示")self.current_image = Noneself.processed_image = Nonedef main():app = QApplication(sys.argv)window = ObjectDetector()window.show()sys.exit(app.exec_())if __name__ == "__main__":main() 

相关文章:

物体识别系统(识别图片中的物体)

这是一个基于 PyTorch 和 PyQt5 的物体识别程序&#xff0c;使用 Faster R-CNN 模型来识别图片中的物体&#xff0c;并通过图形界面展示识别结果。 1.用户界面 主窗口&#xff1a;包含加载图片、识别、清除按钮&#xff0c;以及图片显示区域和结果展示区域。 图片显示&#…...

数据表的存储过程和函数介绍

文章目录 一、概述二、创建存储过程三、在创建过程中使用变量四、光标的使用五、流程控制的使用六、查看和删除存储过程 一、概述 存储过程和函数是在数据库中定义的一些SQL语句的集合&#xff0c;然后直接调用这些存储过程和函数来执行已经定义好的SQL语句。存储过程和函数可…...

【DeepSeek-R1背后的技术】系列九:MLA(Multi-Head Latent Attention,多头潜在注意力)

【DeepSeek背后的技术】系列博文&#xff1a; 第1篇&#xff1a;混合专家模型&#xff08;MoE&#xff09; 第2篇&#xff1a;大模型知识蒸馏&#xff08;Knowledge Distillation&#xff09; 第3篇&#xff1a;强化学习&#xff08;Reinforcement Learning, RL&#xff09; 第…...

【JavaWeb12】数据交换与异步请求:JSON与Ajax的绝妙搭配是否塑造了Web的交互革命?

文章目录 &#x1f30d;一. 数据交换--JSON❄️1. JSON介绍❄️2. JSON 快速入门❄️3. JSON 对象和字符串对象转换❄️4. JSON 在 java 中使用❄️5. 代码演示 &#x1f30d;二. 异步请求--Ajax❄️1. 基本介绍❄️2. JavaScript 原生 Ajax 请求❄️3. JQuery 的 Ajax 请求 &a…...

[特殊字符] 蓝桥杯 Java B 组 之位运算(异或性质、二进制操作)

Day 6&#xff1a;位运算&#xff08;异或性质、二进制操作&#xff09; &#x1f4d6; 一、位运算简介 位运算是计算机底层优化的重要手段&#xff0c;利用二进制操作可以大大提高运算速度。常见的位运算包括&#xff1a; 与&#xff08;&&#xff09;&#xff1a;a &am…...

[MDM 2024]Spatial-Temporal Large Language Model for Traffic Prediction

论文网址&#xff1a;[2401.10134] Spatial-Temporal Large Language Model for Traffic Prediction 论文代码&#xff1a;GitHub - ChenxiLiu-HNU/ST-LLM: Official implementation of the paper "Spatial-Temporal Large Language Model for Traffic Prediction" …...

LTO优化详解

嵌入式开发过程中的LTO优化是什么意思&#xff1f;能够用来解决什么问题&#xff1f;它都优化了哪些&#xff1f;仅开启LTO真的可以优化SIZE的问题吗? 请分别回答我刚才提到的问题&#xff1f; 嗯&#xff0c;用户问关于嵌入式开发中的LTO优化&#xff0c;我需要详细解释这个概…...

分布式事务三阶段协议

分布式事务的三阶段分别是准备阶段、预提交阶段和提交 / 回滚阶段&#xff0c;以下是详细介绍&#xff1a; 三阶段提交协议可以理解为两阶段提交协议的改良版&#xff0c;是在协调者和参与者中都引入超时机制&#xff0c;并且把两阶段提交协议的第一个阶段分成了两步: 询问&am…...

LLaMA-Factory|微调大语言模型初探索(4),64G显存微调13b模型

上篇文章记录了使用lora微调deepseek-7b&#xff0c;微调成功&#xff0c;但是微调llama3-8b显存爆炸&#xff0c;这次尝试使用qlora微调HQQ方式量化&#xff0c;微调更大参数体量的大语言模型&#xff0c;记录下来微调过程&#xff0c;仅供参考。 对过程不感兴趣的兄弟们可以直…...

常用高压缩率的视频容器格式,并进行大比例压缩

常用的高压缩率视频容器格式,包括*.mp4 、*.mkv、*.webM等。     容器格式本身并不直接决定压缩率,而是取决于容器中所使用的视频编码格式等因素。不过,在常见的视频容器格式中,一些容器在搭配特定编码格式时,通常能表现出较高的压缩效率,以下是相关介绍: 1 MKV格式 …...

代码编译(词法义)

1.预处理 (Preprocessing)&#xff1a; 在这个阶段&#xff0c;编译器会处理所有以 # 开头的指令&#xff0c;如 #include、#define 等。它会把头文件的内容插入到源代码中&#xff0c;进行宏替换等预处理操作&#xff0c;生成一个纯净的代码文件。 3.词法分析 (Lexical Analy…...

android,flutter 混合开发,pigeon通信,传参

文章目录 app效果native和flutter通信的基础知识1. 编解码器 一致性和完整性&#xff0c;安全性&#xff0c;性能优化2. android代码3. dart代码 1. 创建flutter_module2.修改 Android 项目的 settings.gradle&#xff0c;添加 Flutter module3. 在 Android app 的 build.gradl…...

at32f403a rt thread led基础bsp工程测试

1.led工程官方bsp使用 导出一个独立的AT32F403A的BSP工程 下载RTT源代码 gitee更新较慢 https://gitee.com/rtthread/rt-thread github版本更新最新 https://github.com/RT-Thread/rt-thread. 切换到V5.1.0分支(使用一个发布版本可以避免不必要的bug) 导出一个独立的AT32BSP…...

DeepSeek写贪吃蛇手机小游戏

DeepSeek写贪吃蛇手机小游戏 提问 根据提的要求&#xff0c;让DeepSeek整理的需求&#xff0c;进行提问&#xff0c;内容如下&#xff1a; 请生成一个包含以下功能的可运行移动端贪吃蛇H5文件&#xff1a; 要求 蛇和食物红点要清晰&#xff0c;不超过屏幕外 下方有暂停和重新…...

【好玩的工具和命令】 ASCII 艺术生成工具: figlet

figlet 是一款用于生成 ASCII 艺术文字的工具&#xff0c;支持多种字体样式。它能将输入的文本转换为由字符组成的大型字母图案&#xff0c;广泛应用于命令行环境下的标题展示或装饰。 核心功能 生成 ASCII 文字艺术&#xff1a;将普通文本转化为大号的、由字符构成的艺术字…...

工具--安川伺服故障代码

上传一下安川伺服故障代码&#xff0c;后续结合实际维修经验&#xff0c;逐个整理分析&#xff0c;绝对超出手册经验 故障代码 故障描述 a.020/a.02 用户参数和数检查异常 1 a.021/a.02 参数格式化异常 1 a.022/a.02 系统参数和数检查异常 1 a.023/a.02 参数密码异常…...

车载软件架构 --- OEM主机厂如何打入软件供应商内部?

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…...

AI 编程助手 cursor的系统提示词 prompt

# Role 你是一名极其优秀具有10年经验的产品经理和精通java编程语言的架构师。与你交流的用户是不懂代码的初中生&#xff0c;不善于表达产品和代码需求。你的工作对用户来说非常重要&#xff0c;完成后将获得10000美元奖励。 # Goal 你的目标是帮助用户以他容易理解的…...

Matlab写入点云数据到Rosbag

最近有需要读取一个点云并做处理后&#xff0c;重新写回rosbag。网上有很多读取的教程&#xff0c;但没有写入。自己写入时也遇到了很多麻烦&#xff0c;踩了一堆坑进行记录。 1. rosbag中一个lidar的msg有哪些信息&#xff1f; 通过如下代码&#xff0c;先读取一个rosbag的l…...

业务流程相关的权威认证和培训有哪些

业务流程的认证和培训种类繁多&#xff0c;旨在帮助专业人士掌握业务流程管理 (BPM) 的知识和技能&#xff0c;从而提升个人职业发展和组织运营效率。下面分别介绍&#xff1a; 一、 业务流程认证和培训的种类 业务流程的认证和培训可以大致分为以下几类&#xff0c;涵盖了不…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...