オブジェクトの検出にはYOLO Darknetを使用しています。 Python3、tensorflow 1.0、numpy、opencv 3を使用しています。検出にはyolo.weightを使用しています。以下のリンクに記載されているとおり: https://github.com/thtrieu/darkflow#cameravideo-file-demo
ビデオで実行すると、すべてのオブジェクトが同時に検出されますが、これは不要です。
検索対象の特定のクラス名のみを検出する方法についてご案内ください。
ありがとう
@JP Kimが述べた手順を実行すると、ラベルだけでビデオが出力されますが、他のオブジェクトもラベルの1つとして出力されます。
darkflowリポジトリの特定のセクションがあります 異なる出力が必要な場合に何をするかを正確に示します。 TLDR-モデルを再トレーニングする必要があります。彼らは3つのクラスの例を取り上げてこれを示しています。
しかし、とにかくプロセスを順を追って説明しましょう。あなたがビデオを持っていて、その中のすべての人々を追跡する必要があるだけだと考えてみましょう。したがって、追跡する必要があるのは1種類のオブジェクト-「人物」のみです。
cfg
ディレクトリに_tiny-yolo-voc.cfg
_ファイルのコピーを作成します。それらの規則に従い、これに_tiny-yolo-voc-1c.cfg
_という名前を付けましょう。サフィックス_1c
_はクラスの数を表します。基本モデルとして他の構成ではなく_tiny-yolo-voc
_を選択する理由は、より小さなGPUでトレーニング可能なより小さなネットワークであるためです。私が観察したところによると、他の構成には10GB以上のグラフィックメモリが必要であり、それらは私のマシンをメモリ不足にするために使用されていました。
_tiny-yolo-voc-1c.cfg
_ファイルに必要な変更を加えます。
classes
変数を_classes=1
_に編集しますconvolutional
の直前の最後のregion
セクションで、filter
変数を5 * (num_class + 5) = 5 * (1+5) = 30
に変更します。したがって、_filters=30
_を設定しますDarkflowソースディレクトリの_labels.txt
_ファイルを編集し、その中にperson
を示す1行のみを含めます。これは、1種類のラベルしか必要ないためです。
ここで、モデルをトレーニングする必要があります。ただし、トレーニングでは、まずデータセットが存在する必要があります。
これで、ラベルがVOCデータセットまたはCoCoデータセットの既存のラベルの1つである場合、VOC/Cocoデータセットの1つをダウンロードできます。この場合、person
は追跡する必要があるオブジェクトのタイプであり、すでにVOCデータセット内のオブジェクトのタイプです。したがって、VOCデータセットを使用します。
ただし、YOLOを使用して新しいタイプのオブジェクトを分類および追跡する場合は、独自のデータセットと注釈を準備する必要があります。このカスタムオブジェクトの目的のために、 このyoutubeビデオシリーズ のパート5-8に従うことができます。これらのビデオは、YOLOを使用して_fidget_spinner
_を追跡および分類する方法の例を紹介しています。
VOCデータセットには、私たちのタイプのオブジェクトに十分なデータと注釈が含まれているため、ダウンロードしてくださいperson
_# Download the Pascal VOC dataset:
curl -O https://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar
tar xf VOCtest_06-Nov-2007.tar
_
最初からトレーニングするつもりはありません。したがって、実際に_tiny-yolo-voc
_モデルの重みをロードし、特定のユースケース(person
クラスのみ)から、そこから再トレーニングを開始します。このため、_tiny-yolo-voc
_にダウンロードされた重みが必要です。重みを見つけることができます ここではYOLO v2の場合 。 VOCデータセットの小さなYOLO の重みをダウンロードします。ダウンロード後、ファイルを_/darkflow/bin/
_ディレクトリに移動します。
これをダウンロードしたら、ベースモデルの構成ファイルとウェイトファイルに同じ名前を付ける必要があります。 configの名前を変更するのは良い考えではないため、ダウンロードした重みの名前を_yolov2-tiny-voc.weights
_から_tiny-yolo-voc.weights
_に変更します。これは、トレーニングするときに重みファイルを提供し、darkflowが新しいモデルをトレーニングするための参照として対応する構成ファイルを取得しようとするために必要です。
これは、darkflowリポジトリページにも記載されています。
Darkflowがtiny-yolo-voc.weightsをロードしていることを確認すると、cfg /フォルダーでtiny-yolo-voc.cfgを探し、その構成ファイルを--model cfg/tiny-yoloで設定した新しいファイルと比較します-voc-1c.cfg。この場合、最後の2つを除いてすべてのレイヤーのウェイトの正確な数は同じになるため、最後の2つまでのすべてのレイヤーにウェイトがロードされます。
これで、モデルをトレーニングできます。これをトレーニングするGPUがない場合は、_--gpu 0.9
_の部分を削除できます。
_# Train the net on the Pascal dataset:
flow --model cfg/tiny-yolo-voc-1c.cfg --load bin/tiny-yolo-voc.weights --train --dataset "~/VOCdevkit/VOC2007/JPEGImages" --annotation "~/VOCdevkit/VOC2007/Annotations" --gpu 0.9
_
損失が減少しなくなったと思われる場合は、Ctrl + Cを押してトレーニングを終了します。通常、適切な損失/平均損失は1以下です。
250ステップごとに、darkflowは_ckpt/
_ディレクトリにチェックポイントを保存し続けることに注意してください。トレーニングを停止すると、これらのチェックポイントのいずれかを使用してモデルをテストできます。
人々のビデオでそれを実行し、境界ボックス予測で新しいビデオを保存します。この例では、1500番目のステップのチェックポイントを使用します。
_flow --model cfg/tiny-yolo-voc-1c.cfg --load 1500 --demo video-input.mp4 --gpu 0.9 --saveVideo
_
これを実行すると、モデルがビデオを操作できるFPSが表示されます。これはマシンによって異なる場合があります。 FPSとビデオの長さによっては、これが完了するまでに時間がかかる場合があります。プロセスが完了すると、_video.avi
_ディレクトリに_darkflow/
_が作成されます。
これは、ビデオで検出されたperson
タイプのオブジェクトのみを持つ必要があります。
出力が適切でない場合は、モデルをさらにトレーニングしたり、しきい値やその他のパラメーターを変更して、より良い出力を得ることができます。
お役に立てれば。
私が見つけたものから、あなたは次のようにそれを行うことができます:
その後、
flow --model cfg/your_new_copied_file.cfg --load path/to/weight_file --demo your_video.mp4 --labels your_labels.txt --saveVideo
それでおしまい。
しかし問題は、全体的な検出精度が大幅に低下することです。多くの場合、完全に異なるオブジェクトをラベル内のオブジェクトとして検出します。 (おそらく、ダークフローがしきい値を超えている場合、ラベルの中で最も信頼できる推測を選択するだけですか?)
したがって、他のオブジェクトをスキップしながら(つまり、それらを認識し、スキップしながら)、他のクラスから一部のオブジェクトのみを検出する場合は、追加のパラメーター(--mark marklabels.txtなど)を受け入れるようにdarkflowソースを編集することをお勧めします。