このブログは、株式会社フィックスターズのエンジニアが、あらゆるテーマについて自由に書いているブログです。
昨年、Unsupervised Monocular Depth Estimation with Left-Right Consistencyという「単眼画像から視差を推定する」という論文がarxivで公開されたことを知り気になっていたのですが、数か月「ソースコード公開準備中」状態が続いていてモヤモヤした日々を過ごしていました。・・・が、ついに先日GitHubで公開されたこともあり動作確認してみました。
ということで、本記事ではmonodepthセットアップから推論までの一連の手順と別シーンでの検証結果について紹介します。また、以降の説明では、Ubuntu 16.04上で行うことを想定し、実行するプログラムを「monodepth」と表記することとします。
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のソースコードを取得します。
$ git clone https://github.com/mrharicot/monodepth.git
論文の筆者が学習済みモデルデータを公開しているため今回はこちらを用いることにします。
学習済みモデルデータ一覧はこちらのページで紹介されています。
本記事ではmodel_kittiを使って検証することにします。
$ mkdir models
$ sh ./utils/get_model.sh model_kitti ./models
まずは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つのファイルが生成されます。
後日の記事でこれらの内訳は紹介予定です。
推論結果は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を一通り動かせるようになったので、別のシーンでもいくつか検証してみました。
このシーンはそれなりに視差が推定できているように見受けられますね。
逆光という厳しそうなシーンですがある程度推定できているように見えます。
うーん、トラックのあたりの視差があやしい感じでしょうか?推定がうまくいかない原因が気になるところですね。
ということで、本記事ではmonodepthセットアップから推論までの一連の手順と別シーンでの検証結果を紹介しました。使ってみる前は「学習に使っていないシーンだとうまくいかないのでは?」と思ったりしていたのですが、意外に視差が推定できていてビックリしました。ただし、今回は定量的な評価まではできていないのでそこまで踏み込んで検証してみたいところです。
keisuke.kimura in Livox Mid-360をROS1/ROS2で動かしてみた
Sorry for the delay in replying. I have done SLAM (FAST_LIO) with Livox MID360, but for various reasons I have not be...
Miya in ウエハースケールエンジン向けSimulated Annealingを複数タイルによる並列化で実装しました
作成されたプロファイラがとても良さそうです :) ぜひ詳細を書いていただきたいです!...
Deivaprakash in Livox Mid-360をROS1/ROS2で動かしてみた
Hey guys myself deiva from India currently i am working in this Livox MID360 and eager to knwo whether you have done the...
岩崎システム設計 岩崎 満 in Alveo U50で10G Ethernetを試してみる
仕事の都合で、検索を行い、御社サイトにたどりつきました。 内容は大変参考になりま...
Prabuddhi Wariyapperuma in Livox Mid-360をROS1/ROS2で動かしてみた
This issue was sorted....