[PYTHON] Capture d'image / comparaison de la vitesse OpenCV avec et sans GPU

Aperçu

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.

environnement

Spécifications PC pour comparaison

Ancien PC

Nouveau GPU intégré au PC

Nouveau PC-GPU

Résultat Cine-bench R20

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.

Banc de capture d'image

Capture d'image (à l'aide de la bibliothèque mss)

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)

Capture d'image (à l'aide de la bibliothèque pyautogui)

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

résultat

Code du banc

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)

Capture de l'appareil photo (appareil photo 30fps utilisé)

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.

Recommended Posts

Capture d'image / comparaison de la vitesse OpenCV avec et sans GPU
XavierNX accélère le traitement d'image OpenCV avec GPU (CUDA)
Avec et sans WSGI
Édition d'image avec python OpenCV
Capture de caméra avec Python + OpenCV
Obtenez des fonctionnalités d'image avec OpenCV
Reconnaissance d'image avec Keras + OpenCV
La comparaison et l'optimisation des vitesses BASIC et C et assembleur jouent avec IchigoJam
Créez un environnement GPU avec GCP et l'image officielle de Kaggle (docker)
Briller la vie avec Python et OpenCV
Interpolation automatique des images avec OpenCV et Python (méthode de marche rapide, Navier-Stokes)
Comparaison de vitesse du traitement de texte intégral de Wiktionary avec F # et Python
Réseau neuronal avec OpenCV 3 et Python 3
[Python] Utilisation d'OpenCV avec Python (transformation d'image)
Segmentation d'image avec scikit-image et scikit-learn
Comparaison de vitesse entre CPython et PyPy
Trouver la similitude d'image avec Python + OpenCV
Essayez de brouiller l'image avec opencv2
Dessinez des figures avec OpenCV et PIL
Lisez l'image du graphique avec OpenCV et obtenez les coordonnées du point final du graphique
Traitement d'image avec Python et OpenCV [Tone Curve]
Acquisition d'images depuis une caméra avec Python + OpenCV
Traitement d'image léger avec Python x OpenCV
Traitement d'image avec Lambda + OpenCV (création d'image grise)
Comparaison de vitesse de murmurhash3, md5 et sha1
J'ai essayé de "lisser" l'image avec Python + OpenCV
Comparaison des performances du détecteur de visage avec Python + OpenCV
J'ai essayé de "différencier" l'image avec Python + OpenCV
Générer et publier des données d'image factice avec Django
Comment recadrer une image avec Python + OpenCV
Installez OpenCV 4.0 et Python 3.7 sur Windows 10 avec Anaconda
J'ai essayé de "binariser" l'image avec Python + OpenCV
[Petite histoire] Tester la génération d'images avec Python / OpenCV
Conversion en ondelettes d'images avec PyWavelets et OpenCV
Nettoyage des données 3 Utilisation d'OpenCV et prétraitement des données d'image
Correspondance des fonctionnalités avec OpenCV 3 et Python 3 (A-KAZE, KNN)
Comparaison de vitesse entre la variable de comptage incrémentielle et l'énumération
Créer une image à plage dynamique élevée (HDR) avec OpenCV et Python (Mertens, Robertson, Debevec)
Un mémo qui détecte le visage de l'image acquise à partir de la caméra Web avec OpenCV de Django et le renvoie.