尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

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

发布时间:2026/9/28 22:57:49

资讯中心
01
ARTICLE

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

商店偷窃行为识别数据集: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 的每图一个 XMLCOCO 在 8395 张这个量级下管理起来更省心相比 YOLO 的每图一个 txtCOCO 保留了类别名称、分割多边形、面积等元信息后续要做行为分类或者时序建模时不用回头补标注。我一般会先确认三件事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 指向你的标注 JSONimg_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 加权。增强策略上商店场景的光照变化和遮挡是主要难点所以随机亮度/对比度调整brightness0.2, contrast0.2随机遮挡cutout 或 mosaic水平翻转flipud0.0, fliplr0.5因为偷窃动作有方向性垂直翻转会破坏语义缩放scale0.5模拟不同距离的监控视角Mosaic 增强在 YOLOv8 里默认开启但我建议在最后 10 个 epoch 关掉让模型适应真实分布。3.2 YOLOv8 训练配置与关键参数下面是一份我常用的 YOLOv8 训练配置针对商店偷窃场景调过from ultralytics import YOLO model YOLO(yolov8m.pt) # 中等规模平衡速度和精度 results model.train( datashoplifting.yaml, # 数据集配置文件 epochs120, imgsz640, batch16, lr00.01, # 初始学习率 lrf0.01, # 最终学习率因子 momentum0.937, weight_decay0.0005, warmup_epochs3, warmup_momentum0.8, box7.5, # box loss 权重 cls0.5, # cls loss 权重 dfl1.5, # dfl loss 权重 hsv_h0.015, hsv_s0.7, hsv_v0.4, degrees0.0, # 不做旋转监控视角固定 translate0.1, scale0.5, shear0.0, perspective0.0, flipud0.0, fliplr0.5, mosaic1.0, mixup0.0, # 行为识别慎用 mixup copy_paste0.0, patience20, # 早停 device0, workers8, projectshoplifting, nameyolov8m_640 )逻辑说明box、cls、dfl 三个 loss 权重是 YOLOv8 的核心调节旋钮。商店偷窃场景里偷窃动作的边界框往往比正常购物更模糊手部遮挡、商品遮挡所以我把 box 权重从默认 7.5 保持不变cls 从 0.5 保持不变但如果你的验证集上分类错误多可以适当提高 cls 到 0.8-1.0。mixup 我设成 0因为行为识别里两张图叠加会破坏动作语义模型学不到有效特征。参数说明imgsz640 是精度和速度的平衡点如果监控截图分辨率高且小目标多可以上 1280但 batch 要相应降到 8 或 4。lr00.01 是 SGD 的常用起点如果你用 AdamW改成 0.001。patience20 表示 20 个 epoch 验证集 mAP 不涨就停防止过拟合。3.3 98.6% 准确率是在什么条件下测出来的这个数字大概率是在特定测试集上、特定 IoU 阈值下、特定类别定义下得到的。我复现时发现三个关键变量第一IoU 阈值。如果按 IoU0.5 算 mAP98.6% 有可能如果按 IoU0.75 算通常会掉 10-15 个点。报告里没写清楚的话默认按 0.5 理解。第二类别定义。如果数据集只分“偷窃”和“非偷窃”两类且“非偷窃”样本里大部分是空场景那准确率天然会高。真正难的是区分“拿起商品看”和“拿起商品塞进包里”这种细粒度动作。第三测试集来源。如果测试集和训练集来自同一批监控摄像头、同一时间段那 98.6% 不奇怪但如果跨摄像头、跨光照条件能到 85% 就算不错了。我一般会自己划一个“困难测试集”挑出所有遮挡严重、光照差、动作模糊的样本单独跑一遍。这个数字才是你落地时该信的。4. 商店偷窃识别落地避坑5 个真实翻车记录4.1 现象训练 loss 正常下降但验证 mAP 始终为 0原因COCO 标注文件里的 category_id 和 YOLO 配置文件里的 names 顺序对不上。比如 COCO 里 id1 是“正常”id2 是“偷窃”但 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 AdaptationTTA也能救急。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( datashoplifting_test.yaml, imgsz640, batch8, conf0.001, # 评估时用低阈值让 PR 曲线完整 iou0.6, # NMS 的 IoU 阈值 save_jsonTrue, # 保存 COCO 格式结果方便和 pycocotools 对比 plotsTrue ) print(fmAP50: {metrics.box.map50:.4f}) print(fmAP50-95: {metrics.box.map:.4f})逻辑说明conf0.001 是为了让 PR 曲线覆盖所有召回率区间评估时不能用部署时的 0.25。iou0.6 是 NMS 的阈值不是评估的 IoU 阈值别搞混。save_jsonTrue 会输出 COCO 格式的预测结果你可以用 pycocotools 再算一遍交叉验证 ultralytics 的评估逻辑有没有 bug。参数说明如果你的困难集里小目标多imgsz 要和你训练时保持一致否则评估结果不可比。batch8 是显存不够时的保守值显存够可以上 16。微调技巧上我一般分两步先冻结 backbone 只训 head10 个 epoch学习率 0.001再解冻全部30 个 epoch学习率 0.0001。这样比直接端到端微调收敛更快且不容易破坏预训练特征。如果目标域数据少于 1000 张第二步的学习率再降一个数量级。最后说个习惯我从来不信数据集自带的准确率数字只信自己在困难集上跑出来的 mAP50-95。8395 张 COCO 标注图是个不错的起点但 98.6% 是别人的场景你的场景得你自己测。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。