Article

2017年6月5日

はじめに

昨年、Unsupervised Monocular Depth Estimation with Left-Right Consistencyという「単眼画像から視差を推定する」という論文がarxivで公開されたことを知り気になっていたのですが、数か月「ソースコード公開準備中」状態が続いていてモヤモヤした日々を過ごしていました。・・・が、ついに先日GitHubで公開されたこともあり動作確認してみました。

ということで、本記事ではmonodepthセットアップから推論までの一連の手順と別シーンでの検証結果について紹介します。また、以降の説明では、Ubuntu 16.04上で行うことを想定し、実行するプログラムを「monodepth」と表記することとします。

TensorFlowインストール

monodepthはTensorFlowを使っているため、TensorFlowをインストールする必要があります。そのため、まずは公式サイトの手順に従ってTensorFlowをインストールします。

インストール後に

$ python

コマンドを実行し、以下のプログラムを実行します。

>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))

実行した結果、以下のメッセージが表示されていれば正常にTensorFlowが導入できていることがわかります。

Hello, TensorFlow!

monodepth動作確認

ソースコード取得

まずは下記コマンドでリポジトリからmonodepthのソースコードを取得します。

$ git clone https://github.com/mrharicot/monodepth.git

学習済みモデルデータ取得

論文の筆者が学習済みモデルデータを公開しているため今回はこちらを用いることにします。
学習済みモデルデータ一覧はこちらのページで紹介されています。
本記事ではmodel_kittiを使って検証することにします。

$ mkdir models
$ sh ./utils/get_model.sh model_kitti ./models

KITTIデータセット取得

まずはKITTIデータセットで確認するためにStereo Evaluation 2015からデータセットを入手します。
以降は、

~/data/KITTI/

以下にKITTIデータセットを配置したものとして説明します。

ファイルリスト修正

./utils/filenames/kitti_stereo_2015_files.txtではJPEG形式のファイル名が列挙されています。
一方でKITTIデータセットはpng形式のため、ファイルリストに列挙されている拡張子を.pngに変更します。

推論スクリプトの実行

こちらのページを参考にして推論を行います。
実行コマンドの例を以下に示します。

$ mkdir tmp
$ mkdir output
$ python monodepth_main.py --mode test --data_path ~/data/KITTI/ --filenames_file ./utils/filenames/kitti_stereo_2015_files.txt --log_directory ./tmp/ --checkpoint_path ./models/model_kitti --output_directory ./output/

推論結果が出力されるディレクトリをoutput_directoryオプションによって指定することができ、
推論が正常に終了するとこのディレクトリに以下の2つのファイルが生成されます。

  • disparities.npy
  • disparities_pp.npy

後日の記事でこれらの内訳は紹介予定です。

推論結果の可視化

推論結果はnumpyのarrayデータとして格納されているので、ここではOpenCVを用いてさくっと可視化してみます。可視化のためのコードを以下に示します。

import numpy as np
import cv2

disparities = np.load('disparities_pp.npy')

image_width = 1242
image_height = 375
size = (image_width, image_height)

frame_num = 200
for index in range(frame_num):
    (minval, maxval, minloc, maxloc) = cv2.minMaxLoc(disparities[index])
    disp = np.array(disparities[index] * 255 / (maxval - minval), dtype = np.uint8)
    disp = cv2.resize(disp, size, 0, 0, cv2.INTER_CUBIC)
    colored_disp = cv2.applyColorMap(disp, cv2.COLORMAP_JET)

    cv2.imshow('disparity(colormap)', colored_disp)
    key = cv2.waitKey(0)
    if key == 27:
        break

以下の画像はKITTIデータセットの1シーンです。

この画像をmonodepthに入力して推論した視差画像(colormap適用後)は以下の通りです。

1枚の画像からここまで視差が求められると思うとビックリですね。

別シーンでの検証

ここまででmonodepthを一通り動かせるようになったので、別のシーンでもいくつか検証してみました。

シーン#1

このシーンはそれなりに視差が推定できているように見受けられますね。

シーン#2

逆光という厳しそうなシーンですがある程度推定できているように見えます。

シーン#3

うーん、トラックのあたりの視差があやしい感じでしょうか?推定がうまくいかない原因が気になるところですね。

おわりに

ということで、本記事ではmonodepthセットアップから推論までの一連の手順と別シーンでの検証結果を紹介しました。使ってみる前は「学習に使っていないシーンだとうまくいかないのでは?」と思ったりしていたのですが、意外に視差が推定できていてビックリしました。ただし、今回は定量的な評価まではできていないのでそこまで踏み込んで検証してみたいところです。

Tags

About Author

yoshimura

Leave a Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Recent Comments

Social Media