分析一下weiliu89的caffe-ssd代码吧

weiliu89在caffe里面加了这么一堆东西,来做他的ssd,我觉得作者实在是有点overdesign了,把代码搞的可读性很差。而且很关键的一点是,这哥们不喜欢在代码里加任何空行,所有代码都密密麻麻挤在一起。你的屏幕面积就那么宝贵么?

费了好几天劲,终于大概看完了他的代码,大概有这么些东西:

数据集准备

caffe/data/coco
caffe/tools/convert_annoset.cpp


caffe proto

LabelMapItem, LabelMap,
NormalizedBBox, Annotation, AnnotationGroup, AnnotatedDatum

ExpansionParameter,
SaltPepperParameter, NoiseParameter, DistortionParameter, 
Sampler, SampleConstraint, BatchSampler, EmitConstraint
ResizeParameter, 

AnnotatedDataParameter
PriorBoxParameter
MultiBoxLossParameter
NonMaximumSuppressionParameter, SaveOutputParameter, DetectionOutputParameter


新增的h/cpp/cu代码

layers/annotated_data_layer.hpp/cpp
layers/detection_evaluate_layer.hpp/cpp
layers/detection_output_layer.hpp/cpp/cu
layers/multibox_loss_layer.hpp/cpp
layers/prior_box_layer.hpp/cpp
layers/smooth_L1_loss_layer.hpp/cpp/cu
util/bbox_util.hpp/cpp/cu
util/im_transforms.hpp/cpp
util/samper.hpp/cpp
data_transformer.hpp/cpp


然后其实他的算法过程就是这么些东西:

Annotated data layer和data transformer

Annotated data layer产生图像以及图像中标记的目标框。图像以及目标框经过data 
transformer进行一系列变换,依次为:
(1) Image distortion;
(2) Image expansion;
(3) Sampling a random crop window;
(4) Data transform: Adding noise, resizing, 
步骤(1)中,使用了caffe proto中的DistortionParameter.
步骤(2)中,使用了caffe proto中的ExpansionParameter。
步骤(3)中,使用了caffe proto中的Sampler, SampleConstraint, BatchSampler。
步骤(4)中,使用了caffe proto中的ResizeParameter和NoiseParameter,先resize 然后加
noise,并且将去掉中心点落到图像外的目标框。
AnnotatedDataLayer输出的目标表示为N*8*1*1的tensor,有N个目标,8个值分别为:
(0) - 来自batch中的第i张图片;
(1) - 目标类别;
(2) - 目标序号;
(3-7) - xmin, ymin, xmax, ymax坐标,均为相对图像宽高归一化到[0, 1]之间的值;
(8) - 是否difficult。

Prior box layer产生prior box

Prior box layer根据图像大小和feature map大小,以及预设的参数,生成prior box。

PriorBoxParameter中,指定了min_size,max_size,和aspect_ratio。另外还有参数flip
和clip,如果flip为true,则将有一组额外的aspect ratio。如果clip为true,则将超出图
像边缘的prior box固定到图像内。作者给的训练网络中flip为true,clip为false。

每个min_size和aspect_ratio的组合生成一个prior box,每个max_size 再生成一个额外的
prior box。在作者的训练网络中,每个prior box用xmin,ymin,xmax,ymax表示,均为相
对于图像宽高的归一化值。此外每个prior box还有4个variance值,用于计算损失时对坐标
进行归一化。作者在训练网络中将这4个variance分别设置为0.1, 0.1, 0.2, 0.2。


Multi box loss layer计算multi box loss

在计算multi box loss时,依次进行如下操作:
(1) GetGroundTruth,从blob复原回NormalizedBBox。
(2) GetPriorBoxes,获取feature map上每个点对应的prior box。
(3) GetLocPredictions,获取feature map上每个点的预测的目标框。注意对不同类别共用
    一个目标框。
(4) FindMatches,将prior box与groundtruth box进行匹配,找到prior box中哪些应作为
    正样本。这里如下参数发挥作用:
    - use_prior_for_matching:在作者的代码中为true,即匹配prior box与gnd box。
    - overlap_threshold:控制了判定样本为正样本的覆盖率阈值。
    - match_type:在作者的代码中设置为PER_PREDICTION,即对每个 gnd box,选择最佳
      匹配的prior box作为positive box,以及对每个prior box,如果与其覆盖率最高的
      gnd box的覆盖率超过overlap_threshold,也将其作为positive box。
(5) MinHardExamples,选择hard negative window。这里如下参数发挥作用:
    - do_neg_mining
    - mining_type
    - use_prior_for_nms
    - nms_param
    - neg_pos_ratio:
    - neg_overlap:如果prior box与gnd box的覆盖率超过此值,则不作为negative。
    - sample_size
    在进行hard neg mining时,按如下步骤进行计算:
    - 计算每个prior box的confidence loss。
    - 如果mining_type为HARD_EXAMPLE,计算location loss,并将location loss和conf
      loss加起来作为损失。注意prior box和gnd box为(xmin, ymin, xmax, ymax)格式,
      但location pred为(ncx, ncy, nw, nh)格式,其中ncx,ncy为中心点偏移,用prior
      box宽高和variance[0]和 variance[1]归一化。nw和nh为宽度和高度偏移,用prior 
      box宽高和variance[2]和variance[3]归一化。需要依次调用EncodeLocPrediction和
      ComputeLocLoss计算位置损失。
    - 如果has_nms_param为true,则对negative window进行nms后再选取。
      如果use_prior_for_nms,则使用prior box进行nms,否则使用pred box进行nms。在
      进行nms之前需要先调用DecodeBBoxes将pred bbox转化为(xmin, ymin, xmax, ymax)
      格式,然后再调用ApplyNMS。
    - 如果mining_type为MAX_NEGATIVE,则根据neg_pos_ratio以及positive数目确定选取
      的negative数目,否则根据sample_size确定要选取的negative数目。


上面这几步完了之后,就是调用具体的loss layer计算损失值了。在backward时,也只需要
将loss layer传回来的diff拷贝到对应窗口的feature map的diff中即可。




  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 安装caffe-ssd-gpu在ubuntu18.04的步骤如下: 1. 安装CUDA:从Nvidia官网下载合适的CUDA安装包,按照官方文档的指引进行安装。 2. 安装依赖:运行以下命令安装所需依赖库: ``` sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev \ libopencv-dev libhdf5-serial-dev protobuf-compiler \ libgflags-dev libgoogle-glog-dev liblmdb-dev libboost-all-dev ``` 3. 下载caffe-ssd-gpu源码并编译:从Github上下载caffe-ssd-gpu的源码,按照官方文档指引进行编译。编译时需要指定编译选项为GPU模式。 4. 运行测试:安装完成后,运行测试脚本,确保安装配置成功。 以上为简要步骤,具体操作请参考对应文档和官方指引。 ### 回答2: Ubuntu18.04是目前比较常见的Linux操作系统之一,而CAFFE-SSD-GPU是深度学习的一个工具。下面是安装caffe-ssd-gpu的步骤: 1. 安装CUDA和cuDNN 首先,您需要安装CUDA和cuDNN,这是运行深度学习框架所需的必备组件。下载安装CUDA和cuDNN之前,您需要查看您的图形卡的型号,以便选择正确的CUDA版本和cuDNN版本。 在下载和安装CUDA和cuDNN之前,您需要在NVIDIA的开发者网站上注册自己,并下载适用于您机器的CUDA和cuDNN版本。此外,您还需要在命令行界面中设置以下环境变量: export PATH=/usr/local/cuda-8.0/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH 2. 安装依赖项 在安装caffe之前,需要安装一些依赖项。您可以使用以下命令将这些依赖项安装到您的Ubuntu系统上: sudo apt-get update sudo apt-get install -y libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev protobuf-compiler gfortran libjpeg62 libfreeimage-dev libatlas-base-dev git python-dev python-pip libgoogle-glog-dev libbz2-dev libxml2-dev libxslt-dev libffi-dev libssl-dev libgflags-dev liblmdb-dev python-yaml python-numpy python-scipy 3. 下载和安装CAFFE 现在,您需要在您的系统上下载和安装CAFFE。从github上获取caffesource代码并进行安装: git clone https://github.com/weiliu89/caffe.git cd caffe git checkout ssd 4. 编译和安装CAFFE 使用以下命令编译和安装caffe: cp Makefile.config.example Makefile.config make all -j $(($(nproc) + 1)) make pycaffe 执行该命令后,您需要等待一段时间才能完成CAFFE的编译。如果出现任何编译错误,请检查您的CUDA和cuDNN版本是否正确,并重新安装依赖项。 5. 使用CAFFE-SSD-GPU 现在,您已经成功地在Ubuntu18.04操作系统上安装并编译了CAFFE-SSD-GPU,您可以开始使用该工具来执行深度学习任务了。 总结 安装CAFFE-SSD-GPU需要充分理解linux的命令行操作。需要先确认CUDA和cuDNN已经安装,并正确设置环境变量。然后需要下载和安装CAFFE, 并最后编译和安装CAFFE。在安装过程中如果存在问题,可以查看错误日志,重新检查步骤。如果对命令行操作不熟悉,则先学习linux基础操作。 ### 回答3: caffe-ssd-gpu是一种基于caffe框架的用于实现目标检测的神经网络模型,在Ubuntu18.04系统中安装caffe-ssd-gpu需要进行以下步骤: 1. 安装CUDA CUDA是NVIDIA公司推出的用于高性能计算的并行计算平台和编程模型,是使用GPU进行深度学习任务所必需的。在Ubuntu18.04上安装CUDA需要首先确认自己的显卡型号,并选择合适的CUDA版本进行安装。可以在NVIDIA官网上下载相应的CUDA安装包,也可以通过命令行方式进行安装。在安装过程中注意要按照提示完成相应的配置和设置。 2. 安装cuDNN cuDNN是用于深度神经网络的GPU加速库,也是必需的组件之一。在安装过程中同样需要确认CUDA的版本和自己的显卡型号,并下载相应的cuDNN安装包进行安装。 3. 安装依赖包 在安装caffe-ssd-gpu前需要先安装几个依赖包,包括protobuf、opencv、boost等。可以通过命令行方式进行安装,例如: ``` sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev libgflags-dev libgoogle-glog-dev liblmdb-dev ``` 4. 下载caffe-ssd-gpu源码 可以在GitHub上找到caffe-ssd-gpu的源码,下载后解压到自己想要的目录下。 5. 编译和安装caffe-ssd-gpu 进入caffe-ssd-gpu源码目录下,执行以下命令: ``` cd caffe-ssd-gpu mkdir build cd build cmake .. make all -j8 make install ``` 其中,make all -j8表示使用8个线程进行编译,提高编译速度。make install表示安装编译好的caffe-ssd-gpu库文件和可执行文件。 6. 测试安装是否成功 可以尝试运行caffe-ssd-gpu自带的测试程序,检查安装是否成功。在源码目录下执行以下命令: ``` ./build/tools/caffe time --model=models/VGGNet/VOC0712/SSD_300x300_ft/deploy.prototxt --gpu=0 ``` 这条命令会测试caffe-ssd-gpu在GPU上执行推断的速度,如果没有问题,则说明安装成功。 需要注意的是,在安装过程中可能会遇到各种问题,例如依赖包的版本不兼容、CUDA和cuDNN的配置出错等等。这时候需要耐心调试错误,逐个解决问题,才能确保caffe-ssd-gpu能够正常运行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值