简介:红外狗类目标检测数据集是一份面向红外热成像场景的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。坐标归一化到 0~1,方便换输入分辨率。
提示:如果 txt 里出现坐标大于 1 或者负数的行,说明原始标注是从别的工具导出后没处理好,训练前必须先清洗。
2.3 类别统计:一个容易忽略的检查项
不要看到 zip 就急着训练。我习惯先把所有 txt 读一遍,统计类别分布和框数量,防止数据倾斜。红外场景下狗在画面里往往很小,框的宽高可能集中在 0.05~0.15 这个区间,标注框数量如果太少,模型学不到小目标特征。用一段脚本做快速体检:
import glob cls_count = {} box_sizes = [] for label_file in glob.glob("infrared-dog/**/labels/*.txt", recursive=True): 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 能吃的 txt
3.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,每个像素的灰度值和实际温度不是线性对应。做训练前最好把图转成真正的单通道灰度,并把像素范围想办法拉伸到 0~255。我常用的处理是 OpenCV 读入后做直方图均衡再保存:
import cv2 import glob for img_path in glob.glob("infrared-dog/**/images/*.jpg", recursive=True): img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) clahe = cv2.createCLAHE(clipLimit=2.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 data=infrared.yaml model=yolov8s.pt epochs=200 imgsz=640 batch=16 device=0 patience=30 save_period=20参数含义拆开:imgsz=640是输入分辨率,红外原图如果是 640x512,这直接对齐;batch=16看显存,8GB 卡只能压到 8;patience=30是 30 个 epoch 没改善就停,防止过拟合无聊等跑完;save_period=20每 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 data=firc-thermal.yaml model=runs/detect/train/weights/best.pt epochs=50 imgsz=640 batch=16队列里最后两行是 yaml 配置。model参数直接指向之前训练的best.pt,Ultralytics 会保留 backbone 权重,只重新初始化输出头,这样几十张电力红外图就能把模型拉过来,比从 COCO 预训练开始省一半时间。鸟类目标检测也是一样的路子,很多用户下载了红外狗类数据集,其实是想借一套已经调顺的红外预处理流程,再把类别 id 换成鸟。
结合这套数据集以及“红外夜视检测鸟类算法”的需求,你还可以做灰度视频抽帧、按温度阈值做前景分割,再用 detect 模式跑一遍:
yolo predict model=runs/detect/train/weights/best.pt source=infrared_video.mp4 imgsz=640 conf=0.35 save_txt=Trueconf=0.35是我对红外场景的习惯值——比默认 0.25 严一点,能砍掉一部分冷热源误报,又不至于把低对比度目标全滤光。从那以后,我每次拿到红外数据集,都会检查拍摄环境和标注来源,确认是车载热像还是固定枪机再决定预处理策略,强制走一遍“目录审计 → 通道统一 → 类别统计 → 小目标复检”的流程,省下的回炉时间都是实打实的。希望帮到你。
本文还有配套的精品资源,点击获取