computer-vision-problems / object_detection_count.py
manikandan18ramalingam's picture
Update object_detection_count.py
9071273 verified
from ultralytics import YOLO
from PIL import Image, ImageDraw, ImageFont
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import os
import shutil
import cv2
import subprocess
# Method to detect object counts with given confidence score
# Helper function to get key by value from a dictionary
def getKeyByValue(dictionary, value):
for key, val in dictionary.items():
if val == value:
return key
return None # Return None if value not found
# Usage in YOLO prediction
#class_name = "car" # The class you want to filter, e.g., "car"
def detectObjectsAndCount(imageFile, confidence_score, class_type):
# Load a pre-trained YOLOv8 model (e.g., YOLOv8n)
model = YOLO("yolov8n.pt") # Use other variants like yolov8s.pt for better accuracy
# Define a custom directory to save the results
custom_save_dir = "/app/runs/detect/predict"
custom_read_dir = "./"
class_index = getKeyByValue(model.names, class_type)
count_of_class_type = 0;
# Run inference on an image or video
results = model.predict(
source=f"{imageFile}",
save=True,
conf=confidence_score,
save_dir=custom_save_dir, # Specify the custom output directory
exist_ok=True, # Prevent creating new subdirectories
classes=[class_index]
)
# Count the number of objects of the specified class
for result in results:
for box in result.boxes:
class_name = model.names[int(box.cls)]
if class_name == class_type:
count_of_class_type += 1
# Path to the saved image in the custom directory
image_path = f"{custom_save_dir}/{imageFile}"
# Open the image using Pillow
img = Image.open(image_path)
# Prepare to draw text on the image
draw = ImageDraw.Draw(img)
font_path = "/System/Library/Fonts/Supplemental/Arial.ttf" # Update this path if necessary
font_size = 30 # Specify the desired font size
try:
font = ImageFont.truetype(font_path, font_size)
except OSError:
font = ImageFont.load_default() # You can load a custom font if needed
# Text to display
text = f"Number of {class_type}s are: {count_of_class_type}"
# Define text position (at the top of the image)
text_position = (200, 10)
# Define text color (dark blue)
text_color = (0, 0, 139) # RGB value for dark blue
# Add text to the image
draw.text(text_position, text, fill=text_color, font=font)
# Display the modified image with the overlay
#plt.figure(figsize=(8, 12))
#plt.imshow(img)
#plt.axis("off") # Hide axes
#plt.show()
return img, count_of_class_type