Find the distance from the object to the camera using the YoloV4 object detector, here we will be using a single camera :camera:, detailed explanation of distance estimation is available in another repository Face detection and Distance Estimation using single camera
Video Tutorial Explains the concept and implementation
Here we are targeting the person and cell phone classes only, for demo purposes.
you can follow all the steps mentioned in the video to create other objects as well.
implementation detail available on Darknet
pip install opencv-contrib-python==4.5.3.56
pip3 install opencv-contrib-python==4.5.3.56
then just clone this repository and you are good to go.
I have used tiny weights, check out more on darknet GitHub for more
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 distance 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 as you want
# returning list containing the object data.
return data_list
You have to make changes on these lines 📝 DistanceEstimation.py there are two situations, if the object(classes) in the single image then, here you can see my reference image it has to two object, person and cell phone
# reading reference 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 the 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 the 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 the Focal length for each
If you have any doubt DM me on insta
if You found this Helpful, please star :star: it.
You can Watch my Video Tutorial on Computer Vision Topics, just check out my YouTube Channel
I am avalaible for paid work here Fiverr