ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

1100张老鼠图像YOLO目标检测实战:数据清洗、训练与避坑指南

1100张老鼠图像YOLO目标检测实战:数据清洗、训练与避坑指南 简介面向目标检测入门与鼠类监测场景这份老鼠图像检测数据集提供约1100张已标注图片采用YOLO标准标注格式类别仅老鼠一种并附类别配置文件。数据已完成训练集与测试集划分另提供show脚本一键可视化标注效果便于快速核验标注质量也可直接用于YOLOv5、YOLOv8等系列模型的训练与改进实验。压缩包内共2000个文件以jpg图像、xml标注文件为主另有py可视化脚本和json配置文件整体大小约171.6MB。目前已有93人浏览学习适合需要标准检测数据开展迁移训练、算法验证或毕业设计的人群。借助这批数据学习者可省去繁重的采集与标注环节直接进入模型训练、参数调优和性能对比流程并可延伸至智慧实验室、有害生物监测等真实应用场景。1. 老鼠图像目标检测数据为什么说1100张已标注YOLO格式图是块好底料实验台前架一台相机录老鼠行为视频攒到 1100 张「老鼠图像目标检测数据」而且已经是 YOLO 标注格式——做过目标检测的人都知道这一步有多解渴。手工标注一张含多只老鼠的图平均三到五分钟1100 张意味着几十个小时的人工被省掉了更关键的是格式已经统一成 YOLO 能直接吃的 txt不用再走一遍 VOC 转 YOLO 的格式踩坑。但先别急着解压扔进训练脚本。这 1100 张图的标注正确率、类别分布、小目标占比、是否存在连续抽帧泄漏每一项都需要在下训练命令前核清楚。这篇整理就按实战顺序讲先认清这个规模够干什么再逐字段核验标注文件做一轮清洗和防泄漏划分最后拿混淆矩阵决定要不要继续补数据。2. 这 1100 张数据能撑起什么任务规模估算与训练成本先算清2.1 小规模目标检测数据集的位置预训练权重是最大变量在目标检测领域1100 张属于「刚过门槛」的小型数据集。COCO 全量拿来训练是 12 万张图、80 个类别每类平均上千实例而你的老鼠数据大概率是单类或两三类实例总数能不能上一两千取决于每张图里有几只老鼠。假设平均每张 2 到 4 只实例数大约在 2000 到 4000 之间这个量级放在「有预训练权重可加载」的前提下完全能训练出一个可用的检测器。关键在于你训练时是不是从 COCO 预训练权重起步。随机初始化从零训 1100 张特征提取器还没学出通用边缘纹理就过拟合了而加载 yolov8s.pt 这类预训练权重再做微调模型对「什么是物体轮廓、什么是背景纹理」已经有了先验你的数据只需要负责教会它「老鼠长什么样」。这也是为什么我不建议在小数据集上换新结构跑从零训练先把标准模型用成熟预训练权重跑通基线比什么都实在。2.2 够用与不够用的边界单类同场景是多类跨场景分水岭这 1100 张够不够核心看两个维度类别数和场景跨度。如果任务是「单类老鼠检测」且训练图来自同一场地、同一摄像头视角、同一光照条件那 1100 张相当充裕。实验鼠行为分析、笼内活动监测这类需求目标外观相对统一背景也不复杂通常能做到一个可部署的基线。这里的最佳实践是把 80% 用于训练20% 用于验证训练集约 880 张验证集约 220 张配合预训练权重和适度增强够用。如果数据里包含了成鼠、幼鼠、死鼠等多个类别或者图片来自不同场地、昼夜光照差异大、部分图隔着笼网拍摄那 1100 张就明显吃力。尾部类别可能只有几十个实例模型学不到稳定的类别特征验证集上那个类别的 AP 会掉到几乎不可用。这个时候的定位就不是「拿来即用的成品数据集」而是「高质量种子集」需要你基于它做针对性补标。别指望一个 1100 张的小集子同时扛住多类别和跨场景泛化这不现实。2.3 训练账本划分、轮次、显存与预期耗时按 880 张训练、220 张验证来算账用 YOLOv8 的 CLI 训练起步命令长这样yolo detect train datadataset.yaml modelyolov8s.pt epochs100 imgsz640 batch16 patience30这行命令的意思是用 yolov8s.pt 预训练权重做迁移学习输入分辨率 640批量大小 16最多跑 100 轮30 轮内验证集 mAP 没有提升就提前停止。对 880 张小图来说epochs100 配合早停是合理区间不太会欠拟合也不至于过拟合到没法看。参数说明里最有调整空间的是 imgsz。老鼠在画面里往往只占很小一块如果目标框面积普遍不到画面的千分之一640 分辨率下对应目标可能只有 20 到 30 像素宽模型很难学。这种情况下把 imgsz 提到 960 或 1280小目标检测效果会明显改善代价是显存和训练时长上浮。batch16 配 imgsz640 在单张 12GB 左右的消费级显卡上能跑如果显存紧张batch 降到 8梯度累积效果也够用。推理侧一张 V100 或 3080 级别显卡跑完这套小型训练时间通常在个把小时到小半天属于「午休时间能出基线」的范畴。训练前的第二本账是划分协议。220 张验证集在单类任务上够用但 mAP 的方差会偏大。我习惯的做法是固定随机种子做划分确认验证集里的类别分布和全量分布一致再开始训练不然你评估出来的 mAP 可能只是运气好或运气差。3. YOLO 标注格式逐字段核验txt 目录、归一化坐标与类别名顺序3.1 先认格式YOLO 的 txt 标注与 labelImg/VOC/COCO 的差别拿到手先别管压缩包叫什么直接把一张图的标注文件打开看。YOLO 标注格式不是 XML 也不是 JSON每张图对应一个同名 txt 文件比如IMG_001.jpg对应IMG_001.txt。每行代表一个目标一行五个数字空格分隔0 0.523437 0.412500 0.082031 0.150000这五个字段分别是class_id目标类别编号从 0 开始center_x目标框中心点的横向比例center_y纵向比例width框宽相对图宽的比例height框高相对图高的比例。所有坐标全部归一化到 0 到 1 区间跟图片实际像素分辨率无关。这是和 VOC 格式最不一样的地方VOC 存的是绝对像素坐标xmin、ymin、xmax、ymaxYOLO 存的是相对比例转换时每一步都要除以图宽或图高出错的点也基本都集中在除错或除反。还有一类常见情况是 labelImg 这类标注工具导出 YOLO 格式时默认生成的就是同名 txt但在项目配置文件里单独维护类别列表。因此你需要确认三件事txt 文件是否与图片一一对应、每行是否严格五列、类别编号是否从 0 开始连续。这三件事决定了后面所有训练能不能正常跑。3.2 用脚本把每一行都查一遍列数、值域、空标签与孤对别用肉眼抽查直接写一个核验脚本把全部标签扫一遍。文本解析类的 BUG 最容易藏在这种小文件里扫一遍能省后面十遍 debug。from pathlib import Path label_dir Path(labels) # 按你的实际路径改 img_dir Path(images) label_files sorted(label_dir.glob(*.txt)) img_files sorted(img_dir.glob(*.jpg)) # 如果图片是png改成png # 1. 检查同名文件是否一一对应 label_names {f.stem for f in label_files} img_names {f.stem for f in img_files} print(有标签无图片的:, len(label_names - img_names)) print(有图片无标签的:, len(img_names - label_names)) # 2. 逐行检查格式 bad_lines [] class_ids set() for f in label_files: for lineno, line in enumerate(f.read_text().splitlines(), 1): line line.strip() if not line: continue parts line.split() if len(parts) ! 5: bad_lines.append((f.name, lineno, 列数不是5, len(parts))) continue try: cls, cx, cy, w, h [float(p) for p in parts] except ValueError: bad_lines.append((f.name, lineno, 存在非数字, line)) continue class_ids.add(int(cls)) if not (0 cx 1 and 0 cy 1): bad_lines.append((f.name, lineno, 中心点越界, line)) if w 0 or h 0 or w 1 or h 1: bad_lines.append((f.name, lineno, 宽高非法, line)) print(非法行数量:, len(bad_lines)) for x in bad_lines[:10]: print(x) print(类别ID集合:, sorted(class_ids))逻辑说明脚本先对比图片和标签的文件主名找出「孤儿标签」和「缺标签图」这两类文件在训练时会导致数据加载错位然后逐行拆字段检查列数是否为 5、五个字段是否都能转成浮点数、中心点是否落在 0 到 1 区间、宽高是否为正且不超过 1。class_ids集合可以帮你一眼看到类别编号是否有 0、2 这类跳跃——YOLO 训练要求类别编号从 0 起且必须小于names里的类别总数编号不连续是训练期报错的经典来源。参数说明glob(*.txt)会把标签目录里的所有 txt 都算进来所以标签目录里千万不要放说明文件或类别名字文件否则会被当成标注解析。图片后缀按实际修改jpg、png、bmp 都有可能。bad_lines[:10]只打印前 10 条如果异常量大改成写入文件再人工过。3.3 类别分布统计训练前必须看清的东西格式核验通过之后下一步是统计每个类别在训练数据里到底有多少实例、有多少张图是纯背景空标注。from pathlib import Path from collections import Counter label_dir Path(labels) counter Counter() empty 0 total_files 0 for f in sorted(label_dir.glob(*.txt)): total_files 1 lines [ln for ln in f.read_text().splitlines() if ln.strip()] if not lines: empty 1 for line in lines: counter[int(line.split()[0])] 1 print(标签文件总数:, total_files) print(空标签文件数量(纯背景图):, empty) print(各类别实例数:, dict(counter))逻辑说明逐行读取所有标签文件int(line.split()[0])取每行第一个字段作为类别编号累加得到每个类别的实例数。空 txt 是合法标注代表这张图里没有目标对检测模型来说是有价值的负样本。参数说明这里没有解析坐标只统计类别速度快。跑完这个脚本你就能回答一个核心问题如果数据是多类别尾部类别是不是只有几十个实例。如果是后面训练就别指望那个类别的 AP 高这也直接决定你要不要补数据。类别名列表建议放到数据集根目录的dataset.yaml里而不是放进 labels 目录path: /path/to/your/dataset train: splits/train.txt val: splits/val.txt names: 0: mouse 1: ratnames里的顺序必须和 txt 里的 class_id 一一对应。对不齐的时候训练不会报错真正跑起来才发现标注里是0成鼠预测输出却叫1幼鼠这种错位在混淆矩阵里极难排查。4. 训练前清洗原图校验、画框回看与防泄漏划分4.1 图片损坏、框面积统计与小目标占比标注文件干净不能代表图片本身没问题。我从实践中得到的教训是小数据集里偶尔有黑图、花屏图、半截图训练时加载不出来会直接报错加载出来但内容损坏则会让模型白学一轮。先扫图片可读性同时算目标框的面积占比这一步把「小目标占比」这个关键结论直接量化。import cv2 import numpy as np from pathlib import Path img_dir Path(images) label_dir Path(labels) areas [] broken 0 for img_path in sorted(img_dir.glob(*.jpg)): img cv2.imread(str(img_path)) if img is None: print(读图失败:, img_path.name) broken 1 continue H, W img.shape[:2] txt label_dir / (img_path.stem .txt) if not txt.exists(): continue for line in txt.read_text().splitlines(): parts line.strip().split() if len(parts) ! 5: continue _, cx, cy, w, h map(float, parts) if w 0 or h 0: continue areas.append(w * h) # 归一化面积占比 print(损坏图片数量:, broken) print(目标框面积占比 中位数:, np.median(areas)) print(目标框面积占比 5%分位:, np.percentile(areas, 5)) print(目标框面积占比 95%分位:, np.percentile(areas, 95))逻辑说明cv2.imread对损坏文件返回 None这里直接计数并打印文件名方便后续删除或人工修复。对每个有效标注框用归一化的w * h计算面积占比不需要乘回分辨率因为它是相对值。面积占比小于 0.001 意味着目标不足画面的千分之一在 640 分辨率下只有约 20 像素宽属于典型小目标。参数说明percentile(5)和percentile(95)用来观察分布两端——如果 5% 分位已经小到 0.0005说明这批图里有相当一部分是远距离拍摄或大场景中的小老鼠那 imgsz 就必须往上调。w*h用的是归一化比例和 imgsz 无关这个指标在不同数据集之间有可比性。4.2 把标注画回原图人眼抽检是慢但稳的一道闸脚本核验只能证明「格式合法」不能证明「框的位置是对的」。标注工具在导出过程中偶尔会出现类别错选、框偏半身、一只老鼠标了两个框的情况这些只有人眼看得准。我的习惯是抽 50 张画框回看覆盖不同光线、角度和远近。import cv2 from pathlib import Path src_dir Path(images) label_dir Path(labels) out_dir Path(check_imgs) out_dir.mkdir(exist_okTrue) colors [(0, 255, 0), (0, 0, 255), (255, 0, 0)] sample sorted(src_dir.glob(*.jpg))[:50] for img_path in sample: img cv2.imread(str(img_path)) if img is None: continue H, W img.shape[:2] txt label_dir / (img_path.stem .txt) if not txt.exists(): continue for line in txt.read_text().splitlines(): parts line.strip().split() if len(parts) ! 5: continue cls, cx, cy, w, h map(float, parts) # 把归一化坐标乘回像素尺寸 x1 int((cx - w / 2) * W) y1 int((cy - h / 2) * H) x2 int((cx w / 2) * W) y2 int((cy h / 2) * H) cv2.rectangle(img, (x1, y1), (x2, y2), colors[int(cls) % 3], 2) cv2.putText(img, fcls{int(cls)}, (x1, max(0, y1 - 5)), cv2.FONT_HERSHEY_SIMPLEX, 0.6, colors[int(cls) % 3], 2) cv2.imwrite(str(out_dir / img_path.name), img) print(画框图已输出到 check_imgs/)逻辑说明把归一化中心点和宽高乘回实际像素int转成整型后画矩形。colors[int(cls) % 3]用类别编号对颜色数组取模避免类别编号超出颜色列表长度导致下标越界。putText的 y 坐标用max(0, y1 - 5)防止文字画到画布外。参数说明sample[:50]是抽前 50 张更合理的做法是每隔 N 张抽一张或者用random.sample均匀抽样。人眼重点看图里老鼠是否全部被框住、框是否明显大于或小于身体、类别编号是否张冠李戴。这个步骤会花掉你十几分钟但它是数据质量最后一道显式保障。4.3 划分数据集的顺序坑shuffle 之前先问是不是连续抽帧划分训练验证集有个被低估的坑如果这 1100 张是从行为视频里按帧抽出来的相邻帧之间只差几十毫秒画面几乎一样。直接随机划分会把视觉上几乎相同的帧同时分进训练集和验证集验证集 mAP 虚高一换场景立刻打回原形。常规划分代码不长但要点在划分策略import random from pathlib import Path random.seed(42) images sorted(Path(images).glob(*.jpg)) random.shuffle(images) split_idx int(len(images) * 0.8) train_files images[:split_idx] val_files images[split_idx:] with open(splits/train.txt, w) as f: f.write(\n.join(str(p).replace(\\, /) for p in train_files)) with open(splits/val.txt, w) as f: f.write(\n.join(str(p).replace(\\, /) for p in val_files)) print(训练集张数:, len(train_files), 验证集张数:, len(val_files))逻辑说明先固定随机种子再 shuffle保证任何一次重跑划分结果一致。图片路径统一用正斜杠写入 txtYOLO 的 data.yaml 可以直接把 train 和 val 指向这两个列表文件。参数说明如果确认数据是视频抽帧来的不要用上面这个「整体 shuffle」版本。正确做法是先把连续帧按场景分桶编号比如每 30 帧算一组以组为单位做划分保证同源帧全部进训练集或全部进验证集不交叉。判断方法是看一眼文件命名规律如果文件名像frame_0001.jpg到frame_1100.jpg这样的连续编号几乎可以断定是抽帧产物必需分桶。5. 老鼠数据集训练中的典型翻车记录四个踩坑实录5.1 现象loss 下降正常但 mAP 一直是 0损失函数的数值在掉训练过程看起来一切正常但每个 epoch 结束打印的验证集 mAP 始终是 0或者从 0.001 起步毫无规律。这个现象在目标检测新手手里出现概率极高而且特别迷惑因为训练侧完全没报错。原因排查下来最常见的是类别编号错位和空标签覆盖。txt 里的 class_id 是 3但dataset.yaml的names只有两个类别模型输出的类别维度只有 2编号 3 的标注在训练时被静默过滤或映射到错误类别。另一种情况是标签文件夹里混入了classes.txt数据加载器把它当成一张图的标注读取解析失败后又因为「标注为空」而忽略整张图导致训练集实际有效的目标框数量极少模型只能在背景图上学验证集自然全零。解决路径很直接第 3 章的核验脚本在跑训练前必须过一遍确认 class_id 最大值小于names长度检查 labels 目录里只有.txt标注文件没有说明文件再打印训练集里实际加载的目标框数量确认不是零。我是通过删除标签目录里的classes.txt解决了这个问题前后折腾了快两小时。5.2 现象验证集分数可观换个摄像头立刻漏检模型在划分出来的验证集上 mAP 打到 0.7 以上看起来能交付了结果把同一批权重接到另一个摄像头拍的视频上老鼠漏掉近一半。这个不是代码问题是数据分布问题。背后有两个原因叠在一起。第一验证集和训练集同源如果还是连续抽帧直接划分的场景高度重合评估分数天然虚高。第二老鼠在画面里占比小模型学到的更多是「这个特定场景里老鼠的样子」光线一变、视角一变特征就不成立了。你可以看一下第 4 节的框面积统计如果中位数占比在 0.003 以下模型在 640 输入下能看到的有效特征非常有限鲁棒性差是必然的。解决思路分两路。数据侧确认划分按场景分桶别再让验证集「开卷考试」如果还能补少量跨场景数据哪怕只有一两百张对泛化的改善也极其明显。训练侧把 imgsz 提高到 960 甚至 1280同时打开多尺度训练让模型在不同分辨率下见过同样的目标推理时如果目标仍然极小可以考虑把大图切片成若干小图分别推理再合并结果。这套组合基本能救回大部分漏检。5.3 现象自写训练脚本框全歪了没有直接用 YOLO 官方训练接口而是自己写了数据加载和推理脚本结果训练时 loss 能降、验证集也能跑但把预测框画回原图时发现所有框的位置整体偏移小目标尤其明显有的框甚至超出了图边界。原因是「标注归一化」和「图像预处理」之间的一条隐含约定没对齐。YOLO 官方训练流程对输入图做的是 letterbox——等比缩放后填充灰边保持原始宽高比不变如果你的加载代码用的是cv2.resize直接拉伸到 640×640宽高比被改变归一化坐标按拉伸后的画布解释自然就对不上原图。推理端同理官方接口在预测后会按原图的 letterbox 参数把坐标映射回去自写脚本少了这一步画框就全歪。解决方法是尽量别重造轮子训练和推理都用同一套预处理逻辑。如果一定要自写必须记录每张图缩放前的原始尺寸、letterbox 的填充边距和缩放比例推理输出后再逆变换回原图坐标。这里也顺带提醒如果标注文件本身是绝对像素坐标而不是归一化坐标训练时不会直接报错但框和内容对不上第 3 章的核验脚本能在训练前发现这类问题所以那一步不要跳过。5.4 现象标签目录里混进类别文件训练报错或静默吃土第五类典型的坑是「文件命名」问题。数据打包者习惯在 labels 目录里放一个classes.txt或names.txt记录类别名但在 YOLO 的数据加载逻辑里labels 目录下的所有 txt 都会被当作标注文件读取。classes.txt打开后每行是类别名称而不是五个数字解析直接失败具体表现因框架而异有的直接报line must have 5 columns有的静默丢弃并打警告还有的空标签被统一过滤造成训练集隐性缩水。解决路径很直白数据清洗阶段就把类别列表文件移出 labels 目录放到数据集根目录或项目配置目录所有标注 txt 必须与图片同名不存在多余文件。用第 3 章的「有标签无图片」检查结果基本能定位这一类问题——如果孤对文件里出现classes这个名字就是这个坑。提示0 字节的空 txt 是合法标注代表纯背景图不要为了「让数据集看起来很干净」而删掉它们。检测任务需要负样本全是有目标的图反而容易让模型把背景误检成老鼠。6. 把 1100 张的性价比打满用统计与混淆矩阵决定补不补数据6.1 拿混淆矩阵说话漏检多还是误检多训练跑完别只看 mAP 那个数字把验证集的混淆矩阵调出来看两个格子真实背景被预测成目标的假正例以及某个真实类别被漏掉的假反例。YOLO 训练日志里会输出混淆矩阵图数值矩阵里对角线是正确检测对角线外的高频格子就是问题集中区。如果背景假正例多调高置信度阈值比继续加数据更有效如果某个类别大量漏检到背景里那才是数据不足或特征不清的信号该补数据的是这个类别而不是整体。注意混淆矩阵的合计行和列未必相等出现差异是正常的因为每个预测框和真实框存在一对多和多对一的匹配过程不要拿它当简单的计数表用。在补数据之前先用一段脚本把验证集的目标统计打出来给判断提供依据from pathlib import Path from collections import Counter import numpy as np val_images [l.strip() for l in open(splits/val.txt) if l.strip()] label_dir Path(labels) sizes [] class_counter Counter() for img_path in val_images: txt label_dir / (Path(img_path).stem .txt) if not txt.exists(): continue for line in txt.read_text().splitlines(): parts line.strip().split() if len(parts) ! 5: continue cls, _, _, w, h map(float, parts) class_counter[int(cls)] 1 sizes.append(max(w, h)) print(验证集实例数:, sum(class_counter.values())) print(验证集类别分布:, dict(class_counter)) print(目标相对图宽高的比例 中位数:, np.median(sizes)) print(5%分位:, np.percentile(sizes, 5), 95%分位:, np.percentile(sizes, 95))逻辑说明max(w, h)用目标框较长边作为尺寸特征因为检测器对小目标的敏感度和最短边关系更大但用长边能避免极端长条框把统计拉偏。percentile(5)看极端小目标有没有厚尾如果 5% 分位已经很低补数据优先级低于提分辨率。参数说明这里的val.txt就是第 4 节划分脚本生成的验证集列表。统计结果配合混淆矩阵看当尾部类别实例数低于 100 且混淆矩阵里该类大量漏检时补这个类别的数据比继续堆总张数要划算得多。6.2 适合老鼠场景的数据增强参数与损失函数观察点老鼠检测的增强策略不能照搬通用目标检测的默认配置。笼养动物场景有几个特殊性老鼠可能倒挂在笼顶垂直翻转增强有效红外夜视或暗光场景下颜色本身就是重要特征颜色增强要克制马赛克增强会把四张图拼在一起如果老鼠是小目标拼图后目标更小反而稀释了有效信息效果未必好。我在这类小目标动物数据上常用的增强配置是参数建议值理由flipud0.5老鼠倒挂常见垂直翻转提升姿态泛化hsv_h0.015轻微色相扰动避免把颜色学死hsv_s0.7饱和度扰动适中保留暗光区分度hsv_v0.4亮度扰动宜小红外图亮度抖动大易失真mosaic0.5 以下或关闭小目标在拼接图中被进一步缩小scale0.5模拟远近变化增强尺度泛化训练过程中要盯损失函数的分离速度正常的训练曲线里box_loss和cls_loss都随 epoch 稳定下降如果box_loss降得快但cls_loss长时间不动优先怀疑标注类别错位或类别数不平衡反过来cls_loss正常但box_loss偏高多半是框的质量问题比如标注框过松或过紧。用前 20 个 epoch 的损失曲线就能筛掉大部分数据质量问题不必等 100 轮跑完。6.3 值不值得继续标注扩充一套判断框架1100 张数据是否够用最后落到一个决策上要不要继续花钱花人力补标注。我的判断框架很简单按顺序回答三个问题判断维度怎么检查决策倾向单类还是多类第 3.3 节的类别分布表单类直接进入训练多类且尾部类少于 100 实例先补尾部类同场景还是跨场景图片里有没有多个场地、多时段同场景跑通基线即用跨场景需求直接列入补数据计划小目标占比第 4.1 节框面积统计面积中位数占比 0.003优先提高 imgsz 和切片推理再看漏检决定补不补如果三个问题都指向「够用」那 1100 张配合预训练权重足够做出一版可用的老鼠检测模型如果指向「不够」也别全量补标先补混淆矩阵里漏检最严重的类别和场景通常补到总实例数翻倍就能看到显著变化。补数据阶段有个技巧把现有模型跑一批未标注视频按置信度从低到高排序优先人工确认那些「模型拿不准」的帧比随机抽帧标注效率高一截。误检的帧直接作为负样本加入训练集漏检的帧补标注后加入对应类别这种半自动迭代能把这 1100 张种子的价值放大好几倍。这类小型目标检测数据集我给自己定的规矩是先梳数据再训模型先看混淆矩阵再谈扩容。这份老鼠图像目标检测数据如果核验后是单类、同场景那它足够撑起一个可用的监测和计数模型如果类别多、画面杂就当它是高质量种子集按上面的框架补数据。我自己第一次拿到类似数据时直接开训结果在验证集上花了好几轮才发现是类别编号错位从那以后核验标注永远排在训练前的第一件事。希望帮到你。本文还有配套的精品资源点击获取
返回列表