Detectionする。全クラスを学習するのは弊社の持っているリソースでは現実的ではない為、リンゴ、オレンジ、苺、バナナの4クラスだけで判定するモデルを作ってみる。BananaのIDは下記。/m/014j1m,Apple/m/0cyhj_,Orange/m/07fbm7,Strawberry/m/09qck,BananaこのIDに該当するラベルと画像だけを抽出して学習する。各ラベルに対する写真の枚数。2,306学習データ全体では19,649。このくらいであればGPUがついた個人のPCでも扱える。利用するライブラリtensorflowのmodelsに置いてあるobject_detectionを利用する。https://github.com/tensorflow/models/tree/master/research/object_detection正式なライブラリという立ち位置ではないけどApacheライセンスでメンテもちょくちょく行われているので、メンテが行われていない古い実装を使うより引っかかる点が少なく済む。V4を利用した例も書いてある。R-CNNやMask-RCNN、Android向けの実装等も用意されている。一部処理はPython2向けになっているようで3では動かない箇所がある。必要になりそうなライブラリをわさわさ入れる。TensorflowはCPU版を指定しているので、必要があればGPU版に書き換える。tqdmcondaで上記yamlのパスを指定してenvを生成。fruits-detection続いて下記のInstallationの項を実行してセットアップを完了させる。https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/installation.mddatasetの用意OIDのデータ取得については下記を参照。formatに直す必要がある。TFRecordファイルの生成処理。ファイルのパス構成は下記のようになることがレコメンドされているので、これに合わせてディレクトリを作成する。label_map_fileとpipeline_config_fileはファイルでそれ以外はディレクトリ。trainこの構成通りのディレクトリ構成にすると、学習時にValidationのデータ等を読み込んでくれる。validationそれぞれのannotations-bbox.csvから必要なラベルだけ抜き出す。fruits-${type}-annotations-bbox.csvdoneこれで3つのファイルができる。ファイルの行数はそれぞれのイメージ数+1(ヘッダの分)になる。train画像ファイルについても必要なファイルだけコピーして1つのディレクトリ配下に入れておく。dest_path)label_mapを記述する。書き方は下記ファイルが参考になる。object_detection/data/oid_v4_label_map.pbtxtファイル名は仮にoid_v5_fruits_label_map.pbtxtとしておく。"Banana"}生成したlabel_map_fileはdataフォルダ配下に置く。Dataset用のTFRecord変換機能)で学習用のデータをTFRecordファイルに変換する。validationそれぞれのTFRecordファイルを生成。1これでmodelsディレクトリ配下にnum_shardsに指定した数で分割されたTFRecordファイルが生成される。oid_fruits-00009-of-00010引数説明。num-shardsはファイルを分割する数。デフォルトでは100になっているが、今回のデータはサンプリングしてあるのでtestデータだと5くらいで十分。100MB以下くらいにすると良いらしい。出力されるファイルのprefixを指定する。ところで下記のようなエラーが出た。byteいくつか修正する。tf.train.Feature(bytes_list=tf.train.BytesList(value=value))train続いてSSDの学習用のconfigを作る。samplesからやりたい処理に似たconfigをコピーする。models/fruits_model/ssd_inception_v3_fruits.configコピーしたファイルを今回のデータに合わせて編集する。枚数はvalidationに入っている660枚。unicode関数が呼ばれていてPython3ではエラーになる。当該ファイルの上の方で下記を宣言して回避する。strこれで準備完了。trainを実行する。初回はさらっと終わるようにNUM_TRAIN_STEPS=3000と少なめの数を指定しておく。実行時間はGTX1070tiで30分位。--alsologtostderr実行状況は下記で確認できる。--logdir=models/fruits_model各ラベルごとのAPの推移等もちゃんと用意されている。3000回くらいだとまだほとんど当たらない。上部タブのIMAGESを選択する実際にvalidationデータの判定結果が見れる。Trueにしておくとこの画面に表示する画像を毎回shuffleして出してくれる。checkpointを読み込んでtrainするmodels配下に生成されたcheckpointから学習を再開してみる。先ほどの実行でckpt-3000というファイルが出来ているはず。再開に利用するチェックポイントを指定する。"models/fruits_model/model.ckpt-3000"NUM_TRAIN_STEPSの数を上げてtrainを実行する。detectionを実行してみる。最後のcheckpointからfrozenなモデルの生成。指定したパスにモデルが出力される。TF_RECORD_FILESにはカンマ区切りでファイルが指定できる。下記では1ファイルのみ指定。指定したパスに結果が出力される。出力されたtf_recordファイルを読み込む。detection_boxesを見ておけば良さそう。下記ページの手順に従って評価を実行する。https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/oid_inference_and_evaluation.md2箇所ほどエラーが出たのでコードを修正している。指定したパスに出力される。tmp/eval/metrics.csvOpenImagesV2_PerformanceByCategory/AP@0.5IOU/b'Apple',0.47982193735198647OpenImagesV2_PerformanceByCategory/AP@0.5IOU/b'Orange',0.1849362140783137OpenImagesV2_PerformanceByCategory/AP@0.5IOU/b'Strawberry',0.2862974195468154OpenImagesV2_PerformanceByCategory/AP@0.5IOU/b'Banana',0.3910937216356761上記はNUM_TRAIN_STEPSを20万まで増やして実行したモデルだけど、だいぶ低い。良いリンゴで約48%、オレンジは18%。テーブルの上に1つフルーツが置いてあるようなシチュエーションであればこのモデルでも十分使えるけど、果物の周囲がごちゃっとしてる画像だとかなり判定をミスる。画像を読み込み、当該モデルを利用して物体検知結果を出力する方法は下記に記載されている。https://github.com/tensorflow/models/blob/master/research/object_detection/object_detection_tutorial.ipynbこれを参考に、単純に1画像のみを読み込んで実行するサンプルコードを記載した。今回生成したモデルのパスに変更すれば実行できるはず。精度を上げるデフォルトのまま回しただけではあまり精度が出なかった。confの項目の中から下記などをチューニングしていくと5%くらいはさらっと精度が向上した。augmentation利用する画像の選別learning_rateを調整する頑張ればもう少し上げられそう。augmentationの設定例。models/fruits_model/ssd_inception_v3_fruits.config)を見てみると、下記のような設定がされている。下記は回転や明度彩度などの調整を加えた設定。augmentationの動きについては下記を参照。MLFlowの機能をざっと試す第三弾。(1)リンク株式会社iMindスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。