Yolo는 워싱턴대의 Joseph Redmon등이 주축이 되서 만든 알고리즘으로 Darknet이라는 C 기반의 딥러닝 프레임에서 만듬 (Darknet은 Tensorflow와 같은 딥러닝 프레임웍)
이후 Joseph Redmon 이 더이상 computer vision연구를 하지 않겠다고 선언한뒤 Yolo의 후속 버전은 계속 다른 사람들이 연구하게 됨
Yolo v4는 이후 Alexey Bochkoviskiy가 구현했는데, 얼마되지 않아서 glenn jocher가 Ultralytics 라는 개인 스타트업을 만들고 다시 Yolo v5를 내놓음
< 진행 절차 >
1. MS COCO Dataset으로 사전학습된 Yolov11 모델 Prediction 기능이용 시 예측에 사용할 이미지 준비
2. Colab 으로 데이터셋 업로드
3. ultralytics 패키지 설치하기
pip install ultralytics
from ultralytics import YOLO
model = YOLO('yolo11n.pt')
model.train(data='coco8.yaml', epochs=10, imgsz=640)
results = model.predict('test_image.jpg')
# 필요 라이브러리 설치
!pip install -q ultralytics
# 필요 라이브러리 가져오기
import ultralytics
ultralytics.checks()
# 테스트 데이터 다운로드하기 : test_image_dir.zip
!gdown 1WYogZUiINXsjGNFO9hCj0thW2HGTP-tM
# 압축 파일 해제하기 : test_image_dir 폴더 하위에
!unzip -qq 'test_image_dir' -d test_image_dir
# 테스트 이미지 1개 나타내기
from PIL import Image
from IPython.display import display
import os
with Image.open('/content/test_image_dir/test1.jpg') as test_image:
display(test_image) # display 함수를 사용해 이미지를 출력합니다.
# 테스트 이미지 모두 나타내기
image_dir = '/content/test_image_dir'
for file_name in os.listdir(image_dir):
file_path = os.path.join(image_dir, file_name)
# 파일 확장자가 .jpg인 경우에만 처리
if file_path.endswith('.jpg'):
with Image.open(file_path) as img:
display(img)
# 모델 가져오기
from ultralytics import YOLO
model = YOLO('yolo11n.pt')
# coco8.yaml 로 학습시키기
model.train(data='coco8.yaml', epochs=10)
model.names
print(type(model.names), len(model.names))
print(model.names)
results = model.predict(source='/content/test_image_dir/*.jpg', save=True)
# 예
import numpy as np
# 예시 클래스 인덱스 배열
cls_indices = np.array([0, 1, 0, 1, 2, 0])
# np.unique 사용, return_counts=True
unique_classes, counts = np.unique(cls_indices, return_counts=True)
print("Unique Classes:", unique_classes)
print("Counts:", counts) # return_counts=True 지정 시 빈도 수 알 수 있음
results[0].boxes.cls
.cpu().numpy()
를 통해 GPU 텐서를 CPU의 NumPy 배열로 변환한다.
np.unique에 return_counts=True
를 주어 고유한 클래스 번호와 각 클래스별 탐지 개수를 구한다.
uniq_cnt_dict에 {클래스번호: 탐지개수}
형태로 저장
import numpy as np
# 객체의 종류를 나타내는 고유값이 result.boxes.cls에 저장되어 있음 (PyTorch 텐서 형식으로)
# uniq : 고유한 클래스 인덱스 , cnt : 각 클래스의 개수
uniq, cnt = np.unique(results[0].boxes.cls.cpu().numpy(), return_counts=True) # Torch.Tensor => numpy 로 변환
uniq_cnt_dict = dict(zip(uniq, cnt))
# Yolov11모델을 그대로 사용해서 MS COCO Dataset에서 정의한 0~79값이 기본적으로 사용됨
print(f'\nclass num : counts = , {uniq_cnt_dict}')
for i, c in enumerate(results[0].boxes.cls):
class_id = int(c)
class_name = results[0].names[class_id] # 예측 클래스 이름
confidence_score = results[0].boxes.conf[i] # 예측 확률
print(f'class num: {class_id}, class name: {class_name :<12}, confidence: {confidence_score:.2f}')
# 이미지 파일을 엽니다.
with Image.open('/content/runs/detect/train22/test1.jpg') as pred_image:
display(pred_image) # display 함수를 사용해 이미지를 출력합니다.
# results 에 있는 사항을 반복문을 사용하여 다음 출력과 같이 나오도록 합니다.
import numpy as np
for idx, result in enumerate(results[:4]): # 처음 4개 이미지 결과 반복
uniq, cnt = np.unique(result.boxes.cls.cpu().numpy(), return_counts=True)
uniq_cnt_dict = dict(zip(uniq, cnt))
print(f"\n[Image {idx+1}] {{class num:counts}} = {uniq_cnt_dict}\n")
for i, c in enumerate(result.boxes.cls):
class_id = int(c)
class_name = result.names[class_id]
confidence = result.boxes.conf[i].item()
print(f"class num: {class_id} , class name: {class_name:<12} , confidence: {confidence:.2f}")
# 이미지가 저장된 폴더 경로
image_dir = '/content/runs/detect/train22'
# 폴더 내의 모든 파일을 순회
for file_name in os.listdir(image_dir):
file_path = os.path.join(image_dir, file_name)
# 파일 확장자가 .jpg인 경우에만 처리
if file_path.endswith('.jpg'):
with Image.open(file_path) as img:
display(img)