アンカーのサイズを取得YOLOv3 K-手段

YOLOv1とYOLOv2は、単にYOLOv3、ちょうどラップタイムを見て詳細に見て、見モンゴルは、いくつかの研究の後、いくつかの重要なポイントでステップ録音バイステップ:

v2およびv3はアンカーに参加し、より高速なアンカーがそれを理解する方法を、いくつかの違いがありますrcnn?

個人的な理解方言の論文:

(1)中心座標と幅と高さを有しているアノテーションデータの基である、標準的なデータ形式の対応するセットは、注射にVOC XMLフォーマットです。

幅と高さと幅と正規化と画像の高さのコード抽出注釈データ:

デフload_dataset(パス):
	データセット= []
	glob.globでxml_fileため( "{} / * XML" .format(パス))。
		ツリー= ET.parse(xml_file)

		高さ= INT(tree.findtext( "./サイズ/高さ"))
		幅= INT(tree.findtext( "./サイズ/幅"))

		tree.iter( "オブジェクト")でOBJについて:
			XMIN = INT(obj.findtext( "bndbox / XMIN"))/幅
			YMIN = INT(obj.findtext( "bndbox / YMIN"))/高さ
			XMAX = INT(obj.findtext( "bndbox / XMAX"))/幅
			YMAX = INT(obj.findtext( "bndbox / ymaxの"))/高さ

			dataset.append([XMAX  -  XMIN、YMAX  -  YMIN])

	np.array返す(データセット)

  

(2)具体的にどのように分割しますか?K-手段がデータをマークされたすべての分割スタックのバウンディングボックスの幅及び高さに応じて使用され、データが9つのVOCスタックに分割され、距離は、距離= 1-IOUであります

NPとしてnumpyのインポート

「」」
(1)K-手段は、特定のフレームN内のすべてのデータを取得し、取得した全てのランダムの幅と高さは、内部にランダム中心として9得る
(2)及び9つの基礎の幅と高さIOU、他のすべてのバウンディングボックスを(距離)を距離N行9バーを算出するために計算されます
(3)すべてのバウンディングボックスは、それらの9が割り当てられていることを、各列の最小見出され、そしてすべてのバウンディングボックスの更新中心点9つのファミリーの中央値を計算します。
中心から(4)までの9つの中心をX、9に変更できない、Yは適当==全体のデータブロックの幅と高さ9つのアンカーです。
「」」 デフIOU(ボックス、クラスタ): 「」」 ボックスとkのクラスタ間の連合(IOU)の上に交差点を計算します。 :PARAMボックス:タプルまたはアレイ、原点にシフト(すなわち、幅と高さ) :PARAMクラスタ:形状のnumpyのアレイ(K、2)ここで、kはクラスタの数であります :リターン:kはクラスタの数である形状のnumpyのアレイ(K、0) 「」」 #9でIOUにクラスタの各ボックスを計算 #箱:すべての[[幅、高さ]、[幅、高さ]、......] #クラスタ:9ランダム中心点[幅、高さ] X = np.minimum(クラスタ[:, 0]、ボックス[0]) Y = np.minimum(クラスタ[:, 1]、ボックス[1]) もしnp.count_nonzero(x == 0)> 0又はnp.count_nonzero(Y == 0)> 0: (「ボックスが領域を持っていない」)ValueErrorを送出し 交差点= X * Y #すべてのボックスエリア box_area =ボックス[0] *ボックス[1] cluster_area =クラスタ[:, 0] *クラスター[:, 1】 iou_ =交差点/(box_area + cluster_area - 交差点) リターンiou_ デフavg_iou(箱、クラスター): 「」」 ボックスおよびK個のクラスタのnumpyのアレイとの間の連合(IOU)の平均交差を計算します。 :PARAMボックス:形状のnumpyのアレイ(R、2)、rは列の数であります :PARAMクラスタ:形状のnumpyのアレイ(K、2)ここで、kはクラスタの数であります :リターン:単一floatとして平均IOU 「」」 np.mean返す([範囲でiについてnp.max(IOU(ボックス[i]は、クラスタ))(boxes.shape [0])]) デフtranslate_boxes(箱): 「」」 原点にすべてのボックスを変換します。 :PARAMボックス:形状のnumpyのアレイ(R 4) :リターン:形状のnumpyのアレイ(R、2) 「」」 new_boxes = boxes.copy() 範囲内の行の(new_boxes.shape [0]): new_boxes [行] [2] = np.abs(new_boxes [行] [2] - new_boxes [行] [0]) new_boxes [行] [3] = np.abs(new_boxes [行] [3] - new_boxes [行] [1]) 戻りnp.delete(new_boxes、[0,1]、軸= 1) DEF関数kmeans(ボックス、K、DIST = np.median)。 「」」 連合の上に交差点でクラスタリングを計算するK-手段(IOU)メトリック。 :PARAMボックス:形状のnumpyのアレイ(R、2)、rは列の数であります :PARAMのK:クラスターの数 :PARAM DIST:距離関数 :リターン:形状のnumpyのアレイ(K、2) 「」」 行= boxes.shape [0] 距離= np.empty((行、k))を last_clusters = np.zeros((行)) np.random.seed() 全体の配列が同じ行が含まれている場合は#Forgyメソッドは失敗します (ランダムにk個の元のデータセットから選択された)初期#k個のクラスタセンター クラスタ=ボックス[np.random.choice(行は、kは、交換=偽)] 真の中に: 範囲内の行の(行): #規定された距離メトリック式:D(ボックス、重心)= 1-IOU(ボックス、重心)。より良い小さいのクラスタ中心までの距離、 #IOU値が、大きく、より良いので、1の使用 - このように小さい距離を確保IOU、大きな値IOU。 #計算値ボックスと(行、k)の全てのクラスタ 距離[行] = 1 - IOU(ボックス[行]、クラスタ) #print(距離) #(コードが最小のクラスタ中心から)各ボックスの(選択された場合、である)「」最も近いクラスタ中心マークボックスに割り当てられます。 nearest_clusters = np.argmin(距離、軸= 1) #クラスタ中心の変化の量がゼロになるまで(すなわち、クラスタ中心を変更します)。 .ALL(last_clusters == nearest_clusters)の場合(): ブレーク #各クラスタの中心は(新しいクラスタの中心として、ここでは各クラスのビット数)を算出します 範囲(K)におけるクラスタの: #この文は、k個のデータを割り当てられたすべてのボックスを積み重ねることで、より厄介な、それは、それぞれが新しいポイントとしての中央値ヒープを求めて、良いKヒープデータポイントであります クラスタ[クラスタ] = DIST(ボックス[nearest_clusters ==クラスタ]、軸= 0) last_clusters = nearest_clusters リターン・クラスター

 コードを実行します。

輸入グローブ
インポートxml.etree.ElementTree'veと

NPとしてnumpyのインポート

関数kmeansから関数kmeans、avg_iouをインポート

#ANNOTATIONS_PATH = "注釈"
CLUSTERS = 9

デフload_dataset(パス):
	データセット= []
	glob.globでxml_fileため( "{} / * XML" .format(パス))。
		ツリー= ET.parse(xml_file)

		高さ= INT(tree.findtext( "./サイズ/高さ"))
		幅= INT(tree.findtext( "./サイズ/幅"))

		tree.iter( "オブジェクト")でOBJについて:
			XMIN = INT(obj.findtext( "bndbox / XMIN"))/幅
			YMIN = INT(obj.findtext( "bndbox / YMIN"))/高さ
			XMAX = INT(obj.findtext( "bndbox / XMAX"))/幅
			YMAX = INT(obj.findtext( "bndbox / ymaxの"))/高さ

			dataset.append([XMAX  -  XMIN、YMAX  -  YMIN])

	np.array返す(データセット)

ANNOTATIONS_PATH =「独自のデータ・パス」
データ= load_dataset(ANNOTATIONS_PATH)
アウト=関数kmeans(データ、K =クラスタ)
プリント( "精度:{:.2f}%" 形式(avg_iou(データアウト)* 100))
#print( "ボックス:\ N {}" 形式(OUT))。
印刷( "ボックス:\ N {}  -  {}" 形式([:, 0] * 416、[:, 1] * 416)アウトアウト)
比率= np.around .tolist()([:, 0] /アウト[:, 1]、小数= 2アウト)
(((比)ソート)フォーマット "\ N {}比"。)印刷

  

独自の計算VOC2007 9963個のデータセットタグデータの合計を、論文が少し出与えるためには、voc2012と2007バーの違い可能性があり、

それは次のように計算されます。

正確さ:

67.22パーセント

ボックス(4自体は、わずかではないに5ラウンド、比率に形式を変更され):
[40、40、76、77 184277 89207 162134 347327 44128 14、27 23、72]

比率:
[0.32、0.35、0.43、0.55、0.67、0.99、1.02、1.06、1.21]

おすすめ

転載: www.cnblogs.com/lzq116/p/12145673.html