红外多目标检测数据集:三种标注格式与YOLO训练实战
发布时间:2026/9/28 17:00:58来源:尧图网络
简介这是一份可直接用于YOLO系列模型训练的红外多目标检测数据集面向目标检测初学者与算法工程师解决真实红外场景下数据难获取、标注格式不统一的问题。资源共2000个文件其中1000个xml、990个txt及py、yaml、html等辅助文件分别对应VOC、COCO、YOLO三种标注格式并配有环境搭建、训练教程与数据集划分脚本压缩包约96.39MB。已有455人学习下载。借助该数据及附赠脚本读者可自行划分训练集、验证集与测试集参照Linux和Windows版YOLO环境搭建及训练案例从数据准备到模型训练全流程快速落地真实场景的高质量红外图片和多格式标签也能大幅节省人工标注与格式转换时间适合课程设计、毕业设计和竞赛实践使用。1. 红外多目标检测数据集1000 张真实场景图与三条标签链路夜间安防和电力巡检里有个普遍现象同一台相机可见光里目标已不可辨红外画面上却有清晰温度轮廓。很多人拿 YOLO 做红外多目标检测模型结构从 v5 换到 v8提升远不如换一批真实红外数据明显——瓶颈在数据。这套 YOLO 红外多目标检测数据集共 1000 张真实场景红外图用 labelimg 标注同时给出 VOC、COCO、YOLO 三种格式标签分别独立存放。配套还有 Linux 和 Windows 环境搭建教程、两套训练教程和三个划分脚本从环境到评估的链路都是齐的。适合卡在标注格式和环境配置上的初学者也适合跑过可见光 YOLO 想验证红外场景差异的从业者。2. 三种标签格式的底层逻辑VOC/COCO/YOLO 的结构、转换与选型2.1 VOC 的 xml 格式从 annotation 到 bndbox 的每个节点VOC 格式源自 PASCAL VOC 挑战赛以 xml 文件描述每一张图中的目标。一个典型文件的层级结构是最外层 annotation 节点下面是 folder、filename、sizewidth/height/depth 三个子节点以及 object 列表每个 object 节点包含 name类别名、pose、truncated、difficult以及 bndbox 里的 xmin、ymin、xmax、ymax 四个整数坐标。红外数据集的 xml 和可见光没有结构差异区别在图像内容同一分辨率下红外目标轮廓模糊标注员的框会偏大bbox 边缘可能多包一圈背景温度区域。如果你拿到的是这套数据集解压后的 voc 目录可以打开一个 xml 看内部结构重点检查 size 里的 width 和 height 是否和同名 jpg 一致——很多人对不上是因为标注后图片被压缩过但没有同步更新 xml 尺寸。annotation folderinfrared_images/folder filenameIR_0001.jpg/filename size width640/width height480/height depth3/depth /size object nameperson/name poseUnspecified/pose truncated0/truncated difficult0/difficult bndbox xmin120/xmin ymin80/ymin xmax300/xmax ymax310/ymax /bndbox /object /annotation这个 xml 的易读性很好labelimg 默认保存格式就是它。我在实际使用中一直保留 VOC 作为底稿因为改一个类别名、删除一个错框都很方便不需要在复杂 json 结构里翻来翻去。缺点是每个 xml 信息冗余而且坐标值依赖 size 节点单独看 xml 无法判断框是否越界必须结合原图尺寸。2.2 COCO 的 json 格式images、annotations、categories 三大数组的关系COCO 格式把整份标注集中到一个 json 文件里核心是三个数组images 数组记录每张图的 id、file_name、width、heightannotations 数组记录每个目标框的 id、image_id、category_id、bbox、area、segmentationcategories 数组记录类别 id 到类别名的映射。三个数组通过 id 互相引用只要有一处不匹配解析就会报错。相比 VOCCOCO 有两个容易踩的坑。第一个是 bbox 坐标定义为 x、y、w、h不是 x1、y1、x2、y2从 xml 的 bndbox 转换时宽度是 xmax 减 xmin高度是 ymax 减 ymin很多人习惯性把 xmax 当 w 用结果所有框的面积和位置全错。第二个是 annotations 里的 area 字段必须与 bbox 保持一致严格地说应该等于 w 乘 h如果面积和框不匹配部分框架在评估阶段计算 IoU 时会得到异常值。红外数据集场景下的建议是如果后续要用 Detectron2 或 MMDetection 跑实验json 是整个流程的入口转换完务必用 2.4 节里的统计脚本做一次结构校验确认 images 数量和 annotations 数量在合理范围内再进入训练。2.3 YOLO 的 txt 格式归一化坐标是怎么算出来的YOLO 的标签格式最简单但最容易出错。每一行代表一个目标格式是 class_id x_center y_center width height五个数字全部归一化到 0~1。归一化的公式是x_center 除以图片宽度y_center 除以图片高度width 除以图片宽度height 除以图片高度。注意宽高分别除以对应轴不能统一除以宽度再取平方。举个例子会清楚得多。640×480 的图片里有一个 personbndbox 是 120, 80, 300, 310那么 x_center 等于 (120 300) / 2 再除以 640得 0.328y_center 等于 (80 310) / 2 再除以 480得 0.406width 等于 (300 - 120) / 640得 0.281height 等于 (310 - 80) / 480得 0.479。对应 txt 一行就是0 0.328125 0.406250 0.281250 0.479167数字保留几位小数不影响训练精度但四舍五入误差会累积建议保留 6 位小数。类别 id 从 0 开始编号顺序和数据集 yaml 里 names 列表一一对应。很多人转 YOLO 格式翻车是在生成 txt 时没有固定类别映射表两次遍历输出顺序不同同一个文件在不同时间转出来类别 id 完全对不上训练出来的模型检测结果全是同一类。2.4 解析三种格式的统计脚本先摸清数据再动手不管用哪种格式训练建议先做一次全局统计图片总数、每张图目标数、每个类别出现次数、框宽高分布。这一步能提前暴露标注问题比如某个类别只出现十几次训练时模型基本学不到它的特征。我整理了一个解析脚本一次性读入三种格式并输出类别统计import os import json import xml.etree.ElementTree as ET from collections import Counter data_root 红外数据集 # 改成你的实际路径 voc_dir os.path.join(data_root, voc) coco_file os.path.join(data_root, coco, annotations.json) yolo_dir os.path.join(data_root, yolo) # 统计 VOC遍历所有 xml取 object/name voc_counts Counter() voc_boxes 0 for xml_name in os.listdir(voc_dir): if not xml_name.endswith(.xml): continue tree ET.parse(os.path.join(voc_dir, xml_name)) for obj in tree.getroot().iter(object): voc_counts[obj.find(name).text] 1 voc_boxes 1 print(f[VOC] xml {len(os.listdir(voc_dir))} 个框 {voc_boxes} 个) print(voc_counts) # 统计 COCO读取 json 的 images/annotations/categories with open(coco_file, r, encodingutf-8) as f: coco json.load(f) id2name {c[id]: c[name] for c in coco[categories]} coco_counts Counter(id2name[ann[category_id]] for ann in coco[annotations]) print(f[COCO] images {len(coco[images])}annotations {len(coco[annotations])}) print(coco_counts) # 统计 YOLO读 txt 第一列类别 id yolo_counts Counter() for txt_name in os.listdir(yolo_dir): if not txt_name.endswith(.txt): continue for line in open(os.path.join(yolo_dir, txt_name), r): parts line.strip().split() if len(parts) 5: yolo_counts[int(parts[0])] 1 print(f[YOLO] 类别 id 分布: {dict(yolo_counts)})逻辑说明脚本不做任何修改只读三个目录分别统计。VOC 用 ElementTree 解析 xmlCOCO 用 json.load 加载后按 category_id 反查名称YOLO 直接按空格 split 取第一列。三个统计结果应该能对上——同一个数据集在不同格式下每个类别的数量应当完全一致对不上就是格式转换出错了。参数说明data_root 是解压后的根目录需要改成实际路径。如果你的 COCO 文件名不叫 annotations.json把 coco_file 改成实际文件名。这段脚本同时充当格式校验工具对比三个 Counter 输出是最快的排查手段。统计完可以顺手做坐标合法性检查YOLO 格式任意一行数字都应该落在 0~1 之间出现大于 1 的值基本是归一化时分母除错VOC 和 COCO 的坐标如果超过图片宽高说明标注时拉伸过图片但没有更新尺寸节点。这两个问题都能用一段循环代码定位到具体文件。2.5 格式选型建议哪个当底稿、哪个拿去训练结合这套资源的实际使用习惯我的选型逻辑是labelimg 原生输出 VOC xml保留作底稿训练 YOLO 系列直接用 txt数据加载阶段不解析 xml速度快也省内存如果要用 MMDetection、Detectron2 这类框架用 json以后要新增标注回到 VOC 改再同步转出其他格式。三个文件夹互相独立互不影响新增一张图时三个目录都要补同名文件否则训练时会因为缺标签报错。3. 划分脚本实战训练集、验证集、测试集怎么分才不翻车3.1 三个脚本分别解决什么问题资源包里放了三个划分脚本对应需求完全不同。第一个脚本是完整三划分把图片和标签按比例一起复制进 train/val/test 三个新文件夹适合想把训练数据从原始目录完全隔离、测试集留到最后再碰的场景。第二个脚本是二划分只生成训练集和验证集适合数据量小、希望通过较早的验证曲线判断训练状态的情况。第三个脚本不复制文件只是生成写入图片路径的 txt 清单类似 VOC 数据集里 ImageSets/Main 下的 train.txt、val.txt 和 test.txt配合自写 DataLoader 用。我的建议是第一次跑通流程用完整三划分脚本一次性把三个目录备好后面改代码、调参都不影响原始文件。等对数据足够熟悉了再按需求改用 txt 清单方式。三个脚本的核心逻辑都围绕同一件事在保持图片和标签文件名同步的前提下把数据拆成互不重叠的集合。3.2 完整版划分脚本五步完成三划分完整版脚本的核心流程拆开来是五步读取图片文件名、按比例切分、创建目录、复制图片和标签、打印统计。但这里有一个关键区别VOC 和 YOLO 是逐文件标签直接复制同名文件COCO 是一个大 json不能按文件复制必须在划分完成后重新过滤生成三个 json。下面给出核心代码import os import random import shutil import json src_images 红外数据集/images dst_root 红外数据集/split voc_dir 红外数据集/voc yolo_dir 红外数据集/yolo coco_file 红外数据集/coco/annotations.json train_ratio, val_ratio 0.8, 0.1 # 测试集取剩余 0.1 random.seed(42) all_images [f for f in os.listdir(src_images) if f.lower().endswith((.jpg, .jpeg, .png))] all_images.sort() random.shuffle(all_images) n_train int(len(all_images) * train_ratio) n_val int(len(all_images) * val_ratio) parts { train: all_images[:n_train], val: all_images[n_train:n_train n_val], test: all_images[n_train n_val:], } # 先复制图片再复制 VOC/YOLO 逐文件标签 for split_name, img_list in parts.items(): img_out os.path.join(dst_root, split_name, images) lbl_out os.path.join(dst_root, split_name, labels) os.makedirs(img_out, exist_okTrue) os.makedirs(lbl_out, exist_okTrue) for img_name in img_list: shutil.copy(os.path.join(src_images, img_name), img_out) stem os.path.splitext(img_name)[0] # 分别从 voc 和 yolo 目录复制同名标签 for src_dir, suffix in ((voc_dir, .xml), (yolo_dir, .txt)): src_lbl os.path.join(src_dir, stem suffix) if os.path.exists(src_lbl): shutil.copy(src_lbl, lbl_out) # 再为每个集合重新生成 COCO json def make_split_coco(split_images, out_json): with open(coco_file, r, encodingutf-8) as f: coco json.load(f) name_set set(split_images) images [img for img in coco[images] if img[file_name] in name_set] img_ids {img[id] for img in images} annotations [ann for ann in coco[annotations] if ann[image_id] in img_ids] out { images: images, annotations: annotations, categories: coco[categories], } with open(out_json, w, encodingutf-8) as f: json.dump(out, f, ensure_asciiFalse) for split_name, img_list in parts.items(): make_split_coco(img_list, os.path.join(dst_root, split_name, coco.json))逻辑说明先 sort 再 shuffle 是关键避免不同机器上 os.listdir 返回顺序不一致导致划分漂移也避免原始数据按时间排列时随机性失效。random.seed(42) 固定随机种子同一份数据在任何机器上重复执行结果完全一致。复制 VOC 和 YOLO 标签时按各自后缀在对应目录找同名文件找到就复制找不到不中断——有的图片没有目标YOLO 标签是空 txt会被正常复制空标签文件在 YOLO 训练中是合法输入不能丢弃。参数说明train_ratio 和 val_ratio 相加小于等于 1测试集用总数减前两部分计算避免浮点误差导致图数对不上。常规取值 0.8/0.1 或 0.7/0.2数据集偏小时可放宽到 0.85/0.1但测试集至少保留 50 张否则 mAP 波动会很大。COCO 的 make_split_coco 函数接收该集合的图片文件名列表从原始 json 里过滤出对应的 images 和 annotationscategory 原样保留这是处理大 json 标签最稳的做法。提示划分脚本必须在原始数据目录上运行不能在已经划分过的目录上重复执行否则会把 train 里的图再次复制一次产生重复文件名。3.3 二划分与 txt 清单脚本的区别第二个脚本只是把三个集合改成两个train 和 val逻辑与完整版一样。实际使用中二划分更适合小数据集——1000 张图拿 100 张做测试有点浪费二划分可以把更多样本放进训练集和验证集通过早停观察收敛最后单独用一个小测试集做最终验证也可以。第三个脚本生成 txt 清单的逻辑是另一种思路不复制文件只把图片路径写入 txt每行一条。一个典型的生成结果是这样/home/user/infrared/split/train/images/IR_0001.jpg /home/user/infrared/split/train/images/IR_0002.jpg这类清单文件配合自定义 DataLoader 时很常用VOC 风格的数据集也习惯用这种 txt 管理训练样本。注意两个细节路径用绝对路径还是相对路径取决于训练代码里怎么拼接用绝对路径最省事txt 里存不存扩展名YOLOv5 的 dataset.py 可以接受不带扩展名的路径并自动补后缀其他框架不一定支持先打开文件看两行再进训练最稳妥。3.4 划分比例、随机种子与分层划分固定随机种子这件事很容易被忽略但影响很大。训练实验需要可复现如果每次划分结果都不同你无法判断模型指标变化是来自参数调整还是数据变动。random.seed(42) 只是起点shuffle 前先 sort 也是保证跨平台一致的关键。类别不均衡是红外数据里常见的坑。比如 person 出现 600 次vehicle 出现 300 次animal 只出现 50 次。纯随机划分下animal 在测试集里可能只剩几张评估结果很不稳定。分层划分的做法是先按图片里包含的类别对图片分组再在每个组内分别按比例切分最后合并成三个集合。这样能保证每个类别在训练、验证、测试里都有样本。实现上可以用一个 dict 把类别映射到图片列表然后逐组 shuffle 切分代码量不大但效果明显。4. 从环境搭建到模型训练Linux 与 Windows 两套完整流程4.1 Linux 路线Ubuntu 安装、显卡驱动、CUDA 与 PyTorchLinux 的教程从 Ubuntu 系统安装讲起一直走到 PyTorch 装完。如果你用云服务器系统这部分可以跳过本地有 NVIDIA 显卡的话驱动和 CUDA 是避不开的。先说检查方法装完驱动执行 nvidia-smi看右上角 CUDA Version。这个数字表示驱动支持的 CUDA 最高版本实际运行环境是 conda 里装的 PyTorch 对应版本两者不是一回事很多人混淆后装错版本白折腾半天。sudo apt update sudo apt install -y python3-pip git # 如果还没装 Miniconda先下载安装再执行下面命令 conda create -n yolo python3.8 -y conda activate yolo # 安装 PyTorch版本号要和显卡驱动支持范围匹配 pip install torch1.13.1 torchvision0.14.1 --index-url https://download.pytorch.org/whl/cu117 git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt这条脚本的核心是 pytorch 安装参数--index-url 指定了 CUDA 11.7 的预编译 wheel 源避免默认源装成 CPU 版。CPU 版不是不能用训练速度差十倍以上一张 1000 图的数据集可能要多跑十几个小时。torch 和 torchvision 的版本号是配套的单独升级任何一边都会报错。conda 环境隔离在此是硬性要求服务器上同时跑多个项目很常见项目间 torch 版本冲突会非常混乱。装完先做一次自检python -c import torch; print(torch.cuda.is_available())。输出 True 说明 GPU 可用False 就回到 nvidia-smi 查驱动再查 conda 环境里 torch 的版本逐级排查。4.2 Windows 路线conda 搭配预编译 wheelWindows 版教程走的是同样的思路只是命令略有差异。打开 Anaconda Prompt执行相同的 conda create 和 pip install 命令即可。Windows 上最常出现的坑是某些依赖包需要本地编译例如 pycocotools 在 Windows 下直接 pip install 容易报错需要先装 Microsoft C Build Tools或者下载预编译的 wheel 文件再安装。另一个 Windows 特有的问题是路径分隔符。yaml 配置里写路径时建议统一用正斜杠/Windows 虽然接受反斜杠但 YAML 解析器对转义字符的处理不一致写成 D:/data/infrared 比 D:\data\infrared 省掉很多报错。4.3 数据集配置 yaml每个字段的含义和常见错误准备训练前要新建一个记录数据路径和类别名的 yaml 文件。YOLOv5 风格的 yaml 如下path: D:/data/infrared # 数据集根目录 train: images/train # 训练集图片目录相对 path val: images/val # 验证集图片目录相对 path test: images/test # 测试集图片目录相对 path nc: 4 # 类别总数 names: [person, vehicle, animal, heat_source]这里的核心约束有两个nc 必须等于 names 列表长度names 的索引顺序必须和标签 txt 第一列的类别 id 严格对应。如果 yaml 里把动物放在第 0 位而标签里 person 是 0模型会把所有 person 框学成 animal而且不会报错——这是最隐蔽的错误。建议把 names 顺序和 VOC xml 中类别名称的字母序或首次出现顺序统一起来并写进文档里避免后续改动。path 字段用绝对路径还是相对路径取决于训练命令的工作目录。我习惯写绝对路径这样不管在哪个目录执行 train.py 都不受影响。4.4 启动训练main 参数、预训练权重与训练日志配置好 yaml 后启动训练完整命令如下python train.py \ --data D:/data/infrared.yaml \ --weights yolov5s.pt \ --epochs 100 \ --batch-size 16 \ --img-size 640 \ --patience 20 \ --cache参数含义--weights 使用官方 yolov5s.pt 预训练权重首次运行时自动下载也可以手动下载后放到同目录--epochs 100 对一千张红外图足够配合 --patience 20 早停更省时间--batch-size 需根据显存调整16G 显存跑 16 稳定V100 32G 可以开到 32--img-size 640 是 YOLOv5 默认训练分辨率红外图片一般就是 640×480 或 1280×1024前者直接用后者建议先缩到 640 训练再上原分辨率微调--cache 把图片缓存到内存第一次训练速度提升明显前提是内存大于数据集大小。训练日志每轮输出一次重点看 train/box_loss、val/box_loss 和 mAP_0.5。训练结束 runs/train/exp 目录下有 best.pt 和 last.pt。评估和部署一律用 best.ptlast.pt 只在断点续训时用。如果有多个实验runs/train 下会自动生成 exp2、exp3 目录通过 --name 参数可以给每个实验起名这个习惯在对比网络结构时特别有用。5. 常见问题排查格式错位、类别缺失与训练崩溃的五类典型坑5.1 训练时报 File not found 或 cache corrupted现象训练启动阶段报找不到某个图片或标签文件使用 --cache 时缓存校验和失败数据加载中断。原因多数是划分脚本漏掉了空标签文件。红外场景里有些图里确实没有目标标注后 YOLO 标签是 0 字节的 txt这类文件在压缩传输或目录复制时经常被跳过。YOLO 训练时每张图都必须有同名标签文件即使是空的否则报错。解决划分完先对比图片数和标签文件数不一致就补齐空文件。补全脚本很简单遍历图片目录对缺失的同名 txt 写入空文件即可。从那以后我每切完一次数据都会先跑这个检查再进训练。5.2 模型把所有目标都识别成同一个类现象训练 loss 正常下降mAP 也不低推理时所有框的类别全都一样。原因类别 ID 在格式转换时发生了偏移。VOC 的类别是字符串转成 YOLO 时如果按字典遍历顺序生成数字 id两次转换顺序不同就会错位。比如第一次遍历得到 person0vehicle1第二次新增了一个类别后顺序变成 vehicle0person1旧标签全部失效。解决固定一个类别映射表写进 yaml所有格式转换脚本共用这张表并在转换时打印映射关系人工核对一遍。每次新增类别时只改映射表不要重新排序。5.3 训练早期 loss 变 NaN 或 BatchNorm 崩溃现象第一个 epoch 尚未结束loss 变成 NaN训练日志里出现 infBatchNorm 层参数异常权重文件无法继续使用。原因最常见的是标签坐标越界。YOLO txt 中归一化坐标出现大于 1 的数值或者某一个坐标是负数都会让损失函数里出现无效值。其次是 batch-size 过小导致 BN 统计不稳定配合默认学习率容易在早期发散。解决先扫描标签目录里所有 txt 的坐标范围找出越界行对应原图回 VOC xml 修正后重新转格式。同时把学习率从默认 0.01 降到 0.002 或 0.005batch-size 小于 8 时优先加大 batch 而不是降 lr。5.4 COCO json 校验失败image_id 找不到对应图片现象用 MMDetection 或 Detectron2 读 json 报 KeyError提示某个 annotation 的 image_id 没有对应 image 条目。原因从 VOC 转 COCO 时跳过了一些没有标注对象的图片。这些图片没有进入 images 数组但转换脚本在生成 annotation 时可能引用了这些 id或者漏掉了某些图片的 annotationjson 结构就不合法了。解决转换脚本先生成完整的 image id 到文件名映射再生成 annotations保证引用一定存在。校验时分别统计 images 和 annotations 数量并把两者的 id 集合做差差值应该为空。5.5 验证集与测试集泄漏导致精度虚高现象验证集和测试集 mAP 都很高换全新图片测试时精度明显下降。原因划分前没有全局 shuffle。原始数据如果按拍摄时间或地点排列前 10% 和后 10% 图片可能来自同一时间段验证集和测试集在内容上高度重叠评估结果虚高。红外图像尤其严重——同一台热像仪同一时段拍的画面温度分布非常相似模型其实只在记忆场景没有学到目标特征。解决划分脚本先 sort 再 shuffle 并固定随机种子见 3.2 节。另一个方案是按采集批次划分比如按日期把不同批次的图片分到不同集合这样验证集和测试集来自完全不同的采集时段指标更有参考价值。6. 把模型部署到真实红外场景从精度曲线到实拍检查6.1 训练曲线里哪些信号值得信训练结束后打开 runs/train/exp 下的 results.png重点看 val/obj_loss 和 mAP_0.5 曲线。验证 loss 连续上升、训练 loss 继续下降是过拟合信号此时 best.pt 已经保留最佳权重继续训练只会更差。如果验证 mAP 波动明显大于 0.05先查标签错位问题再查数据量是否不足。红外小目标对数据增强的敏感度比可见光更高可以把 hyp.scratch.yaml 里的 hsv_h、hsv_s、degrees 适当调大配合 mosaic 一起用往往比调学习率更有效。6.2 批量推理验证把预测结果逐类统计训练完不要只看一两张图就下结论用验证集跑一次完整批推理把预测结果按类别统计能和标注分布对齐才是可信的模型。批量推理命令python detect.py \ --weights runs/train/exp/weights/best.pt \ --source D:/data/infrared/images/test \ --save-txt --save-conf--save-txt 会把每个预测写到 labels 目录下的同名 txt 文件--save-conf 同时保存置信度。推理完成后写一个十几行的小脚本把 txt 汇总成类别分布表和 2.4 节统计的标注分布对比import os from collections import Counter label_dir runs/detect/exp/labels # detect.py --save-txt 的输出目录 total Counter() for txt_name in os.listdir(label_dir): with open(os.path.join(label_dir, txt_name), r, encodingutf-8) as f: for line in f: class_id int(line.strip().split()[0]) total[class_id] 1 print(f预测类别分布: {dict(total)})这段代码读取 detect.py 输出的 txt 结果按类别统计预测目标数量。如果某个类别在标注分布里出现 50 个框预测只检出 2 个说明漏检严重需要回溯检查该类别样本数量和标注质量。6.3 实拍检查清单真实场景部署前按这个清单逐项检查单张静态图识别是否稳定目标从远到近走进时框是否抖动两个目标靠近时 NMS 是否正确合并或保留两个框画面中存在强热源干扰比如太阳直射、设备发热时有没有误报清晨、中午、傍晚三个时段各测一遍。红外图片在不同时段的目标轮廓差异很大训练集如果没有覆盖这些时段模型在没见过的时段可能直接失效这是红外任务和可见光任务最大的差别。从那以后我拿到任何检测数据集的第一件事永远是先跑统计脚本看类别分布和坐标范围再谈训练。这个习惯帮我避开了至少三次“训练指标很好、部署完全不能用”的尴尬。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网