caffe版SSD配置注意问题

9 篇文章 0 订阅
7 篇文章 0 订阅

论文作者在原版caffe基础上加上了一些别的操作和方法来实现SSD,所以配置caffe时遇到了很多官方caffe 没有的问题,例如src/caffe/util/中的math_functions.cpp文件中的caffe_rng_uniform函数写的不完善,不注释掉’CHECK_LE(a, b)’,则会出现Check failed: a <= b <0 vs -1.19209e-007>错误,注释掉的话,后面训练会出现Data layer prefetch queue empty错误,网上有几个方法来解决这个问题,其中一个是修改caffe_rng_uniform函数如下:

void caffe_rng_uniform(const int n, Dtype a, Dtype b, Dtype* r) {
  CHECK_GE(n, 0);
  CHECK(r);
  if(a > b) {
    Dtype c = a;
    a = b;
    b = c;
  }
  CHECK_LE(a, b);
  boost::uniform_real<Dtype> random_distribution(a, caffe_nextafter<Dtype>(b));
  boost::variate_generator<caffe::rng_t*, boost::uniform_real<Dtype> >
      variate_generator(caffe_rng(), random_distribution);
  for (int i = 0; i < n; ++i) {
    r[i] = variate_generator();
  }
}

另外一种是修改src/caffe/util/sampler.cpp,如下面修改代码所示//renew注释下,加入两个判断,使得bbox长宽不要越界。

void SampleBBox(const Sampler& sampler, NormalizedBBox* sampled_bbox) {
  // Get random scale.
  CHECK_GE(sampler.max_scale(), sampler.min_scale());
  CHECK_GT(sampler.min_scale(), 0.);
  CHECK_LE(sampler.max_scale(), 1.);
  float scale;
  caffe_rng_uniform(1, sampler.min_scale(), sampler.max_scale(), &scale);
 
  // Get random aspect ratio.
  CHECK_GE(sampler.max_aspect_ratio(), sampler.min_aspect_ratio());
  CHECK_GT(sampler.min_aspect_ratio(), 0.);
  CHECK_LT(sampler.max_aspect_ratio(), FLT_MAX);
  float aspect_ratio;
  caffe_rng_uniform(1, sampler.min_aspect_ratio(), sampler.max_aspect_ratio(),
      &aspect_ratio);
 
  aspect_ratio = std::max<float>(aspect_ratio, std::pow(scale, 2.));
  aspect_ratio = std::min<float>(aspect_ratio, 1 / std::pow(scale, 2.));
 
  // Figure out bbox dimension.
  float bbox_width = scale * sqrt(aspect_ratio);
  float bbox_height = scale / sqrt(aspect_ratio);
 
  //renew
  if(bbox_width>=1.0)
  {
    bbox_width=1.0;
  }
  if(bbox_height>=1.0)
  {
    bbox_height=1.0;
  }
 
  // Figure out top left coordinates.
  float w_off, h_off;
  caffe_rng_uniform(1, 0.f, 1 - bbox_width, &w_off);
  caffe_rng_uniform(1, 0.f, 1 - bbox_height, &h_off);
 
  sampled_bbox->set_xmin(w_off);
  sampled_bbox->set_ymin(h_off);
  sampled_bbox->set_xmax(w_off + bbox_width);
  sampled_bbox->set_ymax(h_off + bbox_height);
}

参考:
https://blog.csdn.net/LuohenYJ/article/details/88416180

https://ask.csdn.net/questions/7078439

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
1. 安装依赖 首先需要安装 Caffe 和一些相关的依赖项: sudo apt-get update sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler sudo apt-get install --no-install-recommends libboost-all-dev sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev 2. 下载源码 下载 Caffe 的源码,建议使用 GitHub 上的官方仓库: git clone https://github.com/weiliu89/caffe.git 3. 编译 Caffe 进入 Caffe 的根目录,然后执行以下命令进行编译: cd caffe cp Makefile.config.example Makefile.config make all -j8 make test -j8 make runtest -j8 4. 下载预训练模型 下载 SSD 的预训练模型,可以从以下链接中选择: https://github.com/weiliu89/caffe/tree/ssd#models 将下载好的模型放到 Caffe 的根目录下的 models 目录中。 5. 测试 SSDCaffe 的根目录下执行以下命令,测试 SSD 的效果: ./build/tools/caffe test \ --model=models/VGGNet/VOC0712/SSD_300x300/deploy.prototxt \ --weights=models/VGGNet/VOC0712/SSD_300x300/VGG_VOC0712_SSD_300x300_iter_120000.caffemodel \ --iterations=5000 \ --gpu=0 6. 使用 SSD 如果已经成功测试了 SSD,就可以在自己的代码中使用它了。需要引入以下头文件: #include "caffe/caffe.hpp" #include "caffe/util/db.hpp" #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/net.hpp" #include "caffe/proto/caffe.pb.h" #include "caffe/layers/input_layer.hpp" #include "caffe/layers/conv_layer.hpp" #include "caffe/layers/pooling_layer.hpp" #include "caffe/layers/softmax_layer.hpp" #include "caffe/layers/relu_layer.hpp" #include "caffe/layers/detection_output_layer.hpp" 然后可以通过以下方式加载模型: caffe::Net<float> net("models/VGGNet/VOC0712/SSD_300x300/deploy.prototxt", caffe::TEST); net.CopyTrainedLayersFrom("models/VGGNet/VOC0712/SSD_300x300/VGG_VOC0712_SSD_300x300_iter_120000.caffemodel"); 最后就可以使用 SSD 进行目标检测了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值