Sansan Builders Blog

Sansanのものづくりを支えるメンバーの技術やデザイン、プロダクトマネジメントの情報を発信

【ML Tech RPT.】第26回 Crowd Counting (群衆の数え上げ) を学ぶ

f:id:sansan_yoshimura:20210222095528p:plain DSOC研究員の吉村です。最近は、現代短歌について少し興味を持ち始めて、歌集を読んだりしています。様々な解釈ができるので、思考を色々と巡らすのがとても楽しいです。まだまだ基礎も分かっていないところもあるので、その辺りも知りつつ更にいろいろな角度で鑑賞できるようになりたいと思っています。

さて、今回は Crowd Counting についての話題を取り上げます。Crowd Counting は、画像上に含まれる対象物 (主に人) を機械で数え上げる問題設定です。ここで言う Crowd は群衆の意味であり、Cloud (雲) とは異なることに注意が必要です。

本記事では、まず基本的な Crowd Counting の問題設定や応用先について確認した後に、今までに提案されている手法をいくつか紹介します。

はじめに

まずは Crowd Counting の問題設定について見ていきましょう。Crowd Counting の問題設定はアプローチごとに少しずつ異なる部分があるので、ここでは全体に共通する部分を述べることにします。

Crowd Counting では、入力に画像を与えて、そこに写っている対象物 (主に人間) の数を出力するモデルを学習するのが目標となります。学習データには少なくとも画像に含まれる対象物の数が目的変数として与えられます。加えて、対象物のバウンディングボックスか、対象物の一を点で表したアノテーションが与えられる場合もあります。これらの情報からモデルを学習します。

応用

基本的には社会イベントやスポーツイベント、政治集会などの参加者を Crowd Counting のモデルで数えることが可能になります。そこから更に発展した応用の中には、車両数の推定や、細胞数の推定、動物数の推定などもあります。

難しさ

Crowd Counting は一見対象物を数えるだけというシンプルな問題なので簡単に見えます。しかし、実際にはそれほど簡単な問題ではありません。その理由は二つあります。

まず一つ目の理由は、非常に密集している Crowd (群衆) を対象とする場合には、当然対象物同士が重なる場合に対処する必要があることです。つまり、相互に occulusion (画像中の手前の物体が奥の物体を隠す状況) が発生するので、それを考慮した上でモデルを学習する必要があるということになります。従来は、バウンディングボックスを与えて、それを元にモデルを学習していましたが、この方法では occulusion の問題に対処しにくいため、現在では点によるアノテーションのデータを用いることが多いようです。

二つ目の理由が、遠近効果 (perspective effects) によって対象物の大きさや形が変わる点に対応する必要があることです。同じ対象物を扱う場合でも、手前に写っている物体は大きく見え、奥に写っている物体は小さく見えることをうまくモデルに落とし込む必要があるわけです。

手法

Crowd Counting には様々なアプローチがあることに軽く触れました。よく知られるアプローチは大きく次の三つに分類されるようです。

  1. detection-then-count
  2. direct count regression
  3. density map estimation

ここではそれぞれのアプローチを詳細に見ていきましょう。

detection-then-count

これは読んで字のごとく、まず detection (検知) して、そのあとそれを数えるアプローチです。このアプローチの時には、バウンディングボックスによるアノテーションが必須となります。ただ、その性質上、アノテーションが非常に大変であるという課題がつきまといます。実際、大規模イベントの際の人数は 1,000 人を超えることも珍しくなく、それらの非常に小さい対象物をバウンディングボックスで漏れなくアノテーションするのは非常に高コストです。このアプローチで学習したモデルは、基本的にまず物体検知を行うため計算量が大きく、occulusion の問題に弱いです。そのため、対象物が比較的少ない場合にはうまくいく手法と言えます。

direct count regression

こちらも読んで字のごとく、直接対象物の数を回帰 (regression) するアプローチになります。このアプローチにおいては、点によるアノテーションを用いたり、場合によっては明示的にそうしたアノテーションを利用しなかったりするので、アノテーションコストは detection-then-count の場合よりは抑えられるという特徴があります。

direct count regression に分類される手法の一つとして、CNN ベースの手法を紹介します。

CNN ベースの手法

CNN ベースの手法 [*1] は、5 層の畳み込み層と 2 層の全結合層からなるネットワークを、二乗誤差で学習させる回帰モデルです。非常にオーソドックスに見えますが、この手法以前の画像特徴を手で作っていた手法を深層学習で置き換えた点が優れています。加えて、モデルの頑健性を上昇させるために、対象物が何も写っていない Negative Sample を学習に用いるという工夫がなされています。入力画像を 227 x 227 のサイズにクロップして学習しています。

density map estimation

こちらが現時点で一番性能が高いとされており主流のアプローチです。様々な文献で上記の二つのアプローチよりも頑健であると考えられています。こちらは、点によるアノテーションデータを利用します。

density map estimation に分類される手法を二つ紹介します。

Bayesian Loss

Bayesian Loss [*2] は、点によるアノテーションから密度に寄与する確率を扱うモデルを学習するための損失関数です。具体的な損失関数を表す式は下記の通りです。

 \mathcal{L}^{Bayes} = \sum_{n=1}^N \mathcal{F}(1 - E [ c_n ] )

この式の関数と変数などについて説明します。関数  \mathcal{F} は距離関数を表しています。元の論文の実験では  \ell_1 距離が用いられています。定数  N は、アノテーションされた点の数を表します。また、 E[ c_n ] は各アノテーション点の数の期待値を表しており、下記の式で書けます。

 E [ c_n ] = \sum_{m=1}^M p(y_n|\textbf{x}_m) \textbf{D}^{est} ( \textbf{x}_m )

ここで、 \textbf{D}^{est} ( \cdot) は推定密度マップ関数です。  \textbf{x}_m は添え字  m に対応するピクセルの座標を表します。また、 p(y_n|\textbf{x}_m) はアノテーション点を元に計算される正規分布による尤度からベイズの定理で求められる事後分布です。

これは密度マップ関数を、アノテーション点から得られる密度マップ関数で直接推定する方法よりも実験的に良い性能が確認されています。また、元の論文では、対象物がない空間でも密度が高くなってしまうことを防ぐために背景を考慮する亜種も提案しています。

DM-Count

DM-Count (Distribution Matching for crowd COUNTing) [*3] は、最適輸送 (Optimal Transport; OT) を損失関数に導入した手法です。DM-Count で最終的に利用する損失関数は、三つの損失関数の組合せから構成されており、具体的には下記の式で表されます。

 \mathcal{L}^{DM-Count} (\textbf{z}, \hat{\textbf{z}}) = \mathcal{L}_{C} (\textbf{z}, \hat{\textbf{z}}) + \lambda_1 \mathcal{L}_{OT} (\textbf{z}, \hat{\textbf{z}}) + \lambda_2 ||\textbf{z}||_1 \mathcal{L}_{TV} (\textbf{z}, \hat{\textbf{z}})

ただし、 \textbf{z} はベクトルで書き直した密度マップで要素は二値で点によるアノテーションを表します。また、 \hat{\textbf{z}} はニューラルネットによる予測密度マップを表します。

構成要素となるそれぞれの損失関数について、簡単に説明します。

一つ目が Counting Loss (C loss)  \mathcal{L}_{C} です。これは下記の式で表されます。

 \mathcal{L}_{C} ( \textbf{z}, \hat{ \textbf{z} } ) = \left| || \textbf{z} ||_1 - || \hat{ \textbf{z} } ||_1 \right|

これは予測密度マップの値の合計を最終的な対象物の数だと見なすことで、真の対象物の数と一致させるように学習するための損失関数ですので、最低限必要な部分になります。

二つ目が Optimal Transport Loss (OT loss)  \mathcal{L}_{OT}です。元の論文では数式で定義してありますが、全てを正しく説明するのが大変なので、ここではざっくりとした説明にとどめます。詳細を知りたい方は、元の論文にあたってください。これは、Monge-Kantorovich の最適輸送問題の定式化に基づいて、それぞれ正規化された、アノテーション点による密度マップと予測密度マップの二つの分布間の輸送コストが最小になる場合のコストを表します。できる限り近い点同士を結びつけているくらいのイメージを持ってもらえると良いと思います。注意する必要があるのが、この部分の損失を得るための最適化が必要ということです。なお、元の論文では Sinkhorn algorithm というものが用いられています。

三つ目が Total Variation Loss (TV loss)  \mathcal{L}_{TV} です。OT loss を Sinkhorn algorithm で計算しても、近似が不十分になってしまうという問題がわかっています。これを解決するために導入してあるのが、TV Loss で次の式で表されます。

 \mathcal{L}_{TV} ( \textbf{z}, \hat{ \textbf{z} } ) = \frac{1}{2} \left|\left| \frac{\textbf{z}}{|| \textbf{z} ||_1} - \frac{\hat{ \textbf{z} }}{|| \hat{ \textbf{z} } ||_1} \right|\right|

これにより学習が安定することが見込まれます。

おわりに

今回は Crowd Counting について紹介しました。まずはじめに、応用先について話をして、多くの場合には人の群衆を対象にそれを数える問題設定であることを確認しました。そうした、わかりやすい問題設定でありながらも、対象物が被ったり、遠近による影響により形が大きさが同じ対象物でも違ってくる部分が困難につながることを説明しました。こうした課題を踏まえた上で、三つのアプローチがあり、その中でも特に direct count regression のアプローチを取る手法を一つと、現在の主流である density map estimation のアプローチを取る手法を二つ紹介しました。

DM-Count などは実装が公開されていたりもするので、興味がある方は試してみると面白いかもしれません。今回もお付き合いいただき、ありがとうございました。この記事が良かったなと思った方は、読者になるボタンを押してくださいね!


buildersbox.corp-sansan.com

*1:C. Wang, H. Zhang, L. Yang, S. Liu, and X. Cao, “Deep People Counting in Extremely Dense Crowds,“ ACM MM, in 2015.

*2:Z. Ma, X. Wei, X. Hong, and Y. Gong, "Bayesian Loss for Crowd Count Estimation with Point Supervision," ICCV, in 2019.

*3:B. Wang, H. Liu, D. Samaras, and M. Hoai, "Distribution Matching for Crowd Counting," NeuraIPS, in 2020.

© Sansan, Inc.