ArtichoKaleyard
发布于 2026-03-26 / 36 阅读
8

SplitGrid:告别纯手工拉框,专治光伏阵列等密集目标的细粒度标注

元信息:

  • Date: 2026-03-25
  • Categories: AI, 本地, Windows
  • Tags: Windows, PyQt6, OpenCV, 数据标注, 计算机视觉

📌 项目速览


这个工具的来历

去年实验室接了一个光伏检测的横向课题,需要训目标检测模型。模型架构不是问题,数据标注才是。

任务分到每个人头上,我拿到的第一批大约 35 张无人机航拍图。听起来不多,但每张图里是一整片光伏阵列 不是圈个大框就完事,而是要拆到每一块光伏板组件,一张图轻轻松松几十个甚至上百个锚框。

最开始的做法非常原始:在标注软件里一个一个手画四边形。航拍图带透视,阵列是斜的,没法简单复制粘贴;就算在透视不明显的小范围内勉强能复制,效率依然很低。更要命的是,当一张图上堆了好几百个锚框之后,标注软件本身就开始卡顿,每拖一下都要等渲染。

一张图标完,快的十分钟,慢的二十多分钟。35 张图标下来大半天没了,而这只是整个数据集的一小部分 后续还有别的批次陆续发过来。

标着标着就在想:这些光伏板排列明明是有规律的网格结构,行列间距基本一致,为什么非得让人一个个去画?能不能把大阵列的外框画好,剩下的拆分交给程序自动完成?

SplitGrid 就是从这个想法开始的。它在项目进行过程中逐步开发,从最初的脚本一路长成了现在这个带完整交互界面的工具。

SplitGrid 首页或工作区总览图
SplitGrid v1.0.0 Release — 全新重构的 Fluent Design 工作区


一、它做了什么,不做什么

先把边界讲清楚。

SplitGrid 不是通用标注平台,不替代 LabelMe 或 X-AnyLabeling。它解决的是一个非常具体的问题:你已经有了阵列的外轮廓标注(LabelMe 格式的多边形),需要把它进一步拆成内部的逐个小单元。

整条链路是闭环的:读入 LabelMe JSON → 透视矫正 → 投影分析 → 峰值检测 → 参数推荐 → 实时预览 → 手动微调 → 批量统一 → 局部排除 → 结果保存与自动备份。不需要在多个工具之间来回跳转。

1.1 效率提升

用上之后,提升很直接:一张图从十几二十分钟压缩到大约 1–5 分钟,取决于图像复杂度。阵列规整、没有碎格子的情况下两分钟以内就能搞定;遇到边缘破碎或需要额外调试的会慢一些,但和纯手工相比,量级上的差距是明确的。

1.2 适用边界

最适合的场景: 光伏板阵列是最典型的起点。此外,建筑窗格、货架矩阵、规则排布的工业组件 只要内部带明显的网格节奏且已有外轮廓标注,都可以用。

不适合的场景: 目标内部完全不规则,或者连基础外轮廓都不存在。


二、核心算法:不靠深度学习,靠几何和信号

有人可能会问:为什么不用深度学习来做自动分割?

答案很简单 这个工具本身就是为深度学习训练准备数据的。你连标注都没做完,哪来的训练集?哪来的模型?这是个先有鸡还是先有蛋的问题。后期项目里确实有了模型预标注的锚框可以辅助,但前期冷启动阶段,你只能靠自己。

好在光伏板阵列有一个天然优势:它是高度规则的人造结构,行列间距近似等距,网格节奏清晰。与其硬套一个需要训练数据的模型,不如把这种几何规律直接写进算法。

SplitGrid 的核心思路是三步:把几何摆正 → 把信号读出来 → 用阵列规律审核信号

2.1 透视矫正:把输入空间洗干净

航拍图里的阵列几乎都带透视变形,直接在原图上分析行列间距毫无意义。

SplitGrid 先读取标注好的四点多边形,对顶点排序后做透视变换,把倾斜区域拉回规则矩形。所有后续分析都在矫正后的空间里完成,算出结果后再通过逆变换映射回原图坐标。

这一步看似基础,但决定了后面所有判断的起点是否干净。

透视矫正前后对比

2.2 投影波形分析:行和列各自独立

矫正之后,沿水平和垂直方向分别做像素累加投影,得到两条波形曲线。网格缝隙处会出现明显的波峰或波谷,通过峰值检测定位格线位置。

这里有一个关键设计:水平和垂直方向的灵敏度是独立的。 实际图像中,横向缝隙清晰但纵向被反光吞掉是常态。如果两个方向共享同一个灵敏度,修好一边就会搞坏另一边。分开控制后,调参方向明确,试错成本也更低。

灵敏度面板

2.3 阵列先验:用结构规律审核检测结果

单纯找波峰远远不够。真实图像里有阴影、反光、模糊、噪声,裸峰值检测的结果经常是一团乱麻。

这也是整个开发过程中最难啃的部分 图像环境太复杂,单一方法压不住所有场景,最终靠多种策略叠加才稳住:

  • 定向形态学增强:缝隙微弱时,沿阵列方向提取 Sobel 梯度,用长核做形态学运算,把格线扶起来、噪点压下去。
  • 边界过滤与近邻合并:排除贴近多边形边缘的伪峰,合并因毛刺被错误拆分的双线。
  • 等间距先验:利用相邻峰的中位间距,剔除异常密集的噪声峰,按节奏补全漏检的缺失峰。

最后一条是整套逻辑的核心。光伏阵列本来就是等间距的,既然这个先验存在,算法就该利用它。SplitGrid 不只是“把峰找出来”,还会追问:这些峰放在规则网格里看,像不像真的格线?

波形峰值示意


三、批量一致性:真正拉开效率差距的地方

单张图切得准只是基本功。面对一整批数据时,真正的瓶颈变成了一致性 同一类组件、同一批航拍,标注标准不应该随机漂移。

3.1 加权投票

同一批图、同一类组件,绝大多数情况下行列结构应该是一致的(比如都是 6×10)。个别样本可能因遮挡或反光偏离,但不应反过来把整批参数拖偏。

SplitGrid 的批量模式对所有选中区块并行分析,再根据识别置信度做加权投票,让最可信的多数结果收敛出统一参数。不是简单取众数,而是越稳定的区块权重越高。

批量分析窗口
批量调整模式:底层多线程并发,顶部展示投票结果,画布实时渲染

3.2 例外处理:“隐藏并调整”

批量分析不可能百分之百完美,总有几个顽固样本。很多工具在这里只给两个选项:全盘接受或彻底重来。

SplitGrid 多了一个中间态:批量分析窗口退下后,主画布进入调整模式(边框变红),你可以直接用 Shift 增删选区,随时剔除异常样本或单独修正,处理完再落盘。先吃批量的效率红利,再用最小成本收拾例外。

隐藏并调整流程


四、调试面板:切错了,至少得知道为什么

自动化工具最让人抓狂的时刻不是切错,而是切错之后完全不知道为什么,只能盲目拧参数碰运气。

4.1 先看清

D 键呼出调试面板,SplitGrid 会把算法的完整中间过程摊给你看:透视矫正后的底图、方向增强后的特征图、水平/垂直投影曲线、实际阈值线、每一个被采纳或被过滤的波峰。你能清楚地看到这次为什么识别成 6×10,哪些峰是噪声,哪些是真正的缝隙。

调试面板全景

4.2 再接管

这个面板不是只读的。直接在波形图上点击某个位置,系统会把点击坐标反算成灵敏度,立即回写到主界面并重绘分割线。理解算法和修正算法是一个连续动作 看见问题、点一下、改好了。

点击阈值线即时回写

4.3 经验沉淀

用久了你会发现,调试面板还有一个附带收益:它在帮你积累对这类数据的直觉。什么样的图适合直接切、什么需要先增强、什么问题来自透视畸变、什么问题只是阈值没压准 这些经验会在反复使用中沉淀下来。


五、工程细节:能长期用下去的前提

算法决定了工具能不能用,工程细节决定了你愿不愿意拿真数据长期用它。v1.0.0 Release 引入了全新的 Fluent Design 语言,并在多个维度做了打磨。

5.1 入口要顺

首页不是摆设。选择图像目录后,程序自动扫描图像数量,探测 labelsjson 或当前目录里已有的标注文件,点击按钮即可进入工作区。第一次上手的摩擦尽量降到最低。

5.2 画布要顺手

单选、Shift 点选、框选、反选、无级缩放、平移,外加悬浮的鹰眼总览图 (Minimap) 放大细节时不会在大画布里迷路。标注工作需要频繁在全局和局部之间切换,交互本身不能成为拖累。

鹰眼导航画布交互

5.3 回退要安心

  • 全栈撤销重做Ctrl+Z / Ctrl+Y,默认 50 步历史。标注天然需要反复修正,没有多级撤销你就不敢大胆试。
  • 自动备份:每次 Ctrl+S 保存前,旧文件自动复制到 backups 目录并附时间戳。误操作的代价降到最低。

备份目录或保存链路

5.4 状态要一体

主窗口、控制面板、批量管理器、调试面板围绕同一个状态对象工作。一处改参数,其他区域同步更新;切图时历史自动清理;进入批量调整时画布和选区逻辑一起切换。你不一定知道背后怎么实现,但一定能感觉到工具是“一体的”还是“拼凑的”。


六、当前状态与后续

代码已整理发布为 v1.0.0 Release 稳定版(MIT License),有完整 README、软件著作权登记、清晰的版本线,可以直接 clone 下来使用。

它从实验室里一个标注标到崩溃的真实需求出发,在项目过程中逐步开发打磨,现在终于从“我自己用的脚本”走到了“可以公开交给别人用的工具”。

如果你也在做光伏板检测,或者手头有一批密集阵列目标等着拆分标注 试一轮。在模型开始学习之前,数据生产本身值得被认真对待。

欢迎来 GitHub 提 Issue、点 Star 或提交 PR:
SplitGrid — 智能阵列视觉分割与标注系统

最终结果叠加图

(如果你在视觉检测或数据工程中也踩过类似的坑,欢迎交流。)