face_recognitionのGithubで紹介されているように、機械学習・ディープラーニング方面で使うにはCPUのみのラズパイは非力です。GPUを積んでいるJetson Nano を使ってみましょう。
ライブラリにdlibが使われています(Dlib wi-ki)。
ご参考までに、Dlibチート・シート
ちなみにラズパイの場合はラズベリーパイ3で顔認識 をご覧ください。
demo用コードはこういうDoorbell Cameraです。
まずは以下のサイトを参考にDlibをコンパイルして、face_recognitionをJetcardに構築してみます。
Build a Hardware-based Face Recognition System for $150 with the Nvidia Jetson Nano and Python
(Using Python 3.6, OpenCV, Dlib and the face_recognition module)
Jetcardのセットアップはこのページ参照
注:Jetcardにはpip(19.1.1)、numpy(1.16.4)は既に実装されていますので、その部分は端折っています。
また原文中で「Jetson Nano board」という表現がありますが、これがJetson Nano の一般名称のようです。
Installing Required Python Libraries
必要なPythonライブラリのインストール
First, we are updating apt, which is the standard Linux software installation tool that we’ll use to install everything else. Next, we are installing some basic libraries with apt that we will need later to compile dlib.
まず、aptを更新します。これは、他のすべてをインストールするために使用する標準のLinuxソフトウェアインストールツールです。 次に、後でdlibをコンパイルするために必要になるaptを使用していくつかの基本的なライブラリをインストールします。
Before we go any further, we need to create a swapfile. The Jetson Nano only has 4GB of RAM which won’t be enough to compile dlib. To work around this, we’ll set up a swapfile which lets us use disk space as extra RAM. Luckily, there is an easy way to set up a swapfile on the Jetson Nano. Just run these two commands:
先に進む前に、スワップファイルを作成する必要があります。 Jetson Nanoには4GBのRAMしかないため、dlibをコンパイルするのに十分ではありません。 これを回避するために、ディスクスペースを追加のRAMとして使用できるようにするスワップファイルを設定します。 幸い、JetsonNanoにスワップファイルを設定する簡単な方法があります。 次の2つのコマンドを実行するだけです。
以下のコマンドのデフォルトは6GBです。-s オプションでサイズは指定できます。
At this point, you need to reboot the system to make sure the swapfile is running. If you skip this, the next step will fail. You can reboot from the menu at the top right of the desktop.
When you are logged back in, open up a fresh Terminal window and we can continue.
この時点で、システムを再起動して、スワップファイルが実行されていることを確認する必要があります。 これをスキップすると、次のステップは失敗します。 デスクトップの右上にあるメニューから再起動できます。
再度ログインしたら、新しいターミナルウィンドウを開いてください。続行できます。
Now we are ready to install dlib, a deep learning library created by Davis King that does the heavy lifting for the face_recognition library.
However, there is currently a bug in Nvidia’s own CUDA libraries for the Jetson Nano that keeps it from working correctly. To work around the bug, we’ll have to download dlib, edit a line of code, and re-compile it. But don’t worry, it’s no big deal.
In Terminal, run these commands:
これで、Davis Kingによって作成されたdlibをインストールする準備が整いました。これは、face_recognitionライブラリの手間のかかる作業を行います。
ただし、現在、Jetson Nano用のNvidia独自のCUDAライブラリには、正しく機能しないというバグがあります。 バグを回避するには、dlibをダウンロードし、コード行を編集して、再コンパイルする必要があります。 でも心配しないでください、大したことではありません。
ターミナルで、次のコマンドを実行します。
That will download and uncompress the source code for dlib. Before we compile it, we need to comment out a line. Run this command:
これにより、dlibのソースコードがダウンロードおよび解凍されます。 コンパイルする前に、1行コメントアウトする必要があります。 次のコマンドを実行します。
This will open up the file that we need to edit in a text editor. Search the file for the following line of code (which should be line 854):
これにより、テキストエディタで編集する必要のあるファイルが開きます。 次のコード行(854行目)をファイルで検索します。
forward_algo = forward_best_algo;
And comment it out by adding two slashes in front of it, so it looks like this:
そして、その前に2つのスラッシュを追加してコメントアウトすると、次のようになります。
//forward_algo = forward_best_algo;
Now save the file, close the editor, and go back to the Terminal window. Next, run these commands to compile and install dlib:
次に、ファイルを保存し、エディターを閉じて、ターミナルウィンドウに戻ります。 次に、次のコマンドを実行して、dlibをコンパイルしてインストールします。
Finally, we need to install the face_recognition Python library. Do that with this command:
最後に、face_recognitionPythonライブラリをインストールする必要があります。 このコマンドでそれを行います:
30分弱かかりました。
Running the Face Recognition Doorbell Camera Demo App
face_recognitionPythonライブラリを使ったDoorbell Camera Demo Appを使ってみます。
It lets you detect faces, turn each detected face into a unique face encoding that represents the face, and then compare face encodings to see if they are likely the same person — all with just a couple of lines of code.
Using that library, I put together a doorbell camera application that can recognize people who walk up to your front door and track each time the person comes back. Here’s it looks like when you run it:
これを使って、顔を検出し、検出された各顔を顔を表す一意の顔エンコーディングに変換し、顔エンコーディングを比較して、同じ人物である可能性が高いかどうかを確認できます。すべて、わずか数行のコードで実行できます。
そのライブラリを使用して、玄関まで歩いてきた人を認識し、戻ってくるたびに追跡できるドアベルカメラアプリケーションを作成しました。
コードは以下でダウンロードできます。
Then you can run the code and try it out:
次に、コードを実行して試してみることができます。
注:キャリブレーションに失敗する場合は、1280 と720 を検索して解像度を修正してください(2か所あります)。
Raspi 用のカメラ(V2)を使ってみます。こんな感じで動くそうです。
左上の小窓に何回目の訪問なのか、回数がカウントされています。
You’ll see a video window pop up on your desktop. Whenever a new person steps in front of the camera, it will register their face and start tracking how long they have been near your door. If the same person leaves and comes back more than 5 minutes later, it will register a new visit and track them again. You can hit ‘q’ on your keyboard at any time to exit.
The app will automatically save information about everyone it sees to a file called known_faces.dat. When you run the program again, it will use that data to remember previous visitors. If you want to clear out the list of known faces, just quit the program and delete that file.
デスクトップにビデオウィンドウがポップアップ表示されます。 新しい人がカメラの前に足を踏み入れると、顔が登録され、ドアの近くにいる時間を追跡し始めます。 同じ人が5分以上後に離れて戻ってきた場合、新しい訪問を登録し、再度追跡します。 キーボードの「q」を押すと、いつでも終了できます。
アプリは、表示されたすべての人に関する情報をknown_faces.datというファイルに自動的に保存します。 プログラムを再度実行すると、そのデータを使用して以前の訪問者を記憶します。 既知の顔のリストをクリアしたい場合は、プログラムを終了してそのファイルを削除してください。
つまり、何回訪問したかを知らせてくれる……ってことのようです。複数人数登録可能です。
.datファイルはバイナリなので直接のぞけませんが、ソースコードを見て解析ツールを作ってみましょう。
データファイルは顔エンコーディングデータと回数などのメタデータのリストがpickle化されたものだそうです。
python3 -m pickle known_faces.dat で見ることはできますね。
動作中をjetson-statsで確認してみます。
GPUがフルで稼働しています(赤い矢印)。
jetson-statsのインストール
$sudo -H pip3 install jetson-stats
実行
$sudo jtop
こんな感じ、温度もモニターできます。
キーボード、1:ALL、2:GPU、3:CTRL、4:INFO Q:終了
ALLの画面
【doorcam.py】
$150と謳ってますが、104円/$として、4GBモデルでは予算オーバーしますが、Jetson Nano 2GBモデルならカメラモジュールも含めてギリこの価格でいけますね(KB・マウス・HDMI高解像度モニターは既存のものを流用するとする、なおHDMI変換コネクターはJetsonでは使えませんー>使えないのは初期モデルのA02でした)。
ちなみにJetsonの場合、でかいヒートシンクが乗っていますが、冷却ファンも必須のようです。
NVIDIA Jetson Nano 2GB 開発者キット JETSON NANO 2GB DEV:6820円
Official Site(2GBメモリに最適化されたOSイメージもここからダウンロードできます)
NVIDIA Jetson Nanoケース、冷却ファン付き:1399円
USB Type-C 電源アダプター 5V /3A:1390円
64GB MicroSD Card(Class 10、UHS-I、正規品):1500円
Raspberry Pi Camera Module V2 カメラモジュール:3200円
[Amazon調べ]
Next
Doorbell Camera Python Code Walkthrough
Want to know how the code works? Let’s step through it.
Doorbell Cameraがどんなふうに動くのかPythonコードを一歩づつ追いかけてみましょう。
ついでに、ラズベリーパイ3で顔認識で使っている顔識別コードをJetson用に修正する方法も追加しています。
Doorbell Camera の顔認識コードを一歩づつ理解する
Leave a Reply