简介这份资源面向计算机视觉方向的研究人员与算法开发者提供了一套专门针对战车目标的卫星图像目标检测数据集可用于训练、验证与评估YOLO、Faster R-CNN等主流检测框架在远距离、复杂光照与遮挡场景下的识别性能适用于军事侦察、安全监控及自动驾驶等应用研究。压缩包为zip格式整体约343.63MB内含1000张1024×1024像素彩色卫星图像并配套标注文件、数据说明文档与批量重命名脚本标注信息可用于边界框定位训练脚本与说明则便于数据整理与理解来源、标注方式及版权信息。目前已有2902人学习下载适合需要真实卫星视角战车样本、希望快速搭建检测实验并对比算法表现的中高级开发者参考使用。1. 战车卫星图数据集从一张遥感切片到可训练标注的完整链路遥感图像目标检测和常规 COCO 那套玩法差别很大。同样一张 1024×1024 的切片地面拍车能占几百像素卫星图里一辆战车可能只有 12×18 像素还叠着云影、地物纹理和拍摄角度变化。标题里的「战车卫星图2」本质是一批面向遥感场景、以军用车辆为主要目标的检测数据集它要解决的核心问题不是「有没有车」而是「在极小目标、复杂背景、方向任意」三个条件下还能不能稳定框出来。适合谁用做遥感目标检测的算法同学、需要快速验证 YOLO 系列在卫星图上的落地效果、以及想拿真实小目标数据练手的人。这一章先把数据长什么样、标注怎么组织、为什么不能直接套用常规检测流程讲清楚后面几章再落到转换、训练和调参。遥感数据集和普通数据集最大的区别在标注粒度。常规数据集一张图里目标大、数量少标注框基本是水平矩形卫星图里战车朝向随机水平框会引入大量背景像素所以常见做法是同时保留水平框HBB和旋转框OBB两套标注。战车卫星图这类数据集通常按「影像切片 标注文件 类别映射」三件套组织切片尺寸多为 512 或 1024重叠率 10%20% 用来防止目标被切边。类别上一般只保留「战车」一个正类或者细分坦克、装甲车、运输车但细分会让本就稀疏的样本更不平衡。理解这一点后面所有转换和训练决策才有依据。2. 战车卫星图数据集的格式拆解与选型判断拿到一批卫星图数据第一件事不是急着写训练脚本而是把目录结构和标注格式摸清楚。遥感数据集的坑大多埋在格式层坐标系是像素还是地理坐标、角度是弧度还是度、类别 id 从 0 还是 1 开始任何一处对不上训练时 loss 会正常下降但 mAP 始终上不去这种玄学问题九成出在标注解析。2.1 目录结构与标注文件的典型形态战车卫星图这类数据集常见两种组织方式。第一种是 DOTA 风格每张图对应一个 txt每行是x1 y1 x2 y2 x3 y3 x4 y4 category difficult八个坐标是旋转框的四个角点。第二种是 YOLO-OBB 风格每行class x_center y_center width height angle角度通常是弧度。先确认属于哪种再决定转换路径。# 先摸清数据规模与文件分布别急着训练 find ./dataset -type f -name *.txt | wc -l # 标注文件数 find ./dataset -type f -name *.png -o -name *.jpg | wc -l # 影像数 head -n 3 ./dataset/labels/000001.txt # 看标注长啥样这三条命令分别回答「标注有多少」「影像有多少」「单行格式是什么」。影像数和标注数不一致时说明有图没标或有标没图必须先对齐否则训练时 dataloader 会静默跳过你以为在训 5000 张实际只用了 3800 张。2.2 水平框还是旋转框先看目标长宽比分布选 HBB 还是 OBB 不该拍脑袋。统计一下标注框的长宽比如果大量目标长宽比超过 3:1水平框会框进大量背景旋转框收益明显如果目标接近方形HBB 就够了还能省掉角度回归的麻烦。import numpy as np # 假设已把 DOTA 四角点解析成 (w, h) ratios np.array([max(w, h) / max(min(w, h), 1e-6) for w, h in boxes_wh]) print(长宽比中位数:, np.median(ratios)) print(长宽比3 的占比:, (ratios 3).mean())boxes_wh是每辆战车的外接矩形宽高。中位数超过 2.5、且长宽比大于 3 的占比超过 30%就值得上旋转框。参数上注意1e-6是防止除零遥感标注里偶尔出现退化框宽或高为 0不处理会直接 NaN。2.3 类别映射与 id 对齐类别 id 错位是最隐蔽的翻车点。DOTA 里large-vehicle和small-vehicle是两个类战车数据集可能把它们合并成一个vehicle。转换前先写死一张映射表别在代码里散落魔法数字。原始类别名目标类别名目标 idtankcombat_vehicle0armored_carcombat_vehicle0truckcombat_vehicle0large-vehiclecombat_vehicle0映射表落成字典后转换脚本统一引用后续加类减类只改这一处。这一步做完数据层的选型判断就闭环了格式清楚、框型有依据、类别对齐接下来才谈得上转换和训练。3. 把战车卫星图转成 YOLO 可训练格式脚本与四个边界坑数据格式确认后核心工作是把 DOTA 风格的四角点标注转成 YOLO-OBB 或 YOLO-HBB 格式。这一步看着简单实际是踩坑重灾区。我一般会写一个独立转换脚本输入原始标注目录输出images/和labels/两个文件夹中间不做任何训练相关的事保证转换可复现、可回滚。3.1 四角点转旋转框的最小实现DOTA 的八个坐标是顺时针或逆时针排列的四个角点转 OBB 需要算出中心点、宽、高和角度。用 OpenCV 的minAreaRect最稳它内部处理了角点顺序问题。import cv2 import numpy as np def dota_to_obb(points): points: [x1,y1,x2,y2,x3,y3,x4,y4] - (cx,cy,w,h,angle_rad) pts np.array(points, dtypenp.float32).reshape(4, 2) (cx, cy), (w, h), angle_deg cv2.minAreaRect(pts) # OpenCV 角度范围 [-90,0)统一到 [0,90) if angle_deg -45: w, h h, w angle_deg 90 return cx, cy, w, h, np.deg2rad(angle_deg)minAreaRect返回的角度定义和 YOLO-OBB 不完全一致必须做归一化。angle_deg -45时交换宽高并加 90 度是为了让角度落在统一区间否则同一辆车在不同图里角度差 90 度模型学不明白。这一步不做训练 loss 会震荡。3.2 坐标归一化与图像尺寸绑定YOLO 格式要求坐标归一化到 [0,1]且必须用对应图像的真实宽高不能用固定值。def normalize(cx, cy, w, h, img_w, img_h): return cx / img_w, cy / img_h, w / img_w, h / img_h # 逐图读取尺寸别用全局常量 img cv2.imread(img_path) img_h, img_w img.shape[:2]常见错误是拿切片尺寸 1024 当常量去归一化但边缘切片实际可能是 1024×768归一化后坐标全偏。每张图单独读尺寸多花几毫秒省掉一整轮排查。3.3 边界框裁剪与退化框过滤目标被切边时四角点可能超出图像范围归一化后出现负值或大于 1。这类框要么裁剪到边界要么直接丢弃取决于目标被切掉的比例。def clip_and_filter(cx, cy, w, h, img_w, img_h, min_size4): if w min_size or h min_size: return None # 退化框丢弃 cx np.clip(cx, 0, img_w) cy np.clip(cy, 0, img_h) w min(w, img_w) h min(h, img_h) return cx, cy, w, hmin_size4是经验值小于 4 像素的目标在卫星图里基本无法区分战车和噪声留着只会污染训练集。裁剪后如果宽高仍超界说明标注本身有问题建议单独记录到日志人工复核。3.4 转换后的完整性校验转换完必须校验不能直接开训。写一个校验脚本检查每张图是否有对应标注、坐标是否越界、类别 id 是否在合法范围。import os def validate(images_dir, labels_dir, num_classes1): problems [] for name in os.listdir(images_dir): stem os.path.splitext(name)[0] label_path os.path.join(labels_dir, stem .txt) if not os.path.exists(label_path): problems.append(f缺标注: {name}) continue with open(label_path) as f: for i, line in enumerate(f): parts line.split() if len(parts) ! 6: problems.append(f{stem} 第{i}行字段数异常) continue cls int(parts[0]) coords list(map(float, parts[1:])) if cls num_classes or any(c 0 or c 1 for c in coords): problems.append(f{stem} 第{i}行越界) return problems这个校验脚本跑一遍把问题清单打出来比训练跑一半发现 mAP 异常再回头查要省事得多。四个边界坑——角度归一化、尺寸绑定、退化框、完整性校验——处理完数据层才算真正可用。4. 用 YOLOv8 在战车卫星图上跑通第一轮训练数据转换完下一步是选模型和配置训练。遥感小目标检测里 YOLOv8 系列是当前落地最省心的选择生态成熟、OBB 支持完善、社区踩坑记录多。这一章给出一套能直接复现的训练配置重点讲参数为什么这么设以及小目标场景下哪些默认值必须改。4.1 环境与数据配置文件先建data.yaml把路径和类别写清楚。注意path用绝对路径相对路径在不同工作目录下会翻车。path: /data/combat_vehicle train: images/train val: images/val names: 0: combat_vehicle训练集和验证集按 8:2 切切分时按图像切而不是按标注切否则同一张图的目标会同时出现在训练和验证里mAP 虚高。遥感数据里同一区域的多张切片高度相似最好按地理区域切分没有地理信息时至少保证切片不重叠。4.2 小目标场景下的关键训练参数直接上命令再逐条解释。yolo obb train \ modelyolov8s-obb.pt \ datadata.yaml \ imgsz1024 \ epochs150 \ batch8 \ lr00.01 \ lrf0.01 \ mosaic0.5 \ scale0.5 \ degrees180 \ fliplr0.5 \ patience30imgsz1024是关键。卫星图目标小缩到 640 后一辆 12 像素的战车只剩 7 像素特征几乎消失。1024 起步显存不够就降 batch别降 imgsz。degrees180打开全角度旋转增强遥感目标朝向任意这个增强收益很大。mosaic0.5比默认 1.0 低因为 mosaic 会把四张图拼一起小目标进一步缩小过度使用反而伤小目标。patience30早停遥感数据收敛慢给足耐心但别无限跑。4.3 训练过程该盯哪些指标训练启动后重点看三个量box_loss、cls_loss和验证集 mAP50。小目标场景下 box_loss 下降慢是正常的cls_loss 如果长期不降多半是类别映射错了或正负样本失衡。mAP50 在 50 轮后还没动静先回去查数据校验脚本的输出别急着调模型。# 训练日志里过滤关键指标 grep -E box_loss|cls_loss|mAP50 runs/obb/train/results.csv | tail -n 20如果 mAP50 卡在 0.1 以下八成是标注格式问题卡在 0.30.5 上不去再考虑调 anchor 或换更大模型。先排除数据问题再动模型这个顺序不能反。5. 战车卫星图训练避坑五条血泪排查记录遥感小目标训练翻车的方式和常规检测不太一样很多问题在 loss 曲线上看不出来只能靠现象反推。下面五条是我在实际项目里反复遇到的按「现象 → 原因 → 解决」记录遇到对应症状直接对照排查。5.1 现象loss 正常下降但 mAP 始终接近 0原因标注坐标没归一化或者归一化用了错误的图像尺寸。模型在学一个错误的映射loss 能降但预测框全偏。 解决跑第 3.4 节的校验脚本重点检查坐标是否都在 [0,1]。再随机抽 5 张图把标注框画回原图肉眼确认这一步能抓出九成格式问题。5.2 现象验证集 mAP 高但实际推理框不住小目标原因验证集和训练集切片重叠模型记住了背景而不是目标。遥感数据同一区域切片高度相似随机切分很容易泄漏。 解决按地理区域或至少按不重叠切片切分。没有地理信息时用图像哈希去重后再切分保证训练验证无重叠。5.3 现象训练中途 loss 突然变 NaN原因退化框宽或高为 0导致角度回归除零或者学习率过高。 解决转换阶段就用min_size过滤退化框训练时把lr0从 0.01 降到 0.005 试一轮。两者叠加基本能消除 NaN。5.4 现象模型把云影、道路误检成战车原因负样本不足背景多样性不够。卫星图里云、阴影、规则地物和战车纹理接近。 解决加入纯背景切片作为负样本比例控制在正样本的 10%20%。同时开mosaic和scale增强让模型见到更多背景组合。5.5 现象同一辆车被框出多个重叠框原因NMS 的 IoU 阈值对小目标偏大旋转框重叠计算不准。 解决推理时把iou阈值从默认 0.7 降到 0.5OBB 场景下再配合conf从 0.25 提到 0.4。小目标置信度普遍偏低阈值太低会引入大量误检。6. 战车卫星图数据集的进阶用法从单类检测到可复用的评估习惯跑通第一轮训练只是起点。战车卫星图这类数据集真正的价值在于它能当小目标检测的试验台把评估习惯固定下来后面换数据、换模型都能复用。我一般会在训练之外单独建一个评估脚本不依赖训练框架自带的验证自己算一遍指标避免框架默认参数掩盖问题。6.1 自己写一遍 mAP 计算别全信框架输出框架的 mAP 计算默认参数IoU 阈值、置信度阈值不一定适合小目标。自己按 0.5:0.05:0.95 多阈值算一遍能看出模型在不同定位精度下的表现差异。def compute_ap(preds, gts, iou_thr0.5): preds/gts: list of (cls, cx, cy, w, h, score) # 按 score 降序逐个匹配 gt统计 TP/FP preds sorted(preds, keylambda x: -x[-1]) tp, fp [], [] matched set() for p in preds: best_iou, best_j 0, -1 for j, g in enumerate(gts): if j in matched or g[0] ! p[0]: continue iou obb_iou(p[1:5], g[1:5]) if iou best_iou: best_iou, best_j iou, j if best_iou iou_thr: tp.append(1); fp.append(0); matched.add(best_j) else: tp.append(0); fp.append(1) # 累积 precision/recall 后算 AP return ap_from_pr(tp, fp, len(gts))obb_iou需要自己实现旋转框 IoU用 shapely 或 cv2 的旋转矩形交集都行。自己算一遍的意义在于当框架 mAP 和你的结果差很多时能定位是评估逻辑问题还是模型问题而不是对着一个黑匣子数字干瞪眼。6.2 用固定评估集做版本对比每次改数据增强、换模型、调参数都在同一个固定评估集上跑记录 mAP50、mAP75 和推理耗时三个数。我习惯用一张表格管理改了什么、涨了多少、代价是什么一目了然。版本改动mAP50mAP75单图耗时(ms)v1基线 yolov8s-obb0.520.3118v2imgsz 640→10240.610.3841v3加负样本0.640.4041v4degrees1800.670.4341这张表比任何调参直觉都可靠。v2 涨点但耗时翻倍是否接受取决于部署端算力v3、v4 几乎不增加推理成本属于必做项。没有这张表调参就是凭感觉改十次也说不清哪次有效。6.3 一个我坚持的习惯每次拿到新数据集我第一件事永远是写校验脚本、画标注可视化而不是直接开训。这个习惯帮我省掉的返工时间远超写脚本花的那点功夫。战车卫星图这类小目标数据尤其如此标注问题在 loss 曲线上几乎看不出来只有把框画回原图才能一眼看穿。希望帮到你。本文还有配套的精品资源点击获取