ターゲット検出アルゴリズムにおける正長方形と不規則四辺形 IOU の Python 実装

ターゲット検出アルゴリズムにおける正長方形と不規則四辺形 IOU の Python 実装

交差対結合 (IoU) は、ターゲット検出で使用される概念です。ターゲット検出アルゴリズムをテストする場合、生成された予測ボックス (候補境界) とマークされたボックス (グラウンド トゥルース境界) の重複率、つまり交差と結合の比率が重要な指標となります。理想的な状況は完全な重なり、つまり比率が 1 です。

通常、ターゲット検出と呼ぶボックスは、通常の長方形のボックスであり、IOU の計算も非常に簡単です。一般的に、次の 2 つの方法があります。

  • 重なり合う長方形の幅は、2 つの長方形の幅の合計から結合された長方形の幅を引いた値で、重なり合う長方形の高さに等しくなります。
  • 右下隅の最小値から左上隅の最大値を引くと、重なり合う四角形の幅となり、高さと同じになります。

上記の正四角形(長方形)のIOU計算方法1のPython実装

  1. def calculate_regular_iou(rec1, rec2):
  2. 「」 「
  3. コンピューティングIoU
  4. :param rec1: (y0, x0, y1, x1)は、
  5. (、下、)
  6. :パラメータrec2: (y0, x0, y1, x1)
  7. :戻り値: IoUScala 値
  8. 「」 「
  9.  
  10. S_rec1 = (rec1[2] - rec1[0]) * (rec1[3] - rec1[1])
  11. S_rec2 = (rec2[2] - rec2[0]) * (rec2[3] - rec2[1])
  12.  
  13. 合計面積 = S_rec1 + S_rec2
  14. 左の行 =最大(rec1[1], rec2[1])
  15. 右の行 =最小(rec1[3], rec2[3])
  16. トップライン =最大(rec1[0], rec2[0])
  17. ボトムライン =最小(rec1[2], rec2[2])
  18. left_line >= right_lineまたはtop_line >= bottom_line の場合:
  19. 0を返す
  20. それ以外
  21. 交差= (右線 - 左線) * (下線 - 上線)
  22. 戻り値(交差/ (sum_area -交差)) * 1.0
  23.      
  24. __name__ == '__main__'の場合:
  25. # (、下、)
  26. 矩形1 = [551, 26, 657, 45]
  27. 矩形2 = [552, 27, 672, 46]
  28. iou = calculate_regular_iou(rect1, rect2)

上記の正四角形(長方形)のIOU計算方法2のPython実装

  1. def compute_regular_iou_other(rec1, rec2):
  2. 「」 「
  3. コンピューティングIoU
  4. :param rec1: (y0, x0, y1, x1)は、
  5. (、下、)
  6. :パラメータrec2: (y0, x0, y1, x1)
  7. :戻り値: IoUScala 値
  8. 「」 「
  9. エリア1 = (rec1[3] - rec1[1]) * (rec1[2] - rec1[0])
  10. エリア2 = (rec2[3] - rec2[1]) * (rec2[2] - rec2[0])
  11. =最大(rec1[1],rec2[1])
  12. =最小(rec1[3],rec2[3])
  13. =最大(rec1[0], rec2[0])
  14. 底 =最小(rec1[2], rec2[2])
  15. w =最大(0,-)
  16. h =最大(0, 下 -)
  17. w*h / (エリア2 + エリア1 - w*h)を返します
  18. __name__ == '__main__'の場合:
  19. # (、下、)
  20. 矩形1 = [551, 26, 657, 45]
  21. 矩形2 = [552, 27, 672, 46]
  22. iou = compute_regular_iou_other(rect1, rect2)

ただし、上記の 2 つの方法では、不規則な四辺形を計算することはできません。ここでは、Python の Shapely ライブラリを使用して実装します。Python 実装は次のとおりです。

  1. numpyをnpとしてインポートする
  2. インポート形状
  3. shapely.errorsからTopologicalError をインポートします
  4. shapely.geometryからPolygon、MultiPoint をインポートします
  5. def to_polygon(四辺形):
  6. 「」 「
  7. :param quadrilateral: 四辺形の 4 つの点の座標の 1 次元配列表現、[x,y,x,y....]
  8. :戻り値: 四辺形の 2D 配列、ポリゴン四辺形オブジェクト
  9. 「」 「
  10. # 四辺形の2次元配列表現
  11. 四辺形配列 = np.array(四辺形).reshape(4, 2)
  12. # ポリゴンオブジェクトは自動的に4つの点を計算します。最後の4つの点の順序は、左上、左下、右下、右上、左上です。
  13. quadrilateral_polygon = ポリゴン(quadrilateral_array).convex_hull
  14. quadrilateral_array、quadrilateral_polygonを返す
  15. def calculate_iou(実際の四辺形、予測四辺形):
  16. 「」 「
  17. :param actual_quadrilateral: 予測される四辺形の 4 つの点の座標の 1 次元配列表現、[x,y,x,y....]
  18. :param predict_quadrilateral: 四辺形の 4 つの点の座標の 1 次元配列表現 ([x,y,x,y....]) が必要です。
  19. 戻る
  20. 「」 「
  21. # 四辺形の 2D 配列を予測し、四辺形の Polygon オブジェクトを予測します
  22. 実際の四辺形配列、実際の四辺形ポリゴン = to_polygon(実際の四辺形)
  23. # 四辺形の 2D 配列、四辺形の Polygon オブジェクトが期待されます
  24. 予測四辺形配列、予測四辺形ポリゴン = to_polygon(予測四辺形)
  25. # 後で結合領域の計算を容易にするために、2つのボックス座標を8*2に結合します。
  26. union_poly = np.concatenate((実際の四辺形配列、予測四辺形配列))
  27. # 2 つの四辺形は交差しますか?
  28. inter_status = 実際の四辺形ポリゴン。交差します(予測四辺形ポリゴン)
  29. # 2つの四辺形が交差する場合は、iou計算を実行します
  30. インターステータスの場合:
  31. 試す:
  32. # 交差点エリア
  33. インターエリア = 実際の四辺形ポリゴン.インターセクション(予測四辺形ポリゴン).エリア
  34. # 和面積の計算方法1
  35. #union_area = poly1.area + poly2.area - inter_area
  36. # 和面積の計算方法2
  37. ユニオン領域 = MultiPoint(union_poly).凸包領域
  38. # 結合面積が 0 の場合、iou = 0
  39. union_area == 0 の場合:
  40. 借用書 = 0
  41. それ以外
  42. # 最初の計算は、2つの四角形を含む最小の多角形の交差部分/面積です
  43. iou = float (inter_area) / union_area
  44. # 2番目の方法: 交差/結合 (一般的な長方形のIOU計算方法)
  45. # iou = float (inter_area) /(poly1.area+poly2.area-inter_area)
  46. shapely.errors.TopologicalErrorを除く:
  47. print( 'shapely.errors.TopologicalError が発生しました。0 に設定されました' )
  48. 借用書 = 0
  49. それ以外
  50. 借用書 = 0
  51. 戻る
  52. __name__ == '__main__'の場合:
  53. 実際の四辺形 = [908, 215, 934, 312, 752, 355, 728, 252]
  54. 予測四辺形 = [923, 308, 758, 342, 741, 262, 907, 228]
  55. iou = calculate_iou(実際の四辺形、予測四辺形)
  56. 印刷(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 ブラウザを使用して再度ダウンロードしてみてください。

<<:  機械学習と古典的なアルゴリズムの概念をわかりやすい言葉で説明しました。初心者必読

>>:  指紋、顔、虹彩: 適切な生体認証技術を選択するには?

ブログ    
ブログ    

推薦する

...

2015年に中国の電子商取引消費者に最も優しい製品が発表されました:ビッグデータアルゴリズム+専門家のコメント=優れた中国のデザイン

消費者の実際の購買行動や実際のユーザーレビューのビッグデータ分析に基づいた中国初の「2015年中国電...

AsiaInfoが中国聯通のネットワークAIフォーラムに参加し、自動運転ネットワークの革新研究拠点の設立を開始

9月24日、中国聯通の「ネットワークAIフォーラム」が北京で開催された。フォーラムは5GとAI技術の...

FlashAttention v2 は標準の Attention より 5 ~ 9 倍高速です。大規模なモデルで使用されます。

最近、GPT-4(コンテキスト長32k)、MosaicMLのMPT(コンテキスト長65k)、Anth...

Nvidiaの次世代GPUが発表、H100を超える!最初の3nmマルチチップモジュール設計は2024年にデビュー予定

3nmプロセス、H100をはるかに超える性能!つい最近、海外メディアのDigiTimesが、コードネ...

あなたの周りの偽のAI

他のインターネットの概念と同様に、AI は人気が出ると数え切れないほどの支持者を獲得しました。彼らは...

人間と機械の統合はなぜ難しいのでしょうか?

時間と空間を結びつけるのは速度であり、エネルギーと質量を結びつけるのも速度です。事実と価値を結びつけ...

TENSORFLOW を使用してリカレント ニューラル ネットワーク言語モデルをトレーニングする

[[201448]]私は、TensorFlow リカレント ニューラル ネットワークのチュートリアル...

人工知能を活用して室内装飾デザインを最適化する方法

インテリアデザインや装飾に AI を応用することで、エンジニアやインテリアデザイナーは、機械学習によ...

...

人工知能が普及したら、誰が職を失うのでしょうか?この3つのタイプの人々が最前線にいるかもしれない

科学技術は主要な生産力です。人類社会が発展し続けることができるのは、何世代にもわたる科学者が新しい技...

Google は人工知能の分野で「堀」を持っていないのでしょうか?

少し前、匿名の人物が、Google 社内の研究者による研究メモを Discord プラットフォームに...

2022年にロボット工学の急成長を支える5つの要因

ロボット工学は、ロボットの構想、設計、製造、操作を扱う工学の分野です。ロボット産業はここ数年で驚異的...

倪光南:AI開発は教訓を学ぶべき、コア技術は購入したり置き換えたりすることはできない

「ここ数年、情報技術分野で私たちが学んだ最大の教訓の一つは、主要な中核技術は私たち自身の独立したイノ...

...