質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Streamlit

Streamlitは、Pythonでフロントエンドアプリケーションを構築できるフレームワーク。HTML/CSSの知識が不要で、描画ライブラリで作成したグラフを埋め込むことが可能です。機械学習のレポート作成やデータ分析にも応用できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1450閲覧

streamlitアプリのdrawable_canvasで描いた画像を同アプリで読み込む方法

kk22

総合スコア1

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Streamlit

Streamlitは、Pythonでフロントエンドアプリケーションを構築できるフレームワーク。HTML/CSSの知識が不要で、描画ライブラリで作成したグラフを埋め込むことが可能です。機械学習のレポート作成やデータ分析にも応用できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/11/10 14:32

前提

Streamlitで画像分類アプリを作っています。

学習済みモデルを適用することを念頭に、
drawable_canvasで描いた画像を読み込む機能を実装中、
以下のエラーメッセージが発生しております。

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

st.file_uploaderで画像ファイルを読み込ませるのと同様に、
drawable_canvasで描いた画像をアプリに読み込ませたい
のですが、
上手くできないという状況です。
もし打開策がありましたら、ご教示いただけますと幸いです。

実現したいこと

-描いた内容をアプリが読み込めるようにする(そして画像分類できるようにする)

発生している問題・エラーメッセージ

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() Traceback: File "/usr/local/lib/python3.7/dist-packages/streamlit/runtime/scriptrunner/script_runner.py", line 563, in _run_script exec(code, module.__dict__) File "/content/app.py", line 72, in <module> img_file = st.file_uploader(canvas_result.image_data) File "/usr/local/lib/python3.7/dist-packages/streamlit/runtime/metrics_util.py", line 311, in wrapped_func result = non_optional_func(*args, **kwargs) File "/usr/local/lib/python3.7/dist-packages/streamlit/elements/file_uploader.py", line 332, in file_uploader ctx=ctx, File "/usr/local/lib/python3.7/dist-packages/streamlit/elements/file_uploader.py", line 353, in _file_uploader maybe_raise_label_warnings(label, label_visibility) File "/usr/local/lib/python3.7/dist-packages/streamlit/type_util.py", line 676, in maybe_raise_label_warnings if not label:

該当のソースコード

Python

1import streamlit as st 2from PIL import Image 3from model import predict 4from streamlit_drawable_canvas import st_canvas 5 6# canvasのパラメータ設定(略) 7# canvasのコンポーネント作成(略) 8# canvasの描画内容を取り込み(問題発生個所![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-11-10/2028979f-9c5e-4462-9cc1-72307bebc7e0.jpeg)) 9if st.button('Go!'): 10 img_file = st.file_uploader(canvas_result.image_data) 11 12# 画像の判定・予測(一部抜粋) 13if img_file is not None: 14 with st.spinner("推定中..."): 15 img = Image.open(img_file) 16 st.image(img, caption="対象の画像", width=480) 17 st.write("") 18 results = predict(img)

試したこと

次のように、img_fileに描画結果を直接代入しても、うまくいかなかったです。

Python

1 # img_file = st.file_uploader(canvas_result.image_data)の代わりに下記を試行 2 img_file = canvas_result.image_data

エラー内容
AttributeError: 'numpy.ndarray' object has no attribute 'read'

イメージ説明

補足情報(FW/ツールのバージョンなど)

python: 3.7
streamlit: 1.14.0
streamlit-drawable-canvas: 0.9.2
Google Colaboratory使用

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bsdfan

2022/11/11 15:48

どう修正したらよいかまではわからないので、エラーの原因だけ。 「該当のソースコード」では、streamlit.file_uploader を使う必要性がよくわからないのと、file_uploader を使うにしても、引数がおかしいです。file_uploaderの第1引数はラベル(文字列)なのに、ndarray が渡されたことでエラーになっています。 「試したこと」では、img_file に canvas_result.image_data をセットいるので、そのあと Image.open(img_file) をするのがおかしいです。こちらも Image.open() に渡すのはファイル名やファイルオブジェクトです。ndarray からなら Image.fromarray() とかを使うんだと思います。 まずは、ドキュメント等で、関数やメソッドに渡すべき引数や、返ってくる値をちゃんと確認することをお勧めします。
guest

回答1

0

自己解決

質問へのコメントにてbsdfan様より頂いた指摘を受け、調べたところ、自己解決しました。
Pythonの画像処理ライブラリ「Pillown」のImageモジュールを適切に使用するのが鍵のようです。
【公式ドキュメント】https://pillow.readthedocs.io/en/stable/reference/Image.html

Python

1#モジュール等のインポート 2import streamlit as st 3from PIL import Image 4from model import predict 5from streamlit_drawable_canvas import st_canvas 6 7# canvasのパラメータ設定(略) 8# canvasのコンポーネント作成(略) 9# canvasで描いた結果の画像を、numpyが提供する多次元配列ndarrayとして、image_fileへ格納する 10if st.button('Go!'): 11 img_file = canvas_result.image_data 12 13#ndarrayの変数image_fileを、Image.fromarray()を介して分析モデルへ渡す(抜粋) 14if img_file is not None: 15 with st.spinner("推定中..."): 16 img = Image.fromarray(img_file)

ここで、Image.fromarray()は、第一引数のオブジェクト(ndarrayのimage_file)を変換し、
画像データをメモリ上に配置します。
結果として、streamlit.file_uploaderで任意の画像ファイルをアップロードしたときと同様に、
image_fileに対して学習済みモデルを適用できるようになりました。

末尾になりますが、コメントいただいたbsdfan様、誠にありがとうございました。

投稿2022/11/14 16:33

kk22

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問