Alibaba が MNNKit をオープンソース化: Android と iOS をサポートする MNN ベースのモバイル ディープラーニング SDK

Alibaba が MNNKit をオープンソース化: Android と iOS をサポートする MNN ベースのモバイル ディープラーニング SDK

最近、モバイル端末向けのディープラーニングフレームワークの開発がますます増えてきています。最近、アリババはMNN推論エンジンをベースにした最新のMNNKitディープラーニングSDKもオープンソース化しており、AndroidおよびiOS開発者が簡単に呼び出すことができます。

近年、多くの企業がモバイルデバイス向けのディープラーニングフレームワークを開発しています。中国では、XiaomiのMace、TencentのFeatherCNN(Tencent AI)やncnn(Tencent Youtu)、BaiduのPaddle-moblieなどがあります。 Alibaba は独自のモバイル ディープラーニング フレームワーク MNN も開発しました。

最近、アリババはMNNエンジンをベースにしたMNNKitプロジェクトをオープンソース化し、AndroidおよびiOS向けのSDKの形でAIエンドサイド推論機能を提供しています。開発者はアルゴリズムの詳細を理解しなくても直接使用できます。

プロジェクトアドレス: https://github.com/alibaba/MNNKit

現在、MNNKit には顔検出、ジェスチャー認識、ポートレートセグメンテーションなどがすでに備わっており、将来的にはさらに多くの API が追加される可能性があります。

MNNKit: MNN に基づくディープラーニングツール

MNN は、Alibaba の MNN オンデバイス推論エンジンに基づいて開発されたアプリケーション ソリューションであり、主に Android および iOS システムを対象として、実際のモバイル シナリオに AI 機能を適用するのに役立ちます。

MNNKit アーキテクチャ

MNNKit は開発者が使用できる SDK を提供します。以下は SDK のアーキテクチャです。

図からわかるように、MNNKit は下から上に向かって 3 つの層に分けられます。

  1. MNNエンジン層は、Android/iOS上のMNN(https://github.com/alibaba/MNN)ライブラリでコンパイルされたパッケージのバイナリリリース版であり、端末側の動作環境を提供します。

  2. コア基本レイヤー。主に、MNN c++ インターフェース呼び出しと基本的に同じ粒度で上位レベル API を抽象化およびカプセル化します。iOS は OC インターフェースを通じて提供し、Android は Java インターフェースを通じて提供します (TODO)。このレイヤーは、上位レイヤー SDK 用のいくつかのパブリック サービス クラスまたは構造定義も提供します。

  3. ビジネス キット レイヤーには、顔検出とジェスチャ認識のカプセル化のための API が含まれています。プロジェクト紹介によると、ビジネスキット層は今後も拡大していくとのこと。

内部原則

MNNKit は主に Alibaba のエンドサイド AI 機能を提供するため、関連アプリケーションの多くの API をカプセル化します。呼び出し内容は次のとおりです。

たとえば、ユーザーが API を呼び出す必要がある場合、まずインスタンスを作成し、次に画像、ビデオ、またはその他の構造化データを入力して AI モデルで推論を実行する必要があります。作業が完了したら、インスタンスを解放します。

現在、MNNKit は次の API をサポートしています。

  • 顔検出API

  • ジェスチャー認識API

  • ポートレートセグメンテーションAPI

顔検出を例にとると、検出内容は主に次の 3 つのセクションに分かれます。

  • 顔の基本情報

  • 顔の位置の直角座標

  • 106 個のキーポイント座標 (遮蔽されているものと遮蔽されていないものを区別)

  • 自信

[[313534]]

106 個のキーポイントの配布 (公式オープンソース github より)

顔の各部位のツボ分布対応表

  • オイラー角

3つの角度値: ヨー、ピッチ、ロール

  • フェイスアクション(5つのフェイスアクションを含む)

  • 瞬き

  • 口を開けて

  • 首を振る

  • うなずく

  • 眉を上げる

プロセス

顔検出のために検出する必要があるデータがわかったので、処理プロセスを見てみましょう。

図に示すように、このプロセスは、iOS および Android デバイスの背面カメラが前方に撮影した後のモバイル端末上の全体的な処理です。

まず、システムはカメラからデータを SDK への入力として取得します。次に、SDK は次のことを実行します。

  1. MNN エンジンが推論を実行する前に、元の入力が前処理され、入力データ内の顔が正であることを確認します。

  2. 推論に AI モデルを使用します。

  3. 推論後、入力画像(前処理後)の座標系に基づいたキーポイント結果が生成されます。

  4. レンダリングを容易にするために、キーポイントの座標を画面レンダリング座標系と同じ方向に変換します。

プロセス アプリケーションでは、最終結果のキー ポイントがユーザーの画面に表示され、フロント エンドはレンダリングに「キャンバス」を使用します。キャンバスの座標系はレンダリング座標系と呼ばれます。

SDK 検出の最後のステップでは、キー ポイントをレンダリング座標系と同じ方向に変換し、キー ポイントの座標をレンダリング座標系の座標に比例してマッピングします。マッピング後、キャンバスに直接レンダリングできます

コードサンプル

MNNKit は顔検出、ジェスチャー認識などのサンプルコードを提供します。次に、顔検出を例に、Android または iOS で API を呼び出して推論を実行する方法を確認します。

Androidコード

前述のように、API を呼び出すには、まずインスタンスを作成する必要があります。以下は、非同期的に FaceDetector インスタンスを作成し、メイン スレッドでコールバックするコードです。

パブリック静的void createInstanceAsync (コンテキスト コンテキスト、 FaceDetectorCreateConfig createConfig、 InstanceCreatedListener<FaceDetector> リスナー)

ここで、顔検出 API は検出と追跡という 2 つのアクションを実行します。検出は顔の位置とキーポイントを取得するプロセスであり、追跡は顔の動きに合わせてキーポイントを再配置するプロセスです。

ビデオ モードでは、システムはデフォルトで 20 フレームごとに 1 回検出し、残りのフレームのみを追跡します。画像モードでは、各通話が検出されます。

インスタンスを作成したら、推論のためにモデルにデータを入力できます。 MNNKit は入力として複数のデータ形式をサポートするようになりました。ビデオ ストリーム検出シナリオでは、カメラのコールバック データをインターフェイスの入力として使用できます。データを入力するためのコードは次のとおりです。

パブリック同期FaceDetectionReport[] 推論( byte [] data、 int width、 int height、 MNNCVImageFormat format、 long detectConfig、 inAngleint outAngle、 MNNFlipType outputFlip)

ビットマップを入力データとして使用する推論コードは次のとおりです。

パブリック同期FaceDetectionReport[] 推論(Bitmap bitmap、 long detectConfig、 int inAngle、 int outAngle、MNNFlipType outputFlip)

FaceDetector インスタンスが使い果たされた場合は、インスタンスを手動で解放する必要があります。そうしないと、ネイティブ メモリ リークが発生します。

パブリック同期void解放()

iOSコード

Android コードと同様に、まず顔検出インスタンスを作成する必要があります。

+ ( void ) createInstanceAsync: (MNNFaceDetectorCreateConfig*)configコールバック: ( void (^)(NSError *error, MNNFaceDetector *faceDetector))blockコールバックキュー: (dispatch_queue_t)callbackQueue;

デフォルトのメインスレッドコールバック:

+ ( void ) createInstanceAsync: (MNNFaceDetectorCreateConfig*)configコールバック: ( void (^)(NSError *error, MNNFaceDetector *faceDetector))block;

PixelBuffer 入力を使用した推論のコードは次のとおりです。

- (NSArray<MNNFaceDetectionReport *> *)推論: (CVPixelBufferRef)pixelBuffer構成: (MNNFaceDetectConfig)detectConfig角度: ( float )inAngle出力角度: ( float )outAngleフリップタイプ: (MNNFlipType)flipTypeエラー: (NSError *__autoreleasing *)error;

UIImage 入力を使用した推論のコードは次のとおりです。

- (NSArray<MNNFaceDetectionReport *> *) inferenceImage: (UIImage*)image Config: (MNNFaceDetectConfig)detectConfig Angle: ( float )inAngle OutAngle: ( float )outAngle FlipType: (MNNFlipType)flipType error: (NSError *__autoreleasing *)error;

一般的なバッファ配列入力を使用するコードは次のとおりです。

- ( NSArray < MNNFaceDetectionReport *> *)inference:(unsigned char*) data:( float )w高さ:( float )h形式:( MNNCVImageFormat )format構成: (MNNFaceDetectConfig )detectConfig角度:( float )inAngle出力角度:( float )outAngle 反転タイプ:( MNNFlipType )flipType エラー:( NSError * __autoreleasing *)error;

インスタンスのライフサイクルが終了すると、呼び出し元が手動で解放する必要なく、関連するメモリの解放が自動的にトリガーされます。

報道によると、MNNKitはMNNチームがアリババでの大規模なビジネス実践を経て開発した成熟したソリューションであり、Double Elevenなどのプロジェクトのテストに耐え、バックエンドに依存せずに高性能な推論を実行でき、安定していて使いやすいとのこと。

<<:  Pythonを全く知らなかった私がAIエンジニアになるまでに2年かかりました

>>:  主流のブロックチェーンコンセンサスアルゴリズムの包括的なガイド

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

機械学習: Python でベイズ分類器をゼロから実装する

ナイーブ ベイズ アルゴリズムはシンプルで効率的であり、分類問題を扱う際に最初に検討すべき方法の 1...

今年の AI における最大の進歩は進歩なし? 2019年はAutoMLとGANがリードする

11 日間、11 人、11 人の見込み客。 2018 年が終わるまで残り 11 日となりました。有名...

MLOps 実装を成功させるためのベストプラクティス

翻訳者 | ブガッティ企画 | 梁策、孫淑娟機械学習と今日の世界におけるその応用については、すでにご...

AIを活用してモノのインターネットを次のレベルに引き上げる方法

世界中の企業が人工知能を広く導入しています。モノのインターネットもすぐ後に続きます。実際、モノのイン...

顔認識の悪用は情報セキュリティ上の懸念を引き起こす

食べ物を注文した後、カメラをかざすだけで支払いが完了します。ホテルに宿泊する場合、顔をスキャンしない...

Mac専用の大型モデルフレームワークが登場! 2行のコードでデプロイでき、ローカルデータとチャットでき、中国語もサポートしています

Mac ユーザーは、ついに、RTX を使用した独自の大型モデル チャットを持つ N カード プレーヤ...

...

...

ジェネレーティブ AI とクラウド ネイティブは期待が膨らんでいる時期にあります。これらは企業の変革よりも重要ですか?

今年、業界内では「AI 記者会見でない記者会見はない」というジョークが飛び交っています。まさにその通...

人工知能の現状と今後の動向

[[375724]]開発状況近年、デジタル経済の継続的な進歩を背景に、人工知能は急速に発展し、さまざ...

...

NetEase はデータ指標の異常をどのように検出し、診断するのでしょうか?

1. 背景指標はビジネスと密接に関係しており、その価値は、問題点やハイライトを発見し、タイムリーに...

...

...

21 人の専門家が語る: 2017 年の人工知能の展望

2016年はボットにとって歴史的な年でした。Facebookなどの主要プラットフォームがMessen...