带标注红外热成像建筑缺陷数据集:700张图训练yolov12识别率91.5%
简介:面向建筑检测与计算机视觉研究者的红外热成像建筑缺陷识别数据集,适配YOLOv12目标检测框架,模型识别率约91.5%,适合有深度学习基础的研究者用于建筑表面缺陷检测模型训练与算法验证。资源共1401个文件,包含700张JPG红外图像、700份对应的TXT标注文件及1个YAML模型配置,压缩包仅34.53MB,其中TXT文件记录YOLO格式的边界框位置与类别编号,YAML文件则定义数据集类别及路径,数据结构简洁,便于直接接入YOLO系列训练流程。目前已有53人学习下载,适用于小样本迁移学习、缺陷检测竞赛或工程落地前的快速原型测试。借助这批带标注的样本,研究者可省去人工标注环节,直接开展数据增强、模型调参与精度对比,也可作为建筑巡检智能化项目的起步数据集,用于快速构建和迭代缺陷识别模型。
1. 带标注的红外热成像建筑缺陷识别数据集:700张图凭什么做到91.5%
上个月帮朋友处理一批外墙检测的热像图,他拿着一台手持热像仪扫了一栋商业楼,回来对着几千张照片发愁——空鼓、渗漏、保温层缺失在图上明明有温差特征,但靠人眼一张张看,一下午只过了两百张。这时候最缺的不是算法,而是一份能直接喂给yolov12的带标注红外热成像建筑缺陷识别数据集。标题里这个数据集700张图、91.5%识别率,正好戳中这类场景的痛点:热成像图不像可见光图那样色彩丰富、特征直观,缺陷区域和正常墙体温差可能只有2到3度,标注和训练都比普通目标检测麻烦。
这篇笔记围绕这个数据集把整条链路拆开讲:热成像缺陷图的数据特性、标注格式怎么选、yolov12环境怎么配、训练参数怎么调、以及小数据集最容易翻车的几个坑。适合正在做建筑缺陷检测的算法工程师,也适合工地试验室里想自己攒一份数据集的检测方案负责人。先说结论再讲细节:700张图要做目标检测,数据增强和训练策略比模型选型更决定成败,91.5%大概率是mAP@0.5口径,后面会解释这个数字怎么验证。
2. 红外热成像建筑缺陷识别的数据底层:热图特性与标注格式选型
2.1 热成像图为什么让检测模型集体翻车
红外热像仪输出的原始数据是一个温度矩阵,每个像素对应一个温度值,保存成图片时通常有两种形态:灰度图和伪彩图。灰度图按温度高低映射成黑白,伪彩图则用铁红、彩虹等调色板把温度映射成彩色。问题就出在这——训练目标检测模型时,如果直接拿伪彩图当三通道RGB输入,模型学到的边缘和纹理很可能来自调色板的颜色跳变,而不是真实的温度梯度。
我见过最典型的翻车案例:同样的渗漏缺陷,用A厂热像仪自带的铁红色调色板训练,mAP很高;换成B厂默认的彩虹调色板,识别率直接腰斩。原因就是模型抓住了伪彩映射里的假纹理。解决思路有两个:要么训练前统一做灰度转换,只保留温度梯度信息;要么干脆用原始温度矩阵做输入,但yolov12的输入层要改动,工程成本高。实际做项目我一般直接转灰度,省事且稳定。
另一个特征是热成像图的对比度极低。建筑缺陷里的空鼓区域,在白天日晒后表面温度可能只比周边高1到3度;渗漏区域则表现为低温,温差同样很小。反映到图像上就是目标区域和背景的灰度值非常接近,肉眼能分辨,但模型很容易当成噪声。这决定了标注时要把缺陷框得尽可能紧,同时训练时需要针对性调低置信度阈值。
还有一点:热像图的边缘是模糊的。红外传感器的空间分辨率通常远低于可见光相机,640×480的热像仪已经算中高端,缺陷在图上往往只有几十个像素。这个特性直接影响后面anchor和imgsz的选择,小目标问题在热成像检测里不是特例,而是常态。
2.2 标注格式选型:为什么直接用YOLO的txt
带标注的数据集,核心就是图片和标签文件的对应关系。目标检测领域常见三种格式:VOC的XML、COCO的JSON、YOLO的TXT。yolov12系列沿用了Ultralytics风格的YOLO格式,一张图对应一个同名txt文件,每行五个字段:
class_id x_center y_center width height
前四个值全部做归一化,除以图片宽高,取值在0到1之间。这种格式最大的好处是跟分辨率解耦,训练时无论imgsz设640还是800都不用改标签。相比VOC的XML要解析嵌套节点,YOLO格式用numpy直接读就行,预处理速度快很多。
标注类别怎么定是这步的关键。建筑缺陷常见的有外墙空鼓、渗漏、保温层缺失、管道泄漏、裂缝,但热成像能稳定分辨的主要是前两类:空鼓在白天表现为高温异常区,渗漏表现为低温异常区。如果数据集只有700张图,类别数控制在2到4类比较合理,类别越多每类的平均样本越少,模型越容易过拟合。
标注规范里有一条硬性规定:矩形框必须紧贴缺陷的实际边缘,不能像画可见光目标那样留白边。因为热像图缺陷边缘本来就模糊,留白会把大量正常墙体温差带进特征里,训练出来的框会偏大,评测时IoU一卡,mAP就下来了。LabelImg和X-AnyLabeling都支持YOLO格式导出,我习惯用X-AnyLabeling,它带一个自动标注辅助功能,对热像图这种低纹理图先跑个初版再人工修正,效率高很多。
2.3 700张图的数据增强:别把温度信息增强没了
700张训练图在目标检测里属于少样本,但热成像缺陷场景有其特殊性:同一栋楼的外墙纹理高度相似,不同楼的缺陷形态又差异很大。数据增强不能只追求数量,还要保住温度对比这个核心特征。
Mosaic增强是YOLO系列训练里默认开启的,把四张图拼成一张,对小目标检测提升明显。但对热成像图有个副作用:四张来自不同天气、不同时间的热图拼接后,各自的温度范围被拉伸到同一尺度,模型会误以为温差模式是全局一致的。我的做法是Mosaic保留但把概率从默认的1.0降到0.5,同时关闭MixUp——混合两张热图的像素对温度梯度干扰太大。
HSV增强对灰度热图没有意义,直接关掉。真正有用的是随机旋转、平移、翻转和Cutout。其中Cutout随机遮挡部分区域能逼模型学缺陷本身的温度特征,而不是依赖完整墙面的上下文,对渗漏这类小目标效果尤其明显。还有一个容易被忽略的增强:温度偏移模拟。训练时随机给整图的灰度值加一个±10的偏移,相当于模拟不同天气条件下的绝对温差变化,这能让模型学会相对温差识别,而不是记忆某个固定温度阈值。这个增强我在几个项目里都验证过,能显著提升跨天气泛化能力。
3. 用yolov12在本地跑通红外缺陷训练:环境配置与最小命令
3.1 yolov12环境怎么配:Python、PyTorch与CUDA版本
yolov12是独立于Ultralytics仓库的PyTorch实现,架构上用了attention-centric设计,不是yolov8的小版本升级。这意味着 pip install ultralytics 之后并不能直接跑yolov12,需要单独拉代码仓和依赖。
环境配置我建议按这个顺序来,每一步都验证一下再往下走:
conda create -n yolov12 python=3.10 -y
conda activate yolov12
# 先装PyTorch,再装其他依赖,避免依赖解析冲突
pip install torch==2.1.0 torchvision==0.16.0 --index-url https://download.pytorch.org/whl/cu121
git clone https://github.com/你的镜像或官方仓库/yolov12.git
cd yolov12
pip install -r requirements.txt
PyTorch版本和CUDA要对应。我一般用CUDA 12.1配PyTorch 2.1.0,稳定性好;如果显卡驱动只支持CUDA 11.8,就把 cu121 换成 cu118 。装完先跑一句 python -c "import torch; print(torch.cuda.is_available())" ,输出True再继续,这一步能过滤掉一半的环境问题。
requirements.txt里包含opencv、tqdm、pandas这类基础库,还有einops和timm,是yolov12的attention模块依赖。经常有人只装完PyTorch就开训,跑到一半报 ModuleNotFoundError: einops ,再回头装就浪费时间了。
3.2 数据集目录结构与yaml配置
数据集拿到手后,先按YOLO标准目录结构放好。图片放到images,标签放到labels,train和val分开。这是最关键的一步,目录不对后面全白搭:
datasets/
build_defect/
images/
train/
img_001.jpg
img_002.jpg
...
val/
img_101.jpg
...
labels/
train/
img_001.txt
img_002.txt
...
val/
img_101.txt
...
700张图做训练集和验证集划分,常见做法是85%训练、15%验证,也就是595张训练、105张验证。不要单独划测试集,小数据集划测试集会进一步压缩训练样本,验证集已经足够评估模型好坏。划分时注意按楼栋分,别让同一栋楼的图同时出现在训练集和验证集里,否则模型记住的是这栋楼的纹理特征而不是缺陷特征,验证mAP会虚高。
数据集配置文件是一个yaml,放在项目根目录下:
# build_defect.yaml
path: datasets/build_defect
train: images/train
val: images/val
nc: 3
names:
0: delamination # 空鼓
1: moisture # 渗漏
2: insulation # 保温层缺失
nc 必须和names里的类别数一致,这是yolov12读取数据集时的硬校验。路径用相对path的写法,训练命令里指定data参数时只需给到yaml文件路径,图片路径会自动拼接。
3.3 训练命令与关键参数说明
环境配好、数据就位之后,训练命令本身很简洁:
python train.py \
--data build_defect.yaml \
--weights yolov12s.pt \
--batch-size 16 \
--imgsz 640 \
--epochs 200 \
--device 0
weights 参数指向预训练权重。yolov12提供n、s、m、l、x几个规格,700张图的小数据集用s就够,n太小容量不足,m以上在小数据上容易过拟合且训练慢。 imgsz 设640是安全和速度的平衡点,后面会说怎么往800调。
epochs 设200,配合早停机制。yolov12的训练脚本默认开启早停,patience默认是10个epoch——如果验证集mAP连续10轮不涨就自动停止。实际训练里很多项目一百多轮就收敛了,不用跑满200。 batch-size 按显存来,16G显存跑s模型、640输入,16的batch基本是上限;如果显存不够,把batch降到8,同时学习率也要按比例降。
训练过程中的日志要看两个数: val/box_loss 和 metrics/mAP_0.5 。box_loss持续下降说明框回归在收敛;mAP_0.5逼近0.9以上说明模型对缺陷的定位已经比较准。还有一个值得关注的是 val/cls_loss ,如果它降不下去,说明类别区分度不够,通常是渗漏和空鼓在热像图上形态太像,后面在避坑章节具体说怎么处理。
4. 把识别率做到91.5%:mAP口径、三个必调参数与验证方法
4.1 91.5%到底是什么指标,怎么确认
标题里的91.5%识别率,在目标检测场景里需要先确认口径。常见的有两种:mAP@0.5(IoU阈值为0.5时的平均精度)和mAP@0.5:0.95(IoU从0.5到0.95取平均)。这两个数字差距很大,同一模型在mAP@0.5:0.95下可能只有60%左右。做缺陷检测,业内评估一般以mAP@0.5为准,因为缺陷框本身就不要求像素级精准,框能覆盖缺陷区域就算检测成功。
训练结束后脚本会输出最后一轮的验证结果,里面包含 mAP@0.5 、 mAP@0.5:0.95 、 precision 和 recall 四个核心指标。91.5%这个数如果是mAP@0.5,在单类缺陷检测里属于正常偏上的水平;如果模型类别多,每类样本不均衡,mAP会被样本少的类别拉低,这个数字就要打问号。
验证时还有一件事要做:跑一遍混淆矩阵。yolov12训练完会自动生成 confusion_matrix.png ,看类别之间互相混淆的情况。红外缺陷检测最常见的错误是把渗漏检成空鼓,因为两者在灰度图上都是与周边有明显温差斑块,区别只在温度高低。如果混淆矩阵里这两个类别互检率超过15%,优先检查标注质量,其次考虑合并类别。
4.2 三个必调参数:imgsz、close_mosaic与置信度阈值
训练好一轮之后,提升识别率主要靠调三个参数,按对结果的影响排序。
第一个是imgsz。从640调到800,对热成像小目标检测的提升立竿见影。原因很简单:缺陷在640分辨率下可能只有20×20像素,特征太少;提到800后变成25×25,模型的卷积核能捕获更多温度梯度细节。代价是显存占用翻了约1.5倍,batch-size可能要跟着减半。调完imgsz,标签不用改,YOLO格式的归一化特性在这里体现出来。
第二个是close_mosaic。yolov12训练默认前70%的epoch开启Mosaic增强,最后30%的epoch关闭。Mosaic生成的四拼图里有大量拼接边界,如果一直开着,模型学到的特征会被拼接痕迹干扰。默认参数已经处理好了这个节奏,但如果你改过Mosaic概率或自己写训练脚本,一定要确保最后阶段关闭,否则验证mAP会一直上不去。
第三个是推理时的置信度阈值。训练完成后检测框默认过0.25的confidence阈值,但热成像缺陷对比度低,模型输出分数普遍偏低,大量正确检测被阈值滤掉了。推理时降到0.15,recall会明显回升,同时用NMS的IoU阈值控制重复框。我做建筑缺陷检测时习惯把置信度阈值调到0.12到0.15之间,mAP不降,召回率能涨五六个点。
4.3 推理可视化与温度场叠加验证
训练和调参做完,别急着看mAP数字,先把验证集的检测结果可视化,用yolov12自带的推理脚本直接跑:
python detect.py \
--weights runs/train/exp/weights/best.pt \
--source datasets/build_defect/images/val/ \
--conf-thres 0.15 \
--save-txt \
--save-conf
--save-txt 会把检测结果存成txt文件,格式和标注格式一致; --save-conf 把置信度写进txt。这一步建议保留,后续做伪标签迭代时直接拿这个输出当候选标注。
可视化的作用不是看框画得漂不漂亮,而是结合热像图原始数据做温度场验证。框出的空鼓区域,在图上对应位置的像素值应该明显高于周边;渗漏区域则相反。如果某个检测框在灰度图上看起来和周围没区别,说明模型学到的是位置纹理特征而不是温度特征,这种检测在换一栋楼之后就失效了,需要回查是不是训练集里该类别样本太少,或者伪彩图没转灰度。
5. 红外小数据集训练避坑:5条血泪经验
5.1 伪彩图当RGB输入,换台热像仪就失灵
现象:训练loss正常下降,验证mAP也有90%左右,但把模型部署到现场,换一台不同品牌的热像仪,识别率暴跌到50%以下。
原因:数据集里的图大概率是伪彩图转存的JPEG,模型学到的颜色特征是调色板的映射规律,而不是温度梯度的形状特征。不同品牌热像仪的伪彩映射完全不同,模型自然失效。
解决:训练前统一把伪彩图转成单通道灰度,再做三通道复制喂给网络。转灰度用 cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 就行,处理完肉眼看起来信息少了,但模型学到的特征更本质,跨设备泛化能力是伪彩输入的十倍差距。
5.2 小缺陷框归一化后数值太小,被模型当背景丢弃
现象:recall偏低,尤其渗漏类的小面积缺陷漏检严重,训练日志里 metrics/recall 一直在0.7上下上不去。看可视化的漏检图,缺陷区域明明有温差,模型就是没输出框。
原因:热像图分辨率低,一个渗漏斑块可能只有15×10像素,归一化后宽高只有0.023和0.015。yolov12的anchor设计偏向常规目标尺寸,这么小的框在特征金字塔顶层对应感受野过大,特征被背景淹没。
解决:两个方案配合。一是imgsz提到800甚至960,直接放大目标在输入图的尺寸;二是对包含小目标的训练图做滑窗裁剪,把原图切成四块分别训练,相当于把目标放大四倍。我在项目里两个都做了,mAP@0.5从78%涨到89%左右。
5.3 夏天训练的模型,冬天测同一栋楼识别率崩了
现象:夏季日晒强,空鼓区域吸热快、表面温度高,模型学得很好。到了冬季环境温度低,空鼓不再表现为显著高温区,识别率大幅下降。
原因:热成像缺陷检测的本质是检测相对温差模式,但训练数据里所有图的绝对温度都在同一个季节范围内,模型隐式学了一个温度基线值,而不是温度差。
解决:训练时做灰度偏移增强,把整图灰度值随机加减,模拟不同环境温度下的绝对温度变化。代码逻辑很简单,读图后对全图加一个随机整数偏移,再做归一化。这个增强相当于人为制造跨季节样本,是我做过所有增强里性价比最高的一项。
5.4 700张图过拟合,验证loss反升
现象:训练到第80轮,train loss还在降,val loss开始掉头向上,mAP震荡不涨。典型的过拟合曲线。
原因:700张训练图对yolov12s来说偏少,模型容量大,训练后期开始记忆训练图的纹理细节,对没有见过的验证图失去泛化能力。
解决:第一,早停机制打开,patience设10,val loss连续不降就自动保存best.pt;第二,backbone冻结训练前20轮,让模型先只学检测头,再解冻全网络;第三,权重衰减从默认的0.0005加到0.001,给模型更强的正则约束。我按照这个组合来,稳定解决了小数据过拟合问题。
5.5 多人标注同一批图,同一缺陷框法不一致
现象:某类别mAP在训练到一半时突然停滞,混淆矩阵显示该类别的召回率远低于其他类别。查标注文件发现,同一个渗漏区域,有人框了完整水渍范围,有人只框了中心最暗区域,还有人把外圈过渡区也框了进去。
原因:标注规范定得不够死,标注工具没有统一的模板和预览提示。热成像缺陷边缘模糊,不同人对"缺陷边界"的理解天然不一致。
解决:标注规范里写明「矩形框必须覆盖温度异常区域的80%以上,包含过渡区,不包含正常墙面」,并让两个人独立标注同一批图,用IoU算一致性,小于0.7的重新讨论校正。这一步虽然花时间,但后面训练和评测省下的时间远超投入。
6. 用你自己的红外图扩充数据集:一份可执行的标注-训练循环
这个数据集能用,但你手上大概率有自己的项目数据——工地的热像图、无人机巡检的航拍热图、管道检测的管线热图。把这些数据并进现有模型继续训练,比重新攒一个数据集要靠谱得多。我的做法是一个三步循环,每轮大约半天时间。
第一步,用现有模型对你的新图做推理,输出伪标签。跑一遍前面写过的 detect.py 命令, save-txt 打开,得到每张图的候选框和置信度。置信度大于0.3的直接并入训练集,0.15到0.3之间的导入X-AnyLabeling人工确认,小于0.15的删掉不看。
第二步,自动标注结果过一遍人工校验,修正框位和类别标签,然后并进训练集。这里要守一个规矩:新标注的图只弥补类别或场景缺口,不盲目增加已有类别的重复样本。如果你手上大量图片都是白天外墙空鼓,而这部分已经训练充分,直接跳过,有限的时间留给渗漏和保温层缺失这些稀缺类别。
第三步,重新训练并对比新旧模型的验证集mAP。特别注意之前漏检的场景有没有改善。如果加了200张新图后mAP反而掉了,大概率是新增样本里标注噪声太大,回第二步做抽检,把IoU一致性差的样本剔除掉再试。
最后说一个我自己的教训:做热成像缺陷检测数据标注时,我一度迷信标注数量,攒了三千张伪彩图往里灌,结果模型在真实设备上识别率远不如后来只保留700张高质量灰度图的效果。从那之后我定了一个原则:热像图数据集宁缺毋滥,标注质量比数量重要,温度特征比颜色特征可靠。这个数据集的方向是对的,照着这个循环走,你的模型也能跑到甚至超过91.5%。希望帮到你。
更多推荐


所有评论(0)