〇Google ColabでYOLOの学習を行う, 公式ページのほうにも学習方法などが記載されています。 交通部 R&Dセンター. ・フィルター数 = (クラスの数+5)×3), 「obj.names」というファイルを新規作成し、クラス名を1行ずつ記載して以下のパスにアップロードします。今回はbottleという1行のみを記載しています。, 「obj.data」というファイルを新規作成し、以下のフォルダ構成を書き込んだ保存します。今回はクラス数が1なのでclasses= 1としています。, 学習に必要となってくる「train.txt」と「test.txt」を用意します。ファイルの中には今回の学習で使用する画像のパス一覧を記載しておきます。 #and when times[x] arrives use function gfg to clear console. Copyright © 2020 NAKASHA CREATIVE CORPORATION All Rights Reserved. 学習用データの準備 データ保存用のディレクトリを作る。 この例 〒460-0014 愛知県名古屋市中区富士見町13−22 ファミール富士見711  地図 これまでYOLOv3で作ってきた学習データを、無修正でYOLOv4でそのまま学習させると性能が上がるのかどうか?また、検出速度の向上はあるのか?, ただし、YOLOv4では新たな機能として、学習時に画像処理を行い、モザイクやブレなどを生じさせてデータを水増しする機能がありますが、今回は新しい機能を使わずに検証しています。この機能は、汎化性能を向上させる効果を期待できますので、後日改めて検証します。, HP OMEN 880-000jp Desktop i7 7700 3.6GHz*8、メモリ32GB NVidia GeForce GTX1070 8GB Windows10Professional 64bit OpenCV 4.2.0 CUDA 10.1.105 cuDNN 7.6.0.64, batch=64subdivisions=32 width=416height=416, YOLOv3では、値の振れ幅が大きく、ピーク位置もイテレーションが3000のとき、11000のとき、と数回発生しており、なかなか収束の傾向が見られません。これに対し、YOLOv4の方ではピーク位置が2000イテレーションという早い段階で訪れており、その後はYOLOv3よりも緩やかに値が収束していきました。, ここでは、1000イテレーションごとに作成されるweightsのうち、イテレーション回数5000以上のPrecisionの結果から中央値を算出して、比較しています。, 今回検証したモデルでは、Precisionが3~5%ほど向上しているのがわかります。, 実際にYOLOv4のモデルで検出処理をしてみると、YOLOv3のときよりも検出数が上がっているのが確認できました。, label3、label4のように数パーセントしか向上していないものもありますが、対象の特徴がわかりやすく検出しやすい場合や、YOLOv3におけるPrecisionの値が高いといった場合に、そのような傾向がみられました。, Precisionと同じく、RecallとF値についても、値が10%以上向上しているのが確認できました。, YOLOv4では、YOLOv3と比較して学習の処理時間がかかるものの、その精度は以前よりも全体的に向上しているということがわかりました。, より精度を求めるのであれば、YOLOv4でモデルを再作成してみるのをお勧めします。, 4K(3840x2160)と2K(1920x1080)の内容がまったく同じ動画、静止画に対して、YOLOv3とYOLOv4のモデルを使って検出を行い、その処理速度を比較しました。, 動画の処理速度はYOLOv4の方が遅く、静止画の場合もYOLOv4の方が遅いかほぼ同等という結果が得られました。, モデルの性能は向上しますが、残念ながら検出の処理については、学習時と同様、YOLOv3よりも多くの時間が必要になります。, この結果から、YOLOv4では解像度に関わらずベンチマーク通りの能力が発揮されていることがわかります。一方で、YOLOv3の方では、解像度によって10fpsの差が生まれているので、その部分は改善されたと言えます。, 今回使用した学習時パラメータは、v3でベストと判断したものをそのまま使っていますが、モデル構造そのものが異なるので、本来であれば学習率やバッチサイズ、イテレーション回数などを広範囲に調査した上で、最適な条件で学習して比較するのがフェアです。 もしかするとスイートスポットがイテレーション2万回以上のところにあるかもしれませんし、Precision、Recall、F値の算出がv3とv4で異なっている可能性があります。 ※特に正解のアノテーションが難しい不定形の対象の場合に、IoUがこれらの性能指標に大きな影響を持っていることが分かっています。, YOLOv4では、データの水増しを内部で行うための機能が追加されており、汎化性能の向上に寄与すると推測されます。 今回、YOLOv3と全く同じ条件で、比較をしましたので、v4に最適な条件でチューニングした結果は、また変わって来ると思われます。, mapコマンド周りが大きく改善されましたので、性能評価の後処理部分が大きく改善されている効果も期待できます。, R&Dの「ちょっとしたものづくり」を主に担当。360°パノラマ、機械学習などシステム、画像処理を中心に活動しています。, ●富士見事務所 TEL : 052-228-8733 FAX : 052-323-3337 【物体検出】vol.1 :Windowsでディープラーニング!Darknet YOLOv3(AlexeyAB Darknet), 【物体検出】vol.17 :Darknet YOLOv4でRTX2080Superのベンチマーク(GTX1070の1.7倍!), 【物体検出】vol.16 :Darknet YOLOv4の新機能 -save_labelsで"検出結果を学習データに活用する", 【物体検出】vol.15 :Darknet YOLOv3→YOLOv4の変更点(私家版), 【物体検出】vol.14 :YOLOv4 vs YOLOv3 ~ 同じデータセットを使った独自モデルの性能比較. 〇YOLO: Real-Time Object Detection 学習データと評価データの割合:70%、30%, 1カテゴリ100枚で10区分の場合、かつ学習データと評価データを7:3とすると、700枚が学習に使われます。バッチサイズ32枚とすると、700÷32≒20イテレーションで1エポックとなります。, 推奨値である区分数*2000イテレーションを正とすると、20000イテレーション、1000エポックです。, 1エポックで評価データとして300枚(1カテゴリ30枚)が使われます。APを求める母数として、わずか30枚に対する割合や精度だということに注意したほうが良いです。1枚の誤検知があると3%上下するということ。, 何をもって、モデルの精度や検出率を評価するかというのは、「課題に対して異なる」というのが真のようですが、まず、YOLOで良く出て来る指標を押さえておきます。, iOUは、50%で評価することが多いようです。面積で半分と言えば、縦横がどちらか半分くらいずれててもいいでしょう?というレベル。75%の面積の一致とは、縦横のいずれも半分ずれていないよというレベル。, ...が、アノテーションデータの囲い方にもシビアな品質の追求が必要です。そこまで行ってしまうと、ちょっと現実的ではない気がしますね。, mAPは、完全にでたらめに予測をしても50%は出せるでしょうから、60%以上なければ、有意な検出では無いのでは?と想像できます。 交通部 R&Dセンター. YOLOv3の環境構築が終わり、一通り学習済モデルで「おぉぉぉ」と興奮した後は、オリジナルモデルの学習に興味が沸いてきます。, Windows 10上のDarknetでYolo v3をトレーニングしOpenCVから使ってみる, 1カテゴリ当たり100枚で「試しにやってみる」 ⇒ PoC(Proof of Concept:仮説検証), 角度、大きさ、色相、明度の異なる複数のバリエーションを偏りなく集め、1カテゴリ1000枚を達成します。⇒ 精度を向上します。, 誤検知のデータを修正、データの水増しをしながらブラッシュアップを繰り返していくと、結果的に5000枚、10000枚になります。, 1カテゴリ画像100枚、10カテゴリ(1000枚)を集めるためにはおよそ3日のデータ作成時間と、1日の学習、1日の評価時間が必要です。, データ量が10倍になればデータ作成時間は10倍(30人日)ものボリュームに。10000枚ならさらに10倍。どこまで費用をかけられるのか?が制限になります。, https://github.com/AlexeyAB/darknet に書かれていることですが、, バッチサイズ:64で試す→GPUメモリが足りなければ32に変更 【物体検出】vol.2 :YOLOv3をNVIDIA Jetson Nanoで動かす, 【物体検出】vol.1 :Windowsでディープラーニング!Darknet YOLOv3(AlexeyAB Darknet), 【物体検出】vol.17 :Darknet YOLOv4でRTX2080Superのベンチマーク(GTX1070の1.7倍!), 【物体検出】vol.16 :Darknet YOLOv4の新機能 -save_labelsで"検出結果を学習データに活用する", 【物体検出】vol.15 :Darknet YOLOv3→YOLOv4の変更点(私家版), 【物体検出】vol.14 :YOLOv4 vs YOLOv3 ~ 同じデータセットを使った独自モデルの性能比較, MAP = Mean Average Precision、平均適合率の平均。複数のカテゴリのAPの平均。1イテレーションor1エポック単位で各カテゴリのAPの平均を出して、学習が収束しているかどうかの目安にする, 学習データに最適化しすぎて、それ以外のデータではそれほどではない状態(専門バカ、教えたことしかできない子), 推奨:1カテゴリ5000、10000枚(高い精度と検出率、差異が少ない対象を扱っている場合、汎化性能を求める場合), 1つの物体に対して、2つの区分を回答してしまっていた部分が、正しく一つだけ検出するようになった, 640*480ドットの荒い動画でも十分に認識できます。(所詮416ドットで切り出している。これより小さいとダメかもしれませんね), 2物体重なっていても正確に検出します。(3物体以上重なっている場合はダメのようです), WindowsゲーミングPC(GeForce GTX1070)で640x480ドット@30fpsの動画を、40-50fpsで認識できました。4K動画の場合で15fps程度です。, 720pのUSBカメラでリアルタイムに物体検出させた場合、34.2fps出ました。. Kazuki Room ~電子工作・ロボット・3Dプリンター・RaspberryPi~ by, Yolo-v3 and Yolo-v2 for Windows and Linux, How to train YOLOv2 to detect custom objects, 解決!「Arduino ‘read’ was not declared in this scope」というコンパイルエラーについて, Blenderと3Dプリンターを使用してミニ四駆を作ってみた!【3Dプリンターで出力可能な3Dデータを作ります!】, RaspberryPiとMJPG-Streamerでライブストリーミングをする方法, JetsonNanoが搭載されているJetbot(AIロボットカー)を動かしてみた, TACOデータセットとは?TACOのサイトにゴミの画像をアップロードしてAI(深層学習)の学習に役立てよう!, 【深層学習】Colab・YOLOv3・darknet でYOLO形式の独自データセットを学習させる手順. Loss <0.2 〇How to train YOLOv2 to detect custom objects, 使用したい画像を収集し、今回の独自データセットとして使用します。画像収集が完了したらアノテーションツールを使用してアノテーションファイルを作成していきます。, 今回はペットボトルの画像を30枚用意して管理しやすいように「bottle_0001.jpg」のように全てリネームしておきました。リネームは以下の記事で紹介したツールを利用します。, また、今回使用する画像はリサイズして画像の大きさをそろえておきました。データセットで使用する画像はサイズが一定のものがよいと書いてある記事もありますが、こちらについては別途考察していきたいと思います。, アノテーションツールにはLabelingを使用しました。画像を読み込んでタグ付けを実施していきます。YOLO形式で保存されるように設定を切り替えておきます。, 保存をすると画像と同じフォルダにアノテーションファイルが出力されます。一枚の画像(.jpg)に対して一枚のアノテーションファイル(.txt)が出来上がっていることを確認します。, GoogleColabのページに移動して新しいノートブックを作成します。名前は任意です。, 以下のコマンドを順番に実行していきます。必要なものに関してはこちらのページで公開されているものをそのまま使用しています。, YOLOを動作させるためにdarknetフレームワークを取得します。デフォルトのディレクトリから移動していない場合はContentフォルダ配下にダウンロードされます。, 〇darknetフォルダ配下に「darknet53.conv.74」をダウンロードしておきます。リストコマンドで「darknet53.conv.74」ファイルが増えていることを確認します。, ここからは準備しておいた画像や設定ファイルをColabにアップロードしていきます。ファイルのダウンロードおよびアップロードは左側のメニューから右クリックで行うことができます。, まずは以下のパスにある「yolov3.cfg」をローカルにダウンロードし、「yolo-obj.cfg」にリネームします。, リネームしたら中身を以下のように書き換えます。まずはbatchとsubdivisionsを書き換え。, 次に学習するクラスの数に合わせてclassesを書き換えます。今回はbottleだけなので1を設定します。書き換えるのは610 行目、696 行目、783 行目となります。, 次にフィルターを書き換えます。フィルター数は以下の計算式の結果に書き換えます。今回はクラス数が1なので結果は18となります。書き換えるのは603 行目、689 行目、776 行目となります。 ファイルは以下の引数で指定している場所に正しく配置してある必要があります。, 1クラスであれば8時間から12時間程度で学習が終わることが多いようです。クラスの数が増えるとそれだけ学習する時間も増えることが分かっています。学習済みの重みができたら性能を確かめていこうと思います。, Colabで学習を開始してそのまま操作を行わないと90分でセッションが切れてしまいます。今回はその問題を自動化ツールの「UWSC」で解決します。, ⑦上記の処理を一定時間で繰り返し行えるように「.UWS」ファイルの中身を編集します。, あとは学習を開始させたらUWSCの再生ボタンを押してセッションが切れないようにします。, KAZUKIです。 ファイルパスとしては以下のようになります。, 以下のコマンドを実行して学習を開始します。Windowsでは実行コマンドが異なるようですのでご注意。 モノづくりが好きで、ブログでは電子工作やゴミ回収ロボットのことを書いています。, ゴミ回収ロボットを一緒に開発してくれる方がいらっしゃいましたらお問い合わせフォームからご連絡ください。, Kazuki Room ~電子工作・ロボット・3Dプリンター・RaspberryPi~, #!wget https://pjreddie.com/media/files/yolov3.weights, //pjreddie.com/media/files/darknet53.conv.74, #start threading with the Timer module each element of the array. Kazuki Room ~電子工作・ロボット・3Dプリンター・RaspberryPi~ 〒460-0014 愛知県名古屋市中区富士見町13−22 ファミール富士見711  地図 YOLO V3にオリジナルデータを学習させたときのメモ。この記事はチェックができていないので、注意してください。Yoloで学習させるためには以下のものを準備する。 1. 【物体検出】vol.14 :YOLOv4 vs YOLOv3 ~ 同じデータセットを使った独自モデルの性能比較; お問い合わせ ご意見・ご質問などお気軽にお問い合わせ下さい。 ナカシャクリエイテブ株式会社 富士見事務所 TEL : 052-228-8733 FAX : 052-323-3337 電子工作やロボットの情報をメインに発信していきます!, 今回はGoogleColab・YOLOv3・darknetの環境でYOLO形式の独自データセットを学習させる手順を紹介していきます。, 深層学習で使用されるデータセットの形式は数種類あるようですが、今回はその中でYOLO形式のデータセットを用意して実施していきます。, 〇物体検出に独自データを学習させる(顔ロボット) 「YOLOv3」とは、物体検出(画像から物体の位置と種類を検出)する機械学習モデル です。 この「YOLOv3」を、Windows 10 上で動かしてみたいと思います! どんなものができるの? 今回は、YOLOv3 を動作させる環境を構築します。 mAP >0.7, class_id:1、2でAPが低いことが分かります。区分ごとに正解率が高いものと低いものがあることが分かります。(→原因が、データ量の偏りにあるのかどうかを確認すること!), 特に、class_id:2のFPが11と高いです。(FP/(TP+FP)=28.9%)。これは誤検知の割合を示し、検知した中に、本来検知されるべきではないものを示します。区分が紛らわしいか、特徴が他のカテゴリと被っていないかを確認する必要があります。, 次に、これらの各イテレーション毎に、各カテゴリのTP、FPがどのように推移しているかを確認すると、各カテゴリごとに学習が完了したかどうかを推測できます。, TPがあるところで頭打ち、FPが下げ止まりしていれば学習が収束(完了)しています。FPが高い数値でそれ以上下がらない場合は、特徴を上手く捉えられていない可能性があります。, データが少ないか、他のカテゴリと特徴が被っている、未定義の紛らわしいものがあるか。カテゴリの戦略か、学習データを見直す必要があるかもしれません。, イテレーション毎の重みを使って、テストを実行した際、mAPやLossの数字だけではなかなかわからない、"体感"が確かにあります。, Lossが0.1台になり、mAPが80%を超えるようになると、学習データを使った検証で誤認はほとんどありません。, では、それが絶対ベストな状態になっているかというと、実はそうでもなく途中のイテレーションのモノを採用した方が良い場合もあったりします。, 実は、この辺りの都市伝説的なことは、「validationに使うデータが、本当に偏りなく、いろんなパターンを網羅しているのか?」が怪しいんじゃないかと思っています。もっともっとデータを増やした時に、徐々に部分最適解ではなく、全体最適解に収束していくのかもしれません。, どこまで行っても、学習データにおいて良く認識できていることと、汎化性能が確保されているかどうかは、学習時(及び学習時に分割したデータを使ったvalidationにおける)LossやmAPといった指標だけではわかりませんので、あとは色々な(学習や評価に使ったことがない)動画や、紛らわしく意地悪に加工したデータで検証します。, これまでに紹介している当社のゲーミングPC(普通に20万円台で購入できるものです)において、, ●富士見事務所 TEL : 052-228-8733 FAX : 052-323-3337 Copyright © 2020 NAKASHA CREATIVE CORPORATION All Rights Reserved. イテレーション:(カテゴリ数*2000)以上 これまでyolov3で作ってきた学習データを、無修正でyolov4でそのまま学習させると性能が上がるのかどうか?また、検出速度の向上はあるのか? 今回はその辺りを検証し、報告します。 ただし、yol 〇Yolo-v3 and Yolo-v2 for Windows and Linux パス一覧は「train.txt」と「test.txt」で8:2ぐらいとなるようにランダムに割り振っておきます。, 作成した「obj」フォルダの中に学習で使用する画像とアノテーションファイル一式をアップロードします。 (そして実際に、50%を越えなければ、まったく使い物になりません), Precisionも感覚的には、60を超えると、「まぁまぁ分かっているな」。70を超えると「少し間違えるかな」、80を超えると「間違えなくなってきたな」、90を超えると「過学習かな」と疑うレベルです。, イテレーションが進むとLossが減り、mAPが向上します。 今回はGoogleColab・YOLOv3・darknetの環境でYOLO形式の独自データセットを学習させる手順を紹介していきます。 深層学習で使用されるデータセットの形式は数種類あるようですが、今回はその中で YOLO形式 のデータセットを用意して実施していきます。. (Lossが少なく、mAPが高ければ高いほど良い。)