import cv2 import matplotlib.pyplot as plt import torch from PIL.Image import Image from torch import nn from torchvision.transforms import transforms def white_bg_square(img): "return a white-background-color image having the img in exact center" size = (max(img.size),)*2 layer = Image.new('RGB', size, (255, 255, 255)) layer.paste(img, tuple(map(lambda x:(x[0]-x[1])/2, zip(size, img.size)))) return layer code = [] path = "test5.jpg" transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,)), ]) img = cv2.imread(path) img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) img_gray = cv2.GaussianBlur(img_gray, (5, 5), 0) ret, im_th = cv2.threshold(img_gray, 90, 255, cv2.THRESH_BINARY_INV) ctrs, hier = cv2.findContours(im_th.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) rects = [cv2.boundingRect(ctr) for ctr in ctrs] # load nn model input_size = 784 # = 28*28 hidden_sizes = [128, 128, 64] output_size = 10 model = nn.Sequential(nn.Linear(input_size, hidden_sizes[0]), nn.ReLU(), nn.Linear(hidden_sizes[0], hidden_sizes[1]), nn.ReLU(), nn.Linear(hidden_sizes[1], hidden_sizes[2]), nn.ReLU(), nn.Linear(hidden_sizes[2], output_size), nn.LogSoftmax(dim=-1)) model.load_state_dict(torch.load('digit_reco_model2.pt')) model.eval() for rect in rects: # Crop image crop_img = img[rect[1]:rect[1] + rect[3] + 10, rect[0]:rect[0] + rect[2] + 10, 0] # Resize the image roi = cv2.resize(crop_img, (28, 28), interpolation=cv2.INTER_LINEAR) roi = cv2.dilate(roi, (3, 3)) plt.imshow(roi) plt.show() im = transform(roi) im = im.view(1, 784) with torch.no_grad(): logps = model(im.float()) ps = torch.exp(logps) probab = list(ps.numpy()[0]) print("Predicted Digit =", probab.index(max(probab))) cv2.imshow("Code", img) cv2.waitKey()