Untitled
unknown
python
2 years ago
3.9 kB
6
Indexable
import os import grpc import numpy as np import random import tensorflow as tf import cv2 import glob import traceback from PIL import Image, ImageDraw, ImageFont import matplotlib.pyplot as plt from tensorflow_serving.apis import predict_pb2 from tensorflow_serving.apis import prediction_service_pb2_grpc plt.rcParams["figure.figsize"] = [20, 8] channel = grpc.insecure_channel("192.168.1.198:9502", options=[('grpc.max_receive_message_length', 15 * 1024 * 1024)] ) stub = prediction_service_pb2_grpc.PredictionServiceStub(channel) def request_tfsv(inputs, outputs, model_name, sig="serving_default", \ version_label="stable", version=None): grpc_request = predict_pb2.PredictRequest() grpc_request.model_spec.name = model_name grpc_request.model_spec.signature_name = sig if version is None: grpc_request.model_spec.version_label = version_label else: grpc_request.model_spec.version.value = version for iname in inputs: grpc_request.inputs[iname].CopyFrom(tf.compat.v1.make_tensor_proto(inputs[iname], \ shape=inputs[iname].shape)) response = stub.Predict(grpc_request, timeout=60) result = [] for oname in outputs: outp = response.outputs[oname] shape = [x.size for x in outp.tensor_shape.dim] if outp.dtype == 9: value = outp.int64_val else: value = outp.float_val result.append(np.reshape(np.array(value), shape)) return result def digits_detection(image_bgr): img = np.expand_dims(image_bgr[:, :, ::-1], axis=0) preds = request_tfsv({"input_tensor": img}, ["detection_boxes", "detection_scores"], "digit_detection") boxes = preds[0][0] scores = preds[1][0] final_boxes = [] for sc, (t, l, b, r) in zip(scores, boxes): t = int(image_bgr.shape[0] * t) b = int(image_bgr.shape[0] * b) l = int(image_bgr.shape[1] * l) r = int(image_bgr.shape[1] * r) if sc > 0.3: final_boxes.append([l, t, r, b]) return final_boxes def image_processing(pil_image, size=(224, 224), grayscale=False, num_channels=3, normalize=True, transpose=True): img_resized = np.array(pil_image.resize(size, resample=Image.BILINEAR)) if grayscale: gray = cv2.cvtColor(img_resized, cv2.COLOR_RGB2GRAY) if num_channels == 3: img2 = np.zeros_like(img_resized) img2[:,:,0] = gray img2[:,:,1] = gray img2[:,:,2] = gray else: img2 = np.expand_dims(gray, axis=2) else: img2 = img_resized if num_channels == 3: if normalize: image = np.divide(np.subtract(img2.astype(np.float32) / 255, np.array([0.485, 0.456, 0.406], dtype=np.float32)), np.array([0.229, 0.224, 0.225], dtype=np.float32)) else: image = img2 / 255 else: image = img2 / 255 if transpose: image = np.transpose(image, axes=(2, 0, 1)) return image def digit_classify(img_rgb): img = Image.fromarray(img_rgb) image = image_processing(img, (32, 32), True, 1, False) # Inference image = np.expand_dims(np.array(image), axis=0) image = tf.convert_to_tensor(image, dtype=tf.float32) preds = request_tfsv({"input": image}, ["output"], "digits")[0][0] preds = tf.nn.softmax(preds).numpy() return preds.tolist() rand = random.choice(files) image = cv2.imread(rand) ratio = 64 / image.shape[0] image = cv2.resize(image, (0, 0), fx=ratio, fy=ratio) boxes = digits_detection(image) boxes = sorted(boxes, key=lambda x: x[0]) digits = [] for i, (l, t, r, b) in enumerate(boxes): crop = image.copy()[t:b, l:r, ::-1] pred = digit_classify(crop) print(np.argmax(pred), np.max(pred)) for i, (l, t, r, b) in enumerate(boxes): cv2.rectangle(image, (l, t), (r, b), (0, 255, 0), 1) plt.imshow(image[:, :, ::-1])
Editor is loading...