Jetson Nanoで学習済みモデルを使って、いろいろやってみる(6)顔識別(Dlib)


ラズベリーパイ3で顔認識 でやった顔照合や、Jetson NanoでDlibをビルドして顔認識でGPUを使ってみるのドアベル・カメラを、趣向を変えてJetson Nano+コンテナ+USBカメラでやってみます。

dlibDlib wi-kiチート・シート

USBカメラを使うのは、コンテナ内からはラズパイ用カメラ(V2)のようなCSIカメラインターフェースに接続できないからです(2021/04/06現在)。

 

こういうのです。


顔識別2題

ドアベル・カメラ

顔照合

 


まずは、Jetson Nano に、ベースになる共通 のコンテナを構築しておきます。

OS はJetPack 4.5.1 (L4T R32.5.1)

OpenCV(4.1.1)が実装済みのコンテナイメージ(nvcr.io/nvidia/l4t-ml:r32.5.0-py3)を使います。

作業用フォルダーを作っておきます。jetson の部分は各自のアカウント名で適宜変更してください。

SWAPを6GBほど確保しておきます。

コンテナ作成‘

sudo docker create -it --name my_dlib --gpus all --network host -e DISPLAY=$DISPLAY --device /dev/video0:/dev/video0 -v /home/jetson/work-dlib:/work -v /tmp/.X11-unix/:/tmp/.X11-unix nvcr.io/nvidia/l4t-ml:r32.5.0-py3

起動

アップデート&アップグレードとライブラリやパッケージのインストール

 

dlib ビルド用に依存パッケージなどをインストールしておきます。

ソースを取ってきます。

ソースを一部変更。

以下をコメントアウトします(一か所だけです)。

//forward_algo = forward_best_algo;

 

ビルド&インストール

 

コンテナを一度終了

 


ドアベル・カメラ

 

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:
これを使って、顔を検出し、検出された各顔を顔を表す一意の顔エンコーディングに変換し、顔エンコーディングを比較して、同じ人物である可能性が高いかどうかを確認できます。すべて、わずか数行のコードで実行できます。
そのライブラリを使用して、玄関まで歩いてきた人を認識し、戻ってくるたびに追跡できるドアベルカメラアプリケーションを作成しました。

詳細はこちら

ホスト側でソースをダウンロードしておきます。

コンテナを起動して、作業ディレクトリに移動

ソースをちょっち変更

 

【doorcam.py】

ここを変更します。GStreamerは使いません。

 

 

コンテナを一度終了

ホスト側で以下を実行

ドアベル・カメラのディレクトリに移動して実行

こんな感じ。

ちなみに、この顔の女性は現実には存在しません。StyleGANを使って512次元ベクトルでゼロからコーディングされた女性の顔です。(学習済みのStyleGANを使って画像生成することはNanoでも可能なようです。トレーニングは….無理です)

StyleGAN を使った画像生成

以下の顔照合では、128次元でエンコードした顔データを使っています。

 


顔照合

 

ホスト側

作業用ディレクトリを作って、ソースをクローン

カメラ表示用にxhostを実行

 

デフォルトのコードで実行してみます。オプションについてはREADME_Japanese.pdfをご参照ください。

こんな感じです。

デフォルトのコードでは、毎回起動時に顔画像を読み込んでエンコードするので、その分都度時間がかかります。

 

画像のエンコードファイルを作っておいて、それを読み込むだけにすれば、起動は速くなります。

読み込みの都合上、ファイル名は数字にしておくと便利です。

画像ファイル(obama.jpg、biden.jpg)と同じところに以下のようなファイルを作っておきます。

【make_encoding.py】

こんな感じで実行。

1.json、2.json というファイルが作成されます。

上記の、起動時に顔画像を読み込んでエンコードするところを、以下のようにjsonファイルを読み込むだけにします。

これで起動は少々速くなります。

 


face_recognition の認識の仕組みや精度については以下の最終ページをご参照ください。

README_Japanese.pdf

dlibが作成された際のデータセットに偏り(?)があるので、精度には注意が必要です。

では、dlibの再学習は可能かというと…..、できないことはないようですけどやめといたほうがいいかも(~~)。

 


Appendix

バイデンさんのエンコーディングデータはこんな感じです。

 

{“name”: “biden”, “data”: [0.0021262913942337036, 0.18151697516441345, 0.08942946791648865, -0.02890673279762268, -0.13226932287216187, 0.04053925350308418, -0.03351207822561264, -0.07746180146932602, 0.05412473529577255, -0.056906808167696, 0.24183109402656555, -0.05402807891368866, -0.2574354112148285, -0.05157363787293434, 0.06138315051794052, 0.12605756521224976, -0.1494627594947815, -0.06552805006504059, -0.20102559030056, -0.06235632300376892, -0.011033793911337852, -0.041001610457897186, 0.025937143713235855, -0.07272571325302124, -0.20662078261375427, -0.23533891141414642, -0.04712093248963356, -0.10228276997804642, -0.027894964441657066, -0.16243913769721985, 0.07824218273162842, -0.030843913555145264, -0.14441725611686707, -0.05164240300655365, -0.04710124433040619, -0.029858365654945374, -0.01722830720245838, -0.058473408222198486, 0.13154450058937073, 0.0262634065002203, -0.1789228916168213, 0.13025912642478943, 0.007335193455219269, 0.21587210893630981, 0.2947481870651245, -0.005235936492681503, 0.047170139849185944, -0.08853557705879211, 0.1362624615430832, -0.24181866645812988, 0.05437324941158295, 0.034989625215530396, 0.1680707186460495, 0.057698048651218414, 0.1424441635608673, -0.0731722041964531, 0.02392233908176422, 0.18972888588905334, -0.20062503218650818, 0.03737666830420494, 0.05043874680995941, -0.054821375757455826, 0.0341150239109993, -0.043492335826158524, 0.1230146586894989, 0.1102420836687088, -0.009777061641216278, -0.09036187827587128, 0.19369077682495117, -0.0951979011297226, -0.11277233064174652, 0.030787639319896698, -0.06616239994764328, -0.12772178649902344, -0.3352625072002411, 0.0010787732899188995, 0.2703644633293152, 0.1360216736793518, -0.29611098766326904, -0.07562287151813507, -0.04549194127321243, 0.00518055260181427, 0.03369441255927086, 0.008341815322637558, -0.03430062532424927, -0.13692577183246613, -0.05488766357302666, -0.014375559985637665, 0.24373626708984375, -0.10935874283313751, 0.007043739315122366, 0.22373422980308533, 0.048021696507930756, -0.14844165742397308, 0.055711809545755386, -0.03593145310878754, -0.11785192042589188, -0.015106432139873505, -0.1176922395825386, -0.05191788077354431, -0.02262577973306179, -0.15878260135650635, -0.03007996454834938, 0.06657009571790695, -0.26241180300712585, 0.16402582824230194, -0.014173565432429314, -0.07986989617347717, -0.05631709843873978, -0.04092157259583473, 0.012447170913219452, 0.06576451659202576, 0.22907105088233948, -0.24998793005943298, 0.2010732889175415, 0.2281816601753235, -0.0575941726565361, 0.07731681317090988, 0.012065321207046509, 0.06270898878574371, -0.03904259204864502, 0.03572970628738403, -0.0862085223197937, -0.13285425305366516, -0.004300281405448914, -0.021234575659036636, 0.00961276888847351, 0.06677745282649994]}


 

 

Be the first to comment

Leave a Reply

Your email address will not be published.


*