본문 바로가기
AI/컴퓨터 비전

14. YOLO | 객체탐지

by 사라리24 2024. 8. 6.



1. YOLO


이미지 분류, 객체 탐지, 인스턴스 분할 작업에 사용할 수 있는 모델

 





  • 이미지 분류, 객체 탐지, 인스턴스 분할 작업에 사용할 수 있는 모델
  • YOLO는 2015년 Joseph Redmond가 처음 출시한 이후 컴퓨터 비전 커뮤니티에 의해 성장
  • 초기버전(1~4)에서의 YOLO는 Redmon가 작성한 커스텀 딥러닝 프레임워크인 Darknet에서 유지
  • YOLOv3 레포를 PyTorch로 작성하여 Ultralytics에서 YOLOv5를 출시
  • 유연한 Python 구조 덕분에 YOLOv5는 SOTA 레포가 되었음
  • Ultralytics는 2023년 1월에 YOLOv8을 출시
  • 아키텍쳐: https://docs.ultralytics.com/ko/yolov5/tutorials/architecture_description/
  •  Object Detection 문제를 regression 문제로 정의하는 것을 통해 bounding box 좌표 및 각 클래스일 확률을 계산

 

1. YOLO의 장점

* Sliding Window 방식이 아닌 CNN을 사용하여 이미지 전역의 Contextual Informaion을 얻어 학습 성능을 높임
* 일반적인 Object의 표현을 학습하기에 Domain이 달라도 높은 성능을 보임

2. YOLOv8

* Backbone, Nect, Head 로 구성
* Backbone : 전체 네트워크의 본체 파트
* Neck : Backbone과 Head를 연결
* Head: 최종 출력 생성 파트
* 이전 버전에 비해서 더 복잡한 구조를 가지고 있어 높은 정확도를 보여줄 뿐만 아니라, 빠른 속소를 보임

 

 

 

2. PascalVOC 데이터



 

1. PascalVOC 2007

* 분류와 객체 검출을 위해 만들어진 데이터셋
* 총 20개의 클래스를 가지고 있음
    * Person: person
    * Animal: bird, cat, cow, dog, horse, sheep
    * Vehicle: aeroplane, bicycle, boat, bus, car, motorbike, train
    * Indoor: bottle, chair, dining table, potted plant, sofa, tv/monitor

2.  실습준비

학습 데이터
  * train: 2501장
  * val: 2510장
  * 학습 데이터가 너무 적어서 train과 val를 합쳐서 학습시킨 후, 테스트 데이터를 검증 데이터셋으로 사용 예정

테스트 데이터
  * test: 4952장

 

 

train , val, test 데이터 다운받기


      
         !wget http://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar
         !wget http://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar



 

 

 

폴더 구조 (파이썬 로직으로 만들기)


       

        ```
        pascal_datasets
        pascal_datasets/trainval
        pascal_datasets/test
        pascal_datasets/VOC
        pascal_datasets/VOC/images
        pascal_datasets/VOC/labels
        pascal_datasets/VOC/images/train2007
        pascal_datasets/VOC/images/val2007
        pascal_datasets/VOC/images/test2007
        pascal_datasets/VOC/labels/train2007
        pascal_datasets/VOC/labels/val2007
        pascal_datasets/VOC/labels/test2007
        ```



 

 

 

폴더 경로 만들어서 데이터 넣기


       
        from pathlib import Path

        root = Path('./pascal_datasets')
        Path('./pascal_datasets/trainval').mkdir(parents=True, exist_ok=True)
        Path('./pascal_datasets/test').mkdir(parents=True, exist_ok=True)

        for path1 in ('images','labels') :
          for path2 in ('train2007','val2007','test2007') :
            new_path = root / 'VOC' / path1 / path2
            new_path.mkdir(parents=True, exist_ok=True)

 

 

 

 

tar 아카이브 파일을 지정된 디렉토리에 압축 해제


       

     
!tar -xvf VOCtrainval_06-Nov-2007.tar -C ./pascal_datasets/trainval/
      !tar -xvf VOCtest_06-Nov-2007.tar -C ./pascal_datasets/test/


 

 

3.  YOLO 포맷으로 변경

* xml에서 (xmin, ymin, xmax, ymax)을 YOLO 모델에서 사용하기 위해 포멧 변경이 필요
* YOLO 형식: (클래스번호, x의 center 좌표, y의 center 좌표, 너비, 높이)


 

Yolo 형식으로 바꿀 필요성!


 

git에서 변경사항 가져오기


       

      !git clone https://github.com/ssaru/convert2Yolo.git






 

포맷 변경


       
      %cd convert2Yolo
      %pip install -qr requirements.txt


 * 000005.txt 파일 확인



 
 * yolo 형식으로 좌표가 바뀐 것을 볼 수 있음



 

 

4.  names 파일

* 머딥러닝 모델이 데이터셋 내의 클래스를 인식하고 구분할 수 있도록 클래스 이름을 정의하는데 사용되는 파일 형식
* YOLO와 같은 유명한 객체 탐지 알고리즘을 구현하는데 사용

 

voc.names 파일 다운로드 / convert2Yolo폴더에 넣기


       




 

 

 

 trainval 데이터 yolo 포멧 변환


       
        # trainval 데이터 yolo 포멧 변환
        !python3 example.py --datasets VOC --img_path ./pascal_datasets/trainval/VOCdevkit/VOC2007/JPEGImages/ --label /content/pascal_datasets/trainval/VOCdevkit/VOC2007/Annotations/ --convert_output_path /content/pascal_datasets/VOC/labels/train2007 --img_type ".jpg" --manifest_path /content/ --cls_list_file ./voc.names






  • 경로복사

 


test 데이터 yolo 포멧 변환


       
        # test 데이터 yolo 포멧 변환
        !python3 example.py --datasets VOC --img_path ./pascal_datasets/test/VOCdevkit/VOC2007/JPEGImages/ --label /content/pascal_datasets/test/VOCdevkit/VOC2007/Annotations/ --convert_output_path /content/pascal_datasets/VOC/labels/test2007 --img_type ".jpg" --manifest_path /content/ --cls_list_file ./voc.names

 
 

 

  • 경로복사

 

 

5.  PascalVOC 제공  파일로 train, val 라벨분할

* /content/pascal_datasets/trainval/VOCdevkit/VOC2007/ImageSets/Main/val.txt
* /content/pascal_datasets/VOC/labels/train2007 파일 중 위 txt 문서에 있는 파일을 /content/pascal_datasets/VOC/labels/val2007 로 옮기기


 


       

        import shutil

        path = '/content/pascal_datasets/trainval/VOCdevkit/VOC2007/ImageSets/Main/val.txt'

        with open(path) as f:
            image_ids = f.read().strip().split()
            for id in image_ids:
                print(id)
                ori_path = '/content/pascal_datasets/VOC/labels/train2007'
                mv_path = '/content/pascal_datasets/VOC/labels/val2007'
                shutil.move(f'{ori_path}/{id}.txt', f'{mv_path}/{id}.txt')


000005
000007
000009
000016
......
009950
009954
009955
009958

 

 

6.  VOC/labels 에 맞게 images 분할

* /content/pascal_datasets/trainval/VOCdevkit/VOC2007/JPEGImages 와 
/content/pascal_datasets/test/VOCdevkit/VOC2007/JPEGImages 에서 이미지를 가져와 디렉토리에 맞게 저장


 


      

          import os

          path = '/content/pascal_datasets'

          for folder, subset in ('trainval', 'train2007'), ('trainval', 'val2007'), ('test', 'test2007'):
              ex_imgs_path = f'{path}/{folder}/VOCdevkit/VOC2007/JPEGImages'
              label_path = f'{path}/VOC/labels/{subset}'
              img_path = f'{path}/VOC/images/{subset}'
              print(subset, ": ", len(os.listdir(label_path)))
              for lbs_list in os.listdir(label_path):
                  shutil.move(os.path.join(ex_imgs_path, lbs_list.split('.')[0]+'.jpg'),
                          os.path.join(img_path, lbs_list.split('.')[0]+'.jpg'))


train2007 :  2501
val2007 :  2510
test2007 :  4952


 

 

 


3.  커스텀 데이터 준비

 

 

  • 커스텀 데이터 다운로드

custom_images.zip
0.41MB

 

 

더보기

1. 새로운 프로젝트 생성

1.

2. 라벨 정보 입력(이름과 색상 설정) -> 저장

 

3. 새로운 task 생성

 

4. 이미지 업로드

 

 

 

 

* 설정

 

5. 이미지 데이터 경계상자 라벨링

 

6. 라벨링 결과물 저장

 

7. 결과물 YOLO 포멧으로 Export

 

8.  Requests에서 다운로드

 

 

 

 

4.  YOLO 모델 불러오기

 

 

 

  git 에서  yolov5 불러오기


      
      %cd /content/
      !git clone https://github.com/ultralytics/yolov5.git


 

 

 

requirments.txt에서 설치할 pip 설치하기


       
      %cd yolov5
      %pip install -qr requirements.txt


 


import 와 환경 초기화


       
      import torch
      import utils
      display = utils.notebook_init()


 

 

 

5.  WanDB를 이용한 학습 및 평가 과정 로깅

 

  • wandb는 머신러닝/딥러닝 개발자를 위한 종합적인 보조 도구
  • 딥러닝 모델 학습할 때 학습 과정에 대해 로깅을 진행
  • 손실값의 감소하는 형태를 쉽게 파악할 수 있음
  • 팀 단위로 실험 결과를 추적할 수 있도록 해주기 때문에 웹에서 편리하게 분석이 가능
  • 사이트 : https://wandb.ai/site

 

  • 사용방법

 

 

  WanDB 설치


       
      %pip install wandb


 

 

 

설치 확인


       
      import wandb


 

 

 

로그인 하기


       
      wandb.login()


wandb: Appending key for api.wandb.ai to your netrc file: /root/.netrc
True

 

 

6.  실험의 재현성 보장

 

 

 

랜덤 시드 설정


       
        import random
        import numpy as np
        import torch  

        seed = 2024
        deterministic = True

        random.seed(seed)
        np.random.seed(seed)
        torch.manual_seed(seed)
        torch.cuda.manual_seed(seed)


        if deterministic:
            # CuDNN을 사용하는 GPU 연산에서 설정
            # True(동일한 입력에 대해 항상 동일한 결과를 보장)
            torch.backends.cudnn.deterministic = True
            # CuDNN 벤치마크 모드를 활성화
            # 입력 크기가 변경되지 않을 경우 최적의 알고리즘을 선택하여 성능을 향상
            torch.backends.cudnn.benchmark = False


 

 

 



7.  data.yaml 파일


custom_voc.yaml: Pascal voc 2007 데이터 명시 파일
custom_dataset.yaml: 직접 라벨링한 테스트 데이터 명시 파일
파일 경로: /content/yolov5/data

 

1. Custom_dataset.yaml






2. Custom_voc.yaml





 

 

 

8.  YOLOv5 가중치 파일

 

  • yolov5s.pt: 가장 작은 버전으로 경량화된 모델이며 작은 크기의 객체를 감지하거나 시스템 리소스가 제한된 환경에서 사용
  • yolov5m.pt: 중간 크기의 모델로, 기본적인 객체 탐지와 분류에 적합
  • yolov5l.pt: 큰 모델로 더 높은 정확도를 제공, 크기가 큰 객체나 복잡한 시나리오에 유용
  • yolov5x.pt: 가장 큰 모델로, 가장 높은 정확도를 목표로 함

 

 

YOLOv5 모델을 훈련시키기


       
      %cd /content/yolov5
      !python3 train.py --img 640 --batch 32 --epochs 10 --data custom_voc.yaml --weights yolov5s.pt --seed 2024


  1. python train.py는 YOLOv5의 훈련 스크립트를 실행합니다.
  2. --img 640: 입력 이미지의 크기를 640x640으로 설정합니다. YOLOv5는 이 크기의 이미지를 사용하여 훈련됩니다.
  3. --batch 32: 배치 크기를 32로 설정합니다. 한 번의 훈련 스텝에서 32개의 이미지를 사용합니다.
  4. --epochs 10: 총 10번의 에포크 동안 모델을 훈련시킵니다. 한 에포크는 전체 훈련 데이터셋을 한 번 순회하는 과정입니다.
  5. --data custom_voc.yaml: 훈련에 사용할 데이터셋의 구성을 정의하는 YAML 파일을 지정합니다. 이 파일에는 데이터셋의 경로와 클래스 정보 등이 포함되어 있습니다.
  6. --weights yolov5s.pt: 사전 훈련된 YOLOv5s (small) 모델 가중치를 사용합니다. 이 가중치는 훈련 시작 시 모델의 초기 상태로 사용됩니다.
  7. --seed 2024: 훈련의 재현성을 보장하기 위해 랜덤 시드를 2024로 설정합니다. 동일한 시드를 사용하면 동일한 훈련 결과를 얻을 수 있습니다.
 /content/yolov5 디렉토리로 이동한 후,
train.py 스크립트를 실행하여 YOLOv5 모델을 지정된 파라미터로 훈련시키는 명령입니다.
훈련 과정은 입력 이미지 크기, 배치 크기, 에포크 수, 데이터셋 구성 파일, ㅠ사전 훈련된 가중치, 랜덤 시드를 사용하여 설정됩니다.

 

9. mAP(mean Average Precision)

 

 

  • Precision(정밀도) : 모델이 검출한 객체 중에서 실제로 객체인 비율
    • True Positive(PT) : 올바르게 검출한 객체
    • False Postive(FP) : 잘못 검출한 객체
  • Recall(재현율) : 실제 객체 중에서 모델이 올바르게 검출한 비율
    • False Negative(FN) : 검출하지 못한 객체
  • Average Precision(AP)
    • Precision과 Recall의 관계를 나타내는 Precision-Recall 곡선의 아래 면접(Area Under Curve)을 계산하여 얻
  • mean Average Precision(mAP)
    • 다양한 객체 클래스에 대해 AP를 평균한 값
    • 예) 클래스 1: AP = 0.75
            클래스 2: AP = 0.85
            클래스 3: AP = 0.8
            mAP = 0.75 + 0.85 + 0.8 / 3 = 0.8
    • 모델이 다양한 객체 클래스를 얼마나 잘 검출하고 있는지를 종합적으로 평가할 수 있는 중요한 지표
    • 객체 검출 모델의 성능을 비교할 때 많이 사용 -> mAP 값이 높을수록 모델의 검출 성능이 좋다는 것을 의미

 

 

Pascal VOC 테스트 데이터로 테스트하기


       
        # Pascal VOC 테스트 데이터로 테스트
        !python val.py --weights /content/yolov5/runs/train/exp/weights/best.pt --data custom_voc.yaml --img 640 --iou 0.65 --task test --half

 

 

 

 파일확인



 

 

VOC 폴더 안에 custom_dataset > obj_train_data 폴더 만들기


       





 

 

바운딩 박스 치기


       

      # 이미지들에 대한 경계상자 이미지 생성
      !python detect.py --weights /content/yolov5/runs/train/exp/weights/best.pt --img 640 --conf 0.25 --source /content/pascal_datasets/VOC/custom_datasets/obj_train_data


 

 

생성된 detect 폴더에서 바운딩 박스 확인


     






 

 

 

커스텀 이미지에서도 잘 찾아내는 것을 확인


       





 

 

 

  • 최종실행파일

1. YOLO (1).ipynb
0.82MB

 

 

'AI > 컴퓨터 비전' 카테고리의 다른 글

16. YOLO v8를 활용한 안전모 탐지  (0) 2024.08.08
15. YOLO v8을 이용한 폐질환 분류  (0) 2024.08.07
@. 과제  (0) 2024.08.05
13. Faster R-CNN | 객체 탐지  (0) 2024.07.25
12. VGG19 | 분류  (1) 2024.07.24