【Japanese Stable VLM】画像入力対応の日本語特化ローカルLLMで何ができるのか？【実験】

この記事は、[「DeepAelurus(NPO法人AI開発推進協会）」 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/deepaelurus) 4日目の記事です。

---

# 1. はじめに


この数か月で、画像の入力に対応したローカルLLMがいくつか登場しています。

- Turing社「Heron」

https://huggingface.co/turing-motors/heron-chat-blip-ja-stablelm-base-7b-v0

https://huggingface.co/turing-motors/heron-chat-git-ELYZA-fast-7b-v0

---

- Stablity AI社「Japanese Stable VLM」

https://huggingface.co/stabilityai/japanese-stable-vlm


Stablity AI社の「Japanese Stable VLM」は、画像入力対応でかつ条件の範囲内で商用利用可能な日本語画像言語モデルです。Windows上でも簡単に導入でき単一のリポジトリで完結することから、今回はこのモデル（以下、Stable VLM）を使って何ができるのか実験してみました！

https://ja.stability.ai/blog/japanese-stable-vlm


- 以下の環境で動作を確認しました。

| 項目 | |
|:-- |:--|
| OS | Windows 11  |
| CPU  | AMD Ryzen 7 5700X  |
| メインメモリ  | 64GB  |
| GPU  | NVIDIA GeForce RTX 3090 |

---

# 2. 実装

image-to-textモデルということで、画像ファイルを一括で処理するスクリプトを作成しました。
Stable VLMとHeronの各種モデル（GIT、BLIP）に対応しています。

https://github.com/keisuke-okb/vlm-image-tools

Stable VLMにおいては、以下のタスクに対応しています。

| タスク | 説明 |
|:-- |:--|
| "caption"：キャプション | 画像を説明する |
| "tag"：タグ  | 与えた単語を使って説明する |
| "vqa"：質問応答 | 画像に関する質問に答える |

---


上述のタスクを利用し、実装した処理内容は以下の通りです。

- `--save_text`： 画像ファイル名とそれに対応する結果をテキストファイルに保存する。
- `--rename`: モデルの出力に従ってファイル名を変更する。
- `--classify`: モデル出力に従って画像ファイルを複数のフォルダに分類する。

---

### 使い方

コマンドラインやJupyter Notebook上で簡単に実行できます。

```python
from stable_vlm import StableVLM
model = StableVLM("Z:\models\japanese-stable-vlm")

model.run_tools(
    input_dir="path/to/images_input",
    output_dir="path/to/images_output",
    task="caption",
    input="",
    do_sample=False,
    save_text=True,
    rename=True,
    classify=False,
)
```

---

# 3. 実験

## 3.1 写っているものや動物別に画像ファイルを分類する

|パラメータ | 設定 |
|:-- |:--|
| タスク | 質問応答 |
| 入力情報 | "この画像に写っている動物は何ですか？" |

https://pixabay.com

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/aa328393-9e75-59f6-147a-a94e03f8ea0f.png)

フォルダ分けを実行すると...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/debcc308-78fe-3924-cf7c-172f2dfbeb36.png)

:::note info
一つのフォルダ名が「この写っている画像を下に、質問に答えてください。」になってしまいましたが、この中にはライオンの画像が入っており、フォルダの分類自体はできていました。
:::

---

## 3.2 画像ファイル名を、写っているもの・動物などの名前に変更する

|パラメータ | 設定 |
|:-- |:--|
| タスク | 質問応答 |
| 入力情報 | "この画像に写っている動物は何ですか？" |

3.1と同様の画像について、リネームを行うと以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/e2df5efc-60f2-fc27-63c5-9376d88abc70.png)

:::note info
単一の動物写真であれば、かなり精度高く分類を自動化できそうです！
:::

---

## 3.3 人物写真に写っている人の人数を認識する
意地悪として、ミーアキャットの画像を紛れ込ませてみました。

|パラメータ | 設定 |
|:-- |:--|
| タスク | 質問応答 |
| 入力情報 | "この画像に写っている人の人数は何人ですか？" |

https://pixabay.com

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/979ae3bd-d3ca-9592-86a3-279e96cecde5.png)

---

写っている人数でリネームすると、以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/5de0043d-3075-e3de-648d-04ab7e4fbb62.png)

- 「1」と「１」など半角と全角で別々になってしまいました（改善の余地あり）。
- 1、2人は完璧に認識できていますが、グループ写真はの人数はまちがっています。（本当は6人）
- ミーアキャットの画像は、もはや人数ではなく「この画像を下に、質問に答えたください。」になってしまいました。

---

## 3.4 面白い画像を説明させる

「DALL.E 3」を利用して、いくつか様々なテイスト、画風の画像を生成してみました。これらの画像を説明できるのか試してみます。

|パラメータ | 設定 |
|:-- |:--|
| タスク | 質問応答 |
| 入力情報 | "この画像の面白い点は何ですか?" |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/56ce2323-3712-b017-af2e-e95ce6f2d2d3.png)

結果は以下のようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/04cc456c-4edf-d316-7f1a-367369a77dd4.png)

:::note alert
現時点でのStable VLMには、「画像の面白さを説明させる」のは難しいようです。
:::

---

試しに、単純にキャプションをつけてみました。

|パラメータ | 設定 |
|:-- |:--|
| タスク | キャプション |
| 入力情報 | なし |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/4f1cc0e8-db95-26f4-71d5-e6b5a9b76cb6.png)


:::note info
ハンバーガーの画像はそのままでしたが、単純なキャプションタスクの方が画像をよく説明できています。「面白さ」という観点の答えではありませんが、ある程度画像の情景描写ができていることがわかります。
:::

---


## 3.5 おまけ：YouTubeの音楽MVのキャプショニング

単一のフレームからどれだけその動画の状況をテキスト化できるのか、試してみました。
（今まで個人的にカラオケ音源を制作した楽曲の原曲MVの中から、キャプショニングテストとして良さそうな動画のフレームをピックアップしました）

- 「[勇者 / YOASOBI](https://www.youtube.com/watch?v=OIBODIPC_8Y)」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/0ba4aa10-c7d6-36eb-1735-81c5becfd06f.png)
連呼するだけになってしまいました。現段階のStable VLMでは、「質問をおうむ返しする」「特定の単語を連呼する」ことがあるという問題がありそうです。


- 「[Chessboard / Official髭男dism](https://www.youtube.com/watch?v=qo55wGLXcOQ)」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/a96580c2-6882-5506-4405-3bf2fb8d2ba5.png)
状況を正しく理解しています。この曲のコンセプトである「チェスボード」の意図を正しく出力できています。

- 「[強風オールバック / ゆこぴ](https://www.youtube.com/watch?v=D6DVTLvOupE)」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/fae1a79f-247a-c595-4c51-b255618b8d25.png)
状況を正しく理解していますが、さすがに強風でオールバックになっていることは出力されませんでした。

-  「[Majoram Therapie / ももいろクローバーZ](https://www.youtube.com/watch?v=NbyFj150P1E)」 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/31a0a0ef-fd16-d8dd-3422-28054cc7a090.png)
アニメではなく実写ですが、「ステージで踊る」という状況は正しく理解しています。

-  「[アイデン貞貞メルトダウン / えなこ feat. P丸様。](https://www.youtube.com/watch?v=zymfiOtew9I)」 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/7e0ab321-5d4f-7ebc-36a4-edafe7e35dd5.png)
合っていそうで合っていませんでした。「キャラクター」「スクリーン」という意味では部分的に捉えられています。

-  「[なにもの / King & Prince](https://www.youtube.com/watch?v=jnVlcB74A_k)」 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/dc138422-d686-6724-eee5-e044bce141f2.png)
演奏はしていませんが、「赤いカーテン」「2人」という部分は正しく認識できています。

-  「[星座になれたら / 結束バンド](https://www.youtube.com/watch?v=wSTbdqo-j74)」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/9c6d5f58-fe2c-55cb-02e1-10efcbe61a89.png)
暗くわかりにくいですが、こちらも部分的に「キャラクター」「街」という意味を捉えているものの、文章としては無理があります。


-  「[habit / SEKAI NO OWARI](https://www.youtube.com/watch?v=8OZDgBmehbA)」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/15f94b7d-b42b-3fed-ba78-549e718ea801.png)
座ってはいませんが、人々であることは認識しています。よくよく考えると、机に座ってはいけません。



:::note info
ほとんどの動画において、部分的にキーワードを出力させることには成功しました。形態素解析などを盛り込んで単語化すれば、この認識結果を使って何か応用ができるかもしれません。
:::


---


# 4. さいごに

「Japanese Stable VLM」を利用して画像ファイルを一括処理する方法を紹介しました。難しいタスクがあったものの、ある程度キャプショニングや画像分類を自動化できることがわかりました。

今後、Stable VLMなどのローカルで動作するマルチモーダルモデルがさらに高精度になっていくのが楽しみです！
ご覧いただきありがとうございました！