ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

监控场景人物检测数据集处理:从解压到YOLOv8训练全流程实战

监控场景人物检测数据集处理:从解压到YOLOv8训练全流程实战 简介目标检测是计算机视觉领域的核心任务然而模型性能的优劣往往不取决于网络结构而取决于数据质量与标注规范。实际工程中监控场景下的人物检测尤为特殊摄像头视角、光照变化、人群遮挡以及细粒度类别如行人、人头、人肩等都对数据集的组织与标注格式提出了更高要求。从通用目标检测数据集COCO或VOC格式出发转换到YOLOv8可直接读取的YOLO txt格式中间包含目录结构解析、坐标归一化、异常框过滤、标签分布统计等关键步骤。合理的数据清洗与验证策略能有效避免训练时的报错与精度劣化让模型在真实监控环境中获得更好的泛化表现。本文基于“监控镜头下的人物检测数据集.zip”完整拆解了从压缩包解压、格式转换到最终启动训练的每一步工程实践并针对zip损坏、中文路径、类别ID错位等高频坑位给出了排查方案。 做监控场景下的人物检测数据集的坑远比模型结构多。很多人一上来就搓一个YOLOv8结果训练半天MAP上不去排查到最后发现是标注格式、目录结构、场景分布这些基础问题。这次我手里拿到的是名为监控镜头下的人物检测数据集.zip的压缩包干脆把它从解压到训练的全流程拆开把容易踩的坑一次性说透。这篇内容适合三类人一是刚接触目标检测准备拿公开数据集练手跑通YOLOv8的初学者二是已经在做监控场景算法但效果不佳想换数据集验证的工程师三是需要把别人给的数据集整理成自己训练格式的算法团队成员。整个流程我不绕弯子直接按实际操作的顺序来。1. 拿到数据集后先别急着解压——先看清目录结构1.1 压缩包内部的常见组织方式先说一下这个数据集压缩包的核心构成。监控镜头下的人物检测数据集和通用目标检测数据集最大的区别在于标签体系的侧重点。通用数据集比如COCO通常把person作为一个大类但监控场景下的数据集往往会把person拆成更多子类比如pedestrian行人、head人头、shoulder人肩、body人体躯干等。这种细分不是没道理的监控画面里人群密集时全身框经常被遮挡但是人头的可见性往往最高。我见过不少做人群计数、密度估计的项目最终落地的模型反而只靠人头检测就能达成业务指标。解压之前我建议先看一眼压缩包的文件列表。很多情况下数据集提供方会在压缩包的根目录放一个README或者DATASET_INFO.txt里面记录了数据集的来源、标注规范、类别定义。别小看这个文件它决定了你后面写转换脚本时是省力还是踩坑。常见的目录结构有这么几种第一种纯图片 纯标注文件平铺 dataset/ ├── images/ │ ├── 000001.jpg │ ├── 000002.jpg │ └── ... └── labels/ 或 annotations/ ├── 000001.txt ├── 000002.txt └── ... 第二种按序列/场景划分 dataset/ ├── scene01/ │ ├── img/ │ └── ann/ ├── scene02/ │ ├── img/ │ └── ann/ 第三种COCO风格的官方组织方式 dataset/ ├── train2017/ ├── val2017/ ├── test2017/ └── annotations/ ├── instances_train2017.json └── instances_val2017.json拿到压缩包第一步用unzip -l或者tar -tzf看一下文件列表。注意这里有一个实际问题如果压缩包体积很大比如几十GB全量解压前先预览文件列表可以帮你判断是否需要全部解压。比如有些数据集提供方会把图片压缩一份、标注压缩一份但标注文件实际上只有几百MB你只需要解压标注部分再配合软链接指向原始图片目录能省一大块磁盘空间。提示如果文件列表里出现了形如file is not a zip file的报错先别慌。这个错误在Windows下用自带压缩工具解压时很常见多半是压缩包本身损坏、下载不完整或者文件后缀名被改过实际可能是7z格式但命名成zip。处理办法后面专门讲。1.2 标签格式决定后续工作量压缩包中标注文件的格式直接决定了你后续的工程量。监控场景人物检测数据集的标注格式主要有三种派系COCO格式一个大的JSON文件里面包含info、licenses、images、annotations、categories五个字段。annotations里每条记录对应一个目标框通过image_id和category_id关联到图片和类别。这种格式的好处是官方工具链齐全坏处是单个JSON文件太大加载和遍历都比较费内存。VOC格式每张图片对应一个XML文件文件名通常与图片同名。XML里包含object节点每个节点记录目标的name、bndbox坐标。这种格式可读性稍微好一点但XML解析效率低如果数据集有几万张图一次全量遍历会让脚本跑到怀疑人生。YOLO格式每张图片对应一个txt文件每一行是class_id x_center y_center width height注意这里的坐标全部是归一化后的相对坐标值域在0到1之间。YOLO格式是训练时最省事的直接能被YOLOv8的原生DataLoader读取。我在实操中发现很多监控类数据集最初发布时是COCO或VOC格式但训练YOLOv8又需要YOLO格式所以写一个健壮的转换脚本是必须完成的工作。转换本身不难难在边界情况的处理。比如VOC的XML里有些目标的坐标越界负数或超过图片宽高比如COCO的annotations里某些目标的bbox宽高为0这些脏数据如果不筛掉训练时轻则警告重则loss异常。2. 数据标注格式与场景分布为什么监控数据不能拿通用数据集凑数2.1 监控视角下的标注难点很多人觉得人物检测不就是把人框出来COCO里person类别训练一个模型不就完事了。但真实监控场景和COCO这类自然图像数据集完全是两套逻辑。第一个问题是视角和尺度的差异。监控摄像头通常安装在6到10米的高度向下倾斜拍摄画面中的人大多呈现明显的俯视角度头部占比大身体部分可能被柜台、栏杆、绿化带遮挡。COCO数据集里的图基本上以平视视角为主人物占据画面主体直接用COCO预训练权重在那类俯视监控画面上做微调经常出现漏检尤其是远处小目标比如距离摄像头20米以外的人画面上只有几十个像素高度。第二个问题是光照和时段分布。监控数据天然包含白天、黑夜、黄昏、逆光、雨雾等复杂光照条件。很多数据集提供方在制作时只取了白天晴天的片段这样的数据集训练出来的模型一到夜晚就原形毕露。拿到压缩包后我建议先抽样浏览图片确认数据集中是否包含不同时段的样本。如果只有白天数据那后续训练时要重点考虑是否需要额外采集夜间数据或者使用数据增强亮度扰动、gamma校正来模拟夜间效果。第三个问题是类别细粒度。监控场景中人头head、人肩shoulder、上半身upper body、全身full body经常被拆开来标注。有些业务需求是统计客流量检测人头就够了有些是安防报警需要检测全身甚至多人交互。所以模型训练之前先看数据集提供的类别是单一person还是细分后的多类别再根据你的业务目标决定是保留全类别训练还是只取其中一部分类别。2.2 训练集/验证集/测试集的划分逻辑数据集压缩包里通常已经带好了划分好的train/val/test目录但实际情况常常不是这样。很多从学术机构发布的数据集只给了一个全量目录需要你自己划分。这里有一个实操建议划分时务必保证同场景的数据尽量只出现在一个集合里。举个例子如果数据集按scene01、scene02这样的子目录组织不要把scene01的图片一部分划进train、一部分划进val。因为同一段连续视频里相邻帧的画面几乎一样如果训练集和验证集出现相同场景的相邻帧验证指标会虚高模型真实的泛化能力被高估。正确的做法是按scene划分整个scene01进训练集scene02进验证集scene03进测试集。另外监控场景不同摄像头之间存在拍摄角度、安装高度、焦距的差异如果数据集的子目录本身表示的是不同摄像头那么按子目录划分就更必要了。我在实际项目里遇到过惨痛的案例因为随手做了随机划分训练时模型在一个固定机位的测试集上mAP达到0.85一换到新装好的真实摄像头直接掉到0.5以下。后来排查才发现训练集和测试集混入了大量来自同一摄像头的相似画面模型其实是在背书而不是在理解行人特征。3. 从压缩包到可训练的YOLOv8数据集完整实操流程3.1 解压与文件完整性校验拿到zip压缩包后第一步当然是解压。Linux环境下最常用的几条命令# 查看压缩包内容 unzip -l 监控镜头下的人物检测数据集.zip # 全量解压到指定目录 unzip 监控镜头下的人物检测数据集.zip -d /data/datasets/person_detection/ # 如果压缩包是.tar.gz格式 tar -xvzf 监控镜头下的人物检测数据集.tar.gz -C /data/datasets/person_detection/ # 如果压缩包是.tar格式 tar -xvf 监控镜头下的人物检测数据集.tar -C /data/datasets/person_detection/ # 如果遇到分卷压缩比如xxx.zip, xxx.z01需要先合并再解压 zip -s 0 监控镜头下的人物检测数据集.zip --out 合并后.zip unzip 合并后.zip解压时有一个容易忽略的点文件完整性校验。数据集从网盘、邮件、FTP等途径传输过来很可能出现数据损坏。一个常见的报错是error: invalid zip file with missing end-of-central-directory record翻译成人话就是zip压缩包缺失了末尾的目录记录解压工具无法确定文件的完整结构。但注意这个报错并不意味着整个压缩包都废了。zip文件格式中末尾的EOCD记录End Of Central Directory负责索引所有文件条目如果它缺失部分解压工具如Python的zipfile模块直接拒绝打开但一些命令行工具如7z可能会尝试基于中央目录的已有信息进行恢复性解压。实操中我的建议是先试试用7z去解压如果7z能解出来多半只是EOCD损坏文件内容大概率是完整的。不过解压完成后一定要做校验——每个图片文件是否都能正常打开cv2.imread返回是否为None标注文件是否为空这一轮检查虽然耗时但能避免训练时发现数据集里藏着一堆坏图那种挫败感我不想再体验第二次。如果遇到file is not a zip file也要分情况讨论。一种可能是文件确实不是zip格式可能是7z、rar、tar.gz但被人为改了后缀名。这时用file命令查看真实格式file 监控镜头下的人物检测数据集.zip # 输出示例7-zip archive data, version 0.4看到输出里显示7-zip archive data时直接把后缀改成.7z再解压就行。另一种可能是下载不完整文件大小和源文件对不上。这种情况重新下载别无他法。3.2 目录结构与yaml配置文件的对应关系解压完成后典型的数据集目录大概长这样/data/datasets/person_detection/ ├── images/ │ ├── train/ │ │ ├── cam01_00001.jpg │ │ ├── cam01_00002.jpg │ │ └── ... │ ├── val/ │ │ └── ... │ └── test/ │ └── ... ├── labels/ │ ├── train/ │ │ ├── cam01_00001.txt │ │ ├── cam01_00002.txt │ │ └── ... │ ├── val/ │ │ └── ... │ └── test/ │ └── ...YOLOv8训练时需要一个yaml配置文件来告诉框架数据集在哪里、标注格式是什么、训练哪些类别。这个yaml内容实际上很简单# person_detection.yaml path: /data/datasets/person_detection/ # 数据集根目录 train: images/train # 训练集图片目录相对于path val: images/val # 验证集图片目录相对于path test: images/test # 测试集图片目录可选 names: 0: person写yaml时最容易被坑的是path的写法。如果path写的是绝对路径那train和val就写相对路径如果path为空train和val要写完整绝对路径。另外有人会把train写成images/train/多一个斜杠系统也能认但不建议这样搞保持统一风格。关于类别编号YOLO格式的txt文件中第一列就是类别ID而yaml中names列表的索引必须和txt文件中的类别ID严格对应。这个在简单数据集上不会出问题但如果数据集的标签是person和head且提供方在txt里分别用0和1表示那么yaml里的names必须是{0: person, 1: head}顺序不能反。3.3 数据清洗与转换的关键步骤这个环节是整个流程中最容易出现隐藏问题的部分。数据清洗的目标很简单保证喂给训练脚本的每一条数据都合法。具体检查以下内容图片文件是否存在、是否可以正常读取。对应的标注txt文件是否存在且内容不为空。标注坐标是否在[0, 1]范围内YOLO格式下——或者转换后是否落在图片范围内。类别ID是否在names定义范围内。是否有重复的图片通过文件MD5比较或文件名去重。如果数据集提供方给的是COCO格式的JSON标注需要一个转换脚本。下面我给出一个可以直接用的参考脚本把COCO格式的bbox转成YOLO格式的txt文件import json import os from pathlib import Path def coco_to_yolo(coco_json_path, img_root, out_label_root, category_id_to_name): with open(coco_json_path, r, encodingutf-8) as f: coco_data json.load(f) # 建立 image_id - 图片文件名 的映射 img_id_to_info {img[id]: img for img in coco_data[images]} # 建立 category_id - 目标类别名的映射用于分配新的类别ID cat_id_to_name {cat[id]: cat[name] for cat in coco_data[categories]} new_id_by_name {name: idx for idx, name in enumerate(category_id_to_name)} # 按 image_id 聚合标注 anns_by_img {} for ann in coco_data[annotations]: img_id ann[image_id] anns_by_img.setdefault(img_id, []).append(ann) os.makedirs(out_label_root, exist_okTrue) for img_id, anns in anns_by_img.items(): img_info img_id_to_info[img_id] img_name img_info[file_name] # 例如 cam01_00001.jpg img_width img_info[width] img_height img_info[height] label_path Path(out_label_root) / (Path(img_name).stem .txt) lines [] for ann in anns: cat_id ann[category_id] cat_name cat_id_to_name[cat_id] if cat_name not in new_id_by_name: # 跳过不需要的类别 continue # COCO的bbox格式: [x_min, y_min, width, height] x_min, y_min, w, h ann[bbox] # 去除异常框 if w 0 or h 0: continue x_center x_min w / 2.0 y_center y_min h / 2.0 x_center_norm x_center / img_width y_center_norm y_center / img_height w_norm w / img_width h_norm h / img_height # 裁剪越界坐标到[0, 1]区间 x_center_norm min(max(x_center_norm, 0.0), 1.0) y_center_norm min(max(y_center_norm, 0.0), 1.0) w_norm min(max(w_norm, 0.0), 1.0) h_norm min(max(h_norm, 0.0), 1.0) new_class_id new_id_by_name[cat_name] lines.append(f{new_class_id} {x_center_norm:.6f} {y_center_norm:.6f} {w_norm:.6f} {h_norm:.6f}) with open(label_path, w, encodingutf-8) as f: f.write(\n.join(lines))写转换脚本时不光要转格式还要注意几个容易被忽视的细节。第一如果一张图片在JSON中存在但没有任何有效标注比如所有bbox宽度为0或者类别全部被过滤掉那生成的txt就是空文件。训练时YOLOv8对空标签的图片会直接跳过一般不会报错但如果你发现训练时统计的图片数量和预期对不上就要检查是否有大量空标签导致No labels found。第二处理图片和标注之间的对应关系时遇到标注文件名和图片文件名不一致的情况尽量用图片的stem一一对应生成标签文件避免用标注文件名反过来找图片那样容易漏。如果数据集是VOC格式转换原理类似只是解析XML的部分换成xml.etree.ElementTree即可。核心逻辑不变读XML - 取目标框 - 算归一化坐标 - 写txt。3.4 训练前的验证步骤第一次跑训练前强烈建议先做一轮小规模的试运行。不是直接拿全量数据开训而是先验证数据链路是否通。第一步用YOLOv8自带的验证命令看看能否正常读取数据集yolo detect train dataperson_detection.yaml modelyolov8n.pt epochs1 batch4 imgsz640epochs1不是为了训练出一个好模型而是为了验证数据读取是否正常。如果这个命令能跑完一个epoch不报错说明数据集基本没问题。第二步验证标签是否和图片对齐。YOLOv8训练过程中有一个可视化标签的功能或者你可以用下面这个脚本把标注框画到图片上import cv2 import numpy as np from pathlib import Path def draw_yolo_labels(image_path, label_path, class_names): img cv2.imread(str(image_path)) if img is None: print(f无法读取图片: {image_path}) return h, w img.shape[:2] with open(label_path, r, encodingutf-8) as f: for line in f: parts line.strip().split() if len(parts) ! 5: continue cls_id, xc_norm, yc_norm, w_norm, h_norm parts cls_id int(cls_id) xc float(xc_norm) * w yc float(yc_norm) * h bw float(w_norm) * w bh float(h_norm) * h x1 int(xc - bw / 2) y1 int(yc - bh / 2) x2 int(xc bw / 2) y2 int(yc bh / 2) color (0, 255, 0) cv2.rectangle(img, (x1, y1), (x2, y2), color, 2) label_name class_names[cls_id] if cls_id len(class_names) else str(cls_id) cv2.putText(img, label_name, (x1, max(0, y1 - 5)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 1) cv2.imshow(label_check, img) cv2.waitKey(0) cv2.destroyAllWindows() # 示例画一张图检查 draw_yolo_labels( image_pathPath(/data/datasets/person_detection/images/val/cam01_00001.jpg), label_pathPath(/data/datasets/person_detection/labels/val/cam01_00001.txt), class_names[person] )画完之后重点看框是否贴合目标。如果框明显偏移比如框的位置整体偏左上大概率是标注坐标转换时出了问题比如把COCO的x_min, y_min误解成了x_center, y_center。第三步统计标签分布。这一步能帮你看清数据集的类别是否均衡。写一个简单的脚本统计每个类别的目标数量cat /data/datasets/person_detection/labels/train/*.txt | awk {print $1} | sort | uniq -c如果发现类别0有10万个目标类别1只有500个那训练时建议在yaml里设置合理的类别权重或者干脆先做单类别训练否则模型容易倾向性预测样本量大的类别。4. 常见问题与排查实录4.1 zip文件损坏与格式错误这是数据集解压阶段最常碰到的问题我把实际遇到的几种情况汇总成表报错信息可能原因解决方案error: invalid zip file with missing end-of-central-directory record压缩包不完整或EOCD记录缺失重新下载尝试用7z恢复解压file is not a zip file文件真实格式不是zip、或下载损坏、或文件被改名用file命令查看真实格式若真实格式不是zip则改后缀解压End-of-central-directory signature not found压缩包下载不完整重新下载并校验文件大小cannot find zipfile directoryzip文件被截断用zip -F尝试修复或者重新下载unzip: cannot find or open文件名包含中文或特殊字符Shell解析出错给文件名加引号或用Tab键补全有个实用技巧拿到压缩包后先看文件大小如果从网盘下载的数据集文件大小和对方提供的MD5或SHA256值对不上就直接重下不要浪费时间尝试修复。数据集这种动辄几十GB的文件哪怕只损坏了一个字节解压时也会在某个位置报错。如果压缩包是分卷压缩格式比如xxx.zip和xxx.z01、xxx.z02等需要先合并再解压zip -s 0 监控镜头下的人物检测数据集.zip --out full_dataset.zip unzip full_dataset.zip分卷压缩的场景虽然不常见但万一碰到别把每个分卷单独解压——那样出来的文件是碎片拼不回去的。4.2 路径与中文乱码问题很多数据集的文件名带着中文压缩包内的目录层级也可能很深。Linux下解压zip时如果文件名包含GBK编码的中文字符直接用unzip解压可能会出现乱码。这主要是因为zip文件内部记录文件名时用了不同编码而解压工具默认按UTF-8解析。遇到这种情况可以在解压时指定编码# 使用Python解压指定文件名编码为GBK python -c import zipfile; zipfile.ZipFile(数据集.zip).extractall(输出目录)上面的unzip是C实现的对中文编码支持较差。Python的zipfile模块在不同版本中处理编码的方式也不一样Python 3.11及以上版本对GBK编码文件名的兼容性明显改善。如果你手头的Python版本较旧解压后出现乱码文件名可以写一个重命名脚本来修正。YOLOv8训练时路径不要带中文。很多底层库比如OpenCV对中文路径的处理并不好虽然新版OpenCV已经修复了部分问题但cv2.imread读不到中文路径文件的情况依然偶发。训练时最稳妥的做法是数据集路径全部使用英文、数字和下划线。4.3 标签格式转换后坐标异常转换脚本写完后训练时常见的一个问题是AssertionError: bbox must be in [0, 1]或者loss变成NaN。遇到这类问题优先怀疑坐标越界。坐标越界的根源通常是COCO或VOC格式里的坐标值本来越界比如标注者画框时鼠标拖出了图片边界但原格式没有做裁剪。转换脚本里做了min(max())的处理这一步不是可选项而是必须项。不过这里也要注意仅仅裁剪坐标值有时候会掩盖另一个问题如果x_min w超出了图片宽度那么裁掉超出的部分后框的完整性其实已经受影响但训练还能进行。这是可以接受的人工标注的边界误差不能完全避免。另一个坐标异常的情况是YOLO格式中坐标是否归一化。如果从网络上找的转换脚本生成的是像素坐标而不是归一化坐标YOLOv8训练时会报错。判断方法很简单打开一个txt文件如果某一行的坐标值出现大于1的数字说明没有归一化。4.4 训练时类别数量对不上的排查训练时yaml里定义的类别数量和标签文件里实际的类别ID不一致这类问题表面上看不出来但训练日志里会有线索。比如yaml定义了names: {0: person, 1: head}但标签txt文件里出现了类别ID为2的标签。YOLOv8训练时会在解析标签阶段报错class 2 is not in class names。排查方式就是扫描所有标签文件找出最大的类别IDcat /data/datasets/person_detection/labels/train/*.txt | awk {if ($1 max) max$1} END {print max}如果扫描结果最大值是1但yaml里只定义了类别0那就是标签里存在未在yaml中声明的类别。如果最大值超出了yaml定义的索引范围说明标签文件里的类别ID和yaml的names顺序可能不一致。我记得有一次数据集提供方明确说类别顺序是person, head, body结果实际标签文件里person0, head2, body1我又没做统计直接按前三类训练最后发现模型预测的person框对不上。从那以后再也不敢省略标签分布统计这一步了。4.5 空标签与图片数量不一致的问题YOLOv8训练时报No labels found in ...是另一个高频问题。这个错误分两种情况。第一种是数据集的标注文件夹中一个txt文件都没有路径写错或者标注文件没解压全。处理方法是检查labels/train目录是否存在以及里面文件数量是否和images/train中的图片数量接近。第二种是标注文件存在但内容为空。有些数据集发布方会把没有目标的图片也保留在数据集中并放一个空txt文件。YOLOv8对这类空标签的处理方式是直接忽略该图片不参与训练。虽然不报错但会浪费磁盘IO。如果空标签占据比例很高比如无效样本占30%建议在数据清洗阶段直接剔除这些图片让epoch的实际样本量更可控。5. 数据增强与训练策略的补充思考如果数据及解压、转换、训练全流程都跑通了但模型效果还是不理想那么问题可能出在训练参数和数据增强策略上。监控场景有一个特殊性小目标占比极大。人群密集时每个人在画面中只有几十像素大小YOLOv8默认的anchor设计虽然已经覆盖了多尺度但训练时如果把imgsz设置成640小目标的特征在经过多层下采样后很容易丢失。对于监控场景人物检测我建议训练时直接使用imgsz1280或者至少imgsz960。这会让图像中的人体目标占据更多的特征像素显著提高小目标召回率。代价是显存占用增加训练速度下降。如果GPU资源有限可以先用小分辨率跑通训练链路然后再加大分辨率做正式训练。数据增强方面监控场景通常不需要太强的Mosaic增强。YOLOv8默认的Mosaic把四张图拼在一起这会让目标缩放比例变得更极端反而加剧了监控场景下的小目标问题。如果你发现模型在小目标上表现差可以考虑关掉Mosaic超参中可以设置mosaic0.0同时增加一点随机亮度、对比度扰动来模拟不同时段的光照条件。另外随机旋转和翻转对监控场景帮助有限因为行人在自然视角下是竖直的过度旋转会生成不真实的训练样本。还有一个值得尝试的技巧在标注允许的情况下把person和head两个类别拆开训练或者用head类别单独做一个预训练模型再用这个模型去辅助person类别的检测。监控场景中人的头部几乎总是可见的而全身经常被遮挡。用人头检测作为先验再把框向下扩展回归到全身这个思路在很多真实项目里效果不错。6. 关于这份数据集我能说的经验总结整个过程走下来做监控人物检测最花时间的并不是模型调参而是数据整理。我见过太多人在拿到数据集后直接跳过检查环节解压出来就开训最后被各种隐藏的数据问题折磨得焦头烂额。我个人的习惯是宁可多花半天把数据链路彻底验证一遍也不要在跑了十几个epoch之后才发现数据有问题那时候返工的成本高了十倍不止。一个小建议数据集的转换和清洗脚本尽量保留下来。这类脚本在不同项目中复用度非常高只需要改改路径和类别名就能直接跑。我自己的工具库里常年放着COCO转YOLO、VOC转YOLO、标签分布统计、标注可视化检查四个脚本每次拿到新数据集都是先跑这四个脚本跑完再决定后续策略。如果你准备把这个数据集用到实际业务中后续还可以做一件事统计一下不同摄像头的mAP表现差异。如果某个摄像头的检测效果明显差于其他摄像头大概率是这个摄像头的安装角度或者成像质量比较特殊需要在训练集中补充该摄像头的更多样本或者单独对该摄像头做微调。监控场景的算法落地本质上就是不断让模型适应更多摄像头的视角数据集只是起点而不是终点。本文还有配套的精品资源点击获取
返回列表