Spaces:
Runtime error
Runtime error
import cv2 as cv | |
import numpy as np | |
from tts import * | |
# Distance constants | |
KNOWN_DISTANCE = 45 #INCHES | |
PERSON_WIDTH = 16 #INCHES | |
MOBILE_WIDTH = 3.0 #INCHES | |
CHAIR_WIDTH = 20.0 | |
text1 = "" | |
text2 = "" | |
# Object detector constant | |
CONFIDENCE_THRESHOLD = 0.4 | |
NMS_THRESHOLD = 0.3 | |
# colors for object detected | |
COLORS = [(255,0,0),(255,0,255),(0, 255, 255), (255, 255, 0), (0, 255, 0), (255, 0, 0)] | |
GREEN =(0,255,0) | |
BLACK =(0,0,0) | |
# defining fonts | |
FONTS = cv.FONT_HERSHEY_COMPLEX | |
# getting class names from classes.txt file | |
class_names = [] | |
with open("classes.txt", "r") as f: | |
class_names = [cname.strip() for cname in f.readlines()] | |
# setttng up opencv net | |
yoloNet = cv.dnn.readNet('yolov4-tiny.weights', 'yolov4-tiny.cfg') | |
yoloNet.setPreferableBackend(cv.dnn.DNN_BACKEND_CUDA) | |
yoloNet.setPreferableTarget(cv.dnn.DNN_TARGET_CUDA_FP16) | |
model = cv.dnn_DetectionModel(yoloNet) | |
model.setInputParams(size=(416, 416), scale=1/255, swapRB=True) | |
# object detector funciton /method | |
def object_detector(image): | |
classes, scores, boxes = model.detect(image, CONFIDENCE_THRESHOLD, NMS_THRESHOLD) | |
# creating empty list to add objects data | |
data_list =[] | |
for (classid, score, box) in zip(classes, scores, boxes): | |
x1,y1,x2,y2 = box | |
center_x, center_y = ( x1 + x2 ) / 2, ( y1 + y2 ) / 2 | |
height, width, channels = image.shape | |
# print(x1,y1,x2,y2) | |
# define color of each, object based on its class id | |
if center_x <= width/3: | |
W_pos = "left" | |
elif center_x <= (width/3 * 2): | |
W_pos = "center" | |
else: | |
W_pos = "right" | |
if center_y <= height/3: | |
H_pos = "top" | |
elif center_y <= (height/3 * 2): | |
H_pos = "mid" | |
else: | |
H_pos = "bottom" | |
text1 = W_pos | |
text2 = H_pos | |
color= COLORS[int(classid) % len(COLORS)] | |
label = "%s : %f" % (class_names[classid], score) | |
# draw rectangle on and label on object | |
cv.rectangle(image, box, color, 2) | |
cv.putText(image, label, (box[0], box[1]-14), FONTS, 0.5, color, 2) | |
# getting the data | |
# 1: class name | |
# 2: object width in pixels, | |
# 3: position where have to draw text(distance) | |
print("objects identified status") | |
print("person identified : ",classid == 0) | |
print("mobile identified : ",classid == 67) | |
print("chair identified : ",classid == 56) | |
# getting the data | |
# 1: class name 2: object width in pixels, 3: position where have to draw text(distance) | |
if classid == 0: # person class id | |
data_list.append([class_names[classid], box[2], (box[0], box[1]-2),text1,text2]) | |
elif classid == 67: | |
data_list.append([class_names[classid], box[2], (box[0], box[1]-2),text1,text2]) | |
elif classid == 56: | |
data_list.append([class_names[classid], box[2], (box[0], box[1]-2),text1,text2]) | |
# if you want inclulde more classes then you have to simply add more [elif] statements here | |
# returning list containing the object data. | |
return data_list | |
def focal_length_finder (measured_distance, real_width, width_in_rf): | |
focal_length = (width_in_rf * measured_distance) / real_width | |
return focal_length | |
# distance finder function | |
def distance_finder(focal_length, real_object_width, width_in_frmae): | |
distance = (real_object_width * focal_length) / width_in_frmae | |
return distance | |
# reading the reference image from dir | |
ref_person = cv.imread('ReferenceImages/image14.png') | |
ref_mobile = cv.imread('ReferenceImages/image4.png') | |
ref_chair = cv.imread('ReferenceImages/image22.png') | |
mobile_data = object_detector(ref_mobile) | |
mobile_width_in_rf = mobile_data[1][1] | |
person_data = object_detector(ref_person) | |
person_width_in_rf = person_data[0][1] | |
chair_data = object_detector(ref_person) | |
chair_width_in_rf = chair_data[0][1] | |
# print(f"Person width in pixels : {person_width_in_rf} mobile width in pixel: {mobile_width_in_rf}") | |
# finding focal length | |
focal_person = focal_length_finder(KNOWN_DISTANCE, PERSON_WIDTH, person_width_in_rf) | |
focal_mobile = focal_length_finder(KNOWN_DISTANCE, MOBILE_WIDTH, mobile_width_in_rf) | |
focal_chair = focal_length_finder(KNOWN_DISTANCE, CHAIR_WIDTH, chair_width_in_rf) | |
#d[] | |
def get_frame_output(frame, frame_cnt): | |
output_text_file = open('output_text.txt','w') | |
data = object_detector(frame) | |
for d in data: | |
if d[0] =='person': | |
distance = distance_finder(focal_person, PERSON_WIDTH, d[1]) | |
x, y = d[2] | |
elif d[0] =='cell phone': | |
distance = distance_finder (focal_mobile, MOBILE_WIDTH, d[1]) | |
x, y = d[2] | |
elif d[0] == 'chair': | |
distance = distance_finder (focal_chair, CHAIR_WIDTH, d[1]) | |
x, y = d[2] | |
text1,text2=d[3],d[4] | |
cv.rectangle(frame, (x, y-3), (x+150, y+23),BLACK,-1 ) | |
cv.putText(frame, f'Dis: {round(distance,2)} inch', (x+5,y+13), FONTS, 0.48, GREEN, 2) | |
OUTPUTtEXT="" | |
if distance > 100: | |
OUTPUTtEXT = "Get closer" | |
elif (round(distance) > 50) and (text2 == "mid"): | |
OUTPUTtEXT="Go straight" | |
else: | |
OUTPUTtEXT = (str(d[0]) + " " + str(int(round(distance,1))) +" inches"+" take left or right") | |
output_text_file.write(OUTPUTtEXT) | |
output_text_file.write("\n") | |
output_text_file.close() | |
return frame |