毎月、娘の希穏の保育園から写真アルバムが届きます。実際にはzipファイルが何個か届き、それぞれにクラス全員が写った何百枚もの写真が入っていて、そのどこかに希穏の写った十数枚があります。やることはいつも同じ。全部を解凍し、よその子たちが写った何百枚もの写真をスクロールして、自分の子を選び出し、それをPhotosアプリに入れる。ありがたい悩みではありますが、毎月やるとなると面倒な作業です。
そこでKiFinderを作りました。その選り分けをやってくれる小さなMacアプリです。人物をエンロールするには参照写真を数枚ドロップし、アルバム(フォルダ、ばらの画像、あるいは届いたままの保育園のzipファイル)に向けると、すべての写真を三つの山に仕分けます。確信のある一致、もう一度見ておきたいもの、そして残り。確信のあるものをざっと確認し、迷うものに目を通し、正しいものをkeepして、keepしたものをそのままPhotosに書き出します。集合写真には専用の扱いがあります。クラス写真には十数個の顔が写っているので、検出した顔をすべて表示し、自分が意図する顔をタップします。中身では、InsightFaceのArcFaceモデルによる端末上のエンベディングで、各顔がエンロールした人物にどれだけ近いかをスコア付けし、本物の写真を取りこぼさず、誤検出に埋もれさせないよう、しきい値を自分で調整します。
スキャンの見直し。KiFinderは確信のある一致を自動で選び、際どいものは「もう一度見ておきたい」として脇に置き、残りは外します。集合写真では検出した顔をすべて表示するので、正しい顔をタップできます。デモでは娘ではなく自分をエンロールし、ほかの人物は合成顔で代用しています。
端末上で動くことは、あれば嬉しい機能ではなく、まさに核心です。これらのアルバムには、よその家庭の子どもたちが大勢写っています。自分の子を見つけるために、他人の子の写真を何百枚もクラウドサービスにアップロードするのは、まったく逆の取引です。KiFinderは写真をどこにも送りません。モデルはローカルで動き、オリジナルは一切変更されず、端末から出ていくのは、私がkeepに選んだ数枚だけです。
人物のエンロールは、参照写真を5枚から十数枚ドロップするだけ。顔はMac上で切り出され、外には出ません。それがこのアプリの基本姿勢です。
そして、私の判断から学びます。スキャンのあと、本物の一致をkeepし、似ているだけの顔をスキップすると、その訂正が人物のプロファイルに反映され、翌月のアルバムでより良くランク付けされます。しかも一ピクセルもモデルにかけ直すことなく。keepしたものは、人物と月でまとめたライブラリに集まり、Photosに渡せる状態になります。
keepしたもの。人物と月でまとめたライブラリに集まり、Photosに書き出せる状態です。
これ全体を、私の敵対的ビルドハーネスであるSparraを回して作りました。おかげでKiFinderは、その最初の本物のテスト対象の一つになりました。下のアップデートが制作ログです。マッチングエンジン、私の訂正から学ばせた話、そしてその周りで育っていったMacアプリ。