前回、最小のTensorflow2をつくることができたました。
そこで今回はこれを使って深度推定のmododepthをやってみたいと思います。
https://arxiv.org/pdf/1609.03677.pdf
monodepthは、深度推定のアルゴリズムの中では高速で正確らしいです。
最近はCPPのコードも充実してきています。
https://github.com/yan99033/monodepth-cpp
これはさっそく試さなくては。
python版のtensorflowはバージョンがちょっとでも違うと動かないですが、c++版の方は多少バージョンが違ってもきちんと動きます。
なので、おじさんはc++で頑張ります。
さくっと最小のtensorflow2で動くように改良。
ソースコードはこちら
https://drive.google.com/file/d/1_pxE6jmjXABKvtZgHkiJTu6aIzuJRTPv/view?usp=sharing
-----------------------
#define NOMINMAX
#define WIN32_LEAN_AND_MEAN
#include <monodepth.h>
//#include <opencv2/opencv.hpp>
#include "opencv2_core.hpp"
#include "opencv2_imgproc.hpp"
#include "opencv2_imgproc_imgproc_c.h"
#include "opencv2_imgcodecs.hpp"
#ifdef _MSC_VER
#pragma comment(lib,"ws2_32.lib")
#endif
int main()
{
int image_width = 1241;
int image_height = 376;
image_width = 1242;
image_height = 375;
monodepth::MonoDepth m(image_width, image_height, "model_city2kitti_vgg.pb");
cv::Mat depth;
std::string img_path = "/path/to/image/folder/";
int number_of_images = 1000;
//for (int i=0; i<number_of_images; i++)
{
//char index_buf[7]; sprintf(index_buf, "%06d", i); std::string index_s(index_buf);
//cv::Mat image(cv::imread(img_path + index_s + ".png"));
// std::cout << "read image in test monodepth" << std::endl;
cv::Mat image(cv::imread("000027.png"));
assert(!image.empty());
m.inference(image, depth);
// convert disparity to depth
depth = 0.3128f / (depth + 0.00001f);
double min_val, max_val;
cv::Mat depthmap_visual;
cv::threshold(depth, depthmap_visual, 50.0, 50.0, cv::THRESH_TRUNC); // apply threshold
cv::minMaxLoc(depthmap_visual, &min_val, &max_val);
depthmap_visual = 255 * (depthmap_visual - min_val) / (max_val - min_val);
depthmap_visual.convertTo(depthmap_visual, CV_8U);
cv::applyColorMap(depthmap_visual, depthmap_visual, 2); //COLORMAP_JET
cv::Size img_size = image.size();
int height = img_size.height * 2;
int width = img_size.width;
cv::Mat full(height, width, CV_8UC3);
cv::Mat top(full, cv::Rect(0, 0, img_size.width, img_size.height));
image.copyTo(top);
cv::Mat bottom(full, cv::Rect(0, img_size.height, img_size.width, img_size.height));
depthmap_visual.copyTo(bottom);
cv::imwrite("top.png", top);
cv::imwrite("bottom.png", bottom);
cv::imwrite("full.png", full);
//cv::namedWindow("FULL", CV_WINDOW_AUTOSIZE);
//cv::imshow("FULL", full);
//cv::waitKey(1);
}
return 0;
}
-----------------------
vggとresnetの学習済みデータが合わせて500Mバイトもあるけど、それ以外はなんか何事もなく簡単に作れてしまった。
結果はいかのとおり。
GPUがあると13fpsでると書いてあるけど、おじさんのCPUだけマシンだと1枚の画像を解析するだけでも数分間かかる・・・。
monodepthはCPUだけでも遅いけどどうにかできそうってことがわかった。
monodepthの日本語の記事がひとつしかない。日本の自動車メーカーとか大丈夫なんでしょうか?
0 件のコメント:
コメントを投稿