python-logo-master-v3-TM

struct2depthとは、Google Brainが開発した、単眼カメラから深度とエゴモーション(カメラ自身の動き)を推定する手法です。

仮想環境(VirtualBox)を使ってまっさらの環境から動くところまでです。

環境
OS: Ubuntu18.04LTS
Python 2.7.17
Tensorflow 1.12.0
Opencv 4.4.0-pre

まず以下の順番で必要なライブラリをインストールしていきます。

sudo apt install python-pip
pip install --upgrade pip
pip install absl-py
pip install numpy
pip install tensorflow==1.12.0
pip install matplotlib

つぎにgithubからstruct2depthをcloneします。
tensorflow/models: Models and examples built with TensorFlow

git clone https://github.com/tensorflow/models.git

struct2depthはresearch/struct2depthにあります。
そのディレクトリに、inputとoutputというディレクトリを作る。

SnapCrab_No-0000

学習済みのモデルをダウンロードする。

KITTIで学習したモデル
struct2depth_model_kitti.tar.gz - Google ドライブ
Cityscapesで学習したモデル
struct2depth_model_cityscapes.tar.gz - Google ドライブ

これらのモデルはmodelディレクトリに格納します。
SnapCrab_No-0001

inputディレクトリにgoogleストリートビューで拾ってきた適当な画像を格納します。

SnapCrab_No-0002

なお、対応拡張子はpngです。
inputの中には階層分けされたデータセットを入れても、正常に処理されます。

ここまでできたら推論の開始、struct2depthのルートに戻って以下のコマンドを実行します。
この場合KITTIのモデルを使用しています。
python inference.py --logtostderr --file_extension png --depth --egomotion true --input_dir input --output_dir output --model_ckpt model/model-199160

ここで、自分の環境では実行時に下記のエラーが発生しました。
locale.Error: unsupported locale setting
です。

これを解決するための情報はこちらにありました。

fixed script relative link by bigsnarfdude · Pull Request #58 · tensorflow/models

Changing line 236 in util.py
locale.setlocale(locale.LC_ALL, 'en_US') to locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
solves the problem for me.

書かれている通り、struct2depth/util.pyのlocale.setlocale(locale.LC_ALL, 'en_US')を変更しましょう。

# locale.setlocale(locale.LC_ALL, 'en_US')
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')

気を取り直してもう一度推論の開始。
python inference.py --logtostderr --file_extension png --depth --egomotion true --input_dir input --output_dir output --model_ckpt model/model-199160

無事、解析が終わりました。
1

2

結構距離の推測ができている感じです。

主に下記URLの情報を参考にさせていただきました。
非常に助かりました。ありがとうございます。
struct2depth(距離推定)を動かしてみた - ハードウェア技術者のスキルアップ日誌




python-logo-master-v3-TM

画像に対してAIを使って何が映っているのかを判断させる。
SSD KERASというオープンソースのソフトウェアを使う。

VirtualBoxを使ってUbuntu16.04LTSをインストール。
まっさらな環境から主に下記URLの通りの手順を踏んでインストール。

pip3のインストール & アップグレード

$ sudo apt-get install python3-pip python3-dev
$ pip3 install --upgrade pip

TensorFlowのインストール

$ pip3 install tensorflow==1.1.0

KERASのインストール

$ sudo pip3 install keras==1.2.2

matplotlibのインストール

$ pip3 install matplotlib

opencvのインストールに必要なパッケージを取得

$ sudo apt-get install --assume-yes build-essential cmake git
$ sudo apt-get install --assume-yes build-essential pkg-config unzip ffmpeg qtbase5-dev python-dev python3-dev python-numpy python3-numpy
$ sudo apt-get install --assume-yes libopencv-dev libgtk-3-dev libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev
$ sudo apt-get install --assume-yes libavcodec-dev libavformat-dev libswscale-dev libxine2-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev
$ sudo apt-get install --assume-yes libv4l-dev libtbb-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev
$ sudo apt-get install --assume-yes libvorbis-dev libxvidcore-dev v4l-utils

opencvのコードを取得

$ git clone https://github.com/opencv/opencv.git
$ cd opencv

opencvのビルド。この作業、私の環境では2時間くらいかかった。

$ mkdir build
$ cd build/
$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D WITH_V4L=ON -D WITH_QT=ON -D WITH_OPENGL=ON -D WITH_CUBLAS=ON -DCUDA_NVCC_FLAGS="-D_FORCE_INLINES" ..    
$ make -j $(($(nproc) + 1))

opencvのインストール

$ sudo make install
$ sudo /bin/bash -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'
$ sudo ldconfig
$ sudo apt-get update

ssd_kerasのダウンロード

$ git clone https://github.com/rykov8/ssd_keras.git
$ cd ssd_keras

学習モデルのダウンロード
下記サイトより
rykov8/ssd_keras: Port of Single Shot MultiBox Detector to Keras

このhereから

スクリーンショット 2020-07-02 14.52.33

このファイルをダウンロードする。

スクリーンショット 2020-07-02 14.52.46

ダウンロードした学習モデルは、ssd_kerasのディレクトリの中に配置。
この時、ssd_kerasのディレクトリは下記の通りの構成になっている。

LICENSE
PASCAL_VOC
README.md
SSD.ipynb
SSD_training.ipynb
__pycache__
gt_pascal.pkl
main.py
pics
prior_boxes_ssd300.pkl
ssd.py
ssd_layers.py
ssd_training.py
ssd_utils.py
testing_utils
weights_SSD300.hdf5

ここからjupyter notebookをインストールすると参考のサイトには書いてあったが、自分の環境ではjupyterを使ったコードの実行はできなかった。
なので、jupyterに使われていたコードを編集して、一つのプログラムにして実行した。

その際使ったプログラムは下記のとおり

main.py

from keras.applications.imagenet_utils import preprocess_input
from keras.backend.tensorflow_backend import set_session
from keras.preprocessing import image
import matplotlib.pyplot as plt
import numpy as np
from scipy.misc import imread
import tensorflow as tf

from ssd import SSD300
from ssd_utils import BBoxUtility

import glob

picture_dir = './pics'

def make_file_list()-> []:
    result = []
    files = glob.glob('{}/**'.format(picture_dir), recursive=True)
    for f in files:
        if f[-3:] == 'jpg':
            result.append(f)
    return result

def extract_file_name(path:str)-> str:
    idx = path.rfind('/')
    name = path[idx + 1:]
    idx = name.rfind('.')
    result = name[:idx]
    return result

def extract_file_path(path:str)-> str:
    result = path.split('/')[-2]
    # filename = path.split('/')[-1]
    # result = '{}/{}'.format(dir, filename)
    return result


#matplotlib inline
plt.rcParams['figure.figsize'] = (8, 8)
plt.rcParams['image.interpolation'] = 'nearest'

np.set_printoptions(suppress=True)

config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.45
set_session(tf.Session(config=config))

voc_classes = ['Aeroplane', 'Bicycle', 'Bird', 'Boat', 'Bottle',
               'Bus', 'Car', 'Cat', 'Chair', 'Cow', 'Diningtable',
               'Dog', 'Horse','Motorbike', 'Person', 'Pottedplant',
               'Sheep', 'Sofa', 'Train', 'Tvmonitor']

# voc_classes = ['Bird', 'Bus', 'Car', 'Cat','Cow', 'Dog', 'Motorbike', 'Person', 'Sheep']

NUM_CLASSES = len(voc_classes) + 1

input_shape=(300, 300, 3)
model = SSD300(input_shape, num_classes=NUM_CLASSES)
model.load_weights('weights_SSD300.hdf5', by_name=True)
bbox_util = BBoxUtility(NUM_CLASSES)


# files = glob.glob('./pics/dataset/**', recursive=True)
inputs = []
images = []
files = make_file_list()
for f in files:
    # filenames.append(extract_file_name(f))
    img_path = f
    img = image.load_img(img_path, target_size=(300, 300))
    img = image.img_to_array(img)
    images.append(imread(img_path))
    inputs.append(img.copy())


inputs = preprocess_input(np.array(inputs))
preds = model.predict(inputs, batch_size=1, verbose=1)

results = bbox_util.detection_out(preds)

#%%time
a = model.predict(inputs, batch_size=1)
b = bbox_util.detection_out(preds)

idx = 0
for i, img in enumerate(images):
    # Parse the outputs.
    det_label = results[i][:, 0]
    det_conf = results[i][:, 1]
    det_xmin = results[i][:, 2]
    det_ymin = results[i][:, 3]
    det_xmax = results[i][:, 4]
    det_ymax = results[i][:, 5]

    # Get detections with confidence higher than 0.6.
    top_indices = [i for i, conf in enumerate(det_conf) if conf >= 0.6]

    top_conf = det_conf[top_indices]
    top_label_indices = det_label[top_indices].tolist()
    top_xmin = det_xmin[top_indices]
    top_ymin = det_ymin[top_indices]
    top_xmax = det_xmax[top_indices]
    top_ymax = det_ymax[top_indices]

    colors = plt.cm.hsv(np.linspace(0, 1, 21)).tolist()

    plt.imshow(img / 255.)
    currentAxis = plt.gca()
    # f = open('{}/{}/labels.txt'.format(picture_dir, extract_file_path(files[idx])), mode='a')
    for i in range(top_conf.shape[0]):
        xmin = int(round(top_xmin[i] * img.shape[1]))
        ymin = int(round(top_ymin[i] * img.shape[0]))
        xmax = int(round(top_xmax[i] * img.shape[1]))
        ymax = int(round(top_ymax[i] * img.shape[0]))
        score = top_conf[i]
        label = int(top_label_indices[i])
        label_name = voc_classes[label - 1]
        display_txt = '{:0.2f}, {}'.format(score, label_name)
        coords = (xmin, ymin), xmax-xmin+1, ymax-ymin+1
        color = colors[label]
        currentAxis.add_patch(plt.Rectangle(*coords, fill=False, edgecolor=color, linewidth=2))
        currentAxis.text(xmin, ymin, display_txt, bbox={'facecolor':color, 'alpha':0.5})

        # f.write('{} -> {} : {:0.2f}\n'.format(extract_file_name(files[idx]), str(label_name), score))

    # f.close()
    plt.show()
    idx += 1

なお、このプログラムを実行すると、python3-tkが足りないと言われるのでこれをインストール

sudo apt install python3-tk

さらに、cannot import name 'imread'というエラー
これは、scipyのバージョンが違う場合に発生するらしい。
ついてはscipyのバージョンを指定してインストール

pip3 install scipy==1.1.0

h5pyが足りないと言われる場合もある。

pip3 install h5py

これにて動作確認。

人間は結構取れる。
SnapCrab_No-0065

でもちょっと意地悪するとこんな感じ。

スクリーンショット 2020-07-02 15.00.25

上記の工程は主に下記のサイト様を参考にしてやらせていただきました。
本当に助かりました。感謝致します。

映像からの物体検出(SSD_Keras)に挑戦 for ubuntu | AI coordinator




python-logo-master-v3-TM

単眼カメラの画像に対してAIを使って深度の推定をする。
FCRN-DepthPredictionというオープンソースのソフトウェアを使う。

VirtualBoxを使ってUbuntu16.04LTSをインストール。
まっさらな環境から主に下記URLの通りの手順を踏んでインストール。

$ git clone https://github.com/iro-cp/FCRN-DepthPrediction.git
$ cd FCRN-DepthPrediction

virtualenvを使って、Pythonの仮想環境を使って作業を勧めていく。

# sudo apt install virtualenv
$ virtualenv -p python 3.5 python 3.5
$ source 3.5/bin/activate
(python3.5)$

必要なパッケージのインストール

(python3.5)$ pip install tensorflow==1.15.0
(python3.5)$ pip install opencv-python
(python3.5)$ pip install matplotlib
(python3.5)$ pip install Pillow
(python3.5)$ pip install numpy
(python3.5)$ pip install argparse

深度計算の学習済みモデルを取得、展開

(python3.5)$ cd tensorflow/models
(python3.5)$ wget http://campar.in.tum.de/files/rupprecht/depthpred/NYU_FCRN-checkpoint.zip
(python3.5)$ unzip NYU_FCRN-checkpoint.zip

この時点でtensorflow/modelにあるファイル一覧

__init__.py
fcrn.py
NYU_FCRN.ckpt.index
__pycache__
fcrn.cpython-35.pyc
__init__.cpython-35.pyc
network.cpython-35.pyc
NYU_FCRN.ckpt.meta
NYU_FCRN.ckpt.data-00000-of-00001
network.py
NYU_FCRN-checkpoint.zip

tensorflowディレクトリに戻り、実行する

(python3.5)$ cd ..  ([クローンしたトップディレクトリ]/tensorflow に移動)
(python3.5)$ ls     (下記のファイル/フォルダがあるはず)
models                predict.py
(python3.5)$ python predict.py models/NYU_FCRN.ckpt [入力画像のファイルパス]

ここで、PythonのTK_interがないというエラーが出た。
これはpipではなく、aptを使ってインストールする。

$ sudo apt-get install python3-tk

無事動作を確認。

SnapCrab_No-0062

下記URLを参考にさせていただきました。

Tensorflowの深度推定モデルを試してみる - Qiita

非常に助かりました。
ありがとうございます。