update.努力せずに料理マスター。皆さん、料理は好きですか?僕は好きです。外食よりも格安で済み、手間暇かけたかいもあっておいしく感じる手料理。工夫をこらした料理を口にして「やっぱ、おふくろにはかなわねえや。ハハッ」とひとりつぶやいて食べる夕食もオツなものです。そんな僕にはどうしても身に付けたい能力があります。それがこちら...余り物で食卓を間に合わせる能力!!そう、冷蔵庫を見た瞬間に数千の調理パターンを思い浮かべ最適な料理計画を立てるあの主婦力は、まるで天才騎士藤井聡太を間近で見ているようです。いえ現実的な話、何十年も料理をしているからこそ野生的な勘が磨かれていくのです。明日、藤井聡太になれと言われてもとても無理です。しても野生的な主婦力が欲しい僕はある日ふとこう思いました。人工知能に勉強させようディープラーニングってやつがなんとかしてくれるなら、PCが熱く演算している時に僕はアイスでも食ってれば自動的に料理マスターになれますね。これぞ平成生まれの生き方です。今回作るのは、iPhoneを冷蔵庫の中にかざすと食材の画像を認識してその食材を使ったレシピを提案してくれるアプリです。KerasとVGG16モデルを用いた転移学習によって10種類の野菜に特化した学習済みモデルを構築します。このモデルをCoreMLでiPhone向けのモデルにConvertしてSwiftでアプリケーションに仕上げていきます。(自前の環境でできるように野菜は10種、教師画像の枚数もかなり少なく抑えています。Challenge)で提案された畳み込み13層とフル結合3層の計16層から成る畳み込みニューラルネットワーク。層の数が多いだけで一般的な畳み込みニューラルネットと大きな違いはなく、同時期に提案されたGoogLeNetに比べるとシンプルでわかりやすい。ImageNetと呼ばれる大規模な画像データセットを使って訓練したモデルが公開されている。VGG16の出力層は1000ユニットあり、1000クラスを分類するニューラルネットです。世の中のいろんなものを判別してくれて楽しいです。外国で作られているので日本人の視覚にはなじみません。転移学習とはすでに学習済みのモデルを用いて新たなモデルを生成する手法です。画像認識でゼロからモデルを構築するとなると、大量の画像データを集めるのが大変ですし、学習にも膨大な時間がかかります。学習済みモデルでは、画像の特徴を抽出する層と画像の分類を行う層に分かれています。転移学習ではこの分類を行う層を新しいものにすり替えることで、画像の特徴抽出の能力を活かしつつ、目標とする分類を行います。今回はVGG16を特徴抽出器として使います。VGG16は図のように畳み込み層のブロックが5つ続いたあとに全結合層のブロックが続く構成になっています。VGG16の全結合層はImageNetの1000クラスを分類するようになっているためそのままでは10クラスの野菜分類には使えません。そこで、この全結合層を捨ててしまって直前の畳み込みブロックまでを特徴量抽出器として使うのがこの手法のキモです。VGG16モデルの全結合層を外して新たに全結合層を追加し、15層以降のみを学習させます。(14層までの重みは凍結します。tuningはほぼ同じものとして扱われることが多いですが厳密には少し違うそうです。https://www.quora.com/What-is-the-difference-between-transfer-learning-and-fine-tuning今回は転移学習にあたります。野菜たちの画像を集めるまずは学習に必要な画像を集めましょう。今回集める野菜はいかにも冷蔵庫にありそうなこの10種にします。ブロッコリー(broccoli)キャベツ(cabbage)にんじん(carrot)きゅうり(cucumber)なす(eggplant)ピーマン(green_pepper)玉ねぎ(onion)じゃがいも(potato)ほうれんそう(spinach)トマト(tomato)画像集めは合計400枚くらい集めなきゃで結構な労働です。画像収集用のスクリプトを書いて一気に集めて、不要なものを削除していく方法がおすすめです。参考までに使っていたスクリプトを掲載しておきます。CSVLogger次にモデルを定義していきます。'w')f.write(json_string)f.close()モデルの構造は下のようになります。今回はblock5以降の層を学習させます。shuffle=True)それでは学習させましょう。CPUでやるなら一晩かかります。PCが熱を持つので抱いて寝ましょう。plt.yticks([])plt.show()私の環境では以下のような精度になりました。0.9191919197939863CoreMLで学習済みモデルをConvertこちらが非常に参考になりました。https://qiita.com/kenmaz/items/d416b191f79f60e07752CoreMLToolsのインストール。coremltools次のようなテキストファイルを作ります。labels.txtbroccolicabbagecarrotcucumbereggplantgreen_pepperonionpotatospinachtomato.h5->.mlmodelへの変換コードを作ります。'labels.txt')coreml_model.save('vegrecognition.mlmodel')iOSモデルへの組み込み基本的にここのコードを流用しています。https://www.pyimagesearch.com/2018/04/23/running-keras-models-on-ios-with-coreml/Main.storyboard消したり等、初期設定が必要なので上記URLの手順に従ってください。}}若干精度に問題はありますが、30枚程度の教師データでもそれなりの画像認識器ができました。野菜を検出できたら次はレシピを検索します。今回は野菜名は英語で取得されるので、海外のレシピAPIを叩きます。Search"というAPIを使います。Keysを取得してください。https://www.edamam.com/例えば、下のURLはtomatoのレシピを取得するURLです。https://api.edamam.com/search?q=tomato&app_id=[YOUR_APP_ID]&app_key=[YOUR_APP_KEY]&from=0&to=1では、これを先ほどのSwiftコードに乗せていきましょう。iPhoneを接続してRunすると中央にボタンが表示されているはずです。そのボタンをタップするとその時判定されている野菜名でレシピを検索して、料理名とレシピURLがデバッグコンソールに表示されると思います。(レシピをアプリ上で表示する機能は本記事では割愛します。}}デバッグコンソールにこのように表示されていれば成功です。Gravyhttp://www.seriouseats.com/recipes/2013/01/sauced-tomato-gravy-recipe.htmlここではトマトを検出してトマトカレー的なものが出てきました!ひとこと最低限の機能は手持ちのMacBookでもサクッと作れました。YOLOなどのリアルタイム物体検出と連携させるなどがありそうですねー。upLoginユーザーは見つかりませんでした。