Spaces:
Sleeping
Sleeping
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() | |