Toma(とま)のゲーム日記

MHNOW、MHWIB、ELDEN RING、WILD HEARTSなどの役立ち情報をアップしていきます。ツイッターでの懸賞応募、自炊、家庭菜園といろいろ始めました。

記事内に商品プロモーションを含む場合があります。

体重記録アプリを作ってみた_02

毎日体重を測定し、Xで報告をして記録をExcelで残していますが、これが結構めんどくさい。というわけでアプリを作って簡単にできないかと、計画をスタートしました。

Google製のAI:Geminiを使って作成していきます。

初心者なのでアプリの作成完了までたどり着けるのかは…わかりません。

 

Anacondのインストールは完了

こちらのページを参考に、Anacondaをインストールしました。

www.javadrive.jp

 

プログラムディレクトリは変更してC/pgとしました。

 

Gemini作成のプログラム

今回はプログラムのお勉強じゃなくて、アプリ作成なのでGeminiにお任せします。

Geminiへの指令

このアプリをローカルPC内で完結させるためのアプリ作成方法を教えてほしい

 

Geminiからの回答

ローカルPC内で完結させ、プライバシー(体重データ)を守りつつ動作させるには、**Python**と**Streamlit**というライブラリを組み合わせるのが最も簡単でスマートな方法です。

ブラウザをインターフェースとして使いつつ、処理はすべてあなたのPC内で行われます。

---

## 🛠️ 準備するもの(インストール)

まず、Pythonがインストールされている環境で、以下のコマンドをターミナル(コマンドプロンプト)で実行して、必要な道具を揃えます。

```bash
pip install streamlit easyocr opencv-python Pillow

```

* **Streamlit:** 簡単にWebアプリのような画面を作るため
* **EasyOCR:** 画像から数値を読み取るため(初回実行時に学習モデルを自動DLします)
* **OpenCV / Pillow:** 画像を処理するため

---

## 💻 アプリのソースコード (`app.py`)

以下のコードをコピーして、`app.py` という名前で保存してください。

```python
import streamlit as st
import easyocr
import numpy as np
from PIL import Image
import os

# OCRリーダーの初期化
@st.cache_resource
def load_reader():
    return easyocr.Reader(['en'])

reader = load_reader()

st.title("⚖️ 体重差分チェック・記録アプリ")
st.write("2枚の体重計画像をアップロードしてください。")

# 1. 画像アップロード
uploaded_files = st.file_uploader("画像を選択(2枚)", type=['png', 'jpg', 'jpeg'], accept_multiple_files=True)

if len(uploaded_files) == 2:
    weights = []
    cols = st.columns(2)

    for i, file in enumerate(uploaded_files):
        img = Image.open(file)
        cols[i].image(img, caption=f"画像 {i+1}", use_container_width=True)
        
        # OCR処理
        with st.spinner(f"画像 {i+1} を解析中..."):
            img_np = np.array(img)
            results = reader.readtext(img_np)
            
            # 数値抽出ロジック(簡易版)
            found_weight = None
            for res in results:
                text = res[1].replace('kg', '').strip()
                try:
                    val = float(text)
                    if 20 < val < 200: # 体重として妥当な範囲
                        found_weight = val
                        break
                except ValueError:
                    continue
            weights.append(found_weight)

    # 2. 計算と表示
    if None not in weights:
        w1, w2 = weights
        high = max(w1, w2)
        low = min(w1, w2)
        diff = round(high - low, 2)

        st.success("### 判定結果")
        st.write(f"① 多い方の体重: **{high} kg**")
        st.write(f"② 少ない方の体重: **{low} kg**")
        st.write(f"③ 減算結果(差分): **-{diff} kg**")

        # 3. テキスト出力
        result_text = f"① 多い方: {high}kg\n② 少ない方: {low}kg\n③ 差分: -{diff}kg\n"
        
        if st.button("結果をテキスト保存"):
            with open("weight_result.txt", "a", encoding="utf-8") as f:
                f.write(f"--- 測定記録 ---\n{result_text}\n")
            st.info("ローカルの 'weight_result.txt' に追記しました。")
    else:
        st.error("数値をうまく読み取れませんでした。明るい場所で撮った画像で試してください。")


```

---

## 🚀 アプリの起動方法

1. ターミナルを開き、`app.py` を保存したフォルダへ移動します。
2. 以下のコマンドを入力します。
```bash
streamlit run app.py

```


3. 自動的にブラウザが立ち上がり、アプリ画面が表示されます。

---

## 💡 ローカル完結させるためのポイント

* **インターネット不要:** `easyocr` は一度モデルをダウンロードすれば、以降はオフラインで動作します。データが外部サーバーに送られることはありません。
* **自動ソート:** どちらの画像を先に選んでも、プログラムが自動で `max()` と `min()` を判定して計算するようにしています。
* **テキスト保存:** `weight_result.txt` は、プログラムと同じフォルダに自動生成されます。

 

実行準備

必要ソフトを追加インストール

コマンドを実行してStreamlit、EasyOCR、OpenCV / Pillowをインストールする

>pip install streamlit easyocr opencv-python Pillow

※>はコマンド実行時には入力しません、区分用に表記してます

プログラム本体を準備

まずは先ほどのpg内にプログラム保存用のサブフォルダを作る。

そのサブフォルダ内に【weight_scale_soft_01.py】というテキストファイルを作成、中身は上記のコードをコピー&ペーストして保存する。

 

プログラムを実行

>streamlit run weight_scale_soft_01.py

※>はコマンド実行時には入力しません、区分用に表記してます

 
初回の動作結果はエラーしか表示せず

最初は追加ソフトをインストールしなかったのでこうなった💦

ブラウザは立ち上がったが真っ暗な画面でこんな表示

 

このときコマンドウインドウにはエラー表示が出てた。

初回起動だったのでE-mailが表示されているが未入力Enterで継続。

 

ブラウザは起動するが表示せず…💦

 

Geminiさん、HELP!

さっぱりわからないので、Geminiに助けを求める。

Geminiへの指令

app.pyを作成し、実行しましたがブラウザに表示されません。原因の予想をしてください

Geminiからの回答

`app.py`を実行してもブラウザが表示されない場合、いくつかの原因が考えられます。状況に合わせて以下の項目を順番にチェックしてみてください。

---

### 1. 起動コマンドの間違い

もっとも多い原因です。Pythonを動かす時のように `python app.py` で実行していませんか?

* **正解:** `streamlit run app.py`
* **理由:** Streamlitは独自のサーバーを起動する必要があるため、`python`コマンドでは画面(GUI)が立ち上がりません。

### 2. ブラウザが自動で開いていないだけ

ターミナル(黒い画面)に以下のようなメッセージが出ていませんか?

> Local URL: http://localhost:8501
> Network URL: http://192.168.(https://www.google.com/search?q=http://192.168.)x.x:8501

もしこれが出ていれば、アプリは起動しています。**`http://localhost:8501` をコピーして、ブラウザ(ChromeやEdge)のURLバーに直接貼り付けて**みてください。

### 3. ライブラリのインストール失敗

ターミナルに `ModuleNotFoundError: No module named 'streamlit'` のようなエラーが出て止まっていませんか?
その場合は、インストールが完了していません。もう一度以下を実行してください。

```bash
pip install streamlit easyocr opencv-python Pillow

```

### 4. 初回起動時の「Email」入力待ち

初めてStreamlitを動かす際、ターミナルで **"Email: "** と聞かれて止まることがあります。

* **対策:** 何も入力せずに **Enterキー** を押せば進みます。これに気づかず停止しているケースがよくあります。

### 5. ターミナルの「管理者権限」や「パス」の問題

Windowsの場合、PowerShellやコマンドプロンプトを「管理者として実行」していないと、ローカルサーバーの起動がブロックされることがあります。

---

### 🔍 確認作業のステップ

現在のターミナルの状態を見て、以下のどれに当てはまるか確認してください:

1. **「何も表示されず、すぐ入力待ちに戻る」** → コードに構文エラーがあるか、`streamlit run` で実行していない。
2. **「Error: ...」と赤い文字が出る** → 必要なライブラリが足りない。
3. **「You can now view your Streamlit app in your browser.」と出る** → 起動成功。ブラウザで手動でURLを開く。

**もしエラーメッセージが出ているなら、その最後の方の数行をこちらに貼り付けていただければ、より正確な原因を特定できます。**

次に、エラー内容を教えていただけますか?それとも、もう一度コマンドを試してみますか?

 

対策を実施状況を比較

1. 起動コマンドの間違い

 ー>これは大丈夫

 

2. ブラウザが自動で開いていないだけ

 ー>これも大丈夫、自動で開いている

 

3. ライブラリのインストール失敗

 ー>状況不明なので、コマンドを追加で実施する

>pip install streamlit easyocr opencv-python Pillow

 

 4. 初回起動時の「Email」入力待ち

 ー>これは大丈夫、入力済み

 

5. ターミナルの「管理者権限」や「パス」の問題

 ー>ちょっと状況不明、大丈夫と思いたい。

 

再度実行してみる

結果が変わらなかったので、再度GeminiにHELPを要求して言われたのがこれ

 

Geminiへの指令

streamlitを実行すると下記のエラーが表示されます

OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.

 

Geminiからの回答

Streamlitでこのエラーが出るのは、非常に「あるある」な現象です。

原因は、Streamlitがアプリを起動する際、**PyTorch** や **NumPy**、**Matplotlib** といったライブラリがそれぞれ個別に「OpenMP(並列処理ライブラリ)」を読み込もうとして、システム内で衝突が起きているためです。

解決策を、推奨される順に紹介します。

---

## 1. 最も手軽な解決策(環境変数の設定)

コードの**一番最初(他のライブラリを import する前)**に、重複を許容する設定を追記します。これが最も一般的で確実な回避策です。

```python
import os
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"

import streamlit as st
import pandas as pd
# その他の import...

```

---

## 2. ライブラリの整理(根本解決)

もし Anaconda や Miniconda を使用している場合、複数の場所から OpenMP が提供されていることが原因です。以下のコマンドをターミナル(プロンプト)で実行して、ライブラリを統一することで解決する場合があります。

```bash
# 重複している intel-openmp をクリーンアップする
conda install nomkl

```

または、`intel-openmp` を最新に更新します。

```bash
conda update intel-openmp

```

---

## なぜこのエラーが起きるのか?

通常、プログラムが計算を行うとき、一つの「司令塔(OpenMP)」が計算を割り振ります。しかし、Streamlit のような環境で複数の高度な計算ライブラリが動くと、**「俺が司令塔だ!」「いや、俺が司令塔だ!」**と二つの DLL ファイルが同時に立ち上がってしまい、システムが安全のためにプログラムを停止させてしまうのです。

---

### 注意点

`KMP_DUPLICATE_LIB_OK = TRUE` を使うとエラーは消えますが、ごく稀に計算結果が不安定になったり、パフォーマンスがわずかに低下したりすることがあります。研究用や個人開発であれば問題ありませんが、厳密な数値計算が必要な商用システムの場合は、上記「2」の方法で環境をクリーンに保つことをお勧めします。

**このエラーが出ているのは、どのライブラリ(PyTorch, TensorFlow, XGBoost など)を使用している時でしょうか?** それに合わせてより具体的な構成をアドバイスすることも可能です。

 

再度対策を実施

コマンドを入力してライブラリを整理した。

>conda install nomkl

>conda update intel-openmp

 

結果はなんとなく、画面が点滅して表示されているが内容は不明

 

再度GeminiにHELPを要求して言われたのがこれ

Geminiへの指令

ライブラリの整理して実行したところ、ブラウザの中が点滅している状況になっており、まだ異常が発生しています。

 

Geminiからの回答

ブラウザが点滅(リロードを繰り返しているような状態)しているのは、**Streamlitの実行プロセスがクラッシュと再起動をループしている**可能性が高いです。

`libiomp5md.dll` のエラーが完全に解消されていないか、あるいは「解決策1(環境変数)」の記述場所に問題があるために、Streamlitが「起動 → エラーで落ちる → 自動再起動 → エラー」という無限ループに陥っています。

以下の手順で、このループを断ち切りましょう。

---

## 1. `os.environ` の記述位置を「一番上」にする

Pythonは上から順に読み込まれます。もし `import torch` や `import numpy` の**後**に環境変数を書いていても、その前ですでにエラーが発生してしまいます。

**修正後のコード例:**

```python
import os
# 他の何を置いても、これが一番最初です!
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"

import streamlit as st
import numpy as np
import torch  # もし使っていれば
# ...残りのコード

```

---

## 2. ライブラリの「競合」を物理的に解消する

ライブラリを整理しても点滅が止まらない場合、Anacondaなどの環境内に「古いDLL」と「新しいDLL」が混在し、Pythonがパニックを起こしています。

ターミナル(コマンドプロンプトやAnaconda Prompt)で以下を試してください:

1. **問題のライブラリを一度消して入れ直す**(これが最も確実です)
```bash
pip uninstall mkl intel-openmp
pip install mkl intel-openmp

```


2. **`nomkl` を使ってOpenMPの依存を外す**(Conda環境の場合)
```bash
conda install nomkl numpy scipy scikit-learn numexpr

```

 

---

## 3. ブラウザのキャッシュとプロセスの停止

点滅が止まらないのは、ブラウザ側に古いセッションが残っているせいかもしれません。

* **Ctrl + C** をターミナルで数回押し、Streamlitの実行を完全に止めます。
* タスクマネージャーを開き、`python.exe` が残っていれば強制終了します。
* ブラウザのタブを一度閉じ、再度 `streamlit run your_app.py` を実行してください。

---

### まだ点滅が続く場合

点滅している最中の**ターミナル(黒い画面)**を見てみてください。そこに新しいエラーメッセージ(例: `Memory Error` や `AttributeError`)が出ていませんか?

もし別のエラーが出ている場合は、そのメッセージを教えていただければ、さらに絞り込んだ対策を提案できます。**現在、どのライブラリ(PyTorchやMatplotlibなど)をメインで使おうとしていますか?**

 

再度対策を実施

できる対策をする。

まず、命令文をアドバイス通りトップに移動する。

import os

 

続けて、ライブラリの除去+再インストール

>pip uninstall mkl intel-openmp
>pip install mkl intel-openmp

 

そして、OpenMPの依存を外す

>conda install nomkl numpy scipy scikit-learn numexpr

 

結果はなんとなく、画面が点滅して表示されているが内容は不明

 

まぁ、そのあと結局はライブラリが競合してることが分かりintel-openmpの削除コマンドを実行。

>pip uninstall -y intel-openmp mkl

 

ある程度うまくいく

そして、実行したら画像選択の画面が表示され、画像を選択した結果がこれ

 

まぁ、画像取り込みまでうまく異様になったので…今回はここまで。


【更新履歴】

 2026/3/2 新規作成