Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Tensor flowを使った キュウリの仕分け あれこれ

3,557 views

Published on

shizuoka.py#6

Published in: Engineering
  • Be the first to comment

Tensor flowを使った キュウリの仕分け あれこれ

  1. 1. TensorFlowを使った キュウリの仕分け あれこれ @ike_jpn Shizuoka.py #6
  2. 2. 自己紹介 Twitter : @ike_jpn Blog : http://www.workpiles.com/ お仕事: きゅうり農家,プログラマー,Tinkerer 最近のマイブーム: 機械学習,Raspberry Pi,... 活動: MakerFireTokyo(1),MashupAwards(4),gugen(1) Pythonの経験: 独学,OpenCV,Django,TensorFlow
  3. 3. 本日話すこと ・TensorFlowを使ったキュウリ仕分け機の開発にまつわるあれこれ ・現在やってる試作3号機の取り組み
  4. 4. キュウリの仕分け機って? 【仕分け(選果)作業とは】 キュウリの長さ、曲り具合、色つや等によっ て、9種類の等級/階級に選別する。 ウチみたいな個人農家では、仕分け作業 は手作業で行なっており、けっこう時間が かかって大変!         ↓ 流行りのディープラーニングで自動化出来 ないだろうか。やってみたらなんか出来そう だぞ。
  5. 5. 遡ること2016年1月 当時はまだTensorFlow0.6.0。それを何故か32bitPCにインストールしてました。     *最新はr1.0.0 TensorFlowは何と言ってもチュートリアルがしっかりしている! MNISTのチュートリア ルをやれば畳み込みニューラルネットワークを使った画像認識のやり方がほぼ分かる。
  6. 6. TensorFlowの基本(1) TensorFlowのコーディングは、初めにデータフローグラフを構築して、その後実行(デー タを流す)という手順で行います。 実行結果: ①データフローグラフの構築  3 ②’z’を実行して処理結果を取得 ○をops(operationsの略)と 呼びます。 TensorFlowは分散処理用 に設計されており、ops毎に 処理するデバイスを指定す ることができる。
  7. 7. TensorFlowの基本(2) データフローグラフの入り口を作って、データを流し込む。 実行結果: placeholderがデータフ ローの入り口。 実行時にfeed_dictでデー タを流し込む。
  8. 8. Deep MNIST for Experts 『Deep MNIST for Experts』チュートリアルを行うと4層の畳み込みニューラルネットワー クの作り方が大体理解できる。後は、これをベースにちょっとずつチューニングする。 チューニング項目:  ネットワーク構成:   積層数、処理順序、活性化関数、損失関数、正規化、正則化 …  畳み込み層:   フィルタ数、フィルタサイズ、 …  プーリング層:   アルゴリズム、サイズ、 …  ドロップアウト:   有無、ドロップアウト率  全結合層:   ユニット数、… (最適なパラメータ教えてくれる AIプリーズ…)
  9. 9. 試作1号機 最初の試作はWebカメラで上から撮影したキュウリ画像を9クラスに識別するだけ。 ブログのネタになればいいかな程度でやってみた。 275枚のテスト画像に対し、約80%の正答率。 学習データ  サイズ:32x32x3  数:2750枚
  10. 10. 2016年2月 やっぱりPCパワーないと厳しい。ちょっと入力画像の解像度上げるとOOMで落ちる。   →メモリを8Gから24Gに増設(今思えば実装の仕方が悪かっただけでこんなにいらなかった…) でも、GPUないから遅い。ちょっと階層を増やそうものなら学習が終わらなくなる。     →GPUは高いな・・・ゲームもやらないし・・・クラウドよくわからん *GCPのCloudML使ってみたけど、ぶん回すといつの間にか高額請求になりがち。1週間で2 万ぐらい行った(無料期間中でホント助かった)。がっつり機械学習やるならGPU買った方がい いかも。ネットを見るとなんとなくGTX1080買ってる人が多いかな?
  11. 11. 2016年3月 ディープラーニングお金掛かりそうだし、一応ブログのネタにもなったし、そもそも人間と 同等の仕分け作業なんて無理だろうし・・・ すごーい!きみは囲碁が得意なフレンズなんだね!
  12. 12. 試作2号機の制作開始 撮影台から作成を始めた。 何度も作り直したので製作期間は1ヶ月間ぐらいかかった。
  13. 13. 教師データ集め 人間が仕分けをしたキュウリを台に乗せて、ひたすら撮影とラベル付け。 撮影とラベル付けは、openCVで簡単なスクリプトを作成。
  14. 14. 教師データ集め 8500本分のキュウリ画像を撮りためる。撮影期間2ヶ月間ほど。 7000本を教師データ、1500本をテストデータとした。
  15. 15. 学習&チューニング パラメータを変えて何度も試す。40回ぐらいやってわかってきたこと。 ・画像サイズはできるだけ小さくした方がいい(無駄に大きのは時間の無駄) ・画像サイズは小さすぎない方がいい(解像度上げるだけで良い結果になる場合もあ る) ・変数(重みとバイアス)の初期値は継承しよう(restoreで簡単にできるよ) ・Batch Normalizationはいいものだ(誤差の収束が捗る) ・データ拡張はいいものだ(輝度をばらつかせたら効果あった) 今回の場合では、ネットワークのパラメータを調整するよりも、データの前処理をしっかり 行なった方がよい結果につながるという印象でした。 最終的には正答率96%までいった。 *Batch Normalizationは、なぜかラズパイで動かすための protobufに変 換出来なかったので、本番では使わなかった
  16. 16. 2016年6月 ベルトコンベアの作成と撮影台との連携を考えたり。 作り方→http://workpiles.com/2016/08/ccb9-diy-belt_conveyor/
  17. 17. 試作2号機完成! 実環境で動かしてみると約70%の正答率。 周りの明るさ、キュウリを置く位置などの影響を受けまくる。
  18. 18. 試作3号機での取り組み ● キュウリの表面の傷なども認識したい   → キュウリを接写し、もっと解像度を上げで認識したい(学習が進まない問題) → オートエンコーダで事前学習を試してみる → 転移学習を試してみる ● キュウリの病気も認識したい   → 教師データが集まらない     →教師データの錬金術 ● キュウリを手で台に置くのは…全自動化したい   → キュウリを自動的にピックアップする装置の開発
  19. 19. Convolutional Auto-Encoder オートエンコーダとは、機械学習において、ニューラルネットワークを使用した次元圧縮 のためのアルゴリズム(wikiより)。 ・事前学習に使われている(最近はほとんどやらない?) ・256x80でやってみたけど学習が収束していかない… Input (160*80*3) Hidden *1/12 output (160*80*3) https://twitter.com/ike_jpn/status/786469686762274816
  20. 20. VGG16を使った転移学習 既存の訓練されたニューラルネットワークを使って、一部分を再学習することで、効率良 く学習をおこなう。 Inception-v3で抽出した特徴をマッピングしてみた。 VGG16を使って転移学習してみた。 →正答率84%(自前CNNよりも低い)
  21. 21. 教師データの錬金術 教師データが少ない、そもそも集まらない場合は、仮想世界で瞬時に大量生産したデー タで学習して、現実世界に適用すればよい。 最近のゲームを見ても分かる通り、高品質なテクスチャだけでなく、光効果、物理現象す らもリアルに再現するよ。 https://arxiv.org/abs/1612.03019 (2ヶ月間も写真撮るよりも、 Unity勉強したほうがよかった?)
  22. 22. 全自動化 https://twitter.com/ike_jpn/status/829006671787593728 https://twitter.com/ike_jpn/status/822487711592218625 収穫したキュウリをピックアップする装置を作ってみたり。 デルタ式3Dプリンタの先にロボットハンドとカメラを付けた的なやつ 全部pythonで書いてます(リアルタイム性とかあまり気にしないフレンズなんだね!)
  23. 23. まとめ ● まだまだ実用できるレベルではないですが、機械学習を使った自動化の可能性は 見えたかも ● TensorFlowはチュートリアルがしっかりしてるので取っ付き易いただ、最近はAPI が混沌としてきたような…(tf.layers,tf.contrib.learn,tf.contrib.slim,kerasとか…) ● 機械学習プログラムは楽しい!一人で悩まなくていい! ● 試作3号機を今年のMakerFaireに出せるようがんばります

×