一、前言

本文实现基于 NCNN 框架所实现的 OCR 模型移植.

将基于一个安卓项目 OcrLiteAndroidNcnn 来省去开发过程而专注于移植过程.

1. 编译环境

cmake 3.24.1

Python 3.6.9

Android NDK r19c

2. 可能需要的工具包

当出现错误时可能需要用以下命令来安装软件

sudo apt install build-essential

sudo apt install libssl-dev

sudo apt install protobuf-compiler libprotoc-dev

如果发生错误可能使用到的工具包

libopencv-dev
build-essential
git
libvulkan-dev

二、onnx 模型转换成 ncnn 模型

1. 编译 ncnn 相关转换工具

git clone https://github.com/Tencent/ncnn
cd ncnn/
mkdir -p build
cd build/
cmake ..
make -j4

这样编译能通过但是不能得到转换工具, 这是因为缺少 protobuf. 这时需要进行编译安装.

2. protobuf 编译

在网站https://github.com/protocolbuffers/protobuf/releases 下载获取 protobuf-cpp-xxx.tar.gz 压缩包

tar -xzf {protobuf-cpp-xxx.tar.gz}
cd {protobuf-cpp-xxx}
./configure --prefix=$INSTALL_DIR
make -j4
make check
sudo make install

3. 模型转换

使用模型均来自于 https://github.com/DayBreak-u/chineseocr_lite/tree/onnx/models

使用下列命令对模型进行转换

cd {ncnn_path}/build/tools/onnx/
cp -r {onnx_models_path} ./
./onnx2ncnn onnx_models/crnn_lite_lstm.onnx crnn_lite_op.param crnn_lite_op.bin
./onnx2ncnn onnx_models/dbnet.onnx dbnet_op.param dbnet_op.bin
./onnx2ncnn onnx_models/angle_net.onnx angle_op.param angle_op.bin

转换之后的模型列表应该如下所示

4. 模型精简

在转换过程中, 尤其是 crnn_lite_lstm.onnx 模型可能会出现警告, 或者其他模型也会出现相似问题. 这时候我们可以考虑使用 onnx-simplifier 对模型进行精简后在对其进行转换.

需要注意的是, 这里使用的 Python 的版本需要 >= 3.7

pip3 install onnx-simplifier -i https://pypi.tuna.tsinghua.edu.cn/simple

python3 -m onnxsim {Your_Onnx_Model_Name}.onnx {Your_Onnx_Sim_Model_Name}.onnx

需要注意的是, 这里模型转换失败. 当尝试使用 chineseocr_lite 项目中已转换的模型时, 依旧不能使得 demo 正常运行 (出现运行闪退的情况)

三、安卓端 ncnn 调用库编译

1. 前置准备

编译过程参考 https://github.com/Tencent/ncnn/wiki/how-to-build#build-for-android

wget https://dl.google.com/android/repository/android-ndk-r19c-linux-x86_64.zip

unzip android-ndk-r19c-linux-x86_64.zip

export ANDROID_NDK=<your-ndk-root-path>

这里需要注意 NDK 版本不能过高, 不然编译过程中会出现找不到头文件的错误.

# 打开 $ANDROID_NDK/build/cmake/android.toolchain 
# 或者 $ANDROID_NDK/build/cmake/android-legacy.toolchain.
# 删除 "-g" 一行

list(APPEND ANDROID_COMPILER_FLAGS
  -g
  -DANDROID

2. 编译

编译 aarch64 调用库

cd <ncnn-root-dir>
mkdir -p build-android-aarch64
cd build-android-aarch64

cmake -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake"\
    -DANDROID_ABI="arm64-v8a" \
    -DANDROID_PLATFORM=android-21 ..

make -j$(nproc)
make install

在 build-android-aarch64/install 文件夹下可获得调用库

3. 运行

按照安卓项目 OcrLiteAndroidNcnn 配置好环境之后

用得到的 build-android-aarch64/install 下的文件替换掉 arm64-v8a 下的文件.

选择 Android Studio 导入项目, 选择 Build Variants 中 OcrLibrary 中的 Active ABI 为 arm64-v8a

可以得到运行库, 但替换后会出现项目构建错误, 可能是由于版本不同所带来的兼容性问题

4. 正常运行截图

测试图

识别图

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐