どうしてもわかりません。
ご教授願いします。
##models.py
from django.db import models import numpy as np import tensorflow as tf from tensorflow import keras from tensorflow.keras.models import load_model from PIL import Image import io, base64 graph = tf.get_default_graph() class Photo(models.Model): image = models.ImageField(upload_to='Photos') IMAGE_SIZE = 224 # 画像サイズ MODEL_FILE_PATH = './carbike/ml.models/vgg16_transfer.h5' # モデルファイル classes = ["car", "motorbike"] num_classes = len(classes) # 引数から画像ファイルを参照して読み込む def predict(self): model = None global graph with graph.as_default(): model = load_model(self.MODEL_FILE_PATH) img_data = self.image.read() img_bin = io.BytesIO(img_data) image = Image.open(img_bin) image = image.convert("RGB") image = image.resize((self.IMAGE_SIZE, self.IMAGE_SIZE)) data = np.asarray(image) / 255.0 X = [] X.append(data) X = np.array(X) def image_src(self): with self.image.open() as img: base64_img = base64.b64decode(img.read()).decoad() return 'data' + img.file.content_type + ';base64,' + base64_img # Create your mod
##views.py
from django.shortcuts import render, redirect from django.http import HttpResponse from django.template import loader from .forms import PhotoForm from .models import Photo def index(request): template = loader.get_template('carbike/index.html') context = {'form': PhotoForm()} return HttpResponse(template.render(context, request)) def predict(request): if not request.method == 'POST': return redirect('carbike:index') form = PhotoForm(request.POST, request.FILES) if not form.is_valid(): raise ValueError('Formが不正です') photo = Photo(image=form.cleaned_data['image']) predicted, percentage = photo.predict() template = loader.get_template('carbike/result.html') context = { 'photo_name': photo.image.name, 'photo_data': photo.image_src(), 'predicted': predicted, 'percentage': percentage, } return HttpResponse(template.render(context, request))
##predict.py
import numpy as np from tensorflow import keras from tensorflow.keras import Sequential, Model, load_model from PIL import Image import sys # パラメーターの初期化 classes = ["car", "motorbike"] num_classes = len(classes) image_size = 224 # 引数から画像ファイルを参照して読み込む image = Image.open(sys.argv[1]) image = image.convert("RGB") image = image.resize((image_size, image_size)) data = np.asarray(image) / 255.0 X = [] X.append(data) X = np.array(X) # モデルのロード model = load_model('./vgg16_transfer.h5') result = model.predict([X])[0] predicted = result.argmax() percentage = int(result[predicted] * 100) print(self.classes[predicted], percentage)
テキストで提示しましょう
申し訳ありません。
コードを追加しました。
ご教授お願いします。
エラー画面の情報は読んでいますか?
`./carbike/ml_models/vgg16_transfer.h5`というファイルがないと書かれています。
ファイルが配置できているか確認するか、
もしくは`models.py`の
```
MODEL_FILE_PATH = './carbike/ml_models/vgg16_transfer.h5'
```
あたりの指定方法を見直す・デバッグすると何かわかるかもしれません。
昨日に引き続き返信ありがとうございます。
エラー文はしっかり目を通しています。
エラー検索、ファイル確認しましたが、どうにもいかなかったのでこちらで質問させていただきました。
質問にファイル配置を書くか、それがわかるスクリーンショットを載せるかしましょう。(それを載せなかったら"何も調べてないのでは?"と思われてもしかたないでしょう)
一応、どう実行しているかも書いていいと思います。十中八九 python manage.py runserver だと思いますが。
models.pyの
MODEL_FILE_PATH =...
の下に
import os
print(os.path.abspath(MODEL_FILE_PATH))
を追加したら、pythonが読もうとしてるファイルパス(ファイル名を含む)が表示されるので、それがファイルが本当に置いてあるパスやファイル名と合ってるか、確認してみてください
【追記】 追加する行のインデントは、MODEL_FILE_PATH =... の行に合わせてください
質問してるエラーとは関係無いかもしれませんが、コードのあちこちに
model = laoad_model('./vgg16_transfer.h5')
と書いてありますけど、「vgg16_transfer.h5」が本当に置いてある場所は、どこなんでしょうね
'./carbike/ml_models/vgg16_transfer.h5' か?
'./vgg16_transfer.h5' か?
どちらでもないのか?
あと、「laoad_model」は「load_model」に直してくださいね
ただし、その行が本当に必要なら、ですが
quickquipさん
ご指摘ありがとうございます。詳しく説明するべきでした。以後気をつけます。
ターミナルにて、python manage.py runserver で実行です。
jbpb0さん
返信ありがとうございます。
スクショを追加しました。ご覧になっていただけますか?
同じエラーが生じます。
ファイルの問題だと思うのですが原因が解明できません。
import os
print(os.path.abspath(MODEL_FILE_PATH)) を追加し、「load_model」に変更しました。
「vgg16_transfer.h5」が置いてある箇所は'./carbike/ml_models/vgg16_transfer.h5'になります。
> print(os.path.abspath(MODEL_FILE_PATH))
を追加したらエラーが無くなるわけではありません
これを実行したら、
> './carbike/ml_models/vgg16_transfer.h5'
から、Pythonがファイルを読もうとしているパス(絶対パス)が表示されます
それと、ファイルが本当にある場所が合ってるか、確認してください
スクショを追加するなら、下記の二つを追加してください
・「print(os.path.abspath(MODEL_FILE_PATH))」を実行した結果が表示されてるスクショ
Pythonコードではなく、実行結果
・「vgg16_transfer.h5」が本当に置いてある場所が分かるスクショ
Pythonの開発環境ではなく、OSの機能でファイルが置いてあるフォルダを開いた状態
Windowsならエクスプローラー
Macならファインダー
そのフォルダの絶対パスが表示されるように設定する
返信ありがとうございます。
スクショ通りエラーが生じました。
ファイルが見つからない と指示されます。
Unable to open file (unable to open file: name = './carbike/ml_models/vgg16_transfer.h5', errno = 2, error message = 'No such file or directory', flags = 0, o_flags = 0)
ですが、ファイルは /carbike/ml_models/vgg16_transfer.h5 の順番で作りました、、。
承知しました。
スクショします!
print(os.path.abspath(MODEL_FILE_PATH))」を実行した結果が表示されてるスクショ
↑
上記のスクショは現在追加している、OSError at /carbike/predict/ のスクショで問題ありませんでしょうか?
> OSError at /carbike/predict/ のスクショで問題ありませんでしょうか?
それでは分かりません
> ターミナルにて、python manage.py runserver で実行です。
のターミナルに、print(... の結果が表示されてると思うのですが、ありませんか?
「/carbike/ml_models/vgg16_transfer.h5」より左に何か付いてるのが
返信ありがとうございます。
勉強不足で申し訳ございません。
スクショ追加しました。print... はないような気がします、。
一応、それっぽい箇所に赤いペンをつけました。
追加してくれたファインダーのスクショ見たら、「ml_models」じゃなくて「ml.models」になってるけど??
上の赤ペンは合ってます
下の赤ペンは、それの下です(上の赤ペンと同じことが書いてある)
赤ペンの表示と、ファインダーに表示されてるパスを比べたら、下記以外は合ってるようです
> 「ml_models」じゃなくて「ml.models」になってる
大変申し訳ございません。
赤ペンの修正点までありがとうございます!
コードが ml_models になっていまして、
ファイルが ml.models になっていました。
この場合コードを ml.models に変更するほうが良いのでしょうか?
ファイル名に「.」が複数入ってると、たしかPythonはややこしいことになったような気がするけど、たぶんディレクトリ名に「.」が入るのは大丈夫だったような気がするので、どちらでも大丈夫だと思うけど、あんまり自信ない
あと、質問のコードが直ってないので、再度書きます
手元のコードが全部修正済みなら、スルーしてください
models.pyのclass Photo()のdef predict()で、モデルを2回読み込んでる
model = load_model(self.MODEL_FILE_PATH)
model = laoad_model('./vgg16_transfer.h5')
二つ目要る?
二つ目「laoad_」→「load_」
二つ目のパス?? (今直してるパスと違う)
predict.py
model = laoad_model('./vgg16_transfer.h5')
「laoad_」→「load_」
パス?? (今直してるパスと違う)
とんでもないです!
お忙しい中、すぐにご返信していただきまして、ありがとうございます!
ml.modelsに変更後、python manage.py runserverを実行しましたが、エラーが生じました。
もし、ご都合がよろしければ、エラー解読に付き合っていただきたいです。
model = None
モデルの初期化
global graph
モデルを何回も使えるようにglobal graph のグラフと定義しといて、毎回データを投入して推定ができるようにする。
model = load_model(self.MODEL_FILE_PATH)の
load_modelを使って 「MODEL_FILE_PATH = './carbike/ml.models/vgg16_transfer.h5' 」
モデルファイルパスで設定したパスからモデルを読み込んでモデルの変数に格納する。
みたいな流れです。
訂正点ありがとうございます!
訂正致しました!
> model = load_model(self.MODEL_FILE_PATH)の
load_modelを使って 「MODEL_FILE_PATH = './carbike/ml.models/vgg16_transfer.h5' 」
モデルファイルパスで設定したパスからモデルを読み込んでモデルの変数に格納する。
みたいな流れです。
その行の10行くらい下の
# モデルのロード
model = laoad_model('./vgg16_transfer.h5')
で、もう一回load_model()してるのは、なぜでしょうか?
せっかくload_model(self.MODEL_FILE_PATH)したのに、それが消えてしまうのではありませんか?
質問のコードを直してないだけで、お手元のコードはそこは既に削除してあるのでしょうか?
> 「MODEL_FILE_PATH = './carbike/ml.models/vgg16_transfer.h5' 」
モデルファイルパスで設定したパス
load_model()で指定するのは、最後はディレクトリ名じゃなくてファイル名ですから、vgg16_transfer.h5 はファイル名じゃないといけないけど、スクショ見たらディレクトリ名(フォルダ名)になってますね
それだと、load_model()で読めません
(technocoreさんの回答と同じ内容)
手元のコードは削除済です。ご指摘ありがとうございます!
追加のスクショで、「vgg16_transfer.h5」がファイルのはずがディレクトリになってることは直ってます
その状態で実行しても、元々のこの質問のエラー
`./carbike/ml_models/vgg16_transfer.h5`が無い
は、まだ出るのですか?
python manage.py runserver の実行後、エラー内容変わりました。
`./carbike/ml_models/vgg16_transfer.h5`が無い。ではなく、
Unable to open file (file signature not found) とエラーが表示されます。
元々のこの質問のエラー
`./carbike/ml_models/vgg16_transfer.h5`が無い
が解決したのなら、新たなエラーは別の質問にしてください
その際は、質問のコードは最新のものを書いてください
手元のコードは修正したのに質問のコードはそのままだと、他人には状況が把握できません
あと、predict.pyの
laoad_model('./vgg16_transfer.h5')
は、そのままでいいのですか?
手元のコードは直してるのなら、新たにする別質問では、そこも直してください