交差対結合 (IoU) は、ターゲット検出で使用される概念です。ターゲット検出アルゴリズムをテストする場合、生成された予測ボックス (候補境界) とマークされたボックス (グラウンド トゥルース境界) の重複率、つまり交差と結合の比率が重要な指標となります。理想的な状況は完全な重なり、つまり比率が 1 です。 通常、ターゲット検出と呼ぶボックスは、通常の長方形のボックスであり、IOU の計算も非常に簡単です。一般的に、次の 2 つの方法があります。 - 重なり合う長方形の幅は、2 つの長方形の幅の合計から結合された長方形の幅を引いた値で、重なり合う長方形の高さに等しくなります。
- 右下隅の最小値から左上隅の最大値を引くと、重なり合う四角形の幅となり、高さと同じになります。
上記の正四角形(長方形)のIOU計算方法1のPython実装 - def calculate_regular_iou(rec1, rec2):
- 「」 「 」
- コンピューティングIoU
- :param rec1: (y0, x0, y1, x1)は、
- (上、左、下、右)
- :パラメータrec2: (y0, x0, y1, x1)
- :戻り値: IoUのScala 値
- 「」 「 」
-
- S_rec1 = (rec1[2] - rec1[0]) * (rec1[3] - rec1[1])
- S_rec2 = (rec2[2] - rec2[0]) * (rec2[3] - rec2[1])
-
- 合計面積 = S_rec1 + S_rec2
-
- 左の行 =最大(rec1[1], rec2[1])
- 右の行 =最小(rec1[3], rec2[3])
- トップライン =最大(rec1[0], rec2[0])
- ボトムライン =最小(rec1[2], rec2[2])
-
- left_line >= right_lineまたはtop_line >= bottom_line の場合:
- 0を返す
- それ以外:
- 交差= (右線 - 左線) * (下線 - 上線)
- 戻り値(交差/ (sum_area -交差)) * 1.0
-
- __name__ == '__main__'の場合:
- # (上、左、下、右)
- 矩形1 = [551, 26, 657, 45]
- 矩形2 = [552, 27, 672, 46]
- iou = calculate_regular_iou(rect1, rect2)
上記の正四角形(長方形)のIOU計算方法2のPython実装 - def compute_regular_iou_other(rec1, rec2):
- 「」 「 」
- コンピューティングIoU
- :param rec1: (y0, x0, y1, x1)は、
- (上、左、下、右)
- :パラメータrec2: (y0, x0, y1, x1)
- :戻り値: IoUのScala 値
- 「」 「 」
- エリア1 = (rec1[3] - rec1[1]) * (rec1[2] - rec1[0])
- エリア2 = (rec2[3] - rec2[1]) * (rec2[2] - rec2[0])
-
- 左=最大(rec1[1],rec2[1])
-
- 右=最小(rec1[3],rec2[3])
-
- 上=最大(rec1[0], rec2[0])
-
- 底 =最小(rec1[2], rec2[2])
-
- w =最大(0,右-左)
- h =最大(0, 下 -上)
-
- w*h / (エリア2 + エリア1 - w*h)を返します
-
- __name__ == '__main__'の場合:
- # (上、左、下、右)
- 矩形1 = [551, 26, 657, 45]
- 矩形2 = [552, 27, 672, 46]
- iou = compute_regular_iou_other(rect1, rect2)
ただし、上記の 2 つの方法では、不規則な四辺形を計算することはできません。ここでは、Python の Shapely ライブラリを使用して実装します。Python 実装は次のとおりです。 - numpyをnpとしてインポートする
- インポート形状
- shapely.errorsからTopologicalError をインポートします
- shapely.geometryからPolygon、MultiPoint をインポートします
-
- def to_polygon(四辺形):
- 「」 「 」
-
- :param quadrilateral: 四辺形の 4 つの点の座標の 1 次元配列表現、[x,y,x,y....]
- :戻り値: 四辺形の 2D 配列、ポリゴン四辺形オブジェクト
- 「」 「 」
- # 四辺形の2次元配列表現
- 四辺形配列 = np.array(四辺形).reshape(4, 2)
- # ポリゴンオブジェクトは自動的に4つの点を計算します。最後の4つの点の順序は、左上、左下、右下、右上、左上です。
- quadrilateral_polygon = ポリゴン(quadrilateral_array).convex_hull
-
- quadrilateral_array、quadrilateral_polygonを返す
-
- def calculate_iou(実際の四辺形、予測四辺形):
- 「」 「 」
-
- :param actual_quadrilateral: 予測される四辺形の 4 つの点の座標の 1 次元配列表現、[x,y,x,y....]
- :param predict_quadrilateral: 四辺形の 4 つの点の座標の 1 次元配列表現 ([x,y,x,y....]) が必要です。
- :戻る:
- 「」 「 」
- # 四辺形の 2D 配列を予測し、四辺形の Polygon オブジェクトを予測します
- 実際の四辺形配列、実際の四辺形ポリゴン = to_polygon(実際の四辺形)
- # 四辺形の 2D 配列、四辺形の Polygon オブジェクトが期待されます
- 予測四辺形配列、予測四辺形ポリゴン = to_polygon(予測四辺形)
-
- # 後で結合領域の計算を容易にするために、2つのボックス座標を8*2に結合します。
- union_poly = np.concatenate((実際の四辺形配列、予測四辺形配列))
- # 2 つの四辺形は交差しますか?
- inter_status = 実際の四辺形ポリゴン。交差します(予測四辺形ポリゴン)
- # 2つの四辺形が交差する場合は、iou計算を実行します
- インターステータスの場合:
- 試す:
- # 交差点エリア
- インターエリア = 実際の四辺形ポリゴン.インターセクション(予測四辺形ポリゴン).エリア
- # 和面積の計算方法1
- #union_area = poly1.area + poly2.area - inter_area
- # 和面積の計算方法2
- ユニオン領域 = MultiPoint(union_poly).凸包領域
- # 結合面積が 0 の場合、iou = 0
- union_area == 0 の場合:
- 借用書 = 0
- それ以外:
- # 最初の計算は、2つの四角形を含む最小の多角形の交差部分/面積です
- iou = float (inter_area) / union_area
- # 2番目の方法: 交差/結合 (一般的な長方形のIOU計算方法)
- # iou = float (inter_area) /(poly1.area+poly2.area-inter_area)
- shapely.errors.TopologicalErrorを除く:
- print( 'shapely.errors.TopologicalError が発生しました。0 に設定されました' )
- 借用書 = 0
- それ以外:
- 借用書 = 0
-
- 戻る
-
- __name__ == '__main__'の場合:
- 実際の四辺形 = [908, 215, 934, 312, 752, 355, 728, 252]
- 予測四辺形 = [923, 308, 758, 342, 741, 262, 907, 228]
- iou = calculate_iou(実際の四辺形、予測四辺形)
- 印刷(iou)
落とし穴コードを実行するとWinError 126エラーが発生します Python で import shapely を使用する場合はエラーは発生しませんが、from shapely.geometry import Polygon,MultiPoint を使用するとエラーが報告されます。エラーの詳細情報は次のとおりです。 エラーの主な原因は geos_c.dll にあります。オンラインで多くの記事を読んだところ、そのほとんどが、geos_c.dll ファイルが見つからないことがエラーの原因であると述べていました。オンラインでいくつかの geos_c.dll ファイルを見つけて、C:\Windows\System32 に配置しましたが、問題は解決されませんでした。 最終的な解決策: pip uninstall Shapely を使用して元の Shapely をアンインストールし、対応するバージョンの whl ファイルをダウンロードして、上記のように https://www.lfd.uci.edu/~gohlke/pythonlibs/#shapely からインストールします。この whl をインストールすると、問題を解決できます。 whl ファイル ダウンロード 404 エラー https://www.lfd.uci.edu/~gohlke/pythonlibs/#shapely から指定されたバージョンの whl をダウンロードするときに、404 エラーが発生しました。次のように。 この時点で、問題を解決するには、Chrome ブラウザを使用して再度ダウンロードしてみてください。 |