# OCR 模型训练 - 快速参考卡 ## 🎯 何时需要训练? ### ✅ 需要训练 - 工业特殊字体 - 手写体识别 - 艺术字/装饰字体 - 特殊符号 - 要求极高准确率(>98%) ### ❌ 不需要训练 - 标准印刷体 - 通用场景 - 准确率 >90% 即可满足 --- ## 📋 训练流程速查 ``` 准备数据 → 预处理 → 标注 → 生成Box → 训练 → 测试 → 部署 ``` ### 1️⃣ 准备数据(100-500张图片) ``` 要求: ✓ 覆盖所有字符 ✓ 不同光照、角度 ✓ 代表性样本 ✓ 清晰度高(≥300 DPI) ``` ### 2️⃣ 预处理图片 ```csharp OCRTrainingHelper.PreprocessTrainingImages( @"raw_images\", // 输入 @"processed_images\", // 输出 targetWidth: 800 // 宽度 ); ``` ### 3️⃣ 创建标注文件 ``` 为每张图片创建同名 .txt 文件 sample001.png → sample001.txt (内容: "ABC123") sample002.png → sample002.txt (内容: "DEF456") ``` ### 4️⃣ 验证数据集 ```csharp OCRTrainingHelper.ValidateDataset(@"processed_images\"); // 确保每张图片都有对应的 .txt 文件 ``` ### 5️⃣ 分析字符频率 ```csharp OCRTrainingHelper.AnalyzeCharacterFrequency(@"labels\"); // 了解字符分布,优化白名单 ``` ### 6️⃣ 生成训练脚本 ```csharp OCRTrainingHelper.GenerateTrainingScript( "myfont", // 字体名称 @"train.bat" // 输出脚本 ); ``` ### 7️⃣ 执行训练 ```bash 双击运行 train.bat 等待训练完成 生成 myfont.traineddata ``` ### 8️⃣ 部署使用 ``` 1. 将 myfont.traineddata 放入 tessdata 文件夹 2. 代码中使用: */ var engine = OCREngine.GetInstance("myfont"); var result = engine.RecognizeText("test.png"); /* --- ## 🛠️ 训练工具 ### jTessBoxEditor(推荐) **下载**: https://sourceforge.net/projects/vietocr/files/jTessBoxEditor/ **功能**: - 合并 TIFF 文件 - 可视化标注校正 - Box 文件编辑 **使用步骤**: 1. Tools → Merge TIFF → 生成 .tif 2. Box Editor → Open → 加载 .tif 3. 逐张检查并修正标注框 4. Save → 生成 .box 文件 ### Tesseract 命令行 ```bash tesseract image.tif output batch.nochop makebox tesseract image.tif output nobatch box.train unicharset_extractor output.box shapeclustering -F unicharset -O unicharset output.tr mftraining -F unicharset -U unicharset -O font.unicharset output.tr cntraining output.tr combine_tessdata font. ``` --- ## 📊 训练参数建议 ### 样本数量 | 场景 | 最少样本 | 推荐样本 | |------|---------|---------| | 简单(数字) | 50 | 100-200 | | 中等(字母+数字) | 100 | 200-500 | | 复杂(中文) | 200 | 500-1000 | | 手写体 | 500 | 1000+ | ### 图片规格 - **分辨率**: 300 DPI(最低 200 DPI) - **格式**: PNG(无损) - **尺寸**: 宽度 800px(高度自动) - **颜色**: 灰度或二值 ### 训练时间估算 | 样本数 | 估计时间 | |--------|---------| | 100 | 5-10 分钟 | | 500 | 20-30 分钟 | | 1000 | 40-60 分钟 | --- ## ✅ 训练检查清单 ### 训练前 - [ ] 收集足够的样本图片 - [ ] 图片质量符合要求 - [ ] 创建标注文件(.txt) - [ ] 验证数据集完整性 - [ ] 分析字符频率 ### 训练中 - [ ] 正确安装 Tesseract 训练工具 - [ ] 设置正确的字体名称 - [ ] 按顺序执行训练步骤 - [ ] 监控训练日志,无错误 ### 训练后 - [ ] 生成的 .traineddata 文件大小合理 - [ ] 在测试集上验证准确率 - [ ] 与原有模型对比效果 - [ ] 部署到生产环境前充分测试 --- ## 🔍 常见问题 ### Q1: 训练失败,报错 "box file not found" **解决**: 确保 .box 文件与 .tif 文件同名且在同一目录 ### Q2: 训练后准确率没有提升 **可能原因**: - 样本数量不足 - 样本质量差 - 标注错误 - 字符覆盖不全 **解决**: - 增加样本数量 - 提高图片质量 - 仔细检查标注 - 补充缺失字符的样本 ### Q3: 训练时间太长 **优化**: - 减少样本数量(保持代表性) - 降低图片分辨率 - 使用更快的 CPU - 并行处理(如果支持) ### Q4: 如何评估训练效果? **方法**: 1. 准备独立的测试集(不参与训练) 2. 分别用原模型和新模型识别 3. 对比准确率和置信度 4. 统计误识别案例 --- ## 💡 训练技巧 ### 提高准确率 1. **多样化样本** - 不同角度、光照、背景 2. **高质量标注** - 人工校对,避免错误 3. **字符平衡** - 确保每个字符有足够样本 4. **迭代训练** - 根据错误案例补充样本 ### 加速训练 1. **精简字符集** - 只包含需要的字符 2. **优化图片** - 适当降低分辨率 3. **批量处理** - 使用脚本自动化 4. **硬件升级** - 更快的 CPU/SSD ### 调试技巧 1. **小样本测试** - 先用 10-20 张测试流程 2. **查看日志** - 关注警告和错误信息 3. **可视化检查** - 用 jTessBoxEditor 查看标注 4. **对比测试** - 与原模型对比效果 --- ## 📚 进阶资源 ### 官方文档 - [Tesseract Training Guide](https://github.com/tesseract-ocr/tesseract/wiki/TrainingTesseract) - [Tesseract Data Files](https://github.com/tesseract-ocr/tessdata) ### 工具下载 - [jTessBoxEditor](https://sourceforge.net/projects/vietocr/files/jTessBoxEditor/) - [Tesseract Installer](https://github.com/UB-Mannheim/tesseract/wiki) ### 在线平台 - [Transkribus](https://transkribus.eu/) - 适合手写体 - [OCR-D](https://ocr-d.de/) - 现代化训练流程 --- ## 🎯 快速命令参考 ### 创建训练项目 ```csharp OCRTrainingHelper.CreateSampleProject(@"D:\MyProject"); ``` ### 批量预处理 ```csharp OCRTrainingHelper.PreprocessTrainingImages( @"input\", @"output\", 800, 0); ``` ### 生成标注(示例) ```csharp var labels = new Dictionary { {"sample001", "ABC123"}, {"sample002", "DEF456"} }; OCRTrainingHelper.GenerateLabelFiles(@"images\", labels); ``` ### 验证数据集 ```csharp var missing = OCRTrainingHelper.ValidateDataset(@"data\"); ``` ### 分析字符 ```csharp var freq = OCRTrainingHelper.AnalyzeCharacterFrequency(@"labels\"); ``` ### 生成脚本 ```csharp OCRTrainingHelper.GenerateTrainingScript("myfont", @"train.bat"); ``` --- **训练愉快!** 🎉 *提示:训练是一个迭代过程,不断优化才能获得最佳效果*