简介这是一份面向红外目标检测方向的轻量级行业数据集适合从事夜间监控、农业安防、野生动物保护及户外机器人研究的算法工程师与高校学生使用。数据集聚焦红外热成像场景下的狗类目标识别共411张图像按训练集357张、验证集36张、测试集18张划分标注为YOLO格式包含归一化边界框与类别标签类别0为非狗类干扰项类别1为狗类目标可直接用于YOLOv5、YOLOv12等模型的训练与性能基准测试。资源包共824个文件以411个jpg红外图像和411个txt标注文件为主另附1个yaml数据配置与1份docx说明文档压缩包约17.05MB结构清晰、开箱即用。目前已有162人学习下载。该数据集填补了红外动物检测细分领域的数据缺口能帮助读者快速搭建低光照条件下的检测实验验证模型在真实监控环境中的鲁棒性并支持PyTorch、TensorFlow等主流框架的迁移部署。1. 红外狗类目标检测数据集从热成像到 YOLO 标注的落地路径夜间安防、园区巡检、野生动物监测这些场景里可见光摄像头一到天黑基本就废了补光灯打过去要么过曝要么惊动目标。红外热成像不吃这一套它记录的是物体表面的热辐射分布狗、猫、人这类恒温目标在热图里天然就是高亮区域背景再黑也不影响成像。但问题来了网上开源的红外数据集大多是行人、车辆专门针对狗类目标的少之又少自己拿热像仪去拍再标注成本高得离谱。这份红外狗类目标检测数据集就是冲着这个缺口来的它把热成像图、YOLO 格式标注、类别定义打包在一起拿到手就能直接喂给 YOLOv8、YOLOv11 甚至 yolov12 去训练。适合做夜间宠物监控、牧场犬只管理、搜救犬辅助识别这类项目的开发者也适合想拿红外数据练手目标检测的新手——毕竟热成像图的纹理特征和可见光差异很大拿它跑一遍能帮你理解模型对非 RGB 输入的适应边界。2. 数据集结构与 YOLO 标注格式拆解先看懂再动手2.1 目录组织与文件命名逻辑拿到压缩包解压后常见做法是看到 images 和 labels 两个平行目录下面再按 train、val、test 切分。红外图像一般是灰度 PNG 或单通道 JPG文件名通常带时间戳或场景编号比如ir_dog_20240512_001.png。labels 目录里对应同名.txt文件每行一个目标格式是class_id x_center y_center width height坐标全部归一化到 0 到 1 之间。这里有个容易翻车的地方红外图如果是 16 位灰度直接丢给 OpenCV 读会得到 0 到 65535 的像素值而 YOLO 训练时默认按 8 位处理不转换的话图像全黑或者全白模型根本学不到东西。import cv2 import numpy as np import os def convert_16bit_to_8bit(src_dir, dst_dir): 将16位红外灰度图转为8位保留热辐射相对分布 src_dir: 原始16位图像目录 dst_dir: 转换后8位图像目录 os.makedirs(dst_dir, exist_okTrue) for fname in os.listdir(src_dir): if not fname.lower().endswith((.png, .jpg, .jpeg)): continue img cv2.imread(os.path.join(src_dir, fname), cv2.IMREAD_UNCHANGED) if img is None: continue # 判断位深16位图做线性拉伸 if img.dtype np.uint16: img_8u cv2.convertScaleAbs(img, alpha(255.0 / 65535.0)) else: img_8u img cv2.imwrite(os.path.join(dst_dir, fname), img_8u) convert_16bit_to_8bit(./images_raw, ./images_8bit)这段代码的核心是cv2.convertScaleAbs里的 alpha 参数它把 16 位动态范围线性映射到 8 位。如果你发现转换后目标对比度不够可以把 alpha 调大或者改用 CLAHE 自适应直方图均衡但注意别把背景噪声也拉起来。转换完记得检查 labels 里的坐标是否还对应——图像尺寸没变的话坐标不用动如果做了裁剪或缩放标注必须同步重算。2.2 类别定义与标注文件校验这份数据集通常只定义一个类别dogclass_id 为 0。但有些版本会区分dog和other_animal拿到手第一件事是看data.yaml或者classes.txt确认类别数和顺序。YOLO 训练时类别索引从 0 开始如果标注文件里出现了 1 而你的 yaml 只写了 1 个类训练直接报 index out of range。校验脚本可以这样写import os def validate_labels(label_dir, num_classes1): 检查标注文件中的类别索引和坐标范围 label_dir: 标注txt所在目录 num_classes: 数据集定义的类别总数 errors [] for fname in os.listdir(label_dir): if not fname.endswith(.txt): continue path os.path.join(label_dir, fname) with open(path, r) as f: for line_no, line in enumerate(f, 1): parts line.strip().split() if len(parts) ! 5: errors.append(f{fname}:{line_no} 字段数不对) continue cls_id int(parts[0]) coords list(map(float, parts[1:])) if cls_id num_classes: errors.append(f{fname}:{line_no} 类别索引越界 {cls_id}) if any(c 0 or c 1 for c in coords): errors.append(f{fname}:{line_no} 坐标超出0-1范围) return errors errs validate_labels(./labels/train, num_classes1) print(f发现 {len(errs)} 处问题) for e in errs[:10]: print(e)跑一遍这个脚本能把大部分标注低级错误筛出来。常见问题是坐标没归一化、类别索引写成了 1、或者一行里多写了空格导致字段数不对。修完再进训练能省掉很多「loss 不降」的玄学排查时间。3. 用 YOLOv8/v11 训练红外狗类检测模型参数配置与训练监控3.1 环境搭建与 data.yaml 配置Ultralytics 的 YOLOv8 和 YOLOv11 在 API 上基本兼容装一个ultralytics包就能跑。建议用 Python 3.9 以上PyTorch 选 CUDA 版本匹配你的显卡驱动。安装命令就一行pip install ultralytics然后准备dog_ir.yaml内容如下path: /home/user/datasets/ir_dog train: images/train val: images/val test: images/test nc: 1 names: 0: dogpath写数据集根目录train、val是相对路径。nc是类别数names按索引顺序写类别名。这里注意红外图像如果是单通道Ultralytics 默认会按三通道读它内部会自动复制通道不用你手动转 RGB但如果你自己预处理时已经转成了三通道灰度图那也没问题。3.2 训练命令与关键超参设置启动训练最简命令yolo detect train datadog_ir.yaml modelyolov8n.pt epochs100 imgsz640 batch16 device0如果你用 YOLOv11把model换成yolo11n.pt即可。几个参数值得展开说imgsz640红外图分辨率如果本身是 320x240放大到 640 会插值模糊建议按原始尺寸就近取 32 的倍数比如 320 或 416。batch16显存不够就降到 8 或 4但 batch 太小 BN 层统计量不稳训练震荡会变大。device0指定第一块 GPUCPU 训练的话写devicecpu但速度会让你怀疑人生。epochs100红外数据集通常比可见光小100 轮够用配合patience20早停防止过拟合。训练过程中重点看mAP50和mAP50-95两个指标。红外目标边缘模糊mAP50 能到 0.85 以上就算不错mAP50-95 通常比可见光低 10 到 15 个点这是热成像的物理特性决定的不用强行调参去追。3.3 训练日志解读与中断恢复Ultralytics 会在runs/detect/train/下生成results.csv里面记录了每轮的 box_loss、cls_loss、mAP 等。如果 box_loss 降到 0.5 以下但 mAP 不涨大概率是标注框和实际目标对不齐回去查标注。如果 cls_loss 一直很高检查类别是否标错。中断后恢复训练用yolo detect train datadog_ir.yaml modelruns/detect/train/weights/last.pt resumeTrueresumeTrue会从上次中断的 epoch 继续优化器状态和学习率调度都能接上。但注意如果你中途改了data.yaml或者换了数据集路径resume 会报错这时候只能从头来。4. 红外数据集训练避坑从图像位深到标注错位的五条血泪经验4.1 图像全黑或全白模型学不到特征现象训练 loss 从第一轮就不降验证集预测框乱飞。原因16 位红外图没转 8 位或者转换时 alpha 设错导致像素值集中在 0 或 255。解决用第 2 章的转换脚本过一遍转换后用cv2.imshow或matplotlib看一眼确认目标区域有灰度层次。4.2 标注框整体偏移mAP 卡在 0.3 上不去现象预测框位置大致对但和真实框交并比很低。原因图像做了 resize 但标注没同步缩放或者标注时用的是左上角宽高而不是中心点宽高。解决写个脚本把标注画到图上可视化抽 20 张看框是否贴合目标。YOLO 格式必须是中心点归一化坐标不是 VOC 的左上角坐标。4.3 类别索引从 1 开始训练直接报错现象IndexError: index 1 is out of bounds for dimension 0 with size 1。原因标注文件里 dog 的 class_id 写成了 1但 data.yaml 里 nc1只有索引 0。解决批量把标注文件第一列减 1或者把 nc 改成 2 并加一个背景类——但后者不推荐YOLO 不需要显式背景类。4.4 验证集 mAP 远高于测试集过拟合严重现象val mAP50 到 0.9test 上只有 0.6。原因训练集和验证集来自同一段视频的连续帧目标外观几乎一样模型记住了背景。解决按场景或时间段切分数据集确保验证集里的背景、光照、狗的姿态和训练集有差异。红外数据集尤其要注意这点同一场景连续帧的冗余度比可见光更高。4.5 推理时单通道输入报错通道数不匹配现象训练好的模型拿去推理报expected 3 channels but got 1。原因推理脚本直接读了原始单通道红外图没做通道复制。解决推理前用cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)转三通道或者用np.stack([img]*3, axis-1)手动堆叠。Ultralytics 训练时内部会处理但你自己写的推理代码要补这一步。5. 红外狗类检测的进阶技巧从模型导出到热图可视化验证训练完模型只是第一步真正落地还要过导出和验证两关。Ultralytics 支持导出 ONNX、TensorRT、OpenVINO 等格式边缘设备上跑推荐 TensorRT 或 OpenVINO。导出命令yolo export modelruns/detect/train/weights/best.pt formatonnx imgsz640 simplifyTruesimplifyTrue会调用 onnx-simplifier 做图优化去掉冗余算子。导出后拿 ONNX Runtime 跑一遍推理对比 PyTorch 输出误差在 1e-3 以内算正常。如果误差大检查导出时的imgsz和训练时是否一致动态轴设置是否正确。验证模型有没有真正学到热特征而不是在拟合背景我一般会做热图可视化。用 Grad-CAM 或者简单的特征图可视化看模型关注区域是否落在狗的身体轮廓上。如果注意力跑到了地面或围栏上说明背景过拟合了得回去补数据增强比如随机裁剪、亮度扰动、模拟热噪声。红外数据增强和可见光不一样翻转要慎用——有些场景下狗的热辐射左右不对称比如一侧被遮挡翻转会引入错误标签。旋转和缩放相对安全Mosaic 增强在红外上效果也不错但要注意拼接后热辐射连续性被破坏的问题。还有一个实用技巧把可见光预训练权重拿来做迁移学习。虽然红外和 RGB 分布差异大但浅层边缘特征有共通性。我试过用yolov8n.pt在 COCO 上预训练的权重初始化比从头训收敛快 30% 左右最终 mAP 也能高 2 到 3 个点。但如果你数据量足够大超过 5000 张从头训反而可能更好因为预训练权重的 RGB 偏置需要额外轮次去纠正。最后说个我踩过的坑有次导出 TensorRT 引擎后在 Jetson 上跑检测框全部偏移了半个目标。查了半天发现是预处理时 letterbox 的填充值设成了 114而训练时 Ultralytics 默认填充 114 没错但导出后推理脚本里我手动写的预处理用了 0 填充。就这一个参数折腾了一下午。从那以后我每次导出模型都强制走一遍「PyTorch 推理 → ONNX 推理 → 目标平台推理」的三方对比确保预处理和后处理完全对齐。希望帮到你。本文还有配套的精品资源点击获取