web-dev-qa-db-ja.com

人、猫、犬などの特定のクラスのみを検出するYolo Darknet

オブジェクトの検出にはYOLO Darknetを使用しています。 Python3、tensorflow 1.0、numpy、opencv 3を使用しています。検出にはyolo.weightを使用しています。以下のリンクに記載されているとおり: https://github.com/thtrieu/darkflow#cameravideo-file-demo

ビデオで実行すると、すべてのオブジェクトが同時に検出されますが、これは不要です。

検索対象の特定のクラス名のみを検出する方法についてご案内ください。

ありがとう

10
Tejas Somaiya

@JP Kimが述べた手順を実行すると、ラベルだけでビデオが出力されますが、他のオブジェクトもラベルの1つとして出力されます。

darkflowリポジトリの特定のセクションがあります 異なる出力が必要な場合に何をするかを正確に示します。 TLDR-モデルを再トレーニングする必要があります。彼らは3つのクラスの例を取り上げてこれを示しています。

しかし、とにかくプロセスを順を追って説明しましょう。あなたがビデオを持っていて、その中のすべての人々を追跡する必要があるだけだと考えてみましょう。したがって、追跡する必要があるのは1種類のオブジェクト-「人物」のみです。

  1. cfgディレクトリに_tiny-yolo-voc.cfg_ファイルのコピーを作成します。それらの規則に従い、これに_tiny-yolo-voc-1c.cfg_という名前を付けましょう。サフィックス_1c_はクラスの数を表します。基本モデルとして他の構成ではなく_tiny-yolo-voc_を選択する理由は、より小さなGPUでトレーニング可能なより小さなネットワークであるためです。私が観察したところによると、他の構成には10GB以上のグラフィックメモリが必要であり、それらは私のマシンをメモリ不足にするために使用されていました。

  2. _tiny-yolo-voc-1c.cfg_ファイルに必要な変更を加えます。

    • classes変数を_classes=1_に編集します
    • convolutionalの直前の最後のregionセクションで、filter変数を5 * (num_class + 5) = 5 * (1+5) = 30に変更します。したがって、_filters=30_を設定します
  3. Darkflowソースディレクトリの_labels.txt_ファイルを編集し、その中にpersonを示す1行のみを含めます。これは、1種類のラベルしか必要ないためです。

  4. ここで、モデルをトレーニングする必要があります。ただし、トレーニングでは、まずデータセットが存在する必要があります。

    • これで、ラベルがVOCデータセットまたはCoCoデータセットの既存のラベルの1つである場合、VOC/Cocoデータセットの1つをダウンロードできます。この場合、personは追跡する必要があるオブジェクトのタイプであり、すでにVOCデータセット内のオブジェクトのタイプです。したがって、VOCデータセットを使用します。

    • ただし、YOLOを使用して新しいタイプのオブジェクトを分類および追跡する場合は、独自のデータセットと注釈を準備する必要があります。このカスタムオブジェクトの目的のために、 このyoutubeビデオシリーズ のパート5-8に従うことができます。これらのビデオは、YOLOを使用して_fidget_spinner_を追跡および分類する方法の例を紹介しています。

  5. 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
    _
  6. 最初からトレーニングするつもりはありません。したがって、実際に_tiny-yolo-voc_モデルの重みをロードし、特定のユースケース(personクラスのみ)から、そこから再トレーニングを開始します。このため、_tiny-yolo-voc_にダウンロードされた重みが必要です。重みを見つけることができます ここではYOLO v2の場合VOCデータセットの小さなYOLO の重みをダウンロードします。ダウンロード後、ファイルを_/darkflow/bin/_ディレクトリに移動します。

  7. これをダウンロードしたら、ベースモデルの構成ファイルとウェイトファイルに同じ名前を付ける必要があります。 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つまでのすべてのレイヤーにウェイトがロードされます。

  1. これで、モデルをトレーニングできます。これをトレーニングする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
    _
  2. 損失が減少しなくなったと思われる場合は、Ctrl + Cを押してトレーニングを終了します。通常、適切な損失/平均損失は1以下です。

250ステップごとに、darkflowは_ckpt/_ディレクトリにチェックポイントを保存し続けることに注意してください。トレーニングを停止すると、これらのチェックポイントのいずれかを使用してモデルをテストできます。

  1. 人々のビデオでそれを実行し、境界ボックス予測で新しいビデオを保存します。この例では、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タイプのオブジェクトのみを持つ必要があります。

出力が適切でない場合は、モデルをさらにトレーニングしたり、しきい値やその他のパラメーターを変更して、より良い出力を得ることができます。

お役に立てれば。

15
Bhavul

私が見つけたものから、あなたは次のようにそれを行うことができます:

  1. 元のyolo cfgファイルを新しいファイルにコピーし、[region]セクションのクラスの値を、検出するクラスの数に編集します。
  2. ラベルテキストファイルを作成し、検出するクラス名(元のクラスのサブセット)を入力します

その後、

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ソースを編集することをお勧めします。

5
JP Kim