AS中部署NCNN

news2025/1/10 14:24:05

参考链接
http://681314.com/A/Clzr6Q2OBO
https://blog.csdn.net/xs1997/article/details/131747372

一、文章背景:公司再进行一个项目时,使用PyTorch框架,python语言及opencv工具进行神经网络深度学习算法进行训练。生成ONNX模型,但是该模型不能直接用在android平台,只能将该模型先转化为NCNN或TNN或MNN,再部署到AS中,运行在android系统。本文记录AS部署NCNN的方法。首先下载下面几个案例,将这些案例跑起来再对本公司的输出模型进行部署。
案例链接:
https://github.com/nihui/ncnn-android-squeezenet
https://github.com/nihui/ncnn-android-styletransfer
https://github.com/nihui/ncnn-android-mobilenetssd
https://github.com/moli232777144/mtcnn_ncnn
https://github.com/nihui/ncnn-android-yolov5
https://github.com/xiang-wuu/ncnn-android-yolov7
https://github.com/shaoshengsong/qt_android_ncnn_lib_encrypt_example

二、部署流程
注意:首先你的AS具有NDK开发环境。
1、下载ncnn包
下载网址:https://github.com/Tencent/ncnn/releases
在这里插入图片描述
我下载的是Andrid平台,可以GPU加速版本,给的7个案例中涉及的代码也是需要加速版本。

2、解压缩将ncnn部署到AS
1) 新建一个工程,并添加NDK环境;
2) 在/scr/main/cpp下新建文件夹jni,并将解压好的ncnn文件包放到jni文件夹下。
在这里插入图片描述
3)修改CMakeList.txt文件
在这里插入图片描述
4) 编译报错
CMake Error at D:/install/android-sdk/cmake/3.18.1/share/cmake-3.18/Modules/FindPackageHandleStandardArgs.cmake:165 (message):
Could NOT find Vulkan (missing: Vulkan_LIBRARY)
在这里插入图片描述
检查app的build.gradle文件,最低sdk版本不能小于24,把minSDK 改成24解决问题。
以上ncnn部署完成。

三、运行demo工程-ncnn-android-yolov5-master
因为AS版本不同,直接在AS中添加工程会有很多问题,所以我习惯新建工程,然后将demo中的代码复制到工程对应的文件中。

1、加载opencv
因为ncnn文件是由onnx转换的,onnx文件是神经网络+opencv+python训练生成的模型。所以工程中使用ncnn需要加载opencv。
在这里插入图片描述
在这里插入图片描述

2、将相关代码复制到工程
在这里插入图片描述
注意,assets文件夹下面的yolov5s.bin yolov5s.param,是ncnn文件。
3、修改CMakeList.txt文件
添加.h文件 .cpp文件
在这里插入图片描述
4、编译工程运行
编译不会报错,运行程序报错:
dlopen failed: library “libc++_shared.so” not found : externalNativeBuild { cmake { arguments “-DANDROID_STL=c++_shared” } }
解决方法:修改app build.gradle文件。
在这里插入图片描述
运行,可以识别到图片中物体:
在这里插入图片描述
四、运行demo工程-ncnn-android-yolov7-master
1、opencv及ncnn部署都一样,只是添加该demo文件修改CMakeList.txt文件即可。
在这里插入图片描述
2、CMakeList.txt文件
在这里插入图片描述
因为该工程需要ndkcamera及ndkmedia接口,所以添加这两个模块。

3、运行结果
最后,附上两个demo完整CMakeList.txt文件


# CMakeList.txt
cmake_minimum_required(VERSION 3.18.1)

project("onnxtest" CXX)

include_directories(${CMAKE_SOURCE_DIR}/include/yolov7 ${CMAKE_SOURCE_DIR}/include/yolov5s )

# 加载opencv
find_package(OpenCV 4.8.0 REQUIRED java)

# 设置ncnn
set(ncnn_DIR ${CMAKE_SOURCE_DIR}/jni/ncnn-20230816-android-vulkan/${ANDROID_ABI}/lib/cmake/ncnn)
find_package(ncnn REQUIRED)

file(GLOB CPP_FILES ${CMAKE_SOURCE_DIR}/source_yolov5s/onnxtest.cpp ${CMAKE_SOURCE_DIR}/source_yolov7/*.cpp )

add_library(
             onnxtest

             SHARED

             ${CPP_FILES}
        )

find_library(
              log-lib
              log )

target_link_libraries( # Specifies the target library.
                       onnxtest
                       ${log-lib}
                       ${OpenCV_LIBRARIES}
                       ncnn
                       camera2ndk
                       mediandk)

// build.gradle
plugins {
    id 'com.android.application'
}

android {
    compileSdk 31

    defaultConfig {
        applicationId "com.htkj.onnxtest"
        minSdk 24
        targetSdk 31
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cmake {
                    cppFlags "-std=c++11 -frtti -fexceptions"
                    arguments "-DOpenCV_DIR=" + "E:/work/xinchi/testProject/sdk/native/jni" ,"-DANDROID_STL=c++_shared"// , "-DANDROID_ARM_NEON=TRUE"
                }
            }
        }

        splits {
            abi {
                enable true
                universalApk false
                reset()
                include 'armeabi-v7a' // , 'x86', 'x86_64', 'arm64-v8a'
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    externalNativeBuild {
        cmake {
            path file('src/main/cpp/CMakeLists.txt')
            version '3.18.1'
        }
    }



    signingConfigs {
        release {
            storeFile file("../platform.jks")
            storePassword '123456'
            keyAlias 'platform'
            keyPassword '123456'
        }
        debug {
            storeFile file("../platform.jks")
            storePassword '123456'
            keyAlias 'platform'
            keyPassword '123456'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.3.0'
    implementation 'com.google.android.material:material:1.4.0'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

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

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

相关文章

RocketMQ 消费者分类与分组

文章目录 消费者分类PushConsumerPushConsumer 内部原理使用注意事项 SimpleConsumerinvisibleDuration 消息不可见时间 消费者分组(消费者负载均衡)广播消费和共享消费负载均衡策略多个消费者消费顺序消息多消费者消费顺序消息示例 消费者分组管理关闭自…

八股文死记硬背打脸记

背景 我们都知道,再编程领域数据结构的重要性,常见的数据结构包括 List、Set、Map、Queue、Tree、Graph、Stack 等,其中 List、Set、Map、Queue 可以从广义上统称为集合类数据结构。而Java也提供了很多的集合数据结构以供开发者开箱即用&…

左神高级提升班2 约瑟夫环结构

目录 【案例1】 【题目描述】 【输入描述:】 【输出描述:】 【输入】 【输出】 【思路解析】 【代码实现】 【案例1】 【题目描述】 某公司招聘,有n个人入围,HR在黑板上依次写下m个正整数A1、A2、……、Am,然后…

alist windows桌面版下载安装

官网 Desktop | AList Docs 点击下载windows版本 安装 双击exe 修改安装路径 太可惜了,需要收费

LeetCode刷题---Add Two Numbers(一)

文章目录 🍒题目🍒解法一 迭代🍒解法二 递归🍒递归小案例🍒迭代 VS 递归 🍒题目 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只…

聚观早报 | 飞书签约韵达速递;蔚来首颗自研芯片“杨戬”量产

【聚观365】9月22日消息 飞书签约韵达速递 蔚来首颗自研芯片“杨戬”10月量产 靳玉志接任华为车 BU CEO 亚马逊发布全新Alexa语音助手 OpenAI推出图像生成器DALL-E 3 飞书签约韵达速递 近日,国内物流服务公司韵达快递宣布全员上飞书。飞书解决方案副总裁何斌表…

【大数据】Doris 构建实时数仓落地方案详解(一):实时数据仓库概述

本系列包含: Doris 构建实时数仓落地方案详解(一):实时数据仓库概述Doris 构建实时数仓落地方案详解(二):Doris 核心功能解读Doris 构建实时数仓落地方案详解(三)&#…

云原生Kubernetes:K8S集群list-watch机制与 pod调度约束

目录 一、理论 1.K8S的list-watch 机制 2.亲和性 二、实验 1. 指定调度节点 2.节点亲和性 3.亲和性和反亲和 三、问题 1.新生成pod一直为pending 2.如何一次性删除pod和deployment 3.pod亲和性资源报错 4.pod反亲和性资源报错 四、总结 一、理论 1.K8S的list-wat…

zookeeper + kafka

Zookeeper 概述 Zookeeper是一个开源的分布式服务管理框架。存储业务服务节点元数据及状态信息,并负责通知再 ZooKeeper 上注册的服务几点状态给客户端 Zookeeper 工作机制 Zookeeper从设计模式角度来理解: 是一个基于观察者模式设计的分布式服务管理框架&…

vector的扩容机制—为何是1.5倍或者是2倍

文章目录 前言一、Vector 扩容过程二、为什么是1.5倍或者2倍? 前言 在 C 编程中,Vector 是一种常用的动态数组容器。其大小是可以动态调整的,而在扩容操作中,Vector 通常会将容量增加为原来的两倍。本篇博客将详细介绍 Vector 扩…

Kindle电子书下载功能关闭怎么办,借助calibre和cpolar搭建私有的网络书库公网访问

Kindle中国电子书店停运不要慌,十分钟搭建自己的在线书库随时随地看小说! 文章目录 Kindle中国电子书店停运不要慌,十分钟搭建自己的在线书库随时随地看小说!1.网络书库软件下载安装2.网络书库服务器设置3.内网穿透工具设置4.公网…

RT-Thread(学习)

RT-Thread是一款完全由国内团队开发维护的嵌入式实时操作系统(RTOS),具有完全的自主知识产权。经过16个年头的沉淀,伴随着物联网的兴起,它正演变成一个功能强大、组件丰富的物联网操作系统。 RT-Thread概述 RT-Threa…

openssl创建CA证书教程

配置生成CA证书 总示意图: (1),通过openssl创建CA证书 第一步:创建一个秘钥,这个便是CA证书的根本,之后所有的东西都来自这个秘钥 # 通过rsa算法生成2048位长度的秘钥 openssl genrsa -out myCA.key 2048 第二步&#…

Wireshark TS | MQ 传输缓慢问题

问题背景 应用传输慢是一种比较常见的问题,慢在哪,为什么慢,有时候光从网络数据包分析方面很难回答的一清二楚,毕竟不同的技术方向专业性太强,全栈大佬只能仰望,而我们能做到的是在专注于自身的专业方向之…

什么是Selenium?使用Selenium进行自动化测试!

你知道什么是 Selenium 吗?你知道为什么要使用它吗?答案就在本文中,很高兴能够与你共飧。 自动化测试正席卷全球,Selenium 认证是业界最抢手的技能之一。 什么是 Selenium? Selenium 是一种开源工具,用于…

Spring Cloud Alibaba Nacos 2.2.3 (2) - 单机版启动 (winodows 和 linux )

Nacos 2.2.3 (1) - 下载与数据库配置 参考下载与数据库配置 启动服务器 执行 nacos-server-2.2.3\bin 下的startup.sh或者startup.cmd (根据不同系统) windows 下nacos 单机启动 方式一: 1,打开cmd 2,cd 到nacos-s…

数据库数据恢复-SQL SERVER数据库分区被格式化的数据恢复方案

SQL SERVER数据库故障类型: 1、SQL SERVER数据库文件被删除。 2、SQL SERVER数据库所在分区格式化。 3、SQL SERVER数据库文件大小变为“0”。 4、使用备份还原数据库时覆盖原数据库。 SQL SERVER数据库故障原因: 1、人为误操作。 2、文件系统损坏&#…

基于Yolov8的工业小目标缺陷检测实战(2):动态蛇形卷积(Dynamic Snake Convolution),实现暴力涨点 | ICCV2023

目录 1.工业油污数据集介绍 1.1 小目标定义 1.2 难点 1.3 工业缺陷检测算法介绍 1.3.1 YOLOv8 2.Dynamic Snake Convolution 2.1 Dynamic Snake Convolution加入到yolov8 3.训练结果分析 4.系列篇 1.工业油污数据集介绍 三星油污缺陷类别:头发丝和小黑点&…

AirtestIDE编辑窗内,脚本内容消失,显示一片红色怎么办?

airtest编辑窗内,脚本内容消失,显示一片红色怎么办 如果突然有一天打开脚本,发现脚本全都变成了红色的点(因未知错误导致的脚本异常): 原本辛辛苦苦写的三百多行代码全消失,是不是很难受很心慌…

Android Camera2获取摄像头的视场角(FOV)信息

一、概念 FOV(Field of View)是一个用于描述视野范围的术语。它通常用于计算设备(如摄像机、虚拟现实头显或眼睛)所能捕捉到的可见区域。 水平FOV(Horizontal FOV):描述视野在水平方向上的范围…