2022.07.01 - YOLOv5 Deep learning (1)
YOLOv5 Deep learning (1)
Object detection이란? Object Detection(객체 감지)란 컴퓨터 비전의 하위 분야 중 하나로 전체 디지털 이미지 및 비디오 내에서 유의미한 특정 객체를 감지하는 작업을 합니다. 이러한 object detection은 Imag
sunho99.tistory.com
이전 YOLOv5에 대해 간략하게 적은 글입니다. 해당 내용과 이어지며 앞 내용을 참고해주시면 감사하겠습니다.
Preview
Object detection(객체 탐지)란? 컴퓨터 비전의 하위 분야 중 하나로 전체 디지털 이미지 및 비디오 내에서 유의미한 특정 객체를 감지하는 작업을 합니다.
Yolo(You Only Look Once) Object detection이란 One-stage Object detection 모델로 입력 이미지 또는 Feature Map을 특정 grid로 나누고 각 Cell마다 Object Detection을 수행하는 것입니다.
YOLOv5 구조
Yolo 모델은 시간을 거듭할수록 점점 발전해나가고 있습니다. 저는 Yolov5 모델을 사용하며 이에 대해 공부하고 다른 블로그를 통해 공부했던 내용을 바탕으로 설명하겠습니다.
Yolov5의 구조는 다음과 같습니다. 피처(Feature)을 추출하는 backbone, 추출된 Feature을 융합하여 성능을 높이는 Neck, Feature를 바운딩 박스 파라미터로 변환하는 head와 같이 3종류의 부분으로 이뤄져 있습니다.
Backbone은 여러 층의 Convolution layer와 pooling 레이어를 통해 입력 이미지로부터 다양한 크기의 피처맵을 추출하는 부분입니다.
Convolution with Batch normalization and Leaky Relu(CBL), Cross Stage Partial(CSP), Spatial Pyramid Pooling(SPP)의 기법이 사용되었습니다.
CBL은 컨볼루셔널 레이어, 배치 정규화, Leaky-relu의 활성 함수로 이루어진 블록으로 피처를 추출하는데 기본적으로 사용되는 블록입니다.
CSP는 피처맵의 일부에만 컨볼루셔널 연산을 수행하고, 나머지 부분과 통합시키는 방법입니다. 일부의 피처맵만 컨볼루셔널 레이어를 통과시키기 때문에 연산량을 줄일 수 있고, 역전파 과정에서 그레디언트(gradient)의 흐름을 효율적으로 수행하게 되어 성능이 개선될 수 있습니다.
SSP는 피처맵을 다양한 크기의 필터로 풀링한 후 다시 합쳐줌으로써 성능 향상을 가져옵니다.
Neck 부분에서는 다양한 크기의 피처맵을 융합하는데 path aggregation network(PAN)을 사용하여 낮은 레벨의 피처와 높은 레벨의 피처를 섞어주어 성능을 향상시킵니다.
Head는 컨볼루션 레이어를 이용해 넥으로부터 출력된 피처를 네트워크의 최종 출력으로 변환해주는 부분으로 바운딩박스 파라미터(x,y,w,h), 물체가 존재할 확률, 클래스가 존재할 확률로 변환해줍니다.
이때 Yolo의 pretrained 모델은 COCO dataset으로 사전 학습이 되어있는데 Yolov5를 이용하기 위해선 COCo type의 dataset을 Yolo tpye으로 변환 시켜 줘야 합니다.
COCO dataset의 bounding box: 좌측상단의 x,y 좌표 + w,h로 구성
YOLO dataset의 bouding box: box의 중심점의 x,y + 전체이미지의 상대적 w + h
$ python3 example.py
--datasets COCO
--img_path /opt/ml/detection/dataset ##이미지 경로
--label /opt/ml/detection/dataset/valid_v3_f1.json ## 이미지의 정보를 담은 json파일 경로
--convert_output_path /opt/ml/detection/dataset ## 변환 txt를 저장할 경로
--img_type ".jpg" ## 이미지 파일의 타입
--manifest_path /opt/ml/detection/dataset ## darknet 프레임워크을 이용하여 학습할 경우에는 데이터셋의 이미지가 어디 있는지 이미지마다 파일 경로가 적혀있는 *.txt파일을 요구하게 됩니다. 해당 파라미터는 darknet 프레임워크를 위한 파라미터이지만, 불필요한 경우에 생략할 수 없으므로 무조건 적어주어야 합니다.
--cls_list_file /opt/ml/detection/dataset/name ## name이라는 txt 파일에 class name을 담아줘야 한다
이때 conver2Yolo 폴더 안에 있는 example.py를 통해 데이터를 변환 할 수 있습니다.
해당 Yolov5 절차를 한줄로 설명하자면 input -> CNN -> FC -> PT 를 반복합니다.
Yolo는 input 이미지를 S* S grid로 나눕니다. 그리고 각각의 grid cell은 bbox와 해당 박스에 대한 Confidence score를 예측합니다. 해당 Confidence score는 물체가 그 안에 포함되어 있는것과 grid가 예측하는 박스의 정확성을 측정하는 지표입니다.
Score 를 예측하는 방법은 Pr(Object) * IOU로 정의 할 수 있습니다. Pr(Object)는 바운딩 박스 안에 물체가 존재할 확률입니다.
해당 grid cell이 bbox와 Confidence score를 측정할 때 NMS를 수행하지 않으면, 아래와 같이 객체 감지 출력이 상자가 곂쳐 보일 수 있습니다.
object detection 을 제대로 수행하기 위해 특정 점수값보다 작은 boundary box를 제거하기 위해 신뢰도 임계값을 설정합니다. 이때 신뢰도 임계값을 설정 한 후 NMS를 시작하면 해당 신뢰도 임계값보다 낮은 bbox를 제거 할 수 있습니다. 신뢰 임계값이 충분히 높으면 많은 경계 상자를 제거하고 속도를 크게 향상 시킬 수 있습니다. 이후 벡터에서 최대 값을 계산하여 해당하는 클래스를 이미지 위에 박스와 함께 그려주면 됩니다.
참고:
https://danny0628.tistory.com/65
https://bigdata-analyst.tistory.com/194
https://kikaben.com/object-detection-non-maximum-suppression
https://ysbstudy.tistory.com/49
https://jjeamin.github.io/darknet_book/part1_paper/yolov1.html
'AI > Computer vision' 카테고리의 다른 글
Detectron 2 with custom dataset (0) | 2022.07.06 |
---|---|
Detectron2 공부하기 (0) | 2022.07.05 |
YOLOv5 Deep learning (1) (0) | 2022.07.01 |
COCO dataset (0) | 2022.06.27 |