Irpan
init commit
7fa2fcb
from sklearn.cluster import KMeans
class TeamAssigner:
def __init__(self):
self.team_colors = {}
self.player_team_dict = {}
def get_clustering_model(self,image):
# Reshape the image to 2D array
image_2d = image.reshape(-1,3)
# Preform K-means with 2 clusters
kmeans = KMeans(n_clusters=2, init="k-means++",n_init=1)
kmeans.fit(image_2d)
return kmeans
def get_player_color(self,frame,bbox):
image = frame[int(bbox[1]):int(bbox[3]),int(bbox[0]):int(bbox[2])]
top_half_image = image[0:int(image.shape[0]/2),:]
# Get Clustering model
kmeans = self.get_clustering_model(top_half_image)
# Get the cluster labels forr each pixel
labels = kmeans.labels_
# Reshape the labels to the image shape
clustered_image = labels.reshape(top_half_image.shape[0],top_half_image.shape[1])
# Get the player cluster
corner_clusters = [clustered_image[0,0],clustered_image[0,-1],clustered_image[-1,0],clustered_image[-1,-1]]
non_player_cluster = max(set(corner_clusters),key=corner_clusters.count)
player_cluster = 1 - non_player_cluster
player_color = kmeans.cluster_centers_[player_cluster]
return player_color
def assign_team_color(self,frame, player_detections):
player_colors = []
for _, player_detection in player_detections.items():
bbox = player_detection["bbox"]
player_color = self.get_player_color(frame,bbox)
player_colors.append(player_color)
kmeans = KMeans(n_clusters=2, init="k-means++",n_init=10)
kmeans.fit(player_colors)
self.kmeans = kmeans
self.team_colors[1] = kmeans.cluster_centers_[0]
self.team_colors[2] = kmeans.cluster_centers_[1]
def get_player_team(self,frame,player_bbox,player_id):
if player_id in self.player_team_dict:
return self.player_team_dict[player_id]
player_color = self.get_player_color(frame,player_bbox)
team_id = self.kmeans.predict(player_color.reshape(1,-1))[0]
team_id+=1
if player_id ==91:
team_id=1
self.player_team_dict[player_id] = team_id
return team_id