2020年7月28日火曜日

monodepthをやってみる

前回、最小の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 件のコメント:

コメントを投稿