Google Colabで小型ローカルVLMを画像品質評価AIに育ててみた

AI

こんにちは。

最近ローカルLLM界隈が盛り上がっています!

ChatGPTやClaudeのようなクローズドモデルに匹敵する性能をたたき出すものも出てきました!

特にQwen3.8やOrnith1.5あたりは衝撃的なベンチマークスコアでした!

Qwen/Qwen3.8-27B · Hugging Face
We’re on a journey to advance and democratize artificial intelligence through open source and open science.
ornith-ai/Ornith-1.5-397B-GGUF · Hugging Face
We’re on a journey to advance and democratize artificial intelligence through open source and open science.

こうした高性能なモデルをローカルで動かすために、DGX Sparkのような高性能なマシンへの注目も高まっていますね。

100万円の「DGX Spark」価格.comデスクトップランキング2位に ローカルAI特需で急上昇(アスキー) – Yahoo!ニュース
価格.comの「デスクトップパソコン 人気売れ筋ランキング(8月21日付)」で、エヌビディアのAI開発向けPC「DGX Spark」が2位にランクインした。

一方で、私は「高性能な巨大モデルを動かすこと」よりも、「一般的な環境でも扱える小型モデルをどこまで実用的にできるか」に興味があります。

というわけで前回はテキストモデルでしたが、今回は画像を扱えるマルチモーダルモデル(以下VLM)の学習方法について紹介したいと思います。

【GoogleColab無料枠でOK!】SFT+GRPOでローカルLLMに『思考プロセス』を学習させる実践ガイド
こんにちは。Fable5やGPT-5.6など優秀なクローズドモデルの開発が進む昨今のAI業界ですが、同時にその優秀さがいつまで使い続けられるのかも疑問視されるニュースがありました。米国による輸出制限です。7月1日より解除されましたが、今後も…

今回も無料のGoogle Colabで動かせるノートブックを用意したので、お試しレベルでの動作確認もできます。

VLMのチューニング方法についてご興味のある方はご参考ください。

それではよろしくお願いします。

VLMに画像の品質評価(IQA)をさせてみる

ローカルLLMの盛り上がりに加えて、最近面白い論文を見つけたのも本記事を執筆する動機だったりします。

Self-Evolving Vision-Language Models for Image Quality Assessmentvia Voting and Ranking

ByteDance社が開発した画像品質評価(IQA)用のLLMフレームワークです。

IQAという分野はDeepLearningの頃からモデルもいくつか存在します。

私もDeepLearningモデルで使ってみたことがあるのですが、出力結果があまり感覚に一致しなくて実運用には難しかった記憶があります。

人間の主観に近いIQAモデルを作るためには、膨大な学習データとアノテーション(正解ラベル・グラウンドトゥルース)が必要になります。

課題としては手作業でやると大変な上に、アノテーションの品質はばらつきがでてしまいます。

そもそも人間の主観を扱うIQAでは、唯一の絶対的な正解を定義するのが難しいため、多数の人にアノテーションを行ってもらい、平均値などを用いるのが一般的ですが、とてもコストも時間もかかります。

EvoQualityはペアワイズ多数決投票(Pairwise Majority Voting)という手法でこの課題を解決を目指したようです。

2枚の画像からペアを作り、同じペアに対してモデルに複数回回答を生成させます。

その結果を多数決することで、「どちらの画像の品質が高いか」という擬似的な順位ラベルを作成します。

これは、LLMのプロンプトエンジニアリングでよく使われる「自己整合性(Self-Consistency)」という手法を、IQAに応用した考え方です。

https://arxiv.org/pdf/2203.11171

通常、LLMに質問すると、1回の生成結果だけをそのまま回答として採用します。

しかし、複雑な問題では1回の推論だけでは偶然誤った結論にたどり着くことがあります。

自己整合性では、同じ問題に対して複数の推論経路を生成させ、それぞれの回答を集計します。

複数の異なる推論を経ても同じ結論にたどり着く回答ほど、信頼性が高いと考えるわけです。

最終的には、多数決などを利用して最も一貫性のある回答を採用します。

EvoQualityでは、この自己整合性の考え方をIQAに適応しています。

IQAは「この画像の品質は何点か」という絶対評価だけでなく、「2枚のうち、どちらの画像の品質が高いか」という相対評価と相性が良い分野です。

そこで同じ画像ペアをモデルに複数回評価させ、その投票結果を集計します。

複数回の評価で一貫して「画像Aの方が高品質」と判断されるなら、その結果をより信頼できる擬似ラベルとして採用するという仕組みです。

EvoQualityは、Self-ConsistencyとIQAのランキングベースの性質を組み合わせることを明確に意識して設計されています。

あとはその正解をより出せるようにGRPOで強化していく自己進化型の手法です。

使用する報酬関数Fidelity Rewardsがとても重要なのですが、それについての解説は内容が難しく長くなるため、気になる方は後々紹介するNotebookをご覧いただくか、論文をご覧いただくのが良いかと思います。

さて少し長くなりましたがEvoQualityの概要としては以上です。

個人的な感想としてはとても合理的な手法で勝算もありそうな気がします。

一方で懸念点としては、使うモデル次第なところもあり、モデルの学習したデータによるバイアスなどの影響は少なからずあるように思います。

ただこれも強化学習で使うデータセットや報酬関数の工夫をすればある程度対策はできるのではないかと思います。

このGithubではベースモデルはQwen2.5-VL-7B-Instructですが、Google Colabの無料枠で動かすのはリソース的に難しそうです。

前回も使用したLFMシリーズのVLMである、LFM2.5-VL-1.6Bを使って、同じようなことができないか検証してみました。

モデル:LFM2.5-VL-1.6B

おそらく私が知るVLMの中では最も最軽量、かつ高精度なモデルです。

LiquidAI/LFM2.5-VL-1.6B · Hugging Face
We’re on a journey to advance and democratize artificial intelligence through open source and open science.

圧縮なしの16bitでもVRAM使用量は約3GB、GGUFの4bit量子化版であれば約700MBと、1GB以内で動作させることもできます。

これはGPUリソースがなくてもCPUでの推論も可能なサイズ感です。

最近3Bもリリースされたので、そのうち検証してみたいところです。

LiquidAI/LFM2.5-VL-3B · Hugging Face
We’re on a journey to advance and democratize artificial intelligence through open source and open science.

リソースの観点から、今回は1.6Bを使用しました。

データセットは、EvoQualityと同様にKonIQ-10kを使いました。

データセット:KonIQ-10k

IQAの分野ではよく使われるデータセットです。

KonIQ-10k Database
KonIQ-10k is,?? at the time of publication,?? the largest IQA dataset to date consisting of 10,073 quality scored images…

1,459 人のクラウドワーカーから 120 万件の信頼できる品質評価を取得し、より汎用的な IQA モデルへの道を開きました。

という説明もある通り、人のブレや品質評価に対して、かなりの人手を割いて作られたデータセットです。

フルサイズと小さいサイズの2種類がありますが、今回はお試しのため小さいサイズを使います。

パイプライン(処理の流れ)とNotebook

基本的に前回と概ね同じ流れです。

  1. SFT: KonIQ の MOS(人の総合評価の平均)と公式インジケータ(brightness / colorfulness / contrast / sharpness)で JSON を出力するよう LoRA 学習する
  2. オフライン投票(EvoQuality): 画像ペアをモデル自身に何度も比較させ、多数決で擬似順位ラベルを作る
  3. GRPO: 擬似順位を fidelity 報酬にして、相対品質の一貫性を強化する
  4. 評価: MOS との PLCC / SRCC(どれだけ人の評価に近いか)、サンプル推論

Google Colab Notebookは以下になります。

Google Colab

前回同様、「ファイル」→「ドライブにコピーを保存」して使ってください。

ノートブックの最初の方にRUN_MODE = “demo”とありますが、今回はこの簡易版で実行します。

リソースに余裕があれば”full”も試してみてください。

結果

まずは学習がうまくいっているかどうか、SFTとGRPOのPLCCとSRCCを見ていきます。

PLCCとSRCCは-1から1の範囲を取る相関係数です。

1に近いほど人の評価と強い正の相関があり、0に近いほど関係が弱く、-1に近いほど人の評価と逆の傾向を示します。

まずはSFTです。

=== after SFT ===
brightness PLCC=0.218 SRCC=0.191 parse_rate=1.00
colorfulness PLCC=0.139 SRCC=0.134 parse_rate=1.00
contrast PLCC=-0.242 SRCC=-0.220 parse_rate=1.00
sharpness PLCC=0.455 SRCC=0.459 parse_rate=1.00
overall PLCC=0.394 SRCC=0.470 parse_rate=1.00

JSON形式についてはparse_rate=1.00となっており、出力フォーマットの学習は問題なさそうです。

一方、品質スコアの予測精度はまだ十分とは言えません。

特にcontrastは負の相関になっているため、この時点では品質評価能力そのものが十分に獲得できているとは言いにくそうです。

これらの品質スコアがGRPOでどの程度向上しているかが重要です。

=== after GRPO ===
brightness PLCC=0.155 SRCC=0.095 parse_rate=1.00
colorfulness PLCC=0.316 SRCC=0.279 parse_rate=1.00
contrast PLCC=-0.129 SRCC=-0.120 parse_rate=1.00
sharpness PLCC=0.187 SRCC=0.267 parse_rate=1.00
overall PLCC=0.587 SRCC=0.683 parse_rate=1.00

GRPO後はoverallのPLCCが0.394から0.587、SRCCが0.470から0.683まで向上しました。

一方で、brightnessやsharpnessは悪化しており、すべての指標で一様に性能が向上したわけではありません。

今回のGRPOでは「画像同士の総合的な品質比較」を中心に学習しているため、overallには効果が出やすい一方、brightnessやsharpnessまで十分に最適化できていない可能性があります。

今回は30~40分ぐらいでサクッと終わらせるため、データもパラメータも控えめなので、ちゃんとやろうと思ったらリソース確保してガッツリやった方が良さそうです。

では実際に学習したモデルでテストしてみましょう。

13. 好きな画像を採点する のところでGRPOした結果をテストできます。

キャンセルボタンを押せば、KonIQ-10Kのテストデータを使って評価結果が出ます。

REASONINGの説明文を見ると、方向性としては正しいように見えます。

定量評価ではまだ十分な相関が出ているとは言えませんが、個別の推論例を見ると、REASONINGの説明にはある程度納得できる部分があります。

まとめ

今回は軽量VLMであるLFM2.5-VL-1.6Bを使ってSFT→ペアワイズ投票→GRPOという流れをGoogle Colabで一通り実験してみました。

GRPOによって、overall MOSとの相関は改善したことから、強化学習の効果はありそうでした。

それ以外のスコアはうまくいっているとはいえないため、やはりリソースを確保してデータセットやパラメータ、報酬設計の改善が必要そうな感じでした。

この辺の課題をクリアすれば、実際の現場で使えるタスク特化型VLMにつながる可能性もありそうです。

VLMを使って現場で使えるLLMの開発の参考になれば幸いです。

ここまでご覧いただきありがとうございました!

この記事を書いた人
MLエンジニア/データサイエンティスト

自動車部品メーカーで制御系ソフトウェアエンジニアを10年以上勤めた後、MLエンジニア兼データサイエンティストとして活動中の30代男性、2児の父。
個人投資家としても活動中。主に国内株式と米国株式。
自由と豊かさと技術をこよなく愛する。

よねすけをフォローする
AIプログラミング
シェアする
よねすけをフォローする
タイトルとURLをコピーしました