【機械学習】Appleの機械学習をいじっていきます!

はじめに

こんにちは。
「ドラムのフォームを定量的に把握し、技術向上をサポートしたい!」

というマインドを抱えている筆者です。

突然ですがフォームを定量化するためには、以下が必要であると考えております。
①骨格を検出する技術
②検出した結果を表示する環境

②は、ここ一年ネイティブアプリ(iOS, swift)の技術取得を「Myトレ」を通じて身に着けました。
①は、まだまだ何も力がついていない状態ですので、これから身に着けていこうと思います。

さて、①に対してどうアプローチできるか?ですが、Apple社が提供している機械学習を用いて「骨格検出」ができることがわかりました。

以下は、サンプルプログラムにより、アプリで骨格検出した画像になります。

実際に検出した結果(骨格の位置)を、ドラムの上手い人と比較することで何が足りないのか?定量的に評価できると考えております(というよりしたい)。

ということで!今回は「骨格検出」するためのノウハウをまとめていきたいのですが!その前に、Apple社の提供している機械学習の概要についてまとめようと思います。

前提 - 機械学習モデルとは?

機械学習では「機械学習モデル」というものが存在します。
機械学習モデル」とは、入力データに対すてモデルの予測により何らかの結果(出力データ)を算出してくれるものになります。
→モデルの予測によって人間が複雑なプログラミングをする手間を省ける(などのメリットがある)

f:id:avicenxz:20210206102422p:plain

この機械学習モデルの学習方法には大きく3つあります。
教師あり学習
教師なし学習
強化学習

詳細は割愛しますが、それぞれ「大量に集めた学習データから共通する特徴を抽出する」ことでモデルを作成します。


さて、ここからが肝心です。
冒頭で「骨格検出」と言うキーワードを出しましたが、Apple社では「骨格を検出するための機械学習モデル」を既に公開しています。
そして、その機械学習モデルをプログラムで実装するためのAPIも用意しています。

つまり、自分で「骨格検出」を行う「機械学習モデル」を一から頑張って作る必要はないのです。
機械学習モデル」による予測を行うプログラムも一から作る必要はありません。


エンジニアは上記の「API」の仕様さえ抑えれることができれば、機械学習モデルの効果を体感することが可能となります。
→とはいえ、そのAPIの仕様を抑えるのに苦労している筆者


前提が長くなりましたが、次のセクションではその「API」について解説します。

機械学習を提供する二つの「API

種類

API 特徴 事前のモデル準備 ネットワーク接続
CoreML API 「CoreMLモデル」による予測をサポートするAPI 必要 オフラインで動作可能
機械学習API 事前に「CoreML」を用意しなくても、機械学習モデルによる予測をサポートするAPI 不要 オンラインで動作可能

CoreMLとは?

ここで、「CoreML」とはAppleで定義している「機械学習モデル」になります。
このモデルに対してCoreML APIを用いることで、CoreMLによる予測を実施できます。

このCoreMLは自作することも可能(後述)ですが、以下のサイトで学習済みのものも入手することができます。

developer.apple.com

★冒頭であげた写真は、「PoseNet」という骨格検出可能とするCoreMLモデルを使って、画像に写っている人の骨格を検出しています(サンプルプログラム動かしただけです)。

オンラインで動作可能とは?

機械学習APIでは、事前に「CoreML」を用意しなくても良いと記述しています。

また、ネットワーク接続で「オンラインで動作可能」と記述していますが、「CoreMLモデルによる予測」はサーバで実行するということになります。

以下イメージ図書いてみました。

f:id:avicenxz:20210206103911p:plain

インプットとなる情報はアプリ側で収集して、そのデータをサーバに送ります。
あくまで想像ですが、サーバの中にある機械学習モデルが受け取った入力データに対していい感じに予測してくれて、アウトプットのデータをユーザ側に応答を返すといった感じですかね。

機械学習APIの種類

名称 概要
Vision 画像や動画に対する処理や分析
Natural Language テキスト分析
Speech 言語の音声認識
Sound 言語以外の音の分析

↓余談
私がローンチしたアプリ「Myトレ」では、「Speech」を使い録音した音声をテキストに変換しています

上記で取得した「テキスト」が、アプリに登録されている種目と一致する場合、その種目を1タスク分のデータとしてFirebase側にインサートしている、そんな感じの仕組みを実装しております。


ちなみに、機械学習APIはオンライン環境下でないと使用できないと記述しましたが、「Myトレ」もオンラインでないと種目の登録はできないようにしています。

CoreMLモデルの作成方法

作成済みモデルを取得する(自分では作らない)

先ほども記述しましたが、以下で入手できます。
developer.apple.com

CreateML - 自身でオリジナルのCoreMLモデルを作る

Xcodeを使用して、CoreMLモデルを作成できます。
筆者も少し触れたことがあるのですが、こちらについては今度!別の記事でまとめようと思います。

以下のリンクでCreateMLについて紹介してくださっています。
developer.apple.com

CoreMLコンバータ - 学習済みモデルを「CoreML」に変換する

どんな学習済みモデルを「CoreML」に変換できるのかは、必要な時が来たら調査しようと思います・・・

どちらのAPIを使えば良い?

超ざっくりですが、以下のような感触ですかね。

・自分でオリジナリティあふれる予測をしたい、場合
 → coreML API

機械学習APIで求めている予測ができる、かつオンラインによる動作を許容する、場合
 →機械学習API

さいごに

CoreML APIの基本を抑える旅にでます。