Anchor Boxes
アンカーボックスとは、固定サイズとアスペクト比を持つ事前設定済みのボックスで、検出器が位置やサイズを調整して物体に合わせます。サイズの決め方、マッチング、利用方法を解説します。
アンカーボックスは、サイズとアスペクト比が固定された事前定義の矩形で、検出器の特徴マップ上の各位置に配置され、物体の位置や形状を推定するための初期値として機能します。アンカーベース検出器は各アンカーについて全クラスのスコアを算出し、物体に合うようアンカーを移動・拡大縮小する小さなオフセットを予測します。この方法は、何もない状態からボックスを予測するよりも学習しやすくなります。Faster R-CNNは各位置に9個のアンカーを配置します。3つの面積(128²、256²、512²ピクセル)と3つのアスペクト比(1:1、1:2、2:1)の組み合わせで、1000 × 600の画像では約20,000個になります。
アンカーの定義方法#
アンカーセットは、特徴マップの各セルに繰り返し配置するサイズとアスペクト比のリストです。そのため、アンカー数はセル数 × セルあたりの形状数になります。特徴ピラミッドネットワーク (FPN)を備えた検出器では、解像度の高い細かなレベルに小さなアンカーを、粗いレベルに大きなアンカーを割り当てます。RetinaNetは5つの各レベルで位置あたり9個、画像あたり約100,000個のアンカーを使用します。SSDではアンカーをデフォルトボックスと呼び、SSD300は8,732個を配置します。
人手で選んだ形状では一部のデータセットにうまく適合しないため、YOLOv2は学習ボックスの幅と高さに対してk-meansクラスタリングを実行し、距離として1 − IoUを使用して、5つのクラスタ中心をアンカーに採用しました。YOLOv3は9個のアンカーをクラスタリングし、3つの出力ストライドに均等に割り当てました。ストライド8のレベルでは10 × 13ピクセル、ストライド32のレベルでは373 × 326ピクセルです。
アンカーと物体のマッチング#
学習中、各アンカーをすべてのラベル付きボックスとIntersection over Union (IoU)で比較します。物体と十分に重なるアンカーは正例となり、その物体のクラスとバウンディングボックスまでのオフセットを学習します。重なりが小さいアンカーは「背景」を学習する負例となり、その中間のアンカーは無視されます。Faster R-CNNの領域提案ネットワークでは、IoUが0.7以上を正例、0.3未満を負例とします。また、各物体に最もよく一致するアンカーも正例にするため、どの物体にも対応するアンカーがない状態を防げます。
import torch
from torchvision.ops import box_iou
# Nine anchors centered on one feature-map cell at (200, 200): 3 sizes x 3 aspect ratios (height / width)
shapes = [(size, ratio) for size in (64, 128, 256) for ratio in (0.5, 1.0, 2.0)]
anchors = []
for size, ratio in shapes:
w, h = size / ratio**0.5, size * ratio**0.5
anchors.append([200 - w / 2, 200 - h / 2, 200 + w / 2, 200 + h / 2])
# A labeled pedestrian box (x1, y1, x2, y2): tall and narrow
person = torch.tensor([[160.0, 110.0, 240.0, 290.0]])
# Faster R-CNN RPN rule: IoU >= 0.7 is positive, below 0.3 is negative, anything between is ignored
iou = box_iou(torch.tensor(anchors), person).squeeze(1)
for (size, ratio), value in zip(shapes, iou.tolist()):
label = "positive" if value >= 0.7 else "negative" if value < 0.3 else "ignored"
print(f"size {size}, ratio {ratio}: IoU {value:.2f} -> {label}")縦長の128ピクセルアンカー(比率2.0)だけが歩行者と十分に重なり、IoU 0.88で正例になります。IoUが0.31と0.50の他の128ピクセルアンカー2つは無視され、サイズが合わない6つのアンカーは負例になります。その後、正例アンカーは標準的なパラメーター化によるオフセットを学習します。中心はアンカーの幅と高さに対する割合で移動し、幅と高さは予測値の指数関数によってスケーリングされます。
データセットに適したアンカーサイズの選択#
データセット内の物体形状に合うアンカーを使うと、より多くの物体に正例アンカーが割り当てられ、検出器が達成できる再現率が向上します。UltralyticsのYOLOv5は、9個のYOLOv3アンカーを初期値としてAutoAnchorで学習前に確認します。学習ラベルに対するアンカーの最大再現率を測定し、それが0.98を超えない場合は、k-meansと1,000世代の遺伝的進化を使って再適合させ、再現率が向上した場合にのみ新しいアンカーを採用します。
アンカーの制約とアンカーフリー検出器#
アンカーには3つのコストがあります。画像内の数万個に及ぶアンカーのほぼすべてが背景を覆うため、容易な負例によって損失が圧倒されます。RetinaNetはその重みを下げるために焦点損失を導入しました。隣接する複数のアンカーが同じ物体に適合するため、物体ごとに1つのボックスを残すには非最大抑制 (NMS)が必要です。さらに、サイズ、アスペクト比、IoUのしきい値は、データセットや画像サイズごとに調整が必要なハイパーパラメーターです。
アンカーフリー検出器は、点またはキーポイントからボックスを予測することで、これらのハイパーパラメーターをなくします。2021年のYOLOX以降に公開されたリアルタイム検出器の大半はアンカーフリーです。Faster R-CNN、Mask R-CNN、RetinaNetなどのアンカーベース検出器では、引き続きアンカーが使われています。RetinaNetとアンカーフリーのFCOSを比較したATSSは、両者が同じ方法で正例を選ぶと、位置あたり9個のアンカーを使ったRetinaNetの精度は1個の場合と変わらないことを示しました。










