简介:这份红外狗类目标检测数据集面向从事热成像目标检测的算法工程师、农业安防开发者及高校研究人员,用于解决低光照、夜间或恶劣天气下动物识别样本稀缺的问题。数据全部为红外热成像图像,标注采用YOLO格式,包含归一化边界框坐标与类别标签,类别0为非狗类干扰项、类别1为狗类目标,可直接接入YOLOv5、YOLOv12等主流检测框架训练与验证。资源包共824个文件,以411张jpg红外图像和411个同名txt标注文件为主,另附1个yaml数据配置与1份docx说明文档,压缩包约17.05MB,训练集357张、验证集36张、测试集18张,划分清晰、开箱即用。目前已有162人学习下载。借助该数据集,读者可快速搭建红外监控、智能农业入侵检测、边境安防警报或巡检机器人动物识别等场景的基线模型,并用于算法性能基准测试与学术创新实验。
1. 红外狗类目标检测数据集:从“找不到数据”到“跑通第一个baseline”
做红外目标检测的同行大概都有过这种体验:算法论文看了一堆,YOLO、Faster R-CNN、DETR 的改进点背得滚瓜烂熟,真到自己动手时,卡住的第一步不是网络结构,而是——数据从哪来。可见光下的狗类检测数据集一抓一大把,COCO、Open Images 里狗的图像多到用不完,可一旦切到红外波段,公开可用的、标注规范的、专门针对狗这一类目标的检测数据集,屈指可数。红外狗类目标检测数据集.zip 这个标题背后,指向的正是这个痛点:一个面向红外热成像场景、以狗为检测目标的标注数据集,通常包含红外图像与对应的边界框标注文件,用来训练和评估检测模型。它适合三类人:做红外安防监控、夜间动物监测、热成像巡检的工程落地人员;研究跨模态迁移、红外小目标检测的算法同学;以及需要快速搭一个红外检测 demo 验证硬件方案的产品侧开发者。这一章先把“红外狗类检测”这件事的边界讲清楚,后面几章再拆怎么用、怎么调、怎么避坑。
红外图像和可见光图像的本质差异,决定了这个数据集不能简单套用可见光检测的那套经验。红外成像捕捉的是物体表面的热辐射,狗作为恒温动物,在多数环境温度下体表温度高于背景,因此在红外图里往往呈现为高亮区域,对比度反而比可见光更稳定——白天黑夜都能拍,不受光照影响。但代价是纹理信息几乎为零,狗和猫、狗和某些热源物体(比如刚熄火的汽车引擎盖、路灯底座)在灰度分布上可能高度相似,模型很容易把“热”当成“狗”。所以拿到这个数据集之后,第一件要建立的心智模型是:你训练的不是“长什么样”的检测器,而是“热分布形态”的检测器。这个认知会直接影响后面的数据增强策略、anchor 设置和误检排查方向。
数据集本身通常以压缩包形式分发,解压后一般能看到 images 和 labels 两个目录,图像多为灰度单通道或伪彩三通道,标注格式常见的是 YOLO 的 txt(每行 class_id cx cy w h,归一化坐标)或 VOC 的 xml。不同来源的数据集在这一点上不统一,所以拿到手先别急着写训练脚本,先花十分钟把目录结构和标注格式摸清楚,这一步能省掉后面几小时的报错排查。接下来的章节会按“先看懂数据、再跑通训练、然后调参提点、最后避坑”的顺序展开,每一步都给到能直接抄的命令和参数。
2. 红外狗类数据集的结构解析与格式转换
2.1 先摸清压缩包里的目录约定
拿到一个红外检测数据集,解压后的目录结构往往决定了你后面要写多少胶水代码。常见的组织方式有两种:一种是按 YOLO 习惯,images/ 和 labels/ 平级,文件名一一对应,图像是 0001.jpg,标注就是 0001.txt;另一种是按 VOC 习惯,Annotations/ 放 xml,JPEGImages/ 放图,ImageSets/ 放划分文件。红外数据集因为来源杂,这两种都可能遇到,甚至还有把标注直接塞进一个 csv 的情况。
我一般会先跑一段脚本把结构打印出来,而不是靠肉眼翻文件夹。下面这段代码递归统计目录下的文件类型和数量,几秒钟就能判断出这个数据集属于哪种组织方式。
import os from collections import Counter def inspect_dataset(root): """递归统计数据集目录下的文件类型分布""" counter = Counter() for dirpath, dirnames, filenames in os.walk(root): for f in filenames: ext = os.path.splitext(f)[1].lower() counter[ext] += 1 # 打印每层目录,方便看层级关系 level = dirpath.replace(root, '').count(os.sep) print(' ' * level + os.path.basename(dirpath) + '/') print('\n文件类型统计:', dict(counter)) inspect_dataset('./infrared_dog_dataset')这段代码的关键在于os.walk会逐层遍历,level变量用路径分隔符数量推算缩进层级,输出一眼就能看出 images 和 labels 是不是平级。文件类型统计里如果 .txt 数量约等于 .jpg 数量,基本就是 YOLO 格式;如果 .xml 占多数,那就是 VOC 格式。参数上没什么可调的,root 指向解压后的根目录即可。注意有些压缩包解压后会多套一层同名目录,脚本跑出来只有一层且没有图片,那就是路径指错了,往上退一级再跑。
2.2 标注格式转换:VOC 转 YOLO 的完整脚本
如果数据集是 VOC 格式,而你想用 YOLO 系列训练,就需要把 xml 转成归一化的 txt。这个转换看着简单,但边界情况不少:图像尺寸要从 xml 里读还是从实际图片读、类别名到 id 的映射怎么定、坐标越界怎么处理。下面这个脚本把这些都考虑进去了。
import os import xml.etree.ElementTree as ET from PIL import Image # 类别映射:红外狗类数据集通常只有 dog 一类,但保留扩展性 CLASS_MAP = {'dog': 0} # 有些数据集标注写的是拼音或英文变体,统一在这里归一 ALIAS = {'Dog': 'dog', 'gou': 'dog', 'canine': 'dog'} def voc_to_yolo(xml_dir, img_dir, out_dir): os.makedirs(out_dir, exist_ok=True) for xml_file in os.listdir(xml_dir): if not xml_file.endswith('.xml'): continue tree = ET.parse(os.path.join(xml_dir, xml_file)) root = tree.getroot() # 用实际图片尺寸,而不是 xml 里写的 size,避免标注与图片不一致 img_name = root.find('filename').text img_path = os.path.join(img_dir, img_name) with Image.open(img_path) as im: W, H = im.size lines = [] for obj in root.findall('object'): name = obj.find('name').text name = ALIAS.get(name, name) if name not in CLASS_MAP: continue # 跳过非狗类别 cls_id = CLASS_MAP[name] bbox = obj.find('bndbox') x1 = float(bbox.find('xmin').text) y1 = float(bbox.find('ymin').text) x2 = float(bbox.find('xmax').text) y2 = float(bbox.find('ymax').text) # 裁剪到图像边界内,防止越界标注污染训练 x1, x2 = max(0, x1), min(W, x2) y1, y2 = max(0, y1), min(H, y2) if x2 <= x1 or y2 <= y1: continue # 无效框直接丢弃 cx = (x1 + x2) / 2 / W cy = (y1 + y2) / 2 / H bw = (x2 - x1) / W bh = (y2 - y1) / H lines.append(f'{cls_id} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}') out_name = os.path.splitext(xml_file)[0] + '.txt' with open(os.path.join(out_dir, out_name), 'w') as f: f.write('\n'.join(lines)) voc_to_yolo('./Annotations', './JPEGImages', './labels')逻辑上分四步:解析 xml、读实际图像尺寸、逐目标转换坐标、写 txt。几个参数和决策点值得说明。第一,W, H取自 PIL 打开的真实图片而非 xml 里的 size 字段,因为红外数据集在整理过程中经常出现图片被裁剪但 xml 没同步更新的情况,用真实尺寸能避免坐标整体偏移。第二,ALIAS字典处理类别名不一致,红外数据集里狗可能被标成 Dog、gou 甚至 canine,不统一会导致类别 id 错乱。第三,坐标裁剪和无效框丢弃是必须的,红外标注因为热区边界模糊,标注员容易把框画到图像外面,这类框在训练时会产生大于 1 的归一化坐标,轻则 loss 异常,重则训练直接发散。转换完成后,建议随机抽 5 张图用可视化脚本叠框检查一遍,确认框和热区对得上再进入训练。
2.3 训练集/验证集划分与数据泄漏防范
格式转好之后,下一步是划分 train/val。红外数据集如果本身没给划分文件,很多人会直接随机 split,但这里有个容易翻车的点:如果数据集是从视频里抽帧得到的,相邻帧高度相似,随机划分会导致验证集里出现和训练集几乎一样的图,mAP 虚高,模型实际泛化能力被高估。判断方法很简单,看图像文件名是否带连续帧号,或者用感知哈希快速比对相似度。
import os, random, shutil from PIL import Image import imagehash def split_dataset(img_dir, label_dir, out_root, val_ratio=0.2, seed=42): random.seed(seed) imgs = sorted(os.listdir(img_dir)) # 用感知哈希去重,避免近重复帧跨集泄漏 hashes = {} for img in imgs: with Image.open(os.path.join(img_dir, img)) as im: h = imagehash.phash(im.convert('L')) hashes[img] = h # 简单贪心:哈希距离小于阈值的归为同一组 groups, used = [], set() for img in imgs: if img in used: continue group = [img] used.add(img) for other in imgs: if other not in used and hashes[img] - hashes[other] < 8: group.append(other) used.add(other) groups.append(group) random.shuffle(groups) n_val = int(len(groups) * val_ratio) val_groups = groups[:n_val] train_groups = groups[n_val:] for split, gs in [('train', train_groups), ('val', val_groups)]: os.makedirs(f'{out_root}/{split}/images', exist_ok=True) os.makedirs(f'{out_root}/{split}/labels', exist_ok=True) for g in gs: for img in g: shutil.copy(os.path.join(img_dir, img), f'{out_root}/{split}/images/{img}') lbl = os.path.splitext(img)[0] + '.txt' src_lbl = os.path.join(label_dir, lbl) if os.path.exists(src_lbl): shutil.copy(src_lbl, f'{out_root}/{split}/labels/{lbl}') split_dataset('./images', './labels', './dataset_split')核心思路是先用imagehash.phash给每张图算一个 64 位指纹,哈希距离小于 8 的视为近重复,归到同一组,划分时以组为单位而不是以图为单位,这样相似帧不会同时出现在训练和验证集。val_ratio一般设 0.2,数据量小于 500 张时可以降到 0.15,保证验证集至少有几十张图,mAP 才有统计意义。seed固定住是为了可复现,换种子重新划分能快速验证模型对划分的敏感度。这一步做完,数据侧的准备就算扎实了,可以进入模型训练。
3. 用 YOLO 系列在红外狗类数据集上跑通训练
3.1 环境与依赖:把版本钉死比追新更重要
红外检测的训练环境,我的血泪经验是:不要追最新版本。YOLO 生态迭代快,不同版本之间 API 差异大,而红外数据集本身规模通常不大,新版本带来的精度提升有限,反而容易在环境上耗掉半天。常见做法是选一个稳定版本,把 torch、torchvision、ultralytics 的版本号写进 requirements.txt 钉死。
# 建议用 conda 建独立环境,避免和系统里的 torch 冲突 conda create -n ir_dog python=3.10 -y conda activate ir_dog # 钉死版本,CUDA 版本按自己显卡驱动选,这里以 cu118 为例 pip install torch==2.1.0 torchvision==0.16.0 --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics==8.1.0 opencv-python==4.9.0.80 imagehash==4.3.1版本选择上,torch 2.1 配 cu118 是兼容性比较稳的组合,ultralytics 8.1 的 API 已经稳定,训练脚本和导出脚本不会因为小版本变动而报错。imagehash是上一章划分数据集用的,如果已经划分好可以不加。装完之后跑一句python -c "import torch; print(torch.cuda.is_available())"确认 GPU 可用,返回 False 的话先查驱动和 CUDA 版本匹配,别急着往下走,CPU 训练红外数据集会慢到怀疑人生。
3.2 数据配置文件与训练命令
YOLO 训练需要一个 yaml 描述数据路径和类别。红外狗类数据集只有一类,配置很简洁,但路径写法有讲究,相对路径和绝对路径混用是新手最常踩的坑。
# ir_dog.yaml path: /abs/path/to/dataset_split # 强烈建议写绝对路径 train: train/images val: val/images names: 0: dogpath用绝对路径,train和val相对 path 写,这样无论从哪个目录启动训练都能找到数据。names 里只有 dog 一类,id 从 0 开始。配置写好之后,训练命令如下。
yolo detect train \ data=ir_dog.yaml \ model=yolov8n.pt \ epochs=100 \ imgsz=640 \ batch=16 \ lr0=0.01 \ patience=20 \ device=0 \ project=runs/ir_dog \ name=exp1参数逐个说:model=yolov8n.pt用 nano 版先跑通流程,红外数据集通常几千张量级,nano 足够验证 pipeline,确认无误再换 s/m 版提精度。imgsz=640是默认值,红外图像如果分辨率很高(比如 1280),可以保持 640 训练、推理时再调,省显存。batch=16按显存调,8G 显存跑 640 的 nano 大概能到 32,跑不动就减半。lr0=0.01是初始学习率,红外数据集小,学习率太大会震荡,0.01 配 cosine 衰减比较稳。patience=20是早停,20 轮验证指标不升就停,避免过拟合。训练过程中重点看三个指标:box_loss 是否稳定下降、mAP50 是否在 50 轮后还在爬、cls_loss 是否异常高(高说明类别混淆严重,红外里狗和热源物体容易混)。
3.3 红外场景下的数据增强取舍
可见光检测那套增强策略,直接搬到红外上会出问题。翻转、缩放、马赛克这些几何增强可以保留,但颜色相关的增强(HSV 抖动、亮度对比度调整)要谨慎,因为红外图像的灰度直接对应温度,随意调亮度会破坏“热即目标”的物理含义。我的做法是关掉 HSV,保留几何增强,额外加一点高斯噪声模拟传感器噪声。
# 在训练脚本里覆盖默认增强参数 from ultralytics import YOLO model = YOLO('yolov8n.pt') model.train( data='ir_dog.yaml', epochs=100, imgsz=640, hsv_h=0.0, # 关闭色相抖动,红外无意义 hsv_s=0.0, # 关闭饱和度抖动 hsv_v=0.2, # 保留少量亮度抖动,模拟环境温度变化 degrees=10.0, # 小角度旋转,红外目标姿态多样 translate=0.1, scale=0.5, fliplr=0.5, # 水平翻转保留 mosaic=1.0, # 马赛克增强对小目标有效 mixup=0.0, # 红外图像 mixup 会产生不真实的热分布,关掉 )hsv_h和hsv_s设 0 是因为红外图像本身没有色相饱和度概念(伪彩图的颜色是映射出来的,不是真实色彩)。hsv_v=0.2保留一点亮度扰动,模拟不同环境温度下同一目标的灰度变化,但幅度不能大,0.2 是试出来的经验值,再大模型会把暗狗当背景。mixup=0是红外特有的取舍,可见光里 mixup 能提升泛化,但两张红外图叠加会产生物理上不存在的热分布,模型学到的是伪影。mosaic=1.0保留,因为红外小目标多,马赛克能增加小目标出现频率。
4. 红外狗类检测的调参与误检排查
4.1 三个必调参数:anchor、置信度阈值、NMS IoU
训练跑通只是开始,推理阶段的参数直接决定实际可用性。红外狗类检测有三个参数我每次都会重新调,不会用默认值。
第一个是 anchor 尺度。YOLO 默认 anchor 是基于 COCO 聚类的,COCO 里狗的大小分布和红外场景差异很大——红外监控里狗往往在画面中占比较小,且距离远近导致尺度跨度大。如果发现训练时 box_loss 降不下去,或者小目标召回明显低,就该重新聚类 anchor。用 k-means 在自家数据集上跑一遍:
import numpy as np from sklearn.cluster import KMeans def cluster_anchors(label_dir, n_anchors=9): boxes = [] for f in os.listdir(label_dir): with open(os.path.join(label_dir, f)) as fp: for line in fp: _, _, _, w, h = map(float, line.split()) boxes.append([w, h]) boxes = np.array(boxes) kmeans = KMeans(n_clusters=n_anchors, random_state=42).fit(boxes) anchors = kmeans.cluster_centers_ # 按面积排序,YOLO 要求 anchor 从小到大 anchors = anchors[np.argsort(anchors[:, 0] * anchors[:, 1])] for a in anchors: print(f'{a[0]:.4f} {a[1]:.4f}') cluster_anchors('./dataset_split/train/labels')输出的 9 组宽高就是适配你数据集的 anchor,替换掉模型配置里的默认值。红外数据集如果狗普遍偏小,聚类出来的 anchor 会明显小于 COCO 默认值,这一步对小目标召回提升通常有 3 到 5 个点。
第二个是置信度阈值。默认 0.25 在红外场景往往偏低,因为红外里热源干扰多,低阈值会引入大量误检。我的做法是在验证集上画 precision-recall 曲线,找 F1 最大的点。实操上可以先跑yolo detect val拿到不同置信度下的指标,再定阈值。安防场景宁可漏检不可误检时,阈值可以提到 0.5 以上。
第三个是 NMS 的 IoU 阈值。红外目标因为热扩散,同一个狗可能产生多个重叠框,NMS IoU 默认 0.7 有时不够,会留下重复框。如果发现同一只狗被框了两三次,把 IoU 降到 0.5 甚至 0.45。但降太低会导致密集场景下相邻狗被误合并,所以要在验证集上试。
4.2 误检排查:热源干扰与夜间场景
红外狗类检测最常见的误检不是漏检狗,而是把非狗热源当成狗。典型的有三类:刚停下的车辆引擎盖、路灯和变压器底座、以及人体(如果数据集只标了狗没标人)。排查这类问题,不能只看 mAP,要把误检样本单独捞出来分析。
from ultralytics import YOLO import cv2 model = YOLO('runs/ir_dog/exp1/weights/best.pt') results = model.predict('./val_images', conf=0.25, save=True) # 统计每个类别的检出数量,异常多说明有系统性误检 from collections import Counter cnt = Counter() for r in results: for c in r.boxes.cls: cnt[int(c)] += 1 print(cnt)如果 dog 类检出数量远超验证集实际标注数,基本可以确认有误检。下一步是把置信度在 0.25 到 0.5 之间的框可视化出来,这些是模型的“犹豫区”,往往就是热源干扰。针对性的解决办法有两个:一是在训练集里补充这类负样本(把热源图作为背景图加入,不给标注),让模型学会区分;二是如果误检集中在特定场景(比如夜间路灯下),对该场景做针对性数据采集。我一般会先做负样本挖掘,成本低见效快,补几百张纯背景热源图,误检率通常能降一半。
4.3 小目标与遮挡:红外检测的两个硬骨头
红外监控场景里,狗距离镜头远时可能只占十几个像素,这种小目标在 640 分辨率下经过多次下采样后特征几乎消失。提升小目标召回有几个手段:训练分辨率提到 1280(显存翻倍,但小目标 mAP 提升明显)、在数据增强里增加小目标的复制粘贴、以及用 P2 层特征(YOLOv8 支持加 P2,但速度会降)。遮挡则是另一个问题,红外里狗被遮挡后热辐射被挡住,模型只能靠露出的部分判断,容易漏检。这个没有特别好的算法解,只能靠数据里多包含遮挡样本,以及推理时适当降低置信度阈值配合后处理。
5. 避坑与常见问题排查
5.1 训练 loss 正常但 mAP 为 0
现象:训练日志里 box_loss 和 cls_loss 都在降,但验证 mAP 始终是 0 或者极低。原因通常是标注格式和模型预期不匹配,最常见的是类别 id 从 1 开始而不是 0,或者坐标没有归一化。YOLO 要求 class_id 从 0 开始、坐标归一化到 0 到 1,如果转换脚本里忘了归一化,框会全部跑到图像外面。解决办法是随机抽一个 label 文件,确认第一列是 0,后四列都在 0 到 1 之间。另一个可能是 data yaml 里 names 的 id 和 label 里的 id 对不上,检查一遍即可。
5.2 验证集 mAP 很高但实际推理一塌糊涂
现象:验证集 mAP50 到 0.9,拿新拍的视频去测,漏检误检一堆。原因基本是数据泄漏——训练集和验证集里有大量近重复帧,模型记住了而不是学会了。红外数据集从视频抽帧时这个问题特别普遍。解决办法是回到 2.3 节的感知哈希分组划分,确保相似帧不跨集。另一个可能是验证集和实际场景域差异大(比如验证集是白天,实际是夜间),这属于域适应问题,需要补充目标域数据。
5.3 显存溢出(CUDA out of memory)
现象:训练跑几轮后突然 OOM,或者一开始就报显存不足。原因可能是 batch 太大、imgsz 太高,或者 dataloader 的 workers 太多导致内存泄漏。解决办法按顺序试:先把 batch 减半,再把 imgsz 从 640 降到 512,然后把 workers 从 8 降到 4。如果还不行,检查是不是开了缓存(cache=True)把整个数据集读进内存了,红外图像如果是 16 位灰度,单张内存占用比 8 位 RGB 还大,关掉缓存。另外,训练中途 OOM 有时是验证阶段引起的,可以把验证 batch 单独调小。
5.4 红外图像是 16 位灰度导致读取异常
现象:用 OpenCV 读图训练,图像全黑或者对比度异常。原因是红外相机输出的常是 16 位单通道图,cv2.imread默认按 8 位读,高位信息被截断。解决办法是读图时指定cv2.IMREAD_UNCHANGED,然后做归一化映射到 8 位。
import cv2 import numpy as np img = cv2.imread('ir_0001.png', cv2.IMREAD_UNCHANGED) if img.dtype == np.uint16: # 按 1% 和 99% 分位数拉伸,避免极端值影响对比度 lo, hi = np.percentile(img, (1, 99)) img = np.clip((img - lo) / (hi - lo) * 255, 0, 255).astype(np.uint8) cv2.imwrite('ir_0001_8bit.png', img)分位数拉伸比直接除以 65535 效果好,因为红外图里往往有极亮的热源和极暗的背景,线性映射会让目标区域挤在中间灰度,对比度不足。
5.5 类别不平衡与背景图过多
现象:数据集里狗的目标框很少,大部分图是纯背景,训练时 cls_loss 很快降到 0,但召回上不去。原因是背景图占比过高,模型倾向于全部预测为背景。解决办法是控制背景图比例,一般不超过总图数的 10%,或者在 loss 里给正样本加权。YOLO 本身有 focal loss 机制,但背景图太多还是会压垮。实操上把纯背景图单独放一个目录,训练时按比例采样,而不是全量喂进去。
6. 从能跑到好用:红外狗类检测的进阶技巧
把模型训到能出框只是及格线,真正落地到红外监控或巡检场景,还有几件事值得做。第一个是模型导出与推理加速。训练完的 .pt 权重在服务器上跑没问题,但如果要部署到边缘设备(比如带红外模组的嵌入式板子),需要导出成 ONNX 或 TensorRT。导出命令很简单,但红外图像是单通道,导出时要注意输入通道数。
# 导出 ONNX,指定输入为单通道灰度 yolo export model=runs/ir_dog/exp1/weights/best.pt format=onnx imgsz=640 opset=12导出后建议用 onnxruntime 跑一遍和 pytorch 结果对比,确认数值误差在可接受范围。如果部署到 TensorRT,FP16 量化对红外检测精度影响通常很小,因为红外特征本身就不依赖精细纹理,但 INT8 量化要谨慎,需要拿校准集跑一遍,否则小目标召回会掉。
第二个是时序信息利用。红外监控是视频流,单帧检测容易受瞬时热源干扰,但连续帧里狗是移动的,热源是静止的。一个简单有效的后处理是:对连续 N 帧的检测框做跟踪(比如用 IoU 匹配的简易跟踪器),只有持续出现超过 M 帧的检测才输出,这样能过滤掉大量一闪而过的热源误检。这个逻辑不需要改模型,在推理后处理里加几十行代码就能实现,实测误检率能降不少。
第三个是主动学习闭环。红外场景的长尾问题比可见光严重,模型上线后总会遇到新的误检场景。与其定期重新标注全量数据,不如做一个主动学习流程:把模型置信度在 0.3 到 0.6 之间的样本自动挑出来,人工只标这些“犹豫样本”,标完增量训练。这样每轮标注量可能只有几百张,但模型提升比随机标几千张还明显。我一般会把这个流程脚本化,每周跑一次,模型迭代成本能压到很低。
最后说个我自己的习惯:每次换数据集或换场景,先不急着调模型,而是花半小时把数据可视化一遍,随机抽 50 张图叠上标注框看。红外数据集的质量参差不齐,标注偏移、漏标、类别错标都很常见,这些问题在训练日志里看不出来,但会实实在在拖垮指标。数据看一遍,心里有数了再动手,比盲目调参省时间。希望帮到你。
本文还有配套的精品资源,点击获取