修炼之路
主要研究领域包括图像分类、目标检测、OCR、人脸识别等,搞过跨平台的深度学习模型的部署解决方案,设计过分布式的深度学习模型服务架构。
展开
-
实现人脸识别APP(二)
导读上一篇文章介绍了人脸识别组成模块,这篇文章主要介绍一下如何来实现一个人脸识别应用,代码我也开源了,在文章最后有开源地址项目结构这个项目主要实现了人脸检测和人脸识别两个模块,人脸检测是基于retinaface模型,人脸识别是基于insightface实现的。整个的人脸识别项目的结构和之前的图像分类是一样的,这里就不重复介绍了。face_jni.cpp:JNI接口,结合了人脸检测和人脸识别函数,提供给java调用recognition.cpp:封装了人脸识别函数retinaFace.cpp:原创 2021-05-05 23:51:46 · 1034 阅读 · 5 评论 -
实现人脸识别APP(一)
导读前面我们介绍了如何使用ncnn来构建一个基于mobilenet的图像分类应用,通过这个项目大家已经熟悉在移动端上部署深度学习模型的整个流程以及每个步骤。接下来,我们来部署一个稍微复杂点项目,教你如何在手机上来实现一个人脸识别应用。这个应用由两个模型组成,由人脸检测和人脸识别模型组成,我们这里实现的只是一个simple版的。一个人脸识别应用除了人脸检测和人脸识别之外还包括活体检测、姿态检测、质量评估等模块。如果大家有兴趣,后期可以在我的项目上进行扩展现在人脸识别的应用已经随处可见了,刷脸支付、登录、原创 2021-05-05 21:06:49 · 2832 阅读 · 2 评论 -
在Android上部署深度学习模型之apk的编译(九)
导读上一篇文章中,我们已经实现了按钮的功能,并且通过CPU和GPU来调用JNI里面的函数来预测图片,这篇文章就教大家如何来编译apk,并且将编译出来的apk文件安装到手机里。Android手机调试Android studio提供了两种方式来调试,一种是通过Android模拟器,另一种是使用真机来调试。这里我们使用真机来调试打开手机的开发者模式不同的机型会略有差别,具体大家可以百度,我这里主要介绍华为手机打开开发者模式的方法,打开设置–>关于手机(滑到最下面)–>点击版本号,如下图所示原创 2021-05-05 15:43:47 · 599 阅读 · 0 评论 -
在Android上部署深度学习模型之按钮功能实现(八)
导读上篇文章我们介绍了Android UI设计的相关知识,这篇文章我们来看看如何来实现这些按钮的功能。按钮功能实现在我们启动APP的时候会执行MainActivity.java中的代码,文件路径如下创建全局变量和图片识别对象定义控件的全局变量用来保存信息,并且创建一个图片识别对象 private static final int SELECT_IMAGE = 1; //结果展示控件 private TextView infoResult; //图片展示控件原创 2021-05-05 14:42:57 · 340 阅读 · 0 评论 -
在Android上部署深度学习模型之UI设计(七)
导读前面介绍了一些Android相关的配置文件,这篇文章我们主要来介绍一下Android UI设计相关的知识,如何来设计界UI。Android的布局Android的UI主要是利用布局结合控件来设计出展示给用户的UI,Android中常用的布局主要有LinearLayout(线性布局)、RelativeLayout(相对布局)、FrameLayout(帧布局)、TableLayout(表格布局)、AbsoluteLayout(绝对布局)、GridLayout(网格布局)。控件主要包括有文本控件、按钮控原创 2021-05-05 12:11:47 · 595 阅读 · 0 评论 -
在Android上部署深度学习模型之Android配置文件(六)
导读这篇文章我们主要讲下,我们用到的一些配置文件以及相关的一些设置,只要稍微了解一下知道那个配置文件是干什么的就行。build.gradle配置文件在使用Android studio创建Android项目的时候,默认会创建两个build.gradle文件,一个是工程目录下的,一个是module目录下的,一个工程目录下可以由多个module。我们下面来看看这两个build.gradle文件的位置工程目录下的build.gradle我们不需要过多关注,使用默认设置即可。这里主要介绍一下app目录下的b原创 2021-05-05 12:01:33 · 510 阅读 · 0 评论 -
在Android上部署深度学习模型之编写JNI接口(五)
导读上篇文章我们介绍了CMakeLists文件的编写,以及相关参数的配置。在配置好环境之后,我们就开始编写我们的cpp了,因为我这里实现的功能比较简单,所以就直接通过一个jni.cpp就可以实现这些功能。如果功能复杂,使用的模型比较多,最好多分成几个cpp便于管理和更新。JNI函数编写JNI(java native interface),用来编写java与c++交互的接口,在编写的时候需要注意一些编写的规则,java数据类型与c++数据类型的转换。这里简单介绍一下JNI中的数据类型在JNI中如原创 2021-05-05 11:49:41 · 703 阅读 · 9 评论 -
在Android上部署深度学习模型之CMakeLists文件(四)
导读在上篇文章中,我们已经介绍过了如何给Android项目来配置一个ncnn的环境,这篇文章我们主要来介绍一下如何来配置CMakeLists.txt文件。CMakeLists.txt文件CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库。下面来看看如何编写CMakeList.txt原创 2021-05-05 11:22:25 · 672 阅读 · 2 评论 -
在Android上部署深度学习模型之ncnn库的编译(三)
导读前面我们介绍了项目的结构和一些相关的配置文件,在编译JNI的时候我们需要先在Android studio里面配置一个ncnn的环境,然后再编写jni.cpp调用C++的代码,最后通过Java代码去调用jni.cpp对外提供的接口前面介绍过如何在Windows上编译ncnn,编译出来的lib库只能用于Windows,现在我们需要在Android studio中调用就需要将ncnn编译为so或a库,我们可以直接在Windows上进行编译也可以在Linux系统下来编译编译Android的ncnn库下原创 2021-05-05 00:20:28 · 1245 阅读 · 3 评论 -
在Android上部署深度学习模型之项目结构(二)
导读前面我们通过c++实现了mobilenet模型的调用,现在我们想通过Android来调用c++代码,来实现Android端深度学习模型的部署。IOS端可以通过object c直接调用c++代码,Android提供了JNI用来调用c++代码JNIJNI (Java Native Interface,Java本地接口)是一种编程框架,使得Java虚拟机中的Java程序可以调用本地应用/或库,也可以被其他程序调用。 本地程序一般是用其它语言(C、C++或汇编语言等)编写的,并且被编译为基于本机硬件和操作原创 2021-05-04 22:10:49 · 951 阅读 · 0 评论 -
在Android上部署深度学习模型之Android NDK(一)
导读前面我们介绍过了如何来安装ncnn以及搭建ncnn的环境,并且通过VS编写了一个基于mobilenet的图像分类实例。接下来,我们开始介绍如何将mobilenet的图像分类模型部署到手机端,主要介绍Android端的部署,IOS端和Android差不多,只需要把代码移植到IOS环境下重新编译一下即可。环境操作系统:win10开发工具:Android studio开发Android应用当然离不开Android studio了,当然我们作为一名算法工程师并不需要去开发一个Android应用,通原创 2021-05-04 21:31:47 · 1681 阅读 · 10 评论 -
使用ncnn模型预测获取错误的结果
导读在使用ncnn来构建c++的预测代码时,有时候得到的结果与python代码的预测结果不一致,这样会降低模型预测的准确率甚至会使得模型的预测结果变得不可靠,这时候我们就需要检测自己的代码是否存在问题,这篇文章将会介绍,当出现这种情况时,我们应该如何来解决。caffemodel should be row-major如果使用的是caffe的模型,需要注意ncnn的caffe2ncnn工具转换模型的时候是以caffe的模型为row-major的格式来进行转换的。row-major以下面这个3×3的权重参原创 2021-05-04 20:54:40 · 1164 阅读 · 0 评论 -
ncnn常见的错误以及解决办法
param is too old, please regenerate这个问题的主要原因是因为模型(param)文件的格式太旧了导致的,通过从git上clone最新的ncnn代码,然后在build之后,通过模型转换工具将模型转换为param和bin文件,转换完成之后,请查看param文件的第一行是不是7767517。find_blob_index_by_name XYZ failed这种错误通常是发生在Extractor::input()/extract(),通过blob name来获取网络中的某些层原创 2021-05-04 20:34:25 · 5673 阅读 · 0 评论 -
基于mobilenet的ncnn代码实例详解
导读上一篇文章我们使用Python基于mxnet框架实现了一个模型的预测,这篇文章我们使用C++基于ncnn来实现模型的预测新建cpp文件我们将之前ncnn_example项目ncnn_example.cpp里面的main函数改名为main1(不然后面编译时可能会报错),再重新添加一个cpp,点击项目下的源文件–>右键–>添加–>新建项代码解析导入头文件我们需要先导入C++需要依赖的一些头文件,以及相关ncnn和OpenCV的头文件,如果想使用GPU需要依赖vulkan,在原创 2021-05-04 12:08:31 · 766 阅读 · 2 评论 -
Python使用mobilenet的预训练模型进行预测
导读上一篇文章中我们利用ncnn的例子在visual studio中配置了一个ncnn的运行环境,接下来我们会介绍如何来利用ncnn部署一个自己的模型,这里我们利用ImageNet的mobilenet1.0为例,这篇文章我们先介绍如何在python中使用这个模型来做预测,后面再将这个模型迁移到ncnn中。先用Python实现模型预测的主要目的是为了验证模型的结果,保证Python中的预测结果与C++中的结果一致,因为在使用ncnn做模型预测的时候,很有可能因为你的某一个操作环境出错而导致你的模型预测错误原创 2021-05-04 10:56:10 · 1931 阅读 · 0 评论 -
在visual studio中配置ncnn环境
导读上一篇文章中我们介绍了如何将其他框架的模型转换为ncnn的模型,后面我们在开发SDK的时候需要基于visual studio来编写代码,这篇文章主要教大家如何在visual studio中来配置一个ncnn的环境,便于后面基于ncnn来调用我们的模型。如果你已经比较熟悉基于visual studio的c++开发,这篇文章可以跳过。ncnn的examplencnn官方也提供了不少模型调用的例子,在examples目录下有fasterrcnn、mobilenetv2ssdlite、retinafac原创 2021-05-03 23:57:29 · 974 阅读 · 0 评论 -
使用ncnn对模型文件的格式进行转换
导读上一篇文章中我们介绍了如何在windows上配置一个ncnn的环境,这篇文章我们来介绍如何将mxnet、caffe、TensorFlow、pytorch、keras等深度学习框架训练的模型转换为ncnn的模型,以便于我们后面部署在各种生产环境上。这里主要还是以windows为例ncnn转换工具在我们编译好ncnn之后,在ncnn目录里面有一个tools目录,里面包含了一些模型的转换工具目前ncnn官方只提供了mxnet、onnx、caffe模型的转换,对于其它框架训练的模型需要使用第三方工具或原创 2021-05-03 21:36:49 · 1637 阅读 · 0 评论 -
在Windows上搭建ncnn环境
导读上一篇文章,我们介绍了一下ncnn框架的特性以及支持的平台,这篇文章我们介绍一下如何在Windows上来安装ncnnncnn是支持多个平台的,这里我仅仅演示如何在Windows上来搭建ncnn的环境,最终在Windows上编写的SDK,我们只需要将其移植到不同的操作系统下编译即可生成我们需要的库文件环境要求操作系统:win10visual studio安装下载地址:visual studio社区版安装地址这里大家下载社区版的vs就行了,我下的是2019版本差别不大,点击安装即可,在安装原创 2021-05-03 20:51:55 · 1574 阅读 · 0 评论 -
移动端深度学习模型部署框架ncnn介绍
导读当我们把深度学习模型训练好之后,想要基于深度学习模型来开发实际应用的时候,主要有三种不同的应用场景移动端、桌面端和服务器端。移动端部署:我们将模型封装成SDK给Android和IOS调用,由于移动端算力有限通常还需要考虑基于移动端CPU或GPU框架的优化问题来提速。如果模型要求的算力比较大,就只能考虑以API的形式来调用了,这时候模型是部署在服务器上的。桌面端:桌面应用主要包括Windows和Mac OS以及Linux,这时候我们还是需要将模型封装成SDK然后提供接口来进行调用。Windows将原创 2021-05-02 21:53:00 · 3625 阅读 · 0 评论