#!/usr/bin/env python # coding: utf-8 # In[58]: import matplotlib.pyplot as plt import pandas as pd import cv2 import numpy as np from ultralytics import YOLO yolo = YOLO("yolov8n.pt") # In[59]: #plt.imshow(cv2.imread("Datasets/images/000003072.jpg")) # In[60]: def resize_with_padding(points,image, target_size=(224, 224), padding_color=(0, 0, 0)): h, w = image.shape[:2] target_w, target_h = target_size # Compute the scaling factor scale = min(target_w / w, target_h / h) new_w, new_h = int(w * scale), int(h * scale) # Resize while maintaining aspect ratio resized = cv2.resize(image, (new_w, new_h), interpolation=cv2.INTER_AREA) # Create a new blank image (padded) with the target size padded_image = np.full((target_h, target_w, 3), padding_color, dtype=np.uint8) #ajust points points = [(int(x * scale + (target_w - new_w) // 2), int(y * scale + (target_h - new_h) // 2)) for x, y in points] # Compute padding (center the image) x_offset = (target_w - new_w) // 2 y_offset = (target_h - new_h) // 2 # Place the resized image onto the padded canvas padded_image[y_offset:y_offset + new_h, x_offset:x_offset + new_w] = resized #lambdas to reverse x and y reverse = lambda lm,bm,x, y: (int((x - (target_w - new_w) // 2) / scale)+lm, int((y - (target_h - new_h) // 2) / scale)+bm) return padded_image,points,reverse # In[61]: def get_persons(image,points): results = yolo(image) max = 0 crop = 0,0,0,0 # Get detected objects i = 0 for result in results: for box in result.boxes: cls = int(box.cls[0].item()) # Get class ID if cls == 0: # Class '0' is "person" in COCO dataset x1, y1, x2, y2 = map(int, box.xyxy[0].tolist()) # if i == 0: crop = x1,y1,x2,y2 i = 1 #if this area contains all the points of the person sumed = sum([x1 <= x <= x2 and y1 <= y <= y2 for x, y in points]) if sumed > max: #plt.imshow(cropped_image) max = sumed crop = x1,y1,x2,y2 return crop # In[62]: def transform_data(name,points): if isinstance(name, str): image = cv2.imread(path) path = "Datasets/images/"+name if len(points) == 0: path = name else: image = name leftmost,bottommost,rightmost,topmost = get_persons(image,points) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # Ensure the coordinates are within the image bounds leftmost = max(leftmost, 0) bottommost = max(bottommost, 0) rightmost = min(rightmost, image.shape[1]) topmost = min(topmost, image.shape[0]) # Cut image from the points image = image[bottommost:topmost, leftmost:rightmost] # Adjust points coordinates points = [(x - leftmost, y - bottommost) for x, y in points] padded_image,new_points,reverse = resize_with_padding(points,image) reverse_complete = lambda x, y: reverse(leftmost, bottommost,x, y ) return padded_image,new_points,reverse_complete # Plot image # In[13]: # In[63]: #df = pd.read_csv('./Datasets/mpii_human_pose.csv') #df = df[df["NAME"]=="000003072.jpg"] # Load image using OpenCV (convert BGR to RGB for Matplotlib) keypoints = [ ("r ankle_X", "r ankle_Y"), ("r knee_X", "r knee_Y"), ("r hip_X", "r hip_Y"), ("l hip_X", "l hip_Y"), ("l knee_X", "l knee_Y"), ("l ankle_X", "l ankle_Y"), ("pelvis_X", "pelvis_Y"), ("thorax_X", "thorax_Y"), ("upper neck_X", "upper neck_Y"), ("head top_X", "head top_Y"), ("r wrist_X", "r wrist_Y"), ("r elbow_X", "r elbow_Y"), ("r shoulder_X", "r shoulder_Y"), ("l shoulder_X", "l shoulder_Y"), ("l elbow_X", "l elbow_Y"), ("l wrist_X", "l wrist_Y") ] ## Select the first row (example: first image) #row = df.iloc[0] # Change index for other images # ## Convert keypoints into a list of (x, y) tuples #points = [(int(row[x]), int(row[y])) for x, y in keypoints] #image,points,reverse = transform_data("000003072.jpg",points) ## Plot image #plt.imshow(image) #for (x, y) in points: # plt.scatter(x, y, color="red", s=30) # Red points # #plt.show() # In[64]: #original_points = [reverse(x,y) for x, y in points] #plt.imshow(cv2.imread("Datasets/images/000003072.jpg")) #for (x, y) in original_points: # plt.scatter(x, y, color="red", s=30) # Red points # #plt.show() # In[65]: # change the datasenumpy.core._exceptions._UFuncNoLoopError: ufunc 'add' did not contain a loop with signature matching types (dtype(' None #t using a function that will return the image with the alterations and the new points def process_row(row): points = [(int(row[x]), int(row[y])) for x, y in keypoints] try: image, points,_ = transform_data(row["NAME"], points) except Exception as e: print(f"Error processing row {row['ID']}: {e}") row["image"] = None return row row["r ankle_X"], row["r ankle_Y"] = points[0] row["r knee_X"], row["r knee_Y"] = points[1] row["r hip_X"], row["r hip_Y"] = points[2] row["l hip_X"], row["l hip_Y"] = points[3] row["l knee_X"], row["l knee_Y"] = points[4] row["l ankle_X"], row["l ankle_Y"] = points[5] row["pelvis_X"], row["pelvis_Y"] = points[6] row["thorax_X"], row["thorax_Y"] = points[7] row["upper neck_X"], row["upper neck_Y"] = points[8] row["head top_X"], row["head top_Y"] = points[9] row["r wrist_X"], row["r wrist_Y"] = points[10] row["r elbow_X"], row["r elbow_Y"] = points[11] row["r shoulder_X"], row["r shoulder_Y"] = points[12] row["l shoulder_X"], row["l shoulder_Y"] = points[13] row["l elbow_X"], row["l elbow_Y"] = points[14] row["l wrist_X"], row["l wrist_Y"] = points[15] row["image"] = image return row # In[66]: def process_dataset(name,df,numberRows): df = pd.read_csv(name) df= df[(df != -1).all(axis=1)] df = df[:numberRows].apply(process_row, axis=1) #takes a long TIME !! for me 1h 30 min df.to_pickle('dataset'+str(df.shape[0])+'.pkl') return df # In[ ]: #newDF = process_dataset("./Datasets/mpii_human_pose.csv") # In[ ]: #row = newDF.iloc[5] # Change index for other images ## Convert keypoints into a list of (x, y) tuples #points = [(int(row[x]), int(row[y])) for x, y in keypoints] #plt.imshow(row["image"]) #for (x, y) in points: # plt.scatter(x, y, color="red", s=30) # Red points # In[ ]: #get all rows that have image null #df_nulls = newDF[newDF["image"].isnull()] ## count how mutch image nulls it has #print(df_nulls.shape) #row = df_nulls.iloc[0] # Change index for other images #points = [(int(row[x]), int(row[y])) for x, y in keypoints] #print(get_persons(cv2.imread("./Datasets/images/"+row["NAME"]),points)) #plt.imshow(cv2.imread("./Datasets/images/"+row["NAME"])) #for (x, y) in points: # plt.scatter(x, y, color="red", s=30) # In[47]: #df5000 = pd.read_pickle('dataset5000.pkl') #df6231 = pd.read_pickle('dataset6231.pkl') #df = pd.concat([df5000, df6231], ignore_index=True) #df.to_pickle('dataset11231.pkl')