平成29年度http://www.iri.pref.niigata.jp/pdf/houkoku/h29houkoku.pdfリンク先の最終ページ付近に、YOLOを使ったパトライトの監視があります。本稿では、この報告を見習い、keras-yolo3を使ってパトライトを監視させようと思います。※結論からいうと、まだまだ完成度は低いです。完成度を上げるためには工場内で撮ったリアルな画像を集めてこないといけないです。最終的にラズベリーパイで動かすことを念頭におきます。従って、重いフルモデルではなく、軽いtinyモデルを使います。tinyモデルは精度は落ちますが、早いことが特徴です。公式ページによると1秒間に200コマ以上処理する、とてつもなく早いモデルです。こちらを見ても、CPUでサクサク動くようです。クイックスタートAnaconda3やTensorFlow、Kerasのインストールは省略します。※Colaboratoryであれば、これらのインストールは不要です。以下からkeras版yolo3を入手します。ZIP」をクリックしてダウンロードします。解凍すると、keras-yolo3フォルダができます。学習済みのモデルを入手します。今回は、tinyモデルですので、こちらからダウンロードします。ダウンロードしたファイルをkeras-yolo3フォルダの直下に入れます。次に、入手した学習モデルをKeras用に変換します。以下のコマンドを入力します。model_data/tiny_yolo_weights.h5Colaboratoryで作業する場合は、以下のとおりコマンドします。model_data/tiny_yolo_weights.h5これで、Keras用の学習済みモデルが「model_data」フォルダに入ります(tiny_yolo_weights.h5)。yolo.pyをコピーし、「tiny_yolo.py」に名前を変えます。その中身の23、24行目を以下のように書き換えます。#,yolo_anchors.txt',また、yolo_video.pyをコピーし、「tiny_yolo_video.py」に名前を変えます。その中身の3行目を以下のように書き換えます。detect_videoとりあえず、これで静止画と動画の物体検出ができます。静止画は、実行したい写真をkeras-yolo3直下に入れ、以下のコマンドで物体検出させることが可能です。---imageColaboratoryの場合は、以下のとおりコマンドします。---imageファイル名を聞かれるので、写真名を入力してください。判定画像を保存したい場合は、tiny_yolo_video.pyの16、17行目を以下のように書き換えます。::-1])r_image.show()動画を判定させたい場合は、以下のように、入力動画名と出力ファイル名をコマンドします。test_out.mp4となります。こちらは、Colaboratoryだとエラーが出たので、自分のPCで実行しました。パトライト画像の準備ネットでパトライトの画像を集めます。Augmentation(データ水増し)を行いました。十分なデータ数があれば、ここの処理は必要ありません。こちらを参考にkerasでコードを作りました。1最終的に、学習データを100個(画像データ10個+水増しデータ90個)ほど用意しました。事前に、以下のようにフォルダを作っておきます。JPEGImagesアノテーションデータの作成は、こちらのAnnotationTool.exeを使わせていただきました。使い方は、リンク先の「独自データでの準備」の題目を参考にしてください。ツールを実行すると、画像ファイル分の「~.xml」ファイルと、「trainval.txt」ができます。これらを以下のように、「VOCdevkit/VOC2007」内のフォルダにコピーします。「Annotations」フォルダには作成されたxmlファイルを全部入れます。「ImageSets/Main」に「trainval.txt」を入れます。「JPEGImages」フォルダに、パトライトの画像ファイルをすべて入れます。学習の前に、ファイルの準備が必要です。「VOCdevkit/VOC2007/ImageSets/Main」にある「trainval.txt」をコピーして、「train.txt」、「val.txt」、「test.txt」という3つのファイルを作ります。「model_data」フォルダにある「voc_classes.txt」のラベル名を書き換えます。この中にはaeroplaneなど複数のラベル名がありますが、全て消し、今回用のラベルに書き換えます。「voc_annotation.py」の6行目も同様に書き換えます。ここで、以下のコマンドを実行します。voc_annotation.pyすると、keras-yolo3直下に「2007_val.txt」、「2007_train.txt」、「2007_test.txt」が生成されます。このうち「2007_train.txt」のみを「train.txt」というファイル名を変更しておきます。Colaboratoryで学習させる場合は、「train.txt」の各行のアドレスを以下のように編集します。VOCdevkit/VOC2007/JPEGImages/****ここでは、置換機能で書き換えました。keras-yolo3のフォルダをグーグルドライブに上げます。次に、keras-yolo3直下のtrain.pyをコピーし、「tiny_train.py」に名前を変えます。19、20行目を以下のように書き換えます。'model_data/tiny_yolo_anchors.txt'#yolo_anchors.txt'最後に、以下のコマンドで学習を実行します。tiny_train.py自前のGPUで学習させようとすると、非力過ぎてメモリーエラーが出てしまったので、学習はColaboratoryで実行しました。tiny_train.pyデフォルトの学習は、以下のように設定されています。trainデータとvalデータは、自動的に割り振られます。1~50エポックでは、事前学習された重みを使って学習します。学習可能な層は、最後の2層だけのようです。50~100エポックでは、全ての層で学習可能となっています。rateも徐々に下げる設定になっており、前半のエポックに比べlossは1桁下がります。完了したら、「logs/000」フォルダ内にあるval_lossが一番低い.h5ファイルをmodel_dataフォルダに入れます。次にtiny_yolo.pyファイルの中身をいじります。22行目を先ほどの.h5ファイルの名前で書き換えます。'model_data/***.h5',#'model_data/yolo.h5'そして、24行目も以下のように書き換えます。'model_data/voc_classes.txt',#'model_data/coco_classes.txt',さらに、バグかどうか分かりませんが、一部の画像は取り込む際に色が反転したりして、色情報が正しくないことがありました。その理由は、基本的に、JPGで学習させているため、カラーモードをRGBに統一してあげる必要があるためです。https://note.nkmk.me/python-opencv-bgr-rgb-cvtcolor/そこで103、104行目を以下のように書き換えます。image.convert('RGB')さらに、動画はOpenCV2を使って取り込んでいますが、デフォルトは「BGR」になっています。従って、「RGB」に変えてあげる必要があり、191~196行目を以下のように書き換えます。cv2.COLOR_RGB2BGR)あとは、クイックスタートと同じです。---imageとなります。結果まずは、静止画です。Box)が重なっていますが、検知できています。画面サイズは225×225です。処理時間はCPU使用で0.12秒です。静止画より画面サイズが大きいため、若干処理が遅くなります。それでも、CPUで0.2秒(1秒間に5フレーム処理できる)ほどです。学習データについて以下の課題点は、「ネット画像で学習させるのは限界がある」という結論に至ります。従って、工場内で撮ったリアルな画像を集めてこないといけないです。学習データをもっと集めれば、誤検知が減ると思います。本来は、誤検知を防ぐために、背景に他の物体があるものも用意しないといけません。ネットから画像を集めてくると、背景には何も写っていません。従って、工場内のリアルな写真を撮るのが妥当といえます。新潟県の報告にもありましたが、光の加減で誤検知することがあるそうです。Augmentationを使うと良いかもしれません。分類し検知させたいです。ネットの画像に単色だけ光っているものは見当たらず、学習データが用意できませんでした。実際の運用を考えたとき、「画面内の位置情報」と「YOLOの出力情報」を照合・登録するソフトを別途用意する必要があります。requestStockLike27@shinmura0長野県内で、製造業向けにソリューションを提供しています。仕事の依頼などありましたら、お気軽にメールしてください。勉強会も開催しています。upLoginユーザーは見つかりませんでした。