はじめに
近年、コンピュータービジョンの人気が高まり、別の方向で際立っています。 開発者は、世界中で使用される新しいアプリケーションを作成しています。
この方向で、私はオープンソースの概念に惹かれています。 テクノロジーの巨人でさえ、誰もが新しい発見や技術革新を共有する準備ができているので、テクノロジーが金持ちの特権のままではありません。
これらの技術の1つは顔認識です。 正しく倫理的に使用すると、この技術は生活の多くの分野に適用できます。
この記事では、オープンソースのツールを使用して効果的な顔認識アルゴリズムを作成する方法を示します。 この情報に進む前に、このビデオを見て、準備をし、インスピレーションを得てください。
顔認識:潜在的なアプリケーション
顔認識技術のアプリケーションのいくつかの潜在的な分野を以下に示します。
ソーシャルネットワークでの顔認識 。 Facebookは、画像の手動タグ付けを、プラットフォームにアップロードされた各画像に対して自動的に生成されたタグ候補に置き換えました。 Facebookは、単純な顔認識アルゴリズムを使用して画像内のピクセルを分析し、それぞれのユーザーと比較します。
セキュリティにおける顔認識 。 顔認識技術を使用して個人データを保護する簡単な例は、スマートフォンを「顔を合わせて」ロック解除することです。 この技術は、アクセスシステムにも実装できます。人がカメラを覗き込み、カメラに入るかどうかを決定します。
人の数を数える顔認識 。 顔認識技術を使用して、イベント(会議やコンサートなど)に参加している人の数を数えることができます。 参加者を手動で数える代わりに、参加者の顔の画像をキャプチャし、訪問者の総数を提供できるカメラをインストールします。 これにより、プロセスを自動化して時間を節約できます。
システム設定:ハードウェアおよびソフトウェアの要件
使用可能なオープンソースツールに連絡して、顔認識技術の使用方法を検討してください。
推奨する次のツールを使用しました。
- Lenovo E470 ThinkPadラップトップ(Core i5 7th Gen)でリアルタイムの顔認識モデルを構築するためのWebcam(Logitech C920)。 また、ラップトップの内蔵カメラまたはビデオカメラを適切なシステムで使用して、私が使用したビデオの代わりにリアルタイムビデオを分析することもできます。
- ビデオ処理を高速化するには、グラフィックプロセッサを使用することをお勧めします。
- Ubuntu 18.04オペレーティングシステムと必要なすべてのソフトウェアを使用しました。
顔認識のモデルの構築を開始する前に、これらのポイントをより詳細に分析します。
ステップ1:ハードウェアのセットアップ
カメラが正しく構成されているか確認してください。 Ubuntuの場合、これは簡単です。デバイスがオペレーティングシステムによって認識されているかどうかを確認します。 これを行うには、次の手順を実行します。
- Webカメラをラップトップに接続する前に、コマンドプロンプトで「
ls /dev/video*
と入力して、接続されているすべてのビデオデバイスを確認します。 その結果、システムに接続されているすべてのビデオデバイスのリストが表示されます。 - Webカメラを接続して、コマンドを再発行してください。 Webカメラが正しく接続されている場合、コマンドの結果として新しいデバイスが反映されます。
- また、ウェブカメラソフトウェアを使用して、正しい動作を確認することもできます。 UbuntuはこれにCheeseプログラムを使用できます。
ステップ2:ソフトウェアのセットアップ
ステップ2.1:Pythonをインストールする
この記事のコードは、Python(バージョン3.5)を使用して書かれています。 Pythonをインストールするには、データの処理と分析に一般的なPythonディストリビューションであるAnacondaを使用することをお勧めします。
ステップ2.2:OpenCVのインストール
OpenCVは、コンピュータービジョンアプリケーションを作成するために設計されたオープンソースライブラリです。 OpenCVのインストールは、
pip
を使用して行われます。
pip3 install opencv-python
ステップ2.3:face_recognition APIを設定する
世界で最も単純なPython顔認識APIと見なされる
face_recognition API
を使用し
face_recognition API
。 インストールするには、次を使用します。
pip install dlib pip install face_recognition
実装
システムをセットアップしたら、実装に進みます。 始めるために、プログラムを作成してから、何をしたかを説明します。
ウォークスルー
face_detector.py
ファイルを作成し、
face_detector.py
のコードをコピーします。
# import libraries import cv2 import face_recognition # Get a reference to webcam video_capture = cv2.VideoCapture("/dev/video1") # Initialize variables face_locations = [] while True: # Grab a single frame of video ret, frame = video_capture.read() # Convert the image from BGR color (which OpenCV uses) to RGB color (which face_recognition uses) rgb_frame = frame[:, :, ::-1] # Find all the faces in the current frame of video face_locations = face_recognition.face_locations(rgb_frame) # Display the results for top, right, bottom, left in face_locations: # Draw a box around the face cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2) # Display the resulting image cv2.imshow('Video', frame) # Hit 'q' on the keyboard to quit! if cv2.waitKey(1) & 0xFF == ord('q'): break # Release handle to the webcam video_capture.release() cv2.destroyAllWindows()
次に、次のように入力してこのPythonファイルを実行します。
python face_detector.py
すべてが正常に機能する場合、新しいウィンドウが開き、顔認識モードがリアルタイムで起動します。
コードの実行内容を要約して説明するには:
- 最初に、ビデオが分析されるハードウェアを示しました 。
- 次に、フレームごとにリアルタイムのビデオキャプチャを作成しました。
- 次に、 各フレームが処理され、画像内のすべての顔の位置が抽出されました 。
- その結果、 これらのフレームは 、顔の位置の表示とともにビデオの形で再現されました 。
顔認識アプリケーションの例
これがすべての楽しみの終わりではありません。 もう1つクールなことを行います。上記のコードに基づいて、本格的なアプリケーションの例を作成します。 コードに小さな変更を加えると、すべての準備が整います。
カムコーダーを使用して自動システムを作成し、スピーカーの現在位置を追跡するとします。 その位置に応じて、システムはカメラを回転させ、スピーカーが常にフレームの中心に留まるようにします。
最初のステップは、ビデオ内の1人または複数の人を識別し、スピーカーの位置に焦点を当てるシステムを作成することです。
それを行う方法を理解しましょう。 例として、DataHack Summit 2017カンファレンスの講演者によるスピーチとともにYouTubeでビデオを選択しました。
まず、必要なライブラリをインポートします。
import cv2 import face_recognition
次に、ビデオを読み、長さを設定します。
input_movie = cv2.VideoCapture("sample_video.mp4") length = int(input_movie.get(cv2.CAP_PROP_FRAME_COUNT))
その後、入力ファイルと同様の必要な解像度とフレームレートで出力ファイルを作成します。
ビデオでそれを認識するためのモデルとしてスピーカー画像をロードします。
image = face_recognition.load_image_file("sample_image.jpeg") face_encoding = face_recognition.face_encodings(image)[0] known_faces = [ face_encoding, ]
終了したら、次のようなサイクルを開始します。
- ビデオからフレームを抽出します。
- すべての顔を見つけて識別します。
- 元のフレームと話者の顔の位置を署名付きで組み合わせた新しい動画を作成します。
これを実行するコードを見てみましょう。
# Initialize variables face_locations = [] face_encodings = [] face_names = [] frame_number = 0 while True: # Grab a single frame of video ret, frame = input_movie.read() frame_number += 1 # Quit when the input video file ends if not ret: break # Convert the image from BGR color (which OpenCV uses) to RGB color (which face_recognition uses) rgb_frame = frame[:, :, ::-1] # Find all the faces and face encodings in the current frame of video face_locations = face_recognition.face_locations(rgb_frame, model="cnn") face_encodings = face_recognition.face_encodings(rgb_frame, face_locations) face_names = [] for face_encoding in face_encodings: # See if the face is a match for the known face(s) match = face_recognition.compare_faces(known_faces, face_encoding, tolerance=0.50) name = None if match[0]: name = "Phani Srikant" face_names.append(name) # Label the results for (top, right, bottom, left), name in zip(face_locations, face_names): if not name: continue # Draw a box around the face cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2) # Draw a label with a name below the face cv2.rectangle(frame, (left, bottom - 25), (right, bottom), (0, 0, 255), cv2.FILLED) font = cv2.FONT_HERSHEY_DUPLEX cv2.putText(frame, name, (left + 6, bottom - 6), font, 0.5, (255, 255, 255), 1) # Write the resulting image to the output video file print("Writing frame {} / {}".format(frame_number, length)) output_movie.write(frame) # All done! input_movie.release() cv2.destroyAllWindows()
コードは次の結果を提供します。
編集者から
トピックに関するNetologyコース:
- オンライン職業「 Python開発者 」
- オンライン職業データサイエンティスト