Self-Supervised Video Transformer(CVPR'22-Oral), Kanchana Ranasinghe, Muzammal Naseer et al.를 읽고 요약&정리 한 글입니다.
⏹ Abstract
본 논문에서는 라벨링이 되지 않은 비디오 데이터를 사용하여 video transformers에 대한 self-supervised training을 제안한다.
주어진 비디오에서 다양한 spatial size와 frame rates로 local 및 global spatio-temporal view를 생성하고 action의 spatio-temporal variations에 불변(invariant)하기 위해 동일한 비디오를 나타내는 다른 특징을 matching시키는 것을 추구한다. 본 논문에서 제안하는 방식은 Self-supervised Video Transformer(SVT)에서 negative samples 또는 전용 메모리 뱅크에 대한 의존성을 완화하는 방법 중 하나이다.
또한 Transformer 모델의 유연성으로 인해 SVT는 동적으로 조정된 position encoding을 사용하여 단일 아키텍처 내에서 느린 속도의 비디오 처리를 지원하고 spatio-temporal dimension을 따라 long-term relationship modeling을 지원한다.
1️⃣ Introduction
Self-supervised learning을 통해 라벨링이 되지 않은 데이터에서 의미 있는 representations을 추출할 수 있으므로 라벨링 비용이 필요하지 않다.
최근의 Self-supervised learning 방법은 특정 vision task에 대한 supervised learning과 동등한 성능을 발휘한다. Self-supervised learning의 필요성은 annotation이 더 비싼 비디오 분석과 같은 영역에서 훨씬 더 크고 동시에, vision transformers(ViTs)의 등장과 supervised setting 내에서 video understanding을 포함한 다양한 컴퓨터 비전 작업에 ViTs을 성공적으로 채택한 것은 video domain에서의 가능성을 보여준다.
실제로 간단한 ViT backbones을 사용하는 최근 연구는 reduced compute으로 supervised video analysis에서 s convolutional neural networks(CNN)을 능가한다.
본 논문은 video transformers를 self-supervised 방식으로 학습 시키는 간단하지만 효과적인 방법을 제안한다. 이 프로세스는 spatial 및 temporal context를 supervisory signal(from unlabelled videos)로 사용하여 motion, scale 및 viewpoint invariant feature을 학습한다.
기존에 많이 사용되는 비디오에서의 self-supervised representation learning 방법은 더 큰 batch sizes, longer training regimes, careful negative mining 및 전용 memory bank가 필요한 contrastive learning objective를 사용한다. 또, contrastive objectives는 careful temporal sampling과 attract/repel loss공식을 개발하기 위해 유사하거나 다른 클립을 보는 multiple networks를 필요로 한다.
이와 대조적으로, 본 논문은 라벨링이 되지 않은 비디오에서 a twin network strategy (student-teacher models)에 의한 self-distillation을 통해 self-supervised features을 학습할 것을 제안한다.
SVT(Self-supervised Video Transformer)는 space and time attention에 따른 spatial and temporal dimensions의 representations과 일치하는 similarity objective로 student and teacher models을 학습 시킨다.
spatial size가 다르고 single video에서 서로 다른 time frame으로 샘플링 되는 spatiotemporal positive views를 생성하고(Fig 1) teacher video transformer parameters는 student video transformer의 exponential moving average으로 업데이트 된다.
이 두 네트워크 모두 동일한 비디오의 서로 다른 spatiotemporal view를 처리하며 objective function은 feature space에서 하나의 뷰를 다른 뷰에서 예측하도록 설계되었다. 이를 통해 SVT는 비디오 전반에 걸쳐 discriminative features을 생성하면서 비디오의 spatiotemporal change에 불변(invariant)하는 robust(강력한) feature를 학습할 수 있다.
SVT는 negative mining이나 large batch size에 의존하지 않으며 몇 epoch 내에 수렴하기 때문에 계산 효율성이 유지된다(Kinetics-400의 경우 약 20epoch).
위의 장점 외에도, 본 논문의 설계는 unified architecture 내에서 다양한 time-resolutions와 spatial scale를 모델링 할 수 있는 유연성을 제공한다. 이것은 실제 동작들이 다양한 시간 및 공간 세부 사항으로 발생할 수 있기 때문에 비디오 처리에 매우 필요한 기능이다.
현재의 self-supervision 기반 비디오 프레임 워크는 고정된 spatial 및 temporal scale로 작동하여 action의 expressivity(표현성)과 dynamic nature을 모델링하는 데 어려움을 초래할 수 있다.
본 논문 이러한 접근 방식에 사용되는 convolutional backbone이 다양한 temporal resolutions에 대한 adaptability이 부족하므로(fixed number of channels로 인해) 각 해상도에 대한 전용 네트워크가 필요하다는 점에 주목한다.
이 문제를 해결하기 위해 제안 된 SVT는 동적으로 조정된 positional encoding을 사용하여 동일한 아키텍처 내에서 다양한 temporal resolutions을 처리한다. 또한, SVT의 self-attention mechanism은 공간과 시간에 걸쳐 로컬 및 글로벌 long-range dependencies을 모두 포착할 수 있으며, 기존 convolutional kernel에 비해 훨씬 더 큰 receptive field를 제공한다.
◾ 본 논문의 주요 기여
- 공간과 시간에 걸쳐 다양한 fields of view(글로벌 및 로컬) 간의 spatiotemporal correspondences을 활용하여 video transformer의 self-supervised training을 위한 새로운 메커니즘을 소개한다.
- SVT의 Self-supervision은 joint motio 및 crossview correspondence learning objective를 통해 수행된다. 특히, frame rate와 spatial characteristics이 다양한 global 및 local spatiotemporal view는 latent space에서 우리의 motion 및 crossview w correspondences과 일치한다.
- 본 논문에서 제시하는 아키텍처의 독특한 property는 single video transformer를 사용하여 slow-fast의 학습과 추론을 가능하게 한다는 것이다. 이를 위해, 본 논문 sampling strategy에서 생성된 가변 frame rate input을 처리하기 위해 SVT 내에서 dynamic positional encoding을 사용할 것을 제안한다.
2️⃣ Related Work
◾ Transformers in Vision
자연어 처리(NLP) 작업에서 transformer의 초기 성공 이후, 그들은 다양한 다른 영역의 경쟁 아키텍처로 부상했다. vision task 중 초기 연구는 convolutional 및 self attention 기반 아키텍처의 조합에 초점을 맞췄다. convolution이 없는 변형에 자유로운 vision transformer(ViT)는 이미지 분류 작업에서 경쟁력 있는 성능을 달성했다. ViT를 제안하는 이전 연구가 대규모 데이터 세트에 의존했지만, 최근의 연구는 다양한 augmentation strategies을 사용하여 중간 규모 데이터 세트에서도 유사한 결과를 달성한다. 이후의 아키텍처는 또한 transformer blocks에 초점을 맞춘 ViT의 계산 효율성 향상을 탐구한다. ViT는 video classification tasks에도 채택되었다.
본 논문 dimensions 간에 separate attention을 사용하여 표준 ViT를 직접 적용한 TimeSformer backbone을 기반으로 한다.
◾ Self-supervised Learning in Images
초기 이미지 기반 self-supervised learning 작업은 useful representation이 필요한 pretext task에 초점을 맞췄다. 그러나 최근에는 contrastive methods self-supervised learning을 지배하고 있다. 이러한 접근법은 일반적으로 single sample의 두 가지 보기(transformed through augmentations)를 고려하고 representation space의 다른 모든 샘플(positives)에서 밀어내면서 다른 샘플(negative)도 함께 끌어 당긴다. 이러한 방법의 주요 단점은 positive/negative 샘플의 신중한 mining의 필요성과 대량의 negative sample(large batch sizes 또는 memory banks로 이어지는)에 대한 의존성이다.
clustering method g cluster targets을 사용하여 이를 개선하지만, alternate representations을 예측하는 최근의 회귀 기반 방법은 sample mining 및 negative sample의 필요성을 제거한다. 이미지 도메인 내에서 ViT backbone과 spatially localglobal correspondence를 예측하는 것을 탐구하고 개선을 통해 비디오 도메인으로 확장하기도 한다.
◾ Self-supervised Learning in Videos
비디오에서의 selfsupervised learning은 처음에는 비디오 영역 고유의 pretext task에 기초한 접근법에 의해 지배 되었지만 최근 연구는 이미지 영역과 유사한 contrastive losse에 더 초점을 맞추고 있다. multiple modalities에 대한 previous pretext task와 cross-modality distillation의 combination은 Evolving Losses for Unsupervised Video Representation Learning에 제시된다. SVT는 single modality 및 네트워크 내에서 self-distillation이 작동하는 방식이 다르다.
speed consistency 위해 동일한 해상도의 서로 다른 비디오 간에 contrastive loss를 사용하거나 appearance consistency를 위해 서로 다른 해상도의 동일한 비디오를 사용한다. 이러한 작업과 달리 본 논문은 spatial 및 temporal resolution 공동으로 변경하고 a predictive objective를 self-supervision으로 사용한다.
본 논문의 접근 방식은 view locality 사용하여 predictive objective와 함께 차원 간의 correspondences를 학습하는 것이다.
본 논문의 접근 방식은 차원 간의 correspondences 확장하는 spatio-temporal constraint에 초점을 맞추고, alternate view를 처리하기 위해 single shared network를 사용하며, 고유한 ViT architectural feature 활용하여 alternate view를 생성하기 위해 다양한 해상도를 추가로 결합한다.
3️⃣ Self-supervised Video Transformer (SVT)
이 섹션에서는 SVT(Self-supervised Video Transformer) 접근 방식에 대해 설명한다.
contrastive methods와 달리, 본 논문은 다양한 spatial-temporal characteristic을 가진 동일한 비디오에서 두 개의 클립을 처리하여 negative mining 또는 memory bank의 필요성을 피한다.
본 논문에서의 loss formulation은 동일한 action sequence에 대해 motion 및 spatial change에 대한 불변성을 강제하기 위해 서로 다른 클립의 representation과 maching 시킨다. 불변성을 시행하는 naive objective는 모든 representation을 동일하게 붕괴 시킬 수 있지만, 전자가 후자에 대해 보다 안정적인 target으로 작용하여 online student network의 수렴(convergence)이 discriminative representation을 학습할 수 있도록 하는 teacher-student network pair을 사용한다. 이 접근 방식은 representation에 풍부한 spatiotemporal context를 동시에 통합하는 동시에 차별성(discriminative)을 유지한다.
◾ SVT 아키텍쳐
video transformer를 사용하여 input video clip의 temporal 및 spatial dimension을 따라 separate attention을 적용한다.
비디오는 다음과 같이 X로 가정하고,
여기서 N은 the number of frame을 나타낸다.
본 논문에서 샘플링 전략을 통해 선택된 이러한 N 프레임의 하위 집합으로 clip(또는 view interchangeably이라고도 함)을 정의하고 H, W, T를 각각 샘플링 된 clip의 높이, 폭 및 프레임 수로 정의한다.
본 논문의 sampling methodology(Fig 2)는 global (g)과 local(l) spatiotemporal view의 두 가지 유형의 clip을 생성한다.
g와 l은 모두 아래와 같은
g가 있는 비디오 프레임 집합 X의 하위 집합이다.
Global view는 video’s time axis에서 무작위로 선택된 90% portion에서 가변적인 수의 프레임을 균일하게 샘플링 하여 생성된다. 낮은 프레임률(T = 8)과 높은 프레임률(T = 16)과 spatial resolution H = W = 224에서 두 개의 spatiotemporal view(g1, g2)를 생성한다.
Local view는 time axis의 1/8과 spatial axe을 따라 40% 영역을 포함하는 무작위로 선택된 비디오 영역에서 프레임을 균일하게 샘플링 하여 생성된다. 본 논문에서는 T가 {2, 4, 8, 16}에 포함되고 H = W = 96에서 고정된 spatial resolution을 가진 8개의 local spatiotemporal view를 생성한다.
구체적으로, 본 논문은 두 개의 global ((g1, g2)과 여덟 개의 local(l1, ..., l8) spatiotemporal view를 무작위로 샘플링 한다. 샘플링 된 view 내의 spatial 및 temporal dimension은 모두 원본 비디오의 것과 다르다는 점에 유의해야 한다.
본 논문은 RGB input에 대해 3으로 고정된 채널 차원 C를 소개한다. 12개의 encoder block으로 구성된 SVT는 shape(C x T x W x H)(W≤224, H≤224 및 T≤16(각 클립마다 다름))의 각 샘플링 된 클립을 처리한다.
본 논문에서 제시하는 network architecture(Fig 2)는 single architecture 내에서 학습 및 추론 단계 모두에서 이러한 다양한 resolution clip을 처리하도록 설계되었다.
학습 중에, view 내의 각 프레임을 patch로 나눈다. 최대 크기 H = W = 224 및 T = 16의 주어진 view에 대해, 각 SVT encoder block은 최대 196개의 spatial 및 16개의 temporal token을 처리하며, 각 token의 embedding dimension은 R^768이다. 본 논문에서의 view에서 spatial 및 temporal token의 maximum number는 다양한 차원 때문에 다르기 때문에 size W < 224, H < 224 및 T < 16의 view에서 누락된 토큰을 설명하기 위해 dynamic positional encoding을 배치한다. 제안 된 view의 minimum spatial 및 temporal size는 각각 H = W = 96 및 T = 2이다.
이러한 입력 공간 및 시간 토큰 외에도, 아키텍처 내의 feature vector로 single classification token을 사용한다. 이 classification token은 주어진 비디오의 spatial 및 temporal dimensions을 따라 SVT가 학습한 일반적인 feature를 나타낸다. 마지막으로, 우리는 final encoder block의 classification token에 대한 projection head로 multi-layer perceptron(MLP)을 사용한다. 우리는 projection head의 output을 f로 정의한다.
Fig 2에 설명된 바와 같이, 전반적인 접근 방식은 self-distillation를 위해 teacher-student setup을 사용한다. teacher model은 student model의 정확한 architectural replica(복제품)이다.
◾ SVT: Self-supervised Training
student and teacher model의 feature space에서 서로 다른 spatiotemporal characteristics을 가진 서로 다른 view(video clip)를 예측하여 SVT를 a self-supervised manner으로 학습한다. 이를 위해 teacher and student model을 통해 서로 다른 관점을 무작위로 선택하고 전달하는 간단한 routing 전략을 채택한다.
teacher SVT는 주어진 global spatiotemporal view를 처리하여 target 레이블로 사용되는 feature vector fgt를 생성하는 반면, student SVT는 local 및 global spatiotemporal view를 처리하여 feature vector fgs 및 f(1) ls, ..., f(8) ls를 생성하며, 이는 제안 된 loss(Eq. 1)을 통해 target feature fgt와 matching 시킨다.
각 학습 step 동안 backpropagation 통해 student model weight를 업데이트하는 동시에 teacher weight는 studen weight의 exponential moving average(EMA)으로 업데이트 된다.
비디오의 다양한 view를 예측하고자 하는 본 연구의 motivation은 motion correspondence(global to global spatiotemporal view matching)와 cross-view correspondence(local to global spatiotemporal view matching) 학습하여 비디오의 기본 분포를 정의하는 contextual information을 모델링 하는 데 있다(Fig 1).
이는 모델을 motion, scale 및 viewpoint에 불변하게 만든다.
따라서, self-supervised video representation learning approach은 self-distillation mechanism을 사용하여 동일한 비디오에서 서로 다른 시공간 view의 feature representation 사이의 격차를 줄이는 것에 달려 있다.
다음으로, motion correspondence 및 cross-view correspondence이 학습되는 방법을 설명하고, 이어서 loss formulation을 설명한다.
- Motion Correspondences
비디오의 defining characteristic은 frame rate이다. frame rate를 변경하면 미묘한 동작(예: 걷기 동작의 미묘한 신체 움직임)을 제어하면서 비디오의 motion context(예: 천천히 걷는 것 vs 빨리 걷는 것)를 변경할 수 있다.
일반적으로 clip은 고정 frame rate로 비디오에서 샘플링 된다. 그러나 frame rate가 다양한 두 개의 클립(각 클립의 총 프레임 수가 서로 다름)이 주어지면 feature space에서 하나를 다른 클립으로 예측하는 것은 프레임에 걸친 개체의 motion correspondences(MC)을 모델링 하는 것을 포함한다.
또한, 높은 frame rate에서 포착된 미묘한 움직임을 예측하면 모델이 낮은 frame rate 입력에서 모션 관련 상황 정보를 학습하게 된다. 본 논문은 global spatiotemporal view와 global을 matching 시킴으로써 desired property 학습에 모델링 한다.
- Cross-View Correspondences
본 논문의 training strategy은 motion correspondence을 학습하는 것 외에도 cross-view correspondences(CVC) 학습하여 spatiotemporal variations에 걸친 관계를 모델링 하는 것을 목표로 한다.
cross-view correspondence은 student SVT에 의해 처리된 local spatiotemporal view를 teacher SVT 모델(fgt)에 의해 처리된 global spatiotemporal view representation과 matching 시킴으로써 학습된다.
local view는 spatial 및 temporal dimension을 따라 제한된 부분의 비디오를 다룬다. latent space의 local spatiotemporal view에서 비디오의 global spatiotemporal view을 예측하는 것은 a)모델이 주어진 spatial crop의 가능한 이웃의 형태의 spatial context와 b)가능한 이전 또는 미래의 형태의 temporal context를 모델링 하여 높은 수준의 맥락 정보를 학습하도록 강요하는 것이다.
crossview correspondence에서, 본 논문 similarity objective(Eq3)에 의해 local view의 모든 프레임을 사용하여 global view frame을 예측한다.
- Dynamic Positional Embedding
Vision transformers는 입력을 token의 sequence로 변환하므로 효율적인 병렬 처리를 가능하게 한다. Positional encoding은 이러한 sequence의 순서를 모델링 하는 데 사용된다. 흥미롭게도 Positional encoding을 통해 ViT는 누락된 token에 대한 positional embedding을 보간하여 variable input resolution(가변 입력 해상도)를 처리할 수 있다.
앞에서 언급한 바와 같이, motion 및 cross-view correspondence은 다양한 spatial 및 temporal resolution을 포함하여 학습 중에 가변적인 spatial 및 temporal 입력 token을 생성한다. 제안 된 학습 메커니즘에서 다양한 spatial 및 temporal token을 수용함으로써 유리한 positional encoding의 특성을 사용한다.
이를 구현함에 있어, 학습 중에 spatial 및 temporal dimension에 대해 separate positional encoding vector를 사용하고 이러한 벡터를 각 차원에 걸쳐 가장 높은 해상도로 고정한다. positional encoding은 학습된 벡터이다. 낮은 frame rate 또는 spatial size에서 누락된 spatial 및 temporal 토큰을 설명하기 위해 학습 중 보간을 통해 positional encoding 벡터를 변경한다. 이를 통해 single SVT model은 다양한 해상도의 입력을 처리하는 동시에 positional encoding을 제공하여 downstream task의 다양한 크기 입력에 더 적합하다.
downstream task에 대한 slowfast inference 동안, positional encoding은 모든 view에서 사용되는 최대 프레임 수와 spatial resolution로 보간된다. 학습된 positional encoding이 샘플링 된 프레임의 상대적 순서를 나타내기 위해 프레임 번호에 암묵적으로 연결된다는 점에 주목한다.
다양한 frame rate의 view를 고려할 때 정확한 타임 스탬프(frame rate 정보)를 인코딩하지 않는다. frame rate를 차별화하지 않더라도 프레임 순서를 cuing하면 SVT 학습에 충분하다고 가정한다.
- Augmentations
샘플링 전략(temporal dimension augmentations) 외에도 spatial dimension에 표준 image augmentation을 적용한다. 즉, 각 view에 대해 샘플링 된 개별 프레임에 augmentation이 적용된다.
무작위로 선택된 동일한 augmentation이 single view에 속하는 모든 프레임에 동일하게 적용되는 시간적으로 일관된 spatial augmentations을 따른다. 사용된 표준 augmentation은 random color jitter, gray scaling, Gaussian blur 및 solarization을 포함한다.
또한 flip equivariant classes를 포함하지 않는 데이터 세트에 random horizontal flips을 적용한다(e.g., walking left to right).
◾ STV Loss
feature space 내에서 제안 된 spatiotemporal view를 matching 시킴으로써 motion 및 cross-view correspondence을 시행한다.
구체적으로, 다음 objective인 Eq(1)를
최소화하여 모션을 학습하기 위해 global view와 global view를 matching 시키고 crossview correspondence을 학습하기 위해 local view와 global view를 matching 시킨다.
global 및 local spatiotemporal view는 student and teacher model을 통해 해당 feature 출력 fg 및 fl을 얻는다. 이러한 feature vector는 다음과 같이 f를 얻기 위해 정규화 된다:
- Motion Correspondence Loss:
본 논문에서는 loss term(Eq 2)을 얻기 위해 student SVT에 의해 처리된 alternate global view와 비교되는 target feature 역할을 하는 teacher SVT를 통해 global view를 전달한다.
여기서 fgs 및 fgt는 각각 student 및 teacher network의 서로 다른 global spatiotemporal view의 feature output이며 [·]는 dot product operator이다.
- Cross-view Correspondence Loss:
모든 local spatiotemporal view는 student SVT 모델을 통과하고 teacher SVT 모델에서 global spatiotemporal view로 매핑되어 feature representation의 차이를 줄이고 cross-view correspondence을 학습한다(Eq 3). 여기서 합은 k개의 서로 다른 local spatiotemporal view(k = 8 모든 실험에서 일관되게 사용된)에서 수행되며 f(i)ls는 i번째 local view에 대한 feature output이다.
- Convergence:
두 개의 분리된 student teacher network를 고려할 때, 전반적인 loss인 L을 학습 가능한 parameter인 L의 함수로 볼 때, 학습 중에 trivial(사소한) solution(teacher와 student output이 항상 상수와 동일함)으로 붕괴될 우려가 있다.
그러나 본 논문에서는 다음과 같은 이유로 SVT 매개변수가 Lθ를 초과하여 최소값으로 수렴하지 않는다는 점에 주목한다:
a) EMA 업데이트 이후 SVT teacher 매개변수 업데이트가 아래의 방향이 아니다.
b) L에 대한 SVT의 gradient descent은 공동으로 작용하지 않는다.
이는 그러한 loss가 student 및 teacher network의 output에 작용하는 BYOL과 유사하다. 또한, convergence 더욱 용이하게 하기 위해 teacher output의 중심과 선명도를 사용한다.
◾ Slow-Fast Inference
Slow-Fast inference는 공간적으로는 높지만 시간적으로는 낮고 공간적으로는 낮지만 시간적으로는 해상도가 높은 두 개의 다른 비디오 클립을 사용하는 것을 말한다. 이를 통해 계산 증가를 최소화하면서 각 차원에 걸쳐 더 미세한 정보를 캡쳐할 수 있다.
최근의 방법들은 그러한 추론을 배치하지만 다른 해상도로 비디오를 처리하기 위해 multiple network architecture를 사용한다.
그러나 본 논문 dynamic positional encoding은 Fig 3에 나와 있는 것처럼 single SVT model 내에서 Slow-Fast inference를 가능하게 하며, 성능 향상을 위해 downstream task에 사용한다.
4️⃣ Conclusion
본 논문 SVT라는 self-supervised objective를 사용하여 학습된 video transformer 기반 모델을 제시한다. 입력 비디오 시퀀스가 주어지면, 본 논문의 접근 방식은 먼저 동일한 비디오에서 서로 다른 스케일과 프레임 속도로 샘플링 된 시공간적으로(spatiotemporally) 다양한 view 세트를 생성한다. 그런 다음 샘플링 된 클립 간의 모션 속성과 cross-view relationship를 모델링 하는 두 세트의 correspondence learning task를 정의한다.
구체적으로, 우리의 self-supervised objective는 student and teacher network의 잠재 된 공간에서 하나의 관점을 다른 관점에서 재구성한다. 이런 접근 방식은 학습(더 적은 iteration 내에서 수렴)이 빠르고, negative sample이나 큰 배치 사이가 필요하지 않으며, s long-range temporal dependencies를 모델링하고, dynamic slow-fast inference를 수행하여 downstream 성능을 향상 시킨다. SVT는 SOTA와 비교하여 성능이 우수한 4개의 benchmark action recognition dataset에서 평가된다.
◾ Limitations:
이 작업에서, RGB 입력 양식의 context 내에서 SVT를 탐구한다. large-scale multi-modalvideo datasets를 고려할 때, alternate modalities로 사용 가능한 추가 supervision은 현재 접근 방식에서 사용되지 않는다.
향후 연구에서, SVT가 multi-modal data source를 활용하도록 수정될 수 있는 방법을 탐구할 것이다.
논문을 읽은 후 제가 알고 있는 선에서 최대한 정리하고 요약한 글입니다. 때문에 해당 포스팅에 대한 의견 제시 및 오타 정정은 언제나 환영입니다!
늦더라도 댓글 남겨주시면 확인하겠습니다!