最短でラズパイにTensorFlow2.3.0とKeras2.4.3インストールしFashion-MNISTする方法

2021/05/14

IoT Python ガジェット ラズパイ 開発

Fashion MNIST実行結果

こんにちはイチケンです。

ラズパイ+RealSenseでAI物体検出と距離計測をやろうと思っています。そこで必要となるTensorFlowをインストールして行きたいと思います。TensorFlowといえばライブラリ依存関係が強すぎてちょっとバージョン違うとうまく行かなかったりで面倒ですよね。

RealSense公式サンプルコードのバージョン2.3.0をインストールするため、いくつかの記事を参考に試したのですがどれも一発ではうまくいかず。試行錯誤した結果、私の環境で一発でいける方法にたどり着きましたので紹介します。

この記事でわかること

ラズパイにTensorFlow 2.3.0とKeras 2.4.3をインストールしFashion-MNISTで学習と分類推定出力する最短方法がわかります。

  • ラズパイにTensorFlow2.3.0とKeras 2.4.3をインストールする方法
  • Fashion-MNISTを使った機械学習と推定出力

前提条件

まず前提条件となる私の環境です。

  • Raspberry Pi 4 Model B 8GB
  • Raspberry Pi OS 32bit (Linux arm 5.10.17-v7l+, Raspbian 8.3.0-6+rpi1)
  • Visual Studio Code ver 1.55.2
  • Python 3.7.3
  • TensorFlow 2.3.0
  • Keras 2.4.3

TensorFlowインストール

それではサクサクインストールしていきましょう。最終的にはこのサイトのやり方をアレンジすることで成功しています。

Installing Tensorflow 2.3.0 Raspberry Pi3+/4 (Debian Buster)

アップデート

まずはラズパイまわりを最新版にアップデート。

sudo apt update
sudo apt upgrade
sudo apt clean

pipアップデートと依存ライブラリインストール

次にpipまわりをアップデートして依存関係にあるライブラリをインストールします。numpyは最新にすると「互換なし」のエラーが出るので1.19.0を指定するのがよいでしょう。

どの項目も数秒から1分程度です。

pip install --upgrade pip
pip3 install --upgrade setuptools
pip3 install numpu==1.19.0
sudo apt install -y libhdf5-dev libc-ares-dev libeigen3-dev gcc gfortran python-dev libgfortran5 libatlas3-base libatlas-base-dev libopenblas-dev libopenblas-base libblas-dev liblapack-dev cython libatlas-base-dev openmpi-bin libopenmpi-dev python3-dev
pip3 install keras_applications==1.0.8 --no-deps
pip3 install keras_preprocessing==1.1.0 --no-deps
pip3 install h5py==2.9.0
pip3 install pybind11
pip3 install -U --user six wheel mock

TensorFlowとKerasインストール

いよいよTensorFlowをいれていきます。所要時間は15分くらいです。

wget "https://raw.githubusercontent.com/PINTO0309/Tensorflow-bin/master/tensorflow-2.3.0-cp37-none-linux_armv7l_download.sh"
sudo chmod +x tensorflow-2.3.0-cp37-none-linux_armv7l_download.sh
./tensorflow-2.3.0-cp37-none-linux_armv7l_download.sh
TensorFlowのダウンロード

別のバージョンをすでにインストールしている場合はアンインストールする

pip3 uninstall tensorflow

TensorFlow 2.3.0をインストール。

pip3 install tensorflow-2.3.0-cp37-none-linux_armv7l.whl

importテスト

Python3でTensorFlowをimportしてみます。何もエラーが出なければインストール成功です。

python3
import tensorflow
tensorflow.__version__
exit()

'2.3.0'と表示されるはずです。では最後にKeras 2.4.3をインストールします。

pip3 install keras

同様にimportしてみましょう。

python3
import keras
keras.__version__
exit()

問題なければバージョン'2.4.3'が表示されます。

TensorFlowとKerasのimport確認

Fashion-MNISTテスト

では機械学習界のHello worldことFashion-MNISTをテストしてみましょう。本家のサイトはこちら。

はじめてのニューラルネットワーク:分類問題の初歩

表示にmatplotlibを使っているので、ない人はまずこれを入れましょう。

sudo apt install python3-matplotlib

VSCode( インストール方法はこちら )などへ以下のコードをコピペして実行。数分で学習から結果出力まで終わります。解説は本家の日本語翻訳サイトにありますので割愛。従来のMNISTと比べて、Fashion-MNISTの方がやったった感がありますよね(笑)

import tensorflow as tf
import keras

# ヘルパーライブラリのインポート
import numpy as np
import matplotlib.pyplot as plt

print(f'TensorFlow: {tf.__version__}')
print(f'Keras: {keras.__version__}')

fashion_mnist = keras.datasets.fashion_mnist

(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

# データチェック
train_images.shape
len(train_labels)
train_labels
test_images.shape
len(test_labels)

# 前処理
plt.figure()
plt.imshow(train_images[0])
plt.colorbar()
plt.grid(False)
plt.show()

train_images = train_images / 255.0
test_images = test_images / 255.0

# フォーマット確認
plt.figure(figsize=(10,10))
for i in range(25):
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(train_images[i], cmap=plt.cm.binary)
    plt.xlabel(class_names[train_labels[i]])
plt.show()

# モデル構築
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])

# モデルコンパイル
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy',metrics=['accuracy'])

# 訓練
model.fit(train_images, train_labels, epochs=5)

# 評価
test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)
print('\nTest accuracy:', test_acc)


# 予測
predictions = model.predict(test_images)
predictions[0]
np.argmax(predictions[0])
test_labels[0]

def plot_image(i, predictions_array, true_label, img):
    predictions_array, true_label, img = predictions_array[i], true_label[i], img[i]
    plt.grid(False)
    plt.xticks([])
    plt.yticks([])

    plt.imshow(img, cmap=plt.cm.binary)

    predicted_label = np.argmax(predictions_array)
    if predicted_label == true_label:
        color = 'blue'
    else:
        color = 'red'

    plt.xlabel("{} {:2.0f}% ({})".format(class_names[predicted_label],
                                    100*np.max(predictions_array),
                                    class_names[true_label]),
                                    color=color)

def plot_value_array(i, predictions_array, true_label):
    predictions_array, true_label = predictions_array[i], true_label[i]
    plt.grid(False)
    plt.xticks([])
    plt.yticks([])
    thisplot = plt.bar(range(10), predictions_array, color="#777777")
    plt.ylim([0, 1]) 
    predicted_label = np.argmax(predictions_array)

    thisplot[predicted_label].set_color('red')
    thisplot[true_label].set_color('blue')

i = 0
plt.figure(figsize=(6,3))
plt.subplot(1,2,1)
plot_image(i, predictions, test_labels, test_images)
plt.subplot(1,2,2)
plot_value_array(i, predictions,  test_labels)
plt.show()

i = 12
plt.figure(figsize=(6,3))
plt.subplot(1,2,1)
plot_image(i, predictions, test_labels, test_images)
plt.subplot(1,2,2)
plot_value_array(i, predictions,  test_labels)
plt.show()


# X個のテスト画像、予測されたラベル、正解ラベルを表示します。
# 正しい予測は青で、間違った予測は赤で表示しています。
num_rows = 5
num_cols = 3
num_images = num_rows*num_cols
plt.figure(figsize=(2*2*num_cols, 2*num_rows))
for i in range(num_images):
    plt.subplot(num_rows, 2*num_cols, 2*i+1)
    plot_image(i, predictions, test_labels, test_images)
    plt.subplot(num_rows, 2*num_cols, 2*i+2)
    plot_value_array(i, predictions, test_labels)
plt.show()

# テスト用データセットから画像を1枚取り出す
img = test_images[0]

print(img.shape)

# 画像を1枚だけのバッチのメンバーにする
img = (np.expand_dims(img,0))

print(img.shape)

predictions_single = model.predict(img)

print(predictions_single)

plot_value_array(0, predictions_single, test_labels)
_ = plt.xticks(range(10), class_names, rotation=45)

np.argmax(predictions_single[0])

# MIT License
#
# Copyright (c) 2017 François Chollet
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.

実行すると最終的にこのような結果が得れます。

最後に

いかがでしたか?この記事が皆さんのお役に立てれば幸いです。

現場で使える生きたプログラミングスキルを身に着けるなら、現役エンジニアから学ぶのが最速ですね!

スポンサーリンク

フォロワー

Labels

Amazon (3) Apache (3) Apple (9) AppleSilicon (7) Bloggerカスタマイズ (12) EchoShow15 (1) IoT (25) Jetson (1) MySQL (1) PHP (3) Python (20) Web (3) アウトドア (11) アメリカ生活 (19) ガジェット (35) キャンプ (9) ディープラーニング (1) らずキャン△ (11) ラズパイ (24) 暗号資産 (5) 開発 (31) 旅行 (8)

QooQ