Yolov4-Detector-and-Distance-Estimator

Find distance from object to camera using YoloV4 object detector, here we will be using single camera 📷, detailed explanation of distance estimation is available another repository Face detection and Distance Estimation using single camera

YoloV4.Distance.Estimation.mp4

Video Tutorial Explains the concept and implementation YouTube Video Views

  • Here we are targeting the person and cell phone classes only, for demo purpose.

  • you can follow all the steps mentioned in the video to create for other objects as well.

implementation detail available on Darknet


TO DO

  • Finding distance of mutiple object at same time.

Installation you need opencv-contrib-python

opencv contrib

windows

pip install opencv-contrib-python==4.5.3.56

Linux or Mac

pip3 install opencv-contrib-python==4.5.3.56

then just clone this repository and you are good to go.

I have use tiny weights, check out more on darknet github for more


Add more Classes(Objects) for Distance Estimation

You will make changes on these particular lines DistanceEstimation.py

if classid ==0: # person class id 
    data_list.append([class_names[classid[0]], box[2], (box[0], box[1]-2)])
elif classid ==67: # cell phone
    data_list.append([class_names[classid[0]], box[2], (box[0], box[1]-2)])
    
# adding more classes for distnaces estimation 

elif classid ==2: # car
    data_list.append([class_names[classid[0]], box[2], (box[0], box[1]-2)])

elif classid ==15: # cat
    data_list.append([class_names[classid[0]], box[2], (box[0], box[1]-2)])
# in that way you can include as many classes you want 

    # returning list containing the object data. 
return data_list

Reading images and getting focal length

You have to make changes on these lines 📝 DistanceEstimation.py there two situations, if the object(classes) in single image then, here you can see the my reference image it has to two object, person and cell phone

# reading refrence images 
ref_person = cv.imread('ReferenceImages/image14.png')
ref_mobile = cv.imread('ReferenceImages/image4.png')
# calling the object detector function to get the width or height of object
# getting pixel width for person
person_data = object_detector(ref_person)
person_width_in_rf = person_data[0][1]

# getting pixel width for cell phone
mobile_data = object_detector(ref_mobile)
mobile_width_in_rf = mobile_data[1][1]

# getting pixel width for cat
cat_data = object_detector(ref_person)
cat_width_in_rf = person_data[2][1]

# getting pixel width for car
car_data = object_detector(ref_person)
car_width_in_rf = person_data[3][1]

if there is single class(object) in reference image then you approach it that way 👍

# reading the reference image from dir 
ref_person = cv.imread('ReferenceImages/person_ref_img.png')
ref_car = cv.imread('ReferenceImages/car_ref_img.png.png')
ref_cat = cv.imread('ReferenceImages/cat_ref_img.png')
ref_mobile = cv.imread('ReferenceImages/ref_cell_phone.png')

# checking object detection on reference image 
# getting pixel width for person
person_data = object_detector(ref_person)
person_width_in_rf = person_data[0][1]

# getting pixel width for cell phone
mobile_data = object_detector(ref_mobile)
mobile_width_in_rf = mobile_data[0][1]

# getting pixel width for cat
cat_data = object_detector(ref_cat)
cat_width_in_rf = person_data[0][1]

# getting pixel width for car
car_data = object_detector(ref_car)
car_width_in_rf = person_data[0][1]
# then you find Focal length for each

If you have any doubt DM me on insta Instagram


if You found this Helpful, please star it.

You can Watch my Video Tutorial on Computer Vision Topics, just check out my YouTube Channel AiPhile Youtube

I am avalaible for paid work here Fiverr fiverr

💚🖤 Join me on Social Media 🖤💚

YouTube AiPhile Youtube GitHub GitHub Medium Medium Fiverr Fiverr Instagram Instagram