ラズベリーパイ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)を使います。
1 |
sudo docker pull nvcr.io/nvidia/l4t-ml:r32.5.0-py3 |
作業用フォルダーを作っておきます。jetson の部分は各自のアカウント名で適宜変更してください。
1 |
mkdir /home/jetson/work-dlib |
SWAPを6GBほど確保しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
sudo swapoff -a sudo fallocate -l 6G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile free -h //恒久化 sudo cp -p /etc/fstab{,.bak} echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab /swapfile none swap sw 0 0 |
コンテナ作成‘
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
起動
1 |
sudo docker start -i my_dlib |
アップデート&アップグレードとライブラリやパッケージのインストール
1 2 3 4 5 6 7 8 9 10 11 |
apt update apt upgrade -y apt install python-pip python3-pip -y python3 -m pip install --upgrade pip apt install wget apt install nano apt install unzip apt install libcanberra-gtk* -y |
dlib ビルド用に依存パッケージなどをインストールしておきます。
1 |
apt install cmake libopenblas-dev liblapack-dev libjpeg-dev -y |
ソースを取ってきます。
1 2 3 |
wget http://dlib.net/files/dlib-19.17.tar.bz2 tar jxvf dlib-19.17.tar.bz2 cd dlib-19.17 |
ソースを一部変更。
1 |
nano dlib/cuda/cudnn_dlibapi.cpp |
以下をコメントアウトします(一か所だけです)。
//forward_algo = forward_best_algo;
ビルド&インストール
1 2 |
python3 setup.py install pip3 install face_recognition |
ドアベル・カメラ
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:
これを使って、顔を検出し、検出された各顔を顔を表す一意の顔エンコーディングに変換し、顔エンコーディングを比較して、同じ人物である可能性が高いかどうかを確認できます。すべて、わずか数行のコードで実行できます。
そのライブラリを使用して、玄関まで歩いてきた人を認識し、戻ってくるたびに追跡できるドアベルカメラアプリケーションを作成しました。
ホスト側でソースをダウンロードしておきます。
1 2 3 4 |
mkdir /home/jetson/work-dlib/doorcam cd /home/jetson/work-dlib/doorcam wget -O doorcam.py tiny.cc/doorcam |
コンテナを起動して、作業ディレクトリに移動
1 2 3 4 |
sudo docker start -i my_dlib cd /work/doorcam nano doorcam.py |
ソースをちょっち変更
【doorcam.py】
ここを変更します。GStreamerは使いません。
1 2 3 4 5 6 7 8 9 |
def main_loop(): # Get access to the webcam. The method is different depending on if this is running on a laptop or $ if running_on_jetson_nano(): # Accessing the camera with OpenCV on a Jetson Nano requires gstreamer with a custom gstreamer $ video_capture = cv2.VideoCapture(get_jetson_gstreamer_source(), cv2.CAP_GSTREAMER) else: # Accessing the camera with OpenCV on a laptop just requires passing in the number of the webca$ # Note: You can pass in a filename instead if you want to process a video file instead of a liv$ video_capture = cv2.VideoCapture(0) |
↓
1 2 3 |
def main_loop(): # video_capture = cv2.VideoCapture(0) |
コンテナを一度終了
ホスト側で以下を実行
1 2 3 |
sudo xhost si:localuser:root sudo docker start -i my_dlib |
ドアベル・カメラのディレクトリに移動して実行
1 2 3 |
cd /work/doorcam python3 doorcam.py |
こんな感じ。
ちなみに、この顔の女性は現実には存在しません。StyleGANを使って512次元ベクトルでゼロからコーディングされた女性の顔です。(学習済みのStyleGANを使って画像生成することはNanoでも可能なようです。トレーニングは….無理です)
以下の顔照合では、128次元でエンコードした顔データを使っています。
顔照合
ホスト側
作業用ディレクトリを作って、ソースをクローン
1 2 3 |
mkdir /home/jetson/work-dlib/collation cd /home/jetson/work-dlib/collation git clone --single-branch https://github.com/ageitgey/face_recognition.git |
カメラ表示用にxhostを実行
1 |
sudo xhost si:localuser:root |
デフォルトのコードで実行してみます。オプションについてはREADME_Japanese.pdfをご参照ください。
1 2 3 4 |
sudo docker start -i my_dlib cd /work/collation/face_recognition/examples python3 facerec_from_webcam_faster.py --cpus 4 --tolerance 0.54 |
こんな感じです。
デフォルトのコードでは、毎回起動時に顔画像を読み込んでエンコードするので、その分都度時間がかかります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# Load a sample picture and learn how to recognize it. obama_image = face_recognition.load_image_file("obama.jpg") obama_face_encoding = face_recognition.face_encodings(obama_image)[0] # Load a second sample picture and learn how to recognize it. biden_image = face_recognition.load_image_file("biden.jpg") biden_face_encoding = face_recognition.face_encodings(biden_image)[0] # Create arrays of known face encodings and their names known_face_encodings = [ obama_face_encoding, biden_face_encoding ] known_face_names = [ "Barack Obama", "Joe Biden" ] |
画像のエンコードファイルを作っておいて、それを読み込むだけにすれば、起動は速くなります。
読み込みの都合上、ファイル名は数字にしておくと便利です。
画像ファイル(obama.jpg、biden.jpg)と同じところに以下のようなファイルを作っておきます。
【make_encoding.py】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import cv2 import face_recognition import json import sys args = sys.argv image = face_recognition.load_image_file(args[1]) e_name = args[1].split(".")[0] e_num = args[2] def get_EncodingData(e_name,img): loaded_face_encodings = face_recognition.face_encodings(img)[0] encoding_data = loaded_face_encodings.tolist() result = { "name":e_name, "data": encoding_data } return result data = get_EncodingData(e_name,image) json_name = e_num + ".json" with open(json_name, 'w') as fp: json.dump(data, fp) |
こんな感じで実行。
1 2 |
python3 make_encoding.py "obama.jpg" 1 python3 make_encoding.py "biden.jpg" 2 |
1.json、2.json というファイルが作成されます。
上記の、起動時に顔画像を読み込んでエンコードするところを、以下のようにjsonファイルを読み込むだけにします。
1 2 3 4 5 6 7 8 9 10 11 12 |
import json known_face_encodings = [] known_face_names = [] for i in range(2): f = open(str(i+1)+".json", 'r') json_data = json.load(f) name = json_data["name"] known_face_names.append(name) enc_data = json_data["data"] known_face_encodings.append(enc_data) |
これで起動は少々速くなります。
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