元信息:
- Date: 2026-03-25
- Categories: AI, 本地, Windows
- Tags: Windows, PyQt6, OpenCV, 数据标注, 计算机视觉
📌 项目速览
- 开源地址:https://github.com/ArtichoKaleyard/SplitGrid
- 当前状态:
v1.0.0 Release稳定版 (MIT License)- 核心技术栈:Python / PyQt6 / OpenCV / SciPy
这个工具的来历
去年实验室接了一个光伏检测的横向课题,需要训目标检测模型。模型架构不是问题,数据标注才是。
任务分到每个人头上,我拿到的第一批大约 35 张无人机航拍图。听起来不多,但每张图里是一整片光伏阵列 不是圈个大框就完事,而是要拆到每一块光伏板组件,一张图轻轻松松几十个甚至上百个锚框。
最开始的做法非常原始:在标注软件里一个一个手画四边形。航拍图带透视,阵列是斜的,没法简单复制粘贴;就算在透视不明显的小范围内勉强能复制,效率依然很低。更要命的是,当一张图上堆了好几百个锚框之后,标注软件本身就开始卡顿,每拖一下都要等渲染。
一张图标完,快的十分钟,慢的二十多分钟。35 张图标下来大半天没了,而这只是整个数据集的一小部分 后续还有别的批次陆续发过来。
标着标着就在想:这些光伏板排列明明是有规律的网格结构,行列间距基本一致,为什么非得让人一个个去画?能不能把大阵列的外框画好,剩下的拆分交给程序自动完成?
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 入口要顺
首页不是摆设。选择图像目录后,程序自动扫描图像数量,探测 labels、json 或当前目录里已有的标注文件,点击按钮即可进入工作区。第一次上手的摩擦尽量降到最低。
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 — 智能阵列视觉分割与标注系统
(如果你在视觉检测或数据工程中也踩过类似的坑,欢迎交流。)










