Door_Detection / app.py
unknown
Add large files
3aa4656
raw
history blame
7.31 kB
import cv2
import numpy as np
import time
import os
#import datetime
#from datetime import datetime
#from PIL import Image
#from io import BytesIO
#from scipy import ndimage
#from pympler.tracker import SummaryTracker
#tracker = SummaryTracker()
INPUT_WIDTH = 640
INPUT_HEIGHT = 640
SCORE_THRESHOLD = 0.45
NMS_THRESHOLD = 0.45
CONFIDENCE_THRESHOLD = 0.5
# Text parameters.
FONT_FACE = cv2.FONT_HERSHEY_SIMPLEX
FONT_SCALE = 0.7
THICKNESS = 1
# Colors.
BLACK = (0,0,0)
BLUE = (255,178,50)
YELLOW = (0,255,255)
classesFile = "coco.names"
classes = None
#frame = cv2.imread('1.jpg')
# Give the weight files to the model and load the network using them.
roi_detection_modelWeights = "doors.onnx"
roi_detection_model = cv2.dnn.readNet(roi_detection_modelWeights)
roi_detection_model.setPreferableBackend(cv2.dnn.DNN_BACKEND_DEFAULT)
roi_detection_model.setPreferableTarget(cv2.dnn.DNN_TARGET_CPU)
#num_rec_modelWeights = "chan_3_32_num.onnx" #ch first
#num_rec_model = cv2.dnn.readNet(num_rec_modelWeights)
def draw_label(im, label, x, y):
"""Draw text onto image at location."""
# Get text size.
text_size = cv2.getTextSize(label, FONT_FACE, FONT_SCALE, THICKNESS)
dim, baseline = text_size[0], text_size[1]
# Use text size to create a BLACK rectangle.
cv2.rectangle(im, (x,y), (x + dim[0], y + dim[1] + baseline), (0,0,0), cv2.FILLED);
# Display text inside the rectangle.
cv2.putText(im, label, (x, y + dim[1]), FONT_FACE, FONT_SCALE, YELLOW, THICKNESS, cv2.LINE_AA)
def pre_process(input_image, net,w,h):
# Create a 4D blob from a frame.
#print(input_image.shape)
blob = cv2.dnn.blobFromImage(input_image, scalefactor=1/255, size=(640, 640), mean=(0, 0, 0), swapRB=True, crop=False)
# blob = cv2.dnn.blobFromImage(input_image, 1/255, (w, h), [0,0,0], 1, crop=False)
# Sets the input to the network.
net.setInput(blob)
# Run the forward pass to get output of the output layers.
outputs = net.forward(net.getUnconnectedOutLayersNames())
del (blob)
return outputs
def get_xyxy(input_image, outputs,w,h):
# Lists to hold respective values while unwrapping.
class_ids = []
confidences = []
boxes = []
output_boxes=[]
# Rows.
rows = outputs[0].shape[1]
image_height, image_width = input_image.shape[:2]
# Resizing factor.
x_factor = image_width / w
y_factor = image_height / h
# Iterate through detections.
for r in range(rows):
row = outputs[0][0][r]
confidence = row[4]
# Discard bad detections and continue.
if confidence >= CONFIDENCE_THRESHOLD:
classes_scores = row[5:]
# Get the index of max class score.
class_id = np.argmax(classes_scores)
# Continue if the class score is above threshold.
if (classes_scores[class_id] > SCORE_THRESHOLD):
confidences.append(confidence)
class_ids.append(class_id)
cx, cy, w, h = row[0], row[1], row[2], row[3]
left = int((cx - w/2) * x_factor)
top = int((cy - h/2) * y_factor)
width = int(w * x_factor)
height = int(h * y_factor)
box = np.array([left, top, width, height])
boxes.append(box)
# Perform non maximum suppression to eliminate redundant, overlapping boxes with lower confidences.
indices = cv2.dnn.NMSBoxes(boxes, confidences, CONFIDENCE_THRESHOLD, NMS_THRESHOLD)
for i in indices:
box = boxes[i]
left = box[0]
top = box[1]
width = box[2]
height = box[3]
# Draw bounding box.
cv2.rectangle(input_image, (left, top), (left + width, top + height), BLUE, 3*THICKNESS)
# Class label.
#label = "{}:{:.2f}".format(classes[class_ids[i]], confidences[i])
# Draw label.
draw_label(input_image, 'x', left, top)
cv2.imwrite('image.jpg',input_image)
#turn xywh into xyxy
boxes[i][2]=left + width
boxes[i][3]=top + height
#check if the height is suitable
output_boxes.append(boxes[i])
#if height >20:
# output_boxes.append(boxes[i])
#del(input_image,)
return 1,output_boxes,input_image #boxes (left,top,width,height)
def roi_detection(input_image,roi_detection_model,w,h):
detections = pre_process(input_image, roi_detection_model,w,h) #detection results
_,bounding_boxes,input_image=get_xyxy(input_image, detections,w,h) # nms and return the valid bounding boxes
#print( bounding_boxes)
#date = datetime.now().strftime("%Y_%m_%d_%I_%M_%S_%p")
#cv2.imwrite(f"lic_{date}.jpg",image_with_bounding_boxes)
#cv2.imwrite('xf.jpg',image_with_bounding_boxes)
return bounding_boxes ,input_image
# def number_detection(input_image,ch_detection_model,w,h):
# #in_image_copy=input_image.copy()
# detections = pre_process(input_image.copy(), ch_detection_model,w,h) #detection results
# image_with_bounding_boxes,bounding_boxes=get_xyxy(input_image, detections,w,h)
# #date = datetime.now().strftime("%Y_%m_%d_%I_%M_%S_%p")
# #im_name=f"ch_{date}.jpg"
# #print(im_name)
# #cv2.imwrite(im_name,image_with_bounding_boxes)
# # cv2.imwrite('x1.jpg',image_with_bounding_boxes)
# return bounding_boxes
def main_func(img,):
scores='door :'
img = np.array(img)
#send_im_2_tg(img)
t1=time.time()
width_height_diff=img.shape[1]-img.shape[0] #padding
#print(width_height_diff,img.shape)
if width_height_diff>0:
img = cv2.copyMakeBorder(img, 0, width_height_diff, 0, 0, cv2.BORDER_CONSTANT, (0,0,0))
if width_height_diff<0:
img = cv2.copyMakeBorder(img, 0, 0, 0, int(-1*width_height_diff), cv2.BORDER_CONSTANT, (0,0,0))
cropped_licenses_array,input_image=roi_detection(img.copy(),roi_detection_model,640,640)
if len(cropped_licenses_array)!=0:
scores=scores+"True and detection time is "+str(time.time()-t1)
#print('total time in sec :',time.time()-t1)
#tracker.print_diff()
del(img)
#print(scores)
#return (scores+' time_sec : '+str(time.time()-t1))
return input_image ,scores
import gradio as gr
import cv2
import os
# im = gr.Image()
def greet(im):
im=cv2.imread(im)
im,number=main_func(im)
im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
#print(im)
#im=cv2.imread(im)
# im=os.path.join("/content/s.jpg")
return im ,number
inputs = gr.Image(type="filepath", label="Input Image")
outputs = [gr.Image(type="filepath", label="Output Image"),gr.Textbox()]
title = "YOLO-v5-Door detection for visually impaired people"
demo_app = gr.Interface(examples=["s.jpg"],
fn=greet,
inputs=inputs,
outputs=outputs,
title=title,
cache_examples=True,
)
demo_app.launch()