Search
Duplicate
👀

You Look Only Once : Unified, Real-Time Object Detection

Created
2022/04/28
Editor
Tags
Vision
논문 : You Look Only Once : Unified, Real-Time Object Detection 저자 : Joseph Redmon, Santosh Divvala, Ross Girshick, Ali Farhadi
*Object Detection : Multiple objects에서 각각의 object에 대해 Classification + Localization을 수행하는 것

0. 논문 선정 배경

Yolo는 Object detection 분야의 대표적인 real-time 모델 중 하나로, 현재 논문으로 기재된 버전은 버전4까지 나올정도로 유명한 모델입니다. 이번 기회로 여러 시리즈의 욜로 모델들을 차근차근 읽어보고 싶어 선정하게 되었습니다.

1. Introduction

사람은 이미지를 보면 어디에 무엇이 있는지 한 번에 파악할 수 있습니다. 이처럼 빠르고 정확한 인간의 시각체계와 비슷하게 작동할 수 있도록 YOLO는 single neural network로 구성되었습니다.
이전의 detection 모델들은
1) DPM(deformable parts models)
: sliding window 방식을 사용하여 이미지 전체에 대하여 간격이 존재하는 부분도 classifier가 계산
*sliding window방식 : 이미지에서 물체를 찾기 위해 window의 (크기, 비율)을 임의로 마구 바꿔가면서 모든 영역에 대해서 탐색하는 것
2) R-CNN
localizationclassification 파트가 분리 되어 있는 2-stage-detector(1. Region Proposal을 통해 Object가 있을법한 영역을 찾고, 2. CNN으로 각각의 영역으로부터 고정된 크기의 Feature Vector를 뽑아낸 후, Classification 진행)
⇒ 2개의 단계가 독립적으로 학습되기 때문에 최적화되는데에 속도가 느린 복잡한 구조
*https://ganghee-lee.tistory.com/35 : R-CNN에 대해 궁금하신 분은 이 링크를 참고하시면 좋을 것 같습니다.
YOLO는 이와 다르게, 이미지의 픽셀로부터 bounding box의 위치(coordinates), 클래스 확률(class probabilities)을 구하기까지의 일련을 절차를 하나의 회귀 문제로 재정의한 것입니다.
논문명 그대로, you only look once, 이미지를 한 번만 보면 객체를 검출할 수 있다하여 이름이 YOLO입니다.
YOLO의 이런 통합된 모델은 기존의 객체 검출 모델에 비해 여러 가지 장점이 있습니다.
1) YOLO는 매우 빠릅니다.
기존의 복잡한 객체 검출 프로세스를 하나의 회귀 문제로 변환해 단순화 하였기 때문에 실시간으로 detection이 가능해졌습니다.
YOLO 기본 네트워크는 Titan X GPU에서 배치 처리 없이 45fps, Fast YOLO는 150fps 속도를 지닐 정도로 빠른 real-time detector이며, 다른 실시간 객체 검출 모델보다 2배 이상의 mAP(mean average precision)를 갖습니다.
2) YOLO는 예측을 할 때 이미지 전체를 봅니다.
slding window와 region proposal 방식과 다르게 훈련과 테스트 단계에서 이미지 전체를 보기 때문에 주변 정보까지 포함하고 있습니다. 따라서 yolo 이전에 객체 검출 모델 중 성능이 가장 좋았던 Fast R-CNN에 비해 background error가 2배 이상 적습니다.
*background error : 물체가 없는 배경(background)에 반점이나 노이즈가 있을때 그것을 물체로 인식
3) YOLO는 물체의 일반적인 부분을 학습합니다.
다른 모델에 비해 YOLO는 훈련 단계에서 보지 못한 새로운 이미지에 대해 더 robust합니다.
ex) 자연 이미지를 학습하여 그림 이미지로 테스트할 때, YOLO의 성능은 DPM이나 R-CNN보다 월등히 뛰어납니다.
하지만 YOLO는 당시의 sota 모델들에 비해 정확도가 다소 떨어진다는 단점이 존재합니다.
YOLO는 빠르게 객체를 검출할 수 있는 반면, 작은 물체에 대해선 정확도가 떨어집니다.

2. Unified Detection

YOLO는 localizationclassification 동시에 진행하는 single neural network입니다. 따라서 end-to-end 학습이 가능하며 높은 정확도를 유지하면서 실시간 객체 검출이 가능한 모델입니다
입력 이미지를 S x S 그리드로 나눕니다. 만약 어떤 객체의 중심이 특정 그리드 셀 안에 위치한다면, 그 그리드 셀은 객체를 검출하는데에 responsible한 셀입니다.
각각의 그리드 셀은 B개의 바운딩 박스와, 각 박스에 대한 confidence score를 예측합니다.
입니다. confidence score는 다음의 식으로 나타낼 수 있습니다. 만약 그리드 셀에 물체가 없다면 값은 0이 됩니다. (P(Object)=0이기 때문)

1) confidence score 공식

IOU(intersection over union) = (실제 bounding box와 예측 bounding box의 교집합) / (실제 bounding box와 예측 bounding box의 합집합)
각 바운딩 박스는 5개(x, y, w, h, confidence score)의 예측값을 가지고 있습니다. x, y, w, h는 절대 위치가 아니라 그리드 셀 내의 상대 위치를 가져 0~1 사이의 값을 갖습니다.
(x,y) : 바운딩박스의 중심좌표(상대위치)
(w,h) : 바운딩박스의 상대 너비와 상대 높이

2) C(class에 대한 조건부확률값) 공식

<확률이 가장 높은 class = 그리드 셀의 class>
각 그리드 셀은 C(conditional class probabilities)를 예측하는데, 이는 그리드 셀 안에 객체가 있을 때 그 객체가 어떤 클래스인지 나타내는 조건부 확률값입니다. 그리드 셀에 몇 개의 바운딩 박스가 있는지와는 무관하게 하나의 그리드 셀에는 오직 하나의 클래스(class)에 대한 확률 값만을 구합니다.

3) class-specific confidence scores

테스트 단계에서 1)confidence score과 2)조건부 확률값을 곱하면 각 박스에서 클래스에 대한 구체적인 confidence score를 구할 수 있습니다. 이 score는 bounding box에 특정 클래스 객체가 나타날 확률과 예측된 bounding box가 그 클래스 객체에 얼마나 잘 맞추는지를 나타냅니다.
tensor의 크기 : S x S x (B * 5 + C)
7 x 7 x 30 == S x S x (5 x B + C)
S = 그리드 개수 : 7
5 = (cx, cy, w, h, confidence)
B = 바운딩박스 개수 : 2
C = classes : 20 (PASCAL VOC dataset) 을 사용

2.1 Network Design

CNN모델인 GoogLeNet의 네트워크 구조를 모티브로 하였고 총 24개의 conv layer와 2개의 FC layer를 포함하고 있습니다. convolutional layer은 이미지로부터 특징을 추출하고, fully connected layer은 클래스 확률과 bounding box의 좌표를 예측합니다. GoogLeNet의 인셉션 구조 대신 단순한 구조의 1 x 1 축소 계층과 3 x 3 컨볼루션 계층의 결합을 사용했습니다. 이 네트워크의 최종 아웃풋은 7 x 7 x 30 텐서입니다.
GoogLeNet을 이용하여 ImageNet classification에 사용된 weight를 가져와 fine tuning하였는데, 앞쪽 20개의 컨볼루션 레이어는 고정한 채, 뒷 단의 4개 레이어만 object detection 테스크에 맞게 학습시킵니다.
24 conv layer + 2 fc layer
20 conv layer : pretrained with 1000-class ImageNet (input image : 224 x 224)
4 conv layer + 2 fc layer : fine-truned with PASCAL VOC (input image : 448x448)
이렇게 사전 훈련된 모델은 ImageNet 2012 검증 데이터 셋에서 88%의 정확도를 기록했습니다. YOLO 연구진은 Darknet 프레임워크를 사용했습니다.
final layer는 클래스 확률과 바운딩 박스 좌표값을 예측합니다. 활성화 함수를 final layer는 linear activation function, final layer을 제외한 다른 레이어들은 leaky relu를 사용합니다.

2.2 Training

YOLO의 loss는 SSE(sum-squared error)를 기반으로 합니다. SSE가 최적화가 쉽지만 SSE를 최적화하는 것이 YOLO의 최종 목적인 mAP를 높이는 것과 완벽하게 일치하지는 않습니다.
YOLO의 loss에는 bounding box의 위치를 얼마나 잘 예측했는지에 대한 loss인 localization loss와 클래스를 얼마나 잘 예측했는지에 대한 loss인 classification loss가 있습니다. SSE를 최적화하는 방식은 이 두 loss의 가중치를 동일하게 취급하는데, 이는 좋은 방법이 아닙니다. 이미지 내 대부분의 그리드 셀에는 객체가 없기 때문입니다. 따라서 대부분의 그리드 셀의 confidence score=0이 되도록 학습할 수밖에 없고, 이는 모델의 불균형을 초래합니다.
이를 개선하기 위해
1 ) localization loss의 가중치를 증가
2) 객체가 존재하지 않는 bounding box의 confidence loss에 대한 가중치는 감소시켰습니다.(객체가 없는 그리드 셀의 confidence loss보다 객체가 존재하는 그리드 셀의 confidence loss의 가중치를 증가한다는 의미)
이를 위해 두 개의 파라미터인 λcoordλ_{coord}λnoobjλ_{noobj}를 사용하여 λcoord=5λ_{coord}=5, λnoobj=0.5λ_{noobj}=0.5로 가중치를 주었습니다.
λcoordλ_{coord} : bounding box 좌표(coordinate)에 대한 loss의 가중치
λnoobjλ_{noobj} : 객체가 존재하지 않는 bounding box의 confidence loss의 가중치
훈련 단계에서 사용하는 loss function은 다음과 같습니다.
1ijobj1_{ij}^{obj} : 셀 i에서 j번째 바운딩 박스 predictor가 예측에 responsible한 것인지
1iobj1_{i}^{obj} : 셀 i에서 객체가 나타났는지 (나타나면 1, 안나타나면 0)
1.
Localization loss : x, y값을 regression하는 SSE loss
2.
Localization loss : width, height값을 regression하는 SSE loss
3.
Confidence loss : object가 있는 곳의 confidence SSE loss
4.
Confidence loss : object가 없는 곳의 confidence SSE loss
5.
Classification loss : object가 있는 곳의 각 class별 SSE loss (각 셀당 1개의 class probability가 나오므로 ij가 아닌 i뿐)
⇒ grid cell에 object가 존재하는 경우의 오차 & predictor box로 선정된 경우의 오차만 학습
SSE는 큰 bounding box와 작은 boudning box에 대해 모두 동일한 가중치로 loss를 계산하는데, 작은 bounding box가 큰 bounding box보다 작은 위치 변화에 더 민감합니다. 큰 객체를 둘러싸는 bounding box는 조금 움직여도 여전히 큰 객체를 잘 감싸지만, 작은 객체를 둘러싸는 bounding box는 조금만 움직여도 작은 객체를 벗어나게 되기 때문입니다. 이를 개선하기 위해 bounding box의 너비와 높이에 square root를 취해주어 loss에 대한 가중치를 감소시켰습니다.
YOLO는 하나의 그리드 셀 당 여러 개의 bounding box를 예측합니다. 하지만, 훈련단계에서 하나의 bounding box는 하나의 객체에 대한 responsible이 있어야 하기에, 예측된 여러 bounding box 중 객체의 ground-truth에 대해 IOU가 가장 큰 것을 선택합니다. 이렇게 훈련된 bounding box predictor는 특정 크기, 비율(aspect ratios), 객체의 클래스를 전체적으로 잘 예측하게 됩니다.
과적합을 막기 위해 드롭아웃과 data augmentation을 적용하였습니다.

2.3 Inference

훈련 단계와 마찬가지로, 추론 단계에서도 테스트 이미지로부터 객체를 검출하는 데에는 하나의 신경망 계산만 하면 됩니다. 파스칼 VOC 데이터 셋에 대해서 YOLO는 한 이미지 당 98개의 bounding box를 예측해주고, 그 bounding box마다 클래스 확률(class probabilities)을 구해줍니다. YOLO는 하나의 신경망 이기 때문에 테스트 단계에서 굉장히 빠릅니다.
하지만 YOLO의 그리드 디자인은 하나의 객체를 여러 그리드 셀이 동시에 검출하는 경우가 있다는 단점이 존재합니다. 즉, 하나의 그리드 셀이 아닌 여러 그리드 셀에서 해당 객체에 대한 bounding box를 예측할 수 있습니다. 이를 다중 검출(multiple detections) 문제라고 합니다. 이런 다중 검출 문제는 non-maximal suppression방법을 통해 개선할 수 있습니다. 이를 통해 YOLO는 mAP를 2~3%가량 향상시켰습니다.
다음의 ppt 이미지를 보시면 inference 단계에 대해 더욱 이해하기 쉬우실것 같습니다.
*nms에 대한 보충 설명 자료 : https://visionhong.tistory.com/11

2.4 Limitations of YOLO

YOLO는 바운딩 박스 예측하는데에 오직 2개의 바운딩 박스와 한개의 클래스 예측만을 한다는 큰 공간적인 제약이 있습니다. 하나의 그리드 셀은 오직 하나의 객체만 검출하므로 하나의 그리드 셀에 두 개 이상의 객체가 붙어있다면 이를 잘 검출하지 못하게 됩니다. 예를 들어, 새 떼와 같이 작은 물체가 몰려 있는 경우, 하나의 그리드 셀은 오직 하나의 객체만 검출하기 때문에 여러 새 떼를 동시에 검출할 수 없습니다.
YOLO 모델은 데이터로부터 bounding box를 예측하는 것을 학습하기 때문에 훈련 단계에서 학습하지 못했던 새로운 비율의 객체를 마주하면 예측력이 떨어집니다.
YOLO 모델은 큰 bounding box와 작은 bounding box의 loss에 대해 동일한 가중치를 둔다는 단점이 있습니다. 크기가 큰 bounding box보다 크기가 작은 bounding box가 위치 변화에 따른 IOU 변화가 더 심하기 떄문에 동일한 가중치를 주어서는 안됩니다.
YOLO의 주요 error는 부정확한 localization 문제입니다.

3. Comparison to Other Detection Systems

Deformable parts models(DPM)

객체 검출 모델 중 하나인 DPM은 슬라이딩 윈도(sliding sindow)방식을 사용합니다. DPM은 분리된 파이라이프라인으로 구성되어 있습니다. 따라서 각각의 파이프라인이 특징 추출(feature extraction), 영역 분류(region classification), bounding box 예측(bounding box prediction)을 수행합니다. YOLO는 이렇게 분리된 파이프라인을 단일 컨볼루션 신경망으로 대체한 모델입니다. 이 신경망은 특징 추출, 영역 분류, bounding box 예측, 비 최대 억제(non-max suppression) 등을 한 번에 처리합니다. 따라서 YOLO는 DPM보다 더 빠르고 정확한 모델입니다.

R-CNN

R-CNN과 그 변형들은 객체 검출을 위해 슬라이딩 윈도 방식 대신 region proposal 방식을 사용합니다. selective search라는 방식으로 여러 bounding box를 생성하고, 컨볼루션 신경망으로 특징을 추출하고, SVM으로 bouning box에 대한 점수를 매깁니다. 그리고 선형 모델로 bounding box를 조정하고, 비 최대 억제로 중복된 검출을 제거합니다. 이 복잡한 파이프라인의 각 단계는 독립적으로 정밀하게 튜닝해야하기 때문에 한 이미지당 40초 이상 소요될 정도로 매우 느립니다.
YOLO와 R-CNN 사이에는 몇 유사한 부분이 존재합니다. 각 그리드 셀이 bouning box를 예측하고, convolutional feature를 사용하여 그 box에 점수를 매긴다는 것이 그에 해당합니다. 그러나 YOLO는 각 그리드 셀의 공간적 제약으로 인해 동일한 객체에 대해 여러 번 검출되는 경우가 R-CNN에 비해 적습니다. 그리고 YOLO는 R-CNN에 비해 예측하는 bounding box의 개수도 훨씬 적습니다. 마지막으로 YOLO는 이 모든 작업들을 단일 모델로 수행하는 데에 강점이 있습니다.

4. Experiments

먼저 YOLO를 다른 실시간 객체 검출 모델과 비교해보겠습니다. YOLO와 R-CNN 변형(Fast R-CNN) 간의 차이점을 이해하기 위해 PASCAL VOC 2007 데이터셋에서의 에러를 조사해봤습니다. 또한 Fast R-CNN은 이 논문이 나온 당시 가장 좋은 성능을 보였던 R-CNN계열의 모델이었습니다.

4.1 Comparison to Other Real-Time Systems

객체 검출에 대한 많은 연구들은 표준 객체 검출 파이프라인을 빠르게 만드는 데 중점을 두고 있습니다. 연구진은 GPU버전의 YOLO와 30Hz 또는 100Hz에서 실행되는 DPM의 성능을 비교해보았습니다. 또한 상대 mAP와 속도를 비교하여 객체 검출 모델에서 사용할 수 있는 정확도-성능 tradeoff를 연구합니다.
Fast YOLO는 PASCAL 기준으로 가장 빠른 객체 검출 모델입니다. mAP는 57.2%로 DPM보다 실시간 객체 검출에 있어 2배 이상 정확합니다. YOLO는 실시간 성능을 유지하면서 mAP를 63.4%까지 높였습니다.
연구진은 VGG-16을 사용하여 YOLO를 훈련시켰습니다. 이 모델은 일반적인 YOLO보다 정확하지만 훨씬 속도가 느립니다. VGG-16을 사용하는 다른 객체 검출 모델과 비교하는 데에는 유용하지만 실시간 객체 검출 모델로 사용하기에는 느리기 때문에 이 논문에서는 속도가 더 빠른 모델(YOLO)에 중점을 두어 설명했습니다.
Fast DPM은 mAP를 많이 하락시키지 않으면서 DPM의 속도를 효과적으로 가속화하지만, 실시간 검출에 활용하기에는 여전히 부족한 속도를 보입니다. 또한 신경망 접근 방식에 비해 DPM의 검출 정확도가 상대적으로 낮은 편입니다.
R-CNN minus R은 selective search를 static bounding box proposal로 대체한 모델입니다. R-CNN보다는 훨씬 빠르지만, 실시간 검출에 사용하기에는 부족합니다.
Fast R-CNN은 R-CNN의 분류 단계를 가속화했지만, 이미지당 bounding box proposal를 위해 약 2초가 소요되는 selctive search에 의존합니다. 따라서 높은 mAP를 갖지만 여전히 실시간 검출에는 부족합니다.
최근의 Fast R-CNN은 bounding box proposal을 위해 selective search 대신 신경망을 사용하긴 합니다. 연구진이 테스트한 결과, 가장 정확한 모델은 초당 7프레임을 처리할 수 있었고, 약간 더 작고 정확도가 낮은 모델은 18프레임을 처리할 수 있었습니다. VGG-16 버전의 Fast R-CNN은 YOLO에 비해 mAP가 10 정도 높지만 속도가 6배 느립니다. Zeiler-Fergus Faster R-CNN은 YOLO보다 2.5배 더 느리면서 정확도도 더 낮았습니다.
아래 표는 여러 객체 검출 모델들의 정확도(mAP)와 속도(FPS)를 나타냅니다. Fast YOLO는 가장 빠른 속도를 보여주며, 다른 실시간 검출 모델에 비해 2배 더 정확합니다. YOLO는 빠른 버전보다 약 10mAP 정도 더 정확하고 초당 45프레임을 처리할 수 있어 실시간 검출 모델로 적절합니다.

4.2 VOC 2007 Error Analysis

YOLO와 최근 객체 검출 모델들간의 더 자세한 비교를 위해 VOC 2007 데이터셋을 사용하였습니다. 먼저 YOLO와 가장 높은 성능을 보이던 모델 중 하나인 Fast R-CNN을 비교해보겠습니다. 이를 위해 Diagnosing erro in object detectors 논문에 언급된 측정 방법론을 사용했습니다. 각 예측이 정확한지, 틀렸다면 어떤 erroy type인지를 분류했습니다. 기준은 다음과 같습니다.
Correct: correct class, IOU > 0.5
Localization: correct class, 0.1 < IOU < 0.5
Similar: class is similar, IOU > 0.1
Other: class is wrong, IOU > 0.1
Background: IOU < 0.1 for any object
<Fast R-CNN vs. YOLO>
위 그림은 총 20개의 class에 걸친 error type의 분석 결과를 보여줍니다. YOLO(19%)는 Fast R-CNN(8.6%)에 비해 상대적으로 큰 Localization 오류를 보입니다. 하지만 Background error에 대해서는 Fast R-CNN(13.6%)이 YOLO(4.75%)보다 큰 것을 알 수 있습니다. Background error는 이미지에 어떠한 객체도 없는데 객체가 있다고 잘못 판단하는 false positive error입니다. Fast R-CNN은 YOLO보다 Background error가 약 3배 더 큽니다.

4.3 Combining Fast R-CNN and YOLO

YOLO는 Fast R-CNN에 비해 Background error가 더 적습니다. Fast R-CNN에 YOLO를 결합함으로써 해당 오류를 제거하고 크게 성능을 향상시킬 수 있습니다. 먼저 모든 R-CNN이 예측하는 모든 bounding box에 대해 YOLO가 유사하게 예측하는지를 확인합니다. 만약 두 모델이 bounding box를 유사하게 예측한다면, YOLO의 예측 확률을 기반으로 두 bounding box가 겹치는 부분을 bounding box로 지정합니다.
VOC 2007 데이터셋에 대해 가장 성능이 좋은 Fast R-CNN은 71.8%의 mAP를 보였습니다. 여기서 Fast R-CNN에 YOLO를 결합하면 mAP가 3.5% 증가하여 75%로 향상되었습니다. 또한 연구진은 Fast R-CNN에 다른 모델들을 앙상블 해보았지만 mAP 향상의 정도가 0.3%, 0.6%에 그쳤습니다. 따라서 Fast R-CNN을 그대로 사용하는 것보다는 YOLO를 결합한 모델을 사용하면 더 좋은 성능을 기대할 수 있습니다. 자세한 사항은 아래 그림과 같습니다.

4.4 VOC 2012 Results

VOC 2012 데이터셋에서 YOLO는 57.9% mAP를 기록했습니다. 이는 VGG-16을 사용한 R-CNN의 mAP와 비슷합니다. 아래 표를 보면 YOLO의 속도가 가장 빠르고 Fast R-CNN과 YOLO를 결합한 모델이 가장 정확도가 좋은 것을 볼 수 있습니다.

4.5 Generalizability: Person Detection in Artwork

객체 검출을 위해 사용되는 데이터셋은 동일한 분포로 훈련 데이터셋과 테스트 데이터셋을 사용합니다. 하지만 실제 응용 프로그램에서는 가능한 모든 사례를 예측하기 어렵고 훈련 데이터셋과 테스트 데이터셋의 분포가 다를 수 있습니다. 이에 연구진은 각 데이터셋의 분포가 다른 경우에서의 모델 성능을 비교하기 위해 예술 작품을 활용하였습니다. 이때 Picasso 데이터셋과 People-Art 데이터셋을 사용하였으며, YOLO를 다른 객체 검출 시스템과 비교하였습니다.
아래 그림은 YOLO와 다른 객체 검출 모델의 성능을 비교한 그림입니다. R-CNN은 VOC 2007에서 높은 정확도를 보이지만 예술 작품에 대해서는 현저히 낮은 정확도를 보입니다. DPM은 VOC 2007에서 매우 높은 편의 정확도를 보이는건 아니지만 예술 작품에 대해서 정확도가 R-CNN처럼 크게 떨어지지는 않았습니다. 반면 YOLO는 VOC 2007에서도 가장 높은 정확도를 보였고, 예술 작품에 대해서도 비슷한 수준의 정확도를 유지했습니다.

5. Real-Time Detection In The Wild

YOLO는 객체를 빠르고 정확하게 검출할 수 있어 컴퓨터 비전 애플리케이션에 활용하기 이상적인 모델입니다. 연구진은 YOLO를 웹캠과 연결하여 실시간으로 객체를 얼마나 잘 검출해내는지 확인하였습니다. 이는 웹사이트(http://pjreddie.com/yolo/)를 통해 확인할 수 있습니다.

6. Conclusion

객체 검출을 위한 통합 모델인 YOLO에 대해 소개했습니다. Fast YOLO는 본문에서 가장 빠른 범용 객체 검출 모델이며, YOLO는 구성이 간단하고 실시간 물체 검출에 있어 최고의 성능을 보이는 모델입니다. 또한 새로운 도메인에도 잘 일반화되므로 훈련 단계에서 보지 못한 새로운 이미지에 대해서도 객체를 잘 검출해냅니다. 결론적으로 YOLO는 빠르고 정확한 객체 검출을 필요로하는 애플리케이션들에 사용하기 매우 이상적인 모델입니다.
참고자료 :

다음 글 읽기