Récemment, j'ai fait un nouveau PC. Avant, quand je jouais avec OpenCV, le fps du traitement d'image n'était que d'environ 10 fps, et je pensais que c'était subtil, alors j'essaierai de savoir à quoi cela ressemble en changeant de PC. Ensuite, je comparerai le GPU avec le GTX1660super et les graphiques intégrés Intel.
Je pense que quelqu'un le fait déjà, mais je ne l'ai pas trouvé, alors je l'écris. Veuillez me faire savoir s'il existe d'autres articles faisant la même chose. Je veux lire.
PC | Résultats du banc |
---|---|
Ancien PC | 613 |
Nouveau PC-GPU intégré | 4741 |
Nouveau PC-GPU | 4839 |
Cela ne dépend pas du tout du GPU.
FFXV_bench 1920 * 1080, qualité standard
PC | Résultats du banc |
---|---|
Ancien PC | 547:Difficile à utiliser |
Nouveau PC-GPU intégré | 708:Difficile à utiliser |
Nouveau PC-GPU | 8379:confortable |
La mémoire est à peine suffisante et inutile sans GPU.
Vous pouvez capturer des écrans dans une bibliothèque appelée mss.
pip install mss
Est requis. Obtenez le temps écoulé $ [s] $ dans une bibliothèque appelée time. Comparez le temps nécessaire pour capturer l'écran 1000 fois. Je ne sais pas où se trouve le goulot d'étranglement. Si vous bouclez $ while $ sans acquérir l'image, elle n'a pas pu être mesurée au deuxième niveau, donc la partie capture d'image
sct.grab(monitor)
Je pense qu'il ne fait aucun doute que cela prend du temps.
PC | Secondes |
---|---|
Ancien PC | 16.7(60fps) |
Nouveau PC-GPU intégré | 16.7(60fps) |
Nouveau PC-GPU | 16.7(60fps) |
Ceci est attendu car le taux de rafraîchissement de l'écran connecté au PC est réglé sur 59,94 Hz.
capture_test.py
import cv2 #Bibliothèque OpenCV
import numpy as np #Bibliothèque Numpy
from mss import mss
import time
sct = mss()
"""
Pour le contrôle de fonctionnement: commenter après le contrôle de fonctionnement
"""
#windowName = "capture"
#cv2.namedWindow(windowName)
n= 0
while True:
if n == 0:
start_time = time.time()
if n>= 1000: #Répété 1000 fois
end_time = time.time()
break
"""
Acquisition d'image
"""
monitor = {"top": 300, "left": 170, "width": 600, "height": 200}
img = np.array(sct.grab(monitor))
"""
Pièce de contrôle de fonctionnement
"""
"""
img = img[:,:,0:3]
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
img = np.asarray(img)
cv2.imshow(windowName,img)
key = cv2.waitKey(1)
if key ==ord('q'): #terminer le traitement
break
"""
n = n+ 1
cv2.destroyAllWindows()
img[0][0][0] = 1 #Si vous ne l'utilisez pas même une fois, je pense que ce sera inutile et l'ajouter
print(end_time-start_time)
Essayons-le avec la célèbre bibliothèque "pyautogui".
PC | Secondes |
---|---|
Ancien PC | 68.1(Près de 15fps) |
Nouveau PC-GPU intégré | 34.1(Près de 30fps) |
Nouveau PC-GPU | 33.4(Près de 30fps) |
Il peut être ajusté à 15,30,60fps, ce qui est un bon nombre en fonction des performances du PC. Par rapport à mss, la charge sur le GPU et le CPU est un peu plus élevée. Il n'y avait presque aucun effet sur la plage de capture. Étant donné que le facteur de charge de tout PC a une marge par rapport à la limite supérieure, on se demande pourquoi il y a une différence de performances.
Cependant, les 15 ips de l'ancien PC sont trop faibles pour être utilisés.
capture_test_pyautogui.py
import cv2 #Bibliothèque OpenCV
import numpy as np #Bibliothèque Numpy
import pyautogui
import time
"""
Pour le contrôle de fonctionnement: commenter après le contrôle de fonctionnement
"""
"""
windowName = "capture"
cv2.namedWindow(windowName)
"""
monitor = {"top": 300, "left": 170, "width": 600, "height": 600}
n= 0
while True:
if n == 0:
start_time = time.time()
if n>= 1000: #Répété 100 fois
end_time = time.time()
break
"""
Acquisition d'image
"""
home = pyautogui.screenshot(region=(0,0,600,200))
img = np.asarray(home)
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
"""
Pièce de contrôle de fonctionnement
"""
"""
img = img[:,:,0:3]
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
img = np.asarray(img)
cv2.imshow(windowName,img)
key = cv2.waitKey(1)
if key ==ord('q'): #terminer le traitement
break
"""
n = n+ 1
cv2.destroyAllWindows()
img[0][0][0] = 1 #Si vous ne l'utilisez pas même une fois, je pense que ce sera inutile et l'ajouter
print(end_time-start_time)
OpenCV bench Dressez la liste des fonctions que vous souhaitez essayer.
En gros, je veux faire de la reconnaissance d'image, donc ça ressemble à ça.
cv2.imshow Étant donné que la «même» image est affichée à plusieurs reprises, «des images différentes» peuvent donner des résultats légèrement différents. J'ai été grandement influencé par la taille de l'image. Je sens que la charge du processeur est élevée
Taille de l'image 100 * 100
PC | Secondes |
---|---|
Ancien PC | |
Nouveau PC-GPU intégré | 0.015~0.017 |
Nouveau PC-GPU | 0.017 |
Taille de l'image 300 * 300
PC | Secondes |
---|---|
Ancien PC | |
Nouveau PC-GPU intégré | 0.08 |
Nouveau PC-GPU | 0.083~0.084 |
Taille d'image 800 * 800
PC | Secondes |
---|---|
Ancien PC | |
Nouveau PC-GPU intégré | 1.20~1.23 |
Nouveau PC-GPU | 1.11~1.13 |
Taille de l'image 2000 * 2000
PC | Secondes |
---|---|
Ancien PC | |
Nouveau PC-GPU intégré | 8.5~8.9 |
Nouveau PC-GPU | 8.0~8.2 |
opencv_imshow.py
import cv2 #Bibliothèque OpenCV
import numpy as np #Bibliothèque Numpy
import time
windowName = "capture"
cv2.namedWindow(windowName)
img = np.zeros((2000,2000,3))
n= 0
while True:
if n == 0:
start_time = time.time()
if n>= 1000: #Répété 100 fois
end_time = time.time()
break
cv2.imshow(windowName,img)
"""
#Test de fonctionnement
key = cv2.waitKey(1)
if key ==ord('q'): #terminer le traitement
break
"""
n = n+ 1
cv2.destroyAllWindows()
img[0][0][0] = 1 #Si vous ne l'utilisez pas même une fois, je pense que ce sera inutile et l'ajouter
print(end_time-start_time)
cv2.circle
PC | Secondes |
---|---|
Ancien PC | 0.0239~0.0269 |
Nouveau PC-GPU intégré | 0.012 |
Nouveau PC-GPU | 0.013 |
Cela ne semble pas du tout être une charge.
opencv_circle.py
import cv2 #Bibliothèque OpenCV
import numpy as np #Bibliothèque Numpy
import time
windowName = "capture"
cv2.namedWindow(windowName)
img = np.zeros((500,500,3))
n= 0
while True:
if n == 0:
start_time = time.time()
if n>= 1000: #Répété 100 fois
end_time = time.time()
break
cv2.circle(img, (int(n*0.5),50), 10, (0, 0, 255), 4)
"""
Pièce de contrôle de fonctionnement
"""
"""
cv2.imshow(windowName,img)
key = cv2.waitKey(1)
if key ==ord('q'): #terminer le traitement
break
"""
n = n+ 1
cv2.destroyAllWindows()
img[0][0][0] = 1 #Si vous ne l'utilisez pas même une fois, je pense que ce sera inutile et l'ajouter
print(end_time-start_time)
cv2.matchTemplate Ce processus a l'image la plus lourde. En outre, il a été fortement influencé par la taille de l'image.
PC | Secondes prises pour courir 100 fois |
---|---|
Ancien PC | |
Nouveau PC-GPU intégré | |
Nouveau PC-GPU | 4.413 |
import cv2 #Bibliothèque OpenCV
import numpy as np #Bibliothèque Numpy
import time
windowName = "capture"
cv2.namedWindow(windowName)
x = 100
y = 100
depth = 3
img = np.zeros((1000,1000,depth),dtype = np.uint8)
object1 = np.random.randint(0,255,(x,y,depth),dtype = np.uint8)
n= 0
while True:
if n == 0:
start_time = time.time()
if n>= 100: #Répété 100 fois
end_time = time.time()
break
img_ccoeff = cv2.matchTemplate(img, object1, cv2.TM_CCOEFF_NORMED)
n = n+ 1
cv2.destroyAllWindows()
print(end_time-start_time)
cv2.minMaxLoc
PC | Secondes prises pour courir 1000 fois |
---|---|
Ancien PC | |
Nouveau PC-GPU intégré | |
Nouveau PC-GPU | 0.255 |
Vous pouvez voir que cela n'a pas pris de temps.
minmaxLoc_bench.py
import cv2 #Bibliothèque OpenCV
import numpy as np #Bibliothèque Numpy
import time
windowName = "capture"
cv2.namedWindow(windowName)
x = 100
y = 100
depth = 3
img = np.zeros((1000,1000,depth),dtype = np.uint8)
object1 = np.random.randint(0,255,(x,y,depth),dtype = np.uint8)
img_ccoeff = cv2.matchTemplate(img, object1, cv2.TM_CCOEFF_NORMED)
n= 0
while True:
if n == 0:
start_time = time.time()
if n>= 1000: #Répété 100 fois
end_time = time.time()
break
cMin, cMax1, pMin, pMax1 = cv2.minMaxLoc(img_ccoeff)
n = n+ 1
cv2.destroyAllWindows()
print(end_time-start_time)
Je suis désolé. Étant donné que dbd était tellement amusant que ce n'était pas tellement amusant, je le publierai pour l'instant et le mettrai à jour quand j'en aurai les moyens.