
简介红外狗类目标检测数据集是一份面向红外热成像场景的YOLO格式目标检测资源专为夜间、恶劣天气或低照度条件下的狗类目标识别设计。数据集共411张红外图像已明确划分为训练集357张、验证集36张、测试集18张标注类别包含0非狗类物体与1狗类目标边界框坐标经归一化处理可直接用于YOLOv5、YOLOv12等主流模型训练与评估。资源包共824个文件以411个jpg红外图像和411个txt标注文件为主体另附yaml配置文件和docx数据集说明文档压缩包仅17.05MB轻量易用。数据源自真实红外监控场景可支撑智能农业入侵动物检测、边境安防警报、户外巡检机器人避障等领域有利于提升模型在低可见度条件下的鲁棒性并填补红外动物检测细分领域的数据缺口。目前已有162人学习适合目标检测算法研究者、安防与农业AI开发者快速上手省去数据采集与标注成本。1. 红外狗类目标检测数据集这份 zip 能解决哪几类问题红外热成像目标检测这几年在工业巡检、电力廊道、安防周界里需求很实在——可见光一到晚上就瞎红外反而能把温血动物从背景里挖出来。这个“红外狗类目标检测数据集.zip”不是普通狗图包里面是热成像视频帧或红外相机实拍图配的是 YOLO 格式的 txt 标注类别基本围绕“dog”展开适合直接喂给 YOLOv8、YOLOv12 这类检测器跑训练。新手能省掉标数据的力气直接复现一套红外检测流程熟手则能拿它做领域迁移比如把狗类检测的权重微调到电力红外数据集或鸟类目标检测上去。我拆过不少红外数据集这一份的标注粒度算比较规整的值得动手跑一遍。2. 数据集结构拆解目录、标注格式与图像尺寸2.1 目录结构长什么样images 和 labels 的对应关系拿到 zip 解压后第一件事是看目录层级。常见做法是 data/ 底下分 train/ 和 val/各自再放 images/ 和 labels/。我一般会先跑一条 tree 命令看全貌tree infrared-dog -L 3期望的输出长这样infrared-dog/ ├── train/ │ ├── images/ │ │ ├── dog_day_001.jpg │ │ ├── dog_night_002.jpg │ │ └── ... │ └── labels/ │ ├── dog_day_001.txt │ ├── dog_night_002.txt │ └── ... └── val/ ├── images/ └── labels/这里有一个关键点txt 标注文件和 jpg 图片是严格同名对应的YOLO 训练时靠前缀名去匹配 labels。如果文件的 basename 对不上训练时报错全是 “No labels found in image”。常见原因是解压时系统自带缩略图文件比如 macOS 的._开头文件混了进来导致图片找到了但标签文件没找到。解决办法也直接写个脚本把所有._开头和.DS_Store文件清掉再校验一遍文件名交集。2.2 红外图像的尺寸、通道数和标注文件的真实格式红外相机的分辨率一般就是 640x512 或 384x288这份数据集里图像尺寸大概率也是这个区间。注意红外图本身是单通道灰度但很多 zip 包里的 jpg 被存成了三通道视觉上就是灰蒙蒙的伪彩或半伪彩图。这会影响后续训练预处理灰度图转成 3 通道再进网络模型也能收敛但会平白多算近一倍卷积推理速度吃亏。用 Python 快速扫一遍图像属性和标注内容from PIL import Image import os img_path infrared-dog/train/images/dog_day_001.jpg img Image.open(img_path) print(尺寸:, img.size, 通道:, img.mode) # 模式可能是 L 或 RGB label_path infrared-dog/train/labels/dog_day_001.txt with open(label_path, r) as f: print(f.read())这段代码输出的是 YOLO 标准格式每一行是class x_center y_center width height且全部做了归一化。比如0 0.4732 0.4817 0.0831 0.0926含义就是类别 id 为 0狗框中心在相对坐标 (0.4732, 0.4817)宽高分别是 0.0831 和 0.0926。坐标归一化到 01方便换输入分辨率。提示如果 txt 里出现坐标大于 1 或者负数的行说明原始标注是从别的工具导出后没处理好训练前必须先清洗。2.3 类别统计一个容易忽略的检查项不要看到 zip 就急着训练。我习惯先把所有 txt 读一遍统计类别分布和框数量防止数据倾斜。红外场景下狗在画面里往往很小框的宽高可能集中在 0.050.15 这个区间标注框数量如果太少模型学不到小目标特征。用一段脚本做快速体检import glob cls_count {} box_sizes [] for label_file in glob.glob(infrared-dog/**/labels/*.txt, recursiveTrue): with open(label_file, r) as f: for line in f: parts line.strip().split() cls int(parts[0]) cls_count[cls] cls_count.get(cls, 0) 1 w float(parts[3]) h float(parts[4]) box_sizes.append((w, h)) print(类别分布:, cls_count) print(样本数:, len(box_sizes)) print(平均框宽高比:, sum(w / h for w, h in box_sizes) / len(box_sizes))这段代码本质上是做数据审计。看完分布你就知道模型要面对的核心难点是密集的小目标还是稀疏的中等目标。3. 数据预处理把标注归一化成 YOLO 能吃的 txt3.1 从 VOC 或其他格式转成 YOLO 格式拿到手的 zip 里不一定全是 YOLO 格式有些红外数据集最初是用 LabelImg 按 VOC 导出的XML 文件里存的是绝对像素坐标。我自己写过一个通用的转换脚本干的事就是把 XML 里的 xmin/ymin/xmax/ymax 读出换成归一化中心点宽高import xml.etree.ElementTree as ET import os def convert_voc_to_yolo(xml_path, output_dir, classes): tree ET.parse(xml_path) root tree.getroot() size root.find(size) width int(size.find(width).text) height int(size.find(height).text) lines [] for obj in root.findall(object): name obj.find(name).text if name not in classes: continue cls_id classes.index(name) box obj.find(bndbox) x1 float(box.find(xmin).text) y1 float(box.find(ymin).text) x2 float(box.find(xmax).text) y2 float(box.find(ymax).text) x_center (x1 x2) / 2 / width y_center (y1 y2) / 2 / height w (x2 - x1) / width h (y2 - y1) / height lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) out_path os.path.join(output_dir, os.path.basename(xml_path).replace(.xml, .txt)) with open(out_path, w) as f: f.write(\n.join(lines)) classes [dog] convert_voc_to_yolo(annotation.xml, labels, classes)参数说明classes列表的索引顺序就是 YOLO 的类别 id顺序制定后不要中途改否则权重加载会错位。所有坐标必须除以图像宽高做归一化不然训练时框会漂移到画面外。注意有些红外数据集的 xml 里带 rotation 标签表示旋转框YOLO 的矩形框格式存不了旋转信息这种情况要么忽略角度要么用 OBB 模型不要强行把四个角点塞进 xywh。3.2 数据增强红外场景下别盲目开 Mosaic红外图像对比度低、目标与背景温差不明显数据增强参数和可见光要有区分。我一般把训练 yaml 里的增强项拆开调train: infrared-dog/train/images val: infrared-dog/val/images nc: 1 names: [dog] # 增强参数 mosaic: 0.8 mixup: 0.2 hsv_h: 0.01 hsv_s: 0.5 hsv_v: 0.3 degrees: 10.0 translate: 0.1 scale: 0.3 fliplr: 0.5hsv_h 只给到 0.01 是因为红外图像本身没有强的色调信息色相扰动太大反而把温度差异信息洗掉了。translate 和 scale 可以适当给大一点因为狗在画面里的位置变化本来就明显。3.3 把伪彩图统一成灰度、重新定标很多红外数据集里的 jpg 其实是从热像仪软件导出的伪彩 BMP每个像素的灰度值和实际温度不是线性对应。做训练前最好把图转成真正的单通道灰度并把像素范围想办法拉伸到 0255。我常用的处理是 OpenCV 读入后做直方图均衡再保存import cv2 import glob for img_path in glob.glob(infrared-dog/**/images/*.jpg, recursiveTrue): img cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) clahe cv2.createCLAHE(clipLimit2.0, tileGridSize(8, 8)) img_eq clahe.apply(img) cv2.imwrite(img_path, img_eq)代码里的 CLAHE 是自适应直方图均衡clipLimit 控制对比度增强强度给 2.0 是为了不把红外噪声放大得太夸张。tileGridSize 表示把图切成 8x8 的块分别均衡避免整图均衡把弱目标淹没。4. 训练参数与模型选型从 YOLOv8 到 YOLOv12 的取舍4.1 红外场景下选模型的基本原则红外目标检测有个特点目标边缘比可见光模糊小目标占比不低但背景相对单纯。用大模型不划算YOLOv8n 或者 YOLOv8s 反而是多数项目的主力。YOLOv12 出来以后很多人在工业数据集上测试结论是 AP 有小幅提升但推理延迟也上去了边缘设备上要权衡。下面这个对比表可以作为选型参考模型特点适合场景不适合场景YOLOv8n体积小、推理快边缘盒子、实时巡检小目标极多的密集场景YOLOv8s精度速度均衡大多数红外检测任务极端低算力设备YOLOv12注意力机制加持需要更高精度的离线分析延迟敏感的边缘部署YOLO11n后处理优化明显和 v8n 类似无明显短板我的建议是先拿 YOLOv8s 跑通全流程确定数据和标签没问题再换 YOLOv12 做消融对比。4.2 训练命令与关键超参设置用 ultralytics 训练时我习惯把 batch 和 imgsz 写死在命令里保证复现yolo train datainfrared.yaml modelyolov8s.pt epochs200 imgsz640 batch16 device0 patience30 save_period20参数含义拆开imgsz640是输入分辨率红外原图如果是 640x512这直接对齐batch16看显存8GB 卡只能压到 8patience30是 30 个 epoch 没改善就停防止过拟合无聊等跑完save_period20每 20 轮存一次中间权重万一后面几轮崩了还能回退。训练时重点观察 loss 曲线如果 cls_loss 下降但 box_loss 抖动优先怀疑标注框本身边界不干净。4.3 类别不均衡与初始权重迁移这份数据集如果类别只有 dog 一类不存在类别不均衡问题但样本量可能只有几百张不够大规模训练。常见做法是先用 COCO 预训练权重yolov8s.pt做迁移学习只改最后一层输出维度。冷启动从头训几百张红外图几乎必然过拟合。迁移之后还有一个细节把 backbone 冻结前几个 stage让前面层保留可见光特征后面层学红外特征等 loss 不再明显下降再解冻整体微调。5. 避坑红外训练里最常见的 5 个翻车现场5.1 现象loss 降不下去收敛后 mAP 只有 0.3原因这些图从 zip 解压后是 BGR 三通道伪彩图而模型按 RGB 读入通道顺序乱了特征全错位。解决读图时统一用cv2.COLOR_BGR2RGB转换或者直接以灰度单通道方式读入再复制成三通道。5.2 现象验证集 mAP 还行但实战中误报率高得离谱原因红外场景里热源太多车辆引擎盖、路灯、空调外机在热像图里都是亮斑模型把“高温物体”和“狗”混在一起。解决训练时不要只给正样本多裁一些纯背景红外图加入训练集并把置信度阈值从 0.25 提到 0.4 再试。5.3 现象狗在画面远处时永远漏检原因红外狗的远距离目标可能只占 20x20 像素640 推理分辨率下特征太小被下采样丢掉。解决把imgsz调到 768 或者 896 重新训练或者用 SAHI 这类切片推理工具把大图切成 320 块分别检测。5.4 现象两个同样配置的训练结果差很多原因数据集的 train/val 划分是 zip 包里写死的如果划分时把同一段视频帧同时放进了训练和验证那 mAP 虚高反之如果划分随机但部分帧过于相似也会造成波动。解决先用脚本检查 train 和 val 的图片名前缀保证没有同源视频连续帧串集再固定随机种子重拆一次。5.5 现象解压时提示文件损坏或者 labels 目录里混进了 ._ 开头的空文件原因数据集打包时在 macOS 或 Windows 压缩软件下产生隐藏元数据文件zip 传输过程中也可能少了几字节。解决用 7-Zip 强制解压解压后执行一次批量清理find infrared-dog -name ._* -delete find infrared-dog -name .DS_Store -delete完事再跑一遍 2.3 的类别统计脚本确认没有 txt 是 0 字节。这条排错顺序我踩过好几次每次都是先看标注内容而不是瞎调超参。6. 效果验证与场景迁移从狗类检测到电力红外与鸟类识别训练跑完先别急着部署拿val里的失败样本做一次复盘。Ultralytics 训练完后会在runs/detect/train/下生成验证图片把那些置信度低但标注里确实有狗的图像单独筛出来统计它们的框尺寸。我一般写一段脚本统计失败样本的框面积占比如果框中位数小于 0.05说明模型对小目标还没吃透优先加大输入尺寸而不是叠增强。验证通过之后这个数据集真正的价值是当迁移学习的起跳点。我最近在做一个电力红外数据集的项目检测目标是绝缘子发热缺陷本质上也是从热像图里找特定形态的异常区域。做法是直接用这份狗类数据集训出来的权重做finetune# 把 dog 类的模型权重迁移到电力红外单类检测 yolo train datafirc-thermal.yaml modelruns/detect/train/weights/best.pt epochs50 imgsz640 batch16队列里最后两行是 yaml 配置。model参数直接指向之前训练的best.ptUltralytics 会保留 backbone 权重只重新初始化输出头这样几十张电力红外图就能把模型拉过来比从 COCO 预训练开始省一半时间。鸟类目标检测也是一样的路子很多用户下载了红外狗类数据集其实是想借一套已经调顺的红外预处理流程再把类别 id 换成鸟。结合这套数据集以及“红外夜视检测鸟类算法”的需求你还可以做灰度视频抽帧、按温度阈值做前景分割再用 detect 模式跑一遍yolo predict modelruns/detect/train/weights/best.pt sourceinfrared_video.mp4 imgsz640 conf0.35 save_txtTrueconf0.35是我对红外场景的习惯值——比默认 0.25 严一点能砍掉一部分冷热源误报又不至于把低对比度目标全滤光。从那以后我每次拿到红外数据集都会检查拍摄环境和标注来源确认是车载热像还是固定枪机再决定预处理策略强制走一遍“目录审计 → 通道统一 → 类别统计 → 小目标复检”的流程省下的回炉时间都是实打实的。希望帮到你。本文还有配套的精品资源点击获取