☰
大图小目标检测难题:切图训练原理与实战指南
2026/10/17 2:04:00 网站建设 项目流程

大图里的小目标,一直是检测任务里最让人头疼的问题之一。很多人上来就调模型、换骨干网络,折腾半天发现提升有限,其实往往忽略了最根本的矛盾:一张几千乘几千的图,直接缩放到模型输入尺寸,小目标可能就剩几个像素了,特征早丢光了。我自己的实践里,最简单、最直接、也是效果最稳的方案,反而是回归本质——把大图拆成小块去训练。标题里提到“将图片拆成四个分开去放到目标去训练”,这个思路完全正确,而且它背后其实有一套完整的方法论,不只是“切成四块”这么简单。

这套做法的核心逻辑,就是用小图训练、大图推理,让小目标在模型眼里从“看不见”变成“看得清”。它不需要改模型结构,不需要上多卡大规模分布式训练,也不需要搜集额外的数据,纯粹从数据预处理和推理后处理两个阶段入手,就能把很多小目标场景的检测精度拉上来一大截。我自己在航拍图像、高清监控截图、扫描文档这些场景里都验证过,切图方案带来的mAP提升往往比换一个更大的模型还明显。

这篇文章我就围绕“大图小目标检测”这个主题,把切图训练这套方法从原理到实操完整拆开讲。适合刚接触目标检测、正在被大图小目标折磨的开发者参考,也适合已经在用切图但效果不理想、想优化细节的读者对照排查。我会把切图尺寸怎么定、标签怎么跟着切、推理时怎么拼回去、NMS怎么合并这些关键环节全部展开,包括我踩过的坑和实测数据,尽量做到你看完能直接照着复现。

1. 问题本质:大图小目标检测为什么这么难

1.1 缩放导致的特征消失

先看一张典型的大图检测场景。比如一张无人机拍的城市俯瞰图,分辨率是5472x3648,里面的车辆目标可能只有30x30像素左右。如果模型输入尺寸是640x640,那整张图缩放后,一辆车就变成了大约3.5x3.5像素——几个像素在卷积网络里经过几次下采样,到深层特征图上可能连一个点都不到了。这种情况下,任何检测头都无从谈起。

问题本质上是信息量被压缩了。检测模型能“看到”的最小目标,取决于输入分辨率下目标占的像素面积,以及骨干网络的下采样倍数。以常见的YOLO系列为例,输入640时特征图最大尺寸是80x80(对应下采样8倍),一个目标至少要在特征图上占据1个点才有响应,算下来目标在原图中至少要有8x8=64个像素,实际上建议至少16x16以上才能稳定检出。而大图缩放到640之后,30x30的车辆就是这样被“抹掉”的。

1.2 直接暴力切图也有问题

既然大图直接缩放不行,为什么不直接把大图按640尺寸切成几十块,全部送进去训练和推理?理论上完全可行,这也是切图方案的雏形。但实际操作中会发现很多新问题:

  • 一个目标恰好被切在边界上,两半分别落在两个切片里,两边都只剩一半特征,模型很难判断这是什么。
  • 切出来的子图数量庞大,训练时如果全部参与,每个epoch跑的步数会激增,反而拖慢收敛。
  • 大量切片是背景区域,没有目标,负样本比例失衡,模型容易产生误检。
  • 推理时切片之间重叠区域的目标会被重复检出,合并结果时如果处理不好,会出现很多重复框。

所以,切图绝对不是“直接切成N份丢进去训练”这么简单。标题里说的“拆成四个”,其实代表的是一个思路,但真正要落地,需要解决切片设计、标签同步、推理合并这三个核心问题。

1.3 为什么切图能起作用

从模型的角度来看,切图起作用的本质是:它把“在一张超大图上找小目标”的问题,转换成了“在若干张分辨率适中的图上找中等大小目标”的问题。原本30x30的目标,直接缩放后剩3.5x3.5,但切成640的切片后,如果目标完整落在一个切片里,它依然是30x30,在模型输入中占据的像素比例大大提升,特征自然清晰得多。

这其实是在变相“放大目标”,而不是靠模型硬撑。另一个角度理解,切图相当于人为制造了更多高分辨率的训练样本,让模型见过更多“清晰”的小目标形态,比在低分辨率图上硬学那些模糊的马赛克块要有效得多。

2. 切片方案设计:不只是切成四块

2.1 核心原则:切片尺寸要和模型输入匹配

切片尺寸怎么定,直接决定了方案的上限。我自己惯用的原则是:切片尺寸尽量等于或略大于模型的设计输入尺寸。比如模型设计输入是640x640,那切片就切成640x640;如果是608,就切成608。这样切出来的子图可以直接进模型,不需要额外缩放,信息无损。

为什么不建议切片尺寸大于模型输入?比如切成1280x1280再缩放到640,效果其实和直接缩放整张图差不多,该丢的信息还是丢了,还多了一道预处理开销,完全没有意义。

至于“切成四块”这个具体说法,要看原图尺寸。如果原图是2560x2560,切成四块就是每块1280x1280,这个尺寸对很多模型来说还是偏大,需要进一步处理。所以“四块”更多是一个比喻,意思是把大图切成模型能直接“吃下”的子图,具体切多少块,取决于原图尺寸和模型输入尺寸的比值。

2.2 重叠区域(Overlap)的设计

切图训练最容易被忽视但又极其重要的参数,是切片之间的重叠率。为什么需要重叠?回到1.2里提到的边界问题。如果不设置重叠,一个目标恰好横跨相邻两张切片的边界,就会同时被切断,两边各留一半,模型训练时既学不到完整特征,推理时也会因为两边都信息残缺而漏检。

重叠率怎么设?我的经验是,切片尺寸的10%到20%作为重叠区域。比如切片640,重叠64到128像素。这个数值在大多数场景下能保证目标不会轻易被切断,又不会引入太多重复计算。

为什么是10%-20%而不是更多?因为重叠率越高,推理时重复计算的区域越大,耗时越多——比如重叠率30%时,相当于每张图要多算接近一半的像素量,推理速度明显下降。而且在特征比较密集的场景中,过高的重叠还会导致同一目标在多个切片中被反复检出,NMS处理难度加大。

2.3 自适应切片:按目标尺寸反推

如果你要处理的场景目标尺寸差异很大,也可以用一种更精细的自适应切法。先统计训练集中目标框的面积分布,特别是小目标的尺寸区间。然后设定目标:切片尺寸至少是最大小目标尺寸的4到5倍(保证目标在切片内占比合理,不会出现一个切片里全是同一个目标的极端情况),且切片尺寸不能超过模型输入分辨率太多。

这个说法比较绕,总结成实际操作就是:

  • 如果小目标集中在32x32左右,切片建议至少128x128以上。
  • 如果模型输入是640,切片尽量不超过640太多,比如可以选512或640。
  • 目标尺寸分布很散时,可以做一个简单的统计分析:统计所有标注框的宽高分布,取小目标群的尺寸上界,乘以4,再往最近的模型输入尺寸上靠。

这个方法适合目标尺寸跨度极大的数据集,能避免固定切片尺寸下“目标太小学不到、目标太大占满全图”的两难。

2.4 训练还是只用切片,不用原图

我在一些开源项目里看到过“原图+切片混合训练”的做法,即部分epoch用原图训练,部分用切片训练。这种做法有一定合理性,比如能保留模型对全局语义的理解,但实践中我发现,混着训练容易让模型在两种数据分布间摇摆,收敛不稳定,而且如果原图缩放到输入尺寸,小目标又变回模糊状态,反而干扰学习。

我的建议是:如果场景目标普遍偏小,直接全部用切片训练,别混原图。如果场景中既有大目标又有小目标,非要混合,那也要用“切片为主、原图为辅”的比例,比如每4个step里3个用切片、1个用原图,并且原图分支的loss权重适当降低。

3. 标签切分与数据集准备

3.1 坐标变换:一套公式解决

切片之后最关键的步骤,就是让标注框也跟着切片坐标“搬家”。这是整个流程里最容易出错的地方。

假设原图尺寸是W x H,切片起点是(offset_x, offset_y),切片尺寸是crop_w x crop_h。对于原图中的任意标注框(x1, y1, x2, y2),在切片中的新坐标就是:

nx1 = max(x1, offset_x) - offset_x ny1 = max(y1, offset_y) - offset_y nx2 = min(x2, offset_x + crop_w) - offset_x ny2 = min(y2, offset_y + crop_h) - offset_y

这段代码看起来简单,但重点在后面两步判断:

  • 如果nx1 >= nx2或ny1 >= ny2,说明这个框和当前切片完全没有交集(目标在切片外面),直接丢弃。
  • 计算裁剪后框的面积,如果剩余面积小于原框面积的某个比例(比如50%),也建议丢弃。

第二步的判断逻辑值得斟酌,这里面的关键问题是:目标被切掉一大半时,还要不要保留这个残缺的标注框?我的做法是:如果剩余面积小于原来的30%,直接丢弃这个框;在30%-70%之间,保留但给它降低标签权重(如果框架支持的话);超过70%,正常保留。为什么不全部保留?因为训练时模型见过太多“半截目标”会学出错误的形状先验,推理时反而会把完整目标误判成两个半个的。

3.2 要不要保留切片内的空标注图片

切片之后,会有大量子图不包含任何目标(纯背景)。这些图对训练有用吗?

有用,但物极必反。纯背景图能帮助模型减少误检,学习背景和目标的区分,但数量太多会让训练变得极其低效——大量step都在学“这里什么都没有”,特征提取器得不到有效更新。

我的建议是:纯背景切片不全部保留,按一定比例随机采样保留。比例取决于场景复杂度,简单场景(比如空地上少量车辆)保留10%-20%就够,复杂场景(街道、密集人群)可以保留到30%。

为什么不能完全不要背景切片?如果你只保留含有目标的切片,训练集和推理时的数据分布就不一致——推理时模型看到的是一整张大图切出来的所有区域,包括大量背景区,训练时却从没见过纯背景切片,很容易在背景区域产生大量误检。

3.3 数据增强在切片层面的爽点

切图方案在数据增强上有一个天然优势:你可以在切片层面做很多原图层面做不到的操作。

比如,原图上一辆车只有30x30,你没法对它做随机旋转,因为旋转后背景信息占主导;但切片是640x640的,目标在里面占的比例明显更大,可以放心做旋转、缩放、平移、颜色扰动等常规增强。

特别是马赛克增强(Mosaic),在切片训练中效果非常突出。因为切片是从大图里裁出来的,纹理丰富,把4张切片拼成一张新图做增强,目标密度和多样性都更高,模型的鲁棒性会明显提升。

我在项目中实测过,单独切图训练比直接原图训练mAP高约8-12个点;切图+Mosaic增强,又比只切图高3-5个点。这部分收益几乎不需要额外付出。

4. 推理阶段:切片预测、坐标还原与合并

4.1 推理流程全景

训练完成后,推理阶段和训练阶段有一个关键区别:训练时切片尺寸和数量是固定的,推理时必须动态决定切多少块、重叠多少,然后逐块预测,再把结果映射回原图坐标。

完整流程如下:

  1. 读取大图,获取原图尺寸。
  2. 根据预先设定的切块尺寸和重叠率,计算切片起点的网格位置。
  3. 按网格顺序切出所有子图,逐个送入模型预测。
  4. 将每个切片中预测出的框坐标,加上对应切片的偏移量,映射回原图坐标。
  5. 所有切片的预测结果汇总后,做一次全局的NMS(非极大值抑制),消除重复检测框。

4.2 为什么要做两次NMS

这里有一个值得注意的细节:切片内预测时,如果模型自带NMS处理,那每个切片内部已经去重了;但切片之间重叠区域的目标,会在相邻切片中被重复检出——因为同一个目标在切片A里是完整的,在切片B的重叠区域里可能还是完整的,两边都会打出高置信度的框。

所以合并时必须要做一次“全局NMS”。坐标已经被映射回原图,所有框都在同一坐标系里,用常规IOU阈值(比如0.5)做一次非极大值抑制,把重复框去掉。

我试过省略全局NMS,直接输出所有框,结果是同一辆车被标了2到3个框,视觉上非常乱,而且下游应用(比如计数、跟踪)会被严重干扰。所以全局NMS不能省。

4.3 边界处理:目标被切在边缘怎么办

推理时有一个训练阶段不太会遇到的问题:目标恰好落在切片边界上,一半在切片A里,一半在切片B里。因为设置了重叠区域,很多这类目标会在某个切片里保留完整形态,但有些恰好落在重叠区域之外的边界上,就可能只剩一半。

处理办法一般是:给拼接回原图的坐标加一个“边界安全偏移”。具体操作是,映射框坐标时,如果框的某一边贴着切片边界(距离小于某个阈值,比如5像素),就把这个框的置信度乘一个惩罚系数(比如0.8),降低它对最终结果的影响。这个技巧能有效减少边界残缺目标产生的低质量预测框。

4.4 推理性能优化

切图推理最大的副作用是计算量增加。比如一张5472x3648的图,切成640x640、重叠128,大概会切成80到90块,每块都要跑一次模型前向,耗时明显高于直接缩放推理。

优化方案主要有三个:

  • 如果目标尺寸分布允许,适当增大切片尺寸(比如从640提到960或1280),减少切片数量,但此时输入模型的图会被轻微缩放,收益和损失需要权衡。我实测过1280输入相比640输入,小目标精度还能再涨3-5个点,但显存和时间消耗也会翻倍。
  • 用TensorRT等加速框架对模型做推理优化,可以抵消一部分多切片的开销。
  • 设置置信度阈值过滤低分框,减少后续NMS处理量,但训练时输出的低置信度框数量本身取决于模型质量,这个优化幅度有限。

5. 常见问题与坑点实录

5.1 模型检出的框有偏移/坐标不准

这个问题的根源几乎都是标签切分时坐标变换出了问题。特别是用了某些数据增强库时,增强操作的顺序和坐标变换的顺序不一致,会导致标签和图像错位。排查方法是:随机挑几张切片图,把切分后的标注框直接画在切片图上保存下来,肉眼检查——如果框和目标位置对不上,先检查坐标变换代码,再检查增强流程是否对标签同步生效。

5.2 目标在推理时漏检

如果训练是切图训练的,推理也是切图推理的,目标却漏检了,优先排查两点:

  • 推理时切片尺寸和训练时是否一致。如果训练用的是640的切片,推理时擅自改成1024,模型看到的尺度分布变了,小目标可能就检不出来了。保持训练推理一致是第一原则。
  • 重叠率是否足够。如果推理时重叠率设置过低,某些目标可能恰好落在两块切片的边界缺口里,两边都不完整,导致漏检。把重叠率适当提高(比如从10%提到20%)通常能缓解。

5.3 推理结果框太碎/同一目标多个框

这种情况几乎可以断定是全局NMS缺失或IOU阈值设置不当。先检查合并逻辑是否做了全局NMS,再确认IOU阈值是否合理。目标密集场景中,阈值设得太高(比如0.7以上)可能无法消除相邻切片的重复框;设得太低(比如0.3)又可能把两个相邻的真实目标合并成一个。我通常从0.5起步,根据可视化结果微调。

5.4 显存不够用

切片尺寸本身不大,但如果你在推理时把几十个切片一次性放进batch里跑,显存就会爆。解决办法很直接:把推理batch size调小,甚至逐张切片推理。或者用流式处理,每次只加载部分切片到GPU计算,算完释放再算下一批。

5.5 训练时间极长

切片训练的数据量确实会膨胀。比如原图5000张,每张切80块,就是40万张训练图,单卡训练一个epoch的耗时极其可观。我的经验做法是:

  • 在数据加载阶段做在线切图(每次训练时实时从原图中切片),而不是离线把所有切片存成文件。这能大幅节省磁盘空间,同时利用数据加载器的多进程并行,让切图操作和GPU计算重叠。
  • 如果训练进程还是太慢,可以按比例随机采样切片,比如每张原图只随机取其中的30%切片参与训练,用更少的数据量换取更快的迭代速度,精度损失通常在可接受范围内。

6. 进阶扩展:从“切成四块”到更优雅的方案

6.1 多尺度切图:大小切片配合

固定单一尺寸切图,目标形状差异大的时候会顾此失彼。一个可选的扩展方案是同时用两种切片尺寸训练:比如主力用640的切片,辅以1280的大切片,两个分支分别预测,合并时统一映射回原图坐标再做NMS。

这个方案的好处是:1280切片能保住更大的目标和上下文语义信息,640切片对小目标更敏感,两者互补。缺点是训练和推理的计算量都会进一步增加。如果你的场景目标尺寸跨度确实大,这个方案值得尝试。

6.2 切片与检测头的配合

前面聊的都是数据层面的方案,如果你的项目允许改模型,可以再进一步:在检测头里加上对目标尺寸的先验统计,比如给不同尺寸的目标分配不同的特征层。YOLO系列本身就有多尺度检测头,但默认分配策略不一定适配你的目标分布。你可以统计自己数据集中目标框的面积分布,把大目标分配到浅层特征图,小目标分配到深层特征图,配合切图方案,效果还会往上走一截。

6.3 测试时增强(TTA)与切图结合

测试时增强在切图方案里同样可行,尤其是多尺度测试:同一张切片分别以0.8、1.0、1.2的缩放比例输入模型,得到三组预测框,映射回原图坐标后合并再做NMS。实测这个操作通常能给小目标检测带来1-2个mAP点的提升,代价是推理时间变成原来的三倍。如果对精度要求高、对实时性要求不高,这是个很划算的加法。

写在最后的个人经验

这套方案我已经在好几个项目里实际落地了,每次都能稳定提升小目标检测的精度。有一些体会值得单独说说。

切图方案真正要做好的核心就三件事:切片尺寸跟模型输入对齐、标签变换不出错、推理合并时要保持和训练一致。这三件事做到位,方案就成了一大半。

另一个容易忽略的点是评估方式。切图训练后的模型,不要再拿原图缩放的预测结果对比——如果推理时没有用切图,模型在小目标上的表现可能反而更差,这不是方案的问题,是评估流程没跟上。我建议评估时保持“训练怎么切,推理就怎么切”的完整一致性。

最后再分享一个小技巧:如果你在调试阶段觉得切图后效果不明显,可以先可视化一批切片和对应标签,确认切图质量没问题,再往下走。很多人一上来就调参,结果问题出在坐标变换写错了,白白浪费时间。

大图小目标检测没有银弹,但切图训练这套方法,是我试过的所有方案里性价比最高、最不会出错的一种。希望对你有帮助。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询