Recently, I made a new PC. Before, when I was playing with OpenCV, the fps of image processing was only about 10 fps, and I thought it was subtle, so I will try to find out what it looks like by changing the PC. Next, I will compare the GPU with the GTX1660super and Intel built-in graphics.
I think someone is already doing it, but I couldn't find it, so I'm writing it. Please let me know if there are other articles doing the same thing. I want to read.
PC | Bench results |
---|---|
Old PC | 613 |
New PC-Built-in GPU | 4741 |
New PC-GPU | 4839 |
It doesn't depend on GPU at all.
FFXV_bench 1920 * 1080, standard quality
PC | Bench results |
---|---|
Old PC | 547:Difficult to operate |
New PC-Built-in GPU | 708:Difficult to operate |
New PC-GPU | 8379:comfortable |
The memory is barely enough, and it's useless without a GPU.
You can capture screens in a library called mss.
pip install mss
Is required. Get the elapsed time $ [s] $ in a library called time. Compare the time it took to capture the screen 1000 times. I don't know where the bottleneck is. If you loop $ while $ without acquiring the image, it could not be measured at the second level, so the image capture part
sct.grab(monitor)
I think there is no doubt that it takes time.
PC | Seconds |
---|---|
Old PC | 16.7(60fps) |
New PC-Built-in GPU | 16.7(60fps) |
New PC-GPU | 16.7(60fps) |
This is expected because the refresh rate of the display connected to the PC is set to 59.94Hz.
capture_test.py
import cv2 #OpenCV library
import numpy as np #Numpy library
from mss import mss
import time
sct = mss()
"""
For operation check: Comment out after operation check
"""
#windowName = "capture"
#cv2.namedWindow(windowName)
n= 0
while True:
if n == 0:
start_time = time.time()
if n>= 1000: #Repeated 1000 times
end_time = time.time()
break
"""
Image acquisition
"""
monitor = {"top": 300, "left": 170, "width": 600, "height": 200}
img = np.array(sct.grab(monitor))
"""
Operation check part
"""
"""
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'): #end processing
break
"""
n = n+ 1
cv2.destroyAllWindows()
img[0][0][0] = 1 #If you do not use it even once, I think it will be useless and add it
print(end_time-start_time)
Let's try it with the famous library "pyautogui".
PC | Seconds |
---|---|
Old PC | 68.1(Close to 15fps) |
New PC-Built-in GPU | 34.1(Close to 30fps) |
New PC-GPU | 33.4(Close to 30fps) |
It may be adjusted to 15,30,60fps, which is a good number according to the performance of the PC. Compared to mss, the load on both GPU and CPU is a little higher. There was almost no effect on the capture range. Since the load factor of any PC has a margin from the upper limit, it is wondering why there is a difference in performance.
However, the 15fps of the old PC is too low to use.
capture_test_pyautogui.py
import cv2 #OpenCV library
import numpy as np #Numpy library
import pyautogui
import time
"""
For operation check: Comment out after operation check
"""
"""
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: #Repeated 100 times
end_time = time.time()
break
"""
Image acquisition
"""
home = pyautogui.screenshot(region=(0,0,600,200))
img = np.asarray(home)
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
"""
Operation check part
"""
"""
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'): #end processing
break
"""
n = n+ 1
cv2.destroyAllWindows()
img[0][0][0] = 1 #If you do not use it even once, I think it will be useless and add it
print(end_time-start_time)
OpenCV bench List the functions you want to try.
Basically, I want to do image recognition, so it looks like this.
cv2.imshow Since the "same" image is displayed repeatedly, "different images" may give slightly different results. I was greatly influenced by the size of the image. I feel that the CPU load is high
Image size 100 * 100
PC | Seconds |
---|---|
Old PC | |
New PC-Built-in GPU | 0.015~0.017 |
New PC-GPU | 0.017 |
Image size 300 * 300
PC | Seconds |
---|---|
Old PC | |
New PC-Built-in GPU | 0.08 |
New PC-GPU | 0.083~0.084 |
Image size 800 * 800
PC | Seconds |
---|---|
Old PC | |
New PC-Built-in GPU | 1.20~1.23 |
New PC-GPU | 1.11~1.13 |
Image size 2000 * 2000
PC | Seconds |
---|---|
Old PC | |
New PC-Built-in GPU | 8.5~8.9 |
New PC-GPU | 8.0~8.2 |
opencv_imshow.py
import cv2 #OpenCV library
import numpy as np #Numpy library
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: #Repeated 100 times
end_time = time.time()
break
cv2.imshow(windowName,img)
"""
#Operation test
key = cv2.waitKey(1)
if key ==ord('q'): #end processing
break
"""
n = n+ 1
cv2.destroyAllWindows()
img[0][0][0] = 1 #If you do not use it even once, I think it will be useless and add it
print(end_time-start_time)
cv2.circle
PC | Seconds |
---|---|
Old PC | 0.0239~0.0269 |
New PC-Built-in GPU | 0.012 |
New PC-GPU | 0.013 |
It doesn't seem to be a load at all.
opencv_circle.py
import cv2 #OpenCV library
import numpy as np #Numpy library
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: #Repeated 100 times
end_time = time.time()
break
cv2.circle(img, (int(n*0.5),50), 10, (0, 0, 255), 4)
"""
Operation check part
"""
"""
cv2.imshow(windowName,img)
key = cv2.waitKey(1)
if key ==ord('q'): #end processing
break
"""
n = n+ 1
cv2.destroyAllWindows()
img[0][0][0] = 1 #If you do not use it even once, I think it will be useless and add it
print(end_time-start_time)
cv2.matchTemplate This process has the heaviest image. Also, it was strongly influenced by the image size.
PC | Seconds taken to run 100 times |
---|---|
Old PC | |
New PC-Built-in GPU | |
New PC-GPU | 4.413 |
import cv2 #OpenCV library
import numpy as np #Numpy library
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: #Repeated 100 times
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 | Seconds taken to run 1000 times |
---|---|
Old PC | |
New PC-Built-in GPU | |
New PC-GPU | 0.255 |
You can see that it hasn't taken any time.
minmaxLoc_bench.py
import cv2 #OpenCV library
import numpy as np #Numpy library
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: #Repeated 100 times
end_time = time.time()
break
cMin, cMax1, pMin, pMax1 = cv2.minMaxLoc(img_ccoeff)
n = n+ 1
cv2.destroyAllWindows()
print(end_time-start_time)
I'm sorry. Since dbd was so much fun that it wasn't so much, I'll publish it for now and update it when I can afford it.
Recommended Posts