响应公司号召,开搞 OCR
字符识别, OpenCV
和 Halcon
已经实现了部分功能,是基于机器学习实现的,通过边界计算、分割、识别的 Pipeline
完成字符的识别,但纵观技术大局,深度学习能搞定的事情就不要用机器学习了,于是调研下深度学习框架,找了一遍,发现大家对百度的 PaddleOCR
特别推崇(不排除是用百度搜索引擎调研的),于是乎,干就完了。。。
对于深度学习这门玄学,从我的认知出发,先跑一下吧,如果跑的好,那就成了一半了,然后再考虑搭建 train
的环境,更换自己的数据集,所以,首先一步就是部署,根据官网推出的模型进行部署,所幸,百度的生态非常强大,这个问题他早就考虑到了,所以官网有比较详细的部署教程,而且还是中文的,作为没出过国门的中国人,这一点是值得表扬的,鉴于我比较熟悉c++
和 python
,所以就介绍下 C ++
的部署;
vs 2019 社区版
cmake 3.22.5
opencv 4.x
下载paddleOCR code: paddleocr
下载 interface 预测库专用
下载官方det和rec模型 模型下载
编译
deploy/cpp_inte
下,cmake && make
即可
配置与运行
老实说,这个有点麻烦,因为这套代码用到的 Gflag
,需要读取命令行参数,而这个在 win
下不是很友好,所以,可以修改 args
的默认值,主要修改的参数有:
rec_model_dir, det_model_dir,rec_char_dict_path
,这三个对应的文件都是需要提供的,前两个是下载的,第三个在源码文件中存在,需要改下路径就好,至此,就可以进行识别了。
1:将 opencv
移到 deploy/cpp_infer
下;
2:将 paddle_interface
移到 deploy/cpp_infer
下;
3:修改 deploy/cpp_infer/tools/build.sh
#OPENCV_DIR=your_opencv_dir
LIB_DIR='*/paddle_inference' # your_paddle_inference_dir
# CUDA_LIB_DIR=your_cuda_lib_dir
# CUDNN_LIB_DIR=your_cudnn_lib_dir
# BUILD_DIR=build_vs
BUILD_DIR=build_linux
rm -rf ${BUILD_DIR}
mkdir ${BUILD_DIR}
cd ${BUILD_DIR}
cmake .. \
-DPADDLE_LIB=${LIB_DIR} \
-DWITH_MKL=ON \
-DWITH_GPU=OFF \
-DWITH_STATIC_LIB=OFF \
-DWITH_TENSORRT=OFF \
# -DOPENCV_DIR=${OPENCV_DIR} \
# -DCUDNN_LIB=${CUDNN_LIB_DIR} \
# -DCUDA_LIB=${CUDA_LIB_DIR} \
# -DTENSORRT_DIR=${TENSORRT_DIR} \
make -j
4:修改 cpp_infer
下的 CMakeLists.txt
,使文件编译的时候调用系统的 Opencv
# find_package(OpenCV REQUIRED PATHS ${OPENCV_DIR}/share/OpenCV NO_DEFAULT_PATH)
find_package(OpenCV REQUIRED)
5:把 deploy/external-cmake/auto-log.cmake
中的 L10
repo
改下:
https://gitee.com/Double_V/AutoLog
6: 可以编译 demo
了
sh tools/build.sh
7:下载model
截至目前,源码编译便是可以了;
该源码使用了 gflag
,个人认为这个工具再 win
下不是很友好,所以,需要改下默认值:
修改 args.cpp
L32:DEFINE_string(det_model_dir, "../../../models/ch_PP-OCRv3_det_infer", "Path of det inference model.");
L56:DEFINE_string(rec_model_dir, "../../../models/ch_PP-OCRv3_rec_infer", "Path of rec inference model.");
DeepLearning
的三座大山之一,要想在自己的 PC
上搞,还是有些复杂的;鉴于个人计算机容量与性能有限,后续工作可能会转移到工作站进行,所以,在这里通过 Docker
配置环境:
1:下载镜像 docker pull paddlecloud/paddleocr:2.5-cpu-latest
2:下载代码 git clone https://github.
3:数据准备,可参考官网data
4:进入docker
docker run -it -v /mnt/f/github/:/home/github --shm-size="8G" paddle/paddleocr:V1 /bin/bash
记得把代码挂载哟,同时,我发下官方提供的 docker images
没有安装 py
包,也不知道是不是下载错了,不过可以自己安装下,进入到 PaddleOCR
根目录中,执行 :
pip3 install -r requirements.txt
5:修改 configs
主要修改了data
路径等问题,可以参考原版对比下,在这里不一一讲解了
Global:
debug: false
use_gpu: false
epoch_num: 500 #500
log_smooth_window: 20
print_batch_step: 10
save_model_dir: ./output/v3_en_mobile
save_epoch_step: 3
eval_batch_step: [0, 20] # [0, 2000]
cal_metric_during_train: true
pretrained_model:
checkpoints:
save_inference_dir:
use_visualdl: false
infer_img: doc/imgs_words/ch/word_1.jpg
character_dict_path: ppocr/utils/en_dict.txt
max_text_length: &max_text_length 25
infer_mode: false
use_space_char: true
distributed: true
save_res_path: ./output/rec/predicts_ppocrv3_en.txt
Optimizer:
name: Adam
beta1: 0.9
beta2: 0.999
lr:
name: Cosine
learning_rate: 0.001
warmup_epoch: 5
regularizer:
name: L2
factor: 3.0e-05
Architecture:
model_type: rec
algorithm: SVTR
Transform:
Backbone:
name: MobileNetV3 # MobileNetV1Enhance
scale: 0.5
last_conv_stride: [1, 2]
last_pool_type: avg
Head:
name: MultiHead
head_list:
- CTCHead:
Neck:
name: svtr
dims: 64
depth: 2
hidden_dims: 120
use_guide: True
Head:
fc_decay: 0.00001
- SARHead:
enc_dim: 512
max_text_length: *max_text_length
Loss:
name: MultiLoss
loss_config_list:
- CTCLoss:
- SARLoss:
PostProcess:
name: CTCLabelDecode
Metric:
name: RecMetric
main_indicator: acc
ignore_space: False
# modify
Train:
dataset:
name: SimpleDataSet
data_dir: ./train_data/cosmo_data/ #./train_data/
ext_op_transform_idx: 1
label_file_list:
- train_data/cosmo_data/rec_gt_train.txt # ./train_data/train_list.txt
transforms:
- DecodeImage:
img_mode: BGR
channel_first: false
- RecConAug:
prob: 0.5
ext_data_num: 2
image_shape: [48, 320, 3]
- RecAug:
- MultiLabelEncode:
- RecResizeImg:
image_shape: [3, 48, 320]
- KeepKeys:
keep_keys:
- image
- label_ctc
- label_sar
- length
- valid_ratio
loader:
shuffle: true
batch_size_per_card: 2
drop_last: true
num_workers: 1
Eval:
dataset:
name: SimpleDataSet
data_dir: ./train_data/cosmo_data/ # ./train_data
label_file_list:
- ./train_data/cosmo_data/rec_gt_train.txt # ./train_data/val_list.txt
transforms:
- DecodeImage:
img_mode: BGR
channel_first: false
- MultiLabelEncode:
- RecResizeImg:
image_shape: [3, 48, 320]
- KeepKeys:
keep_keys:
- image
- label_ctc
- label_sar
- length
- valid_ratio
loader:
shuffle: false
drop_last: false
batch_size_per_card: 2
num_workers: 1
6:train
为了方便起见,自己新建了一个 py
脚本,后期可以简单改下就好
# recommended paddle.__version__ == 2.0.0
# python3 -m paddle.distributed.launch --log_dir=./debug/ --gpus '0,1,2,3,4,5,6,7' tools/train.py -c configs/rec/rec_mv3_none_bilstm_ctc.yml
python3 tools/train.py -c configs/rec/PP-OCRv3/en_PP-OCRv3_rec.yml -o Global.pretrained_model=./pretrain_models/en_PP-OCRv3_rec_train/best_accuracy
# test predict
# python3 tools/infer_rec.py -c configs/rec/PP-OCRv3/en_PP-OCRv3_rec.yml -o Global.pretrained_model=output/v3_en_mobile/best_accuracy Global.infer_img=train_data/ic15_data/train/word_2.png
# eval
# python3 -m paddle.distributed.launch tools/eval.py -c configs/rec/PP-OCRv3/en_PP-OCRv3_rec.yml -o Global.checkpoints=output/v3_en_mobile/best_accuracy
7:用自己创造的数据集测试,可以运行通,但是,受限于数据集,效果太差
配置,在Ubuntu上配置,首先先介绍下 Paddle_interface
的编译过程:
git clone https://github.com/PaddlePaddle/Paddle.git
cd Paddle
git checkout release/2.0
下载完后就可以进入相应的目录并创建 build
文件夹
mkdir build & cd build
以上是两组比较有代表性的图片,一个是纯手写,另一个是在圆柱上的文字,从测试效果来看,手写的识别效果确实差点,不过,对于手写体,没有经过训练,而且也确实难度比较大,毕竟,写个狂草的话,估计自己都不认识,就不要为难 PC
了。