ncnn编译使用(一)
来源:互联网 发布:工商名录采集软件 编辑:程序博客网 时间:2024/06/05 14:25
ncnn前向框架简介
以下介绍来自官网介绍
ncnn 是一个为手机端极致优化的高性能神经网络前向计算框架。ncnn 从设计之初深刻考虑手机端的部署和使用。无第三方依赖,跨平台,手机端 cpu 的速度快于目前所有已知的开源框架。基于 ncnn,开发者能够将深度学习算法轻松移植到手机端高效执行,开发出人工智能 APP,将 AI 带到你的指尖。ncnn 目前已在腾讯多款应用中使用,如 QQ,Qzone,微信,天天P图等。
功能概述
- 支持卷积神经网络,支持多输入和多分支结构,可计算部分分支
- 无任何第三方库依赖,不依赖 BLAS/NNPACK 等计算框架
- 纯 C++ 实现,跨平台,支持 android ios 等
- ARM NEON 汇编级良心优化,计算速度极快
- 精细的内存管理和数据结构设计,内存占用极低
- 支持多核并行计算加速,ARM big.LITTLE cpu 调度优化
-整体库体积小于 500K,并可轻松精简到小于 300K - 可扩展的模型设计,支持 8bit 量化和半精度浮点存储,可导入 caffe 模型
- 支持直接内存零拷贝引用加载网络模型
- 可注册自定义层实现并扩展
安装
下载源码完成编译
git clone https://github.com/Tencent/ncnncd ncnnmkdir buildcd buildcmake ..make -jmake install
测试
这里我们测试Alexnet进行分类。模型下载地址:https://dl.caffe.berkeleyvision.org/bvlc_alexnet.caffemodel
由于alexnet是用老版caffe训练完成的,参数保存不一致,为了提升到现有的caffe版本,使用下面命令:
~/caffe/build/tools/upgrade_net_proto_text deploy.prototxt new_deplpy.prototxt~/caffe/build/tools/upgrade_net_proto_binary bvlc_alexnet.caffemodel new_bvlc_alexnet.caffemodel
之后将caffe模型转换为ncnn的模型:
./caffe2ncnn ../../examples/alexnet/deploy.prototxt ../../examples/alexnet/bvlc_alexnet.caffemodel ../../examples/alexnet/alexnet.param alexnet.bin
编写测试代码如下:
#include <iostream>#include <fstream>#include <stdio.h>#include <algorithm>#include <vector>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include "net.h"using namespace std;void read_label(std::string label_path, vector<string> &labels){ ifstream infile; infile.open(label_path.data()); assert(infile.is_open()); string line; while(getline(infile, line)){ labels.push_back(line); } infile.close();}static int detect_squeezenet(const cv::Mat& bgr, std::vector<float>& cls_scores){ ncnn::Net squeezenet; squeezenet.load_param("alexnet.param"); squeezenet.load_model("alexnet.bin"); ncnn::Mat in = ncnn::Mat::from_pixels_resize(bgr.data, ncnn::Mat::PIXEL_BGR, bgr.cols, bgr.rows, 227, 227); const float mean_vals[3] = {104.f, 117.f, 123.f}; in.substract_mean_normalize(mean_vals, 0); ncnn::Extractor ex = squeezenet.create_extractor(); ex.set_light_mode(true); ex.input("data", in); ncnn::Mat out; ex.extract("prob", out); cls_scores.resize(out.c); for (int j=0; j<out.c; j++) { const float* prob = out.data + out.cstep * j; cls_scores[j] = prob[0]; } return 0;}static int print_topk(const std::vector<float>& cls_scores, int topk, vector<string> labels){ // partial sort topk with index int size = cls_scores.size(); std::vector< std::pair<float, int> > vec; vec.resize(size); for (int i=0; i<size; i++) { vec[i] = std::make_pair(cls_scores[i], i); } std::partial_sort(vec.begin(), vec.begin() + topk, vec.end(), std::greater< std::pair<float, int> >()); // print topk and score for (int i=0; i<topk; i++) { float score = vec[i].first; int index = vec[i].second; fprintf(stderr, "%d = %f\n", index, score); cout << labels[index] << endl; } return 0;}int main(int argc, char** argv){ const char* imagepath = argv[1]; cv::Mat m = cv::imread(imagepath, CV_LOAD_IMAGE_COLOR); if (m.empty()) { fprintf(stderr, "cv::imread %s failed\n", imagepath); return -1; } vector<string> labels; read_label("./label.txt", labels); std::vector<float> cls_scores; detect_squeezenet(m, cls_scores); print_topk(cls_scores, 3, labels); return 0;}
测试结果
为了编译上述代码,我们使用cmake设置编译环境
cmake_minimum_required(VERSION 3.5)find_package(OpenCV REQUIRED core highgui imgproc)#include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../src)#include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../src)include_directories(/home/young/deeplearning/ncnn/build/install/include)link_directories(/home/young/deeplearning/ncnn/build/install/lib)FIND_PACKAGE( OpenMP REQUIRED) if(OPENMP_FOUND) message("OPENMP FOUND") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}") endif() add_executable(classify classify.cpp)target_link_libraries(classify ncnn ${OpenCV_LIBS})
编译完成,运行如下命令:
./classify ./test.jpg
结果如下:
260 = 0.354059n02112137 狗273 = 0.231026n02115641 狼270 = 0.065178n02114548 狼
todo
学习源码,进行优化
阅读全文
0 0
- ncnn编译使用(一)
- Windows 下编译ncnn的android端的库
- NCNN在RK3288 Linux系统的原生编译问题解决
- 在X86上交叉编译ARM64 linux上的NCNN
- ncnn安卓搭建并使用自己的模型
- ncnn实例教程
- 腾讯优图开源项目ncnn
- 使用Code::Blocks编译VC程序(一)
- ClamAV编译安装和使用(一)
- 使用ant编译Android工程(一)
- Fmpeg Ios 库编译和使用(一)
- 在ncnn上把玩mobileNet
- sqlite使用总结(一)搭建编译与使用环境
- 【Vim使用】6.quickfix使用及一键编译
- Android greenDao 使用教程(一)源码编译与使用
- BJAM编译工具的使用(一)——如何编译Boost,最新boost编译方法
- 腾讯开源ncnn:示例程序运行
- ncnn与NNPACK-darknet速度比较
- 权限管理系统
- Spring Boot Actuator 添加 Git 和 Build 信息
- UFLDL 教程学习笔记:8.处理大型图像
- 3Sum Closest -- LeetCode
- 使程序在Linux下后台运行 (关掉终端继续让程序运行的方法)
- ncnn编译使用(一)
- 元组有关
- 高性能网络编程(七)--tcp连接的内存使用
- Node.js入门(二)——简单读写文件
- least-2017
- 【BZOJ2242】计算器
- VIM系列一:ctags安装使用说明
- 学习笔记
- 优先级队列.c