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