<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Devbottle.log</title>
        <link>https://velog.io/</link>
        <description>넓은 세상을 올바르게 바라볼 수 있는 날까지!</description>
        <lastBuildDate>Tue, 03 Dec 2024 07:37:44 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Devbottle.log</title>
            <url>https://velog.velcdn.com/images/bottlemin_park/profile/396a877d-c360-4b2a-b498-30d2f407ae6f/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Devbottle.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/bottlemin_park" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[논문리뷰] Anomaly Detection via Reverse Distillation from One-Class Embedding ]]></title>
            <link>https://velog.io/@bottlemin_park/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Anomaly-Detection-via-Reverse-Distillation-from-One-Class-Embedding</link>
            <guid>https://velog.io/@bottlemin_park/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Anomaly-Detection-via-Reverse-Distillation-from-One-Class-Embedding</guid>
            <pubDate>Tue, 03 Dec 2024 07:37:44 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>H. Deng and X. Li, &quot;Anomaly Detection via Reverse Distillation from One-Class Embedding,&quot; <em>arXiv preprint arXiv:2201.10703</em>, 2022. [Online]. Available: <a href="https://arxiv.org/abs/2201.10703">https://arxiv.org/abs/2201.10703</a> (2022 CVPR)</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/4588062b-936f-4314-b121-5491fd6ca74a/image.png" alt=""></p>
<h2 id="introduction">INTRODUCTION</h2>
<hr>
<p>Unsupervised Anomaly Detection(UAD)에서 Knowledge Distillation(KD)은 Teacher-Student 모델을 활용하는 접근 방식이다. 이 기법은 사전 학습된 Teacher 모델의 지식을 Student 모델로 전이(transfer)하는 데 초점을 맞춘다.</p>
<p>UAD 관점에서 일반적인 Teacher-Student(T-S) 모델 전략은 다음과 같다:
학습 과정에서는 Normal 데이터만 제공하고, 추론 과정에서는 Anomalous 샘플이 입력되었을 때 Teacher와 Student 모델에서 생성한 Representation의 차이를 계산한다. 이는 Teacher 모델이 Anomalous 샘플에 대한 Representation을 생성할 수 있지만, Student 모델은 그렇지 못하다는 점에서 착안한 방법이다.</p>
<p>하지만 기존의 t-s model method는 다음과 같은 한계점을 가지고 있다.</p>
<ul>
<li>Teacher와 Student 모델의 아키텍처가 동일한 경우, 샘플을 처리하는 논리 또한 동일하기 때문에 Anomaly를 발견하기 어려울 수 있다.</li>
<li>Data Flow가 Teacher와 Student 모델에서 동일하게 구성되므로 차별화된 표현이 어렵다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/68c279f3-b184-4051-9bec-d6128532e0c7/image.png" alt=""></p>
<p>이러한 문제점을 해결하기 위해서 본 논문은 <strong>Reverse Distillation</strong>이라는 knowledge distillation에 대한 새로운 paradigm을 제시하고 있다. </p>
<p>구체적으로, Teacher Encoder와 Student Decoder를 결합하여 Heterogeneous 아키텍처를 구성한다. 이 구조에서 Student 모델은 Low-Dimensional Embedding을 입력받아 Teacher 모델의 Representation을 예측하도록 설계되었다. Regression Task 관점에서 이는 Low-Level Embedding 입력값을 통해 Teacher Representation을 재현하는 행위로 볼 수 있다.</p>
<p>reverse structures는 다음과 같은 장점을 가지고 있다.</p>
<ul>
<li>동일한 아키텍쳐를 가지지 않는 대칭성을 가지고 있다. teacher model을 down-sampling filter으로, student model을 up-sampling filter으로 삼고 있다.</li>
<li>Compact한 Embedding Vector를 생성하여 Normal 패턴을 복원한다. 이를 통해 Anomalous 요소를 제거하고 Reconstruction된 Representation이 Teacher 모델과 구별되도록 한다.</li>
<li>Autoencoder 기반 방법이 Pixel 단위 계산으로 높은 연산 비용을 요구하는 반면, Reverse Distillation은 Dense Feature 수준에서 Region 단위로 계산하여 효율성을 높인다.</li>
</ul>
<p>Reverse Distillation의 효과를 극대화하기 위해, 논문에서는 <strong>One-Class Bottleneck Embedding(OCBE)</strong>을 제안한다. OCBE는 Multi-Scale Feature Fusion(MFF) 블록과 One-Class Embedding(OCE) 블록으로 구성되며 Student Decoder와 함께 학습 가능한 구조이다. 이를 통해 High-Level Feature와 Low-Level Feature를 결합하여 풍부한 Normal 패턴 정보를 포함한 Embedding을 생성한다.</p>
<h2 id="method">METHOD</h2>
<hr>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/1858ef61-74fe-48ba-a79d-761c599e5669/image.png" alt=""></p>
<h3 id="reverse-distillation">Reverse Distillation</h3>
<p>WideResNet을 backbone으로 설정하여 Teacher encoder $D$와 Student decoder $E$는 서로 symmetric이면서 reverse한 구조를 가진다.</p>
<p>다운샘플링은 Convolutional layer를 사용해 kernel size를 1, stride를 2로 설정하여 구현하며, 업샘플링은 Deconvolutional layer를 사용해 kernel size를 2, stride를 2로 설정하여 구현한다.</p>
<p>Encoder의 feature를 decoder에서 효과적으로 학습하도록 하기 위해 multi-scale feature-based distillation을 적용한다. Neural network의 shallow layer는 color, edge, texture와 같은 low-level 정보를 담고 있으며, deep layer는 local/global semanic, structural 정보를 포함하고 있다. Teacher-Student(T-S) 모델에서 low-level 및 high-level feature 간 유사성이 낮다면, 이는 local abnormality와 지역적/전역적 구조적 이상(outlier)이 존재함을 나타낸다.</p>
<p>주어진 문장의 내용은 Teacher-Student(T-S) 모델에서 지식 전이를 수행 방법을 수학적으로 정의해보자면 다음과 같다:</p>
<ul>
<li><p>$\phi$ : 입력 데이터 $I$를 one-class bottleneck embedding 공간으로 투영하는 함수.</p>
</li>
<li><p>Teacher와 Student 모델의 k번째 계층에서 활성화(activation) 텐서를 매칭하는 방식으로 지식 전이를 수행.</p>
<ul>
<li>Teacher 모델의 $k$ 번째 계층 활성화: $f^k_E$</li>
<li>Student 모델의 $k$ 번째 계층 활성화: $f^k_D$</li>
<li>$f^k_E, f^k_D \in \mathbb{R}^{C_k \times H_k \times W_k}$<ul>
<li>( $C_k$ ): 채널 수</li>
<li>( $H_k$ ): 높이 (Height)</li>
<li>( $W_k$ ): 너비 (Width)</li>
</ul>
</li>
</ul>
</li>
<li><p>( h, w ) 위치에서의 Cosine Similarity:
$$$
\text{Cosine Similarity} = \frac{\left(f^k_E(h, w)\right)^T \cdot f^k_D(h, w)}{|f^k_E(h, w)| |f^k_D(h, w)|}
$$$  </p>
</li>
</ul>
<ul>
<li><strong>Anomaly Map $(M^k)$</strong>:<ul>
<li>Teacher와 Student의 벡터 간 유사성을 기반으로 ( k )번째 계층에서의 이상 탐지 맵을 생성.</li>
</ul>
</li>
</ul>
<p>$$$
M^k(h, w) = 1 - \frac{\left(f^k_E(h, w)\right)^T \cdot f^k_D(h, w)}{|f^k_E(h, w)| |f^k_D(h, w)|}
$$$</p>
<p>multi-scale knowledge distillation을 고려할 때, multi-scale anomaly map을 축적하여 student의 loss function을 얻도록 한다.
$$$
\mathcal{L}<em>{KD} = \sum</em>{k=1}^{K} \left{ \frac{1}{H_k W_k} \sum_{h=1}^{H_k} \sum_{w=1}^{W_k} M^k(h, w) \right}
$$$</p>
<h3 id="one-class-bottleneck-embedding">One-Class Bottleneck Embedding</h3>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/960f5791-594c-41e8-9de5-c27d78c4f50e/image.png" alt=""></p>
<p>Encoder의 마지막 embedding block에서 출력된 벡터를 바로 Decoder의 입력 벡터로 사용할 경우 다음과 같은 문제가 발생한다.</p>
<ul>
<li>Teacher 모델의 고차원 표현은 풍부한 정보를 포함하지만, redundancy와 high freedom으로 인해 Student 모델이 anomaly-free feature를 정확히 학습하지 못하게 만든다. 이러한 문제는 Student 모델이 필요하지 않은 anomaly-related feature까지 학습하게 하여, Knowledge Distillation의 효과를 저하시킬 수 있다.</li>
<li>마지막 layer에서 출력된 embedding 벡터는 high-level information을 포함하고 있기 때문에, Decoder가 이를 기반으로 low-level information(예: color, edge, texture)을 추정하는 것이 어렵다.</li>
</ul>
<p>논문에서는 이러한 문제를 해결하기 위해 학습 가능한 One-Class Embedding Block(OCBE)을 도입하여 Teacher 모델의 high-dimensional representation을 low-dimensional space로 투영하도록 한다. 이와 함께, low- 및 high-level feature를 MFF(Multi-scale Feature Fusion) block에서 concatenation하여 high-dimensional representation을 생성하도록 설계한다. </p>
<p>One-Class Embedding을 위해 다음과 같은 구조를 제안한다:</p>
<ul>
<li>하나 이상의 $(3 \times 3)$ Convolutional Layer(stride = 2)와 $(1 \times 1)$ Convolutional Layer(stride = 1)를 포함하여 down-sampling을 구현.</li>
<li>각 Layer를 통과할 때 ReLU Activation Function을 적용하며, $(1 \times 1)$ Convolutional Layer에는 추가로 Batch Normalization을 적용.</li>
</ul>
<p>OCBE를 통해 얻을 수 있는 주요 이점은 다음과 같다:</p>
<ul>
<li>High- 및 low-level feature 정보를 포함하면서도 compact한 표현이 가능하다.</li>
<li>Student 모델이 샘플의 정상 패턴(normal pattern)을 효과적으로 학습할 수 있다. 즉, Teacher 모델에서 추출한 feature를 정확히 추정할 수 있다.</li>
</ul>
<h3 id="anomaly-scoring">Anomaly Scoring</h3>
<p>실제 추론 과정에서 teacher model은 anomality에 대한 feature를 원활하게 추출해준다. 하지만, student model은 anomaly-free representation을 생성하도록 학습했기 때문에 teacher model과 다른 형태가 될 것이다. </p>
<p>T-S representation pair로부터 얻은 anomaly map $(M^k)$의 집합을 얻을 수 있다. 여기서 map안의 크기들은 k번째 feature 텐서의 point-wise anomaly를 의미한다.</p>
<p>query image에서 anomality를 localize할려면, $M^k$을 image size에 맞춰서 up-sampling이 진행되어야 한다. $\Psi$ 를 bilinear up-sampling operation으로 정의한다면, 모든 anomaly map들에 대한 pixel-wise accumulation $S_I{^q}$는 다음과 같이 표현된다.</p>
<p>$$$
S_{AL} = \sum_{i=1}^{L} \Psi(M^i).
$$$</p>
<p>up-sampling된 score map의 noise를 제거하기 위해 Gaussian filter를 적용한다.</p>
<p>$S_{AL}$에 모든 value를 평균값을 취하면 anomalous region의 value들은 score map에 대한 response가 가장 높다는 것을 확인할 수 있다. 따라서 $S_{AL}$에 최댓값을 sample-level anomaly score $S_{AD}$로 정의한다.</p>
<h2 id="expriments">EXPRIMENTS</h2>
<hr>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/54f3a4e1-8bb8-4a9d-8f14-15a2b3b7e9d2/image.png" alt=""></p>
<p>$256\times 256$의 anomality dataset에 대한 실험 결과를 TOP-2 AUROC(%)로 나타낸 것이다. Reverse Distillation method가 모든 threshold에서 높은 binary classification performance를 보여준다. </p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/763dba96-6129-4427-a5ca-f392c5e9d686/image.png" alt=""></p>
<p>anomaly localization에 대한 정량적 평가는 위와 같다. AUROC와 PRO average score 두 가지 평가 지표를 사용한 것으로 보인다. </p>
<blockquote>
<p>PRO score: <strong>anomaly regions</strong>과 <strong>예측된 이상 영역</strong> 간의 영역 기반 비교를 수행.</p>
</blockquote>
<ul>
<li>픽셀 단위가 아니라, 이상이 존재하는 특정 region의 크기와 위치가 얼마나 잘 예측되었는지를 평가.</li>
<li>실제 이상 영역 $(R_\text{GT})$과 예측 영역$(R_\text{pred})$의 <strong>Intersection over Union (IoU)</strong> 계산.</li>
</ul>
<p>AUROC는 픽셀 단위로 one-classification performance를 평가, 큰 anomality에 편향될 위험 존재.
PRO score는 IoU를 통해, localize performance 평가</p>
<p>AUROC - pixel 단위로 평가한 결과, 전반적으로 매우 좋은 성능을 냄을 확인
PRO score - transistor dataset에서 localization performance는 매우 poor함을 확인</p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/3d9620b2-7117-4d4c-a323-12a47f2c99cd/image.png" alt=""></p>
<p>공간적으로 크게 틀어지는 경우에 detection이 힘든 것을 확인</p>
<ul>
<li>student model에 들어오는 sample은 anomality이기 때문에 detection은 되지만, localization이 안되는 것을 확인</li>
<li>higher-level layer의 feature를 MFF에 넣을 때 더 높은 AUROC를 달성</li>
<li>128 $\times$ 128 으로 resizing 시킨다면 resolution이 감소하여 높은 AUROC를 달성</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[cs231n 5강]]></title>
            <link>https://velog.io/@bottlemin_park/cs231n-5</link>
            <guid>https://velog.io/@bottlemin_park/cs231n-5</guid>
            <pubDate>Tue, 14 May 2024 07:50:48 GMT</pubDate>
            <description><![CDATA[<h1 id="convolutional-neural-networks">Convolutional Neural Networks</h1>
<hr>
<h3 id="fully-connected-layer">Fully Connected Layer</h3>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/d4e4687f-be31-4821-b69e-cc11720ec96e/image.png" alt=""></p>
<p>다층으로 구성된 퍼셉트론을 주로 Fully connected layer라고 부른다.</p>
<ul>
<li>3차원 이미지를 1차원 벡터로 늘려뜨려 내적 연산을 통해 10 class로 이뤄진 activation layer에 출력한다.</li>
</ul>
<h2 id="convolution-layer">Convolution Layer</h2>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/e051d0a9-b8a4-479d-b871-bdfed67cc11b/image.png" alt=""></p>
<p>Convoluation layer는 기존의 이미지 차원을 보존하면서 filter와의 공간적 내적 (spatial convolution)을 통해 계산한다.</p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/1fb6fb31-879c-41b7-aa7a-7a94d40a6196/image.png" alt=""></p>
<p>입력 이미지와 filter를 convolve하면 1개의 숫자가 나온다. </p>
<ul>
<li>즉, filter와 입력 차원의 일부 (filter의 크기)를 내적하여 1개의 숫자가 나오게 된다. </li>
<li>1개의 숫자가 나오는 식은 $w^Tx+b$이다. 여기서 $w^Tx$는 5<em>5</em>3=75이고, b는 bias이다.</li>
</ul>
<p>만약 filter가 10번 슬라이딩(convolve)하면 10개의 숫자가 나온다. </p>
<blockquote>
<p>여기서 계산 형태가 유사함을 빌미로 Convolution이라고 지칭한거지, 실제 Convolution의 정의와는 약간의 차이가 있다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/cf3502a6-4d73-400c-b526-e5f6c33d98e9/image.png" alt=""></p>
<p>슬라이딩을 통해서 $28\times28$ 크기의 activation map이 만들어진다. 
<strong>하지만 공간적인 특징을 더 다채롭게 추출하기 위해서는 가중치가  서로 다른 $5\times{5}\times3$ 필터를 추가로 슬라이딩 해줘야한다.</strong></p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/c9f24a67-2165-4be8-a623-57330153d3a2/image.png" alt=""></p>
<p>이렇게 $5\times{5}\times3$ 필터 6개를 사용한다면, 입력 이미지와의 내적 계산이 6번 반복되므로 activation map의 크기는 $28\times{28}\times{6}$ 이다.</p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/f59b0824-f19f-4fa0-a905-81dc243af3ea/image.png" alt=""></p>
<p> $28\times{28}\times{6}$ 크기의 activation map은 다음 layer에서 입력 데이터로 취급하게 된다.</p>
<ul>
<li>필터의 크기는 <strong>depth</strong>는 입력 데이터의 depth와 동일해야한다.</li>
<li>10개의 필터를 사용할 때, 필터의 크기는 $5\times5\times10$ 이다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/568c7c94-3bed-4017-89a1-2437143a526d/image.png" alt=""></p>
<p>Convolution Layer가 깊어짐에 따라 입력 이미지의 어떠한 특징을 추출해주는지 잘 보여주는 그림이다.</p>
<ul>
<li>초반 Layer (Low-level feature) : 객체의 color &amp; edge들을 추출해준다.</li>
<li>중반 Layer (Mid-level feature) : 객체의 corner &amp; blob들을 추출해준다.</li>
<li>후반 Layer (High-level feature) : 객체의 디테일한 구조적 특징들을 추출해준다.</li>
</ul>
<blockquote>
<p>이를 통해 CNN이 계층 구조를 가지는 뉴런과 유사하다는 것을 보여준다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/d2879e7f-496f-43a5-8e36-b34e8299ba68/image.png" alt=""></p>
<p>다음 그림은 CNN이 어떻게 구성되는 지 보여주고 있다.</p>
<ul>
<li>Convolution layer에 activation function인 ReLU를 쌓고, 
activation map의 크기를 줄여주는 pooling layer를 쌓는 방식을 여러 번 진행한다.</li>
<li>마지막에 Fully connected layer를 쌓아 이미지의 클래스를 예측한다. 
(여기서 행(column)은 volume이고 열(row)은 activation map이다.)</li>
</ul>
<p><strong>filter가 어떻게 슬라이딩하는지에 따라서 출력 차원의 결과를 한 번 살펴보자</strong></p>
<h3 id="7x7-input-assume-3x3-filter">7x7 input assume 3x3 filter</h3>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/c9969523-d783-4f09-84e5-e150930f8b94/image.png" alt=""></p>
<p>filter가 입력 이미지를 어떻게 슬라이딩하는 지에 대한 예를 들어보자</p>
<ul>
<li>입력 이미지의 크기 = 7x7, 필터의 크기 = 3x3, stride(보폭) = 1</li>
<li>이렇게 슬라이딩을 하게 된다면 출력 차원은 $5\times5$가 될 것이다.</li>
</ul>
<h3 id="7x7-input-assume-3x3-filter-applied-with-stride-2">7x7 input assume 3x3 filter applied with stride 2</h3>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/b15476d0-13f6-4c41-9522-b2450f3b8f12/image.png" alt=""></p>
<p>이제부터는 filter가 2칸 씩 슬라이딩 하면서 내적 계산을 한</p>
<ul>
<li>CNN에서 중요한 것은 공간적 복잡도와 시간적 복잡도를 낮추는 것이기 때문에 2칸 씩 슬라이딩 하는 것을 자주 이용한다고 한다.</li>
</ul>
<h3 id="7x7-input-assume-3x3-filter-applied-with-stride-3">7x7 input assume 3x3 filter applied with stride 3</h3>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/08d4c384-11a3-42f6-b052-0b40d89339d3/image.png" alt=""></p>
<p>filter가 3칸 씩 슬라이딩 한다면 전체 입력 이미지를 표현할 수 없기 때문에 적용할 수 없다.</p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/32e90311-fb2e-4e0d-8eb4-8888e605c256/image.png" alt=""></p>
<p>결국 입력 차원과 filter 차원 그리고 stride에 따른 출력 차원의 크기는 다음과 같이 공식화할 수 있다.</p>
<h3 id="practice1">practice1</h3>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/13ba099c-8740-4fa6-8da8-2397132f177b/image.png" alt=""></p>
<p>1 pixel만큼 zero padding을 해주었기 때문에 입력 이미지의 크기는 $9\times9$이다.</p>
<ul>
<li>$N=9, F=3, stride=1$일 때, 출력 차원의 크기는 $7\times7$이다.</li>
</ul>
<h3 id="practice2">practice2</h3>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/f576a82d-cd46-4575-871b-aae7c14fe492/image.png" alt=""></p>
<blockquote>
<p>filter의 depth 3이 생략되어 있는데 입력 이미지의 color (RGB)를 내적하는 것은 당연하기 때문이다.</p>
</blockquote>
<p>모든 사이드에 2 pixel만큼 padding 시켜줬기 때문에 $36\times36\times3$이다.
$F=5, stride=1$이므로, 출력 차원은 $32\times32$ 이고, 이러한 필터가 10개 있으므로,
최종적으로 $32\times32\times10$이 출력된다.</p>
<p><strong>그럼 파라미터 개수는?</strong></p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/e7c66bff-320f-4d88-8702-f58e55a3549c/image.png" alt=""></p>
<p>$5\times5\times3$ filter의 파라미터 개수는 다음과 같다. 하나의 filter에 대한 파리미터 개수는 76개 이다. </p>
<p>해당 Layer에서의 전체 파라미터는 $76\times10=760$개가 된다.</p>
<h3 id="1x1-convolution-layers">1x1 convolution layers</h3>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/a2b1dd46-29c0-4c03-8f5e-3fae91179881/image.png" alt=""></p>
<p><strong>1x1xD filter의 convolution은 차원을 줄여주는 역할을 한다.</strong> </p>
<ul>
<li>84x84x64의 입력 이미지를 D개의 1x1x64 필터로 convolve하면 출력 이미지의 크기는 84x84xD이 된다. </li>
<li>D개의 1x1x64 필터는 수학적으로 FC layer와 같다.
따라서 <strong>FC layer와 D개의 1x1x64 필터는 서로 대체할 수 있다.</strong></li>
<li>다만 FC layer는 고정된 크기를 가지는 입력 이미지를 가지지만 convolution layer는 84x84과 비슷하거나 공간적으로 더 큰 입력 이미지를 받아들인다는 점이 다르다. </li>
</ul>
<h3 id="뇌뉴런-관점에서-convolution-layer">뇌/뉴런 관점에서 convolution layer</h3>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/2c343bad-9b0e-4c10-a7b9-b37dd28e03ce/image.png" alt=""></p>
<p><strong>Convolution layer는 입력 이미지를 국소적으로 여러 번 바라보고, FC layer는 입력 이미지를 전체적으로 1번 보는 것과 같다.</strong> </p>
<ul>
<li>Convolution layer는 입력 이미지를 필터와 convolution을 통해 activation map을 얻는다.<ul>
<li>입력 이미지 일부분에서 feature을 추출하므로 전체 이미지에서는 여러 개의 특징을 추출한다. <strong>따라서 이미지 확대, 축소, 이동해도 이미지의 특징을 잘 찾을 수 있다.</strong> </li>
</ul>
</li>
<li>FC layer는 32x32x3의 이미지를 3072x1의 벡터로 만든 후, 가중치 W와 내적해 1개의 숫자를 추출한다. <ul>
<li>이미지 전체 feature를 추출하므로 효과적이지 않다.</li>
</ul>
</li>
</ul>
<h2 id="pooling-layer">Pooling layer</h2>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/147c932e-25c5-414a-adbe-a1b9a634e2d1/image.png" alt=""></p>
<ul>
<li>Pooling layer는 representaions를 downsampling을 통해 공간 &amp; 시간 복잡도를 낮추도록 한다.<blockquote>
<p>주의할 점은 depth는 줄이지 못한다는 것이다. 
또한, pooling할 때 padding하지는 않는다.</p>
</blockquote>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/58253cfe-9a50-4085-98e9-4216bfe118d3/image.png" alt=""></p>
<p>filter의 크기와 stride을 선택하여 입력 이미지를 downsampling하는 것을 Max Pooling이라고 한다.</p>
<ul>
<li>filter 안에 존재하는 숫자 중 가장 큰 값을 선택하여 출력 데이터의 크기를 줄인다.
이 또한 test model의 성능을 높여주는 regularization 기법의 일종이다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/75752f80-2a98-42e4-8807-18300e3bf88d/image.png" alt="">
<img src="https://velog.velcdn.com/images/bottlemin_park/post/70bd858f-1802-4447-be69-adf9e6794abc/image.png" alt=""></p>
<p>보통의 경우에 pooling을 위한 filter의 크기와 stride의 크기는 다음과 같이 설정한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[간단 리뷰] Emerging Properties in Self-Supervised Vision Transformers]]></title>
            <link>https://velog.io/@bottlemin_park/Emerging-Properties-in-Self-Supervised-Vision-Transformers</link>
            <guid>https://velog.io/@bottlemin_park/Emerging-Properties-in-Self-Supervised-Vision-Transformers</guid>
            <pubDate>Mon, 13 May 2024 09:33:13 GMT</pubDate>
            <description><![CDATA[<p><strong>Link : <a href="https://arxiv.org/abs/2104.14294">Emerging Properties in Self-Supervised Vision Transformers</a></strong></p>
<h1 id="background">Background</h1>
<hr>
<h2 id="vit">ViT</h2>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/3768e978-f7d7-4c84-a913-d3796e8a7963/image.png" alt=""></p>
<ul>
<li>이미지를 여러 patch로 나누어 embedding 후, 각 패치를 하나의 token으로 생각하여 transformer 구조에 입력한다.
$\rightarrow$ 이후 class token을 추가하여 학습 후, FC layer를 통해 class를 예측하도록 한다.</li>
<li>CNN의 inductive bias (translation invariance 및 locality 같은 가정)을 크게 줄여줘 모델의 자유도가 높다. 대신 학습에 다량의 데이터가 필요하다.</li>
</ul>
<h2 id="knowledge-distillation-지식-증류">Knowledge Distillation (지식 증류)</h2>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/67568c27-6beb-4ffb-af69-659ba3cfdded/image.png" alt=""></p>
<ul>
<li>teacher와 student 모델을 이용해 교사의 예측 분포를 학생 모델에 전이하는 방법론</li>
<li>Soft/Hard label을 기반으로 큰 모델이 갖는 일반화 능력을 작은 모델에 전이할 수 있다.<blockquote>
<p>Soft labels : 교사 모델의 예측 분포
Hard label : 정답</p>
</blockquote>
</li>
</ul>
<h2 id="self-supervised-model">Self-supervised model</h2>
<ul>
<li>정답이 없는 상황에서 데이터 자체가 갖고 있는 특성을 기반하여 레이블이 없이 학습하는 방법론</li>
<li>Unsueprvised learning의 한 방법론, downstream task를 잘 수행할 수 있도록 하는 representation을 얻기 위함 (Representation learning)</li>
</ul>
<h1 id="dino-전체-모델">DINO 전체 모델</h1>
<hr>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/85c81546-3b23-495b-ac00-bf64c12973c5/image.gif" alt=""></p>
<blockquote>
<p>DINO 모델의 학습 과정을 보여주고 있다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/25c171b2-ae4e-41e0-81b2-2f9db44e2933/image.png" alt=""></p>
<p><strong>Fig1. Self-distillation with no labels</strong></p>
<ol>
<li>$x_1$ 와 $x_2$ 은 각각 Anchor data 그리고 positive or negative data이다.</li>
<li>오직 학생 모델에 대한 backpropagation을 진행하도록 한다.</li>
<li>학생 모델에서 하나의 epoch에 끝날 때, mini-batch를 통해 업데이트한 파라미터는 ema(exponential moving average)를 통해 교사 모델에 소폭 업데이트를 반영한다.</li>
</ol>
<blockquote>
<p><strong>교사 모델은 학생 모델들의 앙상블과 동일한 효과이므로 항상 학생 모델에 비해 더욱 높은 성능을 보인다.</strong></p>
</blockquote>
<ul>
<li><p>하나의 입력 이미지에서 큰 패치 (224 $\times$ 224)를 Global view, 작은 패치(96 $\times$ 96)를 Local view이라고 한다.</p>
<ul>
<li>학생 모델 : 모든 패치를 입력으로 활용</li>
<li>교사 모델 : Global view 패치만 입력하여 학습</li>
</ul>
</li>
<li><p>각 네트워크로부터 출력된 레이블 간의 Cross-entropy Loss를 활용해 학생 모델의 가중치($\theta_s$) 업데이트한다.</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/7b53a54a-be7f-4410-ae51-64e66406d27d/image.png" alt=""></p>
<blockquote>
<p>Dino 모델의 forward 구조</p>
</blockquote>
<p>ViT를 encoder (backbone)으로 활용하는 경우에는 Batch Normalization을 사용하지 않는다</p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/929ba78f-8a17-428d-82e7-f5d96c66e147/image.png" alt="">
<strong>Collapse를 방지하기 위해 centering과 sharpening을 동시에 사용한다</strong></p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/3e88f3fb-f2f1-4a1c-9ab7-20e6048f6cdc/image.png" alt=""></p>
<ul>
<li>complete collapse를 없애주기 위해서 교사 모델에 bias를 더해준다. 특정 dismension으로 collapse되는 것을 방지해 주지만 전체 dimension으로 uniform하게 collapse 된다.</li>
<li>Sharpening을 통해 특정 dimension의 값이 커지도록 조정하면 된다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/b61aaf48-8906-411b-8dbc-01e1872079d7/image.png" alt="">
semantic한 부분에서 attentation이 잘 되는 것을 볼 수 있다.</p>
<h1 id="acknowledge">Acknowledge</h1>
]]></description>
        </item>
        <item>
            <title><![CDATA[cs231n 4강]]></title>
            <link>https://velog.io/@bottlemin_park/cs231n-4%EA%B0%95</link>
            <guid>https://velog.io/@bottlemin_park/cs231n-4%EA%B0%95</guid>
            <pubDate>Fri, 10 May 2024 06:01:35 GMT</pubDate>
            <description><![CDATA[<h1 id="review">review...</h1>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/51d21185-1df0-4749-a298-772ed5b6dfa9/image.png" alt="">
지난 3강에서 우리는 3가지를 배웠다</p>
<ol>
<li>score vector : classifier를 통과해 나온 class의 크기</li>
<li>Loss function : 바로 분류한 결과와 실제 값의 차이를 정량적으로 확인하는 function이다.</li>
<li>regularization : model의 overfitting을 막기 위한 규제 기법</li>
</ol>
<p>세 가지 기술은 <strong>최적화 기법</strong>을 통해 모델의 파라미터 $W$를 최적화 시켜줄 수 있다. 그럴러면 $\nabla_WL$을 알아야 한다.</p>
<h1 id="1-backpropagation">1. Backpropagation</h1>
<hr>
<p>지난 강의의 마지막 부분에서 gradient를 해석적으로 계산하는 것이 더욱 정확하고 빠른 방법임을 설명을 통해 들었다. </p>
<p>그럼 다음과 같은 의문이 들 것이다.</p>
<blockquote>
<p>Neural Network의 미분 계산을 어떻게 해야하지??
미분을 통해서 어떻게 가중치를 최적화시킨다는 말인가??</p>
</blockquote>
<h2 id="computational-graph">Computational graph</h2>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/edc8f1c4-d8d8-4e5b-bbe6-ed79f924aafd/image.png" alt=""></p>
<p>f라는 함수(computation)를 하나의 노드를 표현한 Computational graph를 통해 미분 계산과, 가중치 최적화를 보기 쉽게 표현할 수 있다.</p>
<p>노드의 입력 gradient를 <strong>Upstream gradient</strong>라고 하고, 노드의 local gradient에 의한  출력 gradient를 <strong>Downstream gradient</strong>라고 한다.</p>
<p>Downstream gradient는 <strong>chain rule</strong>에 의해서 Upstream gradient 정보를 가지게 된다.</p>
<p>위 사진에서 $x$에 대한 Downstream gradient는 이렇게 표현한다.
$$
\frac{\partial{L}}{\partial{x}} = \frac{\partial{L}}{\partial{z}}\times\frac{\partial{z}}{\partial{x}}$$</p>
<h2 id="patterns-in-backward-flow">Patterns in backward flow</h2>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/3d026460-4c8d-44e9-8304-bafc3b5c86a8/image.png" alt=""></p>
<p><strong>Add gate</strong> : 입력식 그대로 출력하여 주는 방식이다.
<strong>max gate</strong> : 비교되는 두 변수 중에서 max에 해당된 변수에 gradient 값을 통과시켜준다.
<strong>mul gate</strong> : 두 변수값을 switch해준다.</p>
<h2 id="scalar-operation">Scalar operation</h2>
<h3 id="example-1">example 1</h3>
<p>$$f(x,y,z)=(x+y)z
$$
<img src="https://velog.velcdn.com/images/bottlemin_park/post/8d7d5063-ecbf-4794-94ed-45a1ba9d6123/image.png" alt=""></p>
<p>$x=-2, y=5, z=-4$라고 예시가 주어졌다고 하자</p>
<p>함수 $f$는 위의 그래프로 나타낼 수 있다.</p>
<p>이제부터 변수 $x,y,z$에 대한 gradient를 계산해야한다. 각각의 노드를 표현하게 된다면 다음과 같음 함수로 이뤄진다.</p>
<p>$$
f=qz \ q = x+y$$</p>
<p>각각의 backpropagation을 구하기 위해 chain rule를 적용하면 다음과 같이 계산된다.</p>
<h3 id="example-2">example 2</h3>
<p>$$
f(w,x)=\frac{1}{1+e^{-(w_0x_0+w_1x_1+w_2x_2)}}$$</p>
<p>에 대한 backpropagation은? 먼저 computational graph로 표현해보자
<img src="https://velog.velcdn.com/images/bottlemin_park/post/af131c66-c390-457f-9d8a-3f66484f5c1a/image.png" alt=""></p>
<blockquote>
<p>$\sigma(x)=\frac{1}{1+e^{-x}}$는 sigmoid function으로써 classification에서 쓰이는 activation function 중에 하나이다.</p>
</blockquote>
<p>** 여기서 sigmoid function에 대한 미분 계산을 사전에 정의해줄 수 있다면 계산 비용도 아낄 수 있지 않을까? **</p>
<p>$$
\frac{d\sigma(x)}{dx}=\frac{e^{-x}}{1+e^{-x}}=\Big(\frac{1+e^{-x}-1}{1+e^{-x}}\Big) \Big(\frac{1}{1+e^{-x}}\Big)=(1-\sigma(x))(\sigma(x))
$$</p>
<p>이렇게 sigmoid function을 하나의 big node로 볼 수 있다.</p>
<h2 id="vectorized-operations">Vectorized operations</h2>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/1d5798c7-7973-412d-b8ce-1b8ab04951be/image.png" alt=""></p>
<p>모든 Neural Network의 경우에는 벡터(행렬) 형식의 입력과 출력이 진행된다. 이러한 경우에서는 어떻게 backpropagation이 진행될 것인가?</p>
<p>$$
\begin{aligned}
\frac{df}{dx_1} = [\frac{df}{dx_1},; 0, ; \dots, ; 0]
\
\frac{df}{dx_2} = [0, ; \frac{df}{dx_2}, ; \dots, ; 0] \end{aligned}
$$</p>
<p>$$
\vdots%%
$$</p>
<p>$$
\begin{aligned}
\frac{df}{dx_{4096}} = [0, ; \dots, ; \frac{df}{dx_{4096}}] 
\end{aligned}
$$</p>
<p>$4096\times4096$ 크기의 Jacobian 행렬 계산을 해줘야한다.</p>
<p>사실 이 뿐만 아니라 병렬로 100개의 인풋을 받는다고 하면 input vector는 $100\times4096$이 될 것이고, Jacobian 행렬의 크기는 무려 $[409,600\times409,600]$가 될 것이다.</p>
<p><strong>그러나 행렬식을 잘 보면 Jacobian 행렬은 대각행렬이므로 굳이 행렬 전체를 계산해줄 필요가 없고, 출력에 해당된 요소에만 backpropagation을 진행해주면 된다.</strong></p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/ea57c002-31b0-4745-8106-c73d31d39e8a/image.png" alt=""></p>
<p>$$
\begin{aligned}
q=W\cdot{x}=\begin{pmatrix}
   W_{1,1}x_1+ &amp;\cdots &amp;+W_{1,n}x_n \
   &amp; \vdots \
   W_{n,1}x_1+ &amp;\cdots &amp;+W_{n,n}x_n
\end{pmatrix} \space\space  <Vector>
\end{aligned}
\ f(q)=\lVert{q}\rVert^2=q^2_1+\cdots+q^2_n \space\space  <scalar>
$$</p>
<p>요소 별($W, x$) gradient는 다음과 같이 표현된다.
$$\begin{aligned}
\frac{\partial{L}}{\partial{x}}=\frac{\partial{L}}{\partial{q}}\times \frac{\partial{q}}{\partial{x}}
\end{aligned} \
\begin{aligned}
\frac{\partial{L}}{\partial{W}}=\frac{\partial{L}}{\partial{q}}\times \frac{\partial{q}}{\partial{W}}
\end{aligned}$$</p>
<p> $\frac{\partial{L}}{\partial{q}}$은 gradient를 구하면 되는데, <strong>$\frac{\partial{q}}{\partial{x}} &amp; \frac{\partial{q}}{\partial{W}}$는 어떻게 계산해야할까?</strong></p>
<blockquote>
<p><a href="https://datascienceschool.net/02%20mathematics/04.04%20%ED%96%89%EB%A0%AC%EC%9D%98%20%EB%AF%B8%EB%B6%84.html#id9">행렬의 미분 (from data science school)</a> 
<br>$$\begin{aligned}
q=W\cdot{x}=\begin{pmatrix}
   W_{1,1}x_1+ &amp;  W_{1,2}x_2+ &amp; \cdots &amp;+W_{1,n}x_n \
   W_{2,1}x_1+ &amp;  W_{2,2}x_2+ &amp; \cdots &amp;+W_{2,n}x_n \
                  &amp;              &amp; \vdots &amp;            \
   W_{n,1}x_1+ &amp;  W_{n,2}x_2+ &amp; \cdots &amp;+W_{n,n}x_n
\end{pmatrix}
\end{aligned}
\ f(q)=\lVert{q}\rVert^2=q^2_1+\cdots+q^2_n$$
일 때, 행렬 $W$와 $x$에 대한 미분 결과는 다음과 같다.
<br>
<strong>1. $\frac{\partial{q}}{\partial{x}}$ 에 대한 미분</strong>
<br>$$
\frac{\partial{q}}{\partial{x}}=
\begin{aligned}
\begin{pmatrix}
    \frac{\partial{q}}{\partial{x_1}}\
   \frac{\partial{q}}{\partial{x_2}}\
   \vdots\
   \frac{\partial{q}}{\partial{x_n}}
\end{pmatrix}
\end{aligned}
=\begin{pmatrix}
   W_{1,1} &amp; W_{2,1} &amp; \cdots &amp; W_{n,1} \
   W_{1,2} &amp; W_{2,2} &amp; \cdots &amp; W_{n,2} \
           &amp;         &amp; \vdots &amp;         \
   W_{1,n} &amp; W_{2,n} &amp; \cdots &amp;W_{n,n} 
\end{pmatrix}
 \= W^T$$ 
 <br> <strong>2. $\frac{\partial{q}}{\partial{W}}$ 에 대한 미분</strong> 
 <br> $$
\frac{\partial{q}}{\partial{W}}=
\begin{aligned}
\begin{pmatrix}
    \frac{\partial{q}}{\partial{W_{1,1}}} 
    &amp; \frac{\partial{q}}{\partial{W_{1,2}}} 
    &amp; \cdots 
    &amp; \frac{\partial{q}}{\partial{W_{1,n}}}\
   \frac{\partial{q}}{\partial{W_{2,1}}} 
    &amp; \frac{\partial{q}}{\partial{W_{2,2}}} 
    &amp; \cdots 
    &amp; \frac{\partial{q}}{\partial{W_{2,n}}}\
    &amp; &amp; \vdots\
   \frac{\partial{q}}{\partial{W_{n,1}}} 
    &amp; \frac{\partial{q}}{\partial{W_{n,2}}} 
    &amp; \cdots 
    &amp; \frac{\partial{q}}{\partial{W_{n,n}}}\
\end{pmatrix}
\end{aligned} = \begin{aligned}
\begin{pmatrix}
    x_1 &amp; x_2 &amp; \cdots &amp; x_n \
    x_1 &amp; x_2 &amp; \cdots &amp; x_n \
           &amp;        &amp; \vdots       \
    x_1 &amp; x_2 &amp; \cdots &amp; x_n \
\end{pmatrix}
\end{aligned} 
= \begin{pmatrix}
  x_1 &amp; x_2 &amp; \cdots &amp; x_n
\end{pmatrix} = x^T$$</p>
</blockquote>
<p>행렬 미분의 법칙을 알기만 한다면 다음과 같이 계산이 가능하다</p>
<p>  $$\begin{aligned}
\frac{\partial{L}}{\partial{x}}=\frac{\partial{L}}{\partial{q}}\times \frac{\partial{q}}{\partial{x}} = \frac{\partial{L}}{\partial{q}}\space{W^T}
\end{aligned} \
\begin{aligned}
\frac{\partial{L}}{\partial{W}}=\frac{\partial{L}}{\partial{q}}\times \frac{\partial{q}}{\partial{W}} = x^T\space{\frac{\partial{L}}{\partial{q}}}
\end{aligned}$$</p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/57095dba-ee5f-49f5-82b9-7cbf5004c6c6/image.png" alt=""></p>
<br>

<h1 id="conclusion">Conclusion</h1>
<hr>
<p>이번 챕터는 수학적인 내용이 매우 많이 나왔다.</p>
<p>그러나 차근차근 되짚어 본다면 또 어려운 내용이 아니므로 걱정은 하지 않도록한다! (나에게 하는 말이다)!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[간단 리뷰] SPIn-NeRF: Multiview Segmentation and Perceptual Inpainting with Neural Radiance Fields]]></title>
            <link>https://velog.io/@bottlemin_park/%EA%B0%84%EB%8B%A8-%EB%A6%AC%EB%B7%B0-SPIn-NeRF-Multiview-Segmentation-and-Perceptual-Inpainting-with-Neural-Radiance-Fields</link>
            <guid>https://velog.io/@bottlemin_park/%EA%B0%84%EB%8B%A8-%EB%A6%AC%EB%B7%B0-SPIn-NeRF-Multiview-Segmentation-and-Perceptual-Inpainting-with-Neural-Radiance-Fields</guid>
            <pubDate>Wed, 08 May 2024 08:19:30 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/76f89ebd-d13b-4c0a-bc81-6c96e83f025c/image.png" alt=""></p>
<h2 id="nerf">NeRF...?</h2>
<hr>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/e868652d-c4ff-4a45-8af9-c3369827f798/image.png" alt=""></p>
<p>NeRF는 Multi-view image와 해당 카메라의 방향 및 공간 좌표 정보만으로 <strong>3D 장면을 암묵적으로 표현</strong>하는 방식이다.</p>
<blockquote>
<p>실제 데이터가 3D mesh data가 아니고 기하적 구조를 띄우지 않지만 MLP의 가중치에 내제되어 있다는 점에서 &#39;암묵적&#39;이란 표현을 쓴다</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/4e5c763b-89a5-494e-975a-8b15c46fd529/image.png" alt=""></p>
<p><strong>inpainting 3D scene은 장면에서 보이는 임의의 object를 제거하고 누락된 pixel를 예측하여 복원해주는 기술이다.</strong></p>
<p>(NeRF를 이용하여 2D 이미지를 3D로 변환한 결과물)
<img src="https://velog.velcdn.com/images/bottlemin_park/post/373b84c4-9241-4593-9dbc-8d8dc68d1e84/image.gif" alt=""></p>
<br>

<h2 id="기존-nerf기술들의-문제점">기존 NeRF기술들의 문제점</h2>
<hr>
<ol>
<li>NeRF는 3D-mesh와 같이 명확한 형태로 나타나 있지 않고, Network의 weigh에 내제되어 있어 조작이 쉽지 않다.</li>
<li>inpainting된 3D 장면은 단일 시점에서만 아니라 다른 여러 시점에서도 모형과 기하적으로 그럴듯하게 보여야한다.</li>
<li>전문가가 annotation을 지정하기 위해선 3D보단 2D에서 더 많은 직관을 얻을 수 있다. 
그러나 다양한 시점에서 object에 대한 annotation을 전부 지정하는 것은 어렵다.</li>
</ol>
<p><strong>저자는 단일 시점에서 최소한의 annotation만으로도 여러 시점에서 일관된 3D-segmentation mask를 얻을 수 있다고 주장한다.</strong></p>
<br>

<h2 id="최소한의-annotation만으로도-일관된-3d-segmentation-mask를-얻을-수-있을려면">최소한의 annotation만으로도 일관된 3D-segmentation mask를 얻을 수 있을려면?</h2>
<hr>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/e51d868c-cbcf-4ce3-a8ad-863ae8d1ebd2/image.png" alt=""></p>
<ol>
<li>전문가가 object 위에 annotation을 지정하면, video-based model(vision-transformer)로 초기 mask를 생성한다.</li>
</ol>
<blockquote>
<p>전문가가 object에 대한 annotation를 지정하면 알아서 Segmentation mask를 만들어주는 것을 interactive segmentation라고 한다.
** &ensp; Positive click : 관심 object에 해당된 point
 &ensp; Negative click : 관심 object가 아닌 point**</p>
</blockquote>
<ol start="2">
<li><p>mask를 semantic NeRF에 fitting하여 여러 시점에서도 일관된 semantic segmentaiton mask을 3D로 랜더링한다.</p>
</li>
<li><p>multi-view image set에 pre-trained 2D inpainter를 적용하여 2D inpainting image를 생성한다.</p>
</li>
<li><p>customized NeRF fitting process
<img src="https://velog.velcdn.com/images/bottlemin_park/post/7a82d5ea-d60c-4f1d-bc39-6fa45c1f9194/image.png" alt=""></p>
</li>
</ol>
<ul>
<li>2D inpainting image </li>
<li>mask 영역의 기하학적 구조를 정규화하기 위한 inpainting depth image</li>
</ul>
<p>두 가지 요소를 perceptual loss(지각 손실)을 통해 3D inpainting scene을 재구성한다.</p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/0f251d8e-164a-46b0-8659-0fa3454531c5/image.png" alt=""></p>
<br>

<h2 id="연구-동향-파악-중간-점검">연구 동향 파악 중간 점검</h2>
<ul>
<li><strong>Labeling Problem</strong><ul>
<li>현재 방대한 양의 image dataset을 labeling 시키는 것은 불가능하다고 함</li>
<li>pre-trained model에 대한 연구가 활발한 만큼, self-supervised learning에 대한 중요도가 높은 것 같음</li>
</ul>
</li>
<li><strong>Multi-modal</strong><ul>
<li>vision-text modality: pre-trained model을 어떻게 fine-tuning을 할 것인가?에 대한 주제</li>
<li>Lidar-camera modality: </li>
</ul>
</li>
<li><strong>NeRF</strong><ul>
<li>좀 더 진행해봐야 알 듯!</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[간단 리뷰] Augmentation Matters: A Simple-yet-Effective Approach to Semi-supervised Semantic ]]></title>
            <link>https://velog.io/@bottlemin_park/%EA%B0%84%EB%8B%A8-%EB%A6%AC%EB%B7%B0-%EC%B4%88%EC%95%88</link>
            <guid>https://velog.io/@bottlemin_park/%EA%B0%84%EB%8B%A8-%EB%A6%AC%EB%B7%B0-%EC%B4%88%EC%95%88</guid>
            <pubDate>Tue, 07 May 2024 10:47:35 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/126edd78-63ee-4e1c-a1f7-48d473e1dbed/image.png" alt=""></p>
<h2 id="semi-supervised-semantic-segmentationsss의-일반화-성능-향상을-위한-random-intensity-based-data-augmentation">Semi-supervised Semantic segmentation(SSS)의 일반화 성능 향상을 위한 random intensity based Data augmentation</h2>
<hr>
<p>computer vision을 위한 dataset에서 일일히 labeling시키는 것은 cost가 매우 나가는 문제가 발생한다.</p>
<p>따라서 최근에 object classification/detection 및 segmentation같은 downstream task을 위해 semi-supervised learning 혹은 unsupervised learning에 대한 연구가 많이 진행되고 있다.</p>
<p>해당 논문은 semi-supervised learning에서 data augmentation을 다룸으로써 일반화 성능을 높히는 논문을 제시하고 있다.</p>
<blockquote>
<p>Semi-supervised learning은 다음과 같은 가정을 따른다. <br></p>
</blockquote>
<ol>
<li><strong>Smoothing assumption</strong> : 
인접한 data point들은 그 출력 값 또한 인접할 것</li>
<li><strong>Cluster assumption</strong> : 
Data point들이 같은 cluster에 있다면 같은 class에 속할 것
이로 인해 약간의 data perturbation이 일어나도 일관성이 존잰</li>
<li><strong>Manifold assumption</strong> :
고차원의 data point는 저차원의 manifold으로 표현가능</li>
</ol>
<br>

<h2 id="sss에서-data-augmentation-problem">SSS에서 Data augmentation problem</h2>
<hr>
<p>기존 SSS data augmentation의 경우, <strong>auto-augmentation technique</strong>을 사용하는데, 다음과 같은 문제가 발생하게 된다.</p>
<ul>
<li><p>SSS에서 data augmentation의 경우 *<em>하나의 image에 대해서 서로 다른 view를 제공해주는 것이 목적이므로 *</em> auto-augmentation이 합리적인 technique이 아님을 지적</p>
</li>
<li><p>기존 Copy-Paste 방식은 unlabeled sample간의 혼합에 의존하는데, 이는 pesudo label에 과도하게 의존하여 confirmation bias를 유발할 수 있다</p>
</li>
</ul>
<p>(auto-augmentation 및 RandomAug은 마지막 장 Appendix에 설명해주겠다)</p>
<br>

<h2 id="how-to-slove-it-augseg">How to slove it? (AugSeg)</h2>
<hr>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/3fd02f49-f4b7-4459-a1b5-cfaaeeb6376d/image.png" alt=""></p>
<h3 id="random-intensity-based-augmentation-a_r">random intensity-based augmentation ($A_r(.)$)</h3>
<ul>
<li>discrete space 대신 continuous space상에서 intensity를 균일하게 샘플링한다.</li>
<li>augmentation pool의 크기를 고정하지 않고 random하게 하여 data diversity를 높인다.</li>
<li>제시한 augmentation pool에서 invert같은 strong intensity-based augmentation은 제거하고 RandomAug와 같이 pool을 단순화시킨다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/2fa65171-ee65-4ac4-af08-9c109b21cf67/image.png" alt=""></p>
<p>이렇게 함으로써 data distribution distort는 최소화하면서도 Semi-supervised learning에 적합한 augmentation을 수행할 수 있게 된다.</p>
<h3 id="adaptive-cutmix-based-augmentation-a_alpha">Adaptive CutMix-based augmentation ($A_\alpha(.)$)</h3>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/096ea266-0c86-4a71-bba7-7d03e756c039/image.png" alt=""></p>
<p>모델의 현재 예측에 대한 신뢰도 점수 $\rho_i$를 계산하여, 이를 unlabeled-labeled 혼합 여부를 결정하는 triggering probability로 사용한다.</p>
<p>최종적으로 이렇게 생성된 혼합 후보들과 원래 unlabeled 데이터를 추가로 혼합하여 augmented data를 생성한다.</p>
<br>

<h2 id="appendix">Appendix</h2>
<hr>
<h3 id="auto-augmentation">Auto augmentation</h3>
<p>Downstream task에 맞는 최적의 augmentation 전략을 찾는 기법이다.
$\rightarrow$ 특정 dataset에 대한 augmentation 전략이 맞더라도 다른 dataset으로 전이하는 경우 일반화 능력이 떨어질 수 있기 때문이다.</p>
<h3 id="randomaug">RandomAug</h3>
<p>기존의 Auto augmentation 기법들은 대상 작업에 최적화된 증강 전략을 찾기 위해 복잡한 탐색 과정을 거치는 반면, <strong>RandomAug는 이를 단순화하여 임의의 증강 기법들을 조합하는 방식을 취한다.</strong></p>
<ol>
<li>discrete space에서 증강 기법들의 조합을 샘플링한다. (각 조합은 하나 이상의 증강 기법으로 이루어진다.)</li>
<li>augmentation의 magnitude은 사전에 정의된 범위 내에서 랜덤하게 샘플링된다.</li>
<li>augmentation의 종류와 개수는 미리 정해진 집합(pool)에서 random하게 선택된다.</li>
<li>일반적으로 좀 더 약한 augmentation들이 더 자주 선택되도록 Weight를 부여한다.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[간단리뷰] MSeg3D: Multi-modal 3D Semantic Segmentation for Autonomous Driving]]></title>
            <link>https://velog.io/@bottlemin_park/%EA%B0%84%EB%8B%A8%EB%A6%AC%EB%B7%B0-MSeg3D-Multi-modal-3D-Semantic-Segmentation-for-Autonomous-Driving</link>
            <guid>https://velog.io/@bottlemin_park/%EA%B0%84%EB%8B%A8%EB%A6%AC%EB%B7%B0-MSeg3D-Multi-modal-3D-Semantic-Segmentation-for-Autonomous-Driving</guid>
            <pubDate>Tue, 07 May 2024 07:21:42 GMT</pubDate>
            <description><![CDATA[<h2 id="자율주행의-3d-segmentation을-위해-두-modality인-camera와-lidar를-융합한-논문이다">자율주행의 3D segmentation을 위해 두 modality인 camera와 Lidar를 융합한 논문이다</h2>
<hr>
<p><strong>Camera</strong>: scence에 대한 풍부한 정보를 가지고 있지만, object의 크기가 다양할 때, segment 성능이 낮아지고 3D segmentation 적용이 쉽지 않다.
<strong>Lidar</strong>: 3D semantic segmentation이 가능하지만, laser point들이 희소하기 때문에 object의 디테일이 떨어wu segmentation이 부정확하다는 문제가 있다.</p>
<blockquote>
<p>Laser point가 희소한 이유? $\rightarrow$ 센서로부터 등방성으로 퍼져나가기 때문에 멀리 갈수록 point들이 희소함</p>
</blockquote>
<p>최근 Computer-vision의 트렌드는 multi-modal인 만큼 두 센서를 융합하여 3D semantic segmentation의 정확성과 강인함을 높이겠다는 논문이다.</p>
<br>

<h2 id="3d-semantic-segmentation의-문제점">3D semantic segmentation의 문제점?</h2>
<hr>
<p>저자는 Multi-modal segmentation이 3가지 문제점을 가지고 있다고 한다.</p>
<h3 id="1-heterogeneity-between-modalities">1) Heterogeneity between modalities</h3>
<p>Lidar의 3D point cloud와 Camera의 scence는 기본적으로 균일하지 않다.
intra-modal feature extraction을 통해 이러한 비균일성을 해결할 수 있다고는 해도 joint optimization의 부족으로 인해 optimal한 feature가 나오지 않다.</p>
<h3 id="2-limited-intersection-on-the-field-of-view-fov-between-sensors">2) Limited intersection on the field of view (FOV) between sensors.</h3>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/5024d8fe-8fb7-405c-badb-4c759082d1d4/image.png" alt=""></p>
<p>두 sensor 간에 FOV의 최대 교집합이 제한되어 있다. 그림에서 볼 수 있듯이, camera의 FOV가 제한되어 있다. 제한된 상황에서 multi-modal data을 통한 segmentation 성능은 시원치는 않을 것이다.</p>
<h3 id="3-multi-modal-data-augmentation">3) Multi-modal data augmentation</h3>
<p>data augmentaion 기법은 주로 2D domain에 대해서만 다루고 있다. 
point cloud를 projection해서 사용할 수 있다는 이야기인데... 이러면 point cloud에서 중요한 정보를 왜곡될 수 있다는 위험성이 있다.
<strong>한 마디로 3D point cloud에 대한 augmentation이 어렵다</strong></p>
<br>

<h2 id="how-to-slove-it">How to slove it?</h2>
<hr>
<h3 id="1-jointly-optimize-intra-modal-extraction--inter-modal-feature-fusion">1) Jointly Optimize intra-modal extraction &amp; inter-modal feature fusion</h3>
<p>intra-modal (camera &amp; Lidar)의 feature를 추출한 후, 다음과 같은 과정을 통해 inter-modal feature fusion을 진행한다.</p>
<ul>
<li>GF-Phase (Geometry-based Feature Fusion)</li>
<li>Cross-modal Feature Completion</li>
<li>SF-Phase (Semantic-based Feature Fusion)</li>
</ul>
<h3 id="2-gf-phase를-위한-cross-modal-완성-및-semantic-based-feature-phase-sf-phase-제안">2) GF-Phase를 위한 cross-modal 완성 및 semantic-based feature phase (SF-Phase) 제안</h3>
<h4 id="1-cross-modal-완성">(1) cross-modal 완성</h4>
<p>camera FOV outside 부분에 대한 feature를 예측하는 단계이다.
FOV inside point의 feature와 cross-modal supervision을 이용해 모델을 학습시킨다.</p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/00fdbfd0-df2c-4608-8de4-f60c70dc6b2c/image.png" alt=""></p>
<p>학습된 모델로 FOV 외부 포인트에 대한 가상의 카메라 특징(pseudo-camera features)을 예측하여 결측값을 완성한다.</p>
<blockquote>
<p>cross-modal supervision?
서로 다른 모달리티(예: 이미지, 텍스트 등) 간의 상호 지도학습을 의미. <br>
예를 들어, image-caption 모델에서:</p>
</blockquote>
<p>1) image modality만 사용하면 시각 정보만 반영
2) Caption을 같이 사용하면 언어적 지식도 활용
3) 두 modality가 서로 지도학습을 하면서 상호보완을 함</p>
<h4 id="2-gf-phase">(2) GF-Phase</h4>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/8da4e911-6d8a-476c-a991-216618d60aa5/image.png" alt=""></p>
<p>LiDAR feature과 카메라 feature을 Fully Connected Layer을 통해 동일한 차원의 feature으로 변환한다.</p>
<p>이후, concatenate하여 MLP를 통과시켜 geometry-based fusion feature을 생성한다.</p>
<blockquote>
<p>Geometry-based Feature Fusion (GF-Phase)가 필요한 이유?: <br></p>
</blockquote>
<ol>
<li>기하 정보 활용</li>
</ol>
<ul>
<li>LiDAR point cloud는 3차원 공간 상에서  위치 정보를 포함하는데, GF-Phase에서는 이 기하 정보를 활용하여 feature들을 융합한다.</li>
</ul>
<ol start="2">
<li>Spatial Alignment 고려  </li>
</ol>
<ul>
<li>GF-Phase에서는 기하 정보를 바탕으로 LiDAR point와 camera pixel의 대략적으로 정렬할 수 있도록 한다.</li>
<li>이를 통해 fusion 시 발생할 수 있는 Spatial misalignment 문제를 완화할 수 있다.</li>
</ul>
<ol start="3">
<li>보완적 특징 통합</li>
</ol>
<ul>
<li>다른 종류의 feature들을 기하 정보를 기반으로 융합하여 통합된 표현을 얻을 수 있다.</li>
</ul>
<h4 id="3-sf-phase">(3) SF-Phase</h4>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/e14a2abb-6372-48c2-99ce-de41fccee8b7/image.png" alt=""></p>
<p>여기서 LIDAR SFAM과 Camera SFAM은 각각 sementic feature aggregate module이다.</p>
<p>간단하게 해당 모듈의 목적은 각각의 modality에서 나온 data로부터 각 category에 해당하는 semantic feature vector를 추출하는 것이다.</p>
<p>이후 두 modality에 대한 semantic feature vector를 SFAM을 input으로 넣음으로써, inter-modal feature fusion vector를 구할 수 있다. </p>
<h3 id="3-decomposed-as-the-asymmetric-transformation">3) Decomposed as the asymmetric transformation</h3>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/0c703641-a6f8-4e4f-8211-a554f4a71117/image.png" alt=""></p>
<ul>
<li>L-only: LiDAR data에만 회전, 평행이동, 스케일링 등의 변환 적용</li>
<li>C-only: image에만 스케일링, 회전, 크롭, 색상변화, JPEG 압축 등의 변환 적용</li>
<li>Symmetric: random flipping은 두 modality에 동일하게 적용되는 대칭 변환</li>
</ul>
<p>이처럼 LiDAR와 이미지 각각에 독립적이고 비대칭적인 변환을 적용함으로써 보다 다양한 상황을 반영한 augmented 데이터를 생성한다.</p>
<br>

<h2 id="개인적으로-느꼈던-2023-cvpr-segmentation-트렌드-계속-조사하고-있지만ㅎ">개인적으로 느꼈던 2023 CVPR segmentation 트렌드 (계속 조사하고 있지만...ㅎ)</h2>
<hr>
<ul>
<li>자율주행을 위한 Lidar를 이용한 multi-modal 연구가 활발하다. <ul>
<li>주요 issue는 2D &amp; 3D modality gap으로 인한 Lidar data performance degradation인 듯하다 <br></li>
</ul>
</li>
<li>Computer-vision에 prompt질이 가능하도록 pre-trained model 연구를 성행하고 있다.<ul>
<li>CV에서도 few-shot 혹은 zero-shot learning을 위함이다.</li>
<li>그리고 pre-trained model에 관련된 연구에서 self-supervised learning에 대한 코멘트를 줄차게 들여놓는다.  <br></li>
</ul>
</li>
<li>순수 computer vision의 색깔은 많이 옅어진 느낌이 들었다. caption아니면 Lidar를 이용한 multi-modal 연구가 성행되고 있다.!</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[간단리뷰] Open-Vocabulary Semantic Segmentation with Mask-adapted CLIP]]></title>
            <link>https://velog.io/@bottlemin_park/Open-Vocabulary-Semantic-Segmentation-with-Mask-adapted-CLIP</link>
            <guid>https://velog.io/@bottlemin_park/Open-Vocabulary-Semantic-Segmentation-with-Mask-adapted-CLIP</guid>
            <pubDate>Sun, 05 May 2024 12:14:59 GMT</pubDate>
            <description><![CDATA[<h2 id="clip-contrastive-language-image-pre-training">CLIP (Contrastive Language-Image Pre-training)</h2>
<hr>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/613f28fc-8cf4-43f6-a4da-76d0a02805c0/image.png" alt=""></p>
<p>Contrastive learning 기반 ConVIRT 모델에서 간략화된 버전이 CLIP이라고 한다.
image &amp; text encoder를 Jointly training하도록 한다.</p>
<ul>
<li>Positive한 $N$개의 pair 요소들에 대해 Cosine 유사도가 최대가 되도록 (Pulling)</li>
<li>Negative한 $N^2-N$개의 pair 요소들에 대해 Cosine 유사도가 최소가 되도록 (Pushing)</li>
</ul>
<h3 id="zero-shot-learning">Zero-shot learning</h3>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/6e04a115-d88e-4787-8de3-e3a86b036c6d/image.png" alt=""></p>
<p>Ex) CIFAR-10 dataset을 예측하려 한다.
<strong>Image와 문장화된 label을 Embedding하여 representation한다면 별도의 fine-tuning없이도 바로 예측이 가능하다!</strong></p>
<br>

<h2 id="adopted-vision-language-model을-통해-segment-image-성능-향상">Adopted vision-language model을 통해 segment image 성능 향상</h2>
<hr>
<p>bilion-scale의 image-text pair으로부터 multi-modal feature들을 학습하는 model을 vision-language model이라고 한다.</p>
<p><strong>image - text pair pretrained model을 fine-tuning을 한 Adopt CLIP을 제시했다.</strong></p>
<br>

<h2 id="기존-pre-trained-vision-language-model의-문제점">기존 pre-trained vision-language model의 문제점</h2>
<hr>
<h3 id="generalization-problem">Generalization Problem</h3>
<p>CLIP과 같은 Pre-trained model을 이용하여 <strong>인간 수준의 segment 능력</strong>을 달성할 수 있었다.</p>
<blockquote>
<p>여기서 말하는 <strong>&quot;인간 수준의 segment 능력&quot;</strong>이란 
수 천개의 category들을 가지고 segmentation 할 수 있는 수준 
즉, 단어 사전을 열어보고 (Open-Vocabulary) 인지하는 수준이다.</p>
</blockquote>
<p>이를 위해선 two-stage approachs가 필요하다</p>
<ol>
<li>model에서 class agnostic mask를 생성</li>
<li>pre-trained CLIP의 classification 능력을 masked image에 전이하도록 함</li>
</ol>
<blockquote>
<p>class agnostic mask : object의 종류는 무시하고, 영역만을 mask로 표시하는 것
 즉, 이미지에 있는 foreground object으로 보이는 object를 추출하는 방식</p>
</blockquote>
<p>여기서 model의 mIoU의 성능을 결정 짓는 요소는 두 가지이다.</p>
<ul>
<li>mask를 생성해주는 mask generator</li>
<li>classifier</li>
</ul>
<p><strong>CLIP</strong>은 매우 훌륭한 mask generator를 갖고 있지만 classifier 성능은 보통인 model이다.</p>
<p>이 경우, ground-truth mask와 비슷한 수준의 mask를 생성한다. 
그러나 ADE20K-150 dataset으로 측정한 mIoU 성능은 겨우 20.1%이다.</p>
<p><strong>MaskFormer</strong>는 매우 훌륭한 classifier 성능을 가지고 있지만 mask generator 성능은 보통인 model이다.</p>
<p>COCO dataset으로 측정한 mIoU 성능은 CLIP보다 높은 66.5%이다.</p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/a6f98690-6118-4ba0-bb46-02503b44d625/image.png" alt=""></p>
<p><strong>즉, CLIP은 classificaiton의 결함으로 인해 Open-vocabulary segement model로써 한계가 있다.</strong></p>
<p>저자는 CLIP의 낮은 성능의 이유로 CLIP의 원본 image data와 masking된 image의 domain gap에 의해 발생한다고 한다.</p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/27a2855a-d817-491a-be02-f055e2c735a8/image.png" alt=""></p>
<p>쉽게 말해서 masked image는 crop 및 re-size되었으므로 domain이 원본 이미지와 그 만큼 차이가 난다는 뜻이다.</p>
<h3 id="zero-token-problem">Zero token Problem</h3>
<p>masked image의 background pixel은 CLIP transformer으로 들어갈 때 &quot;zero token&quot;으로 취급한다.</p>
<p>zero token은 아무런 쓸모도 없을 뿐더러 원본 이미지에는 
zero token이 존재하지 않으므로 두 이미지의 domain distribution간에 차이(shifting) 문제가 발생하여 성능이 저하됨을 분석하였다.</p>
<br>

<h2 id="그래서-mask-adapted-clip는-어떻게-만들어지는가">그래서 Mask-adapted CLIP는 어떻게 만들어지는가?</h2>
<hr>
<h3 id="generalization">Generalization</h3>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/b59107b5-874d-4f87-aae6-0a567eb9a169/image.png" alt=""></p>
<ol>
<li>image-caption dataset을 준비하도록한다. (COCO Captions)</li>
<li>image-caption pair에서 caption으로부터 명사를 추출하도록 한다.</li>
<li>pre-trained segmentation model을 이용해 class-agnostic mask를 생성한다.</li>
<li>pre-trained model인 CLIP으로 masked image와 caption으로부터 추출한 명사와의 best-matching이 되도록 할당해준다.</li>
</ol>
<p>masked image와 새로운 category들 사이의 weakly-supervied alignment를 통해 Open vocabulary classification에 대해서 adopted CLIP이 더 나은 일반화 성능을 보여준다.</p>
<pre><code>segmentation label를 사용하는 COCO-staff의 경우에는,
category의 종류 수가 제한되어 있어 
일반화 성능이 떨어지는 문제가 발생한다.</code></pre><h3 id="fine-tuning">Fine-tuning</h3>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/ede69158-c27c-44b9-aede-941a785ca217/image.png" alt=""></p>
<ol>
<li>zero token $\rightarrow$ learnable prompt token으로 변환한다.</li>
<li>CLIP의 weight를 고정시켜 learnable prompt token을 학습할 수 있도록 한다. (내가 생각한 이유는 아래에 적었당)<img src="https://velog.velcdn.com/images/bottlemin_park/post/6a9cc7f9-e389-4aad-85ab-d34d9bf9938e/image.png" width="60%" height="60%">

</li>
</ol>
<p>이를 통해 masked image의 CLIP 성능이 대폭 증가된다고 한다.</p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/c8c2af30-5b18-49e0-b988-568ab1368f9e/image.png" alt="">
<img src="https://velog.velcdn.com/images/bottlemin_park/post/62b9c18f-2d9c-411c-ab36-5ef4e24b0b0d/image.png" width="60%" height="60%"></p>
<p>✔️ 제시한 Query에 따라 segmentation이 매우 잘 됨을 확인할 수 있다.
⚠️ 참에 해당하는 카테고리는 Building &amp; Rail인데 예측한 문장은 skyscraper &amp; road</p>
<ul>
<li>의미는 동일하나 엄밀히 틀린 예측에 해당함
이러한 뜻은 비슷하나 다른 단어들을 구별하는 능력에 한계가 있다는 것으로 논문은 마무리를 하였다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[간단리뷰] Segment Anything]]></title>
            <link>https://velog.io/@bottlemin_park/%EA%B0%84%EB%8B%A8%EB%A6%AC%EB%B7%B0-Segment-Anything</link>
            <guid>https://velog.io/@bottlemin_park/%EA%B0%84%EB%8B%A8%EB%A6%AC%EB%B7%B0-Segment-Anything</guid>
            <pubDate>Sun, 05 May 2024 10:09:51 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/f4e1b93c-d194-46d5-bb67-1434a4f01a7f/image.png" alt=""></p>
<h2 id="segment-model의-foundation-model을-만들어-보겠다">segment model의 “foundation model”을 만들어 보겠다</h2>
<blockquote>
<p>foundation model? 
논문 상에서는 두 가지 요건을 설명하고 있다.</p>
</blockquote>
<ol>
<li>새로운 dataset에 대하여 zero-shot 혹은 few-shot learning을 수행해야함</li>
<li>prompting 기술을 이용해 특징 task를 수행할 수 있어야함</li>
</ol>
<p><strong>$\rightarrow$ Promptable model &amp; pre-trained it on a broad dataset</strong> </p>
<p>진정한 foundation model을 구성할려면 세 가지 구성 요소를 고려해야 한다고 한다.</p>
<ol>
<li>What <strong>task</strong> will enable zero-shot generalization?</li>
<li>What is the corresponding <strong>model</strong> architecture? </li>
<li>What <strong>data</strong> can power this task and model?</li>
</ol>
<p>먼저 segmentation을 위한 large-scale source가 존재하지 않으므로 “data engine”이라는 기술을 통해 data를 수집하고록 한다.</p>
<ul>
<li>data engine을 사용하여 data를 수집한다.</li>
<li>새로운 data를 토대로 모델의 성능을 개선시키는 작업을 반복적으로 진행한다.</li>
</ul>
<h3 id="1-task">1. task</h3>
<blockquote>
<p>✅ the goal is to return a valid segmentation mask given any segmentation prompt</p>
</blockquote>
<p>여기서 “promptable하다”는 뭔 말일까?</p>
<p>Query로써 text 혹은 spatial information을 주어졌을 때, 합리적인 segmentation 결과가 나와져야 한다는 뜻이다</p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/3190d70e-8080-4a96-a185-628118c5d944/image.png" alt=""></p>
<p>심지어 prompt가 애매모호하거나 여러 조건들을 붙이더라도 masking 결과는 합리적이어야 한다.</p>
<h3 id="2-model">2. model</h3>
<p>foundation model을 위해 다음과 같은 조건을 만족해야한다.</p>
<ol>
<li>flexible prompt</li>
<li>compute mask in real-time</li>
<li>must be ambiguity-aware</li>
</ol>
<h3 id="3-data">3. Data</h3>
<p>새로이 얻은 data distribution에 대해서 강력한 일반화 성능을 얻기 위해서, SAM에 굉장히 종류가 다양하고 거대한 mask dataset을 있어야한다.</p>
<br>

<h2 id="sgement-anything-sa-project의-이유">Sgement Anything (SA) project의 이유</h2>
<hr>
<p>model의 성능은 다음과 같은 요소에 의해서 결정됨</p>
<ul>
<li>model scale</li>
<li>dataset size</li>
<li>total training compare</li>
</ul>
<p>그러나 Computer vision에는 충분한 dataset이 없다</p>
<br>

<h2 id="그래서-cv의-foundation-model을-구성하기-위해-어떻게-구성했는가">그래서 CV의 foundation model을 구성하기 위해 어떻게 구성했는가?</h2>
<hr>
<h3 id="segment-anything-model-sam">Segment Anything Model (SAM)</h3>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/5e0bae13-16fe-4268-9f88-536f2dcd481f/image.png" alt=""></p>
<ol>
<li><strong>flexible prompt</strong></li>
</ol>
<ul>
<li>image encoder와 prompt encoder / mask decoder 세 가지로 구성한다.
prompt encoder에 다른 입력이 들어와도 image encoder는 동일한 작업을 하기 때문에 
prompt에 굉장히 유연하다.</li>
</ul>
<ol start="2">
<li><strong>compute mask in real-time</strong></li>
</ol>
<ul>
<li>Embedding된 image은 Web-browser에서 ~10ms로 searching을 통해 
prompt encoder와 mask decoder prediction을 진행한다.</li>
</ul>
<ol start="3">
<li><strong>must be ambiguity-aware</strong>
<img src="https://velog.velcdn.com/images/bottlemin_park/post/bd707776-ec91-4fcb-ab58-aadf973c7a20/image.png" alt=""></li>
</ol>
<ul>
<li>single prompt에 대해서 multiple maks를 예측함으로써, 모호성을 잡아낼 수 있다.<ul>
<li>가령 타조 머리에 annotation 했다면, 이것이 타조 머리인지? 타조 몸통인지? 타조 전체인지?에 대한 여러 task를 잡아내고, G.T.와 비교하여 score를 매기도록 한다. 이를 통해 prompt의 모호성을 잡아낼 수 있다.</li>
</ul>
</li>
</ul>
<h3 id="data-engine">data engine</h3>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/50b3653f-9d76-4fb0-913b-61c6b56e28b5/image.png" alt=""></p>
<p>data engine에는 3단계로 이뤄짐 
$\rightarrow$ assisted-manual / semi-automatic / fully-automatic</p>
<p><strong>assisted-manual</strong></p>
<ul>
<li>전문가들이 mask를 직접 annotate시킴 (전통적인 대화형 segmentation 설정과 유사)</li>
</ul>
<p><strong>semi-automatic</strong> </p>
<ul>
<li>SAM은 prompt을 통해 object에 대한 mask를 자동으로 생성시킨다. 예측한 mask는 전문가가 추가적으로 보정을 해준다.</li>
</ul>
<p><strong>fully-automatic</strong></p>
<ul>
<li>foreground point의 규칙적인 그리드를 prompt하여 평균적으로 이미지당 약 100개의 고품질 mask를 생성</li>
</ul>
<h2 id="conclusion">conclusion</h2>
<hr>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/1cd5759f-9df4-4e89-8005-b6e967fd417e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/8fdd5a3d-b74c-4395-8677-c62cefe26b1d/image.png" alt=""></p>
<p>✔️ SAM이 segment에 실패해도 하나의 prompt에 multi-task (point)를 수행함으로써 정확성을 올릴 수 있었음</p>
<p>✔️ SAM는 pretrain model로써, downstream task에 맞춰서 적용하면 되는데, fine-tuning을 위해서 self-supervied learning의 중요성이 커질 듯</p>
<br>
⚠️ SAM은 아직 고쳐야할 점들이 많음

<ul>
<li>미세한 구조에 대해서는 놓치는 부분들이 많고, 작은 구성 요소들이 hallucination를 일으킬 수 있</li>
<li>image encoder가 무겁나면 real-time processing이 어려움</li>
<li>text-to-mask task가 아직 완벽하게 강인하진 않음</li>
<li>더욱 뛰어난 segmentation을 위한 prompt 디자인은 아직 몰루?</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[공부 일지]]></title>
            <link>https://velog.io/@bottlemin_park/CS-%EA%B3%B5%EB%B6%80-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@bottlemin_park/CS-%EA%B3%B5%EB%B6%80-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Fri, 03 May 2024 16:59:23 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/92482167-945c-4858-80ac-7642e82e40ce/image.png" alt=""></p>
<p>CS 및 CV를 공부하기 위해 내가 어떤 공부를 해야하는가를 정리한 글이다.</p>
<p>기록용 글이므로 두서없음을 주의할 것</p>
<hr>
<h3 id="computer-science">Computer Science</h3>
<p><a href="%22https://www.youtube.com/playlist?list=PLBrGAFAIyf5rby7QylRc6JxU5lzQ9c4tN%22">운영체제 - 한기대 최덕수 교수</a></p>
<ul>
<li>Not yet</li>
</ul>
<p><a href="%22https://www.youtube.com/playlist?list=PL1xKqHsVFgvkjsEOlTU-h7HAOmD1Bpadd%22">자료구조 - 세종대 최유경 교수</a></p>
<ul>
<li>Not yet</li>
</ul>
<p><a href="%22https://www.youtube.com/playlist?list=PL127T2Zu76FuVMq1UQnZv9SG-GFIdZfLg%22">선형대수학 - 이상엽</a></p>
<ul>
<li>Not yet</li>
</ul>
<hr>
<h3 id="deep-learning--computer-vision">Deep Learning &amp; Computer vision</h3>
<p><a href="%22https://www.youtube.com/playlist?list=PL3FW7Lu3i5JvHM8ljYj-zLfQRF3EO8sYv%22">cs231n(2017 spring)</a></p>
<ul>
<li>on going</li>
</ul>
<p><a href="%22https://www.youtube.com/playlist?list=PLBiQZMT3oSxW1RS1hn2jWBgswh0nlcgQZ%22">딥러닝1 - 한경훈 교수</a>
<a href="%22https://www.youtube.com/playlist?list=PLBiQZMT3oSxXNGcmAwI7vzh2LzwcwJpxU%22">딥러닝2 - 한경훈 교수</a>
<a href="%22https://www.youtube.com/playlist?list=PLBiQZMT3oSxV3RxoFgNcUNV4R7AlvUMDx%22">딥러닝3 - 한경훈 교수</a></p>
<ul>
<li>밑바닥부터 시작하는 딥러닝를 참조하면서 공부하는 것을 추전</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[cs231n 3강]]></title>
            <link>https://velog.io/@bottlemin_park/cs231n-3%EA%B0%95</link>
            <guid>https://velog.io/@bottlemin_park/cs231n-3%EA%B0%95</guid>
            <pubDate>Fri, 03 May 2024 05:19:48 GMT</pubDate>
            <description><![CDATA[<h1 id="1-loss-function">1. Loss function</h1>
<p>Loss function은 무엇인가?
바로 분류한 결과와 실제 값의 차이를 정량적으로 확인하는 function이다.
이를 통해 우리는 현재 분류 결과가 얼마나 좋은지 혹은 나쁜지를 판단할 수 있는 근거를 가지게 된다.</p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/cdf35f71-9f88-42b0-bafd-241bb77cebf8/image.png" alt=""></p>
<p>$L_{i}(*)$가 우리가 선택할 Loss function이 되고, $L$은 각 요소에 대한 Loss function의 평균값이 된다.</p>
<blockquote>
<p><strong>좋은 성능의 분류기를 설계하기 위해서 $L=0$이 되도록 최적화작업을 해줘야한다.</strong></p>
</blockquote>
<p>&quot;최적화&quot;라는 의미를 곧 이따가 설명하도록 하겠다. 우선 Loss function부터!
cs231n에서 소개한 Loss function은 두 가지가 있다.</p>
<p>** 1) SVM Loss **
** 2) Softmax **</p>
<p>그리고 L2 norm Loss, L1 norm Loss 등이 있다.
모든 Loss function의 역할은 각각 다르고 이에 따라서 선택을 해줘야 한다.
이번 챕터에서는 &#39;분류&#39;라는 테마에 맞춰서 설명한 것 같다.</p>
<hr>
<h2 id="1-multiclass-svm-loss">1) Multiclass SVM loss</h2>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/e11ed163-cfc3-4ee7-931c-b252ce66f527/image.png" alt=""></p>
<p>Multiclass SVM loss는 각 class에 대한 score를 매겼을 때, score가 참에 해당된 class의 score와 얼마나 차이나는 지 함수이다.</p>
<p><strong>자기 자신을 제외한 나머지 score vector와 ground truth에 해당하는 score vector 간의 차이와 margin term(+1)을 더한 값이 0보다 크면 손실이 발생한다</strong></p>
<p>분류기를 통과해 나온 class에 따른 score는 다음과 같다.</p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/1979e65f-3e9d-4af6-b099-11464b26b0b8/image.png" alt="">
첫번째 데이터인 고양이의 SVM Loss를 계산해보자
고양이의 score vector는 $s_{y_{i}}=s_1=3.2$이다.
나머지 score vector는 각각 $s_2=5.1, s_3=-1.7$이다.
그럼 $L_1 = max(0,5.1-3.1+1) + max(0,-1.7-3.1+1)=2.9+0=2.9$가 된다.</p>
<p>그 다음 데이터인 자동차의 SVM Loss를 계산해보자
자동차의 score vector는 $s_{y_{i}}=s_2=4.9$이다.
나머지 score vector는 각각 $s_2=1.3, s_3=2.0$이다.
그럼 $L_2 = max(0,1.3-4.9+1) + max(0,2.0-4.9+1)=0$가 된다.
매우 훌륭하게 분류되었음을 알 수 있다.</p>
<blockquote>
<p>다음은 SVM Loss의 code를 함수로 나타낸 것이다</p>
</blockquote>
<pre><code class="language-python">def L_i_vectorized(x,y,W):
    scores = W.dot(x)
    margins = np.maximum(0, scores-scores[y]+1)
    margin[y] = 0
    loss_i = np.sum(margins)
    return loss_i</code></pre>
<hr>
<h2 id="2-softmax-loss">2) Softmax Loss</h2>
<blockquote>
<p><strong>What is Softmax?</strong>
<img src="https://velog.velcdn.com/images/bottlemin_park/post/5c32bb0b-3a44-4678-924b-14d7180967f3/image.png" alt=""></p>
</blockquote>
<ul>
<li>출력 vector들을 [0,1]사이로 배치해주고, 확률 분포로 나타내준다.</li>
<li>softmax Function을 통과해 나온 class별 확률값들의 총합은 항상 &#39;1&#39;이다.</li>
</ul>
<p><strong>softmax Loss는 softmax를 negative log likelihood로 표현하도록 한다.</strong>
(loss 값은 양의 범위에서 일어나야하므로 negative이다.)</p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/3db50d82-ff1e-4b08-a088-ab27302de000/image.png" alt=""></p>
<hr>
<h2 id="3-svm-loss-vs-softmax-loss">3) SVM Loss vs Softmax Loss</h2>
<p>그럼 분류를 위해서 쓰인 두 Loss function은 어떤 특성을 보이는 가? 이를 표로 정리해보았다.</p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/dbcf9947-91b3-4ca1-8102-776ebafb8c98/image.png" alt=""></p>
<ul>
<li><strong>score가 변화에 따라 Loss에 변화됨은 Loss function마다 다르다</strong><ul>
<li>Multiclass SVM Loss는 class score의 차이만 고려하기 때문에 Loss가 0이면 더 이상 학습하지 않는다.</li>
<li>softmax Loss는 score를 <strong>확률 기반</strong>으로 다루기 때문에 score의 변화를 적극적으로 반영한다. 따라서 복잡한 task를 처리하려고 할 때는 대부분 softmax loss를 사용한다.</li>
</ul>
</li>
</ul>
<ul>
<li><strong>train model에서 $Loss=0$이 되는 가중치 $W$는 유일하지 않다</strong><ul>
<li>train data에서 추정한 $W$은 $2W$ 혹은 $3W$ 모두 좋은 성능을 낼 수 있다.</li>
<li>그러나 그 말이 test data에서도 올바른 성능을 낼 거라는 가능성은 매우 낮다.</li>
</ul>
</li>
</ul>
<blockquote>
<p>그렇다면 수 많은 $W$ 중에서 &#39;우리가 선택해야하는 $W$은?&#39;</p>
<blockquote>
<p><strong>Regularization을 이용해 train을 통해 추정한 $W$가 test data에도 유효한 성능을 내는지 확인한다.</strong></p>
</blockquote>
</blockquote>
<hr>
<h1 id="2-regularization">2. Regularization</h1>
<p>쉽게 말하자면, 모델의 복잡도가 증가하는 걸을 막기 위해 학습 과정에서 별도의 규제를 추가하는 기술이다.</p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/fc80e56e-982b-475d-b9cd-c2f177878261/image.png" alt=""></p>
<p><strong>train data의 정확도가 얼마나 좋은 지는 중요하지 않다. test data의 예측이 얼마나 정확한지가 중요하다.</strong></p>
<p><strong>다시 말해, train data 뿐만 아니라 test data도 일반적으로 표현할 수 있는 모델을 우리는 원한다.</strong></p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/09234e83-8c0d-4c7a-98b6-c2f102189491/image.png" alt=""></p>
<p>다음과 같이 표현되며, $\lambda$는 hyperparameter이다.
<del>혹시, 이게 어떠한 과정을 통해 규제가 이뤄지는지 궁금할 수 있겠는데, 꽤나 고급진 수학 전개가 필요하다.</del>
<del>이는 나중에 다뤄보겠다.</del></p>
<p>다음과 같은 input data와 가중치가 있다고 하자
<img src="https://velog.velcdn.com/images/bottlemin_park/post/b79f07c4-b860-43e8-8218-f460167f9f49/image.png" alt=""></p>
<p>두 가중치 모두 input data와의 행렬곱은 1로 동일하다.</p>
<ul>
<li>L1 Regularization $\rightarrow{w_1}$에 최적화<ul>
<li>L1 Regularization는 가중치의 요소가 희소 (sparse)할 때 최적화되어 있다.</li>
</ul>
</li>
</ul>
<ul>
<li>L2 Regularization $\rightarrow{w_2}$에 최적화<ul>
<li>L2 Regularization는 모든 가중치 요소에 골고루 영향을 미치게 된다.</li>
</ul>
</li>
</ul>
<p>모델과 데이터 특성에 따라서 올바른 Regularization 전략을 선택해야한다.</p>
<hr>
<h1 id="3-optimization">3. Optimization</h1>
<p>Optimization은 최적의 classifier를 만족하는 가중치 $W$를 찾기 위한 기법이다.</p>
<p>Loss function은 그 자체로 classifier의 성능을 높이진 않는다. <br> 하지만 최적화 기법을 이용하여 $Loss=0$이 되는 가중치 $W$를 탐색할 수 있다.</p>
<p>가장 일반적인 전략은 gradient descent이다.</p>
<p>함수 그래프의 미분식을 통해 특정 값에서의 함수의 기울기를 계산할 수 있었다는 것을 알고 있다.</p>
<blockquote>
<p>여기서 문제를 드리도록 하겠다.</p>
</blockquote>
<ul>
<li><strong>기울기가 0이 되는 값으로 이동할려면 어떻게 해야하는가?</strong>
(hint : 기울기를 경사로 생각해보자. 경사가 없는 평지로 이동할려면?)</li>
<li><em>- 기울기(경사)가 낮은 방향으로 이동하면 된다.*</em></li>
</ul>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/afb7f2a3-7fa8-4d39-983a-d4a36414a4d9/image.png" alt=""></p>
<p>우리는 1차원 스칼라 함수가 아닌 N-차원 벡터 함수에 대한 gradient를 구할려고 한다면, 다변수 미분을 진행하면 된다.</p>
<p>미분 계산하는 것에는 두 가지 방법이 있다. 
1.수치적 미분 방법(numerical gradient) : 근사적인 풀이일 뿐더러 계산이 느리단 단점이 있어 거의 안쓴다. </p>
<p>$$
\frac{f(x)}{dx}=lim_{x\to\infty} \frac{f(x+h)-f(x)}{h}
$$</p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/29663d12-46a1-4592-96c1-8a5e01ae2975/image.png" alt=""></p>
<p>2.해석적 미분 방법(analytic gradient) : 정확하고 빠르지만 오류가 날 가능성이 존재한다.</p>
<blockquote>
<p>함수 $f(x)=x^2+x+2$을 변수 $x$에 대해서 미분한 식은 $\frac{d}{dx}f(x)=2x+1$이 된다.
미분식에 변수를 대입하면 해당 함수의 기울기가 나온다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/19be5629-e1a7-4dc6-9238-4d809aaee9fe/image.png" alt=""></p>
<blockquote>
<p><strong>일반적으로 해석적 방법을 사용하지만, 미분이 가능한지를 수치적으로 볼 경우에는 수치적 방법을 사용한다.</strong></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/3fafe39b-84e4-4f50-a4fd-a2861518904a/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[cs231n 2강]]></title>
            <link>https://velog.io/@bottlemin_park/cs231n-2%EA%B0%95</link>
            <guid>https://velog.io/@bottlemin_park/cs231n-2%EA%B0%95</guid>
            <pubDate>Tue, 30 Apr 2024 03:07:14 GMT</pubDate>
            <description><![CDATA[<h1 id="1-image-classifier">1. Image classifier</h1>
<p>이미지 분류기로 두 가지 기술을 소개하고 있다.</p>
<h4 id="1-nearest-neigbor">1) Nearest Neigbor</h4>
<h4 id="2-linear-classification">2) Linear Classification</h4>
<p>두 기술에 대해서 가볍게 짚을 예정이다.</p>
<br>

<h2 id="1-k-nearest-neighbors">1) K-Nearest Neighbors</h2>
<hr>
<p>image의 Feature을 추출하여 만든 여러 data point들이 있다고 하자.</p>
<p>Distance Metirc을 이용해서 가까운 이웃을 K개 만큼 찾고, 이웃끼리 투표를 하는 방법이다.
그리고 가장 많은 득표수를 획득한 레이블로 예측한다. </p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/ccf9b119-1fa0-44f2-9460-8ecdfe27f92a/image.png" alt=""></p>
<p>그럼 이제 우리는 두 가지 측면을 따져야 한다.
<strong>1) 그럼 두 벡터간의 거리는 어떻게 구할 것인지? =&gt; distance metric
2) 거리가 가까운 data point의 개수를 어떻게 설정할 것인지? =&gt; number of K</strong>
이는 알고리즘이 자동으로 선택이 불가하고, 사람이 직접 설정을 해줘야하는 문제이다. 이러한 파라미터들을 <strong>hyperparameter</strong>라고 한다.</p>
<h3 id="1-distance-metric">(1) distance metric</h3>
<p>벡터간의 거리를 구하는 방법은 L1 norm distance와 L2 norm distance로 나눠져 있다.
<img src="https://velog.velcdn.com/images/bottlemin_park/post/e9857be1-b192-477a-aec4-7f7629f17cc3/image.png" alt=""></p>
<p><strong>L1 norm은 두 벡터의 원소 차이를 절댓값으로 나타내어 합한 형태, 
L2 norm은 원소 차이를 절댓값의 제곱항 형태로 합한 형태이다.</strong></p>
<p>벡터가 개별적인 의미를 가지고 있다면(ex. 키, 몸무게) L1 Distance를, 일반적인 벡터 요소들의 의미를 모르거나 의미가 별로 없을 때는 L2 Distance를 사용한다.</p>
<h3 id="2-number-of-k">(2) number of K</h3>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/7a3c8a3b-4f17-432a-8b74-eddb4fb3e473/image.png" alt=""></p>
<p>K=1의 경우에는, 초록색 점들사이에서 중간에 노란 점이 끼어있다. 또한 초록색 영역이 파란색 영역을 침범하고 있다. 이는 잡음 noise 이거나 가짜 spurious이다.</p>
<p>K=3의 경우에는, 초록색 영역 한가운데에 존재하던 노란색 영역이 사라졌다. 그리고 중앙은 초록색이 점령하였다. 그리고 파란색과 빨간색 사이의 뾰족한 영역도 부드러워졌다. </p>
<p>K=5의 경우에는 파란색과 빨간색 영역이 아주 부드러워졌다. </p>
<p><strong>대체로 NN 분류기를 사용하면, K는 적어도 1 보다는 큰 값으로 사용해야 한다.</strong></p>
<br>

<h2 id="2-linear-classification-1">2) Linear Classification</h2>
<hr>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/2688e32c-de65-449a-b6e6-2af7bbd0dd0b/image.png" alt=""></p>
<p>Linear classification은 이미지 분류 정보를 가중치 $W$에 저장을 하는 <strong>Parametric Approach</strong>이다.
$f(x,W)=Wx+b$으로 계산이 된다. </p>
<blockquote>
<p><strong>$b$는 bias으로 특정 카테고리에 우선권을 주도록 한다.</strong>
Ex) 고양이 데이터 &gt; 개 데이터에서는 고양이 클래스에 상응하는 bias가 더 커지게 된다</p>
</blockquote>
<p><strong>Linear Classification은 K-NN에 비해 test 모델에서 계산 복잡도가 현저히 낮다는 장점을 가지고 있다</strong>.</p>
<ul>
<li><strong>K-NN</strong>은 train model없이 test model에서 입력 데이터 포인트와 나머지 데이터 포인트 간의 거리를 계산해야 하므로 실시간 적용이 어렵다.</li>
<li>반면 <strong>Linear Classification</strong>은 train model에서 학습한 가중치 $W$를 활용하여 test model에서는 입력 데이터에 대한 계산만 수행하면 되므로 계산 복잡도가 현저히 낮아진다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/4579600c-cce9-4db3-8471-1a74a9db6edd/image.png" alt=""></p>
<p>학습한 가중치 $W$를 이용해 input data를 행렬곱하게 된다면 각 카테고리에 해당하는 score가 계산이 될 것이다. 우리는 이 중에서 가장 높은 score에 해당한 카테고리를 선택하면 된다.</p>
<blockquote>
<p>이를 선형 분류기로 해석하는 관점도 가지고 있다.</p>
</blockquote>
<p><strong>다만 Linear Classifier는 각 클래스에 따라 하나의 템플릿만 학습한다는 한계점이 존재한다.</strong></p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/a2f7c3b5-b4d9-41fd-88ad-dfa71f7426c4/image.png" alt="">
오른쪽을 보고 있는 말, 왼쪽을 보고 있는 말의 이미지를 학습한다면, 머리가 두개 달린 말의 이미지가 가중치 $W$에 쌓일 수도 있다. </p>
<p>데이터 분포가 하나의 형태로 모여지는 것이 아닌 다양한 형태로 존재하는 경우에 Linear Classification이 제대로 구별이 힘들다.
<img src="https://velog.velcdn.com/images/bottlemin_park/post/6f9f4bdf-66cd-4eb7-83f1-b01e4feb9332/image.png" alt=""></p>
<hr>
<h2 id="3-setting-hyperparameters">3) Setting Hyperparameters</h2>
<p>K-NN에서만 hyperparameter를 다뤘지만, 추후에 나올 모델들 모두가 이러한 과정을 걸쳐야하므로 일부로 뒤로 뺐다.</p>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/5e16f60f-2fc3-4e2a-b5d6-5d27178013ac/image.png" alt=""></p>
<ul>
<li>** train data : 모델을 학습하기 위함 **</li>
<li>** validation data : 학습한 모델이 충분한 성능을 내는 지 검증하기 위한 데이터**</li>
<li>** test data : 실제 적용할 데이터**</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/e1263a76-dc10-4fd6-bf36-de8ea4c7d6c7/image.png" alt=""></p>
<p>이러한 방식을 통해 최적의 hyperparameter를 결정할 수 있다</p>
<hr>
<h1 id="2-conclusion">2. Conclusion</h1>
<p>Linear Classification을 학습하기 위해서는 Loss function에 대해서 알아야 한다. 하지만 2강은 두 classifier를 소개하는 것으로 마무리했기 때문에 다음 강의 정리에서 소개하도록 하겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[cs231n 스터디 시작 (진행 중)]]></title>
            <link>https://velog.io/@bottlemin_park/cs231n-%EC%8A%A4%ED%84%B0%EB%94%94-%EC%8B%9C%EC%9E%91-%EC%A7%84%ED%96%89-%EC%A4%91</link>
            <guid>https://velog.io/@bottlemin_park/cs231n-%EC%8A%A4%ED%84%B0%EB%94%94-%EC%8B%9C%EC%9E%91-%EC%A7%84%ED%96%89-%EC%A4%91</guid>
            <pubDate>Fri, 26 Apr 2024 15:15:55 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/bottlemin_park/post/78a8d4f2-4478-4f0c-a156-c664a0cfc6da/image.png" alt=""></p>
<h2 id="🚩시작을-하며">🚩시작을 하며...</h2>
<p>졸업을 하고서야 컴퓨터 비전을 희망하는 나에겐 남은 시간이 별로 없다.
왜냐면... <strong>대학원 진학을 위한 준비를 해야하기 때문에!!</strong></p>
<p>그러니 이제부터 공부한 것들을 하나씩 포스팅해가며 컴퓨터 비전 전공자가 되기 위한 기나긴 여정을 진행할 예정이다.</p>
<hr>
<h3 id="cs231n">CS231n</h3>
<p><a href="https://velog.io/@bottlemin_park/cs231n-2%EA%B0%95">CS231n 2강</a> (24-04-30 업데이트)</p>
<p><a href="https://velog.io/@bottlemin_park/cs231n-3%EA%B0%95">CS231n 3강</a> (24-05-03 업데이트)</p>
]]></description>
        </item>
    </channel>
</rss>