ターゲットの検出:画像の右側可変数ターゲットの検索と分類
注意:ターゲット検出を学習する前に習得する必要があります画像分類知識システム
必要な学習資料:Githubのtensorflowによって公式に提供されているターゲット検出および分類ライブラリ
- Githubでテンソルフローモデルを検索し、次のインターフェースに移動します。
- クリックリサーチ、使用できる公式のテンソルフローツールがたくさんあります。分類モデルライブラリはスリムフォルダにあります。ダウンロード可能な事前トレーニング済みのモデルがたくさんあります。コードをクリックしてソースコードを表示します。以前の公式実装は引き続きベースでした。 tensorflow1バージョンで実現されました。現在、tensorflow2バージョンがあります。さらに、Checkpointは、提供されている公式の事前トレーニングモデルです。ImageNetデータセットでトレーニングされています。これらのモデルは、移行学習やさまざまなモデルに使用できます。必要に応じて使用するために選択することができます。、以下に示すように:
- ターゲット検出ライブラリは調査中のobject_detectionファイルです。赤いボックスに公式の事前トレーニング済みモデルがあります。これがCOCOトレーニングセットの事前トレーニング済みモデルです。画像とCOCOの検出に必要な時間は次のとおりです。モデルに。以下に示すように、データセットなどの精度を構築するには、公式ドキュメントとトップの出版物の論文を見て、ブログを少なくするか、バージョンの不一致の問題が原因である可能性があります。たくさんのバグ。
現在、ターゲット検出には2つの主流システムがあります。
すべてのターゲット検出ネットワークで、1ステージと2ステージの2つのシステムに分けることができます。
- 2段階:たとえば、Faster-RCNN。この一連のネットワークの場合、検出プロセスは2つのステップに分割できます。最初のステップは、特別なモジュール(RPN)を介して候補フレームを生成することです。このプロセスは、実際には前景と境界ボックス(アンカーに基づく)の調整では、対象のオブジェクトを分類せずに検索してボックスアウトします。2番目のステップは、最初のステップで生成された候補ボックスに基づいて(提案に基づいて)境界ボックスを分類および調整することです。
- ワンステージ:たとえば、SSDやYoLoは、アンカーに基づいてバウンディングボックスを直接分類し、調整します。
- 比較:One-Stageの検出速度は、検出を実現するのに1ステップしかかからないため、Two-Stageよりも確実に高速です。Two-Stageは時間がかかりますが、代わりに精度が高くなります。どちらを使用する必要がありますか。 ?種は、プロジェクトのニーズに応じて選択する必要があります。
PASCALVOCデータセット
PASCAL VOCチャレンジは、世界クラスのコンピュータービジョンチャレンジです。PASCALのフルネームは、パターン分析、静的モデリング、および計算学習です。これは、欧州連合によって資金提供されているネットワーク組織です。課題には主に、画像分類、ターゲット検出、ターゲットセグメンテーション、およびアクション認識が含まれます。データセットには、主に車両、家具、動物などに分類される合計20のカテゴリがあります。次の図は、ダウンロードしたデータセットのファイル構造を示しています。
注釈:すべての画像の注釈情報を含む注釈情報ファイル、各画像XMLファイルに対応します
。ImageSets:さまざまなタスクの分類情報、トレーニングセットに含まれる画像、検証セットに含まれる画像が含まれます。
黒い注釈はセグメンテーションに関連しており、単純に引き継がれます。
注:cocoデータセットが公開される前は、基本的にPASCAL VOCが使用されていましたが、現在はcocoが使用されています。
ターゲット検出の一般的な指標
ネットワークをトレーニングすると、図に示すように、検証セットでCOCO評価リストが取得されます。分類タスクでは、精度は通常、検証セット内の正しい分類の数をサンプルの総数で割ることによって取得されます。ターゲット検出では、それは確かにそれほど単純ではないので、ターゲットの検出として何がカウントされますか?通常、ネットワークのmAPは、論文の特定のデータセットで確認できます。mAPとは何ですか。ここで、いくつかの概念を紹介します。
- TP(True Positive):正しく予測された境界ボックスの数を示します。ここでは、予測された境界ボックスとgtboxのIoU値が0.5より大きい場合を指定できます(バウンディングボックスが正しいかどうかを判断するために、一般的に合意されたLoU = 0.5)、一致は成功したと見なされます。たとえば、次の図では、確率0.9の赤い境界ボックスが緑のgtboxと一致しており、これはTPです。
- FP(偽陽性):これは、として理解することができる偽陽性が対象ではなく、それは、ターゲット(誤検出)として認識されている、予測境界ボックスとgtboxのIOU値が0.5未満です。 、および図の確率は0.3予測境界ボックスと緑のgtboxです。IoUが0.5未満の場合、赤の境界ボックスはFPと呼ばれます。
- FN(False Negative):検出されなかったGTの数。下の図の右下隅に猫がいますが、ネットワーク検出プロセス中に一致しません。これは、検出の失敗に相当します。
上記のいくつかのパラメーターを通じて、さらにいくつかの概念を導入します。
- 精度:TP /(TP + FP)。これは、モデルによって予測されたすべてのターゲット間の正しい予測の比率であり、精度と呼ばれます。
- リコール:TP /(TP + FN)、すべての実際のターゲットの中で、モデルが正しく予測するターゲットの割合はリコールと呼ばれます。
別の概念を導入します。
- AP:PR曲線の下の領域、
- PR曲線:適合率-再現率曲線
- mAP:平均平均適合率AP値は以前はカテゴリごとに個別に計算されていたため、1つのカテゴリが1つのAPに対応し、ターゲット検出に複数のカテゴリがある場合があり、複数のカテゴリを平均することでmAPを取得します。
次に、トピック、cocoデータセットの各評価インデックスの意味を入力します。
- 最初のパラメータセットのAPには合計3つの値があります.2番目の値はIoUが0.5のときに計算されたAPの値です。この値は
、PASCAL VOCデータセットによって提供される評価指標でもあります。もちろん、 cocoの評価指標はまだ存在しています。ココデータセットの評価指標の中で最も重要なのはAPです。これは最初の値であり、ここではAPについて説明していますが、0.5〜0.95間隔から0.05までの範囲の10個のIoUでのmAPの平均値を指します。 。、しかし、実際には今計算されたmAPです。IoU設定が大きくなると、ターゲット検出のバウンディングボックスがgtBoxと一致する必要があり、ターゲットの位置がますます正確になります。 したがって、表のIoU = 0.75ノートはより厳しい標準です。 - スケール全体のパラメータの2番目のグループには、小/中/大領域のAPがあります。ターゲットピクセル領域が32平方未満の場合は小ターゲットとして分類され、96平方を超える場合は次のようになります。大きなターゲットに分類されます。このグループパラメータを渡すと、さまざまなスケールのターゲット検出に対するターゲット検出ネットワークの影響を理解できます。たとえば、検出されたターゲットが小さい場合、APsmallの値に注意を払う可能性があります。
- パラメータの3番目のグループ:ARパラメータ。再現率は再現率として理解できます。それぞれmax = 1、10、100の3つのケースがあります。通常の計算では、非最大抑制後、各画像は最大で100の各画像によって与えられた境界ボックスの数を表すさまざまな値を持つターゲット。
- パラメータの第4のグループ、パラメータの第2のグループに類似している、異なるターゲットスケールのARの値については説明しません。
- 通常の使用時に注意が必要ないくつかのパラメーターを以下に示します。
ターゲット検出のいくつかの概念(具体的な実装については、論文を読んだ後で詳しく説明します)
- LoU:交差と和集合の比率(loU)関数は、2つの境界ボックスの交差と和集合の比率を計算することです。2つの境界ボックスの重なりの相対的なサイズを測定します。コンピューター検出タスクでは、 loU≥0.5の場合、つまり検出は正しいです。予測子と実際の境界ボックスが完全に重なっている場合、loUは1です。通常、0.5はしきい値であり、予測された境界ボックスが正しいかどうかを判断するために使用されます。これは一般的に合意されていますが、より厳密にしたい場合は、たとえば0.6以上の数値など、loUを高く設定できます。loUが高いほど、バウンディングボックスの精度が高くなります。
- 非最大抑制NSM:アルゴリズムが各オブジェクトを1回だけ検出するようにし、近隣でスコアが最も高いウィンドウを選択し、スコアが低いウィンドウを抑制します。つまり、冗長な検出フレームを削除して、最良のフレームを維持します。具体的な方法は次のとおりです。一連の検出フレームの最大確率と残りのフレームの間のオーバーラップIOUが設定されたしきい値より大きいかどうかを個別に判断し、それをスローして、最も確率の高いフレームを保持し、同じことを行います。残りの検出フレーム状況リストまで動作します。
- アンカーボックス:重なり合う複数のターゲットを検出するために、中心点に異なるウィンドウを使用します。どのステージで、いつトリガーするかについて詳しく説明します。
XMLファイル
xmlの基本的な構成:
- 1>タグ:<タグ名>、開始タグと終了タグはペアで存在します。そして、さらに多くの終了タグ/
形式があります:<開始タグ>…</終了タグ> - 2>属性:<?xml version = "1.0"?>などの開始タグにのみ表示されます。version= "1.0"は属性です。
コンポーネントアクセスプロセス:
- 1.ツリーとルートノードを構築します
- 2.子ノードを取得します:同じ名前の
直接子ノードを直接取得しますfind(node name)#同じ名前の直接子ノードを取得します(欠点:指定された名前に従って最初の子ノードのみを取得します)
findall (node name)#すべて同じ名前を取得する直接の子ノード、返されたノードはリストに保存されます - 3.値へのアクセス:node.tag #get
node tag
node.attrib#picture = "
1.png "などのノード属性を取得node.test#time1.jpgなどのエンドリーフノード間のテキストであるテキストを取得
注意が必要なのは一般的に次のとおりです。
- ファイル名:画像の名前
- サイズ:幅、高さ画像サイズ
- オブジェクト:画像でマークされたターゲットには複数のターゲットが含まれている可能性があります。このxmlには2つのマークされたターゲットがあります
- -----名前:ターゲットカテゴリのラベルラベルラベル
- ----- bndbox:ターゲットボックスにxmin、ymin、xmax、ymaxのラベルを付けます(左上隅、右下隅の座標)
注釈付きデータ分析コード
import numpy as np
import xml.etree.ElementTree as ET
CLASSES = ('aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car',
'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike',
'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor')
index_map = dict(zip(CLASSES, range(len(CLASSES))))
print(index_map)
anno_path='./001234.xml'
tree = ET.parse(anno_path)
root = tree.getroot()
size=root.find('size')
width = float(size.find('width').text)
height = float(size.find('height').text)
print(width,height)
def validate_label(xmin, ymin, xmax, ymax, width, height):
"""Validate labels."""
assert 0 <= xmin < width, "xmin must in [0, {}), given {}".format(width, xmin)
assert 0 <= ymin < height, "ymin must in [0, {}), given {}".format(height, ymin)
assert xmin < xmax <= width, "xmax must in (xmin, {}], given {}".format(width, xmax)
assert ymin < ymax <= height, "ymax must in (ymin, {}], given {}".format(height, ymax)
label=[]
for obj in root.iter('object'):
difficult = int(obj.find('difficult').text)
cls_name = obj.find('name').text.strip().lower()
if cls_name not in CLASSES:
continue
cls_id = index_map[cls_name]
xml_box = obj.find('bndbox')
xmin = (float(xml_box.find('xmin').text) - 1)
ymin = (float(xml_box.find('ymin').text) - 1)
xmax = (float(xml_box.find('xmax').text) - 1)
ymax = (float(xml_box.find('ymax').text) - 1)
try:
validate_label(xmin, ymin, xmax, ymax, width, height)
except AssertionError as e:
raise RuntimeError("Invalid label at {}, {}".format(anno_path, e))
label.append([xmin, ymin, xmax, ymax, cls_id, difficult])
label=np.array(label)
print(label)
Output:
[[ 69. 13. 181. 442. 14. 0.]
[ 32. 166. 189. 499. 14. 0.]
[ 0. 424. 61. 474. 11. 0.]
[ 2. 279. 70. 383. 19. 0.]]
次のコンテンツは001234.xmlとして保存されます。
<annotation>
<folder>VOC2007</folder>
<filename>001234.jpg</filename>
<source>
<database>The VOC2007 Database</database>
<annotation>PASCAL VOC2007</annotation>
<image>flickr</image>
<flickrid>338514152</flickrid>
</source>
<owner>
<flickrid>bensalem5g</flickrid>
<name>Brian</name>
</owner>
<size>
<width>260</width>
<height>500</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>person</name>
<pose>Frontal</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>70</xmin>
<ymin>14</ymin>
<xmax>182</xmax>
<ymax>443</ymax>
</bndbox>
</object>
<object>
<name>person</name>
<pose>Frontal</pose>
<truncated>1</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>33</xmin>
<ymin>167</ymin>
<xmax>190</xmax>
<ymax>500</ymax>
</bndbox>
</object>
<object>
<name>dog</name>
<pose>Right</pose>
<truncated>1</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>1</xmin>
<ymin>425</ymin>
<xmax>62</xmax>
<ymax>475</ymax>
</bndbox>
</object>
<object>
<name>tvmonitor</name>
<pose>Unspecified</pose>
<truncated>1</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>3</xmin>
<ymin>280</ymin>
<xmax>71</xmax>
<ymax>384</ymax>
</bndbox>
</object>
</annotation>