728x90
반응형

RCNN Training - classification

 

stage 1

annotation file에 groundTruth 좌표가 입력된 원본이미지에 selective search를 적용한다.

 

stage 2

1. imageNet으로 Feature Extractor pre-train시킴

 

2. Ground Truth와 ss predicted된 영역IOU가 0.5 이상인 경우만 해당 클래스로, 나머지는 Background로 fine-tuning함

 

3. gound Truth로만 학습하되, 0.3 IOU이하는 background로 설정, 0.3이상이지만 GT가 아닌 경우는 무시함

그 후 SVM으로 학습

 

# Bounding box Regression

모델의 목표는

1. SS proposal box의 중심점 좌표 (Px, Py)를 Ground Truth의 중심점의 거리 PwDx(p), PhDy(p)가 최소가 되게

2. width height의 값도 일치하도록

 

그걸 위해 모델은 Dx(p), Dy(p) 수정 예측값을 찾아야 한다.

 

Target 값은

G - P 좌표 간 거리 차이를 box Pw로 나눠준다,

 

# RCNN이 등장할 당시엔 기존 모델들에 비해 성능이 굉장히 높게 나왔다.

그러나 알고리즘이 매우 복잡함. 너무 detection시간이 느림, 학습시간도 오래 걸림

본질적으로 개별이미지 별로 2000여개씩 생성된 region 이미지를 CNN feature map 생성한다.

각기 따로노는 구성요소들 : selective search, CNN Feature Extractor, SVM, bounding box regressor로 구성된 복잡한 프로세스를 거침

 

향후 영향

- deep learning based object detection 성능 입증

- region proposal 기반 성능 입증

- detection 수행시간 줄이고 복잡하게 분리된 개별 아키텍처를 통합할 수 있는 방안 연구 매진

 

 

반응형
728x90
반응형

Regions - CNN

 

Object Localization이나 Detection 등의 핵심은 object의 위치를 찾는 것이다.

image classification과 동일한 architect(Feature Extrator-Feature Map-FC layer - Softmax class score / Annotation - bounding box regression)를 지닌다.

 

그런데 object detection은 여러개의 object가 있는 경우 중간지점을 예측하는 등 제대로 성능이 나오지 않음

그래서 있을만한 위치를 먼저 예측을 한다 -> region proposal 방식을 채택함

 

# stage 1

selective search 를 통해 2000여개의 region을 예측하고 proposal

예측이된 object는 cnn모델에 넣게됨

 

- object 내 또 각기 다른 object가 있을텐데 사이즈를 동일하게 맞춤

=> 사이즈를 맞추는 이유는 1D flattened Fully Connected input에서 각 사이즈가 명시가 되어있어야하기 때문이다

- 그런데 예측할때 각기 다른 scale로 예측되기 때문에 모양이 다르다.

- 모양을 맞추기 위해 image crop을 하면 모양이 망가진다. 늘어나거나 작아지거나....

warp로 감싼다

 

# stage 2

CNN detection을 통해 학습

Feature Extrator - Feature Map-FC layer - Softmax class score 

- extracted region을 classify 하고 각각 region을 cnn 하고 Bbox reg, SVM을 구동 => 속도가 매우 느릴 수 밖에

 

- 3차원의 feature map이 예를 들어(512, 7, 7)이 있으면 압축을 해서 1차원 Feature vector 로 만듬 => 1D flattened Fully Connected input

deep learning이 끝나고 보통은 softmax를 돌려야 하는데

classification은 svm같은 모델을 별도로 운용한다.

왜냐면 압축된 feature vector는 어차피 1차원이니깐, 그랬더니 성능이 좋았다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
728x90
반응형

- Feature Extractor Network

VGG, RESNET, INCEPTION 등

보통 imageNet dataset 기반으로 pretrained 됨

img classification model 은 원본 img보다는 size가 적지만 상대적으로는 큰 feature map이 만들어지고,

size는 점점 줄어들지만 channel(depth)의 수는 늘어남, feature map이 작아질수록 핵심적인 feature로만 추상화됨

 

- object detection network

pascal VOC / MS-COCO

Dataset 기반으로 pretrained 됨

별도의 network로 구성됨

scale 맞누는 것이나 bounding box 맞추는 것이나, classification을 하는 것

그래서 fully connected 여부나 bounding box regression를 어떻게 할건지를 조절

multiscale, feature pyramid 등 고려

 

# image Resolution, FPS, Detection 성능 상관 관계

높은 image Resolution => 높은 detection 성능 => 낮은 FPS

배열이 크기 때문에 제한된 성능으로 오랜기간 탐색

mAP <> 1/ FPS

FPS가 빨라야 하는 요구사항 => 낮은 Detection 성능

 

=> 상황에 맞게 조절해야 한다.

빠른 속도를 요구하면 precision과 fps로

 

맞추는게 중요하면 recall과 성능으로

반응형

'Computer_Science > Computer Vision Guide' 카테고리의 다른 글

3-2. RCNN Training과 Loss  (0) 2021.09.24
3-1. RCNN - region proposal 기반 OD  (0) 2021.09.24
2-6. OpenCV 영상처리  (0) 2021.09.23
2-4~5. OpenCV 개요  (0) 2021.09.21
2-3. MS-COCO DATASETS  (0) 2021.09.21
728x90
반응형

OpenCV VideoCapture클래스는 동영상을 개별 Frame으로 하나씩 read하는 기능을 제공

VideoWriter는 VideoCapture로 읽어들인 개별 Frame을 동영상 파일로 write 수행

 

Video Capture 개요

# Video Capture 객체는 생성인자로 입력 video 파일 위치를 받아 생성

cap = cv2.VideoCapture(video_input_path)

# Video Capture 객체는 입력 video 파일의 다양한 속성을 가져올수있음

cap.get(cv2.CAP_PROP_FRAME_WIDTH) # 영상 Frame 너비
cap.get(cv2.CAP_PROP_FRAME_HEIGTH) # 영상 Frame 높이
cap.get(cv2.CAP_PROP_FPS) # 영상 FPS

# Video Capture 객체의 read()는 마지막 Frame까지 차례로 Frame 읽음

while True :
	hasFrame, img_frame = cap.read()
    if not hasFrame :
    	print('더 이상 처리할 frame이 없습니다')
        break

 

VideoWriter 개요

- VideoWriter객체는 write할 동영상 파일 위치, encoding 코덱 유형, write fps수치, frame 크기를 생성자로 입력받아 이들값에 따른 도영상 write 수행

VideoWriter는 write시 특정 포맷으로 동영상을 Encoding 할수있음(DIVX, XVID, MJPG, X264, WMV1, WMV2)

# file read
cap = cv2.VideoCapture(video_input_path)
# 해당 format으로 write
codec = cv2.VideoWriter_fourcc(*'XVID')

vid_size = (round(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), round(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
vid_fps = cap.get(cv2.CAP_PROP_FPS)

# target으로 write
vid_writer = cv2.VideoWriter(video_output_path, codec, vid_fps, vid_size)

 

colab 에서 영상 다운로드

!mkdir ./data
!wget -O /content/data/Night_Day_Chase.mp4 https://github.com/chulminkw/DLCV/blob/master/data/video/Night_Day_Chase.mp4?raw=true

데이터 로드 및 확인

# 코랩 버전에서 위의 sample은 John wick이지만 실제 Video 처리는 강의와 동일하게 Night and Day로 수행. 

import cv2

video_input_path = '/content/data/Night_Day_Chase.mp4'
# linux에서 video output의 확장자는 반드시 avi 로 설정 필요. 
video_output_path = '/content/data/Night_Day_Chase_out.mp4'

cap = cv2.VideoCapture(video_input_path)
# Codec은 *'XVID'로 설정. 
codec = cv2.VideoWriter_fourcc(*'XVID')

vid_size = (round(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),round(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))) #(200, 400)
vid_fps = cap.get(cv2.CAP_PROP_FPS )
    
vid_writer = cv2.VideoWriter(video_output_path, codec, vid_fps, vid_size) 

frame_cnt = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
print('총 Frame 갯수:', frame_cnt, 'FPS:', round(vid_fps), 'Frame 크기:', vid_size)
# 총 Frame 갯수: 1383 FPS: 28 Frame 크기: (1216, 516) # w h

frame 총 갯수에서 FPS(frame per second)를 나누면 시간을 구할수있음

1383 / 28 = 약 49초의 영상길이

import time

green_color=(0, 255, 0)
red_color=(0, 0, 255)

start = time.time()
index=0
while True:
    hasFrame, img_frame = cap.read()
    if not hasFrame: # false 방지
        print('더 이상 처리할 frame이 없습니다.')
        break
        
    index += 1
    print('frame :', index, '처리 완료')
    
    # 이 frame으로 detection code가 들어감
    
    # bounding box의 예시
    #              처리할 frame   위치               색깔    
    cv2.rectangle(img_frame, (300, 100, 800, 400), color=green_color, thickness=2)

	# frame이 변할 때마다 적용 
 	caption = "frame:{}".format(index)
    cv2.putText(img_frame, caption, (300, 95), cv2.FONT_HERSHEY_SIMPLEX, 0.7, red_color, 1)
    
    vid_writer.write(img_frame)

print('write 완료 시간:', round(time.time()-start,4))
vid_writer.release()
cap.release()   

# frame : 1 처리 완료
# frame : 2 처리 완료
# frame : 3 처리 완료
# frame : 4 처리 완료
...
# frame : 1382 처리 완료
# frame : 1383 처리 완료
# 더 이상 처리할 frame이 없습니다.
# write 완료 시간: 15.5749

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
728x90
반응형

python 기반 주요 이미지 라이브러리

PIL ( python image library

주로 이미지 처리만을 위해 사용, 처리성능이 상대적으로 느림

skimage

파이썬 기반의 전반적인 컴퓨터 비전 기능 제공

사이파이 기반

오픈소스 기반의 최고 인기 컴퓨터 비전 라이브러리

컴퓨터 비전 기능 일반화에 크게 기여 ( 어려운 기능도 api 몇줄로 간단하게 구현

c++기반이지만  python도 지원 ( java, c# 도 지원

인델이 개발주도, window, linux, mac, 안드로이드, i-os 다양한 플랫폼에서 사용

방대한 컴퓨터 비전 관련 라이브러리와 손쉬운 인터페이스 제공

 

# 주의사항

imread('파일명')으로 이미지 로드하여 numpy.array로 변환

주의할 점은  이미지를 rgb가 아닌 bgr로 로딩하기 때문에 색감이 원본과 다름

그래서 cv2.cvtColor(img, cv2. COLOR_BGR2RGB)로 바꿈

 

# Windows Frame interface

os의 window frame과 바로 인터페이스 하여 사용할 수 있는 여러기능을 제공함

하지만 기능사용하려면, 생성가능한 gui 환경에서만 가능 (window gui, linux x-windows 등)

주피터 노트북 기반에서는 사용시 오류 발생

 

구 분 PIL SKimage OpenCV
library from PIL import image from skimage import io import cv2
데이터로드 image file 객체 생성 np.array np.array
로드 코드 image.open() io.imread() cv2.imread()
cv2.imwrite()
이미지 출력 plt.imshow plt.imshow plt.imshow
RGB RGB RGB BGR(imread) > RGB(imwrite)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
728x90
반응형

80개 Object category

300k의 image와 1.5million개의 object들

tensorflow object detection api 및 많은 오픈소스계열의 주요 패키지들은 coco dataset으로 pretrained모델을 제공함

 

cocodataset은 이미지 한개에 여러개 object를 가지고 있어서 타 dataset에 비해 난이도가 높다

 

반응형
728x90
반응형

# 데이터 다운로드

# pascal voc 2012 데이터를 다운로드 후 /content/data 디렉토리에 압축 해제
# DOWNLOAD시 약 3분정도 시간 소요. 아래 디렉토리가 잘 동작하지 않을 경우 https://web.archive.org/web/20140815141459/http://pascallin.ecs.soton.ac.uk/challenges/VOC/voc2012/VOCtrainval_11-May-2012.tar
!mkdir ./data

!wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
!tar -xvf VOCtrainval_11-May-2012.tar -C /content/data

- annotation과 jpegimage가 1대1로 mapping됨

# 로드 상태 확인

!ls /content/data/VOCdevkit/VOC2012
!ls /content/data/VOCdevkit/VOC2012/JPEGImages | head -n 5

# Annotations  ImageSets	JPEGImages  SegmentationClass  SegmentationObject
# 2007_000027.jpg
# 2007_000032.jpg
# 2007_000033.jpg
# 2007_000039.jpg
# 2007_000042.jpg

JPEGImages 디렉토리에 있는 임의의 이미지 보기

import cv2
import matplotlib.pyplot as plt
import os
%matplotlib inline

# 코랩 버전은 상대 경로를 사용하지 않습니다. /content 디렉토리를 기준으로 절대 경로를 이용합니다. 
# default_dir 은 /content/data 로 지정하고 os.path.join()으로 상세 파일/디렉토리를 지정합니다. 
default_dir = '/content/data'
img = cv2.imread(os.path.join(default_dir, 'VOCdevkit/VOC2012/JPEGImages/2007_000032.jpg'))
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
print('img shape:', img.shape)

plt.figure(figsize=(8, 8))
plt.imshow(img_rgb)
plt.show()

img shape : (281, 500, 3)

# annotation 확인하면 object 설정 상태 확인 =>aeroplane, aeroplane, person, person

SegmentationObject 디렉토리에 있는 있는 임의의 maksing 이미지 보기

img = cv2.imread(os.path.join(default_dir, 'VOCdevkit/VOC2012/SegmentationObject/2007_000032.png'))
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
print('img shape:', img.shape)

plt.figure(figsize=(8, 8))
plt.imshow(img_rgb)
plt.show()

Annotation xml 파일에 있는 요소들을 파싱하여 접근하기

  • ElementTree를 이용하여 XML 파싱(lxml 패키지는 이미 코랩에 설치됨. pip install lxml)
import os
import random

# 코랩 버전 절대경로 수정. 
VOC_ROOT_DIR ="/content/data/VOCdevkit/VOC2012/"
ANNO_DIR = os.path.join(VOC_ROOT_DIR, "Annotations")
IMAGE_DIR = os.path.join(VOC_ROOT_DIR, "JPEGImages")

xml_files = os.listdir(ANNO_DIR)      # list 형태로 annotataion가져옴                  
print(xml_files[:5]); print(len(xml_files)) # 확인, 개수
# ['2012_001655.xml', '2011_001699.xml', '2010_002954.xml', '2012_000123.xml', '2008_001031.xml']
# 17125
# !pip install lxml
import os
import xml.etree.ElementTree as ET
# 사이즈 로드 1) anno > size, 2) opencv array
# ground truth 형태를 가져오려면, xml은 부모자식의 수직적 형태임.
# xml을 잘 parsing하는 것은 et임

# annotation 하나 잡고, parsing 확인
xml_file = os.path.join(ANNO_DIR, '2007_000032.xml') 

# XML 파일을 Parsing 하여 Element 생성
tree = ET.parse(xml_file)
root = tree.getroot() # root node를 찾음

# image 관련 정보는 root의 자식으로 존재
image_name = root.find('filename').text # filename node를 찾음
full_image_name = os.path.join(IMAGE_DIR, image_name) # 해당filename으로 가져옴

image_size = root.find('size')
image_width = int(image_size.find('width').text)
image_height = int(image_size.find('height').text) # 숫자형으로 바꾸기까지

# 파일내에 있는 모든 object Element를 찾음.
objects_list = []
for obj in root.findall('object'):
    # object element의 자식 element에서 bndbox를 찾음. 
    xmlbox = obj.find('bndbox')

	# bndbox element의 자식 element에서 xmin,ymin,xmax,ymax를 찾고 이의 값(text)를 추출 
    x1 = int(xmlbox.find('xmin').text)
    y1 = int(xmlbox.find('ymin').text)
    x2 = int(xmlbox.find('xmax').text)
    y2 = int(xmlbox.find('ymax').text)
    
    bndbox_pos = (x1, y1, x2, y2) # 튜플형태로 저장
    class_name=obj.find('name').text
    object_dict={'class_name': class_name, 'bndbox_pos':bndbox_pos}
    objects_list.append(object_dict)

print('full_image_name:', full_image_name,'\n', 'image_size:', (image_width, image_height))

for object in objects_list:
    print(object)
    
# full_image_name: /content/data/VOCdevkit/VOC2012/JPEGImages/2007_000032.jpg 
# image_size: (500, 281)
# {'class_name': 'aeroplane', 'bndbox_pos': (104, 78, 375, 183)}
# {'class_name': 'aeroplane', 'bndbox_pos': (133, 88, 197, 123)}
# {'class_name': 'person', 'bndbox_pos': (195, 180, 213, 229)}
# {'class_name': 'person', 'bndbox_pos': (26, 189, 44, 238)}

Annotation내의 Object들의 bounding box 정보를 이용하여 Bounding box 시각화

import cv2
import os
import xml.etree.ElementTree as ET

xml_file = os.path.join(ANNO_DIR, '2007_000032.xml')

tree = ET.parse(xml_file)
root = tree.getroot()

image_name = root.find('filename').text
full_image_name = os.path.join(IMAGE_DIR, image_name)

img = cv2.imread(full_image_name)
# opencv의 rectangle()는 인자로 들어온 이미지 배열에 그대로 사각형을 그려주므로 별도의 이미지 배열에 그림 작업 수행. 
# rectangle때문에 메모리가 꼬일수가 있어서
draw_img = img.copy()
# OpenCV는 RGB가 아니라 BGR이므로 빨간색은 (0, 0, 255)
green_color=(0, 255, 0)
red_color=(0, 0, 255)

# 파일내에 있는 모든 object Element를 찾음.
objects_list = []
for obj in root.findall('object'):
    xmlbox = obj.find('bndbox')
    
    left = int(xmlbox.find('xmin').text)
    top = int(xmlbox.find('ymin').text)
    right = int(xmlbox.find('xmax').text)
    bottom = int(xmlbox.find('ymax').text)
    
    class_name=obj.find('name').text
    
    # draw_img 배열의 좌상단 우하단 좌표에 녹색으로 box 표시 
    cv2.rectangle(draw_img, (left, top), (right, bottom), color=green_color, thickness=1)
    # draw_img 배열의 좌상단 좌표에 빨간색으로 클래스명 표시
    cv2.putText(draw_img, class_name, (left, top - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.4, red_color, thickness=1)

img_rgb = cv2.cvtColor(draw_img, cv2.COLOR_BGR2RGB)
plt.figure(figsize=(10, 10))
plt.imshow(img_rgb)

 

반응형

'Computer_Science > Computer Vision Guide' 카테고리의 다른 글

2-4~5. OpenCV 개요  (0) 2021.09.21
2-3. MS-COCO DATASETS  (0) 2021.09.21
2-1. 주요 pretrained dataset  (0) 2021.09.21
1-9~10. 성능평가지표 mAP - 정밀도, 재현율  (0) 2021.09.17
1-8. Non Max Suppression  (0) 2021.09.17
728x90
반응형

PASCAL VOC

XML format

20개의 오브젝트 카테고리

MS COCO

json Format

80개의 오브젝트 카테고리

 

Google Open Images

csv Format

600개의 오브젝트 카테고리

 

* 많은 detection과 segmentation 딥러닝 패키지가 위의 dataset을 기반으로 pretrained 되어 배포됨

 

 

Annotation이란?

=> 이미지의 detection정보를 별도의 설명 파일로 제공되는 것을 일반적으로 annotation이라고 함. ( 주석, 설명

annotation은 object의 bounding box 위치나 object이름 등 특정 포맷을 제공함

<annotation>

	<folder>VOC2012</folder>
    <filename>2007_000032.jpg</filename>  # file에 대한 정보를 가짐
    <source>
    	<dataset>the VOC2007 Database</dataset>
    	<annotation>PASCAL VOC2007</annotation>
    	<image>flickr</image>
	</source>

	<size>
    	<width>500</width>
    	<height>281</height>
    	<depth>3</depth>        
	</size>    
    <segmented>1</segmented>    

	<object>                          # 개별 object 정보
    	<name>aeroplane</name>
    	<pose>Frontal</pose>
    	<truncated>0</truncated>        
    	<difficult>0</difficult>
        <bndbox>
	        <xmin>104</xmin>
	        <ymin>78</ymin>
	        <xmax>375</xmax> 
	        <ymax>183</ymax>            
        </bndbox>        
	</object>
    
    <object>
    	<name>aeroplane</name>
    	<pose>Left</pose>
    	<truncated>0</truncated>        
    	<difficult>0</difficult>
        <bndbox>
	        <xmin>104</xmin>
	        <ymin>78</ymin>
	        <xmax>375</xmax> 
	        <ymax>183</ymax>            
        </bndbox>        
	</object>    

</annotation>

VOCdevkit

- VOC2012

-- annotations : xml format이며, 개별 xml file은 1개 image에 대한 annotation 정보를 가짐. 확장자 xml을 제회한 파일명은 image file명과 동일함 mapping

-- imageset : 어떤 image를 train, test, trainval, val에 사용할 것인지에 대한 mapping 정보를 개별 object별로 파일로 가지고 있음

-- JPEGimages : detection과 segmentation에 사용될 원본 image

-- segmentationClass : semantic segmentation에 사용될 masking 이미지

-- segmentationObject : instance segmentation에 사용될 masking 이미지

 

 

 

반응형
728x90
반응형

실제 object 된 재현율recall의 변화에 따른 정밀도presion의 값을 평균한 성능수치

- IOU

- Precision Recall Curve(binary)의 면적인 Average Precision

- Confidence threshold

=> bounding box로 예측을 하였을 때 내부의 임계치, 확률값 신뢰값

=> inference time 작으면서 높은 average precision(coco ap)이면 좋다

 

정밀도는 예측한 것 중에 얼마나 맞췄는가

재현율은 실제값 중에 얼마나 맞췄는가

둘다 좋아야한다.

 

PASCAL에서는

IOU >0.5 이면 예측 성공으로 인정

 

업무에 따른 재현율과 정밀도의 상대적 중요도

- 재현율이 상대적으로 더중요한 지표인경우 실제 POSITIVE 양성인 데이터 예측을 NEGATIVE로 판단하면 큰문제가 되는 경우 => 암 진단, 금융사기 판별,

: 크든 작든 일단 실제 낌새가 있으면 건드려 봐야한다.

 

- 정밀도가 상대적으로 더중요한 지표인경우 실제 NEGATIVE 음성인 데이터 예측을 NEGATIVE로 판단하면 큰문제가 되는 경우 : 스펨메일

: 너무 건드리면 심기가 불편해짐

 

Confidence 임계값에 따른 정밀도-재현율 변화

- cs 임계값이 0.2정도일 때  후보 bbox를 만들어 낼 확률

confidence 임계값이 낮을수록 더 많은 예측 bbox를 만들게 되어 정밀도는 낮아지고 재현율은 높아짐

=> 있을법한 자신감 컷이 낮으면 '음? 이정도면 얘도 object인데?'이라서 아무거나 일단 실제값이라 해서 재현율이 높아짐, 난사를 해버리는 것이기 때문에 정밀도는 낮아진다

 

- cs 임계값이 0.8정도일 때  후보 bbox를 만들어 낼 확률

confidence 임계값이 높을수록 신중하게 예측 bbox를 만들게 되어 정밀도는 높아지고 재현율은 낮아짐

구간의 최대값을 기준으로 면적을 구하면 average precision

AP = 1/11 * ( mP(r = 0) + mP(r = 0.1) + ... + mP(r = 1) )

    = 1/11 * ( 1.0 + 1.0 + ... + 0.5 )

 

=> AP는 1개 Object에 대한 성능 수치

mAP는 여러 Object의 ap를 평균화한 것

 

COCO Challenge의 mAP

IOU를 0.5이상 고정한 PASCAL VOC와 달리 IOU를 다양한 범위로 설정하여 예측 성공 기준을 정함

IOU를 0.5부터 0.05씩 값을 증가시켜 0.95까지 해당하는 IOU별 mAP를 계산 ( step별

 

 

 

 

 

반응형

'Computer_Science > Computer Vision Guide' 카테고리의 다른 글

2-2. pascal dataset 살펴보기  (0) 2021.09.21
2-1. 주요 pretrained dataset  (0) 2021.09.21
1-8. Non Max Suppression  (0) 2021.09.17
1-7. IoU 성능평가 [colab]  (0) 2021.09.11
1-6. selective search 시각화 [colab]  (0) 2021.09.11
728x90
반응형

여러개의 bounding box가 detection되는 것은 있을만한 위치를 계속 예측하는 것이다

 

NMS는 Detected object의

max가 아닌 object를 눌러준다. suppression

 

1) detected된 bounding box별로 특정 confidence threshold 이하 bounding box는 먼저 제거( confidence score < 0.5 )

 

2) 가장 높은 confidence score를 가진 box순으로 내림차순 정렬하고 아래 로직을 모든 box에 순차적으로 적용

- 높은 confidence score인 box와 겹치는 다른 box를 모두 조사하여 IOU가 특정 threshold이상인 box를 모두 제거(IOU Threshold > 0.4)

 

3) 남아있는 box만 선택

 

=> confidence score가 높을수록, IOU threshhold가 낮을수록 box가 제거됨

 

 

 

 

 

 

 

 

 

 

 

반응형

+ Recent posts