基于 YOLOv11 实现无人货柜商品实时检测(大屏展示版)
本文介绍了一个基于YOLOv11的无人售货柜商品实时检测系统。系统实现了纯净的目标检测功能,仅显示检测框、中文类别标签和置信度,无冗余信息。关键特性包括:英文标签自动映射中文、解决OpenCV中文乱码问题、支持高置信度过滤和RTSP视频流全屏显示。代码提供完整的参数说明,包括置信度阈值(0.5-0.7)和NMS去重阈值(0.45-0.6)的建议范围,并详细说明了中文显示和全屏实现的解决方案。系统运
·
目录
本文基于 YOLOv11 完成无人售货柜商品实时检测,实现纯目标检测 + 中文标签显示 + 全屏展示,无多余轨迹、ID 与 ROI,代码干净、运行高效,可直接用于项目演示与部署。
一、实现功能
- 只保留检测框 + 类别 + 置信度,无冗余绘制
- 英文标签自动映射中文:cola/ksf/lc/qc → 可乐 / 康师傅 / 云雾绿茶 / 茉莉清茶
- 解决 OpenCV 中文乱码问题
- 高置信度过滤,减少误检
- 支持 RTSP 视频流,画面全屏显示
- 按
q键退出程序
二、完整代码
python
运行
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
from ultralytics import YOLO
# 加载训练好的YOLOv11模型
model = YOLO('runs/detect/runs/train/retail_yolo11_optimized7/weights/best.pt')
# 英文标签映射中文名称
label_map = {
"cola": "可乐",
"ksf": "康师傅",
"lc": "云雾绿茶",
"qc": "茉莉清茶"
}
# 视频源与分辨率
WIDTH, HEIGHT = 1920, 1080
CAMERA_SOURCE = "rtsp://192.168.1.13:554/stream1"
# 打开视频流
cap = cv2.VideoCapture(CAMERA_SOURCE)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, WIDTH)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, HEIGHT)
if not cap.isOpened():
print("Error: 无法打开摄像头/RTSP流")
exit()
# 加载中文字体,解决乱码
try:
font = ImageFont.truetype("simhei.ttf", 18)
except:
font = ImageFont.load_default()
# 设置窗口全屏
cv2.namedWindow("Unmanned Cabinet Detection", cv2.WND_PROP_FULLSCREEN)
cv2.setWindowProperty("Unmanned Cabinet Detection",
cv2.WND_PROP_FULLSCREEN,
cv2.WINDOW_FULLSCREEN)
# 主检测循环
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("Error: 视频读取失败")
break
# YOLO预测:conf置信度阈值,iou为NMS去重阈值
results = model.predict(frame, conf=0.6, iou=0.5)
# 转为PIL格式实现中文绘制
frame_pil = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
draw = ImageDraw.Draw(frame_pil)
# 遍历检测结果
for det in results[0].boxes:
x1, y1, x2, y2 = map(int, det.xyxy[0].cpu().numpy())
cls_name = model.names[int(det.cls.item())]
conf = det.conf.item()
# 映射中文标签
show_name = label_map.get(cls_name, cls_name)
label = f"{show_name} {conf:.2f}"
# 绘制检测框
draw.rectangle([(x1, y1), (x2, y2)], outline=(0, 255, 0), width=2)
# 绘制中文标签
draw.text((x1, y1 - 22), label, font=font, fill=(0, 255, 0))
# 转回OpenCV格式显示
annotated_frame = cv2.cvtColor(np.array(frame_pil), cv2.COLOR_RGB2BGR)
cv2.imshow("Unmanned Cabinet Detection", annotated_frame)
# 按q退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
三、关键参数说明
1. conf(置信度阈值)
python
运行
conf=0.6
- 只保留置信度 ≥ 60% 的检测结果
- 数值越高,误检越少,漏检可能增加
- 货柜场景建议:
0.5~0.7
2. iou(NMS 去重阈值)
python
运行
iou=0.5
- 去除同一物体的重复框
- IoU>0.5 视为同一目标,只保留置信度最高框
- 建议范围:
0.45~0.6
3. 中文乱码解决方案
使用 PIL 替代 OpenCV 原生文字绘制,加载系统黑体字库 simhei.ttf,完美支持中文显示。
4. 全屏显示
通过以下两行实现窗口全屏,适合现场演示:
python
运行
cv2.namedWindow(..., cv2.WND_PROP_FULLSCREEN)
cv2.setWindowProperty(...)
四、使用说明
- 将模型路径替换为自己的
best.pt - RTSP 地址改为实际摄像头地址
- 安装依赖:
bash
运行
pip install ultralytics opencv-python pillow numpy
- 运行后自动全屏展示检测效果
- 按
q关闭程序
五、效果展示
- 绿色框标注商品位置
- 左上角显示中文商品名 + 置信度
- 无杂乱轨迹与 ID,画面简洁清爽
- 低误检、高流畅度,适合无人柜实时识别
更多推荐
所有评论(0)