本文へスキップ
NextCode.ltd
開発事例

AIの証明写真は、盛るより先に「別人にしない」を決めた ― AI証明写真

AIの証明写真は、盛るより先に「別人にしない」を決めた ― AI証明写真

証明写真で一番まずいのは、写りが悪いことではなく、面接の部屋で「写真と違う人が来た」と思われることです。

履歴書のテンプレートを売り始めて、すぐに気づいたことがあります。テンプレートを買った人は、次に写真で困る。

AI証明写真(履歴書用)の画面

証明写真機は、写りを見比べる前に印刷が終わってしまう。写真館は、出かける時間が要ります。

それで、自撮りから証明写真を作って、履歴書のPDFに貼るところまでやるAI証明写真を作りました。自撮りを1〜4枚あげると16通りの写真ができて、選んだ1枚が、8様式ある履歴書の30×40mmの枠に入ります。¥980で、うちのテンプレートを買った人は¥580です。

作ってみて分かったのは、AIに写真をきれいにさせるのは簡単で、きれいにさせすぎないほうがずっと難しい、ということでした。

1「きれいにして」より先に「変えないで」を書いた

証明写真で一番まずいのは、写りが悪いことではないと思っています。面接の部屋に入ったとき、「写真と違う人が来た」と思われること。

なので、生成に渡す指示は、直す項目より先に、変えてはいけない項目から書きました。

生成の指示で、AIに任せたことと任せなかったこと

部分整えてよい変えさせない
顔肌荒れ・目の下のクマ・額と鼻のテカリ◎顔立ち・骨格・目の大きさ・輪郭・ほくろの位置
肌の質感毛穴と産毛は残したまま整える◎のっぺりした美肌加工
髪寝ぐせと飛び出した毛◎髪型の系統・長さ・毛量・髪の色
服と背景服は3種から着せ替え、背景は無地に◎年齢感・肌の色

服はスーツにネクタイ、ネクタイなし、ジャケットにブラウスの3つから選べます。背景と照明は、写真館がやっていることを言葉にして渡しました。「大きなソフトボックスを正面やや上に」のように。

パスポートやマイナンバーカード、運転免許の申請には使えないことも、同意のチェックの横に書いています。加工した写真が認められていないからです。使えるのは履歴書とエントリーシート、アルバイトの応募まで。

21枚ずつ頼むのをやめて、1枚の紙に16マス描かせた

最初の版を出したのは9月7日の0時すぎでした。そのときは1枚ずつ生成していて、1枚あたり約35秒。4通り作れば、APIを4回呼ぶことになります。

その1時間後に作り方を変えています。4枚を2×2に並べた1枚の画像として描かせて、ブラウザで縦横ちょうど半分に切る。1536×2048の画像で、境目が768と1024の位置にピクセル単位で来ることを確かめてから入れました。原価は約3分の1です。

9月9日に画像モデルをgpt-image-2.5-flareに替えたら、1枚が10.7秒で出るようになりました。それなら、と同じ紙を4×4まで広げたのが今の形。

1回の生成でできる枚数の移り変わり

いつ作り方1回でできる枚数かかった時間
9月7日 0時台1枚ずつ生成(1008×1344)1枚約35秒
9月7日 1時台2×2の1枚を切る(1536×2048)4枚測っていない
◎9月9日◎4×4の1枚を切る(2304×3072)◎16枚◎21秒

2304×3072は、APIが受け付けた3:4の中でいちばん大きいサイズでした。2048×2731も3072×4096も、400エラーで返ってきています。16等分すると1マスは576×768px。30×40mmに印刷すると488dpiになるので、切り出しても紙の上では粗く見えません。

3最初の16枚で、2列目の人が横を向いていた

16通りの振り方は、段で背景と光を、列でレンズと姿勢を変えることにしました。段は薄いブルーグレー、白、薄いグレー、ベージュ。列は85mm、105mm、70mm、135mmのレンズを想定した撮り方です。

最初のシートを見て、2列目で手が止まりました。「体だけをごくわずかに斜めにして肩のラインを作る」と書いた列で、顔まで横を向いている。宣材写真なら悪くない角度かもしれません。履歴書では使えない。

いまは16マスすべてに「顔はカメラの真正面、両耳が同じだけ見えること」を書き足しています。バリエーションは増やしたいのに、全部が履歴書に使える範囲に収まっていないといけない。この綱引きが、いちばん迷ったところでした。

AIに「いちばん良い1枚」だけを出させる案も考えて、捨てています。本人に似ているかどうかは、私にもAIにも判定できないので。判定できるのは本人だけです。

だから16枚を並べて、チェックを入れたものが元の自撮りと横に並ぶようにしました。スマホで2枚並べると1枚が175pxしかなく顔の違いが見えないので、そこだけは1枚を大きく出して切り替えます。

4検査は通っていたのに、写真を2mmずらしても気づかなかった

写真を履歴書に貼る処理は、組版済みの白紙のPDFに、pdf-libで画像を描き込む形です。枠の座標は8様式ぶん測って持っています。

失敗したのは、位置の検査のほうです。最初の検査は、保存した座標で写真を貼って、その結果を同じ座標と比べていた。わざと2mmずらしても通ってしまう。物差しが1本しかなかったんですよね。

いまは、履歴書の枠だけを色で塗ってPDFにしたものと、写真を貼った実物を、別々に画像にして測り、突き合わせています。同じ2mmのずれを入れると、今度はちゃんと落ちる(1.92mmのずれと報告されました)。普段のビルドでは、8様式とも差は0.06〜0.12mmです。

それでも、数字では見つからないものがありました。拡大したスクリーンショットを目で見たら、写真の枠が、枠を入れるマスの中で0.13mm左に寄っていた。左の余白が2.13mm、右が1.87mm。マスの内側の余白のせいで中央寄せが効いていなかっただけで、直すと2.00mmずつになりました。

検査が確かめていたのは「座標どおりに貼れたか」で、「その座標が正しいか」ではなかった。いまは売り物のPDFを、最後に拡大画像にして目で見てから出しています。

5顔写真を、どこに置いておくか

顔写真は、生成のためにOpenAI(米国)へ送ります。ここは避けられないので、同意のチェックを入れないと先へ進めない作りにしました。OpenAIは不正利用の監視のために最大30日保持すると公表していて、そのことも商品の画面に書いています。

こちらのサーバーには保存しません。自撮りはブラウザの中で長辺1024pxまで縮めてから送り、できた画像は返したらそれきり。

困ったのは再読み込みでした。1回の生成には原価がかかるし、決済後の作り直しは3回までにしている。画面を読み込み直しただけで16枚が消えたら、1回ぶん損をさせることになります。

できあがったシートは、ブラウザのIndexedDBに置いています。sessionStorageは5MB前後で頭打ちになり、数MBあるシートを入れると黙って失敗するので。

共用のパソコンで、次に使う人に前の人の顔が出てはいけない。そこで、タブごとに合鍵を作って、合鍵が一致するときだけ戻すようにしています。合鍵が違うものと、12時間より古いものは、見つけた時点で消す。「いま作った写真をこの端末から消す」ボタンも付けました。

6正直に言うと、まだ分からないこと

16枚のうち、どの列が選ばれているのかを、私は知りません。写真をこちらに残さない作りなので、知る手段が無いんです。

「本人に似ている」の線引きも、数字にできていません。指示には「別人にしない」と書いていても、守られたかを判定しているのは、元の自撮りと見比べる使う人の目だけ。

AIで作った写真を採用する側がどう受け取るかも、分からないままです。応募先の指示が最優先、と書くところまでしかできていません。

履歴書の学歴欄のほうは、生年月日だけで学歴が埋まる履歴書メーカーの記事に書きました。写真の細かい仕様は作品ページに、ほかの開発の話はブログ一覧に並べています。

作ってみて別人に見える写真が出たら、こちらから教えてください。何列目で起きたかが分かれば、次はその列の指示を直します。

この記事を書いた人

NextCode(沖縄県宜野湾市)は、iOSアプリ・ホームページ/LP・NFCデジタル名刺・AI業務自動化を作っている開発スタジオです。ここで書いているのは、実際に作って公開したものと、その過程で詰まったことだけです。

お問い合わせフォームは24時間受け付けています。

この記事が役に立ったらシェアしてください