Python ディープラーニング(深層学習) 機械学習

FaceRecognitionで特定の人物の顔だけにモザイク処理を行う

この記事は約8分で読めます。

 

 

前回は人物の顔を認識してモザイクをかけるという処理を紹介しました

 

関連記事:【Python】Face RecognitionとOpenCVで人物の顔にモザイク処理を行う

 

今回はそれを特定の人物の顔にだけ行う処理を行いたいと思います。

 

前準備と実行環境

 

Face Recognitionはディープラーニングが使われているのでGPUが必要になります。

自分のPCにはGPUが無かったのでColabで動作することを想定しています。

 

ColabでGPUを使用する

 

Face Recognition はインストール時でdlibをビルドが必要になるためGPUを使わないと以下のようなエラーになります。

 

Error while calling cudaGetDevice(&the_device_id) in file /tmp/pip-install-8rhciq4o/dlib_838b2895161a4c358d1084826c17d7fd/dlib/cuda/gpu_data.cpp:204. code: 100, reason: no CUDA-capable device is detected

 

これを回避するためにまずGooglecolabratoryでコード実行に際に「GPU」で実行するように設定を変更します。具体的にはNotebookの「編集」→「ノートブックの設定」→「ハードウェア アクセラレータ」を「GPU」に変更して「保存」で設定完了です。

 

参照:https://pyming.info/2021/06/04/colab_gpu/

 

ライブラリのインストール

 

次にライブラリをインストールします。

 

$ pip install face_recognition

 

インストールが完了したらライブラリを読み込めるか確認します。

 

import face_recognition

 

画像の用意

 

まず前提条件としてオバマ大統領の顔を識別したいとします。

 

認識させたい顔

 

URL:https://tkstock.site/wp-content/uploads/2022/12/President_Barack_Obama-e1670777913971.jpg

 

 

モデルに判定させる顔画像

 

 

<画像のURL>

https://tkstock.site/wp-content/uploads/2022/12/123740.jpg
https://tkstock.site/wp-content/uploads/2022/12/25lunch01.jpg
https://tkstock.site/wp-content/uploads/2022/12/97399196_mediaitem97399195.jpg
https://tkstock.site/wp-content/uploads/2022/12/reizei20150827-thumb-720xauto-720×460-1.jpg

 

FaceRecognitionで特定の人物の顔だけにモザイクを掛ける

 

下記が実際に顔認識を行うサンプルコードです。

 

処理の流れとしてはまず判定したい顔をURLで指定し、リストに指定した画像を1枚ずつfor文で読み込み、顔の座標を特定→その顔が判定したい顔なのか判定→Trueだった場合はモザイク処理、という流れです。

 

!pip install face_recognition==1.2.3
import os
import cv2
import face_recognition
import matplotlib.pyplot as plt
import requests

# 認証したい人の顔のURL
img_url = 'https://tkstock.site/wp-content/uploads/2022/12/President_Barack_Obama-e1670777913971.jpg'
r = requests.get(img_url)
img_path = 'known.jpg'
with open(img_path, 'wb') as saveFile: 
    saveFile.write(r.content)
img = cv2.imread(f'/content/{img_path}')
# 認証する人物の顔の画像を読み込む。
face_img_to_check = face_recognition.load_image_file(f'/content/{img_path}')
face_loc_to_check = face_recognition.face_locations(face_img_to_check, model="cnn")
(face_encoding_to_check,) = face_recognition.face_encodings(
    face_img_to_check, face_loc_to_check
)
# 画像の表示
print('認証したい人の顔')
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) # OpenCV は色がGBR順なのでRGB順に並べ替える
plt.show()




# モザイク処理
def pixelate(src, ratio=1):
    small = cv2.resize(src, None, fx=ratio, fy=ratio, interpolation=cv2.INTER_NEAREST)
    return cv2.resize(small, src.shape[:2][::-1], interpolation=cv2.INTER_NEAREST)


def pixelate_area(src,loc,ratio=0.1):
  dst = src.copy()
  for i, (top, right, bottom, left) in enumerate(loc):
        w, h = right - left, bottom - top
        dst[top:top + h, left:left + w] = pixelate(dst[top:top + h, left:left + w], ratio)
  return dst




# 保存されている人物の顔の画像を読み込む。
known_face_imgs = []
img_list =  [
    'https://tkstock.site/wp-content/uploads/2022/12/123740.jpg'
,'https://tkstock.site/wp-content/uploads/2022/12/25lunch01.jpg'
,'https://tkstock.site/wp-content/uploads/2022/12/97399196_mediaitem97399195.jpg'
,'https://tkstock.site/wp-content/uploads/2022/12/reizei20150827-thumb-720xauto-720x460-1.jpg'
,'https://tkstock.site/wp-content/uploads/2022/12/https___imgix-proxy.n8s.jp_DSXMZO5921788017052020FF8001-PN1-5.jpg'
             ]

count = 0
for path in img_list:
    known_face_encodings = []
    r = requests.get(path)
    with open(f'train_{count}.jpg', 'wb') as saveFile: 
        saveFile.write(r.content)
    img = face_recognition.load_image_file(f'train_{count}.jpg')
    loc_a = face_recognition.face_locations(img, model="hog")
    dst = img.copy()
    for loc in loc_a:
        a = []
        b = []
        
        a.append(loc)
        print(a)
        (encoding,) = face_recognition.face_encodings(img, a)
        b.append(encoding)
        
        matches = face_recognition.compare_faces(b, face_encoding_to_check)
        print(matches)
        if matches[0]==True:
            # 画像の表示
            dst = pixelate_area(dst,a,ratio=0.1)
    # 画像の表示
    fig, ax = plt.subplots()
    ax.set_axis_off()
    ax.imshow(dst)
    # plt.show()
    count += 1

 

コードは下記にあります

Google Colaboratory

 

他にも何かございましたらMENTAにてご相談いただけますと幸いです。

 


プログラミング・スクレイピングツール作成の相談を受け付けています!

クラウドワークス・ココナラ・MENTAなどでPython・SQL・GASなどのプログラミングに関する相談やツール作成などを承っております!

過去の案件事例:

  • Twitter・インスタグラムの自動化ツール作成
  • ウェブサイトのスクレイピングサポート
  • ダッシュボード・サイト作成
  • データエンジニア転職相談

これまでの案件例を見る

キャリア相談もお気軽に!文系学部卒からエンジニア・データサイエンティストへの転職経験をもとに、未経験者がどう進むべきかのアドバイスを提供します。


スポンサーリンク
/* プログラミング速報関連記事一覧表示 */
ミナピピンの研究室

コメント

タイトルとURLをコピーしました