いろいろなイベントやお店紹介で写真を撮影する機会があります。撮影時の楽しい雰囲気をSNSなどに投稿したいのですが、個人情報を拡散したくないなどの理由で掲載して欲しくないという人も多いものです。そこで、写真の楽しい雰囲気をそのままに、人物の顔に仮面を被せるツールを作ってみましょう。

  • 人物に仮面を被せるツールを作ろう

    人物に仮面を被せるツールを作ろう

画像編集APIを利用する準備をしよう

今回のツールでは、画像編集のAPIを使います。OpenAIのAPIを利用する準備をしましょう。APIを利用して画像を生成するには、APIキーの取得が必要です。

OpenAIのAPIを使うのが初めての人は、OpenAIの開発者プラットフォームにアクセスして、OpenAI/ChatGPTのアカウントでログインしてください。そして、こちらで、APIキーを取得しましょう。

【Windowsで環境変数を設定する方法】

Windowsで、環境変数にAPIキーを登録するには、次の手順で作業します。まず、スタートメニューを開いて「環境変数」と入力して、「環境変数を編集」をクリックします。そして、上部の「ユーザー環境変数」で「新規」をクリックして、下記の項目を入力します。

- 変数名: OPENAI_API_KEY
- 変数値: (取得したOpenAIのAPIキー)

【macOSで環境変数を設定する方法】

macOSの場合、シェルの設定ファイル「~/.zshrc」に以下のようなテキストを追加しよう。そして、コマンド「source ~/.zshrc」を実行して設定を反映しましょう。

export OPENAI_API_KEY="(ここに取得したAPIキーを指定)"

OpenAIのAPIを使うために組織認証を有効にしよう

なお、OpenAIの画像生成APIを利用するには、OpenAIの組織認証を有効にする必要があります。こちらの設定を開いて、「Verifications > Verify Organization」のボタンをクリックしましょう。

その後、スマートフォンなどを利用して、身分証明書のスキャンや顔写真の撮影を行います。ちょっと面倒なのですが、APIの不正利用を阻止するために必要な作業となります。認証してから、実際に利用できるようになるまでには、少し時間がかかります。

Antigravityでツールを作ってみよう

今回は、Google Antigravityを利用してツールを作成してみましょう。AIエディタのAntigravityについては、本連載11回目で詳しく紹介していますので、参考にしてインストールしましょう。

Antigravityを起動したら、チャットウィンドウに、下記のプロンプト(指示文)を記述して実行しましょう。

### 今回作成するツール:
Pythonと画像編集APIを利用して、人物の顔を匿名化するCLIツールを作ってください。
人物の顔に自然なパンダやウサギのマスクを被せて、顔が見えないようにします。

### 利用する技術:
- OpenCVで顔検出
- OpenAIの画像編集API

### ツール制作の背景:
撮影時の楽しい雰囲気をSNSなどに投稿したいのですが、
顔バレしたくないので顔を隠したいです。
写真の楽しい雰囲気をそのままに、人物の顔にマスクを付けるツールを作ります。

### プログラムの実行手順
1. コマンドラインから画像ファイルを取得
2. OpenCVを使って顔検出を行う
3. 顔座標を使ってマスク画像を作成して`<元ファイル名>-mask.png`に保存
4. 元画像に座標を描画してデバッグ用の画像`<元ファイル>-debug.png`に保存
5. OpenAIの`client.images.edit(model="gpt-image-1-mini")`とマスク画像でパンダの仮面を描画
6. 描画した画像を`<元ファイル名>-anon.png`に保存

### ツールの使い方:
コマンドラインから使えるツール`anon_face.py`を作ってください。
可愛いパンダかウサギの仮面を被せて、自然な雰囲気の描画をしてください。

### 備考:
日本語で応答してください。

もっと適当なプロンプトで完成できると思ったのですが、意外と思い通りのツールができなかったため、上記のような詳細な手順を指定する必要がありました。

次の画面は、Antigravityを起動して、画面右側にあるチャットウィンドウに上記のプロンプトを入力したところです。Antigravityでは、最初に必要となるタスクを作成して、タスクに従ってプログラムを完成させていくという手順でプログラムを完成させます。

  • Antigravityにプロンプトを与えてプログラムを作ったところ

    Antigravityにプロンプトを与えてプログラムを作ったところ

なお、筆者が試した時、OpenAIのAPI呼び出しを行った後、戻り値が正しく取得できず、何度も失敗していました。そのため、途中で処理を停止して、画像編集APIの応答がBASE64で返されている点を下記のように指摘したら正しいプログラムを作ってくれました。

OpenAIのAPIを呼び出す際、client.images.editの戻り値responseに、
BASE64でエンコードされた画像が入っているのに、画像を取り出せていません。
戻り値の処理を修正してください。

また、Antigravityが、うっかりと編集対象を指定するマスク部分と背景部分の色を間違えて描画するプログラムを作っていました。人間の顔だけが残り、背景がパンダになった様子は、恐怖そのもので、ここでお見せできるものではありませんでした。やはり、人間が目視して実行結果を確認しないと、正しいプログラムかどうかを判定できません。

顔検出はだいたいあっていましたが、マスク画像の作り方が間違っています。
マスクと背景の指定が逆です。修正してください。

それで、最終的な生成に至るまでに必要となる、デバッグ用の画像も保存するように指示をして、各ステップが正しく生成されているかを確認すると良いでしょう。

  • 顔検出から画像編集AIに送信するまで過程も確認しよう

    顔検出から画像編集AIに送信するまで過程も確認しよう

プログラムを実行しよう

今回のプログラムは、コマンドラインツールを作るように指示したため、ターミナル(WindowsならPowerShell、macOSならターミナル.app)を起動して、そこからツールを実行します。

最初に依存ライブラリをインストールしましょう。

# ライブラリのインストール
pip install -r requirements.txt

そして、例えば「test.png」という画像の人物に仮面を被せるには、下記のようなコマンドを実行します。

python anon_face.py test.png

ターミナルからプログラムを実行すると、次のように人物にパンダやウサギの仮面を被せます。

  • ターミナルからプログラムを実行したところ

    ターミナルからプログラムを実行したところ

  • 実行する度に異なる画像が生成される

    実行する度に異なる画像が生成される

今回作成したプログラムは、こちらにアップしています。ご自身でうまく作成できなかった場合は、確認してみてください。

ちなみに、本稿で利用したサンプル写真自体も、ChatGPTで生成した画像です。 以下のようなプロンプトで画像を作成しました。

仲の良い日本人の家族(30代前半の両親と、小学生の娘)が渋谷の交差点で
セルフィーを撮影した場面を描画して。
--- --- --- ---
日本人のインフルエンサー二人がお店の前で、
ニコニコしてポーズを決めている場面を描画してください。

簡単なプロンプトで、それなりの画像を生成してくれるので便利です。

その他の失敗の記録

なお、今回紹介したプロンプトでは画像編集に「gpt-image-1-mini」を利用していますが、当初は少し前のモデル「dall-e-2」を使っていました。すると下記のように、ちょっと怖い画像が生成されてしまいました。

  • DALL-E2で仮面を被せたとき - ちょっと怖い画像が生成された

    DALL-E2で仮面を被せたとき - ちょっと怖い画像が生成された

そこで、下記のようなプロンプトを追加しました。

パンダやウサギの画像が可愛くありません。
自然でもっと可愛い仮面を生成してください。

すると、以下のような画像を生成するようになりましたが、成功率はそれほど高くありませんでした。DALL-E2の画像編集には限界があり自然な画像になりません。そこで、画像生成モデルを「gpt-image-1-mini」に変更しました。

  • 画像生成モデルDALL-E2を使って成功した場合の例

    画像生成モデルDALL-E2を使って成功した場合の例

まとめ

以上、今回は画像編集APIを利用するプログラムを作ってもらいました。最初、あまり考えないで、適当なプロンプトを与えたところ、まともなツールが完成せず、苦戦してしまいました。今回紹介したプロンプトを完成させるまで、6回ほどゼロからやり直す羽目になりました。

そのため、バイブコーディングを実践する際にも、曖昧な指示を与えるだけだと、うまくいかないことがあります。それで、自分である程度技術調査をして、どのような手順で作れば良いのかをイメージしてからプロンプトを組むと良いでしょう。そうすることで、最終的な完成度を高めることができます。画像関連のツールを作る際の参考にしてみてください。