📷

画像のピクセルサイズを読み込むMCPサーバーだけを作って画像の傷を検知できないか調べた。

に公開

まえがき

最近LLMが強すぎるので画像を読み込ませるだけで画像の傷などはなんとなく教えてくれるようになった。
でも傷画像の位置はざっくり教えてくれてもピクセル位置までは教えてくれないので、MCPサーバーでピクセルサイズを教えておけば大体のピクセル位置を教えてくれるんじゃないかと思ったので作りました。

画像のデータセット

下の画像から一枚使用させていただきました。ありがとうございます。

https://github.com/lvxiaoming2019/GC10-DET-Metallic-Surface-Defect-Datasets

ピクセルサイズを読み込むMCPサーバーのコード

コードとしては30行くらいです。単純にopencvで画像を読んでshapeで画像の全体のピクセルサイズを返しています。

from typing import Any, List, Optional
import cv2
import numpy as np
import base64
import io
from PIL import Image
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("get_shape")

def load_image_from_path(image_path: str) -> Optional[np.ndarray]:

    image = cv2.imread(image_path)
    if image is None:
        print(f"画像の読み込みに失敗: {image_path}")
        return None
    return image

@mcp.tool()
async def get_image_shape(
    image_path: str
) -> str:

    image = load_image_from_path(image_path)
    if len(image.shape) == 3:
        height, width, channels = image.shape
        return f"shape: ({height}, {width}, {channels})"
    else:
        height, width = image.shape
        return f"shape: ({height}, {width})"

if __name__ == "__main__":
    mcp.run(transport='stdio')

プロンプト

今回はローカルにある画像パスを指定しないとmcpサーバー経由でclaudeに読んでくれないのでプロンプトで指定しています。
また二度手間ですがパスの画像と同じ物をclaudeに貼り付けています。

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

なんとなくうまく行ってそうですが念の為ピクセル位置を確認します。
以下のサイト様使わせていただきました🙏

x軸はほぼ合ってますが、ちょっとy軸がズレてますね。
あと小さな点状の傷があるとなっているんですがそれは確認できなかったです。

まとめ

大きめの傷ならある程度のピクセル位置まで判定できそうかもしれないと思いました。ただ誤判定も今のところはありそうなので、特徴量を追加したり画像の種類を変えたらもしかしたら精度が上がるのかなと思いました。

Discussion