要将 PaddleOCRX 训练好的模型从部署好的代码中取下来,可以按照以下步骤进行操作:
-
找到保存模型的路径。在 PaddleOCRX 部署代码中,通常会有一段代码用于加载和使用模型。可以查看这段代码中对应的模型路径。
-
将模型文件复制到本地计算机上。可以使用 SCP 命令或其他文件传输工具将模型文件从远程服务器复制到本地计算机上。
-
使用 PaddleOCRX 提供的 API 加载模型。可以使用
paddleocr.OCR
类加载模型,例如:
from paddleocr import PaddleOCR
ocr = PaddleOCR()
# 指定模型路径
ocr = PaddleOCR(det_model_dir='path/to/det_model', rec_model_dir='path/to/rec_model', cls_model_dir='path/to/cls_model')
其中,det_model_dir
、rec_model_dir
和 cls_model_dir
分别指定检测模型、识别模型和分类模型的路径。
- 对加载的模型进行测试。可以使用
ocr.ocr
方法对图片进行文本识别,例如:
result = ocr.ocr('path/to/image.jpg')
print(result)
其中,'path/to/image.jpg'
指定待识别的图像文件路径,result
是识别结果。
迁移学习:
import paddle
from paddleocr import PaddleOCR, draw_ocr
from paddleocr import tools
# 加载预训练模型
pretrained_model = 'path/to/pretrained/model'
ocr = PaddleOCR(det_model_dir=pretrained_model, rec_model_dir=pretrained_model)
# 准备新的数据集
train_dataset = 'path/to/train/data'
test_dataset = 'path/to/test/data'
# 定义微调模型结构
from paddleocr import models
model = models.ocr_system.RecModel(
num_classes=7011,
backbone_type='resnet',
backbone=dict(depth=34),
algorithm='CRNN',
input_shape=[1, 48, 192],
max_text_length=25,
drop_rate=0.5)
# 定义优化器和损失函数
opt = paddle.optimizer.Adam(learning_rate=0.0001)
loss_fn = paddle.nn.loss.CTCLoss(blank=0)
# 定义训练和测试数据读取器
train_reader = tools.reader.ChineseTextRecognizerReader(train_dataset)
test_reader = tools.reader.ChineseTextRecognizerReader(test_dataset)
# 定义训练过程
trainer = paddle.fluid.dygraph.Trainer(paddle.fluid.CUDAPlace(0))
epochs = 10
for epoch in range(epochs):
for batch_id, data in enumerate(train_reader()):
img, label = data
img = paddle.to_tensor(img)
label = paddle.to_tensor(label)
pred = model(img)
loss = loss_fn(pred, label)
loss.backward()
opt.step()
opt.clear_grad()
if batch_id % 100 == 0:
print(f'epoch: {epoch}, batch: {batch_id}, loss: {loss.numpy()[0]}')
# 在验证集上评估模型性能
accs = []
for data in test_reader():
img, label = data
img = paddle.to_tensor(img)
label = paddle.to_tensor(label)
pred = model(img)
preds_size = paddle.to_tensor([pred.shape[1]] * pred.shape[0])
loss = loss_fn(pred, label, preds_size, label.shape[1])
pred_idx = pred.argmax(axis=2)
acc = paddle.metric.accuracy(
input=pred_idx,
label=label,
mask=paddle.cast(label != 0, 'float32'))
accs.append(acc.numpy()[0])
avg_acc = sum(accs) / len(accs)
print(f'epoch: {epoch}, accuracy: {avg_acc}')
# 使用微调后的模型进行文本检测和识别
img_path = 'path/to/image'
result = ocr.ocr(img_path, cls=True)
for line in result:
print(line)
二次训练的模型进行迁移
import paddle
from paddleocr import PaddleOCR, draw_ocr
from paddleocr import tools
# 加载二次训练后的模型参数
params_file_path = 'path/to/params'
params = paddle.load(params_file_path)
# 定义微调模型结构
from paddleocr import models
model = models.ocr_system.RecModel(
num_classes=7011,
backbone_type='resnet',
backbone=dict(depth=34),
algorithm='CRNN',
input_shape=[1, 48, 192],
max_text_length=25,
drop_rate=0.5)
model.set_state_dict(params)
# 定义优化器和损失函数
opt = paddle.optimizer.Adam(learning_rate=0.0001)
loss_fn = paddle.nn.loss.CTCLoss(blank=0)
# 准备新的数据集
train_dataset = 'path/to/train/data'
test_dataset = 'path/to/test/data'
# 定义训练和测试数据读取器
train_reader = tools.reader.ChineseTextRecognizerReader(train_dataset)
test_reader = tools.reader.ChineseTextRecognizerReader(test_dataset)
# 定义训练过程
trainer = paddle.fluid.dygraph.Trainer(paddle.fluid.CUDAPlace(0))
epochs = 10
for epoch in range(epochs):
for batch_id, data in enumerate(train_reader()):
img, label = data
img = paddle.to_tensor(img)
label = paddle.to_tensor(label)
pred = model(img)
loss = loss_fn(pred, label)
loss.backward()
opt.step()
opt.clear_grad()
if batch_id % 100 == 0:
print(f'epoch: {epoch}, batch: {batch_id}, loss: {loss.numpy()[0]}')
# 在验证集上评估模型性能
accs = []
for data in test_reader():
img, label = data
img = paddle.to_tensor(img)
label = paddle.to_tensor(label)
pred = model(img)
preds_size = paddle.to_tensor([pred.shape[1]] * pred.shape[0])
loss = loss_fn(pred, label, preds_size, label.shape[1])
pred_idx = pred.argmax(axis=2)
acc = paddle.metric.accuracy(
input=pred_idx,
label=label,
mask=paddle.cast(label != 0, 'float32'))
accs.append(acc.numpy()[0])
avg_acc = sum(accs) / len(accs)
print(f'epoch: {epoch}, accuracy: {avg_acc}')
# 使用微调后的模型进行文本检测和识别
img_path = 'path/to/image