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://tntmonks.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 = { 0 };
    //test.jpg 
    char * pic_file = argv[1];
    //model
    char * model_path = argv[2];

    int dropclassifier = 0;
    loadimage(pic_file, &image);
    THInit();
    printf("init_thnets.");
    net = THLoadNetwork(model_path);
    if (net) {
        THUseSpatialConvolutionMM(net, 2);
        if (dropclassifier == 1) {
            if (net->net->modules[net->net->nelem - 1].type == MT_SoftMax)
                net->net->nelem--;
            if (net->net->modules[net->net->nelem - 1].type == MT_Linear)
                net->net->nelem--;
            if (net->net->modules[net->net->nelem - 1].type == MT_View)
                net->net->nelem--;
        }
    }
    else {
        printf("Shiiiiit went down.");
        return -1;
    }
    float * percentages = 0;
    int outwidth, outheight;

    if (!net) {
        return 0;
    }
    int i = 0;
    int nbatch = 1;
    unsigned char *bitmaps[256];
    for (i = 0; i < nbatch; i++)
        bitmaps[i] = image.bitmap;
    int size = THProcessImages(net, bitmaps, nbatch, image.width, image.height, image.cp * image.width, &percentages, &outwidth, &outheight, 0);
    for (i = 0; i < nbatch; i++)
        if (bitmaps[i])
            free(bitmaps[i]);
    if (percentages)
    {
        float max[3] = { 0 };
        int maxPos[3] = { 0 };
        for (int j = 0; j < size; j++) {
            if (percentages[j] > max[0]) {
                maxPos[0] = j;
                max[0] = percentages[j];
            }
            else if (percentages[j] > max[1]) {
                maxPos[1] = j;
                max[1] = percentages[j];
            }
            else if (percentages[j] > max[2]) {
                maxPos[2] = j;
                max[2] = percentages[j];
            }
        }
        for (int index = 0; index < 3; index += 1) {
            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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏简书专栏

基于tensorflow+CNN的报警信息短文本分类

tensorflow是谷歌google的深度学习框架,tensor中文叫做张量,flow叫做流。 CNN是convolutional neural netwo...

25220
来自专栏CSDN技术头条

NNabla:索尼开源的一款神经网络框架

NNabla是一款用于研究、开发和生产的深度学习框架。NNabla的目标是要能在台式电脑、HPC集群、嵌入式设备和生产服务器上都能运行。 安装 安装NNabla...

24060
来自专栏Python小屋

两行Python代码实现电影打分与推荐

代码采用基于用户的协同过滤算法,也就是根据用户喜好来确定与当前用户最相似的用户,然后再根据最相似用户的喜好为当前用户进行推荐。 代码采用字典来存放数据,格式为{...

36570
来自专栏机器之心

观点 | 别再使用pip安装TensorFlow了!用conda吧~

conda 是一个开源包和环境管理系统,能够跨平台运行,在 Mac、Windows 和 Linux 上都可以运行。如果你还没用过 conda,我推荐你立刻开始使...

18320
来自专栏机器之心

开源 | 伯克利AI分布式框架Ray,兼容TensorFlow、PyTorch与MXNet

45590
来自专栏贾志刚-OpenCV学堂

Windows下TensorFlow安装与代码测试

Windows下TensorFlow安装与代码测试 一:Tensorflow介绍 TensorFlow是谷歌的深度学习应用开发框架,其思想基于数据流图与节点图实...

53280
来自专栏DannyHoo的专栏

iOS开发中在swift项目中使用HandyJSON将字典转成模型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/de...

21110
来自专栏安恒信息

基于大数据分析的异常检测方法及其思路实例

1 概述 随着人类社会信息化程度的不断深入,信息系统产生的数据也在呈几何级数增长。对这些数据的深入分析可以得到很多有价值的信息。由于数据量太大以及数据属性的多样...

71460
来自专栏人工智能头条

实战:从0搭建完整 AI 开发环境写出第一个 AI 应用

那么,作为多年的程序员,或者准备着成为新一代程序员的读者们,该如何为智能时代做好准备,成为 AI 时代的程序员呢?

52150
来自专栏PHP实战技术

手把手教你玩转12306验证码的秘密!

12306相信对很多小伙伴都不陌生,假如问你对这个网站的印象的时候,你不是会立即想起那个坑爹的验证码,而正是这个验证码,也一时间成为小伙伴们讨论的话题,今天思梦...

29580

扫码关注云+社区

领取腾讯云代金券