くずし字コンペ:CenterNetについて考察してみました
この記事はKaggle アドベントカレンダー 2019の7日目の記事です。
幅野です。
くずし字コンペの上位解法として利用されていた物体検出モデルの一つであるCenterNetについて紹介・考察をしていきます。
今回紹介するCenterNetは「Object As Points」で提案されているモデルです。
「CenterNet: Keypoint Triplets for Object Detection」で提案されているCenterNetは下記で弊社の技術ブログとして紹介しているので良かった見てみてください。
最後にCenterNetのStackingのアイデアについて紹介できればと思います。
背景:くずし字コンペ
くずし字コンペは文書画像からくずし字の種類と位置を推定するコンペです。
https://www.kaggle.com/c/kuzushiji-recognition
物体検出タスクの中ではPASCAL VOC Datasetと比較すると物体のカテゴリ数と1つの画像の中で推定したい物体の数が多いタスクでした。
画像枚数が少なく画像コンペにしてはリソース的に参加の敷居が低そうなコンペの印象がありましたが、このコンペはメダル付与が与えられないことからコンペの参加をしなかった人も多かったかもしれません。
自分もこのコンペを積極的に参加はできなかったのですが、カーネルや上位解法を見るだけでもかなり勉強になりました。
そして今後の上位解法として可能性のあるCenterNetが多く使われていたコンペでもあるので今回はCenterNetについて、その応用方法とアイデアを紹介できればと思います。
またモデルや学習方法についての数式による厳密な解説などは今回の記事では説明しないのでご了承ください。
物体検出タスクで利用されてきたモデル
物体検出は画像から物体の種類と位置を推定するタスクです。
くずし字コンペ以前にも多くの物体検出タスクのコンペが開催されています。
最近だとOpen Images 2019 - Object Detectionなどですね。
この物体検出タスクには2-stage, 1-stageのモデルに分類されて研究されています。
詳細なアーキテクチャの説明は省略しますが、いくつか紹介したいと思います。
2-stageモデル:R-CNN
2-stageモデルは物体のカテゴリを推定するモデルと物体の位置を推定するモデルを2つ利用して物体検出を行います。
モデルはFaster R-CNN, Mask R-CNNなどです。
Mask R-CNNは物体検出以外にも物体の領域をピクセルレベルで推定するInstance Segmentationにも利用されています。
2-stageモデルは1-stageモデルと比較すると精度が高く、Kaggleの物体検出コンペでも上位解法で利用されています。
今回のくずし字コンペの1位解法ではCascade R-CNNが利用されていました。
ただ、2-stageモデルは2つのモデルを利用して物体検出を行うため、推論速度が1-stageモデルと比較すると遅い傾向にあります。
実際のシステムにおいて推論速度、モデルサイズの制約がある場合には2-stageモデルを利用できないケースがあるかもしれません。
そのときに利用されることが多いのが1-stageモデルです。
1-stageモデル:SSD YOLO
1-stageモデルは1つのモデルで物体の種類と位置を推定します。
Single Shot Detector(SSD), You Look Only Once(YOLO)などのモデルが提案されています。
1つのモデルで推定するということから推論速度が2-stageモデルと比較すると速いのが特徴です。
ただ、先程いったように物体検出の精度(IOUなど)を競うKaggleでは1-stageモデル単体で上位解法に上がってくることはあまりありませんでした。
しかし、2019年4月に出た論文「Object As Points」でYOLOv3などよりも推論速度が速く、精度もよいCenterNetが提案されました。
このCenterNetは2-stageモデルがあるなか、くずし字コンペの5位解法で利用されています。
CenterNet(Object As Points)
今までのSSD, YOLOなどの1-stageモデルではモデルで複数の領域候補を推定したあとNon-Maximum-Supression(NMS)を利用して複数の領域候補を1つにまとめて最終的にBoudingBoxを出力していました。
しかし、このNMSは微分計算ができないことからEnd-to-Endで学習することができませんでした。
そこでBoundingBoxの中心をキーポイントとしてヒートマップを出力することでNMSをしなくてもBoundingBoxを出力できるようにしたのがCenterNetです。
また、このキーポイント系の検出モデルはCenterNet以前からCornerNetなどが提案されていました。
CornerNetに関しては以前弊社の技術ブログでまとめました。
ただ、CornerNetは物体の左上と右上のキーポイント2つを出力するので、キーポイントをグルーピングする必要がありました。
Object As Pointsで提案されているCenterNetはキーポイントは物体の中心のみにし、それに付随してカテゴリやBounding Boxを推定するアーキテクチャとなっているので非常にシンプルです。
また、カテゴリだけでなくdepthを出力することで3次元の物体検出に拡張したり、中心点からの関節点を出力するモデルにすることによって、姿勢推定へ適応できたりします。
このように物体検出を様々な用途に拡張してモデルを構築できるのもCenterNetの特徴の一つです。
くずし字コンペにおけるCenterNetの利用方法
くずし字コンペでは7位・5位の方が解法としてCenterNetが利用しています。
7位の方はCenterNetに関するカーネルを投稿しています。非常に参考にさせていただきました。
https://www.kaggle.com/kmat2019/centernet-keypoint-detector
7位の方の解法は2-stageのなかの文字を検出するモデルとしてCenterNetを利用しており、5位の方はCenterNetのみを利用して文字の位置の推定・文字の種類の推定も行っています。
より詳細な解法についてはそれぞれのSolutionとして掲載されています。
https://www.kaggle.com/c/kuzushiji-recognition/discussion/112899
https://www.kaggle.com/c/kuzushiji-recognition/discussion/112771
アイデア:CenterNetのRefine
コンペ終了後に上位解法などを通して色々勉強させていただいたということもあり、CernterNetを利用してLate Submissionしようと思っていました。
このアドベントカレンダーに向けて学習を回していたのですが、現在学習中で評価を出せていないということもあり、ひとまずアイデアを紹介させていただければと思います。。。
当然今回紹介するアイデアが必ず良い結果が出るとは限りませんが、今後良い結果を投稿できればと思っています。
1stageモデルとして利点のあるCenterNetですが、Stackingのような方法を利用してヒートマップをより精度の高いものへRefineできないか考えてみました。
以下のようにStackingすることを考えます。
通常のstackingとほぼ同じように思えますが、この発想はOpenPoseなどの姿勢推定モデルのベースとなったPose Estimation Machineから着想を得ました。
Convolutional Pose Machineでは画像から各関節のヒートマップを出力するのですが、互いの関節の位置は他の関節の位置を推定するのに寄与するという仮説を建てて、ヒートマップをRefineしていくようなモデルアーキテクチャとなっています。
くずし字でも文章として文字が整列していることもあり、他の文字との位置関係はうまく利用できると思いました。実際に5位の解法ではConvolution Pose Machineと似ているFPNアーキテクチャを利用しています。
ただ、出力チャンネル数はConvolution Pose Machineのように統一してはおらず、各Stageの出力に対して損失関数をかけているわけでもなさそうです。
なので、こちらをStackingのようにCenterNetを積み重ねることによってより精度の高いヒートマップを出力できるのではないかと考えています。
感想
CenterNetは1-stage&色々なタスクに応用しやすいということで、今後様々な部分で応用、改良されていくと思っています。
今後、画像系のコンペが出たらぜひCenterNetを一つのモデルとして利用できたらと思っています。