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

物品识别——基于python语言

目录

1.物品识别

2.模型介绍

3.文件框架

4.代码示例

4.1 camera.py

4.2 interaction.py

4.3 object_detection.py

4.4 main.py

4.5 运行结果

5.总结


1.物品识别

该项目使用Python,OpenCV进行图像捕捉,进行物品识别。我们将使用YOLO(You Only Look Once)模型进行物品识别,YOLO是一个高效的实时物体检测系统。

2.模型介绍

YOLO(You Only Look Once)是一种目标检测算法,它在实时性和精确度上取得了很好的平衡。它的核心思想是在一张图片上同时预测出所有物体的位置和类别,而无需像传统的区域提议网络(R-CNN)那样分步骤进行。

3.文件框架

 models中的定义标签文件可以搜索yolo模型来找,下面的四个代码文件是主文件,camera是调用电脑摄像头,interaction是调用opencv绘制图像框,object_detection是定义物品检测函数,main是主函数。

运行main函数即可实现物品检测。

4.代码示例

4.1 camera.py

import cv2  # 导入OpenCV库def get_camera_frame():cap = cv2.VideoCapture(0)  # 打开摄像头if not cap.isOpened():raise Exception("无法打开摄像头。")  # 如果无法打开摄像头,抛出异常ret, frame = cap.read()  # 读取帧cap.release()  # 释放摄像头if not ret:raise Exception("读取照片信息失败。")  # 如果读取失败,抛出异常return frame  # 返回捕捉到的帧

4.2 interaction.py

import cv2  # 导入OpenCV库def draw_boxes(frame, detections):for (class_name, confidence, box) in detections:x, y, w, h = boxlabel = f"{class_name} {confidence:.2f}"  # 创建标签cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)  # 绘制矩形框cv2.putText(frame, label, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)  # 绘制标签return frame  # 返回绘制后的帧

4.3 object_detection.py

import cv2  # 导入OpenCV库,用于计算机视觉任务
import numpy as np  # 导入NumPy库,用于处理数组class ObjectDetector:def __init__(self, config_path, weights_path, names_path):# 初始化YOLO模型self.net = cv2.dnn.readNetFromDarknet(config_path, weights_path)self.layer_names = self.net.getLayerNames()# 获取YOLO模型的输出层self.output_layers = [self.layer_names[i - 1] for i in self.net.getUnconnectedOutLayers()]# 读入类别名称with open(names_path, 'r') as f:self.classes = [line.strip() for line in f.readlines()]def detect_objects(self, frame):height, width = frame.shape[:2]  # 获取图像的高度和宽度# 将图像转换为YOLO模型输入所需的blob格式blob = cv2.dnn.blobFromImage(frame, 0.00392, (416, 416), (0, 0, 0), True, crop=False)self.net.setInput(blob)  # 设置YOLO模型的输入outs = self.net.forward(self.output_layers)  # 前向传播,获取检测结果class_ids = []  # 存储检测到的类别IDconfidences = []  # 存储检测到的置信度boxes = []  # 存储检测到的边框# 处理每个输出层的检测结果for out in outs:for detection in out:scores = detection[5:]  # 获取每个类别的置信度分数class_id = np.argmax(scores)  # 获取置信度最高的类别IDconfidence = scores[class_id]  # 获取最高置信度if confidence > 0.5:  # 过滤低置信度的检测结果center_x = int(detection[0] * width)center_y = int(detection[1] * height)w = int(detection[2] * width)h = int(detection[3] * height)x = int(center_x - w / 2)y = int(center_y - h / 2)boxes.append([x, y, w, h])confidences.append(float(confidence))class_ids.append(class_id)# 非极大值抑制,去除冗余的边框indices = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)result = []if len(indices) > 0:for i in indices.flatten():  # 确保indices是一个可迭代的列表box = boxes[i]result.append((self.classes[class_ids[i]], confidences[i], box))return result

4.4 main.py

import sys
import os
import cv2  # 导入OpenCV库
from camera import get_camera_frame  # 导入相机捕捉函数
from object_detection import ObjectDetector  # 导入物体检测类
from interaction import draw_boxes  # 导入绘制边框函数def main():# 配置文件路径config_path = "./pythonProject/ai_modle_win/wupin/models/yolov3.cfg"weights_path = "./pythonProject/ai_modle_win/wupin/models/yolov3.weights"names_path = "./pythonProject/ai_modle_win/wupin/models/coco.names"# 初始化物体检测器detector = ObjectDetector(config_path, weights_path, names_path)while True:frame = get_camera_frame()  # 获取摄像头帧detections = detector.detect_objects(frame)  # 检测物体frame = draw_boxes(frame, detections)  # 绘制检测结果cv2.imshow("Object Detection", frame)  # 显示结果if cv2.waitKey(1) & 0xFF == ord('q'):  # 按下 'q' 键退出breakcv2.destroyAllWindows()  # 关闭所有窗口if __name__ == "__main__":main()

4.5 运行结果

5.总结

YOLO的主要用途是计算机视觉中的目标检测任务,例如自动驾驶中的行人和车辆识别、安防监控、无人机拍摄分析等场景,它能够实现实时检测,并且对于小目标和大目标都具备较好的性能。你也快来试一试吧!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 人工智能GPT____豆包使用的一些初步探索步骤 体验不一样的工作
  • [NSSRound#4 SWPU]hide_and_seek-用gdb调试
  • 【2024】前端学习笔记6-容器标签div
  • 人工智能开发实战matplotlib库应用基础
  • 性能测试-jmeter的控制器(十六)
  • 腾讯云升级多个云存储解决方案 以智能化存储助力企业增长
  • 物联网——DMA+AD多通道
  • Flutter - Win32程序是如何执行main函数
  • 易语言源码用键盘按键代替小键盘写法教程
  • esp32-C2 对接火山引擎实现智能语音(一)
  • 只有C盘的windows系统通过磁盘分区分出D盘
  • 计算机毕业设计 基于协同过滤算法的个性化音乐推荐系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • electron react离线使用monaco-editor
  • 算法练习题27——疫情下的电影院(模拟)
  • OpenStack × OceanBase: 打造高可用可扩展的基础设施平台
  • 11111111
  • angular学习第一篇-----环境搭建
  • E-HPC支持多队列管理和自动伸缩
  • es6
  • JAVA SE 6 GC调优笔记
  • JS实现简单的MVC模式开发小游戏
  • mysql_config not found
  • 从伪并行的 Python 多线程说起
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 机器学习学习笔记一
  • 什么是Javascript函数节流?
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 06-01 点餐小程序前台界面搭建
  • No resource identifier found for attribute,RxJava之zip操作符
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • #pragma 指令
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • ${ }的特别功能
  • (1)(1.11) SiK Radio v2(一)
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (补充)IDEA项目结构
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET NPOI导出Excel详解
  • .NET/C#⾯试题汇总系列:集合、异常、泛型、LINQ、委托、EF!(完整版)
  • .NET单元测试使用AutoFixture按需填充的方法总结
  • .NET上SQLite的连接
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .Net组件程序设计之线程、并发管理(一)
  • ::什么意思
  • @Autowired和@Resource装配
  • @Bean注解详解