写真1万枚から、わが子の写真を探す。最後は人が選ぶ

ミニバスケットボールチームの写真は、試合と練習で年に数千枚たまります。「うちの子の写真が欲しい」と頼まれるたびに、担当者が1枚ずつ目で探していました。保護者にもらった1枚の写真から、その子の写真を顔が似ている順に並べる Mac アプリ「カオピク」を作りました。

この記事の画面写真について。写っている写真はすべてプログラムで描いたダミーの影絵、子の呼び名は仮名です(件数・日付・撮影設定・画面の作りは実物)。本物の写真は掲載用の画面を作るときに一度も読み込んでいません。

課題

このチームの写真は外付けのストレージに 32,122枚。1人分のアルバムを作るには、何千枚も見返す必要がありました。しかも対象は子どもの顔です。写真をクラウドに送って処理する方法は取れません。

やったこと

  • 保護者から、わが子の顔が写った写真を1枚もらう
  • チームの写真を、顔が似ている順に並べる
  • 担当者は上から ○(本人)/ ×(別の子)を付ける
  • ○ の写真に、ブレ・目つぶり・連写の重複などの除外候補の印を付け、担当者が選んで外す
  • フォルダと ZIP にして渡す

機械が「この子の写真です」と決めることはしません。最後は必ず人が選びます。

処理の流れと役割 ─ 写真の中から、わが子の写真を探す

顔を見つける・数値にする・似ている順に並べる、までが担当者の Mac の中の処理です。「この子です」と決めるのは、最後まで人が行います。

人(保護者・担当者)自動処理(担当者の Mac の中)
1
保護者(人)
元写真を1枚わたす

わが子の顔が写った写真を1枚もらいます。顔が大きく写ったものほど、あとの並び順がよくなります。

2
自動処理(この Mac の中)
チームの写真から顔を見つけ、数値にする

土日祝の体育館らしい日の写真を取り込み、顔を検出して照合用の数値にします。写真も顔の数値も、この Mac の外には出ません。

ポイント:クラウドの顔認識は使いません。処理はすべて手元の1台で完結します。
3
自動処理(この Mac の中)
顔が似ている順に並べる

元写真に似ている順で候補を並べます。「本人」と自動で決める足切りは入れていません(理由は下記)。

4
担当者(人)
上から ○(本人)/ ×(別の子)を付ける

本人かどうかを確かめるのは人です。機械が上位に並べたのに人が × を付けた写真は、あとから見直せます。

5
自動処理(この Mac の中)
除外候補に印を付ける

ブレ・目つぶり・連写の重複などに印を付けます。印を付けるだけで、自動では外しません。

6
担当者(人)
選んで外し、フォルダと ZIP で渡す

写真の名前は「撮影日時_カメラ_元の名前」で、子の呼び名は入りません(フォルダと ZIP の名前だけ)。

渡すところまで、写真はこの Mac から出ません。顔の数値は年度ごとに消せます(年度が変わると画面で知らせ、自動では消しません)。

カオピクの確認画面。似ている順に並んだ候補にひとつずつ○×を付ける(写真はダミーの影絵)
似ている順に並んだ候補に、人が ○(本人)/ ×(別の子)を付ける画面。写真はプログラムで描いたダミーの影絵、呼び名は仮名です(件数は実物)。
カオピクのアルバム画面。○を付けた写真を撮影日ごとに並べ、連写の重複に印が付く(写真はダミーの影絵)
○ を付けた写真を撮影日ごとに並べたアルバム。連写の重複などに除外候補の印が付きます。写真はダミーの影絵、呼び名は仮名です。
カオピクの渡す画面。フォルダとZIPを書き出す(写真はダミーの影絵)
渡す画面。写真の名前は「撮影日時_カメラ_元の名前」で、子の呼び名は入れません。写真はダミーの影絵、呼び名は仮名です。

写真を外に出さない

対象は子どもの顔です。顔の特徴量は、法律上も個人情報(個人識別符号)にあたります。

  • 写真の処理はすべて担当者の Mac 1台の中。写真も顔の数値も、外へは送りません
  • 顔の数値は年度ごとに消します(年度が変わると画面で知らせます。自動では消しません)
  • 消した・設定を変えた記録は残しますが、子の呼び名は記録に残しません
  • 保護者向けの説明文のひな形も用意しました(「どこにも送りません」と答えられる形にしています)
カオピクの「データを消す」画面。年度ごとに顔のデータを消せる(呼び名は仮名)
年度ごとに顔のデータを消す画面。年度が変わると知らせ、自動では消しません。呼び名は仮名です。

結果(1)汎用の画像AIでは足りず、顔照合の専用モデルで解決

評価用に 150枚(その子が写っている27枚・写っていない123枚)を選び、人が先に正解を付けてから比べました。

方式似ている順の上位10枚のうち本人上位20枚
汎用の画像特徴10枚中7枚(元写真1枚)20枚中11枚
顔照合の専用モデル(SFace・採用)30枚中30枚(元写真3枚の合計)60枚中57枚
評価用150枚・人が先に正解を付けてからの比較。汎用は元写真1枚、SFace は元写真3枚の合計です。

精度が一番高かったモデル(ArcFace)は、ライセンスが非商用に限られるため使っていません。差が出たのは、元写真の顔が小さいとき(顔の幅が写真の約3%)でした。元写真は、顔が大きく写ったものが効きます。

結果(2)「この子です」と自動で決めるのは、やめた

似ている度合いに区切りを設ければ、自動で「本人」と決められるのではないか。元写真を1枚ずつ外して確かめました(1枚抜き)。

照合区切り方他の子を本人とした件数(1枚抜きの合計)
採用したモデル決まった距離0件(ただし他の子が混ざり始める境目ちょうどで、余裕なし)
採用したモデル元写真ごとに調整1件
精度が一番高いモデル決まった距離18件
元写真を1枚ずつ外して確かめた合計です。

元写真が変わると、同じ区切りが通用しませんでした。他の子の写真を「お子さんの写真です」と渡す誤りは、取り返しがつきません。そこで、自動で区切るのをやめ、似ている順に並べて人が上から確かめる形にしました。

結果(3)人の正解も見落とす

評価の途中で、人が付けた正解に見落としが2件見つかりました(顔が小さく写っていた写真)。機械が上位に並べたのに人が × を付けた写真を、見直せる画面を足しています。

抜き出して調べると、判定がぶれた

取り込むのは「土日祝の、体育館で撮ったらしい日」(撮影設定の ISO・シャッター速度から推定)。当初は各日8枚だけを抜き出して調べていましたが、屋内と屋外が混ざった日は、選ぶ8枚で判定が変わりました。その日の写真をすべて調べると 45日・10,989枚(32,122枚・372日のうち)。8枚の抜き出しとは、372日中3日食い違っていました。

カオピクの取り込み条件画面。日ごとの撮影設定の中央値と、取り込まない理由が並ぶ
取り込む日の条件と、日ごとの判定(撮影設定の中央値と、取り込まない理由)。この画面は実データです。

目つぶりは「候補」まで

人が正解を付けた 88枚(目を閉じていたのは15枚)で確かめると、目つぶりの候補 9枚中8枚が本当に閉じていました。ただし閉じていた15枚のうち拾えたのは8枚です。印を付けるだけで、自動では外しません。

学び

  • 正解を先に作る。人が正解を付けてから比べたので、汎用AIでは足りないこと、人の正解にも見落としがあることが分かりました。
  • 精度が上がっても、自動で決めてよいとは限らない。1枚抜きで確かめると、区切りは元写真ごとに崩れました。誤りの重さで、人に残す部分を決めています。
  • ライセンスも性能のうち。一番精度の高いモデルは非商用でした。
  • 抜き出しは、ぶれる。全部調べられるなら全部調べます。

「大量の写真や書類から、特定のものを探して、最後は人が確かめる」作業に応用できます。データを外に出さずに処理する設計からご相談いただけます。導入のご相談はお問い合わせから(お問い合わせ種別で「カオピク」をお選びください)。

アプリの紹介ページ:カオピク(kaopic.analyzegear.jp)