<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>HoonC-corgi&apos;s Blog</title>
    <description>해가 지는 곳따라 걷다 보면, 그게 내 기쁨이어라.</description>
    <link>https://hoonc-corgi.github.io/</link>
    <atom:link href="https://hoonc-corgi.github.io/feed.xml" rel="self" type="application/rss+xml" />
    <pubDate>Tue, 29 Jul 2025 05:24:26 +0000</pubDate>
    <lastBuildDate>Tue, 29 Jul 2025 05:24:26 +0000</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>
    
      <item>
        <title>[논문 리뷰] Overall quality Prediction for HTTP Adaptive Streaming Using LSTM Network</title>
        <description>&lt;!-- TOC --&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#논문-리뷰를-시작하며&quot;&gt;논문 리뷰를 시작하며&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#한글-번역-및-코멘트&quot;&gt;한글 번역 및 코멘트&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#abstract&quot;&gt;&lt;strong&gt;Abstract&lt;/strong&gt;&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#notes&quot;&gt;Notes&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#i-introduction&quot;&gt;&lt;strong&gt;I. Introduction&lt;/strong&gt;&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#notes-1&quot;&gt;Notes&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#ii-architecture-of-the-proposed-approach&quot;&gt;&lt;strong&gt;II. Architecture of the Proposed Approach&lt;/strong&gt;&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#notes-2&quot;&gt;Notes&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#iii-input-features&quot;&gt;&lt;strong&gt;III. Input Features&lt;/strong&gt;&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#notes-3&quot;&gt;Notes&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#iv-datasets-and-experiment-settings&quot;&gt;&lt;strong&gt;IV. Datasets and Experiment Settings&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#v-analysis-of-the-input-feature-options&quot;&gt;&lt;strong&gt;V. Analysis of the Input Feature Options&lt;/strong&gt;&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#notes-4&quot;&gt;Notes&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#vi-analysis-of-lstm-networks&quot;&gt;&lt;strong&gt;VI. Analysis of LSTM networks&lt;/strong&gt;&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#notes-5&quot;&gt;Notes&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#vii-comparison-with-existing-approaches&quot;&gt;&lt;strong&gt;VII. Comparison with Existing Approaches&lt;/strong&gt;&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#notes-6&quot;&gt;Notes&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#viii-discussions&quot;&gt;&lt;strong&gt;VIII. Discussions&lt;/strong&gt;&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#notes-7&quot;&gt;Notes&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#ix-conclusion&quot;&gt;&lt;strong&gt;IX. Conclusion&lt;/strong&gt;&lt;/a&gt;
&lt;!-- TOC --&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;논문-리뷰를-시작하며&quot;&gt;논문 리뷰를 시작하며&lt;/h1&gt;

&lt;p&gt;오랜만에 블로그를 작성한다. 학부를 졸업하기 전에 논문을 한 편 써보겠다는 것을 목표로 한참을 달리다 보니 그 간의 일들은 블로그에 담지 못했다.&lt;br /&gt;
돌아보면, 남들보다 뛰어나게 성적을 받고, 성과를 내며 학교를 다니지는 못했지만, 목표가 있는 삶을 살아 왔고, 또 그것들을 모두 이루어 보았다는 점에서 스스로 위안해 본다.&lt;/p&gt;

&lt;p&gt;이번 논문은 일전에 리뷰하였던 논문의 저자들이 이어서 투고한 논문이다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://ieeexplore.ieee.org/abstract/document/9247981&quot;&gt;Overall quality Prediction for HTTP Adaptive Streaming Using LSTM Network&lt;/a&gt;&lt;/strong&gt; - Huyen T. T. Tran, Duc V. Nguyen, Duong D. Nguyen, Nam Pham Ngoc and Truong Cong Thang (IEEE TRANSACTIONS ON CIRCUITS AND SYSTEMS FOR VIDEO TECHNOLOGY • AUGUST 2021)&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;본 게시글은 위 논문을 스스로 번역, 재정리한 내용을 포함합니다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;한글-번역-및-코멘트&quot;&gt;한글 번역 및 코멘트&lt;/h1&gt;
&lt;h2 id=&quot;abstract&quot;&gt;&lt;strong&gt;Abstract&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;HAS는 현대 멀티미디어 전송을 위한 가장 인기 있는 솔루션이다.&lt;/p&gt;

&lt;p&gt;하지만 네트워크 대역폭의 변동으로 인해 스트리밍 중에 비디오 품질은 크게 달라진다.&lt;/p&gt;

&lt;p&gt;그러므로, HAS에서의 핵심 과제는 스트리밍 세션의 overall quality를 어떻게 평가할지에 있다.&lt;/p&gt;

&lt;p&gt;본 논문에서는 스트리밍 세션에서의 각 세그먼트가 set of features로 표현되는 overall quality 예측을 위한 머신 러닝 접근법을 제안한다.&lt;/p&gt;

&lt;p&gt;feature set의 두 가지 옵션을 조사하였다. 첫 번째 옵션에서 우리는 &lt;strong&gt;Segment Quality, Content Characteristics, Stalling Duration, Padding&lt;/strong&gt;, 네 가지 feature를 사용하였다.&lt;/p&gt;

&lt;p&gt;두 번째 옵션에서는 &lt;strong&gt;Bitstream-level parameters, Stalling Duration, Padding&lt;/strong&gt;, 세 가지 feature를 사용하였다.&lt;/p&gt;

&lt;p&gt;각 옵션에서 features를 Stalling event와 Quality variations의 발생 간의 temporal relations를 탐구할 수 있는 LSTM 네트워크에 입력하였다.&lt;/p&gt;

&lt;p&gt;overall quality는 선형 회귀 모듈을 사용하는 LSTM 네트워크의 출력으로부터 예측되었다.&lt;/p&gt;

&lt;p&gt;실험 결과에 따르면, 제안된 접근법은 높은 예측 성능을 보였으며, 기존의 일곱 가지 접근법을 능가하였다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;notes&quot;&gt;Notes&lt;/h3&gt;

&lt;p&gt;제안된 접근법&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;LSTM using Linear Regression Module&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;입출력&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;input
    &lt;ul&gt;
      &lt;li&gt;option 1&lt;br /&gt;
Segment Quality Content Characteristics, Stalling Duration, Padding&lt;/li&gt;
      &lt;li&gt;option 2&lt;br /&gt;
Bitstream-level parameters, Stalling Duration, Padding&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;output
    &lt;ul&gt;
      &lt;li&gt;overall quality&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;i-introduction&quot;&gt;&lt;strong&gt;I. Introduction&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;HAS에서 비디오는 상이한 품질 수준의 여러 버전으로 인코딩 되며, 각 인코딩 버전은 세그먼트 시퀀스로 나뉜다.&lt;/p&gt;

&lt;p&gt;세그먼트는 공용 웹 서버에서 호스팅 되는데, 네트워크 상태에 따라서 클라이언트는 적합한 세그먼트의 버전을 결정하고, 웹 서버에 해당 버전을 요청하기 위한 HTTP requests를 전송한다.&lt;/p&gt;

&lt;p&gt;선택된 세그먼트 버전은 네트워크 대역폭의 변동에 따라서 스트리밍 세션 중에 크게 변할 수 있으며, 이는 Quality variations를 야기한다.&lt;/p&gt;

&lt;p&gt;또한 playback deadline 전에 세그먼트가 도착하지 못한 경우 Stalling event가 발생한다.&lt;/p&gt;

&lt;p&gt;HAS에서 핵심 과제는 Quality variations와 Stalling event의 영향을 고려하여 스트리밍 세션의 전체 품질을 평가하는 방법에 있다.&lt;/p&gt;

&lt;p&gt;스트리밍 세션의 품질을 측정하는 일반적인 방법으로는 Recommendations ITU-R BT.500-13, ITU-T P.880 두 가지 방법이 있다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;순간적인 품질(Instantaneous quality)는 스트리밍 세션 중에 순간적으로 인식되는 품질을 의미한다.&lt;/li&gt;
  &lt;li&gt;전반적인 품질(Overall quality)는 스트리밍 세션의 끝에서 측정되는 전체 세션의 품질을 의미한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;서비스 프로바이더의 경우 사용자에게 최고의 품질 경험을 제공하기 위해 이 두 가지 품질 모두 측정하는 것이 중요하다.&lt;/p&gt;

&lt;p&gt;순간적인 품질의 측정은 impairment 이벤트에 대한 사용자의 즉각적인 반응을 이해하는 데에 유의미하다(i.e., Quality variations, Stalling event).&lt;/p&gt;

&lt;p&gt;현재까지 순간적인 품질 평가 및 모델링과 관련된 몇 가지의 연구가 있었다.&lt;/p&gt;

&lt;p&gt;한편, 전반적인 품질의 측정은 서비스 프로바이더가 제공하는 서비스의 품질을 이해하는 데에 중요하다. 본 연구에서는, 전반적인 품질 측정에 초점을 두었다.&lt;/p&gt;

&lt;p&gt;전반적인 품질을 예측하기 위한 대부분의 기존 접근법들은 분석 모델 기반의 접근법이다.&lt;/p&gt;

&lt;p&gt;이러한 접근법들에서 Quality variations의 영향은 Quality variations의 횟수, 평균, 최소값, 세그먼트 품질 값의 히스토그램과 같은 일부 통계값을 사용하여 모델링된다.&lt;/p&gt;

&lt;p&gt;Stalling event의 영향에 대해서는 Stalling event의 수와 합, Stalling Duration 히스토그램이 일반적으로 사용된다.&lt;/p&gt;

&lt;p&gt;전반적인 품질을 예측하기 위해 이러한 통계값들은 선형 함수와 로그 함수같은 분석 함수를 사용하여 풀링된다.&lt;/p&gt;

&lt;p&gt;기존 접근법 중 일부는 Quality variations와 Stalling event의 영향을 함께 고려하였다.&lt;/p&gt;

&lt;p&gt;문헌에 따르면, 전반적인 품질 예측을 위한 고급 머신 러닝 접근법은 일부 존재한다.&lt;/p&gt;

&lt;p&gt;이는 부분적으로 학습을 위한 충분한 데이터셋이 부족하기 때문이다.&lt;/p&gt;

&lt;p&gt;특히, 공적으로 사용 가능한 데이터 셋의 대부분은 두 가지의 주요 문제가 있다.&lt;/p&gt;

&lt;p&gt;첫 째, 데이터 셋의 사이즈가 작아 기계 학습 접근법의 학습을 할 때에 오버 피팅을 초래할 것으로 보인다.&lt;/p&gt;

&lt;p&gt;둘 째, 기존의 데이터셋은 실제 스트리밍 시나리오를 반영하지 않는데 이는 아래로 인한 결과이다.&lt;/p&gt;

&lt;p&gt;1) 데이터셋에 포함된 세션은 일반적으로 20초 이내의 길이로 매우 짧다.&lt;br /&gt;
2) 오직 Quality variations 또는 Stalling event만을 고려한다.&lt;/p&gt;

&lt;p&gt;전반적인 품질 예측을 위한 최초의 고급 머신 러닝 접근법은 [15]의 연구이며, 랜덤 신경망을 사용하였다.&lt;/p&gt;

&lt;p&gt;해당 접근법의 입력으로는 모든 비디오 프레임의 모든 매크로 블록에 대한 양자화 파라미터 값의 평균, Stalling event 수, Stalling Duration의 평균 및 최대값으로 구성된다.&lt;/p&gt;

&lt;p&gt;해당 접근법은 16초 길이의 118개의 스트리밍 세션이 포함된 데이터셋으로 측정하였다.&lt;/p&gt;

&lt;p&gt;[16]의 저자는 전반적인 품질을 예측하기 위해 회귀 모델을 사용하는 다른 고급 머신 러닝 접근법을 제안하였다.&lt;/p&gt;

&lt;p&gt;그들의 접근법에서 각 세션은 세그먼트 품질 값의 평균, 세그먼트 품질이 감소한 시간, 마지막 impairment 이벤트가 발생한 이후의 시간(ie., Stalling event 또는 세그먼트 품질 저하), Stalling Duration 총합, Stalling event 수 5개의 통계값으로 특정된다.&lt;/p&gt;

&lt;p&gt;이를 위해 선형 휘귀, SVR, 앙상블 기법 세 가지의 회귀 모델이 고려된다.&lt;/p&gt;

&lt;p&gt;대략 72초 길이의 세션 112개로 구성된 데이터셋을 사용하여 SVR이 최고의 평균 예측 성능을 보였다.&lt;/p&gt;

&lt;p&gt;데이터셋의 세션은 8개의 직접 구성한 Quality variations 패턴을 가지며, 각 패턴은 오직 하나의 세그먼트 품질 저하와 최대 두 번의 Stalling event를 가진다.&lt;/p&gt;

&lt;p&gt;ITU-T P.1203.3 표준의 최신 단계에서는 스트리밍 세션의 전반적인 품질을 사전에 결정하기 위한 고급 머신 러닝 접근법이 제안되었다.&lt;/p&gt;

&lt;p&gt;이 접근법은 세그먼트 품질 값의 첫 번째, 다섯 번째, 열 번째 백분위 수, 지연 기간의 합, Stalling event 등 다양한 통계를 포함하는 랜덤 포레스트 모델을 사용한다.&lt;/p&gt;

&lt;p&gt;[22]에 따르면, 이 접근법은 60개의 60초 분량의 긴 세션과 240초 분량의 긴 세션 15개를 사용하여 검증되었다.&lt;/p&gt;

&lt;p&gt;대부분의 분석 모델 기반, 고급 머신러닝 기반 접근법을 사용하는 기존 접근법에서는 입력은 위에서 설명한 세션의 일부 통계값만을 다룬다.&lt;/p&gt;

&lt;p&gt;그러나 이러한 통계값들은 impairment 이벤트들 간의 시간적 관계를 놓치기에 스트리밍 세션에서 발생할 수 있는 impairment 이벤트를 충분히 반영하지 못한다.&lt;/p&gt;

&lt;p&gt;가령, 같은 횟수의 Stalling event, Stalling Durations의 합, 연속적인 Stalling event들이 간헐적으로 발생하는 그것들과 비교하여 야기할 수 있는 부정적인 영향을 반영하지 못한다.&lt;/p&gt;

&lt;p&gt;그러므로, 스트리밍 세션의 impairment 이벤트 간의 시간적 관계를 충분히 추출할 수 있는 접근법을 개발하는 것이 필수적이며, 이것이 본 연구의 핵심 동기이다.&lt;/p&gt;

&lt;p&gt;본 연구에서는 HAS 세션의 전반적인 품질 예측을 위한 새로운 머신 러닝 접근법을 제안한다. 제안된 접근법에서는 세션 기반의 통계값 대신 세그먼트 기반의 값들을 입력으로 사용한다.&lt;/p&gt;

&lt;p&gt;또한, memory를 사용하여 impairment 이벤트 간 시간적 관계를 효과적으로 추출하는 LSTM을 입력을 풀링하기 위해 사용한다.&lt;/p&gt;

&lt;p&gt;문헌에 따르면, LSTM은 instantaneous 품질 예측과 서비스의 예측 응답 시간 예측과 같은 품질 예측의 일부 작업에 응용된다.&lt;/p&gt;

&lt;p&gt;그러나 현재까지 LSTM을 HAS의 전반적인 품질 예측을 위해 사용한 연구는 없다.&lt;/p&gt;

&lt;p&gt;본 연구의 핵심 기여는 아래와 같이 요약된다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;첫 째, LSTM을 사용하여 HAS 세션의 전반적인 품질을 예측하는 새로운 머신 러닝 접근법을 제안한다.&lt;br /&gt;
각 세그먼트는 몇 가지 세그먼트 features를 통해 표현되며, LSTM의 입력으로 세그먼트 기반의 값을 사용하고 풀링하여 전반적인 품질을 예측하는 최초의 연구이다.&lt;/li&gt;
  &lt;li&gt;둘 째, 기본 LSTM, 고급 LSTM 두 개의 상이한 LSTM 네트워크를 조사한다.&lt;br /&gt;
특히, 제안된 접근법의 성능에 패딩이 미치는 영향을 시험한다.&lt;br /&gt;
또한 입력 features를 complex와 simple 두 가지의 옵션으로 제안하고 분석한다.&lt;br /&gt;
complex 옵션은 Segment Quality, Content Characteristics, Stalling Duration, Padding으로 구성된다.&lt;/li&gt;
  &lt;li&gt;셋 째, 제안된 접근법은 세 가지의 데이터셋을 사용하여 평가되었다.&lt;br /&gt;
1) 60-76초 길이의 세션 515개, 그 중 332개는 실제 스트리밍 테스트베드에서 얻은 데이터셋&lt;br /&gt;
2) 1분 길이의 세션 120개로 구성된 데이터셋&lt;br /&gt;
3) 8초 길이의 세션 588개로 구성된 데이터셋&lt;br /&gt;
실험 결과에서 제안된 접근법은 매우 높은 성능을 보였으며, 제안된 접근법과 기존 일곱가지 접근법의 예측 성능을 비교하였으며, 제안된 접근법은 가장 좋은 성능을 보였다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;위 작업의 일부는 [25]에 제시되어 있다. 이전 연구와 비교할 때에, 본 연구는 새로운 점을 가진다.&lt;br /&gt;
  1) 고급 LSTM을 사용하여 제안된 접근법의 성능을 향상 시켰다.  &lt;br /&gt;
  2) 효율적이고 효과적인 feature 셋의 새로운 옵션(simple option)을 제안하였다.  &lt;br /&gt;
  3) Segment Quality feature 표현에 사용되는 다섯 가지 추가 메트릭을 포함하였다.  &lt;br /&gt;
  4) LSTM 입력에 스위칭 빈도 feature를 추가하는 것이 제안된 접근법의 성능을 향상시킬 수 있는지 조사한다.&lt;br /&gt;
  5) 패딩 옵션과 히든 유닛 수를 포함하여 LSTM과 관련된 이슈에 대한 광범위한 평가를 수행하였다. 또한 LSTM과 단순한 회귀 모델인 SVR과 LSTM을 비교하였다.&lt;br /&gt;
  6) [7], [12], [14]에서 제안된 세 개의 기존 접근법을 구현하였으며, 제안된 접근법과 비교하였다.&lt;br /&gt;
  7) 제안된 접근법의 성능을 평가하기 위해 두 개의 데이터셋을 사용하였다.&lt;/p&gt;

&lt;p&gt;이후 구성은 다음과 같다.&lt;br /&gt;
섹션 2에서는 제안된 접근법의 아키텍처를 설명한다.&lt;br /&gt;
섹션 3에서 feature 셋의 옵션을 설명하였다. &lt;br /&gt;
섹션 4는 데이터셋과 제안된 접근법의 성능을 평가하기 위한 실험 환경을 설명한다. &lt;br /&gt;
섹션 5는 입력 feature 옵션을 분석한다.&lt;br /&gt;
섹션 6에서는 LSTM 종류에 따른 성능과 세팅을 설명한다.&lt;br /&gt;
섹션 7은 제안된 접근법과 7개의 기존 접근법을 비교한다.&lt;br /&gt;
섹션 8은 제안된 접근법의 일부 discussions을 제시한다.&lt;br /&gt;
섹션 9는 결론을 제시한다.&lt;/p&gt;

&lt;hr /&gt;
&lt;h3 id=&quot;notes-1&quot;&gt;Notes&lt;/h3&gt;

&lt;p&gt;Quality in HAS&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Instantaneous quality&lt;br /&gt;
스트리밍 세션 중에 순간적으로 인식되는 품질, Quality variations, Stalling event와 같은 impairment 이벤트에 대한 사용자의 즉각적인 반응을 이해하는 데에 유의미함.&lt;/li&gt;
  &lt;li&gt;Overall quality&lt;br /&gt;
스트리밍 세션의 긑에서 측정되는 전체 세션의 품질, 서비스 자체에 대한 품질을 이해하는 데에 유의미함.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Overall quality 평가 방법&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;일반적인 방법
    &lt;ul&gt;
      &lt;li&gt;Recommendations ITU-R BT.500-13&lt;/li&gt;
      &lt;li&gt;ITU-T P.880&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;기존 방법
    &lt;ul&gt;
      &lt;li&gt;분석 모델 기반의 접근법으로, Quality variations의 횟수, 평균, 세그먼트 품질 값의 히스토그램 등 일부 통계값을 사용하여 Quality variations의 영향을 모델링함.&lt;br /&gt;
Stalling event: Stalling event의 수와 합, Stalling Duration 히스토그램 사용이 일반적임.&lt;br /&gt;
Overall quality 예측을 위해 통계값들을 선형 함수, 로그 함수 등으로 풀링&lt;/li&gt;
      &lt;li&gt;고급 머신 러닝 접근법은 적음&lt;br /&gt;
공적으로 사용 가능한 데이터셋을 사용하나 아래 문제가 있음.
1) 데이터셋이 작아 과적합될 수 있음.
2) 20초 이내 짧은 길이를 가지며, Quality variations 또는 Stalling event만을 고려하므로, 실제 스트리밍 시나리오를 반영하지 못함.&lt;/li&gt;
      &lt;li&gt;Overall quality 예측을 위한 최초의 고급 머신러닝 접근법은 [15], 랜덤 신경망을 사용함. 이후에도 몇 가지 접근법이 제안되었으나, SVR이 가장 좋았음.&lt;/li&gt;
      &lt;li&gt;ITU-T P.1203.3 표준 최신 단계에서는 랜덤 포레스트 모델을 사용하는 고급 머신러닝 접근법이 제안 되었음.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;대부분의 분석 모델 기반, 고급 머신러닝 기반 접근법은 입력으로 일부 통계값만을 사용하지만, 이들은 &lt;strong&gt;impairment 이벤트들 간 시간적 관계를 놓쳐 실제 스트리밍 세션에서 발생할 수 있는 문제를 반영하지 못함.&lt;/strong&gt;&lt;br /&gt;
e.g., 동일한 횟수의 impairment 이벤트, 연속적인 이벤트 - 간헐적으로 발생하는 이벤트 간 영향의 차이&lt;br /&gt;
&lt;strong&gt;Motivation =&amp;gt; 스트리밍 세션의 impairment 이벤트 간 시간적 관계를 충분히 반영할 수 있는 접근법 개발이 필수적!&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;제안된 접근법
    &lt;ul&gt;
      &lt;li&gt;세그먼트 기반의 값들을 입력으로 사용함.&lt;/li&gt;
      &lt;li&gt;LSTM을 사용하여 입력에서 시간적 관계를 효과적으로 추출함.&lt;/li&gt;
      &lt;li&gt;핵심 기여
1) Overall quality를 예측하기 위해 LSTM을 사용하는 최초의 연구
2) 기본, 고급 LSTM 두 개의 상이한 LSTM을 조사&lt;br /&gt;
  패딩이 제안된 접근법에 미치는 영향을 조사&lt;br /&gt;
  입력 features를 complex(Segment Quality, Content Characteristics, stalling duraion, Padding), simple 두 가지 옵션으로 제안, 분석함.
3) 세 가지 데이터셋을 사용하여 다양하게 평가&lt;/li&gt;
      &lt;li&gt;이전 연구와의 차이
        &lt;ul&gt;
          &lt;li&gt;고급 LSTM을 사용한 성능향상&lt;/li&gt;
          &lt;li&gt;효율적이고 효과적인 simple option feature 셋 제안&lt;/li&gt;
          &lt;li&gt;Segment Quality feature 표현에 다섯 가지 메트릭 추가&lt;/li&gt;
          &lt;li&gt;LSTM 입력에 스위칭 빈도 feature를 추가하는 것이 성능 향상에 효과적인지 조사&lt;/li&gt;
          &lt;li&gt;패딩 옵션, 히든 유닛 수를 포함한 광범위한 평가, LSTM-SVR 비교&lt;/li&gt;
          &lt;li&gt;[7], [12], [14] 세 개의 기존 접근법 구현 및 비교&lt;/li&gt;
          &lt;li&gt;제안된 접근법 성능 평가를 위해 두 개의 데이터셋 사용&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;
&lt;h2 id=&quot;ii-architecture-of-the-proposed-approach&quot;&gt;&lt;strong&gt;II. Architecture of the Proposed Approach&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;본 섹션에서는 제안된 접근법의 일반적인 구조를 설명한다. 연구에 사용된 두 타입을 상세히 설명한다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A. General Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;스트리밍 세션은 세그먼트의 연속으로 구성되며, 가각은 features 셋으로 표현된다.&lt;/p&gt;

&lt;p&gt;feature들은 LSTM에 입력에 사용된다. 출력은 선형 회귀 모듈을 거쳐 스트리밍 세션의 전반적인 품질을 예측한다.&lt;/p&gt;

&lt;p&gt;본 연구에서는 baLSTM(basic LSTM), adLSTM(advanced LSTM) 두 가지 타입의 LSTM을 사용하였다. 두 서브 섹션에서는 해당 네트워크 타입의 입출력 간 관계를 상세히 설명한다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;B. Basic LSTM Network (baLSTM)&lt;/strong&gt;&lt;br /&gt;
&lt;img src=&quot;https://github.com/user-attachments/assets/704518e6-01da-4735-b2be-7e2fc5382014&quot; alt=&quot;baLSTM network&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C. Advanced LSTM Network (adLSTM)&lt;/strong&gt;&lt;br /&gt;
&lt;img src=&quot;https://github.com/user-attachments/assets/26d3d244-c3dc-4b7c-840d-7fd2fa087e95&quot; alt=&quot;adLSTM Network&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Overall quality는 impairment event 간의 시간적 관계에 크게 의존한다 [27]. 따라서 시간적 관계의 학습 능력을 향상시키기 위해 양방향과 어텐션 메커니즘을 적용하였다.&lt;/p&gt;

&lt;p&gt;전방향 레이어로만 구성된 baLSTM과 달리, 양방향 LSTM은 그림과 같이 전방 레이어와 후방 레이어 모두 포함한다.&lt;/p&gt;

&lt;p&gt;이를 통해 현재 이벤트가 과거 및 미래 이벤트와 관련하여 미치는 영향을 파악할 수 있다.&lt;/p&gt;

&lt;p&gt;어텐션 메커니즘과 관련하여 히든 스테이트의 가중치를 계산하여 어텐션이 높은 주요 이벤트를 결정하는 것이 중요하다.&lt;/p&gt;

&lt;hr /&gt;
&lt;h3 id=&quot;notes-2&quot;&gt;Notes&lt;/h3&gt;

&lt;p&gt;adLSTM에서 어텐션 적용한 걸 보니, 막연하지만 바다나우 어텐션 등 어텐션, LLM 쪽 시도해봐도 괜찮을듯&lt;/p&gt;

&lt;hr /&gt;
&lt;h2 id=&quot;iii-input-features&quot;&gt;&lt;strong&gt;III. Input Features&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;본 섹션에서는 complex option과 simple option feature set 두 가지의 입력 옵션을 제안한다.&lt;/p&gt;

&lt;p&gt;각 옵션에서 features는 Stalling Duration, Padding, quality variations 세 가지 그룹으로 구분할 수 있다.&lt;/p&gt;

&lt;p&gt;Stalling Duration과 Padding의 features는 각 옵션에서 동일하다. Stalling Duration feature를 사용하는 것의 목적은 스트리밍 세션에서 발생하는 Stalling event의 영향에 있다.&lt;/p&gt;

&lt;p&gt;Padding feature는 LSTM 네트워크의 학습 과정에서 모든 세션이 같은 길이를 가질 수 있도록 한다.&lt;/p&gt;

&lt;p&gt;반면에 각 옵션에서 quality variations의 영향을 반영하기 위해서는 상이한 두 가지 feature sets을 고려하여야 한다.&lt;/p&gt;

&lt;p&gt;특히 complex option은 Segment Quality와 Content Characteristics의 두 가지 feature가 모두 포함되어 있으며, 이를 얻는 데에 많은 비용이 들 수 있다.&lt;/p&gt;

&lt;p&gt;Bitstream-level parameter에 기반하는 simple option에서의 features는 이들을 쉽게 추출할 수 있다.&lt;/p&gt;

&lt;p&gt;features에 대한 설명은 아래와 같다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A. Complex Input Option&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;각 세그먼트는 여러 features로 표현된다. 첫 번째 옵션은 Segment Quality, Content Characteristics, Stalling Duration, Padding 네 가지 feature로 구성된다.&lt;/p&gt;

&lt;p&gt;1) Segment Quality&lt;br /&gt;
  &lt;img src=&quot;https://github.com/user-attachments/assets/d5a26fb9-9177-417e-8d3a-8eb837eed199&quot; alt=&quot;Metircs Used to Represent the Segment Quality Feature&quot; /&gt;
  Segment Quality feature는 다양한 quality 메트릭으로 표현될 수 있다. 본 연구에서는 S-MOS, Bitrate, PSNR, PSNR-HVS, PSNR-HVS-M, SSIM, MS-SSIM, VIF 8가지 메트릭을 고려하였다.&lt;br /&gt;
  이 메트릭 중 S-MOS, PSNR-HVS, PSNR-HVS-M, SSIM, MS-SSIM, VIF 여섯 가지 메트릭만이 인간의 시각 시스템 특성을 고려한다.&lt;br /&gt;
  일부 quality 메트릭은 측정하기 쉬운 반면, S-MOS는 이를 얻는 데에 시간이 매우 많이 든다.&lt;/p&gt;

&lt;p&gt;2) Content Characteristics&lt;br /&gt;
  비디오의 품질이 컨텐츠 특성에 영향을 받는다는 것은 잘 알려져 있다.&lt;br /&gt;
  [35]와 유사하게, 제안된 접근법에서는 Content Characteristics은 spatial complexity, temporal complexity로 두 가지 차원을 모두 고려하였다.&lt;br /&gt;
  각 세그먼트의 spatial complexity를 표현하기 위해 SV(Spatial Variance) 메트릭을 사용하였다. 이 메트릭은 MPEG-7 edge histogram algorithm으로부터 계산되었다.&lt;br /&gt;
  특수적으로, 세그먼트의 각 프레임은 우선적으로 4x4의 서브 블록으로 나누어졌으며, 이후 각 블록에서 수직, 수평, 45도, 135도, non-direction 다섯 가지 엣지 유형의 히스토그램이 계산되었다.&lt;br /&gt;
  각 세그먼트의 temporal complexity를 표현하기 위해 모션 벡터로부터 계산된 두 가지 메트릭이 사용되었다.&lt;br /&gt;
  첫 번째 메트릭은 MMM(모션 벡터 크기의 평균)이다.&lt;br /&gt;
  두 번째 메트릭은 SMM(모션 벡터 크기의 표준 편차)이다.&lt;br /&gt;
  세 메트릭 모두 독립적이기에 모두 LSTM에 입력하였다.&lt;/p&gt;

&lt;p&gt;3) Stalling Duration&lt;br /&gt;
  세그먼트의 Stalling Duration feature는 사용자가 이전 세그먼트가 끝난 후 현재 세그먼트가 시작될 때까지 기다려야 하는 시간으로 표현된다.&lt;br /&gt;
  현재 세그먼트가 이전 세그먼트의 재생이 끝나기 전에 클라이언트에 도착하면 Stalling Duration은 0으로 설정된다.&lt;br /&gt;
  반면에, Stalling event가 발생하면, Stalling Duration은 양수 값이 된다. Stalling event는 SD가 0보다 큰 세그먼트의 수이다.&lt;/p&gt;

&lt;p&gt;4) Padding&lt;br /&gt;
  스트리밍 세션은 보통 서로 다른 길이를 가진다. 학습에 제로 패딩 기법을 적용하는 것은 세션이 같은 길이를 가지도록 한다.&lt;br /&gt;
  padded segment라 하는 일부 세그먼트가 모든 세션의 시작에 추가되어 가장 긴 세션의 길이와 같은 길이를 가진다.&lt;br /&gt;
  패딩된 세그먼트와 실제 세그먼트를 구분하기 위해, 1과 0으로 불린 변수 PS를 정의했다.&lt;br /&gt;
  모든 padded 세그먼트는 Segment Quality, Content Characteristics, Stalling Duration과 같은 features값을 0으로 가진다.&lt;br /&gt;
  제안된 접근법의 성능에 패딩이 미치는 영향을 조사하기 위해 네 가지 상이한 패딩 케이스에 대해 VI-B 섹션에서 평가하였다.&lt;br /&gt;
  &lt;img src=&quot;https://github.com/user-attachments/assets/a9befd37-fe6c-405a-b24e-a3270b09113b&quot; alt=&quot;An example of a streaming session&quot; /&gt;
  그림 6은 스트리밍 세션의 정규화된 feature 값과 해당 대역폭 추적을 나타낸다. 처음 14개 세그먼트가 패딩된 세그먼트(PS=1)임을 알 수 있다.&lt;br /&gt;
  나머지는 실제 세그먼트로, 대역폭 변동으로 인해 스트리밍 세션 중에 세그먼트 품질이 달라진다.&lt;br /&gt;
  일반적으로 세그먼트 품질은 대역폭이 증가함에 따라 향상되며, 반대 역시 마찬가지이다. 이 세션에서는 SD&amp;gt;0인 27, 39, 39번째 세그먼트에서 Stalling event가 발생한다.&lt;br /&gt;
  SV 값이 안정적이기에 이 세션에서는 Spatial Complexity에는 큰 변화가 없다. 한편, MMM, SMM 값을 보아 Temporal Complexity는 크게 변화한다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;B. Simple Input Option&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;실제로 Segment Quality와 Content characteristics feature는 얻는 데에 시간이 많이 걸리고, 저장하는 데에 자원이 많이 소모되어 일반적으로 많은 비용이 든다.&lt;/p&gt;

&lt;p&gt;따라서 더 간단하고 실제로 직접 사용할 수 있는 또 다른 옵션인 Simple Input Option을 추가로 제안한다. 이 옵션은 아래의 features를 포함한다.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Bitstream-level parameters&lt;/li&gt;
  &lt;li&gt;Stalling duration&lt;/li&gt;
  &lt;li&gt;Padding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;여기서 Stalling Duration과 Padding features는 complex option과 동일하다. Bitstream-level parameter는 양자화 매개변수(QP), Bitrate, 해상도, frame-rate를 포함한다.&lt;/p&gt;

&lt;p&gt;QP는 세그먼트 내 모든 프레임의 모든 매크로 블록에 대한 양자화된 파라미터 값의 평균으로 계산된다. 나머지는 세그먼트의 Bitrate, 해상도, frame-rate이다.&lt;/p&gt;

&lt;p&gt;이 파라미터들은 매우 기본적이고 비디오 비트스트림으로부터 쉽게 추출할 수 있다.&lt;/p&gt;

&lt;p&gt;이중 Bitrate는 complex option에서도 quality 메트릭으로 선택할 수 있다.&lt;/p&gt;

&lt;p&gt;섹션 V에서 최고의 세그먼트 품질 선택과, 상이한 features 중 더 좋은 선택이 무엇인지를 중심으로 각 input 옵션의 성능을 평가하였다.&lt;/p&gt;

&lt;hr /&gt;
&lt;h3 id=&quot;notes-3&quot;&gt;Notes&lt;/h3&gt;

&lt;p&gt;Input Features Set option&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Complex option
    &lt;ul&gt;
      &lt;li&gt;Stalling Duration&lt;br /&gt;
이전 세그먼트가 끝난 후 현재 세그먼트가 시작될 때까지 기다려야 하는 시간으로 표현&lt;br /&gt;
playback deadline을 넘기지 않으면 0, 아니면 해당 시간으로 설정됨. =&amp;gt; Stalling event는 SD가 0보다 큰 세그먼트의 수&lt;/li&gt;
      &lt;li&gt;Padding&lt;br /&gt;
학습 단계에서 각 세션이 같은 길이를 가지도록하기 위함.&lt;br /&gt;
padded segment가 모든 세션의 시작에 추가되어 가장 긴 세션의 길이와 같은 길이를 가지도록 함.&lt;br /&gt;
본 논문에서는 패딩된 세그먼트와 실제 세그먼트의 구분을 위해 1과 0으로 불린 변수 PS를 정의함.&lt;br /&gt;
패딩된 세그먼트는 다른 features에 대해 0의 값을 가짐.&lt;/li&gt;
      &lt;li&gt;Segment Quality
        &lt;ul&gt;
          &lt;li&gt;Metric: S-MOS, Bitrate, PSNR, PSNR-HVS, PSNR-HVS-M, SSIM, MS-SSIM, VIF&lt;br /&gt;
S-MOS, PSNR-HVS, PSNR-HVS-M, SSIM, MS-SSIM, VIF 여섯 가지 메트릭만이 인간의 시각 시스템 특성을 고려  &lt;br /&gt;
S-MOS는 얻기에 시간이 많이 걸림.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;Content Characteristics
        &lt;ul&gt;
          &lt;li&gt;Metric&lt;br /&gt;
Spatial Complexity: SV(Spatial Variance)&lt;br /&gt;
MPEG-7 edge histogram algorithm, 세그먼트의 각 프레임을 4x4 서브 블록으로 나눈 후 수직, 수평, 45도, 135도, non-direction 다섯 가지 엣지 유형 히스토그램을 계산&lt;br /&gt;
Temporal Complexity: MMM(Mean Motion vector Magnitude), SMM(Standard Deviation Motion vector Magnitude)
SV, MMM, SMM 모두 LSTM에 입력으로 사용&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Simple option&lt;br /&gt;
&lt;strong&gt;Motivation: Segment Quality와 Content Characteristics의 feature는 얻는 데에 시간이 많이 걸리고, 저장 자원이 많이 소모됨.&lt;/strong&gt;&lt;br /&gt;
=&amp;gt; Simple Input Option 제안
    &lt;ul&gt;
      &lt;li&gt;Features
        &lt;ul&gt;
          &lt;li&gt;Stalling Duration&lt;/li&gt;
          &lt;li&gt;Padding&lt;/li&gt;
          &lt;li&gt;Bitstream-level Parameters&lt;br /&gt;
QP(Quatization Prameters), Bitrate, resolution, frame-rate&lt;br /&gt;
QP는 세그먼트 내 모든 프레임의 모든 매크로 블록에 대한 양자화된 파라미터 값의 평균으로 계산, 나머지는 세그먼트의 각 값임.&lt;br /&gt;
비디오 비트스틺으로부터 쉽게 구할 수 있음. Bitrate는 complex option에서 quality 메트릭으로도 선택 가능함.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;
&lt;h2 id=&quot;iv-datasets-and-experiment-settings&quot;&gt;&lt;strong&gt;IV. Datasets and Experiment Settings&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;본 섹션에서 데이터셋 생성에 대해 설명한다. 이후 제안된 접근법의 학습 파라미터, 입력 feature 예시, 연구에서 사용된 성능 평가 메트릭과 같은 실험 환경을 제시한다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A. Dataset&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;학습 데이터 부족 문제를 해결하기 위해 본 연구에 사용된 데이터셋은 세 개의 데이터 셋을 결합하였다. 첫번째, 두번째 데이터셋은 [11], [37]의 이전 작업에서 가져왔다. 나머지 데이터셋은 이와 동일한 절차를 사용하여 주관적 테스트를 수행하여 새로 생성하였다.&lt;/p&gt;

&lt;p&gt;세번째 데이터셋에서는 앞선 데이터셋과는 다른 세션 총 144개가, 1분 길이 비디오에서 생성된다.&lt;/p&gt;

&lt;p&gt;세션 생성을 위해 개별 비디오를 1초 길이의 세그먼트로 나누고 frame-rate 24 fps로 H.264/AVC(libx64)를 사용하여 인코딩한다. 이후 각 비디오마다 42개의 수작업 세션과 30개의 실제 스트리밍 세션으로 구성된 72개의 세션이 생성된다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/14599068-282f-4e00-a227-cb24ee9f2991&quot; alt=&quot;Settings of Hand-Crafted Sessions for the Newly Created Dataset&quot; /&gt;&lt;/p&gt;

&lt;p&gt;테이블 2는 수제작된 세션의 설정을 보인다.&lt;/p&gt;

&lt;p&gt;Quality variations와 Stalling event가 없는 #1-#5, 10개의 세그먼트와 Stalling event는 없고, 주기적인 Quality variations은 있는 #6-#15, 0.25초, 0.5초, 1초, 2초, 3초, 4초의 Stalling event가 있고 Quality variations은 없는 #16-#42로 구성된다.&lt;/p&gt;

&lt;p&gt;이러한 세션 생성을 위해 각 세그먼트는 표 2a에 나와 있는 QP와 해상도를 가진 5가지 버전으로 인코딩 된다. 또한 세션 #16-#42에는 Stalling event가 정기적으로 들어간다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/f797a699-5680-4857-9266-cea6800f17ea&quot; alt=&quot;Settings of Versions Used to Generate Real Streaming Sessions for the Newly Created Dataset&quot; /&gt;&lt;/p&gt;

&lt;p&gt;실제 스트리밍 세션과 관련하여 각 세그먼트는 표3과 같이 서로 다른 QP 값과 해상도에 해당하는 10개의 버전으로 인코딩된다.&lt;/p&gt;

&lt;p&gt;세그먼트 버전의 결정을 위해 [38], [39] 두 가지의 adaptation 방법을 사용하였다.&lt;/p&gt;

&lt;p&gt;해당 adaptation 방법은 모바일 네트워크로의 대역폭 추적을 사용하여 스트리밍 테스트 베드에서 실행된다.&lt;/p&gt;

&lt;p&gt;실제 스트리밍 세션은 Quality variations와 Stalling event로 구성된다.&lt;/p&gt;

&lt;p&gt;테스트 조건은 Recommendation ITU-T P.913에 따라 설계되었다. 피험자의 피로를 최소화하기 위해 주관식 테스트는 서로 다른 날에 실시되는 네부분으로 나뉘어 진행되었다.&lt;/p&gt;

&lt;p&gt;각 파트의 소요 시간은 약 50분이며, 20분마다 10분의 휴식을 제공하였다. 각 피험자는 최대 두 개의 테스트 파트에 참여한다.&lt;/p&gt;

&lt;p&gt;실제 주관식 테스트를 하기 전에 피험자들은 평가 절차와 비디오 품질 점수 범위에 익숙해지도록 교육을 받는다. 세션은 14인치 화면과 검은색 배경에 무작위로 표시된다. 각 세션이 끝나면 피험자는 1점(최악)에서 5점(최고)까지의 점수 범위로 평가를 시행한다.&lt;/p&gt;

&lt;p&gt;주관식 시험에는 18세에서 41세 사이의 총 53명의 피험자가 참여하였으며, 테스트의 총 시간은 약 78시간이 소요되었다. 테스트 결과에 대한 분석은 Recommendation ITU-T P.913에 따라 수행되었으며, 두 명의 피험자는 불합격 처리하였다.&lt;/p&gt;

&lt;p&gt;거부된 피험자의 점수를 제거한 후, 각 세션은 21명의 유효한 피험자에 의해 평가되었다. 각 세션의 주관적인 Overall quality 값은 유효한 피험자의 평균 점수로 계산하였다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;B. Training Parameters and Cases of Input Features&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;제안된 접근법의 예측 성능을 평가하기 위해서 데이터셋은 412개의 세션으로 구성된 학습 세트와 나머지 103개의 세션으로 구성된 테스트 세트로 랜덤 스플릿하였다. 이 분할을 100회 반복하여 100쌍의 학습 및 테스트 세트가 생성되었다. 다음 섹션에 제시된 결과는 100쌍의 학습 및 테스트 세트에 대한 평균값이다.&lt;/p&gt;

&lt;p&gt;학습 과정에서 손실함수는 예측된 품질 값과 주관적 품질 값 사이의 RMSE로 계산하였으며, Adam 옵티마이저 기반의 배치 경사 하강 방식을 사용하였다.&lt;/p&gt;

&lt;p&gt;Adam 옵티마이저의 파라미터는 β1 = 0.9, β2 = 0.999, ϵ = 1e-08, 학습률 0.01로 설정하였다. 500-7000까지의 상이한 에포크들을 500 스텝마다 테스트 하였다. LSTM의 히든 유닛은 d ∈ {1,3,5} 세 가지 값으로 설정하였다.&lt;/p&gt;

&lt;p&gt;제안된 접근법에서 features의 역할을 조사하기 위해 첫 번째 옵션인 Complex option에서의 입력 features를 네 가지 경우로 고려하였다.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Full&lt;br /&gt;
Segment Quality, Content Chracteristics, Stalling Duration, Padding&lt;/li&gt;
  &lt;li&gt;w/oCC&lt;br /&gt;
Segment Quality, Stalling Duration, Padding&lt;/li&gt;
  &lt;li&gt;w/oSQ&lt;br /&gt;
Content Chracteristics, Stalling Duration, Padding&lt;/li&gt;
  &lt;li&gt;w/oSD&lt;br /&gt;
Segment Quality, Content Chracteristics, Padding&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;이전 [21]의 연구에서는 스위칭 빈도, 즉 세그먼트 품질 스위칭의 수를 조사하여 스트리밍 세션의 Overall quality를 예측하는 데에 사용하였다.&lt;/p&gt;

&lt;p&gt;본 조사에서는 complex 옵션의 네 가지 features 외 스위칭 빈도 feature를 추가적으로 고려하는 확장 옵션 exi1(Extended Complex Option)을 조사하였다.&lt;/p&gt;

&lt;p&gt;세그먼트의 스위칭 빈도 feature는 세션 시작 이후 현재 세그먼트까지 누적된 세그먼트 품질 스위치 횟수로 표시된다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C. Evaluation Metrics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;성능 평가 메트릭으로는 100개의 테스트 세트에 대해 평균을 낸 PCC(Pearson Correlation Coefficient), RMSE(Root Mean Square Error), SROCC(Spearman rank-order correlation coefficient)를 사용한다.&lt;/p&gt;

&lt;p&gt;PCC, RMSE, SROCC는 각각 접근법에서 예측된 Overall quality 값과 주관적 테스트에서 얻은 주관적 Overall quality 값 간의 선형 관계, 차이 및 순위 상관관계를 측정하는 데에 사용된다.&lt;/p&gt;

&lt;p&gt;PCC가 높을 수록, RMSE가 낮을 수록, SROCC가 높을 수록 예측 성능이 더 좋음을 의미한다. 표 IV,V,VI,VII에서 PCC(↑), RMSE(↓), SROCC(↑)로 표기되어 있습니다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;v-analysis-of-the-input-feature-options&quot;&gt;&lt;strong&gt;V. Analysis of the Input Feature Options&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A. Performance of the Complex Option I1&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;본 서브섹션에서는 complex option I1에서 features, 특히 Content Characteristics 및 가장 좋은 Segment Quality 측정 메트릭의 이점이 미치는 영향을 조사할 예정이다.&lt;/p&gt;

&lt;p&gt;이를 위해 앞선 네 가지 입력 feature 케이스를 평가한다. 여기서는 adLSTM을 사용하고 에포크는 500~7000, 히든 유닛은 5로 설정한다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/15a02c4a-dd2f-425c-93a7-ffe8fd8fbb86&quot; alt=&quot;PCC values averaged over the 100 sets for the Full case using the diffrent quality metrics of the option I1 and the adLSTM network&quot; /&gt;&lt;/p&gt;

&lt;p&gt;그림 9는 여러 품질 메트릭을 사용하여 Full 케이스에서 100개의 테스트 세트에 대해 평균을 낸 PCC 값을 보인다. S-MOS가 일관되게 가장 높은 PCC 값을 나타내는 것을 볼 수 있다. 이는 S-MOS가 Segment Quality feature를 나타내는 가장 좋은 지표임을 보인다.&lt;/p&gt;

&lt;p&gt;PSNR은 단순한 측정 항목임에도, PCC 값은 S-MOS보다 약간 낮다는 것이다. 특히 가장 높은 PCC 값을 보인 PSNR의 경우 0.942(epochs=4000), S-MOS의 경우 0.966(epochs=1500)이었다.&lt;/p&gt;

&lt;p&gt;또한 PSNR-variants 및 VIF에 해당하는 PCC 값도 S-MOS에 비해 약간 낮았다. 따라서 Content Characteristics이 포함된 경우 Segment Quality feature를 표현하기 위해 S-MOS 대신 PSNR, PSNR-variant, VIF를 사용하여도 무방하다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/c6417e22-f64f-4bf0-8c6a-150d13de5259&quot; alt=&quot;Best performance of the proposed approach using the adLSTM network for the Full and w/oCC cases of the option I1 over the test sets&quot; /&gt;&lt;/p&gt;

&lt;p&gt;그림 11은 서로 다른 Segment Quality 메트릭을 사용할 때 테스트 세트에 대한 Full 케이스, w/oCC 케이스의 최고 성능을 비교한 것이다.&lt;/p&gt;

&lt;p&gt;S-MOS를 제외한 모든 지표에서 Full 케이스가 w/oCC 케이스에 비해 훨씬 더 높은 성능을 보이는 것을 확인할 수 있다. 가장 큰 성능 차이는 PSNR과 VIF에서 보였다.&lt;/p&gt;

&lt;p&gt;한편, S-MOS를 사용할 경우에 Full 케이스와 w/oCC 케이스의 성능이 비슷한데, 이는 Segment Quality feature를 표현하기 위해 S-MOS를 사용할 때에는 Content Characteristics feature를 추가로 사용해도 큰 개선이 없음을 의미한다. 반면, BR, PSNR, PSNR-variant, SSIM, MS-SSIM, VIF 메트릭에서는 Content Characteristics을 고려하는 것이 유리하다.&lt;/p&gt;

&lt;p&gt;PSNR, PSNR-HVS, PSNR-HVS-M 세 가지 메트릭 중 w/oCC 케이스와 비교한 Full 케이스에서의 이득은 PSNR에서 가장 크고 PSNR-HVS-M이 가장 작았다. 이는 인간의 시각 시스템을 추가로 고려하는 PSNR-variants가 기존 PSNR보다 Content Characteristics에 덜 의존한다는 것을 나타낸다. SSIM과 그 변형인 MS-SSIM에서도 비슷한 결론을 찾을 수 있었다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/8272b2c7-5601-43a8-93c2-1bd958722a07&quot; alt=&quot;Best Performance of the Proposed Approach for the Difference Input Cases of Full, w/oSD, w/oSQ, and exI1 Using S-MOS and the adLSTM Network for the Test Sets.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;표 4는 Full, w/oSD, w/oSQ 및 exI1의 다양한 입력 케이스에 대한 제안된 접근법의 최고 성능을 보여준다.&lt;/p&gt;

&lt;p&gt;Stalling Duration feature와 Segment Quality feature를 입력에서 제외하면 제안한 접근법의 성능이 크게 저하되는 것을 볼 수 있다.&lt;/p&gt;

&lt;p&gt;특히 Stalling Duration feature를 고려하지 않은 케이스(w/oSD)에서는 PCC와 SROCC 값이 0.966에서 0.838, 0.965에서 0.820으로 떨어지는 반면 RMSE값은 0.248에서 0.518로 증가하는 것을 볼 수 있다. 이는 Stalling event가 세션의 Overall quality에 상당한 영향을 미친다는 것을 나타낸다.&lt;/p&gt;

&lt;p&gt;w/oSD의 경우와 비교하여 w/oSQ의 경우 PCC 값은 훨씬 낮고(0.734-0.518), SROCC 값은 현저히 낮다(0.584-0.820). 이는 제안된 접근법에서 Segment Quality feature가 Stalling Duration feature보다 더 중요한 역할을 한다는 것을 의미한다.&lt;/p&gt;

&lt;p&gt;또한 스위칭 빈도 feature를 추가하면 제안한 접근법의 성능을 향상시킬 수 있는지 여부를 조사한다. 표 4에서 실제로 스위칭 빈도 feature가 큰 성능 향상을 가져올 수 없음을 보였다. 심지어 성능이 약소하게 저하되는 결과를 보였다.&lt;/p&gt;

&lt;p&gt;특히 PCC, RMSE, SROCC 값은 Full 케이스에서 각각 0.966, 0.248, 0.965이고, exI1 옵션의 경우 0.963, 0.257, 0.963이다. 이는 스위칭 빈도 feature가 스위칭의 폭이 미치는 영향을 구분할 수 없다는 사실로 설명할 수 있다[37]. 따라서 스위칭 빈도가 Overall quality에 미치는 영향이 무시할 수 있는 수준이며, 이는 [42]의 결과와 일치한다.&lt;/p&gt;

&lt;p&gt;논문의 이후 부분에서는 complex option I1에 최고의 성능을 보인 S-MOS를 사용하였다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;B. Comparison of Input Options&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;본 하위 섹션에서는 Simple option(I2), Complex option(I1), I1과 I2를 조합한 옵션의 성능 비교를 보인다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/b0ca28f9-7abb-484f-bde8-38c15738aef3&quot; alt=&quot;Prediction performance of the proposed approach using the simple, the complex, and the combination options&quot; /&gt;&lt;/p&gt;

&lt;p&gt;그림 10은 각 옵션에 대해 adLSTM을 사용하여 얻은 결과이다.&lt;/p&gt;

&lt;p&gt;Complex 및 조합 옵션에서는 Full 케이스와 S-MOS 품질 메트릭이 사용된다. 그림 10에서 complex 옵션과 조합 오션의 성능이 테스트 세트에서 동일하다는 것을 알 수 있다.&lt;/p&gt;

&lt;p&gt;따라서 simple 옵션의 feature를 추가로 사용한다고 하여 성능이 크게 향상되지는 않는다. 즉, I1, I2 옵션의 조합은 중복됨을 의미한다.&lt;/p&gt;

&lt;p&gt;또한 simple 옵션 I2의 성능이 매우 높게 나타난 것도 눈여겨 볼만 하다.&lt;/p&gt;

&lt;p&gt;특히 에포크 수가 3500개일 때 PCC=0.963, RMSE=0.259, SROCC=0.963으로 최고 성능에 도달하는 것을 확인할 수 있다. 에포크 수가 3500개 이상으로 증가하면 학습 성능은 약소하게 증가하지만 테스트 성능도 감소한다.&lt;/p&gt;

&lt;p&gt;1500개 이상의 높은 에포크에서는 simple 옵션과 복합 옵션의 성능이 매우 비슷하게 나타났다. 구체적으로 에포크 수가 1500개로 최고 성능 부근일 때 복합 옵션은 PCC, RMSE, SROCC에서 각 0.005, 0.017, 0.004의 이득을 보였다.&lt;/p&gt;

&lt;p&gt;simple 옵션이 높은 성능을 보이면서도 복잡성에 있어 유리하기에 simple 옵션 I2가 효율적이고 효과적이라 할 수 있다.&lt;/p&gt;

&lt;p&gt;또한 이는 Bitstream-level parameter가 Segment Quality와 Content Characteristics을 대체할 수 있음을 시사한다.&lt;/p&gt;

&lt;p&gt;입력 옵션에 대한 심층적인 이해를 위해 LSTM 대신 단순 회귀 모델인 SVR을 사용하여 비교를 수행하였다.&lt;/p&gt;

&lt;p&gt;결과는 표 5에서 확인할 수 있으며, 비슷한 결론을 도출할 수 있었다. 특히, complex 옵션 I1(Full case)와 조합 옵션의 성능이 비슷하고, 둘 다 simple 옵션 I2보다 약간의 높은 성능만을 보였다.&lt;/p&gt;

&lt;p&gt;또한 w/oSQ, w/oSD의 경우 Full 케이스에 비해 성능이 상당히 낮게 나타난 것에서 Segment Quality와 Stalling Duration feature의 중요한 역할이 다시 한 번 확인할 수 있었다.&lt;/p&gt;

&lt;p&gt;입력 옵션에 대한 자세한 이야기는 섹션 VIII에서 다룬다.&lt;/p&gt;

&lt;hr /&gt;
&lt;h3 id=&quot;notes-4&quot;&gt;Notes&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A. Performance of the Complex Option I1&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Full 케이스에서 100개의 테스트 세트에 대한 PCC 값 비교에서 S-MOS가 가장 좋은 결과를 보임으로, S-MOS가 Segment Quality feature를 가장 잘 나타내는 지표임&lt;/p&gt;

&lt;p&gt;PSNR은 단순하지만 S-MOS 다음으로 좋음.&lt;/p&gt;

&lt;p&gt;w/oCC가 아닌 Content Characteristics를 포함하는 경우에는 S-MOS 대신 PSNR, PSNR-variant, VIF를 사용해도 좋음.&lt;/p&gt;

&lt;p&gt;S-MOS를 제외한 모든 메트릭에서 Full이 w/oCC보다 좋은 성능을 보였음. PSNR, VIF에서 가장 크게 나타남.&lt;/p&gt;

&lt;p&gt;S-MOS를 사용하는 경우 Full과 w/oCC가 비슷한 성능을 보임. 즉, S-MOS에는 Content Characteristics를 반영하는 게 그닥 의미가 없음. 
BR, PSNR, PSNR-variant, SSIM, MS-SSIM, VIF 메트릭 쓸 때는 반영하는 것이 좋음.&lt;/p&gt;

&lt;p&gt;인간의 시각 시스템을 고려하는 메트릭인 PSNR-variant, MS-SSIM이 그 원형보다 Content Characteristics에 덜 영향을 받음. “애초에 사람의 눈은 컨텐츠 특성을 고려하니까”&lt;/p&gt;

&lt;p&gt;w/oSD-Full 비교를 통해서 Stalling event가 Overall quality에 미치는 영향이 큼을 알 수 있음.&lt;/p&gt;

&lt;p&gt;w/oSD-w/oSQ 비교를 통해서 Segment Quality가 Stalling Duration보다 더 중요함을 알 수 있음.&lt;/p&gt;

&lt;p&gt;스위칭 빈도 feature를 추가하여도 단순 발생 횟수 비교이기 때문에 스위칭의 폭을 반영하지 못해[37] 성능은 저하됨. 
스위칭의 빈도가 Overall quality에 미치는 영향은 미미하며, 이전 연구 [42]의 결과와도 일치함.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;B. Comparison of Input Options&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I1, I2, I1+I2 옵션 비교를 통해서 simple 옵션인 I2가 성능과 복잡성 측면에서 효율적임을 보였음. 
&lt;strong&gt;이는 비트스트림 레벨의 파라미터가 Segment Quality와 Content Characteristics를 대체할 수 있음을 의미함.&lt;/strong&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;vi-analysis-of-lstm-networks&quot;&gt;&lt;strong&gt;VI. Analysis of LSTM networks&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;본 섹션에서는 입력 feature 옵션을 다르게 사용하는 두 종류의 LSTM의 성능을 평가한다. 또한, Padding manner, 에포크 수, 히든 유닛 수와 같은 LSTM 자체의 고려사항도 조사한다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A. Evaluation of baLSTM and adLSTM Networks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;본 하위 섹션에서는 complex(Segment Quality 메트릭으로 S-MOS를 사용, Full, w/oCC, w/oSD, w/oSQ 케이스 사용), simple, 조합 옵션으로 두 LSTM 타입과 baseline regression model(SVR)을 비교햐여 설명한다.&lt;/p&gt;

&lt;p&gt;히든 유닛의 수는 5로 설정된다. 섹션 5와 같이 에포크 수는 500~7000일 때 가장 좋은 성능을 보였는데, 이는 LSTM 타입뿐만 아니라 feature set 옵션에 따라 최적의 에포크 수가 달라질 수 있기 때문이다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/c66d648d-5432-4ff1-a875-2e84a51c7293&quot; alt=&quot;Best Performance of the Propsed Approach Using the adLSTM, baLSTM Networks, and SVR Model&quot; /&gt;&lt;/p&gt;

&lt;p&gt;표 5는 각 LSTM 타입과 SVR 모델에 대해 얻은 결과를 보인다.&lt;/p&gt;

&lt;p&gt;동일한 입력 옵션에서 두 LSTM 모두 SVR 모델보다 훨씬 더 높은 성능을 달성한다는 것을 알 수 있다.&lt;/p&gt;

&lt;p&gt;PCC, RMSE, SROCC의 최대 이득은 adLSTM의 경우 각각 0.201, 0.333, 0.164, baLSTM의 경우 0.248, 0.392, 0.179&lt;/p&gt;

&lt;p&gt;이 결과는 Overall quality를 예측하기 위해 세그먼트 feature를 풀링할 때 LSTM이 SVR 모델보다 훨씬 더 효과적이라는 것을 의미한다.&lt;/p&gt;

&lt;p&gt;baLSTM과 비교했을 떄, adLSTM의 성능은 일반적으로 동등하거나 더 높다. 특히 Full, w/oCC 케이스가 포함된 complex, simple, 조합 옵션의 경우 그 차이가 작다.&lt;/p&gt;

&lt;p&gt;하지만 w/oSD, w/oSQ 케이스의 complex 옵션에서는 그 차이가 컸다. adLSTM 네트워크의 이득은 baLSTM 네트워크와 비교하여 PCC의 경우 최대 0.029, RMSE의 경우 0.017, SROCC의 경우 0.033이었다.&lt;/p&gt;

&lt;p&gt;그러나 adLSTM은 후방 레이어를 추가로 포함하기 때문에 파라미터 수가 baLSTM보다 약 2배 더 많으며, 특히 학습 과정에서의 학습 파라미터 수는 baLSTM 네트워크의 경우 d(4M + 4d + 5) + 1, adLSTM 네트워크의 경우 d(8M + 8d + 9) + 1이다.&lt;/p&gt;

&lt;p&gt;따라서 입력 옵션에 무관하게 최고의 성능을 얻기 위해서는 adLSTM을 사용해야 한다. 한편, 간단한 계산의 경우 complex 옵션의 Full 케이스, 또는 simple 옵션으로 baLSTM을 사용할 수 있다.&lt;/p&gt;

&lt;p&gt;LSTM 타입에 따른 자세한 설명은 섹션 8에서 다룰 예정이며, 아래에서는 기본적으로 adLSTM을 기반으로 분석한다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;B. Impact of Padding&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;네 가지의 패딩 케이스로 제안된 접근법의 성능을 조사한다. 
1) prePadd는 섹션 3-A.4에 제시된대로 모든 세션의 시작 부분에 패딩된 세그먼트를 추가한다.
2) postPadd에서는 추가된 세그먼트가 모든 세션의 끝에 추가된다.
3) addPadd10는 가장 긴 세션의 길이에 10개의 세그먼트를 더한 길이와 같을 때까지 모든 세션의 시작 부분에 추가
4) addPadd30은 30개의 세그먼트를 추가하며 과정은 3)과 같음.&lt;/p&gt;

&lt;p&gt;테스트 세트의 여러 패딩 케이스에 해당하는 최고 성능은 표 6에 나와 있으며, 히든 유닛은 5로 설정되어 있다. 패딩 케이스 간 성능 차이는 미미한 수준이었다. 즉, 패딩된 세그먼트와 그 위치는 제안된 접근법의 성능에 큰 영향을 미치지 않는다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C. Impacts of Numbers of Epochs and Hidden Units&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/49a637a8-caf9-47e3-ba6a-9b5fbb741ee9&quot; alt=&quot;Prediction performance of the proposed approach at different numbers of epochs and numbers of hidden units using the option I1(with the Full case) and the option I2&quot; /&gt;&lt;/p&gt;

&lt;p&gt;에포크 수와 히든 유닛 수가 제안한 접근법의 성능에 미치는 영향을 조사한다. 그림 12는 옵션 I1(Full)과 옵션 I2를 사용하여 다양한 에포크 수와 히든 유닛 수에 따른 PCC, RMSE, SROCC의 값을 보인다.&lt;/p&gt;

&lt;p&gt;일반적으로 에포크 수가 증가할 수록 PCC, SROCC 값은 빠르게 증가하고, RMSE는 급격히 감소하였다. 에포크 수가 더 증가하면 이 값들은 안정화되었으며, 히든 유닛의 수가 많을 수록 빠르게 안정화되었다.&lt;/p&gt;

&lt;p&gt;특히 옵션 I1의 경우 Full 케이스에서 e ≥ 2500(d= 1), e ≥ 1500(d= 3), e ≥ 1500(d= 5) 성능이 거의 변하지 않았다. 옵션 I2의 경우 e ≥ 3000(d= 1), e ≥ 2500(d= 3), e ≥ 1500(d= 5)일 때 안정적인 상태를 나타냈다.&lt;/p&gt;

&lt;p&gt;옵션 I1의 경우 e ≥ 3500, 옵션 I2의 경우 e ≥ 5000이 되면 테스트 성능이 점차 감소했다. 이는 학습 과정이 길어지면서 과적합되기 때문이다. 이 결과는 제안된 접근법을 학습할 때 d= 5, e ∈[1500, 3500]으로 설정하면 두 옵션 모두에서 안정적이고 우수한 성능을 제공한다는 것을 시사한다.&lt;/p&gt;

&lt;hr /&gt;
&lt;h3 id=&quot;notes-5&quot;&gt;Notes&lt;/h3&gt;

&lt;p&gt;baLSTM보다 adLSTM이 더 효과적이었으며, w/oSD, w/oSQ 케이스의 complex 옵션에서 차이가 컸음. » 입력 옵션 무관하게 할 거면 adLSTM 쓰는 게 좋음.&lt;/p&gt;

&lt;p&gt;하지만, adLSTM은 후방 레이어의 존재로 인해 파라미터 수가 baLSTM보다 2배 가량 많음. » 간단한 문제에서는 complex 옵션의 Full, simple 옵션으로 baLSTM 성능도 쓸만함.&lt;/p&gt;

&lt;p&gt;패딩은 넣기만 하면 위치나 개수 등은 큰 성능 차를 만들지 않음.&lt;/p&gt;

&lt;p&gt;에포크 수를 높일 수록 메트릭 값들이 빠르게 높아지고 안정화 됨. 하지만 과적합을 고려해야 함.&lt;/p&gt;

&lt;p&gt;제안된 접근법 학습 시에는 d= 5, e ∈[1500, 3500]가 베스트.&lt;/p&gt;

&lt;hr /&gt;
&lt;h2 id=&quot;vii-comparison-with-existing-approaches&quot;&gt;&lt;strong&gt;VII. Comparison with Existing Approaches&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;본 섹션에서는 제안한 접근법의 성능을 기존 7가지 접근법 Guo’s [12], Liu’s [14], Tran’s [11], Singh’s [15], ATLAS [16], P.1203.3 [21], Eswara’s [7]와 비교한다.&lt;/p&gt;

&lt;p&gt;참조한 접근법 중 처음 세 가지(Guo’s, Liu’s, Tran’s)는 분석 모델 기반 접근법이다. 나머지(Singh’s, ATLAS, P.1203.3, Eswara’s)는 고급 머신 러닝 접근법이다.&lt;/p&gt;

&lt;p&gt;Guo’s에서는 Quality variations의 영향만 고려하는 반면 나머지 접근법은 Quality variations와 Stalling event 모두 고려한다.&lt;/p&gt;

&lt;p&gt;본 논문에서는 [18], [44]와 유사하게 각 논문을 기반으로 Guo’s, Liu’s, Tran’s, Singh’s를 구현하였다. 이는 각 구현이 공개적으로 사용 가능하지 않기 때문이다. ATLAS [&lt;a href=&quot;http://live.ece.utexas.edu/research/quality/VideoATLAS_release.zip&quot;&gt;7&lt;/a&gt;]와 Eswara’s [&lt;a href=&quot;https://github.com/lfovia/lstm_qoe&quot;&gt;16&lt;/a&gt;]의 경우 원저자가 공개한 구현을 사용하였다.&lt;/p&gt;

&lt;p&gt;Overall quality 값을 얻기 위해 Eswara의 접근법은 Instantaneous quality 값의 mean pooling 전략을 사용한다 [7].&lt;/p&gt;

&lt;p&gt;P.1203.3 접근법의 경우, 연구 목적으로 자유롭게 사용할 수 있는 &lt;a href=&quot;https://github.com/itu-p1203/itu-p1203/&quot;&gt;표준 구현&lt;/a&gt;을 사용하였다 [22], [45].&lt;/p&gt;

&lt;p&gt;Guo’s, Liu’s, Tran’s, P.1203.3, Eswara’s 접근법의 파라미터는 재학습 없이 각 논문에 명시된 값으로 설정되었다. 따라서 이러한 접근법의 성능을 평가하기 전에 ITU-T P.1401 [46], Recommendation ITU-T P.1203 [21]에 따라 1차 선형 회귀를 사용하여 각 접근법에 대해 주관적인 테스트 조건의 차이에 대한 보정을 수행한다. 기울기 및 절편은 표 7에 기되어 있다.&lt;/p&gt;

&lt;p&gt;제안된 접근법에서는 baLSTM, adLSTM이 simple, complex 옵션과 함께 사용된다. 에포크 수와 히든 유닛 수는 각각 1500, 5로 설정되었다.&lt;/p&gt;

&lt;p&gt;고급 머신 러닝 접근법인 Singh’s와 ATLAS의 성능을 평가하기 전에 제안된 접근법과 동일한 방식으로 파라미터를 재학습한다.&lt;/p&gt;

&lt;p&gt;접근법들의 성능을 비교하기 위해 세 가지 데이터 세트를 사용한다. 첫 번째 데이터 세트는 하위 섹션 4-B에 기술한 100개의 테스트 세트에 대한 PCC, RMSE, SROCC 값의 평균을 구한 데이터 세트이다.&lt;/p&gt;

&lt;p&gt;표 7의 두 번째, 세 번째, 네 번째 열은 데이터 세트를 사용하여 얻은 결과를 보인다.&lt;/p&gt;

&lt;p&gt;두 번째는 TR04라는 학습 세트와 VL04라는 테스트 세트로 구성되며, 이는 &lt;a href=&quot;https://github.com/itu-p1203/open-dataset&quot;&gt;ITU-T P.1203 standardization(P.NATS)&lt;/a&gt;에서 공개된 것이다 [22].&lt;/p&gt;

&lt;p&gt;각 세트는 1분 길이의 비디오 세 개에서 생성된 60개의 세션으로 구성된다. Singh’s 접근법과 제안된 접근법과 관련하여, 데이터 세트의 515개 세션과 TR04 세트의 60개 세션을 모두 사용하여 데이터 분할의 의존성을 피하기 위해 파라미터를 재학습 한다.&lt;/p&gt;

&lt;p&gt;또한 가중치 초기화의 영향을 고려하여 학습 과정을 100회 반복한다. 따라서 성능은 테스트 세트 VL04에 대해 평균화된다.&lt;/p&gt;

&lt;p&gt;결과는 표 7의 7, 8, 9 열에 나와 있다. 입력 데이터가 부족하기 때문에 이 데이터 세트에 대해서는 Liu’s, ATLAS, Eswara의 세 가지 접근법을 평가하지 않았다.&lt;/p&gt;

&lt;p&gt;또한 Content Characteristics feature는 공개적으로 사용할 수 없기 때문에 Full 케이스 대신 w/oCC 케이스가 포함된 옵션 I1을 평가한다.&lt;/p&gt;

&lt;p&gt;최종 데이터 세트는 WaterlooSQoE-II이며, 8초 길이의 소스 비디오 12개에서 생성된 4초 길이의 세그먼트 588개와 다양한 화질, 해상도, frame-rate의 Quality variations 패턴이 포함된 588개의 세션을 포함한다.&lt;/p&gt;

&lt;p&gt;접근법의 성능을 평가하기 위해 이 데이터 세트를 사용한 두 가지 케이스를 고려한다.&lt;/p&gt;

&lt;p&gt;첫 번째 케이스(WaterlooSQoE-II-Case#1)에서는 학습 세트로 본 논문의 데이터 세트를 사용하였고, 테스트 세트로 전체 WaterlooSQoE-II 데이터 세트를 사용하였다.&lt;/p&gt;

&lt;p&gt;두 번째 케이스(WaterlooSQoE-II-Case#2)에서는 데이터 세트 외에 학습 세트에는 WaterlooSQoE II 데이터 세트의 12개 소스 비디오 중 3개에서 생성된 147개 세션이 추가로 포함된다.&lt;/p&gt;

&lt;p&gt;다른 비디오의 나머지 441개 세션은 해당 테스트 세트를 구성한다.&lt;/p&gt;

&lt;p&gt;세 개의 학습 비디오의 선택을 100회 반복하여 100개의 서로 다른 쌍의 학습 및 테스트 세트를 생성하였다.&lt;/p&gt;

&lt;p&gt;위의 두 데이터 세트를 사용한 평가와 마찬가지로, 100회의 서로 다른 테스트 횟수에 대해 평균 PCC, RMSE, SROCC 값을 계산하여 표 7에 나타냈다.&lt;/p&gt;

&lt;p&gt;학습 세트에도 포함된 데이터 세트는 1초 길이의 세그먼트를 사용하여 구성하였으므로, WaterlooSQoE-II 데이터 세트의 각 4초 길이 세그먼트는 실험에서 1초 길이의 세그먼트 4개로 간주하였다.&lt;/p&gt;

&lt;p&gt;표 7을 통해 네 가지 데이터셋/케이스 중 WaterlooSQoE-II-Case#1을 제외한 세 가지에 대해 옵션 I1이 포함된 adLSTM 네트워크를 사용하는 제안된 접근법이 항상 다른 접근법에 비해 가장 높은 성능을 달성한다는 것을 알 수 있다.&lt;/p&gt;

&lt;p&gt;WaterlooSQoE-II-Case#1에서는 가장 높은 PCC와 가장 낮은 RMSE를 얻을 수 있었다.&lt;/p&gt;

&lt;p&gt;또한 SROCC 값은 Tran’s로 얻은 가장 높은 값보다 약간 낮았다. 따라서 본 논문의 접근법이 참조한 일곱 가지 접근법 모두를 능가함을 알 수 있다.&lt;/p&gt;

&lt;p&gt;P.1203 데이터셋과 WaterlooSQoE-II-Case#1 케이스에서 동일한 입력 옵션을 사용할 경우 baLSTM의 성능은 adLSTM과 비교하였을 때 낮았다.&lt;/p&gt;

&lt;p&gt;기존 접근법과 비교하여 WaterlooSQoE-II-Case#1을 제외한 대부분의 데이터셋/케이스에서 옵션 I1을 사용할 때 baLSTM의 성능은 상당히 높다.&lt;/p&gt;

&lt;p&gt;옵션 I2의 경우 본 논문의 데이터셋에 대한 성능도 상당히 높지만, P.1203 데이터셋의 경우 P.1203.3 접근법보다는 약간 낮았다.&lt;/p&gt;

&lt;p&gt;WaterlooSQoE-II-Case#1의 경우, 옵션 I2를 사용하면 매우 낮은 성능을 보였는데, 이는 본 논문의 학습 세트에 포함되지 않은 frame-rate의 Quality variations가 테스트 세트인 WaterlooSQoE-II 데이터 세트에 포함되기 때문이다.&lt;/p&gt;

&lt;p&gt;그러나 WaterlooSQoE-II-Case#2에서는 다양한 frame-rate의 스트리밍 세션이 학습 세트에 추가될 때 상당한 성능 향상을 보였다.&lt;/p&gt;

&lt;p&gt;옵션 I1을 사용하는 baLSTM은 WaterlooSQoE-II-Case#1을 제외한 대부분의 데이터셋/케이스에서 상당히 높은 성능을 달성하기 때문에 제안된 접근법에서도 baLSTM을 사용할 수 있다.&lt;/p&gt;

&lt;p&gt;본 논문의 접근법과 Eswara’s 접근법 모두 LSTM을 사용하지만, 제안된 접근법은 옵션 I1과 baLSTM, adLSTM을 사용하여 훨씬 높은 성능을 보였다. 이는 Eswara’s가 실제로 Instantaneous quality를 예측하기 위해 제안되어 Overall quality는 예측하지 못할 수 있기 때문이다.&lt;/p&gt;

&lt;p&gt;또한 mean pooling 전략은 Instantaneous quality를 Overall quality 값으로 집계하는 데에 효과적이지 않을 수 있다.&lt;/p&gt;

&lt;p&gt;또한 Tran’s와 P.1203.3의 성능이 상당히 우수함을 알 수 있었다. 이 결과는 이러한 접근법도 좋은 성능을 볼 수 있음을 의미한다.&lt;/p&gt;

&lt;p&gt;또 Tran’s가 Singh’s, ATLAS보다 높은 성능을 보인 것에서 일반적으로 분석 모델 기반의 접근법이 고급 머신 러닝 접근법보다 예측 성능이 낮음을 알 수 있다.&lt;/p&gt;

&lt;p&gt;이는 Quality variations와 Stalling event의 영향을 정량화하기 위해 Tran’s에 사용된 품질 스위치와 Stalling Duration의 히스토그램이 Singh’s, ATLAS에 사용된 통계보다 효과적임을 의미한다.&lt;/p&gt;

&lt;hr /&gt;
&lt;h3 id=&quot;notes-6&quot;&gt;Notes&lt;/h3&gt;

&lt;p&gt;기존 7가지 접근법과의 비교
제안된 접근법&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;baLSTM, adLSTM이 simple, complex 옵션 모두 활용, e=1500, d=5.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;분석 모델 기반&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Guo’s [12] (논문 바탕으로 직접 구현) &lt;br /&gt;
유일하게 Stalling event는 함께 고려하지 않고 Quality variations의 영향만 고려함&lt;/li&gt;
  &lt;li&gt;Liu’s [14] (논문 바탕으로 직접 구현)&lt;/li&gt;
  &lt;li&gt;Tran’s [11] (논문 바탕으로 직접 구현)&lt;br /&gt;
Singh’s, ATLAS보다 성능 좋음. 역시 고급 머신 러닝 접근법이 더 좋음.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;고급 머신러닝 기반&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Singh’s [15] (논문 바탕으로 직접 구현)&lt;/li&gt;
  &lt;li&gt;ATLAS [16] (&lt;a href=&quot;http://live.ece.utexas.edu/research/quality/VideoATLAS_release.zip&quot;&gt;오픈 소스 활용&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;P.1203.3 [21] (&lt;a href=&quot;https://github.com/itu-p1203/itu-p1203/&quot;&gt;오픈 소스 활용&lt;/a&gt;)&lt;br /&gt;
성능 좋음.&lt;/li&gt;
  &lt;li&gt;Eswara’s [7] (&lt;a href=&quot;https://github.com/lfovia/lstm_qoe&quot;&gt;오픈 소스 활용&lt;/a&gt;)  &lt;br /&gt;
Overall quality 값을 얻기 위해 Instantaneous quality 값의 mean pooling 전략을 사용함.&lt;br /&gt;
Instantaneous quality를 예측하기 위해 제안 되어서 Overall quality는 예측하지 못할 수 있어 성능 낮았음..
mean pooling 자체가 Overall quality 값 얻는 데에는 부적합할 수도 있음.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;실험 이전에 ITU-T P.1401 [46], Recommendation ITU-T P.1203 [21]에 따라 1차 선형 회귀를 사용하여 테스트 조건에 맞추어 보정하였음. 표 7에 기울기 및 절편 기술함.&lt;br /&gt;
고급 머신 러닝 접근법인 Singh’s, ATLAS와 비교하기 전에 제안된 접근법이랑 동일하게 파라미터 재학습했음. =&amp;gt; 좋은듯&lt;/p&gt;

&lt;p&gt;WaterlooSQoE-II-Case#1를 제외하고는 대부분의 상황에서 complex 옵션 사용하였을 때 baLSTM이 효과적이었음.&lt;/p&gt;

&lt;p&gt;simple 옵션 사용할 때에는 매우 낮은 성능을 보였음. =&amp;gt; WaterlooSQoE-II 데이터 세트에 있는 frame-rate의 Quality variations가 본 논문의 학습 세트에 없기 때문임.&lt;/p&gt;

&lt;p&gt;WaterlooSQoE-II-Case#2에서는 frame-rate 스트리밍 세션을 학습 세트에 추가하면 상당한 성능을 보임.&lt;/p&gt;

&lt;p&gt;=&amp;gt; complex 옵션 사용 시에는 baLSTM 사용하면 웬만하면 다 좋음.&lt;/p&gt;

&lt;hr /&gt;
&lt;h2 id=&quot;viii-discussions&quot;&gt;&lt;strong&gt;VIII. Discussions&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;위의 실험 결과에서 세그먼트, LSTM에서 수집한 feature를 입력으로 사용하면 HAS 세션의 Overall quality를 예측하는 데에 매우 효과적임이 분명히 알 수 있다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;옵션 I1에서 고려한 feature 중 Segment Quality feature의 역할이 가장 중요하며, 다음으로 Stalling Duration feature의 역할이 중요하다. Content Characteristics의 역할은 Segment Quality feature를 나타내는 데에 사용되는 메트릭에 따라 달라진다.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Segment Quality feature를 나타내기 위해 S-MOS가 가장 적합한 지표로 나타났다. 또한 PSNR 간단하지만 좋은 성능을 보였다(complex input option, Full case).&lt;/p&gt;

&lt;p&gt;Content Characteristics의 활용이 본 연구에서 새로운 부분이며, Segment Quality feature에 S-MOS 메트릭을 사용할 때 Content Characteristics feature를 추가로 사용하여도 예측 성능은 크게 향상되지 않는다.&lt;/p&gt;

&lt;p&gt;하지만, BR, PSNR, PSNR-variants, SSIM, MS-SSIM, VIF 메트릭의 경우 Content Characteristics feature를 포함하는 것이 유리했다.&lt;/p&gt;

&lt;p&gt;따라서 S-MOS 메트릭에 이미 Content Characteristics가 반영되어 있다.&lt;/p&gt;

&lt;p&gt;또 다른 이슈로는 Content Characteristics를 포함하지 않는 simple input option의 성능이 좋게 나타났다는 것이다.&lt;/p&gt;

&lt;p&gt;이는 QP, 해상도, frame-rate의 특정 값이 주어지면 Content Characteristics가 더 복잡한 동영상은 일반적으로 비트레이트가 높아지기 때문이다.&lt;/p&gt;

&lt;p&gt;즉, simple input option에 사용되는 Bitstream-level parameters, Stalling, Padding으로 구성된 simple option I2는 효율적이면서도 효과적이다.&lt;/p&gt;

&lt;p&gt;향후 연구에서는 수동으로 선택하는 feature 대신 LSTM에 효과적인 input feature를 자동으로 얻기 위한 딥러닝 접근 방식에 초점을 맞출 것이다.&lt;/p&gt;

&lt;p&gt;LSTM의 타입의 경우 adLSTM을 사용하면 baLSTM에 비해 더 높은 성능을 얻을 수 있다. adLSTM의 경우 d=5, e ∈ [1500,3500]일 때 가장 좋고 안정적인 성능을 보였다.&lt;/p&gt;

&lt;p&gt;그러나 두 모델의 성능은 상당히 비슷하게 나타났다. 또한 baLSTM의 파라미터 수는 adLSTM의 그것에 비해 절반 수준에 불과했다. 특히 baLSTM의 핵심적인 장점은 현재와 과거 세그먼트만 사용하여 처리할 수 있다는 점이다.&lt;/p&gt;

&lt;p&gt;이를 통해 세션이 끝날 때까지 기다릴 필요 없이 진행 중인 세션의 품질을 지속적으로 예측할 수 있다.&lt;/p&gt;

&lt;p&gt;또한 LSTM은 temporal dimension의 모든 변화를 고려하는 데에 도움이 될 수 있으므로, 스위칭 주파수를 feature로 추가해도 성능이 향상되지 않으며, 이는 제안된 접근법이 기존 접근법을 능가하는 주요 이유일 수 있다.&lt;/p&gt;

&lt;p&gt;이 연구에서 사용된 데이터셋에는 H.264/AVC를 사용하여 인코딩된 1초길이의 세그먼트와 4초 길이의 세그먼트가 포함된 약 1분 길이의 세션이 포함된다.&lt;/p&gt;

&lt;p&gt;실제로 서비스 프로바이더는 서로 다른 세그먼트 지속 시간과 다른 비디오 코텍을 사용할 수 있다.&lt;/p&gt;

&lt;p&gt;그러나 이러한 긴 세그먼트는 당연히 1초 길이의 여러 짧은 세그먼트로 나눌 수 있다. 이러한 방식으로 제안된 접근법은 짧은 세그먼트의 feature를 입력하여 적용할 수 있다.&lt;/p&gt;

&lt;p&gt;향후 연구에서는 다양한 세그먼트 지속 시간과 세션 길이를 사용하여 우리의 접근법을 평가할 계획이다.&lt;/p&gt;

&lt;p&gt;또한 다른 비디오 코덱을 사용하여 평가한다면, 제안된 접근법의 검증 및 개선을 시도할 수 있을 것이다.&lt;/p&gt;

&lt;p&gt;계산 복잡도와 관련하여, 우리는 주어진 세션 duration 동안 Overall quality 값을 얻기 위한 평균 시간을 측정했다. 총 1223개의 세션을 8초에서 76초 길이로 사용하였으며, 이는 위 성능 평가에 사용된 세 가지 데이터셋의 모든 세션이다.&lt;/p&gt;

&lt;p&gt;측정은 3.40GHz의 인텔 코어 i3-3240 프로세서와 8GB RAM 사양의 컴퓨터로 수행하였다.&lt;/p&gt;

&lt;p&gt;adLSTM, baLSTM에 대한 모든 input option에서 8초, 60초, 76초의 세션 길이에 각각 1.5ms, 4.5ms, 5.5ms 미만의 계산 복잡도를 보였다. 일반적으로 제안된 접근법의 계산 복잡도는 세션 duration에 따라 선형적으로 증가한다.&lt;/p&gt;

&lt;p&gt;향후 연구에서는 실시간 품질 모니터링을 위해 이 LSTM 기반 접근법의 시간 복잡도를 줄일 예정이다.&lt;/p&gt;

&lt;hr /&gt;
&lt;h3 id=&quot;notes-7&quot;&gt;Notes&lt;/h3&gt;

&lt;p&gt;Complex I1 option&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Segment Quality -&amp;gt; Stalling Duration 순으로 영향이 큼.&lt;/li&gt;
  &lt;li&gt;Content Characteristics는  Segment Quality feature의 측정 메트릭에 따라 달라짐.&lt;/li&gt;
  &lt;li&gt;Segment Quality 측정 메트릭으로는 S-MOS가 가장 적합함. &lt;br /&gt;
Full 케이스에 한해 PSNR은 간단함에도 좋은 성능을 보임.&lt;br /&gt;
S-MOS를 메트릭으로 사용하면 Content Characteristics를 feature로 추가하여도 성능 향상이 크지 않음. =&amp;gt; S-MOS가 이미 이를 포함하고 있음.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Simple I2 option&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Content Characteristics를 포함하지 않음에도 좋은 성능을 보이며, 효율적임.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;LSTM&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;adLSTM이 보다 좋은 성능을 보였으나, baLSTM도 비슷하게 좋은 성능을 보였음.&lt;/li&gt;
  &lt;li&gt;baLSTM은 파라미터 수가 절반 수준으로, 가벼움.&lt;/li&gt;
  &lt;li&gt;현재와 과거 세그먼트만으로 처리가 가능하여 세션이 끝날 때까지 기다릴 필요 없이 진행 중인 세션의 품질을 지속적으로 예측할 수 있음.&lt;/li&gt;
  &lt;li&gt;스위칭 빈도를 feature로 추가하여도 성능이 향상되지 않는 것은 LSTM이 temporal relation을 잘 반영하기 때문이며, 기존 접근법과의 성능 차이의 주요 이유임.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;복잡도&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;주어진 세션 duration 동안 Overall quality 값을 얻는 데에 소요되는 평균 시간을 측정하였음.&lt;/li&gt;
  &lt;li&gt;제안된 접근법의 모든 조건에서 세션 duration 8s, 60s, 76s에 대해 각 1.5ms, 4.5ms, 5.5ms 미만의 계산 시간을 보임.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;
&lt;h2 id=&quot;ix-conclusion&quot;&gt;&lt;strong&gt;IX. Conclusion&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;본 연구에서는 LSTM을 사용하여 HAS의 Overall quality를 예측하기 위한 새로운 머신러닝 접근법을 제안하였다.&lt;/p&gt;

&lt;p&gt;제안된 접근법은 Segment Quality, Content Characteristics, Stalling Duration, Padding과 같은 몇 가지 feature를 고려한다.&lt;/p&gt;

&lt;p&gt;실험 결과를 통해 제안된 접근법이 HAS의 Overall quality 예측에서 매우 높은 성능을 달성함을 보였다.&lt;/p&gt;

&lt;p&gt;input option과 LSTM 설정에 대한 광범위한 평가를 바탕으로 input feature의 역할, Segment Quality feature를 나타내는 최적의 메트릭, 효과적이고 효율적인 input option, 최적의 LSTM 설정 등에서 결과를 얻었다.&lt;/p&gt;

&lt;p&gt;향후 연구에서는 다양한 세그먼트 duration, 세션 길이 및 비디오 코덱을 사용하여 제안된 접근법을 평가할 계획이다. 이를 위해 새로운 데이터셋을 구축할 필요가 있으며, 제안된 접근법을 HAS를 위한 적응 전략의 성능 평가에 활용할 계획이다.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;세션은 세그먼트 시퀀스, 당연히 연속되는 세그먼트 간에 temporal한 관계가 있음.&lt;/p&gt;

&lt;p&gt;실제로 LSTM도 좋았음.. 그리고 본 논문의 adLSTM 구조를 보면, 미래 판단에 지난 과거의 정보도 사용함. 또 성능도 baLSTM보다 좋음.  &lt;br /&gt;
구조가 딱 컨텍스트를 고려하는 느낌,, 트랜스포머, 바다나우 어텐션,, 뭐 이런 것들 사용해도 좋은 성능 보이지 않을까?&lt;br /&gt;
근데, baLSTM 장점이 기존 과거와 현재만 있어 세션 진행 중에 예측이 가능하다고 하는데,, 내 생각에는 adLSTM도 똑같을 것 같은데,,&lt;br /&gt;
이 부분 조금 더 알아술 실시간성을 저해하지 않는 수준이라면, 사용할 수 있을듯.&lt;/p&gt;

&lt;p&gt;트랜스포머를 여기에 적용하되 모델 자체에 집중하기 보다는 본 논문 레퍼런스 해서 temporal한 관계가 있다.&lt;br /&gt;
그리고 같은 모티베이션에서 시작한 이 논문의 결론에서도 그렇듯 스트리밍 세션을 구성하는 세그먼트 사이에는 temporal한 관계가 있다는 것을 트랜스포머로 좋은 성능 뽑아서 이야기한다면, 모델, 인공지능 쪽보다는 네트워크 쪽으로 이야기할 수 있지 않을까 싶음.&lt;/p&gt;

&lt;p&gt;이걸로 논문 써본다면,&lt;br /&gt;
모티베이션: 세션을 구성하는 세그먼트 간의 시간적 관계가 존재함. LSTM도 좋음. 그러니 트랜스포머 써보자.&lt;br /&gt;
~&lt;br /&gt;
실제로 트랜스포머 써보니 좋더라~ 그러한 관계가 있다는 것은 분명하다.  « 단지 이걸로는 근거가 빈약한 느낌&lt;br /&gt;
일반적인 영상들은 결국 프레임 당 사진의 연속이니 당연한 거임. 이걸 비전 쪽 개념 가지고 와서 트랜스포머랑 같이 엮어서 설명하면, 좋을 것 같기도.&lt;br /&gt;
근데 이렇게 되면, 트랜지션이 잦은 영상은?&lt;br /&gt;
트랜지션 잦은 영상에도 트랜스포머가 잘 나오는지 보고, 잘 나오면, 결국 영상에서 트랜지션이 일어나는 순간은 짧고(세그먼트를 많이 먹지 않는다), 다시 사진의 연속이 된다는 쪽.&lt;br /&gt;
잘 안 나오면 그거에 맞춰서 생각해봐야할듯,,&lt;/p&gt;

&lt;p&gt;아니면, 기존에 있는 이러한 방법들을 실제로 활용하였을 때 네트워크 리소스를 많이 먹진 않는지, 실시간성에 적합한지, 등을 생각해서 테스트하고 개선하는 건 어떨지?&lt;br /&gt;
또는 LSTM 같이 성능 개선보다는 모델을 활용하되, 전체 네트워크에서 이득을 볼 수 있는 방향으로 디벨롭하는 것도 좋을듯. 보안성도 높일 수 있을듯 federated learning은 어떨지 공부해봐야 할듯&lt;/p&gt;

&lt;p&gt;이 논문도 이전 논문도 DASH 알고리즘 자체를 건드리는 게 아니라, Overall quality 예측에 한한다는 게 아쉬움,,, Overall quality 예측해서 활용하는 방향으로 가야하는 게 아닌가,,?&lt;/p&gt;

&lt;p&gt;멀티모달로 가보는 건 어떨까,,&lt;/p&gt;

&lt;hr /&gt;

&lt;blockquote&gt;
  &lt;h3 id=&quot;profile&quot;&gt;Profile&lt;/h3&gt;

  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Seong Hun KIM&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;M.S. course&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;Dept. of Computer Science Engineering | Yeungnam University, Repulic of Korea&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Convolution_Filter_Application/assets/118245330/37c81d9e-cfb8-4aee-8497-ff1071b2458b&quot; alt=&quot;yu signature&quot; /&gt;&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Phone&lt;/strong&gt; &lt;a href=&quot;tel:010-6685-1140&quot;&gt;010 - 6685 - 1140&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Mail&lt;/strong&gt; &lt;a href=&quot;mailto:tgh7544@naver.com&quot;&gt;tgh7544@naver.com&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;LinkTree&lt;/strong&gt; &lt;a href=&quot;https://linktr.ee/HoonC_corgi&quot;&gt;https://linktr.ee/HoonC_corgi&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
        <pubDate>Thu, 13 Mar 2025 00:00:00 +0000</pubDate>
        <link>https://hoonc-corgi.github.io/2025/03/13/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Overall-Quality-Prediction-for-HTTP-Adaptive-Streaming-Using-LSTM-Network.html</link>
        <guid isPermaLink="true">https://hoonc-corgi.github.io/2025/03/13/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Overall-Quality-Prediction-for-HTTP-Adaptive-Streaming-Using-LSTM-Network.html</guid>
        
        
      </item>
    
      <item>
        <title>[논문 리뷰] An LSTM-based Approach for Overall Quality Prediction in HTTP Adaptive Streaming</title>
        <description>&lt;p&gt;Index&lt;/p&gt;

&lt;!-- TOC --&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#--&quot;&gt;논문 리뷰를 시작하며&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#---&quot;&gt;한글 번역 및 코멘트&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#abstract&quot;&gt;Abstract&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#notes&quot;&gt;Notes&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#introduction&quot;&gt;Introduction&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#notes&quot;&gt;Notes&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#motivation&quot;&gt;Motivation&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#proposed-approach&quot;&gt;Proposed Approach&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#a-architecture&quot;&gt;A. Architecture&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#notes&quot;&gt;Notes&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#b-segment-features&quot;&gt;B. Segment Features&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#notes&quot;&gt;Notes&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#evaluation&quot;&gt;Evaluation&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#a-experiment-settings&quot;&gt;A. Experiment Settings&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#1--dataset&quot;&gt;1) Dataset&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#2--training-parameters&quot;&gt;2) Training Parameters&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#3--input-features&quot;&gt;3) Input Features&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#4--evaluation-metircs&quot;&gt;4) Evaluation Metircs&lt;/a&gt;
                &lt;ul&gt;
                  &lt;li&gt;&lt;a href=&quot;#notes&quot;&gt;Notes&lt;/a&gt;&lt;/li&gt;
                &lt;/ul&gt;
              &lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#b-roles-of-segment-features&quot;&gt;B. Roles of Segment Features&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#notes&quot;&gt;Notes&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#c-comparison-with-existing-approaches&quot;&gt;C. Comparison with Existing Approaches&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#notes&quot;&gt;Notes&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#conclusion&quot;&gt;Conclusion&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#notes&quot;&gt;Notes&lt;/a&gt;
&lt;!-- TOC --&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;논문-리뷰를-시작하며&quot;&gt;논문 리뷰를 시작하며&lt;/h1&gt;

&lt;p&gt;연구실에서 진행하는 논문 세미나를 위한 논문 지정을 위해 여러 논문의 Abstract를 훑어 보던 시기에 교수님과의 면담에서 하나의 논문을 읽더라도 
제대로 읽어 보고 이해할 필요가 있다는 조언에 따라 훑어 보았던 여러 논문 중 가장 관심이 갔던 논문을 처음부터 읽어 보았다.&lt;br /&gt;
이제부터는 단순히 논문 세미나 준비를 위한 읽기가 아닌, 올해 목표인 국내 논문 투고를 성취하기 위해서 연구 주제 선정을 위한 연구 동향을 파악, 인사이트를 얻는 것에 집중할 시기이기 때문이다.&lt;br /&gt;
아직 어떠한 주제로 접근해야 할지, 내가 주로 어떤 분야로 연구를 할지 정하지는 못했지만, 가장 끌리는 것은 IEEE 802.11의 표준 연구, 비디오 스트리밍이며, 오늘의 논문은 스트리밍과 관련된 논문이다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://ieeexplore.ieee.org/abstract/document/8845041&quot;&gt;An LSTM-based Approach for Overall Quality Prediction in HTTP Adaptive Streaming&lt;/a&gt;&lt;/strong&gt; - Huyen T. T. Tran, Duc V. Nguyen, Duong D. Nguyen, Nam Pham Ngoc and Truong Cong Thang (IEEE INFOCOM WKSHPS • April 2019)&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;본 게시글은 위 논문을 스스로 번역, 재정리한 내용을 포함합니다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;
&lt;h1 id=&quot;한글-번역-및-코멘트&quot;&gt;한글 번역 및 코멘트&lt;/h1&gt;
&lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;HAS (HTTP Adaptive Streaming)&lt;/strong&gt; 은 최근의 멀티미디어 전송을 위한 일반적인 솔루션이다.&lt;/p&gt;

&lt;p&gt;일반적으로 HAS에서는 각 스트리밍 세션에서의 비디오 품질이 변동한다.&lt;/p&gt;

&lt;p&gt;따라서 HAS에서의 핵심적인 질문은 스트리밍 세션에서의 전반적인 품질을 어떻게 평가할 것인지이다.&lt;/p&gt;

&lt;p&gt;본 논문에서는 HAS에서 전반적인 품질 예측을 위한 머신러닝 접근법을 제안한다.&lt;/p&gt;

&lt;p&gt;제안된 접근법에서 각 세그먼트는 &lt;em&gt;segment quality, stalling durations, content characteristics과 padding&lt;/em&gt; 의 네 가지 features로 표현된다.&lt;/p&gt;

&lt;p&gt;특징들은 LSTM 네트워크에 입력되어 세그먼트 간의 시간적인 관계를 발견할 수 있도록 한다.&lt;/p&gt;

&lt;p&gt;스트리밍 세션의 전반적인 품질은 선형회귀 모듈을 사용하는 LSTM 네트워크의 출력으로부터 예측된다.&lt;/p&gt;

&lt;p&gt;실험적 결과들은 제안된 접근법이 스트리밍 세션의 전반적인 품질 예측에 효과적임을 보인다.&lt;/p&gt;

&lt;p&gt;또한 본 방식은 기존의 네 가지 접근 방식을 능가하는 것으로 나타났다.&lt;/p&gt;

&lt;hr /&gt;
&lt;h3 id=&quot;notes&quot;&gt;Notes&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;HAS (HTTP Adaptive Streaming)&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;비디오 컨텐츠를 상이한 품질을 가지는 (상이한 비트레이트로 인코딩된) 여러 개의 작은 세그먼트로 분할함.&lt;/li&gt;
      &lt;li&gt;각 세그먼트들은 HTTP 서버에 저장되며, 클라이언트는 네트워크 상태에 따라 적절한 품질의 세그먼트를 선택하여 다운로드함.&lt;/li&gt;
      &lt;li&gt;이때 각 세그먼트의 URL, 길이, 비트레이트, 해상도 등의 정보들은 매니페스트 파일에 저장되며, 이를 읽고 네트워크 상태에 맞게 선택하여 독립적으로 다운하는 방식임.&lt;/li&gt;
      &lt;li&gt;이외에도 고정된 품질의 비디오 컨텐츠를 HTTP 서버에서 다운로드 하는 PD(Progressive Download), UDP를 사용하고 실시간 스트리밍에 적합한
RTSP (Real-Time Streaming Protocol)와 RTP (Real-time Transport Protocol)가 있음.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;HAS에서는 각 스트리밍 세션 내에서도 비디오 품질 변동이 발생, 따라서 세션의 전반적인 품질을 평가할 방법이 중요한 포인트임.&lt;/li&gt;
  &lt;li&gt;LSTM을 활용하여 세그먼트 간의 시간적인 관계를 발견하고자 함.
    &lt;ul&gt;
      &lt;li&gt;LSTM의 입력: segment quality, stalling durations, content characteristics, padding&lt;/li&gt;
      &lt;li&gt;LSTM의 출력: 스트리밍 세션의 전반적인 품질&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;HAS는 네트워크 상태에 따라 적응형으로 세그먼트를 선택하는 것인데, 스트리밍 세션의 전반적인 품질을 예측한다는 것이 네트워크 상태 평가와 같은 것인지?
    &lt;ul&gt;
      &lt;li&gt;두 개가 상이하다면, 스트리밍 세션의 전반적인 품질을 예측해서 무엇을 하겠다는 것인지? 세그먼트 구조 조정?&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;여러 모델 중 LSTM을 사용한 이유는 무엇인지?&lt;/li&gt;
  &lt;li&gt;LSTM 입력 파라미터 각각의 근거는 무엇인지?&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;
&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;

&lt;p&gt;HAS는 현재 멀티미디어 전송을 위한 비용에 효율적인 수단이 되었다.&lt;/p&gt;

&lt;p&gt;HAS에서는 비디오가 먼저 상이한 품질 수준의 여러 버전으로 인코딩된다.&lt;/p&gt;

&lt;p&gt;각 버전은 다시 짧은 세그먼트 시퀀스로 나누어진다.&lt;/p&gt;

&lt;p&gt;네트워크 상태에 따라 적절한 버전의 세그먼트가 선택된다.&lt;/p&gt;

&lt;p&gt;네트워크 대역폭의 변동으로 인해 선택된 세그먼트의 버전은 스트리밍 세션 동안 크게 달라질 수 있으며, 이는 품질 변동을 야기할 수 있다.&lt;/p&gt;

&lt;p&gt;또한, 세그먼트가 재생 기한 (playback deadline) 전에 클라이언트에 도착하지 않으면 중단 (stalling) 현상이 발생할 수 있다.&lt;/p&gt;

&lt;p&gt;품질 변동과 stalling 현상은 사용자의 시청 경험에 부정적인 영향을 미치는 것으로 알려져 있다.&lt;/p&gt;

&lt;p&gt;따라서, HAS의 주요 과제는 이러한 요소들의 영향을 고려하여 스트리밍 세션의 전반적인 품질을 평가하는 방법을 찾는 것이다.&lt;/p&gt;

&lt;p&gt;기존의 전반적인 스트리밍 세션 품질을 예측하는 방법들 대부분은 분석 모델 기반의 접근법으로, 
이 접근법에서는 품질에 영향을 미치는 요인들을 일부 통계치 (segment quality 값의 평균 및 stalling duration의 평균)의 분석 함수 (e.g., 선형 함수)를 사용하여 모델링한다.&lt;/p&gt;

&lt;p&gt;이러한 접근법들 중에서, 품질 변동과 stalling 현상의 영향을 모두 고려하는 경우는 극히 일부에 불과하다.&lt;/p&gt;

&lt;p&gt;[9]의 연구는 전반적인 품질 예측을 위한 고급 머신러닝 접근법을 제안한 첫 번째 연구이다.&lt;/p&gt;

&lt;p&gt;이 접근법에서는 random neural network가 사용되었다.&lt;/p&gt;

&lt;p&gt;네트워크 입력으로는 모든 비디오 프레임의 모든 매크로 블록에 대한 양자화 파라미터의 평균, stalling의 발생 횟수, stalling duration의 평균 및 최댓값이 포함된다.&lt;/p&gt;

&lt;p&gt;이 접근법은 16초 동안 118개의 스트리밍 세션을 사용하여 평가되었다.&lt;/p&gt;

&lt;p&gt;[10]의 저자들은 Support Vector Regression을 사용하는 고급 머신러닝 접근법을 제안하였다.&lt;/p&gt;

&lt;p&gt;이 접근법의 입력으로는 segment quality 값의 평균, segment quality가 감소한 시간, 마지막 손상 이벤트 (i.e., stalling 또는 segment quality 감소) 이후의 시간, stalling 발생 수와 duration의 합을 포함한다.&lt;/p&gt;

&lt;p&gt;이 접근 법은 약 72초 동안의 112개의 세션을 사용하여 평가되었다. 또한 [9], [10] 두 연구 모두 비디오 컨텐츠 특성의 영향을 고려하지 않았다는 점에 유의해야 한다.&lt;/p&gt;

&lt;p&gt;이 연구에서 우리는 HAS 세션의 전반적인 품질을 예측하기 위한 새로운 고급 머신러닝 접근법을 제안한다. 제안된 접근법에서는 LSTM Network를 사용한다. 그 이유는 두 가지이다.&lt;/p&gt;

&lt;p&gt;첫째, LSTM은 메모리를 사용하여 비디오 세그먼트 간의 시간적 관계를 활용할 수 있기 때문이다.&lt;/p&gt;

&lt;p&gt;둘째, LSTM 네트워크는 video summarization과 video action recognition과 같은 다양한 비디오 관련 작업에서 성공적으로 사용된 바 있다.&lt;/p&gt;

&lt;p&gt;본 연구에서의 주요 기여는 다음과 같이 요약된다.&lt;/p&gt;

&lt;p&gt;첫째, 우리는 HAS 세션의 전반적인 품질을 예측하기 위해 LSTM 네트워크를 사용하는 새로운 고급 머신러닝 접근법을 제안한다.&lt;br /&gt;
제안된 접근법은 품질 변동, stalling 이벤트, 컨텐츠 특성의 영향을 고려한다. 우리가 아는 한, HAS의 전반적인 품질 예측에 LSTM 네트워크를 사용하는 것은 본 연구가 처음이다.&lt;/p&gt;

&lt;p&gt;둘째, 제안된 접근법은 60초에서 76초 사이의 세션 길이를 가진 515개의 세션으로 구성된 데이터셋을 사용하여 평가하였다.&lt;br /&gt;
실험 결과, 제안된 접근법이 높은 예측 성능을 달성하였으며, 기존의 네 가지 접근법보다 우수한 성과를 보였다.&lt;/p&gt;

&lt;hr /&gt;
&lt;h3 id=&quot;notes-1&quot;&gt;Notes&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;HAS는 여러 품질을 가지는 버전으로 인코딩되며, 각 버전은 다시 짧은 세그먼트 시퀀스로 나누어 짐. 이후 네트워크 상태에 따라 적절한 버전의 세그먼트를 선택함.
    &lt;ul&gt;
      &lt;li&gt;이렇게 대역폭의 변동으로 인해 선택된 세그먼트 버전은 스트리밍 세션 동안 크게 변화할 수 있으며, 이는 품질 변동을 야기할 수 있음.&lt;/li&gt;
      &lt;li&gt;또한 세그먼트가 playback deadline 전에 도착하지 못할 경우 stalling 현상 발생할 수 있음.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;기존의 스트리밍 세션 품질 예측 방법
    &lt;ul&gt;
      &lt;li&gt;segment quality 값의 평균 및 stalling duration의 평균 등의 일부 통계치를 선형 함수와 같은 분석 함수에 넣어 모델링하는 분석 모델 기반의 방식임.&lt;br /&gt;
&lt;strong&gt;=&amp;gt; 품질 변동과 stalling 현상이 미치는 영향을 모두 고려하는 연구가 부족함.&lt;/strong&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;motivation&quot;&gt;Motivation&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;고급 머신러닝 접근법을 제안한 연구들
    &lt;ul&gt;
      &lt;li&gt;random neural network를 사용한 연구
        &lt;ul&gt;
          &lt;li&gt;입력: 모든 비디오 프레임의 모든 매크로 블록에 대한 양자화 파라미터의 평균, stalling 발생 횟수와 duration의 평균 및 최댓값&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;SVR (Support Vector Regression)을 사용한 연구
        &lt;ul&gt;
          &lt;li&gt;입력: 스트리밍 동안의 segment quality 값의 평균, 품질 감소가 발생한 시간, 마지막으로 발생한 품질 저하/stalling 이후 경과된 시간, stalling 횟수 및 duration의 합&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;=&amp;gt; 두 연구 모두 video content characteristics (움직임, 장면 복잡도, 트랜지션 등등)의 영향을 고려하지 않았다는 한계가 있음.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;LSTM을 사용한 전반적인 품질 예측 접근법 제안
    &lt;ul&gt;
      &lt;li&gt;LSTM을 사용한 근거
        &lt;ol&gt;
          &lt;li&gt;비디오 세그먼트는 시간적 순서에 따라 재생되기 때문에 시계열 데이터 처리에 강한 순환신경망의 장점을 활용하여 시간적 과녜를 학습, 비디오 스트리밍 세션의 품질 변동을 보다 정확히 예측할 수 있다.&lt;/li&gt;
          &lt;li&gt;실제로 LSTM은 이미 video summarization과 video action recognition과 같은 비디오 관련 작업에서 성공적으로 사용된 바 있다. 즉, 1.의 근거를 뒷받침할 수 있다.&lt;/li&gt;
        &lt;/ol&gt;
      &lt;/li&gt;
      &lt;li&gt;주요 기여
        &lt;ul&gt;
          &lt;li&gt;LSTM을 HAS의 전반적인 품질 예측에 사용한 최초의 연구
            &lt;ul&gt;
              &lt;li&gt;순환신경망으로 처리한다는 점에서 기존 연구에 비해 더 정교한 예측을 가능하도록 함.&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;품질 변동, stalling 이벤트, 컨텐츠 특성을 모두 고려하는 접근 방식&lt;/li&gt;
          &lt;li&gt;실험 결과에서 기존의 네 가지 접근법에 대하여 우수한 결과 도출&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;실험 환경을 60초에서 76초 사이의 세션 길이를 가진 515개의 세션으로 구성한 것이 어떠한 시나리오를 대변하는지에 대한 분석 필요할듯.&lt;/li&gt;
  &lt;li&gt;기존 네 가지 접근법과 같은 환경에서 비교한 것이 맞는지 따져볼 것.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;
&lt;h2 id=&quot;proposed-approach&quot;&gt;Proposed Approach&lt;/h2&gt;

&lt;p&gt;이 섹션에서는 먼저 제안된 접근법의 아키텍처를 제시한다. 이후 다음 네 가지 segment features에 대해 자세히 설명한다.&lt;/p&gt;

&lt;h3 id=&quot;a-architecture&quot;&gt;A. Architecture&lt;/h3&gt;
&lt;p&gt;Figure 1은 제안된 접근법의 아키텍처를 보여준다. 특히, 각 스트리밍 세션은 일련의 세그먼트로 간주된다. 각 세그먼트는 일련의 특징들로 구성된다. 
이러한 특징들은 LSTM 네트워크에 입력으로 제공된다.&lt;/p&gt;

&lt;p&gt;LSTM 네트워크의 출력은 선형 회귀 모듈을 통해 전체 스트리밍 세션의 품질을 예측하는 데 사용된다.&lt;/p&gt;

&lt;p&gt;볼드체 대문자 (e.g., X), 볼드체 소문자 (e.g., x), 이탤릭체 문자 (e.g., &lt;em&gt;X&lt;/em&gt;)는 각각 행렬, 벡터, 스칼라를 나타낸다. _T_는 스트리밍 세션에서의 세그먼트 수를 나타낸다.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;X_t = [ x^1_t x^2_t … x^M_t ]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;세그먼트 𝑡 (1 ≤ 𝑡 ≤ 𝑇)의 특징 벡터를 x_t라고 하며, _M_은 세그먼트당 특징의 수다. 각 벡터 x_t는 Figure 2에 나타난 바와 같이 LSTM 유닛을 통해 은닉 상태 &lt;strong&gt;h&lt;/strong&gt;_t와 연결된다.
특히 은닉 상태 &lt;strong&gt;h&lt;/strong&gt;_t는 다음 방정식을 사용하여 계산된다.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;i_t = sigm(W_{ix} * x_t + V_{ih} * h_{t-1} + b_i),    (2)   
f_t = sigm(W_{fx} * x_t + V_{fh} * h_{t-1} + b_f),    (3)  
o_t = sigm(W_{ox} * x_t + V_{oh} * h_{t-1} + b_o),    (4)  
g_t = tanh(W_{gx} * x_t + V_{gh} * h_{t-1} + b_g),    (5)  
c_t = f_t ⊙ c_{t-1} + i_t ⊙ g_t,                      (6)  
h_t = o_t ⊙ tanh(c_t),                                (7)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;이때 ⊙는 요소별 곱셈을 나타내며, &lt;strong&gt;W&lt;/strong&gt; ∈ ℝ^{d×M}, &lt;strong&gt;V&lt;/strong&gt; ∈ ℝ^{d×d}, &lt;strong&gt;b&lt;/strong&gt; ∈ ℝ^d의 매개변수들은 학습 과정에서 학습되고, LSTM 유닛 전체에서 공유된다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;i&lt;/strong&gt;_t, &lt;strong&gt;f&lt;/strong&gt;_t, &lt;strong&gt;o&lt;/strong&gt;_t, &lt;strong&gt;c&lt;/strong&gt;_t는 각각 입력 게이트, 망각 게이트, 출력 게이트, 메모리 셀의 출력 벡터를 나타낸다.&lt;/p&gt;

&lt;p&gt;이들은 LSTM 유닛이 세그먼트 간의 시간적 관계를 활용할수 있도록 하는 중요한 구성 요소이다.&lt;/p&gt;

&lt;p&gt;특히, 입력 게이트는 현재 입력에서 새로운 정보를 메모리 셀에 추가할지 여부를 결정한다.&lt;/p&gt;

&lt;p&gt;망각 게이트는 메모리 셀에서 오래된 정보를 선택하고 제거하며, 출력 게이트는 메모리 셀에서 유용한 정보를 선택하여 은닉 상태 &lt;strong&gt;h&lt;/strong&gt;_t를 업데이트한다.&lt;/p&gt;

&lt;p&gt;선형 회귀 모듈에서 세션의 전반적인 품질 Q는 마지막 세그먼트에 해당하는 숨겨진 상태 &lt;strong&gt;h&lt;/strong&gt;_ &lt;em&gt;T&lt;/em&gt; 로부터 다음과 같이 예측된다.&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Q = w_r * h_T + b_r
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;여기서 w_r과 b_r도 학습되어야 하는 매개변수이다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h4 id=&quot;notes-2&quot;&gt;Notes&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;제안된 접근법의 구조와 동작
    &lt;ul&gt;
      &lt;li&gt;스트리밍 세션의 세그먼트화&lt;br /&gt;
제안된 접근법에서는 각 스트리밍 세션을 여러 개의 세그먼트로 나누어 처리함. 각 세그먼트는 해당 segment quality, stalling duration, 컨텐츠 특성 등의 특징들로 표현됨.&lt;/li&gt;
      &lt;li&gt;LSTM 네트워크의 역할&lt;br /&gt;
세그먼트의 특징들은 LSTM이 입력으로 사용됨. LSTM은 특징들을 통해 세그먼트 간의 시간적 관계를 학습하여, 스트리밍 세션 전반의 품질을 예측하는 데 필요한 정보를 추출함.
        &lt;ul&gt;
          &lt;li&gt;선형 회귀 모듈&lt;br /&gt;
LSTM 네트워크의 출력은 선형 회귀 모듈로 전달되어 최종적으로 전체 스트리밍 세션의 품질을 예측함. 선형 회귀는 LSTM의 출력 값들을 조합하여 최종적인 품질 점수를 계산함.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;표기
        &lt;ul&gt;
          &lt;li&gt;X: 행렬&lt;/li&gt;
          &lt;li&gt;x: 벡터&lt;/li&gt;
          &lt;li&gt;&lt;em&gt;X&lt;/em&gt;: 스칼라&lt;/li&gt;
          &lt;li&gt;&lt;em&gt;T&lt;/em&gt;: 스트리밍 세션에서의 세그먼트 수&lt;/li&gt;
          &lt;li&gt;⊙: 요소별 곱셈&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;LSTM 학습 방정식
        &lt;ul&gt;
          &lt;li&gt;&lt;strong&gt;W&lt;/strong&gt; ∈ ℝ^{d×M}: 입력에서의 가중치 (i.e., &lt;strong&gt;x&lt;/strong&gt;_t)&lt;/li&gt;
          &lt;li&gt;&lt;strong&gt;V&lt;/strong&gt; ∈ ℝ^{d×d}: 이전 은닉 상태에서의 가중치 (i.e., &lt;strong&gt;h&lt;/strong&gt;_(t-1))&lt;/li&gt;
          &lt;li&gt;&lt;strong&gt;b&lt;/strong&gt; ∈ ℝ^d: bias 벡터&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;각 게이트의 역할
        &lt;ul&gt;
          &lt;li&gt;입력 게이트 (Input Gate): 현재 입력에서 새로운 정보를 메모리 셀에 추가할지 여부를 결정함.
            &lt;ol&gt;
              &lt;li&gt;&lt;strong&gt;x&lt;/strong&gt;&lt;em&gt;t, &lt;strong&gt;h&lt;/strong&gt;&lt;/em&gt;(t-1)를 사용하여 &lt;strong&gt;W&lt;/strong&gt;, &lt;strong&gt;V&lt;/strong&gt;의 가중치 행렬과 곱한 후, 편향 &lt;strong&gt;b&lt;/strong&gt;_i를 더함.&lt;/li&gt;
              &lt;li&gt;이에 sigmoid 적용하여 &lt;em&gt;i&lt;/em&gt; _t를 계산함. 이는 메모리 셀에 입력될 새로운 정보의 양을 결정함.&lt;/li&gt;
              &lt;li&gt;이는 1.의 과정에 tanh를 적용한 g_t와 곱하여 메모리 셀에 추가될 정보를 정하게 됨.
&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
            &lt;/ol&gt;
          &lt;/li&gt;
          &lt;li&gt;망각 게이트 (Forget Gate): 메모리 셀에서 오래된 정보를 선택 및 제거함.
            &lt;ol&gt;
              &lt;li&gt;&lt;strong&gt;x&lt;/strong&gt;&lt;em&gt;t, &lt;strong&gt;h&lt;/strong&gt;&lt;/em&gt;(t-1)를 사용하여 &lt;strong&gt;W&lt;/strong&gt;, &lt;strong&gt;V&lt;/strong&gt;의 가중치 행렬과 곱한 후, 편향 &lt;strong&gt;b&lt;/strong&gt;_f를 더함.&lt;/li&gt;
              &lt;li&gt;이에 sigmoid 적용하여 &lt;em&gt;f&lt;/em&gt; &lt;em&gt;t를 계산함. 이는 메모리 셀의 이전 상태인 c&lt;/em&gt;(t-1) 중에서 어느 정도의 정보를 forget할 것인지 결정함.&lt;/li&gt;
              &lt;li&gt;&lt;em&gt;f&lt;/em&gt; &lt;em&gt;t와 _c&lt;/em&gt; _(t-1)가 곱해져 메모리 셀의 상태가 갱신됨.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
            &lt;/ol&gt;
          &lt;/li&gt;
          &lt;li&gt;출력 게이트 (Ouput Gate): 메모리 셀에서 유용한 정보를 선택하여 은닉 상태를 업데이트 함.
            &lt;ol&gt;
              &lt;li&gt;&lt;strong&gt;x&lt;/strong&gt;&lt;em&gt;t, &lt;strong&gt;h&lt;/strong&gt;&lt;/em&gt;(t-1)를 사용하여 &lt;strong&gt;W&lt;/strong&gt;, &lt;strong&gt;V&lt;/strong&gt;의 가중치 행렬과 곱한 후, 편향 &lt;strong&gt;b&lt;/strong&gt;_o를 더함.&lt;/li&gt;
              &lt;li&gt;이에 sigmoid 적용하여 &lt;em&gt;o&lt;/em&gt; _t를 계산함.&lt;/li&gt;
              &lt;li&gt;메모리 셀 &lt;em&gt;c&lt;/em&gt; &lt;em&gt;t가 tanh를 통해 변환하고, _o&lt;/em&gt; _t와 곱하여 최종적으로 &lt;strong&gt;h&lt;/strong&gt;_t를 결정됨.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
            &lt;/ol&gt;
          &lt;/li&gt;
          &lt;li&gt;메모리 셀 (Memory Cell): 이전 시점의 주요 정보를 유지하고, 현재 입력에서의 정보와 통합하여 시퀀스 데이터 간의 시간적 의존성을 관리함.
            &lt;ol&gt;
              &lt;li&gt;&lt;em&gt;c&lt;/em&gt; &lt;em&gt;t는 _c&lt;/em&gt; &lt;em&gt;(t-1)와 _f&lt;/em&gt; &lt;em&gt;t의 곱과 _i&lt;/em&gt; &lt;em&gt;t와 _g&lt;/em&gt; _t의 곱을 더한 값으로, 이를 통해 메모리 셀 정보가 갱신됨.&lt;/li&gt;
              &lt;li&gt;이후 출력 게이트의 &lt;em&gt;o&lt;/em&gt; _t와 곱하여 은닉 상태 &lt;strong&gt;h&lt;/strong&gt;_t로 변환, 다음 타임스텝으로 전달됨.&lt;/li&gt;
            &lt;/ol&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;Architecture Work Flow
        &lt;ul&gt;
          &lt;li&gt;첫 시점부터 T 시점까지의 각 비디오 Segment features가 각각 LSTM unit에 연결되어 특징벡터로서 각 게이트에 사용됨.&lt;/li&gt;
          &lt;li&gt;최종 시점 T의 은닉상태는 선형 회귀 모듈에 연결되어 가중치와 바이어스와의 연산을 거쳐 Quality 값을 출력하게 됨.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;전체 스트리밍 세션의 품질 예측 과정
        &lt;ul&gt;
          &lt;li&gt;선형 회귀 모듈
            &lt;ul&gt;
              &lt;li&gt;LSTM 네트워크의 출력인 마지막 은닉 상태 &lt;strong&gt;h&lt;/strong&gt;&lt;em&gt;T를 기반으로, 전반적인 세션의 품질 _Q&lt;/em&gt; 를 예측하는 과정에 선형 회귀 모듈이 사용됨. &lt;br /&gt;
&lt;em&gt;Q&lt;/em&gt; = &lt;strong&gt;w&lt;/strong&gt; _r * &lt;strong&gt;h&lt;/strong&gt; _T + b_r&lt;br /&gt;
&lt;strong&gt;w&lt;/strong&gt; _r은 가중치 벡터, b_r은 바이어스 값이며, 학습 과정 동안 최적화 됨.&lt;br /&gt;
최종적으로 수식에 네트워크의 출력 &lt;strong&gt;h&lt;/strong&gt; _T를 입력으로 하여, 세션의 품질 점수 _Q_를 예측함.&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;b-segment-features&quot;&gt;B. Segment Features&lt;/h3&gt;

&lt;p&gt;이 부분에서는 제안된 접근법에 사용된 네 가지 세그먼트의 기능, 즉 segment quality, stalling durations, content characteristics, padding에 대하여 설명한다.&lt;/p&gt;

&lt;p&gt;1) &lt;strong&gt;Segment Quality&lt;/strong&gt;&lt;br /&gt;
  Segment quality feature는 비디오 세그먼트의 가시적인 품질을 나타낸다.&lt;br /&gt;
  본 연구에서는 bitrate(BR), Peak Signal-to-Noise Ratio(PSNT), Segment-MOS(S-MOS) [15] - [17]
  세 가지 메트릭 중 하나를 사용하여 quality feature를 나타낸다.&lt;/p&gt;

&lt;p&gt;2) &lt;strong&gt;Stalling Durations&lt;/strong&gt;&lt;br /&gt;
  세그먼트의 stalling duration feature (이하 SD)는 이전 세그먼트의 재생이 끝난 후 해당 세그먼트의 재생이 시작될 때까지 사용자가 기다려야 하는 시간을 나타낸다. &lt;br /&gt;
  만약 해당 세그먼트가 이전 세그먼트의 재생이 끝나기 전(즉, playback deadline 전에) 클라이언트에 도착하면 SD는 0으로 설정된다. 그렇지 않으면 stalling 현상이 발생하며 SD는 양수 값이 된다.&lt;/p&gt;

&lt;p&gt;3) &lt;strong&gt;Content Characteristics&lt;/strong&gt;
  세션의 전체 품질은 비디오 컨텐츠의 특성에 영향을 받을 수 있다는 것이 잘 알려져 있다. [18]&lt;br /&gt;
  [18]과 유사하게, 제안된 접근법에서는 컨텐츠 특성 특징의 두 가지 차원인 &lt;strong&gt;spatial complexity&lt;/strong&gt;, &lt;strong&gt;temporal complexity&lt;/strong&gt;를 고려한다. &lt;br /&gt;
  세그먼트의 spatial complexity를 나타내기 위해, [18]에서 사용된 &lt;strong&gt;Spatial Variance (SV)&lt;/strong&gt; 지표를 사용한다.&lt;br /&gt;
   &lt;br /&gt;
  이는 MPEG-7 엣지 히스토그램 descriptor를 기반으로 계산된다. 구체적으로, 각 프레임은 먼저 4x4 서브 블록으로 나누어지고, 
  그런 다음 모든 서브 블록에 대해 5가지 엣지 유형 (수직, 수평, 45도, 135도, 비방향)의 히스토그램이 계산된다 [19].&lt;br /&gt;
   &lt;br /&gt;
  &lt;em&gt;S&lt;/em&gt; &lt;em&gt;{qp}는 프레임 q의 모든 서브 블록에 대한 엣지 유형 p의 평균 히스토그램 값을 나타낸다.&lt;br /&gt;
   &lt;br /&gt;
  마지막으로, SV 값은 각 프레임의 _S&lt;/em&gt; _{qp}을 모두 더한 후, 프레임 수 _Q_와 엣지 유형의 수 _P_의 수로 나누어 전체 세그먼트의 temporal complexity를 계산한다.&lt;br /&gt;
   &lt;br /&gt;
  세그먼트의 temporal complexity는 해당 세그먼트의 모션 벡터로부터 계산된 두 가지 지표, &lt;strong&gt;모션 벡터 크기의 평균 (이하 MMM)&lt;/strong&gt;과 &lt;strong&gt;표준 편차 (이하 SMM)&lt;/strong&gt;으로 표현된다.&lt;/p&gt;

&lt;p&gt;4) &lt;strong&gt;Padding&lt;/strong&gt;&lt;br /&gt;
  실제로 스트리밍 세션은 보통 서로 다른 길이 (i.e., 세그먼트의 수)를 가지게 된다. 본 연구에서는 모든 세션이 동일한 길이를 가지도록 하기 위해 
  &lt;strong&gt;zero-padding&lt;/strong&gt;을 사용한다.&lt;br /&gt;
   &lt;br /&gt;
  특히, 각 세션의 시작 부분에 일부 세그먼트 (패딩된 세그먼트라 함)가 추가되어, 해당 세션의 길이가 가장 긴 세션의 길이와 같아지도록 한다.&lt;br /&gt;
   &lt;br /&gt;
  모든 패딩된 세그먼트의 경우, 세그먼트 quality, stalling duration, content characteristics로 구성된 특징 값이 0으로 설정된다.&lt;br /&gt;
  &lt;br /&gt;
  패딩된 세그먼트와 실제 세그먼트를 구별하기 위해 불린 변수 PS를 PS(t) = 1: 패딩된 세그먼트으로 정의한다.&lt;br /&gt;
  &lt;br /&gt;
  Figure 3은 스트리밍 세션에서 정규화된 세그먼트 feature 값의 예를 보인다.&lt;br /&gt;
  Figure 3에서 볼 수 있듯, 세그먼트 quality 즉, BR 지표는 세션 동안 크게 변동한다.&lt;br /&gt;
  또한 아홉 번째 세그먼트에서 SD &amp;gt; 0인 Stalling event가 발생한 것을 볼 수 있다.&lt;br /&gt;
  content characteristics과 관련하여 spatial complexity에는 큰 변동이 없지만, temporal complexity가 급격히 변동한다.&lt;br /&gt;
  PS 값은 첫 네 개의 세그먼트가 패딩된 세그먼트이고, 나머지는 실제 세그먼트임을 나타낸다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h4 id=&quot;notes-3&quot;&gt;Notes&lt;/h4&gt;

&lt;p&gt;1) &lt;strong&gt;Segment Quality&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Bitrate (BR)&lt;br /&gt;
단위 시간 당 전송되는 데이터 양으로, 품질과 요구 대역폭량은 bitrate와 비례한다.&lt;/li&gt;
  &lt;li&gt;Peak Signal-to-Noise Ratio (PSNR)&lt;br /&gt;
가질 수 있는 최대 전력에 대한 신호 대비 잡음의 비율으로, 높을 수록 고품질을 나타냄. 주로, 원본 이미지와 압축 이미지 간 품질 측정에 사용됨.&lt;/li&gt;
  &lt;li&gt;Segment-MOS (S-MOS)&lt;br /&gt;
사용자의 주관적 평가를 바탕으로 한 비디오 품질 지표로, 여러 사용자의 평가 점수 평균을 사용한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;세 가지 메트릭 중 하나를 사용하여 quality feature를 사용한다는데, 시나리오에 따라 다르게 사용하는지 이어질 내용을 봐야할 것.&lt;/p&gt;

&lt;p&gt;2) &lt;strong&gt;Stalling Durations&lt;/strong&gt;&lt;br /&gt;
  특정 세그먼트의 재생 시작까지 기다려야 하는 시간을 의미함. 즉, 이전 세그먼트가 끝난 후 새 세그먼트가 재생되기까지의 대기 시간을 의미함.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Playback Deadline&lt;br /&gt;
특정 세그먼트가 재생되기 전에 해당 세그먼트가 클라이언트에 도착해야 하는 시간의 기한을 의미함. 
즉, 재생 중인 세그먼트가 끝나기 전에 다음 세그먼트가 반드시 클라이언트에 도착해 있어야 하므로, t-1 시점의 세그먼트의 길이로 설정됨.&lt;br /&gt;
t-1 시점의 세그먼트의 재생이 끝난 후 t 시점의 세그먼트가 클라이언트에 도착할 때 &lt;strong&gt;Stalling&lt;/strong&gt;이 발생하며, &lt;strong&gt;Stalling Duration&lt;/strong&gt;은 
양수가 됨. (Playback Deadline 전에 도착한 경우 0)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3) &lt;strong&gt;Content Characteristics&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Spatial Complexity&lt;br /&gt;
비디오 프레임 내에서 시각적 디테일이나 복잡한 장면의 정도를 나타냄. e.g., 많은 세부 정보와 복잡한 패턴이 포함된 장면은 Spatial Complexity가 높음.&lt;br /&gt;
Spatial Complexity가 높으면, 비디오 인코딩에 더 많은 데이터가 필요하며, 스트리밍 품질에 영향을 미칠 수 있음. 낮은 BR과 함께일 때 품질 저하가 더 큼.&lt;br /&gt;
&lt;br /&gt;
    &lt;ul&gt;
      &lt;li&gt;Spatial Variance (SV)&lt;br /&gt;
비디오 프레임에서 시각적 복잡도를 나타내는 지표로, MPEG-7 표준의 엣지 히스토그램 descriptor를 활용하여 계산됨.&lt;/li&gt;
      &lt;li&gt;계산 과정
1) 프레임 분할&lt;br /&gt;
   비디오 프레임을 4x4 서브 블록으로 나눔. 프레임을 작은 블록으로 분해하여 세부적으로 분석하기 위함.
2) 엣지 히스토그램 계산&lt;br /&gt;
   각 서브 블록에 대하여 수직, 수평, 45도, 136도, 비방향 (e.g., 랜덤 패턴, 텍스처, etc.) 5가지 엣지 유형의 히스토그램을 계산함.&lt;br /&gt;
   엣지 히스토그램은 해당 방향으로 얼마나 많은 에지가 존재하는지를 측정함.
3) 평균 히스토그램 값 &lt;em&gt;S&lt;/em&gt; &lt;em&gt;{qp}&lt;br /&gt;
   각 프레임 q에서 모든 서브 블록에 대해 엣지 유형 p의 평균 히스토그램 값을 계산함.
4) 각 프레임의 _S&lt;/em&gt; _{qp}을 모두 더한 후, 프레임 수 _Q_와 엣지 유형의 수 _P_의 수로 나누어 전체 세그먼트의 temporal complexity를 계산함.&lt;br /&gt;
   &lt;strong&gt;SV = 1/(&lt;em&gt;Q&lt;/em&gt; * &lt;em&gt;P&lt;/em&gt;) * (각 프레임 별 &lt;em&gt;S&lt;/em&gt; _{qp} 총합)&lt;/strong&gt;&lt;/li&gt;
      &lt;li&gt;SV 값의 사용&lt;br /&gt;
계산된 평균 히스토그램 값을 바탕으로, 세그먼트의 공간적 복잡도를 나타내는 최종 SV 값이 도출됨.&lt;br /&gt;
이는 비디오 세그먼트의 &lt;strong&gt;spatial complexity&lt;/strong&gt;를 정량적으로 평가하는 데 사용됨.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Temporal Complexity&lt;br /&gt;
  비디오에서 시간에 따라 변화하는 움직임이나 전환의 정도를 나타냄. e.g., 빠르게 움직이는 객체나 트랜지션이 잦은 비디오는 Temporal Complexity가 높음.&lt;br /&gt;
  Temporal Complexity가 높으면, 비디오 인코딩 시 더 많은 BR을 요구하며, 네트워크 대역폭 요구 사항이 증가할 수 있어 Stalling event, 품질 저하를 발생시킬 수 있음.&lt;br /&gt;
  &lt;br /&gt;
    &lt;ul&gt;
      &lt;li&gt;모션 벡터
연속된 두 프레임 사이에서 픽셀이 어떻게 이동했는지를 나타내는 벡터로, 비디오에서 temporal complexity를 측정하기 위해 사용됨.
        &lt;ul&gt;
          &lt;li&gt;지표
            &lt;ul&gt;
              &lt;li&gt;MMM (Mean Magnitude of Motion vectors)&lt;br /&gt;
모션 벡터 크기의 평균으로, 모션 벡터의 크기가 클수록 프레임 간 움직이 큼을 의미함.&lt;/li&gt;
              &lt;li&gt;SMM (Standard Deviation of Motion vectors)&lt;br /&gt;
모션 벡터 크기의 표준 편차로, 표준 편차가 클수록 프레임 간 변동성이 큼을 의미함.&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;4) &lt;strong&gt;Padding&lt;/strong&gt;&lt;br /&gt;
  스트리밍 세션마다 길이 즉, 세션의 세그먼트 수가 다를 수 있음. 따라서 가장 긴 세션에 맞추어 패딩이 필요하며, 0으로 채우는 &lt;strong&gt;Zero-padding&lt;/strong&gt;을 사용함.&lt;br /&gt;
  이때, 패딩된 세그먼트의 특징 값은 모두 0으로 설정됨.&lt;/p&gt;

&lt;p&gt;Figure 3 분석&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Segment Quality (i.e., BR)
세션 동안 큰 변동이 있음을 확인할 수 있음. 스트리밍 도중 네트워크 상태에 따라 bitrate가 달라진 것으로 보임.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Stalling Duration (SD)&lt;br /&gt;
9번째 세그먼트에서 SD가 0이 아닌 값이 된 것을 보아, 아홉 번째 세그먼트가 playback deadline을 초과하여 클라이언트에 도착함으로 인해 재생이 일시적으로 중단되었을 것임을 알 수 있음.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Content Characteristic
    &lt;ul&gt;
      &lt;li&gt;Spatial Complexity (SV)&lt;br /&gt;
세션 동안 SV가 크게 변동하지 않고 일정 수준으로 유지되는 것으로 보아, 시각적인 요소나 패턴이 일정하게 나타날 것으로 예상할 수 있음.&lt;/li&gt;
      &lt;li&gt;Temporal Complexity (MMM, SMM)
그래프에서 MMM과 SMM이 급격히 변동하는 것으로 보아, 비디오 내에 움직임 변화가 크거나, 트랜지션이 잦게 발생하고 있음을 예상할 수 있음.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Padded Segment (PS)
    &lt;ul&gt;
      &lt;li&gt;PS 값이 1인 첫 네 개의 세그먼트는 패딩된 세그먼트이며, 나머지 세그먼트는 실제 비디오 데이터와 feature를 포함하는 세그먼트일 것임. 
따라서 네 번째 세그먼트까지는 그래프 값이 나타나지 않음.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;evaluation&quot;&gt;Evaluation&lt;/h2&gt;

&lt;p&gt;본 섹션에서는 우선 제안하는 접근법의 예측 성능 평가를 위한 실험 환경을 명세한다.&lt;br /&gt;
다음으로, 제안된 접근법에서 각 segment feature들의 역할에 대하여 이야기한다.&lt;br /&gt;
마지막으로 기존의 네 가지 접근법과 성능을 비교한다.&lt;/p&gt;

&lt;h3 id=&quot;a-experiment-settings&quot;&gt;A. Experiment Settings&lt;/h3&gt;

&lt;h4 id=&quot;1-dataset&quot;&gt;1) Dataset&lt;/h4&gt;

&lt;p&gt;학습 데이터 부족 문제를 해결하기 위해, 본 연구에서 사용된 데이터셋은 세 개의 데이터셋을 결합하여 구성되었다.&lt;br /&gt;
두 개의 데이터 셋은 [5], [15]의 이전 연구에서 가져온 것이며, 나머지 데이터셋은 주관적 테스트를 통해 새롭게 생성되었다.&lt;br /&gt;
주관적 테스트에서는 총 144개의 세션이 평가되었으며, 이 세션들은 [5], [15]에서 사용된 비디오와 다른 두 개의 비디오로부터 생성되었다.&lt;/p&gt;

&lt;p&gt;특히, 각 비디오는 72개의 세션을 생성하는 데 사용되었으며, 이 세션들은 수작업으로 만든 42개의 세션과 30개의 실제 스트리밍 세션으로 구성되었다.&lt;br /&gt;
수작업으로 만든 세션은 다음과 같은 패턴으로 생성되었다.&lt;br /&gt;
세션 동안 세그먼트의 버전이 고정된 상태로 품질 변동이 없고, stalling event가 없는 5가지 패턴,&lt;br /&gt;
10초 주기의 주기적인 품질 변동이 있고, stalling event가 없는 10가지 패턴,&lt;br /&gt;
0.25, 0.5, 1, 2, 3, 4초의 지속 시간을 가진 1회에서 6회의 stalling event를 포함하며 품질 변동이 없는 27가지 패턴,&lt;br /&gt;
30개의 실제 스트리밍 세션은 [20], [21]의 두 가지 적응형 방법을 사용하여 모바일 네트워크의 대역폭 추적 자료 [22]를 이용한 스트리밍 테스트베드에서 실행하여 생성되었다.&lt;br /&gt;
실제 스트리밍 세션은 품질 변동과 stalling event를 모두 포함하고 있다.&lt;/p&gt;

&lt;p&gt;이전 연구들 [5], [15]와 유사하게, 테스트 조건은 ITU Recommendation p.913 [23]을 따라 설계되었다.&lt;br /&gt;
피험자들의 피로를 최소화하기 위해, 주관적 테스트는 네 부분으로 나누어 다른 날에 진행되었다.&lt;br /&gt;
각 부분의 지속 시간은 약 50분이었으며, 매 20분마다 10분 간의 휴식 시간이 있었다.&lt;br /&gt;
각 피험자는 최대 두 개의 테스트 부분에만 참여했다.&lt;br /&gt;
실제 주관적 테스트를 수행하기 전에, 피험자들은 평가 절차와 비디오 품질 점수 범위에 익숙해지도록 훈련을 받았다.&lt;br /&gt;
세션들은 해상도 1,366 x 768의 검은색 배경을 가진 14인치 화면에서 무작위로 표시되었다.&lt;br /&gt;
각 세션이 끝날 때마다, 피험자는 1점 (최악)에서 5점 (최상) 사이의 점수를 매겼다.&lt;/p&gt;

&lt;p&gt;주관적 테스트에는 총 53명의 피험자가 참여했으며, 이들은 18세에서 41세 사이였다.&lt;br /&gt;
주관적 테스트의 총 소요 시간은 약 78시간이었다.&lt;br /&gt;
테스트 결과에 대한 선별 분석은 ITU-T Recommendation p.913 [23]에 따라 수행되었으며, 두 명의 피험자는 제외 되었다.&lt;br /&gt;
제외된 피험자들의 점수를 제거한 후, 각 세션은 21명의 유효 피험자들에 의해 평가되었다.&lt;br /&gt;
각 세션의 주관적 전반적 quality 값은 유효 피험자들의 평균 점수로 계산되었다.&lt;/p&gt;

&lt;p&gt;결합된 데이터셋은 총 515개의 세션으로 구성되어 있으며, 이중 183개의 세션은 수작업으로 생성된 세션이고, 332개의 세션은 실제 스트리밍 세션이다.&lt;br /&gt;
세션의 길이는 60초에서 76초 사이이다.&lt;br /&gt;
이 세션들은 무작위로 412개의 세션으로 구성된 학습 세트와 나머지 103개의 세션으로 구성된 테스트 세트로 나누어졌다.&lt;br /&gt;
이 분할 과정은 100번 반복되었으며, 결과적으로 100쌍의 훈련 세트와 테스트 세트가 생성되었다.&lt;br /&gt;
다음 섹션에서 제시되는 결과는 100쌍의 훈련 및 테스트 세트에 대한 평균값이다.&lt;/p&gt;

&lt;h4 id=&quot;2-training-parameters&quot;&gt;2) Training Parameters&lt;/h4&gt;

&lt;p&gt;제안된 접근법의 학습 과정에서는 &lt;strong&gt;루트 평균 제곱 오차 (RMSE)&lt;/strong&gt; 손실 함수를 적용했다.&lt;br /&gt;
이는 Adam 최적화 알고리즘을 기반으로 한 확률적 경사 하강법 (SGD) 방법을 사용하여 최소화된다 [24].&lt;br /&gt;
Adam 알고리즘의 파라미터는 다음과 같이 설정되었다.&lt;br /&gt;
&lt;strong&gt;β_1 = 0.9&lt;/strong&gt;, &lt;strong&gt;𝛽_2 = 0.999&lt;/strong&gt;, &lt;strong&gt;𝜖 = 1e^(-8)&lt;/strong&gt;, &lt;strong&gt;learning rate = 0.01&lt;/strong&gt;, &lt;strong&gt;hidden units 수 = 5&lt;/strong&gt;, &lt;strong&gt;epochs = 5000&lt;/strong&gt;으로 설정되었다.&lt;/p&gt;

&lt;h4 id=&quot;3-input-features&quot;&gt;3) Input Features&lt;/h4&gt;

&lt;p&gt;제안된 접근법에서 세그먼트 features의 역할을 조사하기 위해 네 가지의 input features의 케이스를 고려한다.&lt;br /&gt;
첫 번째 케이스 (Full)는 각 세그먼트가 섹션 &lt;em&gt;II-B&lt;/em&gt; 에 설명된 모든 네 가지 feature로 표현된다.&lt;br /&gt;
나머지 세 가지 케이스에서는 네 가지 feature 중 세 가지만 사용된다.&lt;br /&gt;
구체적으로, 두 번째 케이스 ( &lt;em&gt;w/oCC&lt;/em&gt; )에서는 content characteristics feature가 입력에서 제외된다.&lt;br /&gt;
세 번째 케이스 (&lt;em&gt;w/oSQ&lt;/em&gt;)에서는 세그먼트 quality feature가 고려되지 않는다. 마지막 케이스 (&lt;em&gt;w/oSD&lt;/em&gt;)에서는 stalling duration feature가 제안된 접근법의 입력으로 사용되지 않는다.&lt;/p&gt;

&lt;h4 id=&quot;4-evaluation-metircs&quot;&gt;4) Evaluation Metircs&lt;/h4&gt;

&lt;p&gt;제안된 접근법의 예측 성능을 평가하기 위해 &lt;strong&gt;피어슨 상관 계수 (PCC)&lt;/strong&gt;와 &lt;strong&gt;루트 평균 제곱 오차 (RMSE)&lt;/strong&gt; 두 가지 지표를 사용하며, 이 지표들은 100개의 테스트 세트에 대해 평균화된다.&lt;br /&gt;
&lt;em&gt;높은 PCC와 낮은 RMSE는 더 나은 예측 성능을 의미한다.&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h5 id=&quot;notes-4&quot;&gt;Notes&lt;/h5&gt;

&lt;p&gt;1) Dataset&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;데이터셋 구성
연구에서 사용된 데이터셋은 세 개의 서로 다른 데이터셋을 결합하여 구성함.&lt;br /&gt;
두 개는 이전 연구인 [5], [15]에서, 나머지 하나는 새로운 주관적 테스트를 통해 생성함.&lt;br /&gt;
주관적 테스트에서는 총 144개의 세션이 평가되었으며, 이 세션들은 이전 연구에서 사용되지 않은 두 개의 비디오로 생성함.&lt;br /&gt;
   &lt;br /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;세션 생성 및 구성
각 비디오로부터 72개의 세션이 생성되었으며, 수작업으로 만든 42개의 세션과 실제 스트리밍 세션 30개로 구성됨.&lt;br /&gt;
수작업 세션은 품질 변동과 stalling event가 없는 패턴, 주기적인 품질 변동만 있는 패턴, stalling event만 있는 패턴으로 나뉨.&lt;br /&gt;
실제 스트리밍 세션은 모바일 네트워크 대역폭 자료를 기반으로 스트리밍 테스트베드에서 생성되었으며, 품질 변동과 stalling event를 모두 포함하고 있음.&lt;br /&gt;
   &lt;br /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;주관적 테스트&lt;br /&gt;
권고안을 따라 피험자의 피로를 줄이기 위해 테스트는 네 부분으로 나누어 진행, 각 부분은 50분 동안 진행되었음.&lt;br /&gt;
53명의 피험자가 참여, 이들 중 2명은 선별 과정에서 제외, 최종적으로 21명의 유효 피험자들이 각 세션을 평가함.&lt;br /&gt;
평가 방식은 각 세션이 끝날 때마다 1점 (최악)에서 5점 (최상) 사이의 점수를 매기는 방식이었음.&lt;br /&gt;
   &lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;데이터셋의 최종 구성 및 분할&lt;br /&gt;
최종적으로 결합된 데이터셋은 515개의 세션으로 구성되었으며, 이중 183개는 수작업 세션, 332개는 실제 스트리밍 세션임.&lt;br /&gt;
세션 길이는 60초에서 76초 사이로 다양하며, 데이터셋은 무작위로 412개의 훈련 세트와 103개의 테스트 세트로 나누었음.&lt;br /&gt;
이 과정을 100번 반복하여, 겨로가적으로 100번의 반복에 걸친 훈련 세트와 테스트 세트의 평균값으로 제시됨.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;분할을 100번한 것이 단일 분할을 통한 편향을 줄이고 일반화 성능을 평가하기 위한 것으로 보임.&lt;/p&gt;

&lt;p&gt;2) Training Parameters&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;손실 함수
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;루트 평균 제곱 오차 (RMSE)&lt;/strong&gt;&lt;br /&gt;
모델의 예측 값과 실제 값 사이의 차이를 측정하는 데 사용하는 손실 함수&lt;br /&gt;
예측 오류의 제곱을 평균한 후 제곱근을 취하는 방식으로 계산되며, 값이 작을수록 모델의 예측이 정확함을 의미함.&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;최적화 알고리즘
    &lt;ul&gt;
      &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;Adam 최적화 알고리즘&lt;/strong&gt;&lt;br /&gt;
확률적 경사 하강법 (SGD)의 변형으로, 학습 과정에서 각 매개변수의 학습률을 적응적으로 조정하는 방법.&lt;br /&gt;
모멘텀 (β_1)과 RMSprop (β_2)를 결합하여, 빠르고 안정적인 최적화를 도움.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;Adam 파라미터&lt;/p&gt;
        &lt;ul&gt;
          &lt;li&gt;β_1 = 0.9&lt;br /&gt;
모멘텀 항의 계수로, 이전 그래디언트를 얼마나 반영할지 결정함.&lt;/li&gt;
          &lt;li&gt;β_2 = 0.999&lt;br /&gt;
그래디언트 제곱 항의 계수로, 학습률을 얼마나 안정적으로 조정할지 결정함.&lt;/li&gt;
          &lt;li&gt;𝜖 = 1e^(-8)&lt;br /&gt;
분모의 수치적 안정성을 위해 작은 값을 더하는 항임.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;학습 파라미터
    &lt;ul&gt;
      &lt;li&gt;
        &lt;p&gt;Learning Rat = 0.01
학습률은 각 업데이트 시 매개변수가 얼마나 크게 조정될지를 결정하며, 값이 너무 크면 최적화 과정이 불안정, 작으면 학습 속도가 매우 느려질 수 있음.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;Hidden Units 수 = 5&lt;br /&gt;
hidden units 수는 LSTM 네트워크 각 층에서 사용되는 뉴런의 수를 의미하며, 모델의 학습 능력, 복잡도에 영향을 미침.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;Epochs = 5000&lt;br /&gt;
에포크는 전체 데이터셋이 모델에 한 번 완전히 학습되는 횟수를 의미하며, 에포크 수가 많을수록 모델이 데이터를 더 잘학습할 수 있는 기회가 많아짐.&lt;/p&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;과적합에 대한 방안은 없는 건가?&lt;/p&gt;

&lt;p&gt;3) Input Features&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;첫 번째 케이스 (Full)&lt;br /&gt;
모든 input features를 사용함.
    &lt;ul&gt;
      &lt;li&gt;Segment Quality&lt;/li&gt;
      &lt;li&gt;Stalling Duration&lt;/li&gt;
      &lt;li&gt;Content Characteristics&lt;/li&gt;
      &lt;li&gt;기타 연구에서 사용된 feature&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;전체 특징 사용을 통해 모델이 최상의 성능을 발휘하는지 평가하기 위한 것으로 보임.&lt;br /&gt;
   &lt;br /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;두 번째 케이스 (&lt;em&gt;w/oCC&lt;/em&gt;)
Content Characteristics feature만을 제외한 나머지 세 가지 특징을 사용함.&lt;/p&gt;

    &lt;p&gt;Content Characteristics가 제외된 케이스를 평가하여, 그 중요성을 알아보기 위한 것으로 보임.&lt;br /&gt;
   &lt;br /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;세 번째 케이스 (&lt;em&gt;w/oSQ&lt;/em&gt;)
Segment Quality feature만을 제외한 나머지 세 가지 특징을 사용함.&lt;/p&gt;

    &lt;p&gt;Segment Quality가 제외된 케이스를 평가하여, 그 중요성을 알아보기 위한 것으로 보임.&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;네 번째 케이스 (&lt;em&gt;w/oSD&lt;/em&gt;)
Stalling Duration feature만을 제외한 나머지 세 가지 특징을 사용함.&lt;/p&gt;

    &lt;p&gt;Stalling Duration을 제외된 케이스를 평가하여, 그 중요성을 알아보기 위한 것으로 보임.&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;4) Evaluation Metrics&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;피어슨 상관 계수 (PCC)&lt;/strong&gt;&lt;br /&gt;
피어슨 상관 계수는 두 변수 간의 선형 상관 관계를 측정하는 지표로, -1 ~ 1사이의 값을 가지며, 1에 가까울 수록 두 변수 간의 강한 상관 관계를 가짐을 의미함.&lt;/p&gt;

    &lt;p&gt;높은 PCC 값은 모델의 예측이 실제 값과 높은 일관성을 보임을 나타내므로, 모델의 예측 결과가 실제 값과 얼마나 일치하는지를 평가하기 위한 것으로 보임.&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;루트 평균 제곱 오차 (RMSE)&lt;/strong&gt;&lt;br /&gt;
RMSE는 모델의 예측 값과 실제 값 간의 차이를 제곱한 후, 그 평균의 제곱근을 구한 값으로, 값이 낮을수록 모델의 예측이 실제 값과 가까움을 의미함.&lt;/p&gt;

    &lt;p&gt;낮은 RMSE는 모델의 예측 정확도가 높음을 의미하므로, 모델이 출력하는 오류가 어떻게 나타는지 확인하고 피어슨 상관 계수와 함께 비교하기 위해 사용되는 것으로 보임.&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;평균화&lt;br /&gt;
100개의 테스트 세트에 대해 PCC와 RMSE를 계산, 평균하여 최종 성능을 평가하여, 일관성과 모델의 전반적인 성능 결과에 대한 신뢰도를 높이고자 한 것으로 보임.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;b-roles-of-segment-features&quot;&gt;B. Roles of Segment Features&lt;/h3&gt;

&lt;p&gt;본 하위 섹션에서는 제안된 접근법에서 세그먼트 features가 어떤 역할을 하는지 조사한다.&lt;br /&gt;
이를 위해서 섹션 &lt;em&gt;III-A3&lt;/em&gt; 에서 제시된 네 가지의 input features의 케이스에 대해 제안된 접근법의 예측 성능을 평가한다.&lt;/p&gt;

&lt;p&gt;Figure 4는 제안된 접근법의 Full 및 &lt;em&gt;w/oCC&lt;/em&gt; 케이스에서, epochs &lt;em&gt;e&lt;/em&gt; 가 500에서 5000까지 500 단위로 증가할 때의 PCC와 RMSE 값을 보인다.&lt;br /&gt;
참고로, 세그먼트 quality feature는 섹션 &lt;em&gt;II-B1&lt;/em&gt; 에서 언급된 세 가지 metric 중 하나로 표현된다.&lt;br /&gt;
Figure 4에서 알 수 있듯이, 특정 세그먼트 quality metric을 기준으로 했을 때 훈련 세트는 항상 테스트 세트보다 더 높은 PCC와 더 낮은 RMSE 값을 가진다.&lt;/p&gt;

&lt;p&gt;훈련 세트와 테스트 세트 모두에서 epochs &lt;em&gt;e&lt;/em&gt; 가 처음 증가할 때 PCC값은 빠르게 증가하고 RMSE 값은 급격히 감소한다.&lt;br /&gt;
에포크가 더 증가하면, PCC와 RMSE 값이 안정화된다.&lt;br /&gt;
안정 상태에 도달하는 속도는 S-MOS 및 PSNR metrics가 BR metric보다 훨씬 빠르다.&lt;br /&gt;
구체적으로, Full 및 &lt;em&gt;w/oCC&lt;/em&gt; 케이스 모두에서 최적의 epochs &lt;em&gt;e&lt;/em&gt; 는 S-MOS, PSNR metrics는 1500, BR metric은 2500이다.&lt;/p&gt;

&lt;p&gt;BR 및 PSNR metrics의 경우, Full 케이스가 &lt;em&gt;w/oCC&lt;/em&gt; 케이스보다 훨씬 높은 예측 성능을 달성한다.&lt;br /&gt;
S-MOS 지표의 경우, Full 케이스와 w/oCC 케이스는 유사한 예측 성능을 보인다.&lt;br /&gt;
이 결과는 세그먼트 quality metric으로 S-MOS가 사용될 때, content characteristics feature를 추가로 사용하는 것이 제안된 접근법의 개선에 큰 도움이 되지 않음을 시사한다.&lt;br /&gt;
반면, BR 및 PSNR 지표의 경우, content characteristics feature를 포함하는 것이 필요하다.&lt;br /&gt;
즉, content characteristics feature의 역할은 세그먼트 quality feature를 나타내는 데 사용된 지표에 따라 달라진다.&lt;/p&gt;

&lt;p&gt;Full 케이스에서는 세그먼트 quality metric이 S-MOS일 때 예측 성능이 가장 높다.&lt;br /&gt;
이는 S-MOS가 세그먼트 quality feature를 나타내는 데 가장 적합한 지표임을 의미한다.&lt;br /&gt;
반면, BR 지표를 사용할 경우 예측 성능이 가장 낮게 나타난다.&lt;br /&gt;
이하의 내용에서는 최상의 예측 성능을 보인 S-MOS를 제안된 접근법의 세그먼트 quality metric으로 사용한다.&lt;/p&gt;

&lt;p&gt;Table &lt;strong&gt;I&lt;/strong&gt;는 epochs가 5000일 때 Full, &lt;em&gt;w/oSQ&lt;/em&gt;, &lt;em&gt;w/oSD&lt;/em&gt; 세 가지 경우에 대한 제안된 접근법의 예측 성능을 보인다.&lt;br /&gt;
세그먼트 quality feature나 stalling duration feature가 제안된 접근법의 입력에서 제외되었을 때, PCC 값이 크게 감소하고 RMSE 값이 상당히 증가하는 것을 알 수 있다.&lt;br /&gt;
이는 품질 변동과 stalling event가 세션의 전체 품질에 중요한 영향을 미친다는 것을 나타낸다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h4 id=&quot;notes-5&quot;&gt;Notes&lt;/h4&gt;

&lt;p&gt;훈련 세트가 테스트 세트에 비해 더 좋은 성능을 보이는 것은 일반적으로 발생할 수 있으나, 과적합으로 인한 것일 수도 있음.&lt;/p&gt;

&lt;p&gt;훈련 세트와 테스트 세트 모두에서 epochs 축에 따라 급격한 곡선을 그리며 성능이 향상됨. PCC: 예측과 실제값의 상관 관계를 높임. RMSE: 예측 오류 감소.&lt;/p&gt;

&lt;p&gt;이후 안정화 단계에 접어들 게 되며, 안정화 속도는 S-MOS, PSNR metrics가 BR metric보다 빠름.&lt;/p&gt;

&lt;p&gt;즉, BR metric을 사용할 때에 더 많은 학습을 필요로 함.&lt;/p&gt;

&lt;p&gt;metric을 비교할 때 안정화되는 데까지 S-MOS, PSNR이 1000 에포크 가량 앞서므로, BR metric보다 효율적일 수 있을 것으로 보임.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;세그먼트 quality metric에 따른 Content Characteristics Feature의 기여 차이
    &lt;ul&gt;
      &lt;li&gt;BR 및 PSNR
Full 케이스가 &lt;em&gt;w/oCC&lt;/em&gt; 케이스보다 훨씬 더 높은 예측 성능을 보임.&lt;br /&gt;
즉, BR 및 PSNR을 세그먼트 quality metric으로 사용할 때, content characteristics feature가 모델의 예측 성능에 크게 기여함을 의미함.&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
      &lt;li&gt;S-MOS&lt;br /&gt;
Full 케이스와 &lt;em&gt;w/oCC&lt;/em&gt; 케이스 간의 예측 성능이 거의 동일하게 나타남.&lt;br /&gt;
즉, S-MOS를 세그먼트 quality metirc으로 사용할 때, content characteristics feature가 성능 개선에 큰 영향을 미치지 못함을 의미함.&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
      &lt;li&gt;Content Characteristics Feature의 기여
        &lt;ul&gt;
          &lt;li&gt;BR 및 PSNR&lt;br /&gt;
BR 및 PSNR은 비디오의 complexity와 품질에 따라 변화하므로, content characteristics feature 사용을 통해 성능이 개선될 수 있음으로 예상됨.&lt;/li&gt;
          &lt;li&gt;S-MOS&lt;br /&gt;
S-MOS는 피험자의 주관적 평가에 기반한 품질 지표이기에, 이미 시각적 품질로 평가되었으므로, content characteristics feature의 사용이 큰 효과를 낼 수 없는 것으로 예상됨.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Tabel &lt;strong&gt;I&lt;/strong&gt; 분석&lt;br /&gt;
SQ와 SD feature의 중요성을 강조하기 위한 데이터&lt;br /&gt;
Full 케이스, &lt;em&gt;w/oSQ&lt;/em&gt;, &lt;em&gt;w/oSD&lt;/em&gt; 세 가지 경우에 대한 성능이 상당히 낮아짐.&lt;br /&gt;
즉, segment quality, stalling durations는 모델의 input feature로 필수적임을 나타냄.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;c-comparison-with-existing-approaches&quot;&gt;C. Comparison with Existing Approaches&lt;/h3&gt;

&lt;p&gt;이 부분에서는 제안된 접근법을 Tran의 [5], P.1203.3 [25][27], Singh의 [9], ATLAS [10]의 네 가지 기존 접근법과 비교할 것이다.&lt;br /&gt;
제안된 접근법의 경우, Full 케이스와 S-MOS segment quality metric이 사용된다.&lt;/p&gt;

&lt;p&gt;Table &lt;strong&gt;II&lt;/strong&gt;는 테스트 세트에 대한 제안된 접근법과 기존 접근법들의 PCC와 RMSE 값을 보여준다.&lt;br /&gt;
제안된 접근법이 가장 높은 예측 성능을 달성하며 기존 접근법을 능가하는 것을 알 수 있다.&lt;br /&gt;
특히, 제안된 접근법의 PCC와 RMSE 값은 각각 0.96, 0.26이다.&lt;br /&gt;
이 결과는 LSTM 네트워크가 random neural network와 SVM보다 HAS 세션의 전체 품질을 예측하는 데 더 효과적임을 나타낸다.&lt;br /&gt;
따라서 세션 내에서 세그먼트 간의 시간적 관계는 전체 품질 예측에 필수적이다.&lt;br /&gt;
이는 segment quality 값의 평균과 stalling duration의 합계와 같은 통계치를 사용하는 기존 접근법들이 제안된 접근법보다 낮은 예측 성능을 보이는 이유를 설명해 준다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h4 id=&quot;notes-6&quot;&gt;Notes&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;제안된 접근법과 네 가지 기존 접근법과의 비교
    &lt;ul&gt;
      &lt;li&gt;Tran [5]&lt;br /&gt;
수학적 함수를 통한 분석 모델으로 비디오 스트리밍 세션의 품질을 예측한 연구&lt;br /&gt;
특정 시점에서의 품질이 아닌, 전체 세션의 품질을 예측하기 위해 단순히 평균하거나 더하는 방식을 사용하였음.&lt;br /&gt;
PCC는 높으나 RMSE도 높아 오류가 큰 것을 확인할 수 있음.&lt;br /&gt;
이는 품질 변동이나 stalling event의 발생이 전체 세션의 품질에 미치는 영향을 제대로 반영하지 못할 것으로 보임.&lt;/li&gt;
      &lt;li&gt;P.1203.3 [25][27]&lt;br /&gt;
ITU-T P.1203.3에 기반한 접근법으로, 비디오 품질과 stalling event를 평가하는 표준화된 방법&lt;/li&gt;
      &lt;li&gt;Singh’s [9]&lt;br /&gt;
머신러닝을 활용한 접근법으로, Random Neural Network를 사용함.&lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;ATLAS [10]&lt;br /&gt;
머신러닝을 활용한 접근법으로 SVM의 회귀 변형인 SVR을 사용하여 비디오 스트리밍 세션의 품질을 예측함.&lt;br /&gt;
SVR은 입력 데이터를 고차원 공간에 매핑하여 회귀 평면을 찾는 모델으로, 복잡한 패턴에 강함.&lt;br /&gt;
Random Neural Network를 사용한 Singh에 비교하여 더 높은 PCC, 그와 비슷한 수준으로 낮은 RMSE를 보인 것으로 보아 ATLAS가 성능 향상에 더 좋은 것으로 보인다.&lt;/p&gt;

        &lt;p&gt;&lt;br /&gt;
PCC가 0.96, RMSE가 0.26으로 다른 접근법들에 비해 월등히 좋은 성능을 보였음.&lt;br /&gt;
이는 모델을 사용한다는 점, 또한 다른 모델들과 달리 시계열 데이터 처리에 능한 LSTM을 사용하는 것이 HAS에서도 효과적으로 작용한 것으로 보임.&lt;/p&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;본 연구에서는 HTTP Adaptive Streaming (HAS) 세션의 전체 품질을 예측하기 위해 LSTM 네트워크를 사용하는 새로운 고급 머신러닝 접근법을 제안했다.&lt;br /&gt;
제안된 접근법은 segment quality, stalling duration, content characteristics, padding 네 가지의 세그먼트 features를 고려했다.&lt;br /&gt;
실험 결과를 바탕으로, LSTM 네트워크가 HAS 세션의 전반적인 품질을 예측하는 데에 효과적임이 입증되었다.&lt;br /&gt;
또한, 세션 내 세그먼트 간의 시간적 관계가 전반적인 품질 예측에 있어 필수적이라는 것을 확인하였다.&lt;br /&gt;
추가로, segment quality feature를 나타내는 데 있어 segment-MOS가 가장 적합한 지표로 나타났다.&lt;br /&gt;
향후 연구에서는 제안된 접근법을 HAS 적응 전략 성능 평가에 적용할 계획이다.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;트랜스포머와 같은 근래에 많이 사용되는 모델을 사용하면 어떨지? 좋다면 왜 좋을지에 대한 근거 생각해 보기.&lt;br /&gt;
명백한 단점이 있는지 조사해 보기.&lt;/p&gt;

&lt;hr /&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;날 죽이지 못하는 고통은 날 강하게 만들 뿐이다!&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;blockquote&gt;
  &lt;h3 id=&quot;profile&quot;&gt;Profile&lt;/h3&gt;

  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Seong Hun KIM&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Student&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;Dept. of Computer Science Engineering | Yeungnam University, Repulic of Korea&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Convolution_Filter_Application/assets/118245330/37c81d9e-cfb8-4aee-8497-ff1071b2458b&quot; alt=&quot;yu signature&quot; /&gt;&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Phone&lt;/strong&gt; &lt;a href=&quot;tel:010-6685-1140&quot;&gt;010 - 6685 - 1140&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Mail&lt;/strong&gt; &lt;a href=&quot;mailto:tgh7544@naver.com&quot;&gt;tgh7544@naver.com&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;LinkTree&lt;/strong&gt; &lt;a href=&quot;https://linktr.ee/HoonC_corgi&quot;&gt;https://linktr.ee/HoonC_corgi&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</description>
        <pubDate>Mon, 12 Aug 2024 00:00:00 +0000</pubDate>
        <link>https://hoonc-corgi.github.io/2024/08/12/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-An-LSTM-based-Approach-for-Overall-Quality-Prediction-in-HTTP-Adaptive-Streaming_Huyen-T.-T.-Tran-,-Duc-V.-Nguyen-,-Duong-D.-Nguyen-,-Nam-Pham-Ngoc-,Truong-Cong-Thang.html</link>
        <guid isPermaLink="true">https://hoonc-corgi.github.io/2024/08/12/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-An-LSTM-based-Approach-for-Overall-Quality-Prediction-in-HTTP-Adaptive-Streaming_Huyen-T.-T.-Tran-,-Duc-V.-Nguyen-,-Duong-D.-Nguyen-,-Nam-Pham-Ngoc-,Truong-Cong-Thang.html</guid>
        
        
      </item>
    
      <item>
        <title>논문 어휘 정리</title>
        <description>&lt;!-- TOC --&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#논문-어휘-정리&quot;&gt;논문 어휘 정리&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#전문-용어&quot;&gt;전문 용어&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#영단어&quot;&gt;영단어&lt;/a&gt;
&lt;!-- TOC --&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;논문-어휘-정리&quot;&gt;논문 어휘 정리&lt;/h1&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;전문-용어&quot;&gt;전문 용어&lt;/h2&gt;

&lt;dl&gt;
  &lt;dt&gt;MLO&lt;/dt&gt;
  &lt;dd&gt;Multi-Link Operation
&lt;br /&gt;&lt;br /&gt;&lt;/dd&gt;
  &lt;dt&gt;MLD&lt;/dt&gt;
  &lt;dd&gt;Multi-Link capable Device
&lt;br /&gt;&lt;br /&gt;&lt;/dd&gt;
  &lt;dt&gt;Network Transparency&lt;/dt&gt;
  &lt;dd&gt;네트워크 투명성, 상위 계층은 하위 계층에서 일어나는 작업을 알지 못하도록 하는 것으로, 하위 계층의 작업이 상위 계층에 영향을 주지 않도록 하여 효율을 높임.
&lt;br /&gt;&lt;br /&gt;&lt;/dd&gt;
  &lt;dt&gt;MSDU&lt;/dt&gt;
  &lt;dd&gt;상위 계층의 데이터를 MAC 계층에서 처리하기 위해 사용되는 데이터 단위로, MAC 계층으로 하달된 MSDU는 프레임으로 구성되어 PHY 계층을 통해 송신됨.
&lt;br /&gt;&lt;br /&gt;&lt;/dd&gt;
  &lt;dt&gt;STR (Simultaneous Transmission and Reception) operation&lt;/dt&gt;
  &lt;dd&gt;무선 장치가 동시에 데이터를 송신하고 수신할 수 있는 기능으로, MIMO를 통해 여러 채널을 통해 데이터 동시 송수신이 가능하게 하는 것으로, 하나의 안테나로
IDC Interference를 야기할 수 있음.
&lt;br /&gt;&lt;br /&gt;&lt;/dd&gt;
  &lt;dt&gt;IDC Interference&lt;/dt&gt;
  &lt;dd&gt;하나의 기기 내에서 동시에 동작하는 무선 통신이 서로 간섭을 일으키는 것.
&lt;br /&gt;&lt;br /&gt;&lt;/dd&gt;
  &lt;dt&gt;Power leakage&lt;/dt&gt;
  &lt;dd&gt;무선 신호가 예상된 범위나 채널을 벗어나 인접 채널로 신호가 확산되는 현상으로, 간섭을 일으킬 수 있음. 주로 송신기의 출력과 관련되어 있으며, 인접 채널로의 신호 누출으로 발생하는 간섭임.
&lt;br /&gt;&lt;br /&gt;&lt;/dd&gt;
  &lt;dt&gt;Doze&lt;/dt&gt;
  &lt;dd&gt;장치가 저전력 모드로 전환되어 활동을 최소화 하고 에너지 소비를 줄이는 상태
&lt;br /&gt;&lt;br /&gt;&lt;/dd&gt;
  &lt;dt&gt;TXOP&lt;/dt&gt;
  &lt;dd&gt;단말이 프레임을 전송할 기회를 가지는 시간 구간
&lt;br /&gt;&lt;br /&gt;&lt;/dd&gt;
  &lt;dt&gt;TXOP aggreagation&lt;/dt&gt;
  &lt;dd&gt;여러 데이터 프레임을 전송할 수 있는 기회를 여러 네트워크 인터페이스나 장치가 공유할 수 있도록 하는 것으로, 
인터페이스 A의 TXOP에 다른 인터페이스의 데이터를 함께 전송할 수 있는지 확인하고, 이를 하나의 패킷으로 합쳐서 전송하는 과정을 의미한다.
&lt;br /&gt;&lt;br /&gt;&lt;/dd&gt;
  &lt;dt&gt;end-time alignment&lt;/dt&gt;
  &lt;dd&gt;무선 링크가 동시에 데이터를 전송할 때 이들의 전송이 종료되는 시간을 맞추는 기술
&lt;br /&gt;&lt;br /&gt;&lt;/dd&gt;
  &lt;dt&gt;presence bitmap&lt;/dt&gt;
  &lt;dd&gt;각 비트가 특정 속성이 존재하는지를 나타내는 비트맵으로, 특정 데이터 프레임에 4개의 속성(A, B, C, D)가 있을 때 presence bitmap이 (1, 1, 0, 1)이라면 C 속성이 데이터 필드에 없음을 의미함.
&lt;br /&gt;&lt;br /&gt;&lt;/dd&gt;
  &lt;dt&gt;air-time&lt;/dt&gt;
  &lt;dd&gt;무선 네트워크에서 특정 프레임이 전송되기 위해 채널을 점유하는 시간
&lt;br /&gt;&lt;br /&gt;&lt;/dd&gt;
  &lt;dt&gt;HAS (HTTP Adaptation Streaming)&lt;/dt&gt;
  &lt;dd&gt;네트워크 상태에 따라 비디오 품질을 동적으로 선택하여 클라이언트에 전송하는 메커니즘으로, 비디오를 여러 quality를 가지는 상이한 버전으로 인코딩하며, 각 버전 내에서도 여러 세그먼트로 분핧한 후 HTTP 서버에 저장함. 스트리밍 세션 동안 적절히 선택하여 전송하는 과정임.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;&lt;/dd&gt;
  &lt;dt&gt;Stalling in HAS&lt;/dt&gt;
  &lt;dd&gt;HAS에서 이전 세그먼트의 재생 길이 동안 세그먼트가 클라이언트에 도착하지 못하여 재생이 중단되는 현상
&lt;br /&gt;&lt;br /&gt;&lt;/dd&gt;
&lt;/dl&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;영단어&quot;&gt;영단어&lt;/h2&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;영단어&lt;/th&gt;
      &lt;th&gt;의미&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;concurrently&lt;/td&gt;
      &lt;td&gt;동시에&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;revision&lt;/td&gt;
      &lt;td&gt;개정, 수정&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;demanding&lt;/td&gt;
      &lt;td&gt;까다로운&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;modifications&lt;/td&gt;
      &lt;td&gt;개정, 수정&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;amendments&lt;/td&gt;
      &lt;td&gt;수정 사항&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;analogusly&lt;/td&gt;
      &lt;td&gt;비슷하게&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;comprehensive&lt;/td&gt;
      &lt;td&gt;종합적인&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;depict&lt;/td&gt;
      &lt;td&gt;묘사하다&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;reorder&lt;/td&gt;
      &lt;td&gt;재정렬&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;inherently&lt;/td&gt;
      &lt;td&gt;본질적으로&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fluctuation&lt;/td&gt;
      &lt;td&gt;변동&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;video-streaming-background&quot;&gt;Video Streaming Background&lt;/h2&gt;
&lt;p&gt;기본적으로 HTTP에서 스트리밍이 이루어짐
1) Progressive Streaming&lt;br /&gt;
HTTP 통해서 서버 -&amp;gt; 클라이언트로 비디오 파일을 보냄&lt;br /&gt;
영상 다운 다 되기 전에 재생될 수는 있지만 네트워크 안 좋거나 하는 이유로 빨리 처리 안 되면 영상 멈춤&lt;/p&gt;

&lt;p&gt;2) Adaptive Streaming&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;VoD (Video on Demand)&lt;br /&gt;
유저 입장에선 언제든 어떤 영상을 선택하고 재생할 수 있도록 하는 스트리밍 방식&lt;br /&gt;
메인 서버 부하, 네트워크 대역폭 비용이 비쌈. 반드시 모든 유저에게 네트워크 스트림이 연결되어야..&lt;/li&gt;
  &lt;li&gt;Adaptive Streaming&lt;br /&gt;
여러 유저가 동시에 같은 비디오 재생에 접근될 수 있음..&lt;br /&gt;
=&amp;gt; 엣지 포인트에 컨텐츠 캐싱 필수적. 메인 서버 부하 낮음.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3) Non-HAS based Streaming&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;RTMP (Real-Time Messaging Protocol)&lt;br /&gt;
TCP 기반, 저지연, 버퍼링 이슈 등에 강함.&lt;br /&gt;
스트리밍 품질, 확장성 낮고, 방화벽 넘나들면서 통신해서 보안에 안 좋음. 스트리밍 초기 역사에서는 사실상 표준으로 쓰였던,, (Adobe Flash Player)&lt;/li&gt;
  &lt;li&gt;RTSP (Real-Time Streaming Protocol)&lt;br /&gt;
옛날에 많이 쓰이던 저지연 스트리밍 기술임.&lt;br /&gt;
세그먼트 스트리밍 가능해서 다운로드 다 되기전에 재생 가능함.&lt;br /&gt;
TCP 기반에 로컬 캐싱 필요 없어서 높은 쓰루풋이 가능했음. 근데 서버도 많이 필요하고,, 규모가 너무 커,,&lt;/li&gt;
  &lt;li&gt;WebRTC (Real-Time Communication)&lt;br /&gt;
클라이언트끼리 P2P로 데이터 교환하는 방식이라 빠름. 지연율도 낮고. 다만, 확장성이 낮음.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;4) HAS based Streaming&lt;/p&gt;

&lt;hr /&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;차근차근 꾸준히!&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;–&lt;/p&gt;

&lt;blockquote&gt;
  &lt;h3 id=&quot;profile&quot;&gt;Profile&lt;/h3&gt;

  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Seong Hun KIM&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Student&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;Dept. of Computer Science Engineering | Yeungnam University, Repulic of Korea&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Convolution_Filter_Application/assets/118245330/37c81d9e-cfb8-4aee-8497-ff1071b2458b&quot; alt=&quot;yu signature&quot; /&gt;&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Phone&lt;/strong&gt; &lt;a href=&quot;tel:010-6685-1140&quot;&gt;010 - 6685 - 1140&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Mail&lt;/strong&gt; &lt;a href=&quot;mailto:tgh7544@naver.com&quot;&gt;tgh7544@naver.com&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;LinkTree&lt;/strong&gt; &lt;a href=&quot;https://linktr.ee/HoonC_corgi&quot;&gt;https://linktr.ee/HoonC_corgi&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</description>
        <pubDate>Sat, 22 Jun 2024 00:00:00 +0000</pubDate>
        <link>https://hoonc-corgi.github.io/2024/06/22/%EB%85%BC%EB%AC%B8-%EC%96%B4%ED%9C%98-%EC%A0%95%EB%A6%AC.html</link>
        <guid isPermaLink="true">https://hoonc-corgi.github.io/2024/06/22/%EB%85%BC%EB%AC%B8-%EC%96%B4%ED%9C%98-%EC%A0%95%EB%A6%AC.html</guid>
        
        
      </item>
    
      <item>
        <title>[전공 내용] 컴퓨터 비전 응용 기말 범위 타이핑</title>
        <description>&lt;p&gt;본 내용은 &lt;a href=&quot;오일석, 한빛 아카데미&quot;&gt;컴퓨터 비전(Computer Vision) 기본 개념부터 최신 모바일 응용 예까지&lt;/a&gt;을 스스로 재정리한 내용을 포함합니다.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;시험범위 변경으로 정확한 시험 범위는 &lt;a href=&quot;#기계-학습&quot;&gt;기계 학습&lt;/a&gt;부터이다.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Index&lt;/p&gt;

&lt;!-- TOC --&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#&quot;&gt;매칭&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;매칭의 기초&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;거리 척도&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#---&quot;&gt;매칭 전략과 성능 분석&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#---&quot;&gt;매칭을 활용하는 여러 상황&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#roc---&quot;&gt;ROC를 이용한 성능 분석&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#--&quot;&gt;다른 매칭 전략&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#---&quot;&gt;빠른 최근접 이웃 탐색&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#kd-&quot;&gt;kd 트리&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#----binary-search-tree-bst-&quot;&gt;이진 검색 트리(Binary Search Tree, BST)&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#kd--&quot;&gt;kd 트리의 원리&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#kd----&quot;&gt;kd 트리에서 최근접 이웃 탐색&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#---&quot;&gt;근사 최근접 이웃 탐색&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#&quot;&gt;해싱&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;해싱의 원리&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;매칭에 적용&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#--&quot;&gt;위치 의존 해싱&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#--h-&quot;&gt;해시 함수 h의 동작&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#&quot;&gt;정리&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;순진한 알고리즘&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#----o--logn--&quot;&gt;이진 검색 트리(O(logN))&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#--&quot;&gt;위치 의존 해싱&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#---&quot;&gt;기하 정렬과 변환 추정&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#----&quot;&gt;최소 제곱법과 강인한 추정 기법&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#--&quot;&gt;매칭 문제로의 확장&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#--&quot;&gt;강인한 추정 기법&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#ransac&quot;&gt;RANSAC&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#ransac-&quot;&gt;RANSAC의 원리&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#ransac-&quot;&gt;RANSAC의 확장&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#--&quot;&gt;웹과 모바일 응용&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#--&quot;&gt;파노라마 영상 제작&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#---&quot;&gt;파노라마 영상 제작 과정&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#---&quot;&gt;파노라마 영상 제작 알고리즘&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;사진 관광&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;기계 학습&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#--&quot;&gt;기계 학습의 기초&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#mitchell-&quot;&gt;Mitchell의 정의&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#---&quot;&gt;지도 학습과 비지도 학습&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;지도 학습&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;비지도 학습&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;준지도 학습&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#----&quot;&gt;재 샘플링을 이용한 성능 평가&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#k---&quot;&gt;k-겹 교차 검증&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#&quot;&gt;붓스트랩&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#&quot;&gt;신경망&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#&quot;&gt;퍼셉트론&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;다층 퍼셉트론&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#mlp--multi-layers-perceptron-&quot;&gt;MLP(Multi Layers Perceptron)&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;깊은 학습&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#--&quot;&gt;인식 프로그램 제작&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#cnn&quot;&gt;CNN&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#svm&quot;&gt;SVM&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;분류기 앙상블&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;에이더 부스트&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;임의 숲&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#----&quot;&gt;기계 학습을 이용한 얼굴 검출&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;얼굴 검출&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#---&quot;&gt;비올라 존스 얼굴 검출&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;분류기 앙상블&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#----&quot;&gt;적분 영상을 이용한 속도 향상&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#--&quot;&gt;얼굴 검출 알고리즘&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#&quot;&gt;인식&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;사례 인식&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;기하 정렬&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#&quot;&gt;단어가방&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;범주 인식&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;단어 가방&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#----&quot;&gt;단어 가방의 한계와 극복 노력&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;부품 모델&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;별자리 모델&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#cnn&quot;&gt;CNN&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;사람 인식&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#&quot;&gt;모션&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;움직이는 상황&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;영상 일관성&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#&quot;&gt;차영상&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;모션 필드&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#3---v_3-&quot;&gt;3차원 모션 벡터 V_3의 복원&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#2---&quot;&gt;2차원 모션 벡터 추정&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#----&quot;&gt;모션 필드 추정이 어려운 상황&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#&quot;&gt;광류&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#--&quot;&gt;광류 추정의 원리&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#--&quot;&gt;광류 추정 알고리즘&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#lucas-kanade---lk-&quot;&gt;Lucas-Kanade 알고리즘(LK)&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#horn-schunk---hs-&quot;&gt;Horn-Schunk 알고리즘(HS)&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;광류의 활용&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;물체 추적&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#klt--&quot;&gt;KLT 추적 알고리즘&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#3-&quot;&gt;3차원 비전&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;본질 영상&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;외관과 본질&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#barrow-&quot;&gt;Barrow의 아이디어&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;그림자 제거&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#finalyson&quot;&gt;Finalyson&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#&quot;&gt;스테레오&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;깊이 측정&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;투영 기하&lt;/a&gt;
                &lt;ul&gt;
                  &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;스테레오 기하&lt;/a&gt;&lt;/li&gt;
                &lt;/ul&gt;
              &lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#--&quot;&gt;밀집된 깊이 영상&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#-----&quot;&gt;순진한 알고리즘(전수 조사)&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#--&quot;&gt;지역 탐색 방법&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#--&quot;&gt;전역 탐색 방법&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;능동 센서&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;구조 광&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#&quot;&gt;키넥트&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#--&quot;&gt;깊이 영상의 인식&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#--&quot;&gt;사람의 자세 추정&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;장면 이해&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#--&quot;&gt;선택적 주의 집중&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#&quot;&gt;문맥&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;영상 파싱&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#basics-of-digital-photography&quot;&gt;Basics of Digital Photography&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#exposure&quot;&gt;Exposure&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#depth-of-field&quot;&gt;Depth of Field&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#focus-and-defocus&quot;&gt;Focus and Defocus&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#&quot;&gt;시야각&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#iso&quot;&gt;ISO&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#summary-of-iso&quot;&gt;Summary of ISO&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#white-balance&quot;&gt;White Balance&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#summary-of-white-balancing&quot;&gt;Summary of White Balancing&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#-&quot;&gt;색 온도&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#--&quot;&gt;색 온도의 특성&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#summary-of-color-temperature&quot;&gt;Summary of Color Temperature&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#other-issues&quot;&gt;Other issues&lt;/a&gt;
&lt;!-- TOC --&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;매칭&quot;&gt;매칭&lt;/h1&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;어떤 대상을 다른 것과 비교하여 같은 것인지 알아내는 과정
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;topic&lt;br /&gt;
거짓 긍정(아웃라이어)를 어떻게 배제할 것인가?&lt;br /&gt;
매칭 속도를 어떻게 높일 것인가?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;매칭의-기초&quot;&gt;매칭의 기초&lt;/h2&gt;
&lt;h3 id=&quot;거리-척도&quot;&gt;거리 척도&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;유클라디안 거리&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;마할라 노비스 거리&lt;br /&gt;
공분산 행렬을 이용, 확률 분포 고려&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;화이트닝변환&lt;br /&gt;
공분산 행렬이 단위 행렬 I가 되도록 현재 벡터 x를 y로 변환&lt;br /&gt;
시그마 = I일 때 두 거리 유칼라디안, 마할라 노비스 거리가 같아진다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;매칭-전략과-성능-분석&quot;&gt;매칭 전략과 성능 분석&lt;/h3&gt;
&lt;h4 id=&quot;매칭을-활용하는-여러-상황&quot;&gt;매칭을 활용하는 여러 상황&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;파노라마 영상 제작&lt;/li&gt;
  &lt;li&gt;물체 인식 또는 증강 현실
    &lt;ul&gt;
      &lt;li&gt;모델 영상은 깨끗한 배경 위에 물체가 놓임.&lt;/li&gt;
      &lt;li&gt;장면 영상은 심한 혼재와 가림이 발생&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;roc를-이용한-성능-분석&quot;&gt;ROC를 이용한 성능 분석&lt;/h4&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;T를 점점 키우며 측정한 거짓 긍정률과 참 긍정률을 나타낸 그래프
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;ROC의 X축은 참 긍정률, Y축은 거짓 긍정률이다.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;임계값 T가 낮아질 수록 거짓 부정은 커진다.&lt;/li&gt;
  &lt;li&gt;임계값 T가 커질 수록 거짓 긍정이 커진다.&lt;/li&gt;
  &lt;li&gt;ROC 그래프가 좌상단에 가까울 수록 좋은 성능을 보인다. =&amp;gt; 참 긍정률이 높을 수록 거짓 긍정률이 낮을 수록 좋다.&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;AUC(ROC 그래프에서의 곡선 아래 면적)&lt;br /&gt;
성능을 하나의 수치로 표현할 때 사용함.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;참 긍정률&lt;/dt&gt;
      &lt;dd&gt;TPR = TP/(TP + FN) = Recall&lt;br /&gt;
실제로 참인 것 중 모델이 긍정한 것의 비율 = 실제로 참인 것 중 모델도 인정한 것&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;거짓 긍정률&lt;/dt&gt;
      &lt;dd&gt;FPR = FP/(FP + TN)&lt;br /&gt;
실제로 거짓인 것 중 모델이 긍정한 것의 비율 = 실제로 거짓인 것 중 모델도 인정한 것&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;다른-매칭-전략&quot;&gt;다른 매칭 전략&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;최근접 이웃 전략&lt;br /&gt;
a의 최근접 이웃 b가 d(a, b) &amp;lt; T를 만족할 때 매칭 성공&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;최근접 거리 비율 전략&lt;br /&gt;
좋은 성능을 보임.&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;최근접 거리 b_i와 두 번째 b_k가 d(a_i, b_i) / d(a_i, b_k) &amp;lt; T를 만족하면 매칭 성공&lt;/li&gt;
      &lt;li&gt;ex) SIFT&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;빠른-최근접-이웃-탐색&quot;&gt;빠른 최근접 이웃 탐색&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;순진한 알고리즘&lt;br /&gt;
모든 쌍을 전수 검사함.&lt;br /&gt;
=&amp;gt; 시간이 많이 소요됨.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;특징 벡터를 미리 인덱싱해 두는 효율적인 알고리즘&lt;br /&gt;
데이터 마이닝, 빅테이터, 생물 정보학 등에 활용됨.&lt;/p&gt;
    &lt;ol&gt;
      &lt;li&gt;kd 트리&lt;/li&gt;
      &lt;li&gt;위치 의존 해싱&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;kd-트리&quot;&gt;kd 트리&lt;/h3&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;두 가지 다른 점을 수용할 수 있도록 BST를 확장한 기법
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;이진-검색-트리binary-search-tree-bst&quot;&gt;이진 검색 트리(Binary Search Tree, BST)&lt;/h4&gt;
&lt;p&gt;O(logN)&lt;br /&gt;
 매칭 문제&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;검색 키(특징 벡터)가 여러 개의 실수로 구성된 벡터&lt;/li&gt;
  &lt;li&gt;동일한 값을 갖는 노드를 찾는 것이 아닌, 최근접 이웃을 찾음&lt;br /&gt;
  =&amp;gt; BST를 그대로 적용할 수는 없음.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;kd-트리의-원리&quot;&gt;kd 트리의 원리&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;kd 트리의 표기
    &lt;ul&gt;
      &lt;li&gt;n개의 벡터를 가지고 kd 트리를 구축 X = { x_1, x_2, … , x_n}&lt;/li&gt;
      &lt;li&gt;x_i는 d차원 벡터&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
  &lt;li&gt;루트 노드는 X를 두 개의 부분 집합 X_left, X_right로 나눔(중앙값 기준 1:1의 비율).&lt;/li&gt;
  &lt;li&gt;분할 효과를 극대화하려면 각 차원 분산 중 최댓값을 가지는 축 k를 선택해야 함.&lt;/li&gt;
  &lt;li&gt;위 과정을 반복&lt;/li&gt;
&lt;/ol&gt;

&lt;h4 id=&quot;kd-트리에서-최근접-이웃-탐색&quot;&gt;kd 트리에서 최근접 이웃 탐색&lt;/h4&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;입력 데이터 x = (n, m)에 대하여 축을 기준으로 
n 또는 m을 비교하여 작으면 왼쪽, 
크면 오른쪽으로 분기하는 것을 반복한다.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;kd 트리의 결과가 반드시 최근접 이웃인 것은 아니다.&lt;br /&gt;
&lt;strong&gt;=&amp;gt; 분할 평면의 건너편에 더 가까운 노드가 있을 수 있기 때문&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;스택을 이용하여 백트래킹한다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;단점&lt;br /&gt;
d = 10을 넘게 되면 순진한 알고리즘과 비슷히 낮은 속도를 보인다.&lt;/li&gt;
  &lt;li&gt;=&amp;gt; 시간 효율 개선 필요&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;근사-최근접-이웃-탐색&quot;&gt;근사 최근접 이웃 탐색&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;최적 칸 우선 탐색&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;em&gt;스택 대신 우선 순위 큐인 힙을 사용함.&lt;/em&gt;&lt;/li&gt;
      &lt;li&gt;거리를 우선 순위로 사용하여 백트래킹 시 가까운 것부터 조사한다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;미리 설정한 값에 따라 조사 횟수를 제한한다.
    &lt;ul&gt;
      &lt;li&gt;근사 최근접에서 조사는 멈춰 진다.&lt;br /&gt;
&lt;em&gt;하지만 최적 칸 우선으로 조사 되기에 최근접을 찾을 확률이 높다.&lt;/em&gt;&lt;/li&gt;
      &lt;li&gt;시간 효율이 좋다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;해싱&quot;&gt;해싱&lt;/h3&gt;
&lt;h4 id=&quot;해싱의-원리&quot;&gt;해싱의 원리&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;해시 함수는 키 값을 해시 테이블의 주소로 변환한다.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;테이블에 골고루 배치할 수록 좋은 해시 함수&lt;/em&gt; =&amp;gt; 가까운 벡터의 해시 함수가 같게 나타날 확률이 높아짐.&lt;/li&gt;
  &lt;li&gt;충돌에 대한 방안이 필요함.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;매칭에-적용&quot;&gt;매칭에 적용&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;일반 해싱과의 차이
    &lt;ul&gt;
      &lt;li&gt;키는 단일 값이 아닌 실수 벡터다.&lt;/li&gt;
      &lt;li&gt;동일한 요소가 아니라 최근접 이웃을 찾는다.&lt;/li&gt;
      &lt;li&gt;일반 해싱과 반대로 가까운 벡터는 같은 통에 담길 확률이 높아야 한다.&lt;br /&gt;
=&amp;gt; &lt;em&gt;가까운 벡터는 해시 함수가 같을 확률이 높아야 한다.&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;위치-의존-해싱&quot;&gt;위치 의존 해싱&lt;/h4&gt;
&lt;p&gt;하나의 해시 함수가 아닌, 해시 함수 집합 H에서 여러개를 임의 선택하여 사용한다. 이때 해시 함수 집합 H는 난수 r, b를 설정하여 원하는 수만큼 생성할 수 있다.&lt;/p&gt;

&lt;p&gt;H에 속한 해시 함수 h가 식을 만족하면 &lt;strong&gt;위치 의존적&lt;/strong&gt;이다.&lt;br /&gt;
=&amp;gt; &lt;em&gt;가까운 벡터들의 해시 함수 값이 같을 확률이 높다.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;위치 의존을 만족하는 해시 함수를 여러 개 쓴다고 하여 좋은 것은 아니다!&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;해시-함수-h의-동작&quot;&gt;해시 함수 h의 동작&lt;/h4&gt;
&lt;p&gt;d차원 공간을 r에 소직인 초평면으로 분할한다.&lt;/p&gt;

&lt;h3 id=&quot;정리&quot;&gt;정리&lt;/h3&gt;
&lt;h4 id=&quot;순진한-알고리즘&quot;&gt;순진한 알고리즘&lt;/h4&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;전수 조사로 시간이 많이 소요됨.   =&amp;gt; 특징 벡터를 미리 인덱싱 =&amp;gt; kd 트리, 위치 의존 해싱
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;이진-검색-트리ologn&quot;&gt;이진 검색 트리(O(logN))&lt;/h4&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;매칭 문제로 BST 그대로 적용할 수 없음.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;=&amp;gt; kd 트리로 확장&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;d = 10보다 커질 경우 속도가 순진한 알고리즘과 비슷
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;=&amp;gt; 최적칸 우선 탐색: 힙 사용, 근사 최근접을 구해 최근접을 찾을 확률을 높임. 속도가 빠름&lt;/p&gt;

&lt;h4 id=&quot;위치-의존-해싱-1&quot;&gt;위치 의존 해싱&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;H에 속한 해시 함수 h가 식을 만족하면 &lt;strong&gt;위치 의존적&lt;/strong&gt;이다. =&amp;gt; 가까운 벡터들은 해시 함수 값이 같을 확률이 높다.&lt;/li&gt;
  &lt;li&gt;위치 의존적인 해시 함수를 여러 개 쓴다고 좋은 것은 아니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;기하-정렬과-변환-추정&quot;&gt;기하 정렬과 변환 추정&lt;/h2&gt;
&lt;p&gt;특징 벡터가 개별적으로 매칭을 수행하여 거짓 긍정(아웃 라이어)이 발생한다.&lt;br /&gt;
=&amp;gt; 기하 정렬으로 인라이어 집합을 찾고, 변환 행렬을 추정해야 함.&lt;br /&gt;
=&amp;gt; 기하 정렬: 인라이어 집합을 찾기 위함.&lt;/p&gt;

&lt;h3 id=&quot;최소-제곱법과-강인한-추정-기법&quot;&gt;최소 제곱법과 강인한 추정 기법&lt;/h3&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;최소 제곱법:
회귀 문제에서 직선 l까지의 거리의 오차합을
최소로 하는 직선을 찾는 방법
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;최소 제곱법은 거짓 긍정을 발생 시킨다!&lt;/em&gt;&lt;br /&gt;
=&amp;gt; 거짓 강인한 추정 기법 필요&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;매칭-문제로의-확장&quot;&gt;매칭 문제로의 확장&lt;/h4&gt;
&lt;p&gt;입력은 매칭 쌍 집합을 사용, 모델은 변환 행렬을 사용한다.&lt;/p&gt;

&lt;h4 id=&quot;강인한-추정-기법&quot;&gt;강인한 추정 기법&lt;/h4&gt;
&lt;ol&gt;
  &lt;li&gt;아웃라이어의 영향력을 약화 시키는 &lt;strong&gt;M-추정&lt;/strong&gt;을 사용한다.&lt;/li&gt;
  &lt;li&gt;중앙값 계산까지만 아웃라이어를 사용하는 &lt;strong&gt;최소 제곱 중앙값&lt;/strong&gt; 사용한다.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;ransac&quot;&gt;RANSAC&lt;/h3&gt;
&lt;h4 id=&quot;ransac의-원리&quot;&gt;RANSAC의 원리&lt;/h4&gt;
&lt;p&gt;무작위 샘플링한 두 점을 기준으로 회귀와 평가를 반복하며 직선을 찾아 간다.&lt;/p&gt;

&lt;h4 id=&quot;ransac의-확장&quot;&gt;RANSAC의 확장&lt;/h4&gt;
&lt;p&gt;매칭 쌍 집합을 사용 가능하도록 확장하여 세 개의 대응점 쌍을 임의 선택하여 회귀 평가를 반복하도록 한다.&lt;/p&gt;

&lt;h2 id=&quot;웹과-모바일-응용&quot;&gt;웹과 모바일 응용&lt;/h2&gt;
&lt;h3 id=&quot;파노라마-영상-제작&quot;&gt;파노라마 영상 제작&lt;/h3&gt;
&lt;h4 id=&quot;파노라마-영상-제작-과정&quot;&gt;파노라마 영상 제작 과정&lt;/h4&gt;
&lt;ol&gt;
  &lt;li&gt;입력&lt;/li&gt;
  &lt;li&gt;대응점 찾기&lt;/li&gt;
  &lt;li&gt;두 영상의 변환 행렬&lt;/li&gt;
  &lt;li&gt;번들 조정&lt;/li&gt;
  &lt;li&gt;이어 붙이기&lt;/li&gt;
&lt;/ol&gt;

&lt;h4 id=&quot;파노라마-영상-제작-알고리즘&quot;&gt;파노라마 영상 제작 알고리즘&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;RANSAC은 이웃한 두 영상 사이의 변환을 추정한다.&lt;/li&gt;
  &lt;li&gt;4.의 번들 조정은 영상 집합 전체에 대해 변환 행렬을 미세 조정하는 단계이다.&lt;/li&gt;
  &lt;li&gt;5.의 이어 붙이기는 다중 밴드 결합 알고리즘을 사용한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;사진-관광&quot;&gt;사진 관광&lt;/h3&gt;
&lt;p&gt;사진 관광은 &lt;strong&gt;구조 추정 문제&lt;/strong&gt;이다.&lt;br /&gt;
cf) 구조 추정 문제: 같은 장면을 여러 시점에서 찍은 영상들로부터 3차원 정보를 복원하는 것.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;장면에 나타난 물체의 자세한 정보를 복원해야 한다.&lt;/li&gt;
  &lt;li&gt;카메라 시점 정보를 복원해야 한다.&lt;/li&gt;
  &lt;li&gt;사진 광광, AR 등에 적용된다.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;기계-학습&quot;&gt;기계 학습&lt;/h1&gt;
&lt;h2 id=&quot;기계-학습의-기초&quot;&gt;기계 학습의 기초&lt;/h2&gt;
&lt;h3 id=&quot;mitchell의-정의&quot;&gt;Mitchell의 정의&lt;/h3&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;어떤 컴퓨터 프로그램이 T라는 작업을 수행하고,
프로그램의 성능 P를 평가할 때
경험 E를 통해 성능이 개선되면 프로그램은 기계학습을 하고 있다.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;컴퓨터 비전에서의 적용은 아래와 같다.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;T = 분류(인식)&lt;/li&gt;
  &lt;li&gt;E = 학습집합&lt;/li&gt;
  &lt;li&gt;P = 인식률&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;지도-학습과-비지도-학습&quot;&gt;지도 학습과 비지도 학습&lt;/h3&gt;
&lt;h4 id=&quot;지도-학습&quot;&gt;지도 학습&lt;/h4&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;학습 집합에 대하여 특징을 추출하고, 특징 공간을 학습하는 과정
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;dl&gt;
  &lt;dt&gt;학습 모델&lt;/dt&gt;
  &lt;dd&gt;매개변수 집합 θ의 최적값을 찾는 것을 목표로 한다.&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;특징 추출 방법&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;영역&lt;/li&gt;
  &lt;li&gt;슬라이딩 윈도우&lt;/li&gt;
  &lt;li&gt;관심점&lt;/li&gt;
&lt;/ul&gt;

&lt;dl&gt;
  &lt;dt&gt;일반화 능력&lt;/dt&gt;
  &lt;dd&gt;학습, 테스트 집합에 대한 성능이 높을 수록 일반화 능력이 높다.&lt;br /&gt;
cf) 과적합 시 일반화 능력은 낮아진다.&lt;/dd&gt;
&lt;/dl&gt;

&lt;h4 id=&quot;비지도-학습&quot;&gt;비지도 학습&lt;/h4&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;유사한 특징 벡터들을 모으는 군집화를 수행한다.
군집에서 유용한 정보를 추출한다.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;군집화 방법으로는 k-means, SOM, 민시프트 등이 있다.&lt;/p&gt;

&lt;h4 id=&quot;준지도-학습&quot;&gt;준지도 학습&lt;/h4&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;부류 정보가 있는 샘플과 없는 샘플이 혼재된 상황에서의 학습
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;원리&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;부류 정보가 있는 샘플로 학습, 부류 정보가 없는 샘플의 부류 정보를 추정한다.&lt;/li&gt;
  &lt;li&gt;추정된 정보로 학습을 반복한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;재-샘플링을-이용한-성능-평가&quot;&gt;재 샘플링을 이용한 성능 평가&lt;/h3&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;학습할 데이터베이스가 작은 경우 사용한다.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;k-겹-교차-검증&quot;&gt;k-겹 교차 검증&lt;/h4&gt;
&lt;ol&gt;
  &lt;li&gt;샘플 집합을 k개의 부분 집합으로 등분한다.&lt;/li&gt;
  &lt;li&gt;k-1개를 학습에 사용, 남은 하나를 테스트에 사용한다.&lt;/li&gt;
  &lt;li&gt;위 과정을 반복한다.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4 id=&quot;붓스트랩&quot;&gt;붓스트랩&lt;/h4&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;훈련 집합의 샘플링과 성능 측정을 반복, 평균 성능을 구한다.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;신경망&quot;&gt;신경망&lt;/h2&gt;
&lt;h3 id=&quot;퍼셉트론&quot;&gt;퍼셉트론&lt;/h3&gt;
&lt;p&gt;퍼셉트론의 입력은 특징 벡터이다.&lt;br /&gt;
x를 w1, w2 중 하나로 분류하는 이진 분류기이다.&lt;br /&gt;
활성화 함수로 계단 함수를 사용한다.&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;퍼셉트론의 한계&lt;/dt&gt;
  &lt;dd&gt;퍼셉트론은 선형 분류기로, 선형 분리가 불가능한 상황에 사용할 수 없다.&lt;br /&gt;
=&amp;gt; &lt;em&gt;다층 퍼셉트론으로의 확장&lt;/em&gt;&lt;/dd&gt;
  &lt;dt&gt;XOR 분류 문제&lt;/dt&gt;
  &lt;dd&gt;퍼셉트론으로는 75%의 정 인식률이 한계&lt;br /&gt;
=&amp;gt; 세 개의 퍼셉트론 층을 연결하여 해결.&lt;/dd&gt;
&lt;/dl&gt;

&lt;h3 id=&quot;다층-퍼셉트론&quot;&gt;다층 퍼셉트론&lt;/h3&gt;
&lt;p&gt;구조&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;입력층 -&amp;gt; 은닉층 -&amp;gt; 출력층
    &lt;ul&gt;
      &lt;li&gt;입력층: 특징 벡터의 차원에 따라 d개의 노드 설정&lt;/li&gt;
      &lt;li&gt;출력층: 부류 개수에 따라 m개의 노드 설정&lt;/li&gt;
      &lt;li&gt;은닉층: 노드 개수 지정&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;mlpmulti-layers-perceptron&quot;&gt;MLP(Multi Layers Perceptron)&lt;/h4&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;다층 퍼셉트론을 이용한 학습
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;dl&gt;
  &lt;dt&gt;원리&lt;/dt&gt;
  &lt;dd&gt;손실 함수 값을 줄이는 방향으로 θ를 수정해 간다.&lt;br /&gt;
=&amp;gt; &lt;strong&gt;경사하강법&lt;/strong&gt;&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;학습 시 고려 사항&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;가중치 초기화&lt;/li&gt;
  &lt;li&gt;학습률&lt;/li&gt;
  &lt;li&gt;종료 조건&lt;/li&gt;
  &lt;li&gt;샘플 처리 순서&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;깊은-학습&quot;&gt;깊은 학습&lt;/h3&gt;
&lt;h4 id=&quot;인식-프로그램-제작&quot;&gt;인식 프로그램 제작&lt;/h4&gt;
&lt;p&gt;전통적 방식&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;특징 추출의 세밀한 단계까지 사람이 설계 및 구현&lt;/li&gt;
  &lt;li&gt;분류기는 기계학습으로 따로 제작, 연결하여 사용&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;깊은 학습 방식&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;특징 추출과 분류를 하나의 학습 모델로 처리&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;cnn&quot;&gt;CNN&lt;/h4&gt;
&lt;p&gt;전통적 방식&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;고정된 마스크로 컨볼루션 연산을 수행하여 특징을 추출&lt;br /&gt;
ex) 에지 마스크&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CNN&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;문제에 가장 적합한 마스크를 학습으로 알아냄.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CNN의 구조&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;일곱 층으로 구성&lt;br /&gt;
c: 컨볼루션, s: 다운 샘플링, f: 활성화 함수, o: 아웃풋
    &lt;ol&gt;
      &lt;li&gt;C_1&lt;/li&gt;
      &lt;li&gt;S_2&lt;/li&gt;
      &lt;li&gt;C_3&lt;/li&gt;
      &lt;li&gt;S_4&lt;/li&gt;
      &lt;li&gt;C_5&lt;/li&gt;
      &lt;li&gt;F_6&lt;/li&gt;
      &lt;li&gt;O&lt;br /&gt;
5.까지의 과정은 특징 추출의 과정, 6.과 7.은 분류를 위한 과정이다.&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;층의 깊어 오차 역전파 알고리즘만으로 학습이 불가하다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;svm&quot;&gt;SVM&lt;/h2&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;직선과 데이터 포인트 사이의 최대 여백을 구하여
기존 신경망보다 우수한 일반화 성능을 보인다.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;비선형 SVM으로 확장&lt;br /&gt;
=&amp;gt; 특징 공간 확장 시 선형 분리에 유리&lt;/p&gt;

&lt;p&gt;SVM 특성&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;사용자가 설정해야 하는 매개변수가 적음&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;최적의 커널을 자동으로 찾을 수 없어&lt;/em&gt; 성능 실험으로 결정하여야 함.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;분류기-앙상블&quot;&gt;분류기 앙상블&lt;/h2&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;MLP, SVM과 같은 강한 분류기의 사용을 줄이고 약한 분류기의 사용을 늘이자
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;배깅, 부분 공간 방법 등으로 기초 분류기를 제작&lt;br /&gt;
cf) 배깅은 붓스트랩(훈련 집합의 샘플링과 성능 평가를 반복, 평균 성능을 확인)의 확장이다.&lt;/p&gt;

&lt;h3 id=&quot;에이더-부스트&quot;&gt;에이더 부스트&lt;/h3&gt;
&lt;p&gt;분류기 간에 연관성을 가지도록 제작함. =&amp;gt; 배깅에 비해 정교한 재 샘플링을 수행한다.&lt;br /&gt;
맞춘 샘플의 가중치를 낮추고, 틀린 샘플의 가중치를 높인다.&lt;/p&gt;

&lt;h3 id=&quot;임의-숲&quot;&gt;임의 숲&lt;/h3&gt;
&lt;p&gt;분류기가 독립성(임의성)을 가지도록 제작한다.&lt;br /&gt;
기초 분류기로 트리 분류기를 사용한다.&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;&lt;em&gt;임의 숲은 메타 알고리즘이다.&lt;/em&gt;&lt;/dt&gt;
  &lt;dd&gt;임의성을 가진 트리 분류기 앙상블은 모두 임의 숲으로 볼 수 있다.&lt;/dd&gt;
&lt;/dl&gt;

&lt;h2 id=&quot;기계-학습을-이용한-얼굴-검출&quot;&gt;기계 학습을 이용한 얼굴 검출&lt;/h2&gt;
&lt;p&gt;얼굴 인식 시스템은 검출 -&amp;gt; 인식 과정을 거친다.&lt;/p&gt;
&lt;h3 id=&quot;얼굴-검출&quot;&gt;얼굴 검출&lt;/h3&gt;
&lt;h4 id=&quot;비올라-존스-얼굴-검출&quot;&gt;비올라 존스 얼굴 검출&lt;/h4&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;앙상블을 이용, 전통적 접근의 반대로 접근한다.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;유사 하르 특징, 직렬 분류기를 사용한다.&lt;br /&gt;
유사 하르 특징&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;네 종류의 연산자를 사용하여 검은 영역의 합에서 흰 영역의 합을 뺀다.&lt;br /&gt;
=&amp;gt; 얼굴이 아닌 샘플에 무작위 값을 주어서 얼굴과 분별한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;분류기-앙상블-1&quot;&gt;분류기 앙상블&lt;/h4&gt;
&lt;p&gt;기초 분류기로 루트 노드 하나 뿐인 트리 그루터기를 사용한다.&lt;br /&gt;
에이더 부스트(맞춘 샘플의 가중치를 낮추고 틀린 샘플의 가중치를 높인다)를 사용하여 학습한다.&lt;/p&gt;

&lt;h4 id=&quot;적분-영상을-이용한-속도-향상&quot;&gt;적분 영상을 이용한 속도 향상&lt;/h4&gt;
&lt;p&gt;적분 영상은 좌상단에서 현재 화소까지의 합을 의미한다. 이를 통해 블록 크기와 무관히 덧셈 세 번으로 연산이 끝이난다.&lt;/p&gt;

&lt;h4 id=&quot;얼굴-검출-알고리즘&quot;&gt;얼굴 검출 알고리즘&lt;/h4&gt;
&lt;p&gt;직렬 분류기 아이디어를 이용하여 속도를 높인다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;인식&quot;&gt;인식&lt;/h1&gt;
&lt;h2 id=&quot;사례-인식&quot;&gt;사례 인식&lt;/h2&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;특정 패턴이나 객체를 인식하는 것
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;전통적 방법&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;기하학적 접근 방법이 주류&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;기하-정렬&quot;&gt;기하 정렬&lt;/h3&gt;
&lt;p&gt;모델 구축 단계와 인식 단계로 구성된다.&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;모델 구축 단계&lt;/dt&gt;
  &lt;dd&gt;물체 부류 별로 특징을 추출하고 빠른 인식을 위해 인덱싱하여 저장한다.&lt;/dd&gt;
  &lt;dt&gt;인식 단계&lt;/dt&gt;
  &lt;dd&gt;입력 영상에 어떤 물체가 있는지 알아내고 자세를 나타내는 행렬을 추정한다.&lt;br /&gt;
물체 부류 각각에 기하정렬(RANSAC)이 성공하면 인식한 것으로 간주한다.&lt;/dd&gt;
&lt;/dl&gt;

&lt;h3 id=&quot;단어가방&quot;&gt;단어가방&lt;/h3&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;정보 검색의 원리를 빌려온다.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;dl&gt;
  &lt;dt&gt;정보 검색의 원리&lt;/dt&gt;
  &lt;dd&gt;문서를 단어의 빈도 벡터로 변환&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;정보 검색 알고리즘&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;문서 간의 유사성 측정이 핵심&lt;/li&gt;
  &lt;li&gt;tf 벡터(단어 빈도 벡터)&lt;/li&gt;
  &lt;li&gt;tf-idf 벡터
    &lt;ul&gt;
      &lt;li&gt;다른 문서에 덜 나타난 단어는 가중치를 높이려는 의도&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;유사성 측정
    &lt;ul&gt;
      &lt;li&gt;문서에서 추출한 빈도 벡터 V_1과 V_2를 코사인 유사도로 비교&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;영상 인식에 적용
    &lt;ul&gt;
      &lt;li&gt;SIFT나 SURF 등 지역 특징이 훌륭한 후보를 단어로 사용한다.&lt;/li&gt;
      &lt;li&gt;&lt;em&gt;추출된 특징 벡터가 달라 사전 크기가 너무 커질 뿐 아니라 빈도를 셀 수 없어지는 문제가 있음.&lt;/em&gt;  &lt;br /&gt;
ex) (0.9, 0.2, 0.8)과 (0.9, 0.2000001, 0.8)을 다른 단어로 취급&lt;/li&gt;
      &lt;li&gt;해결책
        &lt;ul&gt;
          &lt;li&gt;&lt;strong&gt;벡터 양자화&lt;/strong&gt;(특징 공간을 구간으로 나누고 각 구간의 대표 벡터를 단어로 간주) 적용&lt;br /&gt;
=&amp;gt; &lt;strong&gt;시각 단어화&lt;/strong&gt; =&amp;gt; &lt;em&gt;정보 검색 기법 사용 가능&lt;/em&gt;&lt;/li&gt;
          &lt;li&gt;새로운 특징 벡터 입력 시 구간에 따라 시각 단어로 매핑&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;범주-인식&quot;&gt;범주 인식&lt;/h2&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;객체를 특정 범주로 인식하고 분류 하는 것 ### 단어 가방 기계학습(분류)를 통해 범주 인식에 단어 가방을 사용
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;적용 사례&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Csurka 2004
    &lt;ul&gt;
      &lt;li&gt;해리스 어파인 관심점과 SIFT 기술자 사용&lt;/li&gt;
      &lt;li&gt;k-means로 벡터 양자화&lt;/li&gt;
      &lt;li&gt;SVM 분류기 사용&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Zhang 2007
    &lt;ul&gt;
      &lt;li&gt;여러 종류의 특징과 SVM의 여러 커널에 대해 성능을 비교&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Opelt 2006
    &lt;ul&gt;
      &lt;li&gt;에이더 부스트&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;단어-가방의-한계와-극복-노력&quot;&gt;단어 가방의 한계와 극복 노력&lt;/h3&gt;
&lt;p&gt;물체의 모양은 배제한 채 외관(텍스처)만 사용하는 외관 기반이다.&lt;br /&gt;
=&amp;gt; &lt;em&gt;코렐로노그램, 피라미드 등을 활용&lt;/em&gt;&lt;/p&gt;

&lt;h3 id=&quot;부품-모델&quot;&gt;부품 모델&lt;/h3&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;물체를 구성하는 부품과 그들의 연결 관계를 표현, 그것으로 학습과 인식 수행 #### 별자리 모델 사람의 얼굴은 &apos;외관&apos;과 &apos;모양&apos;이 일정 범위 내에 있음.   =&amp;gt; 별자리 모델은 이를 표현 가능
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;별자리 모델은 변화를 일정 범위 내로 한정하여 허용함.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;별자리 모델을 이용한 인식&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;새로운 영상이 입력되면 가정-검증 수행&lt;/li&gt;
  &lt;li&gt;특징 추출 후 여러 가정 생성&lt;/li&gt;
  &lt;li&gt;검증&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;외관의 표현&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;주로 관심점을 사용함.&lt;/li&gt;
  &lt;li&gt;부품 별로 군집 형성&lt;/li&gt;
  &lt;li&gt;군집을 &lt;strong&gt;가우시안&lt;/strong&gt;으로 표현&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;모양의 표현&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;여러 부품이 일정한 위치 관계를 형성&lt;/li&gt;
  &lt;li&gt;위치 관계를 &lt;strong&gt;가우시안&lt;/strong&gt;으로 표현&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;한계&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;기하급수적 계산량&lt;/li&gt;
  &lt;li&gt;지역 특징이 모든 물체에 적합하지는 않을 수 있음.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;cnn-1&quot;&gt;CNN&lt;/h3&gt;
&lt;p&gt;특징 추출과 분류를 동시에 학습함.&lt;/p&gt;

&lt;h2 id=&quot;사람-인식&quot;&gt;사람 인식&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;생체 인식&lt;/dt&gt;
      &lt;dd&gt;주로 여러 가지를 인식하고 결과를 결합하는 다중 모드 방식&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
  &lt;li&gt;얼굴 인식&lt;/li&gt;
  &lt;li&gt;나이 인식&lt;/li&gt;
  &lt;li&gt;성별 인식, 인종 인식&lt;/li&gt;
  &lt;li&gt;표정 인식&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;모션&quot;&gt;모션&lt;/h1&gt;
&lt;h2 id=&quot;움직이는-상황&quot;&gt;움직이는 상황&lt;/h2&gt;
&lt;ol&gt;
  &lt;li&gt;정지 카메라와 정지 장면&lt;/li&gt;
  &lt;li&gt;정지 카메라와 동적 장면&lt;br /&gt;
ex) 과속 단속 카메라와 같은 cctv&lt;/li&gt;
  &lt;li&gt;동적 카메라와 정적 장면 
ex) 불법 주차 단속 차량&lt;/li&gt;
  &lt;li&gt;동적 카메라와 동적 장면&lt;br /&gt;
ex) 자율 주행, 로봇&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;영상-일관성&quot;&gt;영상 일관성&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;공간 일관성&lt;/dt&gt;
      &lt;dd&gt;이웃 화소는 비슷할 가능성이 높다.&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;시간 일관성&lt;/dt&gt;
      &lt;dd&gt;이웃 프레임은 비슷한 가능성이 높다.&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;차영상&quot;&gt;차영상&lt;/h3&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;인접한 영상의 차
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;dl&gt;
  &lt;dt&gt;기준 프레임&lt;/dt&gt;
  &lt;dd&gt;t-1 또는 물체가 나타나기 이전의 초기 배경 영상&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;차영상을 이용한 움직임 추출 알고리즘&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;배경과 물체의 색상에 큰 변화가 없는 상황에서만 동작&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;모션-필드&quot;&gt;모션 필드&lt;/h3&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;3차원 실세계의 물체나 장면의 움직임을
2차원 속도 벡터로 표현하는 것
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;3차원-모션-벡터-v_3의-복원&quot;&gt;3차원 모션 벡터 V_3의 복원&lt;/h4&gt;
&lt;p&gt;3차원 벡터가 2차원의 동일한 벡터로 투영되어 2차원 정보로는 복원이 불가&lt;br /&gt;
=&amp;gt; &lt;em&gt;시점이 다른 여러 대의 카메라 필요&lt;/em&gt;&lt;/p&gt;

&lt;h4 id=&quot;2차원-모션-벡터-추정&quot;&gt;2차원 모션 벡터 추정&lt;/h4&gt;
&lt;p&gt;대부분 연구는 두 장의 이웃 영상에서 2차원 모션 벡터를 추정한다.&lt;/p&gt;

&lt;h4 id=&quot;모션-필드-추정이-어려운-상황&quot;&gt;모션 필드 추정이 어려운 상황&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;구체가 회전하는 경우&lt;/li&gt;
  &lt;li&gt;광원이 이동하는 경우&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;광류&quot;&gt;광류&lt;/h2&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;모션 필드의 근사 추정치
=&amp;gt; 3차원 정보를 2차원 속도 벡터로 표현한 것의 근사 추정치
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;광류 알고리즘은 모든 화소의 모션 벡터를 추정해야 함.&lt;/p&gt;

&lt;h3 id=&quot;광류-추정의-원리&quot;&gt;광류 추정의 원리&lt;/h3&gt;

&lt;dl&gt;
  &lt;dt&gt;밝기 항상성&lt;/dt&gt;
  &lt;dd&gt;물체의 같은 점은 다음 영상에서 같은 명암값(오차 범위 내 허용)을 가져야 한다.&lt;/dd&gt;
  &lt;dt&gt;광류 조건식&lt;/dt&gt;
  &lt;dd&gt;그레디언트 조건식&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;모델은 밝기 항상성을 가져야 함.&lt;br /&gt;
테일러 급수에 따른 광류 조건식으로 가정을 통해 모션 벡터 유일 값을 결정한다.&lt;/p&gt;

&lt;h3 id=&quot;광류-추정-알고리즘&quot;&gt;광류 추정 알고리즘&lt;/h3&gt;
&lt;h4 id=&quot;lucas-kanade-알고리즘lk&quot;&gt;Lucas-Kanade 알고리즘(LK)&lt;/h4&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;가정
화소 (y, x)를 중심으로 하는 윈도우 영역 N(y, x)의 광류는 같다.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;특성&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;이웃 영역만 보는 &lt;strong&gt;지역적 알고리즘&lt;/strong&gt;(값이 분산 분포되어 있음)이다.
    &lt;ul&gt;
      &lt;li&gt;&lt;em&gt;윈도우 크기가 커질 수록 큰 움직임을 알아내지만 스무딩 효과로 모션 벡터 정확성은 낮아진다.&lt;/em&gt;&lt;br /&gt;
=&amp;gt; 피라미드를 활용한 기법(Bouget 2000)&lt;/li&gt;
      &lt;li&gt;정확도: LK &amp;gt; HS&lt;/li&gt;
      &lt;li&gt;명암 변화가 적은 물체 내부에 0인 벡터가 발생한다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;horn-schunk-알고리즘hs&quot;&gt;Horn-Schunk 알고리즘(HS)&lt;/h4&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;가정
광류는 부드러워야(균일해야) 한다.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;특성&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;식의 값을 낮출 수록 부드럽다.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;정규화 항&lt;/strong&gt;을 사용한다.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;전역적 알고리즘&lt;/strong&gt;이다. =&amp;gt; 밀집된 광류맵 생성&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;광류의-활용&quot;&gt;광류의 활용&lt;/h3&gt;
&lt;p&gt;광류에서 움직임 정보, 패턴을 추출하여 고급 비전에 사용한다는 점에서 &lt;em&gt;광류는 중간 표현이다.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;물체-추적&quot;&gt;물체 추적&lt;/h2&gt;
&lt;h3 id=&quot;klt-추적-알고리즘&quot;&gt;KLT 추적 알고리즘&lt;/h3&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Lucas-Kanade 광류 알고리즘을 개조한 물체 추적 알고리즘
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;특징점 검출 방법&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;헤시안 행렬 사용
    &lt;ul&gt;
      &lt;li&gt;행렬의 각 요소는 밝기 변화와 연관이 있다.&lt;/li&gt;
      &lt;li&gt;헤시안 행렬의 사용이 갖는 물리적 의미:&lt;br /&gt;
&lt;em&gt;밝기의 변화와 방향성을 측정하여 해당 지점이 추적 작업에 안정적인 정도를 판단할 수 있다.&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;큰 이동이 발생하는 상황에서 모션 벡터 추정이 약해진다.&lt;br /&gt;
=&amp;gt; &lt;em&gt;대응점 찾기 알고리즘으로 해결&lt;/em&gt;
=&amp;gt; 큰 이동 추적&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;3차원-비전&quot;&gt;3차원 비전&lt;/h1&gt;
&lt;p&gt;주로 영상의 깊이를 다룬다.&lt;/p&gt;
&lt;h2 id=&quot;본질-영상&quot;&gt;본질 영상&lt;/h2&gt;
&lt;h3 id=&quot;외관과-본질&quot;&gt;외관과 본질&lt;/h3&gt;

&lt;dl&gt;
  &lt;dt&gt;외관&lt;/dt&gt;
  &lt;dd&gt;텍스처&lt;/dd&gt;
  &lt;dt&gt;본질&lt;/dt&gt;
  &lt;dd&gt;표면 반사율, 색상&lt;/dd&gt;
&lt;/dl&gt;

&lt;h3 id=&quot;barrow의-아이디어&quot;&gt;Barrow의 아이디어&lt;/h3&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;명암 영상을 네 장의 본질 영상으로 분할
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;깊이 영상&lt;/li&gt;
  &lt;li&gt;법선 벡터 영상&lt;/li&gt;
  &lt;li&gt;반사율 영상&lt;/li&gt;
  &lt;li&gt;조명 영상&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;=&amp;gt; 추출 방법은 제안되지 않음&lt;/p&gt;

&lt;h3 id=&quot;그림자-제거&quot;&gt;그림자 제거&lt;/h3&gt;
&lt;h4 id=&quot;finalyson&quot;&gt;Finalyson&lt;/h4&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;컬러를 로그 공간에 매핑하면 
같은 본질을 가진 점은 직선상에 분포한다!
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;스테레오&quot;&gt;스테레오&lt;/h2&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;두 대 이상의 카메라로 여러 영상을 획득, 분석하여 깊이 정보 파악
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;깊이 영상을 획득하는 방법&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;수동적 방법&lt;/dt&gt;
  &lt;dd&gt;스테레오&lt;/dd&gt;
  &lt;dt&gt;능동적 방법&lt;/dt&gt;
  &lt;dd&gt;장면에 어떤 무늬/파를 송수신하여 후 이를 분석하여 깊이를 측정&lt;/dd&gt;
&lt;/dl&gt;

&lt;h3 id=&quot;깊이-측정&quot;&gt;깊이 측정&lt;/h3&gt;
&lt;h4 id=&quot;투영-기하&quot;&gt;투영 기하&lt;/h4&gt;
&lt;p&gt;깊이 확정 불가&lt;br /&gt;
=&amp;gt; 스테레오 기하로 확장&lt;/p&gt;

&lt;h5 id=&quot;스테레오-기하&quot;&gt;스테레오 기하&lt;/h5&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;대응점만 알면 식을 통해 깊이 측정이 가능하다!
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;대응점 찾기 알고리즘 적용 시 두 가지 문제 발생&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;아웃라이어 문제 =&amp;gt; &lt;strong&gt;에피폴라 기하&lt;/strong&gt; =&amp;gt; 대응점 찾기 문제 -&amp;gt; 변위 d 찾기 문제로 변환&lt;/li&gt;
  &lt;li&gt;희소한 문제(대응점을 충분히 찾지 못하는 것) =&amp;gt; 변위 공간으로 해결&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;밀집된-깊이-영상&quot;&gt;밀집된 깊이 영상&lt;/h3&gt;
&lt;h4 id=&quot;순진한-알고리즘전수-조사&quot;&gt;순진한 알고리즘(전수 조사)&lt;/h4&gt;
&lt;p&gt;모든 화소가 독립적으로 동작 =&amp;gt; &lt;em&gt;&lt;strong&gt;공간 일관성&lt;/strong&gt;을 활용하지 못함&lt;/em&gt;&lt;br /&gt;
틀린 대응점으로 인해 틀린 깊이를 갖는 화소가 발생할 수 있다.&lt;/p&gt;

&lt;p&gt;=&amp;gt; _공간 일관성을 활용하기 위해 &lt;strong&gt;변위 공간 영상&lt;/strong&gt;이 필요&lt;/p&gt;

&lt;h4 id=&quot;지역-탐색-방법&quot;&gt;지역 탐색 방법&lt;/h4&gt;
&lt;p&gt;공간 일관성 X&lt;/p&gt;

&lt;h4 id=&quot;전역-탐색-방법&quot;&gt;전역 탐색 방법&lt;/h4&gt;
&lt;p&gt;정규화 항 사용&lt;/p&gt;

&lt;h2 id=&quot;능동-센서&quot;&gt;능동 센서&lt;/h2&gt;
&lt;p&gt;능동 센서&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;스테레오 비전&lt;/dt&gt;
      &lt;dd&gt;수동적, 카메라에 들어오는 빛 정보를 수동적으로 받아들이기만 함.&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;능동 센서&lt;/dt&gt;
      &lt;dd&gt;장면에 능동적으로 무언가를 투사하여, 되돌아 오는 신호로부터 거리를 알아냄.&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;구조-광&quot;&gt;구조 광&lt;/h3&gt;

&lt;dl&gt;
  &lt;dt&gt;원리&lt;/dt&gt;
  &lt;dd&gt;스테레오에서 카메라 한 대를 프로젝터로 대치함. 이 때 프로젝터는 대응점을 찾기 쉽게 설계된 패턴을 투사&lt;/dd&gt;
  &lt;dt&gt;구조광이 사용하는 무늬&lt;/dt&gt;
  &lt;dd&gt;모든 점을 고유한 패턴을 가지도록 하여 대응점 찾기에 용이하게 함.&lt;/dd&gt;
&lt;/dl&gt;

&lt;h3 id=&quot;키넥트&quot;&gt;키넥트&lt;/h3&gt;
&lt;p&gt;RGB, 깊이 영상을 동시에 획득&lt;/p&gt;

&lt;h2 id=&quot;깊이-영상의-인식&quot;&gt;깊이 영상의 인식&lt;/h2&gt;
&lt;h3 id=&quot;사람의-자세-추정&quot;&gt;사람의 자세 추정&lt;/h3&gt;

&lt;dl&gt;
  &lt;dt&gt;원리&lt;/dt&gt;
  &lt;dd&gt;
    &lt;ol&gt;
      &lt;li&gt;깊이 영상을 31개의 구성 요소로 분류&lt;/li&gt;
      &lt;li&gt;임의 숲 분류기로 화소 각각에 대하여 분류&lt;/li&gt;
      &lt;li&gt;구성 요소 별로 군집을 구하고 군집 대표점을 계산&lt;/li&gt;
      &lt;li&gt;대표점 집합은 다음 단계인 제스처 인식의 입력으로 사용&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/dd&gt;
&lt;/dl&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;장면-이해&quot;&gt;장면 이해&lt;/h1&gt;
&lt;p&gt;미래 컴퓨터 비전 시스템이 갖추어야 할 중요 사항&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;계층 구조&lt;/li&gt;
  &lt;li&gt;여러 정보 채널의 분리 처리&lt;/li&gt;
  &lt;li&gt;처리 과정이 정보를 주고 받는 피드백&lt;/li&gt;
  &lt;li&gt;고정된 처리와 학습의 균형&lt;/li&gt;
&lt;/ul&gt;

&lt;dl&gt;
  &lt;dt&gt;계산 시각&lt;/dt&gt;
  &lt;dd&gt;사람의 시각 기능을 정보 처리 관점으로 바라보는 학문&lt;/dd&gt;
&lt;/dl&gt;

&lt;h2 id=&quot;선택적-주의-집중&quot;&gt;선택적 주의 집중&lt;/h2&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;영상에서 관심이 가는 특정 부분을 집중하여 살피는 현상
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;dl&gt;
  &lt;dt&gt;사람의 선택적 주의 집중&lt;/dt&gt;
  &lt;dd&gt;단 속성 운동과 고착 현상으로 나타남.&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;현저성 맵을 이용하여 구현&lt;/p&gt;

&lt;h2 id=&quot;문맥&quot;&gt;문맥&lt;/h2&gt;
&lt;p&gt;컴퓨터 비전에서 문맥을 이용하려면 지식 표현과 추론이 해결되어야 함&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;공간 문맥&lt;/dt&gt;
  &lt;dd&gt;물체가 나타날 위치를 확률 분포로 표현&lt;br /&gt;
=&amp;gt; 한계 존재&lt;/dd&gt;
&lt;/dl&gt;

&lt;h2 id=&quot;영상-파싱&quot;&gt;영상 파싱&lt;/h2&gt;

&lt;dl&gt;
  &lt;dt&gt;언어 처리에서 파싱&lt;/dt&gt;
  &lt;dd&gt;문장을 구성 요소로 나눈 뒤, 의미와 상호 관계를 표현&lt;br /&gt;
문장 -&amp;gt; 영상 =&amp;gt; &lt;strong&gt;영상 파싱&lt;/strong&gt;&lt;/dd&gt;
&lt;/dl&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;basics-of-digital-photography&quot;&gt;Basics of Digital Photography&lt;/h1&gt;
&lt;h2 id=&quot;exposure&quot;&gt;Exposure&lt;/h2&gt;
&lt;p&gt;두 개의 파라미터가 존재&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;Aperture&lt;/dt&gt;
      &lt;dd&gt;조리개를 얼마나 열 것이냐&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;Shutter speed&lt;/dt&gt;
      &lt;dd&gt;셔터 스피드&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;셔터 스피드가 낮을 수록 빛이 더 많이 들어오지만, 모션 블러도 커짐
셔터 스피드가 커질 수록 움직임이 정지됨.&lt;/p&gt;

&lt;p&gt;셔터 스피드 및 초점 거리(Focal Length)&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;망원에는 더 빠른 셔터 스피드를 요구함.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;Rule of thumb&lt;/dt&gt;
      &lt;dd&gt;사람이 손으로 선명한 사진을 찍을 수 있는 셔터 스피드는 1/f임.&lt;br /&gt;
 =&amp;gt; 이미지 안정화: 진동을 기계적으로 보상&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;depth-of-field&quot;&gt;Depth of Field&lt;/h2&gt;
&lt;ol&gt;
  &lt;li&gt;조리개에 의존&lt;/li&gt;
  &lt;li&gt;초점 거리에 의존&lt;/li&gt;
  &lt;li&gt;센서 크기에 의존&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;focus-and-defocus&quot;&gt;Focus and Defocus&lt;/h3&gt;
&lt;p&gt;물체에는 초점이 맞는 특정 거리가 존재함.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;다른 지점들은 이미지에서 ‘circle of confusion’으로 투영됨.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;초점 거리를 바꿀 수 있을까?&lt;/p&gt;

&lt;h3 id=&quot;시야각&quot;&gt;시야각&lt;/h3&gt;
&lt;p&gt;광각일 수록 왜곡이 발생&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;tilt-shift lens&lt;/dt&gt;
  &lt;dd&gt;pespective에 대한 고급 제어 가능&lt;/dd&gt;
&lt;/dl&gt;

&lt;h2 id=&quot;iso&quot;&gt;ISO&lt;/h2&gt;

&lt;p&gt;: 필름의 감도를 의미하는 용어&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;노출&lt;/th&gt;
      &lt;th&gt;—&lt;/th&gt;
      &lt;th&gt;—&amp;gt;&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;조리개&lt;/td&gt;
      &lt;td&gt;high&lt;/td&gt;
      &lt;td&gt;low&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;셔터속도&lt;/td&gt;
      &lt;td&gt;low&lt;/td&gt;
      &lt;td&gt;high&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ISO&lt;/td&gt;
      &lt;td&gt;low&lt;/td&gt;
      &lt;td&gt;high&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;summary-of-iso&quot;&gt;Summary of ISO&lt;/h3&gt;
&lt;p&gt;고감도&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;빛이 적은 상황에서도 플래시 없이 촬영 가능&lt;/li&gt;
  &lt;li&gt;노이즈 발생으로 화질이 떨어짐&lt;/li&gt;
  &lt;li&gt;플래시 사용이 불가한 실내 사진에 적합&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;저감도&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;빛이 부족한 환경에서 노출 부족&lt;/li&gt;
  &lt;li&gt;선명함&lt;/li&gt;
  &lt;li&gt;야외 촬영이나 대형 인화용에 적합&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;white-balance&quot;&gt;White Balance&lt;/h2&gt;
&lt;p&gt;컬러의 세 가지 요소&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;광원&lt;/li&gt;
  &lt;li&gt;물체&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;비주얼 시스템(카메라나 인간 시각 등)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;모든 광원에는 고유한 스펙트럼이 존재&lt;br /&gt;
=&amp;gt; 같은 물체여도 광원에 따라 다른 이미지가 생성&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;summary-of-white-balancing&quot;&gt;Summary of White Balancing&lt;/h3&gt;
&lt;p&gt;흰색을 흰색으로 인식시키는 작업(인간 시각에 흰색은 흰색으로 보이는 것과 별개)&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;실내 촬영의 경우 문제가 발생&lt;/li&gt;
  &lt;li&gt;Gray card가 가장 정확함.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;색-온도&quot;&gt;색 온도&lt;/h2&gt;
&lt;p&gt;화이트 밸런싱 균형을 맞춤&lt;br /&gt;
이미지의 전체적인 톤 조정&lt;/p&gt;

&lt;h3 id=&quot;색-온도의-특성&quot;&gt;색 온도의 특성&lt;/h3&gt;
&lt;p&gt;광원&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;푸른색: 색 온도가 높음&lt;/li&gt;
  &lt;li&gt;붉은색: 색 온도가 높음&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;카메라의 색 온도&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;실제 색 온도보다 높게 설정: 붉어짐.&lt;/li&gt;
  &lt;li&gt;실제 색 온도보다 낮게 설정: 푸르러 짐.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;summary-of-color-temperature&quot;&gt;Summary of Color Temperature&lt;/h3&gt;
&lt;p&gt;화이트 밸런싱 설정에 사용 가능&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;미세 설정 가능&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;사진의 느낌을 바꾸는데 사용&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;실제 색 온도보다 높게 설정: 붉어짐&lt;/li&gt;
  &lt;li&gt;실제 색 온도보다 낮게 설정: 푸르러 짐.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;other-issues&quot;&gt;Other issues&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;렌즈 회절&lt;/li&gt;
  &lt;li&gt;보라색 프린지&lt;/li&gt;
  &lt;li&gt;방사형 왜곡&lt;/li&gt;
  &lt;li&gt;플레어&lt;/li&gt;
  &lt;li&gt;비네팅&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;blockquote&gt;
  &lt;h3 id=&quot;profile&quot;&gt;Profile&lt;/h3&gt;

  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Seong Hun KIM&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Student&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;Dept. of Computer Science Engineering | Yeungnam University, Repulic of Korea&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Convolution_Filter_Application/assets/118245330/37c81d9e-cfb8-4aee-8497-ff1071b2458b&quot; alt=&quot;yu signature&quot; /&gt;&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Phone&lt;/strong&gt; &lt;a href=&quot;tel:010-6685-1140&quot;&gt;010 - 6685 - 1140&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Mail&lt;/strong&gt; &lt;a href=&quot;mailto:tgh7544@naver.com&quot;&gt;tgh7544@naver.com&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;LinkTree&lt;/strong&gt; &lt;a href=&quot;https://linktr.ee/HoonC_corgi&quot;&gt;https://linktr.ee/HoonC_corgi&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</description>
        <pubDate>Wed, 12 Jun 2024 00:00:00 +0000</pubDate>
        <link>https://hoonc-corgi.github.io/2024/06/12/%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%B9%84%EC%A0%84-%EC%9D%91%EC%9A%A9-%ED%83%80%EC%9D%B4%ED%95%91.html</link>
        <guid isPermaLink="true">https://hoonc-corgi.github.io/2024/06/12/%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%B9%84%EC%A0%84-%EC%9D%91%EC%9A%A9-%ED%83%80%EC%9D%B4%ED%95%91.html</guid>
        
        
      </item>
    
      <item>
        <title>[전공 내용] 딥러닝과 자연어처리 기말범위 타이핑</title>
        <description>&lt;h1 id=&quot;딥러닝과-자연어처리-기말범위-타이핑&quot;&gt;딥러닝과 자연어처리 기말범위 타이핑&lt;/h1&gt;

&lt;p&gt;본 내용은 &lt;a href=&quot;https://wikidocs.net/book/2155&quot;&gt;딥 러닝을 이용한 자연어 처리 입문&lt;/a&gt; (유원준, 상준)을 스스로 재정리한 내용을 포합합니다.&lt;/p&gt;

&lt;h2 id=&quot;index&quot;&gt;Index&lt;/h2&gt;

&lt;!-- TOC --&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#딥러닝과-자연어처리-기말범위-타이핑&quot;&gt;딥러닝과 자연어처리 기말범위 타이핑&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#index&quot;&gt;Index&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#타이핑을-시작하며&quot;&gt;타이핑을 시작하며&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#rnn을-이용한-텍스트-분류&quot;&gt;RNN을 이용한 텍스트 분류&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#rnn에서의-다-대-일-문제many-to-one&quot;&gt;RNN에서의 다 대 일 문제(many to one)&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#rnn에서의-다-대-다-문제many-to-many&quot;&gt;RNN에서의 다 대 다 문제(many to many)&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#rnn으로의-분류&quot;&gt;RNN으로의 분류&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#나이브-베이즈-분류기&quot;&gt;나이브 베이즈 분류기&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#이진-분류-&quot;&gt;이진 분류&lt;/a&gt;
                &lt;ul&gt;
                  &lt;li&gt;&lt;a href=&quot;#스팸-메일-분류&quot;&gt;스팸 메일 분류&lt;/a&gt;&lt;/li&gt;
                  &lt;li&gt;&lt;a href=&quot;#imdb-리뷰-감성-분류&quot;&gt;IMDB 리뷰 감성 분류&lt;/a&gt;&lt;/li&gt;
                  &lt;li&gt;&lt;a href=&quot;#네이버-영화-리뷰-감성-분류&quot;&gt;네이버 영화 리뷰 감성 분류&lt;/a&gt;&lt;/li&gt;
                  &lt;li&gt;&lt;a href=&quot;#bilstm으로-한국어-스팀-리뷰-감성-분류&quot;&gt;BiLSTM으로 한국어 스팀 리뷰 감성 분류&lt;/a&gt;&lt;/li&gt;
                &lt;/ul&gt;
              &lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#다중-클래스-문제-&quot;&gt;다중 클래스 문제&lt;/a&gt;
                &lt;ul&gt;
                  &lt;li&gt;&lt;a href=&quot;#로이터-뉴스-분류&quot;&gt;로이터 뉴스 분류&lt;/a&gt;&lt;/li&gt;
                &lt;/ul&gt;
              &lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#자연어-처리를-위한-합성곱-신경망&quot;&gt;자연어 처리를 위한 합성곱 신경망&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#cnn&quot;&gt;CNN&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#합성곱-연산&quot;&gt;합성곱 연산&lt;/a&gt;
                &lt;ul&gt;
                  &lt;li&gt;&lt;a href=&quot;#stride&quot;&gt;stride&lt;/a&gt;&lt;/li&gt;
                  &lt;li&gt;&lt;a href=&quot;#가중치와-바이어스&quot;&gt;가중치와 바이어스&lt;/a&gt;&lt;/li&gt;
                  &lt;li&gt;&lt;a href=&quot;#특성-맵의-크기-&quot;&gt;특성 맵의 크기&lt;/a&gt;&lt;/li&gt;
                  &lt;li&gt;&lt;a href=&quot;#다수의-채널을-가질-경우의-합성곱-연산3차원-텐서의-합성곱-연산&quot;&gt;다수의 채널을 가질 경우의 합성곱 연산(3차원 텐서의 합성곱 연산)&lt;/a&gt;&lt;/li&gt;
                  &lt;li&gt;&lt;a href=&quot;#풀링pooling&quot;&gt;풀링(Pooling)&lt;/a&gt;&lt;/li&gt;
                  &lt;li&gt;&lt;a href=&quot;#2d-합성곱&quot;&gt;2D 합성곱&lt;/a&gt;&lt;/li&gt;
                  &lt;li&gt;&lt;a href=&quot;#1d-합성곱&quot;&gt;1D 합성곱&lt;/a&gt;&lt;/li&gt;
                &lt;/ul&gt;
              &lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#자연어-처리를-위한-1d-cnn&quot;&gt;자연어 처리를 위한 1D CNN&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#max-pooling&quot;&gt;Max-pooling&lt;/a&gt;
                &lt;ul&gt;
                  &lt;li&gt;&lt;a href=&quot;#1d-cnn으로-imdb-리뷰-분류&quot;&gt;1D CNN으로 IMDB 리뷰 분류&lt;/a&gt;&lt;/li&gt;
                  &lt;li&gt;&lt;a href=&quot;#1d-cnn으로-스팸-메일-분류&quot;&gt;1D CNN으로 스팸 메일 분류&lt;/a&gt;&lt;/li&gt;
                  &lt;li&gt;&lt;a href=&quot;#multi-kernel-1d-cnn으로-네이버-영화-리뷰-분류&quot;&gt;Multi-kernel 1D CNN으로 네이버 영화 리뷰 분류&lt;/a&gt;&lt;/li&gt;
                  &lt;li&gt;&lt;a href=&quot;#사전-훈련된-워드-임베딩을-이용한-의도-분류&quot;&gt;사전 훈련된 워드 임베딩을 이용한 의도 분류&lt;/a&gt;&lt;/li&gt;
                &lt;/ul&gt;
              &lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#문자-임베딩&quot;&gt;문자 임베딩&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#1d-cnn을-이용한-문자-임베딩&quot;&gt;1D CNN을 이용한 문자 임베딩&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#bilstm을-이용한-문자-임베딩&quot;&gt;BiLSTM을 이용한 문자 임베딩&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#케라스를-이용한-태깅-작업&quot;&gt;케라스를 이용한 태깅 작업&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#개체명-인식&quot;&gt;개체명 인식&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#bio-표현begin-inside-outside&quot;&gt;BIO 표현(Begin Inside Outside)&lt;/a&gt;
                &lt;ul&gt;
                  &lt;li&gt;&lt;a href=&quot;#conll2003-&quot;&gt;CONLL2003&lt;/a&gt;&lt;/li&gt;
                &lt;/ul&gt;
              &lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#양방향-lstm으로-개체명-인식기-만들기&quot;&gt;양방향 LSTM으로 개체명 인식기 만들기&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#f1-score-&quot;&gt;F1 Score&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#crf&quot;&gt;CRF&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#bilstm-crf를-이용한-개체명-인식&quot;&gt;BiLSTM-CRF를 이용한 개체명 인식&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#bilstm-cnn을-이툥한-개체명-인식&quot;&gt;BiLSTM-CNN을 이툥한 개체명 인식&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#서브워드-토크나이저&quot;&gt;서브워드 토크나이저&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#바이트-페어-인코딩&quot;&gt;바이트 페어 인코딩&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#oovout-of-vocabulary&quot;&gt;OOV(Out Of Vocabulary)&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#바이트-페어-인코딩-byte-pair-encoding-bpe-&quot;&gt;바이트 페어 인코딩 (Byte Pair Encoding, BPE)&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#자연어-처리에서의-bpe-&quot;&gt;자연어 처리에서의 BPE&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#센텐스-피스&quot;&gt;센텐스 피스&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#서브워드-텍스트-인코더&quot;&gt;서브워드 텍스트 인코더&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#허깅-인터페이스-토크나이저&quot;&gt;허깅 인터페이스 토크나이저&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#sequence-to-sequence&quot;&gt;Sequence to Sequence&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#rnn을-이용한-인코더-디코더seq2seq&quot;&gt;RNN을 이용한 인코더-디코더(Seq2Seq)&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#seq2seq&quot;&gt;Seq2Seq&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#인코더&quot;&gt;인코더&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#디코더&quot;&gt;디코더&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#seq2seq-디코더의-훈련과-테스트-과정의-작동-방식&quot;&gt;Seq2Seq 디코더의 훈련과 테스트 과정의 작동 방식&lt;/a&gt;
                &lt;ul&gt;
                  &lt;li&gt;&lt;a href=&quot;#훈련&quot;&gt;훈련&lt;/a&gt;&lt;/li&gt;
                  &lt;li&gt;&lt;a href=&quot;#테스트&quot;&gt;테스트&lt;/a&gt;&lt;/li&gt;
                  &lt;li&gt;&lt;a href=&quot;#디코더-셀의-출력&quot;&gt;디코더 셀의 출력&lt;/a&gt;&lt;/li&gt;
                  &lt;li&gt;&lt;a href=&quot;#교사-강요teacher-forcing&quot;&gt;교사 강요(Teacher forcing)&lt;/a&gt;&lt;/li&gt;
                &lt;/ul&gt;
              &lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#문자-레벨-기계-번역기&quot;&gt;문자 레벨 기계 번역기&lt;/a&gt;
                &lt;ul&gt;
                  &lt;li&gt;&lt;a href=&quot;#seq2seq로-기계-번역기-만들기&quot;&gt;Seq2Seq로 기계 번역기 만들기&lt;/a&gt;&lt;/li&gt;
                &lt;/ul&gt;
              &lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#word-level-번역기-bleu-score&quot;&gt;Word-level 번역기, BLEU Score&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#bleu-score&quot;&gt;BLEU Score&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#unigram-precision단어-개수-카운트로-측정&quot;&gt;Unigram Precision(단어 개수 카운트로 측정)&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#modified-unigram-precision중복을-제거하여-보정하기-&quot;&gt;Modified Unigram Precision(중복을 제거하여 보정하기)&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#n-gram으로-확장&quot;&gt;n-gram으로 확장&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#브레버티-페널티&quot;&gt;브레버티 페널티&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#어텐션-메커니즘attention-mechanism&quot;&gt;어텐션 메커니즘(Attention Mechanism)&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#닷-프로덕트-어텐션dot-product-attention&quot;&gt;닷-프로덕트 어텐션(Dot-Product Attention)&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#어텐션-스코어를-구함&quot;&gt;어텐션 스코어를 구함&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#소프트맥스-함수를-통해-어텐션-분포attention-distribution를-구함&quot;&gt;소프트맥스 함수를 통해 어텐션 분포(Attention Distribution)를 구함&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#각-인코더의-어텐션-가중치와-은닉-상태를-가중합하여-어텐션-값을-구함&quot;&gt;각 인코더의 어텐션 가중치와 은닉 상태를 가중합하여 어텐션 값을 구함&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#어텐션-값과-디코더의-t-시점의-은닉-상태를-연결함&quot;&gt;어텐션 값과 디코더의 t 시점의 은닉 상태를 연결함&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#출력층-연산의-입력이-되는-st를-계산함&quot;&gt;출력층 연산의 입력이 되는 s^t를 계산함&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#바다나우-어텐션&quot;&gt;바다나우 어텐션&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#어텐션-스코어를-구함-1&quot;&gt;어텐션 스코어를 구함&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#소프트-맥스-함수를-통해-어텐션-분포를-구함&quot;&gt;소프트 맥스 함수를 통해 어텐션 분포를 구함&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#각-인코더의-어텐션-가중치와-은닉-상태를-가중합하여-어텐션-값을-구함-1&quot;&gt;각 인코더의 어텐션 가중치와 은닉 상태를 가중합하여 어텐션 값을 구함&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#컨텍스트-벡터로부터-s_t를-구함-&quot;&gt;컨텍스트 벡터로부터 s_t를 구함&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#트랜스포머transformer&quot;&gt;트랜스포머(Transformer)&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#트랜스포머의-주요-하이퍼-파라미터&quot;&gt;트랜스포머의 주요 하이퍼 파라미터&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#포지셔널-인코딩positional-encoding&quot;&gt;포지셔널 인코딩(Positional Encoding)&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#어텐션attention&quot;&gt;어텐션(Attention)&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#인코더encoder&quot;&gt;인코더(Encoder)&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#인코더의-셀프-어텐션&quot;&gt;인코더의 셀프 어텐션&lt;/a&gt;
                &lt;ul&gt;
                  &lt;li&gt;&lt;a href=&quot;#q-k-v-벡터-얻기&quot;&gt;Q, K, V 벡터 얻기&lt;/a&gt;&lt;/li&gt;
                  &lt;li&gt;&lt;a href=&quot;#스케일드-닷-프로덕트-어텐션scaled-dot-product-attention&quot;&gt;스케일드 닷-프로덕트 어텐션(Scaled dot-product Attention)&lt;/a&gt;&lt;/li&gt;
                  &lt;li&gt;&lt;a href=&quot;#멀티-헤드-어텐션multi-head-attention&quot;&gt;멀티 헤드 어텐션(Multi-head Attention)&lt;/a&gt;&lt;/li&gt;
                  &lt;li&gt;&lt;a href=&quot;#패딩-마스크&quot;&gt;패딩 마스크&lt;/a&gt;&lt;/li&gt;
                &lt;/ul&gt;
              &lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#포지션-와이즈-피드-포워드-신경망position-wise-ffnn&quot;&gt;포지션-와이즈 피드 포워드 신경망(Position-wise FFNN)&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#잔차-연결residual-connection과-층-정규화layer-normalization&quot;&gt;잔차 연결(Residual connection)과 층 정규화(Layer Normalization)&lt;/a&gt;
                &lt;ul&gt;
                  &lt;li&gt;&lt;a href=&quot;#잔차-연결residual-connection&quot;&gt;잔차 연결(Residual connection)&lt;/a&gt;&lt;/li&gt;
                  &lt;li&gt;&lt;a href=&quot;#층-정규화layer-normalization&quot;&gt;층 정규화(Layer Normalization)&lt;/a&gt;&lt;/li&gt;
                &lt;/ul&gt;
              &lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#인코더에서-디코더로&quot;&gt;인코더에서 디코더로&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#디코더-1&quot;&gt;디코더&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#디코더의-첫-번째-서브층-masked-multi-head-self-attention셀프-어텐션과-룩-어헤드-마스크&quot;&gt;디코더의 첫 번째 서브층: Masked Multi-head self-Attention(셀프 어텐션과 룩-어헤드 마스크)&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#디코더의-두-번째-서브층-인코더-디코더-어텐션encoder-decorder-attention&quot;&gt;디코더의 두 번째 서브층: 인코더-디코더 어텐션(Encoder-Decorder Attention)&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#어텐션-정리&quot;&gt;어텐션 정리&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#학습률&quot;&gt;학습률&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#학습률-스케줄러&quot;&gt;학습률 스케줄러&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#bert&quot;&gt;BERT&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#임베딩을-사용하는-두-가지-방법&quot;&gt;임베딩을 사용하는 두 가지 방법&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#임베딩-방법의-단점&quot;&gt;임베딩 방법의 단점&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#bert-1&quot;&gt;BERT&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#bert의-크기&quot;&gt;BERT의 크기&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#bert의-문맥을-반영한-임베딩&quot;&gt;BERT의 문맥을 반영한 임베딩&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#bert의-서브워드-토크나이저-wordpiece-embedding&quot;&gt;BERT의 서브워드 토크나이저: WordPiece Embedding&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#포지션-임베딩position-embedding&quot;&gt;포지션 임베딩(Position Embedding)&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#bert의-사전-훈련&quot;&gt;BERT의 사전 훈련&lt;/a&gt;
                &lt;ul&gt;
                  &lt;li&gt;&lt;a href=&quot;#마스크드-언어-모델&quot;&gt;마스크드 언어 모델&lt;/a&gt;&lt;/li&gt;
                  &lt;li&gt;&lt;a href=&quot;#nsp&quot;&gt;NSP&lt;/a&gt;&lt;/li&gt;
                  &lt;li&gt;&lt;a href=&quot;#세그먼트-임베딩segment-embedding&quot;&gt;세그먼트 임베딩(Segment Embedding)&lt;/a&gt;&lt;/li&gt;
                &lt;/ul&gt;
              &lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#bert를-파인-튜닝fine-tuning하기&quot;&gt;BERT를 파인 튜닝(Fine-tuning)하기&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#하나의-텍스트에-대한-태깅-작업&quot;&gt;하나의 텍스트에 대한 태깅 작업&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#텍스트의-쌍에-대한-분류-또는-회귀-문제&quot;&gt;텍스트의 쌍에 대한 분류 또는 회귀 문제&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#어텐션-마스크attention-mask&quot;&gt;어텐션 마스크(Attention Mask)&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#bert의-문장-임베딩&quot;&gt;BERT의 문장 임베딩&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#bert와-gpt&quot;&gt;BERT와 GPT&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#overview&quot;&gt;Overview&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#rnn&quot;&gt;RNN&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#cnn-1&quot;&gt;CNN&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#태깅&quot;&gt;태깅&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#서브워드-토크나이저-1&quot;&gt;서브워드 토크나이저&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#seq2seq-1&quot;&gt;Seq2Seq&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#bleu&quot;&gt;BLEU&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#어텐션-메커니즘&quot;&gt;어텐션 메커니즘&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#트랜스포머&quot;&gt;트랜스포머&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#bert-2&quot;&gt;BERT&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#gpt-&quot;&gt;GPT&lt;/a&gt;
&lt;!-- TOC --&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;
&lt;h2 id=&quot;타이핑을-시작하며&quot;&gt;타이핑을 시작하며&lt;/h2&gt;

&lt;p&gt;기말고사 시험이 2주 남았다. 시험에 앞서 강의 내용을 아이패드로 필기하던 중에 애플펜슬 배터리가 방전되어,, 충전하는 동안 시간 아까워서 타이핑 하는 김에 작성해 본다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;rnn을-이용한-텍스트-분류&quot;&gt;RNN을 이용한 텍스트 분류&lt;/h2&gt;

&lt;p&gt;텍스트 분류는 지도 학습이다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;단어에 대해 정수를 부여해야 한다.
    &lt;ol&gt;
      &lt;li&gt;케라스의 Embedding() 메소드는 단어 각각에 대하여 정수로 변환된 입력에 임베딩을 수행한다.&lt;/li&gt;
      &lt;li&gt;&lt;em&gt;단어를 빈도순으로 정렬하여 순차적으로 정수를 부여한다.&lt;/em&gt; &lt;strong&gt;=&amp;gt; 등장 빈도수가 적은 단어를 제거할 수 있다.&lt;/strong&gt;&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;RNN의 하이퍼 파라미터
    &lt;ul&gt;
      &lt;li&gt;hidden_units: RNN의 출력의 크기로, 은닉 상태의 크기와 같다. &lt;strong&gt;=&amp;gt; 은닉층의 노드 개수와 같은 개념&lt;/strong&gt;&lt;/li&gt;
      &lt;li&gt;timesteps: 시점의 수로, 각 문서에서의 단어 수와 같으며, 은닉층의 개수와 같다.&lt;/li&gt;
      &lt;li&gt;input_dim: 입력 차원의 크기로, 임베딩 벡터의 차원과 같다. &lt;strong&gt;=&amp;gt; 입력층의 노드&lt;/strong&gt; 개수&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;rnn에서의-다-대-일-문제many-to-one&quot;&gt;RNN에서의 다 대 일 문제(many to one)&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;텍스트 분류는 다 대 일 문제이다.&lt;/li&gt;
  &lt;li&gt;텍스트 분류는 모든 시점에 대해서 입력을 받지만 최종 시점의 RNN 셀만이 은닉 상태를 출력, 이것이 출력층에서 활성화 함수를 통해 정답을 고르는 문제가 된다. &lt;strong&gt;=&amp;gt; 입력은 모두, 출력은 하나!&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;스팸 메일 분류, LSTM으로 네이버 리뷰 감성 분류&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;rnn에서의-다-대-다-문제many-to-many&quot;&gt;RNN에서의 다 대 다 문제(many to many)&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;다 대 다 문제를 푸는 경우 양방향 LSTM을 이용한다.&lt;/li&gt;
  &lt;li&gt;케라스에서는 양방향 LSTM을 사용하면서 return_sequence = False로 인자를 줄 경우 처음과 끝의 은닉 상태만을 출력으로 가지며, 이를 통해 양방향 LSTM으로 텍스트 분류를 수행할 수 있다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;rnn으로의-분류&quot;&gt;RNN으로의 분류&lt;/h3&gt;

&lt;h4 id=&quot;나이브-베이즈-분류기&quot;&gt;나이브 베이즈 분류기&lt;/h4&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    텍스트 분류를 위해 전통적으로 사용되는 분류기로, 베이즈 정리를 따름
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;베이즈의 정리
    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;P(A): A가 일어날 확률  
P(A|B): A가 일어난 후 B가 일어날 확률  
cf) B에 대해서도 동일  
P(A|B) = { P(B|A)*P(A) } / P(B)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;스팸 메일 분류 가능&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;이진-분류&quot;&gt;이진 분류&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;활성화 함수: sigmoid&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;손실 함수: binary_crossentropy&lt;/strong&gt;&lt;/p&gt;

&lt;h5 id=&quot;스팸-메일-분류&quot;&gt;스팸 메일 분류&lt;/h5&gt;
&lt;ul&gt;
  &lt;li&gt;이진 분류 문제이다.
    &lt;ul&gt;
      &lt;li&gt;다 대 일 문제이다.&lt;/li&gt;
      &lt;li&gt;데이터
        &lt;ul&gt;
          &lt;li&gt;v1: 스팸 여부 정보
            &lt;ul&gt;
              &lt;li&gt;ham: 0&lt;/li&gt;
              &lt;li&gt;spam: 1&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;
            &lt;p&gt;v2: 메일 본문&lt;/p&gt;
          &lt;/li&gt;
          &lt;li&gt;정상 메일 및 스팸 메일의 &lt;em&gt;데이터가 불균형한 경우 학습 시에도 비율을 반드시 맞추어야 한다.&lt;/em&gt; &lt;strong&gt;=&amp;gt; stratif 인자 활용&lt;/strong&gt;&lt;/li&gt;
          &lt;li&gt;훈련 데이터에 토큰화, 정수 인코딩을 진행하여야 한다.&lt;br /&gt;
cf) 정수 인코딩은 빈도수가 높을 수록 낮은 정수로 인코딩&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;imdb-리뷰-감성-분류&quot;&gt;IMDB 리뷰 감성 분류&lt;/h5&gt;
&lt;ul&gt;
  &lt;li&gt;이진 분류 문제이다.
    &lt;ul&gt;
      &lt;li&gt;GRU로 IMDB 감성 분류하기
        &lt;ul&gt;
          &lt;li&gt;데이터의 크기와 길이를 제한하고 패딩을 활용&lt;/li&gt;
          &lt;li&gt;임베딩 백터 차원: 100, 은닉 상태 크기: 128&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;네이버-영화-리뷰-감성-분류&quot;&gt;네이버 영화 리뷰 감성 분류&lt;/h5&gt;
&lt;ul&gt;
  &lt;li&gt;이진 분류 문제이다.
    &lt;ul&gt;
      &lt;li&gt;과정
        &lt;ol&gt;
          &lt;li&gt;데이터 로드&lt;/li&gt;
          &lt;li&gt;데이터 정제&lt;/li&gt;
          &lt;li&gt;토큰화&lt;br /&gt;
cf) 형태소 분석기 Mecab 사용&lt;/li&gt;
          &lt;li&gt;정수 인코딩&lt;/li&gt;
          &lt;li&gt;빈 샘플 제거&lt;/li&gt;
          &lt;li&gt;패딩&lt;/li&gt;
          &lt;li&gt;GRU LSTM으로 구현
            &lt;ul&gt;
              &lt;li&gt;다 대 일 구조&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ol&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;bilstm으로-한국어-스팀-리뷰-감성-분류&quot;&gt;BiLSTM으로 한국어 스팀 리뷰 감성 분류&lt;/h5&gt;
&lt;ul&gt;
  &lt;li&gt;양방향 LSTM은 두 개의 독립적인 LSTM 아키텍처를 함께 사용한다.&lt;/li&gt;
  &lt;li&gt;다 대 다 문제를 푸는 경우의 양방향 LSTM이다.&lt;/li&gt;
  &lt;li&gt;텍스트 분류 진행 시 역방향 LSTM은 마지막 time step만 본 상태로, LSTM에 유용한 정보를 가졌다고 보기 어렵다.&lt;/li&gt;
  &lt;li&gt;단방향 LSTM의 경우 마지막 time step에 출력이 있으면 역방향, 반대면 순방향 LSTM이다.&lt;/li&gt;
  &lt;li&gt;케라스에서는 양방향 LSTM을 사용하면서 return_sequence = False로 인자를 줄 경우 처음과 끝의 은닉 상태만을 출력으로 가지며, 이를 통해 양방향 LSTM으로 텍스트 분류를 수행할 수 있다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;다중-클래스-문제&quot;&gt;다중 클래스 문제&lt;/h4&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;활성화 함수: softmax
손실 함수: categorical_crossentropy
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;dense layer의 크기는 클래스 개수와 동일하게 설정  &lt;br /&gt;
=&amp;gt; &lt;strong&gt;출력층의 뉴런 개수는 클래스의 개수와 같아야 한다.&lt;/strong&gt; &lt;br /&gt;
cf) dense layer: 은닉층의 노드 개수&lt;/p&gt;

&lt;h5 id=&quot;로이터-뉴스-분류&quot;&gt;로이터 뉴스 분류&lt;/h5&gt;
&lt;ul&gt;
  &lt;li&gt;로이터 뉴스 분류
    &lt;ul&gt;
      &lt;li&gt;다중 클래스 분류 문제이다.&lt;/li&gt;
      &lt;li&gt;LSTM을 사용&lt;br /&gt;
cf) 과적합 방지를 위하여 EarlyStopping(monitor = ‘val_loss’, )를 사용할 수 있다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;자연어-처리를-위한-합성곱-신경망&quot;&gt;자연어 처리를 위한 합성곱 신경망&lt;/h2&gt;

&lt;h3 id=&quot;cnn&quot;&gt;CNN&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;이미지 처리에 좋음&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;다층 퍼셉트론으로 분류 시 1차원 벡터로의 변환 필요&lt;br /&gt;
=&amp;gt; 공간 구조의 정보 유실 =&amp;gt; CNN 사용&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;이미지는 3차원 텐서 형태&lt;br /&gt;
 (h, w, ch) cf) channel을 depth라 부르기도 함.&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;흑백 이미지: (h, w, 1) gray scale: 0 ~ 255&lt;/li&gt;
      &lt;li&gt;컬러 이미지: (h, w, 3) R: 0 ~ 255, G: 0 ~ 255, B: 0 ~ 255&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;합성곱-연산&quot;&gt;합성곱 연산&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;합성곱 층은 합성곱 연산으로 이미지의 특징을 추출한다.&lt;br /&gt;
   kernel or filter 라는 n*m 행렬로 이미지를 훑으며 커널과 겹치는 이미지 영역을 커널 값과 모두 더한 값으로 출력하는데, 이름 &lt;strong&gt;feature map(특성 맵)&lt;/strong&gt;이라 함.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;stride&quot;&gt;stride&lt;/h5&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;커널의 이동 범위  
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;특성맵은 입력보다 작아지게 되어 가장자리 정보들이 유실될 수 있음.&lt;br /&gt;
    =&amp;gt; &lt;strong&gt;zero-padding&lt;/strong&gt; 수행&lt;/p&gt;

&lt;h5 id=&quot;가중치와-바이어스&quot;&gt;가중치와 바이어스&lt;/h5&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;CNN의 가중치는 커널 행렬의 원소이다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;커널 내 가중치만으로 공간적 구조 정보를 보존할 수 있다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;커널의 영역에 있는 이미지에 커널 크기에 따른 가중치 행렬을 곱셈, 합하여 하나의 특성 맵 값을 만든다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;커널 적용의 결과에 편향을 더함으로써 특성 맵을 만들 수도 있다.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;특성-맵의-크기&quot;&gt;특성 맵의 크기&lt;/h5&gt;
&lt;p&gt;특성 맵의 크기 O_h, O_w = (입력 데이터의 높이 - 커널의 높이)/스트라이드 크기 + 1이다.&lt;br /&gt;
  패딩을 고려한다면 O_h, O_w = (입력 데이터의 높이 - 커널의 높이 + 2*패딩 크기)/스트라이드 크기 + 1이다.&lt;/p&gt;

&lt;h5 id=&quot;다수의-채널을-가질-경우의-합성곱-연산3차원-텐서의-합성곱-연산&quot;&gt;다수의 채널을 가질 경우의 합성곱 연산(3차원 텐서의 합성곱 연산)&lt;/h5&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;합성곱 연산의 입력은 다수의 채널을 가진 이미지 또는 특성맵이 될 수 있다.&lt;br /&gt;
    cf) 단, 커널의 채널 수도 입력의 수와 동일해야 함.&lt;br /&gt;
    ex) 흑백 이미지의 입력은 1채널이지만, 컬러 이미지는 3채널으로 커널도 3개여야 함.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;컬러 이미지에 3차원 커널을 사용하여도 특성맵의 차원은 기존과 같다.
        =&amp;gt; 3차원 특성맵을 원한다면, 2차원 커널 3개로 이루어진 커널을 3개 만들어 주어야 함.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;풀링pooling&quot;&gt;풀링(Pooling)&lt;/h5&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;특성맵을 다운 샘플링하여 특성맵의 크기를 줄이는 것
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;일반적으로 합성곱층(합성곱 연산 + 활성화 함수) 다음에는 풀링층을 추가한다.&lt;br /&gt;
풀링도 커널을 사용하지만 가중치가 없고, 채널 수에 변화를 주지 않는다.&lt;br /&gt;
cf) 합성곱 연산도 채널 수 유지는 가능하다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;특성맵의 크기를 감소시켜 모델이 학습할 파라미터 수를 줄여 &lt;em&gt;과대적합을 방지할 수 있다.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;2d-합성곱&quot;&gt;2D 합성곱&lt;/h5&gt;
&lt;p&gt;이미지에 합성곱 연산을 진행하는 것으로, 전술한 바와 같다.&lt;/p&gt;

&lt;h5 id=&quot;1d-합성곱&quot;&gt;1D 합성곱&lt;/h5&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;자연어 처리에 사용되는 1D 합성곱에서의 입력은  
각 단어가 벡터로 변환된 문장 행렬으로, LSTM과 동일하다.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;문장이 토큰화, 패딩, 임베딩 층을 거치면 문장 형태의 행렬로 변환된다.
    &lt;ul&gt;
      &lt;li&gt;행렬로 변환된 문장은 k*n의 크기를 카지는데, k: 임베딩 벡터의 차원, n: 문장의 길이이다.&lt;/li&gt;
      &lt;li&gt;1D 합성곱에서 사용되는 커널의 크기는 h*k인데, k는 임베딩 벡터의 차원으로 고정되므로, 문장의 길이인 h가 곧 커널의 크기가 된다.
        &lt;ul&gt;
          &lt;li&gt;이때 커널의 크기 h에 따라 trigram, bigram 등의 h-gram 커널이 생성된다.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;자연어-처리를-위한-1d-cnn&quot;&gt;자연어 처리를 위한 1D CNN&lt;/h3&gt;
&lt;h4 id=&quot;max-pooling&quot;&gt;Max-pooling&lt;/h4&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;풀링 커널 영역의 최댓값으로 풀링
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;1D CNN에서도 합성곱층 다음에는 풀링층을 추가하여야 한다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;이진 분류를 위한 신경망의 활성화 함수로 소프트맥스 함수를 사용한다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;커널이 stride에 따라 이동하면서 생성되는 6개의 맥스 풀링 스칼라 값을 하나의 벡터를 만들어 주며, 이는 1D CNN을 통한 문장에서 얻은 벡터이다. 이를 Dense layer에 넣어 텍스트 분류를 수행한다.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;1d-cnn으로-imdb-리뷰-분류&quot;&gt;1D CNN으로 IMDB 리뷰 분류&lt;/h5&gt;
&lt;ul&gt;
  &lt;li&gt;출력층에서의 활성화 함수: &lt;strong&gt;sigmoid&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;출력층에서의 손실 함수: &lt;strong&gt;crossentropy&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;1d-cnn으로-스팸-메일-분류&quot;&gt;1D CNN으로 스팸 메일 분류&lt;/h5&gt;
&lt;ul&gt;
  &lt;li&gt;이진 분류
    &lt;ul&gt;
      &lt;li&gt;출력층에 활성화 함수: &lt;strong&gt;sigmoid&lt;/strong&gt;&lt;/li&gt;
      &lt;li&gt;출력층에서의 손실 함수: &lt;strong&gt;crossentropy&lt;/strong&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;multi-kernel-1d-cnn으로-네이버-영화-리뷰-분류&quot;&gt;Multi-kernel 1D CNN으로 네이버 영화 리뷰 분류&lt;/h5&gt;

&lt;h5 id=&quot;사전-훈련된-워드-임베딩을-이용한-의도-분류&quot;&gt;사전 훈련된 워드 임베딩을 이용한 의도 분류&lt;/h5&gt;
&lt;ol&gt;
  &lt;li&gt;의도 카테고리를 고유한 정수로 변환&lt;/li&gt;
  &lt;li&gt;Glove 임베딩 사용&lt;/li&gt;
  &lt;li&gt;훈련 데이터에 있는 단어와 사전 훈련된 워드 임베딩 벡터의 값을 맵핑하여 임베딩 테이블에 저장&lt;/li&gt;
  &lt;li&gt;1D CNN 이용하여 의도 분류&lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;문자-임베딩&quot;&gt;문자 임베딩&lt;/h2&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;단어 임베딩과 달리 단어를 문자 단위로 쪼개어 임베딩을 진행하고,  
이를 이어 붙여 단어의 벡터를 생성
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;1d-cnn을-이용한-문자-임베딩&quot;&gt;1D CNN을 이용한 문자 임베딩&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;1D CNN을 문자 임베딩에 사용할 경우에는 문자의 N-gram으로부터 정보를 얻을 수 있다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;bilstm을-이용한-문자-임베딩&quot;&gt;BiLSTM을 이용한 문자 임베딩&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;단어를 구성하는 각 문자를 순방향, 역방향 LSTM의 셀에 입력으로 넣고,&lt;br /&gt;
  순방향 LSTM의 마지막 시점의 은닉 상태와 역방향 LSTM의 첫 시점 은닉 상태를 단어의 벡터로 사용함.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;워드 임베딩의 대체제 역할을 하며, 워드 임베딩과 연결하여 함께 사용되기도 한다.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;케라스를-이용한-태깅-작업&quot;&gt;케라스를 이용한 태깅 작업&lt;/h2&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;토큰화 이후 각 단어가 속한 유형을 붙여 주는 것
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;태깅 작업은 텍스트 분류와 같이 &lt;strong&gt;지도학습에 속함&lt;/strong&gt;&lt;br /&gt;
  x: 태깅 대상, y: 태깅 정보&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;시퀀스 레이블링  &lt;br /&gt;
 입력 시퀀스 x에 대하여 레이블 시퀀스 y를 각각 부여하는 작업으로, 태깅은 대표적인 시퀀스 레이블링이다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;양방향 LSTM&lt;br /&gt;
이전 시점의 단어 및 다음 시점의 단어 정보도 활용하기 위하여 사용된다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;RNN의 다 대 다 문제
    &lt;ul&gt;
      &lt;li&gt;&lt;em&gt;태깅 작업은 다 대 다 문제이다.&lt;/em&gt;&lt;br /&gt;
cf) return_sequences = True로 설정&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;품사 태깅 데이터에 대한 이해와 전처리
    &lt;ol&gt;
      &lt;li&gt;문장 데이터 x와 품사 태깅 정보 y에 각각 토큰화&lt;/li&gt;
      &lt;li&gt;정수 인코딩&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;개체명-인식&quot;&gt;개체명 인식&lt;/h3&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;이름을 가진 단어(명사)를 보고 단어가 속한 유형을 인식하는 것으로,  
개체명은 단어가 속한 유형이다.
ex) &quot;유정이는 2018년에 골드만삭스에 입사했다.&quot;  
유정(이름을 가진 단어): 사람(개체명), 2018(이름을 가진 단어): 시간(개체명), 골드만삭스(이름을 가진 단어): 조직(개체명)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;NLTK에서 개체명 인식기 NER Chkunker를 지원한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;bio-표현begin-inside-outside&quot;&gt;BIO 표현(Begin Inside Outside)&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;문자&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;BIO&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;개체명&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;해&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;B&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;movie&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;리&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;I&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;movie&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;포&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;I&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;movie&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;터&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;I&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;movie&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;보&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;O&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;러&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;O&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;메&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;B&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;theater&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;가&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;I&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;theater&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;박&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;I&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;theater&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;스&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;I&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;theater&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;가&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;O&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;자&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;O&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h5 id=&quot;conll2003&quot;&gt;CONLL2003&lt;/h5&gt;
&lt;p&gt;개체명 인식을 위한 전통적인 영어 셋으로 [단어] [품사] [청크 태깅] [개체명 태깅]의 형식을 가짐&lt;br /&gt;
ex) Peter NNP B-NP B-Per&lt;br /&gt;
Blackburn NNP I-NP I-Per&lt;br /&gt;
Peter Blackburn: Person&lt;/p&gt;

&lt;h4 id=&quot;양방향-lstm으로-개체명-인식기-만들기&quot;&gt;양방향 LSTM으로 개체명 인식기 만들기&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;임베딩 벡터 차원: 128, 은닉 상태: 128, 다 대 다 구조
    &lt;ul&gt;
      &lt;li&gt;LSTM의 return_sequences = True =&amp;gt; LSTM의 모든 셀의 출력을 사용&lt;br /&gt;
패딩으로 0이 많아질 경우 연산에서 제외 하기 위해 Embedding(mask_zero = True)로 설정&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Time_distributed()&lt;br /&gt;
다 대 다 구조에서 모든 time step에 대하여 출력을 받음.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;f1-score&quot;&gt;F1 Score&lt;/h4&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Precision과 Recall의 조화 평균으로, (2*P*R)/(P+R)을 따름
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt; &lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;예측 참&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;예측 거짓&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;실제 참&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;TP&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;FN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;실제 거짓&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;FP&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;TN&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;strong&gt;TP: 모델이 참(P)으로 봤는데, 예측이 맞았다(T). TP =&amp;gt; 실제 참  &lt;br /&gt;
FN: 모델이 거짓(N)으로 봤는데, 예측이 틀렸다(F). FN =&amp;gt; 실제 참 &lt;br /&gt;
FP: 모델이 참(P)으로 봤는데, 예측이 틀렸다(F). FP =&amp;gt; 실제 거짓&lt;br /&gt;
TN: 모델이 거짓(N)으로 봤는데, 예측이 맞았다(T). TN =&amp;gt; 실제 거짓&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;정밀도(Precision): 모델이 True라고 예측한 것중 실제 True인 것의 비율&lt;br /&gt;
TP/(TP+FP)&lt;br /&gt;
모델이 참이라고 한 것(TP+FP) 중 실제 참인 것(TP)의 비율&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;재현율(Recall): 실제 True인 것 중에서 모델이 True라고 예측한 것의 비율&lt;br /&gt;
TP/(TP+FN)&lt;br /&gt;
실제로 참인 것(TP+FN) 중에서 모델이 참이라고 한 것(TP)의 비율&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;정확도(Accuracy): 전체 예측한 데이터 중에서 정답을 맞춘 것에 대한 비율&lt;br /&gt;
(TP+TN)/(TP+FN+FP+TN)&lt;br /&gt;
전체 예측한 데이터 중에서 정답을 맞춘 것(TP+TN)&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;crf&quot;&gt;CRF&lt;/h4&gt;
&lt;p&gt;LSTM의 출력을 받아 레이블 시퀀스 중 가장 높은 점수를 가지는 시퀀스를 예측&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;CRF 층은 점차적으로 훈련 데이터로부터 아래와 같은 제약사항 등을 학습함.
    &lt;ul&gt;
      &lt;li&gt;문장의 첫 번째 단어에서는 I가 나오지 않음.&lt;/li&gt;
      &lt;li&gt;O-I 패턴은 나오지 않음.&lt;/li&gt;
      &lt;li&gt;B-I-I 패턴에서 개체명은 일관성을 유지한다. 연속된 I에서 다른 개체명이 나오면 안 됨…&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;즉, 양방향 LSTM은 입력 단어에 대한 양방향의 문맥을 반영하며, CRF는 출력 레이블에 대한 양방향 문맥을 반영함.&lt;/p&gt;

&lt;h4 id=&quot;bilstm-crf를-이용한-개체명-인식&quot;&gt;BiLSTM-CRF를 이용한 개체명 인식&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;문자 임베딩을 위한 전처리로, 문자 단위 정수 인코딩을 진행해야 함.
    &lt;ul&gt;
      &lt;li&gt;단어 -&amp;gt; 문자 시퀀스 -&amp;gt; 패딩 -&amp;gt; 문자 단위 정수 인코딩&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;bilstm-cnn을-이툥한-개체명-인식&quot;&gt;BiLSTM-CNN을 이툥한 개체명 인식&lt;/h4&gt;
&lt;ol&gt;
  &lt;li&gt;하나의 단어는 문자 단위로 토큰화&lt;/li&gt;
  &lt;li&gt;각 문자는 전처리를 통해 정수에 매핑&lt;/li&gt;
  &lt;li&gt;각 문자가 임베딩 층을 통과&lt;/li&gt;
  &lt;li&gt;1D CNN에 입력 사용하여 하나의 단어에 대한 단어 벡터를 얻음. (문자 임베딩)&lt;/li&gt;
  &lt;li&gt;일반적인 단어 임베딩 벡터와 연결&lt;/li&gt;
  &lt;li&gt;양방향 LSTM의 입력에 사용&lt;br /&gt;
cf) 문자 임베딩의 결과는 단어 임베딩의 대체제 또는 단어 임베딩 벡터와 함께 사용될 수 있다.&lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;
&lt;h2 id=&quot;서브워드-토크나이저&quot;&gt;서브워드 토크나이저&lt;/h2&gt;
&lt;h3 id=&quot;바이트-페어-인코딩&quot;&gt;바이트 페어 인코딩&lt;/h3&gt;
&lt;h4 id=&quot;oovout-of-vocabulary&quot;&gt;OOV(Out Of Vocabulary)&lt;/h4&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;세상에 모든 단어를 학습할 수 없음.  
모델이 모르는 단어가 발생하게 되면 UNK(Unknown Token)로 표시됨.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;바이트-페어-인코딩-byte-pair-encoding-bpe&quot;&gt;바이트 페어 인코딩 (Byte Pair Encoding, BPE)&lt;/h4&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;연속적으로 가장 많이 등장한 글자의 쌍을 찾아 하나의 글자로 병합함.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;BPE 알고리즘은 데이터 압축 알고리즘이지만, 자연어 처리의 서브워드 분리 알고리즘으로 활용됨.&lt;/p&gt;

&lt;p&gt;ex) “aaabdaaabac”&lt;br /&gt;
aa: 4회&lt;br /&gt;
-&amp;gt; ZabdZabac, Z = aa&lt;br /&gt;
-&amp;gt; ZYdZYac, Y = ab&lt;br /&gt;
-&amp;gt; XdXac, X = ZY
-&amp;gt; 종료&lt;/p&gt;

&lt;h4 id=&quot;자연어-처리에서의-bpe&quot;&gt;자연어 처리에서의 BPE&lt;/h4&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;자연어 처리에서의 BPE는 서브워드 분리 알고리즘
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;글자 단위에서 점차적으로 단어집합을 만들어 내는 Bottom-up 방식&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;훈련 데이터의 모든 단어들을 문자/유니코드 단위로 단어집합을 만듦.&lt;/em&gt;&lt;br /&gt;
  -&amp;gt; 빈도수가 가장 높은 유니그램을 하나의 유니그램으로 통합.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;기존의 접근은 학습한 적이 없는 단어가 입력될 시 제대로 대응하지 못함. =&amp;gt; &lt;strong&gt;OOV 문제&lt;/strong&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;BPE를 사용하는 경우&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;딕셔너리의 모든 단어들을 글자 단위로 분리함.&lt;/li&gt;
      &lt;li&gt;알고리즘 반복 횟수 지정 가능. =&amp;gt; iteration&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;ex)&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;o&quot;&gt;---&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# dictionary 훈련 데이터에 있는 단어와 등장 빈도수
&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;low&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lower&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;newest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;widest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# vocabulary
&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;low&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lower&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;newest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;widest&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;---&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;모든&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;단어를&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;글자&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;단위로&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;분리&lt;/span&gt;
  
    &lt;span class=&quot;c1&quot;&gt;# dictionary
&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;l&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;o&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;l&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;o&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;w&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;w&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;w&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# vocabulary
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;---&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;BPE&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;가장&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;빈도수가&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;높은&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;글자&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;쌍을&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;찾음&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
  
  &lt;span class=&quot;n&quot;&gt;lo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;we&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;er&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ne&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ew&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;es&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;st&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;de&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;es의&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;빈도수가&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;가장&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;높음&lt;/span&gt;

  &lt;span class=&quot;o&quot;&gt;---&lt;/span&gt;
  
  &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;es를&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;하나의&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;글자&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;쌍으로&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;묶어서&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dictionary&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;vocabulary&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;업데이트&lt;/span&gt;
  
  &lt;span class=&quot;c1&quot;&gt;# dictionary =&amp;gt; es 묶기
&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;l&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;o&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;l&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;o&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;w&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;w&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;es&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;w&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;es&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# vocabulary =&amp;gt; es 추가
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;es&lt;/span&gt;

  &lt;span class=&quot;o&quot;&gt;---&lt;/span&gt;
  
  &lt;span class=&quot;n&quot;&gt;BPE&lt;/span&gt;
  
  &lt;span class=&quot;n&quot;&gt;lo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;we&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;er&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ne&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ew&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;est&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;st&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;de&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;est의&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;빈도수가&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;가장&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;높음&lt;/span&gt;
  
  &lt;span class=&quot;o&quot;&gt;---&lt;/span&gt;
  
  &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;est를&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;하나의&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;글자&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;쌍으로&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;묶어서&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;다시&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;업데이트&lt;/span&gt;
  
  &lt;span class=&quot;c1&quot;&gt;# dictionary =&amp;gt; est 묶기
&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;l&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;o&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;l&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;o&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;w&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;w&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;est&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;w&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;est&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# vocabulary =&amp;gt; est 추가
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;es&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;est&lt;/span&gt;
  
  &lt;span class=&quot;o&quot;&gt;---&lt;/span&gt;
  
  &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;
  
  &lt;span class=&quot;n&quot;&gt;iterator만큼&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;반복&lt;/span&gt;
  
  &lt;span class=&quot;o&quot;&gt;---&lt;/span&gt;
  
  &lt;span class=&quot;c1&quot;&gt;# dictionary 
&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;low&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;low&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;newest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;widest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# vocabulary
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;es&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;est&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;low&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ne&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;newest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;widest&lt;/span&gt;
    
  &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OOV가&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;해결됨&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;n&quot;&gt;dictionary&lt;/span&gt;  
  &lt;span class=&quot;n&quot;&gt;low&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;low&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;newest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;widest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;  
  &lt;span class=&quot;n&quot;&gt;vocabulary&lt;/span&gt;  
  &lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;es&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;est&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;low&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ne&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;newest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;widest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;위 vocabulary를 학습한 BPE에&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;‘lowing’이 입력되는 경우
    &lt;ul&gt;
      &lt;li&gt;BPE에 입력
        &lt;ul&gt;
          &lt;li&gt;iteration: 3일 때에 low, i, n, g로 묶이게 되며, vocabulary 안의 단어로 
      병합할 수 있는 글자가 없게 되어 BPE가 종료됨.&lt;br /&gt;
      =&amp;gt; low, i, n, g를 병합하여 단어 완성&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;‘highing’이 입력되는 경우
    &lt;ul&gt;
      &lt;li&gt;BPE에 입력
        &lt;ul&gt;
          &lt;li&gt;iteration: 1일 때 h, i, g, h, i, n, g로 vocabulary 안의 단어로,
병합할 수 있는 글자가 없게 되어 BPE가 종료됨.&lt;br /&gt;
=&amp;gt; h, i, g, h, i, n, g를 병합하여 단어 완성&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;WordPiece Tokenizer&lt;br /&gt;
  BPE의 변형 알고리즘으로, 병합되었을 때 코퍼스의 우도를 가장 높이는 쌍을 병합한다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Unigram Language Model Tokenizer
    &lt;ul&gt;
      &lt;li&gt;각 서브 워드들의 손실을 계산한다.&lt;br /&gt;
cf) 손실: 단어 집합에서 제거되었을 때의 코퍼스 우도 감소치&lt;/li&gt;
      &lt;li&gt;원하는 단어 집합 크기가 될 때까지 최악의 토큰을 10% ~ 20% 제거한다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;센텐스-피스&quot;&gt;센텐스 피스&lt;/h3&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;내부 단어 문제를 위해 사용되는 패키지
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;주요 함수&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;spm.SentencePieceTrainer.Train(–input = imdb_review.txt, …)모든 매개변수 앞에는 –가 붙음.&lt;/li&gt;
  &lt;li&gt;DecodePieces()&lt;br /&gt;
ex) 입력 문장: I have money  &lt;br /&gt;
 -&amp;gt; DecodePieces([‘__I’, ‘__have’, ‘__money’])&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;서브워드-텍스트-인코더&quot;&gt;서브워드 텍스트 인코더&lt;/h3&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;텐서플로우의 서브워드 토크나이저
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;허깅-인터페이스-토크나이저&quot;&gt;허깅 인터페이스 토크나이저&lt;/h3&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;자주 등장하는 서브워드들을 하나의 토큰으로 취급하는 다양한 서브워드 토크나이저를 제공
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;sequence-to-sequence&quot;&gt;Sequence to Sequence&lt;/h2&gt;
&lt;h3 id=&quot;rnn을-이용한-인코더-디코더seq2seq&quot;&gt;RNN을 이용한 인코더-디코더(Seq2Seq)&lt;/h3&gt;
&lt;p&gt;기존의 RNN 구조와는 다른 RNN 인코더, RNN 디코더 두 개의 RNN을 연결하는 인코더-디코더 구조&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;입출력 문장의 길이가 다를 때 사용함. ex) 텍스트 요약 및 번역&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;seq2seq&quot;&gt;Seq2Seq&lt;/h3&gt;
&lt;p&gt;ex) 챗봇 - 입력: 질문, 출력: 대답&lt;br /&gt;
번역 - 입력: 문장, 출력: 번역문&lt;br /&gt;
내용 요약, STT 등&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;인코더와 디코더는 두 개의 RNN 아키텍처로 구성됨(LSTM과 GRU도 될 수 있음.)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Seq2Seq에 사용되는 모든 단어들은 임베딩 벡터로 변환 후 입력에 사용된다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;인코더와 디코더 셀에 입력되는 데이터는 최초 시점의 인코더 셀 말고는 모두 두 개의 데이터이다.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;인코더&quot;&gt;인코더&lt;/h4&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;입력 문장의 모든 단어들을 순차적으로 입력 받은 후 모든 단어 정보를 압축  
=&amp;gt; 컨텍스트 벡터 생성
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;인코더 RNN 셀은 모든 단어를 입력 받은 후 인코더 RNN 셀의 &lt;strong&gt;마지막 시점 은닉 상태&lt;/strong&gt;(&lt;strong&gt;컨텍스트 벡터&lt;/strong&gt;)를 디코더 RNN 셀로 전달함.&lt;/li&gt;
  &lt;li&gt;인코더 LSTM 셀 상위 레이어가 있다면 각 시점의 은닉 상태를 상위 레이어에 전달할 수 있다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;디코더&quot;&gt;디코더&lt;/h4&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;인코더에서 컨텍스트 벡터를 입력 받아 디코딩한 단어를 순차적으로 출력함
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;디코더는 기본적으로 RNNLM(RNN Language Model)이다.
    &lt;ul&gt;
      &lt;li&gt;초기 입력으로 문장의 시작을 의미하는 심볼 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;sos&amp;gt;&lt;/code&gt;가 들어감.&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;eos&amp;gt;&lt;/code&gt;가 입력되면 다음에 등장할 확률이 높은 단어를 예측한다.&lt;/li&gt;
      &lt;li&gt;첫 시점의 디코더 RNN 셀은 다음 시점에 올 단어를 예측하고, 이를 다음 셀의 입력으로 전달한다.&lt;/li&gt;
      &lt;li&gt;문장의 끝을 의미하는 심볼 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;eos&amp;gt;&lt;/code&gt;가 예측될 때까지 위 과정을 반복함.&lt;/li&gt;
      &lt;li&gt;Context Vector를 매 시점의 LSTM 셀에 입력할 수도 있다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;seq2seq-디코더의-훈련과-테스트-과정의-작동-방식&quot;&gt;Seq2Seq 디코더의 훈련과 테스트 과정의 작동 방식&lt;/h4&gt;
&lt;h5 id=&quot;훈련&quot;&gt;훈련&lt;/h5&gt;
&lt;p&gt;훈련 과정에서는 디코더에게 인코더가 보낸 컨텍스트 벡터와 실제 정답인 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;sos&amp;gt;&lt;/code&gt; 문장 a 를 입력 받았을 때, 문장 a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;eos&amp;gt;&lt;/code&gt;가 나오도록 정답을 알리며 훈련함&lt;/p&gt;

&lt;h5 id=&quot;테스트&quot;&gt;테스트&lt;/h5&gt;
&lt;p&gt;디코더는 오직 컨텍스트 벡터와 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;sos&amp;gt;&lt;/code&gt;만을 입력으로 받은 후 다음에 올 단어를 예측, 이를 다음 시점의 RNN 셀의 입력으로 넣는 행위를 반복한다.&lt;/p&gt;

&lt;h5 id=&quot;디코더-셀의-출력&quot;&gt;디코더 셀의 출력&lt;/h5&gt;
&lt;p&gt;각 디코더 셀의 은닉 상태는 &lt;strong&gt;softmax&lt;/strong&gt;층을 거쳐 예측 단어를 출력한다.&lt;/p&gt;

&lt;h5 id=&quot;교사-강요teacher-forcing&quot;&gt;교사 강요(Teacher forcing)&lt;/h5&gt;
&lt;p&gt;훈련 과정에서는 이전 시점의 디코더 셀의 출력을 현재 시점의 디코더 셀에 입력으로 넣어주지 않는다.&lt;br /&gt;
대신 이전 시점의 실제 값을 현재 시점의 디코더 셀의 입력 값으로 사용한다.
=&amp;gt; &lt;em&gt;잘못 예측한 단어가 다음 시점 셀에 입력되게 되면 전체 성능이 저하해 학습 성능을 저해할 수 있기 때문이다.&lt;/em&gt;&lt;/p&gt;

&lt;h4 id=&quot;문자-레벨-기계-번역기&quot;&gt;문자 레벨 기계 번역기&lt;/h4&gt;
&lt;h5 id=&quot;seq2seq로-기계-번역기-만들기&quot;&gt;Seq2Seq로 기계 번역기 만들기&lt;/h5&gt;
&lt;ul&gt;
  &lt;li&gt;훈련 데이터로 &lt;strong&gt;병렬 코퍼스&lt;/strong&gt;(두 개 이상의 언어가 병렬적으로 구성된 코퍼스)가 필요함.&lt;/li&gt;
  &lt;li&gt;교사 강요&lt;/li&gt;
  &lt;li&gt;심볼 - &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;sos&amp;gt;&lt;/code&gt;: ‘\t’, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;eos&amp;gt;&lt;/code&gt;: ‘\n’&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;word-level-번역기-bleu-score&quot;&gt;Word-level 번역기, BLEU Score&lt;/h2&gt;
&lt;h3 id=&quot;bleu-score&quot;&gt;BLEU Score&lt;/h3&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;기계 번역의 결과와 사람이 직접 번역한 결과가 얼마나 유사한지 비교하여 성능을 측정하는 방법
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;unigram-precision단어-개수-카운트로-측정&quot;&gt;Unigram Precision(단어 개수 카운트로 측정)&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;유니그램 정밀도 = Ref들에 존재하는 Ca의 단어의 수 / Ca의 총 단어 수&lt;br /&gt;
=&amp;gt; &lt;em&gt;Ref에 존재하는 단어만 반복되면 점수가 높아지는 문제가 존재함.&lt;/em&gt;&lt;br /&gt;
ex) Ref1: “the cat is cute.”, Ref2: “the cat is on the mat.” Ca: “the the the the” -&amp;gt; 4/4 = 1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;=&amp;gt; 중복 제거 필요&lt;/p&gt;

&lt;h4 id=&quot;modified-unigram-precision중복을-제거하여-보정하기&quot;&gt;Modified Unigram Precision(중복을 제거하여 보정하기)&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Max_Ref_Count: &lt;em&gt;하나의 Ref에 대한 유니그램의 최대 빈도수&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Count: Unigram Precision에서 계산하였던 유니그램의 수&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Count_clip: min(Count, Max_Ref_Count)&lt;/li&gt;
  &lt;li&gt;보정된 유니그램 정밀도: Ca의 각 Count_clip 총합 / Ca의 총 유니그램 수&lt;br /&gt;
ex) Ref1: “the cat is cute.”, Ref2: “the cat is on the mat.” Ca1: “the the the the” &lt;br /&gt;
Max_Ref_Count == 2, Count == 4, Count_clip == 2&lt;br /&gt;
-&amp;gt; 2 / 4 = 0.5가 됨.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;=&amp;gt; &lt;em&gt;단어의 순서가 바뀌어도 점수가 같다는 문제가 존재함.&lt;/em&gt;&lt;br /&gt;
ex) Ref1: “the cat is cute.”, Ref2: “the cat is on the mat.” Ca2: “the moon is good”&lt;/p&gt;

&lt;p&gt;Max_Ref_Count == 2, Count = 1, Count_clip == 1  &lt;br /&gt;
-&amp;gt; 1 / 4 = 0.25&lt;br /&gt;
Ca3: “moon the good is” 여도 값이 같음.&lt;/p&gt;

&lt;p&gt;=&amp;gt; &lt;em&gt;순서를 고려할 수 있도록 단어를 묶어서 보자!&lt;/em&gt;&lt;/p&gt;

&lt;h4 id=&quot;n-gram으로-확장&quot;&gt;n-gram으로 확장&lt;/h4&gt;
&lt;p&gt;n-gram 확장을 통해 단어 순서를 고려할 수 있게 됨.&lt;/p&gt;

&lt;p&gt;=&amp;gt; 짧은 문장에 좋은 점수가 부여되는 문제가 존재.&lt;/p&gt;

&lt;p&gt;=&amp;gt; &lt;em&gt;짧은 문장에 penalty 부여!&lt;/em&gt;&lt;/p&gt;

&lt;h4 id=&quot;브레버티-페널티&quot;&gt;브레버티 페널티&lt;/h4&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Ca가 Ref보다 짧으면 페널티 부여
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ref1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ref2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;***&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;refn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Ca&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;penalty&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;어텐션-메커니즘attention-mechanism&quot;&gt;어텐션 메커니즘(Attention Mechanism)&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;RNN에 기반한 Seq2Seq의 모델의 문제점
    &lt;ul&gt;
      &lt;li&gt;고정된 크기 벡터에 모든 정보를 압축 =&amp;gt; &lt;strong&gt;정보 손실 발생&lt;/strong&gt;&lt;/li&gt;
      &lt;li&gt;기울기 손실의 문제&lt;br /&gt;
=&amp;gt; &lt;em&gt;매 time step마다 필요한 부분에 집중해서 전체 출력을 다시 보자!&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;어텐션 함수&lt;br /&gt;
각 Query에 대해서 Key와의 유사도를 구해 각 Value에 반영함. 어텐션 함수의 결과는 Value의 총합(Attention Value)임.&lt;/p&gt;

    &lt;p&gt;Q = Query: t 시점의 디코더 셀에서의 은닉 상태 
  K = Keys: 모든 시점의 인코더 셀의 은닉 상태
  V = Values: 모든 시점의 인코더 셀의 은닉 상태들&lt;/p&gt;

    &lt;p&gt;Attention(Q, K, V) = Attention Value&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;어텐션 스코어
  현재 디코더의 시점 t에서 단어를 예측하기 위해, 인코더의 모든 은닉 상태 각각이 디코더의 현 시점 은닉 상태 s_t와 얼마나 유사한지를 판단하는 스코어 값&lt;br /&gt;
  h_i: t 시점에서 인코더의 은닉 상태  &lt;br /&gt;
score(s_t, h_i) = (s_t)^T * h_i&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;닷-프로덕트-어텐션dot-product-attention&quot;&gt;닷-프로덕트 어텐션(Dot-Product Attention)&lt;/h3&gt;
&lt;p&gt;연산 순서&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;디코더의 t시점 은닉상태와 각 인코더를 내적하여 어텐션 스코어를 구한다.&lt;/li&gt;
  &lt;li&gt;어텐션 스코어를 모두 더해 softmax를 취하여 어텐션 분포를 구한다.&lt;/li&gt;
  &lt;li&gt;어텐션 분포는 각 어텐션 가중치로 구성되며, 어텐션 가중치를 각 인코더의 은닉상태와 가중합하여 어텐션 밸류(컨텍스트 벡터)를 구한다.&lt;/li&gt;
  &lt;li&gt;어텐션 밸류와 디코더의 t시점 은닉상태와 연결한다.&lt;/li&gt;
  &lt;li&gt;이를 가중치 행렬과 곱한 후 tanh를 적용한다.&lt;/li&gt;
  &lt;li&gt;출력층의 입력으로 사용한다.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4 id=&quot;디코더의-t시점-은닉상태와-각-인코더를-내적하여-어텐션-스코어attention-score를-구한다&quot;&gt;디코더의 t시점 은닉상태와 각 인코더를 내적하여 어텐션 스코어(Attention Score)를 구한다.&lt;/h4&gt;
&lt;p&gt;디코더의 은닉 상태 S^t와 각 인코더의 은닉 상태를 내적하여 Attention score e^t를 구한다.&lt;/p&gt;

&lt;h4 id=&quot;어텐션-스코어를-모두-더해-softmax를-취하여-어텐션-분포attention-distribution를-구한다&quot;&gt;어텐션 스코어를 모두 더해 softmax를 취하여 어텐션 분포(Attention Distribution)를 구한다.&lt;/h4&gt;
&lt;p&gt;어텐션 스코어를 모두 더해 softmax 함수를 적용하여 어텐션 분포를 구한다.   &lt;br /&gt;
이때 어텐션 분포는 각 어텐션 가중치들로 구성된다.&lt;/p&gt;

&lt;h4 id=&quot;어텐션-분포는-각-어텐션-가중치로-구성되며-어텐션-가중치를-각-인코더의-은닉상태와-가중합하여-어텐션-밸류컨텍스트-벡터를-구한다&quot;&gt;어텐션 분포는 각 어텐션 가중치로 구성되며, 어텐션 가중치를 각 인코더의 은닉상태와 가중합하여 어텐션 밸류(컨텍스트 벡터)를 구한다.&lt;/h4&gt;
&lt;p&gt;각 인코더의 어텐션 가중치와 은닉 상태를 가중합하여 어텐션 값을 구한다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;어텐션 값(Attention Value): 어텐션 함수의 출력값&lt;br /&gt;
어텐션 가중치와 은닉 상태를 가중합한 &lt;em&gt;어텐션 값은 인코더의 문맥을 포함&lt;/em&gt; 하고 있다고 하여 &lt;strong&gt;컨텍스트 벡터&lt;/strong&gt;라 부름&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;어텐션-밸류와-디코더의-t시점-은닉상태와-연결한다&quot;&gt;어텐션 밸류와 디코더의 t시점 은닉상태와 연결한다.&lt;/h4&gt;
&lt;p&gt;어텐션 값을 디코더의 s^t와 연결한다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;v^t = a^t와 s^t의 결합&lt;br /&gt;
v^t를 예측 연산의 입력으로 사용하여 인코더로부터 얻은 정보를 활용하게 됨.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;이를-가중치-행렬과-곱한-후-tanh를-적용한다&quot;&gt;이를 가중치 행렬과 곱한 후 tanh를 적용한다.&lt;/h4&gt;
&lt;p&gt;가중치 행렬과 v^t를 곱하여 tanh 함수를 적용하여 s~^t를 만든다.
어텐션 메커니즘에서는 출력층의 입력이 s~^t가 됨.&lt;/p&gt;

&lt;p&gt;이를 출력층의 입력으로 사용한다.&lt;/p&gt;

&lt;h3 id=&quot;바다나우-어텐션&quot;&gt;바다나우 어텐션&lt;/h3&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Q = Query: t-1 시점의 디코더 셀에서의 은닉 상태 
K = Keys: 모든 시점의 인코더 셀의 은닉 상태
V = Values: 모든 시점의 인코더 셀의 은닉 상태들

Attention(Q, K, V) = Attention Value
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;연산 순서&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;어텐션 스코어를 구함&lt;/li&gt;
  &lt;li&gt;소프트 맥스 함수를 통해 어텐션 분포를 구함&lt;/li&gt;
  &lt;li&gt;각 인코더의 어텐션 가중치와 은닉 상태를 가중합하여 어텐션 값을 구함&lt;/li&gt;
  &lt;li&gt;컨텍스트 벡터로부터 s_t를 구함&lt;/li&gt;
&lt;/ol&gt;

&lt;h4 id=&quot;어텐션-스코어를-구함&quot;&gt;어텐션 스코어를 구함&lt;/h4&gt;
&lt;p&gt;닷-프로덕트 어텐션과 달리 Query로 디코더의 t-1 시점의 은닉 상태 s_(t-1)을 사용함. 수식도 다름.&lt;/p&gt;

&lt;h4 id=&quot;소프트-맥스-함수를-통해-어텐션-분포를-구함&quot;&gt;소프트 맥스 함수를 통해 어텐션 분포를 구함&lt;/h4&gt;
&lt;p&gt;닷-프로덕트 어텐션과 동일&lt;/p&gt;

&lt;h4 id=&quot;각-인코더의-어텐션-가중치와-은닉-상태를-가중합하여-어텐션-값을-구함&quot;&gt;각 인코더의 어텐션 가중치와 은닉 상태를 가중합하여 어텐션 값을 구함&lt;/h4&gt;
&lt;p&gt;닷-프로덕트 어텐션과 동일&lt;/p&gt;

&lt;h4 id=&quot;컨텍스트-벡터로부터-s_t를-구함&quot;&gt;컨텍스트 벡터로부터 s_t를 구함&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;LSTM은 이전 셀의 은닉 상태(s_(t-1)) + 현재 입력 (x_t)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Seq2Seq는 이전 셀의 은닉 상태(s_(t-1)) + 임베딩된 단어 벡터 입력 (x_t)&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;출력층에 전달&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;트랜스포머transformer&quot;&gt;트랜스포머(Transformer)&lt;/h2&gt;
&lt;p&gt;Seq2Seq 모델의 한계&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;입력 시퀀스의 벡터 압축 과정에서의 정보 손실 발생&lt;br /&gt;
=&amp;gt; &lt;em&gt;이를 보정하기 위해 어텐션이 사용됨!&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;어텐션을 RNN의 보정 용도로만 사용하지 않고, 어텐션만으로 인코더와 디코더를 만드는 것도 가능함.&lt;/p&gt;

&lt;p&gt;트랜스포머는 RNN을 사용하지 않지만 기존의 Seq2Seq처럼 인코더에서 입력 시퀀스를 입력받고, 디코더에서 출력 시퀀스를 출력하는 인코더-디코더 구조를 유지하고 있음.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Seq2Seq&lt;/strong&gt;: 인코더와 디코더에서 각각 하나의 RNN이 t개의 시점을 가지는 구조(RNN이 인코더와 디코더를 구성)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;트랜스포머&lt;/strong&gt;: 인코더와 디코더라는 단위가 N개로 구성되는 구조(RNN 안 씀, 인코더와 디코더가 N개로 구성)&lt;/p&gt;

&lt;h3 id=&quot;트랜스포머의-주요-하이퍼-파라미터&quot;&gt;트랜스포머의 주요 하이퍼 파라미터&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;임베딩 벡터의 차원(d_model)
    &lt;ul&gt;
      &lt;li&gt;트랜스포머의 인코더와 디코더에서의 정해진 입력과 출력의 크기&lt;/li&gt;
      &lt;li&gt;각 인코더와 디코더는 입출력 차원이 유지됨.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;트랜스포머 모델에서 인코더와 디코더의 레이어 수(num_layers)&lt;br /&gt;
인코더와 디코더를 얼마나 쌓느냐에 대한 하이퍼 파라미터&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;병렬 어텐션의 수
    &lt;ul&gt;
      &lt;li&gt;트랜스포머에서는 어텐션을 사용할 때, &lt;em&gt;여러 개로 분할하여 병렬으로 어텐션을 수행, 결과 값을 다시 하나로 합침&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;트랜스포머 내부에는 피드 포워드 신경망(FFNN)이 존재하며 해당 신경망의 은닉층 크기를 지정할 수 있음.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;포지셔널-인코딩positional-encoding&quot;&gt;포지셔널 인코딩(Positional Encoding)&lt;/h3&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;트랜스포머에서 단어의 위치 정보를 얻기 위해 각 단어의 임베딩 벡터에   
위치 정보(sin, cos 두 개 함수 사용)값들을 더하는 것
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;why to use?&lt;br /&gt;
모델은 포지셔널 인코딩된 결과를 입력으로 사용함.&lt;br /&gt;
RNN이 자연어 처리에서 유용한 것은 &lt;em&gt;단어의 위치에 따라 단어를 순차적으로 입력받는 특성&lt;/em&gt; 때문에 &lt;strong&gt;위치 정보를 가질 수 있기 때문임&lt;/strong&gt;.&lt;br /&gt;
반면, 트랜스포머는 단어 입력을 순차적으로 받지 않아 위치 정보를 부여할 필요가 있음.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;어텐션attention&quot;&gt;어텐션(Attention)&lt;/h3&gt;
&lt;p&gt;셀프 어텐션: Query, Key, Value 벡터의 출처가 동일한 경우
트랜스포머의 인코더-디코더 어텐션: Query가 디코더의 벡터, Key, Value가 인코더의 벡터로 &lt;em&gt;셀프 어텐션이 아님..!&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;인코더의 셀프 어텐션: Query = Key = Value&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;디코더의 마스크드 셀프 어텐션: Query = Key = Value&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;디코더의 인코더-디코더 어텐션: Query: 디코더 벡터 / Key = Value: 인코더 벡터&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;트랜스포머는 어텐션을 병렬으로 수행하기 위해 &lt;strong&gt;Multi-head&lt;/strong&gt; 방법을 사용함.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;인코더encoder&quot;&gt;인코더(Encoder)&lt;/h3&gt;
&lt;p&gt;트랜스포머는 하이퍼 파라미터인 num_layers 개수의 인코더 층을 쌓음.&lt;br /&gt;
인코더를 하나의 층으로 볼 때, 하나의 인코더 층은 셀프 어텐션 층과 피드 포워드 신경망 2개의 서브층으로 나뉨.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;인코더&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Position wise FFNN  &lt;br /&gt; ———————————— &lt;br /&gt; Multi-head Self-Attention&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;어텐션 함수는 주어진 Query에 대해서 모든 Key와의 유사도를 각각 구함.&lt;br /&gt;
이 유사도를 가중치로 하여 키와 맵핑되어 있는 Value에 반영함.&lt;br /&gt;
유사도가 반영된 Value를 모두 가중합하여 리턴함.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;기존의 어텐션은 t 시점이 변화함에 따라 반복적을 쿼리를 수행하기에 전체 시점에 일반화 될 수 있다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;셀프 어텐션은 입력 문장의 모든 단어 벡터들을 다룸으로써 &lt;em&gt;단어 간 연관성을 찾을 수 있다.&lt;/em&gt; ex) 문장 내 it이 가리키는 단어가 무엇인지?&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;인코더의-셀프-어텐션&quot;&gt;인코더의 셀프 어텐션&lt;/h4&gt;
&lt;ol&gt;
  &lt;li&gt;Q, K, V 벡터 얻기&lt;/li&gt;
  &lt;li&gt;스케일드 닷-프로덕트 어텐션(Scaled dot-product Attention)&lt;/li&gt;
&lt;/ol&gt;

&lt;h5 id=&quot;q-k-v-벡터-얻기&quot;&gt;Q, K, V 벡터 얻기&lt;/h5&gt;
&lt;p&gt;앞에서의 셀프 어텐션과는 달리, 실제 Q, K, V 벡터는 초기 입력인 d_model의 차원을 가지는 단어 벡터보다 더 작은 차원을 가짐. (계산 효율 등의 이유)&lt;br /&gt;
트랜스포머는 d_model을 num_heads로 나눈 값을 각 Q, K, V 벡터의 차원으로 가짐.&lt;br /&gt;
각 단어 벡터들에 가중치 행렬을 곱하여 (d_model / num_heads)차원의 Q, K, V 벡터를 얻음. 모든 단어 벡터에 대하여 수행함.&lt;/p&gt;

&lt;h5 id=&quot;스케일드-닷-프로덕트-어텐션scaled-dot-product-attention&quot;&gt;스케일드 닷-프로덕트 어텐션(Scaled dot-product Attention)&lt;/h5&gt;
&lt;p&gt;Q, K, V 벡터를 얻은 후엔 기존 어텐션 메커니즘과 동일함&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Q 벡터는 모든 K 벡터에 대하여 어텐션 스코어를 구함&lt;/li&gt;
  &lt;li&gt;어텐션 분포를 구함&lt;/li&gt;
  &lt;li&gt;V 벡터에 가중합하여 어텐션 값 또는 컨텍스트 벡터를 구함&lt;/li&gt;
  &lt;li&gt;모든 Q 벡터에 반복&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;내적만을 이용하는 기존 닷-프로덕트 어텐션과는 다른 어텐션 함수를 사용하여 스케일드 닷-프로덕트 어텐션이라 함.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;행렬 연산으로 어텐션 연산 일괄 처리&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;멀티-헤드-어텐션multi-head-attention&quot;&gt;멀티 헤드 어텐션(Multi-head Attention)&lt;/h5&gt;
&lt;p&gt;한 번의 어텐션보다 여러번의 어텐션을 병렬로 사용하는 것이 효과적&lt;/p&gt;

&lt;p&gt;d_model의 차원을 num_heads개로 나누어 d-model / num_heads의 차원을 가지는 벡터 Q, K, V에 대해서 num_heads 개의 병렬 어텐션을 수행함&lt;br /&gt;
이때 각 어텐션 값 행렬을 &lt;strong&gt;어텐션 헤드&lt;/strong&gt;라고 부름.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;각 벡터에 곱해지는 &lt;em&gt;가중치 행렬의 값은 어텐션 헤드마다 전부 다르다!&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;: 어텐션을 병렬으로 수행함으로써 다양한 시각에서 정보를 수집할 수 있다.&lt;br /&gt;
=&amp;gt; &lt;em&gt;각 어텐션 헤드에서 같은 단어의 연관성을 다르게 볼 수 있기 때문!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;병렬 어텐션이 수행된 이후에는 모든 어텐션 헤드를 연결하는데, 그 크기는 (seq_len, d_model)&lt;/p&gt;

&lt;p&gt;어텐션 헤드를 모두 연결한 행렬은 다른 가중치 행렬과 곱하여 최종적인 결과 행렬을 출력하며, 그 크기는 인코더의 입력이었던 문장 행렬의 크기 (seq_len, d_model)과 동일하다.&lt;br /&gt;
=&amp;gt; 인코더의 첫 번째 서브층인 멀티-헤드 어텐션을 거친 후의 출력과 입력의 크기는 같다.(인코더의 입출력은 항상 같아야 함.)&lt;br /&gt;
트랜스포머는 동일한 구조의 인코더를 쌓은 구조이기에 결국 인코더 전체의 입출력은 항상 같다.&lt;/p&gt;

&lt;h5 id=&quot;패딩-마스크&quot;&gt;패딩 마스크&lt;/h5&gt;
&lt;p&gt;어텐션 스코어 행렬의 마스킹 위치에 매우 -무한대에 가까운 음수값을 부여&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;PAD&amp;gt;&lt;/code&gt;가 포함된 입력 문장의 셀프 어텐션 수행 과정&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;단어 &lt;PAD&gt;는 실질적 의미가 없는 단어임.&lt;/PAD&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;트랜스포머에서는 Key의 경우에 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;PAD&amp;gt;&lt;/code&gt; 토큰이 존재한다면 이에 대해 유사도를 구하지 않도록 마스킹(Masking)을 함.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;포지션-와이즈-피드-포워드-신경망position-wise-ffnn&quot;&gt;포지션-와이즈 피드 포워드 신경망(Position-wise FFNN)&lt;/h4&gt;
&lt;p&gt;트랜스포머 인코더의 두 번째 서브층&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;포지션-와이즈 FFNN: 완전 연결 FFNN
포지션-와이즈 FFNN은 인코더와 디코더에서공통적으로 가지고 있는 서브층임.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;입출력의 크기는 (seq_len, d_model)로 보존됨.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;잔차-연결residual-connection과-층-정규화layer-normalization&quot;&gt;잔차 연결(Residual connection)과 층 정규화(Layer Normalization)&lt;/h4&gt;
&lt;p&gt;트랜스포머에서는 두 개의 서브층을 가진 인코더에 추가적으로 &lt;strong&gt;Add &amp;amp; Norm&lt;/strong&gt; 기법을 사용함. 이는 &lt;strong&gt;잔차 연결과, 층 정규화&lt;/strong&gt;를 의미&lt;/p&gt;

&lt;h5 id=&quot;잔차-연결residual-connection&quot;&gt;잔차 연결(Residual connection)&lt;/h5&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;서브층의 입력과 출력을 더하는 작업으로, 모델의 학습을 도움
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;트랜스포머 서브층의 입출력이 동일한 차원이라 덧셈 연산이 가능함.&lt;/p&gt;

&lt;h5 id=&quot;층-정규화layer-normalization&quot;&gt;층 정규화(Layer Normalization)&lt;/h5&gt;
&lt;p&gt;텐서의 마지막 차원에 대해서 평균과 분산을 구하고, 이를 통한 수식으로 값을 정규화하여 학습을 도움.&lt;br /&gt;
cf) 텐서의 마지막 차원: d_model의 차원(입출력 크기가 같기 때문)&lt;/p&gt;

&lt;p&gt;층 정규화의 두 가지 방법&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;평균과 분산을 통한 정규화&lt;/li&gt;
  &lt;li&gt;학습 가능한 파라미터 감마와 베타를 통한 정규화&lt;/li&gt;
&lt;/ol&gt;

&lt;h4 id=&quot;인코더에서-디코더로&quot;&gt;인코더에서 디코더로&lt;/h4&gt;
&lt;p&gt;구현된 인코더는 총 num_layers만큼의 층 연산을 순차적으로 진행한 후 마지막 층의 출력을 디코더에 전달함.&lt;br /&gt;
디코더 역시 num_layers만큼의 층 연산을 수행 하는데, 각 디코더 층 연산에 인코더의 출력을 사용함.&lt;/p&gt;

&lt;h3 id=&quot;디코더-1&quot;&gt;디코더&lt;/h3&gt;
&lt;p&gt;기존의 Seq2Seq 구조처럼 시작 심볼 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;sos&amp;gt;&lt;/code&gt;를 입력으로 받아 종료 심볼 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;eos&amp;gt;&lt;/code&gt;가 나올 때까지 연산을 진행함.&lt;br /&gt;
=&amp;gt; &lt;em&gt;RNN을 사용하지 않지만 인코더-디코더 구조는 유지&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;디코더를 하나의 층으로 볼 때, 하나의 디코더 층은 마스크드 멀티 헤드 어텐션 층과 셀프 어텐션 층, 피드 포워드 신경망 3개의 서브층으로 나뉨.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;디코더&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Position wise FFNN  &lt;br /&gt; ———————————————- &lt;br /&gt; Multi-head Attention &lt;br /&gt; ———————————————- &lt;br /&gt; Masked Multi-head self-Attention&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id=&quot;디코더의-첫-번째-서브층-masked-multi-head-self-attention셀프-어텐션과-룩-어헤드-마스크&quot;&gt;디코더의 첫 번째 서브층: Masked Multi-head self-Attention(셀프 어텐션과 룩-어헤드 마스크)&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;디코더도 인코더와 동일하게 임베딩 층과 포지셔널 인코딩을 거친 후의 문장 행렬이 입력됨.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;트랜스포머도 Seq2Seq와 같이 교사 강요(Teacher Forcing)을 사용하여 훈련함.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;디코더는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;sos&amp;gt;&lt;/code&gt; 토큰이 포함된 문장 행렬을 한 번에 입력 받고 이로부터 각 시점의 단어를 예측하도록 훈련됨.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Seq2Seq의 디코더에 사용되는 RNN 계열의 신경망은 입력 단어를 매 시점마다 순차적으로 입력받기 때문에 다음 단어 예측에 현재 및 이전 시점에 입력된 단어만 참고할 수 있음.&lt;/p&gt;

&lt;p&gt;트랜스포머는 문장 행렬로 입력을 한 번에 받기 때문에 현재 시점의 단어를 예측할 때 미래 시점의 단어까지도 참고할 수 있는 현상이 발생.
=&amp;gt; &lt;strong&gt;룩-어헤드 마스크(Look-ahead mask)&lt;/strong&gt; 도입&lt;/p&gt;

&lt;p&gt;디코더의 첫 번째 서브층인 멀티 헤드 셀프 어텐션 층은 인코더의 그것과 동일한 연산을 수행.
&lt;em&gt;오직 어텐션 스코어 행렬에 마스킹을 적용한다는 점만 다름!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;트랜스포머에는 총 세가지 어텐션이 존재함.
각 어텐션 시 함수에 전달하는 마스킹은 아래와 같음.&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;인코더의 셀프 어텐션: 패딩 마스크 전달&lt;/li&gt;
  &lt;li&gt;디코더의 마스크드 셀프 어텐션: 룩-어헤드 마스크 전달(패딩 마스크 포함)&lt;/li&gt;
  &lt;li&gt;디코더의 인코더-디코더 어텐션: 패딩 마스크 전달&lt;/li&gt;
&lt;/ol&gt;

&lt;h4 id=&quot;디코더의-두-번째-서브층-인코더-디코더-어텐션encoder-decorder-attention&quot;&gt;디코더의 두 번째 서브층: 인코더-디코더 어텐션(Encoder-Decorder Attention)&lt;/h4&gt;
&lt;p&gt;디코더의 두 번째 서브층은 멀티 헤드 어텐션을 수행한다는 점에서 이전 어텐션들과 공통점을 가짐.&lt;/p&gt;

&lt;p&gt;셀프 어텐션은 Query, Key, Value의 출처가 같은 경우인데, 인코더-디코더 어텐션 층은 Query: 디코더 행렬, Key = Value: 인코더 행렬이라 셀프 어텐션이 아님!&lt;br /&gt;
따라서 디코더의 두 번째 서브층에는 인코더 마지막 층의 결과 행렬으로부터 두 개의 입력(Key, Value)이 들어옴.&lt;/p&gt;

&lt;h3 id=&quot;어텐션-정리&quot;&gt;어텐션 정리&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;어텐션&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;디코더/인코더&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;셀프&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;마스킹 적용 여부&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;어텐션 시 전달하는 마스킹&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Multi-head&lt;br /&gt;self-Attention&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;인코더 (첫 번째 서브층)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;O&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;X&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;패딩 마스크&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Masked Multi-head&lt;br /&gt;self-Attention&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;디코더 (첫 번째 서브층)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;O&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;O&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;룩-어헤드 마스크&lt;br /&gt;(패딩 마스크 포함)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Encorder-Decorder&lt;br /&gt;Attention&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;디코더 (두 번째 서브층)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;X&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;X&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;패딩 마스크&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;학습률&quot;&gt;학습률&lt;/h3&gt;
&lt;h4 id=&quot;학습률-스케줄러&quot;&gt;학습률 스케줄러&lt;/h4&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;미리 학습 일정을 정해두고 그 일정에 따라 학습률이 조정되는 방법
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;트랜스포머의 경우 사용자가 정한 단계까지 학습률을 증가, 점차 낮춰가는 방식임.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;bert&quot;&gt;BERT&lt;/h2&gt;
&lt;h3 id=&quot;임베딩을-사용하는-두-가지-방법&quot;&gt;임베딩을 사용하는 두 가지 방법&lt;/h3&gt;
&lt;ol&gt;
  &lt;li&gt;임베딩 층을 랜덤 초기화하여 처음부터 학습&lt;/li&gt;
  &lt;li&gt;학습된 임베딩 벡터들을 가져와 사용(데이터가 적은 경우 유리)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;임베딩-방법의-단점&quot;&gt;임베딩 방법의 단점&lt;/h3&gt;
&lt;p&gt;두 가지 방법 모두 하나의 단어가 하나의 벡터값으로 맵핑, 문맥을 고려하지 못함.&lt;br /&gt;
=&amp;gt; 다의어나 동음이의어를 구분하지 못함.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Semi-supervised Sequence Learning&lt;br /&gt;
레이블이 없는 데이터로 학습된 LSTM과 가중치가 랜덤으로 초기화된 LSTM 비교 시 사전 훈련된 언어 모델을 사용한 전자가 더 좋은 성능&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;ELMo&lt;br /&gt;
순방향 언어 모델과 역방향 언어 모델을 따로 학습 시킨 후 사전 학습된 언어 모델로 임베딩 값을 얻음.&lt;br /&gt;
=&amp;gt; 문맥에 따라서 임베딩 벡터가 달라져 다의어를 구분할 수 없었던 문제 해결 가능.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;GPT-1 &lt;br /&gt;
트랜스포머의 디코더는 순차적으로 이전 단어들로부터 다음 단어를 예측&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;양방향 모델&lt;br /&gt;
이미 예측해야 하는 단어를 역방향 언어 모델을 통해 미리 관측한 셈이므로 언어 모델은 일반적으로 양방향으로 구현하지 않음.  &lt;br /&gt;
하지만 언어의 문맥은 실제로 양방향이므로, 그 대안으로 ELMo에서는 순방향과 역방향 두 개의 단방향 언어 모델을 따로 준비하여 학습.  &lt;br /&gt;
=&amp;gt; 새로운 구조의 언어 모델 마스크드 언어 모델 탄생&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;마스크드 언어 모델&lt;br /&gt;
입력 텍스트의 단어 집합의 15% 단어를 랜덤으로 마스킹함. &lt;br /&gt;
문장에 들어갈 마스킹된 단어를 예측하도록 학습&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;bert-1&quot;&gt;BERT&lt;/h3&gt;
&lt;p&gt;레이블이 없는 방대한 데이터로 사전 훈련된 모델을 가지고, 레이블이 있는 다른 작업에 대해 추가 훈련을 하여 하이퍼 파라미터를 재조정하였음.&lt;br /&gt;
=&amp;gt; &lt;strong&gt;파인 튜닝&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;사전 학습된 BERT 모델 위에 신경망을 추가하여 파인튜닝함.&lt;/p&gt;

&lt;h4 id=&quot;bert의-크기&quot;&gt;BERT의 크기&lt;/h4&gt;
&lt;p&gt;트랜스포머의 인코더를 쌓아올린 구조
초기 트랜스포머에 비하여 훨씬 큰 모델임.&lt;/p&gt;

&lt;h4 id=&quot;bert의-문맥을-반영한-임베딩&quot;&gt;BERT의 문맥을 반영한 임베딩&lt;/h4&gt;
&lt;p&gt;새로운 문장이 시작되면 [CLS]로 시작함.&lt;/p&gt;

&lt;p&gt;BERT의 연산을 거친 후 출력 임베딩은 문장의 문맥을 모두 참고한 문맥을 반영한 임베딩이 됨.&lt;/p&gt;

&lt;p&gt;[CLS]라는 벡터는 BERT의 초기 입력으로 사용되었을 때에는 단순히 임베딩 층을 지난 임베딩 벡터지만, BERT를 지나고 나면 모든 단어 벡터들을 모두 참고한 문맥 정보를 가진 벡터가 됨.&lt;/p&gt;

&lt;p&gt;하나의 단어가 모든 단어를 참고하는 연산은 BERT의 12개 층에서 모두 이루어짐.&lt;/p&gt;

&lt;p&gt;=&amp;gt; &lt;strong&gt;셀프 어텐션&lt;/strong&gt;을 통해 가능한 작업&lt;/p&gt;

&lt;p&gt;BERT는 각 층마다 헤드 셀프 어텐션과 포지션 와이즈 피 포워드 신경망을 수행함.&lt;/p&gt;

&lt;h4 id=&quot;bert의-서브워드-토크나이저-wordpiece-embedding&quot;&gt;BERT의 서브워드 토크나이저: WordPiece Embedding&lt;/h4&gt;
&lt;p&gt;BERT는 단어보다 더작은 단위로 쪼개는 서브워드 토크나이저, &lt;strong&gt;WordPiece&lt;/strong&gt;를 사용&lt;br /&gt;
WordPiece 토크나이저는 BPE와 유사하게 글자로부터 서브워드들을 병합해 가는 방식으로 Vocabulary를 만듦.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;자주 등장하지 않는 단어는 더 작은 단위인 서브워드로 분리, 서브워드들이 Vocabulary에 추가되는 아이디어&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;토큰화 과정&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;토큰이 단어 집합(Vocabulary)에 존재함.&lt;br /&gt;
=&amp;gt; 토큰 분리 X&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;토큰이 단어 집합(Vocabulary)에 존재하지 않음.&lt;br /&gt;
=&amp;gt; 해당 토큰을 서브워드로 분리&lt;br /&gt;
=&amp;gt; 해당 토큰의 첫 번째 서브워드를 제외한 나머지 서브워드들은 앞에 “##”을 붙여서 토큰으로 가짐.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;=&amp;gt; 기존의 서브워드 토크나이저에서 OOV 문제를 발생 시키는 단어들을 서브워드로 처리할 수 있음.&lt;/p&gt;

&lt;h4 id=&quot;포지션-임베딩position-embedding&quot;&gt;포지션 임베딩(Position Embedding)&lt;/h4&gt;
&lt;p&gt;트랜스포머에서는 포지셔널 인코딩이라는 방법을 통해서 단어의 위치 정보를 표현함.&lt;/p&gt;

&lt;p&gt;cf) 포지셔널 인코딩: 사인 함수와 코사인 함수를 사용하여 위치에 따라 다른 값을 가지는 행렬을 만들어 다른 벡터들과 더하는 방법&lt;/p&gt;

&lt;p&gt;BERT에서는 위치 정보를 사인 함수와 코사인 함수가 아닌 &lt;em&gt;학습을 통해 얻을 수 있는 포지션 임베딩이라는 방법을 사용.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;WordPice Embedding을 통해 얻은 입력에 포지션 임베딩을 통해 위치 정보를 더함.&lt;/p&gt;

&lt;p&gt;위치 정보를 위한 임베딩 층을 하나 사용하여 문장의 길이와 같은 개수의 포지션 임베딩 벡터를 학습, BERT의 입력마다 포지션 임베딩 벡터를 더함.&lt;br /&gt;
ex) 첫 번째 단어의 임베딩 벡터 + 0번 포지션 임베딩 벡터, 두 번째 단어의 임베딩 벡터 + 1번 포지션 임베딩 벡터&lt;/p&gt;

&lt;p&gt;실제 BERT에서는 문장의 길이를 512로 하고 있으므로, 총 512개의 포지션 임베딩 벡터가 학습됨.&lt;/p&gt;

&lt;p&gt;BERT에서는 WordPice Embedding, Position Embedding, Segment Embedding 세 개의 임베딩 층을 사용함.&lt;/p&gt;

&lt;h4 id=&quot;bert의-사전-훈련&quot;&gt;BERT의 사전 훈련&lt;/h4&gt;
&lt;ol&gt;
  &lt;li&gt;마스크드 언어 모델&lt;/li&gt;
  &lt;li&gt;다음 문장 예측(NSP)&lt;/li&gt;
&lt;/ol&gt;

&lt;h5 id=&quot;마스크드-언어-모델&quot;&gt;마스크드 언어 모델&lt;/h5&gt;
&lt;p&gt;전부 마스크로 변경 X&lt;br /&gt;
랜덤으로 선택된 15% 단어들은, 마스크, 랜덤 단어 변경, 원문 유지(BERT는 바뀐 건지 아닌지 모름) 등의 규칙이 적용되어 마스킹됨.&lt;/p&gt;

&lt;h5 id=&quot;nsp&quot;&gt;NSP&lt;/h5&gt;
&lt;p&gt;BERT는 두 개의 문장을 제공 받고 이어지는 문장인지에 대한 여부를 학습한다.&lt;br /&gt;
cf) 1:1 비율로 실제 이어지는 두 개의 문장과 랜덤으로 이어붙인 두 개의 문장으로 훈련함.&lt;br /&gt;
BERT의 입력으로 넣을 때에는 첫 번째 문장 끝에 [SEP] 토큰을 넣어 문장을 구분함. 두 번째 문장도 동일.&lt;br /&gt;
두 문장이 실제 이어지는지를 [CLS] 토큰의 위치의 출력층에서 이진 분류 문제를 풀도록 함.([CLS] 토큰은 BERT가 분류 문제를 풀기 위해 추가된 특별 토큰)&lt;/p&gt;

&lt;h5 id=&quot;세그먼트-임베딩segment-embedding&quot;&gt;세그먼트 임베딩(Segment Embedding)&lt;/h5&gt;
&lt;p&gt;BERT는 문장 구분을 위해서 세그먼트 임베딩 층을 사용함.&lt;br /&gt;
두 문장을 구분하는 두 개의 임베딩 벡터만 사용됨.&lt;/p&gt;

&lt;p&gt;QA 문제의 경우 질문과 본문 두 가지로, 두 종류의 텍스트를 입력 받아 모두 두 종류의 텍스트/문서가 사용될 수 있지만,&lt;br /&gt;
감성 분류와 같은 작업을 수행할 때에는 하나의 문서만 사용되므로, BERT의 입력 전체에 Sentence 0 임베딩만 더해 주게 됨.&lt;/p&gt;

&lt;h3 id=&quot;bert를-파인-튜닝fine-tuning하기&quot;&gt;BERT를 파인 튜닝(Fine-tuning)하기&lt;/h3&gt;
&lt;h4 id=&quot;하나의-텍스트에-대한-태깅-작업&quot;&gt;하나의 텍스트에 대한 태깅 작업&lt;/h4&gt;
&lt;p&gt;BERT를 사용하는 두 번째 유형은 태깅 작업.&lt;br /&gt;
출력층에서는 입력 텍스트의 각 토큰 위치에 밀집층을 사용하여 분류에 대한 예측 수행&lt;/p&gt;

&lt;h4 id=&quot;텍스트의-쌍에-대한-분류-또는-회귀-문제&quot;&gt;텍스트의 쌍에 대한 분류 또는 회귀 문제&lt;/h4&gt;
&lt;p&gt;BERT는 자연어 추론 등의 경우와 같이 텍스트의 쌍을 입력으로 받는 태스크도 풀 수 있음.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;자연어 추론 문제: 두 문장이 주어졌을 때, 하나의 문장이 다른 문장과의 논리적인 관계를 분류하는 문제 ex) 모순 관계 등&lt;br /&gt;
이 경우 Sentence 0, Sentence 1 임베딩 모두 사용하여 문서를 구분&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;어텐션-마스크attention-mask&quot;&gt;어텐션 마스크(Attention Mask)&lt;/h4&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;BERT가 어텐션 연산을 할 때, 불필요하게 패딩 토큰에 대해 어텐션을 수행하지 않도록 실제 단어와 패딩 토큰을 구분할 수 있도록 하는 입력
1: 실제 단어, 0: 패딩 토큰
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;bert의-문장-임베딩&quot;&gt;BERT의 문장 임베딩&lt;/h3&gt;
&lt;p&gt;사전 학습된 BERT로부터 문장 벡터를 얻는 방법은 세 가지가 있음.&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;BERT의 [CLS] 토큰의 출력 벡터를 문장 벡터로 간주함.&lt;/li&gt;
  &lt;li&gt;BERT의 모든 단어의 출력 벡터에 대해서 평균 풀링을 수행한 벡터를 문장 벡터로 간주함.&lt;/li&gt;
  &lt;li&gt;BERT의 모든 단어의 출력 벡터에 대해서 맥스 풀링을 수행한 벡터를 문장 벡터로 간주함.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
  &lt;li&gt;평균 풀링: 모든 단어의 의미를 반영함.&lt;/li&gt;
  &lt;li&gt;맥스 풀링: 중요한 단어의 의미를 반영함.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;bert와-gpt&quot;&gt;BERT와 GPT&lt;/h2&gt;
&lt;p&gt;GPT는 코퍼스만을 가지고 사전학습됨. 다음에 올 토큰을 예측하는 방식.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;BERT
    &lt;ul&gt;
      &lt;li&gt;&lt;em&gt;트랜스포머의 인코더 사용&lt;/em&gt;&lt;/li&gt;
      &lt;li&gt;파인 튜닝 사용&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;GPT
    &lt;ul&gt;
      &lt;li&gt;&lt;em&gt;트랜스포머의 디코더 사용&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;GPT-1
    &lt;ul&gt;
      &lt;li&gt;파인 튜닝 사용&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;GPT-2, 3
    &lt;ul&gt;
      &lt;li&gt;파인 튜닝 사용 안 함&lt;/li&gt;
      &lt;li&gt;In-context learning 사용&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;overview&quot;&gt;Overview&lt;/h2&gt;
&lt;p&gt;중점적으로 보기.&lt;/p&gt;
&lt;h3 id=&quot;rnn&quot;&gt;RNN&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;나이브 베이즈 정리&lt;br /&gt;
&lt;a href=&quot;#나이브-베이즈-분류기&quot;&gt;나이브 베이즈 분류기 바로가기&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;cnn-1&quot;&gt;CNN&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;1D CNN&lt;br /&gt;
&lt;a href=&quot;#자연어-처리를-위한-1d-cnn&quot;&gt;1D CNN 바로가기&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;문자 임베딩&lt;br /&gt;
&lt;a href=&quot;#문자-임베딩&quot;&gt;문자 임베딩 바로가기&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;태깅&quot;&gt;태깅&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;#케라스를-이용한-태깅-작업&quot;&gt;태깅 품사 바로 가기&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;품사 태깅
    &lt;ul&gt;
      &lt;li&gt;다 대 다 문제&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;BIO 표현&lt;br /&gt;
&lt;a href=&quot;#bio-표현begin-inside-outside&quot;&gt;BIO 표현(Begin Inside Outside) 바로가기&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;F1 Score&lt;br /&gt;
&lt;a href=&quot;#f1-score-&quot;&gt;F1 Score 바로 가기&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;CRF&lt;br /&gt;
&lt;a href=&quot;#crf&quot;&gt;CRF 바로가기&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;서브워드-토크나이저-1&quot;&gt;서브워드 토크나이저&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;BPE 정의 중요&lt;br /&gt;
&lt;a href=&quot;#바이트-페어-인코딩&quot;&gt;BPE 바로가기&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;센텐스피스&lt;br /&gt;
&lt;a href=&quot;#센텐스-피스&quot;&gt;센텐스 피스 바로가기&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;seq2seq-1&quot;&gt;Seq2Seq&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;#seq2seq&quot;&gt;Seq2Seq 바로가기&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;bleu&quot;&gt;BLEU&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;#bleu-score&quot;&gt;BLEU Score 바로가기&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;어텐션-메커니즘&quot;&gt;어텐션 메커니즘&lt;/h3&gt;
&lt;p&gt;계산 중요
&lt;a href=&quot;#어텐션-메커니즘attention-mechanism&quot;&gt;어텐션 메커니즘(Attention Mechanism) 바로가기&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;트랜스포머&quot;&gt;트랜스포머&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;#트랜스포머transformer&quot;&gt;트랜스포머(Transformer) 바로가기&lt;/a&gt;
구조도 잘 보기&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;룩-어헤드 마스크
&lt;a href=&quot;#디코더의-첫-번째-서브층-masked-multi-head-self-attention셀프-어텐션과-룩-어헤드-마스크&quot;&gt;디코더의 첫 번째 서브층: Masked Multi-head self-Attention(셀프 어텐션과 룩-어헤드 마스크) 바로 가기&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;bert-2&quot;&gt;BERT&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;#bert&quot;&gt;BERT 바로가기&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;마스크드 언어 모델&lt;br /&gt;
&lt;a href=&quot;#마스크드-언어-모델&quot;&gt;마스크드 언어 모델 바로가기&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;세그먼트 임베딩
&lt;a href=&quot;#세그먼트-임베딩segment-embedding&quot;&gt;세그먼트 임베딩(Segment Embedding) 바로가기&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;gpt&quot;&gt;GPT&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;#bert와-gpt&quot;&gt;BERT와 GPT 바로가기&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;blockquote&gt;
  &lt;h3 id=&quot;profile&quot;&gt;Profile&lt;/h3&gt;

  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Seong Hun KIM&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Student&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;Dept. of Computer Science Engineering | Yeungnam University, Repulic of Korea&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Convolution_Filter_Application/assets/118245330/37c81d9e-cfb8-4aee-8497-ff1071b2458b&quot; alt=&quot;yu signature&quot; /&gt;&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Phone&lt;/strong&gt; &lt;a href=&quot;tel:010-6685-1140&quot;&gt;010 - 6685 - 1140&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Mail&lt;/strong&gt; &lt;a href=&quot;mailto:tgh7544@naver.com&quot;&gt;tgh7544@naver.com&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;LinkTree&lt;/strong&gt; &lt;a href=&quot;https://linktr.ee/HoonC_corgi&quot;&gt;https://linktr.ee/HoonC_corgi&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</description>
        <pubDate>Fri, 07 Jun 2024 00:00:00 +0000</pubDate>
        <link>https://hoonc-corgi.github.io/2024/06/07/%EB%94%A5%EB%9F%AC%EB%8B%9D%EA%B3%BC-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC-%ED%83%80%EC%9D%B4%ED%95%91.html</link>
        <guid isPermaLink="true">https://hoonc-corgi.github.io/2024/06/07/%EB%94%A5%EB%9F%AC%EB%8B%9D%EA%B3%BC-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC-%ED%83%80%EC%9D%B4%ED%95%91.html</guid>
        
        
      </item>
    
      <item>
        <title>[논문 리뷰] Multi-Link Operation in IEEE 802.11be WLANs</title>
        <description>&lt;!-- TOC --&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#--&quot;&gt;논문 리뷰를 시작하며&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#---&quot;&gt;한글 번역 및 코멘트&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#abstract&quot;&gt;Abstract&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#notes&quot;&gt;Notes&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#introduction&quot;&gt;Introduction&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#notes&quot;&gt;Notes&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#multi-link-operation&quot;&gt;Multi-Link Operation&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#architecture&quot;&gt;Architecture&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#notes&quot;&gt;Notes&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#transmission-modes&quot;&gt;Transmission Modes&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#notes&quot;&gt;Notes&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#management&quot;&gt;Management&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#notes&quot;&gt;Notes&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#power-save&quot;&gt;Power Save&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#notes&quot;&gt;Notes&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#traffic-management&quot;&gt;Traffic Management&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#notes&quot;&gt;Notes&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#performance-evaluation&quot;&gt;Performance Evaluation&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#open-issues-and-challenges&quot;&gt;Open Issues and Challenges&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#notes&quot;&gt;Notes&lt;/a&gt;
&lt;!-- TOC --&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;논문-리뷰를-시작하며&quot;&gt;논문 리뷰를 시작하며&lt;/h1&gt;

&lt;p&gt;연구실에서 진행하는 논문 세미나를 준비하는 과정에서 해당 내용들을 그냥 넘어가지 않고, 블로그에 남겨 놓는다면 추후에 내가 공부하면서 어려워 했던 부분이나,
 놓쳤던 부분을 다시 확인할 수 있을 것 같아 논문 리뷰 글도 블로그에 작성해 보기로 하였다.&lt;/p&gt;

&lt;p&gt;오늘의 논문은 아래와 같다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-Link Operation in IEEE 802.11be WLANs&lt;/strong&gt; - Álvaro López-Raventós and Boris Bellalta (IEEE Wireless Communications • August 2022)&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;본 게시글은 위 논문을 스스로 번역, 재정리한 내용을 포함합니다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;
&lt;h1 id=&quot;한글-번역-및-코멘트&quot;&gt;한글 번역 및 코멘트&lt;/h1&gt;
&lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;multi-link operation (MLO)은 IEEE 802.11 be Extremely High Throughput (EHT)의 개선안의 일부로 제안된 새로운 기능이다.&lt;/p&gt;

&lt;p&gt;이러한 기능은 노드가 여러 무선 인터페이스를 통해 동시에 데이터를 송수신할 수 있게 됨으로써 multi-link 통신으로 패러다임 전환됨을 보인다.&lt;/p&gt;

&lt;p&gt;이를 위해 802.11be의 태스크 그룹은 노드의 아키텍처, 전송 운영 및 관리 기능에 대한 다양한 수정 사안을 제안하였다.&lt;/p&gt;

&lt;p&gt;본 기사에서는 이러한 변경사항과 여전히 해결되지 못한 트래픽이 다중 링크에서 어떻게 분산되어야 하는지에 대한 문제를 검토한다.&lt;/p&gt;

&lt;p&gt;이를 위해 active links를 통해 상이한 load balancing 전략을 평가한다.&lt;/p&gt;

&lt;p&gt;결과는 high load, high dense, 그리고 복잡한 시나리오에서 MLO를 사용하여 차세대 WLAN의 성능을 높이기 위한 congestion aware load balancing 전략이 필수적임을 시사한다.&lt;/p&gt;

&lt;hr /&gt;
&lt;h3 id=&quot;notes&quot;&gt;Notes&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;MLO는 IEEE 802.11 be EHT의 개선안의 일부로 새롭게 제안된 특징임&lt;/li&gt;
  &lt;li&gt;MLO로 인해 노드는 여러 무선 인터페이스를 통해 동시에 데이터 송수신이 가능해짐.&lt;/li&gt;
  &lt;li&gt;이로 인해 multi-link 통신으로 패러다임이 전환됨.
    &lt;ul&gt;
      &lt;li&gt;&lt;em&gt;기존에는 어땠기에?&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;MLO를 위해 노드 아키텍처, 전송 운영 및 관리 기능에 대한 수정 사안 제안됨.&lt;/li&gt;
  &lt;li&gt;이렇게 제안된 여러 변경사항과 “여전히 해결되지 못한 문제”에 대하여 이야기하는 논문임.
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;트래픽이 multi-link에서 어떻게 분산되어야 하는가?&lt;/strong&gt;
        &lt;ul&gt;
          &lt;li&gt;active links에서의 여러 load balancing 전략 평가를 통해 확인&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;결과적으로 high load, high dense, complex 시나리오에서는 MLO를 사용하여 차세대 무선랜의 성능을 높이기 위한 &lt;strong&gt;congestion aware load balancing&lt;/strong&gt; 전략이 필수적임.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;
&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;

&lt;p&gt;WiFi로 흔히 알려진 IEEE 802.11 standard는 낮은 복잡성과 비용 효율을 가지는 무선 연결을 제공하기 위한 솔루션으로 90년대 후반에 출시되었다.&lt;/p&gt;

&lt;p&gt;최근 6세대가 된 WiFi의 확산은 지속적인 표준 개정을 통해 새로운 use-case에 따른 요구사항에 대처할 수 있게 되었기 때문이다.&lt;/p&gt;

&lt;p&gt;무선 데이터 서비스들은 방대한 양의 데이터, 까다로운 throughput, latency, 신뢰성을 요구하는 VR/AR, Video/Game Streaming, 클라우드 서비스 등의 어플리케이션과 함께 계속해서 성장할 것이다.&lt;/p&gt;

&lt;p&gt;이러한 기대를 해결하기 위해 802.11be의 태스크 그룹 (TGbe)은 다가오는 WiFi 7을 가속 시키기 위한 개발을 해결하기 위해 2019년 5월에 만들어 졌다.&lt;/p&gt;

&lt;p&gt;IEEE 802.11be Extremely High Throughput (EHT)라고 불리는, 이 개정안은 WiFi의 throughput을 증가 시키고, 종단 간 latency를 줄이며, 통신의 신뢰성을 높이는 것을 목표로 한다.&lt;/p&gt;

&lt;p&gt;이에 Multi-link Operation (MLO)는 MLO 주요 후보 기능으로 고려되고 있으며, 여러 무선 인터페이스를 사용하도록 하여,
이중, 삼중 대역 기능을 가지는 APs와 STAs에서 데이터를 동시에 송수신할 수 있게 한다.&lt;/p&gt;

&lt;p&gt;게다가 흥미롭게도 MLO 프레임워크의 사용은 빠르게 증가하고 있다. 
실시간 어플리케이션에서의 Latency는 이미 [3-5]에서 진행된 연구에서 MLO가 worst-case에서의 latency를 확연히 줄일 수 있음을 보인다.
한편, [4]의 저자들은 다중 링크에서의 신뢰성을 평가하기 위해 분석을 확장하였는데, 여러 개의 correlated 링크일 때 높은 전송율을 보였다.
또한 동시 송수신(STR) 기능 없이 상이한 링크들을 통해 스테이션에 병렬적으로 downlink 송신할 수 있도록 하는 &lt;strong&gt;end time alignment mechanism&lt;/strong&gt;이 [6]에 제시되어 있다.
이러한 접근은 스펙트럼 효율을 최대화 하는 것을 의도한다.
유사하게 진행 중인 송신에서 collision이 발생하지 않는 것을 확인하게 되면 non-STR 스테이션들이 backoff 타이머를 다시 시작할 수 있도록 하는 &lt;strong&gt;opportunistic backoff&lt;/strong&gt; 메커니즘이 [7]에서 제안 되었다.
[8]의 저자들은 APs 간 협조 없이 MLO의 기능만으로는 충분하지 않을 것이기에 high density areas에서의 high throughput을 구현하기 위한 프레임워크를 제안했다.&lt;/p&gt;

&lt;p&gt;여러 무선 인터페이스를 동시에 운영할 수 있도록 하는 프레임워크의 통합은 새로운 문제와 연구 기회를 가져온다. 이러한 맥락에서 우리는 MLO 호환 장치가 여러 링크를 통해 서로 다른 Quality of Service (QoS) 요구사항을 가지는 패킷을 송수신 할 수 있다는 것을 알았다.
지난 개정에서는 허용되지 않았던 이 기능은 link mapping을 위한 &lt;strong&gt;TID&lt;/strong&gt;라고 불리며 이는 새로운 트래픽 관리 메커니즘을 구상할 수 있게 한다.
예를 들어 우리는 모든 링크에 TID를 할당할 수 있게 되어, 트래픽을 여러 링크 간에 부분적으로 또는 완전히 이동시킴으로써  &lt;strong&gt;full adaptive load balancing&lt;/strong&gt; 전략을 사용할 수 있다.
반대로, 다른 방식들은 특정 QoS 트래픽에 전용 링크를 할당하는 데 의존할 수 있다. 이러한 방식은 더욱 엄격하고 덜 유연한 load balancing 솔루션이지만, 동일한 QoS 요구사항을 가지는 트래픽만이 서로의 자원 세트를 공유하도록 보장한다.&lt;/p&gt;

&lt;p&gt;이 기사에서, 우리는 여러 인터페이스에 트래픽을 배포하는 방법과 그것이 네트워크 성능에 어떤 영향을 미칠 수 있는지에 대한 통찰력을 제공하기 위해 적응형 또는 링크 전용 구현을 따르는 다양한 할당 전략을 평가한다.&lt;/p&gt;

&lt;p&gt;주된 내용은 아래와 같다.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;우리는 MLO 프레임워크가 TGbe에 의해 어떻게 고안되고 있는지에 대한 포괄적인 개요를 제공하며, 노드의 아키텍처 변경, 트랜스 미션 모드 및 관리 기능과 관련하여 다양한 수정 사항을 지적한다.&lt;/li&gt;
  &lt;li&gt;우리는 잠재적인 이익과 개정안과 관련된 도전 문제에 대해 논의한다. 또한, 우리는 MLO 프레임 작업이 직면한 몇 가지 열린 문제와 연구 방향을 지적한다.&lt;/li&gt;
  &lt;li&gt;우리는 TID 할당 문제를 해결하기 위해 다양한 정책 기반 전략을 평가한다. 또한, 우리는 구현, 적합성 및 단점을 보여주기 위해 TID-to-link 매핑 기능을 채택한다.&lt;/li&gt;
  &lt;li&gt;우리는 다른 트래픽 요구사항에 따라 제시된 전략을 평가하여 link-dedicated 접근이 high dense와 high load 시나리오 모두에서 적합하지 않음을 보인다.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;
&lt;h3 id=&quot;notes-1&quot;&gt;Notes&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;MLO의 장점
    &lt;ul&gt;
      &lt;li&gt;worst-case latency의 대폭 감소&lt;/li&gt;
      &lt;li&gt;여러 개의 correlated 링크일 때 높은 전송율 보장&lt;/li&gt;
      &lt;li&gt;end time alignment mechanism
        &lt;ul&gt;
          &lt;li&gt;동시 송수신 기능 없이 상이한 링크들로 스테이션에 병렬적으로 downlink하는 것&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;유사하게 opportunistic backoff mechanism에서는 진행 중인 송신에서 collision이 발생하지 않는 경우 non-STR 스테이션들이 vackoff 타이머를 다시 시작할 수 있도록 한다.
        &lt;ul&gt;
          &lt;li&gt;두 mechanism 모두 collision의 감소에 목적을 둔다는 점에서 유사&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;MLO 호환 장치가 여러 링크를 통해 서로 다른 QoS 요구사항을 가지는 패킷을 송수신 할 수 있음.
        &lt;ul&gt;
          &lt;li&gt;이는 link mapping을 위한 TID로, 지난 개정에는 허용되지 않았으나 트래픽 관리 메커니즘을 새로 할 수 있음.
            &lt;ul&gt;
              &lt;li&gt;ex) TID를 모든 링크에 할당 -&amp;gt; 트래픽을 여러 링크에 이동 가능 -&amp;gt; &lt;strong&gt;full adaptive load balancing&lt;/strong&gt; 가능&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;QoS 트래픽에 전용 링크 할당하는 방법도 존재
            &lt;ul&gt;
              &lt;li&gt;더욱 엄격하고 덜 유연한 load balancing&lt;/li&gt;
              &lt;li&gt;동일한 QoS 요구사항을 가지는 트래픽만이 서로의 자원 세트를 공유할 수 있도록 보장함.&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;AP간 협조 없이는 부족!
    &lt;ul&gt;
      &lt;li&gt;high density areas에서의 high throughput 구현을 위한 프레임워크도 제안됨.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;이어질 내용
    &lt;ul&gt;
      &lt;li&gt;MLO 프레임워크의 포괄적 개요&lt;/li&gt;
      &lt;li&gt;남은 문제들&lt;/li&gt;
      &lt;li&gt;TID 할당 문제 해결을 위한 전략 평가
        &lt;ul&gt;
          &lt;li&gt;TID-to-link mapping 기능으로 평가&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;link-dedicated 접근이 high dens와 high load 시나리오에서의 성능평가&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;
&lt;h2 id=&quot;multi-link-operation&quot;&gt;Multi-Link Operation&lt;/h2&gt;

&lt;p&gt;MLO의 기능과 관련하여 IEEE 802.11 개정에 포함될 가능성이 있는 다양하고 가장 관련성 높은 제안들을 살펴 본다.&lt;/p&gt;

&lt;h3 id=&quot;architecture&quot;&gt;Architecture&lt;/h3&gt;
&lt;p&gt;첫 번째 아키텍처 변화는 고전적인 AP, STAs를 MLD(Multi-Link capable Device)로 재정의 하는 데에 있다.&lt;br /&gt;
AP MLDs 또는 STA MLDs는 여러 무선 인터페이스가 있는 단일 장치를 나타낸다.&lt;br /&gt;
이와 가장 연관된 측면으로 MLDs 각 인터페이스의 독립적인 파라미터를 잃지 않은 채 고유한 MAC 인스턴스를 상위 계층에 제공한다는 사실이다.&lt;br /&gt;
이를 구현하기 위해서 be의 Task Group은 기능에 따라 두 개의 레벨으로 MAC sub-layer를 나눌 것을 제안하였다.&lt;/p&gt;

&lt;p&gt;첫째로, 상위 MAC(U-MAC)이 있는데, 이는 모든 인터페이스에 대한 MAC sub-layer의 공통 부분이다.&lt;br /&gt;
U-MAC에서는 링크에 불가지론적인(알수 없는? 무관한? 구애받지 않는?) 작업이 발생함을 알 수 있다. 그 예로, 시퀀스 넘버 할당 및 MSDU(MAC Service Data Unit) aggregation 및 aggregation 해제가 있다.&lt;br /&gt;
이러한 맥락에서 동일한 트래픽 흐름에 속하는 패킷은 서로 다른 링크를 통해 fragment되고 전송될 수 있기 때문에 시퀀스 번호 할당은 U-MAC에서 수행되어야 한다는 점이 중요하다.
그리고 이러한 접근은 수신 측에서 패킷을 재정렬하는 것을 용이하게 한다. 추가적으로 설정 연결 및 인증과 같은 모든 링크에 대한 공통 관리 기능이 본 layer에서 이루어 진다.&lt;/p&gt;

&lt;p&gt;U-MAC의 아래에 있는 low MAC(L-MAC)은 각 인터페이스에 독립적인 하위 계층으로, 채널 엑세스와 같은 링크의 특정 기능을 담당한다. 이러한 맥락에서 개별적인 L-MAC 인스턴스들을 가지는 것은 필요한 경우 인터페이스가 그들의 채널 파라미터를 유지할 수 있도록 한다.&lt;/p&gt;

&lt;p&gt;본질적으로, 이러한 구현은 각 인터페이스가 자신의 향상된 분산채널 액세스 큐(EDCA Queue)를 추적하여 전송이 끝날 때까지 트래픽을 유지할 수 있도록 허용한다.&lt;br /&gt;
L-MAC 계층의 다른 기능들은 각각 송수신할 때 관리 및 제어 프레임을 생성하는 것 뿐만 아니라 MAC 헤더를 생성 및 검증하기도 한다.&lt;/p&gt;

&lt;p&gt;이러한 2 계층 아키텍처의 motivation은 MLD가 한 링크에서 다른 링크로 트래픽을 이동하여 상위 계층에 완전히 투명하게(Network Transparency) 할 수 있다는 것이다.&lt;br /&gt;
따라서 로드 밸런싱 기술은 가용한 모든 자원을 활용하여 각 클라이언트의 전송이 오직 하나의 대역 또는 다른 대역에서만 수행되는 현재 표준화된 다중 대역 접근 방식의 스펙트럼 사용의 비효율성을 최소화할 수 있다.&lt;/p&gt;

&lt;p&gt;하지만 이러한 아키텍처는 더 복잡한 설계를 수반한다. 트래픽에 대한 링크 할당에 대한 새로운 정책을 설계해야할 뿐만 아니라 여러 링크에서 채널 경쟁 및 패킷 전송이 수행되는 방식에 대한 low-level 측면을 재고하여야 한다.&lt;/p&gt;

&lt;h4 id=&quot;notes-2&quot;&gt;Notes&lt;/h4&gt;
&lt;p&gt;AP, STAs을 단일 장치에서 여러 인터 페이스를 통해 여러 채널에 데이터를 송수신할 수 있는 MLD(Multi-Link Devices)로 재정의&lt;br /&gt;
MLDs 각 인터페이스의 독립적인 파라미터를 잃지 않은 채 고유한 MAC 인스턴스를 상위 계층으로 전달하기 위해 MAC sub-layers의 기능에 따라 
U-MAC, L-MAC 두 개의 서브 계층으로 나누기를 제안함.&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;MSDU&lt;/dt&gt;
  &lt;dd&gt;상위 계층의 데이터를 MAC 계층에서 처리하기 위해 사용되는 데이터 단위로, MAC 계층으로 하달된 MSDU는 프레임으로 구성되어 PHY 계층을 통해 송신됨.&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;&lt;strong&gt;U-MAC&lt;/strong&gt;
시퀀스 넘버 할당 및 MSDU aggregation 및 aggregation 해제, 데이터 및 QoS 관리 등의 링크와는 무관한 작업을 처리함.&lt;br /&gt;
시퀀스 넘버 할당이 U-MAC에서 이루어지는 이유는 MLO를 수행함에 따라 동일한 트래픽 흐름에 속하는 패킷(가령 송신하고자 하는 데이터의 전체 스트림)이 상이한 링크를 통해 fragment되어 전송될 수 있어 
수신 측에서 그 순서를 알 수 있도록 하여야 함. U-MAC은 전체적인 설정과 같은 기능을 담당 L-MAC은 링크 각각에 대한 설정을 가지기에 U-MAC에서 시퀀스 넘버를 할당하여 L-MAC으로 하달하여야 함.
&lt;em&gt;U-MAC과 L-MAC은 투명함!&lt;/em&gt; L-MAC에서는 설정된 시퀀스 넘버에 따라 각 링크로 전송 해당 링크만 유지하면 됨. 이를 통해 수신 측은 수신 순서가 다르더라도 시퀀스 넘버를 통해 재조립할 수 있음.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;L-MAC&lt;/strong&gt;
인터페이스의 독립적인 하위 계층으로, 채널 액세스와 같은 링크와 관련된 작업들을 처리함. 개별적인 L-MAC 인스턴스를 가짐으로써 필요한 경우 채널 파라미터를 유지할 수 있음.
그 이유로는 로밍, DFS(Dynamic Frequency Selection) 등의 네트워크 변동사항에 대처하기 위함임.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Motivation&lt;/strong&gt;
MLO를 통해 여러 링크로 나누어 데이터를 송수신함. 구현 역시 U-MAC과 L-MAC 역시 공통 관리 기능과 각 링크 관리에 대한 기능으로 서브 계층으로 나눔으로써 각 계층이 서로에게 투명하도록 함.&lt;br /&gt;
이러한 로드 밸런싱으로 각 전송이 오직 하나의 링크만을 이용하던 기존 ax와 같은 표준의 비효율적인 스펙트럼 사용을 개선함.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;transmission-modes&quot;&gt;Transmission Modes&lt;/h3&gt;
&lt;p&gt;be 태스크 그룹은 MLDs를 두 가지의 다른 transmission mode로 정의 했다.
첫째, 비동기 tranmission mode는 MLD가 여러 링크에 비동기적으로 프레임을 전송할 수 있도록 한다. 
본 모드에서는 각 인터페이스는 다른 인터페이스를 존중하는 독립적인 동작과 함께 자신의 고유한 channel access 파라미터를 유지한다. 
또한 STR 기능을 허용하여 업 링크(UL)과 다운 링크(DL) 통신을 동시에 가능하도록 한다. 
이상적으로, asynchronous transmission mode는 더 높은 throughput 성능을 제공하기에 802.11을 따르는 모든 노드에 의해 기본 operation 방식으로서 선택되어야 한다고 제안된다. 
하지만 이러한 operation 방식은 특히 handheld 기기에서 동시에 동작하는 여러 비동기 인터페이스들로 인해 전력 소비가 극심하므로, power save 매커니즘을 따라야만 한다. 
추가적으로 비동기 operation은 IDC(In-Device Coexistence) interference에 의해 성능이 제한될 수 있다. 
즉, 인터페이스 간의 power leakage는 동작 대역/채널(ex) 5GHz 대역의 두 채널) 간의 분리가 충분하지 않은 경우 한 인터페이스에서 transmission 중일 때 다른 인터페이스에서 진행 중인 프레임 수신을 막게 될 수 있다.&lt;/p&gt;

&lt;p&gt;IDC 이슈를 피하기 위해서 be 태스크 그룹은 가용한 링크에서 동기화된 프레임 transmission을 수행하는 sychronous transmission mode를 정의하였다. 
synchronous trasmission mode에서 동작하는 장치는 다른 장치를 통해 수신하는 동시에 idle 인터페이스를 통해 전송하는 것을 허용하지 않기 때문에 constrained MLDs 또는 non-STR MLDs라고 한다. 
동기화를 수행하기 위해서 end-time alignment 또는 지연 전송 메커니즘이 구현될 수 있다. 
asynchronous mode는 동시에 다른 채널에서 transmission을 종료하는 것에 의존하는 반면, sychronous mode는 백오프를 완료한 링크의 전송을 다른 링크에서 동일한 카운터가 종료될 때까지 연기한다. 
이를 통해 AP 또는 스테이션이 STR operation을 수행하는 것을 방지하여 IDC 문제를 피할 수 있으나, 비동기 방식에 비하여 그 throughput이 낮다.&lt;/p&gt;

&lt;p&gt;채널 액세스와 관련하여 SPC(Single Primary Channel) 또는 MPC(Multiple Primary Channel) 방법론을 따를 수도 있다. 
기본적으로 SPC는 하나의 채널 내에 접근하기 위해 경쟁하지만, MPC는 각 모든 채널에서 경쟁이 일어난다. 
MPC 방식의 적용을 통해 노드가 경쟁에서 이기고 프레임을 전송할 수 있는 가능성이 높아지지만, SPC는 non-primary channel 인터페이스가 doze 상태로 유지되어 전력 소비를 줄일 수 있다. 
SPC 또는 MPC 방법을 사용하여 인터페이스가 해당 채널의 경쟁에서 이길 경우 PIFS 시간 동안 다른 인터페이스를 확인하여, 이들이 aggregation될 수 있는지 확인, TXOP aggregation를 수행한다. 
마지막으로 MLD를 지원하는 AP는 언제든 transmission 모드를 변경(synchronous to asynchronous, and vice versa)할 수 있다.&lt;/p&gt;

&lt;h4 id=&quot;notes-3&quot;&gt;Notes&lt;/h4&gt;

&lt;p&gt;MLDs의 transmission mode를 두 가지로 정의&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;asynchronous transmission mode&lt;/li&gt;
  &lt;li&gt;synchronous transmission mode&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MLDs를 지원하는 AP는 언제든 위 두가지 transmission mode를 변경할 수 있음.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;asynchronous trasmission mode&lt;/strong&gt;
asynchronous transmission mode에서 각 인터페이스는 다른 인터페이스의 동작에 영향을 주지 않도록 독립적으로 동작하며, 필요에 따라 자신의 고유한 channel access 파라미터를 유지함. 
STR 기능을 허용하여 업 링크와 다운 링크 통신을 동시에 가능하도록 함. 본 눈문에서는 asynchronous trasmission mode가 높은 throughput을 제공하기에 802.11을 따르는 모든 노드에 기본 operation으로 선택되어야 한다고 제안함. 
하지만 asynchronous transmission mode는 특히 handheld 기기에서 와이파이, 셀룰러, BT 등 동시에 동작하는 여러 비동기 인터페이스들로 인해 전력 소비가 심하여 power save 메커니즘을 따라야만 함. 
또한 같은 이유로 발생하는 IDC(In-Device Coexistence) interference로 인해 성능이 제한될 수 있음. 동작 대역/채널 간의 분리(인접한 채널을 사용하는 경우)가 충분하지 않은 경우 이러한 power leakage가 다른 인터페이스에서 진행 중인 프레임의 수신을 방해할 수 있음.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;synchronous transmission mode&lt;/strong&gt;
be 태스크 그룹은 전술한 IDC 이슈를 피하기 위해 가용한 링크에서 동기화된 프레임을 송신하는 sychronous transmission mode를 정의하였음. 
본 모드에서 동작하는 장치는 다른 장치를 통해 수신하는 동시에 idle 인터페이스를 통해 전송하는 것이 허용되지 않음. 즉, 동시에 송수신이 불가함. 이를 constrained MLDs/non-STR MLDs라 함. 
이러한 동기화를 수행하기 위해서는 데이터 전송의 종료 시점을 세밀하게 조정하는 end-time alignment 또는 지연 전송 메커니즘이 구현될 수 있음. 
asynchronous mode에서는 여러 채널에서 동시에 transmission이 종료될 수 있는 반면, synchronous mode에서는 백오프를 완료한 링크의 전송 역시 다른 링크에 존재하는 동기화된 카운터가 종료될 때까지 전송하지 않음. =&amp;gt; defer transmission mode 
이를 통해 AP 또는 스테이션이 동시 송수신(STR operation)하는 것을 방지하여 IDC 이슈를 피할 수 있으나, 이로 인해 비동기 방식에 비하여 throughput이 낮음.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SPC(Single Primary Channel), MPC(Multiple Primary Channel)&lt;/strong&gt;
SPC는 모든 데이터 전송이 하나의 주 채널을 통해 이루어 지는 것, MPC는 여러 주 채널을 통해 데이터를 전송하는 것으로, SPC에서는 하나의 채널에 접근하기 위해, MPC에서는 모든 채널에 접근하기 위해 TXOP 경쟁이 이루어짐. 
데이터 전송에 있어 SPC 또는 MPC에서 특정 인터페이스가 경쟁에서 이길 경우 PIFS 시간 동안 다른 인터페이스들이 자신의 전송 시간에 함께 데이터를 전송할 수 있을지를 확인하고 하나의 패킷으로 함께 전송하는데, 이를 &lt;strong&gt;TXOP aggregation&lt;/strong&gt;이라고 함.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;management&quot;&gt;Management&lt;/h3&gt;

&lt;p&gt;The Multi-Link Element:&lt;br /&gt;
상이한 management frames에 포함된 정보 요소(IEs)를 통해 장치는 기능과 동작과 관련된 매개변수를 교환할 수 있다. 
이를 위해 802.11be는 MLE(Multi-Link Element)를 정의한다. MLE는 다양한 Management에 대한 공통 요소로 설계 되었다. 
그러한 구현을 위해서, MLE는 control 필드 내에 각 작업을 특정 값으로 매핑하는 type sub-filed를 도입한다. 
따라서 이 정보 필드는 유형에 따라 다르며, presence bitmap에 의해 표현된다. 이러한 기능은 프레임이 과도하게 커지는 것을 피하고, 오버헤드를 최소화 하며 유형별 정보를 전달할 수 있는 유연한 구조를 제공한다.&lt;/p&gt;

&lt;p&gt;현재 802.11be 개정판에서는 두 가지의 MLE 유형을 정의하고 있다. 먼저 비콘 프레임에 사용하고자 하는 basic type이 있다. 
이 유형에서 MLE는 모든 인터페이스에 공통된 정보(MLD MAC 주소, 활성화된 링크 또는 STR 기능)만을 전달한다. 
두 번째는 멀티 링크 셋업 시 사용할 것으로 예상되는 multi-link request/response type이 있다. 
이 타입에서 MLE는 공통된 정보와는 별도로 개별적이고 독립적인 필드를 통해 advertising interface와 다른 인터페이스의 완전한 정보를 포함한다. 이때 주어진 인터페이스의 필드에 명시되지 않은 파라미터의 값은 advertising interface의 해당 파라미터와 동일한 값을 가지는 것으로 간주된다. 
예를 들어, 일부 명시된 매개변수는 채널 할당(주 채널 및 대역폭) 및 사용 가능한 공간 스트림의 수를 포함한다. 
현재 정의된 유형은 두 가지뿐이지만 MLE 유형이 추가될 수 있다. 예를 들어 제안은 TIM(Traffic Indication Map)을 보고하거나 TID 값과 링크 간의 매핑에 관한 변경 사항을 나타내는 방식으로 버퍼링된 트래픽 정보를 포함하는 것을 모색하고 있다.&lt;/p&gt;

&lt;p&gt;Discovery and Setup:&lt;br /&gt;
802.11be discovery 메커니즘은 802.11 표준에 이미 정의된 것과 동일한 원칙을 재사용한다. 
즉 스테이션은 passive/active scanning을 기반으로 검색 프로세스를 수행, 주변 AP의 정보를 수집할 수 있다. 
그러나 MLD의 도입을 위해 일부 업데이트가 필요하다. 위에서 설명한 바와 같이 비콘과 probe 프레임은 멀티 링크 수준에서 부분적인 정보(U-MAC 관련 정보)만을 포함한다. 
그러나 이 구현 방식은 멀티 링크 셋업을 수행하기 전에 MLD의 모든 인터페이스를 스캔해야 하기 때문에 검색 프로세스에 많은 시간이 소요될 수 있다. 
이를 방지하기 위해 802.11be는 이미 정의된 RNR(Reduced Neighbor Report) 요소를 재사용하여 동일한 AP MLD의 서로 다른 인터페이스에 대한 몇 가지 기본 정보를 나타낸다. 
이러한 정보는 비콘 프레임을 전송하지 않는 인터페이스에만 속하게 된다. 이를 통해, 스테이션은 AP MLD의 다른 인터페이스의 전체 기능, 파라미터 및 운영 요소를 요청하여 직접 프로브할 수 있다. 
이러한 프로빙을 수행하기 위해 스테이션은 multi-link request/response type을 사용하여야 한다. 이러한 접근은 장치가 추가적인 멀티 링크 요청/응답을 보내야 하므로 비효율적으로 보일 수 있다. 
하지만 실제로는 non-AP MLD가 여러 연결을 활성화할 필요가 없기에(즉, AP MLD의 다른 밴드/채널을 스캔할 필요가 없기에) 에너지를 절약하게 된다. 
또한 이 방법을 사용하면 관리 프레임의 air-time 점유율을 줄이고, 스테이션이 탐색 과정에서 멀티 링크 셋업으로 전환하는 데 필요한 시간을 단축 시킨다. 
설정 과정과 관련하여 802.11be는 현재의 연결 요청/응답 프레임을 추가 MLE와 함께 재사용할 것이다. 그 다음 MLE를 통해 AP MLD와 STA MLD는 자신들의 기능을 교환하여 이후의 운영 방식을 설정한다. 
또한 멀티 링크 셋업 프로세스는 오버헤드를 줄이기 위해 단일 링크에서만 수행되도록 제안된다. 각 STA MLD에 대해 활성화된 링크의 집합은 모든 인터페이스에서 연결 상태를 측정하여 결정된다는 점을 언급할 필요가 있다. 
즉, CCA(Clear Channel Assessment) threshold 이상의 품질 값을 갖는 것은 활성화, 아닌 것은 비활성화 된다. 
사용자가 이동성을 가질 수 있기에 비활성화된 링크들은 리스트화 하여 이후 재설정을 요청하여 추가될 수 있다. 마찬가지로, 재설정 과정은 이미 정의 된 재연결 요청/응답 프레임을 재사용한다.&lt;/p&gt;

&lt;p&gt;Link Management:&lt;br /&gt;
현재 multi-band AP에는 서로 다른 TID에 속하는 MSDU가 여러 링크를 통해 전송될 수 없는 주요 제한 사항이 있다. 
TID는 서로 다른 트래픽 유형을 QoS 요구 사항에 따라 분류하고, 이를 통해 사용자 간 우선 순위를 설정하기 위해 만들어졌다는 점이 중요하다. 
지난 개정안에서는 이러한 사용자 우선 순위를 사용하여 EDCA를 통해 차별화 및 우선 순위를 제공했다. 이는 각 데이터 패킷을 액세스 카테고리로 분류하고, 이를 각각 고유한 MAC 파라미터를 가진 특정 MAC 전송 큐에 연결함으로써 이루어졌다. 
그러나 802.11ax 개정에서 2.4GHz와 5GHz 대역을 모두 사용하더라도 모든 TID는 여전히 단일 링크 operation에 묶여있었다. 802.11be에서는 MLO의 도입으로 이러한 변화를 촉진한다. 
기본적으로 AP MLD는 모든 TID를 모든 링크에 매핑하는 것이 권장되며, 이는 스테이션이 임의의 링크를 통해 모든 유형의 트래픽을 검색할 수 있음을 의미한다. 
그러나 AP가 dynamic TID transfer를 수행함으로써 한 링크에서 다른 링크로 원활하게 TID를 이동할 수 있으므로, 이러한 조건이 반드시 정적인 것은 아니다. 
이러한 맥락에서 link management 기법은 클라이언트 steering을 수행하지 않고도 과도한 수준의 링크 혼잡을 방지하는 load balancing 메커니즘으로 수행될 수 있다. 실제로 이 기능은 로드 밸런싱 분야에서 새로운 연구 기회를 열어 준다.&lt;/p&gt;

&lt;h4 id=&quot;notes-4&quot;&gt;Notes&lt;/h4&gt;
&lt;p&gt;MLE(The Multi-Link Element):&lt;br /&gt;
MLE는 Management에 대한 공통 요소들로 설계 되어 있음. 이를 통해 상이한 management frames에 포함된 정보 요소(IEs)를 통해 장치는 기능과 동작과 관련된 매개변수를 교환할 수 있음. 
이를 구현하기 위해 MLE는 control 필드 내에 각 작업을 특정 값으로 매핑하는 type sub-field를 도입함. 
본 정보 필드는 management 유형에 따라 다르며, presence bitmap으로 표현됨. presence bitmap은 각 비트가 특정 속성이 존재하는지를 나타내는 것임. 
이를 통해 프레임의 과도한 크기 증가, 오버헤드를 최소화 하고 유연한 구조를 갖도록 함.&lt;br /&gt;
802.11be 개정판에서는 &lt;strong&gt;basic type&lt;/strong&gt;과 &lt;strong&gt;multi-link request/response type&lt;/strong&gt; 두 가지의 MLE 유형을 정의함.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;basic type&lt;/strong&gt;&lt;br /&gt;
MLE는 모든 인터페이스에 MLD MAC 주소, 활성화된 링크 등 모든 인터페이스에 공통된 정보를 전달하는 MLE임.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;multi-link request/response type&lt;/strong&gt;&lt;br /&gt;
멀티 링크 셋업 시 사용될 수 있는 MLE로, basic type과 달리 각 링크에 대한 개별적인 정보와 기능을 전달하는 MLE임. 
이때 별도로 명시되지 않은 파라미터는 advertising interface의 파라미터와 같은 값으로 간주함.&lt;/p&gt;

&lt;p&gt;버퍼링된 트래픽 정보 등을 담고 있는 새로운 MLE 유형이 추가될 수 있음.&lt;/p&gt;

&lt;p&gt;Discovery and Setup:&lt;br /&gt;
be의 discovery 메커니즘은 기존 802.11의 표준과 같이 스테이션이 passive/active scanning으로 검색 프로세스를 수행, 주변 AP 정보를 수집함.
하지만 MLD의 도입을 위해 beacon frame, probe frame은 전체가 공통적으로 가지는 네트워크 전반에 대한 정보이므로 U-MAC과 관련된 부분적인 정보만을 포함하도록 추가적인 업데이트가 필요함. 
이러한 업데이트로 인해 인터페이스 개별적인 링크에 대한 정보가 부족하여 멀티 링크 셋업을 수행하기 전에 MLD의 모든 인터페이스를 스캔해야 한다는 점에서 많은 시간이 소요됨. 
이를 방지하기 위해 be에서는 AP MLD의 상이한 인터페이스에 대해 몇 가지 기본 정보를 나타내는 RNR(Reduced Neighbor Report) 요소를 재사용함. 
MLD에서는 여러 주파수 대역을 사용할 수 있으므로, 다른 주파수 대역(인터페이스)에서는 비콘 프레임이 전송되지 않을 수 있음. 
비콘 프레임을 전송하지 않는 인터페이스의 정보는 RNR 요소를 통해 인터페이스의 전체 기능, 파라미터 운영 요소를 요청하여 직접 프로브할 수 있음. 
이 과정에서 multi-link request/response type을 사용하여야 하기에 추가적인 작업으로 비효율적으로 보일 수 있으나 
이를 통해 인터페이스 전체를 스캔하는 과정이 없어짐에 따라 관리 프레임의 air-time 점유율을 줄여 스테이션이 탐색 과정에서 멀티 링크 셋업으로 전환하는 데에 필요한 시간을 단축 시킴.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;STA가 AP MLD로부터 2.4GHz 대역에서 AP MLD의 비콘 프레임을 수신함.(5GHz 대역에 대한 정보를 RNR 요소로 확인 가능)&lt;/li&gt;
  &lt;li&gt;STA가 AP MLD로 multi-link request 프레임을 전송하여 5GHz 대역의 전체 기능, 파라미터 및 운영 요소를 요청(multi-link request/response MLE 타입 사용)&lt;/li&gt;
  &lt;li&gt;AP MLD는 multi-link response 프레임을 통해 5GHz 대역의 상세 정보를 STA에 제공함.&lt;/li&gt;
  &lt;li&gt;두 대역 모두에서 multi-link 연결 설정&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Link Management:&lt;br /&gt;
TID는 트래픽 유형을 QoS 요구 사항에 따라 분류하는 식별자임. 가령, 음성 비디오, 데이터 등의 다양한 트래픽 유형에 우선 순위를 설정하고 관리하기 위함. 
기존 표준인 ax에서는 2.4GHz, 5GHz 대역을 모두 사용할 수는 있으나 TID는 단일 링크에 묶여 있어, 특정 TID에 속하는 트래픽은 단일 링크를 통해서만 정송되었음. 
be에서는 MLO의 도입으로 TID를 모든 링크에 매핑하여 임의의 링크에 모든 유형의 트래픽을 태워 전송할 수 있도록함. &lt;strong&gt;load balancing&lt;/strong&gt;으로서 사용 가능함.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;power-save&quot;&gt;Power Save&lt;/h3&gt;
&lt;p&gt;오늘날 인터넷 연결은 주로 휴대용 장치를 통해 수행되기 때문에 전력 관련 소비 문제를 신중하게 고려해야 한다. 
이러한 문제를 해결하기 위해 be 태스크 그룹은 TIM(Traffic Indication Map)과 TWT(Target Wake Time)의 사용을 채택하고 조정할 것을 제안하였다.&lt;/p&gt;

&lt;p&gt;TIM(Traffic Indication Map):&lt;br /&gt;
AP가 연결된 스테이션에 버퍼된 데이터가 있음을 알리는 역할으로, AP는 TIM을 비콘 프레임에 포함해 주기적으로 브로드캐스트한다. 
TIM 요소에서, AP들은 2007 bits로 형성된 비트맵을 포함하고, 각 비트는 스테이션들에 대응한다. 
가령, 주어진 스테이션에 해당하는 비트맵의 비트가 0이면 스테이션은 doze 상태로 유지되는 반면, 
1이면 AP에서 데이터를 검색할 준비가 되어 awake 상태로 전환된다. 
단일 링크 스테이션에서는 TIM 메커니즘이 작동하였으나, MLD의 도입으로 수정되어야 했다. 
be 태스크 그룹은 스테이션이 연결될 수 있는 모든 multi-link에 대한 정보를 포함하기 위해 TIM 요소 뒤에 링크 표시 필드를 추가할 것을 제안하였다. 
링크 표시 필드 내에는 link mapping bitmap이 포함되며, 여기서 각 비트는 지정된 링크를 나타낸다. 
따라서 STA MLD가 TIM 요소에서 해당 비트가 1로 설정된 것을 감지하면 STA MLD는 링크 매핑을 추가로 확인하여 버퍼링된 트래픽에 매핑된 특정 링크를 찾는다. 
본 메커니즘에서는 기존의 TIM을 확장하여 보다 효율적인 기능을 제공한다. 이를 통해 스테이션은 특정 시간대에만 특정 인터페이스를 깨어나도록 하여 전력 소비를 최소화하고 배터리 수명을 연장할 수 있다.&lt;/p&gt;

&lt;p&gt;TWT(Target Wake Time):&lt;br /&gt;
AP와 STA가 깨어나서 통신하는 시간을 사전에 협상하고 조정하도록 하여 효율을 높이는 방법이다.
TWT는 802.11ah 개정판에 처음 포함된 전력 절약 메커니즘이며, 802.11ax 개정판에서 더욱 발전되었다. 
본 메커니즘은 초기 협상에 기반하여 동작하며, 이 협상 과정에서 스테이션과 AP는 공통의 wake 스케줄링(즉, 스테이션이 데이터를 전송하거나 수신할 수 있는 세션 기간(Session Period, SP) 또는 TWT 세션)에 합의한다. 이를 통해 스테이션은 데이터 전송 및 수신을 할 수 있다. 
이를 구현하기 위해 TWT는 초기 협상 단계부터 SP 파라미터를 결정해야 한다. be 태스크 그룹은 MLO 프레임워크에서 TWT 작업을 효율적으로 해결하기 위해 단일 링크를 통해 서로 다른 활성화된 링크에 대해 TWT 합의를 수행할 것을 제안한다. 
이를 위해 STA MLD는 비트맵을 통해 식별되는 특정 링크에 대응하는 서로 다른 TWT 요소를 TWT 요청에 포함한다. 
이는 링크들이 wake up time, wake interval 또는 최소 wake 지속 시간과 같은 상이한 TWT 파라미터들을 가질 수 있기 때문에 필요하다. 
반대로, 동일한 파라미터들이 모든 링크들에 적용되는 경우, 하나의 TWT 요소만을 필요로 한다. 
TIM뿐만 아니라 TWT에서도 스테이션은 필요할 때 깨어있는 상태에서 doze 상태로 전환하여 전력 소비를 줄일 수 있다. 
TWT의 채택이 다른 성능 영향을 미칠 수도 있으나 현재까지 이러한 문제와 관련된 작업은 없다.&lt;/p&gt;

&lt;h4 id=&quot;notes-5&quot;&gt;Notes&lt;/h4&gt;
&lt;p&gt;오늘날의 인터넷 연결은 주로 휴대용 장치를 통해 수행되기에 전력 소비 문제가 중요함. 
이를 해결하기 위해 be 태스크 그룹은 TIM(Traffic Indication Map)과 TWT(Target Wake Time)의 사용을 채택하고 조정할 것을 제안함.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TIM(Traffic Indication Map)&lt;/strong&gt;:&lt;br /&gt;
AP가 연결된 스테이션에게 버퍼된 데이터가 있음을 알리는 역할임.&lt;br /&gt;
AP는 TIM을 비콘 프레임에 담아 주기적으로 브로드 캐스트하며, TIM의 요소에는 2007 비트의 비트맵이 포함되어 있으며, 각 비트는 스테이션에 대응함.&lt;br /&gt;
특정 스테이션에 해당하는 비트맵의 비트가 0이면 doze, 1이면 wake 상태임.&lt;br /&gt;
MLD의 도입으로 TIM 메커니즘의 수정도 필요.&lt;br /&gt;
스테이션이 연결될 수 있는 모든 multi-link에 대한 정보를 포함하기 위해 TIM 요소 뒤에 링크 표시 필드를 추가함.&lt;br /&gt;
링크 표시 필드 내에는 지정된 링크를 각 비트로 나타내는 link mapping bitmap이 포함됨.&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;STA MLD가 AP로부터 비콘 프레임을 받고 안에 있는 TIM 요소에서 비트가 1로 설정된 것을 감지하면,&lt;/li&gt;
  &lt;li&gt;링크 매핑을 추가로 확인하여 버퍼링된 트래픽에 매핑된 링크를 찾음.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;기존의 TIM에서 확장된 본 메커니즘으로 스테이션은 특정 시간대에만 특정 인터페이스를 깨움으로써 전력 소비를 줄일 수 있음.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TWT(Target Wake Time)&lt;/strong&gt;:&lt;br /&gt;
AP와 STA가 깨어나 통신하는 시간을 사전에 협상하고 조정하도록 하여 효율을 높이는 방법임.&lt;br /&gt;
초기에 스테이션과 AP는 스테이션이 데이터를 송수신할 수 있는 시간 SP를 협상하고, 이 시간 동안에만 송수신을 수행함. =&amp;gt; wake scheduling&lt;br /&gt;
이를 위해 TWT는 초기 협상 단계부터 SP 파라미터를 협상해야 하며, 단일 링크에서 해당 스테이션에 활성화된 모든 인터페이스에 대한 TWT 합의를 수행하여 효율성을 높임.&lt;br /&gt;
이를 위해 STA MLD는 비트맵을 통해 식별되는 특정 링크의 TWT 요소를 자신의 TWT 요청에 포함함. 각각의 링크는 서로 다른 wake up time, interval, 최소 wake 지속 시간 등의 상이한 TWT 파라미터를 가질 수 있기 때문임.&lt;br /&gt;
반대로, 동일한 파라미터가 모든 링크에 적용될 때에는 하나의 TWT 요소로 충분함.&lt;br /&gt;
TIM과 같이 TWT에서도 스테이션은 필요할 때 깨어있는 상태에서 doze 상태로 전환하여 전력 소비를 줄일 수 있음.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;traffic-management&quot;&gt;Traffic Management&lt;/h2&gt;
&lt;p&gt;여러 인터페이스를 가진 AP와 스테이션이 존재하기 때문에 트래픽 flow 할당은 MLO에서 어려운 부분이다. 
이와 관련하여 802.11be U-MAC 구현은 특정 L-MAC에 버퍼링된 데이터를 배포하기 위해 트래픽 관리자에 의존해야 한다. 
인터페이스를 효율적으로 사용하는 것은 네트워크 성능 측면에서 매우 중요한 역할을 할 것이기 때문이다. 
이를 위해 일련의 정책을 도입하였다. 먼저 MLSA(Multi Link Same Load to All Interface)는 모든 인터페이스에 트래픽을 동일하게 할당한다. 
하지만 이러한 작업은 채널 점유율을 고려하지 않고 결정하기 때문에 매우 비효율적이다. 
다음으로 SLCI(Single Link Less Congestion Interface)와 MCAA(Multi-link Congestion-Aware Load Balancing at Flow Arrivals) 정책도 도입하였다. 
이들은 단일 또는 여러 대역에 트래픽을 할당하기 위해 링크 점유율 측정에 의거하므로, 예상대로 상당한 성능 향상을 가져왔다. 
따라서 트래픽 결정은 자체 트래픽 부하뿐만 아니라 채널의 순간적인 점유율을 고려하여야 함을 보여 주었다. 
그러나 제안된 메커니즘의 non-adaptive 구현은 링크의 점유율이 매우 빠르게 변할 수 있으므로, 장기간의 flow에서는 효율적이지 않을 수 있다. 
이러한 맥락에서 흐름이 활성화될 때 각 인터페이스의 순간적인 채널 점유율을 고려할 뿐만 아니라 지속적으로 추적하여 변경 사항이 발생할 때 트래픽을 동적으로 재할당할 수 있는 동적인 전략의 채택을 추가적으로 연구할 예정이다.&lt;/p&gt;

&lt;p&gt;이전의 전략에서는 모든 TID가 여러 인터페이스에 매핑되는 것으로 간주되었지만, MLO는 TID-to-link 매핑 기능을 통해 링크 기반 트래픽 분리를 수행할 수 있는 가능성을 열어 준다. 
즉, 시간에 민감한 트래픽에 대한 액세스 지연을 최소화하기 위해 서로 다른 TID를 서로 다른 링크에 매핑할 수 있다. 
게다가 이러한 기능은 노드의 공간적 분포가 특히 5GHz 6GHz 대역에서 유리한 전파 조건으로 인해 서로 다른 contention-free 링크를 생성할 수 있다는 점으로 보완될 수 있다. 
따라서 높은 QoS 요구사항이 있는 트래픽은 이러한 contention-free 링크가 존재하는 한 독점적으로 교환할 수 있다. 
TID-to-link 매핑 전략의 적용에서 장점과 단점을 보여주기 위해 이 글에서는 서로 다른 유형의 트래픽 흐름을 구분하는 새로운 트래픽 할당 정책을 소개한다. 
즉, 데이터 흐름에 해당하는 트래픽은 비디오 흐름과 다른 링크에 할당된다. 
이 정책을 VDS(Video and Data Separation)이라고 하며, 데이터 흐름은 2.4GHz 또는 5GHz 대역에 할당하고, 비디오 흐름은 6GHz 대역에 할당한다. 
VDS는 여러 인터페이스에 데이터 흐름을 분산하지 않고 전체 트래픽을 단일 인터페이스(즉, 2.4GHz 또는 5GHz 대역 중 가장 빈 인터페이스)에 할당한다.&lt;/p&gt;

&lt;h3 id=&quot;notes-6&quot;&gt;Notes&lt;/h3&gt;
&lt;p&gt;MLO는 여러 인터페이스를 가진 AP와 스테이션이 존재하는 환경이기에 트래픽 flow의 할당이 어렵고 중요함.&lt;br /&gt;
802.11be에서는 이와 관련된 일련의 정책을 도입하였는데, MLSA(Multi Link Same Load to All Interface), 
SLCI(Single Link Less Congestion Interface), 
MCAA(Multi-link Congestion-Aware Load Balancing at Flow Arrivals)가 이에 해당함.&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;&lt;strong&gt;MLSA(Multi Link Same Load to All Interface)&lt;/strong&gt;&lt;/dt&gt;
  &lt;dd&gt;모든 인터페이스에 트래픽을 동일하게 할당 =&amp;gt; 채널 점유율을 고려하지 못하여 비효율적임.&lt;/dd&gt;
  &lt;dt&gt;&lt;strong&gt;SLCI(Single Link Less Congestion Interface)&lt;/strong&gt;&lt;/dt&gt;
  &lt;dd&gt;단일 링크에 트래픽을 할당하되, 현재 가장 혼잡이 적은 링크에 트래픽을 할당하는 방식&lt;/dd&gt;
  &lt;dt&gt;&lt;strong&gt;MCAA(Multi-link Congestion-Aware Load Balancing at Flow Arrivals)&lt;/strong&gt;&lt;/dt&gt;
  &lt;dd&gt;멀티 링크에서 새로운 트래픽 흐름이 발생할 때, 각 링크의 혼잡 상태를 고려하여 트래픽을 분산하는 방식&lt;br /&gt;
링크의 혼잡 상태를 실시간으로 평가, 트래픽을 분산하는 과정으로 이루어짐.&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;SLCI와 MCAA는 MLSA와 달리 링크의 혼잡한 정도와 같은 환경을 고려하여 트래픽을 할당하여 상당한 성능 향상을 보임.&lt;br /&gt;
트래픽 할당은 시스템의 전체 트래픽 처리양뿐만이 아니라, 순간적으로 요구되는 트래픽 처리의 양까지 고려하여서 수행하여야 함을 의미함.&lt;br /&gt;
하지만 위와 같은 구현은 non-adaptive 방식이라 순간적인 트래픽 처리의 양이 매우 빠르게 변화하는 환경에서는 장기적으로 효율적이지 않을 수 있음. &lt;br /&gt;
따라서 순간적인 트래픽 처리의 양을 고려하되 이를 지속적으로 추적하여 변경사항이 있을 시 대처할 수 있는 동적인 정책의 채택을 추가적으로 연구할 예정임.&lt;/p&gt;

&lt;p&gt;SLCI, MCAA, MLSA는 특정 인터페이스의 부하를 막기 위해 모든 TID를 여러 인터페이스에 매핑하여 트래픽을 처리하였음. &lt;br /&gt;
하지만 MLO에서는 TID-to-link 매핑 기능을 통헤 링크 별로 상이한 TID를 매핑하여 처리할 수 있도록 함.&lt;br /&gt;
가령, 기존에는 2.4GHz, 5GHz 모두에서 모든 TID를 처리할 수 있었다면, MLO에서는 비디오 스트리밍은 6GHz, 일반 데이터 전송 트래픽은 2.4GHz 또는 5GHz에 할당함으로써 높은 QoS를 보일 수 있음.&lt;br /&gt;
이러한 정책을 &lt;strong&gt;VDS(Video and Data Separation)&lt;/strong&gt;이라 함.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;performance-evaluation&quot;&gt;Performance Evaluation&lt;/h2&gt;

&lt;p&gt;그림에서 볼 수 있듯 VDS 정책은 평가된 전체 시나리오의 50%에 대해서는 Video flows, Data flows에서 평균 throughput losses를 5% 미만의 값을 보였으나, 
최악의 경우 거의 40%에 육박하는 평균 손실을 보여 MSLA 정책보다 낮은 성능을 보였다. 이는 VDS 정책의 중요한 단점을 보여준다. 
VDS의 트래픽 분리는 인접 BSS가 겹치거나 트래픽 시나리오가 높은 조건에서 심각한 성능 문제를 겪을 수 있지만, SLCI 및 MCAA 정책은 활성 링크 간의 트래픽 부하 균형을 맞출 수 있기에 
시나리오 75%의 문제에서 이를 극복할 수 있음을 볼 수 있다.&lt;/p&gt;

&lt;p&gt;또한 기존 Multi-Band Single Link(MB-SL)과 Single Link(SL)를 통해 단일 링크가 아닌 다중 링크에 분산하는 것이 더 좋은 성능을 보이며, 
그럼에도 MLO의 정책들이 모든 시나리오에서 더 좋은 성능을 보이는 것을 확인할 수 있었다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;open-issues-and-challenges&quot;&gt;Open Issues and Challenges&lt;/h2&gt;
&lt;p&gt;MLO는 차세대 무선랜에서 구현될 유망한 기능을 나타내지만, 여러 인터페이스를 동시에 사용하면 새로운 과제에 직면하게 된다. 
이러한 맥락에서 추가 연구가 필요한 몇 가지 미해결 문제를 지적한다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Non-STR and Legacy Blindness&lt;/strong&gt;:&lt;br /&gt;
이 문제는 non-STR 및 기존 STA가 그들의 제한된 운영으로, 다양한 충돌 시나리오를 유발할 수 있다는 것과 관련된다. 
첫째, non-STR STA는 다른 링크에서 전송을 수행하고 있기 때문에 사용 가능한 다른 링크에서의 DL, UL을 감지하지 못할 수 있다. 
따라서 non-STR STA가 이미 사용중인 링크에서 전송을 시도하면 충돌이 발생할 수 있다. 
이 문제는 AP MLD가 non-STR STA에게 AP MLD가 사용 중인 다른 링크의 채널 상태를 알리도록 하여 해결 되었다.
한편, 마찬가지로 레거시 장치들은 단일 링크에서만 동작하기 때문에 다른 링크에서 전송이 이루어지고 있는지 알지 못할 수 있다. 
따라서 non-STR 사례에서 제안된 것과 같은 지표가 필요하여 레거시 노드에게 다른 링크에서 일어나는 활동을 알려야 한다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spectrum Inefficiency&lt;/strong&gt;:&lt;br /&gt;
IDC interference 또는 충돌을 피하기 위한 보수적인 접근 방식은 하나의 링크에서 백오프 절차를 중단하고, 
다른 링크에서 medium access가 허용되는 경우 스펙트럼의 비효율적인 사용으로 이어질 수 있다. 
이에 non-STR 노드의 스펙트럼 활용을 극대화하기 위해 채널 상태가 충돌이 발생하지 않음을 보장할 때만 전송 시도를 재개하는 opportunistic backoff 메커니즘을 제안하였다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Channel Access Fairness&lt;/strong&gt;:&lt;br /&gt;
MLO는 여러 링크에서 TXOP aggregation을 수행하기 때문에 단일 링크만 사용할 수 있는 노드들은 채널 접근이 더 어려워질 수 있다. 
따라서, legacy STA가 존재하는 경우, link aggregation 기술의 사용을 제한하거나 막아야 한다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Load Balancing&lt;/strong&gt;:&lt;br /&gt;
로드 밸런싱이 글의 주제였으나, MLO WLAN에서 트래픽을 균형 있게 분산하기 위한 최적의 전략을 완전히 이해하기 위해서는 추가적인 연구가 필요하다. 
예로, MLO가 업 링크 트래픽에 어떻게 사용될 수 있는지도 고려하여야 하며, 이는 다운 링크와는 전혀 다른 접근 방식을 요구할 수 있다. 
이 측면에서, 로드 밸런싱 전략은 미래의 트래픽과 네트워크 동향을 예측하기 위해 머신러닝 솔루션을 사용할 때 이점을 얻을 수 있다.&lt;/p&gt;

&lt;h3 id=&quot;notes-7&quot;&gt;Notes&lt;/h3&gt;
&lt;p&gt;MLO를 사용함에 따라 발생한 문제와 해결책, 미해결 문제&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Non-STR and Legacy Blindness&lt;/li&gt;
  &lt;li&gt;Spectrum Inefficiency&lt;/li&gt;
  &lt;li&gt;Channel Access Fairness&lt;/li&gt;
  &lt;li&gt;Load Balancing&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Non-STR and Legacy Blindness&lt;/strong&gt;:&lt;br /&gt;
Non-STR STAs: MLO는 지원하나, 동시 송수신은 지원하지 않는 스테이션&lt;br /&gt;
Legacy STAs: 이전 표준까지의 스테이션으로 MLO 자체를 지원하지 않을 수 있음.&lt;br /&gt;
non-STR STA는 동시 송수신을 지원하지 않으므로, 송신 또는 수신 중일 때 다른 링크에서의 송수신을 감지하지 못할 수 있음.
가령, 1번 링크를 이용 중인 STA_A(non-STR STA)는 2번 링크가 사용되고 있음을 감지하지 못함. 이때 STA_A가 2번 링크에서 전송을 시도하면 충돌이 발생함.&lt;br /&gt;
=&amp;gt; AP MLD가 STA_A에게 자신이 사용 중인 2번 링크의 채널 상태를 알리도록 하여 해결하였음.&lt;/p&gt;

&lt;p&gt;Legacy STA 는 단일 링크에서만 동작하므로, non-STR STA와 같이 다른 링크의 사용 여부를 알지 못할 수 있음.&lt;br /&gt;
=&amp;gt; 같은 맥락의 해결책이 필요함.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spectrum Inefficiency&lt;/strong&gt;:&lt;br /&gt;
IDC interference 또는 충돌을 피하기 위해 사용되는 보수적인 접근론은 다른 링크에서 medium access가 허용될 경우 
기존 링크에서의 백오프 절차를 중단하게 되어 이러한 과정이 스펙트럼 활용 효율을 낮추게 됨.&lt;br /&gt;
=&amp;gt; 채널 상태가 충돌이 발생하지 않음이 보장될 때만 전송 시도를 재개하는 opportunistic backoff 메커니즘을 제안함.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Channel Access Fairness&lt;/strong&gt;:&lt;br /&gt;
MLO는 여러 링크에서 TXOP aggregation을 수행함에 따라 단일 링크만 사용할 수 있는 노드들은 채널 접근이 더 어려워질 수 있음. &lt;br /&gt;
그 이유는 TXOP aggregation 과정에서 여러 링크를 사용하는 노드에게 채널 접근의 우선권을 주기 때문에 접근 경쟁에서 밀림.&lt;br /&gt;
=&amp;gt; legacy STA가 존재하는 경우, link aggregation의 사용을 제한하거나 막아야 함.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Load Balancing&lt;/strong&gt;:&lt;br /&gt;
MLO UL에서의 로드 밸런싱 전략은 다운 링크와 전혀 다른 접근 방식을 요구할 수 있기에 미래 트래픽과 네트워크 동향을 예측하는 머신러닝 솔루션과 함께 사용되도록 연구해야 함.&lt;/p&gt;

&lt;hr /&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;성공적인 성과까지!&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;blockquote&gt;
  &lt;h3 id=&quot;profile&quot;&gt;Profile&lt;/h3&gt;

  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Seong Hun KIM&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Student&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;Dept. of Computer Science Engineering | Yeungnam University, Repulic of Korea&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Convolution_Filter_Application/assets/118245330/37c81d9e-cfb8-4aee-8497-ff1071b2458b&quot; alt=&quot;yu signature&quot; /&gt;&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Phone&lt;/strong&gt; &lt;a href=&quot;tel:010-6685-1140&quot;&gt;010 - 6685 - 1140&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Mail&lt;/strong&gt; &lt;a href=&quot;mailto:tgh7544@naver.com&quot;&gt;tgh7544@naver.com&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;LinkTree&lt;/strong&gt; &lt;a href=&quot;https://linktr.ee/HoonC_corgi&quot;&gt;https://linktr.ee/HoonC_corgi&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</description>
        <pubDate>Mon, 27 May 2024 00:00:00 +0000</pubDate>
        <link>https://hoonc-corgi.github.io/2024/05/27/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Multi-Link-Operation-in-IEEE-802.11be-WLANs-_-%C3%81lvaro-L%C3%B3pez-Ravent%C3%B3s-and-Boris-Bellalta.html</link>
        <guid isPermaLink="true">https://hoonc-corgi.github.io/2024/05/27/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Multi-Link-Operation-in-IEEE-802.11be-WLANs-_-%C3%81lvaro-L%C3%B3pez-Ravent%C3%B3s-and-Boris-Bellalta.html</guid>
        
        
      </item>
    
      <item>
        <title>[프로젝트] Yolov8 콘크리트 크랙 탐지 (5)</title>
        <description>&lt;h1 id=&quot;yolov8-concrete-crack-detection-using-instance-segmentation-5&quot;&gt;&lt;strong&gt;YOLOv8 Concrete Crack Detection using Instance Segmentation #5&lt;/strong&gt;&lt;/h1&gt;
&lt;h2 id=&quot;--about-build-up-for-driving-on-hololens2-labtop-etc&quot;&gt;- About build-up for driving on HoloLens2, labtop, etc&lt;/h2&gt;

&lt;hr /&gt;
&lt;h2 id=&quot;index&quot;&gt;Index&lt;/h2&gt;

&lt;!-- TOC --&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#yolov8-concrete-crack-detection-using-instance-segmentation-5&quot;&gt;&lt;strong&gt;YOLOv8 Concrete Crack Detection using Instance Segmentation #5&lt;/strong&gt;&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#--about-build-up-for-driving-on-hololens2-labtop-etc&quot;&gt;- About build-up for driving on HoloLens2, labtop, etc&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#index&quot;&gt;Index&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#review&quot;&gt;Review&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#project-struct&quot;&gt;Project Struct&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#script-description&quot;&gt;Script Description&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#yolosegpy&quot;&gt;YOLOSeg.py&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#__init__&quot;&gt;__init__&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#__call__&quot;&gt;__call__&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#initialize_model&quot;&gt;initialize_model&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#segment_objects&quot;&gt;segment_objects&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#prepare_input&quot;&gt;prepare_input&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#inference&quot;&gt;inference&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#process_box_output&quot;&gt;process_box_output&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#extract_boxes&quot;&gt;extract_boxes&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#process_mask_output&quot;&gt;process_mask_output&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#draw_detections&quot;&gt;draw_detections&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#draw_masks&quot;&gt;draw_masks&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#get_input_details&quot;&gt;get_input_details&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#get_output_details&quot;&gt;get_output_details&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#rescale_boxes&quot;&gt;rescale_boxes&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#if-__name__--__main__&quot;&gt;if __name__ == __main__:&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#utilspy&quot;&gt;utils.py&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#nms&quot;&gt;nms&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#compute_iou&quot;&gt;compute_iou&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#xywh2xyxy&quot;&gt;xywh2xyxy&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#sigmoid&quot;&gt;sigmoid&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#draw_detections-1&quot;&gt;draw_detections&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#draw_masks-1&quot;&gt;draw_masks&lt;/a&gt;
&lt;!-- TOC --&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;
&lt;h2 id=&quot;review&quot;&gt;Review&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://hoonc-corgi.github.io/2023/11/24/YOLOv8-콘크리트-크랙-탐지-(4)-응용-어플리케이션-개발에-관하여.html&quot;&gt;이전 게시글&lt;/a&gt;&lt;br /&gt;
지난 게시글에서는 본 프로젝트의 목표와 그에 따른 요구사항과 제한 요소에 대한 배경과 타협책을 정하였다. 이번 게시글에서는 변경된 구조에 따른 개발 과정 중 응용 프로그램을 제외한, 근간이 되는 코드들만 리뷰해 보겠다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;project-struct&quot;&gt;Project Struct&lt;/h2&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;project/
|-- models/
|   |-- yolov8n-seg.onnx
|-- yoloseg/
|   |-- __init__.py
|   |-- utils.py
|   |-- YOLOSeg.py
|-- hl2ss.py
|-- hololens_instance_segmentation.py
|-- requirements.txt
|-- README.md
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;yolov8n-seg.onnx&lt;br /&gt;
커스텀 트레이닝 시킨 모델의 .onnx 포맷 파일이다. .onnx가 범용성이 가장 뛰어나 .pt to .onnx로 export하여 생성하였다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;__init__.py&lt;br /&gt;
디렉토리를 패키지로 인식할 수 있도록 하는 스크립트이며, 프로젝트가 로드 될 때 가장 먼저 실행되는 파일이다. 나의 경우 utils.py, YOLOSeg.py를 라이브러리로서 사용하기 위하여 생성하였다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;utils.py&lt;br /&gt;
모델의 기능이 구현된 스크립트이다. 모델이 인식할 객체 범위를 정의하고, nms, iou 계산, detection, masking 등의 기능 함수가 구현되어 있다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;YOLOSeg.py&lt;br /&gt;
모델의 입출력 처리 전체를 관장하며, 모델 로드, 세그먼트 적용, 입력 이미지 로드, 추론, 바운딩 박스, 마스크 처리, 이미지 스케일 등이 포함되어 있음.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;hl2ss.py&lt;br /&gt;
HoloLens 2 Sensor Streaming 통신이 구현된 스크립트이다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;hololens_instance_segmentation.py&lt;br /&gt;
hl2ss.py의 메소드를 활용하여 홀로렌즈와의 통신을 열고, 프레임을 YOLOSeg.py를 활용하여 모델에 처리하여 결과 비디오를 출력한다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;requirements.txt
본 프로젝트 구성에 필수적인 라이브러리들이 정리되어 있는 텍스트 파일으로, requirements.txt가 위치한 디렉토리에서 아래 커맨드 명령어를 통해 자동으로 다운할 수 있다.&lt;/p&gt;
    &lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;pip &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt; requirements.txt 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;본 프로젝트의 구조는 위와 같다.&lt;br /&gt;
프로젝트 완성에 앞서 가장 중요했던 센서 스트리밍은 유니티 및 c# 지식 부족으로 아래 링크의 sln 파일 및 파이썬 스크립트 중 내게 필요한 PV 통신 일부를 참고하여 구성하였다.&lt;br /&gt;
&lt;a href=&quot;https://github.com/jdibenes/hl2ss&quot;&gt;출처 링크&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;script-description&quot;&gt;Script Description&lt;/h2&gt;
&lt;p&gt;hl2ss.py의 경우 전술한 출처 링크를 통해 직접 확인해 볼 수 있으므로, 필수적인 코드만 살펴 볼 예정이며, 본 게시글에서는 응용 프로그램을 제외한 핵심 코드인 yoloseg 패키지 내의 스크립트만 리뷰한다.&lt;/p&gt;

&lt;h3 id=&quot;yolosegpy&quot;&gt;YOLOSeg.py&lt;/h3&gt;
&lt;p&gt;YOLOSeg.py는 욜로 모델의 출력에 따른 바운딩 박스, 마스킹 처리를 위한 스크립트이며 주요 구성은 아래와 같다.&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;__init__&lt;/li&gt;
  &lt;li&gt;__call__&lt;/li&gt;
  &lt;li&gt;initialize_model&lt;/li&gt;
  &lt;li&gt;segment_objects&lt;/li&gt;
  &lt;li&gt;prepare_input&lt;/li&gt;
  &lt;li&gt;inference&lt;/li&gt;
  &lt;li&gt;process_box_output&lt;/li&gt;
  &lt;li&gt;extract_boxes&lt;/li&gt;
  &lt;li&gt;process_mask_output&lt;/li&gt;
  &lt;li&gt;draw_detection&lt;/li&gt;
  &lt;li&gt;draw_masks&lt;/li&gt;
  &lt;li&gt;get_input_details&lt;/li&gt;
  &lt;li&gt;get_output_details&lt;/li&gt;
  &lt;li&gt;rescale_boxes&lt;/li&gt;
  &lt;li&gt;if __name__ == “__main__”:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;사전에 구체적으로 주석처리 하였으므로 위 주요 메소드 및 구성 요소에 대하여 코드와 함께 설명하되 느낀점, 주요 매커니즘을 중점으로 기술하겠다.&lt;/p&gt;
&lt;h4 id=&quot;__init__&quot;&gt;__init__&lt;/h4&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# 생성자: 모델 경로, 확률 임계값, IOU 임계값 및 마스크 개수 초기화
&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;conf_thres&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.7&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;iou_thres&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;num_masks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;conf_threshold&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;conf_thres&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# 예측 신뢰도 임계치 초기화
&lt;/span&gt;        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;iou_threshold&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;iou_thres&lt;/span&gt;      &lt;span class=&quot;c1&quot;&gt;# IOU 임계값 초기화
&lt;/span&gt;        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num_masks&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;num_masks&lt;/span&gt;          &lt;span class=&quot;c1&quot;&gt;# 마스크 개수
&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# Initialize model
&lt;/span&gt;        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;initialize_model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;         &lt;span class=&quot;c1&quot;&gt;# 모델 로드
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;__init__()은 파이썬에서 지원하는 매직 메소드로, 클래스에 새로운 인스턴스가 생성될 때 동작하는 문법이다.&lt;br /&gt;
이를 통해 YOLOSeg.py 스크립트가 실행되면 가장 먼저 초기화를 해줄 수 있도록 생성자로서 동작한다.&lt;/p&gt;

&lt;p&gt;각 매개변수는 모델이 위치한 경로, 신뢰도 임계값, iou 임계값, 마스크 수를 의미한다.&lt;/p&gt;

&lt;h4 id=&quot;__call__&quot;&gt;__call__&lt;/h4&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# 객체 호출시 오브젝트 디텍션 및 세그먼트 수행
&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__call__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;segment_objects&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;__call__ 역시 파이썬에서 지원하는 매직 메소드로, 객체를 호출할 때 사용되며, 객체를 함수처럼 사용하고 싶을 때 이를 사용한다.&lt;/p&gt;

&lt;h4 id=&quot;initialize_model&quot;&gt;initialize_model&lt;/h4&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;initialize_model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# ONNX 런타임을 이용하여 모델을 초기화, 이때 &apos;CPUExecutionProvider&apos;는 모델이 CPU에서 실행될 것임을 나타냄
&lt;/span&gt;        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;session&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;onnxruntime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;InferenceSession&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;providers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;CPUExecutionProvider&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_input_details&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# 입력 정보 가져오기
&lt;/span&gt;        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_output_details&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# 출력 정보 가져오기
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;모델 구동에 관한 초기화를 담당하는 함수이다.
나의 경우 맥북에서 테스팅을 하기 때문에 CPUExecution으로 설정하여 진행하였다.
모델의 입출력 노드에 대한 정보를 저장하는 함수인 get_input/output_details를 호출한다.&lt;/p&gt;

&lt;h4 id=&quot;segment_objects&quot;&gt;segment_objects&lt;/h4&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;segment_objects&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;input_tensor&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prepare_input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# 모델 입력을 위한 변수 초기화. 이미지를 불러와 batch, channels, height, width 4차원 텐서로 변환
&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# Perform inference on the image
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;outputs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;inference&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input_tensor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# 모델에 입력하여 결과 리턴 받음
&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scores&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;class_ids&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_pred&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;process_box_output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;outputs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# outputs[0]에 저장된 바운딩박스, 예측 확률, 예측 클래스, 마스크 예측 클래스를 불러옴
&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mask_maps&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;process_mask_output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mask_pred&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;outputs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# outputs[0]에서 불러온 마스크 예측 클래스를 토대로, 데이터를 처리하여 마스크 맵을 생성함.
&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;# 이때 마스크 맵은 적용된 세그먼트의 결과임.
&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scores&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;class_ids&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mask_maps&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# 바운딩 박스, 예측 신뢰도, 예측 클래스, 마스크 맵을 반환
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;prepare_input 메소드에 이미지를 넘겨 주고 이를 통해 배치, 채널, 높이, 넓이 정보를 모델의 입력 텐서로 초기화 한다.&lt;br /&gt;
초기화된 input_tensor를 통해 inference 함수로 모델에 의한 추론을 시작하고, outputs에 저장한다.
모델 추론에 따른 outputs[0]에서 바운딩 박스, 확률, 클래스, 마스크 클래스를 불러와 각 변수에 저장한다.&lt;br /&gt;
이를 통해 데이터를 처리하고 마스크맵을 생성한다.&lt;br /&gt;
이를 통해 바운딩 박스, 신뢰도, 클래스, 마스크 맵을 반환한다.&lt;/p&gt;

&lt;h4 id=&quot;prepare_input&quot;&gt;prepare_input&lt;/h4&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;prepare_input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img_height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img_width&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# 이미지 shape에 저장된 높이와 너비를 가져옴
&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;input_img&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cvtColor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;COLOR_BGR2RGB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# BGR 이미지에서 RGB이미지로 변환
&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# Resize input image
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;input_img&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;resize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input_img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input_width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input_height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# RGB 이미지 사이즈 조정
&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# Scale input pixel values to 0 to 1
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;input_img&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;input_img&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;255.0&lt;/span&gt;   &lt;span class=&quot;c1&quot;&gt;# 픽셀 값 조정
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;input_img&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;input_img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;transpose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# 모델에 입력하기 위해 이미지 차원 변경 기존 차원(높이, 너비, 차원) -&amp;gt; 차원(차원, 높이, 너비)로 변환됨. (2, 0, 1)은 기존 차원의 인덱스
&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;input_tensor&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;input_img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;newaxis&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;astype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;float32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# 모델에 입력하기 위해 4차원 텐서로 변경함
&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;# 기존  3차원 텐서를 4차원으로 변환함. 이에 따라 0번 차원은 batch_size 표현함. default 1 싱글 배치여도 필요
&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;# 딥러닝 모델은 부동소수점 연산을 사용하므로, float32로의 데이터 타입 변환
&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;input_tensor&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# 결과 리턴
&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;prepare_input()은 모델 입력을 위해 이미지 전처리(학습 단계에서의 전처리와 상이함), 이미지의 shape를 추출하는 함수이다.&lt;br /&gt;
BGR 색상의 이미지는 RGB로 순서를 맞추어 주고, 모델 인풋 사이즈에 맞게 이미지를 리사이즈 한다.&lt;br /&gt;
픽셀값의 스케일링을 진행하며, (높이, 너비, 차원) 순서의 기존 차원 포맷을 (차원, 높이, 너비)로 트랜스포즈하여 모델의 입력 포맷에 맞추어 준다.&lt;br /&gt;
이렇게 인풋 이미지에 대한 (channel, height, width) 차원의 포맷이 추출되는데, 모델은 4차원 텐서를 입력 구조로 가지기에, 새로운 차원을 추가하여 이에 batch_size를 저장한다.
또한 대부분의 딥러닝 모델은 부동소수점 연산을 이용하므로, 32비트 부동소수점 연산을 나타내는 float32의 데이터로 타입을 변환한다.&lt;/p&gt;

&lt;p&gt;본 메소드는 모델에 대한 디테일을 필요로 하는 부분이 많아 꽤 어려움을 겪었다. 구현과 개발에 있어서 문제가 되는 대부분의 경우는 정격 포맷에 맞추지 않았거나, 부동소수점 연산을 사용하지 않아서와 같은 허무할 정도로 사소한 문제가 많다. 또 이러한 사실이 작은 디테일이 중요함을 알 수 있는 반증이기도 하다.&lt;/p&gt;

&lt;p&gt;글을 작성하며 떠오른 기억으로, 이미지는 3차원인데 모델은 4차원 입력을 기대하니 어쩔 줄 몰라했던 기억이 난다. 또 그러다 “설마 이게 되겠어?”하며 그냥 축을 추가해 주었더니 해결되었던 것도 기억이 난다. 나를 가로막는 큰 문제도 때때로 아주 단순하게 풀릴 수도 있음을 느꼈다. 어렵게 생각하면 어려운 문제고, 쉽게 생각하면 쉬운 문제다.
&lt;em&gt;다만 이를 위해서는 유연한 사고가 필수적이다.&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;터널 끝 빛만 보고 걸어 간다면, 바로 옆 비상구도 볼 수 없다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id=&quot;inference&quot;&gt;inference&lt;/h4&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;inference&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;input_tensor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# start = time.perf_counter() # 추론 시작 시간 체크
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;outputs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;session&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;output_names&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input_names&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;input_tensor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# onnx 런타임 세션으로 실행, output_names는 모델의 출력 노드, input_names는 모델의 입력 노드이며 이에 input_tensor가 지정됨.
&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;# 해당 함수의 결과를 outputs에 저장, 결국 모델의 추론 결과가 저장됨.
&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# print(f&quot;Inference time: {(time.perf_counter() - start)*1000:.2f} ms&quot;) # 성능평가를 위한 추론 시간 계산
&lt;/span&gt;        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;outputs&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# 추론 결과 반환
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;inference()는 모델에 이미지를 입력하고 추론하는 함수이다. 추론 시작 시간을 체크하고 이를 출력하는 코드도 초기 프로젝트 구성 및 간이 테스트에서는 사용하였지만, 비디오 스트리밍 추론으로 넘어가면서 원활한 진행을 위해 주석처리 하였다.&lt;br /&gt;
onnx 런타임 세션을 이용하여 추론을 실행하고 outputs에 저장한다.&lt;/p&gt;

&lt;p&gt;ai를 하면서 느끼는 건 사람이 하는 게 많이 없다는 것이다. 일반적으로 생각하는 모델 학습 뿐만 아니라, 모델 실행도 사람이 할 수 있는 건 없다. 밥만 주고 먹으라고 말하듯, 데이터를 주고 처리하라고 명령하는 것이 전부이기에 처음에는 많이 당황스러웠다(그렇다고 밥 주고 먹으라고 하는 게 쉬운 것은 아니다). 우리가 살아가는 세상은 정말 기대 이상으로 발전되어 있는 것 같다.&lt;/p&gt;

&lt;h4 id=&quot;process_box_output&quot;&gt;process_box_output&lt;/h4&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;process_box_output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;box_output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# box_output에는 모델이 추론한 박스 좌표, 에측 정확도 및 예측 클래스 등의 정보가 저장됨.
&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# 모델의 출력 배열 형태로 조정함. 바운딩 박스, 예측 신뢰도 및 예측 클래스 등의 정보를 저장
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;predictions&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;squeeze&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;box_output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# np.squeeze를 통해 불필요한 차원을 제거하여 차원 축소 후 차원을 전치하여 재배열하여 데이터를 처리함.
&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# 분류된 결과 정보를 저장함.
&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;# box_output[1]에는 경계 상자의 x,y,w,h 4개 좌표와 예측 신뢰도, 마스크 예측 값 등이 저장되어 있음.
&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;# 이에 마스크 4개 좌표를 제거함. 즉 num_classes에는 모델이 예측한 클래스를 저장하게 됨.
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;num_classes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;box_output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num_masks&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# Filter out object confidence scores below threshold
&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;# 예측 신뢰도의 최고 점수를 가져옴.
&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;# prediction 배열의 첫 네 개의 값 바운드박스의 좌표에 해당하므로 제외함. axis=1에 따라 행에서 가장 큰 값을 가져옴.
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;scores&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;predictions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num_classes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# 설정된 예측 신뢰도 임계치를 넘는 데이터만 가져옴
&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;# predictions는 오브젝트의 정보를 필터링 -&amp;gt; conf_threshold를 넘지 못하는 데이터 정보는 모두 삭제
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;predictions&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;predictions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scores&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;conf_threshold&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:]&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# scores는 신뢰도 점수만을 필터링 -&amp;gt; conf_threshold를 넘지 못하는 신뢰도 정보도 모두 삭제
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;scores&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scores&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scores&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;conf_threshold&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# 두 코드라인을 함께 씀으로써 두 배열이 서로 일치하는 데이터만을 가지도록 동기화 됨.
&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# 필터링 된 예측 결과가 없다면 0이 채워진 배열 반환
&lt;/span&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scores&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([])&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# 모델이 예측한 바운딩 박스 좌표 및 예측 신뢰도를 저장
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;box_predictions&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;predictions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[...,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num_classes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# 모델이 예측한 마스크 좌표 및 예측 신뢰도를 저장
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;mask_predictions&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;predictions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[...,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;num_classes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:]&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# 행을 따라 박스 예측 신뢰도가 가장 높은 클래스만을 추출
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;class_ids&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;argmax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;box_predictions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# 각 객체에 대한 바운딩 박스 좌표를 추출
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;extract_boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;box_predictions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# nms는 겹치거나 중복되는 바운딩 박스를 제거함으로써 여러 예측이 동일 객체를 가리키는 것을 방지함.
&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;# 이에 대한 기준으로 iou_threshold가 적용, 0.5로 설정하였으므로, 50%이상 겹치는 박스는 제거됨.
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;indices&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nms&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scores&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;iou_threshold&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# nms 처리가 이루어진 바운딩 박스, 신뢰도, 클래스 종류, 마스크 예측 결과를 반환함.
&lt;/span&gt;        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;indices&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scores&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;indices&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;class_ids&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;indices&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_predictions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;indices&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;process_box_output()은 모델이 추론한 데이터를 통해 box_output을 처리하는 메소드다.&lt;br /&gt;
모델 추론의 결과를 predictions에 box_output을 스퀴즈하여 저장한다. 이때 결과는 이후 처리 과정의 효율을 위해 전치된 결과이다.&lt;br /&gt;
나도 공부를 하며 작성한 코드들이기에 주석이 상당히 구체적이므로 나머지는 생략해도 될 것 같다.&lt;br /&gt;
모델의 출력 결과에 따른 처리 과정이 어려운 것 같지만 사실 형태가 행렬이나 배열일 뿐, 변수에 담긴 데이터를 꺼내 와서 비교하고 저장하는 게 전부이기 때문에 모델의 정격 포맷에 대한 이해만 있으면 충분히 할 수 있는 부분이다.&lt;/p&gt;

&lt;h4 id=&quot;extract_boxes&quot;&gt;extract_boxes&lt;/h4&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;extract_boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;box_predictions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# 모든 행(모델 예측 결과)에 대하여 4열까지의 데이터를 가져옴. 즉 박스 데이터를 모두 가져옴
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;box_predictions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# Scale boxes to original image dimensions
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rescale_boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                                   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input_height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input_width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                                   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img_height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img_width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# Convert boxes to xyxy format
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;xywh2xyxy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# Check the boxes are within the image
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;clip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img_width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;clip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img_height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;clip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img_width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;clip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img_height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;extract_boxes()는 모델의 추론 결과로부터 박스의 정보를 추출하는 함수로, process_box_output()에 의해 호출되어 사용된다.&lt;/p&gt;

&lt;h4 id=&quot;process_mask_output&quot;&gt;process_mask_output&lt;/h4&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# 마스크 처리 함수
&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;process_mask_output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_predictions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# 모델이 예측한 마스크에 대한 정보가 없다면, 빈 배열을 반환
&lt;/span&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_predictions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# 마스크 출력을 차원 축소하여 불필요한 정보를 제거함.
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;mask_output&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;squeeze&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mask_output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# Calculate the mask maps for each box
&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;# 마스크 출력의 차원 정보를 가져옴
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;num_mask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_width&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# 마스크 예측값과 모델의 출력값을 행렬 곱셈(@)하여 최종 마스크를 계산함.
&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;# 이를 이를 위해 모델의 출력값 차원을 재조정함. num_mask는 mask_output 배열의 첫 번째 차원이며, 채널 수를 의미함.
&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;# -1 매개변수를 통해 mask_output은 num_mask 매개변수를 가지는 행렬로 재배열 됨.
&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;# 이를 통해 mask_output은 2차원 배열이며, 각 행은 하나의 마스크를 나타내게 됨
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;masks&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sigmoid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mask_predictions&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;@&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reshape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num_mask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# 계산된 마스크를 기존의 이미지 크기에 맞게 다시 재조정함. 행렬 계산을 위해 변환 후 다시 재조정한 것임.
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;masks&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;masks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reshape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# 감지된 바운딩 박스 마스크 크기에 맞게 재조정함.
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;scale_boxes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rescale_boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                                   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img_height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img_width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                                   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mask_height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# 마스크 맵을 초기화
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;mask_maps&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zeros&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scale_boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img_height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img_width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# 블러 처리할 영역의 크기를 정함
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;blur_size&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img_width&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img_height&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# 각 바운딩 박스에 대한 마스크맵 생성
&lt;/span&gt;        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scale_boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)):&lt;/span&gt;

            &lt;span class=&quot;c1&quot;&gt;# 바운딩 박스의 스케일 조정된 좌표를 계산함.
&lt;/span&gt;            &lt;span class=&quot;c1&quot;&gt;# math.floor는 반내림하여 마스크 경계를 명확히 하기 위함. math.ceil은 반올림
&lt;/span&gt;            &lt;span class=&quot;n&quot;&gt;scale_x1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;math&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;floor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scale_boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]))&lt;/span&gt;   &lt;span class=&quot;c1&quot;&gt;# x1좌표: 바운딩 박스의 좌상단 x좌표
&lt;/span&gt;            &lt;span class=&quot;n&quot;&gt;scale_y1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;math&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;floor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scale_boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]))&lt;/span&gt;   &lt;span class=&quot;c1&quot;&gt;# y1좌표: 바운딩 박스의 좌상단 y좌표
&lt;/span&gt;            &lt;span class=&quot;n&quot;&gt;scale_x2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;math&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ceil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scale_boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]))&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# x2: 바운딩 박스의 우하단 x좌표
&lt;/span&gt;            &lt;span class=&quot;n&quot;&gt;scale_y2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;math&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ceil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scale_boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]))&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# y2: 바운딩 박스의 우하단 y좌표
&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;# 기존 바운딩 박스의 좌표를 계산함.
&lt;/span&gt;            &lt;span class=&quot;n&quot;&gt;x1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;math&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;floor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]))&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;y1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;math&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;floor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]))&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;x2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;math&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ceil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]))&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;y2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;math&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ceil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]))&lt;/span&gt;

            &lt;span class=&quot;c1&quot;&gt;# 기존과 신규 좌표를 모두 계산하는 것은 스케일 조정된 마스크 좌표를 기존 바운딩 박스의 크기에 맞게 일치시키기 위함.
&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;# 각 객체의 스케일 조정된 바운딩 박스(마스크) 좌표 scale_y1:scale_y2, scale_x1:scale_x2를 추출
&lt;/span&gt;            &lt;span class=&quot;n&quot;&gt;scale_crop_mask&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;masks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scale_y1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scale_y2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scale_x1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scale_x2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

            &lt;span class=&quot;c1&quot;&gt;# 추출한 각 마스크의 크기를 원본 바운딩 박스의 크기(x2 - x1, y2 - y1)에 맞게 사이즈 조정함.
&lt;/span&gt;            &lt;span class=&quot;c1&quot;&gt;# interpolation=cv2.INTER_CUBIC는 사이즈 조정 시에 사용하는 보간법임.
&lt;/span&gt;            &lt;span class=&quot;n&quot;&gt;crop_mask&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;resize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scale_crop_mask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                              &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                              &lt;span class=&quot;n&quot;&gt;interpolation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;INTER_CUBIC&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

            &lt;span class=&quot;c1&quot;&gt;# 각 바운딩 박스 크기에 맞게 잘려진 마스크의 경계를 블러 처리하여 부드럽게 함.
&lt;/span&gt;            &lt;span class=&quot;n&quot;&gt;crop_mask&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;blur&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;crop_mask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;blur_size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

            &lt;span class=&quot;c1&quot;&gt;# 마스크 영역을 이진화 하여, 마스크 영역을 명확히 함.
&lt;/span&gt;            &lt;span class=&quot;n&quot;&gt;crop_mask&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;crop_mask&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;astype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;uint8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

            &lt;span class=&quot;c1&quot;&gt;# 각 오브젝트의 최종 마스크를 마스크 맵의 해당 위치에 할당함.
&lt;/span&gt;            &lt;span class=&quot;c1&quot;&gt;# mask_maps[i, y1:y2, x1:x2은 원본 이미지에 대응하는 영역을 나타냄.
&lt;/span&gt;            &lt;span class=&quot;n&quot;&gt;mask_maps&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;crop_mask&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# 최종 처리된 마스크맵 반환
&lt;/span&gt;        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_maps&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;process_mask_output()은 process_box_output()과 같이 모델의 추론 결과에 따라 mask_output을 처리하는 함수이다.&lt;br /&gt;
처음 프로젝트를 시작할 때에 모델의 Task를 Object Detection으로 두고 시작하였기에 Instance Segmentation의 핵심인 마스크에 대해서는 지식이 부족하여 주석이 많아졌다.&lt;br /&gt;
본 메소드도 process_box_output()과 같이 &lt;strong&gt;차원축소&lt;/strong&gt;를 이용하는데, 차원축소는 딥러닝과 같은 데이터 분석 및 처리를 요구하는 분야에서 자주 사용된다. 차원축소를 통해서 불필요한 정보를 제거하여 데이터를 정제하고 연산 등의 과정에서의 불필요한 과정을 줄여 고생을 덜 수 있다. 또한 데이터량이 방대할 때에는 차원축소의 여부가 메모리 리소스 등과 같은 자원 활용률에도 영향을 미칠 수 있다.&lt;br /&gt;
대부분의 동작은 주석을 통해 알 수 있으며, 그 구조는 process_box_output()과 유사하다.&lt;br /&gt;
다만 독특한 것이 마스크 예측값과 모델의 출력값을 행렬 곱셈하여 최종 마스크를 계산한다는 점인데, 이는 마스크 영역에 해당하는 각 픽셀에 대하여 클래스 예측 값과 마스크 맵 결과를 함께 고려하여 최종 마스크를 구성하기 위함이다.&lt;br /&gt;
이렇게 생성된 마스크는 행렬 계산을 위해 reshape()하였기 때문에 다시 복원하며, 이미지에 맞게 박스와 마스크 맵 모두를 동기화 하여야 한다.&lt;/p&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;crop_mask&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;resize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scale_crop_mask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                              &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                              &lt;span class=&quot;n&quot;&gt;interpolation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;INTER_CUBIC&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;위 코드 중 ‘interpolation’은 마스크를 다시 리사이즈하는 과정에서 사용되는 보간법을 지정하는 파라미터로, 이미지를 확대하거나 축소하는 경우 발생할 수 있는 계단현상과 노이즈를 줄이기 위해 필수적이다.&lt;br /&gt;
또한 ‘cv2.INTER_CUBIC’은 openCV에서 제공하는 보간법 중 ‘&lt;strong&gt;쌍삼선형 보간법&lt;/strong&gt;‘으로 인접 픽셀들의 가중치를 고려하여 이미지를 보간하여 그 품질이 좋지만 많은 계산량으로 속도가 느리다는 단점이 있다. 나는 느리더라도 깔끔한 마스크를 원했기에 이를 사용하였으며, 마스크 맵의 속도가 문제가 생긴다면, ‘&lt;strong&gt;선형 보간법&lt;/strong&gt;‘이나 ‘&lt;strong&gt;최근접 이웃 보간법&lt;/strong&gt;‘으로의 변경을 고려해 볼 수 있을 것이다.&lt;/p&gt;

&lt;h4 id=&quot;draw_detections&quot;&gt;draw_detections&lt;/h4&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;draw_detections&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;draw_scores&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_alpha&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;  &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_alpha는&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;마스크의&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;투명도임&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;draw_detections&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scores&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                               &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;class_ids&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_alpha&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;draw_detections()는 이미지 위에 추론한 객체의 바운딩 박스, 클래스 종류, 예측 신뢰도를 그리는 함수이다.&lt;/p&gt;

&lt;h4 id=&quot;draw_masks&quot;&gt;draw_masks&lt;/h4&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;draw_masks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;draw_scores&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_alpha&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;draw_detections&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scores&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                               &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;class_ids&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_alpha&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_maps&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mask_maps&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;draw_masks()는 draw_detection()의 mask 확장 함수이다.&lt;/p&gt;

&lt;h4 id=&quot;get_input_details&quot;&gt;get_input_details&lt;/h4&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;get_input_details&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# 모델의 입력 노드 정보를 저장
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;model_inputs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;session&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_inputs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# 입력 노드의 이름을 리스트로 저장함
&lt;/span&gt;        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input_names&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model_inputs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model_inputs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))]&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# 첫 번째 입력 노드의 형태를 가져와서 입력 높이와 너비를 저장함.
&lt;/span&gt;        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input_shape&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model_inputs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input_height&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input_shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input_width&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input_shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;get_input_details()는 각 노드의 데이터에 접근하여 데이터를 처리하기 위해 필요한 함수로 본 프로젝트에서는 첫 번째 입력 노드에서 입력 높이 및 너비를 저장하고 사용하였다.&lt;/p&gt;

&lt;h4 id=&quot;get_output_details&quot;&gt;get_output_details&lt;/h4&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;get_output_details&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# 모델의 출력 노드 정보를 저장
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;model_outputs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;session&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_outputs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# 출력 노드의 이름을 리스트로 저장
&lt;/span&gt;        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;output_names&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model_outputs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model_outputs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;rescale_boxes&quot;&gt;rescale_boxes&lt;/h4&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;staticmethod&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;rescale_boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;input_shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;image_shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# 입력 이미지의 형태를 이용해서 바운딩 박스의 크기를 조정함. 이를 통해 바운딩 박스를 원본 이미지 크기에 맞게 조정할 수 있음.
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;input_shape&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input_shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;input_shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;input_shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;input_shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]])&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;divide&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;input_shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;float32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# 바운딩 박의 좌표를 입력 이미지 크기로 나누어 정규화함.
&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;image_shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;image_shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;image_shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;image_shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]])&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# 정규화된 바운딩 박스를 다시 원본 이미지 크기에 맞게 스케일함.
&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;# image_shape = [ &apos;높이&apos;, &apos;너비&apos; ] 바운딩 박스의 x1, x2는 너비, y1, y2는 높이에 관한 정보이므로 1, 0, 1, 0
&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# 바운딩 박스 리턴
&lt;/span&gt;        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;rescale_boxes()는 입력 이미지에 맞게 박스를 스케일링하는 함수로, 이를 스크립트 내에서 라이브러리 함수처럼 사용하기 위해 “@staticmethod” 데코레이터를 추가하였다. 이를 통해 인스턴스 생성 없이 자유롭게 호출하고, 재사용할 수 있다.&lt;/p&gt;

&lt;h4 id=&quot;if-__name__--__main__&quot;&gt;if __name__ == __main__:&lt;/h4&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;__name__&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;__main__&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# 테스팅 코드
&lt;/span&gt;    &lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;imread_from_url&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;imread_from_url&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;model_path&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;../models/yolov8n-seg.onnx&quot;&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;yoloseg&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;YOLOSeg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model_path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;conf_thres&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.7&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;iou_thres&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;img_url&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;https://live.staticflickr.com/13/19041780_d6fd803de0_3k.jpg&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;imread_from_url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img_url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Detect Objects
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;yoloseg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Draw detections
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;combined_img&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;yoloseg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;draw_masks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;namedWindow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Model Inference&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WINDOW_NORMAL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imshow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Model Inference&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;combined_img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;waitKey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;“if __name__ == __main__:” 구문은 스크립트를 직접 실행할 때에만 포함된 코드를 실행하도록 하는 파이썬 문법으로, YOLOSeg.py를 호출하여 사용하는 hololens_instance_segmentation.py와 같은 외부 파일에 의해 호출될 때에는 실행되지 않는 코드이다. 나는 이를 테스팅을 목적으로 사용하였다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;utilspy&quot;&gt;utils.py&lt;/h3&gt;
&lt;p&gt;utils.py는 YOLOSeg.py에 의해 사용되는 함수로서, 라이브러리 함수와 같은 구조를 위해 별도로 분리해 놓았다.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;nms&lt;/li&gt;
  &lt;li&gt;compute_iou&lt;/li&gt;
  &lt;li&gt;xywh2xyxy&lt;/li&gt;
  &lt;li&gt;sigmoid&lt;/li&gt;
  &lt;li&gt;draw_detections&lt;/li&gt;
  &lt;li&gt;draw_masks&lt;/li&gt;
  &lt;li&gt;기타 코드&lt;/li&gt;
&lt;/ol&gt;

&lt;h4 id=&quot;nms&quot;&gt;nms&lt;/h4&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;nms&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scores&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;iou_threshold&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# socre를 기준으로 정렬
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;sorted_indices&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;argsort&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scores&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)[::&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;keep_boxes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sorted_indices&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;size&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# Pick the last box
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;box_id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sorted_indices&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;keep_boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;box_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# 선택한 상자의 iou를 나머지와 함께 계산
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;ious&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;compute_iou&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;box_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sorted_indices&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:],&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:])&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# iou에 따라 임계값을 넘는 박스는 제거
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;keep_indices&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;where&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ious&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;iou_threshold&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# print(keep_indices.shape, sorted_indices.shape)
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;sorted_indices&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sorted_indices&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;keep_indices&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;keep_boxes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;compute_iou&quot;&gt;compute_iou&lt;/h4&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;compute_iou&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;box&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# 각 박스에 대하여 xmin, ymin, xmax, ymax
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;xmin&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;maximum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;box&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;ymin&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;maximum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;box&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;xmax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;minimum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;box&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;ymax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;minimum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;box&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# 교차되는 면 계산
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;intersection_area&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;maximum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;xmax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;xmin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;maximum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ymax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ymin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# 면 통합 계산
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;box_area&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;box&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;box&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;box&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;box&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;boxes_area&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;union_area&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;box_area&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;boxes_area&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;intersection_area&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# iou 계산
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;iou&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;intersection_area&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;union_area&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;iou&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;위 과정과 같이 각 박스에 관하여 중복되는 면적과 전체 면의 비율을 통해 iou를 계산한다. 이 역시 복잡해 보이지만 간단한 구조로 데이터 타입만 유의하면 될 일이었다.&lt;/p&gt;

&lt;h4 id=&quot;xywh2xyxy&quot;&gt;xywh2xyxy&lt;/h4&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;xywh2xyxy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# (x, y, w, h) 차원을 바운딩 박스 좌표인 (x1, y1, x2, y2) 변경
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;dest&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;copy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;dest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[...,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[...,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[...,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;dest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[...,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[...,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[...,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;dest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[...,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[...,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[...,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;dest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[...,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[...,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[...,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;src[…, 0]: 바운딩 박스 중심의 x 좌표&lt;/li&gt;
  &lt;li&gt;src[…, 1]: 바운딩 박스 중심의 y 좌표&lt;/li&gt;
  &lt;li&gt;src[…, 2]: 바운딩 박스의 너비 (width)&lt;/li&gt;
  &lt;li&gt;src[…, 3]: 바운딩 박스의 높이 (height)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;즉 (x, y, w, h)는 src[…, n] n=(0, 1, 2, 3)에 순차적으로 대응된다.&lt;br /&gt;
또한 (x1, y1, x2, y2)는 (바운딩 박스 좌상단 모서리의 x 좌표, 바운딩 박스 좌상단 모서리의 y좌표, 바운딩 박스 우하단 모서리의 x좌표, 바운딩 박스 우하단 모서리의 y좌표)로서 dest[…, n] n=(0, 1, 2, 3)에 대응된다.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dest[..., 0] = src[..., 0] - src[..., 2] / 2
= (바운딩 박스 좌상단 모서리의 x 좌표) = (바운딩 박스 중심의 x좌표) - (바운딩 박스의 너비의 절반)

ex)
src[..., 0] = 4, src[..., 2] = 4일 때,
dest[..., 0] = 4 - 4/2
dest[..., 0] = 2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;위와 같은 방식으로 dest[…, n] n=(0, 1, 2, 3)가 모두 계산된다.&lt;/p&gt;

&lt;p&gt;src[…, 0] = 4, src[…, 2] = 4일 때를 예로 들면,
바운딩 박스 중심의 x 좌표 = (4,y), 바운딩 박스의 너비 = 4이다.
따라서 바운딩 박스 좌상단의 x좌표는 = 바운딩 박스 중심의 x좌표 - (바운딩 박스의 너비/2)&lt;br /&gt;
dest[…, 0] = src[…, 0] - src[…, 2]/2&lt;br /&gt;
4-4/2 = 2이다.&lt;/p&gt;

&lt;p&gt;위와 같은 방식으로, dest[…, n] n=(0, 1, 2, 3)이 모두 계산 되어 아래와 같은 데이터가 dest에 저장된다.&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    dest[..., 0] = 바운딩 박스의 좌상단 x좌표
    dest[..., 1] = 바운딩 박스의 좌상단 y좌표
    dest[..., 2] = 바운딩 박스의 우하단 x좌표
    dest[..., 3] = 바운딩 박스의 우하단 Y좌표
    dest = {(바운딩 박스의 좌상단 x좌표), (바운딩 박스의 좌상단 y좌표), (바운딩 박스의 우하단 x좌표), (바운딩 박스의 우하단 Y좌표)}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;sigmoid&quot;&gt;sigmoid&lt;/h4&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;sigmoid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;exp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Crack_Detection_using_YOLOv8_Instance_Segmentation/assets/118245330/e89c9066-6cba-4ca1-9658-2ef4eb05af30&quot; alt=&quot;sigmoid&quot; /&gt; &lt;br /&gt;
위 그림은 시그모이드 함수식이다. 함수식 그대로 구현하였으며, 시그모이드 함수가 필요할 때 호출되어 사용된다.&lt;br /&gt;
나의 경우 crack과 normal만 구분하는 이진 분류였고, 확률을 0 ~ 1사이로 출력한다는 점에서 데이터 가공에 시그모이드 함수가 좋다고 판단하였다.&lt;/p&gt;

&lt;h4 id=&quot;draw_detections-1&quot;&gt;draw_detections&lt;/h4&gt;
&lt;p&gt;본 함수는 YOLOSeg.py에서 호출하여 사용하는 동명의 함수의 구현 부분이다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;draw_detections&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scores&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;class_ids&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_alpha&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_maps&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;img_height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;img_width&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;size&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img_height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;img_width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.0006&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;text_thickness&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img_height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;img_width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.001&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;mask_img&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;draw_masks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;class_ids&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_alpha&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_maps&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;box&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;score&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;class_id&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;zip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scores&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;class_ids&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;color&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;colors&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;class_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;x1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;box&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;astype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rectangle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mask_img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;label&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;class_names&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;class_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;caption&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;score&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;%&apos;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;th&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getTextSize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;caption&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fontFace&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FONT_HERSHEY_SIMPLEX&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                                      &lt;span class=&quot;n&quot;&gt;fontScale&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;thickness&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;text_thickness&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;th&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;th&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rectangle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mask_img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                      &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;th&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;putText&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mask_img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;caption&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FONT_HERSHEY_SIMPLEX&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;text_thickness&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;LINE_AA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_img&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Parameters&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;image&lt;br /&gt;
detection 처리할 이미지로, 본 프로젝트에선 실시간 비디오 스트리밍으로, 비디오 프레임이 전달된다.&lt;/li&gt;
  &lt;li&gt;boxes&lt;br /&gt;
바운딩 박스들의 좌표가 저장되어 있다.&lt;/li&gt;
  &lt;li&gt;scores&lt;br /&gt;
탐지된 객체의 신뢰도 확률이 저장되어 있다.&lt;/li&gt;
  &lt;li&gt;class_ids&lt;br /&gt;
각 객체의 클래스 id로, 클래스 이름을 참조한다.&lt;/li&gt;
  &lt;li&gt;mask_alpha&lt;br /&gt;
마스킹 되는 영역의 투명도 파라미터로, 0-1 사이 값이며, 0.3으로 초기화 되어 있으므로, 선택적으로 매개변수를 전달하여도 된다.&lt;/li&gt;
  &lt;li&gt;mask_maps=None&lt;br /&gt;
각 객체에 대한 마스크 정보를 담고 있다.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;box&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;score&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;class_id&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;zip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scores&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;class_ids&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;~~&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;본 함수의 핵심은 위에 해당하는 영역이므로, 해당 부분을 집중적으로 살펴 보겠다.&lt;br /&gt;
매개변수로 전달 받은 boxes, scores, class_ids는 배열으로 여러 데이터의 집합이다. 따라서 해당 데이터에서 객체 각각의 데이터를 담기 위해 위와 같은 문법으로 Box, scores, class_id 변수에 데이터를 추출한다.
따라서 for 구문의 첫 번째 턴에서는 boxes[0], scores[0], class_ids[0]이, 두 번째 턴에서는 boxes[1], scores[1], class_ids[1]이 추출되고, 구문 내에서 이를 처리하여 모든 객체에 대한 draw_detections이 완료된다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;n&quot;&gt;color&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;colors&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;class_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;x1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;box&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;astype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rectangle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mask_img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;각 객체의 박스에서 좌표를 추출하고, OpenCV의 rectangle() 함수를 이용해서 박스를 그리고, 클래스에 따라 색상을 다르게 지정하는 코드이다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;n&quot;&gt;label&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;class_names&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;class_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;caption&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;score&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;%&apos;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;th&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getTextSize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;caption&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fontFace&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FONT_HERSHEY_SIMPLEX&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fontScale&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;thickness&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;text_thickness&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;th&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;th&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rectangle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mask_img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;th&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;putText&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mask_img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;caption&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FONT_HERSHEY_SIMPLEX&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;text_thickness&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;LINE_AA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;복잡해 보일 수 있으나, label 변수에 각 객체의 클래스 이름을 저장하고, caption에 클래스 이름과 신뢰도 확률의 백분율을 저장한다.&lt;br /&gt;
이하의 코드는 만든 텍스트 폰트 등을 설정하고, 바운딩 박스에 배치하는 코드이다.&lt;/p&gt;

&lt;h4 id=&quot;draw_masks-1&quot;&gt;draw_masks&lt;/h4&gt;
&lt;p&gt;아래는 draw_detections 함수에서 호출하여 사용하였던 draw_mask 함수이다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;draw_masks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;class_ids&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_alpha&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_maps&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;mask_img&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;copy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;box&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;class_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;enumerate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;zip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;boxes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;class_ids&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;color&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;colors&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;class_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;x1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;box&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;astype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_maps&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rectangle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mask_img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;crop_mask&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_maps&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;newaxis&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;crop_mask_img&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;crop_mask_img&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;crop_mask_img&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;crop_mask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;crop_mask&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;color&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;mask_img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;crop_mask_img&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addWeighted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mask_img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_alpha&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_alpha&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;전체적인 동작 구조는 draw_detections와 거의 동일하므로, 다른 부분만 보도록 하겠다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;n&quot;&gt;mask_img&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;copy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;마스크를 그리기 위하여 원본 이미지를 복사한다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_maps&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;cv2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rectangle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mask_img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;draw_masks는 draw_detections 함수 내에서 호출되어 사용되는데, draw_detections 함수의 매개변수였던 mask_maps가 None으로 초기화 되어 있었기에 
추가적으로 mask_maps를 전달해 준 것이 아니라면, 위 코드가 동작하여 바운딩 박스 전체에 클래스에 따른 색상을 채우게 된다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;n&quot;&gt;crop_mask&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_maps&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;newaxis&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;crop_mask_img&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask_img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;crop_mask_img&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;crop_mask_img&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;crop_mask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;crop_mask&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;color&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;mask_img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;crop_mask_img&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;저장된 마스크맵이 전달되는 경우에는 보다 정밀한 마스크를 그릴 수 있는데, 그 과정은 아래와 같다.&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;mask_maps의 배열의 0번 인덱스 부터 바운딩 박스를 추출한다. 이떄 2차원 배열인 마스크를 RGB 연산 수행을 위해 차우너 추가로 3차원으로 만들어 준다.&lt;/li&gt;
  &lt;li&gt;추출한 이미지에서 바운딩 박스의 영역을 선택한다.&lt;/li&gt;
  &lt;li&gt;마스크를 적용한다.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;이 과정의 핵심 과정은 아래와 같다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;crop_mask_img = crop_mask_img * (1 - crop_mask) + crop_mask * color&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;crop_mask_img * (1 - crop_mask)&lt;/strong&gt;&lt;br /&gt;
crop_mask_img에서 마스크 값이 0인 부분, 즉 바운딩 박스 내에 객체가 아닌 부분은 이미지 원본의 색상을 유지하게 해야 한다. 따라서 마스크의 반전한 (1 - crop_mask)를 사용하여, 마스크가 0인 부분은 1으로 원본 색상과 곱해지게 되므로, 바운딩 박스 내 객체가 아닌 부분은 원본 이미지와 같은 이미지를 띄게 된다.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;*crop_mask&lt;/em&gt;color**&lt;br /&gt;
crop_mask*color는 마스크 값이 1인 부분, 즉 객체가 위치한 부분에 지정된 컬러를 입히는 과정으로, 이를 통해 객체 영역에 색상이 칠해져 마스킹이 된다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;이 두 가지를 더함으로써 바운딩 박스 내에서 객체 영역은 클래스에 따른 지정 색상으로, 그 외 영역은 원본 이미지와 같은 색상을 유지하게 된다.&lt;/p&gt;

&lt;p&gt;최종적으로 해당 이미지를 원본 이미지의 바운딩 박스 영역에 복사하는 방식으로, 원본 이미지의 바운딩 박스 위에 마스킹된 바운딩 박스가 얹혀져 있는 구조를 하게 된다.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;정직원으로 채용된 것은 아니었지만 회사를 나오고 다시 학교 생활에 집중하다 보니, 어수선하기도 바쁘기도 하여 2024-02-01에 작성하기 시작한 게시글을 오늘인 2024-04-11에 완전히 작성하게 되었다.&lt;br /&gt;
이 시리즈도 이제 두 개 정도의 게시글을 다 쓰게 되면 끝날 것 같으니, 이번 시험 기간에 공부가 손에 안 잡히면 글쓰며 머리를 식혀볼까 한다.&lt;/p&gt;

&lt;hr /&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;시작했으면 끝은 봐야지!&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;blockquote&gt;
  &lt;h3 id=&quot;profile&quot;&gt;Profile&lt;/h3&gt;

  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Seong Hun KIM&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Student&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;Dept. of Computer Science Engineering | Yeungnam University, Repulic of Korea&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Convolution_Filter_Application/assets/118245330/37c81d9e-cfb8-4aee-8497-ff1071b2458b&quot; alt=&quot;yu signature&quot; /&gt;&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Phone&lt;/strong&gt; &lt;a href=&quot;tel:010-6685-1140&quot;&gt;010 - 6685 - 1140&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Mail&lt;/strong&gt; &lt;a href=&quot;mailto:tgh7544@naver.com&quot;&gt;tgh7544@naver.com&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;LinkTree&lt;/strong&gt; &lt;a href=&quot;https://linktr.ee/HoonC_corgi&quot;&gt;https://linktr.ee/HoonC_corgi&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</description>
        <pubDate>Thu, 01 Feb 2024 00:00:00 +0000</pubDate>
        <link>https://hoonc-corgi.github.io/2024/02/01/YOLOv8-%EC%BD%98%ED%81%AC%EB%A6%AC%ED%8A%B8-%ED%81%AC%EB%9E%99-%ED%83%90%EC%A7%80-(5)-%ED%99%80%EB%A1%9C%EB%A0%8C%EC%A6%88,-%EB%9E%A9%ED%83%91-%EB%93%B1%EC%97%90%EC%84%9C%EC%9D%98-%EA%B5%AC%EB%8F%99%EC%9D%84-%EC%9C%84%ED%95%9C-%EB%B9%8C%EB%93%9C%EC%97%85%EC%97%90-%EA%B4%80%ED%95%98.html</link>
        <guid isPermaLink="true">https://hoonc-corgi.github.io/2024/02/01/YOLOv8-%EC%BD%98%ED%81%AC%EB%A6%AC%ED%8A%B8-%ED%81%AC%EB%9E%99-%ED%83%90%EC%A7%80-(5)-%ED%99%80%EB%A1%9C%EB%A0%8C%EC%A6%88,-%EB%9E%A9%ED%83%91-%EB%93%B1%EC%97%90%EC%84%9C%EC%9D%98-%EA%B5%AC%EB%8F%99%EC%9D%84-%EC%9C%84%ED%95%9C-%EB%B9%8C%EB%93%9C%EC%97%85%EC%97%90-%EA%B4%80%ED%95%98.html</guid>
        
        
      </item>
    
      <item>
        <title>[프로젝트] Yolov8 콘크리트 크랙 탐지 (4)</title>
        <description>&lt;h1 id=&quot;yolov8-concrete-crack-detection-using-instance-segmentation-4&quot;&gt;&lt;strong&gt;YOLOv8 Concrete Crack Detection using Instance Segmentation #4&lt;/strong&gt;&lt;/h1&gt;
&lt;h2 id=&quot;--about-developing-application&quot;&gt;- About Developing application&lt;/h2&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;review&quot;&gt;Review&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://hoonc-corgi.github.io/2023/11/24/YOLOv8-콘크리트-크랙-탐지-(3)-모델-학습에-관하여.html&quot;&gt;이전 게시글&lt;/a&gt;&lt;br /&gt;
시리즈 게시글 1, 2, 3까지의 여정을 통해 건축물의 균열을 검출하도록 하는 YOLO 모델을 구축하였다.&lt;br /&gt;
또한 초기에 목표인 본 모델을 HoloLens2에서의 구동할 수 있게 하기 위하여 다양한 방법과 시도를 하였으며, 본 게시글부터는 그에 관한 이야기를 풀어갈 것이다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;-inspiration&quot;&gt;🚀 Inspiration&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Convolution_Filter_Application/assets/118245330/b77c4069-9b51-49e1-bc04-dcb6a2aa7609&quot; alt=&quot;HoloLens2&quot; /&gt;
처음 구상했던 아이디어는 AR 기기인 HoloLens2(이하 홀로렌즈)를 착용하고 건물 외벽을 바라보면 모델이 균열을 검출하고, 그 길이나 폭이 측정될 수 있도록 구현하고자 했다.&lt;br /&gt;
이를 위해서는 홀로렌즈에서 AR이 어떠한 매커니즘으로 동작하는지를 분명히 알아야 하는데, 이를 위해서는 홀로렌즈의 하드웨어 스펙에 대한 이해가 필요하다.&lt;br /&gt;
우리가 흔히 혼합현실이라 부르는 기능의 핵심은 ‘&lt;strong&gt;플로팅&lt;/strong&gt;‘(위 사진과 같이 현실 공간 위에 2d 또는 3d 그래픽을 띄우는 것으로 정의하겠다) 기능이 핵심이다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/Hyung-Gunny/Java-teamproject2-ToDoList/assets/118245330/b6b9f69a-2a1f-4127-8180-f3e60e8d250e&quot; alt=&quot;spatial mapping mesh&quot; /&gt;
또 플로팅이 구현되기 위해서는 ‘&lt;strong&gt;Spatial Mapping&lt;/strong&gt;‘이 필수적이며(그래픽을 현실 공간 어디에 띄워야 할 지에 대한 정보가 필요하기 때문이다), 이를 위해서는 ‘&lt;strong&gt;LiDAR&lt;/strong&gt;’ &lt;strong&gt;Sensor&lt;/strong&gt;가 필요하다.
LiDAR는 “Light Detection and Ranging”의 약어로, 레이저 펄스의 반사광을 통해 거리, 공간 왜곡 등을 확인할 수 있도록하는 개념이다.
홀로렌즈 역시 적외선 광원과 인식 센서, depth 카메라 등을 통해 홀로렌즈를 착용한 사용자를 중심으로 주변 공간을 매핑하고 인식한 후 해당 공간 정보에 따라 홀로그램을 매핑하는 방식으로 구동된다.&lt;/p&gt;

&lt;p&gt;또한 이런 하드웨어 데이터를 얻어오고 그래픽으로 표현하기 위해서는 홀로렌즈 앱 배포가 가능한 유니티 엔진과, 홀로렌즈의 백엔드 메소드 등을 사용하여야 했지만 유니티와 C# 모두 해보지 않은 나로서는 시도조차 어려운 일이었다.
구현부터 시작하고 만들어가는 것은 불가능하다고 판단하여서, 구현하고자 했던 것들과 그에 따라 필요한 것이 무엇이 있는지에 대한 계획을 시작하였다.&lt;/p&gt;

&lt;h4 id=&quot;goal&quot;&gt;Goal&lt;/h4&gt;
&lt;ol&gt;
  &lt;li&gt;홀로렌즈를 착용한 상태에서 균열 검출&lt;/li&gt;
  &lt;li&gt;검출된 균열에 대한 길이와 폭 측정&lt;/li&gt;
  &lt;li&gt;균열에 대한 마스킹&lt;/li&gt;
  &lt;li&gt;마스킹한 균열의 영구성 보장&lt;/li&gt;
  &lt;li&gt;균열의 깊이 측정&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;위 네 개의 사항이 처음 생각했던 목표였으며, 이를 구현하기 위한 요구사항은 아래와 같았다.&lt;/p&gt;

&lt;h4 id=&quot;requirements--problems&quot;&gt;Requirements &amp;amp;&amp;amp; Problems&lt;/h4&gt;
&lt;p&gt;1.1. 모델이 탑재된 홀로렌즈 앱 배포
1.1.1. 앱은 홀로렌즈 하드웨어 데이터를 적절히 활용하여야 함.
1.2. 모델은 홀로렌즈의 하드웨어 스펙과 모델 입력 구조의 충돌이 없어야 함.&lt;/p&gt;

&lt;p&gt;2.1. 길이와 폭 측정에 따른 구현 원리 선정이 필요함.&lt;br /&gt;
2.1.1. 삼각측량법
2.1.2. 픽셀 비율을 통한 계산
2.1.3. Bounding Box의 크기를 통한 계산&lt;/p&gt;

&lt;p&gt;3.1. 공간 정보가 필요함.&lt;/p&gt;

&lt;p&gt;4.1. 데이터 베이스 활용
4.2. 앱에 저장, 업데이트하는 구조&lt;/p&gt;

&lt;p&gt;5.1. 균열의 영역 내에서 최대 depth 값을 가지는 지점과 최소 depth값을 가지는 지점을 알아야 함.&lt;/p&gt;

&lt;p&gt;다섯 가지 목표에 대한 요구사항들이 본질적으로 가지는 것은 모두 홀로렌즈의 하드웨어 데이터를 자유롭게 활용할 수 있도록 하는 것이 가장 컸다.&lt;/p&gt;

&lt;p&gt;따라서 계획부터 수립하기 위해 할 수 있는 것은 균열의 길이와 폭을 측정하기 위한 원리를 선정해 주는 것이었다.
나는 일반적으로 거리 측정에 사용하는 삼각 측량법을 가장 먼저 떠올릴 수 있었지만, 이 역시 홀로렌즈의 depth 데이터를 활용하여야 가능한 것이기에 바로 해볼 수 있는 것이 없었다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/Hyung-Gunny/Java-teamproject2-ToDoList/assets/118245330/40164add-766c-4bdb-929d-c90bc573de61&quot; alt=&quot;아이디어 구상&quot; /&gt;
그렇게 위 사진과 같이 엎고 다시 생각해 보며 2.1.2.의 방법을 떠올리게 되었는데, 그 과정은 아래와 같다.&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;500mm 크기의 균열을 가정하여 그림을 준비한다.&lt;/li&gt;
  &lt;li&gt;벽에 준비한 그림을 붙인 후 1m 거리에서 균열을 바라보고 홀로렌즈로 캡처한다.&lt;/li&gt;
  &lt;li&gt;홀로렌즈 캡처 이미지를 통해 한 픽셀당 실측 비율 &lt;strong&gt;‘ppm’&lt;/strong&gt;(pixel per milli meter)을 계산한다.&lt;/li&gt;
  &lt;li&gt;x, y 축에 대하여 최대 크기를 가지는 연속되는 픽셀의 합을 ppm 산출식에 따라 계산하여 길이와 폭을 측정한다.&lt;/li&gt;
  &lt;li&gt;1m 거리에서 실제 균열을 바라보고 캡처한다.&lt;/li&gt;
  &lt;li&gt;균열의 길이와 폭을 측정한다.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;좋은 접근 방법이라고 생각했지만 이 방식에는 가장 큰 문제가 있었다. 실제 현장을 가정한다면, 정확히 1m를 맞추고 균열과 시선을 수평으로 맞추어서 쳐다볼 수 없다는 것이었다.&lt;br /&gt;
모델을 홀로렌즈에서 구동하기를 원하는 것은 균열 검출 시의 ‘핸즈 프리’, 즉 사용성을 높이기 위함인데 이 경우에는 손만 편하자고 사용이 안되는 경우를 만들어 버리는 노릇이었다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/Hyung-Gunny/Java-teamproject2-ToDoList/assets/118245330/cb35a489-5135-4dde-beda-cd40ad242a18&quot; alt=&quot;레퍼런스한 논문&quot; /&gt;
거리의 경우 최초 실행 시 1회 보정 이후 LiDAR Sensor를 통한 자동 보정을 구현할 수 있겠으나, 모든 각도에 대해서 ppm을 구하는 것은 홀로렌즈의 하드웨어를 자유롭게 활용하더라도 불가능할 것이라 느껴졌다(위 사진과 같이 여러 논문들도 찾아보며 일주일을 머리를 싸매고 고민했던 것 같다).&lt;/p&gt;

&lt;p&gt;당시에도 많이 힘들어 하면서 보낸 과정이었고, 정말 많은 시간을 투자하고도 큰 소득은 없어 많이 좌절했던 시기였던 것 같다.&lt;/p&gt;

&lt;p&gt;결국 홀로렌즈를 통해 소규모 단위 기능으로 하나씩 구현해 보기 위해 여러 깃허브와, 홀로렌즈 공식문서 등을 하루에 9시간 가까이 쳐다보며 보내기를 3주를 반복했지만, 다섯 가지 Goal 중에서 처음 생각했던 대로 구현할 수 있는 건 아무것도 없다는 판단이 섰다. &lt;del&gt;눈물이 났다, 그것도 많이..&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;2달 넘게 진행한 프로젝트였기에 이대로 포기할 수는 없었고, 나는 큰 줄기들을 과감히 건드리며 절충안을 마련하였다. 어떻게든 이 프로젝트의 끝을 보고 싶었다.&lt;/p&gt;

&lt;h4 id=&quot;solutions&quot;&gt;Solutions&lt;/h4&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;del&gt;홀로렌즈를 착용한 상태에서 균열 검출&lt;/del&gt; –&amp;gt; 홀로렌즈 비디오 스트림으로 모바일 또는 pc에서 균열 검출&lt;br /&gt;
기존에 홀로렌즈를 착용한 상태에서 균열을 검출한다는 것은 온전히 홀로렌즈 하나만으로 앱에 탑재된 모델을 통해 실시간으로 균열을 검출하고 AR로 볼 수 있도록 하는 것이었다. 즉, 핸즈 프리의 장점과 더불어 개인 작업을 용이하게 하고자 하였다.&lt;br /&gt;
바뀐 목표에서는 핸즈 프리의 장점은 유지하되 사용자가 홀로렌즈를 통해 균열을 검출하게 되면, 홀로렌즈와 통신하는 모바일, pc 등에서 이를 확인할 수 있도록 하여 협업에 용이하게 하고자 하였다. 또한 이렇게 한 번 검출된 균열은 그 마스크를 오브젝트로 생성하여 해당 위치에 픽스하는 방식으로 추후에 점검 및 비교, 관리할 수 있도록 하였다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;del&gt;검출된 균열에 대한 길이와 폭 측정&lt;/del&gt; –&amp;gt; 비디오 스트림을 수신하는 pc/모바일 사이드에서 균열 길이와 폭 측정
이는 그대로 가져가되, 홀로렌즈 하드웨어 데이터를 이용하지 않고, 생성되는 Bounding Box의 크기를 통해 ppm 산출식에 적용하여 계산하되, 각 측정 거리에 대한 보정까지는 최후에 구현해 보기로 하였다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;del&gt;균열에 대한 마스킹&lt;/del&gt; –&amp;gt; 비디오 스트림을 수신하는 pc/모바일 사이드에서 마스킹 처리&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;마스킹한 균열에 대한 영구성 보장
오브젝트 파일로 저장, 유니티로 앱으로 매핑하는 방식 이용, 이부분의 경우 조력을 받았다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;del&gt;균열의 깊이 측정&lt;/del&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;혹자가 “그렇게 할 거면 홀로렌즈 뭐하러 쓰냐?”라고 묻는다면 사실 할 말이 없다. 하지만 현재 할 수 있는 수준으로 목표를 다시 잡고, 달려가는 것이 프로젝트의 끝을 보는 것에 더 도움이 될 것이라 판단하였다, 중간에 포기하는 것보다는 무엇이든 만들어 내는 편이 좋을 것 같아서.&lt;/p&gt;

&lt;p&gt;변경된 목표에 따라 새로 2개의 구조를 구상하였는데, 이는 아래와 같다.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;양방향 통신으로, 홀로렌즈의 비디오 프레임을 PC / Mobile에서 모델에 입력하여 처리하고, 이를 다시 홀로렌즈로 송신하여 2D 이미지로 띄우는 것&lt;/li&gt;
&lt;/ol&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;PC / Mobile&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;TCP&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Video Stream&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;TCP&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;HoloLens2&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;모델 입력&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;비디오 프레임 수신&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&amp;lt;—&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;비디오 프레임 송신&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;홀로렌즈 Personal Video&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;모델 출력&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;비디오 프레임 송신&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;—&amp;gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;비디오 프레임 수신&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;검출된 균열 비디오&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;ol&gt;
  &lt;li&gt;단방향 통신으로, 홀로렌즈 비디오 프레임을 PC/ Mobile에서 모델에 입력하여 처리하고, PC / Mobile에서 확인하는 것&lt;/li&gt;
&lt;/ol&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;PC / Mobile&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;TCP&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Video Stream&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;TCP&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;HoloLens2&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;모델에 처리 후 확인 가능&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;비디오 프레임 수신&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&amp;lt;—&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;비디오 프레임 송신&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;홀로렌즈 Personal Video&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;홀로렌즈에서 동적으로 균열을 검출하고자 했던 초안과 달리 1.과 2. 모두 PC / Mobile 사이드에서 비디오 프레임을 모델에 입력하고, 1.은 이를 다시 홀로렌즈로 송신하여 비디오 프레임을 보이도록 하는 방식이다.
1.은 기존의 초안과 같이 홀로렌즈에서 검출된 것을 직접 확인할 수 있다는 장점이 있지만, 실시간으로 변할 수 있는 사용자의 시야에 몇 초 전에 송신한 비디오 프레임이 중첩되어 보이게 되므로, 되려 현실과의 괴리감이 커져 초기 프로젝트 목적에 맞지 않다고 판단하여, 2.의 구조를 따르기로 결정하였다.&lt;/p&gt;

&lt;p&gt;다음 글을 통해서 그 과정을 이어 가도록 하겠다.&lt;/p&gt;

&lt;hr /&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;가끔은 돌아 가더라도 그 목적지는 잊지 말아야 한다.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;hr /&gt;

&lt;blockquote&gt;
  &lt;h3 id=&quot;profile&quot;&gt;Profile&lt;/h3&gt;

  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Seong Hun KIM&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Student&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;Dept. of Computer Science Engineering | Yeungnam University, Repulic of Korea&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Convolution_Filter_Application/assets/118245330/37c81d9e-cfb8-4aee-8497-ff1071b2458b&quot; alt=&quot;yu signature&quot; /&gt;&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Phone&lt;/strong&gt; &lt;a href=&quot;tel:010-6685-1140&quot;&gt;010 - 6685 - 1140&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Mail&lt;/strong&gt; &lt;a href=&quot;mailto:tgh7544@naver.com&quot;&gt;tgh7544@naver.com&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;LinkTree&lt;/strong&gt; &lt;a href=&quot;https://linktr.ee/HoonC_corgi&quot;&gt;https://linktr.ee/HoonC_corgi&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</description>
        <pubDate>Mon, 29 Jan 2024 00:00:00 +0000</pubDate>
        <link>https://hoonc-corgi.github.io/2024/01/29/YOLOv8-%EC%BD%98%ED%81%AC%EB%A6%AC%ED%8A%B8-%ED%81%AC%EB%9E%99-%ED%83%90%EC%A7%80-(4)-%EC%9D%91%EC%9A%A9-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EA%B0%9C%EB%B0%9C%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC.html</link>
        <guid isPermaLink="true">https://hoonc-corgi.github.io/2024/01/29/YOLOv8-%EC%BD%98%ED%81%AC%EB%A6%AC%ED%8A%B8-%ED%81%AC%EB%9E%99-%ED%83%90%EC%A7%80-(4)-%EC%9D%91%EC%9A%A9-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EA%B0%9C%EB%B0%9C%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC.html</guid>
        
        
      </item>
    
      <item>
        <title>[프로젝트] Yolov8 콘크리트 크랙 탐지 (3)</title>
        <description>&lt;h1 id=&quot;yolov8-concrete-crack-detection-using-instance-segmentation-3&quot;&gt;&lt;strong&gt;YOLOv8 Concrete Crack Detection using Instance Segmentation #3&lt;/strong&gt;&lt;/h1&gt;
&lt;h2 id=&quot;--about-training-the-model&quot;&gt;- About Training the model&lt;/h2&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;review&quot;&gt;Review&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://hoonc-corgi.github.io/2023/11/24/YOLOv8-콘크리트-크랙-탐지-(2)-학습-데이터-셋-준비에-관하여.html&quot;&gt;이전 게시글&lt;/a&gt;&lt;br /&gt;
지난 글에서는 모델 학습에 앞선 데이터 셋 준비에 관한 글을 작성하였다. 데이터 셋이 준비가 완료되면 모델 학습을 수행하면 된다. 다만, 모델의 학습 결과를 보고 반복적으로 데이터 셋 정제 및 보강 &amp;gt; 모델 학습의 과정을 수행해야 하므로, 단 번에 될 수는 없다.&lt;/p&gt;

&lt;hr /&gt;
&lt;h2 id=&quot;history&quot;&gt;History&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://hoonc-corgi.github.io/2023/11/24/YOLOv8-콘크리트-크랙-탐지-(1)-학습-환경-구축에-관하여.html&quot;&gt;학습환경 구축 과정&lt;/a&gt;&lt;br /&gt;
위 링크에 포함된 본 시리즈의 첫 번째 게시글과 같이 학습 환경이 완전히 준비되었다면, 아래 과정에 따라 그저 학습을 수행하기만 하면 된다. &lt;br /&gt;
학습 수행 &amp;gt; 학습 결과 분석 &amp;gt; 데이터 보강 &amp;gt; 학습 수행, 반복. &lt;br /&gt;
본 과정에서 대부분의 시간은 학습 수행에서 소요되기에 학습을 수행함에 있어 사람이 직접 할 수 있는 것은 ‘기다림’이다.&lt;br /&gt;
모델 학습에 있어 GPU의 성능이 크게 영향을 미친다는 사실을 알고 있었음에도 나의 경우 여건이 되지 않아 평소에 사용하던 MacBook Air 2020(Intel)로 처음 학습을 수행하게 되었다. 조언을 하자면, 사양이 좋지 않은 경우라면 모델 학습은 깔끔하게 포기하고 학습된 타인의 모델을 이용해라. &lt;del&gt;절대 나와 같은 멍청한 짓을 하지 않기를 바란다.&lt;/del&gt;&lt;br /&gt;
아래 사진과 같이 나의 경우 6회 이상 학습이 불가하였고, 20분이 소요되었으며 추론 결과, mAP도 의미도 없던 수준이었던 것으로 기억한다(물론 학습 환경과 파라미터만의 문제라기 보다는 낮은 품질의 데이터셋과의 복합적인 결과일 것임을 직감했다).&lt;br /&gt;
학습하다 뻗어버리는 경우가 많았지만, 그럼에도 학습을 기다리며 보낸 시간이 한참인데,, 이과정은 가비지라 판단되어 사진도 많이 남겨 놓지 않았기에 글에 첨부할 수 없음이 아쉬울 따름이다.&lt;/p&gt;

&lt;h3 id=&quot;about-data-set&quot;&gt;About data set&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Crack_Detection_using_YOLOv8_Instance_Segmentation/assets/118245330/13e7c3f4-8571-4c37-84f0-507417c5d721&quot; alt=&quot;초기 모델의 추론 결과&quot; /&gt;
위와 같이 모델의 추론 결과는 처참했다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Crack_Detection_using_YOLOv8_Instance_Segmentation/assets/118245330/b13c6948-c25e-4279-ba20-1edbc750a8af&quot; alt=&quot;초기 학습 결과&quot; /&gt;
 당시에도 단순 하드웨어적인 문제가 아닐 것임을 직감했지만, 구체적으로 무엇이 문제인지 알 수는 없었기에 학습 결과에서 인사이트를 얻고자 하였다.&lt;br /&gt;
YOLO의 경우 학습을 수행하게 되면 결과에 대한 그래프를 자동적으로 그려주기에 분석하기에 매우 용이하다. 이중 train/box_loss 등을 보면, W 형태가 나타나는데 나는 이것이 학습 데이터의 절대적인 부족에 기인하는 것으로 판단하였다. 가령, 최초 학습에는 학습을 진행하여 높은 수치가 나오지만, 이후 추가학습을 통해 점점 보정되기를 반복하며 특정 값에 수렴해야 하지만, 나의 경우 이러한 반복이 일어나지 않았기 때문이다.  당시에 하드웨어적인 제한은 극복할 수 있는 상황이 아니었기 때문에 나는 이러한 문제가 해결되기 전에 앞서 데이터 셋을 늘이고 정제하는 것에 시간을 투자해야 함을 알았다.&lt;br /&gt;
경우에 따라 그것이 오답일지 모르더라도 이처럼 분석에 근거한 접근론은 나를 성장시켜 줄 수 있을 것이라 확신하였다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Crack_Detection_using_YOLOv8_Instance_Segmentation/assets/118245330/d99cfa9d-038d-48a2-86a5-541c93fa5776&quot; alt=&quot;training on roboflow&quot; /&gt;
데이터 셋에 문제가 있다는 것을 확신하기 위해서 &lt;a href=&quot;https://roboflow.com&quot;&gt;roboflow&lt;/a&gt;에서 지원하는 모델 학습 기능을 이용하여 성능을 살펴 보았다. 로보플로우에서 학습된 모델의 mAP 역시 0.45에 못 미치는 수준이었으며, 이것의 loss 그래프와 이전의 학습 결과를 비교하였을 때, 일정 값에 점차 수렴되는 것은 확인할 수 있었으나 조악한 수준인 것에 근거하여 데이터셋에 문제가 있음을 확신하였다. 또한 같은 데이터셋에 대하여 다른 결과를 보였으므로 하드웨어적인 한계와는 별개로 train configuration의 학습 파라미터의 설정에도 문제가 있을 것이라 판단하였다. 이러한 과정을 반복하여 결국 &lt;a href=&quot;https://hoonc-corgi.github.io/2023/11/24/YOLOv8-콘크리트-크랙-탐지-(2)-학습-데이터-셋-준비에-관하여.html&quot;&gt;이전 게시글&lt;/a&gt;과 같은 학습 데이터 셋을 구축하게 된 것이다.&lt;/p&gt;

&lt;h3 id=&quot;parameter&quot;&gt;parameter&lt;/h3&gt;

&lt;p&gt;YOLO 모델의 학습에 있어서 파라미터를 수정하는 방법은 가령, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;train(epoch=100, lr=0.001, batch=16)&lt;/code&gt;와 같이 train() 메소드의 파라미터 값을 주는 방식과, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;train(config = &apos;[YOUR CONFIG FILE].yaml&apos;)&lt;/code&gt;과 같이 모델의 ‘백본’이 저장된 config.yaml 파일에 직접 접근하여 수정하고, 이를 메소드의 파라미터로 지정해 주는 방식이 있다. &lt;br /&gt;
전자의 방식을 선택한다면, 모델은 기본적으로 제공하는 config 파일에서 메소드가 던져 주는 파라미터 값만 변경하고 나머지는 디폴트 값으로 학습을 시작하고, 후자를 선택한다면, config 파일을 직접 작성하며 모든 파라미터를 하나씩 다 정해줄 수 있다는 장점이 있지만, 그만큼 많은 이해도를 필요로 한다는 것에 주의해야 한다.&lt;/p&gt;

&lt;p&gt;나의 경우 기본적으로 제공되는 모델의 파라미터 default 값이 나의 목표에 적합하지 않다고 판단하였기에 이를 직접 수정하기를 택했고, 이때부터 백본에 대한 이해, 각 파라미터의 기능 등에 대해 완전히 이해하기 위해 실패하고 다시 부딪히며 꽤나 많은 고생을 했다. 또 이과정에서 YOLO 메소드의 구동 매커니즘과 프로세스에 대한 전반적인 이해도가 매우 상승했다.&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;역시 나는 머리 깨져가며 부딪히는 게 어울리는 것 같다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Crack_Detection_using_YOLOv8_Instance_Segmentation/assets/118245330/4acbd8cb-c8fe-4138-b5d3-ca9a226e9e3a&quot; alt=&quot;config.yaml default&quot; /&gt;
위는 YOLO의 디폴트 config 파일의 일부이다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Crack_Detection_using_YOLOv8_Instance_Segmentation/assets/118245330/0a1cb5e8-511a-4d2f-a014-e9ab14a6aa46&quot; alt=&quot;config.yaml custom&quot; /&gt;
위는 커스텀 config 파일을 만들던 시기 중 후반부 파일의 일부 내용이다. 모델 학습에 사용되는 하이퍼 파라미터는 수도 없이 많지만, 직접 하나씩 공부하고 사용해 보며 수많은 결과와 조합을 분석하였을 때 유의미한 변화를 줄 수 있는 것은 &lt;strong&gt;optimizer에 사용되는 함수가 무엇인지&lt;/strong&gt;, &lt;strong&gt;learning_rate(lr로 축약)를 학습 결과에 따라 얼마나, 그리고 cos_lr 등 어떤 방식을 선택할 것인지, weight_decay를 얼마나 줄 것인지, drop_out은 적용할 것인지&lt;/strong&gt; 등 일부에 불과하다고 판단하였고, 이는 학습 결과와 환경에 따라 변화를 주되 default 값을 가져가는 것이 유리하다고 판단하였다. 이 과정에서 정말 많은 시간을 보냈던 것 같다. &lt;del&gt;save_dir을 보면 results23이 되기까지 정말 고생이 많았다.&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;p.s. 에포크와 모델의 퍼포먼스가 반드시 비례하지는 않기에 보다 효율적인 피드백과 학습에 소요되는 시간을 줄이기 위해 ‘early_stopping’기법을 사용하여 최종적으로는 epochs = 300, patience = 30으로 주어 30번 이상 학습하여도 좋은 결과가 나오지 않는다면, 학습이 종료되도록 하여 피드백을 수행하였다.&lt;/p&gt;

&lt;p&gt;많은 노력에도 불구하고 파라미터 조작에 따라 큰 성능 향상을 보이지 않아 좌절하던 때에 ‘&lt;strong&gt;ray tune&lt;/strong&gt;‘이라는 것을 알게 되었다. 이는 모델의 하이퍼 파라미터 튜닝을 수행하는 도구로, 여태 내가 한 것을 자동으로 해주는 기능이었다. &lt;del&gt;내심 기뻤지만 정말 허무했다. ㅋㅋㅋ;;&lt;/del&gt;&lt;br /&gt;
당혹스러운 마음을 추스르고 어찌저찌 레이 튜닝까지 수행하였지만, 결과는 더 조악해졌다. 지금 생각해도 공식적으로 배포가 된 도구인데, 정상적으로 사용했을 때 나같은 초심자가 한 것보다 결과가 안 좋을 수가 있는지 의문이다. 막막하면서도 한 편으로는 안도했던 것 같다, 내가 한 것이 아무 의미 없던 것은 아니라는 생각에.&lt;/p&gt;

&lt;p&gt;레이 튜닝을 포기하고는 다시 하이퍼 파라미터 조작을 시도 했고, 결국 내가 할 수 있는 최선의 조합을 찾았다. 더불어 보다 좋은 성능을 위해 시도할 수 있는 방법을 고민하다 &lt;strong&gt;fine_tuning&lt;/strong&gt;이라는 아주 유용한 기능을 찾을 수 있었다. 이는 사전에 학습된 모델에 데이터를 추가하며 가중치를 학습하는 것으로, 개념적으로는 단순해 보일 수 있지만 아주 좋은 효과를 보여 준다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Crack_Detection_using_YOLOv8_Instance_Segmentation/assets/118245330/316515f5-452b-426b-922f-f70132973727&quot; alt=&quot;data analysis&quot; /&gt;
위 사진은 모델에 학습된 데이터가 어떠한 경향을 가지는 지에 대한 인사이트를 제공하는 그래프로, 이 역시 YOLO가 자동으로 그려주는 것이다. 나는 이를 분석하여 모델에 사용된 데이터 셋에서 crack의 대부분이 사진의 중심에만 모여 있다는 점, “height = 0.4 ~ 1.0 &amp;amp;&amp;amp; width = 0.0 ~ 0.6” 구간의 데이터가 부족하다는 점을 파악하고 모델에 이에 대한 데이터를 추가해 주며 모델을 fine tuning 하였다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;final&quot;&gt;Final&lt;/h2&gt;
&lt;h4 id=&quot;environments&quot;&gt;Environments&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;OS: Windows 10&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Mainboard: ASRock B760M Pro RS&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;BIOS: 3.04&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Processor: 13th Gen Intel(R) Core(TM) i5-13500(20 CPUs), ~2.5GHZz&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Memory: 16GB&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;VGA: NVIDIA Gefore RTX 4600 8GB&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;데이터 셋과 다른 학습 환경을 만족할 수준으로 세팅한 후에는 위와 같이 데스크톱 사양까지 맞추어 울며 겨자 먹기로 학습을 수행하였고, 아래와 같이 꽤나 준수한 성능을 최종적으로 얻을 수 있었다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h4 id=&quot;training-start&quot;&gt;Training start!&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Crack_Detection_using_YOLOv8_Instance_Segmentation/assets/118245330/c8dd99eb-6e84-4b95-871e-1eafc37b91c5&quot; alt=&quot;최종 학습 시작&quot; /&gt;
위 사진은 최종 학습의 시작화면이다. &lt;del&gt;지금 봐도 가슴이 뭉클하다..&lt;/del&gt; 사진을 보면 나오는 수많은 단어와 값들은 모두, 하이퍼 파라미터와 그 값이다. config 파일을 확정할 때 optimizer 파라미터의 값으로 처음에는 ‘&lt;strong&gt;Sigmoid&lt;/strong&gt;’ 함수를 사용하였고, 한계를 느껴 시그모이드 함수의 상위 버전인 ‘&lt;strong&gt;momentum&lt;/strong&gt;‘을 사용하였음에도 만족스럽지 않아, 적응적 학습률을 가지는 ‘&lt;strong&gt;rms prop&lt;/strong&gt;‘도 써보았다. 그럼에도 가시적인 성능 향상을 찾기는 쉽지 않았고, 그렇게 momentum과 rms prop의 상위 버전인 ‘&lt;strong&gt;Adam&lt;/strong&gt;’ 함수를 사용하였더니 만족할 수준의 성능을 보였다.&lt;br /&gt;
그야 당연할 것이 momentum과 rms prop은 optimizer를 설명할 때에 가장 보폭, 방향 등의 비유로 표현되는 각 사이드의 대표적인 주자이기에, 두 요소를 혼합한 Adam이 일반적인 상황에서 가장 좋은 성능을 보이는 것은 당위적인 귀결일 것이다.&lt;br /&gt;
다만, 직접 도출한 최적의 결과가 정답인지 확인하기 위해 optimizer를 ‘auto’로 지정하고 학습하였을 때 사용된 그것이 Adam인 것을 보았을 때에는 정답을 찾았다는 것에서 카타르시스도 느꼈지만, “auto” 네 글자면 해결 되었을 문제라는 점, 일반적으로 좋은 성능을 보이는 Adam의 장점이 나에게도 똑같이 적용됨에 따라 특별할 것이라 생각했던 나의 경우 역시 common case에 속하는 것일 뿐이라는 것에서 찝찝한 감정을 함께 느꼈을 때에는 “&lt;em&gt;괜히 어려운 길을 걸었나?&lt;/em&gt;” 싶은 생각이 들기도 하였다. 단순히 코딩 뿐만 아니라 본 경우, CS, 개념 및 이론 공부에 있어서 이러한 딜레마는 매번 생기는 것 같다. 물론 딜레마가 주는 찝찝함보다 고생 후에 얻은 결과가 옳았다는 것이 주는 성취감이 훨씬 크기에 문제되지 않지만 말이다. &lt;del&gt;세상이 너무 편해졌다.&lt;/del&gt;&lt;/p&gt;

&lt;h4 id=&quot;training-result&quot;&gt;Training Result&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Crack_Detection_using_YOLOv8_Instance_Segmentation/assets/118245330/ee588b84-360b-41a7-82e9-b8fce721b72e&quot; alt=&quot;최종 학습 종료&quot; /&gt;
위 사진은 최종 학습이 종료된 시점의 캡처화면이다. 모델이 30 epochs 이상 향상된 결과를 보이지 않아 조기 종료되었고, 결과적으로 52회차 epoch의 모델이 최고 성능을 보였다. 나름 거액을 투자했음에도 82회 에포크를 학습함에 있어 6.631시간이 걸렸다. 밤새 파라미터를 조정하다가 “더 이상은 할 수 있는 게 없다.” 싶은 생각과 함께 학습을 시작하고 컴퓨터에 앉아 잠들었다 깨어나서도 종료되지 않았던 기억이 난다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;results-analysis&quot;&gt;Results Analysis&lt;/h3&gt;
&lt;h4 id=&quot;input--output-shapes-analysis&quot;&gt;input / output shapes analysis&lt;/h4&gt;
&lt;p&gt;아래는 &lt;a href=&quot;https://netron.app&quot;&gt;netron&lt;/a&gt; 앱을 이용하여 학습된 모델의 아키텍처 중 input, output0, output1의 shape에 해당하는 부분만 일부 캡처한 것이다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Crack_Detection_using_YOLOv8_Instance_Segmentation/assets/118245330/2dc9a666-4056-48fa-a21b-337d6604863c&quot; alt=&quot;input shape&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Crack_Detection_using_YOLOv8_Instance_Segmentation/assets/118245330/7547ed00-f13f-4e69-8940-a716f06d0752&quot; alt=&quot;output0 shape&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Crack_Detection_using_YOLOv8_Instance_Segmentation/assets/118245330/e6777a61-1844-44a9-baf3-4eef45d4235c&quot; alt=&quot;output1 shape&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;input shape = (1, 3, 640, 640)&lt;/li&gt;
  &lt;li&gt;output0 shape = (1, 37, 8400)&lt;/li&gt;
  &lt;li&gt;output1 shape = (1, 32, 160, 160)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;이때,&lt;br /&gt;
input shape = (배치 사이즈, RGB, 이미지 크기 x, 이미지 크기 y)&lt;br /&gt;
output0 shape = (배치 사이즈, 각 클래스의 예측값, 탐지 가능한 객체 수)&lt;br /&gt;
output1 shape = (배치 사이즈, 각 마스크 가중치, 마스크 이미지 크기 x, 마스크 이미지 크기 y)&lt;br /&gt;
의 텐서 차원을 의미하며, Bounding Box와 Mask를 그릴 때, Confidence를 출력할 때에도 해당 텐서 차원을 읽어서 처리하는 방식으로 프로세스가 구성된다.
가령, Bounding Box를 그릴 때에는 output0 shape의 1열의 최상위 네 개 값이 되는 x, y, w, h를 이용해서 Bounding Box를 그리며, Confidence는 그것에 후위하는 데이터를 활용하는 방식이다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h4 id=&quot;주요-metric&quot;&gt;주요 Metric&lt;/h4&gt;
&lt;p&gt;모델의 학습 결과는 아래와 같다.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;&lt;strong&gt;구분&lt;/strong&gt;&lt;/th&gt;
      &lt;th&gt;&lt;strong&gt;Box&lt;/strong&gt;&lt;/th&gt;
      &lt;th&gt;&lt;strong&gt;Mask&lt;/strong&gt;&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;Precision&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;0.875&lt;/td&gt;
      &lt;td&gt;0.891&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;Recall&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;0.823&lt;/td&gt;
      &lt;td&gt;0.792&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;mAP 50&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;0.906&lt;/td&gt;
      &lt;td&gt;0.809&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;mAP 50 - 95&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;0.735&lt;/td&gt;
      &lt;td&gt;0.792&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Crack_Detection_using_YOLOv8_Instance_Segmentation/assets/118245330/ff9f0502-b381-44c7-838a-42b32b34d95a&quot; alt=&quot;PR Curve&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Crack_Detection_using_YOLOv8_Instance_Segmentation/assets/118245330/d2c096b4-e7b4-46c3-a641-dd0905ee24ab&quot; alt=&quot;PC Curve&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Precision&lt;br /&gt;
Box_Precision과 Mask_Precision 모두 0.9에 준하는 값으로, 목표였던 정확도 90%에는 못 미치지만 만족할 수 있는 결과였다. 이는 곧 모델이 균열이라고 외친다면, 90%는 균열이라는 것을 의미한다.
다만, 학습된 모델 역시 세상 모든 경우를 다 포함하는 것이 아니라, 제공해 준 학습 데이터 셋의 경향에 가까운 case에 대해서만 그 정확도를 나타내기에 &lt;em&gt;Recall도 함께 높아야 한다는 것이 상당히 중요하다.&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Recall&lt;br /&gt;
일반적으로 Recall은 Precision에 비해 낮을 수 있지만, 그 차이가 커서는 아니 되고, 나는 겪어온 과정에서의 결과와 달리 Box_Recall, Mask_Recall 모두 그것의 Precision과 10% 내의 차이를 가진다는 점에서 만족할 수 있었다(계속 변인들을 조작하며 다시 시도했던 이유의 대부분은 Precision과 Recall 값의 차이가 극명했기 때문이었다).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;mAP&lt;br /&gt;
mAP는 모델의 성능평가에 있어 가장 일반적으로 사용되는 metric으로 모델이 신뢰도 임계값 iou에 대해 보이는 퍼포먼스가 어느 정도인지를 나타낸다. 이는 iou = 0.5(50%)일 때의 mAP인 mAP 50과,iou = 0.5에서 0.95까지 0.05 단위로 점증시켰을 때의 mAP를 평균낸 값인 mAP 50 - 95로 세분화 된다. iou가 높다는 것은 Detection 되는 객체가 적어지지만, 그만큼 더 정확하다는 의미를 가질 수 있지만, 더 정확하게 하고자 Detection 해야 할 객체를 하지 못하게 되는 단점도 있다. 반대로 iou가 낮아질 수록 객체는 더 많이 인식할 수 있지만, 그것이 정확한가에 대한 신뢰도 문제가 생길 수도 있다. 단, iou = 0.5라고 한들 절대 부족한 수치가 아님으로 mAP라고 한다면 mAP 50를 말한다고 이해하면 될 것이다(실제 내가 테스트 하였을 때에도 iou = 50 ~ 60 선이 실세계에서 가장 사용성이 좋다고 느꼈다).&lt;/p&gt;
    &lt;blockquote&gt;
      &lt;p&gt;혹자가 mAP 50과 mAP 50 - 95 중 무엇이 더 좋은지에 대해 묻는다면, 나는 명확한 답변을 내리기 어려울 것이다.&lt;br /&gt;
그럼에도 불구하고, 모든 공학과 기술의 모든 개념에는 이러한 &lt;strong&gt;trade-off&lt;/strong&gt; 관계가 존재하기에, 상황에 따라 유연히 대처할 수 있도록 다양한 metric, 접근론에 대한 고민과 제안은 계속되어야 한다.&lt;br /&gt;
또한 현대 기술과 사회가 급격하게 발전함에 따라 이러한 과제는 더욱 심화될 것이고,&lt;br /&gt;
&lt;em&gt;&lt;strong&gt;나는 그것의 해결이 공학자를 필요로 하는 근본적인 이유라 믿고 있다.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h4 id=&quot;inference&quot;&gt;Inference&lt;/h4&gt;
&lt;p&gt;주요 Metric에 대한 모델의 퍼포먼스는 만족스러운 수준이었다. 그리고 실제로 모델의 예측 결과를 통해 이를 확인해 보았다.&lt;/p&gt;

&lt;p&gt;나는 우선 테스트 데이터셋 일부에 대해 모델이 추론한 결과와 정답을 비교해 보기로 하였다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Crack_Detection_using_YOLOv8_Instance_Segmentation/assets/118245330/574de480-170f-4b40-b65a-006e596b464e&quot; alt=&quot;정답 비교: 좌 - 정답, 우 - 추론 결과&quot; /&gt;&lt;/p&gt;

&lt;p&gt;사진에서 볼 수 있듯 채택한 비교군에 대하여 모델은 훌륭히 task를 해내었다. (0, 1)과 (0, 3)을 비교해 보면, 추가적으로 Mask 하지 않아야 할 부분도 작게나마 Mask 한 경우도 있었지만 용인가능한 수준이었으며, 반면에 정답 사진에서 제대로 Mask 하지 못한 부분을 모델이 보다 깔끔하게 Mask하는 경우도 있었음을 같은 사진과, (2, 3), (3, 3)에서도 확인할 수 있었다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Crack_Detection_using_YOLOv8_Instance_Segmentation/assets/118245330/15a5afdd-645a-41ec-b378-905d493f65e5&quot; alt=&quot;추론 결과&quot; /&gt;&lt;/p&gt;

&lt;p&gt;위 사진은 모델이 테스트 데이터에 대해 예측한 추론 결과 중 일부를 캡처한 화면이다.
사진에서 볼 수 있듯 대부분의 사진 속 Crack을 Detection 하였지만, 일부에 대해서는 Detection 하지 못한 것을 확인할 수 있었다. 테스트 데이터 셋이 하나씩 확인하기에는 어려움이 있기에 추가적인 코드 작성을 통해서 전체 테스트 데이터 셋 중 Crack을 Detection 하지 못한 사진의 개수, 비율을 확인하고자 했다.&lt;/p&gt;

&lt;p&gt;이를 위한 방법론은 간단하게 고민으로 해결할 수 있었는데, 위 사진에서 Task가 정상적으로 수행된 데이터의 경우 Bounding Box와 Mask를 그리기 위한 crack의 위치 값이 필요하다는 점, 그리고 이는 위 사진 속 좌상단에 있는 labels 패키지에 저장된다는 점을 이용하는 것이었다. 아이디어는 Task를 수행하지 못했다면, labels 파일이 생성되지 않았을 것이기에 파일 개수의 차를 통해서 구할 수 있다는 단순한 생각이었다. 현재 상황에서 숫자만 세고 말 것이라면, 단순히 ctrl + a로 개수 확인해서 비교하고 계산만 하면 그만이지만, 추후에도 이를 고도화 하기 위해서는 추가적인 코드를 작성하는 편이 좋을 것이라 판단하였다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;os&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;count_no_detections&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;image_folder&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;label_folder&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    
    &lt;span class=&quot;n&quot;&gt;image_count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;listdir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;image_folder&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;endswith&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;.png&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;.jpg&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;.jpeg&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))])&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;label_count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;listdir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;label_folder&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;endswith&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;.txt&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)])&lt;/span&gt;
    
    &lt;span class=&quot;n&quot;&gt;no_detection_count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;image_count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;label_count&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;detection_success_rate&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;round&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;label_count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;image_count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;no_detection_count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;detection_success_rate&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;save_to_file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filepath&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;no_detection_count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;success_detection_rate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filepath&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;w&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;No detection count: &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;no_detection_count&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Success detection rate: &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;success_detection_rate&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;간단한 코드를 통해 label 파일의 개수와 이미지 파일의 개수를 읽고 차를 구하고 비율을 구하는 방식으로 해결할 수 있었고, 결과는 다음과 같았다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Crack_Detection_using_YOLOv8_Instance_Segmentation/assets/118245330/54325dce-9d2f-46c9-b00b-044f58a44bb2&quot; alt=&quot;detect success rate&quot; /&gt;
전체 테스트 데이터 셋 중 55개의 데이터에 대하여 Task를 수행하지 못하였고, 수행한 데이터의 비율을 81.6%였다. 생각보다 낮은 수치를 보였기에 Task를 수행하지 못한 데이터를 분석하고자 하였다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Crack_Detection_using_YOLOv8_Instance_Segmentation/assets/118245330/f7bc99ef-c345-41a5-8ec7-21070b481bfe&quot; alt=&quot;missing data&quot; /&gt;
위 사진은 miss한 데이터 중 일부를 캡처한 화면이다. 대부분 맨홀, 대리석 자재 바닥에 발생한 크랙 등이었으며, 이는 공공 데이터를 추가하면서 잘못 추가한 데이터였다. 그럼에도 맨홀 뚜껑과 대리석 바닥의 경우 특유의 음각 패턴 등이 들어가는 경우가 많기에 이에 대한 학습도 경우에 따라 필요할 것으로 보이나, 건물 벽면의 균열을 탐지하고자 했던 나의 목표와는 무관하기에 큰 문제가 되지는 않았다.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;가량 두 개의 게시글로 나누어 쓸 법한 분량을 하나의 게시글에 쓰게 된 것 같다. 이제부터는 어플리케이션 영역으로 넘어가서 학습한 모델을 응용하여 만들었던 WebApp과 로컬 프로그램을 통해 HoloLens, Webcam, Youtube, Image 등의 소스를 본 모델로 추론해 보고자 한다.&lt;/p&gt;

&lt;hr /&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;&lt;strong&gt;그럼에도 불구하고,&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;&lt;strong&gt;비로소 나는 해내었다.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;hr /&gt;

&lt;blockquote&gt;
  &lt;h3 id=&quot;profile&quot;&gt;Profile&lt;/h3&gt;

  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Seong Hun KIM&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Student&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;Dept. of Computer Science Engineering | Yeungnam University, Repulic of Korea&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Convolution_Filter_Application/assets/118245330/37c81d9e-cfb8-4aee-8497-ff1071b2458b&quot; alt=&quot;yu signature&quot; /&gt;&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Phone&lt;/strong&gt; &lt;a href=&quot;tel:010-6685-1140&quot;&gt;010 - 6685 - 1140&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Mail&lt;/strong&gt; &lt;a href=&quot;mailto:tgh7544@naver.com&quot;&gt;tgh7544@naver.com&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;LinkTree&lt;/strong&gt; &lt;a href=&quot;https://linktr.ee/HoonC_corgi&quot;&gt;https://linktr.ee/HoonC_corgi&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
        <pubDate>Mon, 29 Jan 2024 00:00:00 +0000</pubDate>
        <link>https://hoonc-corgi.github.io/2024/01/29/YOLOv8-%EC%BD%98%ED%81%AC%EB%A6%AC%ED%8A%B8-%ED%81%AC%EB%9E%99-%ED%83%90%EC%A7%80-(3)-%EB%AA%A8%EB%8D%B8-%ED%95%99%EC%8A%B5%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC.html</link>
        <guid isPermaLink="true">https://hoonc-corgi.github.io/2024/01/29/YOLOv8-%EC%BD%98%ED%81%AC%EB%A6%AC%ED%8A%B8-%ED%81%AC%EB%9E%99-%ED%83%90%EC%A7%80-(3)-%EB%AA%A8%EB%8D%B8-%ED%95%99%EC%8A%B5%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC.html</guid>
        
        
      </item>
    
      <item>
        <title>[프로젝트] Yolov8 콘크리트 크랙 탐지 (2)</title>
        <description>&lt;h1 id=&quot;yolov8-concrete-crack-detection-using-instance-segmentation-2&quot;&gt;&lt;strong&gt;YOLOv8 Concrete Crack Detection using Instance Segmentation #2&lt;/strong&gt;&lt;/h1&gt;
&lt;h2 id=&quot;--about-preparing-a-training-dataset&quot;&gt;- About Preparing a Training Dataset&lt;/h2&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;review&quot;&gt;Review&lt;/h2&gt;

&lt;p&gt;현장실습이 바빠 한동안 글을 쓰지 못했다. 오늘은 지난 게시글의 연장선을 이어 가려 한다.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://hoonc-corgi.github.io/2023/11/24/YOLOv8-콘크리트-크랙-탐지-(1)-학습-환경-구축에-관하여.html&quot;&gt;이전 게시글&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;지난 글에서는 학습을 위한 기본적인 환경 세팅을 진행하였다. 이번 게시글에서는 구체적인 학습 환경과, 학습 이전 데이터 수집 및 정제와 같은 데이터 셋 준비 단계에서 내가 느낀 바와 이해한 것에 대하여 작성해 볼 것이다.&lt;br /&gt;
지금에서야 이렇게 글도 작성하며 다시 복습하고 정리도 할 수 있게 되었지만, 텍스트 ai만 잠깐 공부하고는 급하게 시작한 비전 ai 프로젝트였기 때문에 비전 ai에 대한 근본적인 개념의 이해와 내가 필요로 하는 버전의 YOLO 사용법을 함께 공부해야 했고, 개념을 혼동한다던가, 레퍼런스를 잘못 찾아 5버전의 메소드를 3버전에 사용하면서 “왜 안 되나,,”하며 좌절하고는 했다. &lt;del&gt;되는 게 이상하지 ㅋㅋ&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;기본적으로 YOLO를 사용할 줄 알겠다 싶을 때가 되어서는 가령, 버전마다 상이한 백본 구조나 메소드 구조, 입력 층의 요구 차원들에 대한 이해, backward compaitibility에 막히는 등 YOLOv3부터 v5, v8으로 오기까지 정말 많은 고생을 했다.&lt;br /&gt;
하지만 막히고 다른 방법으로 시도하는 것을 이과정에서 반복하며 체득했기 때문에, 높은 수준은 아님에도 현재 정도의 이해도를 갖게 되듯 하다.  &lt;del&gt;항상 느끼지만 나의 Problem Solving Ability는 들이박고 깨지면서 앞으로 가기인 것 같다.&lt;/del&gt;
이것이야 말로 이 블로그에 쓰면 좋을 이야기들이지만, 당시에는 문서 형태의 기록을 남긴다 거나, 과정 중의 사진을 찍어 놓지는 않았기에 이를 일일이 기억하며 쓰기는 불가능할 것 같다.  &lt;br /&gt;
p.s. 아래는 내 노력의 흔적,,&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Convolution_Filter_Application/assets/118245330/a5de9e4e-610c-4fd0-9c88-b88b12295f74&quot; alt=&quot;노력의 흔적&quot; /&gt;&lt;/p&gt;

&lt;p&gt;여튼 본문을 시작해 보겠다.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;ai 모델 학습에서 필수적인 요소는 아래와 같다.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;모델&lt;/li&gt;
  &lt;li&gt;학습 데이터&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;나도 처음에는 간단하다고 생각했다. 하지만, 프로젝트의 완성에 다가온 현재 시점에서 생각해 보면 이는 지나치게 포괄적이다. 실제로 모델을 활용하기 위해서는&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. 나의 상황에 적절한 모델이 무엇인가를 찾아야 하고,&lt;/strong&gt; &lt;br /&gt;
&lt;strong&gt;2. 어떻게 사용해야 하는지를 알아야 하며,&lt;/strong&gt; &lt;br /&gt;
&lt;strong&gt;3. 어떠한 구조인지를 정확히 이해해야만 한다.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;학습 데이터는 train, valid, test 셋에서의 각 비율을 몇으로 둘 것인지부터가 시작인 것 같지만, 나는 대부분의 시간을 이가 아닌 학습 데이터의 확보 및 정제, 라벨링에서 써야만 했다.&lt;br /&gt;
이렇게 학습이 완료되면, 학습한 모델을 어떻게 사용할 것인지에 대한 application 영역에 다가가지만, 이 단계에서도 복잡한 여러 과정을 거쳐야만 하므로 이부분은 추가적인 글을 통해 작성해 보겠다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;모델-학습&quot;&gt;모델 학습&lt;/h2&gt;
&lt;h4 id=&quot;모델&quot;&gt;모델&lt;/h4&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Convolution_Filter_Application/assets/118245330/b77c4069-9b51-49e1-bc04-dcb6a2aa7609&quot; alt=&quot;HoloLens2&quot; /&gt;&lt;/p&gt;

&lt;p&gt;나는 초기 프로젝트 계획에 따라 Microsoft사의 AR Machine인 HoloLens2에서 이를 구동하길 원했기 때문에 실시간성이 중요했고, 이를 기준으로 모델을 찾아 보았다.&lt;br /&gt;
개중 ultralytics사의 YOLO 모델은 객체 탐지가 빨라 실시간성을 충족하여 부상한 비전 모델으로, YOLO 안에서도 모델의 버전과, 용도에 따른 규모의 차이, 기능인 ‘Task’에 따라 여러 종류로 나뉘었고, 나는 YOLOv3, v5, v8의 Object Detection, Segment Instance, nano, x 모델 등을 직접 사용해 본 후 활용성, 합목적성, 난이도 등을 고려하여 최종적으로 &lt;em&gt;&lt;strong&gt;YOLOv8n-seg&lt;/strong&gt;&lt;/em&gt; 모델을 선택하였다.&lt;/p&gt;

&lt;p&gt;내가 사용한 모델의 이름을 풀어보면, YOLO: 모델 이름, v8: 8버전, n: nano 버전, seg: Instance Segmentation Task를 수행하는 모델임을 의미한다. YOLO 모델 자체에 대한 자세한 사항은 추후에 공부하는 게시글을 정리해서 올리게 되면 다뤄보도록 하겠다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h4 id=&quot;학습-데이터&quot;&gt;학습 데이터&lt;/h4&gt;
&lt;h6 id=&quot;데이터-수집&quot;&gt;데이터 수집&lt;/h6&gt;

&lt;p&gt;최초에는 학습 데이터를 마련하기 위해 직접 사진을 찍으러 다녔다. 건물 지하 주차장의 외벽, 주변의 구축 건물, 현장실습으로 다니는 회사의 벽, 참 많은 곳을 둘러다녔다.&lt;br /&gt;
길을 걸어갈 때에는 보이던 균열들이 막상 찾아보니 많지 않아 고민 하던 중 학과 건물 바로 뒤에 위치한 전기관에 가서 홀로 나름의 데이터 선별을 거쳐 사진을 찍어 오니 28장 쯤 되었다.&lt;br /&gt;
아무리 비전 ai가 처음이었던 나라고 하여도, 이정도 데이터로는 택도 없음을 알고 있었다. 그렇게 잔머리를 굴리던 중 &lt;strong&gt;&lt;em&gt;“사진을 45도 정도만 기울여도 다른 데이터가 아닌가?”&lt;/em&gt;&lt;/strong&gt; 싶은 생각이 들었다.&lt;br /&gt;
아무리 AI라고 한들, 이는 지도 학습이었고, 내가 제공하는 사진을 스스로 기울여 가며 학습을 하는 것은 아니기에 가능하다고 생각했다.&lt;br /&gt;
그렇게 우연히 비전 ai의 &lt;strong&gt;Data preprocessing, 데이터 전처리&lt;/strong&gt; 기법, &lt;strong&gt;Data Augmentations, 데이터 증강&lt;/strong&gt; 기법에 관심을 가지게 되었다.&lt;br /&gt;
처음에는 이것의 활용 여부는 선택이라 생각했지만, 나와 같이 데이터가 부족한 경우나 데이터를 정제해야 할 때 이는 필수적임을 알게 되었다.&lt;br /&gt;
“그러한 경우가 아니라면 선택의 영역인가?” 라고 생각할 수 있지만, 모델의 퍼포먼스를 위해서라도 &lt;strong&gt;&lt;em&gt;&lt;u&gt;대부분의 학습에서 데이터 정제는 필수적이다.&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Convolution_Filter_Application/assets/118245330/bcaf74d3-ccc8-4c0a-a55a-0598253c0ccb&quot; alt=&quot;applying augmentation&quot; /&gt;&lt;/p&gt;

&lt;p&gt;나는 그렇게 28장의 사진과 공공 데이터 일부를 취합하여 roboflow의 기능을 통해 수없이 전처리 -&amp;gt; 증강 -&amp;gt; 임의 학습 -&amp;gt; 평가하며 현재 나의 상황에 최적이라 판단 되는 조합을 찾았다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Convolution_Filter_Application/assets/118245330/b8134eea-6481-49b2-aa61-1b0b765b772c&quot; alt=&quot;data preprocessing&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Preprocessing-Resize&lt;/strong&gt;&lt;br /&gt;
YOLOv8의 경우 640, 640의 크기를 기대하기 때문에, Resize 해주었다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Augmentations&lt;/strong&gt;&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;Flip&lt;/strong&gt;&lt;br /&gt;
데이터를 수집할 때 습관적으로 정방향에 수평을 맞추어 찍은 탓에 수평 수직 대칭을 해 주었다.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Crop&lt;/strong&gt;&lt;br /&gt;
전기관 벽면 데이터를 수집함에 있어서 높이 때문에 정확히 촬영하기 어려운 경우가 있어, 축소하지는 않고, 확대한 사진도 추가해 주었다.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Exposure&lt;/strong&gt;&lt;br /&gt;
전기관의 경우 벽면이 회색인 경우가 많았고, 크랙은 검은색이 대부분이었기에, 노출 값을 조정해 주어 해당 경우에 대한 과적합을 줄일 수 있을 것으로 보았다.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Noise&lt;/strong&gt;&lt;br /&gt;
노이즈의 경우, 라벨링 된 가장자리의 인접 픽셀에 의도적으로 노이즈를 주어, 학습 후에 보다 정밀한 Masking에 도움이 된다. 특히 균열의 경우 규칙적이거나, 선형적이지 않은 가장자리가 많으므로 도움이 될 것으로 보았다.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Mosaic&lt;/strong&gt;&lt;br /&gt;
모자이크는 하나의 이미지를 여러 개의 작은 타일로 조각내어 이를 무작위 재조합하여 학습함으로써 다양한 위치와, 배경, 조명 등의 변수에 대해 안정성을 가질 수 있도록 한다. 다양한 변수들을 학습하기 힘든 소규모 데이터 셋에서 특히 더 큰 효과를 내므로, 이는 나에게 최적이었다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;위 방식으로 3,000장의 데이터 셋을 준비하였다.&lt;/p&gt;

&lt;h6 id=&quot;데이터-라벨링&quot;&gt;데이터 라벨링&lt;/h6&gt;

&lt;p&gt;&lt;strong&gt;Data Labeling&lt;/strong&gt;은 이름 그대로 각 데이터에 레이블링을 해주는 작업이며, 이는 모델의 입장에서는 교과서 정도의 의미를 갖는다. 즉, 모델은 데이터의 label을 통해서 이것이 사람인지, 아닌지 등을 판단하는 것이다.&lt;br /&gt;
이러한 데이터 라벨링은 지도 학습, 분류 모델에서 필수적이며 데이터 라벨링의 퀄리티 또한 모델의 퍼포먼스에 큰 영향을 미친다. 교과서가 잘못 편찬 되었다면, 이를 공부한들 지식이 늘어나지도, 수능 시험을 잘 칠 수도 없는 것과 같이 지극히 당위적인 논리이다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;del&gt;우리의 아이(&lt;strong&gt;AI&lt;/strong&gt;)가 현명하게 자랐으면 싶은 욕심이 있다면, 데이터 라벨링을 신경쓰기 바란다.&lt;/del&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Convolution_Filter_Application/assets/118245330/69be1382-0dd5-4438-a3bc-6aa070c8b64d&quot; alt=&quot;the difference between detection and segmentation&quot; /&gt;&lt;/p&gt;

&lt;p&gt;아무튼 데이터 라벨링은 정말 중요한 작업이다. 또, 동시에 정말 힘들고 어려운 작업이기도 하다. 데이터 라벨링의 방식은 당 모델의 Task에 따라 구분되는데, &lt;u&gt;Task가 Object Detection인 경우에는 특정 클래스의 위치 정보를 담고 있는 &apos;Bounding Box&apos;를, Instance Segmentation인 경우 &apos;Mask&apos; 영역을 그려주어야 한다.&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;가령, 모델에 사람을 학습 시킨다고 가정할 때, 모델은 사람이 나온 해당 이미지 전체가 아닌 이미지 중 사람이 나온 영역을 중심으로 학습하기를 원한다(사람이 나온 사진 자체가 사람은 아니기 때문이다). 때문에 그 영역의 표시는 &lt;u&gt;최소한의 기준점 x, y와 그에 대한 width, height를 통해 만들어지는 최소한의 사각형&lt;/u&gt;으로 이루어지며 최대한 fit하게 잡아주어야 한다. Instance Segmentation을 수행할 때에는 사각형 내에 사람이 아닌 &lt;u&gt;배경 부분은 제거하고 정확히 사람만 학습에 사용하기 위해 누끼를 따기도 하였는데&lt;/u&gt;, 이 사각형과 누끼를 각각 &lt;strong&gt;Bounding Box&lt;/strong&gt;, &lt;strong&gt;Mask&lt;/strong&gt;라 정의했다.&lt;/p&gt;

&lt;p&gt;정말 끔찍한 점은, 모델에 사용할 수천에서 수만 장의 데이터에 일일이 수작업을 진행해야 한다는 것이다. 따라서 최근에는 ai가 부상함에 따라 ‘Labeler’라는 직업이 새로 등장했다는 말도 들을 수 있었다(물론, 그들의 대부분은 회사에 소속된 직원인 경우가 많다).&lt;/p&gt;

&lt;p&gt;처음에는 데이터 부족과 라벨링의 어려움을 이유로, 한국 지능정보 진흥원에서 운영하는 &lt;a href=&quot;https://aihub.or.kr&quot;&gt;ai hub&lt;/a&gt;의 공공 데이터를 사용하려 하였으나, 이는 TensorFlow, Keras 등의 프레임 워크에 적합해 보이는 라벨링 포맷이었고, json에 약한 내가 쓰기에는 어려움이 있었다.&lt;br /&gt;
나는 데이터 라벨링을 위해서, &lt;a href=&quot;https://roboflow.com&quot;&gt;roboflow&lt;/a&gt;의 툴을 이용하여 편하게 작업했다. roboflow와 같은 툴을 이용한다면 이미지에 박스를 그리고, 누끼를 따면 레이블 파일이 생성되지만, 라벨링 툴을 사용하지 않는다면 일일이 모든 사진에 대해 아래와 같은 파일을 작성해야 한다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Convolution_Filter_Application/assets/118245330/72964e14-ffcf-456d-af21-ee0ff76a56bc&quot; alt=&quot;label file&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;cf-&quot;&gt;&lt;strong&gt;&lt;em&gt;cf .&lt;/em&gt;&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Convolution_Filter_Application/assets/118245330/6b880aaa-9b1f-492d-8df2-47b424db0afa&quot; alt=&quot;labeling_after_augmentation&quot; /&gt;&lt;/p&gt;

&lt;p&gt;증강, 라벨링 과정 중에는 반드시 데이터 증강을 거친 후에, 라벨링을 해야 한다. 레이블된 좌표는 이미 생성되었기 때문에 원본 이미지와 동기화 되어 증강되지 않기 때문이다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;data-set-split&quot;&gt;data set split&lt;/h2&gt;
&lt;h4 id=&quot;정의&quot;&gt;정의&lt;/h4&gt;
&lt;p&gt;데이터 확보가 완료되었다면, 이를 모델에 학습시키기 위한 분할을 해야 한다.&lt;br /&gt;
학습에 필요한 데이터는 3가지로 구분된다.&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;train data&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;validation data&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;test data&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;각 데이터의 기능은 다음과 같다.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;train data&lt;/strong&gt;: 모델이 실제로 학습할 데이터로, 데이터 셋에서 가장 큰 비율을 가진다.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;validation data&lt;/strong&gt;: train data를 통해 학습된 모델이 과적합된 것은 아닌지, 모델의 추론 결과가 높은 재현율을 가질 수 있는지에 대한 여부를 판단할 수 있다.&lt;br /&gt;
가령, train data를 학습한 모델의 mAP가 0.98 - 1.0을 보이더라도, validation data에 대한 그것이 낮다면, 이는 &lt;strong&gt;과적합&lt;/strong&gt;(모델이 train data에 대해서 지나치게 학습되어 실제 환경에서의 성능이 떨어지는 경우)을 의심해 보아야 한다(&lt;u&gt;과적합의 대부분은 다양한 변수를 반영하지 못하는 데이터에서 일어나며&lt;/u&gt;, 이는 모델 학습에서 중요한 개념인 ‘&lt;strong&gt;&lt;em&gt;확증 편향&lt;/em&gt;&lt;/strong&gt;‘으로 이어질 수 있다). 이러한 점에서 validation data는 이를 판단하고 해결할 수 있게 하는 인사이트를 제공하기에 정말 중요한 요소이다. 통상적으로 “val_data” 등으로 축약한다. &lt;br /&gt;
&lt;strong&gt;&lt;em&gt;p.s.&lt;/em&gt;&lt;/strong&gt; 처음 ai 공부를 위해 샀던 도서 ‘혼공머신’에서도 ‘cross validation’, ‘검증 점수’ 등의 개념과 함께 강조하는 중요한 개념이다.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;test data&lt;/strong&gt;: 학습된 모델을 평가하기 위한 데이터 셋으로, 전체 데이터 셋에서 가장 작은 비율을 가진다. 전술한 validation data의 추론 결과와 함께 비교하며 과적합 여부에 대해 판단할 수 있다. 모델의 성능 점수와 검증 점수의 차이가 크다면 데이터 셋이 편향되지는 않았는지 검토한 후 epoch, lr(learning rate), activation function 등의 Back Bone(모델의 Cofiguration) 하이퍼 파라미터 튜닝을 시도해 볼 수 있다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;split-비율&quot;&gt;split 비율&lt;/h4&gt;
&lt;p&gt;data set split의 비율은 데이터의 양, 질에 따라서 차이가 날 수 있지만 통상적인 비율은 train : test = 8 : 2, train : val : test = 6 : 3(2) : 1(2) 정도이지만, 가령 100,000장의 전체 data set에서 20%만 test data여도 이는 20,000장이고, 1,000,000장의 2%여도 20,000장이 되므로 단순히 비율로만 고려해서 될 것은 아니다.&lt;/p&gt;

&lt;p&gt;나의 경우 전체 데이터 셋이 3,000장으로 소규모였기 때문에 train : val : test = 7 : 2 : 1의 비율으로 학습량을 늘이되, mAP, Recall이 낮을 때에는 추가적인 코드 작성을 통해 Detection하지 못한 데이터의 특징을 분석하여 데이터를 추가적으로 정제하고, 증강 기법의 변경, 하이퍼 파라미터 튜닝으로 성능 향상을 시도하였다.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;이 과정에서 겪은 어려움과 교착지점, 노력 등에 대한 이야기는 너무 많기에 학습 데이터 준비에 관한 일지는 이정도에서 갈무리 하고, 추후 학습 과정, 결과, 분석, 응용 등의 게시글에서 그때그때 필요한 이야기를 담아보고자 한다.&lt;/p&gt;

&lt;hr /&gt;

&lt;blockquote&gt;
  &lt;p&gt;역시 정도(正道)만이 살 길이다.
천천히, 그리고 꾸준히 걸어라!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;hr /&gt;

&lt;blockquote&gt;
  &lt;h3 id=&quot;profile&quot;&gt;Profile&lt;/h3&gt;

  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Seong Hun KIM&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Student&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;Dept. of Computer Science Engineering | Yeungnam University, Repulic of Korea&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;&lt;img src=&quot;https://github.com/HoonC-corgi/Convolution_Filter_Application/assets/118245330/37c81d9e-cfb8-4aee-8497-ff1071b2458b&quot; alt=&quot;yu signature&quot; /&gt;&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Phone&lt;/strong&gt; &lt;a href=&quot;tel:010-6685-1140&quot;&gt;010 - 6685 - 1140&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Mail&lt;/strong&gt; &lt;a href=&quot;mailto:tgh7544@naver.com&quot;&gt;tgh7544@naver.com&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;LinkTree&lt;/strong&gt; &lt;a href=&quot;https://linktr.ee/HoonC_corgi&quot;&gt;https://linktr.ee/HoonC_corgi&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</description>
        <pubDate>Thu, 18 Jan 2024 00:00:00 +0000</pubDate>
        <link>https://hoonc-corgi.github.io/2024/01/18/YOLOv8-%EC%BD%98%ED%81%AC%EB%A6%AC%ED%8A%B8-%ED%81%AC%EB%9E%99-%ED%83%90%EC%A7%80-(2)-%ED%95%99%EC%8A%B5-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%85%8B-%EC%A4%80%EB%B9%84%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC.html</link>
        <guid isPermaLink="true">https://hoonc-corgi.github.io/2024/01/18/YOLOv8-%EC%BD%98%ED%81%AC%EB%A6%AC%ED%8A%B8-%ED%81%AC%EB%9E%99-%ED%83%90%EC%A7%80-(2)-%ED%95%99%EC%8A%B5-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%85%8B-%EC%A4%80%EB%B9%84%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC.html</guid>
        
        
      </item>
    
  </channel>
</rss>
