单目深度估计-基于Caffe

本文的思路主要来源于[1],模型和参数来源于[2],这里只是在Caffe的框架下用C++实现了,效果还可以,目前打算做个三维点云显示,做好了再上传吧.

这里先贴代码吧,最近比较忙,就先不讲具体的,大家先看吧,有时间了再写思路吧

#include <vector>
#include <string.h>
#include <caffe/caffe.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace caffe;
using namespace std;

int main(){ 

  /*Load the network*/
  string proto = "scripts/deploy_resnet50by2_pool.prototxt";
  Phase phase = TEST;
  Caffe::set_mode(Caffe::GPU);
  Caffe::SetDevice(0);
  boost::shared_ptr< Net<float> > net(new caffe::Net<float>(proto, phase));
  string model = "model/train_iter_40000.caffemodel";
  net->CopyTrainedLayersFrom(model);

  CHECK_EQ(net->num_inputs(), 1) << "Network should have exactly one input.";
  CHECK_EQ(net->num_outputs(), 1) << "Network should have exactly one output.";

  /*Convert image to input blob. Blob: num, channel, height, width*/
  Blob<float>* input_blob = net->input_blobs()[0];
  int input_channel = input_blob->channels();
  int input_height = input_blob->height();
  int input_width = input_blob->width();
  cout << "The size of input image should be " << input_width << "*" << input_height << endl;

  vector<cv::Mat> input_channels;  //The value of input image‘s each channel
  float* input_data = input_blob->mutable_cpu_data();
  for(int i=0;i<input_channel;i++){
    cv::Mat channel(input_height, input_width, CV_32FC1, input_data);
    input_channels.push_back(channel);
    input_data += input_width*input_height;
  }

  string imgPath = "images/1.png";
  cv::Mat image = cv::imread(imgPath);

  cv::Size input_size = cv::Size(input_width, input_height);
  cv::Mat image_resized;
  cv::resize(image, image_resized, input_size);
  cv::imshow("image", image_resized);
  cv::waitKey(0);

  cv::Mat image_float;
  image_resized.convertTo(image_float, CV_32FC3);
  cv::Mat image_normalized;
  cv::Mat mean(input_height, input_width, CV_32FC3, cv::Scalar(104,117,123));
  cv::subtract(image_float, mean, image_normalized);
  cv::split(image_normalized, input_channels);

  net->Forward();

  /*Convert output blob to image*/
  Blob<float>* output_blob = net->output_blobs()[0];
  int output_height = output_blob->height();
  int output_width = output_blob->width();
  float *output_data = output_blob->mutable_cpu_data();
  cv::Mat depth(output_height, output_width, CV_32FC1, output_data);
  cout << depth.at<float>(5,5);

  cv::Mat depth_uint8;
  depth.convertTo(depth_uint8, CV_8UC1);

  cv::imshow("depth", depth_uint8);
  cv::waitKey(0);

  /*Generate 3D image with rgb image and estimated depth*/

  return 0;
}

下面是我的CmakeList.txt,代码中需要的模型.参数,和图片都是包含在[2]里面的.

cmake_minimum_required( VERSION 2.8 )
project( resTest )

add_executable( resTest resTest.cpp )
set( CMAKE_CXX_FLAGS "-std=c++11" )

include_directories( /home/ai/Programs/Caffe/include
  /home/ai/Programs/Caffe/.build_release/src
  /usr/local/cuda/include
  /usr/local/include
  /usr/include

  )
target_link_libraries( resTest
  /home/ai/Programs/Caffe/.build_release/lib/libcaffe.so
  /usr/lib/x86_64-linux-gnu/libopencv_highgui.so
  /usr/lib/x86_64-linux-gnu/libopencv_imgproc.so
  /usr/lib/x86_64-linux-gnu/libopencv_core.so
  /usr/lib/x86_64-linux-gnu/libboost_system.so
  /usr/lib/x86_64-linux-gnu/libglog.so
  )

参考文献

[1]http://blog.csdn.net/jiongnima/article/details/70197866

[2]https://github.com/Ravi-Garg/Unsupervised_Depth_Estimation

时间: 2024-08-08 22:08:19

单目深度估计-基于Caffe的相关文章

单目,双目,深度相机比较

1.mono优点:结构简单,成本低缺点:在单张图片里,无法确定一个物体的真实大小.它可能是一个很大但很远的物体,也可能是一个很近很小的物体.通过相机的运动形成视差,可以测量物体相对深度.但是单目SLAM估计的轨迹和地图将与真实的轨迹和地图相差一个因子,也就是尺度(scale),单凭图像无法确定这个真实尺度,所以称尺度不确定性. 2.stereo优点:基线距离越大,能够测量的距离就越远:并且可以运用到室内和室外.缺点:配置与标定较为复杂深度量程和精度受到双目基线与分辨率限制视差计算非常消耗计算资源

在自遮挡下的单目图像3D姿态估计 Monocular Image 3D Human Pose Estimation under Self-Occlusion (ICCV 13)

Monocular Image 3D Human Pose Estimationunder Self-Occlusion (ICCV 13) 在自遮挡下的单目图像3D姿态估计 摘要:文中提出在单张图片中3D姿态自动重建的方法.人体关节.易产生幻觉的身体部位的存在,杂乱的背景,都将导致人体姿态判断的歧义性,这都说明这不是一个简单的问题.研究者研究了许多基于运动和阴影的方法,为了减小歧义性,并对3D姿态进行重建.我们算法的关键思想就是增加运动和方向限制.前一个是在3D模型映射到输入图像时增加的限制,

基于OpenCV单目相机的快速标定--源码、工程、实现过程

相机的标定是所有人走进视觉世界需要做的第一件事,辣么多的视觉标定原理解释你可以随便在网上找到,这里只讲到底如何去实现,也算是给刚入门的朋友做个简单的分享. 1.单目相机标定的工程源码 首先请到同性交友网站Github上下载工程源码(https://github.com/Zhanggx0102/Camera_Calibration),注意以下几点: 1).这是一个MS Visual Studio 2010的工程源码(版本是201x都可以). 2).在编译运行之前请先在VS中配置好OpenCV(网上

Semantic Monocular SLAM for Highly Dynamic Environments面向高动态环境的语义单目SLAM

一.摘要 当前单目SLAM系统能够实时稳定地在静态环境中运行,但是由于缺乏明显的动态异常处理能力,在动态场景变化与运动中往往会失败.作者为解决高度动态环境中的问题,提出一种语义单目SLAM架构,结合基于特征和直接方法实现具有挑战的条件下系统的鲁棒性.作者所提出的方法利用专业概率模型从场景中提取的语义信息,使跟踪和建图的概率最大化依赖于那些相对于相机没有呈现相对运动的场景部分.在KITTI和Synia数据集上,作者展示了在动态环境中更稳定的姿态估计效果以及相比当前最好静态场景下不错的表现. 二.贡

基于Caffe的Large Margin Softmax Loss的实现(上)

小喵的唠叨话:在写完上一次的博客之后,已经过去了2个月的时间,小喵在此期间,做了大量的实验工作,最终在使用的DeepID2的方法之后,取得了很不错的结果.这次呢,主要讲述一个比较新的论文中的方法,L-Softmax,据说单model在LFW上能达到98.71%的等错误率.更重要的是,小喵觉得这个方法和DeepID2并不冲突,如果二者可以互补,或许单model达到99%+将不是梦想. 再次推销一下~ 小喵的博客网址是: http://www.miaoerduo.com 博客原文:  http://

单目相机测距

单目测距的小项目,大概需要就是用单目相机,对一个特定的目标进行识别并测算相机与该目标的距离.所以便去网上找了一堆教程,这里给大家总结一下,希望给小白们一个参考. 首先是基本需求了 opencv自然要会的,这咱就不多说了,会一点就行 需要一个摄像头,我用的是一个畸变很大的鱼眼免驱动摄像头,大家用电脑上的那个自带摄像头也可以的,就是不方便. 需要MATLAB进行相机标定 其实上面都是废话,下面进入正题吧. 网上的方法大概有两种,这里主要介绍一个我身边的大哥们都称做PnP问题的一个方法,但会另外简单介

基于caffe与MATLAB接口的回归分析与可视化

如果遇到一些问题,可以在这里找下是否有解决方案.本文内容主要分为两部分,第一部分介绍基于caffe的回归分析,包括了数据准备.配置文件等:第二部分介绍了在MATLAB上进行的可视化.(话说本人最近有个课题需要做场景分类,有兴趣可以共同探讨一下). Preparation 预装好caffe on windows,并编译成功MATLAB接口. 通过caffe进行回归分析 通过caffe进行回归分析,在实验上主要分成HDF5数据准备.网络设计.训练.测试.该实验已经有网友做过,可以参考:http://

ISO/IEC 9899:2011 条款6.5.3——单目操作符

6.5.3 单目操作符 语法 1.unary-expression: postfix-expression ++  unary-expression --  unary-expression unary-expression    cast-expression sizeof    unary-expression sizeof    ( type-name ) _Alignof    ( type-name ) unary-operator:    以下之一 &    *    +    -

基于Caffe的Large Margin Softmax Loss的实现(中)

小喵的唠叨话:前一篇博客,我们做完了L-Softmax的准备工作.而这一章,我们开始进行前馈的研究. 小喵博客: http://miaoerduo.com 博客原文:  http://www.miaoerduo.com/deep-learning/基于caffe的large-margin-softmax-loss的实现(中).html 四.前馈 还记得上一篇博客,小喵给出的三个公式吗?不记得也没关系. 这次,我们要一点一点的通过代码来实现这些公式.小喵主要是GPU上实现前后馈的代码,因为这个层只