2020年5月6日水曜日

Raspberry Pi + RealSense + Coral USB Accelerator + PoseNet で深度情報と姿勢情報を表示する

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

1. はじめに

Raspberry Pi + Coral USB Accelerator + TensorFlow Lite で物体検出と姿勢推定を試してみよう」では、Raspberry Pi と Coral USB Accelerator というディープラーニングの推論を高速化するデバイスを利用し、人間の姿勢を推定しました。

人間の骨格を推定する方法としては Microsoft Kinect というセンサを用いるものがあります。Kinect では三次元空間における人間の位置を求めますので、センサから人間までの距離も知ることができます。しかし、上で見た PoseNet を用いる方法では、人間までの距離を知ることはできません。

一方、対象までの距離を知ることのできるセンサとして、Intel RealSense D415 や D435 が知られています。これはデプスセンサとも呼ばれます。デプスは日本語でいうと深度であり、距離と同じような意味です。

このデプスセンサと PoseNet を組み合わせると、人間の姿勢(骨格)だけではなく人間までの距離を知ることができます。使用例を示したのが下図です。


PoseNet による人間の姿勢(骨格)が黄色の円と線の組み合わせで表現されており、対象物までの距離が色付けされて表示されていることがわかります。

本ページではこれを実現する方法を解説します。なお、RealSense はやや高価なセンサですので、お持ちでない方は本ページを読み物としてお楽しみください。

なお、本ページと同様の内容を Windows で実現したい場合、別サイトに「Intel RealSenseでSkeleton Trackingを行うCubemosのライブラリをPythonで使ってみた」というページを作成しましたので、必要に応じてご覧ください。

2. 準備と必要なもの

本ページの演習を実行するのに必要な物品は下記の通りです。
  • Raspberry Pi (NOOBS 3.3.1 (Raspbian 2020-02-13)で試しました。RealSense SDK のビルドには高い計算能力が必要なので Pi 4 B を推奨します。Pi 3 B+などでもできないわけではありません)
  • RealSense D415 または D435 (本ページの例はすべて D435 で行ったもの)
  • Google Coral Accelerator
これらを接続して実際に使用している様子が下図になります。RealSense D435 と Google Coral Accelerator がどちらも Raspberry Pi 4 の USB 3 ポートに接続されていることがわかります。

Raspberry Pi + Coral USB Accelerator + TensorFlow Lite で物体検出と姿勢推定を試してみよう」を試した方なら、カメラの代わりに RealSense D435 が使われていることが想像できるでしょう。


本ページの以下の演習に進む前に、まず Coral USB Accelerator による姿勢推定の演習を実行しておいてください。

すなわち、「本書のディープラーニングの演習をkeras + TensorFlowで実行する方法」に従い、まず本書に必要なPython3 用ツールをインストールします。
そして、「Raspberry Pi + Coral USB Accelerator + TensorFlow Lite で物体検出と姿勢推定を試してみよう」に従い、TensorFlow Lite をインストールして姿勢推定の演習まで進むのでした。

それが終わったら以下に進みましょう。

3. Raspberry Pi で RealSense SDK をビルドする

まず、本演習を実行するためには、Raspbian で fake KMS という OpenGL のドライバーが有効になっていなければなりません。ただし、NOOBS 3.3.1 (Raspbian 2020-02-13) ではデフォルトで有効になっていました。

念のため確かめてみましょう。ターミナルを開いて以下のコマンドを実行します。なお、本ページではコマンドの先頭に「$」を付けて表示しますが、実行すべきコマンドは「$」を省いたもの、すなわわち「grep fkms /boot/config.txt 」ですので注意してください。
$ grep fkms /boot/config.txt 
dtoverlay=vc4-fkms-v3d
#dtoverlay=vc4-fkms-v3d
上の命令は、/boot/config.txt というファイルから、「fkms」という文字を含んだ行を抽出しています。上に記されているように、先頭に「#」がついていない 「dtoverlay=vc4-fkms-v3d」という行が存在すれば fake KMS は有効ですので先に進みましょう。

もし、先頭に「#」のついた「#dtoverlay=vc4-fkms-v3d」という行しか存在しない、あるいはどちらの行も存在しない場合は、/boot/config.txt の末尾に 「dtoverlay=vc4-fkms-v3d」を追記して Raspberry Pi を再起動する必要があります。

さて、fake KMS の確認が終わったら、RealSense SDK ビルドに必要なツールをインストールするために以下のコマンドを順に実行します。
$ sudo apt update
$ sudo apt install git libssl-dev libusb-1.0-0-dev pkg-config libgtk-3-dev libglfw3-dev libgl1-mesa-dev libglu1-mesa-dev cmake
以上が終わったら、RealSense SDK のビルドに進みます。

Pi 3 B+ などを利用する方への注意
Pi 3 B+ などでは、メモリが足りないためこの先で行う RealSense SDK のビルドに失敗します。 そのため、メモリの代わりに microSD カードを使うスワップ領域のサイズを増やします。 デフォルトではスワップ領域のサイズは 100MB なのですが、以下のコマンドを実行することでそれを 2GB に増やします。 メモリが 2GB または 4GB の Pi 4 B をお使いの方はこの操作は不要です。
$ sudo swapoff -a
$ sudo rm -f /swapfile
$ sudo fallocate -l 2G /swapfile
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile

まず、Raspberry Pi に RealSense が接続されていたら外しておきましょう。 そして、ターミナルで以下のコマンドを順に実行します。RealSense SDK のダウンロードと、USB の設定が行われます。
$ git clone https://github.com/IntelRealSense/librealsense.git

$ cd librealsense

$ sudo ./scripts/setup_udev_rules.sh
最後のコマンドを実行すると、以下のメッセージが現れますので、Enterキーを押して処理を先に進めます。
Setting-up permissions for RealSense devices

Remove all RealSense cameras attached. Hit any key when ready
処理が終わると以下のメッセージが現れます。
udev-rules successfully installed
そして、以下のコマンドを順に実行します。
$ mkdir build

$ cd build

$ cmake ../ -DCMAKE_BUILD_TYPE=Release -DBUILD_EXAMPLES=true -DBUILD_PYTHON_BINDINGS:bool=true
最後のコマンドを実行したとき、メッセージ中に以下のように「No internet connection」という警告が含まれることがあります。 これは、インターネットに接続されていないと判定されていることを意味しますので、このまま進むのは好ましくありません(実は本ページの演習の範囲でならばこのまま進んでも演習はできてしまうのですが)。

この問題を解決するため、上記最後のコマンドを何度か再実行してみましょう。キーボードの「↑」キーで直前に実行したコマンドを表示し、 Enterキーを押すことで再実行できます。何度か同じコマンドを再実行し、下記の警告が出なかったときに先に進みましょう。
(略)

CMake Warning at CMakeLists.txt:16 (message):
  No internet connection, disabling BUILD_WITH_TM2


CMake Warning at CMakeLists.txt:22 (message):
  No internet connection, disabling IMPORT_DEPTH_CAM_FW

(略)
以上で RealSense SDK をビルドするための準備が整いました。次のコマンドでビルドが開始されますが、1時間以上かかる可能性がありますので、 時間が十分あるときに実行しましょう。

なお、コマンド中の「-j4」の「4」は、4つのビルド処理を同時に実行することを意味します。Pi 4 B のメモリ 4GB 版では問題なくビルドできましたが、Raspberry Pi にあまり負荷をかけたくない場合は「-j2」や「-j1」とするのが良いでしょう。

また、Pi 3 B+ などでは上で設定したように microSD カードをスワップ領域として使いますので、microSD カードをに負荷をかけないため、「-j1」で実行すべきだと思います。
$ make -j4
さて、ビルドが終わったら、以下のコマンドを実行してビルドされたプログラムをインストールしましょう。
$ sudo make install
さらに、以下の2コマンドを順に実行し、ビルドした Python3 用のモジュールを利用可能にする設定を行いましょう。
$ echo "export PYTHONPATH=$PYTHONPATH:/usr/local/lib" >> ~/.bashrc

$ source ~/.bashrc

4. 動作テスト

RealSense SDK のインストールが終わったら、動作テストを行ってみましょう。 本ページ上部の写真のように、Raspberry Pi の青色の USB 3 ポートに Coral USB Accelerator と RealSense D415 または D435 を接続しましょう。

ターミナルを起動し、以下のコマンドを実行します。
$ realsense-viewer
以下のようなアプリケーションが起動しますので、左側のトグルを「on」にすると、通常の映像(RGB Camera)と深度画像(Stereo Module)を見ることができます。


なお、今回 Pi 4 B と Pi 3 B+ で試したところ、どちらの場合も RealSense を Raspberry Pi に直接接続して動作させることができました。 しかし、2年くらい前に Pi 3 B で RealSense を動作させたときは、RealSense を電源付きの USB ハブ(セルフパワータイプの USB ハブ)を介して Raspberry Pi に接続しないと、RealSense への電力が足りず動作しないという経験をしました。

Raspberry Piのバージョンが上がったことが原因なのか、私が用いた電源が変わったためか、あるいは RealSense のファームウェアが更新されたことが原因なのか検証していませんが、電力の問題は意識しておいた方が良いかもしれません。

さて、以上が終わったら、RealSense で PoseNet を動かしてみましょう。RealSense の通常の画像で姿勢推定を行い、その結果を通常の画像と深度画像の両方に描画します。

そのプログラムは、「Raspberry Pi + Coral USB Accelerator + TensorFlow Lite で物体検出と姿勢推定を試してみよう」で用いた project-posenet 内に含まれています。 以下のコマンドを実行してみましょう。
$ cd project-posenet
$ python3 pose_camera_realsense_cv.py
通常の画像と深度画像用の2つのウインドウに結果が表示されます。深度画像に対する結果が冒頭の画像であるというわけです。ただし、冒頭の画像は結果が見やすくなるよう黄色い線を太く表示させていますのでご了承ください。

なお、冒頭の画像の深度画像は、realsense-viewer の深度画像にくらべて背景がなめらかではないことに気づかれたかもしれません。 これは、realsense-viewer の深度画像には様々なフィルタが適用されているからです。realsense-viewer でそれらのフィルタのオン・オフを切り替えると、フィルタの効果を知ることができます。

それらのフィルタを PoseNet 用プログラムに適用することもできますが(例えばこちらを参考に)、動作が遅くなるのでそれは行いませんでした。冒頭の図をよく見るとわかるように、フレームレートはおよそ 6~7 fps 程度です。

以下のように、解像度 480x360 でプログラムを実行すると、フレームレートは 8 fps 程度に上昇します。
$ python3 pose_camera_realsense_cv.py --res 480x360
それ以外には1280x720という解像度もサポートしていますが、動作は遅いのであまり実用的ではないかもしれません。
$ python3 pose_camera_realsense_cv.py --res 1280x720
最後に、PoseNet の動作原理を知りたいという方は、別サイト内の 「姿勢推定を行うPoseNetをWindowsなどのPCで実行する」というページの末尾にに解説を記しましたので興味のある方はご覧ください。

5. おわりに

以上です。お疲れさまでした。

2020年3月7日土曜日

NOOBSを使ってOSをインストールする

1. はじめに

初心者用のRaspbianインストール方法として NOOBS と呼ばれるものが長らく使われてきましたが、 2020年3月に新しい初心者用インストールアプリケーションであるRaspberry Pi Imagerが発表されました(使用法は「Raspberry PiへのOSのインストール方法」を参照)。

恐らくこの方法がRaspbianインストールの今後の主流となっていくと思われますが、本ページではNOOBSによるインストール法を記録として残しておきます。

2. OSインストール用のmicroSDカードの準備

ここではRaspberry PiへOSをインストールするために必要なmicroSDカードを準備します。

なお、64GB以上のサイズのmicroSDカードを利用される方は、「64GB以上のmicroSDカードをRaspbianで使えるようフォーマットする」を参考に、microSDカードのフォーマットを exFAT から FAT32 に変更してから先に進んでください。

さて、まずはRaspberry Piは用いず、皆さんが普段お使いの、インターネットに接続されたPCでRaspberry Pi用のOSのインストーラをダウンロードしましょう。

Microsoft EdgeなどのブラウザでJAISTのミラーサイトに接続しましょう。 そして、日付を頼りに欲しいバージョンのリンクをクリックします。
中にある、NOOBS_v◯_◯_◯.zipという形式のファイルをクリックしてダウンロードしましょう。◯にはバージョンを表す数値が入ります。 デフォルトでは「ダウンロード」フォルダーに保存されています。

なお、ファイルのサイズが大きく、ダウンロードに時間がかかります。ネットワークへの接続が速い場合でも20分程度、遅い場合数時間かかる場合がありますので注意してください。なお、Windows 10 の標準ブラウザMicrosoft Edgeをお使いの場合、ダウンロード後の選択肢では「開く」ではなく「フォルダーを開く」を選択してください。

ダウンロード完了後はプロパティでファイルのサイズを調べてください。バージョンによって異なりますが、ファイルサイズがおよそ1.7GBより大幅に小さい場合、ダウンロードに失敗している可能性がありますので、再度チャレンジしてください。

ダウンロードされたファイルは圧縮されたファイルですので、展開する必要があります。

Windowsの場合は、下図のようにファイルを右クリックして「すべて展開」を選択し、現れたダイアログで「展開」ボタンをクリックすると展開が始まります。


ファイルが大きいので、すべての展開が終わるまで少し時間がかかります。なお、この展開時にエラーが出る場合は、やはりダウンロードに失敗している可能性があります。

展開がエラーなく終わったら、現れたファイルを下図のように全てmicroSDカードにコピーしましょう。

コピーが終わった後のmicroSDカードの中身は下図のようになります。


この中身はNOOBSのバージョンが上がるに従い、多少変更を受けることがありますが、展開されたファイルを全てコピーしたのであれば問題ありません。

また、この時点で皆さんのPCには「圧縮ファイル」と「展開されたフォルダ」の2つが残っています。「展開されたフォルダ」は後に削除しても構いません。圧縮ファイルの方は、再インストールの可能性もあるので残しておいた方が安全です。

以上を行ったmicroSDカードをRaspberry Piに接続し、Raspberry Piに電源を入れてOSのインストールを行いましょう。

下図のような起動アイコンが現れるでしょう。


そのまま待つと、さらに下図のようにインストールするOSの選択画面が現れます。


ここではRaspbianにチェックを入れ、Installボタンをクリックします。
なお、NOOBSのバージョンによっては、OSの選択肢としてRaspbianしか現れないこともあります。
その場合もやはりRaspbianにチェックを入れてInstallボタンをクリックしてください。

すると下図のように、microSDカードの中身が消されることを確認するダイアログが現れますのでYesボタンをクリックします。


すると下図のようにインストールが始まります。



インストールは、クラス10のmicroSDカードで約15分かかります。 インストールが完了すると下図のようにインストールの成功を知らせるダイアログが現れますので、OKボタンをクリックします。



するとRaspberry Piが自動的に再起動され、RaspbianというOSのデスクトップが開きます。

2020年2月23日日曜日

64GB以上のmicroSDカードをRaspberry Piで使えるようフォーマットする

0. はじめにの前に

2020年3月に発表されたRaspberry Pi Imager を用いたRaspbainのインストール法では、64GB以上のmicroSDカードに対しても 問題なくOSをインストールできるようです。その利用法は「Raspberry PiへのOSのインストール方法」参照してください。

さらに、この Raspberry Pi Imager では 64GB のmicroSDカードを FAT32 フォーマットでフォーマットすることができます。 その利用法は「Raspberry Pi用に使ったmicroSDカードをフォーマットする」参照してください。

そのため、本ページの以下の記述は古い内容であり、存在意義は小さくなってしまったのですが、記録のため消さずに残しておきます


1. はじめに(以下は古い方法の解説)

本ページは、「64 GB 以上の microSD カードを Raspberry Pi で使えるようフォーマットする」ことを目指すページです。

64 GBよりも小さいサイズの microSD カード(例えば 16 GB や 32 GB)のフォーマットを行いたい場合は、本ページではなく 「Raspberry Pi用に使った microSD カードをフォーマットする」というページの内容に従ってください。

なぜ 64 GB 以上かどうかでページを分けるかと言うと、64 GB 以上の microSD カードは「microSDXC カード」と分類され、購入時に「exFAT フォーマット」という形式でフォーマットされており、そのままでは Raspberry Pi では利用できないからです。

それに対し、16 GB や 32 GBの microSDカードは「microSDHC カード」と分類され、購入時に「FAT32 フォーマット」という形式でフォーマットされております。

ですから、本ページで目指すことは「exFAT でフォーマットされている 64 GB 以上の microSD カードを FAT32 でフォーマットし、Raspberry Pi で使えるようにする」ということです。16 GB や 32 GBの microSDカードであれば、このような面倒な手続きは必要がありません。

なお、この方法は Windows の 「ドライブ」という概念をしっかり理解しておかないとお使いのPC環境を破壊してしまう恐れがあります
ですから、Raspberry Pi用に用いる microSD カードとしては初めから FAT32 でフォーマットされている 16GB か 32GB のものを購入することをお勧めしております。

以上を理解した上で、64 GB 以上の microSD カードを FAT32 でフォーマットしたいと言う方は自己責任で以下の解説にお進みください。

64 GB 以上の microSD カードを FAT32 でフォーマットするためには、それが可能なソフトウェアをダウンロードして用いる必要があります。 Raspbian の公式ページで紹介されているFAT32Format というツールを用いることにしましょう。 なお、このツールは macOS 版がありません。Raspbian の公式ページでは、macOS ではコマンドラインツールである diskutil を用いるよう書いてあります。希望があれば diskutil の解説も記すかもしれませんが、以下では Windows 用 FAT32Format の解説を続けます。

上のリンクをクリックすると、以下のようなFAT32Format のページにたどり着くはずです。ページ中央にある図をクリックすると「guiformat.exe」というファイルがダウンロードされます。


ダウンロードされたファイルは以下のように表示されます。


ここで、exFATでフォーマットされた(すなわち購入直後の)64 GB 以上の microSD カードを接続しましょう。なお、一度 Raspbian で使用し、パーティション(ドライブのようなもの)が複数に分かれた microSD カードの場合、「Raspbian として使った microSD カードをフォーマットする」に従い、パーティションを 1 つに統合してから以下に進む必要があります。

接続したら、先ほどダウンロードした guiformat.exe をダブルクリックして起動します。下記のようなアプリケーションが現れます。


このとき、上図の赤字に記されているように
  • ドライブが microSD カードのものが指定されていること
  • フォーマットが exFAT であること
であることをよく確認しましょう。

ドライブ文字についてよくわからないという方は、あらかじめ「Raspbian として使った microSD カードをフォーマットする」のページをよく読み、ドライブの概念についてよく理解してから先に進んでください。
上図では「D:」と記されていますが、これは筆者の環境でのドライブ文字です。ドライブを指定する文字はPC環境により異なるので、ご自身の環境における microSD カードのドライブ文字を正しく指定しなければならないのです。

特に、ここで用いる guiformat.exe は、microSDカードではないドライブでも指定できるようになっているようです。ですから、正しくドライブを指定しないと、お使いのPCの環境を破壊してしまう恐れがあります。そのことをよく理解した上で先に進みましょう。

さて、上図に示されているように、指定したドライブのフォーマットが exFAT であることも確認しましょう。これを FAT32 にすることが目指すことなのでした。ここに exFAT と記されていることは、microSD カードのドライブが正しく指定されていることの目安になるでしょう。

さらに、指定されたドライブのサイズが「62 G」と表示されていることにも着目してください。このとき、筆者は 64 GB の microSD カードを接続したためこの数字が出たのです(このように、ぴったりの数値ではなく、おおよその値が表示されます)。この数字も、microSD カードのドライブが正しく指定されていることの目安になるでしょう。

以上の確認が終わったら上図右下の「Start」ボタンをクリックしましょう。以下のように、指定したドライブのデータがすべて失われることのについての警告が出ます。自己責任でクリックしましょう。


フォーマットはすぐに終わり、下図のように表記が変わります。exFAT が FAT32 に変化したことがわかるでしょうか。


以上で、この 64 GB 以上の microSD カードを Raspbian で利用できるようになりました。microSDカードを取り外し、FAT32Formatを終了しましょう。

なお、 Raspbian で利用した 64 GB 以上の microSD カードをフォーマットしなおしたい場合、まず「Raspbian として使った microSD カードをフォーマットする」ページに従い、パーティションを 1 つに統合してください。その際、exFAT でフォーマットされます。 それを再び Raspbian で用いたければ本ページに従い、exFAT を FAT32 にフォーマットしなおす、という流れになります。

2020年2月11日火曜日

イメージファイルを使ってOSをインストールする

1. はじめに

Raspberry PiのOSである Raspberry Pi OS は、Raspberry Pi Imagerというソフトウェアを用いてmicroSDカードにインストールされます。このソフトウェアは、OSをmicroSDカードに書き込む時にOSのダウンロードも同時に行ってくれます。

職場や学校などでは、この方法でのOSのインストールに失敗することがあるようです。ネットワーク環境により、OSのダウンロードに失敗するためのようです。

そこで、職場や学校などでもOSのインストールが可能な方法を紹介します。Raspberry Pi Imagerを用いて、あらかじめダウンロード済のOSイメージをmicroSDカードに書き込むという方法です。

2. 必要なものの準備

それでは、「Raspberry Pi OS のイメージで OS を インストールする」方法を解説します。まず、皆さんが普段お使いの PC で Raspberry Pi OS のイメージをダウンロードします。
にアクセスしましょう。OSのイメージをダウンロードするページにたどり着きます。

「64-bit、アプリケーション数は通常、OSは最新」を選択する場合、ダウンロードページでは、「Raspberry Pi OS (64-bit)」の「Raspberry Pi OS with desktop」が該当します。ページをスクロールして下図の項目を見つけましょう。見つかったら、「Download」ボタンをクリックしてダウンロードします。執筆時点では 2024-07-04-raspios-bullseye-armhf.img.xz という名前の圧縮ファイルがダウンロードされました。
「32-bit、アプリケーション数は通常、OSは最新」を選択する場合、下図を選択します。
Pi Zero 2 W のようにメモリが少ない機種では下図の Legacy (32ビット) 版を選ぶと安定動作する可能性があります。
さらに古いOSのイメージを選びたい場合、以下のリンクからファイルをダウンロードすると良いでしょう。 あるいは、OSのバージョンを指定してダウンロードしたい場合、下記のリンクから zip ファイルをダウンロードすると良いでしょう。 さて、現在の Rasbperry Pi OS では、ダウンロードしたファイルの名前は「ファイル名.img.xz」となっています。古いOSイメージの場合は「ファイル名.zip」です。

本ページのタイトルに「イメージファイルを使って」とありますが、ダウンロードしたファイルはこの「イメージファイル」を「圧縮」したファイルです。圧縮の手法が、拡張子に表示されている「xz」または「zip」であるというわけです。

ですから、ここからの流れは通常ならば「圧縮ファイルを『展開』してイメージファイルを取り出す」→「イメージファイルを microSD カードに書き込む」 となります。しかし、本ページでは「展開」という作業は行わす、圧縮されたファイルのまま作業を続けます。 その理由は以下の二つです。
  • microSD カードに書き込むためのツール Raspberry Pi Imagerは、圧縮されたイメージファイルのままでmicroSDカードへの書き込みができる
  • xz で圧縮されたファイルは、Windows のデフォルト環境では展開できない
以下で、圧縮されたイメージファイルをそのまま microSD カードに書き込む方法を解説します。なお、便宜上「圧縮されたイメージファイル」のことを「イメージファイル」と呼ぶことがありますので、混乱しないようご注意ください。

3. Raspberry Pi Imager による OS イメージの microSD カードへの書き込み

ここでは、Raspberry Pi用OSのインストールソフトウェアであるRaspberry Pi Imager を用いてイメージファイルを microSD カードに書き込む方法を紹介します。
インストール済のRaspberry Pi Imagerを起動するには、検索窓で「ras」などと記入して現れるRaspberry Pi Imagerをクリックします。
さて、起動したRaspberry Pi Imagerで「OS (Operating System)」の部分の「OS を選ぶ (CHOOSE OS)」ボタンをクリックしましょう。現れた画面で下図のように「Use custom (カスタムイメージを使う)」を選択します。
すると、イメージファイルの選択画面になりますので、先ほどダウンロードしたファイルを指定します。下図は、ダウンロードフォルダにダウンロードされたファイルを指定している様子です。
次に、Raspberry Pi Imagerで、「ストレージ (SD Card)」の部分の「ストレージを選ぶ (CHOOSE SD CARD)」ボタンをクリックしましょう。microSDカードが接続済であれば下図のようにカードが現れますので、クリックして選択しましょう。

なお、外付けハードディスクなどをPCに接続しているとこの選択肢が複数現れます。microSDカードを表す適切な方を選択しないと皆さんの大切なデータが壊されてしまいますので注意して選択しましょう。
あとはRaspberry Pi Imagerで「書き込む (WRITE)」ボタンをクリックしましょう。「Would you like to apply OS customization settings?」という質問に「いいえ」をクリックし、 「(中略)本当に続けますか?」に「はい」をクリックすると、書き込み (Writing)が始まります。確認 (Verifying)までが終わると、書き込みが終了します。

下図の画面が出たらmicroSDカードを取り外し、その後Raspberry Pi Imagerを終了しましょう。取り外した microSD カードを Raspberry Pi にセットして起動することになります。


Raspberry Pi用に使ったmicroSDカードをフォーマットする

1. はじめに

Raspberry PiではmicroSDカードにOSをインストールして利用します。一度Raspberry Pi用に使ったmicroSDカードは、Linux 系 OS 用に分割およびフォーマットされているため、そのままでは通常のPCで使えません。

このmicroSDカードを通常のPCで再び用いたい場合、フォーマットと呼ばれる作業を行う必要があります。

しかし、フォーマットはWindows標準の機能では行えません。そのためのソフトウェアをインストールして実行する必要があります。 2020年3月に発表されたRaspberry Piの新しいインストール用ソフトウェアであるRaspberry Pi Imagerはこのフォーマット機能を備えています。 ここではRaspberry Pi Imagerによる方法と、もう一つSDメモリカードフォーマッターというソフトウェアによる方法の2種類を紹介します。

2. ドライブ文字の確認

フォーマットをすぐ行ってもよいのですが、ここでWindowsに特有の「ドライブ文字」について先に解説します。知らなかった方はここで覚えてしまいましょう。

PCにまだmicroSDカードを接続していない状態でWindowsのエクスプローラーを起動し、左側の階層構造で「PC」をクリックします。すると、Windows 10がインストールされたストレージが下図(A)のように棒グラフで表示されます。

下図(A)の「Windows 10」の部分は自由に変更できる箇所なので、人により表記が異なります。重要なのは、「C:」と書かれた部分です。この「C」のことを「ドライブ文字」といい、下図(A)の状況のことを、「Windows 10のシステムがCドライブに格納されている」と呼びます。


なお、Windows 10のシステムがCドライブ以外に格納されていることはあり得るのですが、恐らくほとんどの方は上図と同じくCドライブにシステムがインストールされているでしょう。

PC上にCドライブ以外のドライブがあることもあります。例えば上図(B)にはDドライブが存在しますが、これは、「PCにメモリーカードリーダーが接続されているが、そのリーダーにmicroSDカードが挿入されていない」ときに現れます。

他にも、DVDドライブなどが表示されていることもあるでしょう。

このように、皆さんがお使いのPCで、microSDカードが接続される前の状態をあらかじめ頭に入れておきましょう。

ここで新品のmicroSDカードをPCに接続すると、状況は以下のように変化します。新たに、棒グラフ付きのDドライブが出現しており、これがmicroSDカードを表します。

Cドライブど同様に「MICROSD」の文字は人によって異なりますし、ドライブ文字もDドライブとは限らず、人によってさまざまなドライブ文字となることに注意してください。


なお、上図は16 GBのmicroSDカードを差した時の様子です。容量が14.4 GBと表記されていることにも注意しましょう。このように、PC上ではmicroSDカードの容量はカードの表記ぴったりの数字としては現れません。

3. Raspberry Piで使ったmicroSDカードをWindows 10に挿入すると?

さて、Raspberry Piで使ったmicroSDカードをWindowsに差し、フォーマットを行いましょう。

まず、microSDカードを挿入すると、以下のようなエラーが現れます。このエラーは今後何度も目にすると思いますが、すべて「キャンセル」をクリックして閉じてください。


「キャンセル」ボタンを押すと次のエラーが現れますが、これは「OK」ボタンを押すことで消えます。


何が起こっているのでしょうか。先ほど確認したエクスプローラーの「PC」の項目を見ることでそれが明らかになります。

下図には、
  • (A) NOOBSでOSをインストールしたmicroSDカード
  • (B) OSのイメージをインストールしたmicroSDカード
  • (C) NOOBSでOSをインストールしようとしたが失敗したmicroSDカード
の3パターンでの「PC」の状態を示しています。いずれも、microSDカードを一つしか差していないにも関わらず、複数のドライブが現れています。それぞれのドライブ文字もチェックしてください。


上図のように、Raspberry Piで Linux 系 OS 用にmicroSDカードを使うと、カードが複数の区画に分けられます。それぞれの区画をパーティションといいます。さらにいくつかのパーティションはLinux用にフォーマットされており(上図ではEドライブとGドライブ)、Windowsで中身をみることができません。

microSDカードを差したときに出たエラーは、これらEドライブやGドライブをWindowsで認識できないことに対するエラーだったのです。

ここから行うことは、これら複数のパーティションを一つに統合し、さらにWindowsで読めるようにフォーマットしなおすことです。

4. Raspberry Pi Imagerによるフォーマット

まず、2020年3月に発表されたRaspberry Pi Imagerによるフォーマット方法を解説します。

Raspberry Pi Imagerのインストール方法は、「Raspberry PiへのOSのインストール方法」をご覧ください。

インストール済のRaspberry Pi Imagerを起動するには、下図のように検索窓で「ras」などと記入することで現れるRaspberry Pi Imagerをクリックします。


起動したRaspberry Pi Imagerで、「Operating System (OS)」の部分の「CHOOSE OS (OSを選ぶ)」ボタンをクリックしましょう。下図のように「Erase (削除)」を選択します。なお、「Format card as FAT32」と書かれているように、64GB以上のmicroSDカードも FAT32 形式でフォーマットされます。


次に、「SD Card (ストレージ)」の部分の「CHOOSE SD CARD (ストレージを選ぶ)」ボタンをクリックしましょう。microSDカードがPCに接続済であれば、下図(A)のようにmicroSDカードが選択肢として現れますので、クリックして選択します。このとき、下図(A)の「D:\ E:\」のようにドライブが複数表示されることがあります。これは、下図(B)のように、Raspberry Piにより分割されたmicroSDカードの複数のパーティション(ドライブのようなもの)に相当します。

なお、外付けハードディスクなどをPCに接続していると、ここでの選択肢が複数現れます。microSDカードを表す適切な方を選択しないと皆さんの大切なデータが壊されてしまいますので注意しましょう。


あとはRaspberry Pi Imagerで「WRITE (書き込む)」ボタンをクリックしましょう。フォーマットが実行され、終了すると下図のような画面が現れますのでmicroSDカードを取り外し、その後Raspberry Pi Imagerを終了しましょう。


5. SDメモリカードフォーマッターによるフォーマット

次に、SDメモリカードフォーマッターによるフォーマット方法も紹介しておきます。Raspberry Pi Imagerが登場するまではこちらの方法が主流でした。

まず、SDメモリカードフォーマッターを事前にインストールしておく必要があります。まず、以下のページで、お使いのPC用のSDメモリーカードフォーマッターをダウンロードしてください。
SDメモリーカードフォーマッターにはWindows用とmacOS用がありますが、以下ではWindows 10を用いて解説を行います。

ダウンロードされるのは SDCardFormatterv5_WinJP.zip という名前の圧縮ファイルです。拡張子「zip」はお使いのPC環境によっては省略されて見えないかもしれません。また、バージョン番号が大きくなることもあり得ます。

このファイル上でマウスを右クリックし、下図のように「すべて展開」を選択します。現れた画面で「展開」ボタンを押してファイルを展開してください。



すると、展開されたフォルダ内に以下のように SD Card Formatter 5.0.1 Setup JP.exe という名前のファイルがあります。バージョン番号は以後大きくなっていきます。

このファイルをダブルクリックし、インストールを開始してください。デフォルトの設定のまま変更せずに進んでいけばインストールが完了します。

インストールが完了したら、フォーマットを実行しましょう。Raspberry Piで用いたmicroSDカードがWindowsに接続された状態でSDメモリカードフォーマッターを起動します。Windowsメニューから、「SD Association」→「SD Card Formatter」と辿ると見つけられます。

起動した状態が下図です。下図に赤色で示した二か所に着目しましょう。

まず、「カードの選択」の部分にこれからフォーマットするドライブのドライブ文字が書かれていることに着目してください。本ページの例ではDドライブとなっていますが、ドライブ文字は皆さんの環境で異なりますので、自分の環境でのドライブ文字が現れていることが重要です。

なお、その下には認識されたmicroSDカードの情報が記されています。この図では32 GBのmicroSDカードが接続され、容量が29.81 GBと認識されています。先ほども触れた通り、カードの表記ぴったりの数値は現れませんので注意してください。



なお、カードの選択の部分は以下のように選択式になっています。本ページの例の場合、Raspberry Piにより4つに分割されたパーティションのドライブ文字がすべて現れています。4つのうちどのドライブを選んでも同じ結果になりますが、あえて変更する必要はないでしょう。


以上を確認したら、右下の「フォーマット」ボタンを押します。すると、以下の警告が現れます。「データが消去される」とはRaspberry PiのOSのデータがすべて消えるということです。

フォーマットする対象のドライブがmicroSDカードのものであることを確認したうえで、自己責任で「はい」をクリックしましょう。


フォーマットが完了すると、下図のように正常終了を知らせる画面が現れます。


エクスプローラーの「PC」の項目で確認すると、確かに4つのパーティションが統合され、Windowsで読める形式に変換されていることがわかります。



以上です。お疲れさまでした。

2020年1月4日土曜日

Raspberry Pi + Coral USB Accelerator + TensorFlow Lite で物体検出と姿勢推定を試してみよう

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

1. はじめに

注:本ページの演習は Coral USB Accelerator をお持ちでなくても実行できます

Raspberry Pi で YOLO v3-Tiny / YOLO v3 による物体検出を試してみよう」 では、物体検出の手法である YOLO を Raspberry Pi で試しました。
上記ページの演習を実行すると本書で学んだ CNN が物体検出で使われていることを体験頂けますが、計算量が多いため、カメラからの映像に対して物体検出を行うと映像の遅れが大きいことも分かりました。

一方、ディープラーニングの計算を高速化するために、グラフィックを描画するためのハードウェアである GPU が用いられるということを聞いたことがある方もいると思います。 GPU による高速化はRaspberry Pi でも行われており、例えば Idein 社の取り組みなどがあります。

本ページでは、ディープラーニングの推論部(学習後のネットワークによる認識部)の高速化のために Coral USB Accelerator を用いる手法を紹介します。 Coral USB Accelerator は内部に Google が開発した Edge TPU と呼ばれる AI 用ハードウェアを搭載しており、Raspberry Pi に USB ケーブルで接続することで、Raspberry Pi の代わりに高速に推論の計算を実行してくれるデバイスです。


上図は Raspberry Pi 4 に Coral USB Accelerator を接続し、カメラからの映像に対して物体検出を行っている様子です。以下の物体が検出されていることがわかります。
  • chair : 椅子
  • dining table : ダイニングテーブル
  • laptop : 実際にはラップトップPCではなく小型ディスプレイ
  • cup : カップ
  • keyboard : キーボード
  • mouse : マウス
また、少し見にくいですが左上に「19.9ms」と書かれており、これは物体検出の計算に 19.9ミリ秒の時間がかかったことを示しています。これは1秒間に50回物体検出の計算を行えることを意味します。実際には他にも様々な処理が行われるため1秒ごとの計算回数はもう少し少なくなります。
この計算を Coral USB Accelerator なしで行うと約 300ms の時間がかかりますので、約 15 倍程度の高速化になっています。

本ページではこの演習を行う方法を解説します。Coral USB Accelerator を Raspberry Pi 4 に接続した様子が下図になります。

Coral USB Accelerator は例えば下記で購入できます。
1万円以上するため、気軽に購入して試してみるというわけにはいかないかもしれません。
上述したように、本ページでは「Coral USB Accelerator を使った場合」と「使わなかった場合」とで計算時間を比較しますので、Coral USB Accelerator がなくても演習を体験できます。

Raspberry Pi で YOLO v3-Tiny / YOLO v3 による物体検出を試してみよう」で用いた YOLO とは異なる物体検出の方法を用いますので、性能の違いを体験してみるのもよいでしょう。

また、本ページの末尾では Coral USB Accelerator を用いた人物の姿勢推定のプログラムの実行方法も紹介します。こちらも Coral USB Accelerator がなくても動作しますので是非試してみてください。

2. 準備とTensorFlow Liteのインストール

それでは、本ページに演習を行うための準備を解説していきます。 必要なのは下記のものです。
  • Raspbian Busterをインストールした Rasberry Pi ( Pi 3 B+ と Pi 4 B でのみ試しました)
  • Raspberry Pi 公式カメラモジュールまたはウェブカメラ(ウェブカメラは Logicool 社製のみ試しました)
  • Pytrhon3 用の OpenCV 3 がインストールされていること
  • TensorFlow 1 系がインストールされていないこと
さらに、本書を全て終えた状態の Raspberry Pi を仮定します。その状態を簡単に実現するには、まず下記のページに従い Python3 用のツールをインストールします(ただし、kerasの設定は不要です)。
そうすると、TensorFlowがインストールされた状態になります。上記ページで、TensorFlow 1 系をインストールした方は、ターミナルを起動して下記のコマンドで TensorFlow のみを削除します。 TensorFlow 1 系がインストールされている環境では本ページで用いる TensorFlow Lite のプログラムの実行ができなくなるためです。 本ページの演習が終わり、また TensorFlow が必要だと感じた時に改めて再インストールしてください。
sudo pip3 uninstall tensorflow
途中で「Proceed (y/n)?」などと(場合によっては複数回)聞かれますので、キーボードで「y」をタイプしてEnterキーを押し、処理を進めて下さい。

次に、TensorFlow Liteをインストールします。 TensorFlow Lite とは、PCなどとは異なり計算パワーが小さいコンピュータでディープラーニングの計算を行わせるためのライブラリです。例えば、Android や iPhone などのスマートフォンでディープラーニングの計算を行いたい場合にも用いられます。

上で触れたように、Raspberry Pi ではフルセットの TensorFlow が動くのですが、Coral USB Accelerator のプログラムを実行するには TensorFlow Lite が必要になるのです。

下記の2つのコマンドを一つずつ順に実行すれば TensorFlow Lite のインストールは完了です。このコマンドを含め、本ページのコマンドは長いものが多いので、コピー&貼り付けにより確実に実行してください。
wget https://github.com/google-coral/pycoral/releases/download/release-frogfish/tflite_runtime-2.5.0-cp37-cp37m-linux_armv7l.whl

sudo pip3 install tflite_runtime-2.5.0-cp37-cp37m-linux_armv7l.whl
次に、Coral USB Accelerator を使うためのライブラリのインストールを行います。下記の4つのコマンドを一つずつ順に実行すれば完了です。なお、このコマンドは「Get started with the USB Accelerator」ページで解説されているものです。
echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list

curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

sudo apt update

sudo apt install libedgetpu1-std
ここまでが終わったら Raspberry Pi を再起動してください。

3. カメラから得られた画像に対する物体認識

それでは、Coral USB Accelerator で物体検出を試してみましょう。

まず、Coral USB Accelerator を持っている場合は、それを Raspberry Pi に接続しておきましょう。このとき、Raspberry Pi 4 をお使いの方は USB3 ポートに接続するようにしましょう。コネクタの色が青いのが USB3 ポートです。コネクタの色が黒い USB2 ポートに接続するよりも Coral USB Accelerator が高速に動作します。

また、Raspberry Pi 公式カメラモジュールまたはウェブカメラを Raspberry Pi に接続しましょう。Raspberry Pi 公式カメラモジュールをお使いの方は、設定アプリケーションでカメラを有効にすることを忘れないでください。これは本書でも行ったことですね。

それでは、まずサンプルアプリケーションをダウンロードし、さらに 学習済のデータファイルのダウンロードを行います。ターミナルを起動し、下記のコマンドを一つずつ順に実行して下さい。
git clone https://github.com/neuralassembly/CoralOpenCV.git

cd CoralOpenCV/object_detection

bash install_requirements.sh
一つ目のコマンドでサンプルファイル全体のダウンロードを行っており、二つ目のコマンドでプログラムの存在するディレクトリへ移動し、三つ目のコマンドで学習済のデータファイルをダウンロードしています。なお、このサンプルファイルは Coral USB Accelerator 公式のサンプルファイルに、筆者が OpenCV によるカメラ対応を追加したものです。

さて、上のコマンドを実行したターミナルでそのまま下記を実行すれば物体検出が行われます。
python3 detect_opencv.py --model models/ssd_mobilenet_v2_coco_quant_postprocess_edgetpu.tflite --labels models/coco_labels.txt 
Coral USB Accelerator をお持ちではない場合、下記のコマンドを実行してください。
python3 detect_opencv.py --model models/ssd_mobilenet_v2_coco_quant_postprocess.tflite --labels models/coco_labels.txt 
なお、上記コマンドを実行する前にターミナルを一度閉じている場合、先に「cd CoralOpenCV/object_detection」コマンドによりディレクトリの移動を行ってから上記コマンドを実行してください。

なお、上記どちらかのコマンドでエラーが出る場合、一旦下記のコマンドで古いフォルダを削除し…
rm -rf ~/CoralOpenCV/
そして上の「git clone https://github.com/neuralassembly/CoralOpenCV.git」から始まる3コマンドを実行しなしてください。 それで問題が解消する場合があります。

プログラムが正しく動作すれば冒頭に示した図のように、検出された物体の位置に青い枠と名称が表示されます。


一枚の画像に対して物体検出を実行するのにかかる時間が映像の左上に表示されています。筆者が試したところ、おおよそ下記のような数値が得られました。Coral USB Accelerator を Raspberry Pi 4 の USB3 ポートに接続するのが最速ですが、USB2 ポートに接続した場合でも十分に恩恵を受けられることがわかります。

Pi 4 B + Coral USB Accelerator (USB3)20 ms
Pi 4 B + Coral USB Accelerator (USB2)45 ms
Pi 4 B + Coral なし300 ms
Pi 3 B+ + Coral USB Accelerator (USB2)60 ms
Pi 3 B+ + Coral なし590 ms

Raspberry Pi で YOLO v3-Tiny / YOLO v3 による物体検出を試してみよう」 で用いた YOLO と比較すると、Coral USB Accelerator を用いない場合であっても YOLO よりも高速に動作しているように感じます。

それは、この学習済ネットワークには Google により開発された MobileNetV2 + SSDLite という、高速化を意識したネットワークが用いられているからです。 ただし、学習用のデータセットはYOLOと同じCOCOが用いられているため、検出される物体は共通です。検出される物体のリストはこちらにあります。番号が 89 まで振られていますが、数字に抜けがあるので実際には 80 種類の物体を検出できます。

これくらいの速度で動作すると、周囲の物体検出をしながら動作するロボットの作成も現実的ではないでしょうか。

なお、プログラムを終了したい場合は、本書のプログラムと同様、認識の画面上でキーボードの「q」をタイプしてください。

4. (おまけ1)カメラから得られた画像に対する分類

以上で本ページの本題は終わりですが、ダウンロードしたサンプルプログラムには、「映像中に映っている物体の名称を表示する」という分類のプログラムもあるのでその解説もしておきます。 先ほどの物体検出との違いは、こちらのプログラムでは「映像に映っている物体は一つ」であることが前提されていることです。

下記のコマンドにより、分類用の学習データのダウンロードを行います。
cd ~/CoralOpenCV/classification

bash install_requirements.sh
そして、そのまま下記を実行します。
python3 classify_opencv.py --model models/mobilenet_v1_1.0_224_quant_edgetpu.tflite --labels models/labels_mobilenet_quant_v1_224.txt
Coral USB Accelerator をお持ちではない場合、下記のコマンドを実行してください。
python3 classify_opencv.py --model models/mobilenet_v1_1.0_224_quant.tflite --labels models/labels_mobilenet_quant_v1_224.txt
プログラムが動作すると、以下のように映像中に映っている物体(一つ)の名称が画面上部に表示されます。


こちらでは Google により開発された MobileNet V1 というネットワークが用いられています。 認識できる物体はホームディレクトリの「 CoralOpenCV/classification/models/labels_mobilenet_quant_v1_224.txt 」というテキストファイルに 1001 の英語の名称のリストが列挙されていますので、興味のある方は開いて確認してみてください。

4. (おまけ2)カメラに映っている人物の姿勢を推定する

もう一つ、カメラに映っている人物の姿勢を推定するプログラムの実行方法を紹介します。 人物の姿勢推定は、Microsoft の Kinect というデバイスを用いる方法が有名ですが、この例ではそれをディープラーニングにより通常のカメラで実現します。

こちらはサンプルプログラムをダウンロードして実行することにより、PoseNetというモデルを実行します。

まず、ターミナルを起動して下記の2つのコマンドを一つずつ順に実行し、必要なライブラリをインストールします。
sudo apt update

sudo apt install python3-edgetpu
なお、python3-edgetpu をインストールすると、互換性の問題で上でインストールした libedgetpu1-std が削除され、上の物体検出と分類の演習が行えなくなります。もう一度上の物体検出と分類の演習を実行したい場合、下記コマンドで libedgetpu1-std を再インストールしてください。ただしそうすると、たった今インストールした python3-edgetpu が削除され、今度は姿勢推定の演習が行えなくなります。面倒ですね。
sudo apt install libedgetpu1-std
さて、python3-edgetpu がインストールされた状態で、下記の4つのコマンドを一つずつ順に実行し、サンプルプログラムをダウンロードして実行環境を準備します。なお、このサンプルファイルは Coral USB Accelerator 公式のサンプルファイルに、Coral USB Accelerator がない場合のサポートを筆者が加えたものです。
cd ~/

git clone https://github.com/neuralassembly/project-posenet.git

cd project-posenet

bash install_requirements.sh
以上が終わったら、2つのコマンドを一つずつ順に実行してプログラムを実行します。
cd ~/project-posenet

python3 pose_camera.py 
Coral USB Accelerator をお持ちでない方は、以下のコマンドを実行してください。
cd ~/project-posenet

python3 pose_camera_cpu.py 
すると、下記のようにカメラの前の人物の姿勢(および目、鼻、耳)が線で表示されます。


なお、このプログラムはカメラの前に人が立つことを想定したものですが、プライバシーに配慮してフィギュアを用いた例になっておりますことをご了承ください。

また、このプログラムは、キーボードの「Ctrl-c」によりプログラムを終了します。
初回の実行時はプログラムの動作が遅いですが、コンソール上でキーボードで「Ctrl-c」を押して一旦プログラムを終了し、再びプログラムを起動するとそれ以降は快適に動作する印象があります。

また、カメラの前に人が立って動く際、映像の左右を反転させると鏡のようになって直感的に理解しやすい映像となります。コマンドライン引数「--mirror」を付けた以下のコマンドにより実行すると、この動作を実現できます。
python3 pose_camera.py --mirror 
Coral USB Accelerator をお持ちでない方は、以下のコマンドです。
python3 pose_camera_cpu.py --mirror 
なお、PoseNet では人間までの距離を知ることはできません。RealSense というセンサを用いて、人間までの距離も求める方法を 「Raspberry Pi + RealSense + Coral USB Accelerator + PoseNet で深度情報と姿勢情報を表示する」に記しました。RealSense をお持ちでない方も読み物としてお楽しみください。

また、PoseNet の動作原理を知りたいという方は、別サイト内の 「姿勢推定を行うPoseNetをWindowsなどのPCで実行する」というページの末尾にに解説を記しましたので興味のある方はご覧ください。

6. おわりに

Raspberry Pi + Coral USB Accelerator + TensorFlow Lite で物体検出を試してみました。Google により提案された MobileNet という高速なネットワークが、Coral USB Accelerator によりさらに高速に実行できることを体験できました。

ディープラーニングがより普及するには、このように計算能力が高くないデバイスにも計算が高速に実行ができる仕組みが重要になると思われます。