前言
昨天实现了在PHP中调用Python并获取运行结果。
今天又遇到了一个新问题:如果不以PaddleHub
服务的形式运行PaddleOCR
,PHP
很难直接且高效地调用PaddleOCR
。
考虑到Python
的灵活性和系统的高效及安全性,不如直接通过它作为中间件调用Shell
进而完成对PaddleOCR
的调用。
同时可以很方便的通过其完成智能算法的设计,最终以Json
的形式将识别及预测结果返回给PHP
。
在Python
执行Shell
并获取结果时,可谓踩遍了诸多大坑(尤其是编码问题)。
本文将记录最终的结果以方便后续查阅。
成果
以下是本人的成果,如果有大佬发现bug
或有更好的主意,还望不吝赐教。
class PPOCr(): # 调用PaddleOCR,方法内获取文件名并完成识别返回识别结果
def Init(): # 将方法内获取的文件名与img路径拼接在一起调用执行OCR的方法
imageName = sys.argv[1] # 从系统调用参数中获取文件名,正式使用
# imageName = input('请输入'+imagePath+'目录下要识别图片的文件名:') # 要求手动输入文件名,测试使用
imageFullName = imagePath + imageName
return PPOCr.startOcr(imageFullName)
def startOcr(imageFullName): # 执行OCR并返回文字识别结果
# 切换目录到PaddleOCR运行目录
cmd1 = "cd " + PPOCrPath
# 调用文字识别模型指令
cmd2 = 'python tools/infer/predict_system.py --image_dir="' + imageFullName + \
'" --det_model_dir="./inference/ch_PP-OCRv2_det_infer/ch_PP-OCRv2_det_infer/" --rec_model_dir="./inference/ch_PP-OCRv2_rec_infer/ch_PP-OCRv2_rec_infer/" --cls_model_dir="./inference/ch_ppocr_mobile_v2.0_cls_infer/" --use_angle_cls=True --use_space_char=True --use_gpu=False'
# 最终指令
cmd = cmd1 + " && " + cmd2
# 执行最终指令
str = os.popen(cmd)
response = str.buffer.read().decode('gbk', "ignore") # 正式使用(通过参数调用需要gbk编码)
# response = str.buffer.read().decode(
# 'utf-8', "ignore") # 测试使用(直接在VSCode中执行需要utf-8编码)
# print(response) # 输出结果(测试使用)
return response
参考资料:
https://blog.csdn.net/blueheart20/article/details/78794847
https://blog.csdn.net/wang7807564/article/details/78164855
https://blog.51cto.com/zhou123/1312791
https://blog.csdn.net/xmm12508/article/details/117510201
https://blog.csdn.net/qq_27825451/article/details/102909772
https://blog.csdn.net/xiojing825/article/details/78207862
https://www.cxyzjd.com/article/jaket5219999/117066442
https://blog.csdn.net/weixin_42826790/article/details/110283986
https://blog.csdn.net/wanglei_storage/article/details/54615952
https://www.cnblogs.com/pengpp/p/9833349.html
版权属于:soarli
本文链接:https://blog.soarli.top/archives/609.html
转载时须注明出处及本声明。