🦁

(Small) Object Detectionのためのカメラとエンコーディングの話

2023/12/11に公開

1. はじめに

私たちは、「誰もがスポーツが上手くなれる環境を」をミッションに掲げ、AIなどのテクノロジーの力を用いたソフトウェアの研究開発を行なっています。

プロジェクトの一つとして、画像の中から野球のボールを検出するAIモデルを開発しているのですが、まずは次の2つの画像をご覧ください。

低解像度の画像ですが、私たち人間には野球ボールが写っていることがわかります。主な理由は

  • 野球に関連するというコンテクストが教えられている
  • ちょうど探しやすいサイズに画像が拡大されている

ことなどが考えられるでしょう。しかし

  • 通常サイズの画像で野球に関連する背景がうまく隠されている
  • 反対に、ボール以外の背景がクリッピングされている

場合などは、このテクスチャーを野球のボールと認識・検出するのは難しいはずです。

機械学習AIモデルも同様です。

  • 主に物体周辺のテクスチャーのみから検出を行う従来型の中小規模のモデルの場合、このような難しいサンプルが学習データセットに大量に含まれていない限りは、上の画像からボールを検出することはできません。
  • 反対に、上のような画像で学習すると、今度は概ね白くて丸いものや灰色でノイジーな丸いものをボールとして誤検知する傾向になります。
  • 画像全体のコンテクストを認識できる大規模モデルの場合は、野球と分かりやすい背景であれば「この白くて丸いボヤけたものはおそらくボールなのでは」と判断してくれる場合もあります。しかし検出が成功するかどうかは当然モデルや画像によってケースバイケースです。

また、ボールの有無が調べられれば十分なタスクならまだしも、なるべく正確なバウンディングボックスやセグメントの数や形が必要なタスクにおいてはAIモデルの開発難易度は更に高まります。

前置きが長くなりましたが、この記事では、このような難しいサンプルからも正確に物体を検出する方法ではなく、このような難しいサンプルが生じてしまう理由について、カメラの仕組みと静止画・動画のエンコーディングの仕組みについて解説します

対象読者

  • 小さくて高速な物体を検出するアルゴリズムを開発したい・している方
    • 野球、テニス、バドミントンなど小さな道具を高速に飛ばすスポーツ
    • 野鳥や虫などの小さく、体長に対して素早い生き物
    • 物体自体は大きいが、遠くから撮影する場合(例:ビルの屋上から遠くの道路を走る車を検出)
  • 物体検出において、入力画像の品質で困っている・困ったことのある方
  • カメラやエンコーディングの仕組みに詳しい方には常識的なことしか書いていませんが、AI畑にも皆さんの知識が活かせることを見ていってください。

TL;DR

  • カメラ
    • 高速な動きを捉えるには、シャッタースピードを速くする。
    • シャッタースピードを速くすると画像が暗くなるので、絞りISO感度の調整が必要。
    • 屋内の人工照明下では、シャッタースピードを上げると画像が暗くなり、フレームレートの上昇は照明のちらつきを目立たせる。
    • ISO感度を上げると画像にノイズが発生する。
    • 絞りは画像の明るさとピント範囲(被写界深度)に影響する。
    • ズームにはレンズの光学ズームと画像のデジタルズームがある。
  • エンコーディング
    • 一般的な画像・動画データは、非可逆圧縮でデータ量を減らし、詳細情報を削除する
    • 画像を8x8などの小さなブロックごとに分けて圧縮を行うため、復号画像ではブロックの境目で断裂が生じる
    • RAW画像は、圧縮せず画像データをそのまま保存するが、データサイズが段違いに大きい。
  • 制御
    • シャッタースピード、絞り、ISO感度は通常、Auto Exposure (AE) で自動制御される。
    • カメラ専用機では手動設定が可能。
    • スマホカメラもOSのAPIを通じて制御が可能。
    • しかし、一般的な端末では絞りを変更するハード機構は無い。
    • プリインストールのカメラアプリではシャッタースピードとISO感度も制御できない場合が多い。
    • 光学ズームは主にレンズの交換で実現する。それ以外の連続的ズームは基本的にデジタルズーム。
    • カメラ専用機・スマホカメラともに、一部高級機では連続的な可変倍率のズームレンズもある。

2. カメラの基礎知識

この節では、検出の難しい画像が出力されてしまう原因のうち、主にカメラ設定にまつわるあれこれについて紹介します。

シャッタースピードの影響

まずはじめに、高速な動きを捉えるためには、シャッタースピードを速くする必要があります。シャッタースピードとは、一枚の静止画を撮る際にシャッターが開いている時間のことです。カメラはシャッターが開いている間に撮像素子に受けた全ての光を一枚の画像(動画の場合は1フレーム)として出力しますので、シャッタースピードよりも速く動いている物体は残像になります。

例えば、夜空の星や、街中の人や車の残像を撮影した画像などは誰でも一度は見たことがあるのではないでしょうか。シャッタースピードを数十分以上にも遅くするとこのような風景を撮影することができます。[1]

野球のボールも同様です。例えば、自動露出でよくあるシャッタースピードの1/125秒で、100[km/h]の速さで、1000[RPM]の回転のボールの場合、シャッターを切る間にボールは20[cm]以上進み、48[deg]回転します。このような移動と回転によって縫い目や輪郭が潰れて、ぼやけた白い丸になってしまっているのが最初の画像です。

それでは、物体検出では常にシャッタースピードを速くしておけば良いかというと、そう単純な話ではありません。シャッタースピードを上げると、カメラに入る光の量が減少し、結果として画像が暗くなる傾向があります。

カメラの基本的な仕組みは高校物理・数学で理解できるほどシンプルなのですが、あらゆる性能値がトレードオフになっていて、何かを上げれば何かが下がってしまうことが簡単にわかります。それでもなんとか全てを高品質に撮影できるカメラを作るために、メーカーの方々が色々な仕組みの開発を日々頑張っているのではないかと思います。

次の節では画像を明るくする設定について解説します。

絞りとISO感度の調整

シャッタースピードを上げた結果、画像が暗くなる場合、絞りの開度を大きくするか、ISO感度を上げることで、光の不足を補うことができます。

絞りとは、レンズとセンサーの間の穴の大きさを調整できる機構です。人間の目で言うと瞳孔に相当します。絞りを大きくすると、より多くの光がセンサーに到達し、画像が明るくなります。

なお、絞りは画像の明るさだけでなくピントの合う距離の範囲(被写界深度)にも影響を与えます。絞りを小さくすると、被写界深度が深くなり、広い範囲の距離にある物体が鮮明になります。反対に絞りを大きくして明るくすると、ピントの合う範囲が狭くなり、ピンボケした画像になりやすいです。演出として背景のボケた写真を見たことがあると思いますが、物体検出においてはこれは不都合です。

一方、ISO感度とは、撮像素子が受けた光を電気信号に変換する際に、信号を増幅する度合いのことです。微弱な光源の暗い環境で撮影した場合でも、ISO感度を上げれば暗視カメラのように画像を明るく捉えることができます。というか、簡単にいうと可視光の暗視カメラは正にこのISO感度が非常に高いカメラのことです。

ただし、ISO感度を上げると、カメラのセンサーが光に対してより敏感になりますが、同時に画像にノイズが生じやすくなります。次の画像は、シャッタースピード1/3000でISO感度を目一杯あげて、当社内の屋内野球ジムで撮影したものです。地下にある施設なので日光は一切入りません。

後述の動画圧縮の影響が混在している可能性があるため、ISO感度単体の影響と断定はできませんが、画像がノイジーなのは明らかです。

なお、最終的な出力画像の明るさを調整する方法としては、他にはホワイトバランスの調整がありますが、これらは撮像素子が受け取った信号を後から加工する方法で、撮影環境の光量が足りない問題を解決するものではありません。

屋内撮影の注意点

屋内で人工照明の下で撮影する場合、シャッタースピードを高く設定すると、絞りやISO感度を限界まで明るく設定しても画像が暗くなりがちです。これは、本質的に屋内の光量が少ないためです。人間の眼と脳は非常に優秀なので、屋内でも屋外でも視界が見やすいように認識上の明るさを自動的に調整してくれますが、照度計などで光の強さを計ると、実際の明るさは大きく異なることがわかります。

また、屋内で動画を撮影する場合、シャッタースピードを上げることで照明のちらつきが目立つことがあります。これは、動画のフレームレートと照明の周波数が同期しないことによるものです。

ズームの種類

ズームには、レンズの拡大率を物理的に変更する光学ズームと、画像をデジタル的に拡大するデジタルズームの二種類があります。光学ズームは画質の低下なくズームが可能ですが、デジタルズームは画質が劣化する可能性があります。

例えば最近傍点補間による2倍のデジタルズームにおいては、1倍の時の1x1ピクセルの色が、2x2のピクセルに拡大されます。これによって画像全体がモザイク調ないし昔のゲームのピクセルアート調になります。二つ目の投球画像は正にそのような例になっています。右側の腕や、左側の背景の木の葉あたりがモザイク調になっていることがわかりやすいです。

デジタルズームの補間のアルゴリズムは他にもバイキュービック法など、画像全体が滑らかに見えるように工夫が施されたものがあります。実際には最近傍点補間よりも滑らかなアルゴリズムが使われることが多いですが、それでも5倍・10倍と拡大するにつれ、やはり細部の違和感は目立つようになります。

3. 静止画・動画のエンコーディング

一般的な静止画・動画データは、エンコーディング時に非可逆圧縮を用いてデータ量を減らし、詳細情報を削除して保存されます。この節では、いくつかのデータ形式について簡単に紹介します。

JPEGの概要

静止画を撮影する場合、最もよく使われている画像データ形式は今でもなおJPEGではないでしょうか。

ChatGPTに説明してもらったところ、JPEGの圧縮アルゴリズムは以下のようになっています。

  1. 色空間の変換:JPEGは通常、RGB色空間(赤、緑、青)の画像をYCbCr色空間に変換します。この色空間は、明度(Y)と色差(CbとCr)に分けられます。人間の目は明度に対してより敏感で、色差にはそれほど敏感ではないため、この変換によって圧縮効率が向上します。
  2. サブサンプリング:色差成分(CbとCr)は、明度成分よりも解像度を下げることができます。これにより、データ量を削減しつつ、画質への影響を最小限に抑えることが可能です。
  3. 離散コサイン変換(DCT):画像は8x8ピクセルのブロックに分割され、各ブロックに対してDCTが適用されます。DCTは画像データを周波数成分に変換し、人間の目が感知しにくい高周波成分を識別します。
  4. 量子化:DCTによって得られた係数は量子化されます。量子化は、特に高周波成分のデータを減らすことにより、ファイルサイズをさらに削減します。この過程で画質の低下が最も発生しますが、適切な量子化テーブルを使用することで、画質とファイルサイズのバランスを取ることができます。
  5. エンコード:最後に、量子化されたデータはエンコードされてJPEGファイルとなります。この段階では、ハフマン符号化などのエンコード技術が用いられます。

ポイントの一つは、ステップ2,4で非可逆な変換を行っていることです。別の画像形式のPNGは可逆なデータ形式ですが、JPEGは保存される前の画像よりも情報が劣化しています。なお、JPEGを保存する際に"品質"値を制御できるアプリケーションが多数ありますが、この値は量子化時に情報を捨てる度合いに影響していることが一般的らしいです。

もう一つのポイントはステップ3で画像を8x8ピクセルのブロックに分割していることです。JPEG形式の画像や一般的な動画を拡大してみると、市松模様的な断裂が見える場合がありますが、それはこのようにブロックに分けてブロックごとに非可逆変換を行っていることが原因です。

最初の画像でも、ブロックの境目でボールのテクスチャーが断裂していることがわかります。

また、こちらの画像は、三番目の画像の品質を最低まで落としたものです。よく見るとブロックの境目がわかります。

H.264の概要

H.264/MPEG-4 AVCは、少し前まで主流だった動画形式です。現在ではスマートフォンでも後継のH.265/HEVC/MPEG-H Part 2で撮影できるようになったため、少しずつ使われなくなってきているのではないでしょうか。

なお、名前が複数あるのは、このコーデックが複数の規格化団体が協力して作られたもので、各団体が自分の系列の名前をつけているためです。また、MPEG-4はより広範な規格のことで動画コーデックそのものではありません。更に動画のファイル拡張子の.mp4はコーデックではなくコンテナフォーマットのことで、こちらもMPEG-4の規格の一つではありますがMPEG-4 AVCとはまた別のものです。

H.264のアルゴリズムはJPEGよりもかなり複雑なのですが、ChatGPTに中学生にもわかるように説明してもらったものが以下です。

  1. ビデオを小さな部分に分ける: 想像してみてください。あなたがビデオをパズルのように小さなブロックに分けたとします。H.264はビデオを小さな部分に分け、それぞれを別々に処理します。
  2. 同じような部分を見つける: たくさんのビデオの中には、見た目が似ている部分がたくさんあります(例えば、動かない背景など)。H.264はこれらの似ている部分を見つけ、一度だけ保存して、あとは「同じだよ」と伝えることで、データを減らします。
  3. 細かい部分を少し簡単にする: ビデオの中の細かい部分(たとえば、木の葉の一つ一つなど)を少し簡単に表現することで、データを減らします。これをやりすぎるとビデオの品質が落ちますが、うまくやればほとんど気づかれません。
  4. パズルを効率的に並べる: さまざまなパズルのピース(ビデオの部分)を、できるだけ少ないスペースに収まるように並べます。これによってもデータ量を減らせます。
  5. 品質を保ちながら圧縮: 最後に、H.264はこれらの工程を通してビデオのデータ量を減らしますが、見た目の品質はできるだけ落とさないように気をつけます。

ポイントは、こちらでもやはりフレームをブロックごとに分けて変換を行っていることと、データ量を落とすための変換が非可逆であることです。

RAW画像について

前述のような圧縮形式に対して、RAW画像として撮影された静止画・動画は、カメラのセンサが受け取った情報をほぼそのまま保持しています。JPEG等とは異なり、特定のデータフォーマットではなく、撮影された画像を情報劣化の無い形式で保存したものをRAW画像と呼びます。具体的なデータフォーマット/拡張子はカメラのメーカーごとに異なり、例えばCR2, RAF, ARWなどがあります。

画像データのバイト数は、例えばFull HD(1920, 1080)で3バイトのRGBの場合、約6MBにもなります。High Dynamic Rangeで画素値を保存する12bit RAWなどでは、これ以上の大きさになることもあります。内部的にデータを可逆圧縮して保持するフォーマットもあるらしいですが、メーカー独自の付加情報が保持されている場合もありますし、基本的には1フレームあたりこのくらいの規模感のデータサイズになってしまいます。

なお、RAW動画撮影の場合、フレームレートが30FPS未満までしかでないカメラの機種がそれなりにあります。大きなデータを保存する重たい処理なので、古いカメラや安いカメラでは高フレームレートでの撮影は難しいようです。

4. カメラの制御

Auto Exposure

シャッタースピード、絞り、ISO感度は通常、Auto Exposure (AE) 機能によって自動制御されます。

いわゆるデジカメ・ビデオカメラなどのカメラ専用機ではこれらの設定を手動に変更できるのが一般的です。

一方、スマートフォンのカメラでも、ハードが対応していればiOSおよびAndroidのAPIを通じて手動制御が可能です。ただし、端末にプリインストールされたカメラアプリでは手動制御機能が提供されていない場合がほとんどです。また、高フレームレートのハイスピード撮影など、特定の撮影モードではOSレベルまたはハードレベルで手動制御ができない制限がある場合もあります。

なお、昔のスマートフォンでは絞りはハードウェア的に変更できませんでしたが、ここ1,2年で絞りが調節できる機種がそれなりに出てきているようです。例えば最近発売されたXiaomi 14 Proなど。ちなみに、OSのAPIとしては絞りの変更機能も昔から予め用意されています。

光学ズームとレンズ交換

光学ズームは、主にレンズの交換によって実現されます。例えば、背面に二つ以上のレンズがついているスマートフォンがありますが、これは広角レンズと望遠レンズなど倍率の異なる複数のレンズが備え付けられているためです。カメラ専用機の場合は、プロやハイアマの方がレンズの筒を付け替えているのを見たことがあるのではないでしょうか。

通常、狭義の一枚のレンズは固定された一つの倍率しか持たず、変更することはできません。ただし、複数の狭義のレンズとそれらの距離を物理的に変更する機構を備えた、全体として可変倍率のズーム"レンズ"も作られています。

カメラ専用機のズームレンズでは、レンズの筒を物理的に捻ることなどで拡大率を変えることができます。スマホの場合はAPIで制御します。可変倍率レンズを備えたスマホの例としては最近のものだと例えばXperia 1 Vなどが挙げられます。

それ以外のズームは基本的にデジタルズームです。 固定倍率の単一レンズしか持たないスマホのカメラアプリやカメラ専用機のコンソールでも、スライダーによってズーム倍率を変えられる機能を見たことがあるかと思いますが、それらはデジタルズームです。また、例えば1倍広角と2倍望遠の二つの固定倍率レンズを持つスマホの場合も、1.5倍などの中途半端な倍率は1倍広角のデジタルズームです。スライダーによる連続的なズーム倍率変更は、OSがレンズ切り替えとデジタルズームをうまく組み合わせて擬似的な可変倍率を提供することで実現されています。

保存形式

カメラ専用機およびiOS/Androidともに、静止画・画像の保存時にはエンコード形式を選択することができます。ただし、数個の選択肢から選ぶだけの場合もあり、品質値などの全てのパラメータが自由自在に制御できるわけではありません。

iOSのAVFoundationの場合は、品質に関するenumの中から一つを選ぶ方法しか提供されていません。AndroidのMediaRecorderの場合は、bitrateを数値で指定することができます。

5. 終わりに

以上、カメラおよびエンコーディングについて、基本的な仕組みおよび制御項目を説明しました。

カメラだけでなくエンコーディングについても各種性能値がトレードオフになっているため、この設定なら(物体検出向けとして)全て最高です!という単一の設定はなく、タスクに応じて適切な調節が必要ではありますが、そのための項目は一通り網羅的に紹介できたのではないかと思います。

物体検出モデルを開発中の皆様は、今後は是非とも画像撮影時の設定にも気を配ってみてください。

なお、当社ではスマートフォン一台で撮影した投球の分析を行うアプリケーションを開発中です。高性能な物体検出モデルや、モデルを実行する解析サーバ、撮影から解析までをユーザに提供するクライアントアプリ、そして、この記事で述べたようなカメラや動画の細やかな調整を行うiOS/Androidの低レベルAPIの制御、など様々な機能を開発しなければなりません。

当社では、一緒に開発を進める仲間を募集中です。興味のある方は以下の会社ページもご覧いただければ嬉しいです。

https://knowhere.co.jp/

脚注
  1. FUJIFILEの解説によると、正確には、このような星空の画像を出力する場合は30秒程度のシャッタースピードの画像を何枚も合成するようです。単に数十分のシャッタースピードの画像一枚だけでは、星が残像を引くことは変わりませんが、やや違った絵面になるようです。 ↩︎

Discussion