微信小程序本地存储与登录页面处理实例详细讲解
1108
2022-08-31
PC端NCNN部署
1 NCNN部署
1.在电脑端使用ncnn实现分类(alexnet)
s1,安装g++,cmake,protobuf,opencv
s2,对源码进行编译
git clone cd
s3,准备caffe模型文件(alexnet)
deploy.prototxt snapshot_10000.caffemodel
alexnetdeploy.prototxt,caffemodel
s4,使用ncnn转换工具将旧caffe版本的prototxt和caffemodel转新版本 将旧caffe版本的prototxt和caffemodel存放在caffe/build/tools目录下,执行如下命令完成转换
./upgrade_net_proto_text [old prototxt] [new prototxt]./upgrade_net_proto_binary [old caffemodel] [new caffemodel]
s5,将deploy.prototxt中输入层替换成input层(如果只读取一张图片将dim设置为1)
layer { name: "data" type: "Input" top: "data" input_param { shape: { dim: 1 dim: 3 dim: 227 dim: 227 } }}
s6,使用caffe2ncnn工具将caffe model转成ncnn model
./caffe2ncnn deploy.prototxt bvlc_alexnet.caffemodel alexnet.param alexnet.bin
在ncnn/build/tools目录下生成param和bin文件。
s7,对模型参数进行加密
./ncnn2mem alexnet.param alexnet.bin alexnet.id.h alexnet.mem.h
在ncnn/build/tools目录下生成.param、.bin和.h文件。 alexnet.param 网络的模型参数 alexnet.bin 网络的权重 alexnet.id.h 在预测图片的时候使用到
#include
代码是最简单的ncnn使用场景,可以根据自己需求加入代码。
s9,编译代码 (1) 编写CMakeLists.txt 在CMakeLists.txt增加如下两行代码
add_executable(demo demo.cpp)target_link_libraries(demo ncnn)
CMakeLists.txt如下
find_package(OpenCV QUIET COMPONENTS core highgui imgproc imgcodecs) if(NOT OpenCV_FOUND) find_package(OpenCV REQUIRED COMPONENTS core highgui imgproc) endif() include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../src) include_directories(${CMAKE_CURRENT_BINARY_DIR}/../src) add_executable(squeezenet squeezenet.cpp) target_link_libraries(squeezenet ncnn ${OpenCV_LIBS}) add_executable(fasterrcnn fasterrcnn.cpp) target_link_libraries(fasterrcnn ncnn ${OpenCV_LIBS}) add_executable(demo demo.cpp) target_link_libraries(demo ncnn) add_subdirectory(ssd)
(2) 在ncnn根目录下CMakeLists.txt中编译examples语句的注释去掉
############################################### add_subdirectory(examples)# add_subdirectory(benchmark)add_subdirectory(src)if(NOT ANDROID AND NOT IOS)add_subdirectory(tools)endif()
(3)ncnn/build目录下进行编译,生成demo可执行文件
make
s10,执行 将生成的.param和.bin文件复制到ncnn/build/examples目录下,然后终端cd到ncnn/build/examples,执行:
./demo data_path1 data_path2
2. Win x64 (Visual Studio Community 2017)
s1,安装Visual Studio Community 2017
download Visual Studio Community 2017 from itStart → Programs → Visual Studio 2017 → Visual Studio Tools → x64 Native Tools Command Prompt for VS 2017
s2,编译protobuf
download protobuf-3.4.0 from cd
s3,编译ncnn库
> cd
3. Android端使用ncnn
2)配置ndk的环境变量
打开profile
sudo
在profile文件末尾添加ndk路径
export NDK_HOME=sdkroot/ndk-bundlePATH=$NDK_HOME:$PATH
保存退出,使用source命令使环境变量生效
source
验证ndk是否配置成功
ndk-build -v
s2,编译ncnn sdk 通过如下命令编译ncnn sdk,会在ncnn/build-android下生成install文件夹,其中包括:include(调用ncnn所需的头文件)和lib(编译得到的ncnn库libncnn.a)
mkdir build-androidcd build-androidcmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \ -DANDROID_ABI="armeabi-v7a" -DANDROID_ARM_NEON=ON \ -DANDROID_PLATFORM=android-14 ..makemake installmake
参数设置请参考:是架构名字,"armeabi-v7a" 支持绝大部分手机硬件ANDROID_ARM_NEON 是否使用 NEON 指令集,设为 ON 支持绝大部分手机硬件ANDROID_PLATFORM 指定最低系统版本,"android-14" 就是 android-4.0
s3,对源码进行编译
git clone cd
s4,准备caffe模型文件(alexnet)
deploy.prototxt snapshot_10000.caffemodel
alexnet deploy.prototxt, caffemodel
s5,使用ncnn转换工具将旧caffe版本的prototxt和caffemodel转新版本
将旧caffe版本的prototxt和caffemodel存放在caffe/build/tools目录下,执行如下命令完成转换
./upgrade_net_proto_text [old prototxt] [new prototxt]./upgrade_net_proto_binary [old caffemodel] [new caffemodel]
s6,将deploy.prototxt中输入层替换成input层(如果只读取一张图片将dim设置为1)
layer { name: "data" type: "Input" top: "data" input_param { shape: { dim: 1 dim: 3 dim: 227 dim: 227 } }}
s7,使用caffe2ncnn工具将caffe model转成ncnn model
./caffe2ncnn deploy.prototxt bvlc_alexnet.caffemodel alexnet.param alexnet.bin
在ncnn/build/tools目录下生成param和bin文件。
s8,对模型参数进行加密
./ncnn2mem alexnet.param alexnet.bin alexnet.id.h alexnet.mem.h
在ncnn/build/tools目录下生成.param、.bin和.h文件。
alexnet.param 网络的模型参数
alexnet.bin 网络的权重
alexnet.id.h 在预测图片的时候使用到
s9,开发安卓项目
(1)在Android Studio上创建一个NCNN1,并选择Include C++ support
(2)在main目录下创建assets目录,并将alexnet.param、alexnet.bin、label.txt拷贝其中
(3)将include文件夹和 alexnet.id.h拷贝到cpp目录下
(4)在main目录下创建jniLibs/armeabi-v7a/目录,并将alexnet.id.h 拷贝其中
(5)在cpp文件夹下创建C++文件,用于加载模型和预测图片
#include
(6)在项目包com.example.ncnn1下,修改MainActivity.java中的代码
package com.example.ncnn1; import android.Manifest; import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.content.res.AssetManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android-.Uri; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.text.method.ScrollingMovementMethod; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.RequestOptions; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class MainActivity extends Activity { private static final String TAG = MainActivity.class.getName(); private static final int USE_PHOTO = 1001; private String camera_image_path; private ImageView show_image; private TextView result_text; private boolean load_result = false; private int[] ddims = {1, 3, 224, 224}; private int model_index = 1; private List
(7)在项目的包com.example.ncnn1下,创建一个NcnnJni.java类,用于提供JNI接口,代码如下:
package com.example.ncnn1; import android.graphics.Bitmap; public class NcnnJni { public native boolean Init(byte[] param, byte[] bin); public native float[] Detect(Bitmap bitmap); static { System.loadLibrary("ncnn_jni"); } }
(8)在项目的包com.example.ncnn1下,创建一个PhotoUtil.java类,这个是图片的工具类,代码如下:
package com.example.ncnn1; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android-.Uri; import android.provider.MediaStore; import java.nio.FloatBuffer; public class PhotoUtil { // get picture in photo public static void use_photo(Activity activity, int requestCode) { Intent intent = new Intent(Intent.ACTION_PICK); intent.setType("image/*"); activity.startActivityForResult(intent, requestCode); } // get photo from Uri public static String get_path_from_URI(Context context, Uri uri) { String result; Cursor cursor = context.getContentResolver().query(uri, null, null, null, null); if (cursor == null) { result = uri.getPath(); } else { cursor.moveToFirst(); int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); result = cursor.getString(idx); cursor.close(); } return result; } // compress picture public static Bitmap getScaleBitmap(String filePath) { BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inJustDecodeBounds = true; BitmapFactory.decodeFile(filePath, opt); int bmpWidth = opt.outWidth; int bmpHeight = opt.outHeight; int maxSize = 500; // compress picture with inSampleSize opt.inSampleSize = 1; while (true) { if (bmpWidth / opt.inSampleSize < maxSize || bmpHeight / opt.inSampleSize < maxSize) { break; } opt.inSampleSize *= 2; } opt.inJustDecodeBounds = false; return BitmapFactory.decodeFile(filePath, opt); } }
(9)修改启动页面的布局,修改如下:
(10)修改APP目录下的CMakeLists.txt文件,修改如下:
# For more information about using CMake with Android Studio, read the # documentation: # Sets the minimum version of CMake required to build the native library. cmake_minimum_required(VERSION 3.4.1) # Creates and names a library, sets it as either STATIC # or SHARED, and provides the relative paths to its source code. # You can define multiple libraries, and CMake builds them for you. # Gradle automatically packages shared libraries with your APK. set(ncnn_lib ${CMAKE_SOURCE_DIR}/src/main/jniLibs/armeabi-v7a/libncnn.a) add_library (ncnn_lib STATIC IMPORTED) set_target_properties(ncnn_lib PROPERTIES IMPORTED_LOCATION ${ncnn_lib}) add_library( # Sets the name of the library. ncnn_jni # Sets the library as a shared library. SHARED # Provides a relative path to your source file(s). src/main/cpp/ncnn_jni.cpp ) # Searches for a specified prebuilt library and stores the path as a # variable. Because CMake includes system libraries in the search path by # default, you only need to specify the name of the public NDK library # you want to add. CMake verifies that the library exists before # completing its build. find_library( # Sets the name of the path variable. log-lib # Specifies the name of the NDK library that # you want CMake to locate. log ) # Specifies libraries CMake should link to your target library. You # can link multiple libraries, such as libraries you define in this # build script, prebuilt third-party libraries, or system libraries. target_link_libraries( # Specifies the target library. ncnn_jni ncnn_lib jnigraphics # Links the target library to the log library # included in the NDK. ${log-lib} )
(11)修改APP目录下的build.gradle文件,修改如下:
apply plugin: 'com.android.application' android { compileSdkVersion 28 defaultConfig { applicationId "com.example.ncnn1" minSdkVersion 21 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" externalNativeBuild { cmake { cppFlags "-std=c++11 -fopenmp" abiFilters "armeabi-v7a" } } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } externalNativeBuild { cmake { path "CMakeLists.txt" } } sourceSets { main { jniLibs.srcDirs = ["src/main/jniLibs"] jni.srcDirs = ['src/cpp'] } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:28.0.0-rc02' implementation 'com.android.support.constraint:constraint-layout:1.1.3' testImplementation 'junit:junit:4.12' implementation 'com.github.bumptech.glide:glide:4.3.1' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' }
(12)最后在配置文件中添加权限
(13)编译完成
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~