NCNN----Monodepthv2单目深度估计 小米手机部署

文章介绍了如何理解和转化MonoDepthv2模型,将其优化为NCNN格式,以便在小米手机上进行高效的推理。过程中涉及模型源码分析、转换工具如onnx2ncnn的使用,以及AndroidStudio项目配置,包括CMakeLists.txt的修改和OpenCV、ncnn库的集成。最终在Android应用中实现了模型的加载和设备选择功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目要求:学习了解单目深度估计模型MonoDepthv2,基于NCNN推理框架部署到小米手机
MonoDepthv2 论文:Digging Into Self-Supervised Monocular Depth Estimation
MonoDepthv2 源码:Monodepth2 GitHub

分析:
1)了解MonoDepthv2的基本原理和代码理解
2)将模型转化为更加方便高效的NCNN模型并在小米手机端完成推理过程

  • 结果展示:

在这里插入图片描述

  • 参考代码
    nihui/ncnn-android-nanodet

  • 模型转换
    一键转换 onnx2ncnn

  • 包依赖
    opencv-mobile-4.6.0-android (版本可选)
    ncnn-20230223-android-vulkan (版本可选)

  • 软件环境
    Android Studio, SDK Platforms: Android 11, 12, 13; SDK tools, NDK tools

  • 工程目录(重点修改部分已经标红)
    在这里插入图片描述

  • 具体修改项

    1. CMakeLists.txt
    project(nanodetncnn)
    
    cmake_minimum_required(VERSION 3.10)
    
    set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/opencv-mobile-4.6.0-android/sdk/native/jni)
    find_package(OpenCV REQUIRED core imgproc)
    
    set(ncnn_DIR ${CMAKE_SOURCE_DIR}/ncnn-20230223-android-vulkan/${ANDROID_ABI}/lib/cmake/ncnn)
    find_package(ncnn REQUIRED)
    add_library(nanodetncnn SHARED nanodetncnn.cpp nanodet.cpp ndkcamera.cpp)
    
    target_link_libraries(nanodetncnn ncnn ${OpenCV_LIBS} camera2ndk mediandk)
    
    
    1. nanodet.cpp (#59)设置模型输入输出尺寸
    int NanoDet::detect(cv::Mat& rgb)
    {
        ncnn::Mat in = ncnn::Mat::from_pixels_resize(rgb.data, ncnn::Mat::PIXEL_RGB, rgb.cols, rgb.rows,640, 192);
        in.substract_mean_normalize(mean_vals, norm_vals);
    
        ncnn::Extractor ex = nanodet.create_extractor();
        ex.input("input", in);
        ncnn::Mat model_out;
        ex.extract("output", model_out);
    
        cv::Mat out(192, 640, CV_32FC1, model_out.data);
    
    1. string.xml
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string name="app_name">nanodetncnn</string>
        <string-array name="model_array">
            <item>MonoDepthv2</item>
    <!--        <item>MobilenetV2-Wave</item>-->
    <!--        <item>DenseNet</item>-->
    <!--        <item>DenseNet-Wave</item>-->
        </string-array>
        <string-array name="cpugpu_array">
            <item>CPU</item>
            <item>GPU</item>
        </string-array>
    </resources>
    
    1. nanodetncnn.cpp (#170) 设置模型路径和设备cpugpu选项
    JNIEXPORT jboolean JNICALL Java_com_tencent_nanodetncnn_NanoDetNcnn_loadModel(JNIEnv* env, jobject thiz, jobject assetManager, jint modelid, jint cpugpu)
    {
        // 检查一下选的模型和设备是不是在范围
        if (modelid < 0 || modelid > 2 || cpugpu < 0 || cpugpu > 1)
        {
            return JNI_FALSE;
        }
    
        AAssetManager* mgr = AAssetManager_fromJava(env, assetManager);
    
        __android_log_print(ANDROID_LOG_DEBUG, "ncnn", "loadModel %p", mgr);
    
        const char* modeltypes[] =
        {"mono-sim-opt",
        };
    
    1. gradle-wrapper.properties
    distributionBase=GRADLE_USER_HOME
    distributionPath=wrapper/dists
    zipStoreBase=GRADLE_USER_HOME
    zipStorePath=wrapper/dists
    #distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
    distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-5.4.1-all.zip
    
    1. local.properties
    ## This file must *NOT* be checked into Version Control Systems,
    # as it contains information specific to your local configuration.
    #
    # Location of the SDK. This is only used by Gradle.
    # For customization when using a Version Control System, please read the
    # header note.
    #Tue Apr 11 21:28:46 CST 2023
    sdk.dir=\\path\\to\\AppData\\Local
    ndk.dir=\\path\\to\\AppData\\Local\\ndk\\22.1.7171670
    
  • 小结
    1)Android Studio 配置过程会出现各种问题,需要耐心解决。如网络问题,SDK,NDK等路径配置问题;
    2)Android Studio检测手机设备时,需要检测相应的硬件环境,软件环境等一致;

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值