
どうも、まつまるです。今回はFlutterで機械学習を実装していきます。FlutterではtfliteパッケージにPoseNetという骨格推定のモデルがあるので活用していきます。この記事ではアプリを動かすための準備のみです。
完成動画
🎞ギャラリーから画像を取得
👀画像を解析して体の部位を推定
📝推定した部位を画像の上にプロット
参考にした記事はこちら。
初心者にはけっこうてんこ盛りな内容なので、覚悟してください。なにより準備がめんどくさい!
どうやって実行しているのみ気になる人はこちらへ。
まあやっていきましょう。
実行環境
Android Studio 4.1.1
Xcode 12.4
macOS Big Sur 11.2.1
dependencyに追加
pubspec.ymalにtfliteを追加しましょう。
tflite: ^1.1.1
image_picker: ^0.6.7+22
tfliteはTensorFlowLiteのAPIらしいです。よく分からん英語がでできました。
- TensorFlowLiteはGoogleが開発したオープンソースの機械学習ソフトウェアライブラリです。
- APIはApplication Programming Interfaceの略です。APIによって機械学習を実装するのに数行のコードで済みます。
image pockerはデバイスから画像を取得するのに必要です。
iOSの準備
<project root>/ios/Runner/Info.plist:に以下のコードをコピペしてください。
<key>NSPhotoLibraryUsageDescription</key>
<string>This app requires to access your photo library</string>これがないとギャラリーにアクセスできません。
Xcodeの設定
Xcodeの設定をやっておかないと’vector’ file not found”が出ます。
対処方法は公式サイトから出ていました。
Open ios/Runner.xcworkspace in Xcode, click Runner > Tagets > Runner > Build Settings, search Compile Sources As, change the value to Objective-C++
ちゃんと解説していきます。
iosフォルダを右クリック→Flutter→Open iOS module in Xcodeをクリック。
Xcodeが開くので、Runner→Build setting→Compile Sources Asを検索→File TypeをObjective-C++に変更。で大丈夫👌
デフォルト
↓
修正後
写真のように変更すればオッケー。
TensorFlowLiteCのダウングレード
ios/Podfile.lockのTensorFlowLiteCを2.2.0にダウングレードしましょう。これをしないと‘metal_delegate.h’ file not foundというエラーがでてきます。
参考にしたのはこちら。
では、変更していきましょう。おそらくデフォルトは2.4.0になっているので、Podfile.lockをクリックして2.2.0に変更しましょう。
デフォルト修正後
完了したらTerminalを開いてpod installを入力してエンターで以下の画面が出てきたらTensorFlowLiteCのダウングレード完了です!
もし、エラーが出てきたらTerminailでpwdを打ち込んで現在のディレクトリを表示してくれるので確認しましょう。
/ユーザ名/AndroidStudioProjects/プロジェクト名
であればTerminalにcd iosを打ち込みましょう。すると
/ユーザ名/AndroidStudioProjects/プロジェクト名/ios
になるはずです。ここでpod installすれば実行できます。
tfliteの使い方
modelを入手
モデルはこちらからダウンロードしました。
モデル名はposenet_mv1_075_float_from_checkpoints.tfliteです。他のモデル(posenet_mobilenet_float_075_1_metadata_1.tflite)だと部位の推定が上手くいきませんでした。
modelをaseetsに追加
まずはモデルを置く場所を作成します。assetsと名前をつけてディレクトリを作りましょう。
そして、先ほどダウンロードしたモデルをassetsディレクトリにドラック&ドロップして追加します。
次はpubspec.ymalにassetsを追記。これでassetsに置いたモデルを読み込むことができます。
ここまで来れば準備は完了です!!あとはtfliteの基礎を頭の片隅においといてください。
パッケージをimport
import ‘package:tflite/tflite.dart’;
モデルを使うときにはパッケージをインポートしましょう
modelをロード
これでresにモデルをロードさせます。モデルを使う前に必要です。
String res = await Tflite.loadModel(
model: “assets/任意のモデル名”,);
modelをクローズ
await Tflite.close();
さて、これで姿勢推定(pose detection)するための準備が整いました。ここらへんの内容って日本語の文献がほぼほぼないので苦労しました。
次回は実装していきます。