[PYTHON]

Übersicht Vor kurzem wurde der PC erneuert. Früher, als ich mit OpenCV spielte, betrug die Bildverarbeitung nur etwa 10 Bilder pro Sekunde, und ich fand sie subtil. Deshalb werde ich versuchen, durch Ändern des PCs herauszufinden, wie sie aussieht. Als nächstes werde ich die GPU mit der GTX1660super und der integrierten Intel-Grafik vergleichen. Ich denke, jemand macht es bereits, aber ich konnte es nicht finden, also schreibe ich es. Bitte lassen Sie mich wissen, wenn es andere Artikel gibt, die dasselbe tun. Ich will lesen.

Umgebung

PC-Spezifikationen zum Vergleich

Alter PC

Neue PC-integrierte GPU

Neue PC-GPU

Cine-Bench R20 Ergebnis

PC Bench Ergebnisse
Alter PC 613
Neuer PC-Eingebaute GPU 4741
Neuer PC-GPU 4839

Es hängt überhaupt nicht von der GPU ab.

FFXV_bench 1920 * 1080, Standardqualität

PC Bench Ergebnisse
Alter PC 547:Schwer zu bedienen
Neuer PC-Eingebaute GPU 708:Schwer zu bedienen
Neuer PC-GPU 8379:gemütlich

Der Speicher ist kaum genug und ohne GPU nutzlos.

Bilderfassungsbank

Bilderfassung (mit MSS-Bibliothek)

Sie können Bildschirme in einer Bibliothek namens mss erfassen.

pip install mss

Wird benötigt. Holen Sie sich die verstrichene Zeit $ [s] $ in einer Bibliothek namens time. Vergleichen Sie die Zeit, die für die 1000-malige Erfassung des Bildschirms benötigt wurde. Ich weiß nicht, wo der Engpass liegt. Wenn Sie $ while $ schleifen, ohne das Bild zu erfassen, konnte es nicht auf der zweiten Ebene gemessen werden, daher der Bildaufnahmeteil

sct.grab(monitor)

Ich denke, es besteht kein Zweifel, dass es Zeit braucht.

PC Sekunden
Alter PC 16.7(60fps)
Neuer PC-Eingebaute GPU 16.7(60fps)
Neuer PC-GPU 16.7(60fps)

Dies wird erwartet, da die Bildwiederholfrequenz des an den PC angeschlossenen Displays auf 59,94 Hz eingestellt ist.

capture_test.py


import cv2			#OpenCV-Bibliothek
import numpy as np		#Numpy Bibliothek
from mss import mss
import time

sct = mss()

"""
Zur Funktionsprüfung: Nach Betriebsprüfung auskommentieren
"""
#windowName = "capture"
#cv2.namedWindow(windowName)

n= 0
while True:
    if n == 0:
        start_time = time.time()
        
    if n>= 1000:  #1000 mal wiederholt
        end_time = time.time()
        break
    """
Bildaufnahme
    """        
    monitor = {"top": 300, "left": 170, "width": 600, "height": 200}
    img = np.array(sct.grab(monitor))
    
    """
Funktionsteil prüfen
    """
    """
    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'):                 #Verarbeitung beenden
        break
    """
    
    n = n+ 1

cv2.destroyAllWindows()
img[0][0][0] = 1         #Wenn Sie es nicht einmal verwenden, denke ich, dass es nutzlos ist und fügen Sie es hinzu

print(end_time-start_time)

Bilderfassung (mit Pyautogui-Bibliothek)

Probieren wir es mit der berühmten Bibliothek "pyautogui".

PC Sekunden
Alter PC 68.1(Nahezu 15 fps)
Neuer PC-Eingebaute GPU 34.1(Nahezu 30 fps)
Neuer PC-GPU 33.4(Nahezu 30 fps)

Es kann auf 15,30,60 fps eingestellt werden, was je nach Leistung des PCs eine gute Zahl ist. Im Vergleich zu mss ist die Belastung von GPU und CPU etwas höher. Es gab fast keine Auswirkungen auf den Erfassungsbereich. Da der Auslastungsfaktor eines PCs von der Obergrenze abweicht, fragt er sich, warum es einen Leistungsunterschied gibt.

Die 15 fps des alten PCs sind jedoch zu niedrig, um verwendet zu werden.

capture_test_pyautogui.py


import cv2			#OpenCV-Bibliothek
import numpy as np		#Numpy Bibliothek
import pyautogui
import time

"""
Zur Funktionsprüfung: Nach Betriebsprüfung auskommentieren
"""
"""
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:  #100 mal wiederholt
        end_time = time.time()
        break
    """
Bildaufnahme
    """        
    home = pyautogui.screenshot(region=(0,0,600,200))
    img = np.asarray(home)
    img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
    
    """
Funktionsteil prüfen
    """
    """
    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'):                 #Verarbeitung beenden
        break
    """
    
    n = n+ 1

cv2.destroyAllWindows()
img[0][0][0] = 1         #Wenn Sie es nicht einmal verwenden, denke ich, dass es nutzlos ist und fügen Sie es hinzu

print(end_time-start_time)

OpenCV bench Listen Sie die Funktionen auf, die Sie ausprobieren möchten.

Grundsätzlich möchte ich eine Bilderkennung durchführen, also sieht es so aus.

cv2.imshow Da das "gleiche" Bild wiederholt angezeigt wird, können "unterschiedliche Bilder" leicht unterschiedliche Ergebnisse liefern. Die Größe des Bildes hat mich stark beeinflusst. Ich habe das Gefühl, dass die CPU-Auslastung hoch ist


Bildgröße 100 * 100

PC Sekunden
Alter PC
Neuer PC-Eingebaute GPU 0.015~0.017
Neuer PC-GPU 0.017

Bildgröße 300 * 300

PC Sekunden
Alter PC
Neuer PC-Eingebaute GPU 0.08
Neuer PC-GPU 0.083~0.084

Bildgröße 800 * 800

PC Sekunden
Alter PC
Neuer PC-Eingebaute GPU 1.20~1.23
Neuer PC-GPU 1.11~1.13

Bildgröße 2000 * 2000

PC Sekunden
Alter PC
Neuer PC-Eingebaute GPU 8.5~8.9
Neuer PC-GPU 8.0~8.2

Ergebnis

Bankcode

opencv_imshow.py


import cv2			#OpenCV-Bibliothek
import numpy as np		#Numpy Bibliothek
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:  #100 mal wiederholt
        end_time = time.time()
        break
    
    cv2.imshow(windowName,img)
    """
    #Betriebstest
    key = cv2.waitKey(1)
    if key ==ord('q'):                 #Verarbeitung beenden
        break
    """
    n = n+ 1

cv2.destroyAllWindows()
img[0][0][0] = 1         #Wenn Sie es nicht einmal verwenden, denke ich, dass es nutzlos ist und fügen Sie es hinzu

print(end_time-start_time)

cv2.circle

PC Sekunden
Alter PC 0.0239~0.0269
Neuer PC-Eingebaute GPU 0.012
Neuer PC-GPU 0.013

Es scheint überhaupt keine Last zu sein.

opencv_circle.py


import cv2			#OpenCV-Bibliothek
import numpy as np		#Numpy Bibliothek
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:  #100 mal wiederholt
        end_time = time.time()
        break
    
    cv2.circle(img, (int(n*0.5),50), 10, (0, 0, 255), 4)
    
    """
Funktionsteil prüfen
    """
    """
    cv2.imshow(windowName,img)
    key = cv2.waitKey(1)
    if key ==ord('q'):                 #Verarbeitung beenden
        break
    """
    
    
    n = n+ 1

cv2.destroyAllWindows()
img[0][0][0] = 1         #Wenn Sie es nicht einmal verwenden, denke ich, dass es nutzlos ist und fügen Sie es hinzu

print(end_time-start_time)

cv2.matchTemplate Dieser Prozess hat das schwerste Bild. Es wurde auch stark von der Bildgröße beeinflusst.

PC Sekunden, um 100 Mal zu laufen
Alter PC
Neuer PC-Eingebaute GPU
Neuer PC-GPU 4.413

import cv2			#OpenCV-Bibliothek
import numpy as np		#Numpy Bibliothek
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:  #100 mal wiederholt
        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)

Kameraaufnahme (30fps Kamera verwendet)

cv2.minMaxLoc

PC Sekunden, um 1000 Mal zu laufen
Alter PC
Neuer PC-Eingebaute GPU
Neuer PC-GPU 0.255

Sie können sehen, dass es keine Zeit gedauert hat.

minmaxLoc_bench.py


import cv2			#OpenCV-Bibliothek
import numpy as np		#Numpy Bibliothek
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:  #100 mal wiederholt
        end_time = time.time()
        break
    
    cMin, cMax1, pMin, pMax1 = cv2.minMaxLoc(img_ccoeff)
    n = n+ 1

cv2.destroyAllWindows()

print(end_time-start_time)

Es tut mir Leid. Da dbd so viel Spaß gemacht hat, dass es nicht so viel Spaß gemacht hat, werde ich es vorerst veröffentlichen und aktualisieren, wenn ich es mir leisten kann.

Recommended Posts