物体検出(Object Detection)のタスクにおいて、物体の位置を特定するために欠かせないのが「バウンディングボックス(Bounding Box)」です。
本記事では、ディープラーニングにおけるバウンディングボックスの基本的な概念と、よく使われる2つの座標表現、およびその変換方法について解説します。
バウンディングボックスとは?
画像分類タスクが「画像に何が写っているか」を判定するのに対し、物体検出は「何が、どこに写っているか」を判定します。この「どこに」を表すために使用される長方形の枠がバウンディングボックスです。
自動運転での車両や歩行者の検出、セキュリティカメラでの異常検知など、コンピュータビジョンの多くの応用分野で基礎となる重要な概念です。
2つの一般的な座標表現
バウンディングボックスをデータとして表現する際、主に以下の2つの方法が用いられます。
-
2隅表現(Corner representation)
- 左上隅の座標 $(x_1, y_1)$ と右下隅の座標 $(x_2, y_2)$ で表現する方式。
-
中心・サイズ表現(Center-size representation)
- ボックスの中心座標 $(cx, cy)$ と、幅 $w$、高さ $h$ で表現する方式。
アルゴリズムやデータセット(例えばYOLOやCOCOなど)によって採用されている表現が異なるため、これら2つの表現を相互に変換する処理が頻繁に発生します。
座標表現の変換処理(Python実装)
実際にPyTorchやTensorFlowを使って、この2つの表現を変換する関数を実装してみます。
(以下はPyTorchでの例です)
def box_corner_to_center(boxes):
"""(左上, 右下) から (中心, 幅, 高さ) に変換"""
x1, y1, x2, y2 = boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:, 3]
cx = (x1 + x2) / 2
cy = (y1 + y2) / 2
w = x2 - x1
h = y2 - y1
return torch.stack((cx, cy, w, h), axis=-1)
より詳しい実装や、画像上への描画方法、TensorFlow/MXNetでのコードについては、以下のドキュメントが非常に分かりやすくまとまっています。
👉 Dive into Deep Learning: 物体検出とバウンディングボックス
D2L(Dive into Deep Learning)は、理論からPyTorch/TensorFlowによる実装までが1つのページで完結しているため、コンピュータビジョンを基礎から学び直したい方に非常におすすめです。
まとめ
物体検出モデルを構築する第一歩は、このバウンディングボックスの扱いをマスターすることです。座標系の変換はバグの温床になりやすいため、基礎をしっかり押さえておきましょう。