deeplab运行指南

以下仅仅为一个总结,参考了网上的众多资料,仅备忘记。

主要链接

  • deeplab主页:http://liangchiehchen.com/projects/DeepLab.html
  • 官方代码:https://bitbucket.org/aquariusjay/deeplab-public-ver2
  • python 版caffe实现:https://github.com/TheLegendAli/DeepLab-Context2
  • model下载:http://liangchiehchen.com/projects/DeepLab_Models.html
  • DeepLabv2_VGG16 预训练模型
  • DeepLabv2_ResNet101预训练模型
  • pytorch实现的deeplab:https://github.com/isht7/pytorch-deeplab-resnet
  • 网上开源代码:martinkersner/train-DeepLab

主要运行步骤

如下我们主要以网上开源的一个版本讲解:https://github.com/xmojiao/deeplab_v2 .
主要的步骤可以参考:
1. 图像语义分割:从头开始训练deeplab v2系列之一【源码解析】
2. 图像语义分割:从头开始训练deeplab v2系列之二【VOC2012数据集】
3. Deeplab v2 调试全过程(Ubuntu 16.04+cuda8.0)

下面说一些这上面没有的我遇到的一些问题。
1. 安装 matio:
上面资料中都使用 matio-1.5.2.tar.gz ,但是我装不上,可能与我的库不兼容,于是我下载了最新的 matio-1.5.11 ,并且按照如下命令运行安装:

cd matio-1.5.11 
./configure --prefix=/data1/... (填写自己的安装目录)
make 
make check (可略)
make install 最后在bash.rc上加上 LD_LIBRARY_PATH=/your/path/to/libmatio.so.2

参考:http://blog.csdn.net/houqiqi/article/details/46469981
2. 使用的Caffe版本比较陈旧,导致会出现很多和最新环境不兼容的情况,我使用的是cuDNN6.0,cuda8.0
出现:

./include/caffe/util/cudnn.hpp: In function ‘void caffe::cudnn::createPoolingDesc(cudnnPoolingStruct**, caffe::PoolingParameter_PoolMethod, cudnnPoolingMode_t*, int, int, int, int, int, int)’:
./include/caffe/util/cudnn.hpp:127:41: error: too few arguments to function ‘cudnnStatus_t cudnnSetPooling2dDescriptor(cudnnPoolingDescriptor_t, cudnnPoolingMode_t, cudnnNanPropagation_t, int, int, int, int, int, int)’pad_h, pad_w, stride_h, stride_w));

这是由于所使用的cuDNN版本不一致的导致的,作者配置环境是cuDNN 4.0,但是5.0版本后的cuDNN接口有所变化。

解决方法 :将以下几个文件用最新BVLC版本的caffe对应文件替换并重新编译

./include/caffe/util/cudnn.hpp
./include/caffe/layers/cudnn_conv_layer.hpp
./include/caffe/layers/cudnn_relu_layer.hpp
./include/caffe/layers/cudnn_sigmoid_layer.hpp
./include/caffe/layers/cudnn_tanh_layer.hpp./src/caffe/layers/cudnn_conv_layer.cpp
./src/caffe/layers/cudnn_conv_layer.cu
./src/caffe/layers/cudnn_relu_layer.cpp
./src/caffe/layers/cudnn_relu_layer.cu
./src/caffe/layers/cudnn_sigmoid_layer.cpp
./src/caffe/layers/cudnn_sigmoid_layer.cu
./src/caffe/layers/cudnn_tanh_layer.cpp
./src/caffe/layers/cudnn_tanh_layer.cu

参考:http://blog.csdn.net/tianrolin/article/details/71246472
3. 如何解决deeplab v2识别结果为全黑图像的问题?
正如作者而言:http://liangchiehchen.com/projects/DeepLab_FAQ.html

Q: When evaluating the DeepLab outputs (without CRF), I got all-background results (i.e., all black results). Is there anything wrong?A: Please double check if the name of your fc8 is fc8_voc12 in the generated test_val.prototxt or test_test.prototxt (after running run_pascal.sh). The name should be matched for initialization.

主要是作者预训练的模型与你实际测试的模型出现了偏差。主要是fc8 的问题。
以https://github.com/xmojiao/deeplab_v2 为例,如果直接使用此代码,则run_pascal.sh出现在voc12目录下,而run_pascal.sh上EXP2=. ,这与官方的预设不同。官方代码,假定run_pascal.sh应该出现在voc12上一级目录下。 这样最后测试时会出现fc8_voc12_1,fc8_voc12_2,fc8_voc12_3,fc8_voc12_4被忽略的情况。

另外由于测试时需要将test.prototxt复制为test_val.prototxt,所以应该主要修改test.prototxt。
test.prototxt改动如下

layer {name: "data"type: "ImageSegData"top: "data"top: "label"top: "data_dim"include {phase: TEST}transform_param {mirror: falsecrop_size: 513mean_value: 104.008mean_value: 116.669mean_value: 122.675}image_data_param {root_folder: "${DATA_ROOT}"source: "../${EXP}/list/${TEST_SET}.txt"  (改变)batch_size: 1label_type: NONE}
}

run_pascal.sh改变如下

#!/bin/sh

## MODIFY PATH for YOUR SETTING
ROOT_DIR=/data1/caiyong.wang/data/deeplab_dataCAFFE_DIR=../deeplab-public-ver2
CAFFE_BIN=${CAFFE_DIR}/.build_release/tools/caffe.binEXP=voc12  #适应原始训练好的模型目录  (改变)
EXP2=.   #当前目录下               (改变)if [ "${EXP2}" = "." ]; thenNUM_LABELS=21DATA_ROOT=${ROOT_DIR}/VOC_aug/dataset/
elseNUM_LABELS=0echo "Wrong EXP name"
fi## Specify which model to train
########### voc12 ################
NET_ID=deeplab_largeFOV## Variables used for weakly or semi-supervisedly training
#TRAIN_SET_SUFFIX=
TRAIN_SET_SUFFIX=_aug#TRAIN_SET_STRONG=train
#TRAIN_SET_STRONG=train200
#TRAIN_SET_STRONG=train500
#TRAIN_SET_STRONG=train1000
#TRAIN_SET_STRONG=train750#TRAIN_SET_WEAK_LEN=5000DEV_ID=0####### Create dirsCONFIG_DIR=${EXP2}/config/${NET_ID}
MODEL_DIR=${EXP2}/model/${NET_ID}
mkdir -p ${MODEL_DIR}
LOG_DIR=${EXP2}/log/${NET_ID}
mkdir -p ${LOG_DIR}
export  GLOG_log_dir=${LOG_DIR}## RunRUN_TRAIN=0
RUN_TEST=1
RUN_TRAIN2=0
RUN_TEST2=0## Training #1 (on train_aug)if [ ${RUN_TRAIN} -eq 1 ]; then#LIST_DIR=${EXP2}/listTRAIN_SET=train${TRAIN_SET_SUFFIX}if [ -z ${TRAIN_SET_WEAK_LEN} ]; thenTRAIN_SET_WEAK=${TRAIN_SET}_diff_${TRAIN_SET_STRONG}comm -3 ${LIST_DIR}/${TRAIN_SET}.txt ${LIST_DIR}/${TRAIN_SET_STRONG}.txt > ${LIST_DIR}/${TRAIN_SET_WEAK}.txtelseTRAIN_SET_WEAK=${TRAIN_SET}_diff_${TRAIN_SET_STRONG}_head${TRAIN_SET_WEAK_LEN}comm -3 ${LIST_DIR}/${TRAIN_SET}.txt ${LIST_DIR}/${TRAIN_SET_STRONG}.txt | head -n ${TRAIN_SET_WEAK_LEN} > ${LIST_DIR}/${TRAIN_SET_WEAK}.txtfi#MODEL=${EXP2}/model/${NET_ID}/init.caffemodel#echo Training net ${EXP2}/${NET_ID}for pname in train solver; dosed "$(eval echo $(cat sub.sed))" \${CONFIG_DIR}/${pname}.prototxt > ${CONFIG_DIR}/${pname}_${TRAIN_SET}.prototxtdoneCMD="${CAFFE_BIN} train \--solver=${CONFIG_DIR}/solver_${TRAIN_SET}.prototxt \--gpu=${DEV_ID}"if [ -f ${MODEL} ]; thenCMD="${CMD} --weights=${MODEL}"fiecho Running ${CMD} && ${CMD}
fi## Test #1 specification (on val or test)if [ ${RUN_TEST} -eq 1 ]; then#for TEST_SET in val; doTEST_ITER=`cat ${EXP2}/list/${TEST_SET}.txt | wc -l`MODEL=${EXP2}/model/${NET_ID}/test.caffemodelif [ ! -f ${MODEL} ]; thenMODEL=`ls -t ${EXP2}/model/${NET_ID}/train_iter_*.caffemodel | head -n 1`fi#echo Testing net ${EXP2}/${NET_ID}FEATURE_DIR=${EXP2}/features/${NET_ID}mkdir -p ${FEATURE_DIR}/${TEST_SET}/fc8mkdir -p ${FEATURE_DIR}/${TEST_SET}/fc9mkdir -p ${FEATURE_DIR}/${TEST_SET}/seg_scoresed "$(eval echo $(cat sub.sed))" \${CONFIG_DIR}/test.prototxt > ${CONFIG_DIR}/test_${TEST_SET}.prototxtCMD="${CAFFE_BIN} test \--model=${CONFIG_DIR}/test_${TEST_SET}.prototxt \--weights=${MODEL} \--gpu=${DEV_ID} \--iterations=${TEST_ITER}"echo Running ${CMD} && ${CMD}done
fi## Training #2 (finetune on trainval_aug)if [ ${RUN_TRAIN2} -eq 1 ]; then#LIST_DIR=${EXP2}/listTRAIN_SET=trainval${TRAIN_SET_SUFFIX}if [ -z ${TRAIN_SET_WEAK_LEN} ]; thenTRAIN_SET_WEAK=${TRAIN_SET}_diff_${TRAIN_SET_STRONG}comm -3 ${LIST_DIR}/${TRAIN_SET}.txt ${LIST_DIR}/${TRAIN_SET_STRONG}.txt > ${LIST_DIR}/${TRAIN_SET_WEAK}.txtelseTRAIN_SET_WEAK=${TRAIN_SET}_diff_${TRAIN_SET_STRONG}_head${TRAIN_SET_WEAK_LEN}comm -3 ${LIST_DIR}/${TRAIN_SET}.txt ${LIST_DIR}/${TRAIN_SET_STRONG}.txt | head -n ${TRAIN_SET_WEAK_LEN} > ${LIST_DIR}/${TRAIN_SET_WEAK}.txtfi#MODEL=${EXP2}/model/${NET_ID}/init2.caffemodelif [ ! -f ${MODEL} ]; thenMODEL=`ls -t ${EXP2}/model/${NET_ID}/train_iter_*.caffemodel | head -n 1`fi#echo Training2 net ${EXP2}/${NET_ID}for pname in train solver2; dosed "$(eval echo $(cat sub.sed))" \${CONFIG_DIR}/${pname}.prototxt > ${CONFIG_DIR}/${pname}_${TRAIN_SET}.prototxtdoneCMD="${CAFFE_BIN} train \--solver=${CONFIG_DIR}/solver2_${TRAIN_SET}.prototxt \--weights=${MODEL} \--gpu=${DEV_ID}"echo Running ${CMD} && ${CMD}
fi## Test #2 on official test setif [ ${RUN_TEST2} -eq 1 ]; then#for TEST_SET in val test; doTEST_ITER=`cat ${EXP2}/list/${TEST_SET}.txt | wc -l`MODEL=${EXP2}/model/${NET_ID}/test2.caffemodelif [ ! -f ${MODEL} ]; thenMODEL=`ls -t ${EXP2}/model/${NET_ID}/train2_iter_*.caffemodel | head -n 1`fi#echo Testing2 net ${EXP2}/${NET_ID}FEATURE_DIR=${EXP2}/features2/${NET_ID}mkdir -p ${FEATURE_DIR}/${TEST_SET}/fc8mkdir -p ${FEATURE_DIR}/${TEST_SET}/crfsed "$(eval echo $(cat sub.sed))" \${CONFIG_DIR}/test.prototxt > ${CONFIG_DIR}/test_${TEST_SET}.prototxtCMD="${CAFFE_BIN} test \--model=${CONFIG_DIR}/test_${TEST_SET}.prototxt \--weights=${MODEL} \--gpu=${DEV_ID} \--iterations=${TEST_ITER}"echo Running ${CMD} && ${CMD}done
fi

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tensorboard使用_colab打不开tensorboard的解决办法

2020.4.1更新:colab现在自带tensorboard的魔术方法了,用这个命令就能展示tensorboard%load_ext tensorboard %tensorboard --logdir ./log/train# 加载一次后,如果要重新加载,就需要使用reload方法 %reload_ext tensorboard %tens…

构造函数为什么不能是虚函数 ( 转载自C/C++程序员之家)

从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实…

小程序“自定义关键词”功能的常见问答

我们知道小程序可以通过线下扫码、公众号、好友分享、长按小程序码、搜索小程序名称来找到,现在又多了一个新方式——小程序后台新增自定义关键词功能:已发布小程序的开发者,可提交最多10个与小程序业务相关的关键词,帮助你的小程…

语义分割深度学习方法集锦

转载:https://github.com/handong1587/handong1587.github.io/edit/master/_posts/deep_learning/2015-10-09-segmentation.md Papers Deep Joint Task Learning for Generic Object Extraction intro: NIPS 2014homepage: http://vision.sysu.edu.cn/projects/d…

员工培训与开发实训心得体会_公司新员工培训心得体会800字范文

点击蓝字关注我们培训是一次能够快速提升我们的机会,而每个新员工也是通过培训尽快的融入公司的。因此,我们要更加重视培训一些!下面是小编为大家整理的公司新员工培训心得体会,希望对大家有帮助。公司新员工培训心得体会800字为了让我们新进…

Nginx ab压力测试

20-ab压力测试及nginx性能统计模块 优化的启发,打开的文件太多 Nginx 错误日志显示,打开文件数太多 系统层面 more /proc/sys/net/core/somaxconn 单个Nginx 测试index.html 没优化前 [root/home/www]#ab -c 4000 -n 100000 http://test.demo.com/inde…

Code First02---CodeFirst配置实体与数据库映射的两种方式

Code First有两种配置数据库映射的方式,一种是使用数据属性DataAnnotation,另一种是Fluent API.这两种方式分别是什么呢?下面进行一一解释:DataAnnotation的配置方式需要你给定义实体和值对象的类和类中的属性加上与数据库映射相关…

sigmoid函数的数值稳定性

在深度学习中,我们常常选用sigmoid函数作为激活函数。sigmoid函数的具体形式如下: f(x)11e−xf(x)=\frac{1}{1+e^{-x}}曲线表示为: 再画大一点,取x区间更大一些,则为: 显然从图像上看,sigmoid函…

查看CentOS版本方法

有以下命令可以查看: # lsb_release -a LSB Version: :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarchDistributor ID: CentOSDescription: CentOS release 5.4 (Final)Release: 5.4Codename: Final这个命令适用于所有的li…

windows远程连接ubuntu 黑屏_Windows跟Windows远程连接传输文件

关注奕奇科技,学习更多小妙招电脑小知识,值得收藏我们一般在使用windows远程连接时需要传输文件该怎么办?我们可以插入U盘导入导出,但这样很是麻烦而且如果身边暂时没有U盘的情况就要通过社交工具传播文件,大的文件也更…

思维导图分析http之前端组成

思维导图分析http前端组成全文总览本文分为三个部分:前端组成,http协议,http服务器应用程序。http的应用按照我自己的理解分为前端应用以及后端应用,所以我分别写了前端组成以及http服务器应用程序两章,中间穿插了一章…

Linux命令工具基础02 文件及目录管理

文件及目录管理 文件管理不外乎文件或目录的创建、删除、查询、移动,有mkdir/rm/mv 文件查询是重点,用find来进行查询;find的参数丰富,也非常强大; 查看文件内容是个大的话题,文本的处理有太多的工具供我们…

caffe 关于Deconvolution的初始化注意事项

对于fcn,经常要使用到Deconvolution进行上采样。对于caffe使用者,使用Deconvolution上采样,其参数往往直接给定,不需要通过学习获得。 给定参数的方式很有意思,可以通过两种方式实现,但是这两种方式并非完…

多目标进化优化_SDIM 学术讲座|分解多目标优化与帕累托多任务学习

分解多目标优化与帕累托多任务学习2020年11月4日晚,香港城市大学电脑学系讲座教授、博士生导师、IEEE Fellow张青富教授应我院王振坤教授的邀请,在线举办了一场主题为“分解多目标优化与帕累托多任务学习”的学术讲座。此次讲座采用线上和线下两种渠道&a…

hibernate(nested transactions not supported)异常

org.hibernate.TransactionException: nested transactions not supported错误的解决方法! 原因:事务没有提交,事务提交后正常 Transaction tx session.beginTransaction(); tx.commit(); //缺少这句话转载于:https://www.cnblogs.com/lmq-1…

Ubuntu使用Windows下的conio.h

把虚线框里面的内容粘贴进文档文本里面 ---------------------------------------------------------------------------------------------------------- #include <termios.h>#include <stdio.h>static struct termios old, new;/* Initialize new terminal i/o …

安装oracle-java,并覆盖原先的OpenJDK

Centos默认安装openJDK只安装了java,没有安装javac.如果需要安装javac&#xff0c;需要install the openjdk-8-jdk package。参考&#xff1a;http://openjdk.java.net/install/ 为了完整地安装java&#xff0c;我们转而选择使用oracle-java&#xff0c;由于我们没有root权限&a…

反射创建对象_如何应用Java反射技术灵活地创建程序类的对象实例

软件项目实训及课程设计指导——如何应用Java反射技术灵活地创建程序类的对象实例1、如何应用属性配置文件实现对系统中的配置信息进行读写操作Java中的属性配置文件主要可以作为软件应用系统及项目的配置文件&#xff0c;比如许多J2EE的开源框架系统中都提供了属性配置文件作为…

js回到顶部

2019独角兽企业重金招聘Python工程师标准>>> <html xmlns"http://www.w3.org/1999/xhtml"> <head runat"server"> <title></title> <style type"text/css"> #control_pannel …

java 产生的固体物的基础上 增删改的SQL声明

经过多次修改。最后版本。package com.power.sql;import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.List; import java.util.Vector;import org.apache.commons.lang3.reflect.FieldUtils; /*** author Gary Huang* 博客地址&#xff1a;…