
# 模型适配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适配工作 
| 开发语言   | 适配工作                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
|:---|:---|
| C++    | - [修改技能文件]  - [修改模型配置文件]  - [加载模型]  - [模型后处理]  - [OpenCV版本升级]   |
| Python | - [加载模型]  - [模型后处理]                                                                                                                                                                                                                                                                                                                                                               |
   
#### 准备工作
由于新版本使用模型配置文件兼容不同版本的模型，端侧固件版本需要升级至1.3.0，固件升级请参见[升级HiLens_Device_Agent固件版本](https://support.huaweicloud.com/usermanual-hilens/hilens_02_0015.html)。
如果端侧固件版本低于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"文件夹中。模型路径为相对于当前模型配置文件的相对路径。
模型配置文件修改示例如下。配置参数设置请见[模型配置文件](https://support.huaweicloud.com/usermanual-hilens/hilens_02_0152.html)。
```
{
    "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官网。
