PaddleOCR

PaddleOCR

  • 前因
  • 继续因一下
    • 环境及相关库
    • 过程
    • Linux Deploy
    • Training
  • 后果
    • 纯手写字体
    • 随手拍
  • 结论

前因

响应公司号召,开搞 OCR 字符识别, OpenCVHalcon 已经实现了部分功能,是基于机器学习实现的,通过边界计算、分割、识别的 Pipeline 完成字符的识别,但纵观技术大局,深度学习能搞定的事情就不要用机器学习了,于是调研下深度学习框架,找了一遍,发现大家对百度的 PaddleOCR 特别推崇(不排除是用百度搜索引擎调研的),于是乎,干就完了。。。

继续因一下

对于深度学习这门玄学,从我的认知出发,先跑一下吧,如果跑的好,那就成了一半了,然后再考虑搭建 train 的环境,更换自己的数据集,所以,首先一步就是部署,根据官网推出的模型进行部署,所幸,百度的生态非常强大,这个问题他早就考虑到了,所以官网有比较详细的部署教程,而且还是中文的,作为没出过国门的中国人,这一点是值得表扬的,鉴于我比较熟悉c++python,所以就介绍下 C ++ 的部署;

环境及相关库

vs 2019 社区版
cmake 3.22.5
opencv 4.x

过程

  1. 下载paddleOCR code: paddleocr

  2. 下载 interface 预测库专用

  3. 下载官方det和rec模型 模型下载

  4. 编译
    deploy/cpp_inte 下,cmake && make 即可

  5. 配置与运行
    老实说,这个有点麻烦,因为这套代码用到的 Gflag ,需要读取命令行参数,而这个在 win 下不是很友好,所以,可以修改 args 的默认值,主要修改的参数有:
    rec_model_dir, det_model_dir,rec_char_dict_path,这三个对应的文件都是需要提供的,前两个是下载的,第三个在源码文件中存在,需要改下路径就好,至此,就可以进行识别了。

Linux Deploy

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.");

Training

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 

纯手写字体

在这里插入图片描述PaddleOCR_第1张图片

随手拍

PaddleOCR_第2张图片

结论

以上是两组比较有代表性的图片,一个是纯手写,另一个是在圆柱上的文字,从测试效果来看,手写的识别效果确实差点,不过,对于手写体,没有经过训练,而且也确实难度比较大,毕竟,写个狂草的话,估计自己都不认识,就不要为难 PC 了。

你可能感兴趣的:(DeepLearning,人工智能,计算机视觉,python)