実現したいこと
スマホやパソコンのカメラ機能を使って顔を検知して表情の分類をリアルタイムで処理するサイトを作りたい
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

回答2件
あなたの回答
tips
プレビュー