从零搭建SegNet(安装+训练+测试)

SegNet的安装:

SegNet依赖于许多组件,前人已经有许多教程,故这里仅给出我参考并安装成功的部分:

先给一篇我初次安装时参考的:CUDA8.0+NVIDIA Driver安装,其中老版本下载地址为CUDA8.0下载.安装过程中请同时参阅官方安装说明.我在实际安装中遇到的问题可以参考这篇文章,安装的是CUDA9.2版本。

需要注意:CUDA8.0安装包中自带显卡驱动367/375(分别对应8.0.27/8.0.61),若您的系统已经安装了更高版本驱动,则在开始安装CUDA后,有一项安装accelorator driver时应当选否,否则会造成系统崩溃.但是我在安装时首先安装了390.25,随后安装完验证时出现了第四项(想不起来了),即执行

$ ls /dev/nvidia*

后出现了

/dev/nvidia0  /dev/nvidiactl  /dev/nvidia-uvm /dev/nvidiaxxxxxxx

在后续测试中出现无法解决的错误,最终执行

$ sudo apt-get autoremove --purge nvidia-*   #把nvidia驱动清个干干净净
$ sudo reboot

删除了最新版驱动,重新安装CUDA并安装自带显卡后,成功.故而安装时推荐先卸载原有驱动,直接安装CUDA带的驱动.

cuDNN5.1安装,其中老版本下载地址为cuDNN5.1下载,这里需要注册账号才能下载.安装推荐走Debian,自带测试程序。对应ubuntu版本的三个包都下下来,一个一个装,最后测试即可。安装说明见这里

比较简单,不再赘述.

 

随后可根据SegNet官方教程进行配置:SegNet英文官方教程SegNet官方教程的部分中文翻译

 

其中需要用到的有

caffe-segnet for cuDNN5.1下载,根据官方Caffe说明进行配置,也可以参考这篇博文中安装部分(后续部分有问题,接下来说)

SegNet-Tutorials下载,根据官方教程将caffe-segnet-cuDNN文件夹改名后放如该文件夹后即可.

在教程中如果遇到

Check failed: error == cudaSuccess (2 vs. 0) out of memory

该问题是由于显卡显存不够.这篇文章中对这个问题有详细的说明.其中batch size是每次同时送入训练的图片量,数量大其收敛效果更佳.我的经历是用GTX850M(2G显存)在batch size为1时仍超出,即不能运行例程.换成GTX1070(8G显存)可以跑的最大batch size为3.segnet_solver.prototxt中可以定义最大训练循环数(max_iter),按照教程给的40000次我训练了总计14个小时,但是其实每1000次训练就能生成一个训练数据文件,所以训练超过1000次迭代后,理论上你没耐心了可以中断(未测试),不过保险起见最好调整最大训练循环数后再进行测试.

官方的例程可以在Example_Models中的segnet_model_zoo.md中看到说明.

数据集test/train是原图,testannot/trainannot是灰度图,在/Scripts的test_segmentation_camvid.py中有如下代码:

Sky = [128,128,128]
	Building = [128,0,0]
	Pole = [192,192,128]
	Road_marking = [255,69,0]
	Road = [128,64,128]
	Pavement = [60,40,222]
	Tree = [128,128,0]
	SignSymbol = [192,128,128]
	Fence = [64,64,128]
	Car = [64,0,128]
	Pedestrian = [64,64,0]
	Bicyclist = [0,128,192]
	Unlabelled = [0,0,0]

	label_colours = np.array([Sky, Building, Pole, Road, Pavement, Tree, SignSymbol, Fence, Car, Pedestrian, Bicyclist, Unlabelled])
	for l in range(0,11):
		r[ind==l] = label_colours[l,0]
		g[ind==l] = label_colours[l,1]
		b[ind==l] = label_colours[l,2]
		r_gt[label==l] = label_colours[l,0]
		g_gt[label==l] = label_colours[l,1]
		b_gt[label==l] = label_colours[l,2]

故而这里猜测,灰度图中存储的是0~11的数,分别表明相应像素的分类信息.随后在最终输出时用以上程序输出彩色分类图.

接下来将分别对视频识别图片识别进行说明

 

如果想跑官方的视频识别demo,参考caffe-segnet中的ReadMe中Getting Started with Live Demo部分.简短翻译如下:

 

如果你只是想试试样例模型,那么你可以在"Example_Models/"中找到用于 [SegNet webdemo](http://mi.eng.cam.ac.uk/projects/segnet/) 中的模型. 你需要在这里下载对应的segnet_weights_driving_webdemo.caffemodel权重文件并放入Example_Models.

首先打开"Scripts/webcam_demo.py" 并编辑第14行的路径以匹配你的SegNet. 你也需要一个WebCam, 或者也可以编辑第39行以输入一个视频文件.执行程序可以先cd至SegNet文件夹下,然后输入:

python Scripts/webcam_demo.py --model Example_Models/segnet_model_driving_webdemo.prototxt --weights Example_Models/segnet_weights_driving_webdemo.caffemodel --colours Scripts/camvid12.png

注意:以上代码我修改过,这里官方文档中给出的model和color路径中都多了个/,会直接导致报错.尤其是Color,会报如下错误:

  File "Scripts/webcam_demo.py", line 34, in <module>
    label_colours = cv2.imread(args.colours).astype(np.uint8)

很有误导性.

 

接下来,如果有和我一样只是想把手头的图片用SegNet跑出分割并且存储下来的,由于官网的图片程序图片格式变了就出不了效果,而上面视频识别中例程自带图像大小适配,因而对其进行修改即可.

方法很简单,打开/SegNet/Scripts/webcam_demo.py,将

cv2.namedWindow("Input")
cv2.namedWindow("SegNet")
cap = cv2.VideoCapture('/home/inin-h7-blackhole/SegNet/Example_Models/myvideo.mp4') # Change this to your webcam ID, or file name for your video file

rval = True

while rval:
	start = time.time()
	rval, frame = cap.read()

        if rval == False:
            break

	end = time.time()

修改为

cv2.namedWindow("Input")
cv2.namedWindow("SegNet")

inputPath = '/home/inin-h7-blackhole/Stein_private/image_2/'
outputPath = '/home/inin-h7-blackhole/Stein_private/image_2_rgb/'

for i in range(695):
	start = time.time()
	frame = cv2.imread(inputPath+"%06d"%i+'.png')

	end = time.time()

即可.这里inputPath改为你的图片文件所在的文件夹,outputPath改为输出文件夹,而我的图片存储格式为

000000.png  000001.png  000002.png ... 000694.png

所以cv2.imread部分写成这样.请具体按照照片的命名方式做适当修改.

最后,在该文件的末尾

cv2.imshow("SegNet", segmentation_rgb)

之后添加

cv2.imwrite(outputPath+"%06d"%i+'.png',segmentation_rgb*255)

即可输出至对应文件夹存储.这里*255是因为segmentation_rgb在之前进行了归一化处理,这里需要还原.

如此便获得了每张图像语义分割后的对应图像.不过这里的输出图像均为480x360,故而如果需要点对点的同学建议还是把输入也改成对应大小.

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值