news 2026/9/28 22:57:44

商店偷窃行为识别数据集:COCO标注与YOLOv8训练实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
商店偷窃行为识别数据集:COCO标注与YOLOv8训练实战

简介:面向智能安防与零售场景的行为识别开发者,这份商店偷窃行为识别数据集可直接用于目标检测与异常行为分类模型的训练与验证。数据以COCO格式对8395张原始图片完成标注,覆盖真实门店监控视角下的偷窃动作,官方给出的平均准确率可达98.6%,适合作为算法选型、模型微调与效果对比的基准数据。资源包共2000个文件,以1995张jpg图像为主体,另含3个json标注文件与2个txt说明文件,压缩包约455.58MB,图像与标注一一对应,便于直接接入YOLO、Detectron2等主流框架。目前已有545人学习下载,读者可据此快速搭建训练流水线,完成数据加载、类别映射与精度评估,并借助高准确率基线验证自身模型在真实监控画面中的泛化能力,减少从零采集与标注的成本。

1. 商店偷窃行为识别数据集:8395 张 COCO 标注图怎么撑起 98.6% 准确率

做零售安防算法的同行最近都在问同一件事:有没有一份开箱即用的商店偷窃行为识别数据集,标注格式别太偏门,最好直接能喂给 YOLOv8 或者 RT-DETR 训练。我手上这份 8395 张原始图片、按 COCO 格式标注、宣称平均准确率 98.6% 的数据集,正好踩中了这个需求。它解决的不是“有没有数据”的问题,而是“标注质量能不能直接进训练管线”的问题——COCO 格式意味着你可以跳过格式转换,直接接 detectron2、MMDetection 或者 ultralytics 的 dataloader。适合谁?做零售防损、智慧门店、行为识别落地的算法工程师,以及想拿真实场景数据跑通目标检测全流程的开发者。但 98.6% 这个数字得先打个问号,后面我会讲清楚它是在什么条件下测出来的,以及你复现时大概率会遇到的落差。

2. COCO 格式的商店偷窃数据集:结构拆解与加载验证

2.1 为什么选 COCO 而不是 VOC 或 YOLO 格式

商店偷窃行为识别本质上是一个目标检测任务,检测对象通常是“人 + 手部动作 + 商品交互区域”。COCO 格式的核心优势在于它用单一 JSON 文件描述所有图像的标注,字段结构是 images、annotations、categories 三张表通过 id 关联。相比 VOC 的每图一个 XML,COCO 在 8395 张这个量级下管理起来更省心;相比 YOLO 的每图一个 txt,COCO 保留了类别名称、分割多边形、面积等元信息,后续要做行为分类或者时序建模时不用回头补标注。

我一般会先确认三件事:categories 里到底定义了几个类、annotations 里 bbox 的坐标系是不是绝对像素值、images 里的 file_name 是否和实际文件一一对应。这三件事任何一件出问题,训练时 loss 会直接 NaN 或者 mAP 归零。

2.2 用 pycocotools 做一次完整性体检

拿到数据集别急着开训,先跑一遍体检脚本。下面这段代码检查标注文件的基本健康度:

from pycocotools.coco import COCO import os ann_file = 'annotations/instances_train.json' img_dir = 'images/train' coco = COCO(ann_file) # 1. 类别清单 cats = coco.loadCats(coco.getCatIds()) print('类别:', [(c['id'], c['name']) for c in cats]) # 2. 图片与标注数量 img_ids = coco.getImgIds() ann_ids = coco.getAnnIds() print(f'图片数: {len(img_ids)}, 标注数: {len(ann_ids)}') # 3. 检查每张图是否有对应文件 missing = [] for img_id in img_ids: info = coco.loadImgs(img_id)[0] path = os.path.join(img_dir, info['file_name']) if not os.path.exists(path): missing.append(info['file_name']) print(f'缺失文件数: {len(missing)}') if missing[:5]: print('前5个缺失:', missing[:5]) # 4. 检查 bbox 是否越界 bad_bbox = [] for ann in coco.loadAnns(ann_ids): x, y, w, h = ann['bbox'] img = coco.loadImgs(ann['image_id'])[0] if x < 0 or y < 0 or x + w > img['width'] or y + h > img['height']: bad_bbox.append(ann['id']) print(f'越界 bbox 数: {len(bad_bbox)}')

逻辑说明:loadCats 拿到类别映射,这是后面配置模型 num_classes 的依据;loadImgs 和 loadAnns 分别拉取图片和标注列表;缺失文件检查是血泪经验——很多数据集打包时 file_name 带了子目录前缀,解压后路径对不上,训练时直接报 FileNotFoundError。越界 bbox 检查是因为 COCO 允许 bbox 超出图像边界,但大部分检测框架的 dataloader 不会自动裁剪,越界框会导致归一化后坐标大于 1,模型学出来的框会飘。

参数说明:ann_file 指向你的标注 JSON,img_dir 指向图片根目录。如果你的数据集分了 train/val/test,三个 split 都要跑一遍。类别数如果超过 2(比如“正常购物”和“偷窃”),要确认 categories 里没有把背景类也算进去。

2.3 转成 YOLO 格式时的四个边界坑

虽然 COCO 能直接喂给 MMDetection,但很多人还是习惯用 ultralytics 的 YOLOv8 训练。转格式时我踩过四个坑:

第一,COCO 的 bbox 是 [x, y, width, height],YOLO 要的是 [x_center, y_center, width, height] 且全部归一化到 0-1。转换时 x_center = (x + w/2) / img_width,少除一次就全错。

第二,类别 id 要从 0 开始连续。COCO 的 category_id 可能是 1、3、7 这种不连续的,YOLO 要求 0 到 num_classes-1。我一般建一个 id 映射表,别偷懒直接用原 id。

第三,图片文件名里的空格和特殊字符。YOLO 的 dataloader 对路径里的空格处理不一致,建议转换时统一重命名成下划线。

第四,空标注图片。COCO 里有些图可能没有对应 annotation,转 YOLO 时会生成空 txt,训练时这些图会被当成负样本。如果你的任务里“正常购物”也算一类,空标注图不能直接丢,得补上背景类或者单独处理。

3. 从 8395 张图到 98.6% 准确率:训练管线与参数配置

3.1 数据划分与增强策略

8395 张图不算多,尤其是行为识别这种类内差异大的任务。我一般按 7:2:1 分 train/val/test,但如果原始数据里偷窃样本占比低于 30%,要做过采样或者 focal loss 加权。增强策略上,商店场景的光照变化和遮挡是主要难点,所以:

  • 随机亮度/对比度调整(brightness=0.2, contrast=0.2)
  • 随机遮挡(cutout 或 mosaic)
  • 水平翻转(flipud=0.0, fliplr=0.5,因为偷窃动作有方向性,垂直翻转会破坏语义)
  • 缩放(scale=0.5,模拟不同距离的监控视角)

Mosaic 增强在 YOLOv8 里默认开启,但我建议在最后 10 个 epoch 关掉,让模型适应真实分布。

3.2 YOLOv8 训练配置与关键参数

下面是一份我常用的 YOLOv8 训练配置,针对商店偷窃场景调过:

from ultralytics import YOLO model = YOLO('yolov8m.pt') # 中等规模,平衡速度和精度 results = model.train( data='shoplifting.yaml', # 数据集配置文件 epochs=120, imgsz=640, batch=16, lr0=0.01, # 初始学习率 lrf=0.01, # 最终学习率因子 momentum=0.937, weight_decay=0.0005, warmup_epochs=3, warmup_momentum=0.8, box=7.5, # box loss 权重 cls=0.5, # cls loss 权重 dfl=1.5, # dfl loss 权重 hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, # 不做旋转,监控视角固定 translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, mosaic=1.0, mixup=0.0, # 行为识别慎用 mixup copy_paste=0.0, patience=20, # 早停 device=0, workers=8, project='shoplifting', name='yolov8m_640' )

逻辑说明:box、cls、dfl 三个 loss 权重是 YOLOv8 的核心调节旋钮。商店偷窃场景里,偷窃动作的边界框往往比正常购物更模糊(手部遮挡、商品遮挡),所以我把 box 权重从默认 7.5 保持不变,cls 从 0.5 保持不变,但如果你的验证集上分类错误多,可以适当提高 cls 到 0.8-1.0。mixup 我设成 0,因为行为识别里两张图叠加会破坏动作语义,模型学不到有效特征。

参数说明:imgsz=640 是精度和速度的平衡点,如果监控截图分辨率高且小目标多,可以上 1280,但 batch 要相应降到 8 或 4。lr0=0.01 是 SGD 的常用起点,如果你用 AdamW,改成 0.001。patience=20 表示 20 个 epoch 验证集 mAP 不涨就停,防止过拟合。

3.3 98.6% 准确率是在什么条件下测出来的

这个数字大概率是在特定测试集上、特定 IoU 阈值下、特定类别定义下得到的。我复现时发现三个关键变量:

第一,IoU 阈值。如果按 IoU=0.5 算 mAP,98.6% 有可能;如果按 IoU=0.75 算,通常会掉 10-15 个点。报告里没写清楚的话,默认按 0.5 理解。

第二,类别定义。如果数据集只分“偷窃”和“非偷窃”两类,且“非偷窃”样本里大部分是空场景,那准确率天然会高。真正难的是区分“拿起商品看”和“拿起商品塞进包里”这种细粒度动作。

第三,测试集来源。如果测试集和训练集来自同一批监控摄像头、同一时间段,那 98.6% 不奇怪;但如果跨摄像头、跨光照条件,能到 85% 就算不错了。

我一般会自己划一个“困难测试集”:挑出所有遮挡严重、光照差、动作模糊的样本,单独跑一遍。这个数字才是你落地时该信的。

4. 商店偷窃识别落地避坑:5 个真实翻车记录

4.1 现象:训练 loss 正常下降但验证 mAP 始终为 0

原因:COCO 标注文件里的 category_id 和 YOLO 配置文件里的 names 顺序对不上。比如 COCO 里 id=1 是“正常”,id=2 是“偷窃”,但 YAML 里写成了 0: 偷窃, 1: 正常。模型学出来的类别索引和验证时计算的索引错位,mAP 直接归零。

解决:转换格式时打印出 id 到 name 的映射,和 YAML 里的 names 逐行核对。我习惯在转换脚本里加一行 assert,确保映射一致。

4.2 现象:模型在验证集上表现很好,但部署到实际监控视频里频繁误报

原因:训练图片是截帧,分辨率、宽高比和实际视频流不一致。监控视频通常是 16:9 或 4:3,而数据集里的图片可能被裁剪过。另外,训练时用的增强(比如 mosaic)让模型没见过完整的单帧场景。

解决:部署前用实际视频流抽 200 帧做一次推理测试,统计误报率和漏报率。如果误报高,把置信度阈值从 0.25 提到 0.4-0.5;如果漏报高,降低到 0.15 并配合跟踪算法做时序平滑。

4.3 现象:小目标(手部动作)检测效果差,大目标(人体)正常

原因:8395 张图里,手部区域的 bbox 平均面积可能只有整图的 2%-5%,YOLOv8 的 P3 特征图(80x80)对这么小的目标分辨率不够。

解决:两个方向。一是把 imgsz 从 640 提到 1024 或 1280,让 P3 特征图变大;二是在 YOLOv8 配置里增加 P2 检测头(需要改模型结构),专门抓小目标。我一般先试提分辨率,成本低见效快。

4.4 现象:数据集中“偷窃”和“正常”样本比例 1:9,模型偏向预测正常

原因:类别不平衡。8395 张图里如果偷窃样本只有 800 多张,模型学到的先验就是“大部分情况是正常”。

解决:在 YAML 里给偷窃类加权重,或者用 focal loss 替代 BCE loss。YOLOv8 默认的 cls loss 是 BCE,可以通过修改 cls 权重来间接调节。更直接的办法是对偷窃样本做过采样,复制 2-3 倍进训练集,但要注意验证集不能过采样。

4.5 现象:换了一个超市的监控数据,模型准确率从 98% 掉到 60%

原因:域偏移。不同超市的货架布局、摄像头角度、光照色温、顾客着装风格都不一样。模型在原始数据集上过拟合了。

解决:做域自适应。最简单的是在目标域数据上做少量微调(fine-tune),哪怕只有 500 张标注图,也能把准确率拉回 85% 以上。如果目标域没有标注,用伪标签或者 Test-Time Adaptation(TTA)也能救急。

5. 把 98.6% 变成你自己的数字:验证方法与微调技巧

拿到任何宣称高准确率的数据集,我第一件事是跑一个“三集验证”:训练集、验证集、自建困难集。训练集准确率高于验证集 5 个点以上,说明过拟合;验证集高于困难集 10 个点以上,说明域偏移严重。这两个差距比绝对数字更有参考价值。

具体操作上,我会从 8395 张图里随机抽 500 张不参与训练,再手动挑 200 张“困难样本”(遮挡、模糊、光照差),组成一个 700 张的测试集。然后跑三次推理:

from ultralytics import YOLO model = YOLO('runs/detect/shoplifting/yolov8m_640/weights/best.pt') # 在自建测试集上评估 metrics = model.val( data='shoplifting_test.yaml', imgsz=640, batch=8, conf=0.001, # 评估时用低阈值,让 PR 曲线完整 iou=0.6, # NMS 的 IoU 阈值 save_json=True, # 保存 COCO 格式结果,方便和 pycocotools 对比 plots=True ) print(f'mAP50: {metrics.box.map50:.4f}') print(f'mAP50-95: {metrics.box.map:.4f}')

逻辑说明:conf=0.001 是为了让 PR 曲线覆盖所有召回率区间,评估时不能用部署时的 0.25。iou=0.6 是 NMS 的阈值,不是评估的 IoU 阈值,别搞混。save_json=True 会输出 COCO 格式的预测结果,你可以用 pycocotools 再算一遍,交叉验证 ultralytics 的评估逻辑有没有 bug。

参数说明:如果你的困难集里小目标多,imgsz 要和你训练时保持一致,否则评估结果不可比。batch=8 是显存不够时的保守值,显存够可以上 16。

微调技巧上,我一般分两步:先冻结 backbone 只训 head,10 个 epoch,学习率 0.001;再解冻全部,30 个 epoch,学习率 0.0001。这样比直接端到端微调收敛更快,且不容易破坏预训练特征。如果目标域数据少于 1000 张,第二步的学习率再降一个数量级。

最后说个习惯:我从来不信数据集自带的准确率数字,只信自己在困难集上跑出来的 mAP50-95。8395 张 COCO 标注图是个不错的起点,但 98.6% 是别人的场景,你的场景得你自己测。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 22:54:40

Substrate 是什么?不是 Kubernetes 也不是 Agent,而是可组合区块链底座

1. Substrate 是什么&#xff1f;它和你听说的那些“Agent”“Kubernetes”“OCI”到底什么关系&#xff1f;Substrate 不是某个具体工具、命令或配置项&#xff0c;而是一套可组合、可裁剪、可嵌入的区块链底层构建框架。它由 Parity Technologies&#xff08;以太坊早期核心开…

作者头像 李华
网站建设 2026/9/28 22:53:16

自研实现Halcon透视变形模板匹配:从原理到工程落地

1. 透视变形模板匹配到底难在哪做过工业视觉的人都知道&#xff0c;模板匹配算子用起来最顺手的是find_shape_model&#xff0c;拿一个标准件把轮廓一训&#xff0c;产线上转个角度、缩放一点&#xff0c;基本都能稳稳找到。但现实里总有一些场景会让这套流程直接失效——最典型…

作者头像 李华
网站建设 2026/9/28 22:52:34

基于CH552的USB HID键盘模拟器实战:从枚举到按键上报全解析

前阵子我给自己定了个小目标&#xff1a;用最少的花费&#xff0c;做一个能自定义键位的USB HID键盘模拟器。起因是日常写代码需要频繁敲组合键&#xff0c;有些软件里的快捷键用得非常频繁&#xff0c;一个独立的宏键盘能省下不少重复操作。看了一圈成品&#xff0c;要么价格不…

作者头像 李华
网站建设 2026/9/28 22:51:57

MySQL索引优化实战:B+树、EXPLAIN与索引失效场景全解

1. 索引的本质与底层逻辑&#xff1a;为什么数据库需要它聊到 MySQL 性能调优&#xff0c;索引几乎是绕不开的核心话题。很多初级开发者对索引的理解停留在“给表加个索引查询就快了”这个层面&#xff0c;至于为什么快、快在哪里、什么时候不加反而不利&#xff0c;经常是一笔…

作者头像 李华
网站建设 2026/9/28 22:51:53

从Oracle到电科金仓:国产数据库迁移的融合技术与落地实践

先说一个背景&#xff1a;这几年做数据迁移和数据库运维的朋友&#xff0c;应该都明显感觉到国产数据库的讨论度完全不一样了。早些年聊国产库&#xff0c;大家第一反应是“能不能用”&#xff0c;现在聊的是“怎么平滑切过去、成本要控到什么程度”。在众多产品里&#xff0c;…

作者头像 李华
网站建设 2026/9/28 22:44:17

iFlow CLI Hook机制:Windows长任务完成自动通知实践

1. 在Windows上跑任务&#xff0c;为什么必须把"完成通知"当回事1.1 长任务消耗的是"注意力"&#xff0c;不是时间在Windows上跑构建、批量转码、数据同步这类长任务&#xff0c;最大的痛点其实不是机器慢&#xff0c;而是你的注意力被绑死了。任务一跑十几…

作者头像 李华