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,故而如果需要点对点的同学建议还是把输入也改成对应大小.