omuriceman's blog

iOS / AWS / Firebase / JavaScript / Deep Learning を中心とした技術を面白く紹介します!

iOSでディープラーニングが簡単に実装できる公式ライブラリ「Turi Create」

Appleディープラーニングが簡単に実装できるツールといえば「Create ML」が有名です。

developer.apple.com

iOS13でも新たにオブジェクト検出 / オーディオデータ分類 / アクティビティの分類などが追加されます。

しかし、Create MLの開発環境はXCodeのみと限られているため、やや扱いづらい点もあります。今回はPythonやJupyter / Colaboratoryの知見をいかしつつiOSアプリ向けに機械学習を組み込みたいという方向けに「Turi Create」をご紹介します。

Turi Createとは

Appleが2016年に買収したTuriという企業が開発した機械学習のライブラリです。

github.com

Turi Create simplifies the development of custom machine learning models.

Turi Createは機械学習モデルをシンプルに実装できるため、ディープラーニングの理論に詳しくないエンジニアでも気軽に試すことができます。

Turi Createを活用すると以下のようなモデルを簡単にiOSアプリケーションに組み込むことができます。

  • Recommender systems(推薦システム)
  • Image Classification(画像分類)
  • Drawing Classification(描画分類)
  • Sound Classifier(音声分類)
  • Image similarity(類似画像)
  • Object Detection(物体検出)
  • Style Transfer(画風変換)
  • Activity Classifier(アクティビティ分類)
  • Text classification(自然言語処理)

今回は上記のStyle Transferの実装を進めながらTuri Createを紹介していきたいと思います。

Colaboratoryを使ってStyle Transferを実装する

公式サイトがStyle Transferの実装方法を紹介しています。

apple.github.io

実装を進めていくにあたりGPU環境が無いとトレーニングが速く進みません。公式サイトの説明ではCPU環境でトレーニングをおこなうと1日くらいかかるとのことでした。

そこでオススメしたいのがGoogleのColaboratoryです。今となっては非常に有名なサービスですが無料でGPU環境を提供してくれます。

colab.research.google.com

ただし!2019/6/12現在ColaboratoryのCUDAのバージョンは10なのですが、Turi Createがバージョン8を推奨の動作環境としているためGPU環境でのトレーニングがうまくできません。

こちらを解決するために色々と試行錯誤したのですが、最終的に下記のブログを参考にして実行することができました。

medium.com

コードも抜粋します。

!pip install turicreate==5.4
# The wrong version of MXNET will be installed
!pip uninstall -y mxnet
# Install CUDA10-compatible version of mxnet 
!pip install mxnet-cu100==1.4.0.post0

Style Transferを実装するためにコンテンツ画像とスタイル画像を用意する必要があります。ColaboratoryにはGoogle Driveを簡単にマウントできる機能がありますので、Google Driveのマイドライブに「content」と「style」というフォルダを作成しそちらに画像を格納していきます。

詳細は以下の流れになります。

  • Google Driveにcontentとstyleというフォルダを用意してそれぞれ画像を格納する
  • Colaboratory上でマウントする
from google.colab import drive
drive.mount('/content/drive')
  • 画像を読み込む
content = tc.load_images('/content/drive/My Drive/content/')
styles = tc.load_images('/content/drive/My Drive/style/')
model = tc.style_transfer.create(styles, content)

GPU環境でも学習に1時間くらいかかりますので気長に待ちましょう。

学習が完了するとこんな画像が表示されるようになります。 ジョブズくんと葛飾北斎の絵の画風が混ざって・・・

f:id:omuriceman:20190612191108j:plain:h150 + f:id:omuriceman:20190612191203j:plain:w150

こんな画風に変換されました!

f:id:omuriceman:20190612191228p:plain:w300

なんとなく趣を感じますね。

Colaboratory上で実行するコードはこちらにおいておきました。

github.com

Core MLにデプロイしてiOSアプリに組み込む

Colaboratoryで学習させたモデルをエクスポートして、iOSプロジェクトに組み込みを行います。

model.export_coreml('MyStyleTransfer.mlmodel')

Colaboratoryの画面の左カラムにモデルファイル(mlmodel)が出力されていますのでダウンロードしてください。

次にXCodeを立ち上げて、モデルファイルをドラック&ドロップします。

コードについてはGitHubをご覧いただくとして、要点を解説したいと思います。

let numStyles  = 8
let styleIndex = 3

let styleArray = try? MLMultiArray(shape: [numStyles] as [NSNumber], dataType: MLMultiArrayDataType.double)

for i in 0...((styleArray?.count)!-1) {
    styleArray?[i] = 0.0
}
styleArray?[styleIndex] = 1.0
  • numStyles:styleフォルダに入れたスタイル画像の数
  • styleIndex:適用するスタイル

https://apple.github.io/turicreate/docs/userguide/style_transfer/images/styles.png

上の公式サイトの画像を例に言うと、8枚のスタイル画像があるのでnumStylesは8、styleIndexが3の場合は0からカウントするので右上の薪のスタイルが適用されることになります。

画像にStyle Transferを適用するコードは以下の通りです。

// initialize model 
let model = MyStyleTransferModel()

// set input size of the model
let modelInputSize = CGSize(width: 600, height: 600)

// create a cvpixel buffer
var pixelBuffer: CVPixelBuffer?
let attrs = [kCVPixelBufferCGImageCompatibilityKey: kCFBooleanTrue,
             kCVPixelBufferCGBitmapContextCompatibilityKey: kCFBooleanTrue] as CFDictionary
CVPixelBufferCreate(kCFAllocatorDefault,
                    modelInputSize.width,
                    modelInputSize.height,
                    kCVPixelFormatType_32BGRA,
                    attrs,
                    &pixelBuffer)

// put bytes into pixelBuffer
let context = CIContext()
context.render(ciImage, to: pixelBuffer!)

// predict image
let output = try? model.prediction(image: pixelBuffer!, index: styleArray!)
let predImage = CIImage(cvPixelBuffer: (output?.stylizedImage)!)

「MyStyleTransferModel()」は出力したモデルファイル(.mlmodel)のModel Classです。自分の環境に合わせて置き換えてください。

f:id:omuriceman:20190613195847p:plain

CIImageのデータを使いますので、UIImageやCGImageの場合は変換をかけるようにしましょう。

iPhoneから撮影して画風変換を行なってみた結果がこちらです。

f:id:omuriceman:20190613041910g:plain
なんかすごくおしゃれ。

こちらもサンプルをGitHubに用意しました。写真を撮影した後にCGImageからCIImageに変換し回転させてから画風変換を行なっています。

何かのお役に立てれば幸いです。

github.com

まとめ

  • Appleの公式機械学習ライブラリ「Turi Create」を紹介した
  • Create MLと比べてやや難しいができることが多い
  • Colaboratory上で実装できる画風変換のデモをアップしたので利用してほしい
  • 自分で好きなスタイル画像を用意すると結構面白い