有个业务场景,需要审核文件有没有签字按手印。
常规的 OCR 服务可以识别印章,但通常判断不了有没有签字和指纹。客户使用的 OCR 服务就没有这项功能,这时候就需要自己动手了。
不过现在 CV 已经相当成熟了,很多的预训练模型,不需要自己从头开始。
注:CV 工程师可不是你以为的 Ctrl+C Ctrl+V 的工程师
作为分享,咱们直接使用 ultralytics 来实现(注意查看 LICENSE)。
使用 Ultralytics 的 YOLO v10 从头微调一个项目,需要遵循以下几个步骤:
首先,收集包含捺印签字的文档图像。确保数据集多样化,包括不同的捺印签字样式、大小、颜色、背景、光照条件等,以提高模型的泛化能力。
使用标注工具(如 Label Studio)为捺印签字进行标注。YOLO 使用的是 YOLO 格式 的标注文件,即每个图像对应一个 .txt 文件,其中包含了目标的类别和边界框信息。
Label Studio 的安装使用也很方便,直接看官方文档就可以了。需要注意的是,第一次使用需要注册一下。
将图像和标注文件组织成以下目录结构:
datasets/
├── sign_dataset/
│ ├── images/
│ │ ├── train/
│ │ │ ├── img1.jpg
│ │ │ ├── img2.jpg
│ │ ├── val/
│ │ │ ├── img3.jpg
│ ├── labels/
│ │ ├── train/
│ │ │ ├── img1.txt
│ │ │ ├── img2.txt
│ │ ├── val/
│ │ │ ├── img3.txt
在 Python 环境中安装 Ultralytics 库:
pip install ultralytics
在 YOLO 项目中,可以使用 .yaml 文件来配置训练。新建一个配置文件 sign.yaml,内容如下:
train: ./datasets/sign_dataset/images/train # 训练数据集路径
val: ./datasets/sign_dataset/images/val # 验证数据集路径
nc: 1 # 类别数量,捺印签字只有一个类别
names: ['sign'] # 类别名称
通常我们会加载一个预训练的 YOLOv10 模型,以加快收敛速度。如果需要从头训练,可以使用 --weights '' 来指定不加载预训练权重。
使用 Ultralytics 提供的命令行接口进行训练:
from ultralytics import YOLO
# 初始化模型(可以从预训练模型开始)
model = YOLO('yolov10n.pt') # 如果要从头训练,可以使用 YOLO()
# 开始训练
model.train(data='sign.yaml', epochs=100, batch=16, imgsz=640)
epochs=100:训练的轮数。batch=16:批次大小,根据硬件性能调整。imgsz=640:输入图像尺寸。训练完成后,使用验证集来评估模型的性能:
model.val()
这将输出模型在验证集上的平均精度(mAP)、召回率等指标。
使用训练好的模型对新图像进行推理,识别文档中的捺印签字:
results = model.predict(source='path_to_document_image.jpg')
results 包含了预测的类别、边界框、置信度等信息。
训练完成后,可以将模型导出为 ONNX 或 TensorRT 格式,以便于部署:
model.export(format='onnx') # 导出为 ONNX 格式
如果模型的性能不满足需求,可以考虑以下方法进行微调和优化:
(这回不能说我又水一篇了吧……)