본문 바로가기
인공지능

YOLOv8을 사용한 오브젝트 감지 코드 - Claude.ai

by YJHTPII 2024. 7. 23.
반응형

 

 

네, YOLOv5를 사용하여 볼트를 감지하고 개수를 세는 프로그램을 만들 수 있습니다. YOLOv5는 실시간 객체 감지에 매우 효과적인 딥러닝 모델입니다. 다음은 YOLOv5와 웹캠을 이용한 실시간 볼트 감지 프로그램의 예시 코드입니다:

import cv2
import torch
from models.experimental import attempt_load
from utils.general import non_max_suppression, scale_coords
from utils.torch_utils import select_device
from utils.augmentations import letterbox
import numpy as np

def load_model():
    device = select_device('')
    model = attempt_load('yolov5s.pt', map_location=device)
    return model, device

def detect_bolts(frame, model, device):
    img = letterbox(frame, 640, stride=32)[0]
    img = img.transpose((2, 0, 1))[::-1]  # HWC to CHW, BGR to RGB
    img = np.ascontiguousarray(img)
    img = torch.from_numpy(img).to(device)
    img = img.float()
    img /= 255.0
    if img.ndimension() == 3:
        img = img.unsqueeze(0)

    pred = model(img, augment=False)[0]
    pred = non_max_suppression(pred, 0.25, 0.45, classes=[0], agnostic=False)  # 클래스 0은 볼트로 가정

    bolts = []
    for i, det in enumerate(pred):
        if len(det):
            det[:, :4] = scale_coords(img.shape[2:], det[:, :4], frame.shape).round()
            for *xyxy, conf, cls in reversed(det):
                bolts.append((int(xyxy[0]), int(xyxy[1]), int(xyxy[2]), int(xyxy[3])))

    return bolts

def count_bolts_realtime():
    model, device = load_model()
    cap = cv2.VideoCapture(0)

    while True:
        ret, frame = cap.read()
        if not ret:
            break

        bolts = detect_bolts(frame, model, device)

        for (x1, y1, x2, y2) in bolts:
            cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)

        cv2.putText(frame, f"Bolts: {len(bolts)}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

        cv2.imshow('Bolt Counter', frame)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()

count_bolts_realtime()

이 코드를 사용하기 위해서는 다음 사항들을 준비해야 합니다:

  1. YOLOv5 설치: pip install yolov5
  2. YOLOv5 모델 파일: 'yolov5s.pt' 또는 볼트 감지에 특화된 사용자 정의 모델
  3. 필요한 라이브러리: PyTorch, OpenCV, NumPy

주의사항:

  1. 이 코드는 YOLOv5의 기본 모델을 사용합니다. 볼트 감지에 특화된 모델을 훈련시키면 더 좋은 결과를 얻을 수 있습니다.
  2. classes=[0]는 YOLOv5의 기본 클래스 중 첫 번째 클래스(보통 'person')를 감지합니다. 볼트 감지를 위해서는 이 부분을 적절히 수정해야 합니다.
  3. 성능은 사용하는 하드웨어에 따라 다를 수 있습니다. GPU 사용을 권장합니다.

YOLOv5를 사용한 볼트 감지의 장점:

  1. 높은 정확도: 딥러닝 기반 모델로 더 정확한 감지가 가능합니다.
  2. 빠른 처리 속도: 실시간 처리에 적합합니다.
  3. 다양한 조건에서의 robust한 성능: 조명, 각도 등 다양한 조건에서도 잘 작동합니다.

이 코드를 실행하기 전에 볼트 데이터셋으로 YOLOv5 모델을 fine-tuning하는 것이 좋습니다.

 

 

YOLO는 지속적으로 발전해왔으며, 각 버전마다 성능과 특징이 다릅니다. 주요 버전들을 소개해드리겠습니다:

  1. YOLOv3:
    • 더 빠르고 정확한 버전으로, 다양한 크기의 객체 감지에 효과적입니다.
    • Darknet-53 백본 네트워크를 사용합니다.
  2. YOLOv4:
    • YOLOv3보다 더 빠르고 정확합니다.
    • CSPDarknet53 백본을 사용하며, 다양한 데이터 증강 기법을 적용했습니다.
  3. YOLOv5:
    • PyTorch로 구현되어 사용이 편리합니다.
    • 다양한 모델 크기(s, m, l, x)를 제공합니다.
  4. YOLOv6:
    • 매우 빠른 추론 속도를 자랑합니다.
    • 모바일 디바이스에서도 효율적으로 동작합니다.
  5. YOLOv7:
    • 고성능 객체 감지 모델로, 정확도와 속도 면에서 우수합니다.
    • 다양한 작업(객체 감지, 인스턴스 분할 등)에 적용 가능합니다.
  6. YOLOv8:
    • Ultralytics에서 개발한 최신 버전입니다.
    • 객체 감지뿐만 아니라 분할, 포즈 추정 등 다양한 작업을 수행할 수 있습니다.

각 버전은 고유한 특징과 장단점이 있습니다. 예를 들어, YOLOv8을 사용한 볼트 감지 코드는 다음과 같습니다:

 

from ultralytics import YOLO
import cv2

def count_bolts_realtime():
    # YOLOv8 모델 로드
    model = YOLO('yolov8n.pt')  # 또는 볼트 감지용으로 fine-tuning된 모델

    # 웹캠 설정
    cap = cv2.VideoCapture(0)

    while True:
        ret, frame = cap.read()
        if not ret:
            break

        # 객체 감지 수행
        results = model(frame)

        # 감지된 객체 표시 및 개수 세기
        bolt_count = 0
        for r in results:
            boxes = r.boxes
            for box in boxes:
                # 클래스 ID가 볼트에 해당하는 경우에만 처리
                if box.cls == 0:  # 0은 볼트 클래스 ID로 가정
                    bolt_count += 1
                    x1, y1, x2, y2 = box.xyxy[0]
                    cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)

        # 볼트 개수 표시
        cv2.putText(frame, f"Bolts: {bolt_count}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

        # 결과 프레임 표시
        cv2.imshow('Bolt Counter', frame)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()

count_bolts_realtime()

이 코드를 사용하려면 pip install ultralytics 명령으로 YOLOv8을 설치해야 합니다.

어떤 버전을 선택할지는 프로젝트의 요구사항(정확도, 속도, 리소스 제약 등)에 따라 다릅니다. 볼트 감지 작업에 가장 적합한 버전을 선택하려면, 각 버전으로 테스트를 해보고 성능을 비교해보는 것이 좋습니다.

 

[ WARN:0@10.173] global cap_msmf.cpp:471 anonymous-namespace'::SourceReaderCB::OnReadSample videoio(MSMF): OnReadSample() is called with error status: -2147023170
[ WARN:0@10.219] global cap_msmf.cpp:483 anonymous-namespace'::SourceReaderCB::OnReadSample videoio(MSMF): async ReadSample() call is failed with error status: -2147023170
[ WARN:1@10.234] global cap_msmf.cpp:1759 CvCapture_MSMF::grabFrame videoio(MSMF): can't grab frame. Error: -2147023170

이 오류 메시지들은 Microsoft Media Foundation (MSMF)를 사용하는 OpenCV의 비디오 캡처 기능에서 발생한 것입니다. 이는 주로 웹캠이나 카메라 장치와의 통신 문제로 인해 발생합니다. 이 문제를 해결하기 위해 다음 방법들을 시도해 볼 수 있습니다:

  1. 카메라 연결 확인:
    • 웹캠이 제대로 연결되어 있는지 확인하세요.
    • 다른 USB 포트에 연결해 보세요.
  2. 카메라 드라이버 업데이트:
    • 최신 카메라 드라이버를 설치하세요.
  3. 다른 카메라 인덱스 시도:
    • cv2.VideoCapture(0) 대신 cv2.VideoCapture(1) 또는 다른 인덱스를 사용해 보세요.
  4. DirectShow 백엔드 사용:
    • MSMF 대신 DirectShow를 사용해 보세요. 코드를 다음과 같이 수정하세요:
       
      cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
  5. 카메라 해상도 설정:
    • 특정 해상도를 명시적으로 설정해 보세요:
       
      cap = cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
  6. 다른 카메라 사용:
    • 가능하다면 다른 웹캠으로 테스트해 보세요.
  7. OpenCV 재설치:
    • OpenCV를 재설치하거나 다른 버전을 시도해 보세요.
  8. 시스템 재부팅:
    • 간단하지만 때때로 효과적인 방법입니다.
  9. 에러 처리 추가:
    • 코드에 에러 처리를 추가하여 문제를 더 자세히 파악할 수 있습니다:
      python
      Copy
      cap = cv2.VideoCapture(0) if not cap.isOpened(): print("카메라를 열 수 없습니다.") exit()
  10. 다른 비디오 캡처 라이브러리 사용:
    • 예를 들어, pyv4l2나 libuvc 같은 라이브러리를 시도해 볼 수 있습니다.

 

* 해결방안: 아래 내용 수정

# 웹캠 설정
    cap = cv2.VideoCapture(0)  ======>    cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)

from ultralytics import YOLO
import cv2

def count_bolts_realtime():
    # YOLOv8 모델 로드
    model = YOLO('yolov8n.pt')  # 또는 볼트 감지용으로 fine-tuning된 모델

    # 웹캠 설정
    cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)

    while True:
        ret, frame = cap.read()
        if not ret:
            break

        # 객체 감지 수행
        results = model(frame)

        # 감지된 객체 표시 및 개수 세기
        bolt_count = 0
        for r in results:
            boxes = r.boxes
            for box in boxes:
                # 클래스 ID가 볼트에 해당하는 경우에만 처리
                if box.cls == 0:  # 0은 볼트 클래스 ID로 가정
                    bolt_count += 1
                    x1, y1, x2, y2 = box.xyxy[0]
                    cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)

        # 볼트 개수 표시
        cv2.putText(frame, f"Bolts: {bolt_count}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

        # 결과 프레임 표시
        cv2.imshow('Bolt Counter', frame)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()

count_bolts_realtime()

 

 

 

VSCODE Terminal

20240722_yolov8.py
Traceback (most recent call last):
  File "e:\vscode_workspace\20240722_yolov8.py", line 1, in <module>
    from ultralytics import YOLO
ModuleNotFoundError: No module named 'ultralytics'

(base) E:\vscode_workspace>pip install ultralytics
Collecting ultralytics
  Downloading ultralytics-8.2.62-py3-none-any.whl.metadata (41 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 41.2/41.2 kB 197.3 kB/s eta 0:00:00
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 825.2/825.2 kB 5.2 MB/s eta 0:00:00
Downloading ultralytics_thop-2.0.0-py3-none-any.whl (25 kB)
Downloading py_cpuinfo-9.0.0-py3-none-any.whl (22 kB)
Installing collected packages: py-cpuinfo, ultralytics-thop, ultralytics
Successfully installed py-cpuinfo-9.0.0 ultralytics-8.2.62 ultralytics-thop-2.0.0

[notice] A new release of pip is available: 24.0 -> 24.1.2
[notice] To update, run: python.exe -m pip install --upgrade pip

python.exe e:/vscode_workspace/20240722_yolov8.py
Downloading https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8n.pt to 'yolov8n.pt'...
100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 6.25M/6.25M [00:00<00:00, 12.1MB/s]
[ERROR:0@44.436] global obsensor_uvc_stream_channel.cpp:156 cv::obsensor::getStreamChannelGroup Camera index out of range

python.exe e:/vscode_workspace/20240722_yolov8.py
[ERROR:0@3.470] global obsensor_uvc_stream_channel.cpp:156 cv::obsensor::getStreamChannelGroup Camera index out of range

python.exe e:/vscode_workspace/20240722_yolov8.py
[ WARN:0@10.173] global cap_msmf.cpp:471 `anonymous-namespace'::SourceReaderCB::OnReadSample videoio(MSMF): OnReadSample() is called with error status: -2147023170
[ WARN:0@10.219] global cap_msmf.cpp:483 `anonymous-namespace'::SourceReaderCB::OnReadSample videoio(MSMF): async ReadSample() call is failed with error status: -2147023170
[ WARN:1@10.234] global cap_msmf.cpp:1759 CvCapture_MSMF::grabFrame videoio(MSMF): can't grab frame. Error: -2147023170

python.exe e:/vscode_workspace/20240722_yolov8.py
[ERROR:0@3.429] global obsensor_uvc_stream_channel.cpp:156 cv::obsensor::getStreamChannelGroup Camera index out of range
python.exe e:/vscode_workspace/20240722_yolov8.py

0: 480x640 (no detections), 592.0ms
Speed: 87.2ms preprocess, 592.0ms inference, 46.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 1 laptop, 150.4ms
Speed: 37.1ms preprocess, 150.4ms inference, 58.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 1 remote, 148.0ms
Speed: 3.0ms preprocess, 148.0ms inference, 3.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 1 remote, 140.0ms
Speed: 2.0ms preprocess, 140.0ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 1 remote, 143.0ms
Speed: 2.0ms preprocess, 143.0ms inference, 1.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 (no detections), 142.0ms
Speed: 2.0ms preprocess, 142.0ms inference, 1.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 1 remote, 140.0ms
Speed: 3.0ms preprocess, 140.0ms inference, 1.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 1 remote, 143.0ms
Speed: 2.0ms preprocess, 143.0ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 1 remote, 141.0ms
Speed: 2.0ms preprocess, 141.0ms inference, 1.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 1 remote, 143.0ms
Speed: 3.0ms preprocess, 143.0ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 (no detections), 139.0ms
Speed: 2.0ms preprocess, 139.0ms inference, 1.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 (no detections), 143.0ms
Speed: 2.0ms preprocess, 143.0ms inference, 1.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 1 remote, 140.0ms
Speed: 2.0ms preprocess, 140.0ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 1 remote, 142.0ms
Speed: 2.0ms preprocess, 142.0ms inference, 1.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 1 person, 1 remote, 158.4ms
Speed: 2.0ms preprocess, 158.4ms inference, 2.5ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 (no detections), 165.7ms
Speed: 2.5ms preprocess, 165.7ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 (no detections), 145.0ms
Speed: 2.0ms preprocess, 145.0ms inference, 1.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 1 remote, 314.0ms
Speed: 1.0ms preprocess, 314.0ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 (no detections), 163.0ms
Speed: 3.0ms preprocess, 163.0ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 (no detections), 155.0ms
Speed: 3.0ms preprocess, 155.0ms inference, 1.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 1 remote, 162.0ms
Speed: 2.0ms preprocess, 162.0ms inference, 1.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 (no detections), 210.0ms
Speed: 3.0ms preprocess, 210.0ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 (no detections), 146.0ms
Speed: 2.0ms preprocess, 146.0ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 2 remotes, 145.0ms
Speed: 2.0ms preprocess, 145.0ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 1 remote, 149.0ms
Speed: 4.0ms preprocess, 149.0ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 1 remote, 1 keyboard, 150.0ms
Speed: 2.0ms preprocess, 150.0ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 1 remote, 176.5ms
Speed: 2.0ms preprocess, 176.5ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 1 remote, 167.0ms
Speed: 4.8ms preprocess, 167.0ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 1 remote, 150.0ms
Speed: 2.0ms preprocess, 150.0ms inference, 3.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 (no detections), 159.0ms
Speed: 2.0ms preprocess, 159.0ms inference, 5.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 (no detections), 167.0ms
Speed: 2.0ms preprocess, 167.0ms inference, 3.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 1 remote, 156.0ms
Speed: 2.0ms preprocess, 156.0ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)

0: 480x640 (no detections), 163.0ms
Speed: 3.0ms preprocess, 163.0ms inference, 1.0ms postprocess per image at shape (1, 3, 480, 640)

 

반응형

댓글