Untitled

 avatar
unknown
python
2 years ago
3.8 kB
2
Indexable
import os
import grpc
import numpy as np
import random
import tensorflow as tf
import cv2
import glob
import traceback
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:8501",
    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...