物体検出の常識を覆す!アンカーフリーでスマートに学ぶFCOS入門

こんにちは。ゆうせいです。

画像の中から特定のモノを見つけ出し、それが何であるかを特定する物体検出という技術をご存知でしょうか。自動運転車が歩行者を見つけたり、スマートフォンのカメラが顔にピントを合わせたりする時に使われている魔法のような技術です。

これまでの物体検出は、あらかじめ決められた大きさの枠を画像の中にたくさん敷き詰めて、その枠が対象物に合っているかを計算する手法が主流でした。しかし、今回ご紹介するFCOS(Fully Convolutional One-Stage Object Detection)は、そんな面倒な枠組みを一切使わない画期的なモデルです。

なぜ枠を使わない方が良いのか、その秘密を一緒に探っていきましょう!

アンカーフリー検出器とは何か

従来の物体検出では、アンカーボックスというガイドラインのような枠を大量に用意していました。例えば、背の高い人を探すための縦長の枠や、車を探すための横長の枠を、画像全体に何万個も配置するイメージです。

これに対してFCOSは、アンカーフリー検出器と呼ばれます。その名の通り、事前の枠組みを一切必要としません。

アンカーボックスの悩みを解消する

アンカーボックスを使う手法には、いくつかの弱点がありました。

  1. 調整が大変対象物の大きさに合わせて枠のサイズを細かく設定しなければならず、まるでサイズの合わない服を無理やり着せるような苦労がありました。
  2. 計算が重い画像全体に敷き詰めるため、ほとんどの枠には何も写っていない空っぽの状態になります。無駄な計算が非常に多くなってしまいます。

FCOSは、画像の各ピクセル(点)に対して、ここが対象物の中心からどれくらい離れているか?を直接予測します。点から境界線までの距離を測るだけなので、非常にシンプルで効率的なのです。

難題を解決するFocal Lossの力

物体検出において、最も大きな壁となるのがクラス不均衡という問題です。

画像の中には、検出したいモノ(背景以外の対象)よりも、何もない背景の方が圧倒的に多く存在します。普通に学習させると、AIは背景ばかりを熱心に学んでしまい、肝心の対象物を見逃すようになってしまいます。

そこで登場するのがFocal Lossです。

賢く重みを調整する数式

Focal Lossは、簡単な問題(背景だとすぐに分かる部分)の学習をわざとサボらせ、難しい問題(判定に迷う部分)に集中させる仕組みです。

これを数式で表現する際、誤差を L とすると、分類の難しさに応じて (1 - p)^{\gamma} という重みを掛け合わせます。

ここで、正解である確率を p とし、調整パラメータを \gamma とすると、全体の損失は以下のように計算されます。

L = - (1 - p)^{\gamma} \log(p)

もしAIが自信満々で p1 に近い場合、 (1 - p)0 に近づくため、そのデータの学習に対する影響力は小さくなります。逆に、正解かどうかわからない難しいデータほど、しっかり学習するように設計されているのです。

精度を高めるcenternessという発明

FCOSのもう一つの大きな特徴が、centernessという指標の導入です。

アンカーフリーの手法では、対象物の中心付近だけでなく、端っこの方の点も「ここは対象物の範囲内だ」と判定してしまいます。しかし、端っこの点は中心から遠いため、正確な位置を予測するのが苦手です。

質の高い予測を選別する

centernessは、その点が対象物の中心にどれくらい近いかを 0 から 1 の数値で表します。中心に近ければ 1 になり、端にいけば 0 に近づきます。

予測結果を出すときに、この値を掛け合わせることで、中心から外れた信頼性の低い予測を自動的に排除できるようになりました。これにより、検出の精度が飛躍的に向上したのです。

FCOSを学ぶメリットとデメリット

ここで、FCOSを使う上での利点と注意点を整理しておきましょう。

メリット

  • 構造がシンプルで、他のタスク(セグメンテーションなど)への応用がしやすいです。
  • アンカーボックスの設計という職人芸のような調整作業から解放されます。
  • 計算コストを抑えつつ、従来のアンカーベースの手法に匹敵する、あるいは凌駕する精度を叩き出します。

デメリット

  • 重なり合った複数の物体を検出する際に、どの点に責任を持たせるかの処理が少し複雑になります。
  • 非常に小さな物体に対しては、依然として検出が難しい場合があります。

これからの学習のステップ

FCOSの仕組みについて、少しイメージが湧いてきたでしょうか?

もしあなたがさらに深く学びたいなら、まずは公式の論文を眺めてみることをおすすめします。数式が並んでいて驚くかもしれませんが、今回の解説を思い出しながら読めば、きっと理解の助けになるはずです。

次のステップとして、実際にプログラムを動かしてみるのも良いでしょう。

ソースコードの一例を載せておきます。

import torch
from fcos_model import FCOS
model = FCOS(num_classes=80)
images = torch.randn(2, 3, 800, 800)
outputs = model(images)

この短いコードの裏側で、今回お話ししたcenternessやFocal Lossがフル稼働して、画像の中のモノを探し出していると考えるとワクワクしませんか。

まずは、Google Colaboratoryなどで公開されているチュートリアルを探して、自分の用意した画像で物体検出を試してみてください。

セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。