このブログは、株式会社フィックスターズのエンジニアが、あらゆるテーマについて自由に書いているブログです。
昨年、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セットアップから推論までの一連の手順と別シーンでの検証結果を紹介しました。使ってみる前は「学習に使っていないシーンだとうまくいかないのでは?」と思ったりしていたのですが、意外に視差が推定できていてビックリしました。ただし、今回は定量的な評価まではできていないのでそこまで踏み込んで検証してみたいところです。
コンピュータビジョンセミナーvol.2 開催のお知らせ - ニュース一覧 - 株式会社フィックスターズ in Realizing Self-Driving Cars with General-Purpose Processors 日本語版
[…] バージョンアップに伴い、オンラインセミナーを開催します。 本セミナーでは、...
【Docker】NVIDIA SDK Managerでエラー無く環境構築する【Jetson】 | マサキノート in NVIDIA SDK Manager on Dockerで快適なJetsonライフ
[…] 参考:https://proc-cpuinfo.fixstars.com/2019/06/nvidia-sdk-manager-on-docker/ […]...
Windowsカーネルドライバを自作してWinDbgで解析してみる① - かえるのほんだな in Windowsデバイスドライバの基本動作を確認する (1)
[…] 参考:Windowsデバイスドライバの基本動作を確認する (1) - Fixstars Tech Blog /proc/cpuinfo ...
2021年版G検定チートシート | エビワークス in ニューラルネットの共通フォーマット対決! NNEF vs ONNX
[…] ONNX(オニキス):Open Neural Network Exchange formatフレームワーク間のモデル変換ツー...
YOSHIFUJI Naoki in CUDAデバイスメモリもスマートポインタで管理したい
ありがとうございます。別に型にこだわる必要がないので、ユニバーサル参照を受けるよ...