#python #python-requests #azure-aks
#python #python-запросы #azure-aks
Вопрос:
У меня есть конечная точка модели, запущенная в службе Azure Kubernetes, и я не использую Django или Flask. Я отправляю локальные файлы png для оценки следующим образом:
import base64
import json
import cv2
import requests
img_path = 'C:/path/to/exampleImage.png'
link = aks_service.scoring_uri
api_key = aks_service.get_keys()[0]
def send2score(img_path, score_url, api_key):
headers = {'Content-Type': 'application/json',
'Authorization': ('Bearer ' api_key)
}
img = cv2.imread(img_path)
string = base64.b64encode(cv2.imencode('.png', img)[1]).decode()
dict = {
'img': string
}
jsonimg2 = json.dumps(dict, ensure_ascii=False, indent=4)
resp = requests.post(url=link, data=jsonimg2, headers=headers)
print(resp.text)
send2score(img_path=img_path, score_url=link, api_key=api_key)
Мой вопрос: как я могу получить имя файла (exampleImage.png) в score script в Azure Kubernetes после выполнения запроса.post? Пожалуйста, никаких методов, специфичных для Django или Flask
Бонусный вопрос: не стесняйтесь предлагать улучшения в том, как я загружаю данные (функция send2score), эта функция работает, я получаю результат обратно, я просто не могу получить имя файла в score script. Спасибо!
Ответ №1:
Согласно вашему коду, вы отправляете свое изображение в виде строки base64. Он не может содержать имя файла. Я думаю, вам нужно определить параметр для сохранения имени файла в теле запроса. Кроме того, вы также можете опубликовать файл в виде файла с кодировкой requests
из нескольких частей с помощью модуля. Например
отправить файл
import requests
import magic
import os
url = ''
path = "D:/sample/image/faces.jpg"
mime = magic.Magic(mime=True)
headers = {
'Authorization': ('Bearer ' 'cdff')
}
files = {'file': (os.path.basename(path), open(path, 'rb'), mime.from_file(path), {'Expires': '0'})}
res = requests.post(url, files=files, headers=headers)
print(res.content.decode('utf-8'))
Мой сервер
from http.server import BaseHTTPRequestHandler, HTTPServer
import cgi
hostName =
hostPort =
class MyServer(BaseHTTPRequestHandler):
def do_POST(self):
try:
// use cgi to read file
form = cgi.FieldStorage(fp=self.rfile, headers=self.headers, environ={
'REQUEST_METHOD': 'POST', 'CONTENT_TYPE': self.headers['Content-Type'], })
file = form.list[0]
data =file.file.read()
#process data
.............
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
self.wfile.write(bytes(
f"<html><head></head><body><h2>fileName : {file.filename}</h2>/html>", "utf-8"))
except Exception as e:
httperror = e.httperror if hasattr(e, "httperror") else 500
self.send_error(httperror, str(e)) # Send an error response
myServer = HTTPServer((hostName, hostPort), MyServer)
myServer.serve_forever()
Комментарии:
1. Спасибо за ваш ответ, Джим. Я уверен, что это работает, но я нашел более простой способ и скоро опубликую свой ответ
2. @Fjord Спасибо за ваш обмен. Кроме того, поскольку это полезно для вас, не могли бы вы принять его в качестве ответа?
Ответ №2:
Я слишком усложнял ситуацию, я понял, что отправляю закодированное изображение в виде json в словаре. Я могу включить другую информацию, например, имя файла, в словарь:
import base64
import json
import cv2
import requests
img_path = 'C:/path/to/exampleImage.png'
link = aks_service.scoring_uri
api_key = aks_service.get_keys()[0]
def send2score(img_path, score_url, api_key):
headers = {'Content-Type': 'application/json',
'Authorization': ('Bearer ' api_key)
}
img = cv2.imread(img_path)
string = base64.b64encode(cv2.imencode('.png', img)[1]).decode()
dict = {
'imgname': os.path.basename(img_path),
'img': string
}
jsonimg2 = json.dumps(dict, ensure_ascii=False, indent=4)
resp = requests.post(url=link, data=jsonimg2, headers=headers)
print(resp.text)
send2score(img_path=img_path, score_url=link, api_key=api_key)
И я могу получить изображение и имя файла в score script:
# Lots of code before
response = json.loads(path)
string = response['img']
jpg_original = base64.b64decode(string) # decode
jpg_as_np = np.frombuffer(jpg_original, dtype=np.uint8)
img0 = cv2.imdecode(jpg_as_np, flags=1) # image
img0name = response['imgname'] # file name
# Lots of code after