컴퓨터 비전

YOLOv8 실행

도그사운드 2023. 10. 9. 17:08

Yolov8의 모델들

모델별로 성능의 차이가 있다. 8x는 인식의 범위가 8n에 비하여 증가하나 처리속도가 길어진다.

 

Yolo 설치

!pip install ultralytics==8.0.0

torch를 임포트한 후 GPU 사용가능한지 확인

torch.cuda.is_available()

다음의 명령으로 GPU상태 확인이 가능

print("CUDA Available: ", torch.cuda.is_available())
print("CUDA Version: ", torch.version.cuda)
print("PyTorch Version: ", torch.__version__)
print("Device Count: ", torch.cuda.device_count())

 

사진이나 동영상 인식은 yolo task=detect mode=predict model=토치파일 source=이미지 또는 영상

!yolo task=detect mode=predict model=yolov8s.pt source='/content/drive/MyDrive/Colab Notebooks/yolov8/1.2 image1.jpg'

confidence 조절 옵션

!yolo task=detect mode=predict model=yolov8s.pt source='/content/drive/MyDrive/Colab Notebooks/yolov8/1.2 image1.jpg' conf=0.8

save text 옵션

!yolo task=detect mode=predict model=yolov8x.pt source='/content/drive/MyDrive/Colab Notebooks/yolov8/1.2 image1.jpg' conf=0.8 save_txt=True

class별로 Bbox의 좌상단 x,y 좌표 우하단 x,y 좌표를 출력한다

0 0.8705 0.743223 0.081 0.438253
5 0.5365 0.484187 0.483 0.441265
0 0.6315 0.774849 0.081 0.444277
26 0.5145 0.746988 0.081 0.207831
9 0.77 0.27259 0.118 0.28012
0 0.495 0.775602 0.114 0.436747
24 0.3625 0.762048 0.123 0.316265
0 0.805 0.750753 0.132 0.486446
0 0.972 0.670181 0.056 0.331325
0 0.3285 0.729669 0.209 0.525602

 

IPython.display를 사용하면 코랩의 경우 바로 이미지 출력이 가능

from IPython.display import Image
Image('/content/drive/MyDrive/Colab Notebooks/yolov8/1.2 image1.jpg')

save_crop 옵션을 사용하면 각각의 인식된 객체를 별도로 분리한다.

!yolo task=detect mode=predict model=yolov8s.pt source='/content/drive/MyDrive/Colab Notebooks/yolov8/1.2 image1.jpg' save_crop=True

Yolo는 anchor free detection head가 특징이라고 한다.

객체 인식을 위한 Bbox가 고정되어 있다는 의미이다.

Anchor-free

  1. Anchor-based Approaches: 전통적인 객체 탐지 알고리즘에서는 "앵커 박스(anchor boxes)" 또는 "앵커(anchor)"를 사용합니다. 이는 미리 정의된 여러 크기 및 비율의 바운딩 박스로, 신경망이 예측할 때 이들 박스를 기준으로 객체의 위치와 크기를 조절합니다. 대표적인 알고리즘으로는 Faster R-CNN이 있습니다.
  2. Anchor-free Approaches: 반면, "Anchor-free" 방식은 이러한 사전 정의된 앵커 박스를 사용하지 않습니다. 대신, 모델은 바로 객체의 위치와 크기를 예측합니다. Anchor-free 방식은 종종 훈련과 추론 과정이 더 간단하며, 때로는 성능 상의 이점도 있습니다. 대표적인 알고리즘으로는 CenterNet이 있습니다.

 

Image segmentation 관련 Yolo와 Detectron을 비교하면

YOLO (You Only Look Once) 시리즈

  • 성능과 속도: YOLO는 빠른 추론 속도를 가지며, 실시간 애플리케이션에서 널리 사용됩니다. 이전 버전들에 비해 YOLOv4는 성능을 크게 향상시켰으며, 충분한 정확도와 함께 매우 빠른 속도를 제공합니다.
  • 사용의 용이성: YOLO는 설정과 사용이 비교적 쉽습니다. 적은 수의 매개변수를 가지고 있어 튜닝이 간단하고, 다양한 환경에서도 좋은 성능을 보입니다.
  • 아키텍처: YOLO는 신경망 아키텍처와 손실 함수를 통해 객체의 바운딩 박스와 클래스를 동시에 예측합니다. 이는 단일 네트워크 패스를 통해 이루어져 속도 측면에서 이점을 가집니다.

Detectron2

  • 다양한 모델과 기능: Detectron2는 Facebook AI Research(Facebook AI 연구)에서 개발된 객체 탐지 및 세그멘테이션 플랫폼으로, 다양한 최신 모델(예: Faster R-CNN, Mask R-CNN 등)과 기능(예: Panoptic Segmentation)을 지원합니다.
  • 확장성과 유연성: Detectron2는 매우 모듈화되고 확장성 있는 디자인을 가지고 있어, 새로운 모델 또는 기능을 추가하는 것이 상대적으로 쉽습니다.
  • 리서치 중심: Detectron2는 연구 목적으로 개발되어 있어, 여러 최신 기술과 방법론을 적용하거나 테스트하는 데 유용합니다. 때문에 최신 연구결과를 빠르게 반영하고, 실험에 사용될 수 있습니다.
  • 성능: Detectron2의 모델은 높은 정확도를 제공하지만, 복잡한 아키텍처로 인해 YOLO에 비해 추론 속도가 느릴 수 있습니다.

참고로 mAP에 대해서

"Mean Average Precision" (mAP)은 객체 탐지(object detection) 또는 정보 검색(information retrieval)과 같은 작업에서 모델의 성능을 평가하는 데 사용되는 메트릭입니다. mAP는 모든 클래스에 대한 Average Precision (AP)의 평균값을 나타내며, 다양한 상황에서 정밀도와 재현율의 관계를 요약하는 방법으로 사용됩니다.

Average Precision (AP)

AP는 정밀도(precision)와 재현율(recall)의 곡선 아래 영역(area under curve, AUC)을 측정합니다. 객체 탐지에서는 각 클래스에 대해 정밀도-재현율 곡선을 그리고, 곡선 아래의 영역(AUC)을 계산하여 해당 클래스의 AP를 얻습니다. AP는 0에서 1 사이의 값을 가지며, 높은 값일수록 모델의 성능이 좋다고 판단합니다.

mAP in Object Detection

객체 탐지에서 mAP 계산은 일반적으로 다음 단계를 포함합니다:
  1. 예측과 정답 일치: 각 예측 바운딩 박스와 실제 바운딩 박스를 비교하여 일치 여부를 판단합니다. 일반적으로 Intersection over Union (IoU)를 사용하여 일치 여부를 판별합니다.
  2. 정밀도와 재현율: 각 클래스에 대해 정밀도와 재현율을 계산합니다. 여기서 정밀도는 True Positive를 양성으로 예측한 비율이고, 재현율은 실제 양성 샘플 중 모델이 양성으로 올바르게 예측한 비율입니다.
  3. AP 계산: 각 클래스별로 정밀도-재현율 곡선을 그린 후, 곡선 아래 영역을 계산하여 AP를 얻습니다.
  4. mAP 계산: 모든 클래스에 대한 AP 값을 평균내어 mAP를 계산합니다.

레이블과 컨피던스를 화면에서 없애려면

!yolo task=detect mode=predict model=yolov8s.pt source='/content/image1.jpg' hide_labels=True hide_conf=True

 

Image Segmentation

Yolov8과 Detectron2는 Panoptic Segmentation에 속한다.

명령어가 task=segment mode=yolov8s-seg.pt로 변경된다

!yolo task=segment mode=predict model=yolov8s-seg.pt source='/content/drive/MyDrive/Colab Notebooks/yolov8/1.2 image1.jpg'

동영상을 대상으로 image segmentation

!yolo task=segment mode=predict model=yolov8s-seg.pt source='/content/drive/MyDrive/Colab Notebooks/yolov8/2.1 demo.mp4'

각기 프레임 단위로 이미지 세분화가 진행된다.

video 1/1 (1308/1314) /content/drive/MyDrive/Colab Notebooks/yolov8/2.1 demo.mp4: 384x640 4 cars, 3 trucks, 9.3ms video 1/1 (1309/1314) /content/drive/MyDrive/Colab Notebooks/yolov8/2.1 demo.mp4: 384x640 4 cars, 3 trucks, 10.6ms video 1/1 (1310/1314) /content/drive/MyDrive/Colab Notebooks/yolov8/2.1 demo.mp4: 384x640 4 cars, 3 trucks, 8.9ms video 1/1 (1311/1314) /content/drive/MyDrive/Colab Notebooks/yolov8/2.1 demo.mp4: 384x640 4 cars, 3 trucks, 8.9ms video 1/1 (1312/1314) /content/drive/MyDrive/Colab Notebooks/yolov8/2.1 demo.mp4: 384x640 4 cars, 3 trucks, 8.8ms video 1/1 (1313/1314) /content/drive/MyDrive/Colab Notebooks/yolov8/2.1 demo.mp4: 384x640 4 cars, 3 trucks, 9.2ms video 1/1 (1314/1314) /content/drive/MyDrive/Colab Notebooks/yolov8/2.1 demo.mp4: 384x640 4 cars, 3 trucks, 12.3ms Speed: 0.4ms pre-process, 9.6ms inference, 2.3ms postprocess per image at shape (1, 3, 640, 640) Results saved to runs/segment/predict3

 

결과 동영상

- 같은 차량이라도 중간중간에 다른 차종으로 인식되는 경우가 있다. Sort가 이문제를 해결해 줄 수 있을까?

ONNX 포맷으로 모델 export

!yolo task=detect mode=export model=yolov8s.pt format=onnx

 

pycharm에서 실행

터미널에서 pip3 install --user  torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 설치하고

프로젝트 라이브러리에 ultralytics를 설치 이후 가능

from ultralytics import YOLO
model = YOLO("yolov8n.pt")
model.export(format="onnx")

여기서 모델은 yolov8n외에 직접 만든 모델을 사용해도 된다.

실행 결과 ONNX모델이 저장된다. onnx확장자와 pt확장자가 각기 생성된다.

 

위의 3줄을 .py파일에 담아서 python OOO.py로 실행시켜도 된다.