一、前言
本文实现基于 NCNN 框架所实现的 OCR 模型移植.
将基于一个安卓项目 OcrLiteAndroidNcnn
来省去开发过程而专注于移植过程.
1. 编译环境
1 2 3 4 5
| cmake 3.24.1
Python 3.6.9
Android NDK r19c
|
2. 可能需要的工具包
当出现错误时可能需要用以下命令来安装软件
1 2 3 4 5
| sudo apt install build-essential
sudo apt install libssl-dev
sudo apt install protobuf-compiler libprotoc-dev
|
如果发生错误可能使用到的工具包
1 2 3 4
| libopencv-dev build-essential git libvulkan-dev
|
二、onnx 模型转换成 ncnn 模型
1. 编译 ncnn 相关转换工具
1 2 3 4 5 6
| 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 压缩包
1 2 3 4 5 6
| 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
使用下列命令对模型进行转换
1 2 3 4 5
| 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
1 2 3
| 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
1 2 3 4 5
| 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 版本不能过高,
不然编译过程中会出现找不到头文件的错误.
1 2 3 4 5 6 7 8
| # 打开 $ANDROID_NDK/build/cmake/android.toolchain # 或者 $ANDROID_NDK/build/cmake/android-legacy.toolchain. # 删除 "-g" 一行
list(APPEND ANDROID_COMPILER_FLAGS -g -DANDROID
|
2. 编译
编译 aarch64 调用库
1 2 3 4 5 6 7 8 9 10
| 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. 正常运行截图
测试图

识别图
