blog

Node.jsでPaddle Liteにアクセスし、ウェブサイトにAI推論機能を持たせる

フライングパドルの開発者は李瑞、郵政通信の学生、人工知能とモバイル開発愛好家の北京大学と述べました。デスクトップElectron技術の緩やかな上昇に伴い、コードエディタ、チャットソフトウェア、ゲームな...

Jun 10, 2020 · 5 min. read
シェア

フライング・パドルの開発者である李瑞さんは、東京逓信大学の学生で、AIとモバイル開発の愛好家です�

デスクトップにおけるエレクトロン技術の漸進的な台頭により、エレクトロンをベースに開発されたコードエディター、チャットソフト、ゲームなどが数多く存在します。

バックエンドの開発にNode.jsを使用するために使用されている人のために、美しいデスクトップUIクライアントまたは難易度の一定のセットの開発、およびElectronの開発はあまりにも簡単ではありません、限り、あなたはHTMLを書くことができるように、あなたはクライアントを書くことができる、ゆっくりと洗練された時間の残りの部分は、時間に引き渡すことができます。また、このオープンソースの技術は、開発者がJavaScript、HTMLとCSSを使用して、クロスプラットフォームのデスクトップアプリケーションを構築することができます。異なるプラットフォームのUI効果とWebページが同じ効果を表示し、非常に使いやすい。

では、デスクトップクライアントの上に、開発者が推論のためにPaddle Liteをローカルにデプロイするのを助けることができますか?答えはイエスです。これはPaddle LiteをNode.js用のC++プラグインとしてパッケージ化する可能性を開きます。うまく移植できれば、イメージ分類などのタスクを完了するためのデスクトップアプリケーションの開発をクライアント上で実現できます。同時に、Paddle Liteが提供するモデルは非常に軽量であり、通常のPCで十分なパフォーマンスを発揮します。

また、ウェブサイトのバックエンドなど、他のNode.jsシナリオでは、推論に直接Paddle Liteを使用することも可能です。

そこで、Paddle LiteのC++ APIをPaddle Liteクラスにカプセル化するデモを作りました。Node.jsはPaddle LiteのC++ APIを呼び出すことができます。

プロジェクト効果

1.コンパイル済み結果のダウンロード: パドルノードのリリースインターフェースから、以下の3つのファイルを含むコンパイル済み結果を直接ダウンロードすることができます:

  • paddlenode.node : コンパイルされたNode.jsモジュール

  • libiomp5md.dll : OpenMP DLL

  • mklml.dll : MKL 数学コアライブラリ

2.事前学習済みモデルのダウンロードと変換:公式オープンモデルリポジトリからmobilenet_v1モデルをダウンロードし、optツールを使用して変換します:

1.パドルライトをインストールします。

pip install paddlelite

2.変形モデル

paddle_lite_opt -モデル_dir=./mobilenet_v1 -有効_targets=x86 -最適化_out=mobilenetv1_opt

上記の手順を実行した後、変換されたモデルファイル: mobilenetv1_opt.nb を取得できます。

3.Node.jsの推論:

var addon = require('./paddlenode')
var arr = new Array()
for(var i=0; i<arr.length; i++) arr[i]=1;
addon.set_model_file("./mobilenetv1_opt.nb")
addon.infer_float(arr,[1, 3, ])

set_model_fileメソッドはPaddle Liteのset_model_from_fileに直接対応しており、infer_floatの第1引数は渡されるデータ、第2引数は渡されるデータのサイズです。個々の要素の積のサイズが入力データのサイズと異なる場合、エラーがスローされます。その後、1001次元の配列が得られます:

ここで、要素0はトラバーサルを容易にするための結果ベクトルのサイズであり、他の要素はモデル自体の出力です。

手動コンパイル

手動でコンパイルする場合は、まずPaddle Liteのリリースから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': [
 "<(lite_dir)/cxx/include",
 "<(lite_dir)/third_party/mklml/include"
 ],
 'libraries': [
 "-l<(lite_dir)/cxx/lib/libpaddle_api_light_bundled.lib",
 "-l<(lite_dir)/third_party/mklml/lib/libiomp5md.lib",
 "-l<(lite_dir)/third_party/mklml/lib/mklml.lib",
 "-lshlwapi.lib"
 ]
 }
 ]
}

node-gypとwindows-build-toolsがインストールされていることを確認してください:

node-gyp configure build

最終的な結果を生成することができますが、プリコンパイルされたライブラリからコンパイルされた結果のディレクトリに2つのdllライブラリをコピーすることを忘れないでください。なぜなら、libファイルの公式リリースバージョンを使用すると、デバッグバージョンがミスマッチエラーにつながるからです。

原則

このプロジェクトは、実際にはシェルのセットでパドルライトのC + +デモで、最も注意を払う必要があるNode.jsの公式ドキュメントでは、相互にN - APIとCのオブジェクトを変換する方法であり、変換を行うことができるに基づいて、関数や説明の非常に大きな数を与えます。ここでは、いくつかの関数の説明です:

  • ナピ

    定義
    プロパティ - リソースの定義
  • ナピ

    取得
    cb_info - 呼び出しの情報を取得する
  • ナピ

    スロー
    error - エラーをスローします。
  • ナピ

    typeo - ナピを取得
    値のタイプ
  • ナピ

    得る
    utf8 - napi_value を utf8 文字列に変換します。
    utf8 - napi_value を utf8 文字列に変換します。
  • ナピ

    ゲット
    length - napiを取得
    length - napi に対応する配列の長さを取得します。
  • ナピ

    得る
    double - get napi
    値の倍精度配列要素を取得します。
  • ナピ

    得る
    int32 - napi
    値を 32 ビット整数に変換します。
  • ナピ

    得る
    double - napi
    値を倍精度浮動小数点数に変換します。
  • ナピ

    を作成します。
    double - 倍精度浮動小数点数を napi_value に変換します。

また、変換だけを行う関数も数多くあります。



Read next

Selenium スクリーンショット

自動テストプログラムの実行では、いくつかの場所にバグがあり、この時点で、私は開発者がその後、デバッグおよび修復できるように、画面を保存するには、現在のスクリーンショットを実行できるように願っています。

Jun 10, 2020 · 2 min read