2019年12月3日火曜日

Raspberry Pi で YOLO v3-Tiny / YOLO v3 による物体検出を試してみよう

以下は、古くなったのでサポートを停止した情報です。代替ページとして「Raspberry Pi 5 でリアルタイムな姿勢推定と物体検出」をお勧めします。

1. 物体検出とは何か

本ページでは、Rapsberry Pi で「物体検出」を行う方法を紹介します。「物体検出」とは何かを知るには、下図の画像を見るのがわかりやすくて良いでしょう。


机の上にキーボード、カッター、カップ、マウスが置かれており、その写真に物体検出を適用した結果、物体の位置、大きさ、種類が表示されています。 図ではわかりにくいですが、検出された物体にそれぞれキーボード、ナイフ、カップ、マウスという名称が英語で記されています。

なお、「カッター」が「ナイフ」と検出されている理由は後に解説しますが、一言で言えば「学習データにカッターが含まれていないから」です。

物体検出には様々な方法がありますが、本ページで用いる物体検出は、本書で紹介した CNN (畳み込みニューラルネットワーク) の技術が使われたものです。
しかし、下図に示したように通常のCNNと物体検出では大きく異なる点があります。


通常のCNNでは、上図(A)のように画像中に一つの対象が記されており、その画像が属するクラス(「2」や「カップ」と言った分類先)が出力されます。

一方、物体検出では上図(B)のように、一枚の画像中に複数の物体が存在することがあり得ます。そして、それぞれの物体のクラスだけではなく位置や大きさも出力されねばなりません。

2. YOLOとは何か

この物体検出に CNN (畳み込みニューラルネットワーク) の考え方を応用した手法がいくつか提案されており、本ページで紹介するのはそのうちの一つである YOLO です。
YOLO(You Only Look Once、一度だけ見る)は 2016 年に J. Redmon らにより提案された手法です。 オリジナルの論文はこちらから入手できます。

You only look once とは、英語表現 You only live once(一度だけの人生)をもじったものと考えられます。「一度だけ見る」とは、YOLO では一枚の画像に対する認識に CNN の計算を一度だけ実行すれば良いことを示しています。
物体検出に CNN を用いる他の手法では、一枚の画像に対する認識時に何度も CNN の計算を行わねばならなかったことと対比しているのだと思われます。

通常の CNN の出力層ではソフトマックス関数により入力が属するクラスを出力します。詳細は省略しますが、YOLO では出力層に機械学習の回帰の考え方を適用し、物体の位置や大きさに関わる量も出力できるようにします。それにより、物体検出を可能にしているのです。

なお、執筆時点で YOLO にはバージョン 1 からバージョン 3 が存在します。本ページでは YOLO バージョン 3 を実行する方法を紹介します。

バージョンごとに性能が向上されている他に、学習時に用いられたデータが異なるという特徴があります。それにより、認識される物体の種類が異なるのです。
YOLO バージョン 1 ではクラス数 20 の Pascal VOC 2007 といううデータセットが用いられています。20 種類の物体を検出できるということです。その性能を向上させた YOLO バージョン 2 ではImageNet と COCO という 2 つのデータセットを組み合わせてクラス数 9000 の認識が可能な YOLO9000 というネットワークを実装しています。

そして、本ページで用いる用いた YOLO バージョン 3 では COCO というデータセットを用いてクラス数 80 の認識が可能です。80 種類のクラスをこちらでみることができます。

上で見た図で、カッターを「ナイフ」と認識しているのは「カッター」のデータがデータセットに含まれていなかったであると既に述べましたが、それは上のリンクにあるクラス一覧で確認することができます。

なお、これらの「学習済ネットワーク」から出発して新たなデータを学習させる「転移学習」という方法もありますが、本ページでは取り扱いません。

また、通常 YOLO で用いる CNN は、何十個もの畳み込み層と 2 個の全結合層を持ちます。これをそのまま Raspberry Pi の計算能力で実行するのはやや荷が重いといえます。そのため、本ページでは畳み込み層の数を十個程度に減らした YOLO の簡易版である Tiny YOLO の実行方法も紹介します。

Raspberry Pi 3までをお使いの方はこの Tiny YOLO を利用すると良いでしょう。 高速な Raspberry Pi 4 をお使いの方は通常の YOLO もあわせてチャレンジしてみましょう。

また、本ページの続編的なページとして、物体検出の高速化に関連する「Raspberry Pi + Coral USB Accelerator + TensorFlow Lite で物体検出と姿勢推定を試してみよう」もありますので合わせてご覧ください。Coral USB Acceleratorをお持ちでない場合も演習を実行できます。

3. Python3 用の TensorFlow と OpenCV のインストール

さて、YOLO および Tiny YOLO を実行するためには、Python3 用の TensorFlow および OpenCV のインストールが必要です。本書の補足ページの下記ページに従い、Python3 用の TensorFlow および OpenCV をインストールして下さい。 なお、本ページの内容を Anaconda で実行したい方は「本書の演習を Anaconda の Spyder で実行する方法」を参考にしてください。

さて、ここからは以下の流れで解説が進みます。 TensorFlow 1 系に比べて TensorFlow 2 系の解説は簡易的となっておりますのでご了承ください。

1. [TensorFlow 2 系] プログラムのダウンロードから実行まで

TensorFlow 2 系で行うための方法を記します。簡易的な解説となっていますのでご了承ください。

まず、プログラムをダウンロードするには下記のコマンドを実行して下さい。cedrickchee氏のプログラムに筆者が手を加えたファイルがダウンロードされます。TensorFlow 1 系とは別のプログラムを用いていることにもご注意ください。
git clone https://github.com/neuralassembly/tensorflow2-yolo-v3
プログラムのダウンロードが終わったら、下記コマンドを実行し、tensorflow2-yolo-v3 ディレクトリ(フォルダ)内に移動します。
cd tensorflow2-yolo-v3
そして、下記の4つのコマンドを実行し、YOLOv3用の重みをダウンロ―ドし、さらにそれを TensorFlow 用に変換します。前半 2 つが通常の YOLO 用のコマンド、後半 2 つが tiny YOLO 用のコマンドです。
wget https://pjreddie.com/media/files/yolov3.weights -O data/yolov3.weights
python3 convert.py

wget https://pjreddie.com/media/files/yolov3-tiny.weights -O data/yolov3-tiny.weights
python3 convert.py --weights ./data/yolov3-tiny.weights --output ./checkpoints/yolov3-tiny.tf --tiny
Raspberry Pi 4 登場以前の Raspberry Pi 3 などで、コマンド「python3 convert.py」実行時にエラーが出る場合、 「2. [TensorFlow 1 系] プログラムのダウンロードと準備」で解説されているスワップ領域の増加を試してみると良いかもしれません。

次に、静止画に対して物体検出を行うコマンドが下記の 2 つです。1 つ目のコマンドは、通常の YOLO を画像「./data/meme.jpg」に対して適用します。 「./data/meme.jpg」は、「現在のディレクトリ(./)にある data ディレクトリ(data/)にある画像 meme.jpg」という意味です。 同様に、2 つ目のコマンドは、tiny YOLO を画像「./data/street.jpg」に対して適用します。
どちらの場合も、検出結果が描かれた output.jpg というファイルが保存されます。
python3 detect.py --image ./data/meme.jpg

python3 detect.py --weights ./checkpoints/yolov3-tiny.tf --tiny --image ./data/street.jpg
最後に、ウェブカメラから取得した映像への物体検出は以下で行います。1 つ目が通常のYOLO、2 つ目が tiny YOLO 用のコマンドです。どちらも、終了するにはウインドウ上でキーボードの「q」をタイプしてください。
なお、Bullseye 64-bit で、Legacy Camera 有効 + カメラモジュールで使っている場合、カメラモジュールでの認識が可能です。 Bookworm 64-bit の場合カメラモジュールでの認識はできません。USBで接続するウェブカメラが必要です。その場合、detect.py の 57行目の「cap = cv2.VideoCapture(0)」のカッコ内の数字を 0 から 1 に変更する必要があるかもしれません。
python3 detect.py --webcam

python3 detect.py --weights ./checkpoints/yolov3-tiny.tf --tiny --webcam


2. [TensorFlow 1 系] プログラムのダウンロードと準備

ここからは、TensorFlow 1 系用の YOLO バージョン 3 (YOLOv3) のダウンロードと準備を行いましょう。
公式の YOLO は、darknet というライブラリでネットワークを実現しています。 それを別のディープラーニング用ライブラリで実行するためのプログラムを様々な方が公開しています。

ここでは、kcosta42 氏が公開しているプロクラムを用います。 kcosta42 氏のプログラムに、カメラ映像に対する物体検出機能を筆者が追加したプログラムをダウンロードします。 ターミナルを開き、下記のコマンドでプログラムをダウンロードしましょう。
git clone https://github.com/neuralassembly/Tensorflow-YOLOv3
次に、学習済のパラメーター(結合係数)ファイルをダウンロードして TensorFlow 用のファイルに変換します。下記の3つのコマンドを順に一つずつ実行します。
cd Tensorflow-YOLOv3

curl https://pjreddie.com/media/files/yolov3-tiny.weights > ./weights/yolov3-tiny.weights

python3 convert_weights.py --tiny
一つ目のコマンドはディレクトリの移動を、二つ目のコマンドははTiny YOLO用のパラメーターファイル (35MB程度) のダウンロードを表します。
三つ目のコマンドはファイル変換を行います。Pi 3 B+で 1 分 30 秒程度、Pi 4 B で40秒程度の時間がかかります。このときコンソールに大量の WARNING が出ますが、変換は適切に行われますので気にする必要はありません。

Raspberry Pi 4 をお使いの方で Tiny ではない通常の YOLO の実行もしたい方は、引き続き下記の2コマンドを実行してください。
curl https://pjreddie.com/media/files/yolov3.weights > ./weights/yolov3.weights

python3 convert_weights.py
それぞれ YOLO 用のパラメーターファイルのダウンロードと変換を行っています。Pi 4 B で 2 分程度の時間がかかります。
なお、パラメータファイルは250MB程度ありますので、SDカードの容量に注意してください。
なお、ファイルの変換には多くのメモリが必要とされるため、 Pi 3 B+までのRaspberry Piでは途中で強制終了してしまいます。

なお、2019.12末に試したところ、2つめのコマンドで Raspberry Pi 4 でもメモリに関するエラーが出て終了してしまいました(std::bad_alloc)。
これは、この時期にインストールされた tensorflow-1.14.0 に問題があるからのようです。
sudo pip3 install tensorflow==1.13.1
上記のコマンドにより tensorflow 1.13.1 にバージョンを落とすと上の変換コマンド「python3 convert_weights.py」はRaspberry Pi 4 メモリ 8GB 版と 4GB 版とでは問題なく実行でき、「Model Saved at "./weights/model.ckpt" 」と表示されて正常終了します。その場合、「3. プログラムの実行 (静止画の場合)」に進んでください。

なお、Raspberry Pi 4 メモリ 2GB 版ではメモリが足りず tensorflow-1.13.1 にバージョンを落としても「python3 convert_weights.py」コマンドに失敗することがあります。 その場合、SDカードの領域をメモリの一部として使う「スワップ」という領域のサイズを増やす必要があります。スワップ領域のデフォルトのサイズは 100MB であるので、これを 600MB に増やしてみましょう。 下記コマンドにより、スワップ領域のサイズを決めるファイル /etc/dphys-swapfile を管理者権限のテキストエディタで開きます。
sudo mousepad /etc/dphys-swapfile
下記の行がありますので、
CONF_SWAPSIZE=100
この数値 100 を下記のように 600 に変更します。
CONF_SWAPSIZE=600
変更したらテキストエディタでファイルを上書き保存してから、Raspberry Pi を再起動します。すると、スワップ領域の量が 600MB に増えており、変換コマンド「python3 convert_weights.py」が「Model Saved at "./weights/model.ckpt" 」と表示されて正常終了するようになります。
正常終了を確認したら、再び /etc/dphys-swapfile を管理者権限で開き、CONF_SWAPSIZE の値を 100 に戻して構いません。

以上が終わったら物体検出を実行してみましょう。

3. [TensorFlow 1 系] プログラムの実行 (静止画の場合)

まず、静止画に対する物体検出を試してみましょう。プログラムをダウンロードすることでユーザー pi のホームディレクトリに Tensorflow-YOLOv3 というディレクトリ(フォルダ)が出来ていますが、
その中の data ディレクトリ→ imagesディレクトリとたどった中にある person.jpg というファイルに対して物体検出をおこないます。あらかじめ、Raspberry Pi上のファイルマネージャで画像をダブルクリックしてどのような画像か確認しておきましょう。

そして、 Tensorflow-YOLOv3 というディレクトリに移動してからプログラムを実行します。 結合係数の変換からターミナルを閉じていなければそのまま実行してよいのですが、新たにターミナルを起動した場合はあらかじめ
cd Tensorflow-YOLOv3
というコマンドを実行し、ディレクトリを移動してからプログラムを実行します。

Tiny YOLO (YOLOv3-tiny) によりperson.jpgに対して物体検出を行うには下記のコマンドを実行します。
python3 detect.py --tiny image 0.5 0.5 ./data/images/person.jpg
Pi 3 B+で 45秒程度(パラメータファイルからのモデルの構築に36秒、入力から検出結果を得るのに9秒)、Pi 4 B で 24 秒程度(パラメータファイルからのモデルの構築に20秒、入力から検出結果を得るのに4秒)の時間待つと、結果が保存されます。
結果は、Tensorflow-YOLOv3 ディレクトリ内の detections ディレクトリにある image_output.png というファイルに保存されています(ファイル名は毎回固定です)。 下記のようなファイルが保存されているはずです。


犬に対する枠が2重に表示されていたり、馬が sheep と判定されているなど若干問題はありますが、Tinyではない通常の YOLO を用いるとこの問題はどちらも解決されます(その方法は後述します)。
なお、犬に対する枠が2重に表示されている問題は Tiny の範囲で解決できます。実行コマンド中の「0.5 0.5」のうち、一つ目の数字は「同じクラスの物体を示す枠が複数あって重なっているとき、重なりが大きい枠を除去する」という処理に使われます。 この数字を 0 から 1 の範囲で小さくすると(例えば 0.3)、犬の枠は一つになります。すなわち「python3 detect.py --tiny image 0.3 0.5 ./data/images/person.jpg」ですので興味のある方は試してみてください。

ここで、実行コマンドの中の「./data/images/person.jpg」について解説しておきましょう。これは物体検出を行う対象となる画像の位置を指定しています。このとき、下記の記号を覚えておくと便利です。

   .   ユーザーが現在いるディレクトリ
   /   ディレクトリの区切り

この表によると、「./data/images/person.jpg」は「ユーザーが現在いるディレクトリ内にあるdataディレクトリ→imagesディレクトリにあるperson.jpgという画像」という意味になります。 それ以外には下記の記号を覚えておくと良いでしょう。

   ..   ユーザーが現在いるディレクトリの一つ上のディレクトリ

この記号を用いると、例えば「../image.jpg」と書くことで「ユーザーが現在いるディレクトリの一つ上のディレクトリにあるimage.jpgという画像」という意味になります。

ここで学んだ知識を確認するため、別の画像に対しても Tiny YOLO で物体検出を行ってみましょう。本ページの冒頭に示した机の上にキーボード、カッター、カップ、マウスを置いた画像を試してみましょう。下記のコマンドで画像をダウンロードします。
wget https://raw.githubusercontent.com/neuralassembly/raspi/master/desk-image.jpg
ファイルマネージャで Tensorflow-YOLOv3 ディレクトリにダウンロードされた desk-image.jpg の存在を確認し、どんな画像か確認しておきましょう。 そして、下記のコマンドにより物体検出を実行します。
python3 detect.py --tiny image 0.5 0.5 ./desk-image.jpg
先ほど学んだように「./desk-image.jpg」は「現在のディレクトリにある desk-image.jpg という画像ファイル」という意味になるのでしたね。

実行結果は先程と同じく detections ディレクトリの image_output.png として保存されます。以下のような図になっているはずです。


本ページ冒頭の図と異なり、カッターが検出されていません。これは、物体かどうかを判定する基準が厳しいからです。実行コマンド中の「0.5 0.5」のうち二つ目の数字を0.2にすると、基準が緩くなり、カッターがナイフと判定されるようになります (基準は0から1の範囲の数値で定めます)。すなわち「python3 detect.py --tiny image 0.5 0.2 ./desk-image.jpg」です。このコマンドで本ページ冒頭の図と同じものが detections ディレクトリの image_output.png として保存されます。

さて、ここまで Tiny YOLO での物体検出を解説してきました。通常の YOLO で物体検出を行いたい場合は、コマンドから「--tiny」を除いて下記を実行します。Pi 3 B+までではパラメータファイルの変換に失敗するので、実行可能なのは Raspberry Pi 4 以降のみでしたね(メモリ 4GB 版と 2GB版とで動作を確認)。
python3 detect.py image 0.5 0.5 ./data/images/person.jpg
Pi 4 B で 1 分弱(パラメータファイルからのモデルの構築に45秒、入力から検出結果を得るのに8秒)待つと、これまで通り detections ディレクトリの image_output.png として保存されます。
認識率はこちらの通常の YOLO を用いることで格段に上がりますが、そのぶん認識結果を得るまでの時間がかかるようになっています。

4. [TensorFlow 1 系] プログラムの実行 (カメラの映像の場合)

最後に、Raspberry Pi に接続したカメラから得られた映像に対して物体検出を行う方法を紹介します。

カメラは、Raspberry Pi 公式のカメラモジュールおよび USB 接続のウェブカメラのどちらでも構いません。USB 接続のウェブカメラとしてこちらで動作確認したのは ロジクール社の C270 および C920 です。

本ページでは「××社の○○と言うカメラで動くか」という質問や「××社の○○と言うカメラで動くようにして欲しい」という要望には応えることができませんのでご了承ください。

実行方法は、静止画の場合と同様に Tensorflow-YOLOv3 ディレクトリに「cd Tensorflow-YOLOv3」コマンドで移動してから下記を実行します。

Tiny YOLOの場合はこちらです。
python3 detect.py --tiny webcam 0.5 0.5 
利用状況は下図のようになります。Pi 3 B+ では、約1秒に一回くらい映像が更新されましたが、5秒くらいの映像遅れがあるので実用は厳しいところです。
Pi 4 B では、1秒に複数回映像が更新され、2秒くらいの映像遅れがあります。



通常の YOLO の場合はコマンドから「--tiny」を除いた下記のコマンドを実行します。こちらは Raspberry Pi 4 でのみ実行できます(メモリ 4GB 版と 2GB 版とで動作を確認)。 こちらは Tiny YOLO よりも認識率は良いのですが、映像の遅れが25秒程度あるので使いどころは難しいところです。
python3 detect.py webcam 0.5 0.5 


8. まとめ

Raspberry Pi で YOLO v3-Tiny / YOLO v3 による物体検出を試してみました。カメラ映像に対する例を試してみたところ、実用するためには Raspberry Pi 4 + YOLO v3-Tiny くらいの動作速度は最低限欲しいところです。

また、YOLO v3-Tiny は認識精度が低いので、実用するにはなんらかの工夫が必要と思われます。

この物体検出の高速化に関して、「Raspberry Pi + Coral USB Accelerator + TensorFlow Lite で物体検出と姿勢推定を試してみよう」ページを作成しましたので、引き続きご覧ください。Coral USB Acceleratorをお持ちでない場合も演習を実行できます。

2019年12月2日月曜日

本書の演習を Windows / macOS を用いて Anaconda 上の Spyder で実行する方法

1. はじめに

(2024.2 最新の環境で動作するよう加筆しました)
本書の演習を Windows / macOS で動作している Anaconda 上の Spyder で実行する方法に関する質問が時々あります。
Anaconda での実行を正式にサポートすることはできませんが、本ページでそのヒントをいくつか記します。

なお、本ページの内容はWindowsのユーザー名に日本語文字や半角スペースなどが含まれていると実行できません。 ユーザー名に問題のある文字が含まれているかどうかはわかりにくいので、ページの途中で示す確認方法で確認してください。 この問題を回避するには、Windowsで名前がアルファベットと記号のみのユーザーを作り直すしかありませんのでご了承下さい。

2. ツールのインストール

それでは、本書の演習をWindowsなどで実施するために必要な Anaconda のインストールと設定の方法を解説します。

まず、Anaconda は 2024年2月現在、こちらのページの末尾から、Python 3.11用のみがダウンロードできるようです。その 64 bit 版をダウンロードしてインストールします。

なお、インストール中に下記のエラーが出る場合、冒頭で触れた「ユーザー名に問題のある文字が含まれている」場合になります。このまま先に進めてもうまくいきませんので、Windowsでに日本語文字を含まないユーザーを作り直すしかありません。 「Microsoftアカウント」でユーザーを作成すれば、登録したメールアドレスの先頭数文字がユーザー名となるため安全だと思います(メールアドレスには日本語文字は含まれないため)。
Error: Due to incompatibility with several Python libraries, 'Destination Folder' cannot contain non-ascii characters (special characters or diacritics). Please choose another location.


インストールが終わったら、スタートメニューの「A」の項目から下図のように「Anaconda3 (64bit)」内の「Anaconda Prompt」を実行してください。
なお、Windows 11 の場合、このアルファベット順のアプリケーション一覧を表示するには、スタートメニュー上で「すべてのアプリ」を一度クリックする必要があります。



macOS に対するヒント
macOS では、Anaconda Prompt のかわりに macOS のターミナルを使います。


現れたプロンプトで各種ツールのインストール作業を始めます。ただし、最新のAnaconda環境でそのまま本書に必要なツールをインストールしようとすると、ツール同士のバージョンの衝突が起こりうまくインストールできません。そこで、「Pythonの仮想環境を作ってそこに必要なツールのインストールを行う」という方針にします。

なお、プロンプトの冒頭には「(base) C:Users\(ユーザー名)」という内容が書かれています。「(ユーザー名)」の部分は人によって異なります。
本ページ冒頭で「Windowsのユーザー名に日本語文字や半角スペースなどが含まれていると実行できません」と述べましたが、このユーザー名の部分に日本語文字などを含んではいけない、という意味です。
日本語文字などを含んだまま先に進めてもうまくいきませんので、Windowsでに日本語文字を含まないユーザーを作り直すしかありません。 「Microsoftアカウント」でユーザーを作成すれば、登録したメールアドレスの先頭数文字がユーザー名となるため安全だと思います(メールアドレスには日本語文字は含まれないため)。

さて、プロンプト上で下記のコマンドを実行して仮想環境を作成します。仮想環境に「tf2」という名称を付けていますが、これは「TensorFlowのバージョン2をインストールする仮想環境」という意味で付けました。さらに、仮想環境 tf2 で用いる Python のバージョンは 3.8 とします。3.8 にしたのは、安定性を重視したためです。
conda create -n tf2 python=3.8
なお、以後長いコマンドが続きます。ブラウザ上で上のコマンドをコピーし、下図のようにプロンプトの左上のアイコンをクリックして現れるメニューから「貼り付け」を選択すればコマンドを楽に実行できます。
なお、Windows 11 では、このようなメニューは現われないことが多いので、通常通りキーボードで Ctrl-V を入力して貼り付ければ良いでしょう。


貼り付けが完了した状態が下図で、この状態で「Enter」キーを押すことで、コマンドを楽に実行できるわけです。なお、このとき「Continue creating environment (y/[n])?」や「Proceed (y/[n])?」と聞かれたときは、どちらの場合もキーボードで「y」をタイプして「Enter」キーを押して作業を進めてください。



macOS に対するヒント
私の macOS 10.15 / 12.4 (Intel) で試したところ、下記のように python バージョン 3.7 を用いなければ、後のインストールがうまく行きませんでした。macOS の他のバージョンでは未確認です。

conda create -n tf2 python=3.7

なお、一度作ってしまった tf2 環境を削除してやり直したい場合、先頭が (base) のターミナルで下記を実行してください。

conda remove -n tf2 --all


仮想環境の作成が完了したら、下記のコマンドを実行して作成した仮想環境「tf2」に入ります。
conda activate tf2
その結果、下図の状態になります。プロンプトの行頭が「(base)」から「(tf2)」に変化しており、環境が「base」から「tf2」に変わったことがわかります。


そのままの状態で、下記のコマンドを実行して、本書に必要なツールをインストールしましょう。このコマンドは特に長いので、注意してコピーして実行しましょう。先ほどと同様、 「Proceed (y/[n])?」と聞かれたときはキーボードで「y」をタイプして「Enter」キーを押して作業を進めてください。
conda install scikit-learn matplotlib pillow py-opencv tensorflow keras numpy=1.23.5 spyder console_shortcut toml
最後に「done」と表示されていれば、インストールに成功しています。
なお、終了時に下記のようなデバッグメッセージが現れた場合も、最後に「done」と表示されているので、インストールは問題なく完了しています。
- DEBUG menuinst_win32:__init__(199): Menu: name: 'Anaconda${PY_VER} ${PLATFORM}', prefix: 'C:\Users\neura\anaconda3\envs\tf2', env_name: 'tf2', mode: 'user', used_mode: 'user'
DEBUG menuinst_win32:create(323): Shortcut cmd is %windir%\System32\cmd.exe, args are ['"/K"', 'C:\\Users\\neura\\anaconda3\\Scripts\\activate.bat', 'C:\\Users\\neura\\anaconda3\\envs\\tf2']
\ DEBUG menuinst_win32:__init__(199): Menu: name: 'Anaconda${PY_VER} ${PLATFORM}', prefix: 'C:\Users\neura\anaconda3\envs\tf2', env_name: 'tf2', mode: 'user', used_mode: 'user'
DEBUG menuinst_win32:create(323): Shortcut cmd is C:\Users\neura\anaconda3\pythonw.exe, args are ['C:\\Users\\neura\\anaconda3\\cwp.py', 'C:\\Users\\neura\\anaconda3\\envs\\tf2', 'C:\\Users\\neura\\anaconda3\\envs\\tf2\\pythonw.exe', 'C:\\Users\\neura\\anaconda3\\envs\\tf2\\Scripts\\spyder-script.py']
DEBUG menuinst_win32:create(323): Shortcut cmd is C:\Users\neura\anaconda3\python.exe, args are ['C:\\Users\\neura\\anaconda3\\cwp.py', 'C:\\Users\\neura\\anaconda3\\envs\\tf2', 'C:\\Users\\neura\\anaconda3\\envs\\tf2\\python.exe', 'C:\\Users\\neura\\anaconda3\\envs\\tf2\\Scripts\\spyder-script.py', '--reset']
done


macOS に対するヒント
macOS では、仮想環境の Python のバージョンを 3.7 にしないと、上記のインストールに失敗します。その場合、Python バージョン 3.7 で仮想環境を作り直します。


インストールが完了すると、スタートメニューの「Anaconda3 (64bit)」の項目には下図のように「Anaconda Prompt (tf2)」や「Spyder (tf2)」が追加されています。どちらも、仮想環境 tf2 で必要なツールです。「Anaconda Prompt (tf2)」は仮想環境 tf2 へツールをインストールしたいときに、「Spyder (tf2)」は仮想環境 tf2 でPythonプログラムを実行するときに用います。

最後に、画像処理に用いる opencv とじゃんけんシステムで音を鳴らすための playsound というライブラリをインストールしておきましょう。先頭が (tf2) のプロンプトのまま、下記のコマンドを実行します。
pip install opencv-contrib-python playsound==1.2.2

以上で本書の演習を実行するために必要なツールのインストールは終わりです。本書に記されているRaspberry Pi用の様々な設定やインストール作業は不要です。以下、本ページでは「Spyder (tf2)」で本書のプログラムを実行する方法を解説します。

macOS に対するヒント
macOS で tf2 環境の Spyder を実行するには、Anaconda Navigator で「Applications on」の部分で「tf2」を選択し、Spyder の Launch ボタンをクリックします。 または、ターミナルで
conda activate tf2
を実行してから
spyder
とコマンドで実行しても構いません。


なお、仮想環境 tf2 用のSpyder が起動して、インターフェースが日本語ではなかった場合、メニューから「Tools」→「Preferences」を選択し、現れたウインドウで「Application」→「Advanced settings」を選択してLanguageを日本語に設定してください。その際、再起動を促されますのでそれに従えばインターフェースが日本語になります。
また、「Install Kite?」などと聞かれた場合、「Dismiss (無視)」して構いません。

3. サンプルファイルの準備

次に、演習ファイルの用意です。まず、「書の内容を Pi Zero ~ Pi 5 で実行する方法」より、演習ファイル mlbb-sample-pi5.zip をダウンロードし、それが終わったら展開してください(ファイルを右クリックして「すべて展開」)。

さらに、カメラを用いる演習用に、「本書の演習をウェブカメラで実行する方法」にて紹介したウェブカメラ用の演習ファイル mlbb-webcam.zip をダウンロードし、こちらも展開してください。 そして、mlbb-webcam.zip を展開して現れるファイルを、全て本書の演習ファイルと同じフォルダに移動してください。これを行わないと正しく実行できない演習ファイルがあります。2個のファイルを上書きするか聞かれますが、上書きして構いません。

さて、サンプルの演習ファイルのあるフォルダにウェブカメラ用のファイルを加えると、「同じ番号のファイルが複数ある」状態になります。例えば、「ml-08-01」という番号がついたファイルは
  • ml-08-01-cameracheck.py
  • ml-08-01-cameracheck-webcam.py
の2つありますし、「ml-10-09」という番号のついたファイルも同様です。
  • ml-10-09-janken-deep.py
  • ml-10-09-janken-deep-webcam.py
このような場合、「webcam のついたファイルを使う」ようにしてください。上の例だと「ml-08-01-cameracheck-webcam.py」と「ml-10-09-janken-deep-webcam.py」ですね。
これ以外のファイルを実行するとエラーが出ますので注意してください。

以上でサンプルファイルの準備は完了です。

4. ファイルの実行に関する注意

あとは「Spyder (tf2)」からファイルを読みこんで実行するだけなのですが、いくつか注意がありますので順番に列挙します。
  • グラフ表示のあるプログラムでは、図のように「プロット」領域にグラフが現れます。



  • 7章最初に CUI で実行するじゃんけん (ml-07-01-janken-cui.py および ml-07-02-perceptron-cui.py) の実行には注意があります。まず、それらのファイルを開いた状態で「実行」→「ファイルごとの設定」を選択します。


    そした現れた画面で「カスタム設定でファイルを実行」にチェックを入れ、さらに「コンソール」の「外部システムターミナルで実行」を選択して「OK」してください。その設定をしてから実行しないと、プログラムを正しく終了できなくなります。 なお、古い Spyder では「カスタム設定でファイルを実行」のチェックが存在しない場合がありますがその場合は「コンソール」→「外部システムターミナルで実行」のチェックだけで構いません。

  • カメラを用いた演習、例えば ml-08-01-cameracheck.py と ml-08-01-cameracheck-webcam.py という同じ番号のファイルが複数見つかりますが、すべて末尾が「-webcam.py」という名前のファイルを選ぶようにしましょう。 これは上で mlbb-webcam.zip を展開した時に現れたファイルです。

    さらに、カメラを用いた演習でも「実行」→「ファイルごとの設定」で「カスタム設定でファイルを実行」にチェックを入れてから「コンソール」→「外部システムターミナルで実行」を選択してください。そうしないと、プログラム終了時にカメラが正常終了しません。

    また、カメラを用いた演習で手の形にが白く二値化されない場合、「書籍で用いたコマンドおよび追加情報」の「p.257 ml-08-02-binary.pyが手の形を反映していない場合」の項目を参考に、hmin、hmax、smin などのパラメータを調整する必要があります。

  • コマンドライン引数(ひきすう)の必要なプログラムの実行についてです。
    例えば、ml-08-03-learn.py の実行には下記のように「result.pkl」というコマンドライン引数をつける必要があるのでした。
    python3 ml-08-03-learn.py result.pkl
    
    これをSpyder で実現するためには、「実行」→「ファイルごとの設定」を開き、図のように「カスタム設定でファイルを実行」にチェックを入れ、さらに「一般設定」→「コマンドラインオプション」にチェックを入れてから、右側の入力欄に「result.pkl」と記入してOKボタンを押します。なお、古い Spyder では「カスタム設定でファイルを実行」のチェックが存在しない場合がありますがその場合は「一般設定」→「コマンドラインオプション」への記述だけで構いません。

    以上で演習ファイルにコマンドライン引数をつけて実行できます。文字通りこれは「ファイルごとの設定」ですので、演習ファイルを変更するごとに設定しなおす必要があります。

  • 9章で実行するじゃんけんシステム、ml-09-01-janken-webcam.py と ml-09-02-janken-shorten-webcam.pyは、「実行」→「ファイルごとの設定」で「カスタム設定でファイルを実行」にチェックを入れてから「コンソール」の「外部システムターミナルで実行」を選択して「OK」してください。そうしないと正常に終了できなくなります。コマンドライン引数への「result.pkl」の設定も必要です。

  • 10章最後に登場するじゃんけんシステムは、「実行」→「ファイルごとの設定」を開き、「カスタム設定でファイルを実行」にチェックを入れてから「外部システムターミナルで実行」を選択して「OK」してください。そうしないと正常に終了できなくなります。コマンドライン引数への「ml-hand-cnn.h5」の設定も必要です。


5. MediaPipe のサンプルプログラムの実行に関する注意

また、Anaconda の Spyder で「Raspberry Pi 5 でリアルタイムな姿勢推定と物体検出」の内容を実行したい場合の解説を行います。

まず、mediapipe のインストールが必要です。「Anaconda Prompt (tf2)」を起動し、先頭が (tf2) のコマンドプロンプトで下記のコマンドを実行してインストールします。
pip install mediapipe
その後、姿勢推定と物体検出を以下の手順で実行します。
<姿勢推定の場合>
  • 「mediapipe-python-sample」のサンプルファイルをダウンロードするときは、「こちらのリンク」の先で「Code」ボタン→「Download ZIP」とたどります。ZIPファイルをダウンロ―ド後は展開します。
  • 展開したプログラムのうち、ファイル名に「_picamera2.py」が含まれていないものは、ウェブカメラで実行できます。
  • どのプログラムを実行する場合も、「実行」→「ファイルごとの設定」において「外部システムターミナルで実行」を選択します。カメラの種類を変えたい場合は、コマンドラインオプションで「--device 1」などとカメラ番号をしていしてください。

<物体検出の場合>
  • 「mediapipe」のサンプルファイルをダウンロードするときは、「こちらのリンク」の先で「Code」ボタン→「Download ZIP」とたどります。ZIPファイルをダウンロ―ド後は展開します。
  • 展開したプログラムのうち、「object_detection/raspberry_pi」フォルダにある「detect.py」を実行します。その前に、「efficientdet_lite0.tflite」をダウンロードし、「detect.py」と同じフォルダに保存しておきましょう。
  • ファイル実行時の設定として、「実行」→「ファイルごとの設定」において「外部システムターミナルで実行」を選択します。さらに、 コマンドラインオプションで「--model efficientdet_lite0.tflite」を指定します。 カメラの種類を変えたい場合は、コマンドラインオプションを「--model efficientdet_lite0.tflite --cameraId 1」などとしてカメラ番号を指定してください。