首页 / 资讯中心 / 文章详情

基于 YOLO11 的超市店铺偷窃行为智能识别系统 | 源码项目分享

基于 YOLO11 的超市店铺偷窃行为智能识别系统 | 源码项目分享 ★ FEATURED ARTICLE
基于 YOLO11 的超市店铺偷窃行为智能识别系统一套面向便利店 / 商超 / 连锁零售场景的实时偷窃行为视觉识别平台使用 YOLO11n Streamlit 构建支持单图、批量、视频与摄像头多源接入自动标记可疑行为并输出风险分析。一、背景1.1 行业痛点零售门店因品类多、客流大、监控盲区分散人工盯屏识别商品藏匿、未结账离场等行为效率低、漏检率高。传统视频监控只能事后回看取证无法做到实时告警。本项目用计算机视觉目标检测的方式对收银区、货架区、通道等关键区域的正常购物与可疑盗窃两类行为进行实时识别与风险分级给店员和店长一个看得见的智能复核工具。数据集采集自真实超市场景规模 4000 张图像覆盖货架区、收银区、通道等核心区域包含光线变化、人员密度差异等真实情况二分类标注正常/盗窃可有效缓解模型在真实零售环境中的过拟合问题。视频演示与源码下载https://www.bilibili.com/video/BV1HTph6EEtR/包含完整项目源码预训练模型权重️数据集1.2 项目运行效果Web 界面总览深海蓝 警戒红的监控风视觉侧栏聚合关键指标批量图片识别 行为分析图表1.3 项目介绍创新点 / 亮点维度说明告警类别可配configs/project.yaml中alert_classes决定哪些类别算风险无需改代码风险分级 UI命中可疑行为时顶部 banner 自动变红正常时变绿便于一线门店人员快速识别多源接入同一界面切换单图 / 批量 / 视频 / 摄像头覆盖事后复核 实时巡店中文模型类别训练阶段直接使用[正常,盗窃]中文标签前端零翻译展示系统功能概览单张图片识别上传现场画面 → 输出标注图 目标明细 风险等级批量图片识别多张图片或 ZIP 压缩包批量推理输出风险分布图表视频识别逐帧推理 时间线分布导出标注视频与行为明细 CSV摄像头实时检测浏览器调用本机摄像头单帧推理 风险标注技术栈层级技术选型检测模型YOLO11nUltralyticsWeb 框架Streamlit图像处理OpenCV、Pillow数据 / 图表Pandas、Plotly、Streamlit 原生图表视频编解码imageio-ffmpeg部署本地 Python 3.9 macOS / Linux支持容器化部署类别定义nc2names[正常, 盗窃]。二、设计框架系统架构浏览器 ↔ Streamlit 前端 ↔ 推理服务YOLO11 ↔ 模型权重model/best.pt配置由configs/project.yaml驱动业务话术、告警类别和 UI 主题色。┌────────────────────────────────────────────────────────────┐ │ 用户浏览器 │ │ 单张图片 │ 批量图片 │ 视频 │ 摄像头 │ └──────────────────────┬─────────────────────────────────────┘ │ HTTP / WebSocket ┌──────────────────────▼─────────────────────────────────────┐ │ Streamlit App (app/streamlit_app.py) │ │ · 模式路由st.radio │ │ · 上传 / 预览 / 分析图表 │ │ · 风险等级 banner 类别分布 │ └──────────────────────┬─────────────────────────────────────┘ │ model.predict() ┌──────────────────────▼─────────────────────────────────────┐ │ YOLO11n 推理引擎 │ │ Backbone (C2f SPPF) → Neck (FPN PAN) → Decoupled Head │ │ DFL分布式回归 → NMS │ └──────────────────────┬─────────────────────────────────────┘ │ result.boxes (cls, conf, xyxy) ┌──────────────────────▼─────────────────────────────────────┐ │ 后处理apply_class_display is_alert_class │ │ → 渲染标注图 DataFrame 明细 风险分级 │ └────────────────────────────────────────────────────────────┘YOLO11 网络结构与 v8 同源更深更轻Backbone连续Conv C2f块下采样 5 次末端SPPF聚合多尺度特征NeckFPN自顶向下PAN自底向上双向融合Head解耦头分类 / 回归分离回归侧使用DFL输出分布而非单值小目标定位更稳损失BCE分类 CIoU DFL回归检测流程图像/帧 → 缩放至 imgsz640 → 推理 → 置信度过滤conf0.35→ NMSiou0.7→ 类别映射 → 风险打标 → 前端渲染。三、代码结构核心 50 行 解析项目结构精简版超市偷窃行为检测/ ├── app/streamlit_app.py # Streamlit Web 入口含 4 种接入模式 ├── configs/project.yaml # 业务配置标题、告警类别、UI 主题 ├── model/best.pt # 训练好的 YOLO11n 权重 ├── scripts/ # 训练 / 评测 / 导出脚本 ├── data/dataset/ # 数据集train / valid / test └── 超市店铺偷窃行为检测train_CH_yolo11n/train/ # 训练产物指标、曲线核心 50 行app/streamlit_app.py关键片段已删减无关 UIfrompathlibimportPathimportpandasaspdimportstreamlitasstfromultralyticsimportYOLO PROJECT_ROOTPath(__file__).resolve().parent.parent MODEL_PATHPROJECT_ROOT/model/best.ptALERT_CLASSES{盗窃}# 来源project.yaml - app.alert_classesDEFAULT_CONF0.35# 来源project.yaml - inference.confst.cache_resource(show_spinnerFalse)defload_model(model_path:str)-YOLO:returnYOLO(model_path)# 一次加载、全局复用避免每次推理重载权重definfer_image_path(model:YOLO,image_path:Path,conf:float):resultmodel.predict(str(image_path),confconf,verboseFalse)[0]annotatedresult.plot()# 自带画框 类别 置信度rows[]ifresult.boxesisnotNone:forboxinresult.boxes:cls_idint(box.cls.item())rows.append({class_id:cls_id,class_name:result.names[cls_id],confidence:round(float(box.conf.item()),4),x1:float(box.xyxy[0][0]),y1:float(box.xyxy[0][1]),x2:float(box.xyxy[0][2]),y2:float(box.xyxy[0][3]),})returnannotated[:,:,::-1],pd.DataFrame(rows)# BGR - RGBdefis_alert_class(name:str)-bool:returnnameinALERT_CLASSES# ---------------- Streamlit 主流程 ----------------st.set_page_config(page_title超市店铺偷窃行为智能识别系统,layoutwide)modelload_model(str(MODEL_PATH))confst.sidebar.slider(置信度阈值,0.05,0.95,DEFAULT_CONF,0.05)modest.radio(接入源,[单张图片,批量图片,视频,摄像头],horizontalTrue)ifmode单张图片:uploadedst.file_uploader(上传现场图片,type[jpg,png,jpeg])ifuploadedisnotNone:img_bytesuploaded.getvalue()annotated,dfinfer_image_path(model,Path(uploaded.name),conf)col1,col2st.columns(2)col1.image(img_bytes,caption现场画面,widthstretch)col2.image(annotated,caption识别结果,widthstretch)alert_nint(df[class_name].map(is_alert_class).sum())ifnotdf.emptyelse0st.metric(可疑行为数量,alert_n,delta需复核ifalert_nelseNone)st.dataframe(df,widthstretch)逐段解析st.cache_resource装饰load_modelStreamlit 每次交互都会重跑脚本缓存可避免反复YOLO(...)加载单图响应从秒级降到毫秒级。model.predict(confconf, verboseFalse)一行完成预处理 推理 NMS返回Results对象.plot()直接得带框图省去手画 OpenCV 矩形的工作量。result.boxes遍历每个目标把cls / conf / xyxy抽成 DataFrame前端用st.dataframe展示明细也便于后续导出 CSV / 入库。is_alert_class把业务告警与模型类别解耦告警清单在configs/project.yaml里维护新增风险类型时不用改代码。st.radioif/elif路由四种接入模式复用同一个model实例单图 / 批量 / 视频 / 摄像头共享同一份推理逻辑。四、训练效果训练采用 YOLO11n 预训练权重微调epochs200, imgsz640, batch16, patience50。最终关键指标指标数值Precision (B)0.731Recall (B)0.852mAP0.50.824mAP0.5:0.950.630说明当前 mAP0.5 ≈ 0.82整体可用但仍在迭代中。下一阶段会通过以下方式继续提升扩充盗窃难样本藏入袖口、推车遮挡、低光环境等长尾场景引入跟踪ByteTrack抑制单帧抖动把可疑帧聚合成可疑事件升级到 YOLO11s/m 提升小目标识别精度再用 INT8 量化平衡推理速度由于本阶段 mAP 尚未达到放出 PR / 混淆矩阵的内部阈值≥ 0.85暂仅展示训练 loss / 指标随 epoch 变化的总览图。从曲线看box / cls / dfl loss 平稳下降P/R/mAP 在中后段趋于平台期未出现过拟合震荡。五、项目总结做对了什么业务配置全部抽到project.yaml告警类别、置信度、UI 主题、品牌话术可一键替换一套代码切换不同零售场景。类别名直接用中文训练前端零翻译、风险 banner 与告警颜色深海蓝 警戒红符合监控审美。推理函数返回(annotated_image, DataFrame)单图 / 批量 / 视频 / 摄像头四个入口复用同一份核心新增模式只改 UI。还能怎么做加入轻量目标跟踪ByteTrack / BoT-SORT把帧级检测升级为事件级告警减少单帧误报对店员的打扰。接入门店摄像头 RTSP 流结合时间窗口聚合对长时间停留 商品消失做组合规则。模型蒸馏 / 量化在边缘盒子如 Jetson Orin Nano上跑 INT8 YOLO11n把响应时延压到 50ms 以内。一句话总结YOLO11n Streamlit 给了零售业一套开箱即用、配置驱动的偷窃行为复核工具训练数据替换 project.yaml改两行就能复用到便利店、商超、连锁店等多形态门店场景。
阅读完成 · 觉得有帮助?
咨询建站