このコラムの目標は血圧計の写真を読み込み
- 最高血圧
- 最低血圧
- 脈拍
を取得して出力はCSV形式にする
なぜ作ろうと思ったか?
- 僕自信が高血圧で、記録をつけないとまずい(医師にいわれている)
- 高血圧をほっておくと、またくも膜下出血で倒れるリスクがある
- 手書きがほぼできない(字がまともにかけない)
- 記録をスマホ連携する血圧計が高い
- サ終になると嫌だからあえて自分で作る
コアになる画像解析をつくれないかと思って検証してみました
実行イメージ
実行環境
- OS Ubuntu 24.04
- GPU RTX4090
- Elixir 1.17.1-otp-27
- Erlang 27.2.1
- Olama 0.13.0
- モデル gemma3:27b
前提知識
ElixirでのOllamaの使い方はこのコラムを参考にしてください
プログラムを書く
lib/llm_image.ex
defmodule LlmImage do
@moduledoc """
Documentation for `LlmImage`.
"""
def run(file) do
client = Ollama.init()
{:ok, ret} =
Ollama.completion(client,
model: "gemma3:27b",
prompt: prompt(),
images: [get_base64_image(file)]
)
ret
|> Map.get("response")
|> IO.inspect()
end
defp get_base64_image(file) do
image_file_path = "#{System.user_home()}/local/tmp/#{file}"
{:ok, binary} = File.read(image_file_path)
Base.encode64(binary)
end
defp prompt() do
"""
次の数値のみ取得してください
- 最高血圧
- 最低血圧
- 脈拍
出力はCSV形式で
フォーマット例
120,70,80
"""
end
end
たったこれだけです
プログラム解説
prompt()で指示を書きます
次の数値のみ取得してください
- 最高血圧
- 最低血圧
- 脈拍
出力はCSV形式で
フォーマット例
120,70,80
ポイント
- どの情報が必要
- 出力形式
これを指定することで毎回決まって形式で取得できます
get_base64_image(file)で画像ファイルを取得
- File.readでバイナリ形式で取得
- Base64に変換
ポイント
- Base64にすることでOllamaに画像を渡すことができます
Ollama.completionで実行
- モデルの指定 gemma3:27b
- プロンプトの指定 prompt()
- 画像の指定 get_base64_image関数の結果
ポイント
- images:で画像を渡すことができます
- Base64形式にします
カラー画像とグレースケール画像では精度が違った
グレースケール画像の方が精度が良かったです
ollamaコマンドであらかじめ検証しました
今後の課題
- カラー画像をグレースケール画像変更
- LiveView化
- グラフ描画
今は技術検証をして最終的にはWebアプリにしたいと考えています
ソース




