手写识别技术,也被称作手写光学字符识别(HWR)或手写文本识别(HTR),是一种将手写文本转换为机器可读格式的技术。这种技术因其速度快、效率高,减少了对人工数据输入的依赖,从而在多个领域得到广泛应用。与OCR技术相似,手写识别技术旨在将文本的视觉表现形式转换为数字形式,但OCR主要关注印刷文本,这通常更容易识别和转录。
手写识别技术在需要将手写文本转换为机器可读格式以处理信息的场景中得到应用。以下是一些常见的手写识别技术应用案例。
在文档处理领域,手写识别技术被广泛应用于地址识别、支票处理、表格处理和笔记数字化等方面。例如,美国邮政服务(USPS)通过使用手写识别技术,一年内节省了高达9000万美元的处理成本。此外,手写识别技术还被用于更高级的应用场景,如处理表格和数字化笔记。
在零售和物流行业,员工通常更倾向于使用纸质表格和发票,而不是将信息输入到电脑或移动设备中。然而,当涉及到需要存储的信息时,机器可读文本提供了一种成本更低、更易于分析和计算的替代方案。
教育领域也从手写信息即时转换为数字文本中受益。手写识别技术被用于数字化历史文档以供研究、扫描讲座笔记以提高可访问性,以及转录书面问题。
OCR和手写识别技术有着相似的历史,都源于基本的模式识别系统。尽管OCR技术的进步对手写识别技术有所帮助,反之亦然,但人类手写风格的极大差异性和整洁度为识别一致的模式带来了挑战。然而,随着深度学习和机器学习策略的进步,以及在新的OCR和手写识别实现中引入了变换器,基于深度学习的模型已成为手写识别领域的最新技术。
手写识别解决方案的选择范围广泛,从多模态大型语言模型(LMMs)到云API提供商,再到本地运行的软件包或GitHub项目,甚至可以创建自己的解决方案,使用自定义数据集。有了这么多选项,可以构建适合用例的应用程序。让深入了解这些选项,以便了解哪种可能最适合用例。
尽管多模态大型模型并未特别宣传其手写识别能力,但类似于它们在OCR任务中的出色表现,如OpenAI的GPT-4 Vision、Anthropic的Claude 3和Google Gemini等LMMs都显示出了执行HTR任务的能力。
除了LMMs,还有许多API提供商提供手写识别服务。这些例子包括Amazon Web Services Textract、Google Document AI、Microsoft Azure的Cognitive Services、Pen2Txt和Rossum等。
虽然LMMs和API提供了良好的解决方案,但在设备上本地运行手写识别可以消除使用托管服务的每次使用或月度成本,并且具有在没有互联网连接的情况下本地使用的好处。一些在手写识别方面显示出前景的软件包和GitHub项目包括TrOCR、SimpleHTR和Laia等。
通过国际文档分析与识别会议(ICDAR)等竞赛以及其他HTR领域的努力,有相当多的数据集可用。这些数据集包括多行手写数学表达式的识别竞赛、国际模式识别协会技术委员会11的数据集列表、手写表格数据集和手写数学方程式数据集等。
现在已经回顾了手写识别技术的用途和使用选项,以及如何使用从多模态模型到API提供商和开源软件包和项目的手写识别,将通过一个示例用例来说明如何使用对象检测与手写识别结合,创建一个全面的手写识别系统。例如,从银行支票中提取信息。将使用一个示例图像。
from inference_sdk import InferenceHTTPClient
from google.colab import userdata
CLIENT = InferenceHTTPClient(
api_url="https://detect.roboflow.com",
api_key="*ROBOFLOW_API_KEY*"
)
result = CLIENT.infer(image, model_id="chequemodel/1")
一旦运行了预测,可以裁剪然后对裁剪的选择运行TrOCR:
# 裁剪图像
class_list = detections.data["class_name"]
name_detection = detections[class_list == "Payee_Name"]
name_image = sv.crop_image(image,name_detection.xyxy[0].tolist())
amount_detection = detections[class_list == "Amount_In_Numbers"]
amount_image = sv.crop_image(image,amount_detection.xyxy[0].tolist())
# 运行OCR
name_text = run_trocr(name_image)
amount_text = run_trocr(amount_image)
print("Name:",name_text)
print("Amount:",amount_text)
这将正确提取名称和金额。这个过程可以适应任何使用不同对象检测模型的用例,如表格,或者通过使用自己的数据创建自己的模型。