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

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

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

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

4477閲覧

非同期処理で'Object of type 'ndarray' is not JSON serializable'エラーの解決法

trafalbad

総合スコア303

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/01/22 15:43

djangoで予測コード(main.py)からworker(.init.py)にタスクキューを投げて非同期処理をしようとしました。  
workerにはceleryを使ってます。

しかし、json形式になってないとのエラーが出てしまします。
作業の流れ的には以下のようになります。

手順1. $ python manage.py runserverでdjangoを起動
手順2. http://127.0.0.1:8000/myappにアクセス
手順3. フロントエンドで画像を入力
手順4. main.pyの関数predに入力した画像が入り、worker(init.py)の関数add_numbersを呼び出し(非同期処理をして)、予測コードを返す

この手順4でmain.pyのadd_numbers.delay(image)でworkerにimage(画像)を投げるとエラーが出てる状況です。

おそらくnumpy形式の画像がjson形式でないからだと思うのですが、、

何かいい解決策はないでしょうか?
ご教授お願いします

# エラー Exception Value: Object of type 'ndarray' is not JSON serializable Exception Location: /anaconda3/envs/django/lib/python3.6/json/encoder.py in default, line 180 Python Executable: /anaconda3/envs/django/bin/python

python

1#main.py 2def pred(img_path): 3 x=np.asarray(Image.open(img_path)) 4 x=np.resize(x,(150,150,3)) 5 x = np.expand_dims(x, axis=0) 6 image = preprocess_input(x) 7 id = add_numbers.delay(image) 8 time.sleep(10) 9 id=id.result 10 return id

python

1#__init__.py 2@app.task() 3def add_numbers(image): 4 sess = tf.Session() 5 K.set_session(sess) 6 cnt=pd.read_csv(CNT_PATH) 7 cnt=cnt.drop('Unnamed: 0', axis=1) 8 cnt=cnt.drop('cnt', axis=1) 9 10 11 dic = {} 12 for i, v in cnt.iterrows(): 13 dic.setdefault(v['index'], []).append([v['brand_id'], v['model_id'], v['cate_id']]) 14 15 16 #x=np.asarray(Image.open(img_path)) 17 #x=np.resize(x,(150,150,3)) 18 #x = np.expand_dims(x, axis=0) 19 #image = preprocess_input(x) 20 21 test_model = InceptionResNetV2(include_top=True) 22 test_model.load_weights(WHEIGHT_PATH) 23 test_model.compile(optimizer=SGD(lr=0.01, momentum=0.9, decay=0.001, nesterov=True), 24 loss='categorical_crossentropy', 25 metrics=['accuracy']) 26 27 y_pred = test_model.predict(image) 28 top_k=sess.run(tf.nn.top_k(y_pred,k=3,sorted=True)) 29 idxs=list(np.reshape(top_k[1],(3,))) 30 id=[] 31 for idx, v in dic.items(): 32 if idx in idxs: 33 id.append(['brand_id:{} model_id:{}, cate_id:{}'.format(v[0][0], v[0][1], v[0][2])]) 34 return id

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

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

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

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

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

guest

回答1

0

ベストアンサー

とりあえずarray.dumpsでバイト列にはなります。復元はnp.loadsでできます。

python

1>>> import numpy as np 2>>> np.arange(3).dumps() 3b'\x80\x02cnumpy.core.multiarray\n_reconstruct\nq\x00cnumpy\nndarray\nq\x01K\x00\x85q\x02c_codecs\nencode\nq\x03X\x01\x00\x00\x00bq\x04X\x06\x00\x00\x00latin1q\x05\x86q\x06Rq\x07\x87q\x08Rq\t(K\x01K\x03\x85q\ncnumpy\ndtype\nq\x0bX\x02\x00\x00\x00i8q\x0cK\x00K\x01\x87q\rRq\x0e(K\x03X\x01\x00\x00\x00<q\x0fNNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00tq\x10b\x89h\x03X\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00q\x11h\x05\x86q\x12Rq\x13tq\x14b.' 4>>> np.loads(np.arange(3).dumps()) 5array([0, 1, 2])

これで行けたら嬉しいですが、駄目だった場合はbase64でも使ってみましょうか。

python

1>>> import base64 2>>> base64.b64encode(np.arange(3).dumps()).decode() 3'gAJjbnVtcHkuY29yZS5tdWx0aWFycmF5Cl9yZWNvbnN0cnVjdApxAGNudW1weQpuZGFycmF5CnEBSwCFcQJjX2NvZGVjcwplbmNvZGUKcQNYAQAAAGJxBFgGAAAAbGF0aW4xcQWGcQZScQeHcQhScQkoSwFLA4VxCmNudW1weQpkdHlwZQpxC1gCAAAAaThxDEsASwGHcQ1ScQ4oSwNYAQAAADxxD05OTkr/////Sv////9LAHRxEGKJaANYGAAAAAAAAAAAAAAAAQAAAAAAAAACAAAAAAAAAHERaAWGcRJScRN0cRRiLg==' 4>>> np.loads(base64.b64decode(base64.b64encode(np.arange(3).dumps()).decode())) 5array([0, 1, 2])

必要に応じて圧縮して送るなども可能です。

python

1>>> import io 2>>> f = io.BytesIO() # メモリ上で擬似ファイルオブジェクトっぽく振る舞うもの 3>>> np.savez_compressed(f, a=np.arange(1000)) 4>>> f.seek(0) # 書き終わった後にファイル先頭にシークする 50 6>>> s = f.read() 7>>> len(s) 81743 9>>> len(np.arange(1000).dumps()) 108697

投稿2019/01/22 16:07

hayataka2049

総合スコア30933

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

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

trafalbad

2019/01/23 03:49

base64でいけました。ありがとうございます! main.py image_dump=base64.b64encode(image.dumps()).decode() id = add_numbers.delay(image_dump) __init__.py image=np.loads(base64.b64decode(image_dump))
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問