画像認識のモデルは、最初は「この画像は猫です」「これは犬です」と、画像全体を見て答えることが中心でした。
でも現実の写真は、もっとにぎやかです。
・犬はどこにいるのか
・人は何人いるのか
・道路はどの部分か
・この人は手を上げているのか
そんなふうに、ただ名前を当てるだけでは足りない場面がたくさんあります。
そこで画像認識は、少しずつ次のように進化していきました。
四角で囲う → 領域を塗り分ける → 一人ひとりを分ける → 骨組みで動きを見る
まずは、この節の見取り図をざっくり置いておきます。
この節の見取り図
四角で囲って見つけるモデル
→ Fast R-CNN / Faster R-CNN / SSD / YOLO
検出を助ける工夫
→ FPN
領域を塗り分けるモデル
→ FCN / SegNet / U-Net / PSPNet / DeepLab
個体ごとに分けて塗るモデル
→ Mask R-CNN
骨組みで姿勢を見るモデル
→ OpenPose
この見取り図を頭の片すみに置いておくと、モデル名が整理しやすくなります。
Fast R-CNN / Faster R-CNN / SSD / YOLO おまけのFPN
― まずは「四角で囲う」物体検出の流れ
最初に発展したのが、物体検出です。
物体検出では、画像の中にある対象を見つけて、その位置をバウンディングボックス(四角い枠)で示します。
たとえば公園の写真なら、
・ここに犬
・ここに人
・ここにボール
と、四角で囲って教えてくれる感じです。
Fast R-CNNとFaster R-CNN
ここで出てくるのが、Fast R-CNNとFaster R-CNNです。
この流れはひとことで言うと、「丁寧に探したい。でも、もっと効率よくしたい」という進化です。
Fast R-CNNは、物体検出の処理をより効率よくしたモデルです。
まず画像全体の特徴をまとめて計算してから、候補ごとに見るようにして、無駄を減らしました。
Faster R-CNNは、さらにその先へ進みます。
「どこに物体がありそうか」という候補づくりまで、ネットワークの中でうまく行えるようにしたモデルです。
Fast R-CNN→ 検出を効率化した
Faster R-CNN→ 候補づくりも賢くした
SSDとYOLO
研究者たちは、さらなる思いに駆られます。
もっと一気に、もっと速く見られないだろうか。
そこで出てきたのが、SSDとYOLOです。
この二つは、R-CNN系より、スピード感のある検出を目指した流れにいます。
SSDは、画像のいろいろな場所を同時に見ながら、物体を検出しようとするモデルです。
YOLOは、名前の通り「You Only Look Once」=「一度に見て、一気に判断する」という発想が強いモデルです。
Faster R-CNN→ 丁寧で高精度寄り
SSD / YOLO→ より速く、一気に見る寄り
FPN
脇役だけど大事なのが、FPNです。
FPNは、検出モデルそのものというより、小さな物体も見つけやすくするための工夫です。
写真の中には、
・大きく写る車
・小さく写る信号機
・遠くに見える人
のように、大きさの違う対象が混ざっていますよね。
FPNは、異なる深さの特徴をうまく組み合わせることで、大きいものも小さいものも見つけやすくする役割を持っています。
だからFPNは、検出を助ける補助役として覚えるとわかりやすいです。
FCN / SegNet / U-Net / PSPNet / DeepLab
― 次は「塗り分ける」セグメンテーションとは何か
ここで出てくるのが、セグメンテーションです。
でも、この言葉が少しわかりにくいんですよね。だから先に、意味そのものを整理しておきます。
物体検出では、「ここに犬」「ここに人」と、バウンディングボックスで対象を囲いました。
でも四角い枠だけでは、
・犬の体
・まわりの芝生
・背景の一部
まで、いっしょに入ってしまうことがあります。
つまり物体検出では、「だいたいこのあたりに犬がいる」ことはわかっても、「犬の体はどこからどこまでか」までは細かくわかりません。
そこで必要になるのが、セグメンテーションです。
セグメンテーションとは、画像を意味のある部分ごとに細かく切り分けることです。
たとえば公園の写真なら、
・空の部分は空
・木の部分は木
・芝生の部分は芝生
・人の部分は人
というように、画像の中を意味ごとに塗り分けていくイメージです。
ぬりえに少し似ています。「ここは空」「ここは木」「ここは人」と、部分ごとに色を変えていく感じです。
だからセグメンテーションは、画像のどの部分が何なのかを、輪郭に沿って細かく見る仕事だと考えるとわかりやすいです。
セグメンテーションの中でも、まず基本になるのが、どの部分が何の種類かを塗り分けるという仕事です。
これが、セマンティックセグメンテーションです。
FCN(Fully Convolutional Network)
ここで出発点として大事なのが、FCNです。
FCNは、「画像全体を分類する」だけではなく、画像の各部分を塗り分ける方向へ進んだ代表的なモデルです。
だからFCNは、セグメンテーションの出発点と覚えるとよいです。
SegNetとU-Net
そのあと、塗り分けをもっと上手にしたい、もっと元の画像サイズできれいに戻したい、という流れの中で出てきたのがSegNetとU-Netです。
この二つは、どちらもいったん縮めて特徴を学び、あとで戻して塗り分けるという発想を持っています。
SegNetは、その流れを比較的わかりやすく形にしたモデルです。
U-Netは、前半で失われやすい細かな位置情報を、後半へスキップ結合で渡すことで、より精密に塗り分けやすくしたモデルです。
U-Netは特に、医療画像のように細かさが大事な場面で有名ですね。
SegNet→ 縮めて戻して塗る
U-Net→ 細かい位置情報も後ろへ渡して精密に塗る
PSPNetとDeepLab
でも、塗り分けるだけではまだ足りません。
画像の一部分だけ見ても、それが道路なのか壁なのか、小さく切り出しただけではわかりにくいことがあります。
だから今度は、もっと広い文脈も見たいという流れが生まれます。
そこで出てきたのがPSPNetとDeepLabです。
PSPNetは、いろいろな広さの情報を集めて、画像全体の文脈を取り込もうとしたモデルです。
DeepLabは、以前見たDilated Convolutionも活かしながら、広く見たい、でも細かさも失いたくないという方向を進めたモデルです。
PSPNet→ 広い景色を見たい
DeepLab→ 広く見ながら細かさも守りたい
Mask R-CNN
― さらに「一人ひとりを分けて塗る」
ここで新しい疑問が出てきます。
セマンティックセグメンテーションでは、人が3人写っていても、みんなまとめて「人」という領域になることがありました。
でも現実には、同じ「人」でも、一人ひとりを分けたいことがあります。
ここで出てくるのが、Mask R-CNNです。
Mask R-CNN
Mask R-CNNは、Faster R-CNNの流れを受けつつ、各物体ごとに「マスク(領域)」まで予測できるようにしたモデルです。
つまり、
・ここに人がいる
・この人の範囲はここまで
・あの人の範囲はここまで
と、個体ごとに分けられる。
だからMask R-CNNは、検出+個体ごとのセグメンテーションの代表例だと考えると、わかりやすいです。
OpenPose
― 最後は「骨組みで動きを見る」
ここまでのモデルは、主に「何があるか」「どこまでがそのものか」を見てきました。
でも、人を見たときに大事なのはそれだけじゃありません。
・手を上げている
・座っている
・走っている
・踊っている
のように、どういう姿勢かも知りたいことがあります。
そこで出てくるのが、OpenPoseです。
OpenPose
OpenPoseは、人の体を
・頭
・肩
・肘
・手首
・ひざ
・足首
のような関節点として捉え、それらをつなげることで姿勢を推定します。
つまりOpenPoseは、人を「物体」としてではなく、「動く身体」として読むための代表的なモデルです。
だからこの節の最後は、「四角で囲う」でも「塗る」でもなく、骨組みで見るという新しい見方が出てきた、と理解すると流れがきれいです。
まとめ
Fast R-CNN / Faster R-CNN→ 丁寧に物体を見つける流れ
SSD / YOLO→ もっと速く、一気に見つける流れ
FPN→ 小さい物体も見つけやすくする工夫
FCN→ セグメンテーションの出発点
SegNet / U-Net→ 縮めて戻して、細かく塗り分ける流れ
PSPNet / DeepLab→ 広い文脈も見ながら、もっと上手に塗り分ける流れ
Mask R-CNN→ 一人ひとり、一つひとつを分けて塗る
OpenPose→ 骨組みで姿勢を読む
つまりこの歴史は、四角で囲う → 塗り分ける → 個体を分ける → 動きを読む……というふうに、画像をどんどん細かく理解していく歴史なのです。
next ▶ 画像認識の活用例