【Linux】Visionモデルを画像管理に応用する【ローカルLLM】
はじめに
※ Linux環境での記事ですが、WindowsのWSL Linuxでも利用可能です。
LLMをローカルで利用するメリットの一つとして、大量のデータをローカルPCで解析させるという使い方があります。もちろん、料金の問題もありますが、個人情報や著作物を含む可能性のある雑多な画像データを、送信可能かどうか人が確認する手間が無くなります。Googleドライブに肌面積の多い「アニメイラスト」を保存していたがために、YouTubeチャンネルを閉鎖されたというユーチューバーも珍しくない時代になってしまいました。オンラインサービスは便利である一方で、ハルシネーションの多いAIに振り回されるデメリットやリスクが大きくなります。
Visionモデルとは
視覚能力を持たせたLLM(Large Language Model)の事です。画像に関する事柄でAIとやり取りできます。たとえば、絵や写真の内容を尋ねたり、図表の内容を読み取ったりする事ができます。
例えば、次の画像を「What is in the picture?」プロンプトで解析させると、
を得る事ができます。ちゃんとエッフェル塔を認識しています。人物はAI制限が埋め込まれているため有名人であっても答えてくれませんが、名所や有名オブジェクトなどは答えてくれます。
画像ファイルのExif情報に登録する
この解析結果をJpeg画像ファイルのメタ情報へ書き込むと検索時に利用する事ができます。似たような機能はオンラインの画像管理サービスでは当たり前になっていますが、その機能を管理アプリに依存せずにローカルで利用する事ができます。
スクリプトを作る
下記記事で紹介した設定とPythonコード llava-img-analyze.py を利用します。
このコマンドは、
llava-img-analyze.py -f input.jpg -m llava_phi3 -p "What is in the picture?"
等で利用する事ができます。さらにLinuxでJPEG画像ファイルのExif情報を操作するコマンドとしてexiftoolを利用します。導入は、
sudo apt install libimage-exiftool-perl
となります。
この2つのコマンドをシェルスクリプトで利用します。※ 画像解析のために縮小するツールとしてimagemagick(convertコマンド)も利用しています。sudo apt install imagemagick で導入可能です。
ファイル名は「llava-add-exif-comment.sh」とします。ポイントは、
解析前に画像のファイルサイズをAIが扱いやすい解像度(幅を768)にしています
VLMは llava-phi3 を利用します。llava-llama3 の半分以下のメモリで同程度の性能を得られます
#!/bin/bash
set -eu
# オプション管理
if [ $# != 1 ]; then
echo "Usage: `basename $0` <file>"
exit -1
fi
# 画像を解析する前に、適切なサイズにする
# 一時ファイルは/tmpディレクトリに作る
img_in="$1"
img_tmp=`mktemp`
convert -resize 768 "$img_in" png:- > $img_tmp
# llavaで解析する
comment=`llava-img-analize.py -f $img_tmp \
-m "llava-phi3" \
-p "Describe the image in detail"`
# 得られた結果をusercommentとしてファイルへ書き込む
# 改行は削除する
comment=`echo $comment | sed -e 's/\n//g'`
echo "## $comment"
exiftool -usercomment="$comment" -overwrite_original "$img_in"
# 終了処理
rm -f $img_tmp
ただしコメントを画像ファイルに書き込む時には、バックアップを作成せずに書き込むので、バージョンに互換性がなかったたり、失敗したりすると画像ファイルが壊れます。十分注意して利用してください。
実行する
Linuxで複数のファイルへコマンドを適用する一般的なやり方です。
ディレクトリ内のすべてのjpgファイルへ適用する場合
for file in *.jpg
do
llava-add-exif-comment.sh "$file"
done
ディレクトリ下すべてのjpgファイルへ適用する場合(再帰的)
find ./dir -name "*.jpg" -print0 | xargs -I{} -0 llava-add-exif-comment.sh {}
筆者の環境(GTX1660ti)では一枚あたり10秒程度必要ですので、1000枚処理するとなると3時間程度の計算になります。
以下関連する記事の【PR】です。