from datetime import date import tensorflow as tf import pandas as pd import gradio as gr import numpy as np import cv2 as cv2 def shapeModel(): labels=["Octagon","Triangle","Circle Prohibitory","Circle","Rhombus"] json_file = open('./model/model1.json', 'r') loaded_model_json = json_file.read() json_file.close() model = tf.keras.models.model_from_json(loaded_model_json) model.load_weights("./model/model1.h5") return [model,labels] def recognitionModel(): json_file = open('./recognition_model/model.json', 'r') loaded_model_json = json_file.read() json_file.close() model = tf.keras.models.model_from_json(loaded_model_json) model.load_weights("./recognition_model/model.h5") return model def dark_image(h,w): image = np.zeros((h, w, 3), np.uint8) * 255 return image #------------------------ ⬇⬇⬇ Extracting Shape Regions ⬇⬇⬇ ----------------------------- def fill(img): h,w=img.shape image=dark_image(h,w) cnts = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if len(cnts) == 2 else cnts[1] for c in cnts: cv2.drawContours(image,[c], 0, (255,255,255), -1) return image #------------------------- ➡➡➡ This block ends ⬅⬅⬅ -------------------------------- #------------------------ ⬇⬇⬇ Segmenting Red Regions ⬇⬇⬇ ----------------------------- def red_mask(image): lower_red_1 = np.array([0, 100, 20]) upper_red_1 = np.array([10, 255, 255]) lower_red_2 = np.array([160,100,20]) upper_red_2 = np.array([179,255,255]) lower_red_mask = cv2.inRange(image, lower_red_1, upper_red_1) upper_red_mask = cv2.inRange(image, lower_red_2, upper_red_2) red_full_mask = lower_red_mask + upper_red_mask return red_full_mask def red_fill(img): h,w=img.shape image=dark_image(h,w) cnts = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if len(cnts) == 2 else cnts[1] for c in cnts: cv2.drawContours(image,[c], 0, (255,0,0), -1) return image #------------------------- ➡➡➡ This block ends ⬅⬅⬅ ----------------------------------- #-------------------------- ⬇⬇⬇ Segmenting Blue Regions ⬇⬇⬇--------------------------- def blue_mask(image): lower_blue_1 = np.array([112,50,50]) upper_blue_1 = np.array([130,255,255]) lower_blue_2 = np.array([96, 80, 2]) upper_blue_2 = np.array([126, 255, 255]) lower_blue_mask =cv2.inRange(image, lower_blue_1, upper_blue_1) upper_blue_mask =cv2.inRange(image, lower_blue_2, upper_blue_2) blue_full_mask = lower_blue_mask + upper_blue_mask return blue_full_mask def blue_fill(img): h,w=img.shape image=dark_image(h,w) cnts = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if len(cnts) == 2 else cnts[1] for c in cnts: cv2.drawContours(image,[c], 0, (0,0,255), -1) return image #------------------------- ➡➡➡ This block ends ⬅⬅⬅ ----------------------------------- #-------------------------- ⬇⬇⬇ Calculating Center of Image ⬇⬇⬇--------------------------- def coi(img): gray_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) moment = cv2.moments(gray_img) X = int(moment ["m10"] / moment["m00"]) Y = int(moment ["m01"] / moment["m00"]) return X+10,Y+8 #------------------------- ➡➡➡ This block ends ⬅⬅⬅ ----------------------------------- def resize(img): # img= cv2.bilateralFilter(img,9,75,75) width = 32 height = 32 dim = (width, height) resized=cv2.resize(img, dim, interpolation = cv2.INTER_AREA) return resized def shape_recognition(number, image): model=shapeModel()[0] labels=shapeModel()[1] image=resize(image) image_array= np.expand_dims(image, axis=0) predictions=model.predict(image_array) score = tf.nn.softmax(predictions[0]) # return {f"{number +' '+ labels[i] }": float(score[i]) for i in range(len(labels))} return f'Shape {str(number)}:'+" "+ f'{labels[np.argmax(score)]}' def ts_recognition(number, image): model=recognitionModel() labels=pd.read_csv('./recognition_model/labels.csv') labels=labels['Name'] image=resize(image) image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) image_array= np.expand_dims(image, axis=0) predictions=model(image_array) score = tf.nn.softmax(predictions[0]) # return {f"{number +' '+ labels[i] }": float(score[i]) for i in range(len(labels))} return f'Sign {str(number)}:'+" "+ f'{labels[np.argmax(score)]}' def outputs(roi): shape_n=[] color=[] sign=[] count=1 for i in roi: result = i.copy() x,y=list(coi(i)) image = cv2.cvtColor(result, cv2.COLOR_RGB2HSV) red_full_mask = red_mask(image) blue_full_mask = blue_mask(image) filled_red=red_fill(red_full_mask) filled_blue=blue_fill(blue_full_mask) # x=center_of_image[0] # y=center_of_image[1] rb_img=filled_red+filled_blue if list(rb_img[y,x])==[255,0, 0] or list(rb_img[y,x])==[255,0, 255]: # save(fill(red_full_mask)) #print(fill(red_full_mask).shape) shape_n.append(shape_recognition(count,fill(red_full_mask))) color.append(f"Color {count}: Red") sign.append(ts_recognition(count,result)) elif list(rb_img[y,x])==[0, 0, 255]: # print(fill(red_full_mask).shape) shape_n.append(shape_recognition(count,fill(blue_full_mask))) color.append(f"Color {count}: Blue") sign.append(ts_recognition(count,result)) else: shape_n.append(f"Shape {count}: Undefined") color.append(f"Color {count}: Undefined") sign.append(ts_recognition(count,result)) count+=1 return shape_n, color ,sign def detect(image): with tf.io.gfile.GFile('./detection_model/frozen_inference_graph.pb', 'rb') as f: graph_def = tf.compat.v1.GraphDef() graph_def.ParseFromString(f.read()) with tf.compat.v1.Session() as sess: # Restore session sess.graph.as_default() tf.import_graph_def(graph_def, name='') # Read and preprocess an image. img = image cropper=img.copy() rows = img.shape[0] cols = img.shape[1] inp = cv2.resize(img, (300, 300)) #inp = inp[:, :, [2, 1, 0]] # BGR2RGB # Run the model out = sess.run([sess.graph.get_tensor_by_name('num_detections:0'), sess.graph.get_tensor_by_name('detection_scores:0'), sess.graph.get_tensor_by_name('detection_boxes:0'), sess.graph.get_tensor_by_name('detection_classes:0')], feed_dict={'image_tensor:0': inp.reshape(1, inp.shape[0], inp.shape[1], 3)}) # Visualize detected bounding boxes. num_detections = int(out[0][0]) roi=[] for i in range(num_detections): classId = int(out[3][0][i]) score = float(out[1][0][i]) bbox = [float(v) for v in out[2][0][i]] if score > 0.8: x = (bbox[1] * cols) -10 #left y = (bbox[0] * rows) - 15 #top right = (bbox[3] * cols) + 10 bottom = (bbox[2] * rows ) +10 crop=cropper[int(y): int(bottom),int(x):int(right)] if crop.shape[0]!=0 and crop.shape[1]!=0: roi.append(crop) detect=cv2.rectangle(img, (int(x), int(y)), (int(right), int(bottom)), (15, 255,100), thickness=4) cv2.putText(detect, f'{i+1}', (int(x), int(y-10)), cv2.FONT_HERSHEY_PLAIN, 0.8, (255,255,0), 2) if roi: shape_n,color, sign=outputs(roi) return detect, ', '.join(shape_n), ', '.join(color), ', '.join(sign) else: return image, 'Undetected', 'Undetected', 'Undetected' iface=gr.Interface(detect, inputs=gr.Image(label="Upload an Image"), outputs=[gr.Image(label="Detected Image"), gr.Label(label="Shape"), # gr.outputs.Image(label="Removed Background Image"), gr.Label(label="Color"), gr.Label(label="Signs") ], title="Bangladeshi Traffic Sign, Detection, Shape-Color Recognition & Classification", examples=['examples/1.jpg','./examples/2.jpg', './examples/4.jpg'], layout='center', description='The following is an Implementation of a Thesis paper done by Md. Ziaul Karim, \n for the Department of Software Engineering, Daffodil International University\'s Undergraduate program as a proof of concept.', theme='dark-peach',css='./style.css',article=f'© {date.today().year} Copyright | Made by Md. Ziaul Karim | with Gradio' ) iface.launch(debug=True, favicon_path='./favicon.png',height=300,width=500)