Lossに加算されます。以上)に引き離すことができるわけです。e_kとe_jOffset3つ目のOffsetは、BBox位置の小さなズレの修正に用いられる値ですCornerNetにおいて、HeatmapやEmbeddingなどの出力は、入力画像よりも低解像度になっています。これは計算量の都合です。BBox検出の際は、Heatmap上で閾値以上に値の大きな点を頂点として選びますが、このときHeatmapの解像度が入力画像よりも小さいため、得られた座標を定数倍して入力画像サイズに戻す必要があります。ここでズレが生じます。正解BBoxの一つの頂点のx座標が102だったとしましょう。Heatmapが入力画像の1/4に縮小されていたとすると、Heatmap上の座標値は元の画像上では4の倍数にしかなりませんから、102という正確な値は出すことができません。ここで登場するのがOffsetです。CornerNetでは、(予測頂点のHeatmap上の座標+Offset)を定数倍して最終的な推定結果とします。OffsetはHeatmapの各値に対してx軸方向とy軸方向の2チャネルを出力します。Embedding同様こちらもクラス数には依存しません。Offsetによって座標を微修正する正解Offsetとしては、図15に示すように、正解BBoxの各座標を出力サイズに縮小したときの小数点以下の値を使用します。図15では0.5と0.75がそれぞれx軸、y軸のOffsetとなります。論文で報告されているCornerNetの精度です。論文では、MSCOCOデータセットを用いて実験を行っています。detectorに匹敵していると主張しています。以下に論文に掲載されている物体検出結果の一部を示します。小さいボールやスプーン、また密集したキリンや人など精度よく検出できていることがわかります。再現実装ここまでCornerNetの手法の解説を行ってきましたが、最後に、弊社で再現実装を行い、独自のデータセットで評価した結果を紹介します。データセットは弊社で収集した、車載カメラによる走行画像です。データセットは1シーケンス60枚程度の連続した画像からなり、全体で598シーケンスあります。このうち512シーケンスを学習用、残りの86シーケンスを評価用に利用しました。全17クラスのアノテーションがされていますが、データ数の少ない(500未満)6クラスを除外し、11クラスで訓練を行いました。画像サイズは1920×1200で、これを512×512にリサイズして使用しています。次に学習条件の詳細について述べます。訓練時にはAugmentationを行いました。利用したAugmentation手法は、色・明るさの変更、左右反転、ランダムクロップです。beta2=0.999)を用いました。論文では、HeatmapとOffsetのLossは1倍、Embeddingは0.4倍して足し合わせていると書かれていますが、さまざまに条件を変えて実験した結果、以下のようにLossを変更しています。Heatmapについて、独自データセットは頂点の密度がMSCOCOより小さいことを考慮し、頂点のない部分のLoss(式2、下式)を1/50倍しています。軽視される傾向があったため、係数を0.4倍ではなく1倍に変更しました。最後に評価時の条件についてです。Heatmapから値が0.4以上の点の座標をとってくることで頂点の候補を列挙します。次に、それぞれの頂点候補に対して、最もEmbedding間距離の小さいものをペアとし、BBoxを生成します。Suppression)を施して取り除きます。これは、2つのBBoxのIoUを計算し、これが閾値以上だった場合に、予測確率(そこに物体があるという確信度。今回は2頂点のHeatmapの平均値を用いた)の大きいもののみを残すという手法です。NMSの閾値は0.4に設定しました。評価にあたっては、予測BBoxと正解BBoxを比較して、クラスが一致していてかつIoUが0.5以上であった場合に正解とし、mAPを評価指標としました。epoch行い、およそ3日間かかりました。結果は、11クラスに対しmAP=0.202というものでした。論文の値よりもかなり低くなってしまいましたが、11クラス中には訓練データが少ないものもあり、それらがmAPを大きく減少させていました。高精度で検出できているクラスの例としては、車がAP=0.482、停止標識がAP=0.557などと健闘していました。以下は検出結果の例です。うまくいったものから紹介します。検出例(うまくいったもの)画像中の青い印は左上の頂点として検出された領域、赤いものは右下の頂点として検出された領域を示しています。車や信号、歩行者がおおよそ検出できていることがわかります。上の画像では歩行者はかなり小さく映っており、外観も様々ですが、きちんと検出できています。一方で検出に失敗した例を図21に示します。BBoxが大きく広がってしまっている様子がうかがえます。これは、片方の頂点がうまく検出できなかったり、誤った頂点をペアにしてしまったりした結果です。Embeddingの学習がうまくいっていないことを示しています。検出例(うまくいかなかったもの)Embeddingについては、論文通り1次元の値を使ったのが問題ではないかと考え、128次元に拡張して実験を行ってみましたが、かえって精度が下がってしまいました。まとめ本記事では、CornerNetの手法の解説と、弊社で再現実験を行った結果の紹介を行いました。再現実験では十分な結果は得られませんでしたが、これがデータセットの特性によるものなのか、実装に不備があるのかは検証できていません。再現実装に関してはChainerを用いたのですが、cupy.ElementwiseKernelを使ってGPUでの処理を書くのが非常に難しかったです。十分な精度は出せませんでしたが、なぜこの方法で物体検出ができるのかという論理の読み取り、読みやすいプログラムの書き方などが学べ、大変勉強になりました。ALBERTでは、データサイエンティストを募集しています。採用​ページをご覧ください。先進技術部でアルバイトをしています。