前提・実現したいこと
画像データを処理するAPIを作成しています。
ローカルで立ち上げたときは、難なく呼び出すことができましたが、dataにデプロイ後、呼び出すとエラーが発生してしまいます。
発生している問題・エラーメッセージ
File "<unknown>", line 1 Internal Server Error ^ SyntaxError: invalid syntax
該当のソースコード
streamlit
1import io 2import numpy as np 3import base64 4from io import BytesIO 5import requests 6import json 7import cv2 8import ast 9st.title("Hello!") 10 11 12uploaded_file = st.file_uploader('Choose a image file') 13 14def pil_to_base64(img, format="jpeg"): 15 buffer = BytesIO() 16 img.save(buffer, format) 17 img_str = base64.b64encode(buffer.getvalue()).decode("ascii") 18 19 return img_str 20 21if uploaded_file is not None: 22 image = Image.open(uploaded_file) 23 img_array = np.array(image) 24 st.image( 25 image, caption='upload images', 26 use_column_width=True 27 ) 28 img_base64 = pil_to_base64(image, format="png") 29 data = { 30 'id': "1", 31 'data': img_base64 32 } 33 34 url = 'https://inpca0.deta.dev/items/' 35 res = requests.post( 36 url, 37 data=json.dumps(data) 38 ) 39 if res.status_code == 200: 40 st.success('ユーザー登録完了') 41 # res_text = res["responses"][0]["textAnnotations"][0]["description"] 42 st.write(res.text) 43 list = res.text 44 dic = ast.literal_eval(list) 45 img_base64 = dic[0]['heart'] 46 heart_img =img_base64.encode() 47 #バイナリデータ <- base64でエンコードされたデータ 48 img_binary = base64.b64decode(heart_img) 49 png=np.frombuffer(img_binary,dtype=np.uint8) 50 #raw image <- jpg 51 img = cv2.imdecode(png,cv2.IMREAD_UNCHANGED ) 52 im_swap = img.copy() 53 im_swap[:, :, 0], im_swap[:, :, 2] = img[:, :, 2], img[:, :, 0] 54 55 pil_img_swap = Image.fromarray(im_swap) 56 st.image( 57 pil_img_swap, caption='heart images', 58 use_column_width=True 59 ) 60 #st.write(img_base64) 61
fastapi
1from typing import Optional 2import json 3from fastapi import FastAPI 4from pydantic import BaseModel 5import requests 6# matplotlib.pyplotモジュール をインポートし、pltと略して使います。plt.show()のように使用できます 7import matplotlib.pyplot as plt 8from io import BytesIO 9import base64 10# numpyライブラリ をインポートして、npと略して使います。np.arange()のように使用できます。 11import numpy as np 12def Im_analysis (image_path): 13 API_KEY = "apikey" 14 api_url = 'https://vision.googleapis.com/v1/images:annotate?key={}'.format(API_KEY) 15 image_content = image_path 16 req_body = json.dumps({ 17 'requests': [{ 18 'image': { 19 'content': image_content.decode('utf-8') 20 }, 21 'features': [{ 22 'type': 'DOCUMENT_TEXT_DETECTION' 23 }] 24 }] 25 }) 26 res = requests.post(api_url, data=req_body) 27 return res.json() 28def g_nlp(text): 29 key = 'AIzaSyAxlXxFNjIx1-gw6-qYcexl9R4uCTrrDuI' 30 url = f'https://language.googleapis.com/v1/documents:analyzeSentiment?key={key}' 31 32 33 header = {'Content-Type' : 'application/json'} 34 body = { 35 "document": { 36 "type" : "PLAIN_TEXT", 37 "language": "JA", 38 "content" : text 39 } 40 } 41 res = requests.post(url, headers=header, json=body) 42 result = res.json() 43 return result 44 45def heartmake(a,b,c,kekka,hosi): 46 # グラフ上の点を作成します。それらの点が線でつながれると、ハート曲線のようなグラフができます 47 48 # t: 0から2πまで0.01間隔で並んだ数字の配列(ndarray)。パラメータt。 49 # right_t: ハート曲線の右端の点に来る時のtの値=π/2 50 # right_y: ハート曲線の右端の点に来る時のy座標の値 51 # x: グラフ上の点のx座標の配列(ndarray) をパラメータtを用いて表します 52 # y: グラフ上の点のy座標の配列(ndarray) をパラメータtを用いて表します。 53 54 t = np.arange(0, 2*np.pi, 0.01) # np.pi は円周率 55 right_t = np.pi/2 56 right_y = 13*np.cos(right_t)-5*np.cos(2*right_t)-2*np.cos(3*right_t)-np.cos(4*right_t) 57 x = 16 * np.sin(t) ** 3 58 y = 13 * np.cos(t) - 5 * np.cos(2*t) - 2 * np.cos(3*t) - np.cos(4*t) 59 60 # ここから図を作ります 61 62 fig = plt.figure() # Figure(図)のインスタンスfig。何も描かれてない図。 63 ax = fig.add_subplot(1,1,1) # 座標軸(axes)のインスタンスax を作ります。グラフを描く前に座標軸を決めます。 64 ax.set_xlim(-17, 17) # x軸を表示する範囲を -17から17 とします 65 ax.set_ylim(-20, 13) # y軸を表示する範囲を -20から13 とします 66 ax.plot(x, y, color=(a,b,c)) # 点(x,y)を順番にピンクの線でつなぎます 67 ax.fill_between(x, y, y2=right_y, color=(a,b,c)) # 点(x,y) で囲まれた領域を赤く塗りつぶす 68 suuti = int(kekka * 100) 69 if hosi == 1 and suuti >= 70: 70 ax.scatter(8, 8, s=3000, marker="*",color = "yellow") 71 ax.text(0, 0, suuti, fontsize=50, horizontalalignment="center", 72 verticalalignment="center") 73 ax.set_aspect(1) # x,yの目盛りの比を1にします 74 ax.axis("off") 75 return fig 76app = FastAPI() 77 78class Item(BaseModel): 79 id: str 80 data: bytes 81@app.get("/") 82async def root(): 83 return {"message": "Hello World"} 84 85@app.post("/items/") 86async def create_item(item: Item): 87 response = [] 88 data = item.data 89 A_result = Im_analysis(data) 90 #print(data) 91 #print(A_result) 92 res_text = A_result["responses"][0]["textAnnotations"][0]["description"] 93 characters = "\n" 94 res_text = ''.join( x for x in res_text if x not in characters) 95 kanjou_result = g_nlp(res_text) 96 kekka = kanjou_result['documentSentiment']['score'] * 2 97 if kekka >= 0: 98 figure = heartmake(1,0,0,kekka,1) 99 else: 100 b = abs(kekka) 101 figure = heartmake(0,0,1,b,0) 102 # バイト列を base64 文字列に変換する。 103 ofs = BytesIO() 104 figure.savefig(ofs, format="png") 105 png_data = ofs.getvalue() 106 base64_data = base64.b64encode(png_data).decode() 107 response.append({'kekka':kekka,'heart': base64_data}) 108 return response
試したこと
何かコードが変えてしまったかなと思い、もう一度ローカルで試してみましたがうまくいきました。
補足情報(FW/ツールのバージョンなど)
apiはfastapi
streamlitを使って呼び出しています。
windows:vscodeを使用
どなたかご教授おねがいします
あなたの回答
tips
プレビュー