在银河麒麟V10 编译RapidocrNcnn
RapidocrNcnn是一个开源的文字识别软件。还有一个是rapidocronnx,经测试,比这个识别较慢一点。
下载地址:https://github.com/RapidAI/RapidOcrNcnn
编译前要先编译opencv、ncnn ,vulkan
前期准备:
下载cmake 3.28.0 ,https://cmake.org/files/v3.28/cmake-3.28.0-linux-aarch64.sh
执行 ./cmake-3.28.0-linux-aarch64.sh,
编译后把目录加入 到环境目录中即可
gedit /etc/profile
文件中添加一行:export PATH=$PATH:/。。。这里自己改所在目录。。cmake/cmake-3.28.0-linux-aarch64/bin
sudo apt-get install libwayland-dev libwayland-egl1-mesa wayland-protocols
1.编译opencv
先下载opencv4.6源码。(https://opencv.org/releases/)并解压新目录opencv,
再下载https://github.com/RapidAI/OpenCVBuilder下载后解压覆盖到opencv
build-opencv4-linux.sh
2.如要用GPU,我测试比CPU版本还慢!!这步才要处理
预先执行:sudo apt-get install ninja-build
pip install jsonschema
下载https://sdk.lunarg.com/sdk/download/1.3.239.0/linux/vulkansdk-linux-x86_64-1.3.239.0.tar.gz
解压后执行 ./vulkansdk
我没有执行成功,但是后续还是可以编译的。
3.编译 ncnn
https://codeload.github.com/Tencent/ncnn/zip/refs/heads/master
https://codeload.github.com/benjaminwan/NcnnBuilder/zip/refs/heads/main
3.编译Rapidocrncnn
最后脚本合集分了三个。
1.预处理,安装先决条件。要用sudo权限(preinstall)
#!/bin/bash # 设置错误时退出 set -e set -x # 颜色输出函数 RED='\033[0;31m' GREEN='\033[0;32m' BLUE='\033[0;34m' NC='\033[0m' # No Color echo_info() { echo -e "${BLUE}[信息] $1${NC}" } echo_success() { echo -e "${GREEN}[成功] $1${NC}" } echo_error() { echo -e "${RED}[错误] $1${NC}" } REAL_USER="ymf" # 检查是否为root用户 if [ "$EUID" -ne 0 ]; then echo_error "请使用root权限运行此脚本(使用sudo)" exit 1 fi # 创建工作目录 WORK_DIR=$PWD mkdir -p "$WORK_DIR" cd "$WORK_DIR" drop_privileges() { echo_info "正在切换到普通用户权限..." # 切换到普通用户 exec su - $REAL_USER << EOF cd "$WORK_DIR" echo_info "已切换到用户 $REAL_USER" echo_info "当前工作目录: $WORK_DIR" #exec bash EOF } installSoft() { echo "正在安装软件..." } # 安装系统依赖 echo_info "正在安装系统依赖..." apt-get update apt-get install -y build-essential git aria2 \ libwayland-dev libwayland-egl1-mesa wayland-protocols \ ninja-build python3-pip unzip # 安装Python依赖 echo_info "正在安装Python依赖..." pip3 install jsonschema # 处理CMake安装 echo_info "正在处理CMake安装..." # 备份原有的cmake if [ -f /usr/bin/cmake ]; then echo_info "备份原有的cmake..." mv /usr/bin/cmake /usr/bin/cmake.bak fi # 下载CMake echo_info "正在下载CMake..." if [ ! -f cmake-3.28.0-linux-aarch64.sh ]; then aria2c -c -x 16 -s 16 https://cmake.org/files/v3.28/cmake-3.28.0-linux-aarch64.sh fi # 安装CMake到/usr/bin echo_info "正在安装CMake到/usr/bin目录..." chmod +x cmake-3.28.0-linux-aarch64.sh mkdir -p cmake_temp ./cmake-3.28.0-linux-aarch64.sh --skip-license --prefix=cmake_temp cp cmake_temp/bin/cmake /usr/bin/ cp cmake_temp/bin/cmake-gui /usr/bin/ cp cmake_temp/bin/ccmake /usr/bin/ cp cmake_temp/bin/cpack /usr/bin/ cp cmake_temp/bin/ctest /usr/bin/ cp -rf cmake_temp/share/cmake-3.28/ /usr/share/ #rm -rf cmake_temp # 验证CMake安装 echo_info "验证CMake安装..." cmake_version=$(cmake --version | head -n1) echo_info "当前CMake版本: $cmake_version" # 显示CMake版本信息./ echo_info "CMake安装信息:" echo_info "安装位置:/usr/bin/cmake" echo_info "当前版本:$(cmake --version | head -n1)" if [ -f /usr/bin/cmake.bak ]; then echo_info "原版本已备份为:/usr/bin/cmake.bak" fi
2.下载相关代码并初始化
downloadsoft.sh
#!/bin/bash # 设置错误时退出 # 颜色输出函数 RED='\033[0;31m' GREEN='\033[0;32m' BLUE='\033[0;34m' NC='\033[0m' # No Color echo_info() { echo -e "${BLUE}[信息] $1${NC}" } echo_success() { echo -e "${GREEN}[成功] $1${NC}" } echo_error() { echo -e "${RED}[错误] $1${NC}" } # 创建工作目录 WORK_DIR=$PWD mkdir -p "$WORK_DIR" cd "$WORK_DIR" cd "$WORK_DIR" # 下载并编译OpenCV echo_info "正在下载OpenCV相关文件..." if [ ! -f opencv.zip ]; then echo_info "下载OpenCV源码..." #https://gitee.com/opencv/opencv/repository/archive/4.6.0.zip wget -O opencv.zip https://github.com/opencv/opencv/archive/4.6.0.zip fi if [ ! -f opencvbuilder.zip ]; then echo_info "下载OpenCVBuilder..." #git clone https://gitee.com/RapidAI/OpenCVBuilder.git wget -O opencvbuilder.zip https://github.com/RapidAI/OpenCVBuilder/archive/refs/heads/main.zip fi echo_info "解压OpenCV源码..." if [ ! -d opencv-4.6.0 ]; then unzip opencv.zip fi if [ ! -d OpenCVBuilder-main ]; then echo_info "解压OpenCVBuilder..." unzip opencvbuilder.zip fi echo_info "解压OpenCVBuilder并强制覆盖到OpenCV目录..." unzip -o opencvbuilder.zip cp -rf OpenCVBuilder-main/* opencv-4.6.0/ echo_info "配置并编译OpenCV..." cd opencv-4.6.0 chmod +x build-opencv4-linux.sh cd .. # 下载并编译NCNN echo_info "正在下载NCNN相关文件..." if [ ! -f ncnn.zip ]; then echo_info "下载NCNN源码..." aria2c -c -x 16 -s 16 -o ncnn.zip https://codeload.github.com/Tencent/ncnn/zip/refs/heads/master fi if [ ! -f ncnnbuilder.zip ]; then echo_info "下载NCNNBuilder..." aria2c -c -x 16 -s 16 -o ncnnbuilder.zip https://codeload.github.com/benjaminwan/NcnnBuilder/zip/refs/heads/main fi if [ ! -d ncnn-master ]; then echo_info "解压NCNN源码..." unzip ncnn.zip fi if [ ! -d NcnnBuilder-main ]; then echo_info "解压NCNNBuilder..." unzip ncnnbuilder.zip fi cp -r NcnnBuilder-main/* ncnn-master/ .. # 下载并编译RapidOcrNcnn echo_info "正在下载并编译RapidOcrNcnn..." if [ ! -d RapidOcrNcnn ]; then echo_info "克隆RapidOcrNcnn代码库..." git clone https://gitee.com/loadymf/RapidOcrNcnn.git fi echo_success "所有1组件下载完成!"
3.重新编译软件,并把ncnn 和opencv同步到rapidocrncnn中,
rebuild.sh
#!/usr/bin/env bash # ./build-opencv4-linux.sh -n 386 # ./build-opencv4-linux.sh -n amd64 # ./build-opencv4-linux.sh -n arm # ./build-opencv4-linux.sh -n arm64 # ./build-opencv4-linux.sh -n ppc64le set -e # 颜色输出函数 RED='\033[0;31m' GREEN='\033[0;32m' BLUE='\033[0;34m' NC='\033[0m' # No Color echo_info() { echo -e "${BLUE}[信息] $1${NC}" } echo_success() { echo -e "${GREEN}[成功] $1${NC}" } echo_error() { echo -e "${RED}[错误] $1${NC}" } WORK_DIR="/home/ymf/RapidOcr" HOST_OS=$(uname -s) NUM_THREADS=1 BUILD_TYPE=Release # 提示用户输入编译模式 echo "请选择编译模式:" echo "1. Debug" echo "other. Release" default_build_mode="2" read -p "请输入数字 (1 或 other): " build_mode # 根据用户输入设置编译模式 build_mode=${build_mode:-$default_build_mode} if [ "$build_mode" == "1" ]; then BUILD_TYPE=Debug fi echo "BUILD_TYPE=$BUILD_TYPE" if [ "$HOST_OS" == "Linux" ]; then NUM_THREADS=$(nproc) else echo "Unsupported OS: $HOST_OS" exit 0 fi JAVA_FLAG="" TARGET_ARCH="aarch64" while getopts "n:j" arg; do case $arg in n) echo "n(TARGET_ARCH):$OPTARG" TARGET_ARCH="$OPTARG" ;; j) echo "j's arg:$OPTARG" JAVA_FLAG="-DBUILD_FAT_JAVA_LIB=ON -DBUILD_JAVA=ON -DBUILD_opencv_java=ON -DBUILD_opencv_flann=ON" ;; ?) echo -e "unkonw argument." exit 1 ;; esac done if [ -z "$TARGET_ARCH" ]; then echo -e "empty TARGET_ARCH." echo -e "usage: ./build-opencv3-linux.sh -n amd64" exit 1 fi # get gcc version export _compiler=$(which gcc) MAJOR=$(echo __GNUC__ | $_compiler -E -xc - | tail -n 1) MINOR=$(echo __GNUC_MINOR__ | $_compiler -E -xc - | tail -n 1) PATCH_LEVEL=$(echo __GNUC_PATCHLEVEL__ | $_compiler -E -xc - | tail -n 1) if [ "$HOST_OS" == "Linux" ] && [ "$TARGET_ARCH" == "arm64" ] && [ "$MAJOR.$MINOR.$PATCH_LEVEL" == "4.8.4" ]; then echo "Linux arm64 gcc version is 4.8.4, turn off libwebp" DISABLE_OPTION="-DBUILD_WEBP=OFF -DWITH_WEBP=OFF" elif [ "$HOST_OS" == "Linux" ] && [ "$TARGET_ARCH" == "386" ] && [ "$MAJOR.$MINOR.$PATCH_LEVEL" == "4.8.4" ]; then echo "Linux 386 gcc version is 4.8.4, turn off openexr" DISABLE_OPTION="-DBUILD_OPENEXR=OFF -DWITH_OPENEXR=OFF" else echo "Other gcc version" DISABLE_OPTION="" fi BUILD_OUTPUT_PATH="build-$BUILD_TYPE-$TARGET_ARCH-$BUILD_TYPE" BUILD_INSTALL_PATH="$BUILD_OUTPUT_PATH/install" cd opencv-4.6.0 mkdir -p "$BUILD_OUTPUT_PATH" cmake --compile-no-warning-as-error \ -B"$BUILD_OUTPUT_PATH" \ -DCMAKE_INSTALL_PREFIX="$BUILD_INSTALL_PATH" \ -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_CONFIGURATION_TYPES=$BUILD_TYPE \ $(cat opencv4_cmake_options.txt) \ $DISABLE_OPTION \ $JAVA_FLAG cmake --build $BUILD_OUTPUT_PATH --config $BUILD_TYPE --parallel $NUM_THREADS --target install Dest_Path="$WORK_DIR/RapidOcrNcnn/opencv-static/linux" rsync -avh --delete "$BUILD_INSTALL_PATH/" "$Dest_Path/" cd .. cd ncnn-master # 请选择要使用的ncnn库选项并回车: 1)ncnn(CPU),2)ncnn(vulkan) echo "请选择要使用的ncnn库选项并回车: 1.ncnn [CPU],2.ncnn[vulkan]" read -p "请输入数字 1 或 2: " build_ncnn # 根据用户输入设置编译模式 if [ "$build_ncnn" == "2" ]; then BUILD_NCNN_VULKAN="GPU" NCNN_VULKAN="ON" Dest_Path="$WORK_DIR/RapidOcrNcnn/ncnn-vulkan-static/linux" else BUILD_NCNN_VULKAN="CPU" NCNN_VULKAN="OFF" Dest_Path="$WORK_DIR/RapidOcrNcnn/ncnn-static/linux" fi echo "请注意:如果选择2)JNI动态库时,必须安装配置Oracle JDK" echo_info "请选择编译输出类型并回车: 1)BIN可执行文件,2)JNI动态库,3)C动态库" read -p "" BUILD_OUTPUT if [ $BUILD_OUTPUT == 1 ]; then BUILD_OUTPUT="BIN" elif [ $BUILD_OUTPUT == 2 ]; then BUILD_OUTPUT="JNI" elif [ $BUILD_OUTPUT == 3 ]; then BUILD_OUTPUT="CLIB" else BUILD_OUTPUT="BIN" echo -e "输入错误!Input Error!,设置为默认BIN" fi sysOS=$(uname -s) NUM_THREADS=1 TARGET_ARCH="aarch64" if [ $sysOS == "Darwin" ]; then #echo "I'm MacOS" NUM_THREADS=$(sysctl -n hw.ncpu) #cmakeParams "Release" elif [ $sysOS == "Linux" ]; then #echo "I'm Linux" NUM_THREADS=$(grep ^processor /proc/cpuinfo | wc -l) #cmakeParams "$BUILD_TYPE" else echo "Other OS: $sysOS" fi BUILD_OUTPUT_PATH="build-$BUILD_TYPE-$TARGET_ARCH-$BUILD_NCNN_VULKAN" BUILD_INSTALL_PATH="$BUILD_OUTPUT_PATH/install" mkdir -p "$BUILD_OUTPUT_PATH" cd "$BUILD_OUTPUT_PATH" cmake --compile-no-warning-as-error \ -DCMAKE_BUILD_TYPE=$1 \ $(cat ../ncnn_cmake_options.txt) \ -DNCNN_VULKAN=OFF \ -DCMAKE_TOOLCHAIN_FILE=../toolchains/aarch64-linux-gnu.toolchain.cmake \ .. #read -p "暂停" build_mode1 cmake --build . --config "$BUILD_TYPE" -j $NUM_THREADS #read -p "暂停" build_mode1 cmake --build . --config "$BUILD_TYPE" --target install cd .. echo "$BUILD_INSTALL_PATH/" echo "$Dest_Path/" echo "同步ncnn静态库" rsync -avh --delete "$BUILD_INSTALL_PATH/" "$Dest_Path/" #rsync -avh --delete "$BUILD_INSTALL_PATH/" "$Dest_Path/" cd .. cd RapidOcrNcnn mkdir -p $sysOS-$BUILD_OUTPUT-$BUILD_NCNN_VULKAN cd $sysOS-$BUILD_OUTPUT-$BUILD_NCNN_VULKAN echo " cmake -DCMAKE_INSTALL_PREFIX=install -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DOCR_OUTPUT=$BUILD_OUTPUT -DOCR_VULKAN=$BUILD_VULKAN .." cmake -DCMAKE_INSTALL_PREFIX=install -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DOCR_OUTPUT=$BUILD_OUTPUT -DOCR_VULKAN=$BUILD_VULKAN .. cmake --build . --config $BUILD_TYPE -j $NUM_THREADS cmake --build . --config $BUILD_TYPE --target install cd ..