yolov5>onnx>ncnn>apk

标签: 图像处理  yolo  onnx  ncnn  安卓

一. yolov5 pt模型转onnx

条件:
colab notebook
yolov5

1. 安装环境

!pip install onnx>=1.7.0  # for ONNX export
!pip install coremltools==4.0  # for CoreML export
!pip install onnx-simplifier 

2.修改export.py

def forward(self, x):  # x(b,c,w,h) -> y(b,4c,w/2,h/2)
    return self.conv(torch.cat([x, x, x, x], 1))  
    # return self.conv(torch.cat([x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]], 1))

3.导出onnx

%cd /content/yolov5
!python models/export.py --weights /content/yolov5/weights/best.pt --img-size 320 320

4. 简化onnx

!python -m onnxsim /content/yolov5/weights/best.onnx /content/yolov5/weights/last.onnx

二. onnx转ncnn

1.安装环境

!sudo apt-get install autoconf automake libtool curl make g++ unzip

2.编译protobuf

!git clone https://github.com/protocolbuffers/protobuf.git
%cd /content/protobuf
!git submodule update --init --recursive
!./autogen.sh
!./configure
!make
!make check
!sudo make install
!sudo ldconfig

3.编译ncnn

%cd /content
!git clone https://github.com/Tencent/ncnn.git
%cd /content/ncnn
!mkdir -p build
%cd /content/ncnn/build
!cmake -DNCNN_VULKAN=OFF ..  #vulkan是针对gpu的,如果想要ncnn能调用gpu做推理,那么选项需要打开,设置为ON。
!make -j4  #开始编译

4.onnx转ncnn

%cd /content/ncnn/build/tools/onnx/
!./onnx2ncnn last.onnx model.param model.bin

三. 安卓运行ncnn

1.下载文件

git clone https://github.com/cmdbug/YOLOv5_NCNN.git

2. 修改文件

yolo5.h 两处

lass YoloV5 {
public:
    YoloV5(AAssetManager* mgr, const char* param, const char* bin);
    ~YoloV5();
    std::vector<BoxInfo> detect(JNIEnv* env, jobject image, float threshold, float nms_threshold);
    std::vector<std::string> labels{"car"}; //修改labels
private:
    static std::vector<BoxInfo> decode_infer(ncnn::Mat &data, int stride,const cv::Size& frame_size, int net_size,int num_classes,const std::vector<cv::Size>& anchors,float threshold);
    static void nms(std::vector<BoxInfo>& result,float nms_threshold);
    ncnn::Net* Net;
    int input_size = 640;
    int num_class = 1; //修改类型
    std::vector<YoloLayerData> layers{
        {"394",32,{{116,90},{156,198},{373,326}}},
        {"375",16,{{30,61},{62,45},{59,119}}},
        {"output",8,{{10,13},{16,30},{33,23}}},
    };

box.java 一处

public class Box {
    public float x0,y0,x1,y1;
    private int label;
    private float score;
    private static String[] labels={"car"};//修改labels
    public Box(float x0,float y0, float x1, float y1, int label, float score){
        this.x0 = x0;
        this.y0 = y0;
        this.x1 = x1;
        this.y1 = y1;
        this.label = label;
        this.score = score;
    }

jni_interface.cpp 一处

Java_gd_hq_yolov5_YOLOv5_init(JNIEnv* env, jclass, jobject assetManager) {
    if(YoloV5::detector == nullptr){
        AAssetManager* mgr = AAssetManager_fromJava(env, assetManager);
        YoloV5::detector = new YoloV5(mgr,"model.param","model.bin");//修改模型文件
    }
}

直接编译

在这里插入图片描述

有问题添加QQ群:686070107

版权声明:本文为qq_26696715原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_26696715/article/details/109470514

智能推荐

如何写出优美的 JavaScript 代码?

作者:尹锋 链接:https://www.zhihu.com/question/20635785/answer/223515216 1,避免使用 js 糟粕和鸡肋 这些年来,随着 HTML5 和 Node.js 的发展,JavaScript 在各个领域遍地开花,已经从“世界上最被误解的语言”变成了“世界上最流行的语言”。但是由于历史原因,JavaSc...

07-zookeeper的watcher机制原理

zookeeper的watcher机制原理 Watcher 的基本流程 zookeeper的watcher机制,总的来说可以分为三个过程: 客户端注册Watcher。 服务器处理Watcher。 客户端回调Watcher。 客户端注册 watcher有3种方式,getData、exists、getChildren。以如下代码为例,来分析整个触发机制的原理 基于zkclient客户端发起一个数据操作...

Linux搭建Nexus私服

Nexus是什么 Nexus是一个强大的Maven仓库管理器,它极大地简化了自己内部仓库的维护和外部仓库的访问。利用Nexus你可以只在一个地方就能够完全控制访问 和部署在你所维护仓库中的每个Artifact。Nexus是一套“开箱即用”的系统不需要数据库,它使用文件系统加Lucene来组织数据。简单来说,它就是我们自己维护管理的maven仓库,仅限本人或公司内部使用,他人...

【Elastic Stack上】Elastic Search快速入门,让你对ELK日志架构不再困惑

课程介绍 Elastic Stack简介 Elasticsearch的介绍与安装 Elasticsearch的快速入门 Elasticsearch的核心讲解中文分词 全文搜索 Elasticsearch集群 Java客户端讲解 1、Elastic Stack简介 如果你没有听说过Elastic Stack,那你一定听说过ELK,实际上ELK是三款软件的简称,分别是Elasticsearch、Log...

浅谈Java中==和equals()区别

Java基础 浅谈Java中==和equals()区别 == 运算符 equals(): 方法 浅谈Java中==和equals()区别 == 运算符 可以使用在基本数据类型变量和引用数据类型变量中 如果比较的是基本数据类型变量,比较两个变量保存的数据是否相等(不一定要类型相同) 如果比较的是引用类型变量,比较的是两个变量的地址值是否相同,即两个引用是否指向同一个对象实体 equals(): 方法...

猜你喜欢

Python-基础课-第一节-03-Python环境搭建

3.1Python环境搭建 Python是一个跨平台、可移植的编程语言,因此可在windows、Linux和Mac OS X系统 中安装使用。 安装完成后,你会得到Python解释器环境,可以通过终端输入python命令查看本地 是否已经按照python以及python版本。这里有一点需要注意的是,如果没有将 python的安装目录添加到环境变量中,会报错(python不是内部命令或外部命令, 也...

2020-11-26

JS创建自定义对象的几种方式 创建一个Object实例 对象字面量 上面两种方式是创建对象的两种基本方式,他们的原型就是Object 工厂模式 从上面代码中我们可以看出来,工厂模式实际上就是借助函数,内部返回使用第一种方式( new Object())创建的对象。 优点:可以很方便的创建相似对象。 缺点:没有解决对象识别的问题,即怎样知道一个对象的类型。 构造函数方式 构造函数可以创建特定类型的对...

微信小程序重点API使用

小程序的执行流程 注册一个小程序(小程序的生命周期) 注册App时,一般会做什么 判断小程序的进入场景 监听生命周期函数,在生命周期中执行对应的业务逻辑,比如在某个生命周期函数中获取微信用户的信息。 因为App()实例只有一个,并且是全局共享的( 单例对象),所以我们可以将一些共享数据放在这里。 小程序后台存活时间: htps://developers.weixin.qq.com/miniprog...

Vulkan_顶点着色器特效6(二维扭曲)

前面几个案例都是在 3D 空间中对顶点位置进行的变换,但本次将给出一个在 2D 空间中基于顶点位置变换进行二维扭曲的案例。 一、基本原理 介绍本节案例的具体开发之前,首先需要了解二维扭曲的基本情况,如图所示。 从图中可以看出,左侧的原始三角形经过扭曲处理后产生了右侧奇异的形状,犹如一个风车。同时从图中可以看出,要想对原始三角形实现扭曲处理,必须将大三角形切分为很多小三角形。下面简单介绍扭曲的计算思...

【Python】 第2章-12 输出三角形面积和周长 (15分)

  本题要求编写程序,根据输入的三角形的三条边a、b、c,计算并输出面积和周长。注意:在一个三角形中, 任意两边之和大于第三边。三角形面积计算公式:area=√​s(s−a)(s−b)(s−c)​​​,其中s=(a+b+c)/2。 输入格式: 输入为3个正整数,分别代表三角形的3条边a、b、c。 输出格式: 如果输入的边能构成一个三角形,则...