제 객체탐지 코드가 GPU를 활용하고 있는지 모르겠습니다.

제가 너무 모르는 부분이 많아서 어떻게 질문을 드려야할지 모르겠습니다.
제가 하고 싶은 동작은 스크린샷을 찍어서 파일로 저장하지 않고 학습된 모델을 활용해 객체 탐지를 지속적으로 하는 것입니다. 관련 지식이 없다보니 그냥 구글링을 통해서 짜집기한 코드입니다.

import torch
from PIL import ImageGrab
import cv2
import numpy as np

model = torch.hub.load('.', 'custom', path='C:/coding/datasets/coco128/train_data/weights/best.pt', source='local',device='cuda:0' if torch.cuda.is_available() else 'cpu')
#YOLOv5를 활용하여 직접 라벨링하고 학습시킨 모델입니다.(best.pt)

def img_search() :
img=ImageGrab.grab((48,567,453,808))
numpy_image=np.array(img)
frame=cv2.cvtColor(numpy_image, cv2.COLOR_RGB2BGR)
results = model(img) #모델을 이용한 객체탐지

results_data=results.pandas().xyxy[0].values

start_point = (int(bbox[0]), int(bbox[1])) # 객체 영역 오른쪽상단 좌표(x,y)
end_point = (int(bbox[2]), int(bbox[3])) # 객체 영역 왼쪽하단 좌표(x,y)
center_x = (int(bbox[0]) + int(bbox[2]))/2
center_y = (int(bbox[1]) + int(bbox[3]))/2

frame = cv2.rectangle(frame, start_point, end_point, (255, 0, 0), 3) # 이미지에 객체 영역 그리기

cv2.imshow("show image, q를 누르면 종료됩니다", frame) # 이미지 결과 띄우기

while True :
img_search()
k = cv2.waitKey(1) & 0xff
if k == 27 : break

이렇게 코드를 작성해서 작동까지는 성공했습니다. 그런데 속도가 많이 느려서 혹시 이미지를 따오는 것이 느린건지... 모델을 이용한 객체탐지가 느린건지.. 알수가 없어요
그래서 혹시 이렇게 코드를 진행시키면 GPU를 사용하는지가 궁금합니다.

정리하자면, GPU를 이용해 학습한 모델을 이용해 results = model(img) 코드를 실핼할때 GPU가 사용되는건가요?

  • 아래 답변은 OpenAI의 GPT-4-Turbo 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요! GPU 사용 여부에 대해 궁금증을 가지고 계신 것 같네요. 또한, 스크린샷을 찍어서 실시간으로 객체 탐지를 수행하는 코드의 속도 문제에 대해서도 고민이 있으신 것 같습니다. 질문을 잘 정리해주셔서 감사합니다. 제가 이해한 바로는, PyTorch를 사용하여 학습된 모델을 불러와서 실시간으로 스크린샷을 찍고 객체 탐지를 수행하는 코드를 작성하셨고, 이 과정에서 GPU가 제대로 활용되고 있는지, 그리고 속도가 느린 원인이 무엇인지 알고 싶으신 것으로 보입니다.

먼저, GPU 사용 여부를 확인하는 방법에 대해 설명드리겠습니다. PyTorch에서 모델을 GPU로 옮기려면 .to(device) 메서드를 사용해야 합니다. 이미 torch.hub.load 함수에서 device='cuda:0' 옵션을 주셨기 때문에, GPU가 사용 가능하다면 모델은 GPU로 옮겨져 있을 것입니다. 하지만 모델에 입력되는 이미지도 GPU로 옮겨져야 GPU에서 연산이 이루어집니다. 코드에서 img를 모델에 입력하기 전에 img를 GPU로 옮겨주는 작업이 필요합니다.

다음은 수정된 코드 예시입니다:

import torch
from PIL import ImageGrab
import cv2
import numpy as np

# 모델을 GPU로 로드합니다. GPU가 사용 가능하면 'cuda:0', 아니면 'cpu'를 사용합니다.
model = torch.hub.load('.', 'custom', path='C:/coding/datasets/coco128/train_data/weights/best.pt', source='local', device='cuda:0' if torch.cuda.is_available() else 'cpu')

def img_search():
    img = ImageGrab.grab((48, 567, 453, 808))
    numpy_image = np.array(img)
    frame = cv2.cvtColor(numpy_image, cv2.COLOR_RGB2BGR)
    
    # 이미지를 모델이 처리할 수 있는 형태로 변환합니다.
    # 예를 들어, 이미지를 tensor로 변환하고, GPU로 옮기는 과정이 필요합니다.
    # 이 부분은 모델에 따라 달라질 수 있으므로 적절히 조정해야 합니다.
    img_tensor = transforms.ToTensor()(img).unsqueeze(0).to(model.device)
    
    # 모델을 이용한 객체 탐지
    results = model(img_tensor)
    
    # 결과 처리 코드...
    # ...

while True:
    img_search()
    k = cv2.waitKey(1) & 0xff
    if k == 27: break

위 코드에서 transforms.ToTensor()는 PIL 이미지를 PyTorch 텐서로 변환하는 함수이며, .unsqueeze(0)는 배치 차원을 추가하는 작업입니다. .to(model.device)는 텐서를 모델이 있는 디바이스(GPU 또는 CPU)로 옮깁니다.

속도 문제는 여러 요인에 의해 발생할 수 있습니다. 이미지를 가져오는 과정, 모델을 실행하는 과정, 결과를 화면에 표시하는 과정 등에서 병목이 발생할 수 있습니다. 각 단계에서 시간을 측정하여 어느 부분이 느린지 확인해보는 것이 좋습니다.

PyTorch 공식 문서나 튜토리얼을 참고하시면 더 많은 정보를 얻을 수 있습니다. PyTorch 튜토리얼은 다음 링크에서 확인하실 수 있습니다:

제 답변이 정확하지 않을 수도 있으니, 실제 코드를 실행하면서 확인해보시는 것이 가장 좋습니다. 추가적인 질문이 있으시면 언제든지 질문해주세요!


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
1개의 좋아요
  • 아래 답변은 Anthropic의 Claude-2 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요 siknamm님,

제가 보기에 객체탐지 속도 개선 문제로 고민하고 계시는 것 같습니다.

siknamm님께서 질문해주신 내용을 정리해보겠습니다.

  1. YOLOv5 모델을 이용해 객체탐지 코드를 짜셨습니다.

  2. 현재 코드가 동작은 하지만 속도가 매우 느리다고 하셨습니다.

  3. GPU를 사용 중인지 확인이 필요하다고 문의해 주셨습니다.

네, 확인 결과 model = torch.hub.load에서 device='cuda:0'로 설정하셨기 때문에 GPU를 사용 중입니다.

속도 개선을 위해서는 다음과 같은 방법들이 도움이 될 수 있습니다.

  1. 입력 이미지 사이즈 조정: 고해상도의 큰 이미지일 경우 속도 저하 가능성이 있습니다. 이미지 사이즈를 줄여보세요.

  2. 배치 사이즈 조정: 배치 사이즈를 늘리면 병렬 처리량이 증가하여 속도 향상이 기대됩니다.

  3. torch.backends.cudnn.benchmark = True 추가: cuDNN 알고리즘 최적화를 활성화합니다.

  4. FP16 학습된 모델 사용: half precision으로 학습된 모델을 사용하면 추론 속도 향상이 기대됩니다.

  5. TensorRT/ONNX Runtime 연동: TensorRT나 ONNX Runtime으로 변환된 모델을 사용하는 것도 방법입니다.

이외에도 다양한 최적화가 가능합니다.

혹시 추가로 문의 사항이 있으시면 언제든 질문 주세요.

좋은 하루 되세요!


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
1개의 좋아요
  • 아래 답변은 OpenAI의 GPT-4 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요! GPU 사용 여부에 대해 궁금증을 가지고 계신 것 같네요. 코드를 통해 스크린샷을 찍어 실시간으로 객체 탐지를 수행하는 과정에서 속도가 느린 문제를 겪고 계신 것으로 이해했습니다.

먼저, GPU를 사용하고 있는지 확인하는 방법에 대해 설명드리겠습니다. PyTorch에서는 torch.cuda.is_available() 함수를 통해 CUDA(GPU)를 사용할 수 있는지 확인할 수 있습니다. 코드에서 device='cuda:0' if torch.cuda.is_available() else 'cpu' 부분을 통해 GPU가 사용 가능하면 cuda:0을, 그렇지 않으면 cpu를 사용하도록 설정하고 있습니다. 따라서, 모델이 GPU를 사용하도록 이미 설정되어 있습니다.

하지만, 모델에 입력되는 이미지도 GPU 메모리에 올려야 GPU에서 연산이 이루어집니다. model(img) 부분에서 img가 GPU에 올라가 있지 않다면, 모델이 GPU에서 실행되더라도 CPU와 GPU 간의 데이터 이동으로 인해 성능 저하가 발생할 수 있습니다.

아래는 입력 이미지를 GPU로 옮기는 코드를 추가한 예시입니다.

import torch
from PIL import ImageGrab
import cv2
import numpy as np

# 모델을 GPU로 로드합니다.
device = 'cuda:0' if torch.cuda.is_available() else 'cpu'
model = torch.hub.load('.', 'custom', path='C:/coding/datasets/coco128/train_data/weights/best.pt', source='local').to(device)

def img_search():
    img = ImageGrab.grab((48, 567, 453, 808))
    numpy_image = np.array(img)
    frame = cv2.cvtColor(numpy_image, cv2.COLOR_RGB2BGR)
    
    # 이미지를 PyTorch 텐서로 변환하고 GPU로 옮깁니다.
    tensor_image = transforms.ToTensor()(frame).unsqueeze(0).to(device)
    
    # 모델을 이용한 객체 탐지
    results = model(tensor_image)
    
    # 결과 처리 부분은 생략...

while True:
    img_search()
    k = cv2.waitKey(1) & 0xff
    if k == 27: break

위 코드에서 transforms.ToTensor()는 OpenCV 이미지를 PyTorch 텐서로 변환하고, .unsqueeze(0)는 배치 차원을 추가합니다. .to(device)를 통해 텐서를 GPU로 옮깁니다.

속도가 느린 문제는 여러 요인에 의해 발생할 수 있습니다. 이미지를 가져오는 과정, 모델의 추론 시간, 결과를 화면에 표시하는 시간 등이 모두 영향을 미칠 수 있습니다. 따라서, 각 단계별로 시간을 측정해보는 것이 좋습니다. 예를 들어, time 모듈을 사용하여 각 함수의 실행 시간을 측정할 수 있습니다.

PyTorch 관련 문서는 공식 PyTorch 튜토리얼 사이트에서 찾아볼 수 있습니다. GPU 사용에 대한 더 자세한 정보는 다음 링크를 참조하세요: PyTorch CUDA Tutorials.

제 답변이 정확하지 않을 수도 있으니, 문제가 해결되지 않는 경우 추가적인 정보를 제공해주시면 더 도움을 드릴 수 있을 것 같습니다.


  • 이 답변이 도움이 되셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!