Ubuntu14.04(CPU only)でSegNetを使ってみる
手順
- caffe-segnetのダウンロード
git clone https://github.com/alexgkendall/caffe-segnet.git
- 以下の手順でインストール
- 以下の手順でMakeコンパイル
CPU only の設定に変更
For CPU-only Caffe, uncomment CPU_ONLY := 1 in Makefile.config.
- python のパスの設定
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
- 実行結果
参考: