Untitled

 avatar
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...