build android,Home · Tencent/ncnn Wiki · GitHub

input data and extract output

#include

#include

#include "net.h"

int main()

{

cv::Mat img = cv::imread("image.ppm", CV_LOAD_IMAGE_GRAYSCALE);

int w = img.cols;

int h = img.rows;

// subtract 128, norm to -1 ~ 1

ncnn::Mat in = ncnn::Mat::from_pixels_resize(img.data, ncnn::Mat::PIXEL_GRAY, w, h, 60, 60);

float mean[1] = { 128.f };

float norm[1] = { 1/128.f };

in.substract_mean_normalize(mean, norm);

ncnn::Net net;

net.load_param("model.param");

net.load_model("model.bin");

ncnn::Extractor ex = net.create_extractor();

ex.set_light_mode(true);

ex.set_num_threads(4);

ex.input("data", in);

ncnn::Mat feat;

ex.extract("output", feat);

return 0;

}

print Mat content

void pretty_print(const ncnn::Mat& m)

{

for (int q=0; q

{

const float* ptr = m.channel(q);

for (int y=0; y

{

for (int x=0; x

{

printf("%f ", ptr[x]);

}

ptr += m.w;

printf("\n");

}

printf("------------------------\n");

}

}

visualize Mat content

void visualize(const char* title, const ncnn::Mat& m)

{

std::vector<:mat> normed_feats(m.c);

for (int i=0; i

{

cv::Mat tmp(m.h, m.w, CV_32FC1, (void*)(const float*)m.channel(i));

cv::normalize(tmp, normed_feats[i], 0, 255, cv::NORM_MINMAX, CV_8U);

cv::cvtColor(normed_feats[i], normed_feats[i], cv::COLOR_GRAY2BGR);

// check NaN

for (int y=0; y

{

const float* tp = tmp.ptr(y);

uchar* sp = normed_feats[i].ptr(y);

for (int x=0; x

{

float v = tp[x];

if (v != v)

{

sp[0] = 0;

sp[1] = 0;

sp[2] = 255;

}

sp += 3;

}

}

}

int tw = m.w < 10 ? 32 : m.w < 20 ? 16 : m.w < 40 ? 8 : m.w < 80 ? 4 : m.w < 160 ? 2 : 1;

int th = (m.c - 1) / tw + 1;

cv::Mat show_map(m.h * th, m.w * tw, CV_8UC3);

show_map = cv::Scalar(127);

// tile

for (int i=0; i

{

int ty = i / tw;

int tx = i % tw;

normed_feats[i].copyTo(show_map(cv::Rect(tx * m.w, ty * m.h, m.w, m.h)));

}

cv::resize(show_map, show_map, cv::Size(0,0), 2, 2, cv::INTER_NEAREST);

cv::imshow(title, show_map);

}

caffe-android-lib+openblas vs ncnn

use squeezenet v1.1, nexus6p, android 7.1.2

memory usage is the RSS item in top utility output

compare item

caffe-android-lib+openblas

ncnn

inference time(1 thread)

228ms

88ms

inference time(8 thread)

152ms

38ms

memory usage

138.16M

21.56M

library binary size

6.9M

<500K

compability

armeabi-v7a-hard with neon or arm64-v8a

armeabi-v7a with neon or arm64-v8a

thirdparty dependency

boost gflags glog lmdb openblas opencv protobuf

none

FAQ

Q ncnn的起源

A 深度学习算法要在手机上落地,caffe依赖太多,手机上也没有cuda,需要个又快又小的前向网络实现

Q ncnn名字的来历

A cnn就是卷积神经网络的缩写,开头的n算是一语n关。比如new/next(全新的实现),naive(ncnn是naive实现),neon(ncnn最初为手机优化),up主名字(←_←)

Q 支持哪些平台

A 跨平台,主要支持 android,次要支持 ios / linux / windows

Q 计算精度如何

A armv7 neon float 不遵照 ieee754 标准,有些采用快速实现(如exp sin等),速度快但确保精度足够高

Q pc 上的速度很慢

A pc都是x86架构的,基本没做什么优化,主要用来核对结果,毕竟up主精力是有限的(

Q 为何没有 logo

A up主是mc玩家,所以开始是找了萌萌的苦力怕当看板娘的,但是这样子会侵权对吧,只好空出来了...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值