Как улучшить этот класс, чтобы уменьшить использование памяти и повысить производительность? ⇐ Python

Программы на Python
Anonymous
Как улучшить этот класс, чтобы уменьшить использование памяти и повысить производительность?

Сообщение Anonymous »

Я пытаюсь увеличить FPS моей программы, но этот класс использует слишком много памяти, что снижает производительность. Как я могу улучшить этот класс, чтобы моя программа могла делать снимки экрана быстрее и работать лучше?

Код: Выделить всё

import cv2
import numpy as np

# Work on this to cut down memory and boost performance
class ObjectDetection:

def __init__(self):
self.avg_y_obstacle = None
self.avg_x_obstacle = None
self.avg_y_jump = None
self.avg_x_jump = None

# Preload templates for obstacle detection to optimize performance
self.templates = {
'template1': cv2.imread('template1.png', 0),
'template2': cv2.imread('template2.png', 0),
'template3': cv2.imread('template3.png', 0),
'template4': cv2.imread('template4.png', 0),
'template5': cv2.imread('template5.png', 0),
'template6': cv2.imread('template6.png', 0),
'template7': cv2.imread('template7.png', 0),
'template8': cv2.imread('template8.png', 0)
}
# Check if all templates loaded properly
for name, template in self.templates.items():
if template is None:
raise ValueError(f"Error loading template: {name}")

def ObstacleDetect(self, imageInput=None, threshold=0.8):
if imageInput is None:
raise ValueError("Input image is required")

# Convert input image to grayscale
image_gray = cv2.cvtColor(imageInput, cv2.COLOR_BGR2GRAY)

coordinates = []

# Iterate over each preloaded template
for name, template in self.templates.items():
h, w = template.shape[:2]  # Get template dimensions

# Perform template matching
result = cv2.matchTemplate(image_gray, template, cv2.TM_CCOEFF_NORMED)
loc = np.where(result >= threshold)

# Collect coordinates for detected objects and draw bounding boxes
for pt in zip(*loc[::-1]):
coordinates.append((pt[0], pt[1], pt[0] + w, pt[1] + h))
# cv2.rectangle(imageInput, (pt[0], pt[1]), (pt[0] + w, pt[1] + h), (0, 255, 0), 2)
# cv2.putText(imageInput, name, (pt[0], pt[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)

# Calculate avg_x_obstacle and avg_y_obstacle if coordinates are found
if coordinates:
coordinates = np.array(coordinates)
self.avg_y_obstacle = np.mean(coordinates[:, 1])  # Average y-coordinate of top-left
self.avg_x_obstacle = np.mean(coordinates[:, 0])  # Average x-coordinate of top-left
else:
print("No obstacles detected.")
self.avg_y_obstacle = None
self.avg_x_obstacle = None

return imageInput

def findJumpArea(self, image=None, threshold=0.8):
# Load the jump template once
template = cv2.imread('jump_template.png', 0)
if image is None or template is None:
raise ValueError("Error:  Could not load input image or template image.")

# Convert image to grayscale
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
h, w = template.shape[:2]

# Perform template matching
result = cv2.matchTemplate(image_gray, template, cv2.TM_CCOEFF_NORMED)
loc = np.where(result >= threshold)

coordinates = []

# Collect detected jump area coordinates and draw lines
for pt in zip(*loc[::-1]):
coordinates.append((pt[0], pt[1]))
# line_length = 50
# cv2.line(image, (pt[0], pt[1]), (pt[0] + line_length, pt[1]), (0, 255, 0), 2)

# Calculate avg_x_jump and avg_y_jump if coordinates are found
if coordinates:
coordinates = np.array(coordinates)
self.avg_y_jump = np.mean(coordinates[:, 1])  # Average y-coordinate of the top-left point
self.avg_x_jump = np.mean(coordinates[:, 0])  # Average x-coordinate of the top-left point
else:
print("No jump area detected.")
self.avg_y_jump = None
self.avg_x_jump = None

return image

# Getters for average coordinates
def getObstacleAvgY(self):
return self.avg_y_obstacle

def getObstacleAvgX(self):
return self.avg_x_obstacle

def getJumpAvgY(self):
return self.avg_y_jump

def getJumpAvgX(self):
return self.avg_x_jump

Я попробовал предварительно загрузить шаблоны и закомментировать некоторые визуальные элементы резюме, это немного улучшило производительность. Однако это все, что я смог придумать.

Подробнее здесь: https://stackoverflow.com/questions/790 ... erformance

Вернуться в «Python»