<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>정이는 성장중</title>
        <link>https://velog.io/</link>
        <description>📩 qtly_u@naver.com</description>
        <lastBuildDate>Thu, 13 Feb 2025 07:45:19 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>정이는 성장중</title>
            <url>https://velog.velcdn.com/images/qtly_u/profile/e9598cbc-8a06-4d81-a766-2bf49c21e64f/image.jfif</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 정이는 성장중. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/qtly_u" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[paper] ControlNet, Adding Conditional Control to Text-to-Image Diffusion Models]]></title>
            <link>https://velog.io/@qtly_u/n2kjj1jy</link>
            <guid>https://velog.io/@qtly_u/n2kjj1jy</guid>
            <pubDate>Thu, 13 Feb 2025 07:45:19 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>Adding Conditional Control to Text-to-Image Diffusion Models, 2023, <a href="https://arxiv.org/abs/2302.05543">arxiv</a></p>
</blockquote>
<p>ControlNet은 Stable Diffusion 모델에 조건을 추가하여 더 정밀한 이미지 생성을 가능하게 하는 신경망 아키텍처입니다. Stable Diffusion은 원래 텍스트 입력을 바탕으로 이미지를 생성하는 모델로, 입력된 텍스트에 따라 이미지를 생성할 수 있는 강력한 능력을 가지고 있습니다. 텍스트만으로는 원하는 형태나 레이아웃을 반영하기 어려울 뿐 아니라, UNet의 각 레이어에 원하는 컨디션을 concat해주더라도 충분한 퀄리티가 나오기까지의 cost가 굉장히 많이 필요합니다. </p>
<blockquote>
<p>** Stable diffusion (latent diffusion model)**</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/c67c9716-d831-4b94-9091-e38b18b9f0d7/image.png" alt=""></p>
<br/>

<h3 id="controlnet">ControlNet</h3>
<p>ControlNet은 이러한 문제를 해결하기 위해 Stable Diffusion에 조건적 제어(conditional control)를 추가하는 방안을 고안했는데요,
ControlNet은 텍스트와 함께 추가적인 condition 이미지를 입력받아, 이 컨디션에 맞는 이미지를 생성합니다. 예를 들어, 사용자가 제공하는 Canny edge, pose, segmentation map, depth map 등을 추가적으로 입력받아, Stable Diffusion의 이미지 생성 과정을 세밀하게 조정할 수 있게 됩니다. 이렇게 하면, 이미지 생성 시 사용자가 원하는 정확한 형태나 구성 요소를 반영하는 것이 가능합니다.
<img src="https://velog.velcdn.com/images/qtly_u/post/0bd42f73-a130-4706-a4d6-a6c49cec7165/image.png" alt=""></p>
<p>기존 Stable Diffusion 모델의 UNet 부분을 고정된 부분(frozen layers)으로 두고, condition을 학습하는 복제본(trainable copy)을 두어 두 브랜치로 이루어져 있습니다.
<img src="https://velog.velcdn.com/images/qtly_u/post/489af6dc-3b62-4e10-8b5b-d3b72d4183e4/image.png" alt=""></p>
<p>피규어를 살펴보면, Stable Diffusion 모델의 원래 파라미터는 frozen되어 그대로 사용됩니다. 즉, Stable Diffusion의 대형 파라미터는 그대로 유지됩니다.
frozen 모델에 복제본(trainable copy)을 만들어 이 부분을 학습합니다. 복제본은 입력된 조건적 이미지(예: Canny edge, pose, segmentation map 등)로부터 특징을 학습하며, 이를 통해 이미지를 생성할 때 더 정교한 제어가 가능합니다.</p>
<br/>

<h3 id="denosing-process-in-controlnet">Denosing process in ControlNet</h3>
<p>아키텍처를 자세히 들여다보면, 
<img src="https://velog.velcdn.com/images/qtly_u/post/85b5c8e7-e19a-432a-80af-3601e5968bd0/image.png" alt="">
denoising process에서 노이즈 $\epsilon$를 예측하는 UNet은 두 브랜치로 이루어져 있고, condition이 들어가는 ControlNet 브랜치는 zero convolution layer를 사용하여 연결됩니다.</p>
<blockquote>
<h4 id="zero-initialized-layers">Zero-initialized Layers</h4>
<p>zero convolution 레이어들은 bias와 weight들이 모두 0으로 설정되어 있어, 학습이 전혀 되지 않은 상태에서는 기존 stable diffusion의 output과 같습니다. 이 방식은 학습 초기 단계에서 불필요하거나 유해한 노이즈가 모델에 영향을 미치지 않도록 하고, 이는 모델의 기존 성능(사전 학습된 Frozen Model)을 보호하면서 새로운 condition을 점진적으로 학습할 수 있도록 돕습니다. </p>
</blockquote>
<br/>

<h3 id="sudden-convergence-phenomenon">Sudden Convergence Phenomenon</h3>
<p>기존 Stable Diffusion 모델을 그대로 두고, 그 위에 ControlNet을 덧붙이는 방식이므로, finetunning시 학습 속도가 빨라지고 더 적은 데이터로도 효과적인 학습이 가능합니다.</p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/1c693053-b106-4157-93e9-b2d0eda8f6c0/image.png" alt=""></p>
<p>또 그러한 방식을 사용하기 때문에, 논문에서는 ControlNet이 학습 초기에도 high quality의 이미지를 생성하는데, 그 과정에서 <strong>&quot;sudden convergence phenomenon&quot;</strong>을 경험한다고 언급합니다. 이는 학습 초기에 점진적으로 조건을 따라가지는 않지만, 특정 시점에 갑자기 퀀텀 점프를 하여 빠르게 조건을 따르게 되는 현상입니다. 이는 기존 모델을 보호하면서도 새로운 조건을 빠르게 학습할 수 있도록 도와주는 중요한 특징입니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Docker container 환경 구축하기, 서버 간 파일 전송 ]]></title>
            <link>https://velog.io/@qtly_u/i3vmym2a</link>
            <guid>https://velog.io/@qtly_u/i3vmym2a</guid>
            <pubDate>Fri, 24 Jan 2025 07:43:10 GMT</pubDate>
            <description><![CDATA[<p>사용하고 있는 서버에서 다른 서버로 프로젝트 옮기기.. </p>
<blockquote>
<p>상황</p>
</blockquote>
<ul>
<li>ssh접속으로 사용하고 있는 서버에서 gpu사양이 더 좋은 다른 서버로 코드 및 파일 전체, conda 가상환경을 이동하고자 함</li>
<li>현재 사용 서버에는 도커 없음, 루트계정 권한 없음 (일반사용자계정)</li>
<li>이동하려는 새로운 서버에는 도커 컨테이너 환경을 만들고자 함</li>
</ul>
<p>➤ 기존에 사용하던 서버에서 루트 권한이 없어 도커를 설치할 수 없기 때문에, vscode에서 Dockerfile을 작성하는 대신 코드를 서버에서 서버로 보내는 방법을 사용하려고 한다. 
<br/></p>
<hr>
<h3 id="conda-freezing--프로젝트-디렉토리-서버에서-서버로-전송">&lt;Conda freezing &amp; 프로젝트 디렉토리 서버에서 서버로 전송&gt;</h3>
<h4 id="requirementstxt-생성">requirements.txt 생성</h4>
<p>일단 conda 가상환경을 저장해준다.</p>
<pre><code class="language-bash">pip freeze &gt; requirements.txt</code></pre>
<h4 id="프로젝트-코드-압축">프로젝트 코드 압축</h4>
<p>터미널에서 tar -czfg [압축할 폴더명] [경로]</p>
<pre><code class="language-bash">tar -czfg project_code.tar.gz /project/path</code></pre>
<h4 id="server-to-server-파일-및-코드-이동">server to server 파일 및 코드 이동</h4>
<p>scp -P [옮길 서버의 포트번호] [압축한 폴더명] [사용자계정]@[옮길 서버의 IP]:[저장할 경로]</p>
<pre><code class="language-bash">scp -P 22 project_code.tar.gz requirements.txt user@server:/path/target/directory</code></pre>
<br/>

<hr>
<h3 id="docker-컨테이너-환경-구축-및-실행">&lt;Docker 컨테이너 환경 구축 및 실행&gt;</h3>
<p>이동한 서버에는 도커가 이미 설치되어 있어, 아래는 도커 설치 이후 컨테이너를 빌드하는 과정이다.</p>
<h4 id="a-base-image">a. Base image</h4>
<p><a href="https://hub.docker.com/_/docker">https://hub.docker.com/_/docker</a>
해당 링크에서 여러 베이스 이미지를 검색할 수 있다. 원하는 베이스 이미지를 사용하면 되는데, 나는 컨테이너에서 conda를 이용해 파이썬 버전을 따로 관리할 예정이라 우분투와 설치되어있는 cuda 드라이버 버전에 맞추어 주었다. </p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/68babeb6-4872-4d79-8bf4-3e334dbae506/image.png" alt="">
태그란을 클릭하면 cuda 드라이버와 우분투 버전별로 베이스이미지들이 있고,
dockerfile에서 사용할 베이스 이미지를 새로 사용할 서버에 맞게 선택해준다.</p>
<h4 id="b-dockerfile-작성">b. Dockerfile 작성</h4>
<p>도커파일은 설치가 필요한 것들과 config를 설정해주면 되는데, 나는 이런식으로 작성해주었다. conda 환경도 같이 구축한다. </p>
<pre><code class="language-bash"># 예시
FROM nvidia/cuda:11.1.1-cudnn8-devel-ubuntu20.04
#FROM nvidia/cuda:12.2.0-base-ubuntu22.04
#FROM spped2000/dinov2manyproblem:lastest
ARG DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Seoul

# Updating Ubuntu packages
RUN apt-get update &amp;&amp; yes|apt-get upgrade
RUN apt-get install -y emacs wget bzip2 git vim gcc g++ libgl1-mesa-glx
RUN apt-get install -y tzdata

RUN wget https://repo.continuum.io/archive/Anaconda3-2021.04-Linux-x86_64.sh
RUN bash Anaconda3-2021.04-Linux-x86_64.sh -b
RUN rm Anaconda3-2021.04-Linux-x86_64.sh

# Set path to conda
ENV PATH /root/anaconda3/bin:$PATH

# Updating Anaconda packages
RUN conda config --remove channels defaults
RUN conda config --add channels conda-forge
RUN conda config --set channel_priority strict</code></pre>
<h4 id="c-docker-이미지-빌드">c. Docker 이미지 빌드</h4>
<p>작성한 Dockerfile을 기반으로 이미지를 빌드한다. 만든 이미지의 빌드는 터미널에서 다음 커맨드를 입력한다. 
docker build -t [태그명] -f [도커파일 경로]</p>
<pre><code class="language-bash">docker build -t tagname -f dockerfilepath/Dockerfile .</code></pre>
<p>그럼 이미지가 만들어진다. </p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/f42a575b-1a11-428a-a875-88a7c2773b4a/image.png" alt=""></p>
<h4 id="d-docker-컨테이너-생성">d. Docker 컨테이너 생성</h4>
<p>컨테이너 생성은 아래 커맨드를 사용해 생성한다.
-it는 터미널 연결이 끊겨도 컨테이너에서 코드가 계속 돌아갈 수 있도록 하는 옵션이고, 딥러닝 코드를 돌릴 예정이므로 gpu를 사용하는 옵션도 지정해주었다. 그다음 --name [컨테이너명] [이미지이름]:[태그명]이렇게 arg들을 주면 된다. run 옵션은 다음 글을 참고하자. <a href="https://jjuke-brain.tistory.com/entry/Docker-SSH-Visual-Studio-Code%EB%A1%9C-%EC%9E%91%EC%97%85-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0">run명령어옵션</a>
다만 여기에서 호스트 서버의 데이터를 이용해야 할 경우 볼륨을 생성해주어야 하는데, 글 맨 아래 내용을 참고하길 바란다. </p>
<pre><code class="language-bash">docker run -d -it --name containername --gpus all imagename:tag</code></pre>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/ea655328-0649-4d75-a420-09eea049e729/image.png" alt=""></p>
<p>나는 <code>docker run -d -it --name hj --gpus all docker-ai-image:latest</code> 커맨드를 사용하여 hj라는 컨테이너를 생성해주었다.</p>
<h4 id="e-docker-컨테이너-attach">e. Docker 컨테이너 Attach</h4>
<p>컨테이너를 생성했으면 ssh 접속한 것처럼 터미널을 붙일 수 있다. </p>
<p>방법 1) </p>
<pre><code>docker attach containername</code></pre><p>다음 커맨드를 사용하여 터미널을 컨테이너 환경의 터미널로 변경할 수 있고, 
<img src="https://velog.velcdn.com/images/qtly_u/post/38cfb6e8-d72d-48b4-afae-63276401eb9e/image.png" alt=""></p>
<p>방법 2) 
vscode에서 Docker 익스텐션을 설치하였으면 사이드바의 도커에서 해당 컨테이너를 우클릭하여 컨테이너에 접속할 수도 있다. Attach shell 또는 attach vscode를 사용하면 된다. </p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/024ecf33-ce8e-4e31-b834-2508d10f220c/image.png" alt=""></p>
<p>방법 3) 
command palette에서 attach까지 검색하면 컨테이너 터미널로 변경하는 커맨드가 나온다. 
<img src="https://velog.velcdn.com/images/qtly_u/post/5abf309a-bb97-4d1f-83c2-426cc501d53e/image.png" alt=""></p>
<p>*첫번째 CLI방법으로 도커에서 빠져나올때 exit나 CTRL+C로 나오면 컨테이너가 종료되기 때문에, 터미널을 종료하더라도 컨테이너에서 실행중인 코드를 계속 유지하고 싶다면 CTRL+P+Q로 나와야만 유지할 수 있다.</p>
<br/>

<p>생성한 컨테이너에 접속하면 사용자이름이 root계정으로 바뀌고 conda도 잘 설치되어있는 모습을 볼 수 있다. </p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/02b84f18-64fe-49a9-bd78-1bbe4c4e7b1c/image.png" alt=""></p>
<br/>

<hr>
<p>@
서버에서 다른 서버의 도커 컨테이너로 파일을 직접 전송하는 방법은 없기 때문에, 서버로 전송한 프로젝트 파일을 다시 컨테이너로 옮겨주어야 했다.</p>
<p>두 가지 방법이 있는데, </p>
<p>방법 1) 직접 컨테이너로 옮기는 방식</p>
<p>직접 컨테이너로 옮기는 방식은 
docker cp [프로젝트 압축파일 경로] [container_id]:[컨테이너에서 프로젝트파일을 저장할 경로] </p>
<pre><code class="language-bash">docker cp /path/project/file container_id:path/container/destination</code></pre>
<p>이렇게 사용하면 되고, *container_id는 <code>docker ps</code>를 치면 확인할 수 있다. </p>
<p>방법 2) 볼륨 생성하기 </p>
<p>다른 방법은 호스트 서버에 데이터가 있고 그 데이터를 컨테이너에서 이용하는 방법이다.
컨테이너에 파일데이터를 직접 옮겨줄 경우 컨테이너를 삭제하면 안의 파일들도 다 삭제되기 때문에, 도커에서는 볼륨이라는 것을 사용한다.
볼륨은 컨테이너가 삭제되더라도 데이터를 지속적으로 보존할 수 있게 해주는데, 볼륨을 사용하면 컨테이너를 삭제해도 데이터는 볼륨에 저장되고, 새로운 컨테이너를 실행할 때 이 볼륨을 다시 마운트할 수 있다.</p>
<p>먼저 서버에서 볼륨을 생성해준다. </p>
<pre><code>docker volume create my_volume</code></pre><p>그리고 컨테이너 실행시 볼륨의 경로를 지정해주는 옵션을 함께 넣어주면 된다.</p>
<pre><code>docker run -v my_volume:/path/to/data &lt;other-options&gt; &lt;image-name&gt;</code></pre><p><img src="https://velog.velcdn.com/images/qtly_u/post/96fc633f-8969-4e40-99a5-c12e64395e75/image.png" alt=""></p>
<p>아무튼 파일 압축을 풀고 conda requirements 파일을 이용해 가상환경을 다시 구축해주었다. </p>
<br/>


<p><span style="color: skyblue"><em>끝!</em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[paper] Stable diffusion]]></title>
            <link>https://velog.io/@qtly_u/paper-Stable-diffusion</link>
            <guid>https://velog.io/@qtly_u/paper-Stable-diffusion</guid>
            <pubDate>Wed, 04 Dec 2024 06:39:07 GMT</pubDate>
            <description><![CDATA[<p><strong>_High-Resolution Image Synthesis with Latent Diffusion Models, 2022, CVPR 
_</strong>
Stable Diffusion은 2022년 8월 Stability AI에서 발표한 text-to-image 생성 모델로, 오픈소스로 공개되어 인공지능 이미지 생성 분야에서 큰 주목을 받았는데요, 24년 12월 기준 1만 2천회가 넘는 인용수를 가지는 논문입니다. 최근 컴퓨터비전에서 주로 연구 및 발전되고 있는 생성모델 분류이고, 다양한 여러 태스크에서 stable diffusion의 아키텍처를 이용하여 SOTA를 달성한 모습을 많이 볼 수 있습니다. </p>
<br/>
<br/>

<h2 id="introduction">Introduction</h2>
<hr>
<p> 기존의 이미지 생성 모델인 Generative Adversarial Networks(GAN)와 Variational Autoencoders(VAE)는 훈련의 불안정성, mode collapse, 낮은 해상도 등의 문제를 겪었습니다. Diffusion 모델은 이러한 한계를 극복하며 고품질 이미지 생성을 가능하게 했지만, 픽셀 공간에서 동작하므로 높은 cost과 학습 시간이 요구됩니다.</p>
<blockquote>
<p>Image generation model의 분류</p>
</blockquote>
<ul>
<li>Autoregressive(AR) 모델:<ul>
<li>픽셀 단위로 순차적으로 이미지를 생성하며, 밀도 추정에서 강력한 성능을 보임</li>
<li>그러나 낮은 해상도에만 적합하며, 높은 계산 비용으로 인해 고해상도 이미지를 생성하는 데 제약이 있음</li>
</ul>
</li>
<li>GAN(Generative Adversarial Networks):<ul>
<li>높은 품질의 이미지를 생성할 수 있지만, 학습이 불안정하며, 데이터 분포의 다양한 모드를 모두 학습하지 못하는 mode collapse 문제를 겪음</li>
</ul>
</li>
<li>Diffusion 모델(DM):<ul>
<li>노이즈를 추가하고 제거하는 과정을 통해 이미지를 생성하며, GAN의 mode collapse 문제를 해결</li>
<li>그러나 픽셀 공간에서 작동하기 때문에(pixel-level의 reconstruction) <strong>계산 비용이 높고, train 및 test가 비효율적</strong></li>
</ul>
</li>
</ul>
<br/>

<p>diffusion model에서 상당한 리소스가 소요된다는 점을 해결하기 위해 저자들은 diffusion model의 학습 단계를 분석했을때, likelihood 기반의 모델들이 다음 그림과 같은 두가지 단계를 거친다는 것을 발견했습니다. </p>
<blockquote>
<p>Likelihood based model의 <strong>Training Stages</strong></p>
</blockquote>
<ul>
<li>First, Perceptual compression</li>
<li>Second, Semantic Compression</li>
</ul>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/28d29105-65e9-455e-b216-2963f5cc5a60/image.png" alt=""></p>
<p>먼저 피규어를 설명하기에 앞서서 Rate(bits/dim)은 압축에 사용되는 비트수인데요, 0에 가까워질수록 압축에 사용되는 비트수가 적기 때문에 크게 압축된 상태라고 보시면 됩니다. 그래서 학습단계에서는 원본 상태(=압축률 낮음, 비트수 많음)에서 압축이 큰 단계로 가는 것이 latent space로 가는 과정이라고 할 수 있겠습니다. </p>
<p>그래서 첫 번째로 <strong>perceptual compression 단계</strong>에서는 high frequency 영역을 제거하면서 semantic 정보를 유지하는 단계입니다. 그림상에서 오른쪽 하단 부분인데요, 오른쪽 세장의 사진에서 선글라스 낀 남성의 모습이 유지되는 것을 알 수 있습니다.</p>
<p>그러고 나서 <strong>Semantic compression 단계</strong>를 거친다고 합니다. 이 단계에서는 semantic하고 coneptual한 구성을 파악하는 단계입니다. 그림상에서 왼쪽인데요, 왼쪽에서는 선글라스, 남성 등의 context가 사라지고 사람 얼굴만 유지되는 것을 알 수 있습니다. </p>
<p>그래서 perceptually equivalent하면서, 적합한 space를 찾아서 diffusion 모델을 학습시키겠다는 것이 논문의 요지입니다. perceptually equivalent하다는 것은 원본과 거의 차이가 없는, 즉 피규어 상에서 가장 오른쪽에 있는 사진으로부터 세번째 사진 지점의 latent space에서 high-resolution의 이미지를 위한 diffusion을 학습시키겠다는 것입니다.
<br/>
<br/></p>
<h2 id="arcitecture">Arcitecture</h2>
<hr>
<p>이를 위해 학습단계를 구별되도록 아키텍처를 설정하는데요, 첫번째 단계인 perceptual compression 단계는 Autoencoder, Semantic Compression 단계는 Diffusion Model로 구성을 합니다.</p>
<blockquote>
<p><strong>Distinct Training phases</strong></p>
</blockquote>
<ul>
<li>Perceptual compression → Autoencoder</li>
<li>Semantic compression → Latent Diffusion Model(LDM)</li>
</ul>
<p>autoencoder를 통해 효율적인 작은 차원으로 만들면서, perceptual하게 동등한 data space로 만드는 것입니다. 압축된 공간에서부터 diffusion model이 동작하기 때문에, 효율적인 이미지 생성을 할 수 있습니다. </p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/bc5dd91f-0800-42af-9ad8-a2e47f2ed7a7/image.png" alt=""></p>
<h3 id="1-autoencoder">1. Autoencoder</h3>
<p>빨간색 부분이 Autoencoder입니다. Autoencoder에서는 perceptual compression을 위해 두가지 loss를 활용하는데요,</p>
<blockquote>
<ul>
<li>perceptual loss</li>
<li>patch-based adversarial objective</li>
</ul>
</blockquote>
<p><strong>perceptual loss</strong>는 VGG같은 pretrained model을 사용하여 high-level의 featuremap을 뽑아서 원본과 비교하는 형식의 loss입니다. 기존에 주로 사용하는 L1, L2 loss의 경우 pixel-level의 compression, reconstruction을 진행하면서 blurriness 문제가 발생하는데, perceptual loss를 사용하면 피할 수 있고 보다 이미지 매니폴드를 잘 따르게 할 수 있다고 합니다.</p>
<p><strong>patch-based adversarial objective</strong>는 PatchGAN에서 사용하는 loss인데, 패치단위에서 패치의 real/fake 여부를 판별하게 만들면서 local realism을 학습할 수 있도록 하는 것입니다.</p>
<p>모델 코드 내에서는 autoencoder가 perceptual loss를 따르도록 하고, autoencoder가 생성한 이미지를 구별해내는 dicriminator가 patch-based loss를 따르도록 하여 adversarial하게 학습을 진행하고 있습니다. </p>
<p>이때 latent space가 높은 variance를 갖는 것을 피하기 위해 논문에서는 두가지 regularization을 언급하는데요, </p>
<blockquote>
<p>Regularization for avoiding high-variance of latent space</p>
<ul>
<li>KL-reg</li>
<li>VQ-reg</li>
</ul>
</blockquote>
<p>첫번째로는 latent space가  VAE처럼 정규분포를 따르도록 KL penalty를 주는 것, 두번째는 디코더의 레이어에 vector quantization을 주는 것입니다. 뒤에서 나오는 실험파트에서 VQ-reg가 더 좋았다고 언급합니다.</p>
<p>이렇게 만들어진 latent space는 x의 representation을 잘 보존하고, 적합한 압축률을 가진다고 합니다.</p>
<h3 id="2-latent-diffusion-modelldm">2. Latent Diffusion Model(LDM)</h3>
<p>그림상에서 초록색 부분입니다.</p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/716cff0e-3577-48e5-9889-342c497a4384/image.png" alt=""></p>
<p>👉 기존의 diffusion model(DM)에서는 노이즈가 정규분포를 따른다고 가정하고, 타임스텝 t에 따른 노이즈를 예측(예측된 noise $\epsilon_\theta (x_t, t)$)하여 L2 loss를 줄이는 방식으로 학습했는데요, </p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/b533f60c-1881-43be-a7b5-ed1dc4afe0b1/image.png" alt=""></p>
<p>👉 LDM에서는 기존의 DM처럼 노이즈를 예측하는 것은 똑같지만 x대신 오토인코더의 latent space에 임베딩된 feature를 사용하여, 타임스탭 t가 주어졌을때 노이즈 스텝에서의 t시점 잠재공간 z의 noise를 예측하도록 학습합니다. </p>
<p>이렇게 학습하는 것이 pixel-level의 고차원과 비교했을때 likelihood 기반의 모델에 적합하다고 합니다. 즉 이 space가 semantinc bits에 더 잘 집중하고, 학습시 cost가 적다고 합니다.</p>
<h3 id="3-conditioning-mechanism">3. Conditioning Mechanism</h3>
<p>기존의 diffusion model의 경우 $p(x|y)$로 같은 condition y가 주어졌을때 x를 생성하는 작업이 가능했지만, 주로 condition은 클래스 라벨이나 블러리한 이미지로 다른 condition에 대한 탐구가 이루어지지 않았는데요, stable diffusion에서는 LDM에서 $Z_t$ → $Z_{t-1}$로 가는 기존의 UNet의 레이어를 어텐션 레이어를 사용함으로써 다양한 모달리티를 condition으로 사용할 수 있습니다.</p>
<p>domain specific한 encoder $\tau _\theta$로 y를 적합한 latent space로 변환하고, UNet 레이어마다 cross attention을 계산할 수 있습니다.</p>
<p>equation은 다음과 같습니다:
<img src="https://velog.velcdn.com/images/qtly_u/post/8ed7f43b-d381-4eb8-b348-4d45bf91898f/image.png" alt=""></p>
<ul>
<li>여기서 $\varphi$는 UNet의 중간 representation을 attention matrix 계산을 위해 flatten 시킨 노테이션입니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/baa5baca-5cc0-452c-8346-64ed96d49790/image.png" alt=""></p>
<p>👉 그러면 수식은 기존의 LDM에서 임베딩된 y($\tau_\theta(y)$)가 주어졌을 때의 노이즈를 예측하는 것으로 변형되고, 이 때 두 인코더 $\varepsilon$과 $\tau$는 동시에 학습됩니다. 이 메커니즘을 통해 encoder $\tau$는 domain에 적합한 expert가 되고, 예를 들어서 text가 condition으로 들어온다고 하면 트랜스포머모델을 사용할 수 있습니다. </p>
<br/>
<br/>

<h2 id="experiments">Experiments</h2>
<hr>
<ul>
<li>Regularization에 대한 실험
AutoEncoder에 대한 regularization으로 vector quantization을 사용하는 것이 성능이 좋았다는 것을 언급하고 있습니다. f는 down sampling 계수인데, 기존 dimension에서 다운샘플링될때 한 비트에 대응되는 픽셀 수입니다.
<img src="https://velog.velcdn.com/images/qtly_u/post/bd7745ca-94a1-4fc8-9864-89d66b47327d/image.png" alt=""></li>
</ul>
<ul>
<li><p>Compression에 따른 성능 비교
LDM-1은 기존 pixel space의 diffusion model입니다. 아래 figure를 보면 너무 많이 압축된 LDM-32의 경우에는 정보 손실로 인해 일정 train step 이후 충분한 학습이 어렵습니다. 반면 적당이 압축된 LDM-{4, 8, 16}의 경우에는 FID, Inception score모두 좋은 성능을 보이는 것을 확인할 수 있습니다.
<img src="https://velog.velcdn.com/images/qtly_u/post/ed09c081-da3a-4a71-8eb1-af88bfd5b374/image.png" alt=""></p>
<p>CelebA-HQ (왼쪽), ImageNet (오른쪽) 두 데이터셋에서 압축률에 따른 FID score를 확인했을때는, 상대적으로 어려운 ImageNet같은 데이터셋에서는 압축률을 줄여야함을 알 수 있습니다. 
<img src="https://velog.velcdn.com/images/qtly_u/post/abfae665-6308-4a89-927a-a4067a0d7f71/image.png" alt=""></p>
</li>
<li><p>기타 실험 결과 및 성과</p>
<ul>
<li>기존 모델들과의 성능 비교: 기존의 GAN, VAE 기반 모델들과 비교하여 더 나은 성능과 효율성을 입증하였습니다.
<img src="https://velog.velcdn.com/images/qtly_u/post/f76f7ecb-202a-4aa6-ae08-408feea05f56/image.png" alt=""></li>
<li>Text-to-Image, Layout-to-Image, Super Resolution, Inpainting 등 다양한 응용 사례: 텍스트를 통한 이미지 생성, 레이아웃 기반 이미지 생성, 초해상도, 이미지 복원 등 다양한 응용 분야에서 우수한 성능을 보였습니다
<img src="https://velog.velcdn.com/images/qtly_u/post/99679c94-ca70-457c-b5ae-fc9b888ae7a0/image.png" alt=""></li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/ec696d2d-4028-446b-aad8-3a5a11609aaf/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[YAML과 Hydra를 이용한 config 관리]]></title>
            <link>https://velog.io/@qtly_u/YAML%EA%B3%BC-Hydra%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-config-%EA%B4%80%EB%A6%AC</link>
            <guid>https://velog.io/@qtly_u/YAML%EA%B3%BC-Hydra%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-config-%EA%B4%80%EB%A6%AC</guid>
            <pubDate>Wed, 02 Oct 2024 06:59:10 GMT</pubDate>
            <description><![CDATA[<h3 id="모델-config에서-yaml과-hydra를-사용하는-이유">모델 config에서 YAML과 Hydra를 사용하는 이유</h3>
<p>딥러닝이나 머신러닝 프로젝트를 하다 보면, 모델의 config 파일을 통해 학습에 필요한 다양한 설정을 정의하게 됩니다. 이러한 설정 파일을 만들 때 가장 많이 사용하는 포맷이 YAML입니다. 또한, 설정 파일을 효율적으로 관리하고, 다양한 실험 환경을 지원하기 위해 Hydra라는 프레임워크도 함께 사용하는 경우가 많습니다.</p>
<p>오늘은 YAML과 Hydra로 모델의 설정 파일을 만들고 관리하는 방법에 대해서 살펴보겠습니다.
<br/></p>
<h2 id="1-yaml-설정-파일-형식">1. YAML: 설정 파일 형식</h2>
<hr>
<p>먼저, YAML은 &quot;YAML Ain&#39;t Markup Language&quot;의 줄임말로, 데이터를 표현하는 데 매우 간결하고 사람이 읽기 쉬운 포맷입니다. JSON과 비슷한 형식이지만, 가독성이 훨씬 뛰어나기 때문에 구성 파일로 많이 사용됩니다.
<br/></p>
<blockquote>
<p>YAML 사용 이유</p>
</blockquote>
<ul>
<li>가독성: 들여쓰기를 사용해 구조를 표현하기 때문에, 데이터를 직관적으로 이해할 수 있습니다. 중괄호나 대괄호를 사용하는 JSON보다 훨씬 간결하게 표현됩니다.</li>
<li>유연한 데이터 구조: 딕셔너리, 리스트 같은 다양한 데이터 구조를 쉽게 표현할 수 있습니다.</li>
<li>주석 지원: #을 사용해서 주석을 추가할 수 있어, 설정 파일에 설명을 추가할 수 있습니다. 이는 JSON과 비교했을 때 큰 장점입니다.<br/>

</li>
</ul>
<blockquote>
<p>YAML의 기본 문법</p>
</blockquote>
<p>YAML에서 가장 기본적인 데이터 표현은 키-값 쌍입니다. 설정 파일에서 변수와 그 값을 정의하는 방식입니다.</p>
<pre><code class="language-yaml">model:
  name: resnet50
  learning_rate: 0.001
  epochs: 50</code></pre>
<p>위의 예시는 model이라는 키에 대한 세부 설정을 표현한 것입니다. name, learning_rate, epochs는 각각 모델의 이름, 학습률, 학습 횟수를 나타냅니다.
<br/></p>
<blockquote>
<p>리스트와 딕셔너리 표현</p>
</blockquote>
<p>YAML은 리스트와 딕셔너리를 사용하여 복잡한 데이터를 직관적으로 표현할 수 있습니다.</p>
<pre><code class="language-yaml"># 리스트 표현
layers:
  - conv1
  - conv2
  - conv3

# 딕셔너리 표현
dataset:
  name: CIFAR10
  path: /datasets/cifar10
  batch_size: 32</code></pre>
<p>리스트는 -로 항목을 구분하며, 딕셔너리는 들여쓰기를 통해 하위 키와 값을 표현합니다. 이런 방식으로 모델의 구성이나 데이터셋 정보를 YAML에 정의할 수 있습니다.
<br/>
<br/></p>
<h2 id="hydra-설정-관리-프레임워크">Hydra: 설정 관리 프레임워크</h2>
<hr>
<p>다음으로 Hydra는 구성 파일을 동적으로 관리하고 다양한 실험 환경을 지원하기 위해 만들어진 Python 프레임워크입니다. 실험에서 하이퍼파라미터 튜닝이나 다양한 설정을 테스트할 때 매우 유용합니다.</p>
<blockquote>
<p>Hydra의 핵심 기능</p>
</blockquote>
<p>Hydra는 YAML 파일을 바탕으로, 실행 시점에 설정 값을 쉽게 변경하거나, 여러 실험을 자동으로 관리하는 기능을 제공합니다.
<br/></p>
<blockquote>
<p>Config Override</p>
</blockquote>
<p>Hydra는 커맨드 라인에서 설정 파일에 정의된 값을 쉽게 오버라이드할 수 있습니다. 예를 들어, config.yaml 파일에서 학습률을 0.001로 정의했더라도 실행 시 다음과 같이 값을 변경할 수 있습니다.</p>
<pre><code class="language-bash">python train.py model.learning_rate=0.01</code></pre>
<p>이처럼 코드 수정 없이 커맨드 라인에서 파라미터 값을 변경할 수 있어 매우 유용합니다.
<br/></p>
<blockquote>
<p>구성 파일 상속 및 계층화</p>
</blockquote>
<p>Hydra는 구성 파일을 상속하고, 계층적으로 관리할 수 있습니다. 예를 들어, 모델 구조, 데이터셋, 학습 파라미터 등 여러 설정 파일을 나누고, 실행 시 필요한 부분만 결합하여 사용할 수 있습니다.</p>
<pre><code class="language-yaml">
# config.yaml
defaults:
  - dataset: cifar10
  - model: resnet50
  - optimizer: adam</code></pre>
<p>실행 시 데이터셋을 cifar100으로 바꾸고 싶다면 이렇게 할 수 있습니다.</p>
<pre><code class="language-bash">python train.py dataset=cifar100</code></pre>
<br/>

<blockquote>
<p>멀티런 기능 (Multirun)</p>
</blockquote>
<p>여러 하이퍼파라미터 조합을 실험할 때, Hydra의 멀티런 기능을 사용하면 한 번의 명령어로 여러 설정을 자동으로 테스트할 수 있습니다.</p>
<pre><code class="language-bash">python train.py -m model.learning_rate=0.001,0.01 optimizer=adam,sgd</code></pre>
<p>위 명령어는 learning_rate와 optimizer의 다양한 조합으로 자동으로 여러 번의 실험을 수행합니다.
<br/>
<br/></p>
<h2 id="3-yaml과-hydra의-사용-예제">3. YAML과 Hydra의 사용 예제</h2>
<hr>
<p>이제 YAML과 Hydra를 결합하여 어떻게 사용하는지 살펴보겠습니다.</p>
<p>1) YAML 파일 작성
우선, config.yaml 파일에 모델과 학습에 필요한 기본 설정을 정의합니다.</p>
<pre><code class="language-yaml"># config.yaml
model:
  name: resnet50
  learning_rate: 0.001
  layers:
    - conv1
    - conv2
    - conv3

dataset:
  name: CIFAR10
  path: /datasets/cifar10
  batch_size: 32

optimizer:
  type: adam
  weight_decay: 0.0005</code></pre>
<p>2) Hydra로 설정 파일 로드
이제 Python 코드에서 Hydra를 이용해 이 설정 파일을 로드하고, 필요한 값을 사용합니다.</p>
<pre><code class="language-python">import hydra
from omegaconf import DictConfig

@hydra.main(config_path=&quot;.&quot;, config_name=&quot;config&quot;)
def train(cfg: DictConfig):
    print(f&quot;Using model: {cfg.model.name}&quot;)
    print(f&quot;Learning rate: {cfg.model.learning_rate}&quot;)
    print(f&quot;Dataset path: {cfg.dataset.path}&quot;)

if __name__ == &quot;__main__&quot;:
    train()</code></pre>
<p>3) 실행 시 설정 오버라이드
위의 코드를 실행할 때, 다음과 같이 설정을 동적으로 오버라이드할 수 있습니다.</p>
<pre><code class="language-bash">python train.py model.learning_rate=0.01 dataset.batch_size=64</code></pre>
<p>이 명령어는 학습률을 0.01로, 배치 사이즈를 64로 변경하여 실행하게 됩니다.</p>
<p>4) 멀티런으로 실험 자동화
하이퍼파라미터 튜닝을 위해 멀티런 기능을 사용할 수도 있습니다.</p>
<pre><code class="language-bash">python train.py -m model.learning_rate=0.001,0.01 optimizer.type=adam,sgd</code></pre>
<p>이 명령어는 learning rate와 optimizer의 다양한 조합으로 자동으로 실험을 수행합니다.
<br/>
<br/></p>
<h2 id="4-마무리">4. 마무리</h2>
<hr>
<p>모델의 config를 관리하는 것은 매우 중요하지만, 이를 직접 코드로 구현하면 복잡해지고 관리가 어려워질 수 있기 때문에 YAML과 Hydra를 사용하면 설정 파일을 보다 직관적이고 가독성 좋게 관리할 수 있으며, 다양한 실험을 손쉽게 실행할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[paper]  NOPE: Novel Object Pose Estimation from a Single Image]]></title>
            <link>https://velog.io/@qtly_u/paper-NOPE-Novel-Object-Pose-Estimation-from-a-Single-Image</link>
            <guid>https://velog.io/@qtly_u/paper-NOPE-Novel-Object-Pose-Estimation-from-a-Single-Image</guid>
            <pubDate>Fri, 13 Sep 2024 01:50:07 GMT</pubDate>
            <description><![CDATA[<p><a href="https://arxiv.org/abs/2303.13612">NOPE: Novel Object Pose Estimation from a Single Image</a>은 arxiv 기준 23년 3월에 게재된 페이퍼입니다.</p>
<p>페이퍼 내용에 앞서 6D pose estimation task를 살펴보겠습니다.
<br/></p>
<p>먼저 최근 6D Pose estimation은 CAD model과 같은 3D 모델을 사용하여 <strong>instance level</strong>에서 estimation하거나, 카테고리의 general한 feature를 이용하는 경우(<strong>category-level</strong>이라고 함)로 크게 분류할 수 있습니다. </p>
<p>approach는 다음과 같이 분류할 수 있습니다.</p>
<blockquote>
<ol>
<li>Feature-based Methods
이미지에서 특징점을 추출하고,이를 바탕으로 3D공간에서 객체의 위치와 방향을 추정</li>
<li>Neural Surface Reconstruction-based Methods
객체의 3D 구조를 학습하여 6D 포즈를 추정할 때 이 3D구조를 참고하는 방식
ex.NeuSurfEmb</li>
<li>Template Matching-based Methods
사전 생성된 템플릿 이미지와 입력 이미지 간의 유사성을 기반으로 객체의 6D 포즈를 추정하는 방식
ex. GigaPose</li>
<li>Pose Regression-based Methods
단일 RGB 이미지ㅣ로부터 직접적으로 6D 포즈를 regression하는 방식으로 특징점 추출이나 3D 구조 재구성을 하지 않으며, 신경망을 사용해 직접적으로 표즈를 예측하는 방식</li>
</ol>
</blockquote>
<p>최근에는 정확도가 낮은 pose regression 방식보다는 reconstruction-based method를 거친 후 키포인트를 조정하는 방식의 아키텍처로 많이 연구가 이뤄지고 있고, 오늘 소개할 NOPE은 reconstruction, template mathching methods와 가깝다고 볼 수 있습니다.</p>
<p>기존의 object pose estimation (OPE) 방법들은 3D 모델, 다수의 이미지(reference images, 비디오 시퀀스)를 필요로 하고 새로운 객체나 카테고리에 대해 재학습이 필요한 반면에, 
NOPE은 single 이미지만으로 새로운 객체의 상대적인 3D pose(rotation)을 예측할 수 있다고 합니다. 또한 3D 모델이나 새로운 instance에 대한 재학습도 필요없다고 합니다.
<br/></p>
<h3 id="framework">Framework</h3>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/93d0a8e8-4f26-4457-ac79-8c71b451938b/image.png" alt=""></p>
<p>NOPE 모델의 아키텍처는 요약하면 아래와 같은 방식으로 동작합니다.</p>
<p>여기서 논문 제목 때문에 헷갈릴 수 있는 요소가 있는데, 정말 single 이미지에서의 pose estimation이 아니고, 포즈 정보를 가지고 있는 reference 이미지 한장이 필요합니다. 포즈 정보를 알고 있는 reference <strong>이미지 한장만 있으면</strong> _category 정보, instance의 CAD 모델, 다수의 reference 이미지(또는 비디오 시퀀스)_가 없어도 pose estimation을 할 수 있다,는 것이 이 모델의 contribution이라고 할 수 있습니다. </p>
<blockquote>
<p>요약</p>
</blockquote>
<p>reference image를 바탕으로 다양한 view에서의 객체의 예상모습(pose포함)을 생성하고,생성한 이미지의 representation을 템플릿으로 사용해 쿼리이미지의 representation과 매칭하여 상대적인 포즈추정</p>
<blockquote>
<p>네트워크 구성</p>
</blockquote>
<p>네트워크는 U-Net과 같은 모양으로 구성이 되어있고, 이 네트워크는 reference 이미지가 특정 상대적인 포즈에서 어떻게 보일지에 대한 임베딩을 생성합니다.
또 각 레이어에서는 포즈 임베딩을 condition으로 사용하는데, reference 이미지가 주어진 상대적 포즈에서 어떻게 보일지를 예측합니다.</p>
<blockquote>
<p>과정</p>
</blockquote>
<ol>
<li>이미지 임베딩
reference 이미지와 query 이미지를 U-Net을 통해 임베딩</li>
<li>템플릿 생성
reference 이미지에서 객체의 다양한 view에서 보이는 모습을 예측하여 각 view에 해당하는 임베딩 생성
생성한 임베딩은 해당 view에서의 pose 정보를 가진 템플릿이 됨</li>
<li>템플릿 매칭
query 이미지와 reference 이미지의 템플릿을 매칭하여 쿼리 이미지에서의 객체의 상대적인 포즈를  추정<br/>

</li>
</ol>
<h3 id="pose-prediction">Pose prediction</h3>
<p>3번째 phase인 템플릿 매칭에 대해서 살펴보면, 아래와 같은 단계로 구성됩니다.</p>
<blockquote>
<p>1) 주어진 reference image $I_r$와 N개의 상대적 view $P_n$에 대해, 각 view에 해당하는 예측된 임베딩을 획득</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/c06c2387-56a4-4dca-9b5f-46da1512c71d/image.png" alt=""></p>
<p><span style="color:gray">Templates for 3D Object Pose Estimation Revisited:Generalization to New Objects and Robustness to Occlusions
<a href="https://arxiv.org/pdf/2203.17234">(link)</a></span></p>
<p>따라서 모든 view(342개)에서의 확률이 계산됩니다.</p>
<p>$p(\Delta R | I_r, R_q) = \mathcal{N}(e_q|e(e_r, \Delta R), \sum(e_r, \Delta R))$</p>
<ul>
<li>$I_r$ : reference 이미지</li>
<li>$e_q$, $e_r$ : 쿼리/reference 이미지의 임베딩</li>
<li>$R$ : 참조이미지에서 쿼리이미지로의 회전행렬</li>
<li>$e(e_r, \Delta R)$ : 참조이미지의 임베딩에서 회전 $\Delta R$을 적용했을 때의 평균 임베딩</li>
<li>$\sum (e_r, \Delta R)$ : covariance, 회전 $\Delta R$에서의 불확실성</li>
</ul>
<p>여기서 $e(e_r, \Delta R)$는 회전 $\Delta R$에서 객체가 보일 수 있는 모든 가능한 모습을 평균적으로 나타내는 임베딩으로, 객체의 다양한 3D 형태를 고려하여 임베딩이 계산됩니다.</p>
<p>$e(e_r, \Delta R) = \int_M e(\Delta R, \mathcal{M})p(\mathcal{M}|e_r)d\mathcal{M}$</p>
<ul>
<li>$\mathcal{M}$는 객체의 3D 모델
그래서 평균임베딩이라는 것은 객체가 가질 수 있는 다양한 모습을 통합한 <strong>일반화된 표현</strong>이며, 저장된 임베딩은 객체의 <strong>구체적인 시각적 디테일</strong>보다는, <strong>객체의 포즈와 형태를 구별하는 데 필요한 중요한 특징</strong>을 담고 있다고 할 수 있습니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/ac4e18e2-4baa-41ef-aa42-646f505895d1/image.png" alt="">
<br/></p>
<blockquote>
<p>2) Nearest neighbor search를 사용하여 쿼리 이미지의 임베딩과 가장 가까운 임베딩을 가진 reference point를 찾아서 query 이미지와 ref 이미지의 상대적 포즈 결정</p>
</blockquote>
<ul>
<li>Nearest 상위 N개의 템플릿(3 또는 5개)를 사용하여 포즈 평가
  → 각 템플릿에서 얻은 포즈 결과들을 추가적으로 분석하여 오차가 가장 작은 포즈를 선택하는 방식으로 동작</li>
</ul>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/34325a40-bae2-4016-964a-93ae44794472/image.png" alt=""></p>
<br/>


<h3 id="loss-function">Loss function</h3>
<p>loss는 l2 norm으로 계산됩니다.</p>
<p>$\sum_{(e_1, e_2, \Delta R)} |F(e_1, \Delta R)- e_2|^2$</p>
<ul>
<li>F는 참조이미지의 임베딩($e_1$)을 입력으로 받아 회전행렬을 적용한 후 결과를 예측하는 네트워크</li>
<li>$e_2$는 truth embedding<br/>


</li>
</ul>
<h3 id="experiments">Experiments</h3>
<blockquote>
<p>비교대상</p>
</blockquote>
<ul>
<li><strong>PIZZA</strong>: regression 기반 접근 방식으로, 상대적인 포즈를 직접 예측</li>
<li><strong>SSVE</strong> 및 <strong>ViewNet</strong>: 이 두 기법은 semi-supervised learning 및 self-supervised learning을 사용하여 view point 추정을 이미지 reconstruction 문제로 처리, 학습된 객체 카테고리만 사용할 수 있음</li>
<li><strong>3DiM</strong>: 주로 view synthesis에 초점을 맞춘 기법으로, 3D 객체 포즈 추정을 위한 템플릿을 생성하고 가장 가까운 이웃 검색을 사용해 포즈를 추정</li>
</ul>
<blockquote>
<p><strong>ShapeNet</strong></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/75e5878e-b1dc-444e-bfcf-bb69e87325e9/image.png" alt=""></p>
<p>NOPE은 새로운 객체에서도 더나은 generalize <strong>성능</strong>을 보여주었으며, 특히 <strong>회전 대칭성</strong>을 가진 객체에서도 탁월한 성능을 발휘했습니다.</p>
<p>기존의 방법들은 새로운 객체나 학습되지 않은 카테고리에서 성능이 저하되는 반면, NOPE은 학습되지 않은 객체 카테고리에서도 강력한 성능을 유지할 수 있음을 보입니다.</p>
<blockquote>
<p><strong>T-LESS</strong></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/20c3b5a3-5a1a-4e27-a8b1-6ae25ff7bad6/image.png" alt=""></p>
<p>GT CAD 모델을 사용하는 모델 중 [32]의 성능에는 미치지 못했지만 [47]은 능가한 모습을 볼 수 있습니다.</p>
<blockquote>
<p><strong>Robustness to occlusions</strong></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/3e8da795-9807-4cd8-9b14-ecc7b9f07fa1/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/5cef08ba-06b9-49db-8d64-5a1ca5b73b7b/image.png" alt=""></p>
<p>NOPE은 <strong>큰 가림이 있는 경우에도</strong> 여전히 robust한 성능을 보입니다.</p>
<blockquote>
<p><strong>Failure cases</strong></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/af79cfc0-5e64-4d42-9e1d-6b2edc3517fe/image.png" alt=""></p>
<ul>
<li>모든 방법이 <strong>시계(clock)</strong>, <strong>식기세척기(dishwasher)</strong>, <strong>기타(guitar)</strong>, <strong>머그잔(mug)</strong> 카테고리에서는 정확한 결과를 내지 못했으며, 이는 높은 median의 오류로 확인되었다고 합니다.</li>
<li><strong>기타를 제외한</strong> 이 카테고리들은 <strong>거의 대칭적</strong>이며, 작은 디테일만이 포즈의 모호성을 제거하기 때문에 pose estimation에 어려움을 겪었고, NOPE은 <strong>90도 또는 180도 대칭성</strong>을 가진 객체에서 상위 3개 또는 5개의 가장 가까운 이웃을 사용함으로써 중앙값 오류를 크게 개선했지만, <strong>머그잔과 같이 원형 대칭을 가진</strong> 객체에서는 개선이 어려웠습니다. </li>
<li>또한 기타는 특정 시점에서 매우 얇게 보일 수 있기 때문에, 포즈 추정의 어려움이 있었습니다.<br>


</li>
</ul>
<h3 id="summary">Summary</h3>
<ul>
<li><p><strong>NOPE의 목표</strong>:</p>
<ul>
<li>NOPE은 <strong>단일 이미지</strong>만으로 새로운 객체의 상대적인 3D pose(rotation)를 예측하며, <strong>3D 모델이나 추가적인 재학습 없이</strong>도 새로운 이미지에서 객체의 포즈를 estimation 가능</li>
<li>이 방법은 특히 <strong>새로운 객체에 대해 학습이 필요 없다는 점</strong>에서 기존 방법과 차별화</li>
</ul>
</li>
<li><p><strong>주요 기법</strong>:</p>
<ul>
<li>NOPE은 객체의 새로운 view(시점)를 예측하고 이를 template matching 방식으로 사용하여 새로운 이미지의 포즈를 예측</li>
<li>이러한 템플릿 매칭 방식은 occlusion이나 <strong>symmetry</strong> 문제에 대해서도 robust</li>
</ul>
</li>
<li><p><strong>방법론 차별점</strong>:</p>
<ul>
<li><p>기존의 <strong>Novel View Synthesis(새로운 시점 생성)</strong> 방법들과 달리, NOPE은 색상 정보를 예측하는 것이 아닌, discriminative embeddings을 예측하여 더 빠르고 효율적으로 포즈를 추정</p>
</li>
<li><p>이를 통해 불필요한 세부 사항을 “발명(invent)”하지 않고도, 실제 객체의 외형에 가까운 임베딩을 생성가능</p>
<p><span style="color:gray"> ⏩ 새로운 view 생성은 input 이미지에서 보이지 않는 부분을 만들어내야 하는데, 실제 이미지와 일치하지 않을 수 있기 때문에 이런 부분이 pose estimation에 부정적인 영향을 미칠 수 있음</p>
</li>
</ul>
</li>
</ul>
<ul>
<li><strong>대칭성 문제 처리</strong>:<ul>
<li>NOPE은 대칭적인 물체에서 발생할 수 있는 포즈의 모호성을 예측할 수 있으며, 이를 해결하기 위해 <strong>확률 분포를 사용한 템플릿 매칭</strong> 방식을 도입</li>
<li>이를 통해 여러 포즈 가능성을 분석하고, 그 중 최적의 포즈를 선택<br/>


</li>
</ul>
</li>
</ul>
<p>NOPE은 <strong>학습 시에 템플릿(임베딩과 gt포즈)를 저장해서 이용하는 것이 아니라</strong>, <strong>추론(inference) 시에</strong> 템플릿을 예측해서 생성하는 접근이 다른 템플릿 기반 모델들과 다른 방법이었습니다. 때문에 unseen 객체에 대해서도 estimation할 수 있고, 특정 카테고리나 인스턴스의 3D 모델 없이도 estimation할 수 있다는 장점을 가지고 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Roboflow 데이터셋 유형변경 - Object Detection에서 Instance Segmentation]]></title>
            <link>https://velog.io/@qtly_u/roboflow-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%85%8B-object-detection%EC%97%90%EC%84%9C-instance-segmentation%EC%9C%BC%EB%A1%9C-%EC%9C%A0%ED%98%95%EB%B3%80%EA%B2%BD</link>
            <guid>https://velog.io/@qtly_u/roboflow-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%85%8B-object-detection%EC%97%90%EC%84%9C-instance-segmentation%EC%9C%BC%EB%A1%9C-%EC%9C%A0%ED%98%95%EB%B3%80%EA%B2%BD</guid>
            <pubDate>Thu, 05 Sep 2024 01:04:00 GMT</pubDate>
            <description><![CDATA[<p>바운딩 박스로 되어있는 object detection 데이터셋을 이용해서 segmentation 데이터셋으로 변경하고 싶을 때, </p>
<h2 id="segmentation-annotation">Segmentation Annotation</h2>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/aab18af2-213b-4ac7-955a-2ca57fee6bf6/image.png" alt="">
좌측의 annotate로 들어가서 이미지를 연다.</p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/a122bd1e-26de-4bd6-847f-35c092f58ef8/image.png" alt=""></p>
<p>우측의 툴바에서 polygon tool 또는 smart polygon tool을 사용하여 segmentation 해준다.</p>
<p>필자는 주로 smart polygon tool을 사용해서 자동으로 segmentation을 따주었고, 인식이 잘 안된것만 polygon tool을 이용해 다시 수정해주었다. </p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/031dbcdf-6c9e-4b5a-85e8-4cb01425ca22/image.png" alt=""></p>
<p>smart polygon을 이용하더라도 이렇게 잘 되는 모습을 볼 수 있다. </p>
<p>로보플로우에서 대량으로 적용하는 방법은 아직 구현되어있지 않다. 
개별적으로 하나씩 다 세그멘테이션 하고 나서, </p>
<h2 id="change-dataset-format">Change dataset format</h2>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/e2bb5d0d-3046-4309-831f-25d560aea823/image.png" alt=""></p>
<p>데이터셋 화면으로 돌아가 좌측의 generate 탭으로 들어간다. </p>
<p>필요한 전처리와 Augmentation를 적용해준 뒤 create 버튼을 누른다. </p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/e0d1ddb8-736c-48e3-b1c8-850ec94aadce/image.png" alt=""></p>
<p>우측 상단의 download 버튼을 누르고 포맷을 coco json으로 설정하면 segmentation 정보가 저장된다. 
<img src="https://velog.velcdn.com/images/qtly_u/post/2bebd3e8-b7ce-40f1-90a2-c45b122da51b/image.png" alt=""></p>
<p><strong>zip 파일로 저장</strong>한 뒤에, 압축을 풀어준다.</p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/47b3c71b-2247-4d1d-926a-1b23f34a224f/image.png" alt=""></p>
<p>다시 좌측 보라색 탭의 프로젝트로 들어가서, </p>
<p>New Project를 만들어준다.</p>
<p><strong>이때, instance segmentation으로 만들어주어야 한다.</strong>
그렇게 하면 아래처럼 이미지들이 있는 object detection(원래) 폴더, 새로 만든 instance segmentation 폴더 두 개가 보일 것이다. </p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/9932d577-5489-4b41-9711-671bb466b38f/image.png" alt=""></p>
<p>새로 만든 instance segmentation 폴더로 들어가서, </p>
<p>아까 저장한 폴더를 업로드 해준다. </p>
<p><img src="blob:https://velog.io/a36cd304-9049-4383-b745-ad7121bbddba" alt="업로드중.."></p>
<p>그러면 이미지들이 등록되어 화면에 나타나는데, 
우측 상단의 upload 버튼을 눌러 완료까지 해주어야 된다.</p>
<br/>
그러면 instance segmentation 데이터셋이 완성된다. 

<p>다시 원하는 모델의 포맷으로 다운받아 사용하면 된다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[paper] PatchCore: Towards Total Recall in Industrial Anomaly Detection]]></title>
            <link>https://velog.io/@qtly_u/paper-PatchCore-Towards-Total-Recall-in-Industrial-Anomaly-Detection</link>
            <guid>https://velog.io/@qtly_u/paper-PatchCore-Towards-Total-Recall-in-Industrial-Anomaly-Detection</guid>
            <pubDate>Wed, 04 Sep 2024 06:52:50 GMT</pubDate>
            <description><![CDATA[<p>** Towards Total Recall in Industrial Anomaly Detection (CVPR, 2022)**
<a href="https://arxiv.org/pdf/2106.08265">arxiv.org</a></p>
<h3 id="preliminaries"><strong>Preliminaries</strong></h3>
<hr>
<blockquote>
<p>Anomaly Detection의 Cold Start</p>
</blockquote>
<ul>
<li>제한된 label 데이터 : anomaly detection은 보통 normal sample로 모델을 학습시키는 상황에서 이루어지는데, 이때 이상 데이터에 대한 정보가 거의 없거나 전혀 없기 때문에 anomaly를 잘 탐지할 수 있을지 확신하기 어려움</li>
<li>불충분한 데이터 : 처음에 사용할 수 있는 데이터가 제한적일 때, 충분한 양의 정상 데이터조차도 확보하기 어려운 경우</li>
<li>일반화 문제 : 특정 상황에서나 환경에서만 수집된 정상 데이터는 다른 상황에 잘 인반화되지 않을 수 있음<br/>

</li>
</ul>
<blockquote>
<p>Anomaly Detection의 주 Approach</p>
</blockquote>
<p>1) Recontruction-Based </p>
<p>주로 정상데이터의 분포를 학습하고 inference 시에 input과 비교하는 out-of-distribution 문제로 접근된다.</p>
<ul>
<li>Autoencoder(자동 인코더): input 데이터를 압축한 후 재구성하여 입력 데이터와 재구성된 데이터 간의 차이를 통해 이상을 탐지, 정상 데이터는 잘 재구성되지만, 이상 데이터는 제대로 재구성되지 않음</li>
<li>Generative Adversarial Networks(GANs): 정상 데이터 분포를 학습하는 생성 모델을 사용하여 비정상 데이터를 탐지, GAN을 사용하면 정상 데이터와의 차이를 모델이 학습하게 할 수 있음</li>
<li>k-NN, Mahalanobis 거리 기반 방법: feature space에서 normal 데이터의 분포를 기반으로, 새로운 데이터가 이 분포에서 얼마나 벗어나는지를 계산하여 이상 여부를 판단</li>
</ul>
<p>2) Memory bank-Based</p>
<ul>
<li>Memory bank: normal 데이터를 기반으로 한 feature을 저장해놓고 테스트할 때 새로운 데이터와 비교하여 이상을 탐지</li>
<li>메모리 뱅크는 대규모 데이터에서 처리 및 저장 비용이 많이 들 수 있으며, pretrained 모델의 feature들이 natural 이미지에 편향될 수 있음<br/>

</li>
</ul>
<blockquote>
<p><strong>Domain Shift</strong></p>
</blockquote>
<ul>
<li>모델이 학습한 데이터와 실제 산업 환경에서 사용하는 데이터 간의 차이</li>
<li>ImageNet에서 학습된 모델의 특징은 natural 이미지에 최적화되어 있어, 산업적 데이터에서 발생하는 결함을 탐지하는 데 적합하지 않을 수 있음</li>
<li>이를 해결하기 위해 학습된 feature을 재사용하더라도, 해당 데이터에 맞는 특화된 방식을 사용해야 함<br/>
<br/>


</li>
</ul>
<h2 id="introduction">Introduction</h2>
<hr>
<p>Industrial Anomaly Detection에서 &quot;PatchCore&quot;라는 새로운 접근 방식을 제안한 논문이다. </p>
<ul>
<li>특히 결함이 없는 정상적인 데이터만을 사용하여 모델을 학습시키는 &quot;cold start&quot; 문제를 해결하려고 했다.</li>
<li>테스트 시 사용할 수 있는 정상 정보를 최대한 활용하고, ImageNet 클래스에 대한 편향을 줄이며, 높은 추론 속도를 유지하는 방법을 제안하였다.</li>
<li>그 방법의 간략한 내용은 다음과 같다.<ul>
<li>mid-level의 patch feature를 활용하여 최소한의 bias로 높은 high-resolution을 다룸</li>
<li>local 이웃의 feature aggregation을 통해 충분한 공간적 context 유지</li>
<li>memory bank에서 중복성을 줄이고 메모리 및 inference time을 줄이기 위해 greedy coreset subsampling 도입</li>
</ul>
</li>
</ul>
<p>결과적으로 MVTec AD에서 거의 완벽한 이미지 레벨 탐지 AUROC(최대 99.6%)를 달성하며, 이전 방법의 오류를 절반 이상 줄였다고 한다. 이와 동시에 빠른 추론 시간을 유지하고, 소수의 샘플로도 기존 방법과 비슷한 성능을 보였다고 한다. 
<br/></p>
<h2 id="related-works">Related Works</h2>
<p>related works에서는 PatchCore 이전의 SPADE, PaDiM을 언급하였는데, <strong>SPADE</strong>와 <strong>PaDiM</strong>은 industrial anomaly detection에서 자주 사용되는 대표적인 기법들이다. 두 방법은 ImageNe pretrained 모델을 사용해 abnormal 데이터를 탐지하며, 각각의 강점과 제한점을 가지고 있다. </p>
<blockquote>
<p><strong>SPADE (Sub-image Anomaly Detection with Deep Pyramid Correspondences)</strong></p>
</blockquote>
<p>이미지 전체에서 여러 계층의 피처를 추출한 후, 이를 메모리 뱅크에 저장하고, 새로운 이미지의 패치와 비교하여 이상 여부를 판단</p>
<table>
  </tr>
  <tr>
    <td>장점</td>
    <td>• 다중 스케일에서 이상 탐지 가능 (세밀한 결함부터 전체 구조까지) <br> • 정상 데이터의 메모리 뱅크를 활용하여 새로운 이미지와 비교</td>
  </tr>
  <tr>
    <td>단점</td>
    <td>• 이상 여부를 판단할 때 각각의 패치는 개별적으로 처리되어 패치 간의 지역적 맥락(neighboring context)를 고려하지 않음 </td>
  </tr>
</table>
<br/>

<blockquote>
<p><strong>PaDiM (Patch Distribution Modeling for Anomaly Detection and Localization)</strong></p>
</blockquote>
<ul>
<li>이미지를 패치 단위로 나누고, 각 패치의 특징 분포를 모델링</li>
<li>Mahalanobis 거리를 사용해 정상 패치와의 차이를 측정하여 이상 탐지</li>
</ul>
<table>
  </tr>
  <tr>
    <td>장점</td>
    <td>• 패치 기반 탐지로 세밀한 결함까지 탐지 가능 <br> • 다양한 크기의 이미지에서도 유연하게 작동</td>
  </tr>
  <tr>
    <td>단점</td>
    <td>• Mahalanobis 거리 계산으로 인해 계산 비용이 큼 <br> • 동일한 위치에 있는 패치들만 비교하기 때문에 이미지의 정렬에 의존적이며 유연성이 부족 - 즉 동일한 결함이 이미지의 다른 위치에 발생했을 때 탐지하기 어려울 수 있음 </td>
  </tr>
</table>
<br/><br/>

<p>정리하자면 Method에서 소개할 내용은 다음과 같다.</p>
<ul>
<li><strong>SPADE</strong>와 같이 다중 계층의 특징을 활용하는 대신, PatchCore는 <strong>중간 수준의 계층</strong>에서만 패치 특징을 추출함으로써 메모리와 계산 비용을 절감하면서도 성능을 유지</li>
<li>PatchCore는 <strong>모든 패치 간 비교</strong>를 통해 이미지 정렬에 덜 의존적이고 더 유연한 탐지가 가능</li>
<li><strong>그리디 서브샘플링(coreset subsampling)</strong> 기법을 도입해 메모리 뱅크 크기를 줄여, 두 방법이 직면한 메모리 및 추론 시간 문제도 효율적으로 해결</li>
</ul>
<p>결과적으로, PatchCore는 <strong>SPADE의 비용 문제</strong>와 <strong>PaDiM의 위치 의존성 문제</strong>를 해결하며, 패치 간의 <strong>지역적 맥락</strong>을 고려한 효율적인 anomaly detection 모델이다. 
<br/>
<br/></p>
<h2 id="method">Method</h2>
<hr>
<h3 id="1-locally-aware-patch-features">1. Locally Aware Patch Features</h3>
<ul>
<li>Mid-level Feature 사용: PatchCore는 pretrained 모델에서 mid-level<strong>의 patch feature를</strong> 추출하여 이상 탐지를 수행한다. 중간 수준의 피처를 사용하면 너무 추상적이거나(low-level) ImageNet의 클래스에 너무 편향되지(high-level) 않으면서도 충분히 높은 해상도로 동작할 수 있다.
<img src="https://velog.velcdn.com/images/qtly_u/post/234420d8-6132-47df-bbcf-531f0f75be26/image.png" alt=""></li>
</ul>
<ul>
<li>Patch Aggregation: 이미지를 작은 패치로 나누고, 각 패치의 특징을 <strong>주변 패치와 함께 aggregation</strong>하여 지역적 맥락을 고려한다. aggregation 방법은 <strong>adaptive average pooling</strong>을 사용하여 패치 특징을 집계한다.</li>
<li>memory bank에서 모든 패치 비교: 정상 데이터에서 추출한 패치 특징들을 <strong>메모리 뱅크</strong>에 저장하는데, <strong>테스트 패치</strong>는 메모리 뱅크의 모든 패치와 비교되어, 동일한 위치에 있지 않더라도 비슷한 정상 패치들과 비교할 수 있다.<br/>


</li>
</ul>
<h3 id="2-coreset-reduced-patch-feature-memory-bank">2. Coreset-reduced patch-feature memory bank</h3>
<ul>
<li>정상 데이터에서 추출한 모든 패치 특징을 메모리 뱅크에 저장하면, 메모리 크기가 너무 커지고, 테스트 시 계산 비용이 크게 증가하기 때문에, PatchCore는 이러한 문제를 해결하기 위해, <strong>코어셋 서브샘플링(coreset subsampling)</strong> 기법을 사용<ul>
<li><strong>coreset</strong>은 주어진 데이터의 특징을 대표하는 작은 부분집합을 선택하는 기법, 즉 원래 데이터에서 중요한 정보를 유지하면서도, 전체 데이터의 구조를 가장 잘 표현하는 서브셋을 찾는 과정<br/>


</li>
</ul>
</li>
</ul>
<blockquote>
<p><strong>Coreset Selection 방법 - Subsampling</strong></p>
</blockquote>
<ul>
<li>minimax facility location 문제에서 사용하는 그리디 알고리즘을 적용하여 subsampling 수행</li>
<li>과정:
<img src="https://velog.velcdn.com/images/qtly_u/post/9190739b-5952-44f4-9985-d770537d4983/image.png" alt=""><ol>
<li>원래 메모리 뱅크 M에서 데이터를 하나씩 선택해, 각 패치가 얼마나 &quot;대표적인지&quot; 측정</li>
<li>이를 통해 각 패치가 얼마나 다른 패치들을 잘 대변할 수 있는지 계산하여 가장 중요한 패치를 선택</li>
<li>이 과정을 반복해 전체 데이터에서 중요한 패치들을 추출하여 서브셋 MC를 이룸</li>
</ol>
</li>
<li>차원 축소:  추가로 패치 특징의 차원을 Johnson-Lindenstrauss 변환을 통해 축소<br/>

</li>
</ul>
<h3 id="3-anomaly-detection-with-patchcore">3. Anomaly Detection with PatchCore</h3>
<ul>
<li>PatchCore는 메모리 뱅크에서 정상 패치 특징들을 저장하고, 새로운 테스트 이미지가 들어오면 해당 이미지의 패치 특징을 메모리 뱅크와 비교하여 이상 여부를 판별하는 방식으로 동작</li>
<li>이 과정에서, PatchCore는 테스트 이미지의 가장 이상한 패치와 메모리 뱅크에 저장된 정상 패치들 간의 거리를 계산하여 anomaly score를 부여하는데,  이 이상 점수는 image-level anomaly detection과 pixel-level segmentation에 모두 사용
<img src="https://velog.velcdn.com/images/qtly_u/post/6e413ae5-07d9-472f-859d-37ef0275c96b/image.png" alt=""></li>
</ul>
<ul>
<li><p>과정</p>
<ul>
<li><p>패치 간 거리 계산: 메모리 뱅크 중 가장 가까운 패치(가장 유사한 정상 패치)를 찾음</p>
</li>
<li><p>최대 거리(anomaly score) 계산: 테스트 이미지의 모든 패치 중에서 가장 이상한 (가장 거리가 먼) 패치를 기준으로 이미지의 최대거리를 저장하여 anomaly score로 사용</p>
</li>
<li><p>anomaly score 조정: 근접 패치들의 거리를 추가적으로 참조하여, 정상 패치들 사이에서 드문 패치일수록 anomaly score를 높게 부여
<img src="https://velog.velcdn.com/images/qtly_u/post/748494bc-221e-4ca8-82b5-73cd469afc34/image.png" alt=""></p>
<p><code>여기서 $N_b(m^*)$는 메모리 뱅크에서 가장 가까운 정상 패치 주변의 패치들이며, 이들의 거리를 사용해 점수를 재조정</code></p>
</li>
</ul>
</li>
<li><p>이미지 전체의 anomaly score를 계산하는 과정에서 각 패치의 공간적 위치도 함께 고려됨</p>
</li>
<li><p>결과적으로 각 패치의 anomaly score는 픽셀 단위로 이상이 어디서 발생했는지를 나타내는 anomaly segmentation map을 생성</p>
</li>
</ul>
<br/>

<p>전체적인 아키텍처는 다음과 같다.
<img src="https://velog.velcdn.com/images/qtly_u/post/89619999-01f5-4d4f-9dd8-1ac9e4516b83/image.png" alt=""></p>
<br/>


<h2 id="experiments">Experiments</h2>
<hr>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/ecb6c531-abc6-464b-9386-8d34173f8ac6/image.png" alt=""></p>
<p>PatchCore가 MVTec AD에서 99.6%의 AUROC를 기록하며 이전 방법들보다 좋은 성능을 보여주었고,</p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/00314929-63c3-4e0a-ace2-ca7f3ade6a50/image.png" alt=""></p>
<p>inference time에서도 눈에띄는 감소효과를 보였다. </p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/14cda172-5b5c-4ad6-b3d0-3274d55293d6/image.png" alt=""></p>
<p>이미지 레벨의 anomaly detection 뿐만 아니라, segmentation 성능도 좋은 결과를 보였다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[paper] Unsupervised Continual Anomaly Detection with Contrastively-learned Prompt]]></title>
            <link>https://velog.io/@qtly_u/paper-Unsupervised-Continual-Anomaly-Detection-with-Contrastively-learned-Prompt</link>
            <guid>https://velog.io/@qtly_u/paper-Unsupervised-Continual-Anomaly-Detection-with-Contrastively-learned-Prompt</guid>
            <pubDate>Tue, 27 Aug 2024 07:45:45 GMT</pubDate>
            <description><![CDATA[<p>catastrophic forgetting없이 하나의 모델에서 multi-object를 지속적으로 학습하고, task 간 transfer가 자유로운 anomaly detection 모델
*여기서 말하는 task는 다른 object category, anomaly detection 특성 상 하나의 분류 전체를 독립적으로 학습하고 이상탐지를 하기 때문에</p>
<p><a href="https://arxiv.org/abs/2401.01010">[paper link] Unsupervised Continual Anomaly Detection with Contrastively-learned Prompt
(Jiaqi Liu, Kai Wu, Qiang Nie, Ying Chen, Bin-Bin Gao, Yong Liu, Jinbao Wang, Chengjie Wang, Feng Zheng, 2024)</a></p>
<br/>

<h2 id="introduction">Introduction</h2>
<ul>
<li><strong>Unsupervised Anomaly Detection (UAD)</strong> : 사전 지식이나 레이블없이 이상치를 탐지<ul>
<li>industrial manufacturing처럼 잘 레이블된 결함 데이터를 얻기 힘들 경우 유용한 접근방식</li>
<li>다양한 클래스에 이상탐지 모델을 사용하기 위한 최근 연구<ul>
<li>다양한 클래스에 대한 훈련 → 테스트 시에 class identiy에 의존</li>
<li>개별적인 모델로 분리 → computational 부담</li>
<li>UniAD : 다양한 클래스들을 다루기 위한 하나의 통합 모델<ul>
<li>그러나 실제 적용할 때, 학습이 연쇄적으로 일어나기 때문에 새로운 데이터 학습시 이전에 학습한 정보를 까먹을 수 있음(Catastrophic forgetting) → 그래서 real-world에는 적용하기 어렵다.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><strong>Continual Learning (CL)</strong> : Catastrophic forgetting를 다루는 방법으로, 지속적으로 데이터를 학습하면서도 이전에 학습한 정보를 잘 유지하는 방법<ul>
<li>최근 연구는 테스트 단계에서 task identity가 필요한지 여부에 따라 분류할 수 있음</li>
<li>Task-aware 접근 방법은 task identity를 명확하게 guide해주어 task 간 간섭을 방지<ul>
<li>그러나 실제 추론할 때 task identity를 얻기 어려울 수 있음 → 따라서 task에 구애받지 않는 방법이 필요하다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<br/>

<blockquote>
<p>정리하면 아래와 같은 상황</p>
</blockquote>
<p>1) 실제 산업환경에서는 높은 생산 성공률과 정보보호문제로 anomaly 데이터를 얻기 힘들고
2) 여러 태스크에 적용가능한 모델이 필요
3) supervised tasks에서 task-agnostic Continual Learning이 효과적임에도 불구하고 UAD에서 continual learning의 효과가 입증되지 않음</p>
<br/>

<p>그래서 저자들은</p>
<p><strong><em>Continual Learning을 활용한 Unsupervised Anomaly Detection을 하겠다!</em></strong></p>
<p>고 제시</p>
<p>그런데 기존 연구가 없었냐, 하면</p>
<ul>
<li>Gaussian distribution estimator (DNE) (Li et al. 2022) 외에는 없었음<ul>
<li>DNE는 augmentation을 사용하여 pseudo-supervision을 제공, anomaly segmentation에는 적용할 수 없음</li>
<li>Continual AD 방법보다는 Continual binary classification 방법에 더 가까움</li>
<li>실제 산업 제조 환경에서는 이상 영역을 정확하게 분할하는 것이 중요하기 때문에 Unsupervised Continual Anomaly Detection과 Anomaly Segmentation을 동시에 수행할 수 있는 방법이 필요함<br/>

</li>
</ul>
</li>
</ul>
<p>그래서 제안한 내용은 새로운 프레임워크인 UCAD</p>
<ul>
<li>하나의 모델로 다양한 클래스의 anomaly를 지속적으로 배울 수 있고, 그런데 unsupervised 방식임</li>
<li>구성요소<ul>
<li><strong>Continual Prompting Module (CPM)</strong><ul>
<li>“key-prompt-knowledge” 메모리 공간 학습; 이미지가 주어지면, key는 자동적으로 상응하는 task prompt를 찾고, prompt를 바탕으로 feature를 추가로 추출하여 해당 클래스의 정상 정보와 비교하여 이상을 탐지</li>
<li>한계 : 고정된 백본 ViT가 다양한 task에서 충분히 압축된 feature representation을 제공하지 못한다는 한계가 있음</li>
</ul>
</li>
<li><strong>Structure-based Contrastive Learning Module (SCL)</strong><ul>
<li>CPM의 한계를 극복하기 위해, 즉 dominant feature representation을 추출하고 도메인 간의 차이를 줄이기 위해 도입</li>
<li>SAM의 general한 segmentation 능력을 활용하여 영역 안의 feature들을 함게 묶고, 다른 영역의 feature와는 멀리 떨어지게 만듦, 이 과정에서 프롬프트가 더 나은 feature 추출을 위해 대조적으로 학습됨 (Contrastive Learning)</li>
</ul>
</li>
</ul>
</li>
</ul>
<blockquote>
<p>Contribution</p>
</blockquote>
<ul>
<li>UCAD는 unsupervised anomaly detection과 segmentation에서 최초의 task-agnostic continual learning 프레임워크임</li>
<li>Key-prompt-knowledge 메모리 공간을 통해 자동화된 작업 지시(task instruction), knowledge transfer, unsupervised anomaly detection및 segmentation을 수행함</li>
<li>SAM의 일반적인 능력을 활용하여, 다양한 클래스에서 대조 학습된 프롬프트를 사용해 비지도 특징 추출 성능을 향상시킴</li>
<li>철저한 실험과 새로운 벤치마크를 도입하여, 이전의 최신 AD 방법들에 비해 15.6% 높은 detection 성능과 26.6% 높은 segmentation 성능을 보였음</li>
</ul>
<br/>


<h2 id="related-work---industrial-image-anomaly-detection">Related Work - Industrial image Anomaly Detection</h2>
<ul>
<li>이건 그냥 흐름 파악용으로 정리</li>
</ul>
<h3 id="unsupervised-image-anomaly-detection">Unsupervised Image Anomaly Detection</h3>
<p>MVTec AD dataset(2019) 공개와 함께, 지도에서 비지도 이미지 이상탐지로 패러다임 변화</p>
<p>Unsupervised anomaly detection 패러다임에서는, 테스트 데이터는 정상데이터와 이상 데이터로 구성, 반면 학습 데이터는 정상데이터로만 구성됨</p>
<blockquote>
<p>Unsupervised Industrial Anomaly Detection 연구의 분류</p>
</blockquote>
<ul>
<li>Feature-embedding-based methods<ul>
<li>Teacher-student model</li>
<li>One-class classification methods</li>
<li>Mapping-based methods</li>
<li>Memory-based methods<ul>
<li>Reconstruction-based methods</li>
</ul>
</li>
<li>Autoencoder based methods</li>
<li>GANs based</li>
<li>ViT based</li>
<li>Diffusion based</li>
</ul>
</li>
</ul>
<blockquote>
<p>기존 UAD 방법의 한계</p>
</blockquote>
<ul>
<li>single object category에서 anomaly detection</li>
<li>Continual Learning scenario에서 anomaly detection 수행 능력 부족</li>
<li>심지어 multi-class unified anomaly detection 모델도 continual learning을 고려하지 않음<br/>

</li>
</ul>
<h3 id="continual-image-anomaly-detection">Continual Image Anomaly Detection</h3>
<p><strong>Natural</strong> image object detection task와 달리, 제조산업에서는 *데이터 스트림이 일반적이다. </p>
<p><code>💌 Datastream in Industrial manufacturing</code>
<code>제조 산업 환경에서 데이터를 한 번에 모아서 처리하는 것이 아니라, 데이터가 시간이 지나면서 점차적으로 계속 들어오는 경우가 많음</code></p>
<p>이러한 현상을 인식하고 다루기 위한 시도가 몇 있음</p>
<ul>
<li>IDDM (2023) : 레이블이 달린 데이터가 적은 상황에서 점차적으로 anomaly를 detection하는 방법</li>
<li>LeMO (2023) : 레이블이 없는 정상 데이터가 지속적으로 증가하는 상황에서 정상데이터를 추가학습 할 수 있는 anomaly detection 방법</li>
</ul>
<p>그러나 위 두 연구는 다른 추가 클래스의 추가학습을 고려하지 않음</p>
<p>DNE (Li et al. 2022)가 가장 저자들의 연구와 비슷한데, DNE는 continual learning 시나리오에서 이미지레벨로 수행하는 anomaly detection을 제안</p>
<blockquote>
<p>근데 저자들의 연구와 뭐가 다르냐, 하면</p>
<p>DNE는 오직 클래스 레벨의 정보만 저장 가능하고, 이상 위치를 localization할 수 없음, 즉 anomaly segmentation에는 부적합하지만,
저자들의 연구는 ‘anomaly detection을 detection(<em>이미지 분류</em>)를 넘어 pixel-level의(<em>segmentation</em>) continual learning이 가능하다. ‘는 것</p>
</blockquote>
<br/>

<h2 id="methods">Methods</h2>
<h3 id="문제-정의---unsupervised-continual-ad-problem">문제 정의 - Unsupervised Continual AD Problem</h3>
<ul>
<li>오로지 정상 데이터; 현실 생산 과정에서는 레이블된 이상 샘플을 얻기 힘들기 때문에</li>
<li>테스트 셋은 실제처럼 normal과 abnormal로 구성</li>
<li>task n개에 각각 train set, test</li>
</ul>
<h3 id="continual-prompting-module">Continual Prompting Module</h3>
<blockquote>
<p>UAD에 CL을 적용하는 것은 두가지 어려움이 있음</p>
</blockquote>
<p>1) 들어오는 이미지의 task identities를 어떻게 자동적으로 결정할건지</p>
<p>2) unsupervised manner로 관련 태스크의 모델 예측을 어떻게 가이드 할건지</p>
<p>⇒ CPM(Continual Promptin Module)은 (1) 동적으로 적용하고, (2) 모델 예측을 지시할 수 있음</p>
<blockquote>
<p>Architecture</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/1442d9d2-6182-4452-8dce-3a831e54ccfb/image.png" alt=""></p>
<ul>
<li><p><strong>key-prompt-knowledge$(K_e, V, K_n)$</strong> 아키텍처를 위한 memory space $M$</p>
</li>
<li><p>task identification 단계와 task adaptation 단계로 구성</p>
<ul>
<li><span style="background-color:#DCFFE4"><strong>Task Identification</strong></span><ul>
<li>image $x \in \R^{H\times W\times X}$를 frozen pretrained ViT 통과, 추출된 feature를 key로 사용 → task identity가 됨<ul>
<li>이때 task identity는 textual details과 high-level information을 동시에 가지고 있어야 하기 때문에, ViT에서 마지막 임베딩 레이어를 제외한 특정 i번째 레이어의 임베딩 feature를 사용 (논문에서는 i=5)</li>
<li>각 태스크 t에는 $N_t$개의 학습 이미지가 있다고 가정하며, 추출된 모든 임베딩은 크기가 $R^{N_t \times N_p \times C}$가 됨 → 많은 메모리 필요</li>
<li>테스트 동안 효율적인 태스크 매칭을 위해, 단일 feature space representing을 사용 → $R^{N_p \times C}$, 바로 윗줄과 비교했을 때 공간적 크기가 매우 작음</li>
</ul>
</li>
<li>FPS (Furthest Point Sampling) 기법 사용<ul>
<li>FPS는 관련성 있는 대표 feature를 선택하는 방법, 태스크 t에 대해 $K^t_c$ 세트를 설정, 특정 태스크의 모든 임베딩을 대표함</li>
<li>$K^t_e = FPS(K^t)$ : 태스크 t에 대한 임베딩 벡터 중 대표 feature</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>- &lt;span style=&quot;background-color:#DCFFE4&quot;&gt;**Task Adaptation**&lt;/span&gt;
    - 각 레이어의 input feature에 태스크 정보를 전달하기 위한 프롬프트 $p^i$가 더해짐 $k^i = f^i(k^{i-1}+p^i)$, $k^i$는 i번째 레이어의 output feature가 됨
    - learnable prompts $p \in V$
    - Knowledge $K_n$ : task transfer된 이미지 feature $k^i$는 Knowledge $K_n$을 생성하는 데 사용, 생성된 knowledge는 학습 중에 저장되고, 이후 normal과 abnormal을 비교하는 데 사용
    - Core-set Sampling : 이미지 feature가 학습 중에 너무 많이 축적될 경우, Coreset Sampling을 사용하여 저장되는 정보의 양을 줄임 $K_n = CoreSetSampling(k^i)$
    - M : 학습 중에 생성된 정상 이미지들의 특징, $M_c$ : Coreset으로 선택된 정상이미지들의 특징</code></pre><br/>

<p>CPM은 이전 task의 지식을 현재 태스크에 성공적으로 transfer 가능, 즉 태스크 간 knowledge transfer 가능</p>
<p>문제점 : 백본이 natural image로 학습되었기 때문에, industrial image의 특정 구조와 특징을 충분히 반영하지 못할 수 있음 (industrial image는 주로 텍스처와 엣지 구조를 가지고 있음, 이미지들이 유사함)</p>
<p>→ 이를 해결하기 위해 structure-based contrastive learning을 통해 프롬프트가 다양한 태스크 간 feature를 더 잘 추출하고 학습할 수 있도록 함
<br/></p>
<h3 id="structured-based-contrastive-learning">Structured-based Contrastive Learning</h3>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/7dcabc28-460c-46b4-a1d4-311e52dddc17/image.png" alt=""></p>
<ul>
<li>SAM (Segment Anything Model)을 통한 Segmentation<ul>
<li>학습 중 각 이미지에서 SAM을 사용하여 세그먼트화된 이미지 $I_s$ 생성</li>
<li>동시에 프롬프트에 따라 각 영역에 대해 특징맵 $F_s$ 획득</li>
<li>세그먼트화된 이미지 $I_s$는 크기 $H \times W$로 다운샘플링되어 $F_s$와 같은 크기로 조정되고, 해당 위치에서 레이블맵 $L_s$가 생성됨</li>
</ul>
</li>
<li>그리고 Contrastive Learning을 적용하여 동일한 영역의 feature는 가까이, 다른 영역의 feature는 더 멀어지게 학습</li>
<li>Loss Function
<img src="https://velog.velcdn.com/images/qtly_u/post/94fd95af-782c-4818-be5f-6699d7a7431c/image.png" alt="">$L_{pos_con}$ : 동일한 영역이 가까워지도록 하는 positive contrastive loss
$L_{neg_con}$ : 다른 영역이 특징들이 멀어지도록 하는 negative contrastive loss</li>
</ul>
<br/>

<h3 id="test-time-task-agnostic-inference">Test-Time Task-Agnostic Inference</h3>
<p>테스트 시에 추론 </p>
<ul>
<li><p>Task Selection and Adaption</p>
<ul>
<li><p>자동적으로 task identity를 결정하기 위해, 테스트 이미지는 가장 유사한 태스크에 선택됨</p>
<p>  $m^{test}$는 ViT의 i번째 레이어에서 추출된 패치 수준의 feature map을 나타냄</p>
<p>  <img src="https://velog.velcdn.com/images/qtly_u/post/a83ee916-e4f1-4de4-892a-1110e2db28a4/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<ul>
<li>Anomaly Detection and Segmentation<ul>
<li>anomaly score를 계산하기 위해서, image feature $m^{test}$와 $K^t_n$에 저장된 정상(nominal) feature를 비교</li>
<li>re-weighting 방식을 사용하여, 패치 수준에서 anomaly detection process 구현<ul>
<li>이때 $K^t_n$에 저장된 NN(Nearest Neighbors)를 사용하여 anomaly score 계산</li>
<li>구체적으로, 두 맵의 l2 norm을 사용하여 계산</li>
<li>얻은 NN으로부터 다시 re-weighting</li>
</ul>
</li>
<li>각 패치에 대해 계산된 anomaly score 중에서 가장 높은 값이 해당 이미지의 anomaly score로 사용됨 → 즉 이미지 내에서 가장 이상하다고 판단된 부분이 전체 이미지의 anomaly score 결정</li>
<li>각 패치별로 계산된 점수를 모아서 대략적인 segmentation map $S_{cmap}$ 생성; 이미지의 어느 부분이 이상한지를 나타냄</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/c06bdc30-fd74-4b4c-84f2-1555ccd87244/image.png" alt=""></p>
<br/>
<br/>


<h2 id="experiments-and-discussion">Experiments and Discussion</h2>
<h3 id="experiments-setup">Experiments setup</h3>
<ul>
<li>Dataset<ul>
<li>MVTec AD (2019)</li>
<li>VisA (2022)</li>
</ul>
</li>
<li>Methods<ul>
<li>CFA (2022)</li>
<li>CSFlow (2022)</li>
<li>CutPaste (2021)</li>
<li>DNE (2022) - unsupervised continual AD SOTA method</li>
<li>DREAM (2021)</li>
<li>Fast-Flow (2021)</li>
<li>FAVAE (2020)</li>
<li>PaDiM (2021)</li>
<li>PatchCore (2022) - 메모리, 통합 기반 대표적인 AD method</li>
<li>RD4AD (2022)</li>
<li>SPADE (2020)</li>
<li>STPM (2021)</li>
<li>SimpleNet (2023)</li>
<li>UniAD (2022) - 메모리, 통합 기반 대표적인 AD method</li>
</ul>
</li>
<li>Metrics<ul>
<li>AUROC/AUC : anomaly classification</li>
<li>AUPR/AP : 픽셀 수준의 anomaly segmentation</li>
<li>FM : Forgetting Measure; 이전에 학습한 내용을 잊어버리지 않는 능력</li>
</ul>
</li>
</ul>
<h3 id="training-details-and-module-parameter-settings">Training Details and Module Parameter Settings</h3>
<ul>
<li>Backbone : vit-base-patch16-224</li>
<li>Trainig settings : batch 8, Adam, 25 epochs</li>
<li>Key-Prompt-Knowledge : (15, 196, 1024), (15, 7, 768), (15, 196, 1024)</li>
</ul>
<h3 id="continual-anomaly-detection-benchmark">Continual anomaly detection benchmark</h3>
<ol>
<li>AUROC, FM on MVTecAD
<img src="https://velog.velcdn.com/images/qtly_u/post/7dd6e74a-b120-41d5-8817-fedb9a264c0a/image.png" alt=""></li>
<li>AUPR, FM on MVTecAD
<img src="https://velog.velcdn.com/images/qtly_u/post/7792c728-5957-46e8-87aa-5c4ee5d5f514/image.png" alt=""></li>
<li>AUROC, FM on VisA
<img src="https://velog.velcdn.com/images/qtly_u/post/20330b48-bb11-472e-b795-674e63b80f21/image.png" alt=""></li>
<li>AUPR, FM on VisA
<img src="https://velog.velcdn.com/images/qtly_u/post/e21f21cd-7ed8-4d28-b3b7-d2133b4e75cb/image.png" alt=""></li>
</ol>
<ul>
<li>대부분의 anomaly detection 방법이 continual learning 시나리오에서 성능이 매우 감소</li>
<li>복잡한 구조를 가진 VisA 데이터셋에서, DNE의 탐지 능력은 <strong>클래스 토큰</strong>에 의존하는 방식 때문에 크게 감소한 반면, 저자들이 제안한 방법은 영향을 받지 않았음 (Table 1, 3, DNE AUPR average 0.870→0.610)</li>
<li>PatchCore와 UniAD와 비교했을 때 장점<ul>
<li>더 정밀한 anomaly localization</li>
<li>False positive 최소화</li>
</ul>
</li>
</ul>
<h3 id="ablation-study">Ablation study</h3>
<ul>
<li><p>Module Effectivity
<img src="https://velog.velcdn.com/images/qtly_u/post/775d09f2-a831-4e2a-ba5c-1d162c659fdc/image.png" alt=""></p>
<ul>
<li>SCL을 사용하지 않으면, 모델은 고정된 ViT 백본에만 의존하여 feature 추출, 성능에서 약 4 포인트의 감소</li>
</ul>
</li>
<li><p>Size of Knowledge Base in CPM
<img src="https://velog.velcdn.com/images/qtly_u/post/b4145ee6-d999-441e-b5c3-3fc7d696bea8/image.png" alt=""></p>
<ul>
<li>기본 knowledge base size는 196</li>
<li>SCL을 사용하지 않는 경우 Knowledge Base size를 늘리면 성능 향상</li>
<li>반면 SCL을 사용한 경우 늘려도 성능향상이 거의 없었음
→ SCL이 특징 분포를 더 컴팩트하게 만들어 같은 크기의 knowledge base에 더 많은 정보를 압축할 수 있기 때문</li>
</ul>
</li>
<li><p>ViT Feature Layers
  <img src="https://velog.velcdn.com/images/qtly_u/post/f05628fb-048a-4bbc-abd0-fadc9b437574/image.png" alt=""></p>
<ul>
<li>중간 레이어가 contextual 정보와 semantic 정보를 모두 표현할 수 있기 때문에 좋은 성능을 보임</li>
<li>데이터셋마다 요구되는 contextual 정보의 정도가 다를 수 있음</li>
</ul>
</li>
</ul>
<br/>

<h2 id="conclusions">Conclusions</h2>
<ul>
<li>저자들은 Unsupervised Anomaly Setection에 Continual Learning을 적용하는 문제를 연구하여, Industrial Manufacturing과 같은 실제 응용 분야에서 발생하는 문제를 해결하고자 함</li>
<li>Task-Agnostic CL을 최초로 UAD에서 segmentation도 같이 가능</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[OpenAI API로 여러 데이터에 대한 답변 뽑을 때 주의* - RateLimitError, InvalidRequestError]]></title>
            <link>https://velog.io/@qtly_u/OpenAI-API%EB%A1%9C-%EC%97%AC%EB%9F%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%97%90-%EB%8C%80%ED%95%9C-%EB%8B%B5%EB%B3%80-%EB%BD%91%EC%9D%84-%EB%95%8C-%EC%A3%BC%EC%9D%98-RateLimitError</link>
            <guid>https://velog.io/@qtly_u/OpenAI-API%EB%A1%9C-%EC%97%AC%EB%9F%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%97%90-%EB%8C%80%ED%95%9C-%EB%8B%B5%EB%B3%80-%EB%BD%91%EC%9D%84-%EB%95%8C-%EC%A3%BC%EC%9D%98-RateLimitError</guid>
            <pubDate>Fri, 23 Aug 2024 08:31:10 GMT</pubDate>
            <description><![CDATA[<h2 id="에러나서-다시-돌리면-토큰-아까우니까-실행-전-미리-주의하세요">에러나서 다시 돌리면 토큰 아까우니까 실행 전 미리 주의하세요..</h2>
<p>json데이터나 csv에서 각 row에 대한 답변을 받으려고 할 때, 다음과 같은 에러가 나타났다..  토큰 아끼려고 데이터 하나 넣어서 함수 만든거 동작하는지 확인한 다음 전체 데이터에 대해 돌렸는데 에러 발생</p>
<h3 id="1-ratelimiterror">1. RateLimitError</h3>
<blockquote>
<p>RateLimitError: Rate limit reached for gpt-4 in organization org-xxxxxxxxxx on requests per min (RPM): Limit 3, Used 3, Requested 1. Please try again in 20s. Visit <a href="https://platform.openai.com/account/rate-limits">https://platform.openai.com/account/rate-limits</a> to learn more. You can increase your rate limit by adding a payment method to your account at <a href="https://platform.openai.com/account/billing">https://platform.openai.com/account/billing</a>.</p>
</blockquote>
<p>여러 데이터에 대한 답변을 생성할 때 요청이 일정 한도를 초과하면 발생한다고 한다... 호출할 때 time sleep을 두면 되는데, 나는 try except문으로 rate limit이 났을 때 time sleep을 할 수 있도록 수정했다. </p>
<br/>


<pre><code class="language-python"># api 호출시 rate limit에 걸릴 경우 재시도하는 함수 정의
def extract_issues_with_retry(review_text, retries=3):
    for attempt in range(retries):
        try:
            return extract_issues_from_review(review_text) # 원하는 함수 실행
        except openai.error.RateLimitError:
            print(f&quot;Rate limit&quot;)
            time.sleep(20) # 20초간 timesleep
    return &quot;Rate limit exceeded&quot;</code></pre>
<p>limit에 도달하면 time sleep을 20초간 하고, 다시 호출에 실패할 경우에 최대 3번까지 다시 시도한다. </p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/afd6151c-13b1-4a8f-9a32-6d3411e7df42/image.png" alt=""></p>
<p>그러면 이렇게 리밋에 도달했을 때마다 20초씩 기다리는 모습을 볼 수 있다.
<br/>
<br/></p>
<h3 id="2-invalidrequesterror">2. InvalidRequestError</h3>
<blockquote>
<p>InvalidRequestError: This model&#39;s maximum context length is 8192 tokens. However, your messages resulted in 11012 tokens. Please reduce the length of the messages.</p>
</blockquote>
<p>gpt 모델의 최대 텍스트 길이를 초과하면 나타나는 에러이다. 필자는 리뷰글에 대한 텍스트를 한번에 돌리려다보니 거의 마지막에 이 에러를 마주했다.</p>
<p>아래와 같이 너무 긴 글일 경우 쪼개서 사용하는 방식으로 진행하면 해결된다. </p>
<pre><code class="language-python">def split_text(text, max_tokens=3000):
    words = text.split()
    chunks = []
    current_chunk = []

    for word in words:
        current_chunk.append(word)
        if len(&#39; &#39;.join(current_chunk)) &gt; max_tokens:
            chunks.append(&#39; &#39;.join(current_chunk[:-1]))
            current_chunk = [word]

    chunks.append(&#39; &#39;.join(current_chunk))
    return chunks

def extract_issues_with_limit(review_text):
    chunks = split_text(review_text)
    all_issues = []

    for chunk in chunks:
        issues = extract_issues_from_review(chunk) # 원하는 함수 실행
        all_issues.append(issues)

    return &#39;\n&#39;.join(all_issues)</code></pre>
<hr>
<hr>
<p>함수만들고 나서 끊긴 부분부터 다시 넣어서 그래도 토큰 낭비는 많이 없었다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[3D Object Generation 기술 동향, 모델 비교- Zero123, MVDream, SyncDreamer]]></title>
            <link>https://velog.io/@qtly_u/3D-Generation</link>
            <guid>https://velog.io/@qtly_u/3D-Generation</guid>
            <pubDate>Tue, 20 Aug 2024 08:53:05 GMT</pubDate>
            <description><![CDATA[<p><code>연구원에서 세미나 열리는거 메일받고 듣고싶어서 실장님께 말씀드리고 다른 연구실 세미나 참석하기..</code></p>
<p>오늘 KAIST의 박병준 연구원님이 오셔서 &quot;3D 콘텐츠 생성 기술 동향&quot;에 대한 세미나를 열어주셨습니다. 최근 CVPR 2024에서 발표하신 논문도 함께 소개해 주셔서 매우 유익한 시간이었습니다. 최근에 multi-view synthetic data를 생성하는 모델에 관심이 있었는데, 마침 관련 주제로 세미나가 열려 운이 좋았습니다.</p>
<p>세미나 내용을 바탕으로 세미나에서 다룬 주제를 더 깊이 이해하기 위해 추가로 조사한 내용을 정리했습니다. 아래는 세미나에서 특히 인상 깊었던 내용과 관련 연구의 개요입니다.</p>
<br/>
<br/>


<hr>
<p>최근 3D 객체 생성 기술은 크게 두 가지 축으로 발전하고 있다. 
첫번째로 NeuS와 같은 기술은 표면복원에 집중하여 고해상도의 3표면을 생성하는데, 이는 기존의 NeRF 기반 방법론과 차별화된다.
두번째로 DreamFusion과 같은 새로운 접근법은 NeRF와 SDS를 결합하여 더 높은 품질의 3D를 객체를 생성하고자 한다. 특히 이 두 가지 접근법의 조합이 어떻게 최신 모델들에서 활용되는지 살펴보고자 한다.</p>
<p>모델을 살펴보기 전에 SDS와 NeuS를 먼저 얘기하자면, NeuS(Neural Implicit Surface)와 SDS(Score Distillation Sampling)는 모두 3D 객체를 생성하거나 표현하는 데 사용되는 기법이지만, 그 접근 방식과 역할이 다르다.</p>
<blockquote>
<p>SDS(Score Distillation Sampling)란?</p>
</blockquote>
<p>SDS는 주로 이미지 또는 3D 데이터를 기반으로 객체의 샘플을 생성하고, 그 output과 노이즈를 비교하여 SDS Loss를 계산하고 이를 통해 학습시키는 방식이다. 보통 생성 과정에서 정교한 샘플링을 통해 고품질의 결과물을 얻도록 설계되어 일반적으로 계산 비용이 높아 시간이 오래 걸릴 수 있다.</p>
<blockquote>
<p>NeuS(Neural Implicit Surface)란?</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/06d67f15-22ec-48f2-81ce-8bf30cae7220/image.png" alt=""></p>
<p>NeuS는 3D 공간에서의 표면을 Implicit하게 정의하는 함수를 학습한다. 이 함수는 주어진 위치가 객체의 내부, 표면, 또는 외부에 있는지 구분할 수 있으며, 이를 통해 고해상도의 3D 표면을 복원한다.</p>
<p>NeuS는 NeRF(Neural Radiance Fields)와 유사하지만, NeRF가 주로 3D 객체의 밀도를 학습하여 볼륨 렌더링을 수행하는 반면, NeuS는 3D 공간에서 암시적(Implicit) 함수를 학습하여 객체의 표면을 고해상도로 재구성한다고 한다.</p>
<p>NeuS는 복잡한 샘플링 없이도 NeuS의 효율적인 표면 표현 능력을 이용해 빠르게 3D 객체를 생성할 수 있다는 것에 의미가 있다.</p>
<br/>
<br/>


<h2 id="dreamfusion">DreamFusion</h2>
<hr>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/55ede49c-f8a4-46ea-825c-a0e88f96857f/image.png" alt=""></p>
<p>DreamFusion은 
<strong>(1) 샘플링한 camera pose, light position을 사용해서 Nerf로 이미지를 렌더링하고, 
(2) Nerf로 생성된 이미지, timestep t, text embedding을 이용해 diffusion model의 noise $\epsilon$으로 샘플링하고 SDS Loss를 계산한다.</strong></p>
<blockquote>
<p>*SDS(score distillation sampling) Loss : 
SDS Loss는 위의 DreamFusion의 피규어와 같이보면, gaussian noise가 추가된 이미지를 U-Net을 통해 복원하고, 그 생성된 이미지와 추가한 gaussian noise의 차이를 이용해서 loss값을 업데이트한다. 여기서 $\theta$가 Nerf 파라미터이므로 x를 $\theta$로 미분하여 Nerf의 파라미터를 업데이트하는 것이다.
<img src="https://velog.velcdn.com/images/qtly_u/post/bd30c9f1-bdb1-47f1-8a99-b1c420c221ea/image.png" alt=""></p>
</blockquote>
<br/>
<br/>

<h2 id="objarverse-dataset-등장-이후의-모델">Objarverse dataset 등장 이후의 모델</h2>
<hr>
<p>3D object dataset으로 주로 ShapeNet이 쓰이고 있었는데, 이후 더 큰 데이터셋인 Objarverse이 등장하였다. (OpenWorld에 대한 데이터셋) 주석이 달린 3D 객체 데이터셋으로, 80만 개 이상의 3D 모델을 포함하고 있으며, 이 모델들은 자연어 설명, 태그, 애니메이션과 함께 제공된다.
<br/></p>
<p>이를 기반으로 Zero-1-to-3, MVDream, SyncDreamer 등의 다양한 모델이 개발되었다.</p>
<h3 id="1-zero-1-to-3">1. Zero-1-to-3</h3>
<p>(arxiv 기준 2023.03.)</p>
<ul>
<li>Zero-1-to-3 모델은 텍스트 입력을 통해 단일 뷰에서 시작하여 SDS로 한 번에 한 뷰씩 생성한다. 한 관점씩 점진적으로 추가해 나가는 방식으로 3D 객체를 완성</li>
<li>장점: Sequential한 방식으로, 각 관점에서의 세부 묘사가 비교적 정교하며, 복잡한 객체에 대한 세밀한 조정이 가능하다. </li>
<li>단점: 관점을 하나씩 생성하기 때문에 전체 3D 객체를 생성하는 데 시간이 많이 걸리며, 객체의 일관성을 유지하는 데 어려움이 있을 수 있다.</li>
</ul>
<h3 id="2-mvdream">2. MVDream</h3>
<p>(arxiv 기준 2023.08.)
<img src="https://velog.velcdn.com/images/qtly_u/post/687d4d5b-bc3d-4a74-818b-b5eabc894311/image.png" alt=""></p>
<ul>
<li>MVDream은 orthogonal한 네 가지 관점에서 동시에 3D 객체를 생성하는 방식으로, SDS 알고리즘을 활용하여 생성한다.</li>
<li>객체의 전체적인 일관성을 유지하면서도 빠르게 3D 모델을 완성할 수 있는 것이 특징</li>
<li>장점: 동시에 여러 관점을 생성하기 때문에 객체의 일관성을 유지하면서도 생성 속도가 빠름 (한 번에 네 가지 관점을 생성하므로, Zero-1-to-3에 비해 시간 효율적)</li>
<li>단점: 모든 뷰가 동시에 생성되기 때문에 복잡한 객체의 세밀한 부분에 대한 조정이 어렵고, 생성 과정에서의 제어가 비교적 제한적일 수 있다. 또한, 생성하는 데 약 2시간이 소요된다는 점에서 여전히 효율성에 한계가 있다.</li>
</ul>
<h3 id="3-syncdreamer">3. SyncDreamer</h3>
<p>(arxiv 기준 2023.07.)</p>
<ul>
<li>SyncDreamer는 <strong><em>SDS를 사용하지 않고 NeuS (Neural Scene Representation and Rendering)를 기반으로 하여 10분 내에 3D 객체 생성</em></strong></li>
<li>장점: SyncDreamer는 기존 모델들에 비해 훨씬 빠르게 3D 객체를 생성할 수 있으며, NeuS 기반의 학습을 통해 비교적 안정적인 결과물을 제공</li>
<li>단점: Objaverse 데이터셋에서만 학습되었기 때문에, 이 도메인을 벗어난(out-of-domain) 객체에 대해서는 생성 성능이 저하될 수 있음<br/>

</li>
</ul>
<blockquote>
<p><strong>Recap</strong></p>
</blockquote>
<table>
<thead>
<tr>
<th>모델</th>
<th>주요 기법</th>
<th>시간 소요</th>
<th>장점</th>
<th>단점</th>
</tr>
</thead>
<tbody><tr>
<td>Zero-1-2-3</td>
<td>SDS를 사용한 단일 뷰 생성</td>
<td>시간이 많이 소요됨</td>
<td>세밀한 각도별 3D 이미지 생성 가능</td>
<td>긴 생성 시간, 높은 계산 비용</td>
</tr>
<tr>
<td>MVDream</td>
<td>SDS를 사용한 동시 4뷰 생성</td>
<td>약 2시간 소요</td>
<td>뷰 간 일관성 높은 고품질 3D 생성 가능</td>
<td>여전히 높은 시간 소요, 계산 비용이 큼</td>
</tr>
<tr>
<td>SyncDreamer</td>
<td>NeuS 사용, SDS 비사용</td>
<td>약 10분 소요</td>
<td>빠른 생성 속도, 실시간 응용 가능</td>
<td>도메인 밖에서는 성능 부족, 범용성 제한</td>
</tr>
</tbody></table>
<br/>
<br/>
<br/>



<hr>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[ViTPose++: Vision Transformer for Generic Body Pose Estimation]]></title>
            <link>https://velog.io/@qtly_u/ViTPose-Vision-Transformer-for-Generic-Body-Pose-Estimation</link>
            <guid>https://velog.io/@qtly_u/ViTPose-Vision-Transformer-for-Generic-Body-Pose-Estimation</guid>
            <pubDate>Sun, 09 Jun 2024 10:48:34 GMT</pubDate>
            <description><![CDATA[<p>Vision Transformer는 컴퓨터 비전 작업에서 큰 잠재력을 보여주었으며, human body pose estimation에 적용되어 우수한 성능을 얻었습니다.</p>
<p>기존의 ViTPose에서는 vision transformer를 pose estimation task에 적용하면서, 베이스라인을 제시하고 확장성, 단순성 등의 이점을 보여주었습니다.(<a href="https://velog.io/@qtly_u/ViTPose">이전 ViTPose 글 참고</a>) ViTPose++에서는 ViTPose에 MoE 방식을 사용하여 다양한 pose estimation task에서 사용할 수 있도록 지식을 분해하는 방법을 도입했습니다.</p>
<p>간단하게 요약하면 다음과 같습니다.</p>
<table>
<thead>
<tr>
<th>ViTPose</th>
<th>ViTPose++</th>
</tr>
</thead>
<tbody><tr>
<td>- 비전 트랜스포머를 사용하여 신체 자세 추정을 수행하는 간단한 베이스라인 모델</td>
<td>- MoE(Mixture of Experts) 방식을 도입하여 지식 분해(knowledge decomposition)를 수행</td>
</tr>
<tr>
<td>- 확장성, 단순성 등의 이점을 보여주며, MS COCO 등에서 우수한 성능을 달성</td>
<td>- FFN 계층을 공통 전문가(task-agnostic expert)와 작업 특화 전문가(task-specific experts)로 분할하여 각각 공통 지식과 작업 특화 지식을 인코딩</td>
</tr>
<tr>
<td></td>
<td>- 작업 간 충돌을 최소화하고 다양한 포즈 추정 작업에서 우수한 성능을 달성</td>
</tr>
<tr>
<td></td>
<td>- 추가적인 파라미터나 계산 비용 없이 다양한 신체 키포인트 검출 작업을 효과적으로 수행할 수 있음</td>
</tr>
</tbody></table>
<br/>

<p>본 글에서는 ViTPose 부분은 생략하고, ViTPose++에서 제시한 지식분해 방법에 대해 살펴보겠습니다.</p>
<br/>
<br/>
<br/>



<h3 id="다양한-pose-estimation-task를-위한-moe방식의-지식-분해knowledge-decomposition">다양한 pose estimation task를 위한 MoE방식의 지식 분해(knowledge decomposition):</h3>
<hr>
<p>일반적인 신체 키포인트 검출을 위해서는 다양한 신체 자세 추정 작업을 다룰 수 있어야 합니다. 여기서 중요한 도전 과제는 서로 다른 자세 추정 작업에서 신체 키포인트의 차이를 처리하는 것입니다. 예를 들어, 인간과 동물의 외형이 다른 동일한 키포인트(예: 코), 그리고 MS COCO와 MPII에는 없는 COCO-W의 키포인트 카테고리의 차이를 처리해야 합니다. 또한, 다른 종의 데이터 분포도 다릅니다. 예를 들어, 인간의 머리는 항상 어깨 위에 있지만, 소의 머리는 항상 어깨의 좌우에 위치합니다.</p>
<p>단순한 해결책으로는 ViTPose 모델을 멀티태스크 학습으로 훈련시키는 것입니다. 즉, 공통 백본을 사용하고 각 자세 추정 작업에 대한 별도의 디코더를 사용하는 것입니다. 그러나 이러한 방법은 작업 간 충돌이 발생하여 학습 성능에 영향을 줄 수 있습니다.</p>
<p>ViTPose++에서는 지식 분해 관점에서 이 문제를 해결하고자 하는데, 구체적으로, MoE(Mixture of Experts) 아이디어를 채택하여 <strong>FFN 계층을 task-agnostic(작업에 민감하지 않은) 전문가와 task-specific(작업 특화) 전문가로 분할</strong>하여 각각 공통 지식과 작업 특화 지식을 인코딩합니다. 이는 MHSA 계층은 자세 추정 작업에 민감하지 않기 때문에 가능하다고 합니다. 각 신체 자세 추정 작업에 대해 작업 특화 디코더를 사용한다는 점에서 앞서 언급한 단순한 멀티태스크 학습 방법과 유합니다.</p>
<p>논문에서 예로 주어진 하나의 트랜스포머 블록을 살펴보겠습니다. 
<img src="https://velog.velcdn.com/images/qtly_u/post/f003c9ff-b5d4-4e0c-9842-2615ac8f76ba/image.png" alt=""></p>
<p>MASA의 ouput feature $$F_{attn}$$가 주어졌을 때, FFN의 첫번째 linear layer에서 처리되고, 그것은 MoE에 의해 공유됩니다. </p>
<p>$$F^{FFN} = ReLU(Linear(F^{attn}))$$</p>
<p>그런다음, $$F^{FFN}\in\R^{N \times \gamma C}$$은 별도의 linear layer들에 전달됩니다. 여기서 N은 토큰 수를, $$\gamma$$는 FFN의 확장 비율을 나타내며, 기본값은 4입니다. 두 종류의 전문가가 $$F^{FFN}$$를 $$F^{shared}와 F^{specific}$$으로 투영하며, 채널 차원은 각각 (1 − α)C와 αC입니다.</p>
<p>여기서 $$\alpha$$는 shared expert(공유 전문가)와 task-specific expert(태스크 특화 전문가)를 균형 있게 사용하기 위해 설정된 분할 비율로, 기본값은 0.25입니다. 공통 전문가가 전체 채널의 75%를, 작업 특화 전문가가 25%를 차지하도록 합니다. <strong>공통 전문가의 파라미터는 모든 데이터를 사용하여 학습되며, 작업 특화 전문가의 파라미터는 해당 작업의 데이터만 사용하여 학습됩니다.</strong> 그런 다음, $$F^{shared}와 F^{specific}$$은 채널 차원에서 결합되어 트랜스포머 블록의 출력을 형성합니다. 특정 자세 추정 작업의 학습 세트에서 입력 이미지를 받으면, 위에서 설명한 트랜스포머 백본에서 인코딩된 특징을 얻은 후, 해당 디코더에 전달되어 히트맵을 regression합니다.</p>
<p>추론 단계에서는 각 자세 추정 작업에 대해 공유 및 작업 특화 선형 계층이 병합되어 병렬 계산을 수행합니다. 이 방식으로 ViTPose++는 ViTPose 모델과 비교하여 추가적인 파라미터나 계산 비용 없이 일반적인 신체 자세 추정을 위한 foundation model로 기능할 수 있습니다.</p>
<br/>
<br/>

<h3 id="ablation-studies-of-vitpose-and-analysis">Ablation Studies of ViTPose++ and Analysis</h3>
<hr>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/68bc73d0-a766-4945-a884-2345c21a1618/image.png" alt=""></p>
<blockquote>
<p>실험결과를 살펴보면, MS COCO val 세트에서 다양한 데이터셋(MS COCO, AIC, MPII 등)을 추가하면서 성능이 지속적으로 향상되는데, 동물 데이터셋(AP-10K, APT-36K)을 포함하면 성능이 약간 하락하는 것을 볼 수 있습니다. </p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/29beef59-c20e-4541-bbab-a1ab8ef487fb/image.png" alt=""></p>
<blockquote>
<ul>
<li><strong>독립적인 FFN (I-FFN)</strong>: 각 작업에 대해 독립적인 FFN을 사용하여 작업 간 충돌을 완화시킬때는 성능은 ViTPose와 비슷하거나 더 나쁩니다.</li>
</ul>
</blockquote>
<ul>
<li><strong>독립 및 공유 FFN (IS-FFN)</strong>: 공통 지식을 인코딩하기 위해 공유 FFN을 추가로 도입하여 작업별 FFN과 공유 FFN의 출력을 합쳐 다음 레이어로 전달하는 방식에서 I-FFN보다 성능이 좋아집니다.</li>
<li><strong>부분적으로 공유된 FFN (PS-FFN)</strong>: 공통 지식과 작업 특화 지식을 인코딩하기 위해 FFN의 마지막 선형 계층을 공유 부분과 독립 부분으로 분할하는 것인데, 성능과 모델 복잡성 간의 균형을 잘 맞출때(알파 0.25에서) 77.0 AP를 달성합니다.</li>
</ul>
<p>I-FFN에서는 공통 지식을 모델링하지 않아 성능이 낮고, PS-FFN에서 공통 및 task-specific 지식을 잘 인코딩하여 77.0 AP를 달성하는 것을 볼 수 있습니다.</p>
<br/>
<br/>

<p>ViTPose++는 human pose estimation 뿐 아니라 다양한 pose estimation task를 공통적으로 학습하면서도, Mixture of Experts(MoE) 방식을 통해 태스크 간의 충돌을 최소화할 수 있는 방안을 제시했습니다. 이를 통해 다양한 pose estimation task에서 일반적인 foundation model로서 효율적으로 동작할 수 있음을 보였습니다.</p>
<p>감사합니다.</p>
<br/>

<blockquote>
<p>Reference
<a href="https://arxiv.org/abs/2212.04246">ViTPose++ Paper</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[paper] Inpaint Anything]]></title>
            <link>https://velog.io/@qtly_u/paper-Inpaint-Anything</link>
            <guid>https://velog.io/@qtly_u/paper-Inpaint-Anything</guid>
            <pubDate>Fri, 07 Jun 2024 08:04:31 GMT</pubDate>
            <description><![CDATA[<p>Inpaint Anything 논문은 23년 4월에 발표되었습니다. 이 논문은 Segment Anything Model(SAM)을 기반으로 한 이미지 인페인팅 시스템을 소개합니다. 
<br/></p>
<p>이 프레임워크는 다음과 같은 주요 기능을 제공합니다.</p>
<blockquote>
</blockquote>
<p>Remove Anything: 사용자가 이미지를 클릭하여 특정 객체를 제거할 수 있으며, SAM이 해당 객체를 분할하고 인페인팅 모델이 생성된 구멍을 배경 정보로 채워줍니다.</p>
<blockquote>
<p>Fill Anything: 객체를 제거한 후, 사용자가 텍스트 프롬프트를 제공하면 인페인팅 모델이 텍스트 프롬프트에 기반하여 구멍을 새로운 콘텐츠로 채워줍니다.</p>
</blockquote>
<blockquote>
<p>Replace Anything: 사용자가 지정한 객체를 유지하면서 배경을 새로운 장면으로 대체할 수 있습니다. 이 기능은 SAM과 인페인팅 모델을 결합하여 시각적으로 일관된 배경을 생성합니다.</p>
</blockquote>
<br/>
<br/>


<h2 id="motivation-and-observation">Motivation and Observation</h2>
<hr>
<h3 id="why-do-we-need-inpaint-anything">Why do we need Inpaint Anything?</h3>
<p>먼저 논문에서 제시한 배경입니다.</p>
<ul>
<li><p>최신 이미지 인페인팅 기법(LaMa, Repaint, MAT, ZITS 등)은 큰 영역을 성공적으로 채우고 복잡한 반복 구조를 잘 처리하지만, 각 마스크에 대한 세밀한 주석이 필요합니다.</p>
</li>
<li><p>Segment Anything Model (SAM)은 포인트나 박스 같은 입력 프롬프트로부터 고품질의 객체 마스크를 생성할 수 있습니다.</p>
</li>
<li><p>기존 인페인팅 방법은 제거된 영역을 문맥으로만 채울 수 있지만, AIGC(AI generated content) 모델은 새로운 콘텐츠를 생성할 수 있는 기회를 제공합니다.</p>
<p>  AIGC(AI generated content) 모델: 인공지능 기술을 사용하여 디지털 콘텐츠를 생성하는 모델
  ex) chatgpt, stable diffusion, LaMa</p>
</li>
<li><p>SAM, SOTA inpainting, AIGC 모델의 장점을 결합하여 객체 제거, 새로운 콘텐츠 채우기, 배경 교체와 같은 일반적인 인페인팅 문제를 해결하는 강력하고 사용하기 쉬운 파이프라인을 제공합니다.</p>
<br/>

</li>
</ul>
<h3 id="what-inpaint-anything-can-do">What Inpaint Anything can do?</h3>
<ul>
<li>SAM + SOTA 인페인팅 모델로 모든 것을 제거(Remove Anything): 사용자는 클릭만으로 인터페이스에서 특정 객체를 쉽게 제거할 수 있고, 명확한 객체 영역을 지정할 수 있으며, 이는 인페인팅 모델의 입력으로 사용됩니다.</li>
<li>SAM + AIGC 모델로 모든 것을 채우거나 교체(Fill Anything &amp; Replace Anything): 객체 제거 후, 사용자는 텍스트 프롬프트를 제공하여 &quot;새로운 콘텐츠&quot;로 원하는 영역을 채울 수 있습니다. 예를 들어, &quot;dog&quot; 또는 &quot;a cute dog, sitting on the bench&quot;와 같은 프롬프트를 사용해 새로운 객체를 생성합니다. 또 사용자는 클릭 선택된 객체를 유지하면서 나머지 배경을 새로 생성된 장면으로 교체할 수도 있습니다.</li>
</ul>
<p>정리하자면 segment anything으로 segment 주석을 알아서 하게 하고, 그 뒤에 inpainting 모델을 사용해서 객체를 지우거나 배경을 생성할 수 있는 프레임워크를 제시한 것의 논문의 주 내용입니다. 
<br/>
<br/></p>
<h2 id="methodology">Methodology</h2>
<hr>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/846926ce-5f29-4784-b8a9-e6b2d4821d85/image.png" alt=""></p>
<blockquote>
<p>모델 구성</p>
</blockquote>
<p><a href="https://arxiv.org/pdf/2304.02643"><strong>Segment Anything Model (SAM)</strong></a>: 
SAM은 최근에 출시된 대규모 비주얼 트랜스포머(ViT) 기반 모델로, 대형 visual corpus(SA-1B)에서 훈련되었습니다. 다양한 시나리오에서 뛰어난 segmentation 능력을 보여줍니다.</p>
<p><strong>SOTA Inpainters</strong>: 
이미지 인페인팅은 손상된 이미지의 특정 부분을 시각적으로 그럴듯한 구조와 텍스처로 대체하는 태스크입니다. 최신 딥러닝 기법들은 LaMa, Repaint, MAT, ZITS 등 다양한 방법이 있습니다. 특히 LaMa는 빠른 푸리에 합성(FFCs), perceptual loss, 공격적인 훈련 마스크 생성 전략을 결합하여 좋은 성능을 보입니다.</p>
<p><strong>AIGC Models</strong>: 
ChatGPT 및 기타 생성형 AI(GAI) 기술은 인공지능을 사용하여 디지털 콘텐츠(이미지, 음악, 자연어 등)를 생성합니다. Inpaint Anything(IA)에서는 Stable Diffusion과 같은 강력한 AIGC 모델을 사용하여 텍스트 프롬프트를 기반으로 원하는 콘텐츠를 생성합니다.
<br/></p>
<p>위 모델들로 구성된 segment anything의 세가지 주요 기능을 위에서 얘기했었는데, 아래는 그 예시입니다.</p>
<ol>
<li><p>Remove Anything
사용자가 클릭한 객체를 제거하고, SAM이 생성한 마스크를 사용하여 해당 영역을 배경 정보로 채웁니다.
<img src="https://velog.velcdn.com/images/qtly_u/post/35ccb92c-379f-4587-9005-9f8fa4b8b810/image.gif" alt=""></p>
</li>
<li><p>Fill Anything
객체 제거 후 텍스트 프롬프트를 입력하면, AIGC 모델(예: Stable Diffusion)이 해당 프롬프트에 따라 구멍을 새로운 콘텐츠로 채웁니다.
<img src="https://velog.velcdn.com/images/qtly_u/post/bfb53425-7075-4367-8e76-26b274341045/image.gif" alt=""></p>
</li>
<li><p>Replace Anything
선택한 객체를 유지하고, 나머지 배경을 새로 생성된 장면으로 교체합니다.
<img src="https://velog.velcdn.com/images/qtly_u/post/b345ed7a-80c8-4983-8225-716f40ca3eba/image.gif" alt=""></p>
</li>
</ol>
<br/>
<br/>


<p>&quot;Inpaint Anything&quot; 논문은 Segmentation Anything, 최신 인페인팅 모델, AIGC 모델의 강점을 결합하여 객체 제거, 객체 변경, 배경 교체 등의 태스크를 효과적으로 해결할 수 있는 방법을 제시했습니다. 또, 고해상도와 다양한 비율의 이미지를 처리할 수 있는 유연성을 가지고 있어 적용 가능성이 높을 것 같습니다.</p>
<p>읽어주셔서 감사합니다.</p>
<br/>
<br/>

<blockquote>
<p>Reference
<a href="https://arxiv.org/pdf/2304.06790">[paper] Inpaint Anything: Segment Anything Meets Image Inpainting</a>
<a href="https://github.com/geekyutao/Inpaint-Anything">Inpaint Anything Github</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[GAN Mode collapse, Wasserstein Loss, Weight Clipping, Gradient Penalty]]></title>
            <link>https://velog.io/@qtly_u/GAN-Mode-collapse-Wasserstein-Loss-Weight-Clipping-Gradient-Penalty</link>
            <guid>https://velog.io/@qtly_u/GAN-Mode-collapse-Wasserstein-Loss-Weight-Clipping-Gradient-Penalty</guid>
            <pubDate>Fri, 26 Apr 2024 01:50:24 GMT</pubDate>
            <description><![CDATA[<h2 id="mode-collapse">Mode collapse</h2>
<hr>
<blockquote>
<p>generator가 discriminator가 못맞추는 클래스를 파악해서 그 클래스만 계속 생성해서 discriminator가 전부 오분류하도록 하는것</p>
</blockquote>
<p>즉 generator가 local minima에 갇힌 것이다.</p>
<br/>

<blockquote>
<p>Problem with BCE loss</p>
</blockquote>
<p>GAN에서 binary cross entropy를 사용할 경우, 학습 초기에는 discriminator의 성능이 좋지 않기 때문에 상관이 없지만 generator보다 비교적 학습이 쉽기 때문에 학습 속도가 빠를 수 있다. 즉 generator가 이미지를 생성해내는 것보다 discriminator가 real/fake이미지 분류를 잘하게 된다. 이때 discriminator가 분류를 잘하게 되면 0에 가까운 gradient를 넘겨주기 때문에 generator의 성능향상이 어려워지는 상황에서 결국 학습이 종료된다. 
Generator는 discriminator가 잘못 분류하는 특정한 이미지 모드에만 집중하여 이 모드에 해당하는 이미지를 생성하려고 시도한다. 이렇게 되면 generator가 다양한 이미지를 생성하는 대신 특정한 이미지 패턴에만 집중하게 되고, 결과적으로 mode collapse가 발생할 수 있다.
<img src="https://velog.velcdn.com/images/qtly_u/post/ace7ed7a-46b0-458b-9f69-569e434fd677/image.png" alt=""></p>
<br/>

<p>이를 해결하기 위해 Earth Mover&#39;s Distance를 사용한다.</p>
<h2 id="earth-movers-distance">Earth Mover&#39;s Distance</h2>
<hr>
<blockquote>
<p>Earth mover&#39;s distance는 두 분포를 동일하게 만들기 위해서 얼만큼 옮겨야하는지를 계산하는 것</p>
</blockquote>
<p>두 분포 사이의 거리를 측정하는 cost function으로 일반적으로 GAN을 훈련할 때 BCE 관련 cost function보다 성능이 뛰어나다.</p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/edd77a1d-e6b3-499e-b885-2d1a1652d8f9/image.png" alt=""></p>
<p>예를 들어 분포가 흙더미라고 생각하면, 그 흙더미를 움직여 실제 분포의 모양과 위치로 만드는 것은 얼마나 어려울까? ⇒ 이것이 Earth Mover’s Distance</p>
<p>BCE loss에서는 0과 1사이의 값을 가져 1에 가까운 값이 점점 0에 가까워지면서 학습을 멈추게 되는데, Earth Movers’ Distance에서는 이러한 상한선이 없기 때문에 계속 cost를 증가시킬 수 있음</p>
<br/>

<h2 id="wasserstein-loss">Wasserstein Loss</h2>
<hr>
<blockquote>
<p>Earth Mover’s distance를 근사화한 loss</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/5b2334b0-bc1c-4a11-a97d-7b3c7c10daeb/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/be44a137-8839-44f0-b4aa-a672cb90a3d5/image.png" alt=""></p>
<p>함수는 discriminator의 prediction의 예상치 차이를 계산한다.
여기서 discriminator가 평가하는 역할을 하기 때문에 <code>critic</code>이라고 한다.</p>
<p>discriminator는 이 두 가지를 보고 진짜에 대한 생각과 가짜에 대한 생각 사이의 거리를 최대화하려고 하는 한편, generator는 가짜 이미지가 진짜와 최대한 가깝다고 discriminator가 생각하기를 원하기 때문에 이 차이를 최소화하려고 한다.
거리 기반이기 때문에 0과 1의 한계가 없다.</p>
<br/>

<h3 id="1-lipschitz-continuous">1-Lipschitz Continuous</h3>
<p>다만 신경망에서 너무 큰 숫자는 피해야 하기 때문에 Lipshitz 제약이라는 제약조건을 걸어 critic을 제한한다.</p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/dba06e16-39da-4bbe-a50b-4a6558f06690/image.png" alt=""></p>
<p>critic에서 이 condition이 W-loss에 중요한 이유는 W-Loss 함수가 연속적이게 될 뿐 아니라 훈련 중에 너무 많이 성장하지 않고 어느 정도 안정성을 유지하도록 보장하기 때문이다. </p>
<p>위 condition을 만족하기 위한 기법으로는 weight clipping과 gradient penalty가 있다. </p>
<h3 id="weight-clipping">Weight Clipping</h3>
<blockquote>
<p>gradient의 norm을 강제적으로 1보다 크지않게 하는 것
<img src="https://velog.velcdn.com/images/qtly_u/post/022b6e03-8bb6-46f6-be9b-5e9a55d00410/image.png" alt=""></p>
</blockquote>
<p>넘어가는 값들을 아예 clipping해버리기 때문에 다양한 가중치값을 받아들이지 못해 최적을 찾지 못할 수 있고, critic을 지나치게 제한할 수도 있다는 단점이 있다.</p>
<h3 id="gradient-penalty">Gradient Penalty</h3>
<blockquote>
<p>regularization term을 붙임으로서 1-L 연속성을 좀더 부드럽게 강제하는 방식</p>
</blockquote>
<p>weight clipping처럼 값을 자르는 것이 아니라 많이 넘어갈수록 제약을 걸어주는 방식이다. 
<img src="https://velog.velcdn.com/images/qtly_u/post/6aaadce9-eab6-41df-ac54-35f889c3c76e/image.png" alt=""></p>
<p>regularization term은 진짜 이미지와 생성된 가짜 이미지를 이용해 interpolation한 중간이미지를 통해 줄수 있다. 
<img src="https://velog.velcdn.com/images/qtly_u/post/8db60dc3-30e9-4200-9371-28319f25f109/image.png" alt=""></p>
<p>즉 x hat은 진짜와 가짜에 대한 가중치를 부여한 이미지이기 때문에 1-L continuous를 엄격하게 강제하는 것이 아니라 권장하는 것이다. 
<img src="https://velog.velcdn.com/images/qtly_u/post/67673962-cb4d-4a79-9f9e-e0fdd10d7eef/image.png" alt=""></p>
<blockquote>
<p>⚙ interpolated image를 사용해 수식 구현</p>
</blockquote>
<ol>
<li><p><strong>보간된 이미지 생성</strong>
실제 이미지(real)와 가짜 이미지(fake)를 일정한 epsilon을 주고 섞어서 보간된 이미지를 생성</p>
<p>$\hat{x} = ϵ × real + (1−ϵ) × fake$</p>
</li>
<li><p><strong>Critic 모델에 보간된 이미지 입력</strong></p>
</li>
<li><p><strong>Critic의 그래디언트 계산</strong>    $\nabla _{\hat{x}} D(\hat{x})$</p>
</li>
<li><p><strong>Gradient Penalty 계산</strong>
Gradient Penalty는 critic의 그래디언트 norm이 1에서 벗어나는 정도를 측정해 페널티 부여
$penalty=λEx^∼Px^[(∥∇x^D(x^)∥2−1)2]$</p>
</li>
</ol>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>

<blockquote>
<p>Coursera의 Build Basic Generative Adversarial Networks (GANs) 강의를 바탕으로 작성하였습니다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[paper] MetaFormer Is Actually What You Need for Vision]]></title>
            <link>https://velog.io/@qtly_u/paper-MetaFormer-Is-Actually-What-You-Need-for-Vision</link>
            <guid>https://velog.io/@qtly_u/paper-MetaFormer-Is-Actually-What-You-Need-for-Vision</guid>
            <pubDate>Tue, 26 Mar 2024 09:01:07 GMT</pubDate>
            <description><![CDATA[<p>본 글에서는 CVPR에서 22년도에 발표된 MetaFormer is Actually What You Need for Vision, Yu et al.에 대해 간단하게 정리하겠습니다.
<br/></p>
<h2 id="generalized-transformer-achitecture">Generalized Transformer Achitecture</h2>
<hr>
<p>논문에서는 일반화된 트랜스포머 아키텍처를 제안합니다.
여기서 기존 트랜스포머 구조에서 Self-Attention이 왔던 부분을 Token Mixer라고 하고, Self-Attention을 제외한 나머지부분을 MetaFormer라고 했을 때, attention이 아니더라도Token Mixer 자리에 어떤 것이 오든지 MetaFormer 구조만 갖추고 있으면 CV task들에서 잘 작동한다는 것입니다.</p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/627e923a-7c20-4f30-aa7d-8ccb2d1a3ec5/image.png" alt=""></p>
<br/>

<h3 id="motivation">Motivation</h3>
<p>이러한 구조를 발견하게 된 배경을 보면, 
ViT 모델들이 여러가지 구조로 다양화되고 있는데,저자들은 Token Mixer자리에 Self Attention이 아니더라도 MLP, 심지어는 옛날 연산 방식인 Fourier transform이 오더라도 성능이 잘 나온다는 흐름을 보게 되었습니다.
그래서 저자들은 파라미터 자체도 없는 Average Pooling을 넣어보면 어떨까? 하고 구조를 완성해봤는데 오히려 SOTA를 달성하는 결과를 얻었다고 말합니다.</p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/4090a898-271c-4d07-b343-440521e43f5c/image.png" alt="performance"></p>
<p>이렇게 제안된 PoolFormer는 MetaFormer의 구조의 Token Mixer 자리에 average pooling을 넣어 완성했다고 불 수 있습니다. </p>
<br/>

<h2 id="poolformer-architecture">PoolFormer Architecture</h2>
<hr>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/307f976e-035a-4821-9b3e-eafc3e4e007f/image.png" alt=""></p>
<pre><code>*L은 전체 블록의 개수, L/6은 전체의 1/6이 분포한다는 뜻임</code></pre><p>구조를 전체적으로 보면 patch embedding이 총 네 번 들어가고, 각 patch embedding 사이에 PoolFormer들을 여러개를 집어넣어서 특징을 추출하는 단계로 구성됩니다.</p>
<p>또한 이미지의 스테이지 자체는 기존에 사용되었던 image classification 모델들의 feature map 축소하는 비율과 유사하게 4배,  8배, 16배, 32배 축소가 되는걸 볼 수 있습니다.</p>
<br/>


<h2 id="metaformer">MetaFormer</h2>
<hr>
<p>MetaFormer의 구조는 아래와 같이 구성되어 있으며, </p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/2c1a6848-7b61-495b-961e-a9b2b9d6dcb1/image.png" alt="">
식으로는 다음과 같습니다.</p>
<p>$$
X = InputEmb(I)
\newline Y = TokenMixer(Norm(X))+X
\newline Z = \sigma(Norm(Y)W_1)W_2+Y
$$</p>
<br/>

<h3 id="average-pooling"><strong>average pooling</strong></h3>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/aa88b4e5-d06f-4340-882d-7a17555897e6/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/c748833b-d3d3-4661-bc4f-4a64bced5f56/image.png" alt=""></p>
<p>pooling자리에서 average pooling을 하고 normalization layer에서 넘어온 Input을 한번 빼는 점이 약간 다릅니다. 
<br/></p>
<h2 id="ablation-study">Ablation study</h2>
<hr>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/00b7f974-3690-46ba-91f1-89ab6ae9354f/image.png" alt=""></p>
<p>pooling 자체를 Identity mapping, 그냥 직접 전달하더라도 베이스라인에서 3% 밖에 안떨어지는 모습을 보이며 → metaformer 구조 자체가 훌륭하다는 것을 시사합니다.</p>
<br/>

<p>감사합니다.
<br/></p>
<br/>

<blockquote>
<p>Reference</p>
</blockquote>
<ul>
<li><a href="https://www.youtube.com/watch?v=ThCkRzh9Ohw">딥러닝논문읽기모임 세미나</a></li>
<li><a href="https://arxiv.org/abs/2111.11418">https://arxiv.org/abs/2111.11418</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[paper] Inception v4 (2016)]]></title>
            <link>https://velog.io/@qtly_u/paper-Inception-v4-2016</link>
            <guid>https://velog.io/@qtly_u/paper-Inception-v4-2016</guid>
            <pubDate>Wed, 13 Mar 2024 14:38:42 GMT</pubDate>
            <description><![CDATA[<h2 id="inception-시리즈의-발전">Inception 시리즈의 발전</h2>
<hr>
<p>Inception 아키텍처는 초기에 GoogLeNet으로 알려져 있었으며, 이후 Inception v2, Inception v3 등 다양한 버전이 발표되었습니다. Inception v4는 2016년에 소개되었으며, 그 이후로도 다양한 개선이 이루어진 것으로 알려져 있습니다.</p>
<br/>

<h2 id="기존-단점">기존 단점</h2>
<hr>
<p>Inception v3에서 발생했던 일부 단점 중 하나는 그 복잡한 구조였습니다. Inception v4에서는 파라미터 공유와 모듈 간의 효율적인 연결을 최적화하여 학습 속도를 향상시켰습니다. 또한, 배치 정규화와 드롭아웃 등의 효과적인 정규화 기법을 도입하여 과적합 문제에 대처했습니다.</p>
<br/>

<h2 id="inception-v4의-특징">Inception v4의 특징</h2>
<hr>
<ol>
<li><p>Residual Connection의 도입
Inception v4에서는 Residual Connection이 처음으로 도입되었습니다. Residual Connection은 각 레이어의 입력에 해당 레이어의 출력을 더하는 구조로, 그레이디언트 소실 문제를 해결해 심층 신경망의 훈련을 안정화시키는 데 큰 역할을 합니다.</p>
</li>
<li><p>네트워크의 깊이와 너비
Inception v4는 이전 버전에 비해 더 깊고 넓은 네트워크를 가지고 있습니다.(총 22개 레이어로 구성) 더 많은 레이어와 노드는 더 풍부한 특징 추출을 가능하게 하며, 이는 복잡한 데이터셋에서 높은 정확도를 달성하는 데 기여합니다.</p>
</li>
<li><p>Inception 모듈의 다양성 =&gt; Scale-up 효과
Inception v4는 서로 다른 크기의 필터를 사용하여 특징을 추출하는 여러 가지 크기의 Inception 모듈을 사용합니다. 이는 네트워크가 다양한 크기의 특징을 동시에 학습하고 결합하여 보다 풍부한 representation을 얻을 수 있도록 합니다.</p>
</li>
<li><p>효율적인 Inception module
Inception v4에서는 기존의 Inception 모듈을 최적화하여 연산 효율성을 높였습니다. 적은 파라미터로 높은 효율을 달성하며, 이는 학습 및 추론 시간을 단축시키는 데 기여합니다.</p>
</li>
</ol>
<br/>

<h2 id="구조">구조</h2>
<hr>
<p>Inception 후속 버전에서 유의미한 성능 개선이 있었음에도 불구하고 Inception 모델은 복잡한 구조 때문에 잘 사용되지 않았습니다. 때문에 v4모델에서는 구조를 획일화하였습니다. 
<img src="https://velog.velcdn.com/images/qtly_u/post/2f4cccd2-e2f5-4809-8c51-08413c286457/image.png" alt="">
다음은 각 모듈에 대해 살펴보겠습니다.</p>
<h3 id="stem"><strong>Stem</strong></h3>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/578bdd84-e190-49f3-803a-ce8a6f32fac6/image.png" alt=""></p>
<p>Stem 모듈은 Inception v4의 초기 부분에서 사용되는 모듈로, 입력 이미지의 초기 특징을 추출하는 역할을 합니다. 이 모듈은 이미지에 대한 기본적인 특징을 학습하고 네트워크에 전달하기 위해 사용됩니다. Stem 모듈은 일반적으로 Convolutional 레이어와 Pooling 레이어의 조합으로 구성되어 있으며, 입력 이미지의 고수준 특징을 추상화하기 위해 필터와 스트라이드를 조정합니다.</p>
<h3 id="inception-a"><strong>Inception-A</strong></h3>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/7babc841-6ad1-4a11-a802-72985723bc07/image.png" alt=""></p>
<p>주로 1x1, 3x3, 5x5 필터와 pooling 연산이 병렬로 적용되며, 이를 통해 다양한 크기의 receptive field를 가진 특징을 얻을 수 있습니다.</p>
<h3 id="inception-b"><strong>inception-B</strong></h3>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/d22b5bc2-5b15-43b1-af78-7208411a9f06/image.png" alt=""></p>
<p>Inception-B 모듈은 Inception-A 모듈과 유사하지만, 필터의 구성이 다르게 조정되어 있습니다. 주로 1x1, 7x7 필터와 다양한 크기의 pooling 연산이 사용되며, 이로 인해 더욱 다양하고 복잡한 특징을 추출할 수 있습니다.</p>
<h3 id="inception-c"><strong>inception-C</strong></h3>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/671879b8-b1b9-4afc-bb6f-c377c14fe36c/image.png" alt=""></p>
<p>Inception-C 모듈은 높은 수준의 추상화된 특징을 얻기 위해 Inception-A와 Inception-B 모듈에서 나온 특징을 결합하는 역할을 합니다. 이 모듈은 이전 모듈에서 추출된 특징을 조합하여 더욱 풍부한 표현을 만들어내는 데 기여합니다.</p>
<h3 id="reduction-a"><strong>reduction-A</strong></h3>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/22a4adc0-f496-478f-a1c6-54ffb625074e/image.png" alt=""></p>
<p>Reduction-A 모듈은 네트워크의 공간 해상도를 줄이고 특징의 차원을 감소시키는 역할을 합니다. 이 모듈은 보다 큰 receptive field를 가진 특징을 추출하며, 네트워크의 파라미터를 줄이고 계산 효율성을 높이기 위해 사용됩니다.</p>
<h3 id="reduction-b"><strong>reduction-B</strong></h3>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/05696721-7aab-43b6-9dd1-9a3ff5600155/image.png" alt=""></p>
<p>Reduction-B 모듈은 Reduction-A와 마찬가지로 공간 해상도를 줄이고 특징의 차원을 감소시키는 역할을 합니다. Reduction-A 모듈에서 처리한 이미지의 크기를 줄이는 이 모듈은 3x3 크기의 컨볼루션 레이어와 Max pooling 레이어로 구성되어 있으며, Reduction-A 모듈보다 더 많은 레이어를 가지고 있습니다.</p>
<p>이러한 다양한 모듈의 조합을 최적화하여 고안된 네트워크라고 할 수 있습니다.</p>
<br/>
<br/>

<blockquote>
<p>Reference
[[paper] Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning
] (<a href="https://arxiv.org/abs/1602.07261">https://arxiv.org/abs/1602.07261</a>)
<a href="https://hyunsooworld.tistory.com/entry/Inception-v1v2v3v4%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%B4-%EB%8B%A4%EB%A5%B8%EA%B0%80-CNN%EC%9D%98-%EC%97%AD%EC%82%AC">https://hyunsooworld.tistory.com/entry/Inception-v1v2v3v4%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%B4-%EB%8B%A4%EB%A5%B8%EA%B0%80-CNN%EC%9D%98-%EC%97%AD%EC%82%AC</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[PEFT(Parameter-Efficient Fine-Tuning) 라이브러리 : 대규모 Pre-trained Language Model 효과적으로 활용하기]]></title>
            <link>https://velog.io/@qtly_u/PEFTParameter-Efficient-Fine-Tuning-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EB%8C%80%EA%B7%9C%EB%AA%A8-Pre-trained-Language-Model-%ED%9A%A8%EA%B3%BC%EC%A0%81%EC%9C%BC%EB%A1%9C-%ED%99%9C%EC%9A%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@qtly_u/PEFTParameter-Efficient-Fine-Tuning-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EB%8C%80%EA%B7%9C%EB%AA%A8-Pre-trained-Language-Model-%ED%9A%A8%EA%B3%BC%EC%A0%81%EC%9C%BC%EB%A1%9C-%ED%99%9C%EC%9A%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 08 Mar 2024 07:35:48 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/qtly_u/post/27ba1843-93a7-4216-b85a-ca60a4eae4d6/image.png" alt=""></p>
<h3 id="소개">소개</h3>
<hr>
<p>최근에는 대규모 트랜스포머 모델을 사용한 Pre-trained Language Model (PLM)이 다양한 자연어 처리 분야에서 높은 성능을 보이고 있습니다. 트랜스포머 모델은 GPT, T5, BERT와 같은 대규모 언어 모델뿐만 아니라 VIT, Stable Diffusion, LayoutLM 등 컴퓨터 비전 및 음성 분야에도 적용되고 있습니다. 그러나 모델이 커짐에 따라 Fine-tuning 비용이 증가하고, 모든 파라미터를 튜닝하는 것이 어려워지는 문제가 발생했습니다.</p>
<p>이러한 문제를 해결하기 위해 등장한 라이브러리가 PEFT(Parameter-Efficient Fine-Tuning)입니다. PEFT는 대부분의 모델 파라미터를 고정하고 필요한 부분만 튜닝함으로써 저장 공간 및 계산 비용을 크게 줄입니다. 또한, catastrophic forgetting*과 같은 문제를 극복하면서도 적은 양의 데이터나 도메인 이탈 데이터에 대한 뛰어난 일반화 성능을 보여줍니다.</p>
<blockquote>
<p>*catastrophic forgetting: 인공 신경망이 새로운 정보를 학습할 때 이전에 학습한 정보를 갑자기 급격하게 잊어버리는 경향</p>
</blockquote>
<p>PEFT는 다양한 방법을 활용하여 대규모 언어 모델의 Fine-tuning 비용을 혁신적으로 줄일 수 있는 기능을 제공합니다.</p>
<br/>
<br/>

<h3 id="peft의-기법들">PEFT의 기법들</h3>
<hr>
<p>허깅페이스에서 제공하는 PEFT 라이브러리는 모델 파라미터 중 일부만 미세 조정하거나, 재매개변수화 방법(예: Low-rank adaptation)을 사용하여 계산 및 저장 비용을 크게 절감하는 다양한 방법론을 제공합니다. </p>
<br/>
초기에 PEFT을 위해 제안되었던 방법은 어댑터(adapters)를 사용하는 것입니다.

<p>여기서 adapater란, 기존에 이미 학습이 완료된 모델(pre-trained model)의 사이사이에 학습 가능한 작은 feed-forward networks를 삽입하는 구조를 말합니다. 이때, pre-trained model의 weights를 고정시키고 어댑터를 중간 중간 추가함으로써 적은 수의 파라미터로 모델을 튜닝하는 기법입니다.
<br/></p>
<p>뿐만 아니라, PEFT는 다양한 방법론을 제공하고 있으며, <code>LoRA</code>, <code>prompt tuning</code>, <code>prefix tuning</code>
등이 이에 속합니다. 이러한 다양한 방법론을 활용하여 효율적으로 모델을 fine-tuning할 수 있습니다.</p>
<blockquote>
<p><a href="https://velog.io/@qtly_u/LoRA-Low-Rank-Adaptation-of-Large-Language-Models">LoRA 참고설명</a></p>
</blockquote>
<br/>

<p>** PEFT 사용법 예시:**</p>
<pre><code class="language-python">pythonCopy code
from transformers import AutoModelForCausalLM
from peft import get_peft_config, get_peft_model, LoraConfig, TaskType

model_name_or_path = &quot;bigscience/mt0-large&quot;
tokenizer_name_or_path = &quot;bigscience/mt0-large&quot;

peft_config = LoraConfig(
    task_type=&quot;CAUSAL_LM&quot;, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1
)

model = AutoModelForCausalLM.from_pretrained(model_name_or_path)
model = get_peft_model(model, peft_config)
model.print_trainable_parameters()
# output: trainable params: 2359296 || all params: 1231940608 || trainable%: 0.19151053100118282
</code></pre>
<p>이렇게 PEFT를 적용한 모델은 기존 모델의 일부 파라미터만 미세 조정하고 있으며, 저장 및 계산 비용을 현저하게 감소시키는 것을 볼 수 있습니다. 또한, 모델 저장 시에는 base_model 파라미터를 제외한 Adapter 부분만 저장되어 저장 공간을 효율적으로 활용합니다.</p>
<br/>
<br/>

<h3 id="마무리">마무리</h3>
<ul>
<li>PEFT를 사용하여 모델을 조정하면 전체 파인튜닝에서 생성되는 큰 체크포인트 파일 대신 작은 체크포인트 파일을 얻을 수 있어 저장 공간 관리에 도움이 됩니다.</li>
<li>예를 들어, Hugging Face의 bigscience/mt0-xl 모델은 40GB의 저장 공간을 차지하고 각 다운스트림 데이터 세트에 대해 40GB의 체크포인트 파일이 생성되지만 PEFT를 사용하면 다운스트림 데이터 세트에 대해 몇 메가바이트의 적은 용량을 가진 체크포인트 파일을 사용할 수 있습니다.</li>
<li>즉 PEFT로 학습된 적은 양의 가중치는 사전 학습된 LLM 모델 레이어의 상단에 위치하여 모델 전체를 대체할 필요 없이 조금의 가중치만 추가하여 여러 작업을 수행할 수 있습니다.</li>
</ul>
<br/>
<br/>
<br/>

<blockquote>
</blockquote>
<p><strong>참고 링크:</strong>
<a href="https://github.com/huggingface/peft">PEFT 라이브러리 공식 GitHub</a>
<a href="https://sooftware.io/peft/">https://sooftware.io/peft/</a>
<a href="https://4n3mone.tistory.com/7">https://4n3mone.tistory.com/7</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Linux server에서 Stable diffusion web-ui 설치하기 ]]></title>
            <link>https://velog.io/@qtly_u/Linux-server%EC%97%90%EC%84%9C-Stable-diffusion-web-ui-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@qtly_u/Linux-server%EC%97%90%EC%84%9C-Stable-diffusion-web-ui-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 01 Mar 2024 06:32:21 GMT</pubDate>
            <description><![CDATA[<h3 id="깃헙-설치-매뉴얼처럼-sudo-접근이-불가한-server에서-stable-diffusion-설치하기">깃헙 설치 매뉴얼처럼 sudo 접근이 불가한 server에서 stable diffusion 설치하기</h3>
<p><a href="https://github.com/AUTOMATIC1111/stable-diffusion-webui#automatic-installation-on-linux">github link</a>에서 리눅스 설치 방법을 참고합니다.</p>
<p>저는 sudo 접근이 불가해서 git clone하여 시작했습니다.</p>
<pre><code>$ git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git</code></pre><p>그런 다음 <strong>생성된 폴더로 이동</strong></p>
<p>그리고 다음 커맨드를 입력하여 webui.sh를 생성해줍니다.</p>
<pre><code>$ wget -q https://raw.githubusercontent.com/AUTOMATIC1111/stable-diffusion-webui/master/webui.sh
</code></pre><p>쓰기 권한을 부여해주고 </p>
<pre><code>$ chmod +x webui.sh</code></pre><pre><code>$ ./webui.sh
</code></pre><p>실행해줍니다</p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/09016b0a-7976-41fc-bacc-8d18944aa862/image.png" alt=""></p>
<p>좀 기다리면 끝</p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/d86874b6-7c7c-47e3-ad9d-8afadcf73268/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[paper] BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation]]></title>
            <link>https://velog.io/@qtly_u/BLIP-Bootstrapping-Language-Image-Pre-training-for-Unified-Vision-Language-Understanding-and-Generation</link>
            <guid>https://velog.io/@qtly_u/BLIP-Bootstrapping-Language-Image-Pre-training-for-Unified-Vision-Language-Understanding-and-Generation</guid>
            <pubDate>Tue, 30 Jan 2024 06:18:05 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>&quot;BLIP&quot;</p>
</blockquote>
<p>오늘 소개하는 <a href="https://arxiv.org/pdf/2201.12086.pdf">BLIP(paper)</a>는, 2022년 발표된 논문으로 vision-language understanding tasks와 generation-based tasks 모두 유연하게 사용할 수 있도록 아키텍처를 설계하였고, 합성된 캡션을 생성하고 기존 text중에서는 noise가 있는 caption을 제거하는 방식을 통해 웹에서 수집한 데이터의 noise를 효과적으로 활용할 수 있도록 했다고 한다. </p>
<p>작성시점 기준 후속연구인 BLIP2가 <a href="https://nocaps.org/">nocaps dataset</a>에서 SOTA를 달성하고 있다.</p>
<br/>


<h2 id="introduction">Introduction</h2>
<hr>
<blockquote>
<p>기존 Vision-Language Pre-training (VLP)의 한계</p>
</blockquote>
<p>Vision-Language Pre-training (VLP) 기술이 시각과 언어를 결합한 tasks에서 좋은 성과를 보이고 있으나 아래와 같은 한계가 존재한다. </p>
<ol>
<li><p>모델 관점에서의 한계</p>
<ul>
<li>대부분의 방법이 encoder 기반 모델이나 encoder-decoder 모델 중 하나를 채택하고 있음
👉  그러나 encoder 기반 모델은 text generation task(ex. image caption generation)에는 적합하지 않고, encoder-decoder 모델은 text 생성에만 집중하다보니 image-text 상호 modality간의 understanding이 필요한 task의 성능이 그리 좋지 않았음</li>
</ul>
</li>
<li><p>데이터 관점에서의 한계</p>
<ul>
<li>대부분의 최신 방법은 주로 웹에서 수집하여 noise가 있는 image-text 데이터셋의 확장을 통해 성능을 향상시키고자 함
👉  데이터셋을 확장하여 성능향상을 이룰 순 있지만 논문에서는 web text의 noise가 vision-language 학습에는 부적절하다고 한다.<br/>

</li>
</ul>
</li>
</ol>
<p>BLIP에서는 이러한 한계를 극복하기 위한 아키텍처를 제안하였다.</p>
<blockquote>
<p>BLIP 프레임워크의 두 가지 Contribution</p>
</blockquote>
<ol>
<li><p>모델 관점 
Multimodal mixture of Encoder-Decoder (MED) 
: 효과적인 multimodal pre-training과 유연한 transfer learning을 위한 새로운 모델 구조로, 아래 세가지 기능으로 동작할 수 있어 위와 같은 이름이 붙여졌다.
<code>- unimodal encoder</code> 
<code>- image-text encoder</code> 
<code>- image-text decoder</code></p>
<p>위에서 살펴봤던 한계처럼 encoder, decoder에 적합한 task가 나뉘면서 서로다른 modality 간의 상호작용을 고려하기 어려웠던 문제점을 다양한 작동 모드에서 동작할 수 있는 MED 블록으로 학습시키면서 vision과 language에 대한 이해를 꾀한다.</p>
</li>
</ol>
<ol start="2">
<li><p>데이터 관점 
Captioning and Filtering (CapFilt)
: noise가 있는 image-text pairs에서 학습하기 위한 새로운 데이터 bootstrapping 방법</p>
<ul>
<li>pre-trained된 MED를 captioner 및 노이즈 제거 필터 두 모듈로 세밀 조정</li>
<li>이미지에서 합성된 캡션을 생성하는 captioner와, 원본 web text 및 합성된 text에서 noise가 많은 caption을 제거하는 filter가 함께 작동하여 다양한 downstream tasks에서 상당한 성능 향상을 달성</li>
</ul>
<p><span style="color:gray"><em>example) 아래 그림처럼 케이크 사진에 잘못된 caption을 filter를 통해 제거!</em>
<img src="https://velog.velcdn.com/images/qtly_u/post/98982d2f-f08b-4fc1-8c0f-243561563f15/image.png" alt=""></p>
</li>
</ol>
<br/>

<h2 id="method">Method</h2>
<hr>
<blockquote>
<p>Model Architecture</p>
</blockquote>
<p>image encoder로는 Vision transformer를 사용하였고, 위에서 설명한 MED가  unimodal encoder, image-text encoder, image-text decoder로 작동한다.</p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/2181403b-1e45-4ff7-a09f-b157bf337b0b/image.png" alt=""></p>
<p>때문에 모델은 image-text contrastive learning, image-text matching, imageconditioned language modeling의 세 가지 vision-language 목적으로 동시에 pretrained 된다. 이를 위한 loss는 아래 내용으로 이어진다.</p>
<br/>

<blockquote>
<p>Pre-training Objectives</p>
</blockquote>
<p>pre-training 동안 두 개의 understanding-based objective와 한 개의 generation-based objective, 이렇게 세 개의 목적을 달성하기 위해 아래의 loss function을 가진다. </p>
<p><span style="color:yellowgreen"> 1. Image-Text Contrastive Loss (ITC)</span>
  : vision transformer와 text transformer 사이에서 negative pairs와 대조적으로 positive image-text pairs끼리 유사한 표현을 갖도록 하는 loss</p>
<p><span style="color:yellowgreen">2. Image-Text Matching Loss (ITM)</span>
  : image-based text encoder에서 작용하는 loss
  vision과 language 간의 미세한 alignment를 캡처하는 representation을 학습하도록 하는 objective function이다.</p>
<p><span style="color:yellowgreen">3. Language Modeling Loss (LM)</span>
  : image-based text decoder에서 작용하는 loss
  decoder에서 텍스트 설명을 생성할 때 텍스트의 가능성을 최대화하도록 모델을 training한다, cross entropy loss가 쓰인다.</p>
<br/>

<p>multi-task learning을 활용하여 효율적인 pre-training을 수행하기 위해 <strong>text encoder와 text decoder는 SA(Self-Attention) 레이어를 제외한 모든 파라미터를 공유</strong>한다. </p>
<p>👉 SA 레이어를 제외한 이유는 인코딩 및 디코딩 작업 간의 차이가 SA 레이어에 가장 잘 나타나기 때문 (각각의 작업에서 공통된 특징을 학습하면서도, 인코딩 및 디코딩 작업 간의 차이를 반영하기 위함)</p>
<br/>

<blockquote>
<p>CapFilt </p>
</blockquote>
<p>최근에는 인간이 수동으로 캡션을 생성하는 고품질 데이터셋을 이용하기보다 웹에서 수집되는 대규모 데이터셋을 사용하는 추세이다.
그러나 웹에서 수집된 대체 텍스트는  vision-language alignment를 학습하기에는 부적절한(이미지의 시각적 내용을 정확하게 설명하지않는) noise가 많이 포함되어 있다. </p>
<p>논문에서는 이러한 text corpus의 품질을 향상시키기 위해 CapFilt(Captioning and Filtering)라는 새로운 방법을 도입한다. 
아래와 같이 두가지 기능으로 구성된다.</p>
<ul>
<li>captioner : image-based text decoder로서 이미지에 대한 캡션 생성</li>
<li>filter : image-based text encoder로서 ITC 및 ITM objectives를 사용하여 생성된 텍스트로부터 텍스트가 이미지와 일치하는지 확인하고 노이즈가 있는 이미지-텍스트 쌍을 제거</li>
</ul>
<p>👉 마지막으로 이렇게 필터링된 이미지-텍스트 쌍을 사람이 주석을 매긴 쌍과 결합하여 새로운 데이터셋을 형성하게 된다.</p>
<br/>

<h2 id="experiments">Experiments</h2>
<hr>
<blockquote>
<p>CapFilt의 효과</p>
</blockquote>
<p>  아래 표를 보면 captioner(C)와 filter(F) 둘다 사용했을 때 효과가 상호 보완되어 원본 웹 텍스트를 사용하는 것보다 성능이 향상되는 것을 볼 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/3a8bd3c9-10f1-4b58-965b-520802110483/image.png" alt=""></p>
<br/>

<blockquote>
<p>parameter sharing 전략</p>
</blockquote>
<p>Self attention layer를 제외하고 파라미터를 공유했을 때 가장 높은 성능을 보임을 알 수 있다.
SA 레이어를 공유하면 인코딩 작업과 디코딩 작업 간의 충돌로 인해 모델 성능이 저하된다.</p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/44758ec0-5220-4e9b-8e22-250e2a6474f1/image.png" alt=""></p>
<br/>

<blockquote>
<p>Image-Text Retrieval</p>
</blockquote>
<p>14M pretrained 이미지에서 BLIP은 COCO의 평균 R@1에서 이전 SOTA모델 ALBEF보다 +2.7% 더 높은 성능을 달성했다. </p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/51feb78c-b6fa-456e-8d4a-3db9fc2bc95b/image.png" alt=""></p>
<br/>

<blockquote>
<p>Image Captioning</p>
</blockquote>
<p>129M 이미지의 BLIP은 200M 이미지의 LEMON과 같은 성능을 발휘하는데, LEMON에는 계산량이 많은 pretrained object detector와 더 높은 resolution(800×1333) 입력 이미지가 필요하므로 BLIP보다 추론 시간이 상당히 느리다. </p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/fa915c25-26c1-422d-89f8-a73a657acec1/image.png" alt=""></p>
<br/>

<blockquote>
<p>Visual Question Answering (VQA)</p>
</blockquote>
<p>주어진 이미지와 질문에 대한 답변을 예측해야 하는 task에서도 14M 이미지셋에서BLIP이 테스트 세트에서 ALBEF보다 +1.64% 더 나은 성능을 보인다.
129M 이미지셋으로 pretrained된 BLIP은 13배 더 많은 사전 훈련 데이터(1.8B)와 더 큰 비전 백본을 사용하는 SimVLM보다도 더 나은 성능을 달성하는 것을 볼 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/8437b10c-53fd-482f-9c40-d6031b978687/image.png" alt=""></p>
<br/>

<blockquote>
<p>Zero-shot Transfer to Video-Language Tasks</p>
</blockquote>
<p>BLIP 모델은 텍스트-비디오 검색과 비디오 질문 답변의 video-language task에 대해서도 일반화 성능을 보여줬다.</p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/ef936f8c-8f34-4f3b-976a-c014f354cad6/image.png" alt=""></p>
<br/>
<br/>
]]></description>
        </item>
        <item>
            <title><![CDATA[Stable diffusion webui 설치 및 실행방법, 에러]]></title>
            <link>https://velog.io/@qtly_u/Stable-diffusion-webui-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%8B%A4%ED%96%89%EB%B0%A9%EB%B2%95-%EC%97%90%EB%9F%AC</link>
            <guid>https://velog.io/@qtly_u/Stable-diffusion-webui-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%8B%A4%ED%96%89%EB%B0%A9%EB%B2%95-%EC%97%90%EB%9F%AC</guid>
            <pubDate>Mon, 22 Jan 2024 05:18:50 GMT</pubDate>
            <description><![CDATA[<h3 id="step-1">step 1.</h3>
<p>github link : <a href="https://github.com/AUTOMATIC1111/stable-diffusion-webui/">https://github.com/AUTOMATIC1111/stable-diffusion-webui/</a></p>
<p>위 레포지토리를 clone하고 
<img src="https://velog.velcdn.com/images/qtly_u/post/6e14d915-ad82-4635-a032-9714870adb66/image.png" alt=""></p>
<h3 id="step-2">step 2.</h3>
<p>webui-user.bat 파일을 더블클릭하여 실행하면 된다.</p>
<p>이때 python을 찾을 수 없다는 에러가 나올 경우
<img src="https://velog.velcdn.com/images/qtly_u/post/9e36fb51-bf5e-4fab-b969-b642bb22be06/image.png" alt=""></p>
<p>편집을 누르고</p>
<pre><code>set PYTHON=</code></pre><p>이렇게 비어있다면 여기에 python의 경로를 입력 후 저장해주면 된다.</p>
<blockquote>
<p>*참고  : python 경로 못찾겠을 때
터미널에서 </p>
</blockquote>
<pre><code>python
&gt;&gt;&gt; import sys
&gt;&gt;&gt; sys.executable</code></pre><blockquote>
<p>하면 경로 나옴</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/af73a33c-0d5c-4020-a0cd-72f5b3fb1431/image.png" alt=""></p>
<blockquote>
<p>복사하여 붙여주고 저장하면 된다. </p>
</blockquote>
<br/>

<h3 id="-gpu-사용-불가-에러">@ gpu 사용 불가 에러</h3>
<blockquote>
<p>RuntimeError: Torch is not able to use GPU; add --skip-torch-cuda-test to COMMANDLINE_ARGS variable to disable this check</p>
</blockquote>
<p>파이썬 경로만 입력해줬을 때 작동하면 다행이지만 gpu사용이 불가능할 경우 다음과 같은 에러를 마주하게 된다.</p>
<p>이럴때는 다시 파일을 편집버튼을 눌러 열고 </p>
<pre><code>set COMMANDLINE_ARGS=</code></pre><p>이렇게 비어있다면 </p>
<pre><code>set COMMANDLINE_ARGS=--skip-torch-cuda-test --precision full --no-half</code></pre><p>위와 같이 수정하여 준다. </p>
<br/>
그러면 잘 접속된다. 

<p><img src="https://velog.velcdn.com/images/qtly_u/post/4228f00d-e25c-4e13-b6cb-9311f8376efc/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[paper] SlowFast Networks for Video Recognition]]></title>
            <link>https://velog.io/@qtly_u/paper-SlowFast-Networks-for-Video-Recognition</link>
            <guid>https://velog.io/@qtly_u/paper-SlowFast-Networks-for-Video-Recognition</guid>
            <pubDate>Fri, 12 Jan 2024 06:01:51 GMT</pubDate>
            <description><![CDATA[<p>SlowFast Networks for Video Recognition 논문 리뷰</p>
<p>이 모델은 facebook에서 2018년에 발표했으며, 발표 당시 video recognition task에서 SOTA를 달성하며 논문으로 나온 모델입니다. 
먼저 이름부터 특이한데요, Slow와 fast가 동시에 존재합니다. 이는 모델에서 제안한 특이한 아키텍처로부터 붙여진 이름입니다. </p>
<br/>

<h3 id="introduction">Introduction</h3>
<hr>
<blockquote>
<p>이미지 및 비디오 인식의 맥락에서 공간 및 시간 차원</p>
</blockquote>
<ul>
<li><p>공간 영역과 시간 차원의 차이:<br>이미지에서는 x와 y라는 공간 차원을 대칭적으로 취급하는 것이 일반적입니다. 그러나 비디오에서는 이미지와 달리 시간(t)이라는 차원이 추가됩니다. 이러한 차원이 추가되면서 비디오에서는 공간과 시간의 대칭성이 더 이상 성립하지 않습니다. </p>
</li>
<li><p>움직임의 속성:  일상에서는 물체나 인물의 움직임이 크게 빨라지는 경우보다는 느린 움직임이 더 자주 나타날 수 있습니다. </p>
</li>
</ul>
<p>말이 어려운데, 예를 들어 손을 흔드는 동작은 &quot;손&quot;의 정체성은 흔들기 동작 동안에도 변경되지 않고, 사람은 걷는 동작에서 뛰기로 전환하더라도 항상 &quot;사람&quot; 범주에 속한다는 것입니다. 따라서 범주적 의미론(색상, 질감, 조명 등)의 인식은 비교적 천천히 새롭게 갱신될 수 있습니다. 그러나 수행 중인 동작은 주체의 정체성보다 훨씬 빠르게 진화할 수 있습니다. 예를 들어 박수치기, 손 흔들기, 흔들림, 걷기, 뛰기 등이 해당됩니다. 이러한 빠르게 변하는 동작을 효과적으로 모델링하기 위해 빠른 갱신 속도(높은 시간적 해상도)의 프레임을 사용하는 것이 바람직할 수 있습니다.</p>
<br/>

<h3 id="2-path-networks">2-path Networks</h3>
<hr>
<p>이에 따라 SlowFast 모델은 두 가지 경로를 제시합니다. </p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/8a092a7c-ca9f-4847-92aa-920dc4f63979/image.png" alt=""></p>
<p>첫 번째 경로는 이미지 또는 몇 개의 희소한 프레임에서 얻을 수 있는 의미 정보를 캡처하도록 설계되어 낮은 프레임 속도와 느린 갱신 속도를 가집니다. 
반면, 두 번째 경로는 빠르게 변하는 동작을 캡처하도록 하며 높은 갱신 속도와 높은 시간적 해상도에서 작동합니다. 이 경로는 매우 가볍게 설계되었고 전체 계산의 약 20% 정도를 차지합니다. </p>
<p><strong>첫 번째 경로를 &quot;느린(Slow) 패스웨이&quot;라 하고, 두 번째 경로를 &quot;빠른(Fast) 패스웨이&quot;라고 부르며, 이는 각각 다른 시간 속도에 기반합니다.</strong></p>
<p>정리하자면 다음과 같습니다. </p>
<blockquote>
<ul>
<li>느린(Slow) 패스웨이:</li>
</ul>
</blockquote>
<ul>
<li>이미지나 희소한 프레임에서 얻을 수 있는 의미 정보를 캡처</li>
<li>낮은 프레임 속도와 느린 갱신 속도에서 작동 </li>
<li>공간 영역과 의미론에 집중</li>
<li>약 80%의 계산 차지<blockquote>
<ul>
<li>빠른(Fast) 패스웨이:</li>
</ul>
</blockquote>
</li>
<li>빠르게 변하는 동작을 캡처</li>
<li>높은 프레임 속도와 높은 시간적 해상도에서 작동</li>
<li>가벼운 구조, 약 20% 정도의 계산 차지</li>
</ul>
<p>이렇게 정리해놓고 단순히 생각하면 slow path가 80%의 계산을 차지하고 fast path가 20%의 계산을 차지하는 것이 의아한데요, Fast path는 모션 정보만 얻어내면 되기 때문에, 디테일한 정보가 필요 없어서 채널 수가 적어도 됩니다. Slow path에 비해서 “베타＂만큼 채널을 줄일 수 있게끔 됩니다. 
이 비율의 기준도 궁금한데요, 사실 이 모델이 실제 사람의 시신경에서 모티브를 얻은 것이기 때문입니다. 실제 동물의 시각 세포들은 물체의 공간적 도메인을 분석하는 파트와 시간적 도메인을 분석하는 파트가 따로 나뉘어있다고 합니다. 시각 세포 중 20%는 물체의 움직임과 위치를 보고, 남은 대부분의 80% 세포는 색깔과 디테일을 본다고 합니다. 생물학적으로 비율이 정해져 있어서 slowfast에도 이 비율을 그대로 적용이 된 것입니다.</p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/6df26eb5-9e34-4d0f-81b7-11bb68886549/image.png" alt=""></p>
<p>(출처) <a href="https://blog.naver.com/112fkdldjs/223033497222">https://blog.naver.com/112fkdldjs/223033497222</a></p>
<br/>


<h3 id="lateral-connections">Lateral connections</h3>
<hr>
<p>두 경로는 측면 연결을 통해 통합됩니다. fast pathway는 가벼움으로 인해 모든 중간 레이어에서 높은 프레임 속도에서 작동하고 시간적 충실도*를 유지할 필요가 없습니다. 반면에 낮은 프레임 속도 덕분에 slow pathway는 공간 영역과 의미론에 더 집중할 수 있습니다. 이 방법은 비디오를 다르게 갱신 속도로 처리함으로써 두 경로가 각각의 역할을 수행하도록 하는 것입니다. </p>
<p>(*시간적 충실도 : 빠르게 변화하는 시간적인 특징을 잘 포착하면서도 그 변화를 정확하게 나타낼 수 있는 능력을 갖추고 있다는 것을 의미)</p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/e82978fa-91b6-4f77-b7b9-e04b73442f3b/image.png" alt=""></p>
<p>다시한번 사진을 보시면 fast path에서 slow path로 유니 디렉션을 통해 연결을 해주는 것을 볼 수 있습니다. 논문에서는 단방향으로 해도 양방향과 유사한 결과를 얻었다고 언급합니다.</p>
<p>이러한 연결 과정에서 특징의 크기를 일치시키는 것이 필요한데요, Slow 경로의 특징 형태를 {T, S2, C}로 표기하면, Fast 경로의 특징 형태는 {αT, S2, βC}입니다. 다음과 같은 변환을 통해 Lateral connections에서 실험을 진행합니다:</p>
<blockquote>
<p>Time-to-channel:</p>
<p>{αT, S2, βC}를 {T, S2, αβC}로 reshape하고 transpose합니다. 이는 모든 α 프레임을 하나의 프레임의 채널로 묶는 것을 의미합니다.</p>
</blockquote>
<blockquote>
<p>Time-strided sampling:</p>
<p>간단히 말해 α 중에서 하나씩 샘플링하여 {αT, S2, βC}를 {T, S2, βC}로 만듭니다.</p>
</blockquote>
<blockquote>
<p>Time-strided convolution:</p>
<p>5×1×2 커널을 사용하는 3D convolution을 수행하고 2βC의 출력 채널과 α의 stride를 갖습니다.
측면 연결의 출력은 Slow path에 더하거나 concat하여 통합됩니다.</p>
</blockquote>
<br/>

<h3 id="results">Results</h3>
<hr>
<p> SlowFast 모델이 가장 높은 성능을 자랑하는 스펙은 Non Local Blocks까지 사용한 모델이라, 소개를 하고 넘어가겠습니다.</p>
<blockquote>
<h4 id="non-local-block">Non Local block</h4>
</blockquote>
<p><a href="https://openaccess.thecvf.com/content_cvpr_2018/papers/Wang_Non-Local_Neural_Networks_CVPR_2018_paper.pdf">Non Local block</a>은 CNN 구조나 Transformer와 같은 모델에서 특정 레이어 또는 블록에 통합할 수 있는 유용한 블록입니다. spatial domain 즉 공간적 도메인 혹은 temperal 도메인 어느 쪽 으로라도 현재 출발하는 지점의 픽셀의 정보가 어떤 frame의 어느 지점과 연관성이 있는지 계산하는 일종의 self attention 네트워크입니다. 이 블록은 시간적으로 긴 범위에서도 정보를 캡처할 수 있어 Action Recognition과 같은 작업에서 성능 향상에 기여합니다.
<img src="https://velog.velcdn.com/images/qtly_u/post/7e261962-1c5e-46fc-bfde-69ed3f4c4e19/image.png" alt=""></p>
<br/>


<p>다시 돌아와서, 실험에서 SlowFast 네트워크는 Kinetics-400, Kinetics-600, Charades 및 AVA 데이터셋에서 평가되었습니다. Kinetics action classification에 대한 실험에서 SlowFast의 기여도가 입증되었으며, 당시 SlowFast 네트워크는 이전 모델에 비해 상당한 성능 향상을 보여주는 새로운 최고 기록을 세웠습니다.</p>
<p><img src="https://velog.velcdn.com/images/qtly_u/post/f0c28e28-99d7-4697-8c49-1e16af04a2f1/image.png" alt=""></p>
<br/>
<br/>

<hr>
<p>연구원님 블로그를 보다가 알게된 모델인데 이런 공간적인 문맥을 따로 학습하는 네트워크가 있으면 비슷한 이미지가 연속되는 비디오에서도 객체의 직접적인 형태의 변형이 없어도 객체의 이동, 위치를 고려한 상황 학습을 시킬 수 있을까 생각이 들어서 정리했다. 나중에 좀더 조사해보고 태스크에 적용해보려고 하는데, 내가 하고 싶은 태스크는 단순 분류나 인식 태스크가 아니라 조금 더 조사해 봐야 할듯하다.  </p>
<blockquote>
<p><strong>Reference</strong>
<a href="https://blog.naver.com/112fkdldjs/223033497222">https://blog.naver.com/112fkdldjs/223033497222</a>
<a href="https://arxiv.org/pdf/1812.03982.pdf">https://arxiv.org/pdf/1812.03982.pdf</a>
<a href="https://openaccess.thecvf.com/content_cvpr_2018/papers/Wang_Non-Local_Neural_Networks_CVPR_2018_paper.pdf">https://openaccess.thecvf.com/content_cvpr_2018/papers/Wang_Non-Local_Neural_Networks_CVPR_2018_paper.pdf</a></p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>