AIを使ってしたい100のこと

生成AIの可能性と、それを使って自分自身を表現する楽しさを伝えることを目指しています。

Copilotを活用したPythonでの顔認識とモザイク処理

1. はじめに

この記事では、私がCopilotと対話を重ね、その経験を共有します。私の目標は、Pythonを使って画像にモザイク処理を施すプログラムを作成することです。このアイデアは、Processingというアーティスト・クリエイター向けのプログラム言語を使ったこちらの記事から得ました。

2. Copilotとの対話

私がCopilotに求めたのは、「Pythonでイメージファイルを読み込み、人の顔を認識してモザイクを掛けるコード」の生成でした。また、必要なライブラリがあれば、それについても教えてもらいました。

2.1 私の質問

Pythonでイメージファイルを読み込み、人の顔を認識してモザイクを掛けるコードを教えてください。インストールが必要なライブラリがある場合は、それについても教えてください。

2.2 Copilotの回答

Pythonで画像を読み込み、顔を認識し、その顔にモザイクをかけるためには、opencv-pythonnumpyというライブラリが必要です。これらのライブラリは以下のコマンドでインストールできます。

pip install opencv-python numpy

以下に、指定した画像から顔を検出し、その顔にモザイクをかけるサンプルコードを示します。

import cv2
import numpy as np

def mosaic(img, ratio=0.1):
    small = cv2.resize(img, None, fx=ratio, fy=ratio, interpolation=cv2.INTER_NEAREST)
    return cv2.resize(small, img.shape[:2][::-1], interpolation=cv2.INTER_NEAREST)

# 顔検出用のカスケードファイルを指定
cascade_path = "/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml"
cascade = cv2.CascadeClassifier(cascade_path)

# 画像を読み込む
img = cv2.imread("image.jpg")

# グレースケールに変換
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 顔を検出
faces = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3, minSize=(30, 30))

# 顔部分にモザイクをかける
for (x, y, w, h) in faces:
    face_img = img[y:y+h, x:x+w]
    img[y:y+h, x:x+w] = mosaic(face_img)

# 画像を保存
cv2.imwrite("mosaic.jpg", img)

このコードは、指定した画像(image.jpg)から顔を検出し、その顔にモザイクをかけ、結果をmosaic.jpgとして保存します。モザイクの粗さはmosaic関数のratioパラメータで調整できます。値が小さいほど、モザイクは粗くなります。

なお、このコードはOpenCVのデフォルトのカスケードファイルを使用しています。異なる環境では、カスケードファイルのパスが異なる可能性があるため、適切なパスに変更してください。また、このコードは正面から見た顔のみを検出します。プロフィールなど、他の角度から見た顔を検出するには、別のカスケードファイルを使用する必要があります。具体的なパスやカスケードファイルは、使用している環境や要件によります。必要に応じて適切なものを選択してください。

このコードは基本的なもので、実際の使用にはさらなる調整が必要かもしれません。例えば、顔検出の精度を上げるためには、detectMultiScaleメソッドのパラメータを調整することが考えられます。また、画像の明るさやコントラスト、顔の大きさや位置など、画像の特性によっては、顔検出がうまくいかない場合もあります。そのような場合には、画像の前処理やパラメータの調整が必要になるかもしれません。具体的な調整方法は、使用する画像や要件によります。必要に応じて適切な調整を行ってください。

以上が基本的な顔検出とモザイク処理のコードです。何か他に質問がありましたら、お気軽にどうぞ。

ソース: Copilot との会話、 2024/6/13 (1) github.com. https://github.com/vhehduatks/AI_mosaic/tree/2f181e682f2fff53d177f01f12aaf4ce065b6df1/detector.py.

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

私のWindows PCには、Pythonがインストール済みです。Copilotの案内に従い、Pythonライブラリをインストールしていきます。

pip install opencv-python numpy

カスケードファイルのパス変更

私の質問

PowerShellで、haarcascade_frontalface_alt.xmlファイルを検索するコマンドを教えてください。

Copilotの回答

PowerShellで特定のファイルを検索するには、Get-ChildItemコマンドレットを使用します。以下に、haarcascade_frontalface_alt.xmlファイルを検索するためのコマンドを示します。

Get-ChildItem -Path C:\ -Filter haarcascade_frontalface_alt.xml -Recurse -ErrorAction SilentlyContinue -Force

このコマンドは、Cドライブ全体を対象にhaarcascade_frontalface_alt.xmlという名前のファイルを検索します。-Recurseオプションにより、すべてのサブディレクトリも検索対象となります。-ErrorAction SilentlyContinueは、アクセス権限がないディレクトリなどでエラーが発生した場合に、エラーメッセージを表示せずに処理を続行するためのオプションです。-Forceオプションは、隠しファイルやシステムファイルも検索対象に含めるためのオプションです。

なお、このコマンドはCドライブ全体を検索するため、実行には時間がかかる場合があります。また、システムファイルを含めて検索するため、管理者権限が必要な場合があります。必要に応じて、検索対象のパスやオプションを調整してください。

以上が基本的なファイル検索のコマンドです。何か他に質問がありましたら、お気軽にどうぞ。

カスケードファイルのパス確認

PowerShellhaarcascade_frontalface_alt.xmlファイルのパスを確認します。

PS C:\Users\user1> Get-ChildItem -Path C:\ -Filter haarcascade_frontalface_alt.xml -Recurse -ErrorAction SilentlyContinue -Force

    Directory: C:\Users\user1\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\cv2\data

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---          2024/06/13    11:30         676709 haarcascade_frontalface_alt.xml

haarcascade_frontalface_alt.xmlファイルのパスは、以下の通りであることが分かりました。

C:\Users\user1\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\cv2\data\haarcascade_frontalface_alt.xml

顔検出用のカスケードファイルパスの修正

ソースコードを以下のように修正しました。

# 顔検出用のカスケードファイルを指定
cascade_path = "C:\Users\user1\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\cv2\data\haarcascade_frontalface_alt.xml"

ソースコードの保存

Pythonソースコードauto-face-detect-mosaic.pyというファイル名で、任意のフォルダに保存します。

モザイク処理対象の画像

処理対象の画像は、生成AIで作成した実在しない人の顔画像です。image.jpgというファイル名にリネームし、ソースコードと同じフォルダに保存しておきます。

生成AIで作成した、実在しない人の顔画像

モザイク処理の実行1:SyntaxError

Pythonコードを実行したところ、エラーとなりました。自分で書き換えた、cascade_pathのところがエラーになっています。おそらく「\(バックスラッシュ)」が問題なのだと思いますが、これもCopilotに聞くことにします。

PS C:\auto-face-detect-mosaic> python .\auto-face-detect-mosaic.py
  File ".\auto-face-detect-mosaic.py", line 9
    cascade_path = "C:\Users\user1\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\cv2\data\haarcascade_frontalface_alt.xml"
                   ^
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

エラーの対処方法をCopilotに聞く

私の質問

このようなエラーが表示されました。対処方法を教えてください。 PS C:\auto-face-detect-mosaic> python .\auto-face-detect-mosaic.py File ".\auto-face-detect-mosaic.py", line 9 cascade_path = "C:\Users\user1\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\cv2\data\haarcascade_frontalface_alt.xml" ^ SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

Copilotの回答

エラーメッセージによると、Pythonの文字列内でバックスラッシュ(\)がエスケープシーケンスとして解釈されてしまい、Unicodeエスケープシーケンス(\UXXXXXXXX)として解釈されてしまったためにエラーが発生しています。

Pythonでは、バックスラッシュ(\)はエスケープシーケンスの開始を示す特殊な文字です。したがって、Windowsのパスのようにバックスラッシュを含む文字列をそのままPythonの文字列として使用すると、このようなエラーが発生します。

この問題を解決するには、以下のいずれかの方法を試してみてください。

  1. 文字列をraw文字列(rを先頭につけた文字列)として扱う。これにより、バックスラッシュがエスケープシーケンスとして解釈されるのを防ぐことができます。
cascade_path = r"C:\Users\user1\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\cv2\data\haarcascade_frontalface_alt.xml"
  1. バックスラッシュを二重にする。これにより、一つ目のバックスラッシュが二つ目のバックスラッシュをエスケープし、結果としてバックスラッシュ一つが得られます。
cascade_path = "C:\\Users\\user1\\AppData\\Local\\Programs\\Python\\Python38-32\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_alt.xml"

これらの修正を行うことで、エラーが解消するはずです。それでも問題が解決しない場合は、再度お知らせください。よろしくお願いいたします。

顔検出用のカスケードファイルパスの修正(\をエスケープ)

普段Pythonを使っていないため、簡単なことでもつまずきます。「2. バックスラッシュを二重にする。」で対処します。ソースコードを以下のように修正しました。

# 顔検出用のカスケードファイルを指定
cascade_path = "C:\\Users\\user1\\AppData\\Local\\Programs\\Python\\Python38-32\\Lib\site-packages\\cv2\\data\\haarcascade_frontalface_alt.xml"

ソースコード全文

auto-face-detect-mosaic.py

import cv2
import numpy as np

def mosaic(img, ratio=0.1):
    small = cv2.resize(img, None, fx=ratio, fy=ratio, interpolation=cv2.INTER_NEAREST)
    return cv2.resize(small, img.shape[:2][::-1], interpolation=cv2.INTER_NEAREST)

# 顔検出用のカスケードファイルを指定
cascade_path = "C:\\Users\\user1\\AppData\\Local\\Programs\\Python\\Python38-32\\Lib\site-packages\\cv2\\data\\haarcascade_frontalface_alt.xml"
cascade = cv2.CascadeClassifier(cascade_path)

# 画像を読み込む
img = cv2.imread("image.jpg")

# グレースケールに変換
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 顔を検出
faces = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3, minSize=(30, 30))

# 顔部分にモザイクをかける
for (x, y, w, h) in faces:
    face_img = img[y:y+h, x:x+w]
    img[y:y+h, x:x+w] = mosaic(face_img)

# 画像を保存
cv2.imwrite("mosaic.jpg", img)

モザイク処理の実行2:成功

実行

Pythonコードを再度実行したところ、実行に成功しました。

PS C:\auto-face-detect-mosaic> python .\auto-face-detect-mosaic.py
PS C:\auto-face-detect-mosaic> 

結果画像

顔の部分にモザイク処理が施されたことを確認します。

モザイク処理が施された、mosaic.jpg

モザイク処理の実行3:モザイクを粗くする

モザイクの粗さはmosaic関数のratioパラメータで調整できます。値が小さいほど、モザイクは粗くなります。

もう少しモザイクを粗くしてみたくなりました。mosaic関数のratioパラメータを現在の0.1から、0.025に変えてみます。

粗いモザイク処理が施された、mosaic.jpg

やってみた感想

  • 私のようなPythonの素人でも、ライブラリの導入、画像の顔認識、モザイク適用という処理を実装できてしまいました。
  • ほとんど自分で考えることなく、コードを実装できました。
  • エラーについても、Copilotに聞いて対処できました。
  • 今回作成したコードを元に、人の顔以外を認識できるコードを作成してみたくなりました。
  • 本当はCopilotに「この画像の人の顔にモザイクを掛けてください」と頼みたいところですが、「その処理を行うソースコードを作ってもらう」というのもいい方法だと思いました。

参考文献

www.tc3.co.jp