生成AI APIからローカル顔認識ライブラリへ。推しメン画像自動分類システムの試行錯誤

Idol Data Lab

今回は少しアイドルヲタク寄りの記事になる。

このブログでも何回か書いているが、私は日向坂46を応援しているヲタクだ。

先週の7月15日(水)・16日(木)も五期生のライブが横浜のぴあアリーナMMで開催され、両日とも参加してきた。
(声を出し過ぎて翌日声が枯れてたり、金曜日の専門学校でのIT授業では少し眠かったりしたが倒れたりはしないで済んだ。)

そんな私が以前からチャレンジしたいと思っていたのが、ブログに挙がっている画像に登場しているメンバーを自動で識別したいというものだ。

と言うのは私はまず金村美玖というメンバーを推していて、毎日xに金村美玖のブログ画像やインスタグラムの画像を添付して朝の挨拶を投稿している。
ただ、日向坂46のメンバーの誕生日の際には、金村美玖とメンバーが写っている画像をアップしているのだ。
その金村美玖と誕生日のメンバーが一緒に写っている画像をブログから探すのが結構大変なのだ。
なので、ブログに画像が掲載されるたびに、画像の登場人物を記録しておけば、検索も早く出来るのではないかと考えていたのだ。

AIに費用を聞いてみた。

『プロンプト』
「坂道メンバーの顔を覚えてもらうために、メンバー毎に何枚かトレーニング用に画像を用意して、それを読み込んで記憶してもらう。
過去の3年程度のブログ記事が約13000記事ある。また1記事に3つ程度画像が掲載されている。
その画像に写っている人物をメンバー内にいればメンバー名、メンバー以外ならメンバー以外と返し、人物が写っていなければ人物無しと返してもらい、それぞれの画像を分類するシステムを作成したい。
どの位の費用が掛かるか算定して欲しい。」

『回答(概要)』
「システムとして運用するためには、AIの利用料金(実費)のほかに、スクレイピングやサーバー環境の構築費用が必要です。
AI API利用料(実費): 約 12万円
上記のバッチ処理による分類実行費用。
初期開発・インフラ構築費: 約 30万 〜 80万円
ブログ記事13,000件から画像を自動ダウンロードするスクレイピングプログラムの作成。
トレーニング画像とブログ画像をAIに順次投入し、結果をCSVやデータベースに保存するシステム(Python等)の開発。
画像を一時的に保存するストレージ料金(数GB程度のため月額数百円〜数千円程度)。
コストをさらに抑えるためのアドバイス
もし12万円のAPI実費をさらに下げたい場合、「Context Caching(コンテキスト キャッシング)」という機能を有効にします。
これを使うと、全リクエストで共通して読み込ませる「トレーニング画像500枚分」の入力料金が約4分の1に減額されるため、
API実費を約3万〜4万円前後まで圧縮できる可能性が高くなります。」

『プロンプト』
「また、その前提で毎日最大10記事程度投稿される記事を分類する場合のランニングコストはどのくらいになるだろうか?」

『回答(概要)』
「月々の総ランニングコスト目安
システムを自動で安定稼働させるための全体の月額費用です。
AI API利用料(実費): 約 2,300円 / 月
クラウドサーバー・ストレージ費: 約 1,000円 〜 3,000円 / 月
毎日自動でブログをチェック(スクレイピング)し、AIへ転送するプログラムを動かす小型のクラウドサーバー(AWSのEC2やLambda、GCPなど)の維持費。
新着画像を一時的に保存するストレージ(Amazon S3など)の費用。
💡 運用のポイント
システム全体のランニングコストは、月額 約3,500円 〜 5,500円程度で収まる計算になります。」

一度構築すれば毎月数千円かと思いながら、さすがに毎月これだけの費用が掛かるのは少し高いなと感じた。
なので、その時は、一旦保留にしていた。

実はこの時『プロンプト』に問題があることに気付いていなかったのだ。

もう一度AIに聞いてみた

ずいぶん経ってから、そう言えば、最初のプロンプトでは有料前提に聞いてたなと思いだした。AIをプログラムから利用する場合に、ある程度は無料で使えることを思い出したのだ。
たぶんトレーニングをする前提だと有料になってしまうのだろうが、トレーニングをせずに、ある程度の精度で分類することは出来るのではないかと思ったのだ。
そこで、もう一度AIに聞いてみることにした。

『プロンプト』
「坂道メンバーの顔写真を1人につき2枚か3枚(合計180枚から270枚位)AIに渡して、いくつかの写真に写っているのがメンバー(1人〜複数)なのか、それ以外の人なのか、それとも人がいない写真なのかを分類するプログラムを作りたいと思っている。
まずは無料の範囲で作りたいと思っている。まずはそれが可能かどうか知りたい。」

『回答(概要)』
「結論から申し上げますと、ご希望のプログラムを無料の範囲で作成することは十分に可能です。
現在のAI技術(特に画像認識・マルチモーダルAI)の進歩により、数十枚〜数百枚程度の画像であれば、高額なマシンや有料のAPIを使わなくても、無料のクラウドサービスやオープンソースのライブラリを活用して判別・分類させることができます。
実現可能である理由と、それを可能にするアプローチを大きく2つに分けて解説します。
1. 無料の生成AI API(Gemini API など)を活用する(推奨:最も簡単)
2. Google Colaboratory とオープンソースの顔認識ライブラリを使う(自由度が高い)」
ということで2種類のアプローチを説明してくれた。

ということで、今回は無料の生成AI APIを使って出来る方法を試してみようかと考えた。

ただ、まずメンバー毎に1~2枚の登録用画像を用意する必要があった。
AIにどうやって画像を作ってAIに渡すのかを聞くと、メンバーの画像を一つのフォルダに格納し、メンバー名とグループ名、そして画像ファイル名をまとめたjsonファイルを作成するのが良いということだった。
その際の画像ファイルの名前の付け方もいろいろと提案してもらった。

そこで、提案通りファイルをローカルフォルダ格納して、ルールに従って名前を付与した上で、jsonファイルを作成した。

そして、次にAIにjsonファイルを渡して、画像の分類を行うプログラムを作成することにした。
今回はPythonを使って、ローカルフォルダの登録用画像をjsonファイルで渡した上で、テスト用の画像を読み込んで、分類結果を返すプログラムを作成した。
その結果、登録ファイルは無事に読み込まれ、テスト用の画像も読み込まれて、分類結果を返すことが出来た。

ただ、二人の顔が写っている画像だったのだが、二名のうち一名の認識がうまくいかなかった。
そこで、まずはプログラム中のAIに対するリクエストのパラメータを変えて、認識精度を上げるようにしてみた。
でも結果は変わらなかった。
さらにプログラムで指定するAIのモデルを変えてみた。しかしそれでもやはり二名のうち同じ一名の認識が上手くいかないのだ。しかも別のメンバーだと誤認識する。

不思議な事にちゃんと二名を認識してくれたのだ。おそらくAPI経由で大量の登録画像をプロンプトに渡す際の指示の出し方(プロンプトエンジニアリング)にコツがいるのだろう。ただ、無料枠での検証にはリクエスト制限の壁があり、これ以上APIの試行錯誤を続けるのは効率が悪いと判断した。

再度AIに聞いてみた

生成AI APIを使う場合には、リクエストの回数や頻度に制限があるため、同じテストを何度も行うことは出来ない。そこで方向を変えて、ローカルな環境でAIを動かして、同じ様なことが出来ないかを試したいと考えた。

いつもの様にAIに聞いてみた。

『プロンプト』
「画像認識に強いローカルLLMを教えて欲しい」

『回答(概要)』
「ローカル環境(PC単体)で動作し、画像認識(OCR、物体検出、図表の理解など)に特に強いオープンソースの主要なVision-Language Model(VLM)を紹介します。
利用環境(PCのスペック)や用途に合わせて選ぶのが最適です。
1. 圧倒的な認識精度と日本語対応:Qwen-VL シリーズ
Qwen2.5-VL / Qwen3-VL (7B / 8B / 14Bなど)
2. 物体検出や位置特定に特化:Molmo シリーズ
Allen Institute for AIが開発した、非常に高精度なオープンソースVLMです。
3. 軽量・高速で手軽に動く:Llama シリーズ
Metaが開発しているオープンモデルで、エコシステム(Ollamaやllama.cppなど)への対応が最も早いため導入が極めて簡単です。
4. 特殊用途(軽量・超高速OCR):Florence-2
Microsoftが開発した、従来のLLMとは少し毛色の異なる超軽量ビジョン専用モデル」

と色々と提案してくれた。

ただ、なんか用途が違う感じがしたので、再度確認してみた。

『プロンプト』
「画像認識と言っても特に利用したいのは女性のかを認識できるかどうかと言う点だが、それで選択は変わるだろうか?」

『回答(概要)』
「「女性の顔を認識(判定・分析)できるか」という点に絞る場合、モデルの選択基準や重視すべきポイントは大きく変わります。
LLM(VLM)で人間の顔や性別、表情などを扱おうとする場合、一般的な「オブジェクト検出(車や犬を見つける)」や「OCR(文字起こし)」とは異なる特有の壁や特徴があるためです。
結論から言うと、この用途であればQwen2.5-VL(または最新のQwen3-VL)、もしくはLlama 3.2 Visionの2択になります(Florence-2やMolmoはおすすめから外れます)。
その理由と、顔認識における重要な注意点を解説します。」

というのだ。
う~ん、まだ違う感じがする。

『プロンプト』
「そこまでではなく、100人程度の人物の画像データを読み込んでトレーニングした上で、提供された画像に写っている人物がその100人に含まれているか?
含まれているなら名前を答えて、含まれていなければ、100人以外、もしくは人物は映っていないと応答してもらう用途になる。」

『回答(概要)』
「100人程度の特定の人物を学習(登録)させ、テスト画像にその人が写っているかを判定し、名前を特定する」という用途ですね。
この明確な目的がある場合、選択肢はローカルLLM(VLM)ではなく、100%「顔認識専用のライブラリ(Pythonツール)」の一択になります。大元の選択自体をガラリと変える必要があります。

🛠️ 具体的なシステム構成イメージ
もしPythonを使える環境であれば、以下のような構成でシステムを構築します。
登録用フォルダを作る
sato.jpg, tanaka.jpg, suzuki.jpg … のように、100人分の顔がハッキリ写った写真を1枚ずつ用意してフォルダに入れます。
プログラムの動き(わずか3ステップ)
ステップ1: 登録フォルダ内の画像を読み込み、それぞれの顔の「特徴(128次元のベクトル)」を計算して名前とセットでメモリに保持する(これがトレーニングに相当します)。
ステップ2: 判定したい新しい画像を読み込み、そこから「顔」を検出する(写っていなければ、この時点で「人物は写っていません」と即座に応答)。
ステップ3: 検出した顔の特徴と、登録されている100人の特徴を数学的に比較する。最も似ている人が見つかり、かつ「似ている度合い」が基準をクリアしていれば「〇〇さん」と出力。どれも基準を満たさなければ「100人以外」と出力。

おすすめのライブラリ
face_recognition (Pythonライブラリ):
世界で最も手軽に使われている顔認識ライブラリです。日本語の解説記事やサンプルコードがネット上に無数に転がっているため、初心者でも数時間あれば100人の認識システムを構築できます。

まとめ:
「100人の中から名前を特定する、いなければ『含まれない/人物なし』と答える」というタスクにおいて、ローカルLLMを使うのは「包丁で木を伐採しようとする」くらい不向きです。ここはチェーンソーにあたる「顔認識専用ライブラリ」を使用することを強くおすすめします。」

ローカルで顔認識ライブラリを使うことにした

あれ、ローカルでpythonの「face_recognition」ライブラリでやるのが簡単なのか?
ということで、ローカルで、Pythonの「face_recognition」ライブラリを使って、100人程度の人物の画像データを読み込んでトレーニング(厳密には特徴量の登録だが、この記事では分かりやすくトレーニングと呼ぶことにする)し、提供された画像に写っている人物がその100人に含まれているかを判定するシステムを構築することにした。
というかトレーニング用のデータは、生成AIのAPIを使う際に作ったjsonファイルを使って簡単に構築できた。

あと、ローカルで実行できるので、予算を気にせずに済むので、とりあえず5000件ほどのブログ記事画像を分類してみることにした。
いやあ、実行時間が大変だった。上手く出来ているかどうかも分からなかったので、いったん中断したら2700件ほどが分類されていた。

そこで、1割程度の件数を抽出して、分類結果を検証してみた。
結果的に、検証した248件中、正しく分類されたのは132件で、精度は約53%程度だった。

生成AIのAPIを使った場合に用意したデータは正面を向いた画像で良いということだったのだが、今回のライブラリでは、正面を向いていない画像の検出が出来ていなかった。
同じ様に、目・口・鼻が隠れている場合も検出できていなかった。

なので、正面を向いていない画像や、目・口・鼻が隠れている画像も検出できるようにするために、トレーニング用のデータを増やすことにするのだが、この記事執筆時点では、まだその作業は完了していない。
データの準備が完了したら、再度報告したい。

タイトルとURLをコピーしました