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

news2024/11/25 18:40:38

题目要求:学习了解单目深度估计模型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检测手机设备时,需要检测相应的硬件环境,软件环境等一致;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/499232.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Illustrator如何进行任务自动化之实例演示?

文章目录 0.引言1.动作的录制2.对文件播放动作3.批处理 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对Illustrator进行了学习&#xff0c;本文通过《Illustrator CC2018基础与实战》及其配套素材结合网上相关资料进行学习笔记总结&#xff0c;本文对任务自动化进行…

Cadence技巧总结学习(DRC、Annotate)持续更新~

Cadence技巧总结学习持续更新~ 你还可以再哪里看到这篇文章&#xff1a;知乎 1. 画叉 对于芯片上不用的引脚信号画上号&#xff0c;如下&#xff1a; 按大写X就可以了&#xff0c;或是双脚引脚&#xff0c;在跳出的界面中&#xff0c;Is No Connect上✔。 2. 画线快捷键&#…

【关于C++中----智能指针】

文章目录 一、概念引入二、内存泄漏2.1 内存泄漏概念及其危害2.2 内存泄漏分类2.3 避免内存泄漏 三、智能指针的原理3.1 RAII3.2 像指针一样 四、三类智能指针4.1 auto_ptr4.2 unique_ptr4.3 shared_ptr 五、循环引用和weak_ptr 一、概念引入 在我们日常写代码过程中&#xff…

ARM学习(21)STM32 外设Can的认识与驱动编写

笔者来聊聊can的认识以及can接收数据的驱动编写 1、STM32 Can 外设的认识 Can的特性就不多说了&#xff0c;主要来聊聊can的一些标识符以及收发状态。can有一套收发机制&#xff0c;发送和接收都有硬件缓存&#xff0c;叫邮箱&#xff0c;通过下面的图可以看出&#xff0c;下面…

ESP32学习笔记 -- ESP32-S3 使用外部 PSRAM

ESP32-S3是乐鑫科技推出的一款专为物联网而生的SOC芯片,该芯片同时支持WIFI和BLE蓝牙功能,集成了高性能的Xtensa 32位LX7双核处理器,最高主频可达240MHz。 根据乐鑫官方资料介绍,该芯片内置512KB SRAM片上内存,并且具有45个可编程GPIO管脚和丰富的通信接口。为了更好地扩…

Flask框架之路由与蓝图的使用

路由与蓝图 路由路由概述路由的基本使用查看路由信息url_map对象命令行方式 HTTP请求方法 蓝图概述蓝图的基本使用蓝图的拆分指定蓝图的url前缀蓝图构造URL蓝图静态文件蓝图模板目录 路由 路由概述 在Flask中&#xff0c;路由用于将HTTP请求与特定的Python函数相匹配。通过定义…

K8s-Pod概念、创建及常用命令

文章目录 一、Pod概念1、Pod是什么&#xff1f;2、Pod网络共享实现方式3、Pod存储共享方式4、创建Pod整体流程 二、使用YAML文件定义Pod资源1、Pod资源清单YAML文件书写技巧1. YAML语法格式&#xff1a;2. 配置Linux tab缩进两个空格3. 使用kubectl explain帮助命令 2、创建Pod…

章节2:01-Java序列化和反序列化

章节2&#xff1a;01-Java序列化和反序列化 01-Java序列化和反序列化 基础环境 JDK解压版&#xff1a;包含Java运行时环境 IDEA&#xff1a;开发工具 Maven&#xff1a;jar包依赖管理 Tomcat&#xff1a;HTTP服务器 Burp Suite&#xff1a;发送HTTP请求 Kali&#xff1…

ANSYS APDL谐响应分析——悬臂梁的频响函数计算以及幅值、角度(相位)、分贝计算

问题描述 研究一根悬臂梁&#xff0c;材质为钢材。长度 L 2 L2 L2 米&#xff1b;截面为矩形&#xff0c;矩形的长度为 H 5 c m H 5cm H5cm&#xff0c;宽度为 B 2 c m B 2cm B2cm 。 建模思路&#xff1a; 先建立节点&#xff0c;然后用节点生成单元。使用n命令&…

book-riscv-rev1.pdf 翻译(自用,更新完成)第一章 操作系统接口

Job of operating system: 操作系统使得多个程序分享一台计算机&#xff0c;提供一系列仅靠硬件无法支持的服务。 管理与抽象低级别硬件&#xff08;如&#xff1a;文件处理程序不需要关注使用哪种硬盘&#xff09;使得多个程序分享硬件&#xff08;programs that can run at…

797. 差分(C++和Python3)——2023.5.7打卡

文章目录 QuestionIdeasCode Question 输入一个长度为 n 的整数序列。 接下来输入 m 个操作&#xff0c;每个操作包含三个整数 l,r,c &#xff0c;表示将序列中 [l,r] 之间的每个数加上 c 。 请你输出进行完所有操作后的序列。 输入格式 第一行包含两个整数 n 和 m 。 第二…

高性能流媒体硬解码

目录 高性能流媒体硬解码前言1. What、Why and How1.1 What1.2 Why&#xff1f;1.3 How&#xff1f; 2. 离散傅里叶变换(DFT)2.1 JPEG编码2.2 哈夫曼编码(Huffman Coding) 3. 视频流媒体前置知识3.1 视频文件的构成3.2 视频的编码与封装3.3 H264编码的分层3.4 RTSP之RTP(Real-t…

【clang】安装clang编译器并将linux默认编译器改为clang

目录 省心操作法手动安装 本文是他人智慧的总结个人实践。 省心操作法 缺点&#xff1a; clang版本不能自己选择&#xff1b;我的系统是ubuntu 20&#xff0c;安装后是clang10.0版本 优点&#xff1a;省心&#xff0c;基本不会踩坑 手动安装 参考这篇文章ubuntu20.04 安装cl…

RabbitMQ --- 死信交换机

一、简介 1.1、什么是死信交换机 什么是死信&#xff1f; 当一个队列中的消息满足下列情况之一时&#xff0c;可以成为死信&#xff08;dead letter&#xff09;&#xff1a; 消费者使用basic.reject或 basic.nack声明消费失败&#xff0c;并且消息的requeue参数设置为false…

超详细-自动化测试从选型到落地,2023年我从10k涨到了18k*14薪...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Python自动化测试&…

系统集成项目管理工程师 下午 真题 及考点(2021年上下半年)

文章目录 2021年下半年试题一&#xff1a;第18章 项目风险管理&#xff0c;风险应对策略&#xff0c;风险的性质&#xff08;客观、偶然、相对、社会、不确定&#xff09;试题二&#xff1a;第9章 项目成本管理&#xff0c;执行绩效&#xff08;即CV和SV&#xff09;&#xff0…

HAL库版FreeRTOS(中)

目录 FreeRTOS 任务切换PendSV 异常PendSV 中断服务函数FreeRTOS 确定下一个要运行的任务函数vTaskSwitchContext()函数taskSELECT_HIGHEST_PRIORITY_TASK() PendSV 异常何时触发FreeRTOS 时间片调度实验功能设计软件设计下载验证 FreeRTOS 内核控制函数FreeRTOS 内核控制函数预…

蓝牙设备的名称与MAC地址及UUID

每个蓝牙设备都具有各自的地址和名称&#xff0c;他们之间通过唯一通过地址和名称进行数据交互。本文详细讲述了蓝牙设备的名称和地址的格式及作用。 名称 蓝牙设备具有各自的名称&#xff0c;通常为字母与数字的组合. MAC地址 与Ethernet相同&#xff0c;MAC地址为48bit的…

VTK安装路径检查

/usr/include/vtk-7.1——————VTK头文件

番剧更新表及番剧详情数据库

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 该项目立足于目前各大平台网站的番剧信息较为分散&#xff0c;用户需要辗转多个平台才能获取较为完整的番剧信息的背景下&#xff0c;实现了各大平台网站番剧信息的整合。将各大平台网站的番剧更新信息及番剧详情信息整合制表…