POSTS
AMD社製GPUとTensorFlow1.3を用いた領域認識(Semantic Segmentation)
Introduction
Source | YoloV2(Object Detection) | FCN(Semantic Segmentation) |
---|---|---|
Deep Learningにおける領域認識(Semantic Segmentation)ではよく話にでるネットワークとして、U-Net(2015)、FCN(2015)、PSPNet(2017)があります。今回はAMD社製 Radeon GPUを用いてそれらを動かしてみたいと思います。
使用するフレームワークは、AMD TensorFlow1.3, ROCm1.7.137を使用します。※2018年4月16日現在の最新バージョン hellochick ← 台湾人開発者のリポジトリからソースをお借りします。
https://github.com/hellochick/semantic-segmentation-tensorflow
Setup TensorFlow 1.3 on AMD Radeon GPU
最近、HIP-TensorFlow1.0.1から1.3へアップデートされ、同時に名前がのHIPという部分が取れてリポジトリも別になりました。同時に、旧HIP-TensorFlowのリポジトリが見えなくなっています。旧HIP−TensorFlowはこちらのリポジトリですがすでにリンク切れになっています。HIPって何?TensorFlowとは別物なの?という声も多かったので個人的には歓迎です。 https://github.com/ROCmSoftwarePlatform/hiptensorflow
一方で、新しいTensorFlowはなんと呼べば良いかわからないので、今回はAMD TensorFlowという風に呼びたいと思います。 https://github.com/ROCmSoftwarePlatform/tensorflow
以下のコマンドにて、Python3上にAMD TensorFlow1.3を簡単に構築できます。なおOpenCV3.3.0、ビデオコーデック、CythonやPillowイメージ等々も含まれます。
curl -sL http://install.aieatr.com/setup_rocm_tensorflow_p3
[Ubuntu16.04用]
Semantic Segmentation
git clone https://github.com/hellochick/semantic-segmentation-tensorflow
gitリポジトリのReadmeに書いてある、FCNの学習済みモデルを持ってきます。 Google Drive - FCN(fcn.npy)
semantic-segmentation-tensorflow/model/fcn.npy として設置します。
PSPNetの場合は、 semantic-segmentation-tensorflow/model/pspnet50.npy
ICNetの場合は、 semantic-segmentation-tensorflow/model/cityscapes/icnet.npy として、cityspaces以下に設置します。
実行
semantic-segmentation-tensorflow/input以下にテスト用の画像が含まれますので、それをFCNモデルと一緒に指定して実行します。
python3 inference.py --model fcn --img-path input/indoor_1.jpg
以下に出力されます。 semantic-segmentation-tensorflow/output/fcn_indoor_1.jpg
リアルタイム性の強いICNetにしたければ、
python3 inference.py --model icnet --img-path input/indoor_1.jpg
とするだけです。
カメラから読み取ったものをリアルタイムに処理する場合は、model.load(path)の中身を書き換える必要があるので、semantic-segmentation-tensorflow/tools.pyファイルを開いて、
def load_img(img_path):
if os.path.isfile(img_path):
print('successful load img: {0}'.format(img_path))
else:
print('not found file: {0}'.format(img_path))
sys.exit(0)
filename = img_path.split('/')[-1]
img = misc.imread(img_path, mode='RGB')
return img, filename
を以下に修正すれば、numpy形式が受け取れるようになります。
def load_img(img_path):
if type(np.array(img_path)).__module__ == np.__name__:
return img_path, "np"
if os.path.isfile(img_path):
print('successful load img: {0}'.format(img_path))
else:
print('not found file: {0}'.format(img_path))
sys.exit(0)
filename = img_path.split('/')[-1]
img = misc.imread(img_path, mode='RGB')
return img, filename
以下のソースをmain.pyにして実行すれば、カメラからリアルタイムに出力する事ができます。 Cameraデバイス、デスクトップ環境、OpenCV3.3.0が揃っている必要があります。
import tensorflow as tf
from model import FCN8s, PSPNet50, ICNet, ENet
import cv2
import time
import sys
import numpy as np
# Parameters
model_name = 'icnet'
camera_num = 0
model_table = {}
model_table['icnet'] = {"module":ICNet, "path":"model/icnet.npy"}
model_table['fcn'] = {"module":FCN8s, "path":"model/fcn.npy"}
model_table['pspnet'] = {"module":PSPNet50, "path":"model/pspnet50.npy"}
if len(sys.argv) == 2: model_name = sys.argv[1]
print("Open TensorFlow session and initialize")
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
print("Selected model => " + model_name)
param = model_table[model_name]
model = param['module']()
model.load(param['path'], sess)
print("Start camera")
cap = cv2.VideoCapture(camera_num)
print("Initialized capture device.")
while cap.isOpened():
check, frame = cap.read()
print(check)
if check:
left = frame.copy()
right = frame.copy()
model.read_input(left)
print("Input")
left = model.forward(sess)[0]
print("Forward")
left = cv2.resize(left,(frame.shape[1],frame.shape[0]))
left += left
left += right
left /= 3
left = cv2.resize(left,(2*left.shape[1],2*left.shape[0]))
left = np.array(left, dtype = 'uint8')
cv2.imshow(model_name,left)
cv2.waitKey(1)
print("Show")
SemanticSegmentationの場合は、教師データを作るのが地獄ですが、ObjectDetectionよりもネットワークはシンプルなものが多くて助かります。
Source | YoloV2(Object Detection) | FCN(Semantic Segmentation) |
---|---|---|
Source | YoloV2(Object Detection) | FCN(Semantic Segmentation) |
---|---|---|
Source | YoloV2(Object Detection) | FCN(Semantic Segmentation) |
---|---|---|
References
- ROCm-TensorFlow https://github.com/ROCmSoftwarePlatform/tensorflow
- ROCm https://github.com/RadeonOpenCompute/ROCm
- MIOpen https://gpuopen.com/compute-product/miopen/
- GPUEater https://www.gpueater.com/help#hiptensorflow
- OpenCV https://github.com/opencv
- hellochick repos https://github.com/hellochick/semantic-segmentation-tensorflow
エンジニア募集中
GPU EATERの開発を一緒に行うメンバーを募集しています。
特にディープラーニング研究者、バックエンドエンジニアを積極採用中です。
募集職種はこちら
GPU EATER - AMD GPU-based Deep Learning Cloud
- Cloud
- GPU
- AMD
- ROCm
- DeepLearning
- TensorFlow
- HIP-TensorFlow
- FCN
- ICNET
- PSPNet
- Semantic Segmentation
- Image Recognition