更新时间:2022-08-18 GMT+08:00
分享

模型适配HiLens Studio

由于HiLens Studio开发工具包升级至新版本C7X,使得目前HiLens Studio仅支持C7X版本的模型,即输出的模型是NHWC格式。而HiLens Kit设备支持C3X版本模型,即输出的模型是NCHW格式。如果您使用旧版本的开发工具包在HiLens Studio上开发技能,该技能将不能在最新版本的HiLens Studio上正常运行,同时新版本Studio将OpenCV的版本从3.4.2升级到4.2.0,因此需要对技能进行适配。适配工作如表1所示。

准备工作

由于新版本使用模型配置文件兼容不同版本的模型,端侧固件版本需要升级至1.3.0,固件升级请参见升级HiLens_Device_Agent固件版本

如果端侧固件版本低于1.3.0,可能会导致技能无法运行。

修改技能文件

需要对“CMakeLists.txt”“prebuild.sh”“build.sh”“clean.sh”文件进行修改。

  • CMakeLists.txt

    修改内容如下:

    project(main)
     
    # 使用C++11标准
    set(CMAKE_CXX_STANDARD 11)
     
    # 头文件
    include_directories(${CMAKE_SOURCE_DIR}/../src/main/cpp/include)
    include_directories(/home/hilens/hilens_studio_sdk/include)
     
    # framework lib库
    link_directories(/home/hilens/hilens_studio_sdk/lib)
     
    # 源文件
    file(GLOB_RECURSE SRC_LIST "${CMAKE_SOURCE_DIR}/../src/main/cpp/*.cpp")
    set(lib_srcs ${SRC_LIST})
     
    # 调试设置
    if(STUDIO)
        # DEBUG版本
        message("debug 设置")
        SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
    else()
        # release版本设置
        message("release 设置")
        SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
    endif()
     
    set(LIBS hilens_m opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs
    opencv_calib3d opencv_videoio opencv_features2d opencv_flann opencv_photo opencv_video jsoncpp_noabi)# libm-2.24.so)
     
    set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
     
    # 可执行程序(不携带so)
    if(STUDIO)
        set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/../)
    else()
        set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/output/kit/bin)
    endif()
     
    add_executable(main ${lib_srcs} ${CMAKE_SOURCE_DIR}/../src/main/cpp/main.cpp)
     
    target_link_libraries(main ${LIBS})
  • prebuild.sh

    修改如下内容:

    current_workspace=`pwd`
    echo "cmake..."
     
    bash build/build.sh
     
    cd $current_workspace
     
    filename=.hilens
    if [ ! -d $filename  ];then
      mkdir $filename
    fi
     
    uuid=`cat /proc/sys/kernel/random/uuid`
    echo -n $uuid > ./$filename/rtmp.txt
    vid_src=`cat ./.hilens/rtmp_source`
     
    current_workspace=`pwd`
     
    echo "cd $current_workspace" > ~/.gdbinit
    echo "set environment RTMP_PATH rtmp://127.0.0.1/live/$uuid" >> ~/.gdbinit
    echo "set environment VID_SRC $vid_src" >> ~/.gdbinit
    echo "handle SIG32 nostop noprint pass" >> ~/.gdbinit
  • build.sh

    修改如下内容:

    #!/bin/sh
     
    echo "cmake..."
    cd build
    # 清理build
     
    if [ ! -d output ]; then
        mkdir output
    fi
    cd output
     
    if [ ! -d studio ]; then
        mkdir studio
    fi
    cd studio
     
    echo "studio build..."
    export LD_LIBRARY_PATH=/usr/lib64/:$LD_LIBRARY_PATH
    cmake ../../ -DCMAKE_BUILD_TYPE=Debug -DSTUDIO=ON && make -j
    cp compile_commands.json ../../../
     
    echo "kit cmake... "
    cd ..
    if [ ! -d kit ]; then
        mkdir kit
    fi
    cd kit
    cmake ../../ -DCMAKE_BUILD_TYPE=Release -DSTUDIO=OFF && make -j 
  • clean.sh

    修改如下内容:

    cd build/output
    export LD_LIBRARY_PATH=/usr/lib64/:$LD_LIBRARY_PATH
    
    # 清理kit
    BUILD_DIR="kit"
    if [ -d ${BUILD_DIR} ];then
        echo " clean and remove build..."
        cd $BUILD_DIR
        make clean
        cd ..
        rm -rf ${BUILD_DIR}
    fi
     
    # 清理studio
    BUILD_DIR="studio"
    if [ -d ${BUILD_DIR} ];then
        echo "clean and remove build..."
        cd $BUILD_DIR
        make clean
        cd ..
        rm -rf ${BUILD_DIR}
    fi

修改模型配置文件

模型配置文件是一个json文件,模型在加载的时候将会根据这个文件自动加载合适的模型并进行输入的预处理。建议将模型配置文件放在“model”文件夹中。模型路径为相对于当前模型配置文件的相对路径。

模型配置文件修改示例如下。配置参数设置请见模型配置文件

{
    "ModelCfgs" : 
    [
        {
            "DeviceType" : "D310_C3X",
            "ModelPath": "./mask_det_c3x.om",
            "FrameWorkInput": "BGR",
            "ModelInput": "BGR",
            "NetworkWidth": 512,
            "NetworkHeight": 288,
            "NetworkChannel": 2,
            "ScaleMeanEnable": false
        },
        {
            "DeviceType" : "D310_C7X",
            "ModelPath": "./mask_det_c7x.om",
            "FrameWorkInput": "BGR",
            "ModelInput": "BGR",
            "NetworkWidth": 512,
            "NetworkHeight": 288,
            "NetworkChannel": 2,
            "ScaleMeanEnable": false
        }
    ]
}

加载模型

如果开发语言使用C++,修改如下内容:

model = Model::Create(modelConfigPath);// 创建模型时传入模型配置文件的路径

如果开发语言使用Python,修改如下内容:

model = hilens.Model(model_config_path)  # 创建模型时传入模型配置文件的路径

模型后处理

如果原始模型是TensorFlow,由于C7X新版本模型转换工具将TensorFlow和Caffe的模型输出统一成NHWC格式,而C3X模型转换工具将TensorFlow模型转换成“om”时,输出的是NCHW格式,因此需要对HiLens Studio和HiLens Kit模型后处理进行不同的处理,将代码建立两个分支。

  • C++

    使用# if STUDIO 和 # else 进行区分。

    #if STUDIO  // C7X版本
    // 模型输出是NHWC格式,针对该格式进行后处理。
    #else  // C3X版本
    // 模型输出是NCHW格式,针对该格式进行后处理。
    #endif
  • Python

    使用如下代码进行区分:

    import os
    if os.getenv("SKILL_NAME"):
    # Studio版本,即C7X
    # 模型输出是NHWC格式,针对该格式进行后处理。
    else:
    # Kit 版本,即C3X版本
    # 模型输出是NCHW格式,针对该格式进行后处理。

OpenCV版本升级

C7X版本Studio中OpenCV由原来的3.4.2版本更新至4.2.0,有些OpenCV中定义的常量需要进行修改。具体修改情况请参考OpenCV4.2.0官网。

相关文档