恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
OCR模型训练数据不够?用数据生成工具批量造数据实战
首页
资讯中心
/
OCR模型训练数据不够?用数据生成工具批量造数据实战
OCR模型训练数据不够?用数据生成工具批量造数据实战
发布时间:2026/10/20 20:02:08
OCR模型训练最头疼的从来不是网络结构设计而是标注数据不够。我做过好几个文字识别项目每次卡在瓶颈上的几乎都是同一件事真实场景的样本太少标注成本太高模型在测试集上看着还行一上真实业务就崩。后来我花了不少时间研究怎么用数据生成工具来“造”训练数据踩了一圈坑之后总算摸索出一套相对靠谱的流程。这篇就聊聊怎么用数据生成工具给自己的OCR任务批量生产文字识别数据从原理到实操到避坑尽量讲透。1. 为什么OCR项目绕不开数据生成这一步1.1 真实标注数据的三个硬伤做文字识别的人都有一个共识模型效果的上限很大程度上由数据决定。但真实标注数据有几个绕不过去的硬伤。第一是获取成本高。一张包含多行文字的图片标注人员需要逐字框选、逐字输入遇到模糊、倾斜、遮挡的情况还要反复确认。我粗略估算过一个熟练的标注人员处理一张中等复杂度的文档图片大概需要一到三分钟如果是手写体或者复杂排版时间还要翻倍。一个稍微像样的OCR项目训练集动辄需要几万甚至几十万张图片这个成本不是小团队能承受的。第二是场景覆盖难。你从某个渠道收集来的真实图片往往集中在少数几种场景里。比如你收集的都是扫描版合同那模型对手机拍摄的、带透视畸变的、光照不均的文字就几乎没有泛化能力。而真实业务里用户上传的图片千奇百怪什么角度、什么光照、什么背景都有。靠人工去凑齐所有场景的样本几乎是不可能完成的任务。第三是长尾分布严重。自然场景下的文字常用字出现频率极高生僻字、特殊符号、罕见字体出现频率极低。但恰恰是这些长尾样本决定了模型在真实场景下的鲁棒性。你不可能为了几个生僻字去专门收集几千张图片这在工程上完全不划算。1.2 数据生成到底解决了什么问题数据生成工具的核心思路是用程序化的方式合成带有精确标注的文字图片。你给它一批文字内容、一批字体、一批背景图它就能自动渲染出成千上万张带标注的图片。标注信息在生成过程中就天然存在不需要人工标注这是它最大的价值。具体来说它解决了三个层面的问题。成本层面一次配置好生成脚本可以无限量产出数据边际成本几乎为零。覆盖层面你可以通过参数控制字体、字号、颜色、背景、模糊、噪声、旋转、透视变换等维度人为地制造出各种极端场景。分布层面你可以精确控制每个字符、每种字体的出现频率把长尾样本的比例调高让模型在这些难例上得到充分训练。需要明确一点生成数据不是要完全替代真实数据而是作为真实数据的补充和增强。纯合成数据训练出来的模型在真实场景下往往会有域偏移问题后面我会详细讲怎么缓解。1.3 哪些OCR场景最适合用生成数据不是所有OCR任务都适合用生成数据来补。根据我的经验以下几类场景收益最明显。印刷体文档识别是最成熟的场景。字体规整、排版有规律生成工具很容易模拟出接近真实的文档图片。尤其是票据、表单、证件这类有固定版式的场景生成数据的效果非常好。固定字库的验证码识别也是典型受益场景。字符集有限、字体变化可控生成数据几乎可以做到和真实数据同分布。多语言文字识别同样适合。很多小语种的真实标注数据极其稀缺但字体文件是现成的用生成工具可以快速搭建起基础训练集。相比之下自然场景下的任意文字识别比如街景招牌对生成数据的依赖就要谨慎一些因为背景的复杂度和多样性太高合成数据和真实数据之间的差距会比较明显需要配合更强的域适应手段。2. 数据生成工具的核心工作链路拆解2.1 从文字语料到渲染参数的完整流程一个完整的数据生成流程大致可以拆成五个环节每个环节都有不少细节值得说。第一个环节是语料准备。你需要一份文字内容库可以是词典、文章、随机字符串也可以是业务场景中提取的高频词表。语料的质量直接决定了生成数据的字符分布。我的习惯是准备多份语料一份是常用字表保证基础覆盖一份是业务词表保证领域相关一份是随机字符保证长尾覆盖按比例混合使用。第二个环节是字体管理。字体文件决定了文字的视觉形态。你需要收集尽可能多的字体包括不同字重、不同风格。这里有个容易忽略的点很多字体文件对某些字符的支持是不完整的渲染时会出现缺字或者豆腐块。所以生成前一定要做字体覆盖度检查把不支持的字符过滤掉。第三个环节是背景准备。背景图决定了文字所处的视觉环境。可以是纯色、渐变、纹理也可以是真实的场景照片。背景的多样性对模型的泛化能力影响很大。第四个环节是渲染合成。这是核心步骤把文字按照指定的字体、颜色、大小渲染到背景上同时施加各种变换和退化。这一步的参数空间非常大后面会专门展开讲。第五个环节是标注输出。生成图片的同时输出对应的标注文件。标注格式要和你的训练框架对齐常见的有文本框坐标加文字内容、字符级坐标加字符等。2.2 文字渲染层字体、字号与排版控制文字渲染层看起来简单实际上有很多讲究。字体选择上我建议至少准备几十种字体覆盖宋体、黑体、楷体、仿宋等常见类别如果有条件还要加入一些艺术字体和手写字体。字体越多模型见到的字形变化越丰富。但要注意字体不是越多越好如果某些字体在真实场景中根本不会出现加进去反而会引入噪声。字号控制要模拟真实场景中的尺度变化。同一个文字在不同图片里可能占据完全不同的像素高度。我的做法是设定一个字号范围比如16到72像素然后在这个范围内随机采样。对于需要识别小文字的场景还要专门生成一批小字号样本。排版方式上横排是最常见的但竖排、斜排、弧形排列在某些场景下也会出现。如果业务涉及这些特殊排版生成时就要对应模拟。另外字间距和行间距也要随机化不能所有图片都用同一个间距。# 文字渲染参数配置示例伪代码结构 render_config { font_dir: ./fonts, # 字体文件目录 font_size_range: (16, 72), # 字号范围 text_color_mode: random, # 文字颜色随机 bg_color_mode: random, # 背景颜色随机 char_spacing_range: (-2, 8), # 字间距范围 line_spacing_range: (0.8, 2.0),# 行间距倍数 layout: [horizontal, vertical], # 排版方向 }2.3 背景合成层如何让文字“长”在真实场景里背景合成是决定生成数据真实感的关键环节。很多人生成的数据一眼就能看出是合成的问题往往出在背景上。纯色背景最简单适合模拟文档、票据这类场景。但即便是纯色也要加入轻微的噪声和渐变否则太干净反而不真实。纹理背景可以用程序生成比如纸张纹理、布料纹理、金属纹理。这类背景适合模拟各种材质表面的文字。真实照片背景效果最好但要注意文字和背景的融合方式。直接把文字贴上去会很突兀需要模拟光照、阴影、透视等效果。我的经验是文字的颜色要和背景的局部区域形成足够的对比度否则模型学不到有效的特征。还有一个容易被忽略的点是背景和文字的语义一致性。比如你在一个餐厅招牌的背景上渲染一段法律条文虽然技术上没问题但这种组合在真实场景中几乎不会出现对模型训练没有正面帮助。尽量让背景和文字内容在语义上匹配。2.4 退化增强层模糊、噪声、畸变的参数化模拟退化增强是让生成数据逼近真实拍摄效果的关键。真实图片中的文字往往伴随着各种退化。模糊是最常见的退化。运动模糊、高斯模糊、散焦模糊对应的物理成因不同视觉效果也不同。我通常会用高斯模糊模拟失焦用线性核模拟运动模糊模糊强度在一定范围内随机。噪声方面高斯噪声、椒盐噪声、泊松噪声都要覆盖。噪声强度不能太大否则文字完全不可辨认这种样本对训练没有意义。我的做法是控制信噪比在一个合理区间保证文字仍然可读。几何畸变包括旋转、缩放、透视变换、弹性形变等。透视变换对模拟手机拍摄文档的场景特别重要。弹性形变则适合模拟纸张褶皱、曲面上的文字。光照变化包括亮度调整、对比度调整、局部阴影、高光等。真实场景中光照不均是非常普遍的现象生成数据必须覆盖这种情况。退化类型模拟手段参数建议适用场景模糊高斯核/线性核卷积核大小3-15失焦、运动拍摄噪声加性高斯/椒盐信噪比15-40dB低质量摄像头旋转仿射变换角度-15到15度拍摄角度偏差透视透视变换角点偏移0-10%手机拍文档光照亮度/对比度/阴影亮度±30%光照不均压缩JPEG压缩质量因子30-90网络传输图片3. 手把手搭建一套可用的生成流水线3.1 环境准备与依赖选择搭建生成流水线技术栈的选择比较灵活。核心需求是图像处理和文字渲染能力。图像处理库方面OpenCV是最常用的选择功能全面性能也不错。Pillow在文字渲染上更方便一些两者可以配合使用。如果涉及更复杂的图像变换可以考虑用Albumentations它的增强操作非常丰富。文字渲染主要靠Pillow的ImageDraw模块或者用FreeType库直接操作字体文件。Pillow的接口更友好适合快速开发。并行加速方面如果生成量很大单进程会非常慢。可以用多进程并行把生成任务分配到多个CPU核心上。我实测下来用8核并行生成速度大概能提升6到7倍。# 依赖安装示例 pip install opencv-python pillow numpy albumentations tqdm环境准备好之后建议先写一个最小可运行的demo生成几张图片看看效果确认字体加载、文字渲染、图片保存这些基础环节都正常再往上叠加复杂功能。3.2 语料与字体库的组织方式语料的组织我习惯用分层结构。最底层是字符集包含所有需要支持的字符。往上一层是词表由字符组合而成。再往上是句子和段落。字符集要仔细整理把中文、英文、数字、标点符号都包含进去。如果有特殊符号需求也要提前加进去。字符集确定之后要检查每个字体文件对这些字符的覆盖情况生成一份字体-字符支持矩阵。# 字体覆盖度检查伪代码 from PIL import ImageFont def check_font_coverage(font_path, charset): font ImageFont.truetype(font_path, size32) unsupported [] for char in charset: # 通过渲染测试判断字体是否支持该字符 if not font_has_glyph(font, char): unsupported.append(char) return unsupported字体库的组织上我建议按类别分目录存放比如fonts/宋体/、fonts/黑体/、fonts/手写/。每个目录下放对应的字体文件。生成时按类别采样可以控制不同风格字体的出现比例。语料和字体都准备好之后还要做一次交叉验证随机抽取若干字符和字体组合实际渲染出来看看效果确认没有明显的渲染异常。3.3 生成脚本的核心参数配置生成脚本的参数配置是整个流水线的灵魂。参数设得好生成的数据质量高参数设得不好生成的数据要么太简单没价值要么太离谱没法用。我把参数分成几组来管理。内容参数控制生成什么文字包括语料来源、文本长度范围、字符集范围。样式参数控制文字长什么样包括字体、字号、颜色、粗细。背景参数控制文字所处的环境包括背景类型、背景颜色、纹理强度。退化参数控制图片的质量包括模糊、噪声、畸变、光照。输出参数控制生成结果的格式包括图片尺寸、标注格式、保存路径。# 生成配置示例伪代码结构 generation_config { content: { corpus_files: [./corpus/common.txt, ./corpus/business.txt], text_length_range: (1, 30), charset: chinese_english_digit, }, style: { font_categories: [song, hei, kai], font_size_range: (20, 64), text_color: random_dark, bold_probability: 0.3, }, background: { bg_types: [solid, gradient, texture, photo], bg_dir: ./backgrounds, blend_mode: normal, }, degradation: { blur_probability: 0.5, noise_probability: 0.4, rotate_range: (-10, 10), perspective_probability: 0.3, }, output: { image_size: (640, 640), annotation_format: json, output_dir: ./generated_data, }, }参数配置好之后建议先小批量生成几百张人工检查一下效果。重点看几个方面文字是否清晰可辨、标注是否准确、退化是否合理、背景是否自然。确认没问题再放大批量。3.4 批量生成与质量抽检批量生成的时候有几个工程上的细节要注意。进度监控很重要。生成几万张图片可能需要几个小时没有进度提示会让人很焦虑。用tqdm之类的库加个进度条能清楚看到还剩多少。断点续传也要考虑。万一生成到一半程序崩了不能从头再来。我的做法是每生成一批就记录一个检查点重启时从检查点继续。随机种子管理是个容易被忽略的点。如果每次生成的随机序列不一样复现结果就很困难。建议固定随机种子或者把每次生成的种子记录下来方便后续排查问题。质量抽检方面我通常按1%到5%的比例随机抽样人工检查。检查项包括文字是否正确渲染、标注框是否准确、退化是否过度、背景是否合理。如果发现某类问题占比超过阈值就要调整参数重新生成。一个实用技巧把生成的数据按参数组合分成若干组每组单独抽检。这样能快速定位是哪组参数出了问题而不是在一大堆数据里盲目找。4. 合成数据与真实数据的配比实战4.1 纯合成数据训练的域偏移问题直接用纯合成数据训练模型然后在真实数据上测试你大概率会看到一个明显的性能下降。这个现象叫域偏移本质上是合成数据和真实数据在分布上存在差异。差异体现在很多层面。纹理层面合成图片的文字边缘往往过于锐利真实图片因为光学和传感器的影响边缘会有一定的过渡。噪声层面合成噪声通常是人为添加的分布和真实噪声不一样。背景层面合成背景再多样也比不上真实场景的复杂度。文字形态层面合成文字是字体文件直接渲染的真实文字可能经过印刷、拍摄、压缩等多重环节形态会有微妙变化。我做过一个对比实验同样的模型结构纯合成数据训练后在真实测试集上的准确率比混合数据训练低了大概8到15个百分点。这个差距在业务场景中是不可接受的。4.2 合成与真实数据的最优混合比例混合比例没有绝对的标准需要根据具体任务来调。但有一些经验规律可以参考。真实数据极少的情况下比如只有几百张合成数据的比例可以高一些大概占到70%到80%。这时候合成数据主要起扩充样本量的作用让模型能学到基本的文字特征。真实数据中等的情况下几千张合成数据比例可以降到50%左右。真实数据开始发挥主导作用合成数据作为补充重点覆盖真实数据中缺失的场景。真实数据充足的情况下几万张以上合成数据比例可以进一步降到20%到30%。这时候合成数据主要用于增强长尾样本和极端场景。我的建议是做一个消融实验设置几组不同的混合比例分别训练模型在验证集上对比效果选最优的比例。这个过程虽然费时间但能帮你找到最适合当前任务的配比。真实数据量建议合成比例合成数据主要作用 500张70%-80%扩充基础样本量500-5000张40%-60%补充场景覆盖5000-50000张20%-40%增强长尾和极端场景 50000张10%-20%针对性补充难例4.3 用真实数据反向校准生成参数一个很实用的技巧是用真实数据来反向指导生成参数的设置。具体做法是先分析真实数据的统计特征包括文字尺寸分布、颜色分布、背景亮度分布、模糊程度分布等。然后把这些统计特征作为生成参数的约束条件让生成数据的分布尽量贴近真实数据。比如你发现真实数据中文字高度主要集中在20到40像素之间那生成时就把字号范围设在这个区间附近而不是盲目地设一个很宽的范围。再比如你发现真实数据中大部分图片的对比度都比较高那生成时就要控制退化的强度不要让文字太模糊。# 真实数据统计分析示例伪代码 def analyze_real_data(image_dir): stats { text_height: [], # 文字高度分布 contrast: [], # 对比度分布 brightness: [], # 亮度分布 blur_level: [], # 模糊程度分布 } for img_path in list_images(image_dir): img load_image(img_path) stats[text_height].append(measure_text_height(img)) stats[contrast].append(measure_contrast(img)) stats[brightness].append(measure_brightness(img)) stats[blur_level].append(measure_blur(img)) return compute_distributions(stats)分析完真实数据的分布之后把生成参数往这个分布上靠。这样生成出来的数据和真实数据的差距会小很多域偏移问题也能得到缓解。4.4 迭代式训练生成-训练-评估-再生成数据生成不是一次性的工作而是一个迭代的过程。第一轮用初始参数生成一批数据和真实数据混合训练一个基础模型。然后在验证集上评估看看模型在哪些场景下表现差。针对表现差的场景调整生成参数生成更有针对性的数据。第二轮用新数据继续训练再评估再调整。如此循环几轮模型的效果会逐步提升。这个迭代过程的关键是评估要细。不能只看一个总体准确率要分场景、分字符、分字体去评估。比如你发现模型对手写体的识别率特别低那下一轮就重点生成手写体数据。发现模型对某个生僻字总是识别错就专门生成包含这个字的样本。我通常会把评估结果整理成一张表列出各个维度的表现然后针对性地制定下一轮的生成策略。这样每一轮生成都有明确的目标不会盲目地堆数据。5. 那些年我在数据生成上踩过的坑5.1 生成数据太“干净”导致模型学不到鲁棒特征刚开始做数据生成的时候我追求的是“清晰”。生成的图片文字锐利、背景干净、没有噪声看起来非常漂亮。结果模型训练出来在真实数据上表现一塌糊涂。后来才明白真实场景中的文字从来都不是“干净”的。光照不均、轻微模糊、压缩伪影、背景干扰这些都是常态。模型如果只在干净数据上训练就学不会处理这些干扰。解决办法是主动引入退化。在生成时加入各种退化操作让数据“脏”起来。但退化也要适度不能把文字退化到无法辨认。我的经验是退化的强度要控制在“人眼仍然能轻松识别”的范围内。5.2 字体缺失字符引发的标注错位这个问题很隐蔽但影响很大。某些字体文件对部分字符的支持不完整渲染时会出现两种情况一种是直接不显示另一种是显示成替代符号比如方框。如果生成时没有检测这种情况就会出现标注和实际渲染内容不一致的问题。标注文件里写的是某个字但图片上显示的是方框或者空白。这种数据喂给模型会严重干扰训练。我的解决办法是在生成前做字体覆盖度检查把不支持的字符-字体组合过滤掉。另外生成后也要做一次校验用OCR模型反向识别生成的图片和标注对比把不一致的样本剔除。5.3 背景与文字对比度不足的隐形陷阱文字和背景的对比度直接决定了文字是否可读。但对比度这个东西不是简单的颜色差异还涉及到亮度、饱和度、局部对比度等多个维度。我遇到过一种情况文字是深蓝色背景是深灰色从颜色上看差异挺大但转成灰度图之后两者的亮度非常接近文字几乎看不清。这种样本如果大量存在模型会学到错误的特征。解决办法是在生成时计算文字区域和背景区域的局部对比度低于阈值的样本直接丢弃或者调整颜色重新生成。对比度的计算可以用简单的灰度差值也可以用更复杂的局部对比度度量。5.4 标注格式与训练框架不匹配的返工这个坑说起来有点蠢但确实浪费了我不少时间。生成数据的时候标注格式是自己定的等到要训练的时候才发现训练框架要求的格式完全不一样只能写脚本做格式转换。更麻烦的是有些格式转换是有损的。比如训练框架要求的是字符级标注而你生成的是文本框级标注转换时就需要做字符切分这个过程容易引入误差。所以我的建议是在生成之前就确定好训练框架和标注格式生成脚本直接输出目标格式。如果实在需要转换也要在转换后做校验确保标注信息没有丢失或错位。5.5 生成量过大导致的存储与IO瓶颈数据生成很容易上瘾参数一调几万张图片就出来了。但图片多了之后存储和IO就成了问题。几万张图片占用的磁盘空间可能达到几十GB如果图片分辨率高占用还要翻倍。训练时读取这些图片IO压力也很大如果磁盘速度跟不上GPU就会经常处于等待状态训练效率大幅下降。我的做法是控制单次生成量不要一次性生成太多。另外可以把图片打包成特定的数据格式比如TFRecord、LMDB减少小文件数量提升读取效率。如果条件允许用SSD存储数据IO瓶颈会缓解很多。6. 让生成数据更贴近真实的几个进阶思路6.1 基于真实背景库的融合生成前面提到过背景的真实感对生成数据质量影响很大。一个有效的做法是从真实场景中收集一批背景图片建立背景库生成时从库中随机采样背景。背景库的构建要注意几点。多样性要足够覆盖不同的场景、光照、材质。质量要过关模糊的、损坏的背景图要剔除。版权要清晰确保使用的背景图没有法律风险。文字和背景的融合也有讲究。简单的叠加会显得很假需要模拟一些物理效果。比如文字在纸张上会有轻微的渗透在金属表面会有反光在布料上会有纹理叠加。这些效果可以通过图像处理手段模拟。6.2 用风格迁移缩小合成与真实的差距风格迁移是缩小合成数据和真实数据差距的一个有力工具。核心思路是把合成图片的风格迁移到真实图片的风格上让合成数据看起来更像真实数据。具体做法可以用图像到图像的转换模型学习真实数据的风格特征然后应用到合成数据上。这样生成的图片既保留了合成数据的精确标注又具备了真实数据的视觉特征。这个思路实现起来有一定门槛需要训练额外的风格迁移模型。但如果你的任务对数据真实性要求很高这个投入是值得的。6.3 针对难例的定向生成策略模型训练到后期大部分简单样本已经学得很好了瓶颈往往在少数难例上。这时候定向生成难例数据就很有价值。难例的识别可以通过分析模型的错误样本来完成。把模型识别错误的样本收集起来分析它们的共同特征然后针对这些特征生成数据。比如模型总是把“0”和“O”搞混那就专门生成一批包含这两个字符的样本并且在字体、大小、上下文上做各种变化让模型充分学习它们的区别。再比如模型对倾斜文字识别不好就专门生成大量不同倾斜角度的样本。这种定向生成的策略比盲目扩大数据量要高效得多。每一批生成的数据都有明确的针对性训练效果提升也更明显。6.4 生成数据的自动化质量评估人工抽检虽然有效但效率低而且难以覆盖所有样本。建立一套自动化的质量评估机制能大幅提升效率。自动评估可以从几个维度入手。可读性评估用现有的OCR模型反向识别生成图片识别结果和标注的相似度作为可读性指标。对比度评估计算文字区域和背景区域的对比度低于阈值的标记为可疑样本。标注一致性评估检查标注框和实际文字区域的重合度偏差过大的标记出来。把这些评估指标综合起来给每个生成样本打一个质量分。训练时可以根据质量分做样本加权质量高的样本权重高质量低的样本权重低或者直接丢弃。# 自动化质量评估示例伪代码 def evaluate_sample_quality(image, annotation): score {} # 可读性用OCR模型反向识别 ocr_result ocr_model.recognize(image) score[readability] compute_similarity(ocr_result, annotation[text]) # 对比度文字区域和背景区域的对比度 score[contrast] compute_local_contrast(image, annotation[bbox]) # 标注一致性标注框和文字区域的重合度 score[consistency] compute_iou(annotation[bbox], detect_text_region(image)) # 综合评分 score[overall] weighted_average(score) return score这套机制建立起来之后数据生成的质量控制就变得可量化、可自动化了。每次生成完一批数据跑一遍评估把低质量样本过滤掉剩下的高质量数据用于训练。7. 一些实操中的经验碎片关于文字颜色我踩过一个坑如果文字颜色和背景颜色都完全随机会生成大量对比度极低的样本。后来改成文字颜色从深色系采样、背景从浅色系采样或者反过来对比度问题就缓解了很多。关于字体大小不要只用一个固定值。真实场景中文字大小变化很大生成时字号范围要足够宽。但也不能太宽否则会出现文字小到看不清的情况。我的经验是字号范围控制在3到4倍以内比较合适。关于生成速度如果单进程生成太慢可以用多进程。但要注意每个进程要独立加载字体和背景资源避免资源竞争。另外写文件的时候要注意避免文件名冲突可以用进程ID加序号的方式命名。关于数据存储小文件太多会影响训练时的读取效率。可以考虑把生成的图片和标注打包成二进制格式训练时顺序读取速度会快很多。关于版本管理每次调整生成参数都要记录参数配置和对应的生成数据。否则时间一长你自己都忘了哪批数据是用什么参数生成的。我习惯用配置文件加时间戳的方式管理每次生成都保存一份配置副本。关于验证集千万不要用生成数据做验证集。验证集必须用真实数据否则你评估出来的效果是虚高的上线后会出大问题。生成数据可以用来做训练集的增强但验证和测试必须用真实数据。关于迭代节奏不要指望一次生成就能解决问题。数据生成是一个持续迭代的过程根据模型的表现不断调整生成策略才能逐步逼近理想效果。我一般会预留出至少三轮迭代的时间。关于团队协作如果有多个人参与数据生成一定要统一参数配置和标注格式。否则每个人生成的数据风格不一致混在一起训练反而会互相干扰。建议制定一份数据生成规范文档所有人都按规范执行。