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

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

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

Q&A

解決済

2回答

1444閲覧

ImportError: cannot import name 'soft_unicode' from 'markupsafe' の解決策

jaogjig

総合スコア21

0グッド

0クリップ

投稿2023/02/21 12:51

編集2023/02/27 00:51

実現したいこと

スマホやパソコンのカメラ機能を使って顔を検知して表情の分類をリアルタイムで処理するサイトを作りたい
flaskのアプリケーションをhttp://localhost:5000/ にアクセスして実行させたい

さらに試したこと
仮想環境を管理するツールを2つ試してみました。
まずcondaはまた別のエラー(zsh: illegal hardware instruction flask run)が出てしまいました。
そこで試したことは
パソコンの再起動
flaskのバージョンアップ
をやりました。
またターミナルを新たに機動すると自動的にcondaで作った仮想環境に入ってしまうこともありました。
違うフォルダーで下のようなコードで試しにflaskを動かしてみたら動きました。

from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello, World!'

つまり、コードで使っているライブラリーが原因だと思われます。
今使っているライブラリーは
import Flask, render_template
cv2
numpy
pandas
keras
だけでなく
FER2013モデルのTensorFlowもインストールはしています。
同じ問題が次であったとき問題の対処ができないかもしれませんが、今度は違うモデルでもう一度コードを書き直した方が賢明かもしれません。
エラーを正面から解決しない方法でもいいのでしょうか

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

from markupsafe import soft_unicode
ImportError: cannot import name 'soft_unicode' from 'markupsafe' (/Library/Frameworks/Python.framework/Versions/3.9/lib/python
ImportError: cannot import name 'soft_unicode' from 'markupsafe' が出てしまいました。
そこで調べた結果MarkupSafeのバージョンを落すことで解決すると書いてあったので実践してみたところ同じエラーが出てしまいます。
解決策をご教授お願いします。

参考記事
https://keep-loving-python.hatenablog.com/entry/2022/08/29/121515
[後から調べた結果]
pip install Flask==2.2.3 Jinja2==3.1.2 MarkupSafe==2.0.1 Werkzeug==2.0.1
この4つが2つづつ衝突していることが原因だとわかりました。
それを修正するためにバージョンを指定してインストールすることにしました。
しかし
Flaskの方を修正するとMarkupSafe==2.0.1、Werkzeug==2.0.1が衝突が起きて
Werkzeugを修正するとFlaskの方が衝突が起きてしまいます。
また、pipのバージョンも何回か変えましたがダメでした。

前提

VScodeを使っています。
VScodeを一回アンインストールしてもう一度仮想環境を作ってみてもダメでした。
仮想環境は使っています。(j)という名前にしています。
flaskのバージョンも一緒に落としてみてもダメでした。
Pythonの最新のバージョンで3.11でやっていましたが、それだとtensorflowが使えないらしく、今は3.9のバージョンでやっています。
(pytzをインストールしましたが、エラーが解決しなかったので3.9を再インストールして設定しなおしました。)
環境変数:
export PATH="/usr/local/bin:$PATH"
export PATH="/Library/Frameworks/Python.framework/Versions/3.9/bin:$PATH"
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
export CXX=/usr/bin/clang++
export PATH="/usr/local/opt/python@3.9/bin:$PATH"

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

from markupsafe import soft_unicode
ImportError: cannot import name 'soft_unicode' from 'markupsafe' (/Library/Frameworks/Python.framework/Versions/3.9/lib/python
ImportError: cannot import name 'soft_unicode' from 'markupsafe' が出てしまいました。
そこで調べた結果MarkupSafeのバージョンを落すことで解決すると書いてあったので実践してみたところ同じエラーが出てしまいます。
解決策をご教授お願いします。

ソースコード

python

1from flask import Flask, render_template 2import cv2 3import numpy as np 4import pandas as pd 5from keras.models import Sequential 6from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D 7from keras.models import load_model 8from keras.utils import np_utils 9app = Flask(__name__) 10 11@app.route('/') 12def index(): 13 return render_template('index.html') 14 15 16# データの読み込み 17data = pd.read_csv('fer2013.csv') 18 19# データの前処理 20X_train, train_y, X_test, test_y = [], [], [], [] 21for index, row in data.iterrows(): 22 val = row['pixels'].split(" ") 23 try: 24 if 'Training' in row['Usage']: 25 X_train.append(np.array(val, 'float32')) 26 train_y.append(row['emotion']) 27 elif 'PublicTest' in row['Usage']: 28 X_test.append(np.array(val, 'float32')) 29 test_y.append(row['emotion']) 30 except: 31 print(f"error occurred at index :{index} and row:{row}") 32 33# データの正規化 34X_train = np.array(X_train) / 255 35X_test = np.array(X_test) / 255 36 37# ラベルをone-hot形式に変換 38train_y = np_utils.to_categorical(train_y, 7) 39test_y = np_utils.to_categorical(test_y, 7) 40 41# モデルの作成 42model = Sequential() 43model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(48,48,1))) 44model.add(Conv2D(64, kernel_size=(3, 3), activation='relu')) 45model.add(MaxPooling2D(pool_size=(2, 2))) 46model.add(Dropout(0.25)) 47model.add(Flatten()) 48model.add(Dense(128, activation='relu')) 49model.add(Dropout(0.5)) 50model.add(Dense(7, activation='softmax')) 51model.compile(loss='categorical_crossentropy',optimizer='Adam',metrics=['accuracy']) 52 53# モデルのトレーニング 54model.fit(X_train.reshape(-1, 48, 48, 1), train_y,validation_data=(X_test.reshape(-1,48,48,1), test_y),epochs=15,batch_size=64,shuffle=True) 55 56# カメラからの映像を取得 57cap = cv2.VideoCapture(0) 58 59# 予測結果を表示する関数 60def draw_label(image, point, label, font=cv2.FONT_HERSHEY_SIMPLEX, font_scale=1, thickness=2): 61 size = cv2.getTextSize(label, font, font_scale, thickness)[0] 62 x, y = point 63 cv2.rectangle(image, (x, y - size[1]), (x + size[0], y), (0,0,255), cv2.FILLED) 64 cv2.putText(image, label, point, font, font_scale, (255, 255, 255), thickness) 65 66# 表情のラベルを定義 67emotion_dict = {0: "Angry", 1: "Disgusted", 2: "Fearful", 3: "Happy", 4: "Neutral", 5: "Sad",6: "Surprised"} 68#モデルを読み込み 69model = load_model('model.h5') 70 71while True: 72 ret, frame = cap.read() 73 if not ret: 74 print("Can't receive frame (stream end?). Exiting ...") 75 break 76 77 # グレースケールに変換 78 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 79 80 # 顔の検出 81 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') 82 faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30), flags=cv2.CASCADE_SCALE_IMAGE) 83 84 for (x, y, w, h) in faces: 85 # 顔の部分を切り出し、リサイズして正規化 86 roi_gray = gray[y:y+h, x:x+w] 87 roi_gray = cv2.resize(roi_gray, (48, 48), interpolation=cv2.INTER_AREA) 88 img_pixels = np.array(roi_gray, 'float32') / 255 89 img_pixels = np.expand_dims(img_pixels, axis=0) 90 img_pixels = np.expand_dims(img_pixels, axis=3) 91 92 # 顔の表情を予測 93 predictions = model.predict(img_pixels) 94 max_index = np.argmax(predictions[0]) 95 96 # 予測結果を表示 97 label = emotion_dict[max_index] 98 draw_label(frame, (x, y), label) 99 100 # 結果を画面に表示 101 cv2.imshow('Video', cv2.resize(frame,(800,600),interpolation = cv2.INTER_CUBIC)) 102 103 # 'q'キーを押して終了 104 if cv2.waitKey(1) & 0xFF == ord('q'): 105 break 106 107# 後処理 108cap.release() 109cv2.destroyAllWindows() 110 111if __name__ == '__main__': 112 app.run() 113

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

パソコン:Mac M1
Mac OS 13.1
エディター:VScode
click 7.1.2
Flask 2.0.1
importlib-metadata 6.0.0
itsdangerous 2.1.2
Jinja2 3.1.2
keras 2.11.0
MarkupSafe 2.1.2
numpy 1.24.2
opencv-python 4.7.0.68
pandas 1.5.3
pip 23.0.1
python-dateutil 2.8.2
pytz 2022.7.1
setuptools 58.1.0
six 1.16.0
Werkzeug 2.2.3
zipp 3.14.0

ファイルの依存関係表示コマンド:pipdeptree
Flask==2.2.3

  • click [required: >=8.0, installed: 8.1.3]
  • importlib-metadata [required: >=3.6.0, installed: 6.0.0]
    • zipp [required: >=0.5, installed: 3.14.0]
  • itsdangerous [required: >=2.0, installed: 2.1.2]
  • Jinja2 [required: >=3.0, installed: 3.0.2]
    • MarkupSafe [required: >=2.0, installed: 2.0.1]
  • Werkzeug [required: >=2.2.2, installed: 2.2.2]
    • MarkupSafe [required: >=2.1.1, installed: 2.0.1]

keras==2.11.0
opencv-python==4.7.0.68

  • numpy [required: >=1.17.3, installed: 1.24.2]
  • numpy [required: >=1.17.0, installed: 1.24.2]
  • numpy [required: >=1.19.3, installed: 1.24.2]

pandas==1.5.3

  • numpy [required: >=1.20.3, installed: 1.24.2]
  • python-dateutil [required: >=2.8.1, installed: 2.8.2]
    • six [required: >=1.5, installed: 1.16.0]
  • pytz [required: >=2020.1, installed: 2022.7.1]

pip==23.0.1
pipdeptree==2.5.0
setuptools==58.1.0

pip install Flask==2.2.3 Jinja2==3.1.2 MarkupSafe==2.0.1 Werkzeug==2.0.1

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

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

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

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

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

jbpb0

2023/02/21 22:04

> ImportError: cannot import name 'soft_unicode' from 'markupsafe' https://keep-loving-python.hatenablog.com/entry/2022/08/29/121515 に書かれてることと同じことですが、「soft_unicode」はmarkupsafe 2.0.1 https://github.com/pallets/markupsafe/blob/2.0.1/src/markupsafe/__init__.py にはありますが、2.1.0 https://github.com/pallets/markupsafe/blob/2.1.0/src/markupsafe/__init__.py にはありませんので、2.0.1以前のを入れる必要があります
jbpb0

2023/02/21 22:06

> pip install Flask==2.2.3 Jinja2==3.1.2 MarkupSafe==2.0.1 Werkzeug==2.0.1 この4つが2つづつ衝突している 質問の「ファイルの依存関係表示コマンド」のところを見ると、 Flask==2.2.3 ↓ Werkzeug [required: >=2.2.2 ↓ MarkupSafe [required: >=2.1.1 となってるので、「flask 2.2.3」を使うと「markupsafe 2.0.1」を使えないようですが、flaskが2.2.3じゃないといけない理由が有るのでしょうか? 特に理由が無いなら、「markupsafe 2.0.1」との組み合わせで使えるwerkzeugのバージョンを調べて、そのバージョンのwerkzeugとの組み合わせで使えるflaskのバージョンを調べて、それらを入れたらいいと思います (別の矛盾が起きるかもしれませんが)
guest

回答2

0

自己解決

違うフォルダーで下のようなコードで試しにflaskを動かしてみたら動きました。

from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello, World!'

つまり、コードで使っているライブラリーが原因だと思われます。
今使っているライブラリーは
import Flask, render_template
cv2
numpy
pandas
keras
だけでなく
FER2013モデルのTensorFlowもインストールはしています。
同じ問題が次であったとき問題の対処ができないかもしれませんが、今度は違うモデルでもう一度コードを書き直した方が賢明かもしれません。
python自体のバージョンを2.7に下げた方がいいかもしれない

投稿2023/02/23 12:41

編集2023/02/26 15:51
jaogjig

総合スコア21

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

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

0

以下によると、
Changes

Remove soft_unicode, which was previously deprecated. Use soft_str instead. #261

とあるので、soft_strに変えてみてはいかがでしょうか。

soft_strのドキュメントは、以下のようです。
soft_str

投稿2023/02/22 01:42

FiroProchainezo

総合スコア2385

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.53%

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

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

質問する

関連した質問