スキップしてメイン コンテンツに移動

人工知能が見ている世界

今の世の中、そこら中に人工知能(AI)と呼ばれるシステムがあふれている。特にディープラーニングによるニューラルネットワークモデルを使ったシステムは高度な処理が可能であると広く考えられているようだ。では、それを使ったAIはどのようにこの世界を見ているのだろうか。

ディープラーニングで得られる特徴を含んだ値(特徴マップ)がAIの視覚と呼べるだろう。AIについて扱った教材では、ディープラーニングにより学習されたニューラルネットワークモデルの特徴マップを例示していることがあるが、特定の画像に対する特定の特徴の一部を載せているだけなので、AIがどのように世界を見ているのか、それだけで判断するのは難しい。

そこで、任意の動画に対してニューラルネットワークモデルを使って特徴マップを映像化することにした。今回、対象とするネットワークアーキテクチャは、AlexNetVGG19だ。それぞれ2012年と2014に公表されており、どちらのアーキテクチャもImageNetの分類できわめて高い性能を誇っている。

特徴マップの映像化を行うにあたって、まずは動画処理のためにffmpeg-pythonを利用することにした。これは、名前からもわかるようにPythonのFFmpegラッパーで、動画を扱うのにはかなり便利なライブラリとなっている。次に、AlexNetとVGG19を利用するためにPyTorchとそのパッケージであるtorchvisionを利用した。torchvisionにはAlexNetとVGG19の学習済みネットワークモデルも用意されている。使い方は簡単で、例えばAlexNetなら、以下のコードでネットワークモデルをすぐに使うことができる。

model = torchvision.models.alexnet(pretrained=True)

今回は学習をせず用意されているモデルを使うだけなので、推論モードにして勾配計算をしないように model.eval()torch.set_grad_enabled(False) を記述しておく。

処理の流れは次の通り。入力データとして適当な動画ファイルを用意する。動画ファイルが読み込まれると、ffmpegによりフレーム画像を一枚ずつ読み出し、それをnumpyで配列に変換。変換されたデータをPyTorchのモデルに渡す。前処理としてtransposeやunsqueezeでモデルが処理できるような形に変換しておく。モデル内での計算は特徴のみを抽出するため、 model.features() を呼び出す。続けて model.avgpool() を呼び出してもいいが、プーリングによりデータが圧縮されて出力画像の解像度が落ちる。

モデルによる出力データとしてチャネル数分の特徴マップが出てくるので、それを出力動画の画面に並べることにする。AlexNetであればチャネル数は256なので16×16に並べる(VGG19なら512なので32×16)。まず、モデルからの出力を(Ho×Wo, 256)の形に変換して(Ho, Woはそれぞれ出力された特徴マップの高さと幅を表す)、人に見やすく視覚化するために、特徴マップごとに正規化(min-max scaling; 0-255)を行っている。そして、それを縦横16×16枚の特徴マップの画像として並ぶようにデータを変換し、画像処理ライブラリであるPIL (pillow)を用いて元のサイズにスケーリングする。さらに、オリジナルの画像を透過度(アルファ値)0.3にして重ね合わせて、動画フレームのための画像データを生成する。最後にffmpegにより動画ファイルにエンコードして完了となる。

コードはGitHubリポジトリのfoota / neural-networks-viewに置いてある。使い方は以下の通り。

python nnview.py 入力動画ファイル名 出力動画ファイル名

以下に示す動画がAlexNetが見ている世界になる。256個もの眼を持って、矯めつ眇めつそれを眺め、何であるのかを認識している。人が見て何となく認識できる映像もあれば、ただの点滅にしか見えないものまで様々だ。


同様に、VGG19の見ている世界が以下の映像だ。AlexNetの倍の眼を持ち、512個もの異なった視点を全結合層で統合して判断を下していると考えるとなんだか不思議な気分になる。入力映像としてPixabayハトの動画 [1280x720]を使わせてもらった。


最後に、手元の実行環境(CPU: Intel Core i9 10900K @3.70GHz / GPU: NVIDIA GeForce RTX 2080Ti)での速度比較を示す。CPUとGPUの速度差は、AlexNetで4.4倍、VGG19で24.8倍であった。この違いが生じている理由は、AlexNetと比較して計算量が多いVGG19の方が効果的にGPUを利用できているためだ。

実行時間の比較 (入力データ: ハトの動画 [1280x720])
アーキテクチャ CPU / GPU 実行時間 (秒)
AlexNet CPU 44.204
GPU 9.998
VGG19 CPU 550.690
GPU 22.204

今回はAlexNetとVGG19の2つのアーキテクチャについて動画を作成してみたが、特徴マップを抽出できればどのアーキテクチャにも適用できると思うので、興味があれば試して欲しい。また、いろいろな動画で試してみることで、ニューラルネットワークしか知り得ない、面白い特徴が見つかるかもしれない。

※ 入力フレーム画像の正規化が入っていなかったのでコード修正・動画差し替え (2020-07-29)

コメント