PaddleOcr fastdeploy 识图脚本
修改自官方示例,舍弃命令行模式,改为脚本传参
import time
import fastdeploy as fd
import cv2
import os
# device推理设备,参数 cpu/gpu
# device_id设备编号,默认参数 0
# backend推理模型,参数pplite openvino ort paddle pptrt trt||PPLite,OenVINO,PPInference,ONNXRuntime,PPTensorRT,NvTensorRT
# cls_bs,Classification model inference batch size,默认参数 1
# rec_bs,Recognition model inference batch size,默认参数 6
# 模型路径 文本框检测det_model, 方向分类模型cls_model, 文字识别rec_model, 字典rec_label_file
# 图像路径 image 默认空
class Args:
def __init__(self):
self.device = 'cpu'
self.backend = 'openvino'
self.det_model = 'ch_PP-OCRv3_det_infer'
self.cls_model = 'ch_ppocr_mobile_v2.0_cls_infer'
self.rec_model = 'ch_PP-OCRv3_rec_infer'
self.rec_label_file = 'ppocr_keys_v1.txt'
self.device_id = 0
self.cls_bs = 1
self.rec_bs = 6
self.image = ''
def build_option(args):
det_option = fd.RuntimeOption()
cls_option = fd.RuntimeOption()
rec_option = fd.RuntimeOption()
if args.device.lower() == "gpu":
det_option.use_gpu(args.device_id)
cls_option.use_gpu(args.device_id)
rec_option.use_gpu(args.device_id)
if args.backend.lower() == "trt":
assert args.device.lower(
) == "gpu", "TensorRT backend require inference on device GPU."
det_option.use_trt_backend()
cls_option.use_trt_backend()
rec_option.use_trt_backend()
# If you use TRT backend, the dynamic shape will be set as follows.
# We recommend that users set the length and height of the detection model to a multiple of 32.
# We also recommend that users set the Trt input shape as follows.
det_option.set_trt_input_shape("x", [1, 3, 64, 64], [1, 3, 640, 640],
[1, 3, 960, 960])
cls_option.set_trt_input_shape("x", [1, 3, 48, 10],
[args.cls_bs, 3, 48, 320],
[args.cls_bs, 3, 48, 1024])
rec_option.set_trt_input_shape("x", [1, 3, 48, 10],
[args.rec_bs, 3, 48, 320],
[args.rec_bs, 3, 48, 2304])
# Users could save TRT cache file to disk as follow.
det_option.set_trt_cache_file(args.det_model + "/det_trt_cache.trt")
cls_option.set_trt_cache_file(args.cls_model + "/cls_trt_cache.trt")
rec_option.set_trt_cache_file(args.rec_model + "/rec_trt_cache.trt")
elif args.backend.lower() == "pptrt":
assert args.device.lower(
) == "gpu", "Paddle-TensorRT backend require inference on device GPU."
det_option.use_paddle_infer_backend()
det_option.paddle_infer_option.collect_trt_shape = True
det_option.paddle_infer_option.enable_trt = True
cls_option.use_paddle_infer_backend()
cls_option.paddle_infer_option.collect_trt_shape = True
cls_option.paddle_infer_option.enable_trt = True
rec_option.use_paddle_infer_backend()
rec_option.paddle_infer_option.collect_trt_shape = True
rec_option.paddle_infer_option.enable_trt = True
# If use TRT backend, the dynamic shape will be set as follow.
# We recommend that users set the length and height of the detection model to a multiple of 32.
# We also recommend that users set the Trt input shape as follow.
det_option.set_trt_input_shape("x", [1, 3, 64, 64], [1, 3, 640, 640],
[1, 3, 960, 960])
cls_option.set_trt_input_shape("x", [1, 3, 48, 10],
[args.cls_bs, 3, 48, 320],
[args.cls_bs, 3, 48, 1024])
rec_option.set_trt_input_shape("x", [1, 3, 48, 10],
[args.rec_bs, 3, 48, 320],
[args.rec_bs, 3, 48, 2304])
# Users could save TRT cache file to disk as follow.
det_option.set_trt_cache_file(args.det_model)
cls_option.set_trt_cache_file(args.cls_model)
rec_option.set_trt_cache_file(args.rec_model)
elif args.backend.lower() == "ort":
det_option.use_ort_backend()
cls_option.use_ort_backend()
rec_option.use_ort_backend()
elif args.backend.lower() == "paddle":
det_option.use_paddle_infer_backend()
cls_option.use_paddle_infer_backend()
rec_option.use_paddle_infer_backend()
elif args.backend.lower() == "openvino":
assert args.device.lower(
) == "cpu", "OpenVINO backend require inference on device CPU."
det_option.use_openvino_backend()
cls_option.use_openvino_backend()
rec_option.use_openvino_backend()
elif args.backend.lower() == "pplite":
assert args.device.lower(
) == "cpu", "Paddle Lite backend require inference on device CPU."
det_option.use_lite_backend()
cls_option.use_lite_backend()
rec_option.use_lite_backend()
return det_option, cls_option, rec_option
args = Args()
det_model_file = os.path.join(args.det_model, "inference.pdmodel")
det_params_file = os.path.join(args.det_model, "inference.pdiparams")
cls_model_file = os.path.join(args.cls_model, "inference.pdmodel")
cls_params_file = os.path.join(args.cls_model, "inference.pdiparams")
rec_model_file = os.path.join(args.rec_model, "inference.pdmodel")
rec_params_file = os.path.join(args.rec_model, "inference.pdiparams")
rec_label_file = args.rec_label_file
det_option, cls_option, rec_option = build_option(args)
det_model = fd.vision.ocr.DBDetector(
det_model_file, det_params_file, runtime_option=det_option)
cls_model = fd.vision.ocr.Classifier(
cls_model_file, cls_params_file, runtime_option=cls_option)
rec_model = fd.vision.ocr.Recognizer(
rec_model_file, rec_params_file, rec_label_file, runtime_option=rec_option)
# Parameters settings for pre-processing and post-processing of Det/Cls/Rec Models.
# All parameters are set to default values.
det_model.preprocessor.max_side_len = 960
det_model.postprocessor.det_db_thresh = 0.3
det_model.postprocessor.det_db_box_thresh = 0.6
det_model.postprocessor.det_db_unclip_ratio = 1.5
det_model.postprocessor.det_db_score_mode = "slow"
det_model.postprocessor.use_dilation = False
cls_model.postprocessor.cls_thresh = 0.9
# Create PP-OCRv3, if cls_model is not needed, just set cls_model=None .
ppocr_v3 = fd.vision.ocr.PPOCRv3(
det_model=det_model, cls_model=cls_model, rec_model=rec_model)
# Set inference batch size for cls model and rec model, the value could be -1 and 1 to positive infinity.
# When inference batch size is set to -1, it means that the inference batch size
# of the cls and rec models will be the same as the number of boxes detected by the det model.
ppocr_v3.cls_batch_size = args.cls_bs
ppocr_v3.rec_batch_size = args.rec_bs
# Read the input image
args.image = '12.jpg'
im = cv2.imread(args.image)
# Predict and return the results
result = ppocr_v3.predict(im)
# print(result)
# Visualize the results.
vis_im = fd.vision.vis_ppocr(im, result)
cv2.imwrite("visualized_result.jpg", vis_im)
print("Visualized result save in ./visualized_result.jpg")
#以下为个人测试
# 数组输出
trust_result = []
for i in range(0, len(result.boxes)):
print(result.cls_labels[i] == 0, result.cls_scores[i] > 0.6, result.rec_scores[i] > 0.6)
if result.cls_labels[i] == 0 and result.cls_scores[i] > 0.6 and result.rec_scores[i] > 0.6:
trust_result.append([(result.boxes[i], result.text[i])])
for i in trust_result:
print(i)
#100次测试
for i in range(0, 100):
time_start = time.time()
im = cv2.imread(args.image)
# Predict and return the results
result = ppocr_v3.predict(im)
# Visualize the results.
# vis_im = fd.vision.vis_ppocr(im, result)
# cv2.imwrite("visualized_result.jpg", vis_im)
# 单次耗时
time_end = time.time() - time_start
print(str(i + 1) + "_used_time : " + str(time_end))
Recent
Popular
- [工作] 无法建立计算机与VPN服务器之间的
- [Windows] Windows Server 2016
- [运维开发] 桃乐豆 - 中文WOW插件加速源
- [艺术] 至高强者十三阶
- [Windows] Windows Server 2019
- [WindowsPE] Sergei Strelec WinPE
- [Windows] Windows 7
- [学习] NovelAI模型大全分享
- [Windows] Windows 10
- [游戏] Realm Grinder - 放置游戏个人攻略
- [Windows] Windows Server 2008
- [工作] 此平台不支持虚拟化的Intel VT-x/E
- [Windows] Windows 8.1
- [Windows] Windows Server 2012