基于NCNN的OCR模型的安卓移植
本文实现基于 NCNN 框架所实现的 OCR 模型移植.将基于一个安卓项目来省去开发过程而专注于移植过程.
文章目录
一、前言
本文实现基于 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. 正常运行截图
测试图
识别图
更多推荐
所有评论(0)