ミニバスケットボールチームの写真は、試合と練習で年に数千枚たまります。「うちの子の写真が欲しい」と頼まれるたびに、担当者が1枚ずつ目で探していました。保護者にもらった1枚の写真から、その子の写真を顔が似ている順に並べる Mac アプリ「カオピク」を作りました。
この記事の画面写真について。写っている写真はすべてプログラムで描いたダミーの影絵、子の呼び名は仮名です(件数・日付・撮影設定・画面の作りは実物)。本物の写真は掲載用の画面を作るときに一度も読み込んでいません。
課題
このチームの写真は外付けのストレージに 32,122枚。1人分のアルバムを作るには、何千枚も見返す必要がありました。しかも対象は子どもの顔です。写真をクラウドに送って処理する方法は取れません。
やったこと
- 保護者から、わが子の顔が写った写真を1枚もらう
- チームの写真を、顔が似ている順に並べる
- 担当者は上から ○(本人)/ ×(別の子)を付ける
- ○ の写真に、ブレ・目つぶり・連写の重複などの除外候補の印を付け、担当者が選んで外す
- フォルダと ZIP にして渡す
機械が「この子の写真です」と決めることはしません。最後は必ず人が選びます。
顔を見つける・数値にする・似ている順に並べる、までが担当者の Mac の中の処理です。「この子です」と決めるのは、最後まで人が行います。
わが子の顔が写った写真を1枚もらいます。顔が大きく写ったものほど、あとの並び順がよくなります。
土日祝の体育館らしい日の写真を取り込み、顔を検出して照合用の数値にします。写真も顔の数値も、この Mac の外には出ません。
元写真に似ている順で候補を並べます。「本人」と自動で決める足切りは入れていません(理由は下記)。
本人かどうかを確かめるのは人です。機械が上位に並べたのに人が × を付けた写真は、あとから見直せます。
ブレ・目つぶり・連写の重複などに印を付けます。印を付けるだけで、自動では外しません。
写真の名前は「撮影日時_カメラ_元の名前」で、子の呼び名は入りません(フォルダと ZIP の名前だけ)。
渡すところまで、写真はこの Mac から出ません。顔の数値は年度ごとに消せます(年度が変わると画面で知らせ、自動では消しません)。



写真を外に出さない
対象は子どもの顔です。顔の特徴量は、法律上も個人情報(個人識別符号)にあたります。
- 写真の処理はすべて担当者の Mac 1台の中。写真も顔の数値も、外へは送りません
- 顔の数値は年度ごとに消します(年度が変わると画面で知らせます。自動では消しません)
- 消した・設定を変えた記録は残しますが、子の呼び名は記録に残しません
- 保護者向けの説明文のひな形も用意しました(「どこにも送りません」と答えられる形にしています)

結果(1)汎用の画像AIでは足りず、顔照合の専用モデルで解決
評価用に 150枚(その子が写っている27枚・写っていない123枚)を選び、人が先に正解を付けてから比べました。
| 方式 | 似ている順の上位10枚のうち本人 | 上位20枚 |
|---|---|---|
| 汎用の画像特徴 | 10枚中7枚(元写真1枚) | 20枚中11枚 |
| 顔照合の専用モデル(SFace・採用) | 30枚中30枚(元写真3枚の合計) | 60枚中57枚 |
精度が一番高かったモデル(ArcFace)は、ライセンスが非商用に限られるため使っていません。差が出たのは、元写真の顔が小さいとき(顔の幅が写真の約3%)でした。元写真は、顔が大きく写ったものが効きます。
結果(2)「この子です」と自動で決めるのは、やめた
似ている度合いに区切りを設ければ、自動で「本人」と決められるのではないか。元写真を1枚ずつ外して確かめました(1枚抜き)。
| 照合 | 区切り方 | 他の子を本人とした件数(1枚抜きの合計) |
|---|---|---|
| 採用したモデル | 決まった距離 | 0件(ただし他の子が混ざり始める境目ちょうどで、余裕なし) |
| 採用したモデル | 元写真ごとに調整 | 1件 |
| 精度が一番高いモデル | 決まった距離 | 18件 |
元写真が変わると、同じ区切りが通用しませんでした。他の子の写真を「お子さんの写真です」と渡す誤りは、取り返しがつきません。そこで、自動で区切るのをやめ、似ている順に並べて人が上から確かめる形にしました。
結果(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)
構成と計測条件
- 対象データ:自チーム(ミニバスケットボール)の写真 32,122枚(外付けSSD・2016〜2026年)。取り込み対象は「土日祝の体育館らしい日」= 45日・10,989枚(撮影設定の ISO・シャッター速度の中央値で推定)。
- 顔の検出 YuNet(MIT)+ 照合 SFace(Apache 2.0)。いずれも OpenCV Zoo の商用可モデル。目の開き具合は Apple Vision(macOS の機能)。
- 実装:Python(画面とロジック)+ Swift(Apple Vision・Mac アプリの窓)。パソコンに不慣れな人向けに、ダブルクリックで開く Mac アプリにしています。
- 処理はすべて担当者の Mac 1台の中。クラウドの顔認識は使いません(写真も顔の数値も送りません)。顔の数値は Mac の中だけに保存(ディスク暗号化を前提)。
- 評価:150枚(その子が写っている27枚・写っていない123枚)に人が先に正解を付けてから比較。
検出・数値化・並べ替えまでが手元の Mac の処理。外部のAIサービスは使いません。本人の確定と、除外候補の採否は人が行います。
顔の数値は年度ごとに削除(年度が変わると画面で通知・自動削除はしない)。操作の記録は残すが子の呼び名は残さない。保護者向け説明文のひな形つき。
モデルの比較(母数つき)
| 方式 | 上位10枚のうち本人 | 上位20枚 | 備考 |
|---|---|---|---|
| macOS の汎用画像特徴(顔の切り出しに適用) | 10枚中7枚(元写真1枚) | 20枚中11枚 | 誤検出0になる区切りが無い(最も厳しい区切りでも4件中1件が他人) |
| SFace(採用・Apache 2.0) | 30枚中30枚(元写真3枚の合計) | 60枚中57枚 | 商用可 |
| ArcFace(非商用ライセンスのため不採用・比較のみ) | 30枚中30枚 | 60枚中60枚 | 顔の幅が写真の約3%の元写真で、上位20枚中 SFace 17枚・ArcFace 20枚 |
自動の足切りを見送った根拠(1枚抜き)
| 照合 | 区切り方 | 誤検出(1枚抜きの合計) |
|---|---|---|
| SFace(採用) | 決まった距離 | 0件(区切りが「他人が混ざり始める境目」ちょうどで余裕が無い) |
| SFace(採用) | 元写真ごとの相対スコア | 1件 |
| ArcFace | 決まった距離 | 18件(ある元写真で崩れる) |
取り込みと、日の判定
- 取り込み 0.45秒/枚(同時4つ・9,653枚で73分)、顔 48,904個を検出。
- 対象日の推定は撮影設定(ISO・シャッター速度)の中央値。当初は各日8枚を抜き出して調べていたが、屋内と屋外が混ざった日は選ぶ8枚で判定が変わった。
- その日の写真をすべて調べると 45日・10,989枚(32,122枚・372日のうち)。8枚の抜き出しとは 372日中3日(別の抜き出しでは6日)食い違った。
- 全部読むのは初回だけ約2分(2回目からは覚えた値で約1秒)。
目つぶりの候補
| 方式 | 候補 | うち本当に閉じていた |
|---|---|---|
| Apple Vision(採用) | 9枚 | 8枚 |
| MediaPipe(比較のみ) | 7枚 | 6枚 |
- 候補として印を付けるだけで、自動では外しません。
- 基準は同じ写真で決めたので甘めの数字です。閉じている写真が15枚と少ないことにも注意してください。
- Apple Vision の目の位置は、顔の位置を0.1画素ずらすだけで値が最大0.05揺れました。7通りずらした中央の値にして0.015に抑えています。
ここは測っていない
- 速さ(手作業との比較) … 手作業の時間も、このアプリを使ったときの時間も測っていません。
- 本人の自動判定 … 機械が「この子です」と決める設計にしていないため、自動で本人を特定できる率は出せません(理由は上記)。
- アルバム全体の正しさ(渡した写真に他の子が混ざった率) … 最後は人が選ぶため、ツール単体の数字としては出せません。
- 除外候補(ブレ・顔が小さい・暗い・連写)の当たり外れ … 目つぶり以外は人の正解を付けていないため、出せるのは候補の件数だけです。
- 他チームでの利用実績 … 自チームのみです。
- 満足度・保護者の反応 … 測っていません。
Analyzegear