Python 用 OpenCV について Dlib を使って顔検出を実装する

Python 用 OpenCV について Dlib を使って顔検出を実装する

Dlib は、プログラミング言語 C++ で記述された汎用のクロスプラットフォーム ソフトウェア ライブラリです。その設計は、契約による設計とコンポーネントベースのソフトウェア エンジニアリングのアイデアに大きく影響されています。したがって、何よりもまず、それは独立したソフトウェア コンポーネントのセットです。これは、Accelerated Software License に基づいてリリースされたオープンソース ソフトウェアです。

Dlib には、ネットワーク、スレッド、グラフィカル ユーザー インターフェイス、データ構造、線形代数、機械学習、画像処理、データ マイニング、XML およびテキスト解析、数値最適化、ベイジアン ネットワーク、その他多くのタスクを処理するためのソフトウェア コンポーネントが含まれています。近年、幅広い統計機械学習ツールの作成に多くの開発努力が注がれています。 2009 年に、Dlib は Machine Learning Research に掲載されました。それ以来、幅広い分野で利用されてきました。

dlib を使用すると、開発が大幅に簡素化されます。たとえば、顔認識や特徴点検出などのタスクを簡単に実現できます。同時に、face_recogintion ライブラリ (Python ベースのオープンソースの顔認識ライブラリ face_recognition を応用) など、dlib をベースに開発されたアプリケーションやオープンソース ライブラリも数多くあります。

dlib ライブラリは、右眉毛に 18 ~ 22 ポイント、左眉毛に 23 ~ 27 ポイント、左目に 37 ~ 42 ポイント、右目に 43 ~ 48 ポイント、鼻に 32 ~ 36 ポイント、口に 49 ~ 68 ポイントなど、顔の重要な部分をマークするために 68 ポイントを使用し、その中で唇も認識できます。

目のアルゴリズムを変更することで、瞬きや目を細めるなどの動作を認識できるほか、目や口を変えることでさまざまな感情を認識できる。

人物の68点をもとにアルゴリズムモデルを構築し、顔認識を行うことも可能です。

dlib のインストールは、特に python3.7 バージョンでは面倒です。pip install では正常にインストールできません。探索時間を節約するために、インターネットから whl パッケージをダウンロードすることをお勧めします。

 # Windows は whl ファイル経由で dlib をインストールします
# dlib は Python 3.7 と互換性の問題があります。Visual Studio がインストールされていても、dlib はインストールできません。
# そこで、インターネットからpython37用のdlibのwhlファイルをダウンロードしました
# pip で dlib-19.17.99-cp37-cp37m-win_amd64.whl をインストールします
# 顔認識をインストール
# imutils をインストールします
dlibをインポートする
numpyをnpとしてインポートする
cv2をインポート
imutilsをインポートする
imutilsからface_utilsをインポート

# Dlibの正面顔検出器 frontal_face_detector を使用する
検出器 = dlib.get_frontal_face_detector()
# 訓練されたモデル shape_predictor_68_face_landmarks.dat を使用して、顔を検出しながら顔の68個のキーポイントを検出します。
予測子 = dlib.shape_predictor(r'C:\Python\Pycharm\docxprocess\face_detector\shape_predictor_68_face_landmarks.dat')

# 画像が配置されているパス
画像名 = r'C:\Python\Pycharm\docxprocess\picture\other\renwu\juhui1.jpg' #21
# imgname = r'C:\Python\Pycharm\docxprocess\picture\other\renwu\juhui2.png' #6
# imgname = r'C:\Python\Pycharm\docxprocess\picture\other\ldh\angry.png'
# imgname = r'C:\Python\Pycharm\docxprocess\picture\other\ldh\ldh.png'
# 画像名 = r'C:\Python\Pycharm\docxprocess\picture\other\ldh\happy.png'
# 画像名 = r'C:\Python\Pycharm\docxprocess\picture\other\ldh\shigu.jpeg'
# imgname = r'C:\Python\Pycharm\docxprocess\picture\other\renwu\juhui4.png' #24
# 画像を読み取り、グレースケールに変換します
img = cv2.imread(画像名)
img_gray = cv2.cvtColor(img、cv2.COLOR_RGB2GRAY) です。

# 顔検出、顔データの取得
顔 = detector(img_gray, 1)
# 長方形[[(941, 254) (977, 290)], [(361, 210) (397, 246)], [(717, 138) (753, 174)], [(801, 214) (837, 250)],
# [(573, 138) (609, 174)], [(45, 210) (81, 246)], [(585, 202) (621, 238)], [(189, 254) (225, 290)],
# [(245, 214) (281, 250)], [(689, 210) (725, 246)], [(419, 247) (463, 290)], [(553, 242) (589, 278)],
# [(901, 218) (937, 254)], [(77, 246) (113, 282)], [(141, 222) (177, 258)], [(741, 242) (777, 278)],
# [(485, 202) (521, 238)], [(161, 110) (197, 146)], [(297, 166) (333, 202)], [(905, 138) (941, 174)],
# [(301, 246) (337, 282)], [(865, 106) (901, 142)], [(389, 146) (425, 182)], [(241, 138) (277, 174)]]
len(faces) < 1の場合:
print("顔が検出されませんでした")
それ以外:
print("面の総数は", len(faces))
enumerate(faces) 内の for(i, rect):

# フェイスフレームの左上隅の座標と長方形フレームのサイズを返します
(x, y, w, h) = face_utils.rect_to_bb(rect)
# 画像上に長方形のボックスを描き、検出された顔の数を出力します
cv2.rectangle(画像, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.putText(img, "面#{}".format(i + 1), (x - 10, y - 10),
cv2.FONT_HERSHEY_SIMPLEX、0.5、(0、255、0)、2)


cv2.imshow("出力", img)
cv2.waitKey(0)

以前OpenCVで得られた顔検出結果

1927 年にベルギーのブリュッセルで開催された第 5 回ソルベー会議の白黒写真。21 人が写っている。

1924年、中国を訪れたラビンドラナート・タゴールと林慧銀らが写真を撮影した。合計7人だったが、肝心のタゴールの姿は確認できなかった。

1927年にベルギーのブリュッセルで開催された第5回ソルベー会議のカラー写真。24人が写っている。

年齢を感じさせない男の神、ハンサムなアンディ・ラウ。

トレーニング済みのモデル shape_predictor_68_face_landmarks.dat を使用して、顔と顔にある 68 個のキーポイントを検出します。もう一度、Andy Lau を見てみましょう。

 dlibをインポートする
numpyをnpとしてインポートする
cv2をインポート
imutilsをインポートする
imutilsからface_utilsをインポート

# Dlibの正面顔検出器 frontal_face_detector を使用する
検出器 = dlib.get_frontal_face_detector()
# 訓練されたモデルshape_predictor_68_face_landmarks.datを使用して、顔を検出しながら顔の68個のキーポイントを検出します
予測子 = dlib.shape_predictor(r'C:\Python\Pycharm\docxprocess\face_detector\shape_predictor_68_face_landmarks.dat')

# 画像が配置されているパス
画像名 = r'C:\Python\Pycharm\docxprocess\picture\other\renwu\juhui1.jpg' #21
imgname = r'C:\Python\Pycharm\docxprocess\picture\other\renwu\juhui2.png' #6
# imgname = r'C:\Python\Pycharm\docxprocess\picture\other\ldh\angry.png'
画像名 = r'C:\Python\Pycharm\docxprocess\picture\other\ldh\ldh.png'
# 画像名 = r'C:\Python\Pycharm\docxprocess\picture\other\ldh\happy.png'
# 画像名 = r'C:\Python\Pycharm\docxprocess\picture\other\ldh\shigu.jpeg'
# imgname = r'C:\Python\Pycharm\docxprocess\picture\other\renwu\juhui4.png' #24
# 画像を読み取り、グレースケールに変換します
img = cv2.imread(画像名)
img_gray = cv2.cvtColor(img、cv2.COLOR_RGB2GRAY) です。

# 顔検出、顔データの取得
顔 = detector(img_gray, 1)
# 長方形[[(941, 254) (977, 290)], [(361, 210) (397, 246)], [(717, 138) (753, 174)], [(801, 214) (837, 250)],
# [(573, 138) (609, 174)], [(45, 210) (81, 246)], [(585, 202) (621, 238)], [(189, 254) (225, 290)],
# [(245, 214) (281, 250)], [(689, 210) (725, 246)], [(419, 247) (463, 290)], [(553, 242) (589, 278)],
# [(901, 218) (937, 254)], [(77, 246) (113, 282)], [(141, 222) (177, 258)], [(741, 242) (777, 278)],
# [(485, 202) (521, 238)], [(161, 110) (197, 146)], [(297, 166) (333, 202)], [(905, 138) (941, 174)],
# [(301, 246) (337, 282)], [(865, 106) (901, 142)], [(389, 146) (425, 182)], [(241, 138) (277, 174)]]
len(faces) < 1の場合:
print("顔が検出されませんでした")
それ以外:
print("面の総数は", len(faces))
enumerate(faces) 内の for(i, rect):

# フェイスフレームの左上隅の座標と長方形フレームのサイズを返します
(x, y, w, h) = face_utils.rect_to_bb(rect)
# 画像上に長方形のボックスを描き、検出された顔の数を出力します
cv2.rectangle(画像, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.putText(img, "面#{}".format(i + 1), (x - 10, y - 10),
cv2.FONT_HERSHEY_SIMPLEX、0.5、(0、255、0)、2)

# 顔に68個のランドマークポイントをマーク
形状 = 予測子(img_gray、矩形)
# <0x0000018AF09586F8 の dlib.full_object_detection オブジェクト>
# 形状は68座標点の行列に変換されます
シェイプ = face_utils.shape_to_np(シェイプ)
# [[245 149]
# [245 152]
# ...
# [246 159]]
# [[364 225]
# [365 228]
# ...
# [366 236]]
# ソース画像上のランドマークポイントを出力する
enumerate(shape) 内の j,(x, y) について:
cv2.circle(画像, (x, y), 2, (0, 0, 255), -1)
cv2.putText(img, "{}".format(j + 1), (x - 10, y - 10),
cv2.FONT_HERSHEY_SIMPLEX、0.5、(0、255、0)、2)

cv2.imshow("出力", img)
cv2.waitKey(0)

<<:  インテリジェントな仮想アシスタントが2022年に生産性を2倍にする方法

>>:  機械学習の 3 つの時代の計算パワーの法則をまとめる: 大規模モデルの出現によって何が変わったのでしょうか?

ブログ    
ブログ    

推薦する

偽の顔を正確に生成します! Amazonの新しいGANモデルは死角のないオールラウンドな美しさを提供します

最近、Amazon One の研究者は、生成された画像を明示的に制御できる GAN をトレーニングす...

人工知能はメタバースのビジョンの実現に役立つでしょうか?

現在、メタバースの分野は、誇大宣伝と新規プロジェクトの立ち上げ数の点で急速に成長しており、業界の市場...

AIチップとは何ですか?人々が知っておくべきことすべて

[51CTO.com クイック翻訳] 業界の専門家は、音声アシスタント、顔認識カメラ、コンピューター...

...

米軍のAIブラックテクノロジー:暗闇でも正確に顔を認識できる。これに不安を感じる人はいるだろうか?

[[227002]]今日お話しするのは、「そんな手術があるの?」と第一印象でとても驚く内容ですが、...

石油探査のための AI: 石油産業のデジタル変革に向けた新しい考え方

石油は産業の血液であるだけでなく、私たちの日常生活にも深く関わっていることは周知の事実です。統計によ...

...

...

プログラマーの間でデータ構造やアルゴリズムに関する知識が一般的に不足していることについてどう思いますか?

多くのプログラマーの目には、データ構造やアルゴリズムなどは役に立たず、実際に使用されることもあまりな...

米国は、中国のAIチップ量子の3つの主要分野への投資を制限する最新の大統領令に署名しました。大手メーカーが50億ドル相当のA800を緊急発注

水曜日、ホワイトハウスは大統領令に署名した。米国は、中国の半導体設計ソフトウェアや製造ハードウェアへ...

人工知能の長所と短所について知っておくべき10の事実

AIの進歩は、人工的に生み出された富がどのように課税され、分配されるかによって、すべての人々が贅沢な...

2018年のAIトレンドはこちら

ビッグデータの計算分析は決して時代遅れではありません。それどころか、データ量が増え続けるにつれて、デ...

アルファベットのウィングがドローン配達サービスをダラス・フォートワース地域に導入

ドローンはまもなく、タイレノールとバンドエイドが詰まった小型容器を積んでダラス・フォートワース上空を...

機械学習と AI のトレンド: 何が期待できるか?

ビデオゲーム、医療におけるモノのインターネット、スマートシティなどでは、すでに仮想現実がさらに多く見...

...