<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>hunniee_j.log</title>
        <link>https://velog.io/</link>
        <description>MMAI Lab in Yonsei univ. since 2024</description>
        <lastBuildDate>Tue, 22 Aug 2023 06:14:09 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. hunniee_j.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/hunniee_j" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[SR Paper Review] SOF-VSR(2)]]></title>
            <link>https://velog.io/@hunniee_j/SR-Paper-Review-SOF-VSR2</link>
            <guid>https://velog.io/@hunniee_j/SR-Paper-Review-SOF-VSR2</guid>
            <pubDate>Tue, 22 Aug 2023 06:14:09 GMT</pubDate>
            <description><![CDATA[<p>이번에는 <a href="https://velog.io/@hunniee_j/SR-Paper-Review-SOF-VSR">앞서 올린 포스트</a>의 뒷부분을 리뷰하고, SOF-VSR에 대한 정리를 마치도록 하겠습니다. Methodology부터 하나씩 살펴보겠습니다.</p>
<h2 id="methodology">Methodology</h2>
<p>본 논문의 핵심인 SOF-VSR의 전체적인 구조는 Fig.1과 같습니다. 추후 상세한 단계별 구조들도 논문에 상세히 소개되어 있어서 도움이 많이 될 것 같습니다.</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/ad497a83-9ea0-4c25-84d1-319f121d5160/image.png
" alt="abstract thumbnail"/>
  Fig 1. SOF-VSR Architecture
</p>

<h4 id="overview">Overview</h4>
<ul>
<li>T개의 연속적인 LR frames이 SOF-VSR의 입력으로 사용</li>
<li>$I_{(t-N)}^L,; \cdots, ; I_t^L, ; I_{t+N}^L$ 으로 frame을 표기하여 $T=2N+1$ 임</li>
<li>그 이후 LR frames들을 <span style=color:orange>YCbCr color space</span> 로 변환하는데, <span style=color:orange>밝기에 관한 channel</span>만을 얻고자 하였음.
(<del>YCbCR은 첫 프로젝트에서 사용한 이미지의 색 채널 관련된 것인데, 참고사항으로 공부하면 도움이 많이 되었습니다. 이미지 및 영상 처리에서 중요하게 쓰였더라구요.</del>) 
<a href="https://en.wikipedia.org/wiki/YCbCr">✅참고자료 : YCbCr Wikipedia</a></li>
<li>LR Frame들은 OFRnet으로 먼저 들어가고, HR optical flow를 추론함</li>
<li>ORFnet은 <span style=color:red>central LR frame $I_t^L$과 인접한 $I_i^L$ frame</span>을 가지고 <span style=color:red>HR optical flow $F_{i\to t}^H$</span>를 생성함</li>
</ul>
<hr>
<ul>
<li>그 후, <span style=color:orange>space-to-depth transformation</span>을 거쳐 <span style=color:red>HR optical flow를 LR flow cube</span>로 생성</li>
<li><span style=color:orange>Motion compensation</span>이 <span style=color:red>flow cube를 사용하여 draft cube를 생성</span>함</li>
<li>생성된 <span style=color:orange>Draft cube</span>가 SRnet으로 들어가 최종적인 <span style=color:red>HR frame</span>을 만듬</li>
<li>본 예시에서는 $T=3$을 예시로 설명되어 있음</li>
</ul>
<hr>
<h4 id="optical-flow-reconstruction-netofrnet">Optical Flow Reconstruction Net(OFRnet)</h4>
<p>시작하기 앞서 자꾸 optical flow라는 개념이 나오는데, 이에 대해 설명은 하지 않아둬서 이해에 어려움이 있으시면 아래의 두 자료를 확인해주시면 좋습니다. 저도 공부하는데 많이 도움이 된 두 곳입니다.</p>
<p>✅ <a href="https://gaussian37.github.io/vision-concept-optical_flow/">Optical Flow(1)</a>
✅ <a href="https://learnopencv.com/optical-flow-in-opencv/">Optical Flow(2)</a></p>
<hr>
<ul>
<li>기존의 연구들로 CNN이 LR and HR image간의 <span style=color:red>non-linear mapping</span>도 학습 가능하다는 것이 보여짐</li>
<li>Optical Flow를 사용한 FlowNet과 같은 선행 연구들이 optical flow가 <span style=color:red>motion estimation</span>에 사용될 수 있다는 잠재력을 보여줌</li>
<li>따라서 본 논문에서 OFRnet은 이를 융합하여 사용</li>
</ul>
<p>$$
F^H_{i \to j} = Net_{OFR}(I^L_i ;,; I^L_j ; ;; Θ_{OFR}) \
\ 
Θ ; : ; set ; of ; parameter
$$</p>
<hr>
<ul>
<li>model size와 training difficulty를 줄이기 위해, parameter를 공유하는 <span style=color:red>scale-recurrent architecture</span>가 <strong>SRN-DeblutNet</strong>에서 사용됨</li>
<li>이 개념에서 아이디어를 얻어 <span style=color:red>optical flow reconstruction</span>에 scale-recurrent network를 사용</li>
<li>전체적인 OFRnet의 구조는 Fig.2 참고</li>
</ul>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/fbd81e93-aadf-41a7-a2d2-3233e77df328/image.png
" alt="abstract thumbnail"/>
  Fig 2. OFRnet Architecture
</p>

<ul>
<li>첫 두 level에서는 recurrent module을 서로 다른 scale의 input에서 optical flow를 추론하기 위해서 사용</li>
<li>level 3에서는 먼저 <span style=color:red> recurrent structure</span>를 <span style=color:red>deep representation</span>을 생성하기 위해 사용하고, 그리고 SR module을 <span style=color:red>LR frame representation</span>을 기반으로 <span style=color:red>HR optical flow</span>를 복원하는데 사용</li>
<li>이러한 구조는 OFRnet이 <span style=color:red>complex motion pattern</span>을 다룰 수 있게 하고, model 자체도 <span style=color:red>lightweight</span> 및 <span style=color:red>compact</span> 함</li>
</ul>
<hr>
<p>Fig.2의 각 level별 동작을 상세히 정리하면 아래와 같습니다. 입력과 출력이 서로 엮여있어 level 1부터 차례대로 타고 올라가면 전체적인 흐름을 파악할 수 있습니다.</p>
<h5 id="level-1">Level 1.</h5>
<ul>
<li><strong>Input</strong> : pair of LR frame $I^L_i$, $I^L_j$</li>
<li>Input $\to$  <span style=color:red>downsampled</span> by a factor 2</li>
<li><strong>Generate</strong> : $I^{LD}<em>i$ , $I^{LD}_j$ &amp; initial flow map $F^0</em>{i \to j}$</li>
<li>Concatenated these generations $\to$ fed to a <strong>feature extraction layer</strong></li>
<li><strong>three efficient residual blocks</strong> used to generate <span style=color:red>deep features</span></li>
<li><span style=color:orange>Channel split, Channel shuffle, Depth-wise convolution techniques</span> are used to improve the efficiency</li>
<li>these <strong>features</strong> $\to$ fed to <strong>flow estimation layer</strong> $\to$ generate $F^{LD}_{i \to j}$ : <strong>optical flow</strong> at level 1</li>
<li>middle layer를 제외한 모든 convolution layer는 ReLU를 사용</li>
<li><strong>Output</strong> : $F^{LD}_{i \to j}$</li>
</ul>
<h5 id="level-2">Level 2.</h5>
<ul>
<li><strong>Input</strong> : $F^{LD}_{i \to j}$</li>
<li><span style=color:red>Upscaled</span> by factor of 2 using bilinear interpolation</li>
<li><span style=color:orange>Magnitude</span> of optical flow is also <strong>doubled with the resolution</strong></li>
<li><strong>Upscaled Flow</strong> : $F^{LDU}<em>{i \to j}$ used to warp $I^L_i$ $\to$ result $I^L</em>{i \to j}$</li>
<li>$I^L_{i \to j}$ ,  $I^L_{j}$, $F^{LDU}_{i \to j}$ : concatenated and fed to the recurrent model</li>
<li><strong>Output</strong> : $F^{L}_{i \to j}$</li>
</ul>
<h5 id="level-3">Level 3.</h5>
<ul>
<li><strong>Input</strong> : $F^{L}_{i \to j}$</li>
<li>Input has <span style=color:orange>same size as the LR input</span> $I^L_j$ $\to$ level 3 works as an <strong>SR module</strong> to <span style=color:red>reconstruct HR optical flows</span></li>
<li><strong>Similar to level 2</strong> first concateneted and fed to recurrent model to <strong>extract features</strong></li>
<li>These features then fed to <strong>three additional residual blocks</strong> to generate <span style=color:red>deep representations </span></li>
<li>Resulting feature representations are fed to a <strong>sub-pixel layer</strong> for <spanb style=color:red>resolution enhancement</span></li>
<li><strong>Output</strong> : final HR optical flow $F^H_{i \to j}$</li>
</ul>
<h5 id="contribution-of-ofrnet">Contribution of OFRnet</h5>
<ol>
<li>First unified network to <span style=color:red>integrate SR and optical flow estimation</span></li>
<li>Learns to infer <span style=color:red>HR optical flows</span> between <span style=color:red>latent HR image from LR inputs</span></li>
<li>Demonstrated the <span style=color:red>potential of CNN</span></li>
</ol>
<h4 id="motion-compensation-module">Motion Compensation Module</h4>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/fec86fe6-6fd4-4062-885b-797383a61276/image.png
" alt="abstract thumbnail"/>
  Fig 3. Space-to-depth transformation
</p>

<ul>
<li><span style=color:red>space-to-depth transformation</span>이 HR optical flow와 LR frame 사이의 <span style=color:red>resolution gap</span>을 이어주기 위해 사용됨</li>
<li>Fig.3에서 볼 수 있듯, regular LR grid가 HR flow에서 추출되고, channel dimension으로 배치되고 flow cube를 얻음</li>
</ul>
<p>$$
[F^H_{i \to j}]^{sH ; \times ;sW ;\times; 2} ; \to ; [F^H_{i \to j}]^{H ; \times ; W ; \times ; 2s^2}
$$</p>
<ul>
<li>$H$ and $S$는 LR frame의 크기, $s$는 upscaling factor를 의미</li>
<li>Slices are extracted for LR flow cube to wap the LR frame, resulting in multiple warped drafts</li>
</ul>
<p>$$
C^L_{i \to j} = W(I^L_i ; , ; [F^H_{i \to j}]^{H ; \times ; W ; \times ; 2s^2})
$$</p>
<ul>
<li>$W( \dots )$ : warping operation using bilinear interpolation</li>
<li>$C^L_{i \to j} \in R^{H ; \times ; W ; \times ; s^2}$ : represents the concatenation of multiple warped drafts</li>
</ul>
<h4 id="super-resolution-net-srnet">Super-Resolution Net (SRnet)</h4>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/ab5150df-e545-4457-80b4-ff01d02657ff/image.png
" alt="abstract thumbnail"/>
  Fig 4. SRnet
</p>

<ul>
<li>Motion compensation이 끝나고, multiple drafts가 각 neighboring frame에 대해서 생성됨</li>
<li>모든 draft가 <span style=color:red>central LR frame</span>로 concatenated $\to$ fed to SRnet
$$
I^{SR}<em>0 = Net</em>{SR}(C^L;Θ_{SR})
$$</li>
</ul>
<h4 id="loss-function">Loss Function</h4>
<ul>
<li>SRnet과 OFRnet에 대한 Loss 설정</li>
<li>SRnet에 대해서는 MSE(Mean-Square-Error)를 사용<p align=center><img src=https://velog.velcdn.com/images/hunniee_j/post/cace2322-a2b2-4afa-b811-7a8696fd6b7a/image.png></p></li>
<li>OFRnet의 Loss-equation은 아래와 같음</li>
</ul>
<p align=center><img src=https://velog.velcdn.com/images/hunniee_j/post/c810e8c6-9f02-4629-8e75-e8916a24def2/image.png></p>

<ul>
<li><strong>Total Loss</strong> : $L = L_{SR} + \lambda_4 ; L_{OFR}$</li>
<li>$\lambda_4 = 0.01$</li>
</ul>
<h2 id="experiments">Experiments</h2>
<ul>
<li>*<em>Datasets *</em> : Vid4 , DAVIS-10</li>
<li>145 1080P HD video from CDVL database</li>
</ul>
<ul>
<li><strong>Basic Settings</strong> : Pytorch, Nvidia GTX 1080Ti GPU, Adam solver</li>
<li>*<em>Iteration *</em> : 200k</li>
</ul>
<h4 id="ablation-study">Ablation Study</h4>
<p>각 실험에 대한 결과는 Fig.5를 참고하면 됩니다.</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/86f6fe7a-8176-45b7-a430-54aa9fd9bf23/image.png
" alt="abstract thumbnail"/>
  Fig 5. Results of ablation studies
</p>

<ol>
<li><strong>Motion Compensation</strong> : removed OFRnet and fed LR frames directly to SRnet</li>
<li><strong>LR Flow vs HR Flow</strong> : HR optical flows provide more <span style=color:red>accurate temporal dependency</span> for performance improvement</li>
<li><strong>Upsampled Flow vs Super-resolved Flow</strong> : optical flow SR can recover finer temporal details and facilitate SOF-VSR</li>
<li><strong>SISR before Optical Flow Estimation</strong> : network has a much <span style=color:red>lower computational cost</span> and is more suitable for applications on mobile computing devices</li>
<li><strong>Scale-recurrent vs. Scale-cascaded Architectures</strong> :  SOF-VSR is <span style=color:red>more lightweight and compact</span> while achieving comparable performance</li>
<li><strong>Efficient Residual Block vs. Vanilla Residual Block</strong> : SOF-VSR network is <span style=color:red>more suitable</span> for applications on mobile computing devices</li>
</ol>
<hr>
<p>그 외 시각적인 실험결과는 다음 Fig.6-8을 통해 확인할 수 있습니다.</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/e3d94a7d-d7ac-4da8-bcc8-c6bbcebd172e/image.png
" alt="abstract thumbnail"/>
  Fig 6. Results(1)
</p>

<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/c8b0ead9-f94c-42b6-b26a-c05ce0daa99b/image.png
" alt="abstract thumbnail"/>
  Fig 7. Results(2)
</p>

<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/3bea5c46-8eb1-4994-9636-383c85621eda/image.png
" alt="abstract thumbnail"/>
  Fig 8. Results(3)
</p>

<hr>
<p>정량적인 수치에 대한 비교는 Fig.9-12에 첨부된 표를 통해 확인할 수 있습니다.</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/a21580dc-a6ca-4981-9082-ea7f7507571e/image.png
" alt="abstract thumbnail"/>
  Fig 9. Result Tables(1)
</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/820785a7-20a2-4c34-a429-e1d779759d31/image.png
" alt="abstract thumbnail"/>
  Fig 10. Result Tables(2)
</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/6495769c-7020-490b-9205-1f92f3a40937/image.png
" alt="abstract thumbnail"/>
  Fig 11. Result Tables(3)
</p>

<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/6a6ae379-6192-447a-9879-cefef18652c1/image.png
" alt="abstract thumbnail"/>
  Fig 12. Result Tables(4)
</p>

<hr>
<p>표의 내용을 깔끔하게 그래프로 정리해준 사진도 있습니다. Fig.13을 참고해주세요. 그래프에 대한 설명은 하이라이트 해두었습니다.</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/75da5251-d409-46c9-9be6-2610b9592207/image.png
" alt="abstract thumbnail"/>
  Fig 13. Table to Graph
</p>

<hr>
<h2 id="conclusion">Conclusion</h2>
<ul>
<li>Proposed <span style=color:red>end-to-end deep network</span> for video SR</li>
<li>First <span style=color:red>super-resolves optical flows</span> to provide accurate temporal dependency</li>
<li><span style=color:red>Motion compensation</span> is the performed based on HR optical flows</li>
<li>SRnet used to infer SR results from these compensated LR frames</li>
<li>Results show that SOF-VSR network can <span style=color:red>recover accurate temporal details</span> for the <span style=color:red>improvement of both SR accuracy and consistency</span></li>
</ul>
<hr>
<p>SOF-VSR의 논문 리뷰를 이것으로 마치겠습니다. 직접 코딩도 해보고 실험도 해봐야할 Model이라 상세히 읽느라 시간이 좀 오래 걸렸던 것 같습니다. 다음은 OpticalFlow와 관련된 FlowNet으로 생각중입니다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SR Paper Review] SOF-VSR(1)]]></title>
            <link>https://velog.io/@hunniee_j/SR-Paper-Review-SOF-VSR</link>
            <guid>https://velog.io/@hunniee_j/SR-Paper-Review-SOF-VSR</guid>
            <pubDate>Mon, 21 Aug 2023 14:52:26 GMT</pubDate>
            <description><![CDATA[<p>이번에 리뷰할 논문은 2018 ACCV에 <em>&quot;Learning for Video Super-Resolution through HR Optical Flow Estimation&quot;</em> 이란 제목으로 처음 공개된 후 2년 뒤 2020 IEEE에 <em>&quot;Deep Video Super-Resolution using HR Optical Flow Estimation&quot;</em> 으로 보완되어 공개된 논문입니다. Video Super Resolution과 Optical Flow에 대한 개념이 모두 들어가있는 논문으로 원본 논문들과 공식 Github 링크는 아래에 첨부해두겠습니다.</p>
<p>✅ <a href="https://arxiv.org/abs/1809.08573">ACCV 2018</a>
✅ <a href="https://arxiv.org/abs/2001.02129">IEEE 2020</a>
✅ <a href="https://github.com/The-Learning-And-Vision-Atelier-LAVA/SOF-VSR/tree/master">Github</a></p>
<h2 id="abstract">Abstract</h2>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/34c46e0a-9ffc-476b-a067-5e1e69859411/image.png
" alt="abstract thumbnail"/>
  Fig 1. Abstract
</p>


<p>본 초록에서는 기존 Video SR의 난관과 SOF-VSR에 대한 간략한 설명이 요약되어 있습니다.</p>
<blockquote>
<p>&quot;The key challenge for video SR lies in the effective exploitation of temporal dependency between consecutive frames&quot;</p>
</blockquote>
<p>Video-SR에서는 <span style=color:red> 연속적인 프레임 사이에서 일시적인 연관성을 효과적으로 추출하는 것</span>이 가장 key challenge입니다. 기존의 연구들의 경우 저해상도(<strong>LR</strong>) 프레임 간의 optical flow를 추론해서 이를 일시적인 연관성으로 사용했습니다. 하지만 이 방법은 고해상도(<strong>HR</strong>) 출력과 해상도 차이가 있었고, fine detail을 복원하는것을 방해(hinder)하였습니다. 따라서 본 연구에서는</p>
<blockquote>
<p> Specifically, we first propose an optical flow reconstruction network (OFRnet) to infer HR optical flows in a coarse-to-fine manner. Then, motion compensation is performed using HR optical flows to encode temporal dependency. Finally, compensated LR inputs are fed to a super-resolution network(SRnet) to generate SR results.</p>
</blockquote>
<p>의 방법을 소개하고 있습니다. 자세한 구조적인 측면은 추후 Network Architecture와 함께 살펴보도록 하겠습니다.</p>
<h2 id="introduction">Introduction</h2>
<p>Introduction에서는 Abstract에 서술된 부분을 보다 자세하게 정리해두었습니다. 원문은 첨부된 Fig.2~3을 참고해주세요. 자세한 내용은 아래 서술하였습니다.</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/ef04bea2-db50-487a-8349-1079886de408/image.png
" alt="abstract thumbnail"/>
  Fig 2. Introduction 1
</p>

<hr>
<ul>
<li>Consecutive Frame 사이에서 Temporal Dependecy를 추출하는 것이 Video-SR에서 중요함</li>
<li>이를 수행하기 위해 Traditional Video SR이나 Multi-image SR에서는 patch similarities를 사용해 recurrent patches를 찾아냄</li>
<li>하지만 이러한 방법들은 <span style=color:red> 오직 pixel-level dependency이며 computational cost가 아주 높음 </span></li>
<li>그 이후 sub-pixel motion 정보를 optical flow estimation을 통해 사용하는 방법들이 제시됨</li>
<li>이 방법들의 제시 이후, Video SR은 <span style=color:red> Optimization Problem </span>의 영역으로 여겨짐</li>
<li>하지만 이 방법도 수렴단계까지 large number of iteration이 요구되어 high computational cost 문제에 봉착함</li>
</ul>
<hr>
<ul>
<li>단일 이미지 SR의 성공 이후 video SR에서도 많은 연구가 나왔는데, LR frames에서 optical flow를 추정 한 후 이를 HR output에 direct matching하는 방법으로 학습을 해줌</li>
<li>하지만 LR optical flow에서 제공하는 temporal dependency는 video SR을 수행하기엔 아직 부족함</li>
<li>Video SR에서는 <span style=color:red> temporal details &amp; spatail detail </span>이 모두 중요함</li>
<li>현존하는 DL base의 Video SR 방식들이 spatial detail은 LR frame에서 성공적으로 복제할 수 있지만, temporal detail의 resoration은 아직 미지수임</li>
</ul>
<hr>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/3b745905-2616-436f-8362-64d0dc4c0f01/image.png
" alt="abstract thumbnail"/>
  Fig 3. Introduction 2
</p>

<hr>
<ul>
<li><p>따라서 이 논문에서는 Super-resolve Optical Flow for Video SR(<strong>SOF-VSR</strong>)을 제시함</p>
</li>
<li><p>본 구조는 temporal detail을 optical flow SR을 통해서 복원함</p>
</li>
<li><p>우선 optical flow reconstruction net(OFRnet)을 통해 HR optical flow를 재구성함</p>
</li>
<li><p>이 optical flow눈 LR frame에서 motion compensation을 수행하기 위해 사용됨</p>
<blockquote>
<p>a space to-depth transformation is used to bridge the resolution gap between HR optical flows and LR frames</p>
</blockquote>
</li>
<li><p>결론적으로 compensated LR frame들이 <strong>SRnet</strong>(Super-Resolution Net)에 입력됨</p>
</li>
</ul>
<hr>
<p>본 논문의 기여(contribution)는 다음과 같이 주장하고 있습니다.</p>
<ol>
<li>incorporate SR both optical flows and images : Optical flow의 SR이 이미지의 SR에 궁극적으로 기여함 따라서 더 나은 performance를 얻을 수 있었음</li>
<li>propose OFRnet to infer HR optical flows from LR frames</li>
<li>SOF-VSR은 SOTA만큼의 성능을 제공함</li>
</ol>
<hr>
<p>앞서 서두에서 말했듯, 본 논문은 2018년에 ACCV에 올라오고, 2020년에 IEEE에 다시 보완하여 제출되었는데, 2년간의 보완에 대한 설명도 첨부되어 있습니다.(Fig.4)</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/9ad87f09-d897-463c-9690-ed008d657b0a/image.png
" alt="abstract thumbnail"/>
  Fig 4. Introduction 3
</p>

<ol>
<li>Introduce a more <span style=color:orange>lightweight and compact </span> architecture</li>
<li>additional analyses on the design of network</li>
<li>conducted additional experiments on different upscaling factors</li>
<li>additional experiments have been provided</li>
</ol>
<hr>
<h2 id="related-work">Related Work</h2>
<h4 id="single-image-sr">Single Image SR</h4>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/1d9b79a9-a44d-44e2-9884-993a19ce519d/image.png
" alt="abstract thumbnail"/>
  Fig 5. Single Image SR 1
</p>


<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/8afc2b0c-ca7a-41c8-8096-c711374fd90c/image.png
" alt="abstract thumbnail"/>
  Fig 6. Single Image SR 2
</p>

<ul>
<li>기존의 방식들은 high-frequency detail을 복원할 수 없었음</li>
<li>그 후 제시된 방식은 large-number의 반복을 요구하여 연산이 굉장히 비쌈(expensive)</li>
<li>그 이후 DL을 접목하기 시작하면서 SRCNN, VDSR, DRRN, EXPCN, RDN 등의 model이 등장</li>
</ul>
<h4 id="video-sr">Video SR</h4>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/1b4c217e-4b19-486a-bfe5-498965491148/image.png
" alt="abstract thumbnail"/>
  Fig 7. Traditional Video SR
</p>

<ul>
<li>전통적인 Video SR에도 여러 방법이 제시되었지만 <span style=color:red> over-smoothed </span>과 <span style=color:red> time-consuming </span> 이라는 문제점이 있음</li>
</ul>
<hr>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/48feb993-9c5a-4a28-b4b3-e33072f14a47/image.png
" alt="abstract thumbnail"/>
  Fig 8. Deep Video SR with Separated Motion Compensation
</p>

<ul>
<li>SRCNN의 성공 이후 2 단계로 framework를 나눠서 Video SR에 적용</li>
<li>optical flow를 사용하고 이를 CNN에 넣는 형식</li>
<li>이러한 방법들은 최적의 결과를 얻기 힘들다는 단점이 있음</li>
</ul>
<hr>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/36c4bc7d-b1a3-4689-a2bd-60c9da91abbe/image.png
" alt="abstract thumbnail"/>
  Fig 9. Deep Video SR with Integrated Motion Compensation 1
</p>

<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/8acfe223-acee-43f8-bb19-6c925bb1a71f/image.png
" alt="abstract thumbnail"/>
  Fig 10. Deep Video SR with Integrated Motion Compensation 2
</p>

<ul>
<li>end-to-end CNN이 접목되기 시작함 그리고 이 구조가 주를 이룸</li>
<li>그 이후 Encoder-Decoder와 LSTM이 사용됨
(<del>진짜 요즘에 구조들은 Encoder-Decoder 없는게 있을까? 싶을 정도로 Transformer와 함께 정말 많이 보인다</del>)</li>
</ul>
<hr>
<p>Methodology부터 본격적인 논문의 시작일 듯 하네요. 그건 Part 2에 상세히 기술하도록 하겠습니다. 이걸 보고 있으니 Optical Flow에 대한 개념 성립도 필요할 것 같아서 Flownet에 대한 Paper Review도 빨리 해야겠네요. 2번째 포스트로 바로 Methodology부터 업로드 하겠습니다. Intro 자세히 읽어주셔서 감사합니다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Vision Paper Review] - ViT : Vision Transformer]]></title>
            <link>https://velog.io/@hunniee_j/Vision-Paper-Review-ViT-Vision-Transformer</link>
            <guid>https://velog.io/@hunniee_j/Vision-Paper-Review-ViT-Vision-Transformer</guid>
            <pubDate>Tue, 08 Aug 2023 14:33:02 GMT</pubDate>
            <description><![CDATA[<p>지난 <a href="https://velog.io/@hunniee_j/Vision-Transformer-Paper-Review-Attention-Is-All-You-Need">Attention is All You Need</a> 포스트에 이은 두 번째 Paper Review는 NLP에서 사용된 Transformer를 CV 영역에도 적용한 Vision Transformer(ViT)입니다. 논문 원본과 공식 코드는 아래 링크를 참고해주세요.</p>
<p>✅<a href="https://arxiv.org/abs/2010.11929">An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale(<em>ICLR 2021</em>)</a>
✅<a href="https://github.com/google-research/vision_transformer">공식 Github 주소</a></p>
<h2 id="abstract">Abstract</h2>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/15577d79-8ae1-4058-951d-4f202c6838a8/image.png
" alt="abstract thumbnail"/>
  Fig 1. Abstract
</p>

<p>Abstract에서 Transformer architecture의 소개 이후, NLP 분야에서는 많은 연구가 이루어 졌으나, computer vision에 적용하는 것은 아직 제한적이라고 말하며 시작합니다. 왜냐하면 Computer Vision 분야에서는 <span style=color:red> Attention이 CNN과 conjunction 되어 있거나, 특정 부분을 대체하는 정도</span>로 사용되었기 때문입니다. 본 연구를 통해서 Vision 분야에서도 Pure transformer가 image classification 등의 영역에서 state-of-the-art CNN 보다 더 좋은 성능을 보였음을 증명합니다.</p>
<h2 id="introduction">Introduction</h2>
<p>Introduction에서 말하는 것을 간략히 정리하면 아래와 같습니다. 원문은 Fig 2~3을 참고해주세요.</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/0355cd84-98cf-468e-87db-7f73e9e0426f/image.png
" alt="abstract thumbnail"/>
  Fig 2. Introduction 1
</p>

<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/f894aa35-707c-4a3a-b2bf-ae482f60b1b4/image.png
" alt="abstract thumbnail"/>
  Fig 3. Introduction 2
</p>

<ul>
<li>Transformer의 효율성과 확장성으로 인해, unprecedented size이며 100B가 넘는 parameter를 지닌 model의 학습도 가능하게 됨</li>
<li>Computer Vision에서는 CNN이 아직 dominant로 남아있음</li>
<li>NLP에서 Transformer의 성공으로 이를 이용한 연구가 발표되었으나, 이론적으로는 효율성이 나타나지만 실제 사용하는 하드웨어와의 호환이 잘 이뤄지지 않았음</li>
<li>본 연구에서는 image를 Transformer로 직접적으로 삽입</li>
<li>이를 수행하기 위해 image를 patch로 분할하고, linear embedding의 sequence로 만들어서 Transformer의 input으로 사용</li>
<li>이러한 Image patch들은 NLP에서의 token과 같은 역할을 수행</li>
</ul>
<hr>
<ul>
<li><p>Mid-Size의 dataset(ImageNet)에서는 ResNets에 비해 strong regulation이 없는 경우 더 좋은 성능을 보이지 않았음</p>
</li>
<li><p>그 원인으로 논문에서는 아래와 같이 추론함</p>
<blockquote>
<p>Transformers <span style=color:red> lack some of the inductive biases</span> inherent to CNNS, such as translation equivariance and locality, therefore <span style=color:orange> do not generalize well </span> when trained on insufficient amounts of data.</p>
</blockquote>
</li>
<li><p>하지만 더 큰 모델(14M-300M image)에서는 위의 inductive biases를 극복 가능하다고 함</p>
</li>
<li><p>따라서 ViT(Vision Transformer)는 충분히 큰 dataset에서 우선 학습 시키고(pre-trained) 그 모델을 작은 dataset으로 전이학습(transfer learning) 시켰을때 좋은 성능을 보임</p>
</li>
</ul>
<h2 id="related-work">Related Work</h2>
<p>Transformer의 발견 이후, 많은 연구들이 있었습니다.(하단의 Fif 4-6의 하이라이트 된 부분을 참고해주세요.)</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/2083716c-6cf3-4efd-ab93-5fbe69e3ed96/image.png" alt="abstract thumbnail"/>
  Fig 4. Related Work 1
</p>

<ul>
<li>Fig 4의 마지막 문장에서 알 수 있듯, 앞선 선행 연구들은 하드웨어 가속기(hardware accelearator)에서 연산을 효율적으로 수행하기 위해서는 복잡한 작업들이 요구된다는 단점이 있습니다</li>
</ul>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/975a6afa-ee9b-4e5e-a055-1dfe78578c03/image.png" alt="abstract thumbnail"/>
  Fig 5. Related Work 2
</p>

<ul>
<li>Fig 5의 하이라이트 된 부분을 참고하면, 이미지를 2-2의 패치로 나눈 후 이를 적용하는 것인데 ViT와 가장 유사하다고 합니다</li>
<li>하지만, ViT가 vanilla Transformer 구조를 사용했다는 점, 오직 저해상도 이미지에서만 사용할 수 있는 반면에 ViT는 중해상도 이미지에서도 적용이 가능하다는 점에서 더 좋은 성능을 나타낸다고 합니다</li>
</ul>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/6b869757-9075-43c5-a46d-2b07d1d97741/image.png" alt="abstract thumbnail"/>
  Fig 6. Related Work 3
</p>

<ul>
<li>기존의 선행연구와 ViT의 차별점은 standard ImageNet dataset보다 더 큰 dataset에서 실험을 진행하고, 이를 기반으로 기존의 ResNet을 바탕으로 하는 CNN보다 월등한 성능을 낼 수 있었다는 것입니다</li>
</ul>
<h2 id="method">Method</h2>
<p>본 챕터에서는 ViT의 model architecture 등에 대해 자세히 살펴보겠습니다. Image를 처리하기 위한 전처리 과정을 제외한다면 Transformer의 구조와 거의 유사하며, 이는 논문에서 필자들이 장점으로 이야기한 부분이기도 합니다.</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/71a5918b-c3e6-43ed-a490-6bc08d65b05e/image.png" alt="abstract thumbnail"/>
  Fig 7. Model Architecture of ViT
</p>

<h4 id="vision-transformervit">Vision Transformer(ViT)</h4>
<p>아래 첨부한 이미지에서 흐름을 상세히 확인 할 수 있습니다. 수식으로, 글로 이해하는 것에서 그치지 않고 이렇게 이미지 파일로 보니 코드 짤때도 도움이 된 것 같습니다. 직접 짠 코드(Pytorch Based)도 기회가 되면 &amp; 제가 github에 보다 익숙해지면 공유하도록 하겠습니다.</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/ec135527-de93-440d-8e75-e917d6ad523b/image.gif" alt="abstract thumbnail"/>
  Fig 8. Model Architecture Flow of ViT
</p>

<p><a href="https://github.com/lucidrains/vit-pytorch">출처</a></p>
<p>큰 틀은 기존에 리뷰한 Transformer와 유사합니다. 특히 Transformer Encoding 부분은 거의 변함이 없고, 이미지를 patch로 나누어서 linear projection하는 것이 NLP의 token과 같은 역할을 수행하는 것으로 보입니다.</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/eed42d55-8f7e-4acc-b600-c8271772ae55/image.png" alt="abstract thumbnail"/>
  Fig 9. Vision Transformer 1
</p>

<p>Fig 9.에는 2D 이미지를 flattern하고 patch로 만들어주기 위해 rearrange하는 과정에 대해서 설명해주었습니다. 2D 이미지를 다루기 위헤 이를 2D patches로 변환한 후 이를 다시 1D의 차원으로 flattern 하여 넣어줍니다. 따라서, Transformer에 맞는 vector 형식으로 치환하여 input value로 사용해주게 됩니다. Fig 8을 보시면 1~9번까지의 patch가 순차적으로 linear projection of flatterened patch로 들어가는 것을 볼 수 있습니다. 이 과정이 앞서 보인 Patch Embedding 과정입니다.(Fig.7 참고) 두번째 문단을 살펴보면 BERT와 유사하게 임베딩된 패치들의 맨 앞에 학습가능한 class 토큰 임베딩 벡터 하나를 추가했습니다. 임베딩벡터($z_0^0;=;x_{class}$)는 Transformer의 여러 encoder층을 거쳐 최종 output($z_0^L$) 으로 나왔을 때, 이미지에 대한 1차원 representation vector로써의 역할을 수행합니다. 여기서 $L$은 마지막 dimension을 의미합니다.</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/5abac5c1-f341-4b8f-bfdb-7a38eb14374c/image.png" alt="abstract thumbnail"/>
  Fig 10. Vision Transformer 2
</p>

<p>Position Embedding은 위치 정보를 유지하기 위해서 Patch Embedding에 추가되며, 본 연구에서는 advanced 2D-aware 위치 임베딩을 사용하는 것과 성능에서 큰 차이가 관측되지 않았기 때문에 학습가능한 1D position embedding을 사용합니다. Embedding vector의 Resulting sequence는 encoder의 input으로 사용됩니다. 아래의 Fig 11을 통해 ViT에서 사용되는 이론적인 수식을 알아볼 수 있습니다. 상세한 설명은 제가 참고한 <a href="https://hipgyung.tistory.com/entry/%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-ViTVision-Transformer-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-An-Image-is-Worth-16x16-Words-Transformers-for-Image-Recognition-at-Scale">리뷰</a>를 보시면 도움이 될 것 같습니다.</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/c4a18560-e525-427b-87d1-463435fc33c1/image.png" alt="abstract thumbnail"/>
  Fig 11. Vision Transformer 3 - Equation of ViT
</p>

<h4 id="inductive-device">Inductive Device</h4>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/bc19c325-1a5a-4e00-92dc-920bda8ea1c8/image.png" alt="abstract thumbnail"/>
  Fig 12. Inductive Device
</p>

<ul>
<li>CNN에서는 Locality, 2D neighborhood structure, translation equivariance의 세가지가 image-specific한 inductive device로 존재</li>
<li>ViT에서는 MLP layer만 local, translationally equivariant로 작용하며 self-attention layers는 global함</li>
<li>2D neighborhood structure는 model의 초창기에는 cutting image to patch로, positional embedding 조절(fine-tuning)으로 작용함</li>
</ul>
<h4 id="hybrid-architecture--fine-tuning-and-higher-resolution">Hybrid Architecture &amp; Fine-tuning and higher-resolution</h4>
<p>본 논문에는 짧게 소개되어 있어(Fig 13.) <a href="https://daebaq27.tistory.com/108">참고한 리뷰글</a>을 통해서 상세한 정보를 얻을 수 있습니다.</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/2ae9701c-a421-4629-be36-9566b2a27498/image.png" alt="abstract thumbnail"/>
  Fig 13. Hybrid Architecture
</p>

<h2 id="experiments">Experiments</h2>
<p>첨부한 각 이미지 별로 논문 내에서의 설명을 별첨하도록 하겠습니다.</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/4dc02399-b6d0-4592-9e9f-f54ca8461d1d/image.png" alt="abstract thumbnail"/>
  Fig 14. Datasets
</p>

<ul>
<li>ILSVRC-2012 ImageNet(1k classes &amp; 1.3M images)</li>
<li>Sperset ImageNet-21k(21k classes &amp; 14M images) &amp; JFT (18k classes and 303M high-resolution images)</li>
</ul>
<p>Test of Downtream Tasks</p>
<ul>
<li>ImageNet (<em>Val</em>)</li>
<li>ImageNet with cleaned-up ReaL Labels</li>
<li>CIFAR-10/100</li>
<li>Oxford-IIIT Pets</li>
<li>Oxford Flowers-102</li>
</ul>
<p>Also evaluate,</p>
<ul>
<li>VTAB Datasts for 19 tasks</li>
</ul>
<blockquote>
<p><em>&quot;The tasks are divided into three groups: Natural – tasks like the above, Pets, CIFAR, etc. Specialized – medical and satellite imagery, and Structured – tasks that require geometric understanding like localization.&quot;</em></p>
</blockquote>
<p>Baseline</p>
<blockquote>
<p>&quot; For the baseline CNNs, we use ResNet (He et al., 2016), but replace the Batch Normalization lay- ers (Ioffe &amp; Szegedy, 2015) with Group Normalization (Wu &amp; He, 2018), and used standardized convolutions (Qiao et al., 2019). These modifications improve transfer (Kolesnikov et al., 2020), and we denote the modified model “ResNet (BiT)”. For the hybrids, we feed the intermediate fea- ture maps into ViT with patch size of one “pixel”. To experiment with different sequence lengths, we either (i) take the output of stage 4 of a regular ResNet50 or (ii) remove stage 4, place the same number of layers in stage 3 (keeping the total number of layers), and take the output of this extended stage 3. Option (ii) results in a 4x longer sequence length, and a more expensive ViT model. &quot;</p>
</blockquote>
<p>상세한 내용은 paper의 appendixt table 6. 참고</p>
<ul>
<li>Optimizer : ADAM for Pre-training and SGD for fine-tuning</li>
<li>batch size : 4096</li>
<li>linear warmups &amp; Learning Rate Decay : Cosine or Linear </li>
</ul>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/64135afa-0413-4021-82a9-32f986e38ff4/image.png" alt="abstract thumbnail"/>
  Fig 15. Details and Results
</p>

<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/53f10c31-7e0f-4fe3-81f7-475b2d4e3ca7/image.png" alt="abstract thumbnail"/>
  Fig 16. Results
</p>

<p>▶️ 이를 통해 ViT는 Model Parameter 및 DataSet의 크기가 증가할 수록 지속적으로 성능이 증가함을 도출 할 수 있음</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/c9317863-31f8-4bcd-ab75-5d24f582d908/image.png" alt="abstract thumbnail"/>
  Fig 17. Inside of ViT
</p>


<p>Fig 17.은 ViT의 내부를 확인하기 위해 진행한 실험으로 상세한 정리는 <a href="https://daebaq27.tistory.com/108">참고 리뷰</a>에 상세히 나와있습니다. 저는 읽어보고 이해하는 정도에서 마쳤습니다.</p>
<h2 id="conclusion">Conclusion</h2>
<p>ViT는 NLP 영역에서 사용되는 Transformer라는 개념을 computer vision에 직접적으로 접목시킨 연구분야로, 이를 통해서 최근 다양한 논문이 쏟아져 나오고 있습니다. Transformer에 대한 기본적인 이해가 있으면 보다 쉽게 읽을 수 있었던 것 같아 상세한 이론적인 내용이 조금 축약된 부분이 없지 않아 있어 보입니다. 그 전의 <a href="https://velog.io/@hunniee_j/Vision-Transformer-Paper-Review-Attention-Is-All-You-Need">포스트</a> 및 참고자료들을 이해하면 보다 쉽지 않을까 생각합니다. 제가 Transformer를 이론적으로 공부할 때 주로 봤던 영상과 사이트들을 링크 걸어둘테니 도움이 되길 바랍니다.</p>
<p>✅<a href="https://www.youtube.com/watch?v=Yk1tV_cXMMU&amp;t=1158s">고려대학교 DSBA 연구실 Transformer 강의</a>
✅<a href="https://www.youtube.com/watch?v=NQIkPlCdSSI">고려대학교 DSBA 연구실 ViT 설명강의</a></p>
<p>다음 포스트는 SwinIR 혹은 RVRT로 생각 중 입니다. 두 편 모두 Review 할 예정이라 먼저 읽히는 논문 먼저 작성해보겠습니다.</p>
<p>감사합니다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Vision Paper Review] - Attention Is All You Need]]></title>
            <link>https://velog.io/@hunniee_j/Vision-Transformer-Paper-Review-Attention-Is-All-You-Need</link>
            <guid>https://velog.io/@hunniee_j/Vision-Transformer-Paper-Review-Attention-Is-All-You-Need</guid>
            <pubDate>Mon, 07 Aug 2023 08:36:43 GMT</pubDate>
            <description><![CDATA[<p>Vision Transformer 관련된 논문 리뷰의 가장 첫 번째 포스트로는 NLP(자연어처리)에서 가장 큰 영향을 주고 있고, Vision에서도 쓰이고 있는 Transformer를 가장 먼저 리뷰해보겠습니다. 논문과 공식 Github Code는 아래 링크를 참고해주세요.</p>
<p>✅<a href="https://arxiv.org/abs/1706.03762">Attention is All You Need</a>
✅<a href="https://github.com/tensorflow/tensor2tensor.git">Official Tensorflow Code - Github</a></p>
<h2 id="abstract">Abstract</h2>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/20989255-13b7-47fe-88c2-08c4514536fa/image.png" alt="abstract thumbnail"/>
  Fig 1. Abstract
</p>

<p>Abstract에서는 <br></p>
<ol>
<li>&quot;The dominant sequence transduction models are <span style='color:red'> based on complex reccurent or convolutional neural networks</span> that include encoder and decoder&quot;<br></li>
<li>&quot;~ <span style='color:red'> based solely on attention mechanisms</span> , dispending with recurrence and convolutions entirely.&quot; <br></li>
</ol>
<p>이 두 문장으로 본 연구의 전반적인 목적과 성과를 설명하고 있습니다. Transformer 이전의 모델들은 RNN과 CNN을 사용하는 것이 주를 이루었고, 가장 성능이 좋은 모델 또한, Attention mechanisms에 Encoder와 Decoder를 연결한 구조였습니다. 이와 달리, Transformer는 오직 attention mechanisms을 사용하며, RNN과 CNN을 포함하고 있지 않습니다. 따라서 이를 통해 본 논문의 제목인 <strong>&quot;Attention is All You Need&quot;</strong> 를 이해할 수 있습니다. 이 구조를 통해서 Engligh-to-German, English-to-French Translation task에서 좋은 성능을 보였다고 정리하고 있습니다.</p>
<h2 id="introduction">Introduction</h2>
<p>RNN, LSTM(Long Short-Term Memory), gated RNN이 기존에 제기된 Sequence modeling과 Transduction problem에 SOTA를 달성했습니다. <br> 본 Paper에서는 이런 Recurrent model의 문제점을 제시했는데,</p>
<blockquote>
<p><em>&quot;This inherently sequential nature precludes parallelization within training examples, <span style = color:red>which becomes critical at longer sequence lengths</span>,</em>&quot;</p>
</blockquote>
<p>즉, Recurrent model은 parallelization이 불가능하여 longer sequetial length에서 치명적인 단점이 있습니다. 비록 최근의 연구결과(<del>그 당시에</del>)들이 computational efficiency와 model performance를 향상시켰지만, 근본적인 문제점은 여전히 남아있습니다.</p>
<p><br> Attention mechanisms은 다양한 분야에서 접목되서 사용되고 있었으나, 기존에 사용되고 있는 Recurrent model에 conjugated된 형태로만 사용되고 있었습니다. Attention mechanisms의 장점은 input과 output sequence의 distance에 상관없다는 것 입니다.</p>
<blockquote>
<p><em>&quot; ~ allowing modeling of dependencies without regard of their distance in the input or output sequences&quot;</em>
 <span style=color:red><em>&quot; ~ however, such attention mechanisms are used in cojunction with a recurrent network.&quot;</em></span></p>
</blockquote>
<p><br> 본 연구는 Transformer를 제시하는데, </p>
<blockquote>
<p>&quot;<em>relying entirely on an attention mechanism to draw global dependencies between input and output.</em>&quot;</p>
</blockquote>
<p>기존에 제기되었던 parallelization을 해결할 수 있어서 더 짧은 시간에 좋은 성능을 보였다고 합니다.</p>
<h2 id="background">Background</h2>
<p>Sequential Computation을 줄이는 것은 Extended Neural GPU, ByteNet, ConvS2S에서도 제시되었지만, </p>
<ul>
<li>all of which use CNN as basic building block</li>
<li>Computing hidden representations in parallel for all input and output positions</li>
</ul>
<p>의 방식을 사용하여 <span style=color:red> <em>more difficult to learn dependencies between distance position</em> </span> 이란 문제점이 있습니다.</p>
<br>

<p>또한 Background에서 Self-Attention(Intra-Attention), End-to-End Memory Network에 대해서도 간략히 서술해두었습니다. 아래 Fig 2.를 참고해주세요.</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/0364e461-55e0-4869-a8c7-5ec68ffaa745/image.png" alt="abstract thumbnail"/>
  Fig 2. Background
</p>

<p>이런 Background를 기반으로 본 논문에서는 Transformer를 아래와 같이 소개하고 있습니다.</p>
<blockquote>
<p><em>&quot; the first transduction model relying entirely on self-attention to compute representations of its input and output without using sequence-aligned RNNs or convolutions&quot;</em></p>
</blockquote>
<h2 id="model-architecture">Model Architecture</h2>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/0eb0a39a-902f-4cfe-b6ba-bc454eb6ef88/image.png
" alt="abstract thumbnail"/>
  Fig 3. Transformer Model Architecture
</p>

<h3 id="encoder-and-decoder-stacks">Encoder and Decoder Stacks</h3>
<h4 id="encoder">Encoder</h4>
<p>Encoder의 특징은 아래와 같습니다.</p>
<ul>
<li>Encoder is composed of a stack of N = 6 (본 논문에서 6으로 설정)</li>
<li>Each layer has two sub-layers 
<em>(Multi-Head Self-Attention &amp; Position wise fully connected feed-forward network)</em></li>
<li>Employ a residual connection followed by layer normalization</li>
<li>Output of each sub-layer 
$$ 
LayerNorm( x + SubLayer(x)) 
$$ </li>
<li>produce outputs of dimension
$$
d_{model} = 512</li>
</ul>
<h4 id="decoder">Decoder</h4>
<p>Decoder의 특징은 아래와 같습니다.</p>
<ul>
<li>Decoder is composed of a stack of N = 6 (Encoder와 동일)</li>
<li>The decoder insert a third sub-layer, which performs multi-head attention over the output of the encoder stack.</li>
<li>그 외 특성은 Encoder와 유사</li>
</ul>
<h3 id="attention">Attention</h3>
<p>아래는 Attention function에 대한 간략한 설명입니다.</p>
<blockquote>
<p><em>&quot;An attention function can be described as mapping a query and a set of key-value pairs to an output, where the query, keys, values, and output are all vectors. The output is computed as a weighted sum of the values, ~ &quot;</em></p>
</blockquote>
<p>Attention Function에 대한 이론적인 부분은 ✔ <a href="https://wikidocs.net/22893">딥러닝을 이용한 자연어처리 입문</a> ✔에서 보다 상세히 소개되어 있으니, 참고하면 도움이 될 것 같습니다.</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/ec4004cb-821d-4976-87f1-05d5cb1bcd61/image.png" alt="abstract thumbnail"
/>
  Fig 4. Scaled Dot-Product Attention(L) & Multi-Head Attention consists of several attention layers running in parallel(R)
</p>

<h4 id="scaled-dot-product-attention">Scaled Dot-Product Attention</h4>
<p>Fig 4(L)을 참고하여 특징을 정리하면,</p>
<ul>
<li>The input consists of queries and keys of dimension $d_k$, and values of dimension $d_v$</li>
<li>compute the dot prodict of the query with all ppeys, divide each by $\sqrt{d_k}$</li>
<li>apply softmax function to obtain the weights on the values
$$
Attention(Q, K, V) = softmax(\frac{QK^{T}}{\sqrt{d_k}})V</li>
</ul>
<p>가장 많이 사용되는 Attention function 중 대표적인 두 가지는</p>
<ol>
<li>Additive Attention : computes the compatibility function using a feed-forward network with a single hidden layer.</li>
<li>Dot-Product(Multiplicative) Attention : identical to our algorithm, except for the scaling factor of $\frac{1}{\sqrt{d_k}}$</li>
</ol>
<p>이 있습니다. 두 가지 함수는 이론적인 복잡도 측면에서는 유사하지만 Dot-Product Attention이 더 빠르고, 공간적으로 효율적입니다.</p>
<blockquote>
<p><em>&quot; While the two are similar in theoretical complexity, dot-product attention is <span style=color:red> much faster and more space-efficient</span> in practice, since it can be implemented using highly optimized matrix multiplication code&quot;</em></p>
</blockquote>
<p>작은 $d_k$ 값에서는 두 메커니즘이 비슷한 성능을 보이지만, additive attention이 $d_k$값이 증가할 수록 성능이 좋다고 합니다. 본 연구에서는 큰 값을 사용하기 때문에 dot-product의 gradient vanishing problem이 일어날 수 있어, dot-product를 $\frac{1}{\sqrt{d_k}}$로 scaling 해주었습니다.</p>
<blockquote>
<p>_&quot; While for small values of dk the two mechanisms perform similarly, additive attention outperforms dot product attention without scaling for larger values of $d_k$. We suspect that for large values of $d_k$, the dot products grow large in magnitude, pushing the softmax function into regions where it <span style=color:red> has extremely small gradients. To counteract this effect, we scale the dot products by $\frac{1}{\sqrt{d_k}}$ </span> &quot; _</p>
</blockquote>
<h4 id="multi-head-attention">Multi-Head Attention</h4>
<p>Fig 4(R)을 참고하며, $d_{model}$ - demensional keys, values, queries를 사용한 single attention function 보다 queries, keys, and values를 서로 다르고, 학습된 linear projection을 $d_k, d_k, d_v$ 차원에 수행하는 것이 더 효과적인 것을 발견했습니다. 이렇게 projected 된 version의 Q, K, V는 병렬로 attention function을 거치게 되고, $d_v-demensional$ output value를 얻게 됩니다. 이는 Concatenated되고 다시 projected 되어 최종값을 도출합니다.</p>
<blockquote>
<p><em>&quot;Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions. With a single attention head, averaging inhibits this.&quot;</em></p>
</blockquote>
<p>$$
MultiHead(Q, K, V) = Concat(head_{1}, \dots, head_{h})W^O
$$
$$
where ; head_{i} = Attention(QW_{i}^{Q}, KW_{i}^{K}, VW_{i}^{V})
$$</p>
<p>사용된 파라미터들을 정리하면 아래와 같습니다.</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/b6cfa79f-c1f4-4428-b789-e9ab24d2e998/image.png" alt="abstract thumbnail"
/>
  Fig 5. Parameters
</p>

<h4 id="applications-of-attention-in-our-model">Applications of Attention in our Model</h4>
<p>Transformer는 Multi-head Attention을 3가지 다른 방법으로 사용했습니다.</p>
<h5 id="encoder-decoder-attention">Encoder-Decoder Attention</h5>
<ul>
<li>Queries come from the previous decoder layer</li>
<li>Memory keys and values come from the output of the encoder
➡ <span style=color:red> This allows every position in the decoder to attend over all positions in the input sequence </span></li>
</ul>
<h5 id="encoder-1">Encoder</h5>
<ul>
<li>Encoder contains self-attention layers</li>
<li>In a self-attention layer all of the keys, values and queries come from the same place
➡ <span style=color:red> Each position in the encoder can attend to all positions in the previous layer of the encoder </span></li>
</ul>
<h5 id="decoder-1">Decoder</h5>
<p>➡ <span style=color:red>  self-attention layers in the decoder allow each position in the decoder to attend to all positions in the decoder up to and including that position. </span></p>
<ul>
<li>need to prevent leftward information flow in the decoder to preserve the auto-regressive property</li>
<li>implement thisinside of scaled dot-product attention by masking out (setting to −∞) all values in the input of the softmax which correspond to illegal connections</li>
</ul>
<h4 id="position-wise-feed-forward-networks">Position-wise Feed-Forward Networks</h4>
<p>본 모델의 Encoder와 Decoder는 모두 FFN을 가지고 있습니다. 이 FFN은 각 위치에 개별적이고 분리되어서 적용되며, ReLU 함수가 중간에 위치한 두 개의 선형 변환으로 이루어져 있습니다.</p>
<blockquote>
<p>each of the layers in our encoder and decoder contains a fully connected feed-forward network, which is applied to each position separately and identically. This consists of two linear transformations with a ReLU activation in between.</p>
</blockquote>
<p>FFN의 수식은 다음과 같습니다.</p>
<p>$$
FFN(x) = max(0, xW_1 + b_1) W_2 + b_2
$$</p>
<p>각 선형 변환은 다른 위치에 있어도 동일하지만, layer 마다 다른 parameter를 사용합니다.</p>
<h4 id="embeding-and-softmax">Embeding and Softmax</h4>
<ul>
<li>Sequence transduction model과 유사하게, 학습된 embedding을 input token과 output token을 $d_{model}$ dimension 상의 벡터로 변환하기 위해 사용</li>
<li>usual learned linear transformation과 softmax function을 decoder output을 predicted next-token prob로 변환하기 위해 사용</li>
<li><blockquote>
<p>same weight matrix가 two embedding layer와 pre-softmax linear transformation에서 사용됨</p>
</blockquote>
</li>
<li>Multiply $\sqrt{d_{model}}$ to those weights</li>
</ul>
<h4 id="positional-encoding">Positional Encoding</h4>
<p>Transformer는 어떠한 recurrance와 convolution을 사용하지 않기 때문에, 본 연구에서는 sequence를 사용하기 위해 sequence의 token들에 대한 상대적, 그리고 절대적인 위치 정보를 삽입해줘야합니다.</p>
<blockquote>
<p>&quot; Since our model contains no recurrence and no convolution, in order for the model to make use of the order of the sequence, we must inject some information about the relative or absolute position of the tokens in the sequence. &quot;</p>
</blockquote>
<p>따라서 본 연구에서는 positional embedding을 encoder와 decoder stack의 아래의 input embedding에 삽입하였습니다. Positional Encoding은 Embedding과 마찬가지로 $d_{model}$의 차원을 가져 덧셈 연산(summation)이 가능하고, 다양한 함수를 사용할 수 있지만, 본 연구에서는 sine, cosine 함수를 서로 다른 주파수 영역에서 사용했습니다. 수식은 아래와 같습니다. 본 함수를 사용한 이유는 주기성으로 k번째 식도 표현할 수 있기 때문입니다.( <del>이렇게 보면 삼각함수가 참 중요한 것 같습니다. 주기성이라는 특성 하나만으로도요.</del>)
$$
PE_(pos,2i) =sin(pos/100002i/d_{model}) \
PE(pos,2i+1) =cos(pos/100002i/d_{model})
$$</p>
<p>연구진은 학습된 positional embedding에 대해 실험을 진행했고, 두 가지 결과가 비슷하게 도출되었습니다. 이를 기반으로 sine 함수를 사용했는데, </p>
<blockquote>
<p>&quot;it may allow the model to extrapolate to sequence lengths longer than the ones encountered during training.&quot; </p>
</blockquote>
<p>의 사유, 즉 model이 더 긴 길이의 sequence를 유추할 수 있게 해주기 때문입니다.</p>
<h2 id="why-self-attention">Why Self-Attention</h2>
<p>본 문단에서는 self-attention과 기존에 사용되던 (state-of-the-art) RNN 등과의 비교가 주를 이룹니다. 첫 번째로 비교한 것은 전체적인 연산의 복잡도이며, 그 결과는 논문의 Table.1 (본 정리본의 Fig .6)에 나와있습니다. 두 번째는, parallel 하게 연결 할 수 있는 연산의 총 수이며, 마지막 세번째는 네트워크 상에서 path 간의 long-range dependencies 입니다.</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/0790b5d7-50ed-41be-806d-02efb82ad9a4/image.png" alt="abstract thumbnail"
/>
  Fig 6. Table 1 in Paper
</p>

<ul>
<li>Self-Attention Layer는 모든 Position을 상수인 시간에만 연결</li>
<li>Recurrent Layer는 $O(n)$의 시간 복잡도를 가짐</li>
<li>Layer가 $n(=sequence ; length) &lt; d(representation ; dimensionality)$ 일 때 self-attention layer가 더 효율적임</li>
<li>very-long sequence에 대해서는 self-attention은 neighborhood size를 $r$로 제한할 수 있고, 이는 max path-length를 $O(n/r)$로 증가시킬 수 있음</li>
<li>$k&lt;n$ 인 kernel width 의 single convolutional layer는 input 과 output의 모든 쌍을 연결하지 않음
➡ contiguous kernel의 경우 $O(n/k)$의 stack이 필요
➡ dilated convolution의 경우 $O(log_k(n))$이 필요</li>
<li>Convolution layer는 일반적으로 recurrent layer보다 더 큰 비용이 요구
➡ Separable Convolution의 경우 복잡도를 $O(k \cdot n \cdot d+n \cdot d^2)$ 까지 줄일 수 있음</li>
<li>$k = n$ 의 경우, transformer 와 같이 self-attention layer와 point-wise feed forward layer의 조합과 복잡도가 같음</li>
</ul>
<h2 id="training">Training</h2>
<p>Training에 대한 기본 세팅 등은 논문 상에 소개된 부분으로 이미지로 대체합니다. Fig 7 ~ 8을 참고 해주세요. </p>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/6466008d-9cff-4513-b7c2-e9f7ce57200e/image.png" alt="abstract thumbnail"
/>
  Fig 7. Training Data and Batching & Hardware and Schedule
</p>

<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/8347d44b-1577-488e-95e9-ab52bcf00b63/image.png" alt="abstract thumbnail"
/>
  Fig 8. Optimizer
</p>

<p>본 연구에서는 ADAM을 Optimizer로 사용했습니다. </p>
<h4 id="regularization">Regularization</h4>
<p>본 연구에서는 세 가지 Regulaization을 사용했는데요.</p>
<ol>
<li>각 sub-Layer의 Output이 다음 sub-layer에 input에 더해지고 normalization 되기 전에 Residual Dropout 적용</li>
<li>Encoder &amp; Decoder stack의 positional embedding과 sums of embedding에 dropout 적용</li>
<li>학습 중에 labeling smoothing 적용</li>
</ol>
<h2 id="results">Results</h2>
<h4 id="machine-translation">Machine Translation</h4>
<h4 id="model-variations">Model Variations</h4>
<h4 id="english-constituency-parsing">English Constituency Parsing</h4>
<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/d34ca760-6bdb-47ad-936a-05f7c523e037/image.png" alt="abstract thumbnail"
/>
  Fig 9. Table. 2
</p>

<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/5a6e66ae-e05a-4822-b267-2016b4a907c6/image.png" alt="abstract thumbnail"
/>
  Fig 10. Table. 3
</p>

<p align='center'>
<img src="https://velog.velcdn.com/images/hunniee_j/post/f4a13434-8abf-4ba4-85ae-dd31b9d4d6c4/image.png" alt="abstract thumbnail"
/>
  Fig 11. Table. 4
</p>

<p>Fig 9 - 11의 결과를 통해서 본 Transformer가 좋은 성능을 보이며 (English-to-German &amp; English-to-French) English Consistuency Parsing에서도 별도의 튜닝 작업 없이도 좋은 성능을 보였다고 말합니다(Fig 11 참고). </p>
<blockquote>
<p><em>&quot; In contrast to RNN sequence-to-sequence models [37], the Transformer outperforms the Berkeley- Parser [29] even when training only on the WSJ training set of 40K sentences. &quot;</em></p>
</blockquote>
<h2 id="conclusion">Conclusion</h2>
<p>Transformer의 등장으로 새로운 패러다임이 열렸다고 평가하는 부분이 많습니다. 그리고 현재까지도 다양한 응용이 이뤄지고 있습니다. 다음 포스트는 NLP 영역에서 사용되는 Transformer를 컴퓨터 비전에 적용한 ViT 논문에 대해 리뷰해보도록 하겠습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Object Detection Code Review - YOLOv5 with Pytorch]]]></title>
            <link>https://velog.io/@hunniee_j/Object-Detection-Code-Review-YOLOv5-with-Pythorch</link>
            <guid>https://velog.io/@hunniee_j/Object-Detection-Code-Review-YOLOv5-with-Pythorch</guid>
            <pubDate>Wed, 13 Jul 2022 03:11:53 GMT</pubDate>
            <description><![CDATA[<h2 id="introduction">Introduction</h2>
<p>지난 주까지해서 YOLO의 구조 및 원리에 대해서 살펴보았다. 현재 YOLO는 수많은 다른 개발자들에 의해 가공되고 발전되서 YOLOv7까지 찾을 수 있었다.</p>
<p>👍<a href="https://github.com/WongKinYiu/yolov7">YOLOv7 Github</a></p>
<p>지금 하고 있는 프로젝트에 사용하는 YOLO version은 5를 사용하게 되었는데, 딱히 명확한 이유는 없고 이걸로 한번 해서 개량해보자라는 방향이라 선정하게 되었다.</p>
<p>본 포스트에 기록할 내용은</p>
<ol>
<li>YOLO 개발환경 Setting</li>
<li>Project 경과</li>
<li>앞으로의 계획 및 참고사항</li>
</ol>
<p>이 주를 이룬다.</p>
<h2 id="yolo-setting">YOLO Setting</h2>
<h3 id="pc-사양">PC 사양</h3>
<p>먼저 지금 사용하고 있는 PC 사양을 간략히 정리하면,</p>
<p>CPU : i5-9500
RAM : 32GB
OS : Windows 10
GPU : NVIDIA Geforce 1660</p>
<p>으로 지금 많이 나와있는 GPU에 비하면 조금 부족한 스펙이지만, 서버를 받게된다면 사용할 수 있기 때문에 아직까지는 큰 문제 없이 사용 중 이다. (+ 교수님 사무실에 남는 GPU도 주워오기로했다!)</p>
<h3 id="setting">Setting</h3>
<p>이 과정이 제일 귀찮았는데, 버전이 다른것이 많아 + 사람의 PC 사양에 따라 달리 설치해주어야했기 때문에 주의해야한다. 기본적인 과정은</p>
<ol>
<li>VS(Visual Studio) 설치</li>
<li>CUDA 설치</li>
<li>cuDNN 설치</li>
<li>OPENCV 설치</li>
<li>Pytorch 설치</li>
</ol>
<p>인데, 나는 VS v2015, CUDA v10.1, cuDNN v8.0.3, OPENCV v3.4.8, Pytorch는 CUDA10.1에 맞는걸로 구글링해서 설치했다. 상세한 설치방법은 다른 블로그들을 검색하면 충분히 많이 자료를 얻을 수 있어, 본인이 원하는 환경과 유사하게 진행하신 혹은 본인의 PC 사양과 비슷한 환경인 가이드를 따라가는게 제일인 것 같다.</p>
<p>🤦‍♂️유의사항🤦‍♂️
Visual Studio를 먼저 설치하고 CUDA를 꼭 설치해야한다. 그렇지 않으면 다시 까는게 나은 귀찮은 상황들과 마주하게 된다. 또한, Visual Studio에 C++ 및 Python 개발환경 Setting을 하면 편리하게 볼 수 있다. 마지막으로, 각 프로그램마다 요구하는 최소버전이 있기 때문에 이에 유의하여 설치해야한다. YOLOv5도 요구하는 버전, OPENCV, Python에 제약이 있기 때문에 너무 구버전은 호환성에 문제가 생길 수 있다. 또한 환경변수 PATH 설정도 잊어서는 안된다!</p>
<h3 id="get-yolov5">GET YOLOv5!</h3>
<p>이렇게 모든 준비를 마쳤으면 이제 <a href="https://github.com/ultralytics/yolov5">YOLOv5를 Github</a>에서 다운로드해준다. 사실 다운로드만 하고 Sample Image를 실행하는 것은 이미 학습이 되어있기 때문에 바로 진행할 수 있다. cmd 창이나 본인이 Conda를 사용한다면 Conda Prompt나 등 console 창에 다음과 같이 명령하면 된다.</p>
<pre><code>python detect.py --source &quot;contents/imamge/&quot; #--source 뒤에는 본인이 원하는 img의 경로 및 파일명을 기입하면 된다!</code></pre><p>Sample로 몇 가지를 해본 결과들이다.</p>
<p><img src="https://velog.velcdn.com/images/hunniee_j/post/dfb2188e-a477-4b5e-abf1-bfd3e2b7d072/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hunniee_j/post/338b6379-12cb-43b5-a77f-8c9b45a5804d/image.jpg" alt=""></p>
<p>NBA Final 사진에서 보면 Thompson 얼굴이 아니라 옆에 Anchor Box가 있는 약간의 miss가 있긴하지만, 비교적 높은 성능 그리고 빠른 시간을 보여준다.</p>
<h2 id="project">Project</h2>
<h3 id="intro">Intro...</h3>
<p>지금 근로 중인 스타트업에서 하는 프로젝트 중 하나로 수표에 있는 인감도장의 대조에 관한 시스템을 구축, 개량하는 부분을 우선 진행 중이다.</p>
<p><img src="https://velog.velcdn.com/images/hunniee_j/post/f1cb8e8d-a70f-4e65-8cab-d8c688637ae9/image.png" alt=""></p>
<p>👌 <a href="http://www.newstomato.com/one/view.aspx?seq=1021037">이미지출처</a></p>
<h3 id="start">Start..!</h3>
<p>위와 같이 모든 수표에는 인감도장이 찍히게 되는데, 그 인감도장이 수표의 사용에 문제가 없는 본인의 도장이 맞는지를 판단하는 시스템을 개량하신다고 한다. 그럼 우선 이 시스템의 개략적인 과정을 보면 
** 1. 수표 사진에서 인감도장 검출 
2. 은행 등 서버 데이터에서 본인 인감과 대조 
3. 확인 후 승인 및 미등록 시 데이터 저장** 
의 단계를 거치게 된다. 따라서 우선적으로 해야하는것은 저 사진에 있는 인감도장을 얼마나 잘 검출해서 이를 데이터 서버에 넘겨줄 수 있는가이다.</p>
<p>따라서 제공받은 데이터를 최대한 Augmentation 시켜서 학습을 진행해보았는데, 이때 사용한 사이트가 <a href="https://roboflow.com/">Roboflow</a>이다. 여기서 손쉽게 data를 build할 수 있었다. <del>실제 편집 사진은 실 수표라 생략하겠습니다..😂</del> 저렇게 data를 만들고 이를 다운로드 해주면 train, test, valid 폴더를 얻게 되고 이를 yolov5 폴더에 data에 넣어주면 된다. 이후</p>
<pre><code>python train.py --img 416 --batch 16 --epochs 128 --data contents/data.yaml --weights yolov5m.pt</code></pre><p>이렇게 학습을 시켜주면 된다. 여기서, img는 본인이 만든 img size로 epochs 원하는 만큼, 그리고 data는 data.yaml 파일이 위치한 경로를 contents 항목에 넣어주면 된다. 그럼 이제 열심히 학습을 한다.
<img src="https://velog.velcdn.com/images/hunniee_j/post/1c2096d1-b962-40a7-80ac-f4e872e7e2ab/image.PNG" alt=""></p>
<p>학습이 끝나면 이제 결과 파일이 저장되게 되고, weight 파일을 얻을 수 있다.
<img src="https://velog.velcdn.com/images/hunniee_j/post/f144f41a-1a8c-48cc-a14f-5db693c4dfc8/image.png" alt="">
그럼 이제 이 weight 파일을 가지고 test를 진행하면 된다.</p>
<pre><code>python detect.py --source contents/images/ --weight contents/modelfiles --conf /confidence score/</code></pre><p>이렇게 해주면 되는데, 여기서 confidence score는 본인이 설정하면 된다.</p>
<h3 id="result">Result..!!!</h3>
<p><img src="https://velog.velcdn.com/images/hunniee_j/post/bb06a3e1-6c27-4648-943f-8c65b98d9727/image.jpg" alt="">
그렇게 test를 진행하니 다음과 같이 인감도장이 검출되는것을 확인할 수 있다..!</p>
<h2 id="next-step">Next Step</h2>
<h3 id="data-pruning">Data Pruning</h3>
<p>이제 다음 단계로 해나갈 것은, 단순히 인감도장만 선택하면 되는데 굳이 많은 학습이 필요할까라는 물음에서 나와서 교수님께서 이것저것 생각해볼거리를 많이 어제 세미나에서 말씀해주셨다. 먼저, 인감도장의 형태와 색에 집중하고 다른 특징들에 대한 conv layer는 없어도 되지 않을까? 그럼 architecture가 간단해지고 더 빠른 속도를 나타낼 수 있다. 이 기본 과정을 기반으로 YOLOv5가 진행하는 filter의 과정 및 각 코드가 어떻게 작용하는지를 자세히 공부할 예정이다...! 어느정도 진행이 되면 이제 다시 Paper Review도 포스팅 해보고자 한다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Object Detection Paper Review] - YOLO v2]]></title>
            <link>https://velog.io/@hunniee_j/Object-Detection-Paper-Review-YOLO-v2-v3</link>
            <guid>https://velog.io/@hunniee_j/Object-Detection-Paper-Review-YOLO-v2-v3</guid>
            <pubDate>Fri, 01 Jul 2022 03:27:34 GMT</pubDate>
            <description><![CDATA[<p>지난번 velog 첫 포스트 <a href="https://velog.io/@hunniee_j/Object-Detection-Paper-Review-YOLOv13">Paper review - YOLOv1</a>에 이어 바로 YOLO v2에 대한 리뷰를 진행하겠습니다.</p>
<h2 id="introduction">Introduction</h2>
<p><img src="https://velog.velcdn.com/images/hunniee_j/post/20048931-69b9-4c71-b3fe-e01e89eaf36b/image.JPG" alt="">
Fig 1. Limitations of YOLO v1.</p>
<p>먼저 지난 포스트의 말미에 YOLOv1의 단점들에 대해서 언급을 했는데, 1년이 지난 CVPR &#39;17에서 필자가 이를 해결하고자 시도한 YOLO v2를 발표했습니다. 특히 필자는 recall을 increase하고, localization error를 decrease 하는 방법을 강구했습니다. 가장 널리 알려진 방법은 network의 크기를 키우는 것(scaling-up)이지만, 필자는 이 방식이 아니라, 되려 network는 simplify하고 학습이 더 쉬워지도록 하고자 했습니다.
👌 <a href="https://sumniya.tistory.com/26">recall이 뭐였지 하시는 분을 위한, 숨니님의 블로그</a></p>
<h2 id="better">Better</h2>
<p><img src="https://velog.velcdn.com/images/hunniee_j/post/1e442a82-eff0-465c-bdfe-b726667897a0/image.JPG" alt="">
Fig 2. Efforts to Solve Problems of YOLO v1</p>
<p>따라서 다음의 Fig 2와 같은 여러가지 방식을 사용했는데 간단히 넘어갈 수 있는 것은 간략하게 넘어가며 하나씩 살펴보도록 하겠습니다.</p>
<h3 id="batch-normalization">Batch Normalization</h3>
<p>먼저 등장하는 것이 바로 Batch Normalization입니다. Batch Normalization에 대하여 잘 모르시는 분은 <a href="https://eehoeskrap.tistory.com/430">꾸준희님의 Batch Normalization 정리</a>를 참고하시면 좋을 것 같습니다. 굉장히 쉽게 설명이 잘 되어 있습니다. 필자는 이 방식을 사용하여 mAP를 2% 넘게 향상할 수 있었다고 합니다.
👌 <a href="https://ctkim.tistory.com/79">mAP가 뭐였지 하시는 분을 위한 Developer님의 블로그</a></p>
<h3 id="high-resolution-classifier">High Resolution Classifier</h3>
<p>YOLO v1과 같은 경우는 224x224의 image로 pre-training을 했습니다. 하지만, 아시다시피 입력 image는 448x448이었죠. 따라서 YOLO는 high-resolution에 적응하는(adjust) 추가적인 작업이 필요했습니다. 따라서 이를 해결하고자, 시작부터 448x448의 image를 가지고 학습을 수행했고, 이 결과 4%의 mAP 상승을 이뤄냈습니다.</p>
<h3 id="convolutional-with-anchor-box">Convolutional With Anchor Box</h3>
<p><img src="https://velog.velcdn.com/images/hunniee_j/post/5c2a9bd9-b853-4816-bb4f-9e34657a756c/image.JPG" alt="">
Fig 3. Convolutional With Anchor Box</p>
<p>앞서 YOLO v1을 생각해보면 bbox의 5가지 prediction 중에 x,y,w,h의 값은 0<del>1 사이의 값을 가졌습니다. 또한 YOLO는 x,y값을 적당히 랜덤하게 예측해서 학습을 시작했었죠. 이는 초기에 model이 unstable하다는 문제점을 가지고 있었고, 복잡했습니다. 따라서 필자는 Fast-R-CNN ~</del>(YOLO가 끝나는 대로 R-CNN도 순차적으로 업로드 하겠습니다.)~~에서 사용한 방식인 Anchor-box를 통한 offset 예측을 시도했습니다. 이 방식을 거치면 network가 훨씬 간단하고 계산에도 무리가 없기 때문입니다. 이를 위해 필자는 2가지의 작업을 해주었습니다.</p>
<ol>
<li>Eliminate one pooling layer to make output</li>
<li>Using 416x416 input image</li>
</ol>
<p>1번 작업의 경우 출력을 고해상도로 만들어주는 작업이고 우리가 살펴볼 부분은 바로 2번째 작업입니다. 앞서 <strong>High Resolution Classifier</strong> 단계에서 448x448이던 input image를 416x416으로 network를 줄여 수정하는 이유는 Fig 3을 통해 알 수 있습니다. </p>
<p>YOLO는 1/32의 downsample ratio를 가지는데, 448x448의 경우 이 과정을 거치면 14x14의 Feature Map을 가지게 됩니다. 중간에 4개의 grid cell이 뭉쳐있는 것을 확인할 수 있습니다. 하지만, 416x416의 경우 feature map의 size가 13x13으로 중간에 하나의 grid cell이 남는것을 확인할 수 있습니다. 보통 이미지를 처리할때 중간에 object가 있을 확률이 높으므로 이렇게 홀수 크기의 feature map을 얻는 것이 유리합니다.</p>
<p>또한, YOLOv1의 경우 98개의 bbox를 보유하지만, v2의 경우에는 anchor box를 사용하기 때문에 보다 많은 bbox를 보유하게 됩니다.(필자는 more than a thousand라고 말했습니다.)</p>
<p>이렇게 anchor box를 사용한 접근은 mAP를 낮추지만, Recall을 상당히 올려주어 이 network가 발전할 가능성이 충분함을 보여주었습니다. 여기서 Recall이 어떤 의미가 있냐, <a href="https://sumniya.tistory.com/26">위의 블로그</a>에 다녀오시면 이해가 편하실텐데요. 높은 Recall은 이 모델이 실제 객체의 위치를 예측한 비가 높아졌다는 것을 의미합니다.</p>
<h3 id="dimension-clusters">Dimension Clusters</h3>
<p><img src="https://velog.velcdn.com/images/hunniee_j/post/c2f9bdfe-2ae0-4a1b-954c-e7dbc383c73f/image.JPG" alt="">
Fig 4. Dimension Clusters</p>
<p>다음으로 살펴볼 내용은 Dimension Clustering입니다. Anchor box를 사용하게 되면서 2가지 issue와 마주하게 되는데, 아래와 같습니다.</p>
<ol>
<li>Box dimensions are hand-picked<ol start="2">
<li>Model instability</li>
</ol>
</li>
</ol>
<p>그 중 첫번째 Box dimensions의 hand-picked 되던 값을 이제 우리 model이 better prior를 pick하게 하는 것이 첫번째 해결방안이고 이를 위해 필자가 사용한 idea가 dimension clustering입니다. 필자는 k-meanss clustering 방식을 사용했는데요. k-means clustering에 대해 조금 더 자세히 정리해둔 <a href="https://towardsdatascience.com/understanding-k-means-clustering-in-machine-learning-6a6e67336aa1">Dr. Michal J. Garbade님의 글</a>을 참고하시면 이해에 도움이 될 것입니다. Fig 4 내의 Figure 2를 참고하시면 필자는 k = 5의 값을 선택하여 clustering을 진행했다고 합니다.</p>
<p>또한, 필자가 적용한 k-means clustering은 일반적으로 알고 있는 k-means clustering과는 차이가 있는데, 바로 Euclidean distance를 사용하지 않았다는 점입니다. 만일 Euclidean distance를 사용하게 된다면, 큰 박스가 작은 박스에 비해 더 많은 error를 일으키게 되는데, YOLO algorithm에서 저희가 원하는 것은 필자가 아래와 같이 서술한</p>
<blockquote>
<p>priors that lead to good IOU scores</p>
</blockquote>
<p>와 같이 box size에 독립적인(independent) IOU score에 초점을 맞추기 때문입니다.</p>
<p>👌 <a href="https://en.wikipedia.org/wiki/Euclidean_distance">Euclidean distance의 정의 - wikipedia</a></p>
<p>따라서 본 clustering에서는 위의 Fig 4의 식을 distance metric으로 사용했습니다. 식을 살펴보면, box와 centroid의 IOU가 클수록 거리가 가깝다는 것을 알 수 있습니다. 따라서 이런 clustering의 효과를 보여주는 것이 Table 1입니다. Cluster IOU #5일때 Avg IOU가 61.0의 값을 가지고, Anchor Boxes가 #9일때 Avg IOU가 60.9인것을 볼 수 있습니다. 즉 better prior는 오직 5개의 anchor box만으로도 좋은 효율을 나타낸다는 것 입니다.</p>
<h3 id="direct-location-prediction">Direct Location Prediction</h3>
<p><img src="https://velog.velcdn.com/images/hunniee_j/post/15e79141-837a-4e8b-b445-f8686f6078a8/image.JPG" alt="">
Fig 5. Direct Location Prediction</p>
<p>이제 앞서 말한 두번째 issue인 model instability를 해결하는 방법을 서술하겠습니다. Anchor box를 사용하는 것이 초기 iteration에서 특히 model instability를 일으킨다고 합니다. 대부분의 문제는 (x,y)를 예측하는데서 오는데요. Region Proposal network에서는 <del>(위의 Fig 5의 우측 상단의 식을 봐주시면 됩니다.)</del> $$t_x, t_y$$값을 예측하여 사용하고 이를 바탕으로 (x, y)를 계산합니다. 따라서 $$t_x = 1$$인 경우에는 box를 anchor box의 width만큼 우측으로 이동시키는 것입니다.</p>
<p>하지만, 이런 formula는 $$t_x, t_y$$값이 제한된 범위가 없어, 초기에 최적화된 값을 찾는데 어려움이 있습니다. 따라서 sensible한 offset을 예측하는데도 시간이 오래 소요됩니다. 따라서 이를 해결하기 위해, YOLO는 location coordinates를 grid cell의 location에 상관있게(relative) 예측하게 됩니다. 이렇게하면 bbox의 값이 0<del>1의 사이의 값을 가지게 됩니다.(YOLOv1에서 4개의 prediction을 하는 방식과 동일합니다.) Logistic activation을 사용해서 0</del>1의 사이의 범위를 가지게 합니다.<del>(이를 나타낸 식이 Fig 5의 우측 중간부 식입니다.)</del> 즉 $$b_x = sigma(t_x)+c_x$$로 $$b_x$$의 값의 범위를 한정하는 것입니다. 따라서 모델은 안정적인 학습이 가능합니다.</p>
<p>각 network는 5개의 bbox를 각 grid cell마다 예측하고, 따라서 총 5x(20+5)=125 filter가 사용됩니다. 이 방식을 사용해서 5%의 recall 향상을 얻을 수 있습니다.</p>
<h3 id="fine-grained-features">Fine-Grained Features</h3>
<p><img src="https://velog.velcdn.com/images/hunniee_j/post/9a26574b-ac6a-42db-8cbf-31b9a11648d9/image.JPG" alt="">
Fig 6. Fine Grained Features</p>
<p>앞서 YOLOv2는 13x13 size의 feature map을 얻는다고 했습니다. Feature Map의 size가 작은경우 큰 object의 detection은 용이하지만, 작은 object는 어렵다는 단점이 있습니다. 이를 해결하기 위해 Faster R-CNN과 SSD에서 사용한 방식과는 다른 접근으로 YOLOv2를 설계했는데,</p>
<blockquote>
<p>adding a pass through layer that brings features from an earlier layer at 26x26 resolution.</p>
</blockquote>
<p>으로, 위의 Fig 6에서 볼 수 있듯, 13x13x1024 size의 feature map을 얻기 이전에 26x26x512의 feature map을 미리 추출합니다. 그리고 이를 13x13x2048의 feature map으로 연결하고 이를 연결해 결과적으로 13x13x3072의 feature map을 얻고, 이를 1x1 및 3x3 convolution layer를 거쳐 13x13x125의 feature map으로 완성합니다. 여기서 125인 이유는 바로 위에 서술해두었습니다.<del>(5x(5+20))</del> 이 방식을 사용하는 이유는 26x26x512의 feature map은 higher resolution feature를 지니고 있고 이를 low resolution feature에 쌓아 작은 개체에 대해서도 예측이 용이하게 설계한 것입니다. 이 방식을 통해 1%의 performance increase를 얻었습니다.</p>
<p>👌 <a href="https://www.hindawi.com/journals/mpe/2018/3518959/">Fig 6에 첨부된 YOLOv2 Structure Diagram 및 추가 설명</a></p>
<h3 id="multi-scale-training">Multi-Scale Training</h3>
<p><img src="https://velog.velcdn.com/images/hunniee_j/post/0d2d7ccf-308a-433d-b3a6-de4306a48b3f/image.PNG" alt="">
마지막으로 필자는 YOLOv2의 추가적인 학습을 통해 model의 완성도를 높였습니다. YOLO의 downsample ratio가 1/32이므로 320x320부터 608x608까지의 이미지를 학습시켰고 따라서 다양한 size를 입력받을 수 있습니다. 위의 Table 3를 참고하면 낮은 resolution에서는 높은 FPS와 상대적으로 낮은 mAP를, 높은 resolution에서는 낮은 FPS와 높은 mAP를 보입니다. <em>(Easy Trade-off between speed and accuracy)</em>  그리고 YOLOv2의 성능이 가장 뛰어납니다.</p>
<h2 id="faster">Faster</h2>
<p>필자는 accurate하고 fast한 두 needs를 YOLO가 모두 충족하기를 원합니다. 그 당시에는 자율주행과 같은 robotics는 low-latency prediction에 의존하고 있었습니다. 당시에 주로 사용하던 VGG-16은 정확하지만, 너무 복잡하다는 단점이 있었습니다. 224x224 size image를 1회 처리하는데 30.69 billion floating point operation이 필요했기 때문입니다. YOLO v1이 사용한 GoogLe Net Architecture 또한 8.52 billion operation를 사용해 VGG-16보다는 비교적 빨랐지만, accuracy 측면에서는 취약한 모습을 나타냈습니다.</p>
<h3 id="darknet-19">Darknet-19</h3>
<p><img src="https://velog.velcdn.com/images/hunniee_j/post/6a34da29-0f8b-4d5d-b6ef-ee813c7e877e/image.JPG" alt="">
Fig 7. Darknet-19</p>
<p>따라서 필자는 YOLOv2를 위한 새로운 backbone architecture를 고안했습니다. Darknet-19는 VGG-16과 비슷하게 3x3 filter를 주로 사용하면서 Network in Network(NIN)과 유사하게 global average pooling layer를 사용했습니다. Global average pooling layer를 사용하는 이유는 YOLOv1에서 사용한 FC(Fully-connected)는 parameter가 크게 증가하여 속도가 굉장히 느려지는 단점이 있어 이를 해결하기 위함입니다. 위의 Fig 7의 우측이 Global pooling layer에 대한 이미지 자료입니다.</p>
<p>👌 <a href="https://gaussian37.github.io/dl-concept-global_average_pooling/">Global Average Pooling에 대해 정리한 Jinsol Kim님의 Github.io</a></p>
<p>따라서 Darknet-19는 19개의 convolutional layer와 5개의 maxpooling layer로 구성되어 있습니다. 그리고 Darknet-19는 5.58 billion operations이 필요해 operation 수를 굉장히 줄였지만, top-5 accuracy에서 91.2%, top-1 accuracy에서 72.9% accuracy로 좋은 성능을 보였습니다. </p>
<h2 id="stronger">Stronger</h2>
<h3 id="hierarchical-classification">Hierarchical Classification</h3>
<p><img src="https://velog.velcdn.com/images/hunniee_j/post/e23f5760-6776-4f05-be38-17876cf3be0a/image.JPG" alt="">
Fig 8. YOLO9000 - WordTree</p>
<p>필자는 YOLOv2에 classification data와 detection data를 동시에 학습시켜 보다 많은 class를 가지는 YOLO9000을 소개합니다. 여기서 joint training을 사용해 새로운 mechanism을 소개합니다. 여기서 필자가 부딪힌 난관은 detection dataset은 general label을 지니고, classification label은 deeper, wider한 range를 가진다는 것입니다. 예를 들어, detection label은 모든 개를 dog로 labeling하지만, classification label은 더 세세하게 Yokshire Terrior, Bedlingtion terrior와 같이 세부적으로 labeling을 하여 이 둘을 같이 학습시킬 경우 dog와 terrior를 다른 class로 인식하게 됩니다. 따라서 이를 해결하기 위해 제안한 방식이 Tree구조 입니다. Parents Node와 Child Node가 있기 때문에, 계층적으로 분류해 내려가면 된다는 것이 주된 idea입니다.<strong>(Hierarchical classification)</strong></p>
<p><img src="https://velog.velcdn.com/images/hunniee_j/post/46b0c232-1af2-4368-b225-c6ede456c4e9/image.png" alt="">
Fig 9. Norfolk Terrior를 찾아가는 과정</p>
<p>따라서 각 세부 객체를 범주를 점차 낮춰가면서 조건부확률의 좁을 통해서 연산할 수 있습니다. 이렇게 ImageNet을 통해 WordTree를 구성할 경우 1369개의 Node가 존재한다고 합니다. 이 방식을 사용하여 얻은 장점을 필자는 다음과 같이 말했습니다.</p>
<blockquote>
<p>Our accuracy only drops marginally.
Performace degrades gracefully on new or unknown objects categories.</p>
</blockquote>
<p>따라서 Fig 8의 우측 Tree 구조와 같이 COCO와 ImageNet을 합친 WordTree 구조를 만들었는데 여기서 ImageNet : COCO = 4:1로 joint model을 구축했습니다. 따라서 이렇게 구성한 WordTree는 총 9418의 classes를 가진다고 합니다.</p>
<h3 id="loss-function-of-yolov2">Loss Function of YOLOv2</h3>
<p><img src="https://velog.velcdn.com/images/hunniee_j/post/b14d6fb4-f390-4ce0-8eca-418f481dd1cd/image.JPG" alt="">
Fig 10. Loss Function of YOLOv2</p>
<p>본 논문에서는 Loss function에 대해 상세히 기술되어 있지는 않으나, 구글링을 통해서 다른 분들이 정리해둔 것을 통해 알 수 있었습니다. 전반적인 내용은 YOLOv1의 Loss function과 비슷하게 SSE를 사용한 것이 보입니다.</p>
<p>하지만, 조금의 차이도 있는데요. <a href="https://velog.io/@hunniee_j/Object-Detection-Paper-Review-YOLOv13">YOLOv1의 Loss Function</a>과 비교하시면 더 좋을 것 같습니다. Part 1에 no_responsible_obj에 관한 Loss를 계산해주면서 새로운 weight parameter가 추가된 것을 볼 수 있습니다. 두번째 항이 추가된 이유는 바로 불필요한 연산을 줄이기 위해 학습시키는 것입니다. 보다 자세한 내용은 Reference를 참고해주시면 이해에 도움이 될 것 같습니다.</p>
<p>👌 <a href="https://github.com/leetenki/YOLOv2/blob/master/YOLOv2.md">Reference 1. Loss Function of YOLOv2</a></p>
<h3 id="result">Result</h3>
<p><img src="https://velog.velcdn.com/images/hunniee_j/post/cb4f0a85-ef3e-4bcb-ad46-c9523d180054/image.png" alt=""></p>
<p>따라서 위의 trade-off 관계를 보여주는 결과와 같이 본인이 필요한 상황에 맞춰 적절한 size의 image를 선택해 YOLOv2를 사용하면 보다 빠르고 정확한 detection이 가능합니다.</p>
<h3 id="comments">Comments</h3>
<p>본 YOLOv2에 대해 학습하면서, 기존의 issue들을 해결하는데, 이미 이전에 발표된 내용 (Batch Normalization 등)에 적절한 변형을 해서 해결하는 것이 놀라웠습니다. 또한, Darknet-19와 WordTree 개념도 본인의 문제를 해결하기 위해 기존에 발표된 것을 조화시켜 구현한 Architecture입니다. 사실 이 논문이 발표된지 몇 년이 지난 지금 수많은 source code들이 공개되어 있어서, 더 이상 코드를 구현하고 단순히 실행하는 것은 더이상 문제가 아닙니다. 하지만, 연구자들은 단순한 개발이 목적이 아니라, 조금 더 각 상황에 맞는 architecture에 대한 고민과 탐구가 필요합니다.
<del>(지금 제가 밑에서 수학하고 있는 교수님의 조언입니다..ㅎ)</del> 
스타트업에서 단순히 소스코드로 기술을 구현하는 것이 아니라 근원적인 내용에 대해 탐구하는 것이 중요하다는 것을 느끼면서 Paper Review를 하고 있는 중 입니다.</p>
<h3 id="references">References</h3>
<p>✔ <a href="https://arxiv.org/abs/1612.08242">YOLOv2 Paper</a>
✔ <a href="https://herbwood.tistory.com/17">YOLOv2 Paper Review by herbwood</a>
✔ <a href="https://deep-learning-study.tistory.com/433">YOLOv2 Paper Review by deep-learing-study</a></p>
<p>참고한 Reference들에 미처 다루지 못한 내용들이 있으니 각 part 별로 자세히 읽어보시면 좋을 것 같습니다.</p>
<p>p.s. YOLOv3에 대한 Post도 여기에 하려했는데, 생각보다 YOLOv2의 내용이 방대하여 좀 짧은 post가 될 것 같지만 다음 post에 서술하도록 하겠습니다.</p>
<p>긴 글 읽어주셔서 감사합니다.😊😊</p>
<p><img src="https://velog.velcdn.com/images/hunniee_j/post/a0c91292-4488-41a2-b07c-9eef1aa85057/image.jpg" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Object Detection Paper Review] - YOLOv1]]></title>
            <link>https://velog.io/@hunniee_j/Object-Detection-Paper-Review-YOLOv13</link>
            <guid>https://velog.io/@hunniee_j/Object-Detection-Paper-Review-YOLOv13</guid>
            <pubDate>Thu, 30 Jun 2022 05:59:14 GMT</pubDate>
            <description><![CDATA[<h3 id="introduction">Introduction</h3>
<p>첫 시리즈로 Object Detection의 가장 대표적인 YOLO(You Only Look Once)의 v1부터 v3까지의 Paper review를 진행합니다. 본 포스트는 그 중 v1에 관한 내용입니다. YOLO로 시작한 이유는 현재 Internship 중인 스타트업<strong>(ABrain)</strong> 및 랩실에서 이번에 진행하는 과제에 YOLOv5를 사용하여, 미리 개념을 알아두어야 하기 때문에 첫 번째 리뷰로 선정했습니다. </p>
<p>  <del>첨부하는 이미지 파일은 Seminar 용으로 제가 제작한 PPT 파일이고, 내부에 첨부된 파일 등은 <strong>Reference(✔)</strong>를 참고해주세요!</del></p>
<p><img src="https://velog.velcdn.com/images/hunniee_j/post/433db97b-6eaf-4381-82c4-84c2cce7b802/image.JPG" alt=""></p>
<center>Fig 1. R-CNN vs YOLO</center>

<p>✔ <a href="https://arxiv.org/abs/1311.2524">R-CNN Paper</a></p>
<p>✔ <a href="https://arxiv.org/abs/1506.02640">YOLOv1 Paper</a></p>
<p>기존에 Object Detection의 분야에서 선두로 달리고 있는 방법은 R-CNN이었습니다. R-CNN은 UC Berkeley의 Ross Girshick에 의해 처음 소개된 object detection 방법으로 대표적인 <em>2-stage detection</em> 방법입니다.  </p>
<p>이런 2-Stage 방법은 우선 <em>Localization -&gt; Classification*의 과정으로 분류되며, 위의 그림에서 보이는 것과 같이, *Region Proposals, Region Classifier</em> 의 단계들을 확인할 수 있습니다. 이런 방식은 장점은 비교적 아주 정확한 결과를 도출한다는 점인데요. 다만 <em>bottleneck</em> (병목현상)이 일어날 가능성이 있어서 느리다는 단점이 있습니다.</p>
<p>✔ <a href="https://m.blog.naver.com/infoefficien/221216245814">Localization lecture by Andew Ng</a></p>
<p>YOLO는 정확하지만 느린 R-CNN을 빠르게 하면서 보다 간편하게 하고자 하는 idea에서 시작되었습니다. 즉, <em>&#39;왜 우리는 두 단계 혹은 여러 단계로 나눠서 인식을 하는걸까..? 한번에 해보자!&#39;</em> 라는 생각인 것입니다. 따라서 이러한 object detection 방식을 이제 1-stage detection이라 부르며, Object detection의 양대 산맥으로 자리하고 있습니다. 위의 Fig 1의 아래 그림이 바로 YOLO에 관한 내용인데 필자는 YOLO를 이렇게 소개하고 있습니다.</p>
<blockquote>
<p><em>YOLO is refreshingly simple!</em></p>
</blockquote>
<p>이런 YOLO의 장점으로는</p>
<ol>
<li>YOLO is <span style="color:red">EXTREMELY FAST</span><ol start="2">
<li>YOLO reasons globally about the image when making prediction. </li>
<li>YOLO learns generalizable representations of objects</li>
</ol>
</li>
</ol>
<p>의 세가지가 있습니다.</p>
<h3 id="methods-and-key-concepts-of-yolo">Methods and key-concepts of YOLO</h3>
<p><img src="https://velog.velcdn.com/images/hunniee_j/post/cbd3888c-8b75-4325-988f-eadaded84232/image.JPG" alt="">
  <center>Fig 2. Structure of YOLO</center></p>
<p>  다음으로 이제 YOLO Algorithms의 Architecture에 대해 알아보겠습니다. YOLO는 총 24개의 Convolutional layer와 2개의 fully-connected layer으로 이루어져있으며 필자는 이 구조를 <em>GoogLeNet</em> 에서 영감을 얻었다고 했습니다. 다만 GoogLeNet에서 사용한 Inception module 대신 1x1  convolution layer와 3x3 convolution layer를 사용했다고 합니다. 여기서 사용하는 1x1 layer의 역할에 대해서는 GoogLe Net paper review에서 다루도록 하고, 지금은 단순히 가장 중요한 역할인 demension reduction을 통한 computational bottleneck 해결으로 생각하고 넘어가겠습니다.</p>
<p>  ✔ <a href="https://arxiv.org/abs/1409.4842">GoogLe Net Paper</a></p>
<p>  위의 Fig 2의 하단 그림을 참고하면, 20개의 layer는 GoogLe Net modification이고 그 이후의 4개의 layer를 통해서 object detection을 학습시킵니다. 그 이후 2개의 fully-connected layer를 통해 7x7x30 Tensor를 얻게 됩니다. 각 Layer의 학습단계에서 Leaky ReLU 함수를 사용하고, 마지막 layer에서만 linear activation function을 사용했습니다.
  <img src="https://velog.velcdn.com/images/hunniee_j/post/b11998fd-d1f2-4fd2-b4d5-6d04829dc571/image.JPG" alt=""></p>
<center> Fig 3. YOLO with Example </center>

<p>이제 이런 structure을 가지는 YOLO가 어떻게 동작하는지 살펴보면, YOLO는 input image를 SxS grid cell로 분할합니다. 이 과정에서 만약, object의 center가 grid cell에 위치한다면, 그 grid cell은 object detection에 주요한 grid cell이 되는 것입니다. 또한 각 grid cell은 B개의 bbox(boundary box)와 Confidence Score를 예측합니다. 그리고 총 20개의 class에 대해 학습을 거쳤습니다. 따라서 본 Fig 3의 식에서 S=7, B=2, C=20의 값을 얻게 되고, x5의 의미는 bbox의 5가지 prediction (x,y,w,h,c)입니다. x, y는 bbox의 중심 좌표 w, h는 bbox의 크기를 나타내며. 이를 대입하여 결국 7x7x30 Tensor의 output을 얻게 되는 것입니다.</p>
<p>  각 요소에 대해 자세히 살펴보면 Confidence Score는 Pr(Objects)xIOU로 나타내지는데 이 의미는, model이 객체를 잘 포함하고 있는지, 그리고 얼마나 예측을 잘 했는지 나타내주는 것입니다. 따라서 grid cell 내에 객체가 존재할 경우 Pr(obj) = 1이므로 Confidence Score = IOU이고, 객체가 존재하지 않을 경우, Confidence Score는 0이 됩니다.</p>
<p>  다음으로 7x7x30 Tensor의 동작에 대해 개략적으로 보도록 하겠습니다. 이 자료를 통해서 저는 Tensor의 원리에 대해 수월하게 이해할 수 있었고, 좀 있다 Review하는 v2와 v3에서도 무리없이 이해할 수 있었습니다.</p>
<h3 id="tensor">Tensor</h3>
<p>  <img src="https://velog.velcdn.com/images/hunniee_j/post/69a1acaa-1ed0-4bcd-bf08-c793599c91a4/image.JPG" alt="">
  <center> Fig 4. Work of Tensor </center></p>
<p>Fig 4를 통해서 왜 98개의 bbox가 생겨나는지, 그리고 Tensor의 역할이 어떻게 수행되는지 이해할 수 있었습니다. 각 grid cell 당 2개의 bbox가 할당되고(B=2) 하나의 bbox에는 5개의 prediction이 존재합니다.(x,y,w,h,c) 그리고 20개의 class가 존재하니 5+5+20 = 30 차원의 tensor를 가지고 모든 과정을 수행하는 것이며, grid cell은 7x7 = 49개 이므로 총 98개의 bbox에 대해 연산을 하는 것입니다. 보다 자세한 과정은 아래의 slide에 잘 정리되어 있습니다. 또한 YOLO가 수많은 bbox 중에서 특정 bbox만을 선택하는 기법이 Non-max Suppression(비-최대 억제)인데 그 내용도 상세히 설명되어 있으니 참고하시길 바랍니다.</p>
<p>  ✔ <a href="https://docs.google.com/presentation/d/1aeRvtKG21KHdD5lg6Hgyhx5rPq_ZOsGjG5rJ1HP7BbA/pub?start=false&amp;loop=false&amp;delayms=3000&amp;slide=id.p">YOLO google Slides</a></p>
<h3 id="loss-function">Loss Function</h3>
<p>  <img src="https://velog.velcdn.com/images/hunniee_j/post/0bdf4513-dd3d-41a0-861f-345289283d3d/image.JPG" alt="">
  <center> Fig 5. Loss function of YOLO v1 </center></p>
<p>거의 다 와 갑니다. 이제 Loss Function에 대해 알아보겠습니다. YOLOv1의 Loss function은 크게 3개의 part로 구분됩니다.</p>
<ol>
<li>bbox의 size, location Loss (x,y,w,h)</li>
<li>Confidence Score Loss</li>
<li>Classification Loss</li>
</ol>
<p>먼저, 전체적으로 손실함수가 SSE(Sum of Squares Error)를 사용하고 있음을 확인할 수 있습니다. 훗날 이런 통계와 관련된 부분을 공부한 후 시리즈로 업로드 할 계획도 세우고 있습니다. <del> 늘 계획만 세우지만요,,,,</del> 손실함수에서 필자가 주목해야한다고 한 부분은 바로 람다값입니다. 이는 SSE의 optimize하기는 쉽지만, perfectly align하지 못하다는 단점을 보완하기 위한 방법입니다. 자세히 살펴보면, </p>
<ol>
<li>localization error가 classification error와 비슷한 가중치를 가지게 되는 점 </li>
<li>모든 cell이 object를 가지진않아, confidence score가 0으로 수렴하여 overpowering gradient를 유발</li>
</ol>
<p>따라서 결국 결국 model을 불안정하게 만드는 단점을 가지고 있습니다. 이를 해결하기 위해, object를 포함하고 있지 않은 bbox의 가중치를 0.5로 설정하여 penalty를 낮춰주고, localization error에 5의 가중치를 주어 penalty를 증가시키는 parameter를 추가한 것입니다. 또 기존의 SSE 방식에는 문제점이 더 있는데, 바로 bbox의 크기에 상관없이 weight errors한다는 점입니다. 따라서 필자는 이 문제점을 해결하기 위해 Loss function의 첫 번째 part에 size와 height 연산에 sqaure root를 취해주었습니다.</p>
<p><img src="https://velog.velcdn.com/images/hunniee_j/post/52e1e586-1482-4d27-8dc8-5d257f060a01/image.JPG" alt="">
  <center> Fig 6. Result of YOLOv1 </center></p>
<p>  이렇게 완성한 YOLO의 test 결과 R-CNN에 비해 확연하게 줄어든 Background error를 볼 수 있습니다. 또한 Table 1에서 확인할 수 있듯 real-time detection에서도 높은 mAP를 나타냄을 확인할 수 있습니다. 하지만 localize error에서는 해결해야할 점이 있음을 나타내기도 합니다.</p>
<p>이러한 점이 바로 YOLO의 limitation이기도 합니다. YOLOv1의 한계는</p>
<ol>
<li>Each grid cell only predicts one class -&gt; 새들의 군집 등을 분석하기 힘듭니다.<ol start="2">
<li>bbox가 data에 따라 학습되어 새로운 형태의 bbox에 대해 대응이 어렵습니다.</li>
<li>작은 bbox의 loss가 더 큰 영향을 미쳐, localization error가 높아집니다.</li>
</ol>
</li>
</ol>
<p>이러한 점을 해결해나가는 과정이 YOLOv2와 YOLOv3로 이는 다음 포스트에 업로드 하겠습니다.</p>
<p>긴 글 읽어주셔서 감사합니다😊😊</p>
<p><strong>Reference</strong>
  <a href="https://herbwood.tistory.com/13?category=856250">YOLOv1 논문리뷰 by herbwood</a>
  <a href="https://herbwood.tistory.com/13?category=856250">YOLOv1 논문리뷰 by 딥러닝공부방</a>
  <a href="https://herbwood.tistory.com/13?category=856250">YOLOv1 논문리뷰 by 비전홍</a>
  <a href="https://www.youtube.com/watch?v=NM6lrxy0bxs">CVPR 2016 YOLOv1 Youtube 영상</a></p>
<p>  <img src="https://velog.velcdn.com/images/hunniee_j/post/f647d0b1-fb3c-4e83-abe1-ffc0dc27172c/image.jpg" alt=""></p>
</div>]]></description>
        </item>
    </channel>
</rss>