<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://ts-logic.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://ts-logic.github.io/" rel="alternate" type="text/html" /><updated>2026-04-17T10:03:53+09:00</updated><id>https://ts-logic.github.io/feed.xml</id><title type="html">TS Logic: Vision Engineering Note</title><subtitle>Software Engineer at LG Electronics Vehicle Solution</subtitle><author><name>TS Logic</name></author><entry><title type="html">카메라 Bring-up 전체 프로세스 정리: 센서 초기화부터 영상 출력까지</title><link href="https://ts-logic.github.io/2026/04/17/camera-bring-up/" rel="alternate" type="text/html" title="카메라 Bring-up 전체 프로세스 정리: 센서 초기화부터 영상 출력까지" /><published>2026-04-17T00:00:00+09:00</published><updated>2026-04-17T00:00:00+09:00</updated><id>https://ts-logic.github.io/2026/04/17/camera-bring-up</id><content type="html" xml:base="https://ts-logic.github.io/2026/04/17/camera-bring-up/"><![CDATA[<p>임베디드 시스템 개발에서 <strong>카메라 Bring-up</strong>은 하드웨어 제어, 데이터 전송 프로토콜, 커널 드라이버 및 미들웨어까지 아우르는 고난도 작업입니다. 새로운 카메라 센서를 보드에 붙였을 때, 화면이 나오기까지의 전체적인 흐름을 단계별로 정리해 보겠습니다.</p>

<hr />

<h2 id="1-하드웨어-점검-physical-layer">1. 하드웨어 점검 (Physical Layer)</h2>

<p>소프트웨어 설정을 하기 전, 물리적인 연결이 정상인지 확인하는 것이 첫 번째입니다.</p>

<ul>
  <li><strong>전원(Power):</strong> 센서가 요구하는 전압(AVDD, DVDD, IOVDD)이 데이터시트 기준에 맞게 공급되는지 확인합니다.</li>
  <li><strong>클록(MCLK):</strong> 센서의 메인 클록 신호가 정상적으로 입력되는지 체크합니다.</li>
  <li><strong>리셋 및 파워다운(Reset/PWDN):</strong> 제어 핀의 논리 레벨(High/Low)이 드라이버 상에서 반대로 설정되지 않았는지 확인합니다.</li>
</ul>

<hr />

<h2 id="2-제어-인터페이스-확인-i2c-communication">2. 제어 인터페이스 확인 (I2C Communication)</h2>

<p>카메라 센서의 레지스터를 설정하기 위해 I2C 통신이 먼저 성공해야 합니다.</p>

<ul>
  <li><strong>Slave Address:</strong> 센서의 I2C 주소가 맞는지 확인합니다.</li>
  <li><strong>Chip ID Read:</strong> 드라이버 로드 시 가장 먼저 수행하는 작업입니다. 센서 내부의 고유 ID 레지스터를 읽어 통신이 정상임을 확신할 수 있습니다. 만약 여기서 실패한다면 전원이나 I2C 라인의 풀업(Pull-up) 저항 등을 의심해야 합니다.</li>
</ul>

<hr />

<p><img src="/assets/images/posts/camera-sensor-mipi.webp" alt="AI로 생성한 미래형 카메라 센서와 SoC 간의 MIPI 데이터 전송 개념도" style="max-width: 75%;" /></p>

<h2 id="3-데이터-전송-인터페이스-설정-mipi-csi-2--dvp">3. 데이터 전송 인터페이스 설정 (MIPI CSI-2 / DVP)</h2>

<p>이미지 데이터를 전송하기 위한 통로를 설정합니다. 요즘은 대부분 <strong>MIPI CSI-2</strong> 인터페이스를 사용합니다.</p>

<ul>
  <li><strong>Lane 설정:</strong> 데이터 레인(Lane)의 개수(1, 2, 4 lane 등)를 맞춥니다.</li>
  <li><strong>D-PHY/C-PHY:</strong> 인터페이스 물리 계층 규격을 일치시킵니다.</li>
  <li><strong>Pixel Format:</strong> RAW8, RAW10, RAW12, YUV422 등 전송 포맷을 정의합니다.</li>
</ul>

<hr />

<h2 id="4-커널-드라이버-및-dtb-설정-software-layer">4. 커널 드라이버 및 DTB 설정 (Software Layer)</h2>

<p>리눅스 환경이라면 <strong>Device Tree(DTS)</strong>와 <strong>V4L2(Video for Linux 2)</strong> 프레임워크를 이해해야 합니다.</p>

<ol>
  <li><strong>Device Tree:</strong> 센서의 I2C 주소, 클록 주파수, GPIO 핀, 포트 노드(MIPI 연결 정보)를 기술합니다.</li>
  <li><strong>Sensor Driver:</strong> V4L2 서브디바이스로 등록되며, 센서 초기화 시퀀스(Register Setting)를 포함합니다.</li>
  <li><strong>Host Controller Driver:</strong> AP(Application Processor) 측의 MIPI 수신기 및 ISP(Image Signal Processor) 드라이버입니다.</li>
</ol>

<hr />

<h2 id="5-센서-설정-및-초기화-시퀀스-initialization">5. 센서 설정 및 초기화 시퀀스 (Initialization)</h2>

<p>센서 제조사에서 제공하는 레지스터 설정값(Setting Sheet)을 드라이버에 반영합니다.</p>

<ul>
  <li><strong>Resolution &amp; FPS:</strong> 해상도와 프레임 레이트를 결정합니다.</li>
  <li><strong>Exposure &amp; Gain:</strong> 초기 노출값과 게인값을 설정합니다.</li>
  <li><strong>Test Pattern:</strong> 데이터 라인 전송에 문제가 없는지 확인하기 위해 센서 자체에서 제공하는 컬러바(Color Bar) 패턴을 먼저 띄워보는 것이 좋습니다.</li>
</ul>

<hr />

<h2 id="6-영상-파이프라인-구성-v4l2-framework">6. 영상 파이프라인 구성 (V4L2 Framework)</h2>

<p>하드웨어 연결이 끝났다면 소프트웨어에서 데이터를 받아올 준비를 합니다.</p>

<ul>
  <li><strong>Media Controller:</strong> 센서 -&gt; MIPI Rx -&gt; ISP -&gt; Memory로 이어지는 파이프라인을 링크(Link)합니다.</li>
  <li><strong>V4L2-CTL:</strong> 커맨드라인 도구를 사용하여 스트리밍을 시작해 봅니다.
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="c"># 예시 명령: 프레임 캡처 테스트</span>
  v4l2-ctl <span class="nt">--device</span> /dev/video0 <span class="nt">--stream-mmap</span> <span class="nt">--stream-count</span><span class="o">=</span>1 <span class="nt">--stream-to</span><span class="o">=</span>test.raw
</code></pre></div>    </div>
  </li>
</ul>

<hr />

<h2 id="7-이미지-튜닝-및-출력-isp-tuning">7. 이미지 튜닝 및 출력 (ISP Tuning)</h2>

<p>영상이 화면에 나오더라도 색감이 이상하거나 노이즈가 많을 수 있습니다. 이때 ISP 튜닝이 필요합니다.</p>

<ul>
  <li><strong>Black Level Correction (BLC)</strong></li>
  <li><strong>Lens Shading Correction (LSC)</strong></li>
  <li><strong>White Balance (AWB) &amp; Auto Exposure (AE)</strong></li>
  <li><strong>Demosaicing:</strong> RAW 데이터를 RGB/YUV로 변환합니다.</li>
</ul>

<hr />]]></content><author><name>TS Logic</name></author><category term="Vision Engineering" /><category term="Bring-up" /><category term="Camera Sensor" /><category term="MIPI" /><category term="I2C" /><category term="ISP" /><category term="V4L2" /><category term="Driver" /><summary type="html"><![CDATA[임베디드 시스템에서 카메라 센서를 활성화하고 영상을 출력하기까지의 하드웨어/소프트웨어 Bring-up 단계별 흐름을 상세히 알아봅니다.]]></summary></entry><entry><title type="html">OpenAI와 LangChain으로 AI 시인 만들기</title><link href="https://ts-logic.github.io/2026/03/28/AI-Poet/" rel="alternate" type="text/html" title="OpenAI와 LangChain으로 AI 시인 만들기" /><published>2026-03-28T21:00:00+09:00</published><updated>2026-03-28T21:00:00+09:00</updated><id>https://ts-logic.github.io/2026/03/28/AI%20Poet</id><content type="html" xml:base="https://ts-logic.github.io/2026/03/28/AI-Poet/"><![CDATA[<p>인공지능 시인을 만들고 웹 서비스로 배포하는 과정을 정리합니다.</p>

<h2 id="1-보안-설정-env">1. 보안 설정 (.env)</h2>
<p>API 키 유출 방지를 위해 .env 파일을 사용합니다. 
pip install python-dotenv 설치 후 루트 폴더에 생성하세요.</p>

<ul>
  <li>파일명: .env</li>
  <li>내용: OPENAI_API_KEY=your_key_here</li>
</ul>

<h2 id="2-핵심-코드-langchain--streamlit">2. 핵심 코드 (LangChain &amp; Streamlit)</h2>
<p>LangChain의 Chat Model을 활용해 시 작성 로직을 구현하고, Streamlit으로 UI를 만듭니다.</p>

<ul>
  <li>설치: pip install langchain-openai streamlit</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">streamlit</span> <span class="k">as</span> <span class="n">st</span>
<span class="kn">from</span> <span class="nn">dotenv</span> <span class="kn">import</span> <span class="n">load_dotenv</span>
<span class="kn">from</span> <span class="nn">langchain_openai</span> <span class="kn">import</span> <span class="n">ChatOpenAI</span>

<span class="n">load_dotenv</span><span class="p">()</span>
<span class="n">chat_model</span> <span class="o">=</span> <span class="n">ChatOpenAI</span><span class="p">(</span><span class="n">model</span><span class="o">=</span><span class="s">"gpt-3.5-turbo"</span><span class="p">)</span>

<span class="n">st</span><span class="p">.</span><span class="n">title</span><span class="p">(</span><span class="s">"AI 시인 서비스"</span><span class="p">)</span>
<span class="n">topic</span> <span class="o">=</span> <span class="n">st</span><span class="p">.</span><span class="n">text_input</span><span class="p">(</span><span class="s">"시의 주제를 입력하세요"</span><span class="p">)</span>

<span class="k">if</span> <span class="n">st</span><span class="p">.</span><span class="n">button</span><span class="p">(</span><span class="s">"시 작성"</span><span class="p">):</span>
    <span class="n">result</span> <span class="o">=</span> <span class="n">chat_model</span><span class="p">.</span><span class="n">invoke</span><span class="p">(</span><span class="n">topic</span> <span class="o">+</span> <span class="s">"에 대한 시를 써줘."</span><span class="p">)</span>
    <span class="n">st</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="n">result</span><span class="p">.</span><span class="n">content</span><span class="p">)</span>
</code></pre></div></div>

<h3 id="3-비용-및-보안-대안-llama2-활용">3. 비용 및 보안 대안 (Llama2 활용)</h3>

<p>OpenAI API의 비용이 부담되거나 데이터 보안이 중요하다면, 로컬 환경에서 <strong>Llama2</strong>를 사용하는 것을 추천합니다.</p>

<ul>
  <li><strong>비용 측면</strong>:
    <ul>
      <li>OpenAI: 유료 (사용량에 따른 API 과금)</li>
      <li>Llama2: <strong>무료</strong> (본인 컴퓨터 자원 사용)</li>
    </ul>
  </li>
  <li><strong>보안 측면</strong>:
    <ul>
      <li>OpenAI: 외부 서버로 데이터 전송 필요</li>
      <li>Llama2: <strong>로컬 환경에서만 처리</strong> (데이터 유출 위험 없음)</li>
    </ul>
  </li>
  <li><strong>네트워크 연결</strong>:
    <ul>
      <li>OpenAI: 인터넷 연결 필수</li>
      <li>Llama2: <strong>오프라인 환경에서도 작동 가능</strong></li>
    </ul>
  </li>
  <li><strong>성능 및 사양</strong>:
    <ul>
      <li>OpenAI: 매우 뛰어난 추론 성능</li>
      <li>Llama2: 모델 크기에 따라 차이가 있으며, 로컬 PC 사양에 영향을 받음</li>
    </ul>
  </li>
</ul>

<hr />
<blockquote>
  <p><strong>💡 팁</strong>: 로컬 LLM을 처음 시작하신다면 <strong>Ollama</strong>라는 도구를 설치해 보세요. LangChain의 <code class="language-plaintext highlighter-rouge">ChatOllama</code> 모듈을 사용하면 코드 한 줄만 바꿔서 바로 Llama2로 교체할 수 있습니다.</p>
</blockquote>]]></content><author><name>TS Logic</name></author><category term="Daily Study" /><category term="LangChain" /><category term="OpenAI" /><category term="Streamlit" /><category term="Llama2" /><summary type="html"><![CDATA[인공지능 시인을 만들고 웹 서비스로 배포하는 과정을 정리합니다.]]></summary></entry><entry><title type="html">OpenAI vs Gemini: 수익형 AI 에이전트 개발을 위한 API 완벽 비교</title><link href="https://ts-logic.github.io/2026/03/28/Building-AI-Agent-with-Gemini-API/" rel="alternate" type="text/html" title="OpenAI vs Gemini: 수익형 AI 에이전트 개발을 위한 API 완벽 비교" /><published>2026-03-28T21:00:00+09:00</published><updated>2026-03-28T21:00:00+09:00</updated><id>https://ts-logic.github.io/2026/03/28/Building%20AI%20Agent%20with%20Gemini-API</id><content type="html" xml:base="https://ts-logic.github.io/2026/03/28/Building-AI-Agent-with-Gemini-API/"><![CDATA[<p>최근 IT 업계와 1인 창업가들 사이에서 <strong>‘수익형 AI 에이전트’</strong> 제작 강의가 큰 인기를 끌고 있습니다. 단순한 챗봇을 넘어 스스로 사고하고 행동하는 ‘디지털 직원’을 만드는 시대, 어떤 API를 선택하고 어떻게 시작해야 할까요?</p>

<h2 id="1-2026년-openai-api의-진화">1. 2026년 OpenAI API의 진화</h2>
<p>OpenAI는 단순 텍스트 모델을 넘어 고도의 추론과 컴퓨터 제어가 가능한 플랫폼으로 진화했습니다.</p>

<ul>
  <li><strong>모델 라인업:</strong> 고성능 <strong>GPT-5.4</strong>, 추론 특화 <strong>o-series</strong>, 초고속 저비용 <strong>nano</strong> 모델 등 목적에 따른 세분화.</li>
  <li><strong>핵심 기능:</strong> 모델이 직접 화면을 조작하는 <strong>Computer Use</strong>, 실시간 상호작용을 위한 <strong>Realtime API</strong>.</li>
  <li><strong>비용 전략:</strong> <strong>Context Caching</strong>을 통해 반복되는 입력값에 대한 비용을 최대 90%까지 절감 가능.</li>
</ul>

<h2 id="2-수익형-ai-에이전트가-유행하는-이유">2. 수익형 AI 에이전트가 유행하는 이유</h2>
<p>단순 응답기가 아닌 ‘실행력’을 갖춘 에이전트가 수익 모델과 직결되기 때문입니다.</p>

<ul>
  <li><strong>B2B 자동화:</strong> CS 응대, 견적서 발급, 리드 발굴 등 기업 업무 대행.</li>
  <li><strong>콘텐츠 자동화:</strong> 트렌드 분석부터 블로그/숏폼 대본 생성 및 업로드까지 자동화.</li>
  <li><strong>낮아진 장벽:</strong> <code class="language-plaintext highlighter-rouge">n8n</code>, <code class="language-plaintext highlighter-rouge">Make</code> 같은 노코드 툴과 최신 SDK 덕분에 개발 문턱이 낮아짐.</li>
</ul>

<h2 id="3-gemini-api-에이전트-개발의-강력한-대안">3. Gemini API: 에이전트 개발의 강력한 대안</h2>
<p>구글의 Gemini API는 에이전트 구현 시 OpenAI와는 또 다른 독보적인 강점을 제공합니다.</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left">강점</th>
      <th style="text-align: left">내용</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left"><strong>대용량 컨텍스트</strong></td>
      <td style="text-align: left">2M+(200만) 이상의 토큰 지원. 대규모 문서나 긴 영상을 한 번에 처리.</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>네이티브 멀티모달</strong></td>
      <td style="text-align: left">이미지, 오디오, 영상을 변환 없이 직접 이해하여 처리 속도와 정확도 향상.</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>구글 생태계 연동</strong></td>
      <td style="text-align: left">구글 검색(Grounding), Gmail, Drive 등 워크스페이스와의 유기적 결합.</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>강력한 도구 활용</strong></td>
      <td style="text-align: left"><strong>Function Calling</strong>과 <strong>Code Execution</strong> 기능으로 논리적 문제 해결 능력 탁월.</td>
    </tr>
  </tbody>
</table>

<h2 id="4-gemini로-에이전트-시작하기-3단계">4. Gemini로 에이전트 시작하기 (3단계)</h2>
<ol>
  <li><strong>Google AI Studio (<a href="https://aistudio.google.com">aistudio.google.com</a>):</strong> Gemini 구독 계정으로 로그인하여 API 키 발급.</li>
  <li><strong>도구 설정:</strong> System Instruction을 설정하고 <code class="language-plaintext highlighter-rouge">Google Search</code>나 <code class="language-plaintext highlighter-rouge">Code Execution</code> 기능을 활성화.</li>
  <li><strong>테스트 및 배포:</strong> Python SDK나 Node.js를 활용해 에이전트의 페르소나와 외부 API 연동 로직 구현.</li>
</ol>

<hr />

<h3 id="마치며">마치며</h3>
<p>어떤 API를 선택하든 중요한 것은 <strong>“어떤 반복 업무를 자동화하여 가치를 창출할 것인가”</strong>라는 기획 단계입니다. 특히 Gemini는 구글 도구와의 연동성과 방대한 데이터 처리 능력에서 큰 이점이 있으니, 자신의 프로젝트 성격에 맞춰 선택해 보시길 바랍니다.</p>]]></content><author><name>TS Logic</name></author><category term="Daily Study" /><category term="OpenAI" /><category term="Gemini" /><category term="AIAgent" /><category term="API" /><category term="Automation" /><summary type="html"><![CDATA[최근 IT 업계와 1인 창업가들 사이에서 ‘수익형 AI 에이전트’ 제작 강의가 큰 인기를 끌고 있습니다. 단순한 챗봇을 넘어 스스로 사고하고 행동하는 ‘디지털 직원’을 만드는 시대, 어떤 API를 선택하고 어떻게 시작해야 할까요?]]></summary></entry><entry><title type="html">Twitter Scraper</title><link href="https://ts-logic.github.io/2026/03/21/Twitter-Scraper/" rel="alternate" type="text/html" title="Twitter Scraper" /><published>2026-03-21T00:00:00+09:00</published><updated>2026-03-21T00:00:00+09:00</updated><id>https://ts-logic.github.io/2026/03/21/Twitter%20Scraper</id><content type="html" xml:base="https://ts-logic.github.io/2026/03/21/Twitter-Scraper/"><![CDATA[<h1 id="비동기-프로그래밍의-핵심-asyncio와-async_playwright-이해하기">비동기 프로그래밍의 핵심: asyncio와 async_playwright 이해하기</h1>

<p>오늘 학습한 파이썬 비동기 라이브러리 <code class="language-plaintext highlighter-rouge">asyncio</code>와 웹 자동화 도구인 <code class="language-plaintext highlighter-rouge">async_playwright</code>의 핵심 개념을 정리합니다.</p>

<h2 id="1-asyncio-비동기-프로그래밍의-엔진">1. asyncio (비동기 프로그래밍의 엔진)</h2>
<p><code class="language-plaintext highlighter-rouge">asyncio</code>는 파이썬에서 <strong>비동기(Asynchronous)</strong> 코드를 작성할 수 있게 해주는 표준 라이브러리입니다.</p>

<ul>
  <li><strong>핵심 개념</strong>: I/O 바운드 작업(네트워크 통신, 파일 입출력 등) 시, 결과가 올 때까지 기다리지 않고 다른 작업을 먼저 처리하는 방식입니다.</li>
  <li><strong>주요 키워드</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">async def</code>: 비동기 함수(코루틴) 선언</li>
      <li><code class="language-plaintext highlighter-rouge">await</code>: 비동기 작업 완료 대기 및 제어권 양도</li>
    </ul>
  </li>
  <li><strong>장점</strong>: 대기 시간이 많은 작업에서 전체 실행 시간을 획기적으로 단축할 수 있습니다.</li>
</ul>

<h2 id="2-async_playwright-고성능-웹-자동화-도구">2. async_playwright (고성능 웹 자동화 도구)</h2>
<p><code class="language-plaintext highlighter-rouge">Playwright</code>는 마이크로소프트(MS)에서 개발한 브라우저 자동화 라이브러리로, <code class="language-plaintext highlighter-rouge">async_playwright</code>는 이를 <code class="language-plaintext highlighter-rouge">asyncio</code> 환경에서 사용할 수 있도록 최적화된 버전입니다.</p>

<ul>
  <li><strong>주요 기능</strong>: Chromium, Firefox, WebKit(Safari) 브라우저를 코드로 제어하여 클릭, 입력, 스크롤, 스크린샷 등 수행.</li>
  <li><strong>강점</strong>:
    <ul>
      <li><strong>Auto-wait</strong>: 요소가 나타날 때까지 자동으로 기다려주어 코드가 안정적입니다.</li>
      <li><strong>고성능</strong>: 비동기 기반이라 여러 페이지를 동시에 제어할 때 매우 빠릅니다.</li>
      <li><strong>현대적 웹 대응</strong>: SPA(Single Page Application)와 자바스크립트 비중이 높은 사이트 크롤링에 최적입니다.</li>
    </ul>
  </li>
</ul>

<h2 id="3-요약-비교">3. 요약 비교</h2>

<table>
  <thead>
    <tr>
      <th style="text-align: left">구분</th>
      <th style="text-align: left">asyncio</th>
      <th style="text-align: left">async_playwright</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left"><strong>정체</strong></td>
      <td style="text-align: left">파이썬 표준 비동기 프레임워크</td>
      <td style="text-align: left">비동기 기반 브라우저 자동화 라이브러리</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>역할</strong></td>
      <td style="text-align: left">비동기 흐름 및 이벤트 루프 제어</td>
      <td style="text-align: left">웹 사이트 조작 및 데이터 추출</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>비유</strong></td>
      <td style="text-align: left">일하는 방식을 결정하는 ‘엔진’</td>
      <td style="text-align: left">엔진을 장착한 ‘고성능 자동화 장비’</td>
    </tr>
  </tbody>
</table>

<blockquote>
  <p><strong>결론</strong>: <code class="language-plaintext highlighter-rouge">asyncio</code>라는 비동기 인프라 위에서 <code class="language-plaintext highlighter-rouge">async_playwright</code>라는 강력한 도구를 활용하면, 복잡한 웹 환경에서도 빠르고 효율적인 자동화 시스템을 구축할 수 있습니다.</p>
</blockquote>]]></content><author><name>TS Logic</name></author><category term="Daily Study" /><summary type="html"><![CDATA[비동기 프로그래밍의 핵심: asyncio와 async_playwright 이해하기]]></summary></entry><entry><title type="html">Amazon AI Voice Bot</title><link href="https://ts-logic.github.io/2026/03/20/Amazon-AI-Voice-Bot/" rel="alternate" type="text/html" title="Amazon AI Voice Bot" /><published>2026-03-20T00:00:00+09:00</published><updated>2026-03-20T00:00:00+09:00</updated><id>https://ts-logic.github.io/2026/03/20/Amazon%20AI%20Voice%20Bot</id><content type="html" xml:base="https://ts-logic.github.io/2026/03/20/Amazon-AI-Voice-Bot/"><![CDATA[<h1 id="현대적-웹-자동화-도구-playwright와-chrome-for-testing-이해하기">현대적 웹 자동화 도구: Playwright와 Chrome for Testing 이해하기</h1>

<p>오늘 학습한 <strong>Playwright</strong>의 핵심 개념과 웹 자동화 환경에서 <strong>Chrome for Testing</strong>이 왜 중요한지 정리한 로그입니다.</p>

<h2 id="1-playwright란">1. Playwright란?</h2>
<p><strong>Playwright</strong>는 Microsoft에서 개발한 차세대 오픈소스 웹 브라우저 자동화 라이브러리입니다. Selenium의 뒤를 잇는 강력한 도구로 평가받고 있습니다.</p>

<h3 id="-주요-특징">🚀 주요 특징</h3>
<ul>
  <li><strong>멀티 브라우저 지원:</strong> 하나의 API로 Chromium, Firefox, WebKit(Safari)을 모두 제어할 수 있습니다.</li>
  <li><strong>자동 대기(Auto-wait):</strong> 요소가 나타나거나 클릭 가능해질 때까지 자동으로 기다려주어 ‘Flaky test(불안정한 테스트)’를 방지합니다.</li>
  <li><strong>격리된 컨텍스트:</strong> 브라우저를 매번 새로 띄우지 않고도 독립적인 세션을 빠르게 생성하여 실행 속도가 매우 빠릅니다.</li>
  <li><strong>강력한 도구 모음:</strong> * <code class="language-plaintext highlighter-rouge">codegen</code>: 브라우저 동작을 기록해 코드로 자동 생성
    <ul>
      <li><code class="language-plaintext highlighter-rouge">Inspector</code>: 실행 과정을 한 줄씩 디버깅</li>
      <li><code class="language-plaintext highlighter-rouge">Trace Viewer</code>: 실행 과정과 네트워크 상태를 타임라인으로 복기</li>
    </ul>
  </li>
</ul>

<h2 id="2-웹-크롤링-vs-웹-자동화">2. 웹 크롤링 vs 웹 자동화</h2>
<p>두 개념은 혼용되기도 하지만 목적에 따라 구분됩니다.</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left">구분</th>
      <th style="text-align: left">웹 크롤링 (Web Crawling)</th>
      <th style="text-align: left">웹 자동화 (Web Automation)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left"><strong>목적</strong></td>
      <td style="text-align: left">데이터 수집 (Reading)</td>
      <td style="text-align: left">특정 동작 수행 (Acting)</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>주요 작업</strong></td>
      <td style="text-align: left">텍스트 추출, 이미지 저장, 가격 비교</td>
      <td style="text-align: left">로그인, 글쓰기, 결제, 출석 체크</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Playwright 활용</strong></td>
      <td style="text-align: left">JS로 렌더링되는 동적 데이터 수집</td>
      <td style="text-align: left">복잡한 UI 인터랙션 자동 수행</td>
    </tr>
  </tbody>
</table>

<h2 id="3-chrome-for-testing-cft의-등장-배경">3. Chrome for Testing (CfT)의 등장 배경</h2>
<p>자동화 개발자를 괴롭히던 가장 큰 문제는 <strong>“크롬 브라우저의 자동 업데이트”</strong>였습니다.</p>

<blockquote>
  <p><strong>문제 상황:</strong> 어제까지 잘 작동하던 자동화 코드가 오늘 아침 브라우저 업데이트로 인해 ChromeDriver 버전과 맞지 않아 에러 발생.</p>
</blockquote>

<h3 id="-chrome-for-testing이란">✅ Chrome for Testing이란?</h3>
<p>Google이 오직 <strong>자동화 테스트만을 위해</strong> 별도로 출시한 전용 브라우저입니다.</p>

<ul>
  <li><strong>버전 고정:</strong> 자동 업데이트 기능이 제거되어, 개발자가 지정한 특정 버전을 안정적으로 유지할 수 있습니다.</li>
  <li><strong>독립성:</strong> 일반 사용자가 쓰는 크롬과 별개로 설치되어 서로 영향을 주지 않습니다.</li>
  <li><strong>표시:</strong> 실행 시 상단에 “자동화 테스트용으로 제작되었습니다”라는 안내 문구가 표시됩니다.</li>
</ul>

<h2 id="4-요약-및-결론">4. 요약 및 결론</h2>
<p>현대적인 웹 환경(SPA, React, Vue 등)을 자동화하기 위해서는 <strong>Playwright</strong>가 매우 효율적인 선택지이며, 버전 관리의 고통에서 벗어나기 위해 <strong>Chrome for Testing</strong>과 같은 전용 브라우저 환경을 활용하는 것이 필수적입니다.</p>

<p><strong>Tag:</strong> <code class="language-plaintext highlighter-rouge">#Playwright</code> <code class="language-plaintext highlighter-rouge">#Python</code> <code class="language-plaintext highlighter-rouge">#WebAutomation</code> <code class="language-plaintext highlighter-rouge">#Crawling</code> <code class="language-plaintext highlighter-rouge">#ChromeforTesting</code></p>]]></content><author><name>TS Logic</name></author><category term="Daily Study" /><summary type="html"><![CDATA[현대적 웹 자동화 도구: Playwright와 Chrome for Testing 이해하기]]></summary></entry><entry><title type="html">Uncertainty-Aware Unsupervised Image Deblurring with Deep Residual Prior (CVPR 2023)</title><link href="https://ts-logic.github.io/2023/10/03/Uncertainty-Aware-Unsupervised-Image-Deblurring-with-Deep-Residual-Prior-(CVPR-2023)/" rel="alternate" type="text/html" title="Uncertainty-Aware Unsupervised Image Deblurring with Deep Residual Prior (CVPR 2023)" /><published>2023-10-03T00:00:00+09:00</published><updated>2023-10-03T00:00:00+09:00</updated><id>https://ts-logic.github.io/2023/10/03/Uncertainty-Aware%20Unsupervised%20Image%20Deblurring%20with%20Deep%20Residual%20Prior%20(CVPR%202023)</id><content type="html" xml:base="https://ts-logic.github.io/2023/10/03/Uncertainty-Aware-Unsupervised-Image-Deblurring-with-Deep-Residual-Prior-(CVPR-2023)/"><![CDATA[<p>이미지 디블러는 다음과 같은 컨볼루션 연산으로 표현할 수 있습니다:</p>

<p>[
y=k\otimes x+n
]</p>

<p>위 수식에서 $y$와 $x$는 각각 블러 이미지와 선명한 이미지를 뜻하고, $k$는 블러 커널, $n$은 가우시안 노이즈를 뜻합니다. 커널의 이용 가능성에 따라 디블러 방법은 커널을 모른다고 가정하는 blind 디블러와 커널이 알려졌다고 가정하는 non-blind 디블러 방법으로 구분됩니다. 전형적인 디블러 방법들은 2단계로 진행됩니다: 1) 블러 이미지로부터 블러 커널을 추정하기, 2) 추정된 블러 커널을 통해 선명한 이미지를 복구하기. Non-blind 디블러 방법은 커널에 오류가 없는 경우에만 잘 동작하는 한계가 있습니다.</p>

<p>따라서, 커널 오류 개선을 위해 사전 정보(prior)를 제공하는 semi-blind 방법이 연구되고 있습니다. 이때 사용되는 사전 정보는 hand-crafted와 data-driven 방식으로 구분됩니다. 그러나 각 방식 모두 한계점이 존재합니다.</p>

<p>본 논문에서는 deep residual prior(DRP)라는 dataset-free deep prior를 제안합니다. 이 방법은 학습되지 않은 딥러닝 네트워크를 활용하여 실제 환경에서 발생하는 복잡한 residual을 포착합니다.</p>

<p>먼저, semi-blind 디블러 문제를 수식으로 정리했습니다. 커널 오류와 발생 가능한 아티팩트를 고려했습니다:</p>

<p>[
y=\left ( \hat{k} + \Delta k\right )\otimes x+h+n= \hat{k}\otimes x+r+h+n
]</p>

<p>위 수식에서 $y$와 $x$는 각각 블러 이미지와 선명한 이미지를 뜻하고,  $\hat{k}$와 $\Delta k$는 각각 블러 커널과 커널 오류, $r=\Delta k\otimes x$는 커널 오류로부터 유도된 residual, $h$는 아티팩트를 뜻합니다. 블러 이미지로부터 $x, h, r$을 추정하는 것은 ill-posed problem이므로 선택지를 좁히기 위해서 사전 정보가 필요합니다.</p>

<p>이를 위해 DRP와 sparse prior를 통합하여 $r$, deep image prior(DIP)와 total variation을 통합하여 $x$, sparse prior와 discrete cosine transform(DCT)을 통합하여 $h$의 사전 정보를 얻습니다.</p>

<p>Residual $r$의 복잡한 구조를 유연하고 견고하게 모델링하기 위해 학습되지 않은 딥러닝 네트워크를 활용합니다. 또한, 공간 도메인에서 residual은 sparse 하기 때문에, sparse prior를 DRP의 guide로 활용합니다.</p>

<p>선명한 이미지 $x$의 모델링을 위해 DIP를 활용합니다. DIP는 선명한 이미지의 통계를 이용하기 때문에, zero-shot 시나리오에서 여러 블러들과 이미지를 처리하는데 적합합니다. 또한, local smoothness를 위해 total variation을 DIP의 guide로 활용합니다.</p>

<p>아티팩트 $h$의 모델링을 위해 DCT 도메인에서 sparse prior를 활용합니다. 커널 오류 $\Delta k$ 때문에 발생하는 아티팩트는 edge 주변에서 주기성을 나타내고, 이는 DCT 계수가 sparse 하다는 것을 의미하기 때문입니다.</p>

<p><img src="https://github.com/TheRamji/TheRamji.github.io/assets/46318721/19b4fdb2-dcd2-4d0d-90a3-398ae412cb39" alt="Deep_Residual_Prior" /></p>

<p>DIP 모듈은 랜덤 노이즈 입력 $z_{x}$을 입력받아 이미지를, DRP 모듈은 $z_{r}$를 입력받아 residual을 추정합니다.</p>

<p>정리하면, 본 논문에서는 학습되지 않은 딥러닝 네트워크로 residual을 예측하는 dataset free DRP를 제안했으며, 이를 통해 실제 시나리오에서 여러 블러들과 이미지에 대한 일반화를 가능하게 했습니다. DRP를 활용하여 deep과 hand crafted prior를 포함한 불확실성을 고려한 비지도 학습 이미지 디블러 모델을 제안했습니다.</p>

<p>보다 구체적인 정보를 위해서는 논문 링크를 참고해주세요. 다음은 논문 링크입니다.</p>

<p><a href="https://openaccess.thecvf.com/content/CVPR2023/html/Tang_Uncertainty-Aware_Unsupervised_Image_Deblurring_With_Deep_Residual_Prior_CVPR_2023_paper.html" target="_blank">CVPR 2023 open access</a></p>]]></content><author><name>TS Logic</name></author><category term="Paper Review" /><summary type="html"><![CDATA[이미지 디블러는 다음과 같은 컨볼루션 연산으로 표현할 수 있습니다:]]></summary></entry><entry><title type="html">Generic-to-Specific Distillation of Masked Autoencoders (CVPR 2023)</title><link href="https://ts-logic.github.io/2023/09/05/Generic-to-Specific-Distillation-of-Masked-Autoencoders-(CVPR-2023)/" rel="alternate" type="text/html" title="Generic-to-Specific Distillation of Masked Autoencoders (CVPR 2023)" /><published>2023-09-05T00:00:00+09:00</published><updated>2023-09-05T00:00:00+09:00</updated><id>https://ts-logic.github.io/2023/09/05/Generic-to-Specific%20Distillation%20of%20Masked%20Autoencoders%20(CVPR%202023)</id><content type="html" xml:base="https://ts-logic.github.io/2023/09/05/Generic-to-Specific-Distillation-of-Masked-Autoencoders-(CVPR-2023)/"><![CDATA[<p>Vision transformers (ViTs)는 self-supervised learning 방식으로 대량의 데이터셋을 학습했을 때, 높은 성능으로 주목받았습니다. Pixels, tokens, features 재구성을 학습하는 masked image modeling (MIM)은 large ViT 모델의 성능을 더 끌어올렸습니다.</p>

<p>그러나, small ViT 모델은 self-supervised learning이나 대량의 데이터셋이 주는 장점을 잘 살리지 못했습니다. 따라서, 이 모델은 CNN 모델보다 종종 낮은 성능을 나타냈습니다.</p>

<p>본 논문에서는 generic-to-specific distillation (G2SD)을 통해 lightweight ViT가 teacher로부터 task-agnostic과 task-specific representations를 전달받아, 더 나은 성능을 나타내도록 했습니다. 이때, teacher는 masked autoencoders입니다. Generic과 specific distillation에서 각각 task-agnostic, task-specific features를 전달합니다.</p>

<p><img src="https://github.com/TheRamji/TheRamji.github.io/assets/46318721/dd173074-7e5e-486e-a885-145fe68eb771" alt="Generic_to_Specific" /></p>

<p>Generic distillation에서는 large pre-trained masked autoencoders의 task-agnostic knowledge를 전달합니다. 아래의 수식은 generic distillation loss입니다.</p>

<p>[L_{GD}=\sum_{i\epsilon \left \lbrace V \cup M \right \rbrace}Smooth-\ell_{1}\left ( LN(\hat{z}_{i}^{t}) - z_i^{s} \right )]</p>

<p>$L_{GD}$를 통해 visible tokens $V$의 feature extraction 방법을 학습합니다. 또한, 이 loss를 통해 masked tokens $M$에 대해 context 모델링 방법을 학습합니다.</p>

<p>Specific distillation은 downstream tasks (e.g. image classification, object detection, semantic segmentation)에 최적화된 features를 전달합니다.</p>

<p>[L_{SD}=L_{Task}\left ( f^{s}\left ( x \right ), Y \right )+\beta L_{KD}\left ( f^{s}\left ( x \right ), f^{t}\left ( x \right ) \right )]</p>

<p>이때, teacher model $f^t$는 MAE 방법으로 사전 학습된 뒤에, 특정 task로 fine-tuned 되어있습니다. $L_{Task}$는 task loss function, $L_{KD}$는 task-specific distillation loss를 뜻합니다.</p>

<p>정리하면, 본 논문에서는 사전 학습된 large models로부터 lightweight ViTs로 generic-to-specific distillation을 통해 지식을 전달하는 방법을 제안합니다. 제안하는 방법을 통해 task-agnostic과 task-specific knowledge를 전달합니다.</p>

<p>보다 구체적인 정보를 위해서는 논문 링크를 참고해주세요. 다음은 논문 링크입니다.</p>

<p><a href="https://openaccess.thecvf.com/content/CVPR2023/html/Huang_Generic-to-Specific_Distillation_of_Masked_Autoencoders_CVPR_2023_paper.html" target="_blank">CVPR 2023 open access</a></p>]]></content><author><name>TS Logic</name></author><category term="Paper Review" /><summary type="html"><![CDATA[Vision transformers (ViTs)는 self-supervised learning 방식으로 대량의 데이터셋을 학습했을 때, 높은 성능으로 주목받았습니다. Pixels, tokens, features 재구성을 학습하는 masked image modeling (MIM)은 large ViT 모델의 성능을 더 끌어올렸습니다.]]></summary></entry><entry><title type="html">MaskCLIP: Masked Self-Distillation Advances Contrastive Language-Image Pretraining (CVPR 2023)</title><link href="https://ts-logic.github.io/2023/08/30/MaskCLIP-Masked-Self-Distillation-Advances-Contrastive-Language-Image-Pretraining-(CVPR-2023)/" rel="alternate" type="text/html" title="MaskCLIP: Masked Self-Distillation Advances Contrastive Language-Image Pretraining (CVPR 2023)" /><published>2023-08-30T00:00:00+09:00</published><updated>2023-08-30T00:00:00+09:00</updated><id>https://ts-logic.github.io/2023/08/30/MaskCLIP%20Masked%20Self-Distillation%20Advances%20Contrastive%20Language-Image%20Pretraining%20(CVPR%202023)</id><content type="html" xml:base="https://ts-logic.github.io/2023/08/30/MaskCLIP-Masked-Self-Distillation-Advances-Contrastive-Language-Image-Pretraining-(CVPR-2023)/"><![CDATA[<p>본 논문은 masked self-distillation을 CLIP (contrastive language image pretraining)에 적용한 새로운 기법을 제안합니다. Self-knowledge distillation은 모델 그 자체에서 지식을 증류하여 학습에 활용하는 기법으로, masked self-distillation은 전체 이미지에 대한 representation을 masking된 이미지에 대한 representation으로 증류하는 것입니다. 이 기법은 semantic한 local patch representation 학습에 이점이 있습니다.</p>

<p>Student와 teacher model은 동일한 구조를 갖고 있으며, knowledge는 full image로부터 masked image로 증류됩니다. 다양한 실험을 통해 제안하는 masked self-distillation의 효과를 검증했습니다.</p>

<p><img src="https://github.com/TheRamji/TheRamji.github.io/assets/46318721/faa4dd73-d5e9-452e-8e27-7ee2cc7979b1" alt="MaskCLIP" /></p>

<p>MaskCLIP의 $E_I$는 Vision Transformer (ViT)를 사용합니다. Visual encoder의 학습을 위해 외부의 teacher를 가져오는 것이 아니라, student와 같은 구조를 갖는 mean teacher model을 사용하여 self-distillation을 수행합니다. Teacher의 parameters는 student로부터 exponential moving averages (EMA) 업데이트합니다.</p>

<p>[\bar\theta_t=\alpha\bar\theta_{t-1}+(1-\alpha)\theta_t]</p>

<p>$\alpha$는 smoothing updates를 위한 hyper-parameter입니다. 먼저 input image $I$가 EMA model $\bar{E_I}$ (teacher model)에 입력되고, 랜덤하게 masking 한 뒤에 $E_I$ (student model)에 입력합니다. Masking은 input image의 75% 비중으로 설정합니다.</p>

<p>Masked image modeling을 통해 local patch representation을 학습할 수 있습니다. 본 논문에서 제안하는 masked self-distillation을 통해 더 semantic 한 local patch representation을 학습할 수 있다고 합니다.</p>

<p>한 줄로 요약하면, 본 논문에서는 masked self-distillation을 통해 semantic 한 local patch representation을 학습할 수 있는 MaskCLIP 구조를 제안했습니다.</p>

<p>보다 구체적인 정보를 위해서는 논문 링크를 참고해주세요. 다음은 논문 링크입니다.</p>

<p><a href="https://openaccess.thecvf.com/content/CVPR2023/html/Dong_MaskCLIP_Masked_Self-Distillation_Advances_Contrastive_Language-Image_Pretraining_CVPR_2023_paper.html" target="_blank">CVPR 2023 open access</a></p>]]></content><author><name>TS Logic</name></author><category term="Paper Review" /><summary type="html"><![CDATA[본 논문은 masked self-distillation을 CLIP (contrastive language image pretraining)에 적용한 새로운 기법을 제안합니다. Self-knowledge distillation은 모델 그 자체에서 지식을 증류하여 학습에 활용하는 기법으로, masked self-distillation은 전체 이미지에 대한 representation을 masking된 이미지에 대한 representation으로 증류하는 것입니다. 이 기법은 semantic한 local patch representation 학습에 이점이 있습니다.]]></summary></entry><entry><title type="html">취득한 RGB-NIR 데이터셋에 대한 검증</title><link href="https://ts-logic.github.io/2023/08/29/%EC%B7%A8%EB%93%9D%ED%95%9C-RGB-NIR-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%85%8B%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B2%80%EC%A6%9D/" rel="alternate" type="text/html" title="취득한 RGB-NIR 데이터셋에 대한 검증" /><published>2023-08-29T00:00:00+09:00</published><updated>2023-08-29T00:00:00+09:00</updated><id>https://ts-logic.github.io/2023/08/29/%EC%B7%A8%EB%93%9D%ED%95%9C%20RGB-NIR%20%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%85%8B%EC%97%90%20%EB%8C%80%ED%95%9C%20%EA%B2%80%EC%A6%9D</id><content type="html" xml:base="https://ts-logic.github.io/2023/08/29/%EC%B7%A8%EB%93%9D%ED%95%9C-RGB-NIR-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%85%8B%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B2%80%EC%A6%9D/"><![CDATA[<p>연구실 내에서 자체적으로 취득한 데이터셋을 검증했습니다. 취득한 데이터셋은 NIR-to-RGB와 RGB-to-NIR conversion 연구에 사용됩니다. Public 데이터셋을 사용하지 않고 자체적으로 데이터셋을 취득하는 이유는 다양합니다. 데이터셋을 직접 취득하면, task에 대한 이해도를 높일 수 있습니다. 딥러닝은 데이터 기반으로 학습하기 때문에 데이터를 직접 취득하면서 task에 대한 이해도를 높이는 것이 중요합니다. 또한 연구실에서 새롭게 시도하는 연구에 적합한 public 데이터셋이 없기 때문에 새로운 연구를 위해 데이터셋을 취득하는 과정이 필요합니다.</p>

<p>취득한 데이터셋의 검증 절차는 중요합니다. 데이터가 편향될 가능성이 높으며, 저품질 (예: saturation, blurring)의 영상 데이터가 섞여 있을 수 있습니다. 검증을 위해 한 가지 실험을 진행했습니다. 하나의 네트워크로 다양한 데이터셋을 학습시켜 결과를 비교했습니다.</p>

<p>네트워크는 U-Net으로 선택했습니다. 이 네트워크는 NIR-to-RGB conversion을 수행합니다. 실험에 사용된 데이터셋은 총 5 종류입니다. 자체 취득한 3 종류의 데이터셋과 2 종류의 public 데이터셋으로 구분됩니다.</p>

<p>자체 취득한 3 종류의 데이터셋은 indoor, outdoor, mix입니다. Indoor dataset은 연구실 내에서 카메라의 위치와 설정을 고정하여 물건만 바꿔서 scene을 다양하게 구성하여 취득했습니다. 총 236장입니다. 반면, outdoor dataset은 연구실 밖에서 취득했으며, 카메라의 위치와 설정이 상황에 따라 바뀌며 이에 따라 scene은 다양하게 바뀝니다. 총 269장입니다. 취득한 영상은 white balance가 조정되었고 register는 별도로 진행하지 않았습니다. Mix dataset은 indoor와 outdoor dataset의 혼합입니다.</p>

<p>2종류의 public 데이터셋은 VCIP, RGB-NIR scene입니다. VCIP dataset은 country, field, forest, mountain 총 4개의 클래스로 구성됩니다. 모든 영상의 해상도는 256x256이며, 총 400장입니다. RGB-NIR scene dataset은 VCIP dataset를 구성하는 클래스에 추가적으로 indoor, old building, street, urban, water로 총 9개의 클래스로 구성됩니다. 영상의 해상도는 영상마다 다르며, 총 477장입니다. 취득 후 영상은 white balance와 register되었습니다. 영상이 register가 되었음에도 불구하고, 완벽히 align이 맞지 않습니다.</p>

<p><img src="https://github.com/TheRamji/TheRamji.github.io/assets/46318721/07801df1-8c12-41a9-97c3-2d6de61c1b3e" alt="RGB-NIR scene dataset" width="80%&quot;&quot;,height=&quot;80%&quot;" /></p>

<p>모델 학습을 할 때는 overfitting을 방지하기 위해 validation loss가 30 epoch 동안 감소하지 않으면 학습이 자동으로 종료됩니다(early stopping). 아래 그림은 training loss입니다. 모든 종류의 데이터셋에 대해 epoch가 증가함에 따라 loss가 감소합니다.</p>

<p><img src="https://github.com/TheRamji/TheRamji.github.io/assets/46318721/e07e6a38-0f81-40cc-9682-6b76915f5689" alt="training loss" /></p>

<p>아래 그림은 validation loss입니다. 연구실에서 자체적으로 취득한 데이터셋이 public 데이터셋보다 빠르게 overfitting이 발생합니다.</p>

<p><img src="https://github.com/TheRamji/TheRamji.github.io/assets/46318721/134a33ad-9348-4674-a721-f8a003dfa544" alt="validation loss" /></p>

<p>연구실에서 취득한 데이터셋에 대한 테스트 결과는 다음과 같습니다. 아래 그림은 indoor 데이터셋이며, epoch 51까지 학습한 모델로 예측한 영상입니다.</p>

<p><img src="https://github.com/TheRamji/TheRamji.github.io/assets/46318721/42a9637c-c3ff-4e57-83ec-d451977fee52" alt="Indoor test" width="50%&quot;&quot;,height=&quot;50%&quot;" /></p>

<p>다음은 public 데이터셋에 대한 테스트 결과입니다. 아래 그림은 VCIP 데이터셋이며, epoch 111까지 학습한 모델로 예측한 영상입니다.</p>

<p><img src="https://github.com/TheRamji/TheRamji.github.io/assets/46318721/50380c2a-d648-4d3c-b5fc-96166d6af69b" alt="VCIP test" /></p>

<p>아래 그림은 RGB-NIR scene 데이터셋이며, 80 epoch까지 학습한 모델로 예측한 영상입니다.</p>

<p><img src="https://github.com/TheRamji/TheRamji.github.io/assets/46318721/8f50868f-dc0a-4d9c-a39a-5b813de1b0ae" alt="RGB-NIR scene test" width="50%&quot;&quot;,height=&quot;50%&quot;" /></p>

<p>연구실에서 취득한 데이터셋으로 학습한 모델은 색 복원을 하지 못합니다. 반면, public 데이터셋으로 학습한 모델은 정답 RGB 영상과는 다르지만 그럴듯한 색을 복원하고 있습니다. 연구실에서 취득한 데이터셋이 public 데이터셋에 비해 overfitting이 빠르게 되고 색 복원을 하지 못하는 이유는 데이터셋의 양은 적은데 비해 다양성은 너무 높은 것으로 생각됩니다. 데이터셋의 다양성을 높이기 위해 scene을 구성하는 objects를 다양하게 구성했지만, 이에 따른 개수는 부족합니다. 그래서 모델이 일반화되지 못한 것으로 생각됩니다.</p>

<p>그동안은 모델이 데이터셋을 전부 외워버려 정답과 같은 예측 영상을 출력했던 것으로 생각합니다. 데이터셋을 외우는 성능을 비교하면 되기 때문에 알고리즘 연구는 가능할 수 있습니다. 그러나, 이 모델은 일반화 능력을 갖추지 못합니다. 이러한 이유로 연구실에서 취득한 데이터셋으로 RGB-to-NIR conversion을 수행하는 모델을 학습하여 public 데이터셋으로 NIR을 추정하고자 하면, NIR의 품질이 상당히 나쁩니다. 왜냐하면 모델은 일반화 능력을 갖추지 못했기 때문입니다.</p>

<p>이를 개선하기 위한 세 가지 방법을 생각했습니다. 첫째, 취득한 데이터셋의 다양성은 더 이상 높이지 않고 양을 늘려야 합니다. 데이터 증강 기법을 적용하거나 동일한 object에 대해 다양한 상황에서 추가적으로 취득해야 할 것입니다. 둘째, public 데이터셋에 없는 NIR 영상의 추정이 필요한 경우, public 데이터셋과 유사한 데이터셋을 취득하는 것입니다. 어떤 상황에서도 적용할 수 있는 데이터셋 취득에 시간과 비용이 많이 소요됨으로 target public 데이터셋과 최대한 유사하게 취득해야 할 것 같습니다. 그러나, public 데이터셋에는 ground truth가 없기 때문에 변환 성능을 평가할 방법이 없다는 문제가 있습니다. 마지막은 거대한 데이터셋을 구축하는 것입니다. 이때, 모델은 생성 모델로 구현합니다. 이를 통해, 정답 영상과 동일하게 만드는 모델이 아닌 정답스러운 영상을 생성하는 모델을 구현합니다. 그러나, 얼마나 많은 데이터셋을 취득해야 할지 모르고 생성 모델의 성능을 평가하는 지표가 없다는 문제가 있습니다.</p>

<p>따라서, 알고리즘 개발을 위해서는 데이터셋의 다양성을 제한하는 것이 필요합니다. 그러나 overfitting이 발생할 가능성이 있으므로 모델의 성능 변화를 관찰하기 어려울 수 있습니다. 또한 일반화 성능을 갖추지 못할 것입니다.</p>

<h2 id="참고문헌">참고문헌</h2>
<p>[1] <a href="https://www.epfl.ch/labs/ivrl/research/downloads/rgb-nir-scene-dataset/" target="_blank">RGB-NIR scene dataset</a></p>

<p>[2] <a href="http://www.vcip2020.org/grand_challenge.htm" target="_blank">VCIP dataset</a></p>]]></content><author><name>TS Logic</name></author><category term="Deep Learning" /><summary type="html"><![CDATA[연구실 내에서 자체적으로 취득한 데이터셋을 검증했습니다. 취득한 데이터셋은 NIR-to-RGB와 RGB-to-NIR conversion 연구에 사용됩니다. Public 데이터셋을 사용하지 않고 자체적으로 데이터셋을 취득하는 이유는 다양합니다. 데이터셋을 직접 취득하면, task에 대한 이해도를 높일 수 있습니다. 딥러닝은 데이터 기반으로 학습하기 때문에 데이터를 직접 취득하면서 task에 대한 이해도를 높이는 것이 중요합니다. 또한 연구실에서 새롭게 시도하는 연구에 적합한 public 데이터셋이 없기 때문에 새로운 연구를 위해 데이터셋을 취득하는 과정이 필요합니다.]]></summary></entry><entry><title type="html">Image Data Augmentation for Deep Learning: A Survey (arXiv 2022)</title><link href="https://ts-logic.github.io/2023/08/26/Image-Data-Augmentation-for-Deep-Learning-A-Survey-(arXiv-2022)/" rel="alternate" type="text/html" title="Image Data Augmentation for Deep Learning: A Survey (arXiv 2022)" /><published>2023-08-26T00:00:00+09:00</published><updated>2023-08-26T00:00:00+09:00</updated><id>https://ts-logic.github.io/2023/08/26/Image%20Data%20Augmentation%20for%20Deep%20Learning%20A%20Survey%20(arXiv%202022)</id><content type="html" xml:base="https://ts-logic.github.io/2023/08/26/Image-Data-Augmentation-for-Deep-Learning-A-Survey-(arXiv-2022)/"><![CDATA[<p>Image data augmentation은 딥러닝 모델의 상용화를 위해 학습 데이터의 양과 다양성을 늘려줄 수 있는 중요하고 필수적인 방법입니다. 이 방법은 크게 basic과 advanced 접근법으로 구분할 수 있습니다.</p>

<p><img src="https://github.com/developerTae/developerTae.github.io/assets/46318721/fe34cc31-c04d-4c37-806b-bb20a12874db" alt="Taxonomy" /></p>

<p>첫 번째, basic 접근법에는 image manipulation, image erasing, image mix가 있습니다. Image manipulation은 rotation, flipping, cropping 등과 같은 image 변형과 관련된 기법입니다. Image erasing은 image 내부의 하나 또는 그 이상의 지역을 지우는 기법입니다. Image mix는 두 개 또는 그 이상의 전체 image나 일부 지역을 혼합하는 기법입니다.</p>

<p><img src="https://github.com/developerTae/developerTae.github.io/assets/46318721/c8746890-7fa0-43d0-a903-7e85ec20b02d" alt="Image Manipulation" width="70%&quot;&quot;,height=&quot;70%&quot;" /></p>

<p>두 번째, advanced 접근법에는 auto augment, feature augmentation, deep generative models가 있습니다. 더 향상된 성능을 얻을 수 있는 augmentation 방법을 자동으로 찾는 기법입니다. Augmentation은 노이즈가 있고 추론에 부정적인 영향을 끼칠 수 있다는 단점이 있습니다. 입력 공간에만 augmentation을 적용하던 것을 넘어서, 학습된 feature 공간에 변형을 수행하는 feature augmentation이 있습니다. Data augmentation의 목표는 분포로부터 샘플들을 그려내는 것입니다.</p>

<p>다양한 augmentation 기법들이 성능 향상에 도움이 되지만, 아직 극복해야 하는 문제들이 존재합니다. 먼저, 이 기법에 관한 이론적 연구가 부족하다는 것입니다. 이 기법이 성능 향상에 어떻게 도움이 되는지 이해가 부족합니다 (e.g. pairing samples와 mix up). 그리고 충분한 데이터셋 양에 대한 이론이 없습니다. 또한, 표준 평가 방법이 정해져 있지 않습니다. 그래서 어떻게 평가를 할 것인지가 문제입니다.  이 외에도 클래스 불균형 문제가 있습니다. 그리고 생성된 데이터의 양에 관련된 문제가 있습니다. 학습 데이터의 양을 증가해도 성능 향상으로 이어지지 않는 경우가 있습니다. 마지막으로 augmentation 기법의 선택과 조합에 관한 문제입니다. 새로운 데이터를 만들기 위해 다양한 augmentation 기법들을 어떻게 조합할 것인지가 중요한 문제입니다.</p>

<p>보다 구체적인 정보를 위해서는 논문 링크를 참고해주세요. 다음은 논문 링크입니다.</p>

<p><a href="https://arxiv.org/abs/2204.08610" target="_blank">arXiv</a></p>]]></content><author><name>TS Logic</name></author><category term="Paper Review" /><summary type="html"><![CDATA[Image data augmentation은 딥러닝 모델의 상용화를 위해 학습 데이터의 양과 다양성을 늘려줄 수 있는 중요하고 필수적인 방법입니다. 이 방법은 크게 basic과 advanced 접근법으로 구분할 수 있습니다.]]></summary></entry></feed>