23
TensorFlowを使った キュウリの仕分け あれこれ @ike_jpn Shizuoka.py #6

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

  • Upload
    ikejpn

  • View
    259

  • Download
    0

Embed Size (px)

Citation preview

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

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

@ike_jpnShizuoka.py #6

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

自己紹介

Twitter : @ike_jpn

Blog : http://www.workpiles.com/

お仕事: きゅうり農家,プログラマー,Tinkerer

最近のマイブーム: 機械学習,Raspberry Pi,...

活動: MakerFireTokyo(1),MashupAwards(4),gugen(1)

Pythonの経験: 独学,OpenCV,Django,TensorFlow

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

本日話すこと

・TensorFlowを使ったキュウリ仕分け機の開発にまつわるあれこれ

・現在やってる試作3号機の取り組み

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

キュウリの仕分け機って?

【仕分け(選果)作業とは】

キュウリの長さ、曲り具合、色つや等によっ

て、9種類の等級/階級に選別する。

ウチみたいな個人農家では、仕分け作業

は手作業で行なっており、けっこう時間が

かかって大変!

        ↓

流行りのディープラーニングで自動化出来

ないだろうか。やってみたらなんか出来そう

だぞ。

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

遡ること2016年1月

当時はまだTensorFlow0.6.0。それを何故か32bitPCにインストールしてました。    

*最新はr1.0.0

TensorFlowは何と言ってもチュートリアルがしっかりしている! MNISTのチュートリア

ルをやれば畳み込みニューラルネットワークを使った画像認識のやり方がほぼ分かる。

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

TensorFlowの基本(1)

TensorFlowのコーディングは、初めにデータフローグラフを構築して、その後実行(デー

タを流す)という手順で行います。

実行結果:

①データフローグラフの構築

 3②’z’を実行して処理結果を取得

○をops(operationsの略)と呼びます。TensorFlowは分散処理用に設計されており、ops毎に処理するデバイスを指定することができる。

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

TensorFlowの基本(2)

データフローグラフの入り口を作って、データを流し込む。

実行結果:

placeholderがデータフローの入り口。実行時にfeed_dictでデータを流し込む。

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

Deep MNIST for Experts

『Deep MNIST for Experts』チュートリアルを行うと4層の畳み込みニューラルネットワー

クの作り方が大体理解できる。後は、これをベースにちょっとずつチューニングする。

チューニング項目: ネットワーク構成:  積層数、処理順序、活性化関数、損失関数、正規化、正則化 … 畳み込み層:  フィルタ数、フィルタサイズ、 … プーリング層:  アルゴリズム、サイズ、 … ドロップアウト:  有無、ドロップアウト率 全結合層:  ユニット数、…

(最適なパラメータ教えてくれる AIプリーズ…)

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

試作1号機

最初の試作はWebカメラで上から撮影したキュウリ画像を9クラスに識別するだけ。

ブログのネタになればいいかな程度でやってみた。

275枚のテスト画像に対し、約80%の正答率。

学習データ サイズ:32x32x3 数:2750枚

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

2016年2月

やっぱりPCパワーないと厳しい。ちょっと入力画像の解像度上げるとOOMで落ちる。  

→メモリを8Gから24Gに増設(今思えば実装の仕方が悪かっただけでこんなにいらなかった…)

でも、GPUないから遅い。ちょっと階層を増やそうものなら学習が終わらなくなる。    

→GPUは高いな・・・ゲームもやらないし・・・クラウドよくわからん

*GCPのCloudML使ってみたけど、ぶん回すといつの間にか高額請求になりがち。1週間で2万ぐらい行った(無料期間中でホント助かった)。がっつり機械学習やるならGPU買った方がいいかも。ネットを見るとなんとなくGTX1080買ってる人が多いかな?

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

2016年3月

ディープラーニングお金掛かりそうだし、一応ブログのネタにもなったし、そもそも人間と

同等の仕分け作業なんて無理だろうし・・・

すごーい!きみは囲碁が得意なフレンズなんだね!

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

試作2号機の制作開始

撮影台から作成を始めた。

何度も作り直したので製作期間は1ヶ月間ぐらいかかった。

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

教師データ集め

人間が仕分けをしたキュウリを台に乗せて、ひたすら撮影とラベル付け。

撮影とラベル付けは、openCVで簡単なスクリプトを作成。

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

教師データ集め

8500本分のキュウリ画像を撮りためる。撮影期間2ヶ月間ほど。

7000本を教師データ、1500本をテストデータとした。

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

学習&チューニング

パラメータを変えて何度も試す。40回ぐらいやってわかってきたこと。

・画像サイズはできるだけ小さくした方がいい(無駄に大きのは時間の無駄)

・画像サイズは小さすぎない方がいい(解像度上げるだけで良い結果になる場合もあ

る)

・変数(重みとバイアス)の初期値は継承しよう(restoreで簡単にできるよ)

・Batch Normalizationはいいものだ(誤差の収束が捗る)

・データ拡張はいいものだ(輝度をばらつかせたら効果あった)

今回の場合では、ネットワークのパラメータを調整するよりも、データの前処理をしっかり

行なった方がよい結果につながるという印象でした。

最終的には正答率96%までいった。*Batch Normalizationは、なぜかラズパイで動かすための protobufに変換出来なかったので、本番では使わなかった

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

2016年6月

ベルトコンベアの作成と撮影台との連携を考えたり。

作り方→http://workpiles.com/2016/08/ccb9-diy-belt_conveyor/

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

試作2号機完成!

実環境で動かしてみると約70%の正答率。

周りの明るさ、キュウリを置く位置などの影響を受けまくる。

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

試作3号機での取り組み

● キュウリの表面の傷なども認識したい

  → キュウリを接写し、もっと解像度を上げで認識したい(学習が進まない問題)

→ オートエンコーダで事前学習を試してみる

→ 転移学習を試してみる

● キュウリの病気も認識したい

  → 教師データが集まらない

    →教師データの錬金術

● キュウリを手で台に置くのは…全自動化したい

  → キュウリを自動的にピックアップする装置の開発

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

Convolutional Auto-Encoder

オートエンコーダとは、機械学習において、ニューラルネットワークを使用した次元圧縮

のためのアルゴリズム(wikiより)。

・事前学習に使われている(最近はほとんどやらない?)

・256x80でやってみたけど学習が収束していかない…

Input(160*80*3)

Hidden*1/12

output(160*80*3)

https://twitter.com/ike_jpn/status/786469686762274816

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

VGG16を使った転移学習

既存の訓練されたニューラルネットワークを使って、一部分を再学習することで、効率良

く学習をおこなう。

Inception-v3で抽出した特徴をマッピングしてみた。

VGG16を使って転移学習してみた。

→正答率84%(自前CNNよりも低い)

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

教師データの錬金術

教師データが少ない、そもそも集まらない場合は、仮想世界で瞬時に大量生産したデー

タで学習して、現実世界に適用すればよい。

最近のゲームを見ても分かる通り、高品質なテクスチャだけでなく、光効果、物理現象す

らもリアルに再現するよ。

https://arxiv.org/abs/1612.03019

(2ヶ月間も写真撮るよりも、 Unity勉強したほうがよかった?)

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

全自動化

https://twitter.com/ike_jpn/status/829006671787593728

https://twitter.com/ike_jpn/status/822487711592218625

収穫したキュウリをピックアップする装置を作ってみたり。

デルタ式3Dプリンタの先にロボットハンドとカメラを付けた的なやつ

全部pythonで書いてます(リアルタイム性とかあまり気にしないフレンズなんだね!)

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

まとめ

● まだまだ実用できるレベルではないですが、機械学習を使った自動化の可能性は

見えたかも

● TensorFlowはチュートリアルがしっかりしてるので取っ付き易いただ、最近はAPIが混沌としてきたような…(tf.layers,tf.contrib.learn,tf.contrib.slim,kerasとか…)

● 機械学習プログラムは楽しい!一人で悩まなくていい!

● 試作3号機を今年のMakerFaireに出せるようがんばります