2021/04/14SHAREツイートシェアはてブGoogle+PocketLINEこんばんはエンジニアの眠れない夜です。前回はkeras−yolo3の使い方をご紹介しました。【物体検出】keras−yolo3の使い方まだ読んでいない方は先にkeras-yolo3の使い方を読んでkeras-yolo3を動くようにしてからこの先を読み進めるとスムーズにkeras-yolo3の学習を始められます。物体検出ってこんなに簡単にできるの!?ってなります。機械学習がとっても身近なものに感じられるようになります。́Д`)と、感じますがそこはディープラーニング、仕方ないですね(^_^;)sleepless-se/keras-yolo3をクローンkeras−yolo3の学習が行いやすいようにオリジナルのkeras-yolo3に手を加えたものを公開しました。こちらからクローンしてください。keras-yolo3-sampleクローンできたらrequirements.txtから必要なモジュールをインストールします。1.6.0がインストールされます。なにかエラーが出る場合はバージョンを揃えたほうがいいです。3.6.9で動作しました。教師画像をダウンロード物体検出をしたい画像を集める必要があります。分量は各ラベル(対象)ごとに500は必要。1000枚くらいあるといいと書いている記事が多いです。画像を集めてくるのは大変ですが、機械学習の画像収集ならiCrawlerを使うと1回の実行で100枚の画像を集められるので楽ができます。機械学習の画像集めはiCrawlerがおすすめ!今回はお試しなので、各クラス(ラベル)ごとに20枚程度で大丈夫です。動かなかった時に涙します。精度は出ませんが、今回は学習ができるかを確認することが目的です。教師画像をリサイズ一通り画像のダウンロードができたらkeras-yolo3のimages直下に画像を全て移動させます。keras-yolo3ディレクトリで下記のコードを実行します。画像にリサイズします。画像が正方形ではない場合は白で背景が塗り足されます。このコードは私が追加したものなのでオリジナルのkeras-yolo3には入っていないので気をつけてください。教師画像のサイズは32pxの倍数である必要があるので320pxに設定しています。32の倍数であれば128pxや352pxなどでも大丈夫です。画像が大きすぎると学習時にメモリに乗り切らずクラッシュするため小さめのサイズが無難です。リサイズ時の大きさを変更したい場合は第一引数でサイズを指定してください。128また、今回はデフォルトでimagesフォルダの画像をリサイズしてresize_imageに保存されるようになっていますが33行目辺りで設定可能です。+と警告が出ることがありますが無視して大丈夫です。アノテーションツールVOTT画像のここに対象物がありますよ。伝えることをアノテーションといいます。このアノテーションを作成するアプリはたくさんあるのですが、個人的にはVOTTというアプリケーションがおすすめです。事前に学習したモデルに予測をさせてアノテーションができるVoTTの使い方は別の記事にまとめたのでこちらをご覧ください。VOCでアノテーションファイルを書き出すと、resize_imageの中にxxx-PascalVOC-exportというフォルダが作成されます。この中のフォルダとファイルをkeras-yolo3/VOCDevkit/VOC2007に移動させます。ここで移動しているのは書き出されたファイルとフォルダだけなのでアノテーションを設定した元のファイルは影響を受けないというVOTTの親切設計です。学習を実行するにはtrain.txt、test.txt、val.txtの3つのファイルが必要です。下記のコマンドを実行すると3つのファイルが作成されます。make_train_files.pyこのスクリプトは書き出された学習用のアノテーションファイルをそれぞれ、train.txtとval.txtにまとめてval.txtの中身をシャッフルして、3割ほどtest.txtに移動させて保存しています。sleepless-se/keras-yolo3で追加したファイルです。オリジナルのkeras-yolo3にはありません。作成されたファイルはkeras-yolo3/VOCDevkit/VOC2007/ImageSets/Mainから確認できます。`ラベル名_train.txt``ラベル名_val.txt`というファイルがVoTTによって作成されたファイルです。1つずつしか作成されていません。複数ラベル設定した場合はラベルの数だけ作成されます。スクリプトを実行して作成されたのがこちらの3つのファイルです。val.txtとtest.txtに分ける理由が気になる方はこちらが参考になります。YOLOの学習用に変換VOTTで書き出したアノテーションはそのままではYOLOの学習には使えないのでvoc_annotation.pyでYOLOの学習用に変換します。keras-yolo3直下にあるvoc_annotation.pyの6行目あたりのclassesのリストも自分で学習させる内容に合わせて修正します。["item"]としました。適宜自分のクラス(ラベル)に合わせて設定してください。voc_annotation.pyでYOLOの学習用に変換されます。ファイルの編集をしなくてもこちらも引数でクラスを指定できるようにしました。下記の例ではitemのみを追加しています。voc_annotation.pyに変更を加えています。変換されたファイルはkeras-yolo3直下にあるmodel_dataに保存されます。YOLO学習開始models_dataの中にあるvoc_classes.txtにクラス(ラベル)を列挙する必要があるのですが、これも先程のvoc_annotation.pyで自動で作成するようにしています。初期値はデフォルトのモデルで使われているクラスが列挙されています。今回はitemだけなので上記の画像のようになります。画像のサイズを320pxで進めてきましたが、他のサイズに変換している方は25行目辺りの下記のコードを修正してください。hwもしくは、第1引数でサイズを渡してください。先ほど作成した学習用データとクラス名の設定はannotation_pathとclasses_pathで読み込んでいます。'model_data/voc_classes.txt'学習用にweights(重み)を変換YOLOv3のweightsをダウンロードしてきて、変換します。weightsの変換が必要なのはもとのYOLOのweightsがKeras用ではないからだと思います。model_data/yolo_weights.h5未確認ですがこのページにある他のweightsを使えばベースとなるモデルを変えて移転学習ができると思います。※今回はYOLOv3-608を使用しています。学習開始!変換ができたらここまでずいぶん長い道のりでしたがいよいよ学習開始です!下記のコマンドを実行すると学習が始まります。画像のサイズを指定する場合はこのようにします。128初めの1分ほどでエラーが出なければ設定に問題はありません。これまでの作業で設定を間違えているとエラーが出ます。́Д`)教師データの量とスペックによりますが、CPU環境で問題なければ1日くらい待てば学習が終了します。゚;メモリ不足だと学習の途中で落ちます。メモリ16GBtrain.pyの57行目辺りのバッチサイズを32以下の2の倍数にすると一度に消費するメモリが少なくなるので落ちなくなります。他のブログを読んでいると8に設定してうまくいっている人が多いようです。バッチサイズは第二引数で指定できるようにしています。'val_loss'KeyError:'val_loss'とエラーが出た時はkeras-yolo3/model_data/2007_test.txtのテストファイルに含まれるファイル(行)が10個以下の場合です。動作確認のために動かすだけなら2007_test.txt内の行をコピペで10行に増やすだけで大丈夫です。学習結果に影響が出るので本番ではこういうことは絶対にしてはいけませんが、本番の場合はテスト用のデータが10件に満たないということはそもそも無いのでこういったエラーは出ません。学習済みのモデルはkeras-yolo3/logs/000/に保存されいるtrained_weights_final.h5を使います。学習中にベストスコアが出たタイミングでもep075-loss10.849-val_loss10.981.h5等のファイル名で保存されています。sleepless-se/keras-yolo3ではすぐに学習済みのモデルが使えるようにyolo.pyの24行目辺りのmodel_pathを下記のように変更しています。'logs/000/trained_weights_final.h5',画像のサイズを変更している人は29行目辺りの画像のサイズ設定を行います。320),後は画像や動画を入れて実行するだけです。--imageの後に画像のファイル名を入力でしたね。教師データが少ないので精度は程々ですが、悪くないです。ファイル名.mp4でしたね。この辺り、詳しくは前回の記事を参照してください。TДT)お疲れ様です!うまく独自モデルの学習はできましたか?アノテーションファイルの作成を適当にしても結構ステップがあって大変でしたよね。一度、全体の流れをおさらいするとこんな感じです。train.py)学習させるまでのステップが多いので途中でミスってハマるポイントがいろいろありそうです。何よりCPU環境なら日が暮れて、登ってもまだ終わりません...時々落ちるという悪夢も...(笑)私の希望としては「アノテーションさえしっかりやっていれば誰でも物体検出ができるよ!」というところまで持っていきたいです。最後に一言この記事を書いた動機は「物体検出が誰でもできるようになると世の中がもっと便利になる事いっぱいあるよね!」っと思ったからです。今回のサンプルはitemでしたが対象が変わって、見る人が見ればガンの発見なんかもこれでできるようになります。́ڡ`๑)」という思いです。この記事を読んでくださった方も独自のモデルを使っていろんな問題解決にチャレンジしてみてくださいね(^^)v今回作成したモデルはこちらの方法で簡単にAPI化してどこからでもアクセスできるようにできます。次回は無料でGPU環境が使えるGoogleColaboを使って短時間で学習させる方法を紹介します。今回紹介した方法がうまくいかない(>_<)!!CPUだと遅すぎて話にならない!!という方はこちらの方法をお試しください。現在は『アイデアをカタチにする』ことが仕事です。2019年7月24日そのエラーメッセージだけでは原因を特定できませんでした。同じようなエラーが発生してしまいました。2019年8月8日ありがとうございます!同じところでエラーが出ているというのはもしかするとなにか書き忘れているか間違えているかもしれませんね...もう一度精査します。2019年8月10日2007_test.txtに含まれるファイルが少ないことが原因でした。記事を更新しましたのでそちらをご確認ください。2019年8月26日わかりやすい記事をありがとうございます。‘model_data/2007_test.txt’の部分は‘model_data/2007_train.txt’ではないのでしょうか。2019年10月15日そう言っていただけて嬉しいです^^ご指摘ありがとうございます。凡ミス失礼致しました。分かり易いサイトを有難うございます!以下について教えてください。‘model_data/2007_test.txt’となっていますが、2007_train.txtではないのでしょうか?宜しくお願いします。2019年10月15日お役に立てて嬉しいです!ご指摘ありがとうございます!ブログ、リポジトリ修正致しました。2019年10月15日この記事は移転学習を使ったものになります。ベースとなるモデル(ウェイト)は【学習用にweightsを変換】のところでダウンロードしています。2019年10月22日momoさんコメントありがとうございます!無事に学習・検出ができると嬉しいですよね(^^)vクラス数を増やすのであればアノテーションを付ける時にラベルの数を増やして行けば大丈夫です。本記事と「【物体検出】アノテーションツールVoTTの使い方」を参考にすればできると思います。2020年12月23日webカメラを接続して、リアルタイムで実行すればどのようにコードを書き換えればいいでしょうか。2020年12月26日ミントさんWebカメラの画像をPythonで読み取って処理するのはいかがでしょうか?Webカメラからの画像の取り込みはこちらが参考になると思います。2019年10月21日プログラミングなど全くの素人です。必要と考え、色々と探して、この記事にたどり着きました。いうことは習うより慣れろ!と思い、詳細な理解はほとんど進んでいません。記事を読みつつコピペしてなんとか最後まで実施できたのですが、検出したい物体をうまく認識してくれませんでした。人や自動車のように「何か」を判断させたいわけではなく、単純に画像の中に「あるか、無いか」を判断させたいのです。そのような用途には不向きでしょうか?最後の学習済みのモデルファイルの名前が、_stage_1.h5となっていました。何かが違う?なにかアドバイスを頂けたらと思いました。2019年10月22日M.K.さんプログラミングの知識無しで挑戦するのは凄いですね!そんな方でも学習済みのファイルを作成するところまで進めるなんて私はなかなかいい記事を書きましたね。自画自賛(笑)学習済みのモデルはkeras-yolo3/logs/000/に保存されいるtrained_weights_final.h5を使います。参照しているフォルダが違うのでしょうか?もしくは同じフォルダの中にtrained_weights_final.h5が入っているかもしれません。_stage_1.h5は名前から察するに学習途中のファイルで最後まで学習した状態ではないものだと思います。単純に画像の中に「あるか、無いか」を判断させたいのです。それなら「物体検出」ではなく「画像分類」をキーワードに探されたほうがピンポイントな情報が見つけられます。ご参考になれば幸いです。お返事、ありがとうございます!色々似たようで違う記事を見てきましたが、ご自身の関連する記事とリンクしてまとまっていて、とても良く理解を進めることができる内容でした。参照しているフォルダなどは記事の通りなのですが・・・finalとはなっていませんでした。計算時間?も、かなり短かったと思います。アノテーションのやり方が適当はない?と推測していますが、現在確認しているケースでは何が適切なのか?も判らないので困っています。画像処理による検出認識も(理解は進んでいませんが)確認を進めているのですが、背景が変化することなどにより適用に足らないう認識で、他の手法を探しています。このような手法の「組み合わせ」とかでもできるのか?と思っていますが、知識と理解が追いつかない(笑)身近に相談できる人もおらず、でも時間は過ぎてゆく・・・(汗)ありがとうございました。私のような素人でも、これらを実行できるようにメモとして。本日二度目の実行で気づいたことなどを、記載します。教師画像をリサイズ一通り画像のダウンロードができたらkeras-yolo3の「image」直下に画像を全て移動させます。プログラム.py内の記載はimageではなく、imagesでした。ファイルできないなぁ?と見直して気づきました。https://pjreddie.com/media/files/yolov3.weightsだと何故か得られません。対応として、そのファイルをダウンロードして指定のディレクトリに置きました。調子に乗って?Anacondaの環境をアップデートしたら、エラーで実行できなくなってしまいました。実行環境は大切なのですねぇ。2019年10月23日M.K.さんご指摘ありがとうございます!画像保存用のフォルダ名が間違っていました。