在ncnn上把玩mobileNet

YOLO系列如何通过ncnn模型部署Android ncnn 是一个为手机端极致优化的高性能神经网络前向计算框架。 ncnn 从设计之初深刻考虑手机端的部署和使用。 无第三方依赖,跨平台,手机端 cpu 的速度快于目前所有已知的开源框架。 阅读详情

ncnn是腾讯优图最近开源的适合移动端的深度学习框架。mobileNet是谷歌在2017年4月份发表的论文MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications中提出的网络。由于引入了depthwise convolution,mobileNet的模型非常小,1000类的分类模型只有16.9M,很适合在移动端部署。本文尝试在Mac上用ncnn来运行mobileNet。

1. 下载并编译ncnn

git clone https://github.com/Tencent/ncnn
cd ncnn
mkdir build && cd build
cmake ..
make -j
make install

编译完成后在ncnn/build/tools 目录下,可以看到已经生成了 caffe2ncnn和ncnn2mem这两个可执行文件。caffe2ncnn可的作用是将caffe模型生成ncnn 模型,ncnn2mem可对模型进行加密。

2. 下载MobileNet的caffe模型和配置文件

可从https://github.com/shicai/MobileNet-Caffe中下载,下载后得到mobilenet_deploy.prototxt和mobilenet.caffemodel两个文件。

3. 旧版caffe模型转新版caffe模型

因为ncnn只支持转换新版的caffe模型,所以需要先把第二步下载的caffe模型转换为新版的caffe模型。新版caffe框架中自带了转换的工具,使用姿势如下。

$ ~/caffe/build/tools/upgrade_net_proto_text mobilenet_deploy.prototxt mobilenet_deploy_new.prototxt
$ ~/caffe/build/tools/upgrade_net_proto_binary mobilenet.caffemodel mobilenet_new.caffemodel

4. 新版caffe模型转ncnn模型

在第一步生成的ncnn/build/tools目录下用caffe2ncnn来转换新版的mobileNet模型。

$./caffe2ncnn mobilenet_deploy_new.prototxt mobilenet_new.caffemodel mobilenet.param mobilenet.bin

注意生成的ncnn格式的模型中,.param可以理解为网络的配置文件,.bin可以理解为网络的参数(各种权重)文件。
若需要对模型进行加密,可用如下命令

 $./ncnn2mem mobilenet.param mobilenet.bin mobilenet.id.h mobilenet.mem.h

最后可生成 mobilenet.param.bin 这样的二进制加密文件。ncnn对加密和非加密两种文件的读取方式不一样。

//load非加密的ncnn模型
ncnn::Net net;
net.load_param("mobilenet.param");
net.load_model("mobilenet.bin");
//load加密的ncnn模型
ncnn::Net net;
net.load_param_bin("mobilenet.param.bin");
net.load_model("mobilenet.bin");

5. 开工:使用Xcode编写代码运行

使用Xcode新建一个工程,并把第一步中编译完成的ncnn库导入工程中。编译完成的ncnn lib在ncnn/build/install目录下。
配置好ncnn库后,可以借鉴example下面的squeezenet.cpp代码进行mobileNet模型的部署。修改后的代码如下

static int detect_mobileNet(const cv::Mat& bgr, std::vector<float>& cls_scores)
{
    ncnn::Net mobileNet;
    mobileNet.load_param("/Users/Guigu/Documents/projects/ncnn_mobileNet/mobilenet.param");
    mobileNet.load_model("/Users/Guigu/Documents/projects/ncnn_mobileNet/mobilenet.bin");

    ncnn::Mat in = ncnn::Mat::from_pixels_resize(bgr.data, ncnn::Mat::PIXEL_BGR, bgr.cols, bgr.rows, 224, 224);

    const float mean_vals[3] = {103.94f, 116.78f, 123.68f};
    const float norm_vals[3] = {0.017f,0.017f,0.017f};
    in.substract_mean_normalize(mean_vals, norm_vals);


    ncnn::Extractor ex = mobileNet.create_extractor();
    ex.set_light_mode(true);

    ex.input("data", in);

    ncnn::Mat out;
    ex.extract("fc7", out);  //此处与squeezenet不同

    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;
}

在main函数中调用该接口就OK了。

下面这张图是我测试的图
这里写图片描述

mobileNet识别的结果如下:

detection time: 852ms
917 = 13.889417 ( comic book)
643 = 13.157956 ( mask)
921 = 7.961194 ( book jacket, dust cover, dust jacket, dust wrapper)
Program ended with exit code: 0

细心的人可能观察到耗时比较长,原因是用Mac自带的编译器编ncnn的时候不能把openmp编进去。另外,Mac上也不能通过arm neon来加速(毕竟平台不一样嘛)。

完整的工程地址:https://github.com/Revo-Future/ncnn_mobileNet

Bonus

如果想编译源代码,可以把ncnn中src目录下的文件加上build/src下的platform.h layer_registry.h 和layer_declaration.h放到一起替换上面的ncnn lib进行源码的编译研究。

Reference:
http://blog.youkuaiyun.com/best_coder/article/details/76201275

手把手教你用NCNN在C++中部署轻量级神经网络(附完整代码示例) 本文详细介绍了如何在C++项目中部署轻量级神经网络推理框架NCNN。通过从环境搭建、模型转换到编写高效推理代码的完整实战流程,帮助开发者快速掌握在移动端和嵌入式设备上进行高效AI模型部署的核心技能,并附有可直接使用的代码示例。 阅读详情

相关推荐

基于mobilenet的ncnn代码实例详解

导读 上一篇文章我们使用Python基于mxnet框架实现了一个模型的预测,这篇文章我们使用C++基于ncnn来实现模型的预测 新建cpp文件 我们将之前ncnn_example项目ncnn_example.cpp里面的main函数改名为main1(不然后面编译时可能会报错),再重新添加一个cpp,点击项目下的源文件–>右键–>添加–>新建项 代码解析 导入头文件 我们需要先导入C++需要依赖的一些头文件,以及相关ncnn和OpenCV的头文件,如果想使用GPU需要依赖vulkan,在

修炼之路 1101

ncnn2mem

文件:ncnn2mem.cpp 说明  : 将ncnn的proto文本文件转换成二进制文件,并基于layer name在ncnn的param中的顺序进行编号,生成*.id.h文件。 把ncnn的param和model二进制文件dump到*.mem.h文件中 该操作比较简单,不做详细的描述;在ncnn模型加载时,会对这两种模型存储形式分别进行描述。 如果需要将网络结构和模型合并为一个文件,需...

qingsong1001的专栏 2666

MobileNet-SSD框架在Android和NCNN上的高效实现

SSD(Single Shot MultiBox Detector)是一种高效的目标检测算法,它通过在不同的深度层上预测边界框和分类概率来实现快速且准确的目标检测。SSD将目标检测过程简化为单一的深度神经网络前向传播,大幅减少了计算资源需求,适合在硬件条件有限的移动设备上部署。

weixin_42515392的博客 1361

caffe模型转ncnn模型

ncnn是腾讯优图最近开源的适合移动端的深度学习框架。mobileNet是谷歌在2017年4月份发表的论文MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications中提出的网络。由于引入了depthwise convolution,mobileNet的模型非常小,1000类的分类模型只有16....

soralaro的博客 6949

ncnnSrcDemo:基于iOS直接调试ncnn源码,方便理解分析

ncnnSrcDemo:基于iOS直接调试ncnn源码,方便理解分析

android 运动目标检测_MindSpore应用案例:AI对篮球运动员目标的检测

MindSpore作为一个端边云协同的开源的全场景AI框架,今年3月份开源以来,受到了业界的广泛关注和应用,欢迎大家参与开源贡献、模型众智合作、行业创新与应用、学术合作等,贡献您在云侧、端侧 (HiMindSpore 应用程序)、边侧以及安全领域的应用案例。MindSpore与您在AI领域共同成长,让AI使能千行百业,释放出强大的生产力。本文讲述的是MindSpore对篮球运动员目标的检测应用,通...

weixin_33603813的博客 832

【转】在ncnn上把玩mobileNet

转自:https://blog.youkuaiyun.com/computerme/article/details/77876633 ncnn是腾讯优图最近开源的适合移动端的深度学习框架。mobileNet是谷歌在2017年4月份发表的论文MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications中提出...

lanyuxuan100的博客 1018

RT-DETR改进有效系列目录 | 包含卷积、主干、RepC3、注意力机制、Neck上百种创新机制

Hello,各位读者们好Hello,各位读者,距离第一天发RT-DETR的博客已经过去了接近两个月,这段时间里我深入的研究了一下RT-DETR在ultralytics仓库的使用,旨在为大家解决为什么用v8的仓库训练的时候模型不收敛,精度差的离谱的问题,我也是成功的找到了解决方案,对于ultralytics仓库进行多处改进从而让其还原RT-DETR官方的实验环境从而达到一比一的效果。同时本人一些讲解视频和包含我所有创新的RT-DETR文档。

Snu77的博客 3万+

腾讯NCNN运行Mobilenet-SSD检测视频

腾讯NCNN运行Mobilenet-SSD检测视频 1 源码下载与修改 git clone https://github.com/GuoJaw/MobileNetSSD_NCNN 下载后的文件列表如下 将自己的 mobilenet.param 和 mobilenet.bin 放在 kitti_model 目录下 修改CmakeLists.txt cmake_minimum_required...

la_fe_的博客 2105

YOLO小目标检测优化:9种实用方案,准确率直接提升15%

小目标检测是个系统工程,没有银弹,但有明确的优化路径。优先搞数据。Copy-Paste + 提升分辨率,这俩加起来成本最低、收益最大,能解决80%的小目标问题。别一上来就改模型结构。调参走在改结构前面。锚框聚类、损失加权、增强优化,这些都是零成本的,先做满了再说改模型的事。P2层是大杀器,但不要轻易用。加了P2层,TensorRT部署、后处理、速度都要跟着调,工程化工作量翻倍。数据和训练做到位还不够,再加也不迟。滑动窗口是兜底的。能从训练端解决的问题,就不要拖到推理端。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 186

第16课:动手实战中文句法依存分析

句法分析是自然语言处理(NLP)中的关键技术之一,其基本任务是确定句子的句法结构或者句子中词汇之间的依存关系。主要包括两方面的内容:一是确定语言的语法体系,即对语言中合法句子的语法结构给予形式化的定义;另一方面是句法分析技术,即根据给定的语法体系,自动推导出句子的句法结构,分析句子所包含的句法单位和这些句法单位之间的关系。 句法分析被用在很多场景中,比如搜索引擎用户日志分析和关键词识别,比如信息抽...

春华秋实 2435

将mobileNet caffe模型转换为ncnn模型

参考博客:https://blog.youkuaiyun.com/Best_Coder/article/details/76201275#reply          https://blog.youkuaiyun.com/computerme/article/details/77876633 实现方法: 1、前提条件:下载并成功编译ncnn   (主要参考github文档:https://github.com/Te...

一棹春风一叶舟,一纶茧缕一轻钩 1184

还在用 RaiDrive/Rclone 挂载网盘?教您使用Windows 原生 WebDAV 丝滑直连 AList/Openlist,让你的网盘秒变本地硬盘!

网盘文件分散管理?😩 别再依赖第三方工具了!本文教你如何在 Windows 下,利用原生 WebDAV 功能,将 Openlist 网盘直接映射为本地硬盘!💻 操作简单,告别繁琐,让你的云端文件像本地文件一样丝滑!🚀 轻松实现高效管理,快来体验吧!

XiaoqiangClub的博客 2972

使用NCNN在华为M5部署MobileNet-SSD

文件是一个压缩文件,其中包含了 ncnn 框架在 Android 平台上使用 Vulkan 图形库加速的相关文件和代码。在 Android 平台上,ncnn 框架可以利用 Vulkan 的并行计算能力来进行神经网络模型的推理计算,以提升计算性能。ncnn-android-vulkan.zip 文件中包含了使用 ncnn 框架和 Vulkan 图形库进行推理计算所需的相关文件和代码,例如 ncnn 库文件、Vulkan 相关的动态链接库、示例代码等。

豫州刺史 1153

Claude Code Skills 入门:内置技能与自定义技能开发

│ Skill 的特点 │1. 封装性:把复杂操作封装成简单命令2. 可复用:一次定义,随处使用3. 可定制:支持参数传入4. 可发现:通过 /skill-name 方式调用打个比方,如果说 Claude Code 的基础工具是「原材料」,那 Skills 就是「预制菜」——只需要简单加热(调用),就能得到成品(结果)。你可以创建自己的 Skill 来封装常用操作。Skill 支持参数,通过。

gaoxiang_120的专栏 670

【WRF-Urban】使用 NUDAPT 数据集与 BEP/BEP_BEM 方案的 WRF 配置指南

【WRF-Urban】使用 NUDAPT 数据集与 BEP/BEP_BEM 方案的 WRF 配置指南

WW、forever的博客 1964

将mobilenet转ncnn,并用xcode跑起来

目录 1. 下载并编译ncnn 2. 下载MobileNet的caffe模型和配置文件 3. 旧版caffe模型转新版caffe模型 4. 新版caffe模型转ncnn模型 5. 开工:使用Xcode编写代码运行 ncnn是腾讯优图最近开源的适合移动端的深度学习框架。mobileNet是谷歌在2017年4月份发表的论文MobileNets: Efficient Convolutiona...

山中有石为玉 1260

C/C++李峋同款跳动的爱心代码(完整代码)

C++语言实现出李峋同款跳动的爱心的完整代码。

AIGC 10万+

将mobileNet模型转换为ncnn模型

主要任务:将mobileNet模型转换为ncnn模型参考博客:https://blog.youkuaiyun.com/Best_Coder/article/details/76201275#reply         https://blog.youkuaiyun.com/computerme/article/details/77876633实现方法:1、前提条件:下载并成功编译ncnn  (主要参考github文档:h...

qxqsunshine的博客 3278

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Caffe学习系列(十):腾讯ncnn框架

Caffe学习系列(十):腾讯ncnn框架 1.ncnn安装 安装依赖 sudo apt-get install -y gfortran sudo apt-get install -y libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler sudo apt-...

la_fe_的博客 8074

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

在Android手机上使用腾讯的ncnn实现图像分类

目录 目录 前言 使用Ubuntu编译NCNN库 转换预测模型 开发Android项目 参考资料 前言 使用Ubuntu编译NCNN库 1、首先要下载和解压NDK。 wget https://dl.google.com/android/repository/android-ndk-r17b-linux-x86_64.zip unzip android-ndk-r17b-l...

夜雨飘零 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

记mobilenet_v2的pytorch模型转onnx模型再转ncnn模型一段不堪回首的历程

#111

weixin_42184622的博客 6923

ncnn之一:ncnn概述

github https://github.com/Tencent/ncnn ncnn 是一个为手机端极致优化的高性能神经网络前向计算框架。ncnn 从设计之初深刻考虑手机端的部署和使用。无第三方依赖,跨平台,手机端 cpu 的速度快于目前所有已知的开源框架。 支持大部分常用的 CNN 网络 Classical CNN: VGG AlexNet GoogleNet Inception … Pra...

mingo_敏 7万+

QT 6.6.0 中腾讯优图NCNN环境配置以及基于PNNX转NCNN模型文件实现图像分割

我们已经讲解了关于通过PNNX将模型转换为NCNN之后在QT中实现的目标检测,并且给出了从环境的配置以及到最终的案例实现,并且我们还尝试以onnx作为中间格式转NCNN和给出一些存在的问题,最终选择以PNNX作为转换工具更加适合。我相信如果小伙伴已经看了前面关于ONNX转NCNN和PNNX工具转NCNN的案例实现,已经有了很大的收获,我也建议小伙伴先看前面的两篇文章,再来看这篇更加的合适。本文主要是基于PyTorch官方提供的分割模型。

Keep_Trying_Go的博客 1721

在树莓派3B+上编译ncnn并用benchmark和mobilenet_yolo测试

步骤 安装git和cmake $ sudo apt-get install git $ sudo apt-get install cmake 安装protocobuf和其它依赖项 这段命令参考自《树莓派3B完成ncnn框架测试》 sudo apt-get install -y gfortran sudo apt-get install -y libprotobuf-dev libleveldb-...

yuanlulu的博客 6153
上一篇: 在Metal上实现对多通道feature map的双线性插值
下一篇: 解决UIImage显示方向和内存方向不一致的问题
IT修道者
IT修道者 领域专家: 人工智能技术领域 领域专家: 人工智能技术领域
博客等级 码龄17年 326粉丝 95原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值