<HttpResponse status_code=200, "image/png"> 不可 JSON 序列化
<HttpResponse status_code=200, "image/png"> is not JSON serializable
我已经构建了一个 CNN 模型并且能够很好地 class 验证。但是我想尝试使用 Django 在 url 中传递图像时 class 化图像的 class。这是我尝试过的几件事。我的 apps.py
中的预测函数
def prediction(image_loc):
image_path = 'D:/'
image = cv2.imread(os.path.join(image_path,image_loc))
print("image in matrix is ", image)
output = image.copy()
# Pre-Process the image for classification
image = cv2.resize(image, (96, 96))
image = image.astype("float") / 255.0
image = img_to_array(image)
image = np.expand_dims(image, axis=0)
# Load the trained convolutional neural network and the label binarizer
print("[INFO] Loading Model...")
model_RP = load_model(os.path.join(os.getcwd(), "model\cnn_model_RP.hdf5"))
lb_path = os.path.join(os.getcwd(),"model\labelbin_RP")
lb_RP = pickle.loads(open(lb_path, "rb").read())
print("[INFO] Model Loading Complete.")
# Classify the input image
print("[INFO] classifying image...")
proba = model_RP.predict(image)[0]
idx = np.argmax(proba)
label = lb_RP.classes_[idx]
#we will mark our prediction as "correct" of the input image filename contains the predicted label text
#(obviously this makes the assumption that you have named your testing image files this way)
filename = image_loc[image_loc.rfind(os.path.sep) + 1:]
correct = "correct" if filename.rfind(label) != -1 else "incorrect"
# Build the label and draw the label on the image
label = "{}: {:.2f}% ({})".format(label, proba[idx] * 100, correct)
output = imutils.resize(output, width=400)
cv2.putText(output, label, (10, 25), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 0, 0), 2)
# show the output image
print("[INFO] {}".format(label))
#plt.imshow(output)
#plt.show()
#return(plt.show())
return(label) #- WORKING
#return HttpResponse(output, content_type = 'image/png')
#resp = HttpResponse("", content_type = 'image/png')
#resp.write('output')
#return resp
- 如果我 return 只是它起作用的标签,下面是我的 apps.py
的代码片段
label = "{}: {:.2f}% ({})".format(label, proba[idx] * 100, correct)
return (label)
2.a 问题来了。我正在尝试 return 图像以及上面的标签。我没有成功。
label = "{}: {:.2f}% ({})".format(label, proba[idx] * 100, correct)
output = imutils.resize(output, width=400)
cv2.putText(output, label, (10, 25), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 0, 0), 2)
return HttpResponse(output, content_type = 'image/png')
2.b 这是 return 图片的第二种方法,不幸的是失败了。
label = "{}: {:.2f}% ({})".format(label, proba[idx] * 100, correct)
output = imutils.resize(output, width=400)
cv2.putText(output, label, (10, 25), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 0, 0), 2)
resp = HttpResponse("", content_type = 'image/png')
resp.write('output')
return resp
- 这是我的 views.py
@api_view(['GET']) # Decorator
def call_model(request):
#if request.method == 'GET':
# sentence is the query we want to get the prediction for
params = request.GET.get('image_loc')
# predict method used to get the prediction
resp = prediction(image_loc = params)
# returning JSON response
return Response(resp)
错误堆栈跟踪,当我在浏览器上 运行 以下内容时。
http://127.0.0.1:8000/model/img?format=json&image_loc=bulbasaur_plush.png
TypeError at /model/img
<HttpResponse status_code=200, "image/png"> is not JSON serializable
Request Method: GET
Request URL: http://127.0.0.1:8000/model/img?format=json&image_loc=bulbasaur_plush.png
Django Version: 2.2.12
Exception Type: TypeError
Exception Value:
<HttpResponse status_code=200, "image/png"> is not JSON serializable
Exception Location: C:\Anaconda3\envs\tf35\lib\json\encoder.py in default, line 179
Python Executable: C:\Anaconda3\envs\tf35\python.exe
Python Version: 3.5.5
Python Path:
['D:\Discern\Term 3\deploy',
'C:\Anaconda3\envs\tf35\python35.zip',
'C:\Anaconda3\envs\tf35\DLLs',
'C:\Anaconda3\envs\tf35\lib',
'C:\Anaconda3\envs\tf35',
'C:\Users\prade\AppData\Roaming\Python\Python35\site-packages',
'C:\Anaconda3\envs\tf35\lib\site-packages',
'C:\Anaconda3\envs\tf35\lib\site-packages\win32',
'C:\Anaconda3\envs\tf35\lib\site-packages\win32\lib',
'C:\Anaconda3\envs\tf35\lib\site-packages\Pythonwin']
Server time: Fri, 29 May 2020 04:35:18 +0000
试图查看类似的帖子,但它们与文本相关,因此无法解决我的问题。
有人可以帮忙吗
看起来 resp
是一个 HttpResponse
对象(不能说更多,你没有给出 prediction
的代码)。
你必须在 Response()
构造函数中使某些东西 JSON 可序列化(通常是字典或列表,只有字符串/整数/布尔值)。
(顺便说一句,Django Rest Framework 的 @api_view
装饰器已经过时,@action
最好使用最新版本)
我已经构建了一个 CNN 模型并且能够很好地 class 验证。但是我想尝试使用 Django 在 url 中传递图像时 class 化图像的 class。这是我尝试过的几件事。我的 apps.py
中的预测函数def prediction(image_loc):
image_path = 'D:/'
image = cv2.imread(os.path.join(image_path,image_loc))
print("image in matrix is ", image)
output = image.copy()
# Pre-Process the image for classification
image = cv2.resize(image, (96, 96))
image = image.astype("float") / 255.0
image = img_to_array(image)
image = np.expand_dims(image, axis=0)
# Load the trained convolutional neural network and the label binarizer
print("[INFO] Loading Model...")
model_RP = load_model(os.path.join(os.getcwd(), "model\cnn_model_RP.hdf5"))
lb_path = os.path.join(os.getcwd(),"model\labelbin_RP")
lb_RP = pickle.loads(open(lb_path, "rb").read())
print("[INFO] Model Loading Complete.")
# Classify the input image
print("[INFO] classifying image...")
proba = model_RP.predict(image)[0]
idx = np.argmax(proba)
label = lb_RP.classes_[idx]
#we will mark our prediction as "correct" of the input image filename contains the predicted label text
#(obviously this makes the assumption that you have named your testing image files this way)
filename = image_loc[image_loc.rfind(os.path.sep) + 1:]
correct = "correct" if filename.rfind(label) != -1 else "incorrect"
# Build the label and draw the label on the image
label = "{}: {:.2f}% ({})".format(label, proba[idx] * 100, correct)
output = imutils.resize(output, width=400)
cv2.putText(output, label, (10, 25), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 0, 0), 2)
# show the output image
print("[INFO] {}".format(label))
#plt.imshow(output)
#plt.show()
#return(plt.show())
return(label) #- WORKING
#return HttpResponse(output, content_type = 'image/png')
#resp = HttpResponse("", content_type = 'image/png')
#resp.write('output')
#return resp
- 如果我 return 只是它起作用的标签,下面是我的 apps.py 的代码片段
label = "{}: {:.2f}% ({})".format(label, proba[idx] * 100, correct)
return (label)
2.a 问题来了。我正在尝试 return 图像以及上面的标签。我没有成功。
label = "{}: {:.2f}% ({})".format(label, proba[idx] * 100, correct)
output = imutils.resize(output, width=400)
cv2.putText(output, label, (10, 25), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 0, 0), 2)
return HttpResponse(output, content_type = 'image/png')
2.b 这是 return 图片的第二种方法,不幸的是失败了。
label = "{}: {:.2f}% ({})".format(label, proba[idx] * 100, correct)
output = imutils.resize(output, width=400)
cv2.putText(output, label, (10, 25), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 0, 0), 2)
resp = HttpResponse("", content_type = 'image/png')
resp.write('output')
return resp
- 这是我的 views.py
@api_view(['GET']) # Decorator
def call_model(request):
#if request.method == 'GET':
# sentence is the query we want to get the prediction for
params = request.GET.get('image_loc')
# predict method used to get the prediction
resp = prediction(image_loc = params)
# returning JSON response
return Response(resp)
错误堆栈跟踪,当我在浏览器上 运行 以下内容时。
http://127.0.0.1:8000/model/img?format=json&image_loc=bulbasaur_plush.png
TypeError at /model/img
<HttpResponse status_code=200, "image/png"> is not JSON serializable
Request Method: GET
Request URL: http://127.0.0.1:8000/model/img?format=json&image_loc=bulbasaur_plush.png
Django Version: 2.2.12
Exception Type: TypeError
Exception Value:
<HttpResponse status_code=200, "image/png"> is not JSON serializable
Exception Location: C:\Anaconda3\envs\tf35\lib\json\encoder.py in default, line 179
Python Executable: C:\Anaconda3\envs\tf35\python.exe
Python Version: 3.5.5
Python Path:
['D:\Discern\Term 3\deploy',
'C:\Anaconda3\envs\tf35\python35.zip',
'C:\Anaconda3\envs\tf35\DLLs',
'C:\Anaconda3\envs\tf35\lib',
'C:\Anaconda3\envs\tf35',
'C:\Users\prade\AppData\Roaming\Python\Python35\site-packages',
'C:\Anaconda3\envs\tf35\lib\site-packages',
'C:\Anaconda3\envs\tf35\lib\site-packages\win32',
'C:\Anaconda3\envs\tf35\lib\site-packages\win32\lib',
'C:\Anaconda3\envs\tf35\lib\site-packages\Pythonwin']
Server time: Fri, 29 May 2020 04:35:18 +0000
试图查看类似的帖子,但它们与文本相关,因此无法解决我的问题。
有人可以帮忙吗
看起来 resp
是一个 HttpResponse
对象(不能说更多,你没有给出 prediction
的代码)。
你必须在 Response()
构造函数中使某些东西 JSON 可序列化(通常是字典或列表,只有字符串/整数/布尔值)。
(顺便说一句,Django Rest Framework 的 @api_view
装饰器已经过时,@action
最好使用最新版本)