EGEUNet印章分割实战:从数据标注到训练集划分的完整指南

发布时间:2026/10/22 3:25:56
EGEUNet印章分割实战:从数据标注到训练集划分的完整指南 做印章分割这件事最初是被一个合同审核项目逼出来的。电子合同里红章压住了关键条款OCR 一识别就把印章边缘当成文字笔画结果整行文本直接废掉。后来决定在识别前面加一道分割流程先把印章区域摘出来再让下游算法去处理。这个思路听着简单真正动手才发现最卡脖子的不是分割网络本身而是手上根本找不到一份像样的印章分割数据集。于是就有了这个系列基于 EGEUNet 的印章分割实战。作为系列第一篇我特意选择先讲数据集。这篇的目标是把这份叫 seal_seg_v1.0 的数据集从头到尾说清楚它从哪来、怎么标注、统计分布长什么样、划分时有哪些讲究、怎么下载怎么用以及我在准备数据过程中踩过的三个坑。EGEUNet 的网络结构、训练细节和推理部署会放在系列后续几篇单独拆解。适合正在做文档图像分割、印章识别前处理或者刚接触语义分割想找一份能直接开工的数据集的朋友。下面先聊一个很多人忽视的问题为什么印章分割不能直接套现成的分割数据集。1. 为什么印章分割要单独造一份数据集业务背景与数据先行原则1.1 印章遮挡、背景干扰开源分割数据集为什么帮不上忙我一开始也天真地以为语义分割是成熟技术网上开源数据集一大把找个带文档或者物体类别的回来微调一下就行。结果翻了一圈要么是街景、人像、室内场景这类通用分割数据要么是文档版面分析数据集里面压根没有印章这个类别。就算偶尔有几张合同扫描图标注也基本是矩形框级别的粗标签根本没法做像素级分割训练。更深层的问题在印章任务本身的特殊性上。印章和普通分割目标的差异非常大印章是半透明的红色颜料会透出底下的文字和表格线网络很难定义哪个像素属于印章印章颜色不固定红章最常见但蓝章、紫章、黑色骑缝章也不少颜色特征不能作为稳定线索印章经常和背景文字重叠边缘被笔画切断人眼都要仔细分辨更别说模型扫描和拍照的清晰度差异巨大有的印章已经褪色到接近背景色有的被强光扫得发白拍摄角度会导致圆形印章变成椭圆甚至不规则形状平移、旋转、尺度变化都比普通目标剧烈。这些难点组合在一起决定了拿通用分割数据预训练 少量印章数据微调这条路并不稳。模型的底层特征可以迁移但顶层语义必须靠大量印章专属样本喂出来。所以结论很清楚想把这个系统做好必须从头构建一份专门的数据集。1.2 先定数据、再定网络这个系列的学习顺序第二个问题是为什么系列第一篇不直接上 EGEUNet 结构解析非要先花一整篇讲数据因为我在实际项目里的体会是分割模型的上限八成由数据决定两成才是网络结构。很多时候训练指标上不去不是网络不够深、注意力模块不够多而是训练集和测试集根本不在同一个分布里。网络结构随时可以换骨干、损失函数、解码器都能调但数据集这种东西一旦有偏向后面所有实验结论都会被带偏。当时我搭好第一版 EGEUNet 之后在自建的小数据集上跑出了 0.93 的 mIoU心里还挺高兴。结果一上真实业务样本直接掉到 0.81。后来逐张排查才发现训练集里合成图像占比太高背景太干净模型学到的是背景干净 印章容易找这种假规律。这种问题靠改网络是修不好的只能回头重新收拾数据。所以这个系列的顺序是刻意安排的本篇把数据集讲透第二篇拆 EGEUNet 的网络结构第三篇讲训练细节和 baseline 指标后续再谈部署和优化。如果你只想要一份能跑通的代码直接跳去后面几篇也行但如果你想真正把印章分割做好我建议先把数据这关过了后面会省很多事。2. 数据集是怎么来的真实脱敏样本与合成样本的配比思路2.1 真实样本脱敏流程与覆盖场景设计数据集的底子是真实业务样本。这批数据来自一个文档数字化项目源文件包括合同扫描页、发票、公文、档案影印件时间跨度好几年扫描设备也不止一台。原始文件里包含大量个人信息和敏感条款不可能直接拿来分发所以第一步是脱敏。脱敏不是简单把姓名、身份证号打马赛克因为马赛克区域本身就会干扰分割。我采用的做法是先用检测模型框出敏感区域再用纯白矩形覆盖覆盖区域尽量避开印章如果印章正好压在敏感信息上就保留印章部分把文字区域单独裁掉或用同色填充。处理完之后还要人工扫一遍确保没有任何可读的个人信息残留。覆盖场景设计上我刻意留意了几个维度印章的几何形状圆形、椭圆形、方形、印章颜色以红色为主适量蓝紫、印刷质量清晰、模糊、褪色、重影、背景复杂度纯白纸张、有表格线、有大段文字、有背景图案。每个维度都有一个最低样本数要求比如褪色印章至少 80 张防止模型在极端光照条件下完全失明。最终真实样本保留了 800 张。这个数量对深度学习来说不算多但胜在真实、脏、有各种意外情况比如纸张褶皱阴影、背面文字透印、扫描时产生的条纹噪声。这些是合成数据很难模拟出来的。2.2 合成样本是怎么做的又补了哪些真实场景补不上的角落800 张真实样本显然不够训练一个稳定的分割模型尤其是 EGEUNet 这种带编码器-解码器结构的网络参数量不小数据太少很容易过拟合。所以我又补了 2200 张合成样本合成不是为了凑数而是为了把真实数据覆盖不到的角落补上。合成流程分三步走。第一步从真实样本里把印章区域裁出来建一个印章纹理素材库。这个库里有各种颜色、清晰度、形状的印章切片大约收集了 600 多个。第二步随机生成背景版面可以是模拟合同表格线、排版段落、手写注释、票据横线也可以直接叠扫描噪点。第三步把印章纹理经过随机几何变换贴到背景上再整体做一次图像退化处理。有几个细节值得说。印章素材一定要用真实剪裁不能用程序生成的矢量章否则边缘太干净模型很快会识破。贴图时的融合方式我用的是正片叠底模拟半透明效果而不是直接硬贴这样印章和背景文字之间的遮挡关系才符合物理规律。生成完之后每张合成图还要过一次随机退化管线包括模糊、降分辨率、加 JPEG 压缩噪声让合成图看起来像真的扫描件。合成样本补上了三类真实数据特别缺的场景极端角度下的椭圆形印章、褪色到快要看不见的浅红印章、印章大面积压在密集文字上的情况。这些场景在真实业务里不常见但一旦出现就是硬伤模型必须在这些输入上也能稳住。最终 3000 张里真实 800、合成 2200比例大约 27:73这个配比在我后面几轮的验证实验里是效果最稳的组合。2.3 标注规范掩码格式、边缘判定标准与质检环节数据集标注是二类语义分割唯一前景类是印章背景是其余所有像素。标注格式统一为单通道 PNG 掩码印章区域像素值为 255背景为 0。不区分具体印章类型圆形椭圆方形一律算同一个类别因为下游任务只需要知道印章在哪不需要知道哪种章。标注工具我用的是多边形描边类工具沿着印章外轮廓打点。这里最大的争议是边缘判定标准尤其是半透明区域印章压在文字上文字笔画透过红色颜料露出来这部分的像素到底算印章还是算背景我最后定下的规则是只要人眼能明确判断出这里有红色颜料覆盖整块区域就标成前景颜料极淡、几乎看不出的边缘过渡带也全部归入前景。换句话说宁可让掩码稍微膨胀一点也不要让它缩进去因为下游 OCR 更怕漏掉印章边界而不是多出一圈边缘羽化区。质检环节是保证标注质量的关键。每个样本由两名标注人员独立标注然后计算两人掩码的交并比IoU 低于 0.95 的直接打回重标。通过初检的样本还要过一遍抽检流程随机抽 20% 由我逐张核对重点看边缘、重叠区域和低清晰度样本。标签文件统一命名不允许出现中文和特殊字符避免后续加载时踩编码坑。整套标注流程花了大约两周比采集还久但这一步省不得。3. 数据集统计口径与切分方案训练前必须核对的三张表3.1 样本数量、分辨率与难易分布统计拿到 3000 张标注完成的图像后第一件事不是急着训练而是把统计摸清楚。我把统计信息整理成了几张表覆盖三个维度数量、分辨率、难度。划分总样本数真实样本合成样本印章为红色印章为蓝/紫色低清晰度样本训练集240062017801950450360验证集300902102406045测试集300902102406045分辨率方面原始图像的短边最小 512 像素长边最大 2048 像素。我不想让网络在不同分辨率上反复横跳所以训练时统一缩放到 704×704 作为基准输入尺寸验证和测试时保持原始比例缩放并补齐到 704×704。难度分布是我额外加的一个统计维度。真实样本按印章与背景重叠面积比例、清晰度、背景复杂度人工打分分成易、中、难三档合成样本按生成参数自动打标。最终测试集里三档比例控制在 4:3:3确保评测指标能真实反映模型在困难场景下的表现而不只是被简单样本拉高平均分。3.2 训练/验证/测试集的划分策略与防泄漏措施划分最怕两件事分布偏斜和样本泄漏。分布偏斜好理解比如测试集全是清晰红章模型看着很强一换真实场景就露馅。所以我采用分层抽样按真实/合成来源、颜色、难度三个维度做了分层让三个划分里的比例尽量接近整体统计。样本泄漏是更隐蔽的坑。我当时第一版划分是随机打乱后按比例切验证集指标 0.96测试集却只有 0.87差了快 10 个点。后来一查原因是有很多样本来自同一份合同的不同扫描页这些页面背景、印章几乎一样随机切分时训练集和验证集会同时出现同一个章的近亲样本模型等于提前看到了答案。解决办法是按样本 ID 做分组去重。我给每份原始文档一个唯一 ID同一份文档的所有页面归属于同一个分组划分时以分组为单位而不是以单张图像为单位。这样训练集里出现的印章验证集和测试集里就不会出现同源的副本。另外合成样本也要按生成批次分组防止同一批合成参数产生的图像跨划分泄漏。做完这两步验证集和测试集的差距从 9 个点缩小到了 2 个点以内这个差距才算正常。4. 数据增强清单与 EGEUNet 输入管线的适配4.1 按印章任务特点筛选的增强项及参数数据增强不是越多越好而是每一项都要对应一个真实的未见过的情况。我采用的增强组合都是从印章任务的真实退化场景反推出来的增强操作参数范围对应解决的场景随机旋转0°~360°圆形印章任意角度出现椭圆章角度各异透视仿射倾斜角 ±10°手机拍照或扫描时纸张倾斜亮度扰动系数 0.7~1.3扫描仪曝光不均、纸张底色差异对比度扰动系数 0.8~1.5褪色印章与深色印章的差异高斯模糊σ 0.5~2.0低清晰度扫描件、失焦拍摄运动模糊长度 5~15 像素拍摄抖动导致的拖影随机遮挡矩形区域 5%~15%印章被文字、线条、污点遮挡HSV 色彩抖动H ±0.05S/V ±0.3红、蓝、紫印章的颜色漂移纸张纹理叠加真实纹理库随机选模拟扫描纸面粗糙度这里有一个容易被忽略的原则几何增强和颜色增强要分开考虑。旋转、仿射只改变位置和形状不改变像素值分布色彩抖动、亮度、对比度只改变像素统计不改变几何结构。混合使用时要保持顺序稳定否则模型会学到颜色变了形状也变的错误相关性。另一条心得是合成样本和真实样本的增强强度应该不一样。真实样本本身已经够脏增强过头会破坏标注精度合成样本太干净反而要多上模糊、噪声、遮挡把干净感压下去。训练时我对真实样本只做轻增强对合成样本做重增强实测下来泛化效果比统一增强策略高 3 到 4 个 mIoU 点。4.2 从原图到输入张量的完整数据流EGEUNet 的输入是 704×704×3 的 RGB 图像Mask 要变成对应的 704×704×1 浮点张量。整个数据流我按下面的顺序组织读取原图和掩码检查文件名是否一一对应按短边缩放原图长宽比不做拉伸缩放后短边 704中心裁剪或边缘填充到 704×704我用的是边缘填充因为印章很多在纸张角落随机翻转 随机旋转 仿射扰动颜色类增强归一化减去均值、除以标准差均值和标准差用训练集统计出来不用 ImageNet 默认值掩码同步执行相同的几何变换插值方式统一用最近邻避免边缘出现灰色插值值。所有变换都要保证图像与掩码是一对一同步的。最容易翻车的点在第 7 步很多人用同一套随机数种子分别处理图像和掩码看起来没问题但一旦出现 resize 时图像用双线性、掩码用最近邻之外的组合掩码边缘就会多出一圈 127 的灰色像素训练时损失函数直接把这部分当成错误样本。我在代码里干脆把图像和掩码拼成一个整体数组再一起变换彻底杜绝不同步的问题。5. 数据集下载方式、目录结构与加载参考代码5.1 下载入口说明与获取流程数据集压缩包 seal_seg_v1.0.zip解压后约 3.2GB。下载链接放在系列配套资源区和评论区置顶位置。正文里不方便直接放外链容易被平台拦截所以我统一把地址放在两个地方评论区置顶评论包含压缩包下载地址、提取码和 SHA256 校验值系列资源汇总页后续的网络结构、训练权重、推理脚本也会一起放在那里。如果你打开时发现链接失效直接在评论区留言或私信我我会尽快补链。下载完成后先解压再建议花两分钟做一次完整性校验防止传输过程中文件损坏导致训练到一半报错。压缩包里的 README 也写了校验方法很简单。这里多说一句开源数据集的下载链接失效是常态不是我这个项目特有。拿到任何数据集第一件事都是看 README、看目录结构、看标签说明别急着开训练脚本省下来的时间远比想象中多。5.2 解压后的目录结构与命名规范数据集目录结构如下seal_seg_v1.0/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── masks/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels.txt ├── dataset_info.json └── README.md图像和掩码一一对应文件名完全相同只是所在目录不同。比如images/train/contract_0023_page01.jpg对应masks/train/contract_0023_page01.png。图像格式统一为 JPG压缩质量 95掩码统一为 PNG无损掩码是单通道灰度图0 为背景255 为印章。dataset_info.json里记录了划分统计、类别列表、分辨率范围等元信息我直接贴出来{ name: seal_seg_v1.0, num_samples: 3000, classes: [background, seal], splits: { train: 2400, val: 300, test: 300 }, resolution: { short_edge_min: 512, long_edge_max: 2048 }, mask_format: png_grayscale_0_255 }5.3 一个可以直接改用的数据加载示例配合 EGEUNet 训练我写了一个标准 PyTorch Dataset 加载器可以直接替换路径使用。示例实现包括图像与掩码同步读取、格式校验、基础归一化没有包含增强逻辑方便你按自己的策略扩展。import os import torch from PIL import Image from torch.utils.data import Dataset class SealSegDataset(Dataset): def __init__(self, root_dir, splittrain, transformNone): self.img_dir os.path.join(root_dir, images, split) self.mask_dir os.path.join(root_dir, masks, split) self.transform transform self.names [] for fname in sorted(os.listdir(self.img_dir)): if fname.lower().endswith((.jpg, .jpeg, .png)): self.names.append(fname) def __len__(self): return len(self.names) def __getitem__(self, idx): fname self.names[idx] img_path os.path.join(self.img_dir, fname) mask_path os.path.join(self.mask_dir, os.path.splitext(fname)[0] .png) image Image.open(img_path).convert(RGB) mask Image.open(mask_path).convert(L) if self.transform is not None: image, mask self.transform(image, mask) mask torch.as_tensor(np.array(mask), dtypetorch.float32) / 255.0 mask mask.unsqueeze(0) return image, mask要注意的是掩码除以 255 之后会变成 0 和 1 之间的浮点数这对交叉熵损失和多类分割都友好不要用除 255 之前的值直接算损失数值范围不对会拖慢收敛。6. 用这份数据集踩过的三个坑每一个都能让训练白跑6.1 合成样本太干净模型在真实扫描图上崩了第一次拿这份数据跑 EGEUNet 时训练集 mIoU 冲到 0.96验证集也还行但一上真实扫描图就崩。后来我把合成样本逐张调出来看才发现问题合成背景虽然是模拟扫描噪点但整体干净程度和真实纸质扫描件差太远。真实合同扫描件有纸张纤维纹理、有背面文字透印、有扫描仪亮度不均的暗角这些特征合成阶段都没模拟到位。模型学到的是背景干净 印章容易找一旦遇到真实扫描件那种发灰、带纹理的背景特征分布全变了分割边界就开始乱飘。修复办法是强化合成样本的退化管线加入真实纸张纹理素材库、随机暗角、局部亮度不均、还加了 JPEG 两次压缩产生的块状噪声。改完之后合成样本在模型内部特征空间的分布和真实样本的距离缩短了一大截。这个坑给我的教训是合成数据一定要以骗过模型为标准而不是以人眼看着像为标准。人眼觉得像模型不一定觉得像反过来也一样。6.2 掩码边缘半透明区域的标注口径不统一第二个坑出在标注口径上。当时标注人员对半透明印章和文字重叠的边缘理解不一致有人把红色颜料薄的地方标成前景有人标成背景。训练的时候损失函数在边缘区域反复震荡模型收敛速度明显变慢预测出来的掩码边缘也一条黑一条白很不稳定。发现这个问题的直接证据是同一张图跑两次验证指标波动超过 1.5 个点。后来把标注规范重新收紧明确只要颜料肉眼可见一律算前景然后让两个标注人员返工全部样本。返工之后边缘震荡问题基本消失。这块我还有一个经验训练时可以在损失函数里加一点边缘权重让模型更关注靠近边界的像素。但前提是标签边缘本身是稳定的如果标签都歪歪扭扭加权只会放大噪声。所以先统一标注再谈边权。6.3 划分时没按样本 ID 去重验证指标虚高第三个坑前面已经预告过了随机划分带来的同源泄漏。训练和验证集里出现同一份合同的不同页验证 IoU 虚高到 0.96测试集立刻打回原形。这个坑特别隐蔽因为从图像上看训练页和验证页确实不是同一张图但它们的背景、字体、印章形态几乎一致模型等于是背下了答案。修复方案就是按文档 ID 分组划分同时把合成样本按生成批次分组。改造后测试集指标和验证集差距从 9 个点缩小到 2 个点以内。这个坑是所有做文档类图像任务的人都容易踩的。合同、票据、试卷、档案天然存在同源多页结构只要数据按页面而不是按文档切分测试集的可信度就要打个大问号。做数据划分时多问一句这批图里有没有哪些是同一个来源多花十分钟按组划分后面能少掉一大半调参时间。数据准备到这一步整个 seal_seg_v1.0 算是能稳定支撑 EGEUNet 训练了。回头再看这三周时间花得值。做分割任务真的没有什么比数据分布干净、划分可信更重要的了。下一篇文章我会正式拆 EGEUNet 的网络结构讲讲它为什么在印章这种强边缘、小目标任务上表现不错也会把用这份数据集跑出的 baseline 指标和训练配置完整贴出来。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询