5 from PIL
import Image
as PLImage
9 from flask
import Flask, request, Response
15 if t.dtype
is torch.float32:
16 return t.to(dtype=torch.half)
22 self.
device =
"cuda" if torch.cuda.is_available()
else "cpu"
27 image = cv2.resize(img, dsize=(640, 480))
28 image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
29 image = PLImage.fromarray(image)
31 text_inputs = torch.cat([clip.tokenize(c)
for c
in texts]).to(self.
device)
33 image_features = self.model.encode_image(image_input)
35 image_features /= image_features.norm(dim=-1, keepdim=
True)
36 text_features /= text_features.norm(dim=-1, keepdim=
True)
37 probability = (100.0 * image_features @ text_features.T).softmax(dim=-1)
38 similarity = (text_features.cpu().numpy() @ image_features.cpu().numpy().T).T[0]
39 values, indices = probability[0].topk(len(texts))
41 for value, index
in zip(values, indices):
42 results[texts[index]] = (value.item(),
float(similarity[index]))
46 if __name__ ==
"__main__":
50 @app.route(
"/inference", methods=[
'POST'])
52 data = request.data.decode(
"utf-8")
53 data_json = json.loads(data)
55 image_b = data_json[
'image']
56 image_dec = base64.b64decode(image_b)
57 data_np = np.fromstring(image_dec, dtype=
'uint8')
58 img = cv2.imdecode(data_np, 1)
60 texts = data_json[
'queries']
61 infer_results = infer.infer(img, texts)
63 for q
in infer_results:
64 results.append({
"question": q,
"probability": infer_results[q][0],
"similarity": infer_results[q][1]})
65 return Response(response=json.dumps({
"results": results}), status=200)
67 app.run(
"0.0.0.0", 8080, threaded=
True)