识别模型
识别模型
omr.model 定义了识别结果的结构:RecognitionResult 和 IOmrElement 接口。
RecognitionResult
TemplateProcessor.Recognize() 返回一个 RecognitionResult。它公开 OmrElements(已识别元素的列表),以及 ImagePath、Images、PageName 和 TemplateName。在结果层面,GetCsv(encoding)、GetJson(encoding) 和 GetXml(encoding) 导出完整结果;每个都有对应的 ...AsStream 变体,返回一个 BytesIO。
from omr.api import OmrEngine, FormValidationLogic
engine = OmrEngine()
processor = engine.GetTemplateProcessor("out/final-exam.omr", FormValidationLogic.Ignore)
result = processor.Recognize("scan.png")
print(result.GetJson())IOmrElement
每个 RecognitionResult.OmrElements 条目实现了 IOmrElement:QuestionName 和 SortWeight 用于标识元素,GetAnswer() / GetCsv() 用于读取其识别值。
for element in result.OmrElements:
print(element.QuestionName, element.GetAnswer())技巧与最佳实践
- 读取
QuestionName将已识别的元素匹配回其来源的问题,而不是依赖列表顺序。 - 在将结果写入非文件系统目标时,使用
...AsStream的导出变体(GetCsvAsStream、GetJsonAsStream、GetXmlAsStream)。 TemplateProcessor.Recalculate()会就地更新已有的RecognitionResult——随后重新读取OmrElements,而不是保留重新计算前的引用。
常见问题
| 问题 | 原因 | 修复 |
|---|---|---|
| 元素的答案是空字符串 | 识别阈值对该标记来说过于严格,或者 Recalculate() 被以一个不可能的严格值调用 | 降低阈值,或将 -100 传递给 Recognize() 进行自动校准 |
FAQ
对于未标记的问题,GetAnswer() 返回什么?
空字符串——这与 Recalculate() 在更严格阈值拒绝所有标记时产生的表示相同。
我可以只导出部分元素而不是整个结果吗?
RecognitionResult的 GetCsv/GetJson/GetXml 导出完整结果;如果需要子集,请先自行过滤 OmrElements。
API Reference 摘要
| 类/方法 | 描述 |
|---|---|
RecognitionResult.OmrElements | 已识别的 IOmrElement 条目列表 |
RecognitionResult.GetCsv / GetJson / GetXml | 导出完整结果 |
IOmrElement.GetAnswer / GetCsv | 每个元素的已识别值 |