ラズベリーパイ3で顔認識 でやった顔照合や、Jetson NanoでDlibをビルドして顔認識でGPUを使ってみるのドアベル・カメラを、趣向を変えてJetson Nano+コンテナ+USBカメラでやってみます。
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でも可能なようです。トレーニングは….無理です)
以下の顔照合では、128次元でエンコードした顔データを使っています。
顔照合
ホスト側
作業用ディレクトリを作って、ソースをクローン
カメラ表示用にxhostを実行
デフォルトのコードで実行してみます。オプションについてはREADME_Japanese.pdfをご参照ください。
こんな感じです。
デフォルトのコードでは、毎回起動時に顔画像を読み込んでエンコードするので、その分都度時間がかかります。
画像のエンコードファイルを作っておいて、それを読み込むだけにすれば、起動は速くなります。
読み込みの都合上、ファイル名は数字にしておくと便利です。
画像ファイル(obama.jpg、biden.jpg)と同じところに以下のようなファイルを作っておきます。
【make_encoding.py】
こんな感じで実行。
1.json、2.json というファイルが作成されます。
上記の、起動時に顔画像を読み込んでエンコードするところを、以下のようにjsonファイルを読み込むだけにします。
これで起動は少々速くなります。
face_recognition の認識の仕組みや精度については以下の最終ページをご参照ください。
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]}
Leave a Reply