pytorch 移动端框架 thnets 附c示例代码
前年年前做一个手机移动端图像识别项目的时候,
先后尝试了mxnet,thnets,caffe,tensorflow.
当时的情况是,mxnet内存管理奇差,内存经常由于模型运算分配不足,app挂掉。
后来调研了下caffe发现也很不友好。
最后发现thnets相对比较轻巧,
经过算法调优之后,性能还不错,
特别是在ios下启用了Accelerate加速库。
后来tensorflow快速发展,就切到tensorflow上了。
最近看了下thnets,作者 mvitez 看来不怎么上心了。
至今为止,改进的不多。
thnets的移动端样例代码,可以参考:
https://github.com/e-lab/apps-iOs
https://github.com/e-lab/apps-android
有一段时间nnpack加速库起来了,就想着把thnets给patch一下nnpack.
但是由于项目太赶,没那个时间去做。
后来也因为切换到tensorflow上了。
thnets就被雪藏了。
向作者提交了两个建议,1,改用stb_image加载图片 2, 支持windows平台
这个两个工作,我都做了。
作者合了1。
2 我关闭了。几天前去看历史记录,作者当时问我关闭的原因,我没回。
真正的原因是。。。thnets被我遗忘了,而windows 版本的存在意义并不大。
今天稍微花了点时间,在windows写个thnets的demo样例,给有需要的网友~
项目地址:
https://github.com/cpuimage/thnets
代码示例见:demo.c
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "thnets.h"
// http://cpuimage.cnblogs.com/
THNETWORK * net; char * labels[] = { "lamp"," bottle"," watch"," pen"," grass"," shoe"," wall"," chair"," mug"," fork"," table"," book"," tablet"," bookcase"," pencil"," door"," face"," ceiling"," sofa"," bicycle"," aluminum - can"," window"," road"," stairs"," floor"," painting"," toy"," remote"," computer"," plant"," television"," dog"," laptop"," microwave"," cat"," tree"," knife"," car"," motorcycle"," person"," cup"," sidewalk"," telephone"," spoon"," hand"," sofabed" }; int main(int argc, char ** argv) {
img_t image = { };
//test.jpg
char * pic_file = argv[];
//model
char * model_path = argv[]; int dropclassifier = ;
loadimage(pic_file, &image);
THInit();
printf("init_thnets.");
net = THLoadNetwork(model_path);
if (net) {
THUseSpatialConvolutionMM(net, );
if (dropclassifier == ) {
if (net->net->modules[net->net->nelem - ].type == MT_SoftMax)
net->net->nelem--;
if (net->net->modules[net->net->nelem - ].type == MT_Linear)
net->net->nelem--;
if (net->net->modules[net->net->nelem - ].type == MT_View)
net->net->nelem--;
}
}
else {
printf("Shiiiiit went down.");
return -;
}
float * percentages = ;
int outwidth, outheight; if (!net) {
return ;
}
int i = ;
int nbatch = ;
unsigned char *bitmaps[];
for (i = ; i < nbatch; i++)
bitmaps[i] = image.bitmap;
int size = THProcessImages(net, bitmaps, nbatch, image.width, image.height, image.cp * image.width, &percentages, &outwidth, &outheight, );
for (i = ; i < nbatch; i++)
if (bitmaps[i])
free(bitmaps[i]);
if (percentages)
{
float max[] = { };
int maxPos[] = { };
for (int j = ; j < size; j++) {
if (percentages[j] > max[]) {
maxPos[] = j;
max[] = percentages[j];
}
else if (percentages[j] > max[]) {
maxPos[] = j;
max[] = percentages[j];
}
else if (percentages[j] > max[]) {
maxPos[] = j;
max[] = percentages[j];
}
}
for (int index = ; index < ; index += ) {
const float predictionValue = max[index];
if (predictionValue > 0.05f) {
printf(" %f %s \n", predictionValue, labels[maxPos[index] % size]);
}
}
free(percentages);
}
getchar();
}
采用vs编译的话,需要下载openblas:
https://jaist.dl.sourceforge.net/project/openblas/v0.2.19/
lib库链接文件:libopenblas.dll.a 即可编译。
附带的模型 来自e-lab的项目。
示例输出得分最高并且高于0.05的三个结果。
示例图片:test.jpg
示例模型: model
对应的标签,见代码或模型文件夹下的categories.txt
以上,待有精力再对thnets进行性能调优。
对于前向传播而言,最好的代码学习资料莫过于:darknet
https://github.com/pjreddie/darknet
darknet 代码写得十分耐看,逻辑清晰。
darknet+nnpack:
https://github.com/digitalbrain79/darknet-nnpack
若有其他相关问题或者需求也可以邮件联系俺探讨。
邮箱地址是:
gaozhihan@vip.qq.com
pytorch 移动端框架 thnets 附c示例代码的更多相关文章
- c语言智能指针 附完整示例代码
是的,你没有看错, 不是c++不是c#, 就是你认识的那个c语言. 在很长一段时间里,c的内存管理问题, 层出不穷,不是编写的时候特别费劲繁琐, 就是碰到内存泄漏排查的各种困难, 特别在多线程环境下, ...
- 【译】用Fragment创建动态的界面布局(附Android示例代码)
原文链接:Building a Dynamic UI with Fragments 为了在Android上创建一个动态和多视图的用户界面,你需要封装UI控件和模块化Activity的行为,以便于你能够 ...
- 看完48秒动画,让你不敢再登录HTTP网站(附完整示例代码)
在我的 单点登录SSO示例代码 一文中,强烈不建议部署HTTP的SSO服务站点. 在此写个基于网络包嗅探的HTTP会话劫持程序,给大家一个直观的危害性展示. 示例中,我在一台Mac上登录58同城,被另 ...
- 音频算法之小黄人变声 附完整C代码
前面提及到<大话音频变声原理 附简单示例代码>与<声音变调算法PitchShift(模拟汤姆猫) 附完整C++算法实现代码> 都稍微讲过变声的原理和具体实现. 大家都知道,算法 ...
- 3.NetDh框架之缓存操作类和二次开发模式简单设计(附源码和示例代码)
前言 NetDh框架适用于C/S.B/S的服务端框架,可用于项目开发和学习.目前包含以下四个模块 1.数据库操作层封装Dapper,支持多种数据库类型.多库实例,简单强大: 此部分具体说明可参考博客: ...
- 2.NetDh框架之简单高效的日志操作类(附源码和示例代码)
前言 NetDh框架适用于C/S.B/S的服务端框架,可用于项目开发和学习.目前包含以下四个模块 1.数据库操作层封装Dapper,支持多种数据库类型.多库实例,简单强大: 此部分具体说明可参考博客: ...
- 1.NetDh框架之数据库操作层--Dapper简单封装,可支持多库实例、多种数据库类型等(附源码和示例代码)
1.NetDh框架开始的需求场景 需求场景: 1.之前公司有不同.net项目组,有的项目是用SqlServer做数据库,有的项目是用Oracle,后面也有可能会用到Mysql等,而且要考虑后续扩展成主 ...
- java jodd框架介绍及使用示例
Jodd是一个普通开源Java包.你可以把Jodd想象成Java的"瑞士军刀",不仅小,锋利而且包含许多便利的功能.Jodd 提供的功能有: 提供操作Java bean, 可以 ...
- iOS App集成Apple Pay教程(附示例代码)
苹果在本周一发布了iOS 8.1版本,并正式开放了Apple Pay支付系统.Apple Pay是一个基于NFC的支付系统,不久将被数以万计的线下零售商店予以支持.即便这项科技并不是彻底的突破性进展, ...
随机推荐
- oracle导出dmp文件的2种方法
使用exp和expdp导出数据 1.exp导出数据命令 exp gd_base/@192.168.13.211/oanet file=D:\export\gd_base.dmp log=D:\expo ...
- 网络1712--c语言第二次作业总结
1.作业亮点 1.1在调试问题方面有明显进步,变量声明方面有所改变,没有发现大面积抄袭现象. 1.2 以下几位同学博文写的较为优秀,可作为范例供大家参考 田亚琴--代码格式良好,思路清晰,调试部分图文 ...
- Beta阶段敏捷冲刺报告-DAY3
Beta阶段敏捷冲刺报告-DAY3 Scrum Meeting 敏捷开发日期 2017.11.4 会议时间 12:30 会议地点 软工所 参会人员 全体成员 会议内容 当天任务确认,进度调整, 讨论时 ...
- B-day5
1.昨天的困难,今天解决的进度,以及明天要做的事情 昨天的困难:昨天虽然完成了风险数据的图表统计,但是界面风格仍然不太满意,还在抓紧调试中:还有登录页的背景图,在想应该如何设计, 什么样的风格才好. ...
- 高校征信系统项目Postmortem结果
设想和目标 1 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件需要解决的问题是当前高校学生征信系统建设薄弱的问题,我们试图建立一个征信系统,在完成之后推 ...
- Alpha冲刺第一天
Alpha冲刺第一天 站立式会议 项目进展 项目的第一天,主要工作是对项目的开发进行规划,以及将规划的成果转化为燃尽图与博客文章.依据项目需求分析报告与开题报告中已经完成的设计任务和项目规划,我们将系 ...
- string类的简洁版实现
说是原创,差不多算是转载了,我也是看了好多大牛的写法,大牛的建议,自己加一总结,形成代码: 实现一个简洁版的string类,我觉得,下面的也够了:另外需要参见另外的写法: http://blog.cs ...
- 【iOS】swift 排序Sort函数用法(包含NSDictionary排序)
用了几分钟做的简单翻译 一个例子 直接贴代码,不过多解释 //这是我们的model class imageFile { var fileName = String() var fileID = Int ...
- 《javascript设计模式与开发实践》阅读笔记(10)—— 组合模式
组合模式:一些子对象组成一个父对象,子对象本身也可能是由一些孙对象组成. 有点类似树形结构的意思,这里举一个包含命令模式的例子 var list=function(){ //创建接口对象的函数 ret ...
- java中DelayQueue的一个使用陷阱分析
最近工作中有接触到DelayQueue,网上搜索资料的时候发现一篇文章谈到DelayQueue的坑.点击打开链接 文中已经总结了遇到坑的地方,还有解决方案.不过我第一眼看一下没弄明白为什么,所以翻了翻 ...