热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

node获取图片路径_骚操作,Node.js接入PaddleLite,网站也能AI推理

随着桌面端Electron技术逐步崛起,基于Electron开发的代码编辑器、聊天软件、游戏等层出不穷。对于习惯使用Node.js进行后端开发的朋友来说,

随着桌面端Electron技术逐步崛起,基于Electron开发的代码编辑器、聊天软件、游戏等层出不穷。

对于习惯使用Node.js进行后端开发的朋友来说,开发一套漂亮的桌面UI客户端还是有一定难度的;而Electron开发不要太简单,只要会写HTML,就能写客户端,剩下的交给时间慢慢打磨即可。而且,这款开源的技术允许开发者使用Javascript、HTML 和 CSS 构建跨平台的桌面应用程序。不同平台UI效果和网页显示效果一致,非常易用。

那么在桌面客户端上面,我们能否帮开发者实现本地部署Paddle Lite进行推理呢?答案是肯定的。Paddle Lite提供C++接口,并且在2.6.0版本中支持了Windows开发环境。这为我们将Paddle Lite封装成Node.js的C++插件提供了可能。如果能够成功移植,开发桌面应用的时候就可以实现在客户端上完成图片分类等任务。同时Paddle Lite提供的模型非常轻量化,常规PC机足以跑出不错的性能。

而且,对于其他Node.js场景来说,比如网站后端,也可以直接使用Paddle Lite进行推理。

于是我做了一个Demo,其本质上是将Paddle Lite的C++ API封装为Paddle Lite类,这个类目前提供了两个方法,分别是set_model_file和infer_float。在此之上,我使用N-API来编写Node.js插件,将其组合起来,允许Node.js调用Paddle Lite的C++ API。

项目效果

1. 下载预编译结果:可以直接在Paddle Node的Release界面下载预编译的结果,包括以下三个文件:

  • paddlenode.node :编译后的Node.js模块
  • libiomp5md.dll :OpenMP DLL
  • mklml.dll :MKL数学核心库
2. 下载并转化预训练模型:从官方开放的模型库中下载mobilenet_v1模型,并使用opt工具(Paddle Lite自带此工具)转换:1.安装Paddle Lite :

pip install paddlelite2. 转化模型:

paddle_lite_opt –model_dir=./mobilenet_v1 –valid_targets=x86 –optimize_out=mobilenetv1_opt执行上面步骤后我们可以得到转化后的模型文件:mobilenetv1_opt.nb3. 在Node.js中进行推理:

var addon = require('./paddlenode')var arr = new Array(150528)for(var i=0; i1;
addon.set_model_file("./mobilenetv1_opt.nb")
addon.infer_float(arr,[1, 3, 224, 224])
这里我们输入全1的数组进行模拟,set_model_file方法直接对应Paddle Lite中的set_model_from_file,infer_float的第一个参数是我们要传入的数据,第二个是传入数据的尺寸。如果各个元素乘积大小和传入数据的大小不同,将会抛出一个错误。之后我们会得到一个1001维的数组:df343d7dc758a18758b95aea16df37e9.png其中0号元素为结果向量的大小,方便进行遍历,其他元素即为模型本身的输出。

手动编译

如果你决定手动编译,首先需要从Paddle Lite的Release中找到x86的预编译结果,目前最新版本是v2.6.1。下载下来之后定位到binding.gyp,将lite_dir变量设定为预编译库

文件夹的绝对路径,示例如下:

{'variables': {'lite_dir%': 'C:/Users/Li/Desktop/Exp/inference_lite_lib.win.x86.MSVC.C++_static.py37.full_publish',
    },"targets": [
        {'target_name': "paddlenode",'sources': ["paddlelib.h","paddlelib.cc","paddlenode.cc"],'defines': [
            ],'include_dirs': [","
            ],'libraries': ["-l,"-l,"-l,"-lshlwapi.lib"
            ]
        }
    ]
}
之后定位到我们的源码所在目录,确保你已经安装好了node-gyp和windows-build-tools,运行:

node-gyp configure build即可生成最终结果,但是记得从预编译库中复制两个dll动态链接库到编译结果目录。因为官方发布的为Release版lib文件,这里如果使用debug版会导致不匹配的错误。

原理介绍

这个项目实际上是在Paddle Lite的C++ Demo上套了一层壳,我们最需要关注的是怎么将N-API和C的对象互相转换,在Node.js的官方文档中给出了非常多的函数和解释,在此基础上做转换即可。这里给出一些函数的解释:

  • napidefineproperties - 定义资源
  • napigetcb_info - 获取调用的信息
  • napithrowerror - 抛出错误
  • napitypeo - 获取napivalue的类型
  • napigetvaluestringutf8 - 将napi_value转换为utf8字符串
  • napigetarraylength - 获取napivalue对应的数组长度
  • napigetvaluedouble - 获取napivalue对应的双精度数组元素
  • napigetvalueint32 - 将napivalue转换为32位整型
  • napigetvaluedouble - 将napivalue转换为双精度浮点数
  • napicreatedouble - 将双精度浮点数转换为napi_value
还有一些函数大体作用相同,仅仅作为转换作用。

写在最后

飞桨已经推出的Paddle.js支持直接在浏览器中进行推理。而本文介绍的Paddle Node项目从另一个角度为Node.js提供可能。飞桨的中文生态给国内开发者和入门者提供了非常大的便利,大大降低了大家的学习成本。希望飞桨能够做得越来越好,进一步降低用户使用门槛,非常感谢。

本项目代码:

https://github.com/KernelErr/paddlenode

C/C++ Addons with N-API:https://nodejs.org/docs/latest-v12.x/api/n-api.html官网地址:https://www.paddlepaddle.org.cnPaddle Lite:https://github.com/PaddlePaddle/Paddle-LitePaddle.js:https://github.com/PaddlePaddle/Paddle.js飞桨开源框架项目地址:GitHub:https://github.com/PaddlePaddle/PaddleGitee: https://gitee.com/paddlepaddle/Paddle推荐阅读

用人话讲解GPL 2.0协议

从Copyright到Copyleft,聊聊版权与开源协议

利用人工智能给游戏“开挂”,但求一败

你看得上瘾的斗鱼,首次开源了自家项目

只剩下[ ]和( )可选,Go泛型要用哪个?




推荐阅读
  • 本文介绍了如何在Windows操作系统中安装FFTW库,并详细说明了使用Visual Studio 2010进行4096点快速傅里叶变换(FFT)的步骤。包括下载预编译文件、生成库文件以及配置环境等关键环节。 ... [详细]
  • 本文详细介绍了在 Windows 7 上安装和配置 PHP 5.4 的 Memcached 分布式缓存系统的方法,旨在减少数据库的频繁访问,提高应用程序的响应速度。 ... [详细]
  • IEC60825激光产品安全标准详解
    随着激光技术在全球范围内的广泛应用,尤其是激光投影显示技术的兴起,了解和遵守相关的安全标准变得尤为重要。本文将详细介绍IEC60825激光产品安全标准及其重要性。 ... [详细]
  • Mysqlcheck作为MySQL提供的一个实用工具,主要用于数据库表的维护工作,包括检查、分析、修复及优化等操作。本文将详细介绍如何使用Mysqlcheck工具,并提供一些实践建议。 ... [详细]
  • 本文详细介绍了如何在本地环境中安装配置Frida及其服务器组件,以及如何通过Frida进行基本的应用程序动态分析,包括获取应用版本和加载的类信息。 ... [详细]
  • 本文介绍了两个重要的Node.js库——cache-content-type和mime-types,它们在处理HTTP响应头时非常有用。cache-content-type是基于mime-types构建的,并且实现了缓存机制以提高性能。 ... [详细]
  • 本文介绍了一个基本的同步Socket程序,演示了如何实现客户端与服务器之间的简单消息传递。此外,文章还概述了Socket的基本工作流程,并计划在未来探讨同步与异步Socket的区别。 ... [详细]
  • ED Tree HDU4812 点分治+逆元
    这道题非常巧妙!!!我们进行点分治的时候,算出当前子节点的所有子树中的节点,到当前节点节点的儿子节点的距离,如下图意思就是当前节点的红色节点,我们要求出红色节点的儿子节点绿色节点, ... [详细]
  • 本文详细介绍了Python中的生成器表达式、列表推导式、字典推导式及集合推导式等,探讨了它们之间的差异,并提供了丰富的代码示例。 ... [详细]
  • SpringBoot新手入门指南
    本文旨在为初次接触SpringBoot的开发者提供一份详细的入门指导,包括如何快速搭建并运行一个简单的SpringBoot应用。通过本文,读者将了解Maven项目的构建、必要的配置文件设置以及基本的应用开发流程。 ... [详细]
  • 本文介绍了进程的基本概念及其在操作系统中的重要性,探讨了进程与程序的区别,以及如何通过多进程实现并发和并行。文章还详细讲解了Python中的multiprocessing模块,包括Process类的使用方法、进程间的同步与异步调用、阻塞与非阻塞操作,并通过实例演示了进程池的应用。 ... [详细]
  • Redis: 高效的键值存储系统
    Redis是一款遵循BSD许可的开源高性能键值存储系统,它不仅支持多种数据类型的存储,还提供了数据持久化和复制等功能,显著区别于其他键值缓存解决方案。 ... [详细]
  • 第1章选择流程控制语句1.1顺序结构的基本使用1.1.1顺序结构概述是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行 ... [详细]
  • 使用IntelliJ IDEA高效开发与运行Shell脚本
    本文介绍了如何利用IntelliJ IDEA中的BashSupport插件来增强Shell脚本的开发体验,包括插件的安装、配置以及脚本的运行方法。 ... [详细]
  • 本文详细介绍了Java API中文文档的位置、用途及其查看方法,帮助开发者更高效地利用这一资源。 ... [详细]
author-avatar
www
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有