空飛ぶロボットのつくりかた

ロボットをつくるために必要な技術をまとめます。ロボットの未来についても考えたりします。

Ubuntu14.04(CPU only)でSegNetを使ってみる

手順

  • caffe-segnetのダウンロード
git clone https://github.com/alexgkendall/caffe-segnet.git
  • 以下の手順でインストー

Caffe | Installation: Ubuntu

CPU only の設定に変更

Caffe | Installation

For CPU-only Caffe, uncomment CPU_ONLY := 1 in Makefile.config.

caffe-segnetの中のpythonフォルダ

export PYTHONPATH={適切なpathの設定}/caffe-segnet/python:$PYTHONPATH 
cd /
git clone https://github.com/alexgkendall/SegNet-Tutorial.git
mv SegNet-Tutorial SegNet
cd /SegNet/Example_Models
wget http://mi.eng.cam.ac.uk/projects/segnet/models/segnet_weights_driving_webdemo.caffemodel
  • サンプルプログラムを以下のように修正

SegNet/Script/webcam_demo.pyを写真から読みこむ設定に変更

名前はpicture_demo.pyに変更

import numpy as np
import matplotlib.pyplot as plt
import os.path
import scipy
import argparse
import math
import cv2
import sys
import time

sys.path.append('/usr/local/lib/python2.7/site-packages')
# Make sure that caffe is on the python path:
caffe_root = '/SegNet/caffe-segnet/'
sys.path.insert(0, caffe_root + 'python')
import caffe

# Import arguments
parser = argparse.ArgumentParser()
parser.add_argument('--model', type=str, required=True)
parser.add_argument('--weights', type=str, required=True)
parser.add_argument('--colours', type=str, required=True)
args = parser.parse_args()

net = caffe.Net(args.model,
                args.weights,
                caffe.TEST)

#caffe.set_mode_gpu()

input_shape = net.blobs['data'].data.shape
output_shape = net.blobs['argmax'].data.shape

label_colours = cv2.imread(args.colours).astype(np.uint8)

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

cap = cv2.VideoCapture(0) # Change this to your webcam ID, or file name for your video file

rval = True

start = time.time()
frame = cv2.imread('rimocon.jpg', 1)

end = time.time()
print '%30s' % 'Grabbed camera frame in ', str((end - start)*1000), 'ms'

start = time.time()
frame = cv2.resize(frame, (input_shape[3],input_shape[2]))
print frame.shape
input_image = frame.transpose((2,0,1))
print input_image.shape
input_image = np.asarray([input_image])
end = time.time()
print '%30s' % 'Resized image in ', str((end - start)*1000), 'ms'

start = time.time()
out = net.forward_all(data=input_image)
end = time.time()
print '%30s' % 'Executed SegNet in ', str((end - start)*1000), 'ms'

start = time.time()
segmentation_ind = np.squeeze(net.blobs['argmax'].data)
segmentation_ind_3ch = np.resize(segmentation_ind,(3,input_shape[2],input_shape[3]))
segmentation_ind_3ch = segmentation_ind_3ch.transpose(1,2,0).astype(np.uint8)
segmentation_rgb = np.zeros(segmentation_ind_3ch.shape, dtype=np.uint8)

cv2.LUT(segmentation_ind_3ch,label_colours,segmentation_rgb)
segmentation_rgb = segmentation_rgb.astype(float)/255

end = time.time()
print '%30s' % 'Processed results in ', str((end - start)*1000), 'ms\n'


cv2.imshow("Input", frame)
cv2.imshow("SegNet", segmentation_rgb)

while rval:
    key = cv2.waitKey(1)
    if key == 27: # exit on ESC
        break
cap.release()
cv2.destroyAllWindows()
  • サンプルの実行
python picture.py --model /SegNet/Example_Models/segnet_model_driving_webdemo.prototxt --weights /SegNet/Example_Models/segnet_weights_driving_webdemo.caffemodel --colours /SegNet/Scripts/camvid12.png
  • 実行結果

参考:

SegNet

OpenCV 備忘録: SegNetをUbuntuで試してみた