<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>ALPICA</title>
        <link>https://velog.io/</link>
        <description>AI Learning, Parcelled Innovations, Carrying All</description>
        <lastBuildDate>Fri, 13 Oct 2023 06:51:01 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>ALPICA</title>
            <url>https://velog.velcdn.com/images/hipjaengyi_cat18/profile/2ae8b882-7226-444a-aed0-d99ba531e641/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. ALPICA. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/hipjaengyi_cat18" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[참석후기] 장동선교수의 '뇌과학자가 바라보는 AI시대의 미래']]></title>
            <link>https://velog.io/@hipjaengyi_cat18/%EC%B0%B8%EC%84%9D%ED%9B%84%EA%B8%B0-%EC%9E%A5%EB%8F%99%EC%84%A0%EA%B5%90%EC%88%98%EC%9D%98-%EB%87%8C%EA%B3%BC%ED%95%99%EC%9E%90%EA%B0%80-%EB%B0%94%EB%9D%BC%EB%B3%B4%EB%8A%94-AI%EC%8B%9C%EB%8C%80%EC%9D%98-%EB%AF%B8%EB%9E%98</link>
            <guid>https://velog.io/@hipjaengyi_cat18/%EC%B0%B8%EC%84%9D%ED%9B%84%EA%B8%B0-%EC%9E%A5%EB%8F%99%EC%84%A0%EA%B5%90%EC%88%98%EC%9D%98-%EB%87%8C%EA%B3%BC%ED%95%99%EC%9E%90%EA%B0%80-%EB%B0%94%EB%9D%BC%EB%B3%B4%EB%8A%94-AI%EC%8B%9C%EB%8C%80%EC%9D%98-%EB%AF%B8%EB%9E%98</guid>
            <pubDate>Fri, 13 Oct 2023 06:51:01 GMT</pubDate>
            <description><![CDATA[<h1 id="뇌과학자-장동선교수가-바라보는-ai시대의-미래🧠">뇌과학자 장동선교수가 바라보는 AI시대의 미래🧠</h1>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/45106c48-9aa7-485e-84bb-32b02282bed7/image.png" alt=""></p>
<h2 id="ai의-시대-미래의-얼굴을-엿보다">AI의 시대, 미래의 얼굴을 엿보다</h2>
<p>안녕하세요, 여러분! 오늘은 &quot;뇌과학자가 바라보는 AI시대의 미래&quot; 인문학 콘서트에 다녀와서 들은 내용을 정리해보려고 합니다. 이 콘서트에서는 AI의 미래에 대한 흥미로운 전망과 인간과 기계의 차이점, 그리고 어떻게 아이들을 양육해야 하는지에 대한 질문에 답해주셨는데요, 이 모든 내용을 함께 알아보도록 하겠습니다.
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/9bcef418-34eb-4d7e-be5a-7bcef645abdd/image.jpeg" alt=""></p>
<h2 id="ai의-시대에-일어날-변화">AI의 시대에 일어날 변화</h2>
<p>AI의 시대에는 우리 주변의 변화가 예상되는데, 그 중에서도 박사님은 다음과 같이 변화될 것이라고 생각하셨습니다.
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/49a702e0-c001-4263-b6b3-5ee83b22973f/image.jpeg" alt=""></p>
<h3 id="1-인간과-ai의-경계가-희미해진다">1. 인간과 AI의 경계가 희미해진다</h3>
<p>장동선 교수는 먼저 인간과 기계, 특히 AI의 구분이 점차 모호해지고 있다고 설명했습니다. 이는 우리의 일상에서도 점차 나타나고 있습니다. 디지털 헬스 분야에서는 AI가 진단과 치료에 활용되고, 심지어 집중력을 향상시키기 위한 디지털 게임 처방이 이루어지며, 게임을 통해 치매를 예측하는 연구도 진행 중입니다. 이로 인해 인간과 AI의 차이가 더욱 모호해지고 있습니다.
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/2f606c3e-66d1-4418-b00b-853b19e26835/image.jpeg" alt=""></p>
<p>교육과 의료 분야에서도 AI의 도움으로 격차가 줄어들고, 인간과 AI의 경계가 희미해지는 경향이 나타납니다. 따라서 미래에는 우리가 능동적으로 무언가를 창조하고 만들어내는 &#39;빌더나 메이커&#39;로서 더 중요해질 것이라고 강조했습니다. 학위나 졸업장을 얻는 것보다 직접 무언가를 만들어서 성공하는 길이 더욱 가치 있을 것이라는 것이죠.</p>
<p>또한, 인공지능 기술이 발전하면서 가짜와 진짜를 구분하는 것이 어려워지고 있습니다. 예를 들어 영상통화 보이스피싱이 급증하고, 유명인을 모방한 가짜 영상으로 인한 피해가 발생하고 있습니다. 또한, 데이트 AI를 만들어 돈을 벌며 인간과 AI 사이의 관계가 급증하고 있는데, 이러한 변화들은 우리의 미래를 형성하고 있습니다.</p>
<h3 id="2-인간의-삶-죽음-건강-행동이-예측-가능해진다">2. 인간의 삶, 죽음, 건강, 행동이 예측 가능해진다</h3>
<p>인간의 삶과 죽음, 건강, 그리고 행동이 예측 가능해지고 있습니다. 모든 데이터와 신호가 디지털로 변환되면서 우리가 온라인에서 남긴 정보를 토대로 우리의 행동이 예측되고 조작됩니다. 이에 따라 사이버 보안의 중요성이 더욱 부각되고 있으며, 데이터를 수집하는 기업이 교육과 의료 분야에서 중요한 역할을 할 것이라 예측됩니다.</p>
<p>AI 기술의 발전 속도는 빠르게 가속화되고 있으며, ChatGPT와 같은 프로그램이 개발되면서 인간과 AI의 협력이 더욱 강화되고 있습니다. 이러한 발전은 우리의 미래를 형성하고 있으며, 우리는 이러한 변화에 대응하기 위해 준비를 해야 합니다.</p>
<h3 id="3-새로운-정보-획득-방식의-변화">3. 새로운 정보 획득 방식의 변화</h3>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/de5c8319-6f2f-446a-9d23-72238bc7e3d0/image.jpeg" alt=""></p>
<p>인공지능 기술이 발전함에 따라 우리가 새로운 정보를 얻는 방식도 변화하고 있습니다. AI는 이미 우리의 지식을 온라인으로 변환시키고, 연산 능력을 향상시키고 있습니다. 그 결과, 우리는 모든 정보를 열람할 수 있게 되었지만, 이는 편향된 정보에 노출될 가능성을 의미합니다. 그렇기 때문에 장동선 교수는 공부는 AI가 하고 사람은 묻는 방식으로 학습이 진행될 것으로 예측합니다.</p>
<h2 id="인간의-뇌와-기계가-다른점">인간의 뇌와 기계가 다른점</h2>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/95f64b8f-0586-4a33-abab-5432cb79602d/image.jpeg" alt="">
인간과 기계, 그 사이의 차이점은 어떤 걸까요? &#39;뇌과학자가 바라보는 AI시대의 미래&#39; 콘서트에서 들은 내용을 토대로 이 두 세계 간의 다른 점을 살펴보고자 합니다.</p>
<h3 id="1-공감의-힘-인간은-메타인지를-통한-존재-이해">1. 공감의 힘: 인간은 메타인지를 통한 존재 이해</h3>
<p>우리 인간은 공감 덕분에 자아를 발견하며, 메타인지를 경험합니다. 매순간 타인을 이해하고 예측하려는 노력을 통해 우리는 더 나은 사회적 존재로 성장합니다. 이는 우리의 뇌가 지닌 특별한 능력 중 하나입니다.</p>
<p>예를 들어, 누군가가 우리를 모방하면 우리의 뇌는 운동 관련 영역을 활성화시키며, 거울 뉴런 시스템을 활용합니다. 다시 말해, 누군가가 우리의 행동을 따라하면 우리의 뇌가 그 반응을 그대로 반영하고, 그 결과로 우리는 피로감을 느끼게 됩니다. 또한 말하는 사람과 듣는 사람의 뇌파가 6초의 싱크로 동기화됨을 발견했습니다. 이는 사람 간의 상호작용이 얼마나 강력한 힘을 지니고 있는지를 보여줍니다.
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/f38a2f3f-9554-4ca1-ad93-8b0e43a0e4c1/image.jpeg" alt=""></p>
<h3 id="2-연결의-힘-인간은-집단지성을-형성하며-새로운-생각을-만들어냅니다">2. 연결의 힘: 인간은 집단지성을 형성하며 새로운 생각을 만들어냅니다</h3>
<p>우리 인간은 타인과 연결되어 있으며, 이러한 연결을 통해 집단지성을 구축합니다. 인간의 뇌는 미래와 과거를 상상하거나 고민할 때 동일한 뇌 활동을 겪는다는 연구 결과가 있습니다. 즉, 우리의 상상력은 우리의!
 경험을 기반으로 합니다.</p>
<p>이와 대조적으로 기계는 이러한 공감과 연결을 가지지 않습니다. AI가 이러한 방식으로 새로운 생각을 만들어낼 수 있는지는 아직 연구 중이며, 인간과 다른 의견을 제시할 수 있는 다양성이 중요하다는 점을 강조했습니다.</p>
<p>가장 중요한 것은 바로 &#39;사람과의 만남&#39;입니다. 훌륭한 개인보다 항상 팀이 더 나은 성과를 내며, 집단지성이 잘 이루어지는 팀은 다양성이 높은 곳에서 나온다고 밝혔습니다. 다양한 의견과 경험을 공유하는 것이 우리의 미래를 밝게 만드는 열쇠일 것입니다.
<a href="https://velog.velcdn.com/images/hipjaengyi_cat18/post/3a9b461b-01dc-4865-8e68-7f829ed712cc/image.jpeg"></a></p>
<p>AI 시대에도 인간의 독특한 능력과 연결은 귀중한 자산이며, 이러한 점을 적극적으로 활용하여 함께 성장하고 발전해나가야 합니다. AI와의 공존과 협력을 통해 미래를 더 밝게 만들 수 있을 것입니다.</p>
<h2 id="ai의-시대의-미래는">AI의 시대의 미래는?</h2>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/763ee180-60a7-4193-b0d7-e3cdf464407b/image.jpeg" alt="">
마지막으로, 장동선 교수는 미래에 대한 예측을 할 수 없다고 강조했습니다. 그러면서도 미래를 예측하는 가장 좋은 방법은 그 미래를 창조하는 것이라고 말했습니다. 이는 우리 모두에게 적용되며, 앞으로의 미래를 함께 만들어나가는 역할을 하면서 변화와 발전을 즐길 수 있는 길이라고 말씀드렸습니다.</p>
<p>이렇게 &#39;뇌과학자가 바라보는 AI시대의 미래&#39;에 대한 강연을 통해 우리는 미래에 대한 인사이트를 얻었습니다. AI의 발전과 함께 우리도 변화와 발전에 대한 적극적인 태도로 미래를 이끌어나갈 필요가 있습니다. 함께 미래를 만들어 나가는 여정을 즐기며, 미래에 대한 두려움이 아닌 기대감으로 나아가는 것이 중요하다는 점을 기억해 봅시다.</p>
<h2 id="질의응답">질의응답</h2>
<p>이번 인문학 콘서트에서 학부모들의 아이 교육과 관련한 질문이 많았습니다. 특히, 스마트기기 사용과 관련한 부분과 박사님의 자녀 교육에 대한 질문이 눈에 띕니다.</p>
<p>Q. 스마트기기 뇌 발달에 부정적인 영향을 미친다는 의견에 대해 어떻게 생각하십니까?
이 부분은 결론 안나지 않았지만 개인적의견으로 너무 안쓰면 사회부적응자되는 경우도 있다. 완벽한 교육을 받는다고 해도 세상은 부조리하기 때문에 세상의 부조리에 무너질수 있다.
또한 평생 디지털 기기 안쓰는 세상아니므로, 좋지 않더라도 어떻게 제어할 수 있는지 배우는 것이 중요하다고 하시면서
스마트폰이 나쁜게 아니라 스마트폰으로 악영향을 주는 것을 하는지가 중요하라고 하셨습니다(틱톡 등)</p>
<p>Q. 박사님의 자녀분들도 학원을 다니신다고 들었는데, 그 이유는 무엇인가요?
타인과 공감할 수 있는 공동 영역을 공유하는거 중요하다.
박사님의 자녀들의 주변 아이들이 전부 학원에 다니기 때문에 주변 아이들과 어울림(함께 공부하거나, 함께 땡땡이를 치는 등을ㅎㅎ) 위해 학원을 보내신다고 하십니다.
타인과 연결될 수 있는 호환성을 가지는게 중요하다는 말씀과 함께 타인과 공감할 수 있는 공동 영역을 공유하는 것이 중요성을 강조하셨습니다.</p>
<h2 id="마무리">마무리</h2>
<p>AI 시대의 미래는 아직 확실히 예측하기 어려우며, 우리는 이러한 변화에 적응하고 발전해 나가는 방법을 찾아야 합니다. 합리적인 스마트기기 사용과 타인과의 연결은 AI 시대에서도 중요한 역할을 할 것입니다. 함께 더 나은 미래를 만들어봅시다! 😊</p>
<p>그럼, 다음 글에서 또 만나요! 🚀</p>
<hr>
<h3 id="작성후기">작성후기</h3>
<p>해당 글을 chat-GPT 3.0을 사용해 작성하였습니다.🤖</p>
<p>chat-GPT를 통해 다양한 활동을 하면서 계속 느끼는 바는 역시 프롬프트를 어떻게 작성하는지에 따라 답변이 달라진다는 것과 역시 놀라운 생산성입니다
질 좋은 글을 위해서 평소 하루종일 시간이 걸리는 경우가 많은데 GPT를 활용하면 원하는대로 글을 생성하고 원하는 느낌대로 조금만 손봐주면 되니 이 글을 작성하는데 30분밖에 걸리지 않았습니다😲</p>
<p>또한 처음 작성한 질문을 통해 원하는 바를 다 얻은 적은 거의 없고 답변을 보고 작성한 질문을 다시 수정을 거듭하고 추가 질문을 통해 원하는 결과를 만들어가는 재미가 신기하다는 느낌을 매일 받고 있습니다.</p>
<p>AI의 원리들을 공부해가며 그런 이론들은 너무 어렵지만 역시 직접 사용해보면 그 놀라움에 항상 신기할 따름입니다.
오늘도 GPT로 이글을 쓰며 AI시대를 몸소 느끼고 있는 바로서 무섭기도 하면서 AI를 앞으로 어떻게 활용할지 기대가 됩니다.</p>
<p>어떻게 chat-GPT를 활용해 블로그글을 작성하였는지 궁금하시면 다음링크를 참고하시면 좋겠습니다
👉 <a href="https://chat.openai.com/share/471cd7e2-5aa0-4c94-b7e9-e406aa7aa7be">https://chat.openai.com/share/471cd7e2-5aa0-4c94-b7e9-e406aa7aa7be</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ML Serving] 머신러닝 디자인 패턴]]></title>
            <link>https://velog.io/@hipjaengyi_cat18/ML-Serving-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4</link>
            <guid>https://velog.io/@hipjaengyi_cat18/ML-Serving-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4</guid>
            <pubDate>Thu, 06 Jul 2023 06:33:11 GMT</pubDate>
            <description><![CDATA[<h1 id="디자인-패턴이란">디자인 패턴이란?</h1>
<ul>
<li>문제를 해결하는 방법을 패턴화해서 표현</li>
<li>반복적으로 발생하는 문제를 어떻게 해결할지에 대한 솔루션 - 추상화된 패턴</li>
<li>개발할 때 구조화된 패턴을 설명하는 용어</li>
<li>안티 패턴 : 좋지 않은 패턴</li>
</ul>
<p>1) 초기 개발 : main.py, inference.py, predict.py, utils.py 등 간단하게 시작
2) 규모가 커질때 : 하나의 시스템에 여러 역할이 필요한 경우가 존재 -&gt; 복잡한 비즈니스 로직을 해결하기 위해 코드 아키텍처도 잘 설계하는 것이 필요</p>
<h1 id="머신러닝-디자인-패턴-vs-소프트웨어-개발">머신러닝 디자인 패턴 vs 소프트웨어 개발</h1>
<ul>
<li><p>소프트웨어 개발 : Code</p>
</li>
<li><p>머신러닝 개발의 특수성 : Data, Model, Code</p>
</li>
<li><p>머신러닝 개발시 학습, 예측, 운영하면서 생기는 노하우 =&gt; 패턴화</p>
</li>
</ul>
<h1 id="머신러닝-디자인-패턴">머신러닝 디자인 패턴</h1>
<ul>
<li>Serving 패턴 : 모델을 Production 환경에 서빙하는 패턴</li>
<li>Training 패턴 : 모델을 학습하는 패턴</li>
<li>QA 패턴 : 모델의 성능을 Production 환경에서 평가하기 위한 패턴</li>
<li>Operation 패턴 : 모델을 운영하기 위한 패턴</li>
</ul>
<h1 id="serving-패턴">Serving 패턴</h1>
<h2 id="1-web-single">1) Web Single</h2>
<ul>
<li>가장 간단한 아키텍처</li>
<li>예측 서버를 빠르게 출시하고 싶은 경우</li>
</ul>
<p>Architecture</p>
<ul>
<li>FastAPI, Flask 등으로 단일 REST 인터페이스 생성 - 요청시 전처리도 같이 포함</li>
<li>간단하게 생성할 수 있는 구조</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/1e67d5a6-d5ac-4ed2-9f4f-0f8f43291fd9/image.png" alt=""></p>
<p>장점</p>
<ul>
<li>하나의 프로그래밍 언어로 진행 - 아키텍처의 단순함</li>
<li>처음 사용할 때 좋은 방식
단점</li>
<li>구성 요소 하나가 바뀌면 전체 업데이트를 해야함</li>
</ul>
<h2 id="2-synchronous">2) Synchronous</h2>
<ul>
<li>예측의 결과에 따라 로직이 달라지는 경우</li>
<li>예) 예측 결과가 강아지라고 하면 =&gt; 강아지 관련 화면, 고양이면 고양이 화면</li>
</ul>
<p>Architecture</p>
<ul>
<li>예측이 끝날 때까지 프로세스를 Block</li>
<li>REST API는 대부분 Synchronous 패턴
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/de29b9e2-4545-4ff2-bc2e-668b3c2798f6/image.png" alt=""></li>
</ul>
<p>장점</p>
<ul>
<li>아키텍처의 단순함</li>
<li>예측이 완료될 때까지 프로세스가 다른 작업을 할 필요가 없어서 Workflow가 단순해짐
단점</li>
<li>예측 속도가 병목이 됨(동시에 1000개의 요청이 올 경우 대기 시간) - 예측 지연으로 사용자 경험이 악화될 수 있음</li>
</ul>
<h2 id="3-asynchronous">3) Asynchronous</h2>
<ul>
<li>예측과 진행 프로세스의 의존성이 없는 경우</li>
<li>비동기로 실행됨. 예측 요청을 하고 응답을 바로 받을 필요가 없는 경우 - 예측을 요청하는 클라이언트와 응답을 반환하는 목적지가 분리된 경우</li>
</ul>
<p>Architecture</p>
<ul>
<li>클라이언트와 예측 서버 사이에 메세지 시스템(Queue)을 추가 - 특정 메세지에 Request 데이터를 메세지 Queue에 저장(Push) - 특정 서버는 메세지 Queue의 데이터를 가져와서 예측(Pull)
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/9b711baf-9e16-4065-b84d-3af96f67ca48/image.png" alt="">
장점</li>
<li>클라이언트와 예측을 분리</li>
<li>클라이언트가 예측을 기다릴 필요가 없음
단점</li>
<li>메세지 Queue 시스템을 만들어야 함 - 실시간 예측엔 적절하지 않음</li>
</ul>
<h2 id="4-batch">4) Batch</h2>
<ul>
<li>예측 결과를 실시간으로 얻을 필요가 없는 경우</li>
<li>대량의 데이터에 대한 예측을 하는 경우</li>
<li>예측 실행이 시간대별, 월별, 일별로 스케쥴링해도 괜찮은 경우</li>
</ul>
<p>Architecture</p>
<ul>
<li>실시간으로 진행할 필요가 없는 경우 사용</li>
<li>Airflow 등으로 Batch 작업을 스케줄링에 맞게 트리거링 - Input, Output 데이터는 데이터 웨어하우스 등에 저장
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/e648bf17-0db8-44a7-8d53-e04ec55fbaa0/image.png" alt=""></li>
</ul>
<p>장점</p>
<ul>
<li>API 서버 등을 개발하지 않아도 되는 단순함 - 서버 리소스를 유연하게 관리할 수 있음
단점</li>
<li>스케줄링을 위한 서버 필요</li>
</ul>
<h2 id="5-prediction">5) Prediction</h2>
<ul>
<li>전처리와 예측을 분리하고 싶은 경우</li>
<li>전처리와 예측에서 사용하는 언어가 다른 경우</li>
<li>리소스를 분리해서 효율성을 향상하고 싶은 경우</li>
</ul>
<p>Architecture</p>
<ul>
<li>전처리 서버와 예측 서버를 분리</li>
<li>Request를 할 경우 맨 처음엔 전처리 서버로 가서 전처리하고, 그 데이터를 예측 서버로 Request
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/08eddfb5-ec50-4885-b134-d6b317362e22/image.png" alt=""></li>
</ul>
<p>장점</p>
<ul>
<li>전처리 서버와 예측 서버를 분리해서 효율적으로 리소스를 사용할 수 있음 - Fault Isolation : 장애를 격리할 수 있음</li>
<li>딥러닝에선 전처리가 많이 필요해서 이렇게 활용하는 경우도 존재
단점</li>
<li>서버 2개를 운영해야 해서 운영 비용이 증가함</li>
<li>전처리 서버와 예측 서버 네트워크 연결이 병목 포인트가 될 수 있음</li>
</ul>
<h2 id="microservice-vertical">Microservice Vertical</h2>
<ul>
<li>여러 모델이 순차적으로 연결되는 경우</li>
<li>A 모델의 결과를 B 모델의 Input으로 사용하는 경우 - 예측끼리 의존 관계가 있는 경우</li>
</ul>
<p>Architecture</p>
<ul>
<li>각각의 모델을 별도의 서버로 배포</li>
<li>동기적으로 순서대로 예측하고, 예측 결과를 다른 모델에 또 Request
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/f495f19a-95db-44ef-a71b-71ae6d1afc71/image.png" alt=""></li>
</ul>
<p>장점</p>
<ul>
<li>여러 예측을 순서대로 실행할 수 있음</li>
<li>이전 예측 결과에 따라 다음 예측 모델을 여러개로 분기할 수 있음
단점</li>
<li>동기식으로 실행되기 때문에 대기 시간이 더 필요함 - 하나의 포인트에서 병목이 생길 수 있음</li>
<li>복잡한 시스템 구조</li>
</ul>
<h2 id="microservice-horizontal">Microservice Horizontal</h2>
<ul>
<li>하나의 Request에 여러 모델을 병렬로 실행하고 싶은 경우</li>
<li>보통 이런 경우 마지막에 예측 결과를 통합함</li>
<li>마스크 분류 모델에서 한번에 예측할 수도 있지만, 연령대 예측 모델 + 마스크 분류 모델 + 성별 예측 모델 등으로 구성할 수도 있음</li>
</ul>
<p>Architecture</p>
<ul>
<li>Microservice Vertical 패턴과 유사하게 모델을 각각의 서버로 배포 - Request가 올 경우 여러 모델 서버로 예측
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/c371ef88-7276-46c7-8303-708a50f45e04/image.png" alt="">
장점</li>
<li>리소스 사용량을 독립적으로 사용할 수 있고, 장애를 격리할 수 있음 - 다른 모델에 의존성 없이 개발할 수 있음
단점</li>
<li>시스템이 복잡해질 수 있음</li>
</ul>
<h2 id="prediction-cache">Prediction Cache</h2>
<ul>
<li>Request할 때 데이터를 저장하고, 예측 결과도 별도로 저장해야 하는 경우 - 예측 결과가 자주 변경되지 않는 경우</li>
<li>입력 데이터를 캐시로 활용할 수 있는 경우</li>
<li>예측의 속도를 개선하고 싶은 경우</li>
</ul>
<p>Architecture</p>
<ul>
<li>Request가 올 경우 해당 데이터로 예측한 결과가 있는지 캐시에서 검색함(주로 Redis 사용) - 만약 예측 결과가 있다면 해당 데이터를 바로 Return, 예측 결과가 없다면 모델에 예측</li>
<li>오래된 예측이 있다면 주기적으로 삭제하는 로직이 필요함
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/66d85b27-5ec4-4b5a-b9d0-0ae0a3bf4c7e/image.png" alt=""></li>
</ul>
<p>장점</p>
<ul>
<li>반복되는 요청이 있는 경우 성능을 개선할 수 있음
단점</li>
<li>캐시 서버를 운영해야 함</li>
</ul>
<h2 id="online-bigsize---anti-패턴">Online Bigsize - anti 패턴</h2>
<ul>
<li>실시간 대응이 필요한 온라인 서비스에 예측에 오래 걸리는 모델을 사용하는 경우 - 속도와 비용 Tradeoff를 조절해 모델 경량화하는 작업이 필요</li>
<li>실시간이 아닌 배치로 변경하는 것도 가능한지 검토</li>
<li>중간에 캐시 서버를 추가하고, 전처리를 분리하는 것도 Bigsize를 탈피하는 방법</li>
</ul>
<h2 id="all-in-one---anti-패턴">All-in-one - anti 패턴</h2>
<ul>
<li>하나의 서버에 여러 예측 모델을 띄우는 경우</li>
<li>predict1, predict2, predict3으로 나눠서 하나의 서버에서 모두 실행하는 경우 - 라이브러리 선택 제한이 존재함</li>
<li>장애가 발생할 경우(서버가 갑자기 다운) 로그를 확인하기 어려움</li>
</ul>
<h1 id="training-패턴">Training 패턴</h1>
<p>학습 파이프라인을 구성하기 위한 패턴</p>
<ul>
<li>자주 학습하는가?</li>
<li>학습의 Component 다양한 단계를 재사용하는가</li>
</ul>
<h2 id="batch-training">Batch Training</h2>
<ul>
<li>주기적으로 학습해야 하는 경우</li>
</ul>
<p>Architecture</p>
<ul>
<li>Batch Serving 패턴처럼 스케줄링 서버 필요</li>
<li>학습 과정에서 데이터 전처리, 평가 과정 모두 필요</li>
<li>저장한 모델 파일을 사용할 수 있도록 저장하는 작업이 필요
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/108ddb94-a74a-4a32-9f66-731a9bbf4669/image.png" alt=""></li>
</ul>
<p>장점</p>
<ul>
<li>정기적인 재학습과 모델 업데이트
단점</li>
<li>데이터 수집, 전처리, 학습, 평가 과정에서 오류가 발생할 상황을 고려해야 함</li>
</ul>
<h2 id="pipeline-training">Pipeline Training</h2>
<ul>
<li>학습 파이프라인 단계를 분리해 각각을 선택하고 재사용할 수 있도록 만드는 경우 - 각 작업을 별도로 컨트롤하고 싶은 경우</li>
</ul>
<p>Architecture</p>
<ul>
<li>Batch Training 패턴의 응용 패턴</li>
<li>각 작업을 개별 리소스로 분할(서버, 컨테이너 등) =&gt; 전처리 서버는 메모리가 크게, 서빙 서버는 GPU 등</li>
<li>시간이 많이 걸리는 작업은 자주 실행하고, 다른 작업은 적게 실행</li>
<li>이전 작업의 실행 결과가 후속 작업의 Input</li>
<li>처리 완료된 데이터를 데이터 웨어하우스에 중간 저장
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/afb2e63e-15d6-4763-bd39-5d6e7929a13e/image.png" alt=""></li>
</ul>
<p>장점</p>
<ul>
<li>작업 리소스, 라이브러리를 유연하게 선택할 수 있음 - 장애 분리</li>
<li>Workflow 기반 작업</li>
<li>컨테이너를 재사용할 수 있음
단점</li>
<li>다중 구조로 여러 작업을 관리해야 함</li>
</ul>
<h2 id="training-code-in-serving---training-anti-패턴">Training code in Serving - Training Anti 패턴</h2>
<ul>
<li>학습, 실험, 평가에 사용해야 하는 코드가 서빙 코드에 들어간 경우</li>
<li>학습, 실험, 평가를 위한 환경과 서빙을 같이 처리하는 경우</li>
<li>Research 단계와 Production 단계에서 필요한 코드와 로직은 다름 =&gt; 리소스도 마찬가지로 분리
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/c37279a8-d0d8-4c3c-a251-0fd440e76201/image.png" alt=""></li>
</ul>
<h2 id="too-many-pipes-패턴---training-anti-패턴">Too many pipes 패턴 - Training Anti 패턴</h2>
<ul>
<li>학습 파이프라인이 너무 다양하고 복잡한 경우</li>
<li>데이터 소스가 너무 많아서 각각 가져오는 방법이 다양하고, 추상화되어 있지 않은 경우
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/ea883691-0fb4-48e3-aa46-ad0fe3a8f23f/image.png" alt=""></li>
</ul>
<h1 id="qa-패턴">QA 패턴</h1>
<p>예측 서버와 모델의 성능 평가를 위한 패턴</p>
<ul>
<li>모델이 처음 배포된다면 배포 끝!이지만 기존 모델이 있고 신규 모델이 있다면 모델을 비교해야 함</li>
<li>Production 환경에 영향이 없도록 Test하는 패턴, 바로 영향이 가는 패턴 등이 존재</li>
<li>추천 시스템에서 자주 사용하며, AB Test - MAB 등의 키워드도 존재</li>
</ul>
<h2 id="shadow-ab-test-패턴">Shadow AB Test 패턴</h2>
<ul>
<li>새로운 예측 모델이 Production 환경에서 잘 동작하는지 확인하고 싶은 경우</li>
<li>새로운 예측 서버가 Production 환경의 부하를 견디는지 확인하고 싶은 경우</li>
</ul>
<p>Architecture</p>
<ul>
<li>예측 모델, 서버를 Production 환경에 배포하기 전에 사용</li>
<li>Request가 들어온 경우 기존 모델과 새로운 모델에게 모두 전달되고, Response는 기존 모델 서버에만 전달됨(새로운 모델의 결과는 별도로 저장만)</li>
<li>모델이 잘 예측하는지 동시에 2개의 모델을 실행해서 파악할 수 있음</li>
<li>새로운 모델이 문제가 생기면 AB Test에서 제거하고 다시 개선</li>
<li>Shadow AB Test 패턴은 Risk가 적음(현재 모델은 그대로 운영)
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/f77e99ed-ee22-437b-bfa4-68d28b15e7d0/image.png" alt=""></li>
</ul>
<p>장점</p>
<ul>
<li>Production 환경에 영향을 주지 않고 새로운 모델 성능을 확인할 수 있음 - 여러 모델의 예측 결과를 수집해 분석할 수 있음
단점</li>
<li>새로운 예측 서버에 대한 비용이 발생</li>
</ul>
<h2 id="online-ab-test-패턴">Online AB Test 패턴</h2>
<ul>
<li>새로운 모델이 Production 환경에서 잘 동작하는지 확인하고 싶은 경우</li>
<li>새로운 서버가 Production 환경의 부하를 견딜 수 있는지 확인하고 싶은 경우 - 온라인으로 여러 예측 모델을 측정하고 싶은 경우</li>
</ul>
<p>Architecture</p>
<ul>
<li>Shadow AB Test 패턴과 큰 방식은 동일</li>
<li>Request가 들어오면 지정된 비율(예-1:1)로 트래픽을 나눠서 절반은 기존 모델, 절반은 신규 모델에 예측</li>
<li>처음부터 1:1로 하진 않고, 새로운 모델을 10% 정도로 조절하곤 함
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/81384c8b-d577-4261-a89b-9d8c93c35bda/image.png" alt="">
장점</li>
<li>Production 환경에서 새로운 모델의 예측 결과, 속도를 확인할 수 있음 - 여러 모델의 예측 결과를 수집해 분석할 수 있음
단점</li>
<li>새로운 모델이 바로 비즈니스에 노출되므로 부정적인 비즈니스 영향이 발생할 수 있음 - 새로운 예측 서버에 대한 비용이 발생</li>
</ul>
<h2 id="offline-only-패턴---qa-anti-패턴">Offline Only 패턴 - QA Anti 패턴</h2>
<ul>
<li>머신러닝 모델이 Online Test를 하지 않고, Offline Test Data로만 진행되는 경우 - 머신러닝 모델의 비즈니스 가치를 입증하기 어려움</li>
<li>Production 환경에도 꼭 사용하는 시기가 필요함
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/0575c675-c4e4-4250-bbda-a3c11f750809/image.png" alt=""></li>
</ul>
<h1 id="operation-패턴">Operation 패턴</h1>
<p>머신러닝 시스템의 설정, 로깅, 모니터링 등 운영을 위한 패턴</p>
<ul>
<li>모델의 이미지를 함께 Docker Image로 만들 것인지 - 로그를 어떻게 저장할지, 저장된 로그로 모니터링할지</li>
</ul>
<h2 id="model-in-image-패턴">Model in Image 패턴</h2>
<ul>
<li>서비스 환경과 모델을 통합해서 관리하고 싶은 경우 - Docker Image 안에 모델이 저장되어 있는 경우</li>
</ul>
<p>Architecture</p>
<ul>
<li>Docker Image로 모델 코드와 모델 파일(pkl 등)을 저장해서 사용 - Production 환경에선 이 이미지를 Pull해서 사용
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/6493bb83-0b3c-44fb-9bd7-0d304a1d833c/image.png" alt=""></li>
</ul>
<p>장점</p>
<ul>
<li>Production 환경과 Dev 환경을 동일하게 운영할 수 있음
단점</li>
<li>모델을 수정하는 일이 빈번할 경우, Docker Image Build를 계속 수행해야 함</li>
</ul>
<h2 id="model-load-패턴">Model Load 패턴</h2>
<ul>
<li>Docker 이미지와 모델 파일을 분리하고 싶은 경우</li>
<li>모델 업데이트가 빈번한 경우</li>
<li>서버 이미지는 공통으로 사용하되, 모델은 여러개를 사용하는 경우</li>
</ul>
<p>Architecture</p>
<ul>
<li>개발 코드는 Docker Image로 Build</li>
<li>모델 파일은 Object Storage 등에 업로드하고 프로세스 시작할 때 모델 파일을 다운(프리트레인 모델처럼)</li>
<li>분리를 통해 서버 이미지를 경량화할 수 있는 패턴
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/82c4486a-58b3-4756-af0d-d3152802e3f4/image.png" alt=""></li>
</ul>
<p>장점</p>
<ul>
<li>모델과 서버 이미지를 구분</li>
<li>서버 이미지를 재사용할 수 있으며, 서버 이미지가 경량화됨
단점</li>
<li>모델 파일을 가지고 와야하기 때문에 서비스 시작하는데 더 오래 걸릴 수 있음 - 서버 이미지, 모델 관리를 해야 함</li>
</ul>
<h2 id="prediction-log-패턴">Prediction Log 패턴</h2>
<ul>
<li>서비스 개선을 위해 예측, 지연 시간(latency) 로그를 사용하려고 할 경우</li>
<li>Data Validation, 예측 결과 등을 확인하고 싶은 경우</li>
</ul>
<p>Architecture</p>
<ul>
<li>프로세스에서 로그를 저장하지 않고, 메세지 시스템으로 넘겨서 프로세스가 저장에 신경쓰는 시간을 줄임</li>
<li>장애 등을 파악할 수 있도록 로그도 기록하고 모니터링도 할 수 있도록 대비해야 함
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/5215b197-5a8d-4dac-b1f5-482128fca8d3/image.png" alt=""></li>
</ul>
<p>장점</p>
<ul>
<li>예측 결과, 모델의 Latency 등을 분석할 수 있음
단점</li>
<li>로그가 많아지면 저장 비용이 발생함</li>
</ul>
<h2 id="condition-based-serving-패턴">Condition Based Serving 패턴</h2>
<ul>
<li>상황에 따라(특정 조건) 예측해야 하는 대상이 다양한 경우</li>
<li>룰 베이스 방식으로 상황에 따라 모델을 선택하는 경우</li>
</ul>
<p>Architecture</p>
<ul>
<li>사용자의 상태, 시간, 장소에 따라 예측 대상이 바뀔 수 있음
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/5b306177-93b8-4237-9cb7-976a1d8dbcaf/image.png" alt=""></li>
</ul>
<p>장점</p>
<ul>
<li>상황에 따라 알맞은 모델 제공
단점</li>
<li>모델 수에 따라 운영 비용 증가</li>
</ul>
<h2 id="operation-anti-패턴---no-logging-패턴">Operation Anti 패턴 - No Logging 패턴</h2>
<ul>
<li>별도의 로그를 남기지 않는 경우</li>
</ul>
<h1 id="정리">정리</h1>
<ul>
<li>머신러닝 시스템 개발도 점점 패턴화되고 있음</li>
<li>어떻게 설계할지 고민이 된다면 머신러닝 디자인 패턴을 찾아본 후, 설계하는 것도 방법 - 위 방법이 항상 절대 진리는 아니고, 프로젝트 상황에 따라 다름</li>
<li>여러 패턴이 어떤 장단점이 있는지 하나씩 파악하기
머신러닝 패턴 참고: <a href="https://mercari.github.io/ml-system-design-pattern/README_ko.html">https://mercari.github.io/ml-system-design-pattern/README_ko.html</a>
code 레벨 참고 : <a href="https://github.com/shibuiwilliam/ml-system-in-actions">https://github.com/shibuiwilliam/ml-system-in-actions</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Batch Process]  Apache Airflow]]></title>
            <link>https://velog.io/@hipjaengyi_cat18/Batch-Process-Apache-Airflow</link>
            <guid>https://velog.io/@hipjaengyi_cat18/Batch-Process-Apache-Airflow</guid>
            <pubDate>Thu, 06 Jul 2023 05:59:19 GMT</pubDate>
            <description><![CDATA[<h2 id="batch-process란">Batch Process란?</h2>
<p>예약된 시간에 실행되는 프로세스
일회성(1회)도 가능하고, 주기적인 실행도 가능
  ex. 이번 주 일요일 07:00에 1번 실행되는 프로세스 
  ex. 매주 일요일 07:00에 실행되는 프로세스</p>
<ul>
<li>모델을 주기적으로 학습시키는 경우 사용(Continuous Training)</li>
<li>주기적인 Batch Serving을 하는 경우 사용</li>
<li>그 외 개발에서 필요한 배치성 작업</li>
</ul>
<h2 id="batch-process-구축-방법">Batch Process 구축 방법</h2>
<p>1) Linux Crontab
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/7cc2b599-b70f-46e8-8463-1bd01377008a/image.png" alt=""></p>
<ul>
<li>(서버에서) crontab -e 입력</li>
<li>실행된 에디터에서 0 * * * * predict.py 입력</li>
<li>(0 * * * * 은 크론탭 표현으로 매 시 0분에 실행하는 것을 의미)</li>
<li>OS에 의해 매 시 0분에 predict.py가 실행</li>
<li>Linux는 일반적인 서버 환경이고, Crontab은 기본적으로 설치되어 있기 때문에 매우 간편</li>
<li>간단하게 Batch Process를 시작하기에 Crontab은 좋은 선택</li>
</ul>
<h3 id="크론-표현식">크론 표현식</h3>
<ul>
<li>Batch Process의 스케줄링을 정의한 표현식</li>
<li>이 표현식은 다른 Batch Process 도구에서도 자주 사용됨
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/8988f0f5-1f19-4d38-b75b-15915f72a931/image.png" alt="">
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/d954064b-e99d-47d5-84a5-b94deb4655d1/image.png" alt="">
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/c2314882-9c30-4e38-9cd4-f0792226a38c/image.png" alt=""></li>
</ul>
<p>크론 표현식 제너레이터 사이트 : <a href="http://www.cronmaker.com">http://www.cronmaker.com</a></p>
<h3 id="linux-crontab-문제점">Linux Crontab 문제점</h3>
<ul>
<li>재실행 및 알람</li>
<li>파일을 실행하다 오류가 발생한 경우, 크론탭이 별도의 처리를 하지 않음</li>
<li>예) 매주 일요일 07:00에 predict.py를 실행하다가 에러가 발생한 경우, 알람을 별도로 받지 못함</li>
<li>실패할 경우, 자동으로 몇 번 더 재실행(Retry)하고, 그래도 실패하면 실패했다는 알람을 받으면 좋음 - 과거 실행 이력 및 실행 로그를 보기 어려움</li>
<li>여러 파일을 실행하거나, 복잡한 파이프라인을 만들기 힘듬
Crontab은 간단히 사용할 수는 있지만, 실패 시 재실행, 실행 로그 확인, 알람 등의 기능은 제공하지 않음</li>
</ul>
<p>2) 스케줄링 워크플로우 전용 도구의 등장
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/584d173a-fa99-4bab-913d-d6f151d7d977/image.png" alt=""></p>
<h1 id="airflow">Airflow</h1>
<p>현재 스케줄링, 워크플로우 도구의 표준</p>
<ul>
<li>에어비앤비(Airbnb)에서 개발</li>
<li>현재 릴리즈된 버전은 2.2.0으로, 업데이트 주기가 빠름</li>
<li>스케줄링 도구로 무거울 수 있지만, 거의 모든 기능을 제공하고, 확장성이 넓어 일반적으로 스케줄링과 파이프라인 작성 도구로 많이 사용</li>
<li>특히 데이터 엔지니어링 팀에서 많이 사용</li>
</ul>
<p>1) 파이썬을 사용해 스케줄링 및 파이프라인 작성
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/0a7eac3a-cb5f-4e9f-a2a1-84271858505a/image.png" alt=""></p>
<p>2) 스케줄링 및 파이프라인 목록을 볼 수 있는 웹 UI 제공
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/41fa6ccf-7a2d-4749-817e-ecf8cd5250e1/image.png" alt=""></p>
<p>3) 스케줄링 및 파이프라인 목록을 볼 수 있는 웹 UI 제공
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/40260a5c-ab3f-41cd-a9ec-4343b975aaa2/image.png" alt=""></p>
<p>4) 스케줄링 및 파이프라인 목록을 볼 수 있는 웹 UI 제공
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/31a22a24-1675-4cb6-a2f8-ee0339e04397/image.png" alt=""></p>
<ul>
<li>실패 시 알람</li>
<li>실패 시 재실행 시도 - 동시 실행 워커 수</li>
<li>설정 및 변수 값 분리</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Back-End] FastAPI]]></title>
            <link>https://velog.io/@hipjaengyi_cat18/Back-End-FastAPI</link>
            <guid>https://velog.io/@hipjaengyi_cat18/Back-End-FastAPI</guid>
            <pubDate>Thu, 06 Jul 2023 05:41:25 GMT</pubDate>
            <description><![CDATA[<h1 id="fastapi-특징">FastAPI 특징</h1>
<ul>
<li><p>High Performance : Node.js, go와 대등한 성능</p>
</li>
<li><p>Easy : Flask와 비슷한 구조, Microservice에 적합</p>
</li>
<li><p>Productivity : Swagger 자동 생성, Pydantic을 이용한 Serialization</p>
</li>
<li><p>장점 </p>
</li>
<li><p>Flask보다 간결한 Router 문법
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/b6e1a854-ec4e-4567-989e-eb1e07058786/image.png" alt=""></p>
</li>
<li><p>Asynchronous(비동기) 지원 </p>
</li>
<li><p>Built-in API Documentation (Swagger)</p>
</li>
<li><p>단점</p>
</li>
<li><p>아직 Flask 유저가 더 많음
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/48c3dbea-d037-4003-9db1-ff99ef4cdf2f/image.png" alt=""></p>
</li>
<li><p>ORM 등 Database와 관련된 라이브러리가 적음</p>
</li>
<li><p>FastAPI 프로젝트시 필요한 패키지</p>
</li>
<li><p>pip install fastapi [<a href="https://pypi.org/project/fastapi/%5D">https://pypi.org/project/fastapi/]</a></p>
</li>
<li><p>pip install uvicorn [<a href="https://pypi.org/project/uvicorn/%5D">https://pypi.org/project/uvicorn/]</a></p>
</li>
<li><p>pip install gunicorn [<a href="https://pypi.org/project/gunicorn/%5D">https://pypi.org/project/gunicorn/]</a></p>
</li>
</ul>
<h2 id="fast-api를-이용한-프로젝트-구조">Fast API를 이용한 프로젝트 구조</h2>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/cf3cba86-d5f5-496f-96d1-0fdc11fb5be4/image.png" alt=""></p>
<ul>
<li>app : 프로젝트의 코드가 들어갈 모듈 설정(app), &#39;app&#39;대신 프로젝트 이름, src 등 사용할 수 있음</li>
<li><strong>main</strong>.py : 간단하게 애플리케이션을 실행할 수 있는 Entrypoint 역할
[<a href="https://docs.python.org/3/library/__main__.html%5D">https://docs.python.org/3/library/__main__.html]</a><ul>
<li>Entrypoint : 프로그래밍 언어에서 최상위 코드가 실행되는 시작점 또는 프로그램 진입점</li>
</ul>
</li>
<li>main.py(or app.py) : FastAPI의 애플리케이션과 Router 설정</li>
<li>model.py : ML model에 대한 클래스와 함수 정의</li>
</ul>
<h1 id="poetry로-파이썬-패키지-관리하기">Poetry로 파이썬 패키지 관리하기</h1>
<ul>
<li><p>Dependency Resolver로 복잡한 의존성들의 버전 충돌을 방지</p>
</li>
<li><p>Virtualenv를 생성해서 격리된 환경에서 빠르게 개발이 가능해짐</p>
</li>
<li><p>기존 파이썬 패키지 관리 도구에서 지원하지 않는 Build, Publish가 가능</p>
</li>
<li><p>pyproject.toml을 기준으로 여러 툴들의 config를 명시적으로 관리</p>
</li>
<li><p>새로 만든 프로젝트라면 poetry를 사용해보고, virtualenv 등과 비교하는 것을 추천</p>
</li>
<li><p>공식 홈페이지 링크 : <a href="https://python-poetry.org/docs/">https://python-poetry.org/docs/</a>
  설치 코드</p>
<ul>
<li><p>MAC OSX / Linux : curl -sSL <a href="https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py">https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py</a> | python -</p>
</li>
<li><p>Windows(Powershell) : 
(Invoke-WebRequest -Uri <a href="https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py">https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py</a> -UseBasicParsing).Content | python -</p>
</li>
</ul>
</li>
</ul>
<h1 id="fastapi-기본지식">FastAPI 기본지식</h1>
<h2 id="path-parameter">Path Parameter</h2>
<ul>
<li>웹에서 GET Method를 사용해 데이터를 전송할 때 서버에 원하는 값을 전달하고 변수로 사용
ex) ID 402인 사용자 정보를 가져올 경우 : .../users/402</li>
</ul>
<h2 id="query-parameter">Query Parameter</h2>
<ul>
<li>웹에서 GET Method를 사용해 데이터를 전송할 때 key, valud로 전달함</li>
<li>Query String</li>
<li>API 뒤에 입력 데이터를 함께 제공하는 방식으로 사용</li>
<li>Query String은 Key, Value의 쌍으로 이루어지며 &amp;로 연결해 여러 데이터를 넘길 수 있음
ex) ID 402인 사용자 정보를 가져올 경우 : .../users?id=402
ex) 네이버에서 검색할 경우 : <a href="https://search.naver.com/search.naver?where=nexearch&amp;sm=top_hty&amp;fbm=0&amp;ie=utf8&amp;query=%EA%B4%91%EC%A7%84%EA%B5%AC">https://search.naver.com/search.naver?where=nexearch&amp;sm=top_hty&amp;fbm=0&amp;ie=utf8&amp;query=광진구</a></li>
</ul>
<h2 id="path-parameter-vs-query-parameter">Path Parameter VS Query Parameter</h2>
<p>어떤 Resource를 식별하고 싶은 경우(그러나 kyle이란 유저는 없는 경우)</p>
<ul>
<li><p>/users/kyle : Path -&gt; 저 경로에 존재하는 내용이 없으면 404 error</p>
</li>
<li><p>/users?name=kyle : Query -&gt; 데이터가 없는 경우 빈리스트 -&gt; Error Handling 필요함</p>
</li>
<li><p>Resource를 식별해야 하는 경우 : Path Parameter가 더 적합</p>
</li>
<li><p>정렬, 필터링을 해야 하는 경우 : Query Parameter가 더 적합</p>
</li>
</ul>
<h2 id="request-body">Request Body</h2>
<ul>
<li><p>클라이언트에서 API에 데이터를 보낼 때, Request Body를 사용함</p>
</li>
<li><p>클라이언트 =&gt; API : Request Body</p>
</li>
<li><p>API의 Response =&gt; 클라이언트 : Response Body</p>
</li>
<li><p>Request Body에 데이터를 보내고 싶다면 POST Method를 사용, 데이터가 항상 포함되어야하는 것은 아님
(참고) GET Method는 URL, Request Header로 데이터 전달</p>
</li>
<li><p>Body의 데이터를 설명하는 Content-Type이란 Header 필드가 존재하고, 어떤 데이터 타입인지 명시해야 함</p>
<ul>
<li>application/x-www-form-urlencoded : BODY에 Key, Value 사용. &amp; 구분자 사용 </li>
<li>text/plain : 단순 txt 파일</li>
<li>multipartform-data : 데이터를 바이너리 데이터로 전송</li>
</ul>
<h2 id="form">Form</h2>
<ul>
<li>Form(입력) 형태로 데이터를 받고 싶은 경우</li>
<li>Form을 사용하려면 python-multipart를 설치해야 함<blockquote>
<p>  pip install python-multipart
pip install Jinja2 # 프론트도 간단히 만들기 위해 Jinja2 설치</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<h2 id="pydantic">Pydantic</h2>
<ul>
<li>Data Validation / Settings Management 라이브러리</li>
<li>Type Hint를 런타임에서 강제해 안전하게 데이터 핸들링</li>
<li>파이썬 기본 타입(String, Int 등) + List, Dict, Tuple에 대한 Validation 지원</li>
<li>기존 Validation 라이브러리보다 빠름
  Benchmark : <a href="https://site-deploy--pydantic-docs.netlify.app/benchmarks/">https://site-deploy--pydantic-docs.netlify.app/benchmarks/</a></li>
<li>Config를 효과적으로 관리하도록 도와줌</li>
<li>머신러닝 Feature Data Validation으로도 활용 가능</li>
</ul>
<h3 id="validation">Validation</h3>
<ul>
<li>Machine Learning Model Input Validation</li>
<li>Online Serving에서 Input 데이터를 Validation하는 Case</li>
</ul>
<p>Validation Check Logic</p>
<ul>
<li>조건 1: 올바른 url을 입력 받음 (url)</li>
<li>조건 2: 1-10 사이의 정수 입력 받음 (rate)</li>
<li>조건 3: 올바른 폴더 이름을 입력 받음(target_dir)</li>
</ul>
<p>사용할 수 있는 방법</p>
<ul>
<li><p>1) 일반 Python Class를 활용한 Input Definition 및 Validation
  -&gt; 의미 없는 코드 많아짐
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/48fc2201-2f54-4157-b30d-b0fcfe5a31a3/image.png" alt=""></p>
</li>
<li><p>2) Dataclass를(python 3.7 이상 필요) 활용한 Input Definition 및 Validation
  -&gt; 인스턴스 생성 시점에서 Validation을 수행하기 쉬움
  -&gt; 여전히 Validation 로직들을 직접 작성해야 함
  -&gt; Validation 로직을 따로 작성하지 않으면, 런타임에서 type checking을 지원하지 않음</p>
<p>  <img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/71bbc68b-ff6a-43da-9871-3bb3f6e7f1da/image.png" alt="">
  <img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/6517d4a9-1907-48b9-a4a6-7168a7e40606/image.png" alt=""></p>
</li>
<li><p>3) Pydantic을 활용한 Input Definition 및 Validation
-&gt;  훨씬 간결해진 코드 (6라인)(vs 52라인 Python Class, vs 50라인 dataclass)
-&gt;  주로 쓰이는 타입들(http url, db url, enum 등)에 대한 Validation이 만들어져 있음 - 런타임에서 Type Hint에 따라서 Validation Error 발생
-&gt;  Custom Type에 대한 Validation도 쉽게 사용 가능
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/77e49d93-c9d8-4bb9-a467-94cd0cb92e3d/image.png" alt=""></p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/5097c561-549a-43a2-a6d7-23af3b74bc01/image.png" alt=""></p>
<ul>
<li>어디서 에러가 발생했는지</li>
<li>location, type, message 등을 알려줌</li>
</ul>
<h2 id="pydantic-config">Pydantic Config</h2>
<ul>
<li><p>Pydantic은 Config을 체계적으로 관리할 방법을 제공</p>
</li>
<li><p>기존에 다른 라이브러리들은 어떻게 Config를 설정하고 있을까?</p>
</li>
<li><p>Twelve-Factor
설정을 코드에서 엄격하게 분리하는 것을 요구함
설정을 환경 변수(envvars나 env라고도 불림)에 저장함
환경 변수는 코드 변경 없이 쉽게 배포 때마다 쉽게 변경할 수 있음
SaaS(Software as a Service)를 만들기 위한 방법론을 정리한 규칙들에 따르면, 환경 설정은 애플리케이션 코드에서 분리되어 관리되어야 함
<a href="https://12factor.net/ko/config">https://12factor.net/ko/config</a></p>
</li>
</ul>
<p>1) .ini, .yaml 파일 등으로 config 설정하기
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/bac9190f-9ba1-40a6-8fc2-b5328a9ce2f0/image.png" alt=""></p>
<p>2) flask-style config.py
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/22a7e222-6a0d-4c48-8fa4-bdc6374bbad6/image.png" alt=""></p>
<ul>
<li>Config 클래스에서 yaml, ini 파일을 불러와 python class 필드로 주입하는 과정을 구현</li>
<li>Config를 상속한 클래스에서는 Config 클래스의 정보를 오버라이딩해서 사용</li>
<li>하지만 해당 파일의 데이터가 정상적인지 체크하거나(Validation) 또는 환경 변수로 부터 해당 필드를 오버라이딩(Overriding) 하려면 코드량이 늘어남</li>
</ul>
<p>3) pydantic base settings
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/ca1095d2-1f3e-4d30-af8d-614fd6a89d6b/image.png" alt=""></p>
<ul>
<li>Validation처럼 Pydantic은 BaseSettings를 상속한 클래스에서 Type Hint로 주입된 설정 데이터를 검증할 수 있음</li>
<li>Field 클래스의 env 인자로, 환경 변수로 부터 해당 필드를 오버라이딩 할 수 있음</li>
<li>yaml, ini 파일들을 추가적으로 만들지 않고, .env 파일들을 환경별로 만들어 두거나, 실행 환경에서 유연하게 오버라이딩 할 수 있음</li>
<li>environment variable overriding
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/f871dfd8-c164-4d8b-b173-ef0c061b4741/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Back-End] 기본 개념]]></title>
            <link>https://velog.io/@hipjaengyi_cat18/Back-End-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90</link>
            <guid>https://velog.io/@hipjaengyi_cat18/Back-End-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90</guid>
            <pubDate>Tue, 04 Jul 2023 07:20:14 GMT</pubDate>
            <description><![CDATA[<h1 id="server의-형태">server의 형태</h1>
<ul>
<li><p>모놀리식 아키텍쳐(Monolithic Architecture)</p>
<ul>
<li>하나의 큰 서버 안에 모든 기능을 처리함</li>
</ul>
</li>
<li><p>마이크로서비스 아키텍쳐(Mircroservice Architecture-MSA)</p>
<ul>
<li>각각의 기능이 개별서버로 구성되고, 서로 통신하도록 함</li>
<li>개발할 때 API를 의미로 만들 수 있으나 작성 양식이 다르면 서로 다르게 쓰게됨 -&gt; 따라서 API 형식과 통신 형식이 중요함</li>
</ul>
</li>
</ul>
<h1 id="rest-api">REST API</h1>
<ul>
<li>Representational State Transfer의 약자로 Resource, Method, Representation of Resource로 구성됨</li>
<li>정보를 주고 받을 때 널리 사용되는 형식</li>
<li>각 요청이 어떤 동작이나 정보를 위한 것을 요청 모습 자체로 추론할 수 있음</li>
<li>기본적인 데이터 처리 - CRUD : Create(새로추가), READ(조회),  Update(수정), Delete(삭제)</li>
<li>클라이언트 : 요청을 하는 플랫폼, 브라우저같은 웹이나, 앱, python을 사용해 요청하는 것도 클라이언트임</li>
<li>Resource : Unique한 ID를 가지는 리소스, ex) URI</li>
<li>Method : 서버에 요청을 보내기 위한 방식, GET, POST, PUT, PATCH, DELETE</li>
</ul>
<h2 id="uri-vs-url">URI VS URL</h2>
<p>URL : Uniform Resource Locator로 인터넷 상 자원의 위치
URI : Uniform Resource Identifier로 인터넷 상의 자원을 식별하기 위한 문자열의 구성</p>
<ul>
<li>URI는 URL을 포함함, URI가 더 포괄적인 범위이다.</li>
</ul>
<h2 id="httphyper-text-transfer-protocol">HTTP(Hyper Text Transfer Protocol)</h2>
<ul>
<li>정보를 주고 받을 때 지켜야 하는 통신 프로토콜(규약), 약속</li>
<li>HTTP는 기본적으로 80번 포트를 사용하고 있고, 서버에서 80번 포트를 열어주지 않으면 HTTP통신이 불가능하다</li>
</ul>
<h3 id="http-method">HTTP Method</h3>
<ul>
<li><p>GET : 정보를 요청하기 위해 사용 - read
  어떤 정보를 가져와서 조회하기 위해 사용되는 방식
  URL에 변수를 포함시켜 요청함
  데이터를 Header에 포함하여 전송함
  URL에 데이터가 노출되어 있어 보안에 취약함
  캐싱할 수 있음</p>
</li>
<li><p>POST : 정보를 입력하기 위해 사용 - create
  데이터를 서버로 제출해 추가 또는 수정하기 위해 사용되는 방식
  URL에 변수를 노출하지 않고 요청함
  데이터를 Body에 포함함
  URL에 데이터가 노출되지 않아 기본 보안이 되어 있움
  캐싱할 수 없음, 다만 그안에 아키텍처로 캐싱할 수 있음</p>
</li>
<li><p>PUT : 정보를 업데이트하기 위해 사용 - update</p>
</li>
<li><p>PATCH : 정보를 업데이트하기 위해 사용 - update</p>
</li>
<li><p>DELETE - 정보를 삭제하기 위해 사용 - delete</p>
</li>
<li><p>GET vs POST
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/709f8a6c-4b06-47df-9eac-d0ca41729389/image.png" alt=""></p>
</li>
<li><p>Header &amp; Body</p>
</li>
<li><p>Http 통신은 Request하고, Response를 받을 때 정보를 Packet에 저장함</p>
</li>
<li><p>Packet의 구조 : Header / Body
ex) 메일 : Header - 보내는 주고, 받는 주소, 시간 / Body - 전달하려는 내용</p>
</li>
</ul>
<h1 id="status-code">Status Code</h1>
<ul>
<li>클라이언트 요청에 따라 서버가 어떻게 반응하는지 알려주는 코드
1xx(정보) : 요청을 받았고, 프로세스를 계속 진행함
2xx(성공) : 요청을 성공적으로 받았고, 실행함
3xx(리다이렉션) : 요청 완료를 위한 추가 작업이 필요
4xx(클라이언트 오류) : 요청 문법이 잘못되었거나 요청을 처리할 수 없음 5xx(서버 오류) 서버가 요청에 대해 실패함</li>
</ul>
<h1 id="동기-vs-비동기">동기 VS 비동기</h1>
<ul>
<li><p>동기(Sync) : 서버에서 요청을 보냈을 때, 응답이 돌아와야 다음 동작을 수행할 수 있음. A 작업이 모두 완료될 때까지 B 작업은 대기해야 함</p>
</li>
<li><p>비동기(Async) : 요청을 보낼 때 응답 상태와 상관없이 다음 동작을 수행함. A작업과 B 작업이 동시에 실행됨</p>
</li>
</ul>
<h1 id="ip">IP</h1>
<ul>
<li>네트워크에 연결된 특정 PC의 주소를 나타내는 체계</li>
<li>Internet Protocol의 줄임말, 인터넷상에서 사용하는 주소체계</li>
<li>4덩이의 숫자로 구성된 IP 주소 체계를IPv4라고 함</li>
<li>각 덩어리마다 0~255로 나타낼 수 있음. 2^32 = 43억개의 IP 주소를 표현할 수 있음<ul>
<li>localhost, 127.0.0.1 : 현재 사용 중인 Local PC</li>
<li>0.0.0.0, 255.255.255.255 : broadcast address, 로컬 네트워크에 접속된 모든 장치와 소통하는 주소</li>
</ul>
</li>
<li>개인 PC 보급으로 누구나 PC를 사용해 IPv4로 할당할 수 있는 한계점 진입, IPv6이 나옴</li>
</ul>
<h2 id="port">port</h2>
<ul>
<li>IP 주소 뒤에 나오는 숫자</li>
<li>PC에 접속할 수 있는 통로(채널)</li>
<li>사용 중인 포트는 중복할 수 없음</li>
<li>Jupyter Notebook은 8888</li>
<li>Port는 0 ~ 65535까지 존재</li>
<li>그 중 0~1024는 통신을 위한 규약에 정해짐 - 22 : SSH</li>
<li>80 : HTTP</li>
<li>443 : HTTPS</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CI/CD] Github Action을 통해 CI/CD 구축하기]]></title>
            <link>https://velog.io/@hipjaengyi_cat18/CICD-Github-Action%EC%9D%84-%ED%86%B5%ED%95%B4-CICD-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@hipjaengyi_cat18/CICD-Github-Action%EC%9D%84-%ED%86%B5%ED%95%B4-CICD-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 02 Jul 2023 10:53:48 GMT</pubDate>
            <description><![CDATA[<p>CI/CD(Continious Integration/Continuous deploymen)라는 용어에 대해서 많이 들어보았지만, 실제로 회사에서 직접 구현해보지는 않아서 많이 낯설다.
이번에는 CI/CD가 무엇인지 알아보고 Github Action을 통해 CI/CD 파이프라인을 구축해서 자동화를 통해 코드를 서빙하는 과정을 가져보았다.</p>
<h1 id="개발-환경">개발 환경</h1>
<p>목적에 따라 개발 환경을 나누는 이유 : 실제 운영중인 서비스에 장애가 발생하면 안되기 때문이다. </p>
<p>Local</p>
<ul>
<li>각자의 개인 컴퓨터</li>
<li>각자의 환경을 통일 시키기 위해 Docker 등을 사용한다</li>
</ul>
<p>Dev</p>
<ul>
<li>local에서 개발한 기능을 테스트 하는 환경</li>
<li>Test 서버라고 한다</li>
</ul>
<p>Staging</p>
<ul>
<li>production 환경에 배포하기 전에 운영하거나 보안, 성능을 측정하는 환경</li>
<li>Staging 서버라고 한다</li>
</ul>
<p>Production</p>
<ul>
<li>실제 서비스를 운영하는 환경</li>
<li>운영 서버라고 한다</li>
</ul>
<p>Dev = Staging = Production인 경우 문제점?</p>
<ul>
<li>소스 코드를 저장하면 바로 반영될 수 있다.</li>
</ul>
<h1 id="git-flow">Git Flow</h1>
<p>main -&gt; staging -&gt; dev -&gt; feature/기능
(prod Server) (Staging Server) (Dev Server)
&lt;- 방향으로 Pull Request/Review가 이루어짐,
PR로 Merge가 되면 Local에서 git pull &amp; Test 실행 후 괜찮으면 코드를 배포함(FTP로 파일 전송함)</p>
<p>이런 과정을 효율화할 수 없을까?</p>
<h1 id="ci">CI</h1>
<p>CI란 Continous Intergration으로 지속적 통합을 이야기한다.</p>
<ul>
<li>즉, 빌드, 테스트 자동화라고 볼 수 있다.</li>
<li>새롭게 작성한 코드 변경 사항을 build, test 진행 후 test case에 통과했는지 확인한다</li>
<li>지속적으로 코드 품질 관리를 한다(n명의 개발자가 코드를 수정하면 모두 CI프로세스를 진행한다)</li>
</ul>
<h1 id="cd">CD</h1>
<p>CD란 Continuous Deploy/Delivery로 지속적 배포를 이야기한다.</p>
<ul>
<li>즉 배포 자동화라고 볼 수 있다.</li>
<li>작성한 코드가 항상 신뢰 가능한 상태가 되면 자동으로 배포될 수 있도록 하는 과정</li>
<li>CI -&gt; CD 순으로 진행된다</li>
<li>dev/staging/main 브랜치에서 Merge 될 경우 코드가 자동으로 서버에 배포 된다.</li>
</ul>
<h1 id="cicd-도구">CI/CD 도구</h1>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/294fbadb-3fb0-4ad5-b94c-48147d6f8340/image.png" alt=""></p>
<ul>
<li>Jenkins, circleci, Travis CI, AWS codeDeploy, GCP Cloud Build, Github Action 등이 있다.</li>
</ul>
<h1 id="github-action">Github Action</h1>
<p>Github Action는 Github에서 소프트웨어 Workflow 자동화를 위해 출시한 기능이다.</p>
<h2 id="github-action-사용-예시">Github Action 사용 예시</h2>
<ol>
<li>Test code</li>
</ol>
<ul>
<li>작성한 소스코드가 특정 함수의 return값이 어떻게 나오는지, 특정변수 타입이 의도한대로 맞는지를 확인할 수 있다.</li>
<li>Unit Test, End to End Test</li>
</ul>
<ol start="2">
<li>배포</li>
</ol>
<ul>
<li>Prodm Staging, Dev 서버에 코드 배포</li>
<li>FTP 파일로 전송하거나, Docker Image를 push 할 수도 있음</li>
<li>Node.js 등 다양한 언어 배포 지원</li>
</ul>
<ol start="3">
<li>파이썬, 쉘 스크립트 실행</li>
</ol>
<ul>
<li>Github Repo에 저장된 스크립트를 일정 주기를 가지고 실행할 수 있듬</li>
<li>crontab 대용으로 가능함</li>
<li>데이터 수집을 주기적으로 해야할 경우 활용할 수도 있음</li>
<li><a href="https://github.com/actions/setup-python">https://github.com/actions/setup-python</a></li>
</ul>
<ol start="4">
<li>Github Tag, Release 자동으로 설정</li>
</ol>
<ul>
<li>Main 브랜치에 Merge 될 경우에 특정 작업 실행</li>
<li>기존 버전에서 버전 up 하기</li>
<li>새로운 브랜치 생성시 특정 작업 실행도 가능함</li>
</ul>
<ol start="5">
<li>그외 다양한 Workflow 만들기 가능</li>
</ol>
<ul>
<li>원하는 기능이 있는 경우 검색해 사용가능</li>
<li>Action Marketplace : <a href="https://github.com/marketplace?type=actions">https://github.com/marketplace?type=actions</a></li>
<li>Awesome Github Action : <a href="https://github.com/sdras/awesome-actions">https://github.com/sdras/awesome-actions</a>
Github Action을 사용한 CI/CD</li>
</ul>
<h3 id="제약조건">제약조건</h3>
<ul>
<li>금액 : Public Repo 무료, Private Repo 조건에 따라 금액 다름</li>
<li>하나의 Github Repository당 최대 20개 workflow 등록가능</li>
<li>Workflow에 존재하는 Job은 최대 6시간 실행할 수 있으며, 초과시 자동으로 중지됨</li>
<li>동시에 실행할 수 있는 Job 제한 존재</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[OCR] Text Detection]]></title>
            <link>https://velog.io/@hipjaengyi_cat18/OCR-Text-Detection</link>
            <guid>https://velog.io/@hipjaengyi_cat18/OCR-Text-Detection</guid>
            <pubDate>Wed, 24 May 2023 19:42:48 GMT</pubDate>
            <description><![CDATA[<p>OCR 시스템에서 가장 먼저 수행되는 단계는 무엇일까? 바로 글자 검출이다.
글자 검출은 이미지에서 읽어낼 글자가 놓여있는 영역을 찾아내는 기술이다.
글자 영역을 표현하는 방식 등 글자 검출 관련 기술과, 글자 검출 방법론들을 알아보겠다.</p>
<h1 id="object-detection-vs-text-detection">Object Detection VS Text Detection</h1>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/e0b0895e-a230-4429-808f-344f02b28357/image.png" alt=""></p>
<ul>
<li>Object Detection : 클래스와 위치를 예측하는 문제</li>
<li>Text Detection : 모든 객체는 텍스트 영역, 텍스트라는 단일 클래스의 위치만 예측하는 문제</li>
</ul>
<h1 id="text-detection-특징">Text Detection 특징</h1>
<ol>
<li><p>매우 높은 밀도</p>
</li>
<li><p>극단적 종횡비</p>
</li>
<li><p>특이 모양 - 구겨진 영역, 휘어진 영역, 세로 쓰기 영역
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/90907b41-f4e6-4980-a0a2-c21ed022f44b/image.png" alt=""></p>
</li>
<li><p>모호한 객체 영역</p>
</li>
<li><p>크기 편차
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/b50e5e98-a555-4662-be7e-1daef6aa0a87/image.png" alt=""></p>
</li>
</ol>
<h1 id="글자-영역-표현법">글자 영역 표현법</h1>
<h2 id="사각형">사각형</h2>
<ol>
<li>직사각형 (RECT, Rectangle) </li>
</ol>
<ul>
<li>𝑥1, 𝑦1, 𝑤𝑖𝑑𝑡h, h𝑒𝑖𝑔h𝑡 or (𝑥1, 𝑦1, 𝑥2, 𝑦2)
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/5476c72a-8034-4b8a-8bd3-0a265454fc01/image.png" alt=""></li>
</ul>
<ol start="2">
<li>직사각형+각도 (RBOX, Rotated Box)</li>
</ol>
<ul>
<li>𝑥1, 𝑦1, 𝑤𝑖𝑑𝑡h, h𝑒𝑖𝑔h𝑡, 𝜃 or (𝑥1, 𝑦1, 𝑥2, 𝑦2, 𝜃)
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/2177d902-7e48-42e9-9fb1-79c8a033c54c/image.png" alt=""></li>
</ul>
<ol start="3">
<li>사각형 (QUAD, Quadrilateral)</li>
</ol>
<ul>
<li>(𝑥1,𝑦1,...,𝑥4,𝑦4)
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/5b3d326e-6280-4e43-930c-93a5d822a28a/image.png" alt=""></li>
</ul>
<h2 id="다각형">다각형</h2>
<ul>
<li>Polygon - (𝑥1, 𝑦1, ... , 𝑥n, 𝑦n)</li>
<li>Arbitrary-shaped text를 주로 다루는 최근의 벤치마크들에 적합</li>
<li>일반적으로 2N points를 이용하고,위의 두 점과 쌍이 되는 아래의 두 점을 잡으면 특정 글자 영역이 되도록 상하 점들이 쌍을 이루도록 배치
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/5925c1af-6668-4fe4-8b15-1c79538fdb16/image.png" alt=""></li>
</ul>
<h1 id="regression-based-vs-segmentation-based">Regression-based vs Segmentation-based</h1>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/5cdb12d4-2a98-464e-a8c0-62a3c8288133/image.png" alt=""></p>
<ul>
<li><p>Regression-based : 이미지를 입력 받아 글자 영역 표현값들을 바로 출력함</p>
</li>
<li><p>단점
Arbitrary-shaped text : 불필요한 영역을 포함 (Bounding box 표현 방식의 한계)
Extreme aspect ratio : Bounding box 정확도 하락 (Receptive field의 한계)
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/d38cb203-344e-46f4-83ed-5b7d01230ea3/image.png" alt=""></p>
</li>
<li><p>Segmentation-based : 이미지를 입력 받아 글자 영역 표현값들에 사용되는 화소 단위 정보를 뽑고, 후처리를 통해서 최종 글자 영역 표현 값들을 확보!</p>
</li>
</ul>
<ol>
<li>각 화소별로 글자 영역에 속할 확률</li>
<li>글자영역에 속할 확률 -&gt; 8개의 방향으로 이웃한 화소가 글자 영역에 속할 확률
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/d966ba18-ac65-4e82-bbb6-cb1a82903c81/image.png" alt="">
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/bf1ab386-57d2-4775-8903-d9b69c6ae811/image.png" alt="">
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/8192ab89-21ac-4de0-8844-2217464c437c/image.png" alt=""></li>
</ol>
<ul>
<li>단점
복잡하고 시간이 오래 걸리는 post-processing이 필요할 수 있음
서로 간섭이 있거나 인접한 개체 간의 구분이 어려움.
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/555e1157-c5b8-49e0-bc39-f12e3665a281/image.png" alt=""></li>
</ul>
<h1 id="hybrid">Hybrid</h1>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/df5f19ca-a548-496b-abd9-59a38ee98c55/image.png" alt="">
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/c65a34b1-7402-43b9-8a8f-af89a88e27e7/image.png" alt=""></p>
<h2 id="character-based-methods">Character-Based Methods</h2>
<ul>
<li><p>Character 단위로 검출하고 이를 조합해서 word instance를 예측</p>
</li>
<li><p>Character-level GT 필요</p>
</li>
<li><p>Character region과 affinity(연결성)을 예측 -&gt; Word로 조합
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/4c5c85a9-cd8e-4832-832d-2913ec8007ca/image.png" alt=""></p>
</li>
</ul>
<h2 id="word-based-methods">Word-Based Methods</h2>
<ul>
<li>Word 단위로 예측</li>
<li>대부분의 모델이 해당
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/dcf1c74c-a880-4bcd-8968-55c391b558c2/image.png" alt=""></li>
</ul>
<h1 id="eastan-efficient-and-accurate-scene-text-detector-cvpr-2017">EAST(An Efficient and Accurate Scene Text Detector, CVPR, 2017)</h1>
<ul>
<li>Simple 2-Staged System</li>
<li>Fast inference &amp; end-to-end train
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/94c81547-0191-4662-9f98-038964f2b588/image.png" alt=""></li>
</ul>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/01a1bf96-7da3-44b5-b6dc-7857b1dd2562/image.png" alt=""></p>
<ul>
<li>네트워크가 2가지 정보를 pixel-wise로 출력</li>
</ul>
<ol>
<li>글자 영역 중심에 해당하는지 : score map</li>
<li>어떤 화소가 글자 영역이라면 해당 Bounding box의 위치는 어디인지 : geometry map
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/b20a7a1a-d3b2-4304-b98c-53bbf2d89c79/image.png" alt=""></li>
</ol>
<h2 id="multi-channel-fcn">Multi-Channel FCN</h2>
<ul>
<li>FCN : U-net 구조</li>
<li>Segmentation의 base가 되는 network 구조</li>
<li>pixel-wise prediction
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/96673a7f-9da6-46fd-9fd0-e997f4b36bf7/image.png" alt="">
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/bea00763-19d2-43ae-9b96-ba5e051e4eff/image.png" alt=""></li>
</ul>
<ol>
<li>Feature extractor stem (backbone): PVANet, VGGNet (Code), ResNet50</li>
<li>Feature merging branch: Unpool로 크기 맞추고 concat 1 x 1, 3 x 3 convolution으로 channel 수 조절</li>
<li>Output: H/4 x W/4 x C maps</li>
</ol>
<h2 id="score-map">Score Map</h2>
<p>글자 영역 중심에 해당하는지
H/4 x W/4 x 1 binary map - 글자 영역의 중심이면 1, 배경이면 0
GT bounding box를 줄여서 생성 (글자 높이의 30%만큼 end points를 안쪽으로 이동)
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/71db08a1-0875-44e6-a390-7497622ec684/image.png" alt=""></p>
<h2 id="geometry-map">Geometry Map</h2>
<p>어떤 화소가 글자 영역이라면 해당 Bounding box의 위치는 어디인지 
RBOX (rotated box, 직사각형+각도) 형식: 
회전 각도 예측 -&gt; 1 channel, 
Bounding box의 4개 경계선까지의 거리를 예측 -&gt; 4 channels
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/d9b92370-9cd0-43ce-a6c4-c57d23c87548/image.png" alt="">
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/72afd280-74e9-4308-82c2-f681b719905a/image.png" alt=""></p>
<p>QUAD (quadrilateral, 좌표 4개) 형식:
Bounding box의 4개 점까지의 offset을 예측 -&gt; 8 channels
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/d77e5f82-68c3-4db6-958d-13d469de7714/image.png" alt=""></p>
<p>Post-processing : RBOX 기준
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/27a54ddf-e0f3-4eca-bcef-36bd16bfa3f1/image.png" alt=""></p>
<h1 id="locality-aware-nms">Locality-Aware NMS</h1>
<p>Standard NMS : 복잡도가 O(N^2) 로 Dense prediction 상황에 부적합
Locality-Aware NMS : 인접한 픽셀에서 예측한 bounding box들은 같은 text instance일 가능성이 높음
-&gt; 위치 순서(행 우선)로 탐색하면서 비슷한 것들을 하나로 통합하자. (IoU 기반)
-&gt; 통합 시 score map값으로 weighted merge
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/a7f809a7-f65c-42eb-aff1-4fcfc09d0f2c/image.png" alt=""></p>
<h2 id="loss-terms--rbox-기준">Loss Terms : RBOX 기준</h2>
<p>loss function = loss for score map + loss for geometry map
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/9bb66f35-5bbe-4ac4-85b0-f11d20ca607d/image.png" alt=""></p>
<ul>
<li><p>Ls : Score map loss
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/5efe9e49-4eda-4898-ac0f-cb164c40d56d/image.png" alt=""></p>
</li>
<li><p>Lg : Geometry map loss
직사각형은 IoU loss + 각도값은 cosine</p>
</li>
</ul>
<h2 id="f-score--speed">F-score &amp; Speed</h2>
<p>Speed : Real-time 수준은 아니지만 빠른 속도 (일반적으로 30fps 정도부터 real-time)
LA-NMS의 속도 개선은 효과적 (T!: 네트워크 계산 시간, T&quot;: 후처리(NMS) 시간)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Data Centric] OCR]]></title>
            <link>https://velog.io/@hipjaengyi_cat18/Data-Centric-OCR</link>
            <guid>https://velog.io/@hipjaengyi_cat18/Data-Centric-OCR</guid>
            <pubDate>Tue, 23 May 2023 17:42:34 GMT</pubDate>
            <description><![CDATA[<h1 id="ocr">OCR?</h1>
<p>OCR : Optical Character Recognition
(vs STR : Scene Text Recognition)
OCR = 글자읽기 = 글자 영역 찾기 + 영역 내 글자 인식</p>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/8a6a90fa-3051-4bdb-8819-ac6884a00bf9/image.png" alt=""></p>
<h1 id="object-detection-vs-ocr">Object Detection VS OCR</h1>
<p>Object Detection : 입력이미지에서 정해진 클래스들이 해당하는 각 객체들의 위치는 어디인가?</p>
<p>OCR = Text Detector + Text Recognizer + Serializer + Text Parser
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/48f7cbb1-7b98-45af-87d7-8e08544ab513/image.png" alt=""></p>
<p>Text Detection : 클래스 정보가 필요없고, 글자 영역에 해당 하는 객체의 위치만 추정함
=&gt; Text Detector : 이미지 입력에 글자 영역 위치가 출력인 모델, Object Detection과 다르게 영역의 종횡비, 객체 밀도
=&gt; Text Recognizer : 하나 글자 영역 이미지 입력에 해당 영역 글자열을 출력하는 모델</p>
<p>OCR : Computer Vision과 Natural Language Processing의 교집합
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/40c5c859-6309-40d6-b5a2-2629f08ffe0e/image.png" alt=""></p>
<p>(cf. 유사한 기술 영역으로 Image Captioning(이미지 설명하는 문장생성)이 있음)</p>
<p>=&gt; Serializer : OCR 결과값을 자연어 처리 하기 편하게 일렬로 정렬하는 모듈, 상용화된 기술은 규칙기반이 대부분임 
=&gt; Text Parser : 자연어 처리 모듈 중 가장 많이 사용되는 것은 기 정의된 Key들에 대한 value 추출임
ex ) BIO 태깅을 활용한 개체명 인식 : 문장에서 기 정의된 개체에 대한 값 추출
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/a0b02e74-7afe-46df-b8f7-861f850bbb5c/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/3f37b63d-95c5-4e82-85b4-56a62d447ba0/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Data Centric] Lifecycle of AI Project]]></title>
            <link>https://velog.io/@hipjaengyi_cat18/Data-Centric-Lifecycle-of-AI-Project</link>
            <guid>https://velog.io/@hipjaengyi_cat18/Data-Centric-Lifecycle-of-AI-Project</guid>
            <pubDate>Tue, 23 May 2023 17:05:51 GMT</pubDate>
            <description><![CDATA[<p>실무에서 AI프로젝트 생애주기는 어떻게 될까? SW2.0으로 인한 패러다임으로 데이터셋 제작의 중요성이 대두 되었고, 생애주기에도 데이터셋 제작의 중요성이 강조되었다.
실제 상품화되는 모델의 성능을 개선하고 유지보수하는데 좋은 데이터를 확보하는 것은 매우 중요하다.</p>
<h1 id="ai-research-vs-ai-production">AI Research vs AI Production</h1>
<ul>
<li><p>AI Research
정해진 데이터셋과 평가 방식으로 더 좋은 모델을 찾음</p>
</li>
<li><p>AI Production
데이터셋은 준비되어 있지 않고 서비스 요구사항만 존재함, 따라서 서비스에 적용되는 AI 개발 업무의 상당 부분이 데이터셋을 준비하는 작업임
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/48ed3ced-8155-4191-86f9-c6419a63d6d7/image.png" alt=""></p>
</li>
</ul>
<h1 id="ai-서비스-개발-과정">AI 서비스 개발 과정</h1>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/cfd34494-3a7c-4a09-ab43-f5f5cdad2ea5/image.png" alt=""></p>
<p>-&gt; 이때 서비스를 위한 요구사항을 충족시키는  모델을 지속적으로 확보하는 것이 중요한다
-&gt; 이 방법은 데이터를 통해 모델 성능을 끌어올리는 방법과 모델 성능을 끌어올리는 방식이 있다.</p>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/4525a8a0-84a0-47f6-b874-874126788958/image.png" alt=""></p>
<ul>
<li><p>서비스화를 위한 모델 성능 달성 시 데이터와 모델의 비중
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/01370532-20d2-489b-960c-1c95587e0a65/image.png" alt=""></p>
</li>
<li><p>서비스 이후 모델 성능 개선 시 데이터와 모델에 대한 비중
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/4f64d55a-ac5c-4399-9239-68ed2652c7fa/image.png" alt=""></p>
</li>
</ul>
<h2 id="데이터-관련-업무의-어려움">데이터 관련 업무의 어려움</h2>
<p>데이터 관련 업무가 많은 이유</p>
<h2 id="어떻게-하면-좋을지-잘-안알려져-있다">어떻게 하면 좋을지 잘 안알려져 있다</h2>
<p>학계에서 데이터를 다루기 힘든 이유</p>
<ol>
<li>좋은 데이터를 많이 모으기 힘듦</li>
<li>라벨링 비용이 크다</li>
<li>작업 기간이 오래 걸린다</li>
</ol>
<h2 id="데이터-라벨링-작업은-생각보다-많이-많이-어렵다">데이터 라벨링 작업은 생각보다 많이 많이 어렵다</h2>
<p>-&gt; 데이터가 많다고 모델 성능이 항상 올라가는 것이 아니다, 따라서 제대로된 라벨링이 중요하다. 하지만 데이터 라벨링 작업 생각보다 많이 어렵다</p>
<p>=&gt; 라벨링 노이즈는 학습에 얼마나 영향을 줄까?
=&gt; 라벨링 노이즈를 학습 시 무시하게 하려면 적어도 깨끗이 라벨링된 결과가 2배 이상 필요하다</p>
<p>=&gt; 그렇다면 양이 적더라도 제대로된 데이터만 있으면 괜찮을까?
=&gt; 적은 데이터도 골고루 있어야지 너무 유사한 데이터만 있으면 좋은 모델을 확보하기 힘들다
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/0d686a7a-491d-4cf0-bfb6-69cb34685f0c/image.png" alt=""></p>
<ul>
<li><a href="https://www.youtube.com/watch?v=06-AZXmwHjo">https://www.youtube.com/watch?v=06-AZXmwHjo</a></li>
</ul>
<h3 id="라벨링-노이즈와-데이터-분포와-연관성">라벨링 노이즈와 데이터 분포와 연관성</h3>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/2c4eae68-de6c-4d26-b8fb-0567e52808c0/image.png" alt=""></p>
<ul>
<li>Common : 자주 보는 샘플은 라벨링 작업자도 인지하고 있고, 작업 가이드를 만들 때 해당 데이터를 고려해서 만들기 때문에 라벨링 노이즈가 적다</li>
<li>Rare : 희귀 케이스인 경우 작업 가이드에서 다루지 않을 수도 있고, 라벨링 작업자별로 다르게 생각해 작업할 가능성이 크다
ex)
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/27f016c1-e312-4f32-a99b-3d47219685e0/image.png" alt="">
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/13878ac8-9a5b-4e15-b7b3-1125484e93ff/image.png" alt=""></li>
</ul>
<h2 id="데이터-불균형을-바로-잡기가-많이-어렵다">데이터 불균형을 바로 잡기가 많이 어렵다</h2>
<p>=&gt; Rare 케이스일 경우 해당 샘플들을 모아 라벨링 가이드를 만들어야됌
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/5f40605c-14a8-4991-a0d7-922e640fe0d5/image.png" alt=""></p>
<p>=&gt; Rare케이스를 바로 잡는 과정은 어떻게 효율화 할 수 있을까?</p>
<ol>
<li>해당 task에 대한 지식이 많아야 예외를 미리 인지 할 수 있다.
ex) 테슬라의 예외처리(트리거라고 지칭하고 221를 정의하고 관리함)
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/cee2ac9d-1f10-41ca-966d-31ba36d5db25/image.png" alt=""></li>
</ol>
<ol start="2">
<li>모든 경우를 완벽하게 아는 경우는 불가능하지 이를 반복적이고 자동화된 작업으로 만들어야함
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/7b00b459-d2ff-43e1-879b-1d1efaebd277/image.png" alt=""></li>
</ol>
<h1 id="data-engine--flywheel">Data Engine &amp; Flywheel</h1>
<p>=&gt; 데이터 관점에서 서비스 개발시 필요한 기능</p>
<ol>
<li>데이터셋 시각화</li>
</ol>
<p>-&gt; 데이터, 레이블 분포 시각화, 레이블 시각화, 데이터 별 예측값 시각화</p>
<ol start="2">
<li>데이터 라벨링</li>
</ol>
<p>-&gt; 태스크 특화 기능, 라벨링 일관성 확인, 라벨링 작업 효율 확인, 자동 라벨링,...</p>
<ol start="3">
<li>데이터셋 정제</li>
</ol>
<p>-&gt; 반복 데이터 제거, 라벨링 오류 수정</p>
<ol start="4">
<li>데이터셋 선별</li>
</ol>
<p>-&gt; 모델 성능 향상을 위해 어떤 데이터를 라벨링 해야하는가?</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Data Centric] Software 1.0 VS Software 2.0]]></title>
            <link>https://velog.io/@hipjaengyi_cat18/Data-Centric-Software-1.0-VS-Software-2.0</link>
            <guid>https://velog.io/@hipjaengyi_cat18/Data-Centric-Software-1.0-VS-Software-2.0</guid>
            <pubDate>Tue, 23 May 2023 15:37:00 GMT</pubDate>
            <description><![CDATA[<p>실제 딥러닝 기반 프로덕트를 배포 시 중요시 되는 것 중 하나는 데이터셋 제작이다. 소프트웨어 개발 방식인 Software 1.0, Software 2.0을 알아보고, 데이터셋 제작 측면에서 Software 1.0와 Software 2.0 차이점을 알아보자</p>
<h1 id="software-10">Software 1.0</h1>
<ol>
<li>문제 정의</li>
<li>큰 문제를 작은 문제들의 집합으로 분해</li>
<li>개별 문제 별로 알고리즘 설계</li>
<li>솔루션들을 합쳐 하나의 시스템으로 만듦</li>
</ol>
<h2 id="1-문제-정의">1. 문제 정의</h2>
<p>ex) 비디오를 적은 용량으로 저장할 때 품질 저하 없이 저장할 수는 없을까?
-&gt; 비디오를 품질 저하 없이 아주 적은 용량의 데이터로 표현해 저장하고, 재생할 때 원본 비디오로 복원하자
-&gt; Video Codec : Video Encoder + Decoder</p>
<h2 id="2-큰-문제를-작은-문제들의-집합으로-분해">2. 큰 문제를 작은 문제들의 집합으로 분해</h2>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/9fcff992-8e93-4ca6-b385-c39f32f81eed/image.png" alt=""></p>
<h2 id="3-개별-문제-별로-알고리즘-설계">3. 개별 문제 별로 알고리즘 설계</h2>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/07d7bb3e-37f6-45e8-8e91-09ed5a18ba5d/image.png" alt=""></p>
<h2 id="4-솔루션들을-합쳐-하나의-시스템으로-만듦">4. 솔루션들을 합쳐 하나의 시스템으로 만듦</h2>
<ul>
<li><p>Chipset/HW
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/8d962921-aa16-4bb8-822b-7fd9ffc27c0d/image.png" alt=""></p>
</li>
<li><p>SDK/SW
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/2fa5f93b-c7b2-444e-a2ec-be393f9b2a2d/image.png" alt=""></p>
</li>
</ul>
<h2 id="software-10-성공사례">Software 1.0 성공사례</h2>
<ul>
<li><p>internet : TCP/IP stack
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/1ebb641a-7279-4821-a40d-5dbaba01c2ed/image.png" alt=""></p>
</li>
<li><p>Smartphone : Android Stack
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/1eb11a04-a8f7-4cf1-9064-840b257e5c65/image.png" alt=""></p>
</li>
</ul>
<h1 id="software-10---image-detection">Software 1.0 - image detection</h1>
<h2 id="human-detection">Human Detection</h2>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/fe2a4ae0-89b2-4484-b5dc-9da1a9233e0e/image.png" alt="">
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/c2dd7f52-45c5-40ed-bcb4-2851104ccbfc/image.png" alt=""></p>
<h3 id="큰-문제를-작은-문제들의-집합으로-분해하고-문제별로-알고리즘-설계">큰 문제를 작은 문제들의 집합으로 분해하고 문제별로 알고리즘 설계</h3>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/03a3d536-8c93-43d1-98fe-223d5ef11047/image.png" alt="">
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/020cb960-bc04-4028-a68b-7294b95d39c5/image.png" alt="">
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/c05dacc1-eb93-4940-b335-3986a5e01406/image.png" alt=""></p>
<h2 id="object-detection">object detection</h2>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/43ee535a-ba4a-4487-bcda-94cc9f53a31e/image.png" alt="">
-&gt; SW1.0은 객체 검출에서 대응하기 어려운 케이스가 많았음
-&gt; DPM-v1은 21%, DPM-v5는 33.7%로 SW1.0 방식으로 설계된 방법론은 높은 성능을 갖지 못했음
-&gt; SW2.0이 이에 대한 해결책으로 등장했고, SW2.0 방식의 방법론들이 높은 성능을 보여주고 있음
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/4b1c1008-ffb7-4679-9df4-bdd56c9a34e6/image.png" alt=""></p>
<ul>
<li><a href="https://arxiv.org/pdf/1905.05055.pdf">https://arxiv.org/pdf/1905.05055.pdf</a></li>
</ul>
<h1 id="software-20">Software 2.0</h1>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/c234cbb2-4696-4cf4-a352-114e7624668c/image.png" alt=""></p>
<ul>
<li><a href="https://www.researchgate.net/figure/Conventional-machine-learning-and-deep-learning_fig2_337804593">https://www.researchgate.net/figure/Conventional-machine-learning-and-deep-learning_fig2_337804593</a></li>
</ul>
<p>SW1.0 : 어떤 연산을 할 지 사람이 정함
SW2.0 : neural network(AI)의 구조에 의해 검색영역이 정해지고,
최적화를 통해 목적에 제일 부합하는 연산 집합을 찾음
이때 경로와 목적지는 데이터와 최적화 방법에 의해서 정해짐
=&gt; AI 모델 성능 : 코드(모델 구조 + 최적화 방법) + 데이터</p>
<p>=&gt; 구조 설계 시 사람의 개입이 필요하지만, 점점 개입을 줄이고 최적화에 더 신경 씀
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/190d3bcf-7ef6-49a4-8c26-b14c50ed19f9/image.png" alt=""></p>
<h2 id="sw20---transformer">SW2.0 - Transformer</h2>
<ul>
<li>음성인식
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/0e9a8dc2-c04a-4827-8469-fe165c885f1f/image.png" alt=""></li>
</ul>
<ul>
<li><p>기계번역
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/288ad416-117a-4de4-a37d-97a3f3cad7d1/image.png" alt=""></p>
</li>
<li><p>객체검출
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/ebf5ba79-8075-4805-a6eb-a244fba833e9/image.png" alt=""></p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Object Detection] Neck]]></title>
            <link>https://velog.io/@hipjaengyi_cat18/Object-Detection-Neck</link>
            <guid>https://velog.io/@hipjaengyi_cat18/Object-Detection-Neck</guid>
            <pubDate>Thu, 04 May 2023 03:19:33 GMT</pubDate>
            <description><![CDATA[<p>이번 강의에서는 이미지에서 Feature를 추출하는 Backbone과 Region Proposal Network(RPN)을 연결하는 Neck에 대해 알아봅니다.  Neck은 왜 필요한지, Neck의 종류에는 어떤 것들이 있는지(FPN, PANet, DetectorRS, BiFPN, NASFPN, AugFPN) 훑어볼 것입니다. 각 구조가 어떤 아이디어에서 출발했는지, 어떤 구조를 갖는지, 또 어떻게 구현되어 있는지 꼼꼼히 학습해봅시다.</p>
<h2 id="neck은-왜-필요한지">Neck은 왜 필요한지?</h2>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/df45ecf1-8dcf-4871-8fd5-653958af13a7/image.png" alt="">
 다양한크기의객체를더잘탐지하기위해서</p>
<p> • Low level의 feature는 semantic이 약하므로 상대적으로 semantic이 강한 high feature와의
교환이 필요
 <img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/ecbb1120-5091-441d-bda1-9a0449008ec6/image.png" alt=""></p>
<h2 id="neck의-종류에는-어떤-것들이-있는지">Neck의 종류에는 어떤 것들이 있는지</h2>
<p>FPN, PANet, DetectorRS, BiFPN, NASFPN, AugFPN</p>
<h1 id="fpn">FPN</h1>
<p>high level에서 low level로 semantic 정보 전달 필요
따라서 top-down path way 추가
• Pyramid 구조를 통해서 high level 정보를 low level에 순차적으로 전달
• Low level = Early stage = Bottom
• High level = Late stage = Top
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/26217131-b77d-4955-b2bb-2d70b01e4762/image.png" alt="">
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/878d2fae-e97e-426b-a99b-1d25b4bf42b0/image.png" alt=""></p>
<h2 id="bottom-up">Bottom-up</h2>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/38c19ee4-51ce-468b-be9f-5125d179e522/image.png" alt=""></p>
<h2 id="top-down">Top-down</h2>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/82fc57c4-8f1b-4ae0-835d-09b37e44f9e0/image.png" alt=""></p>
<h2 id="lateral-connections">Lateral connections</h2>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/a66964a9-da3f-4297-a46e-44c068766efe/image.png" alt=""></p>
<ul>
<li><p>Bottom-up
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/1cff6f35-0374-4720-91cf-f989eb5dd205/image.png" alt=""></p>
</li>
<li><p>Top-down
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/ea841b93-a1e1-4bb1-a596-fa2e5c92a44e/image.png" alt=""></p>
</li>
</ul>
<p>** Nearest Neighbor Upsampling
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/128dbc5e-4f53-4d32-8bf1-80680880939e/image.png" alt=""></p>
<h2 id="contribution">Contribution</h2>
<p>• 여러 scale의 물체를 탐지하기 위해 설계
• 이를 달성하기 위해서는 여러 크기의 feature를 사용해야할 필요가 있음</p>
<h2 id="summary">Summary</h2>
<p>• Bottom up (backbone)에서 다양한 크기의 feature map 추출
• 다양한 크기의 feature map의 semantic을 교환하기 위해 top-down 방식 사용</p>
<h1 id="panet">PANet</h1>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/cf1b5aff-3906-43b4-bc49-1bf11a72a4d6/image.png" alt=""></p>
<p>backbone이 resnet으로 low level feature map이 다음 Layer로 bottom-up 하게되는 시간이 오래걸림, feature를 제대로 전달 될 수 없음</p>
<h2 id="bottom-up-path-augmentation">Bottom-up Path Augmentation</h2>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/4b9ea22f-5ca2-4042-8e55-67f0a65ea354/image.png" alt="">
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/69341bc9-b807-418c-84de-9ba8a4e66bc9/image.png" alt=""></p>
<h1 id="detectors">DetectoRS</h1>
<p>Motivation
• Looking and thinking twice
• Region proposal networks (RPN) • Cascade R-CNN</p>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/391a6a61-a8af-44d8-82d6-4e64cc267bce/image.png" alt=""></p>
<h2 id="recursive-feature-pyramid-rfp">Recursive Feature Pyramid (RFP)</h2>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/6c04637a-04df-4919-9f95-8da8af9b9d14/image.png" alt="">
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/2a4a5ece-7ddd-4a35-a6a6-a9916fd5802a/image.png" alt=""></p>
<h2 id="aspp">ASPP</h2>
<p>receptive field를 늘리기 위한 방법</p>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/379ff19b-cab5-44c1-a21e-5615f7852d35/image.png" alt=""></p>
<h2 id="switchable-atrous-convolution-sac">Switchable Atrous Convolution (SAC)</h2>
<h1 id="bifpn">BiFPN</h1>
<p>EfficientDet: Scalable and Efficient Object Detection 에서 소개됌
Bi-directional Feature Pyramid</p>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/f62cc2b7-9538-4bc5-ab73-096e43b62990/image.png" alt="">
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/d4940097-b8de-48ec-95b3-2d63ee5e9b1e/image.png" alt=""></p>
<h2 id="weighted-feature-fusion">Weighted Feature Fusion</h2>
<p>• FPN과 같이 단순 summation을 하는 것이 아니라 각 feature별로 가중치를 부여한 뒤 summation
• 모델 사이즈의 증가는 거의 없음
• feature별 가중치를 통해 중요한 feature를 강조하여 성능 상승
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/7c217dd1-b6d5-42dc-aaad-c4ed6fe45e16/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/93088f03-7a09-4396-be49-870807baa5c5/image.png" alt=""></p>
<h1 id="nasfpn">NASFPN</h1>
<p>NAS-FPN : Learning Scalable Feature Pyramid Architecture for Object Detection 에서 제안됌
• 기존의 FPN, PANet : Top-down or bottom up pathway
• 단순 일방향(top-&gt;bottom or bottom -&gt;top) summation 보다 좋은 방법이 있을까?
• 그렇다면 FPN 아키텍처를 NAS (Neural architecture search)를 통해서 찾자!
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/fd1ab4ad-d5b2-4da9-af1a-1bf79c52513f/image.png" alt="">
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/9dc1ccd6-c67c-436e-bbce-9a0a15b23702/image.png" alt="">
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/b0579600-8844-4ea1-a157-90d0a6e57dc3/image.png" alt=""></p>
<h2 id="요약">요약</h2>
<p>• COCO dataset, ResNet기준으로 찾은 architecture, 범용적이지 못함 • Parameter가 많이 소요
• High search cost
• 다른 Dataset이나 backbone에서 가장 좋은 성능을 내는 architecture를 찾기 위해 새로운 search cost</p>
<h1 id="augfpn">AugFPN</h1>
<p>AugFPN : Improving Multi-scale Feature Learning for Object Detection에서 제안됌
• Problems in FPN
  • 서로 다른 level의 feature간의 semantic차이
  • Highest feature map의 정보 손실
  • 1개의 feature map에서 RoI 생성
 <img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/ecd078f7-12b3-4fcc-a586-54af3acd39b7/image.png" alt=""></p>
<p>• 주요구성
  • Consistent Supervision
  • Residual Feature Augmentation
  • Soft RoI Selection</p>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/4bf35284-046a-4f30-bda1-e19bdb79dcf6/image.png" alt=""></p>
<h2 id="residual-feature-augmentation">Residual Feature Augmentation</h2>
<p>  • Ratio-invariant Adaptive Pooling
  • 다양한 scale의 feature map 생성
  • 256 channels</p>
<p> <img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/825cd063-9dad-4969-9242-7304caca9ddb/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/484c0176-7c27-4eed-8fb5-9a4f29881b35/image.png" alt=""></p>
<ol>
<li>동일한 size로 upsampling</li>
<li>Adaptivie Spatial Fusion : N 개의 feature에 대해 가중치를 두고 summation 하는 방법</li>
<li>3개의 feature map을 Concat하고 N x ( 1 x h x w ) 의 값을 구함
이 때 N x ( 1 x h x w ) 은 spatial weight를 의미
N x ( 1 x h x w ) 를 각 N 개의 feature에 곱해 가중 summation</li>
</ol>
<h2 id="soft-roi-selection">Soft RoI Selection</h2>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/24f4d5f8-0637-47d1-b660-a3416a6f150a/image.png" alt="">
• FPN과 같이 하나의 feature map에서 RoI를 계산하는 경우 sub-optimal
• 이를 해결하기 위해 PANet에서 모든 feature map을 이용했지만, max pool하여 정보 손실 가능성
• 이를 해결하기 위해 Soft RoI Selection을 설계</p>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/d7e3bf12-f7d7-4937-9c83-751028991909/image.png" alt=""></p>
<ol>
<li>모든 scale의 feature에서 RoI projection 진행 후 RoI pooling</li>
<li>Channel-wise 가중치 계산 후 가중 합을 사용, PANet의 max pooling을 학습 가능한 가중 합으로 대체</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Object Detection] 2 stage detectors - MMDetection, Detectron2]]></title>
            <link>https://velog.io/@hipjaengyi_cat18/Object-Detection-2-stage-detectors-MMDetection-Detectron2</link>
            <guid>https://velog.io/@hipjaengyi_cat18/Object-Detection-2-stage-detectors-MMDetection-Detectron2</guid>
            <pubDate>Wed, 03 May 2023 16:07:35 GMT</pubDate>
            <description><![CDATA[<p>Object Detection은 통합된 라이브러리의 부재
실무 / 캐글에서는 아래 두 라이브러리를 주로 활용함
• MMDetection
• Detectron2</p>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/2b12f545-fed6-43c6-b205-7d0da28f0983/image.png" alt=""></p>
<h1 id="mmdetection">MMDetection</h1>
<p>Pytorch 기반의 Object Detection 오픈소스 라이브러리</p>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/0194ed90-0649-4abb-96a8-8eb1eea7e764/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/45581da9-fe37-4b0d-be5e-8b2f2d181694/image.png" alt=""></p>
<ul>
<li>2 Stage 모델은 크게 Backbone / Neck / DenseHead / RoIHead 모듈로 나눌 수 있음</li>
<li>각각의 모듈 단위로 커스터마이징</li>
<li>이러한 시스템은 config 파일을 이용해 통제됨</li>
</ul>
<ul>
<li>Backbone – 입력 이미지를 특징 맵으로 변형</li>
<li>Neck – backbone과 head를 연결, Feature map을 재구성 (ex. FPN)</li>
<li>DenseHead – 특징 맵의 dense location을 수행하는 부분임</li>
<li>RoIHead –RoI 특징을 입력으로 받아 box 분류, 좌표 회귀 등을 예측하는 부분임</li>
</ul>
<h1 id="detectron2">Detectron2</h1>
<p>• Facebook AI Research의 Pytorch 기반 라이브러리
• Object Detection 외에도 Segmentation, Pose prediction 등 알고리즘도 제공</p>
<p>• Setup Config / Setup Trainer / Start Training</p>
<h3 id="-setup-config">• Setup Config</h3>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/aa0b04d0-911d-4856-89e6-67119e21ae1c/image.png" alt=""></p>
<h3 id="-setup-trainer">• Setup Trainer</h3>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/40c535e8-0a60-4e46-9eb5-e262cb3cfd11/image.png" alt=""></p>
<p>  • build_model
  • build_detection_train/test_loader • build_optimizer
  • build_lr_scheduler</p>
<h3 id="-start-training">• Start Training</h3>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/d3ad6703-3fd5-4feb-bf1f-963534dc294e/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Object Detection] 2 stage detectors]]></title>
            <link>https://velog.io/@hipjaengyi_cat18/2-stage-detectors</link>
            <guid>https://velog.io/@hipjaengyi_cat18/2-stage-detectors</guid>
            <pubDate>Wed, 03 May 2023 14:24:49 GMT</pubDate>
            <description><![CDATA[<p>Object Detection 모델들은 크게 2 Stage Detector와 1 Stage Detector로 구분이 가능합니다. 저희는 그 중 먼저 2 Stage Detector에 대해 학습해봅시다. 이번 강의에서는 R-CNN부터 SPPNet, Fast R-CNN, 그리고 최신 2 Stage Detector들의 기초가 되는 Faster R-CNN까지 차례로 훑으며 모델 발전의 역사를 알아봅니다. 각각의 연구가 어떤 메소드를 활용했는지, 또 각각 연구에 어떤 단점들이 존재하는지, 해당 단점들을 해결하기 위해 다음 연구에서 어떤 방법을 활용했는지 주의 깊게 살펴봅시다.</p>
<h1 id="2-stage-detectors">2 stage detectors</h1>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/9564cf13-578c-41e7-a7d4-7329c76364fd/image.png" alt=""></p>
<h1 id="r-cnn">R-CNN</h1>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/d3955a09-ccbe-4ad6-838a-9cd48e89bcd2/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/f3935929-d666-49a9-b44f-150bf530f7f2/image.png" alt=""></p>
<ol>
<li><p>selective search을 통해 약 2000개의 RoI를 추출</p>
</li>
<li><p>RoI 크기를 조절해 모두 동일한 사이즈로 warping(변형)
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/6848a632-7c56-4813-996f-e697c26e72da/image.png" alt=""></p>
</li>
</ol>
<ul>
<li>CNN의 마지막인 FC layer의 입력 사이즈가 고정이므로 warping 과정 필요함</li>
</ul>
<ol start="3">
<li>RoI를 CNN에 넣어, feature를 추출함</li>
</ol>
<ul>
<li>각 region 마다 4096-dim feature vector가 추출됨(2000X4096)</li>
<li>pretrained AlexNet 구조 활용해 AlexNet 마지막에 FC layer 추가하고 필요에 따라 Findtuning 진행함
  AlexNet
  • Domain specific finetuning
  • Dataset 구성
  • IoU &gt; 0.5: positive samples
  • IoU &lt; 0.5: negative samples
  • Positive samples 32, negative samples 96</li>
</ul>
<ol start="4">
<li>CNN을 통해 나온 feature를 SVM에 넣어 분류를 진행함</li>
</ol>
<ul>
<li>input : 2000X4096 features</li>
<li>output : Class개수 + 배경여부 = Class(C+1) + Confidence scores</li>
</ul>
<p>• Linear SVM
    Dataset 구성
  • Ground truth: positive samples
  • IoU &lt; 0.3: negative samples
  • Positive samples 32, negative samples 96</p>
<ul>
<li>Hard negative mining
• Hard negative: False positive
• 배경으로 식별하기 어려운 샘플들을 강제로 다음 배치의 negative sample로 mining하는 방법</li>
</ul>
<ol start="5">
<li>CNN을 통해 나온 feature를 regression을 통해 bounding box 예측
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/746c911a-4d9f-4f38-a503-cfff7f8456fb/image.png" alt="">
• IoU &gt; 0.5: positive samples
• IoU &lt; 0.5: negative samples
• Positive samples 32, negative samples 96</li>
</ol>
<p>• Bbox regressor
    • Dataset 구성
        IoU &gt; 0.6 : positive samples
    • Loss function :  MSE Loss</p>
<h2 id="요약">요약</h2>
<p>2000개의 Region을 각각 CNN통과
강제 warping, 성능하락 가능성
CNN, SVM, bounding box regressor 따로 학습
End to End X</p>
<h2 id="한계점">한계점</h2>
<p>• Convolution Network의 입력 이미지가 고정되어 있음
    이미지를 고정된 크기로 자르거나(crop) 비율을 조정(warp)해야함
• RoI(Region of Interest)마다 CNN통과
    하나의 이미지에 대해서 2000번 CNN을 통과 해야함 → 시간이 오래 걸림</p>
<h1 id="sppnet">SPPNet</h1>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/91d4204a-9746-4397-9148-72211f2db87f/image.png" alt=""></p>
<h2 id="rcnn과-비교">RCNN과 비교</h2>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/087ccd6f-ad85-4ca4-9007-162053ba96a0/image.png" alt=""></p>
<h2 id="pipeline">Pipeline</h2>
<ol>
<li>입력이미지를 ConvNet을 거쳐 feature map 추출(conv5)</li>
<li>Spatial Pyrmaid Pooling Layer를 통해 feature map에서 RoI추출, RoI Pooling을 통해 일정한 크기의 feature가 추출</li>
</ol>
<p>• 고정된 vector얻기 위한 과정
• SPP사용
• pyramid level: 1
• Target grid size: 7x7</p>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/f7f30ab9-1668-4e38-9b82-2d834eaffa35/image.png" alt=""></p>
<h2 id="spatial-pyramid-pooling">Spatial Pyramid Pooling</h2>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/225fbdf8-2b59-40f5-80a0-0aaea2b726fb/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/0d676145-7d92-42d5-bb60-1c8a3438b260/image.png" alt=""></p>
<p>RCNN에서는 원본 이미지에서 selected search를 통해 RoI를 추출하지만
SPP에서는 feature map에서 RoI를 추출함
RCNN과 같은 방식으로 RoI를 추출할 수는 없음
원본 이미지에서 추출된 2000개의 RoI를 feature map에 projection(투영,투사)을 함
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/704e316d-cbdd-4499-890c-bb04ceca5157/image.png" alt=""></p>
<p>만약 cnn을 통해 feature map이 원본 이미지 크기 보다 작아진 경우
(1/10로 작아졌을 경우)
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/ca528abc-02ca-437e-98e7-655882a84daa/image.png" alt=""></p>
<ol start="3">
<li>Fully connected layer 이후, Softmax Classifier과 Bounding Box Regressor
• 클래스 개수: C+1개
• 클래스 (C개) + 배경 (1개)</li>
</ol>
<h2 id="training">Training</h2>
<p>• multi task loss 사용
    • (classification loss + bounding box regression)
• Loss function
    • Classification : Cross entropy
    • BB regressor : Smooth L1
• Dataset 구성
    • IoU &gt; 0.5: positive samples
    • 0.1 &lt; IoU &lt; 0.5: negative samples
    • Positive samples 25%, negative samples 75%
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/4200a302-f678-4e23-9259-0b1b59d8984e/image.png" alt=""></p>
<p>• Hierarchical sampling
  • R-CNN의 경우 이미지에 존재하는 RoI를 전부 저장해 사용
  • 한 배치에 서로 다른 이미지의 RoI가 포함됨
  • Fast R-CNN의 경우 한 배치에 한 이미지의 RoI만을 포함
  • 한 배치 안에서 연산과 메모리를 공유할 수 있음</p>
<h2 id="한계점-1">한계점</h2>
<p>기존의 RCNN의 한계점인 </p>
<p>1) 2000개의 RoI 각각 CNN 통과
2) 강제 Warping, 성능 손실 가능성
을 해소함</p>
<h1 id="fast-r-cnn">Fast R-CNN</h1>
<h2 id="한계점-2">한계점</h2>
<p>기존의 RCNN의 단점인</p>
<ol>
<li>2000개의 Region을 각각 CNN통과</li>
<li>강제 warping, 성능하락 가능성</li>
<li>CNN, SVM, bounding box regressor 따로 학습을 해결함</li>
</ol>
<h1 id="faster-r-cnn">Faster R-CNN</h1>
<p><a href="blob:https://velog.io/7fa74fce-9cc7-4e51-baaf-1514bc6ad6dc">업로드중..</a></p>
<ol>
<li>이미지를 CNN에 넣어 feature maps 추출 (CNN을 한 번만 사용)</li>
<li>RPN을 통해 RoI 계산
• 기존의 selective search 대체
• Anchor box 개념 사용
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/e53aa8d2-c3ae-409b-b7b1-58ef87e1153f/image.png" alt=""></li>
</ol>
<h2 id="region-proposal-network-rpn">Region Proposal Network (RPN)</h2>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/4f5ea501-0e66-4acf-bc28-f11b839d0086/image.png" alt="">
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/2af11ed7-0795-4f0d-8e7f-3872b0e627b8/image.png" alt=""></p>
<p>2-1)  CNN에서 나온 feature map을 input으로 받음. (𝐻: 세로, 𝑊: 가로, 𝐶: 채널)</p>
<p>2-2) 3x3 conv 수행하여 intermediate layer 생성
(채널을 512로 맞춰주기 위한 과정)</p>
<p>2-3) 1x1 conv 수행하여 binary classification 수행</p>
<ul>
<li>왜 18개 채널인가? 9개의 anchors box가 객체인지 아닌지 판별 </li>
<li><blockquote>
<p>2 (object or not) x 9 (num of anchors) 채널 생성</p>
</blockquote>
</li>
</ul>
<p>2-4) 1x1 conv 수행하여 bounding box regression 수행</p>
<ul>
<li>왜 36개 채널인가? 9개의 anchors box의 중심점 좌표 x, y, 가로길이, 세로길이</li>
<li><blockquote>
<p>4 (bounding box) x9 (num of anchors) 채널 생성</p>
</blockquote>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/66335eff-64c9-4cac-be3f-833fffe104bf/image.png" alt=""></p>
<h2 id="nms">NMS</h2>
<p>• N개의 RoI 중 유사한 RPN Proposals 제거하기 위해 사용
• Class score를 기준으로 proposals 분류
• IoU가 0.7 이상인 proposals 영역들은 중복된 영역으로 판단한 뒤 제거</p>
<ul>
<li>약 2000개 RoI 중에서 1000~1200개로 줄임</li>
</ul>
<p>예시) 
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/c48c63ca-71db-49b5-aa92-96050afa2d9e/image.png" alt="">
-&gt; bb1과 bb2는 0.8 만큼 유사하므로 bb2 클래스 스코어 0으로 변경해 제거</p>
<h2 id="traning">traning</h2>
<ol>
<li>Region Proposal Network (RPN)
• RPN 단계에서 classification과 regressor학습을 위해 앵커박스를 positive/negative samples 구분
• 데이터셋 구성
• IoU &gt; 0.7 or highest IoU with GT: positive samples
• IoU &lt; 0.3: negative samples
• Otherwise : 학습데이터로 사용 X
<img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/7b064b21-a1c1-49fe-acef-95abb5651ee8/image.png" alt=""></li>
</ol>
<ol start="2">
<li><p>Region proposal 이후 Fast RCNN 학습을 위해 positive/negative samples로 구분
• 데이터셋 구성
• IoU &gt; 0.5: positive samples → 32개
• IoU &lt; 0.5: negative samples → 96개
• 128개의 samples로 mini-batch 구성
• Loss 함수
• Fast RCNN과 동일</p>
</li>
<li><p>RPN과 Fast RCNN 학습을 위해 4 steps alternative training 활용
• Step 1) Imagenet pretrained backbone load + RPN 학습
• Step 2) Imagenet pretrained backbone load + RPN from step 1 + Fast RCNN 학습
• Step 3) Step 2 finetuned backbone load &amp; freeze + RPN 학습
• Step 4) Step 2 finetuned backbone load &amp; freeze + RPN from step 3 + Fast RCNN 학습</p>
<p>• 학습 과정이 매우 복잡해서, 최근에는 Approximate Joint Training 활용</p>
</li>
</ol>
<h1 id="summary">summary</h1>
<p><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/a33fa940-27f7-42a1-8c16-79d073d9bc74/image.png" alt=""></p>
<h1 id="한계점-3">한계점</h1>
<p>하지만 RCNN에서 여러 한계점을 극복하는 모델이 나왔지만 2 stage 모델은 여전히 속도면에서 한계점이 존재함</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ 📸 Image Classification(이미지 분류)(3)-  👨‍🏫Transfer learning, Knowledge distillation, Noisy Student까지 | 내가보려고정리한AI🧐]]></title>
            <link>https://velog.io/@hipjaengyi_cat18/Transfer-learning-Knowledge-distillation-Recap</link>
            <guid>https://velog.io/@hipjaengyi_cat18/Transfer-learning-Knowledge-distillation-Recap</guid>
            <pubDate>Sun, 02 Apr 2023 12:47:02 GMT</pubDate>
            <description><![CDATA[<h1 id="preview">Preview</h1>
<p>질 좋은 데이터셋은 매우 비싸고 얻기에 매우 힘들다. 이번 장에서는 질 좋은 데이터셋으로 학습된 모델을 Transfer 해서 small dataset으로 학습하는  Transfer learning와, Knowledge distillation 방법을 알아보고, 이를 이용한 Noisy Student 모델을 탐구해보겠다. </p>
<h1 id="transfer-learning">Transfer learning</h1>
<p>Supervised learning(지도학습)은 매우 큰 스케일의 데이터셋을 요구한다. 하지만 새로운 Task에 적용 시 raw data를 Annotating 하는 것은 매우 비싸다.
또한 데이터가 적으므로 데이터 구축 시 사람이 클래스를 구분하여 학습데이터를 만들면 사람의 편향이 들어가 퀄리티가 높지 않은 데이터가 나올 확률이 높으므로 좋은 퀄리티를 만들어내는 것도 쉽지 않다.</p>
<p>🆀 유사한 데이터셋은 공통의 정보를 공유하고 있지 않을까? 또한 다른 Task여도 같은 이미지이지 공통점이 있지 않을까?
🅰 질 좋은 유사한 데이터셋으로 학습된 모델을 활용하면 우리는 쉽고 경제적으로 우리가 다루고 있는 task에 모델을 적용할 수 있을 것이다. 또한 성능도 어느정도 보장할 수 있을 것이다.</p>
<h2 id="transfer-learning-방법론">Transfer learning 방법론</h2>
<ol>
<li><p>Transfer knowledge from a pre-trained task to a new task</p>
</li>
<li><p>Fine-tuning the whole model</p>
</li>
<li><p>Teacher-student learning(Knowledge distillation)</p>
</li>
</ol>
<h2 id="transfer-knowledge">Transfer knowledge</h2>
<ul>
<li>Chop off the final layer of the pre-trained model,add and only re-train a new FClayer</li>
<li>Extracted features preserve all the knowledge from pre-training</li>
<li>학습된 task를 새로운 Task로 지식을 이전 하기</li>
<li>하나의 데이터셋을 미리 학습한 모델의 FC layers에 새로운 테스크의 FC layers만 새로 붙이고 FC layers만 학습시킴<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/c16b6a0e-7db1-4e0d-ac19-52ee3b6ab5c7/image.png" width="400px"></p>


</li>
</ul>
<h2 id="fine-tuning">Fine-tuning</h2>
<ul>
<li>하나의 데이터셋을 미리 학습한 모델의 FC layers에 새로운 테스크의 FC layers만 새로 붙이고 FC에는 높은 학습률, Conv에는 낮은 학습률로 진행</li>
<li>Replace the final layer of the pre-trained model to a new one,and re-train the whole model </li>
<li>Set learning rates differently<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/cc3936fa-d0f9-4c55-bdaa-71711fe53cd3/image.png" width="400px"></p>

</li>
</ul>
<h2 id="knowledge-distillation">Knowledge distillation</h2>
<ul>
<li>knowledge distillation -&gt; Teacher-student learning</li>
<li>미리 학습된 large 모델의 지식을 학습되지 않은 small 모델로 가져오는 것이다.<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/955b9cfb-6044-4ea7-8ad4-bca50f594f6b/image.png" width="400px"></p>

</li>
</ul>
<p>Used for model compression (Mimicking what a larger model knows)
Also,used for pseudo-labeling(Generating pseudo-labels for an unlabeled dataset)</p>
<p>The student network learns what the teacher network knows
The student network mimics outputs of the teacher network
Unsupervised learning, since training can be done only with unlabeled data</p>
<p>When labeled data is available, can leverage labeled data for training (StudentLoss)
Distillation loss to ‘predict similar outputs with the teacher model’</p>
<p>💁‍♀️ hard label vs soft label
hard label : 원-핫 벡터,소프트맥스를 지나 각 레이블별 값이 아닌 하나의 값만 존재
soft label : 소프트 맥스를 지나기전 값과 유사하다, 각 레이블별 확률값이 존재함.
soft label는 모델이 어떻게 생각하는지 얻기 좋다</p>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/3c1bc94f-30cc-4f7d-a89b-22c02c99f9f1/image.png" width="400px"></p>

<p>💁‍♀️ Knowledge distillation시 Semantic information is not considered in distillation</p>
<ul>
<li><p>Distillation Loss</p>
</li>
<li><p>KLdiv(Soft label,Soft prediction)</p>
</li>
<li><p>Loss = difference between the teacher and student network’s inference</p>
</li>
<li><p>Learn what teacher network knows by mimicking</p>
</li>
<li><p>Student Loss</p>
</li>
<li><p>Cross Entropy(Hard label,Soft prediction)
Loss = difference between the student network’s inference and true label</p>
</li>
<li><p>Learn the “right answer”</p>
</li>
</ul>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/ceb3a733-7b10-4de1-a864-4eeef22a43ef/image.png" width="400px"></p>

<p>Softmax with temperature (𝑇)
Softmax with temperature : controls difference in output between small &amp; large input values
A large 𝑇 smoothens large input value differences
Useful to synchronize the student and teacher models’ outputs</p>
<h1 id="recap">Recap</h1>
<blockquote>
<p>Recap란
2019년 11월, ImageNet 데이터셋에 대해 State-of-the-art를 갱신한 논문이다.
Image recognition(classification) 분야는 AlexNet, VGG, ResNet 부터 시작해서 NASNet 최근에는 EfficientNet 등 많은 연구가 진행되며 발전해왔다. 이 모델들은 supervised learning으로 큰 labeled images를 필요로 한다. 하지만 unlabeled images를 이용하지는 않았다. 이 논문은 ImageNet에 속하지 않은 unlabeled images 까지 이용하여 ImageNet 정확성의 SOTA를 갱신하며, robustness 성능 까지 높이는 방법에 대해 설명한다.</p>
</blockquote>
<h2 id="recap의-특징">Recap의 특징</h2>
<ol>
<li>data augmentation</li>
</ol>
<ul>
<li>Augment a dataset to make the dataset closer to real data distribution</li>
</ul>
<ol start="2">
<li>knowledge distillation</li>
</ol>
<ul>
<li>Train a student network to imitate a teacher network</li>
<li>Transfer the teacher network’s knowledge to the student network</li>
</ul>
<ol start="3">
<li>semi-supervied learning(Pseudo label-based method)</li>
</ol>
<ul>
<li>Pseudo-label an unlabeled dataset using a pre-trained model,then use for training</li>
<li>Leveraging an unlabeled data set for training!</li>
</ul>
<h3 id="data-augmentation">data augmentation</h3>
<p>💁‍♀️ data augmentation은 이미지를 자르거나, 밝기를 높이가 회전하기 등을 통해 실제 데이터와 간격을 줄이는 데이터 증강 방법이다.
💁‍♀️ 자세한 내용은 따로 정리하였다 -&gt; <a href="https://velog.io/@hipjaengyi_cat18/Data-augmentation%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A6%9D%EA%B0%95-Image%ED%8E%B8-%EB%82%B4%EA%B0%80%EB%B3%B4%EB%A0%A4%EA%B3%A0%EC%A0%95%EB%A6%AC%ED%95%9CAI">Data augmentation(데이터 증강) - Image편</a></p>
<h3 id="knowledge-distillation-1">knowledge distillation</h3>
<ul>
<li>knowledge distillation란 Teacher-student learning 방식으로</li>
<li>large model의 지식을 모방하기 위해 model compression(압축)한다</li>
<li>레이블이 없는 데이터셋에 pseudo labels(가짜 레이블)을 생성해 사용한다
semantic information를 학습하는 것이 아님 하나하나의 값들이 중요한것이 아닌 전체 값이 중요</li>
</ul>
<h3 id="semi-supervied-learning">semi-supervied learning</h3>
<p>💁‍♀️ Semi-supervised learning이란 training위해 leveraging unlabeled dataset을 통해 성능을 leveraging 하는 것이다.
🆀 왜 unlabeled data을 사용했을까?
🅰 labeled 데이터는 큰 데이터셋을 만들기 어렵고, unlabeled data를 사용하면 온라인상 모든 데이터를 사용할수 있기 때문에 많은 데이터 사용 가능하기 때문이다. </p>
<p>즉, semi- supervised learning이란 unsupervied + supervied 것이다.
💁‍♀️ Semi-supervised learning방법 </p>
<ol>
<li>labeled dataset 로 학습</li>
<li>unlabed 데이터의 label을 예측함(Pseudo-labeling)</li>
<li>두개 데이터를 합쳐서 재학습함<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/58413d44-229e-4698-b154-bc3c0e2c0d21/image.png" width="400px"></p>

</li>
</ol>
<h2 id="recap의-구조">Recap의 구조</h2>
<p>💁‍♀️ self-training</p>
<ol>
<li>ImageMet 1M을 학습시킴 -&gt; Teacher Model</li>
<li>Teacher Model로 300M의 unlabeld data를 예측함 -&gt; pseudo-labeled data</li>
<li>생성된 pseudo-labeled data를 ImageMet 1M과 함께 RandAugment를 적용해 Student Model을 학습함</li>
<li>기존 Teacher Model을 날리고 학습된 Student Model를 Teacher Model로 replace함</li>
<li>2~5부터 반복, 이때 Student Model는 조금씩 커짐</li>
</ol>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/a04921a2-72cb-4851-88ec-06f3839d6388/image.png" width="400px"></p>

<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/a1c58c19-d397-4616-bf2c-2a92fcec976c/image.png" width="400px"></p>

<h2 id="recap의-성능">Recap의 성능</h2>
<ul>
<li>ImageNet 2012 ILSVRC validation set accuracy<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/b0e845f4-0cb5-410a-ab3b-ff117fe5b9f0/image.png" width="400px"></p>

</li>
</ul>
<p>Noisy Student(EfficientNet-L2)가 88.4% top-1 accuracy로 SOTA를 갱신하였다. 
기존 EfficientNet-B7에 비해 3.4% 성능 개선을 하였다. 
마찬가지로 같은 구조인 EfficientNet-L2에서 Noisy Student 방법의 추가로 2.9% 성능 개선을 하였다.</p>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/0f2dd1ee-e060-418f-a5f7-25f858328ed2/image.png" width="400px"></p>

<p>성능 향상도 향상인데 성능 자체가 압도적으로 높음을 보여주었다.
기존에 가장 성능이 좋았던 efficientNet을 이기면서 2019년 SOTA ImageNet classfication이 되었다.</p>
<h4 id="-참고-">-참고-</h4>
<ul>
<li>네이버 부스트캠프 AITech 5기
<a href="https://byeongjokim.github.io/posts/Self-training-with-Noisy-Student-improves-ImageNet-classification/">논문 리뷰 - Self-training with Noisy Student improves ImageNet classification</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[ 📸 Data augmentation(데이터 증강) - Image편 | 내가보려고정리한AI🧐]]></title>
            <link>https://velog.io/@hipjaengyi_cat18/Data-augmentation%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A6%9D%EA%B0%95-Image%ED%8E%B8-%EB%82%B4%EA%B0%80%EB%B3%B4%EB%A0%A4%EA%B3%A0%EC%A0%95%EB%A6%AC%ED%95%9CAI</link>
            <guid>https://velog.io/@hipjaengyi_cat18/Data-augmentation%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A6%9D%EA%B0%95-Image%ED%8E%B8-%EB%82%B4%EA%B0%80%EB%B3%B4%EB%A0%A4%EA%B3%A0%EC%A0%95%EB%A6%AC%ED%95%9CAI</guid>
            <pubDate>Sun, 02 Apr 2023 11:22:56 GMT</pubDate>
            <description><![CDATA[<h1 id="preview">Preview</h1>
<p>학습 데이터는 세상의 모든 데이터와 항상 같을까? 학습 데이터는 현실 데이터의 부분이다. 즉, 학습데이터는 항상 현실 데이터와 차이가 있을 수 밖에 없다.
이런 차이를 Data augmentation를 통해서 줄여나갈 수 있다. 이번 장에서는 Image Data의 augmentation을 알아보겠다.</p>
<h1 id="data-augmentation">Data Augmentation</h1>
<p>train data는 real data가 아니다. 세상 모든 데이터는 수집할 수 없기 때문에  train data는 샘플링한 데이터이다. 
train data는 real data를 샘플링 한 것처럼 편향되어 있다.
Image train data는 선명한 데이터, 잘리지 않고 여백이 적은 이미지만 실제 이미지 데이터는 그렇지 않다. </p>
<p>💁‍♀️ Data Augmentation이란 그런 편향된 데이터와 실제 데이터 간의 간격을 줄이기 위한 방법론이다.</p>
<p>💁‍♀️  Image Data Augmentation은 이미지를 자르거나, 밝기를 높이가 회전하기 등등 실제 데이터와 간격을 줄이는 등으로 수행한다.</p>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/3e8ad456-20bb-4d70-bd71-42e697f9303b/image.png" width="400px"></p>

<h1 id="image-data-augmentation-종류">Image Data Augmentation 종류</h1>
<h2 id="crop">crop</h2>
<ul>
<li>이미지를 잘라준다<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/fd70afd3-78b0-4be6-b110-bf173ed06c90/image.png" width="400px"></p>

</li>
</ul>
<h2 id="brightness">brightness</h2>
<ul>
<li>rgb 값에 숫자를 더해주거나 스케일링을 통해 가능하다.<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/756456c3-8fe6-4890-aec1-4696aa17b417/image.png" width="400px"></p>


</li>
</ul>
<h2 id="rotate-flip">rotate, flip</h2>
<ul>
<li>pytorch- transformation, cv2.rotate, 등을 통해 수행할 수 있다.<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/3c4636a8-219b-4713-9269-e5f983e33f71/image.png" width="400px"></p>


</li>
</ul>
<h2 id="affine-transformation">affine transformation</h2>
<ul>
<li>직사각형을 평행사변형으로 변환 해주는 등의 작업을 해준다 </li>
<li>-&gt; cv2.warpAffine, cv2.getAffineTransform ...<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/9e4992f7-c49d-4a85-bf9c-16ca08a57f85/image.png" width="400px"></p>

</li>
</ul>
<h2 id="cutmix">cutmix</h2>
<ul>
<li>두 개 이미지를 잘라서 합치고, 클래스가 다르면 라벨도 합성해준다</li>
<li>모델이 물체 위치를 더 잘 찾도록 해주는 효과가 있다. <p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/1969eb38-aa67-4f8f-be3b-9217fdaece06/image.png" width="400px"></p>


</li>
</ul>
<h1 id="randaugment">RandAugment</h1>
<p>💁‍♀️ 많은 augmentation 방법이 존재하고 최고의 augmentation를 찾는 것이 힘들다</p>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/58486a59-70dc-4b5c-88f3-3eff5edef604/image.png" width="400px"></p>

<p>💁‍♀️ RandAugment는 자동적으로 최고의 augmentation 조합과 순서를 찾아주는 패키지이다</p>
<ul>
<li>어떤 augmentation 사용건지, 얼마나 사용 magnitude, 어떤 순서로 할건지 의 n개 policy 중 샘플링 해준다.</li>
<li>Policy={N augmentations to apply} by random sampling</li>
<li>random sample -&gt; apply -&gt; evaluate augmentations<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/6f09b7c9-4c5c-4e5e-9b75-0338fdad9cd8/image.png" width="400px"></p>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/d4dfe59a-77bb-422b-a23e-dbc8bec1362c/image.png" width="400px"></p>






</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[⛰️ 최적화(Optimization)-2. 경사하강법(Gradient descent)편 | 내가보려고정리한AI🧐]]></title>
            <link>https://velog.io/@hipjaengyi_cat18/%EC%B5%9C%EC%A0%81%ED%99%94Optimization-2.-%EA%B2%BD%EC%82%AC%ED%95%98%EA%B0%95%EB%B2%95Gradient-descent%ED%8E%B8-%EB%82%B4%EA%B0%80%EB%B3%B4%EB%A0%A4%EA%B3%A0%EC%A0%95%EB%A6%AC%ED%95%9CAI</link>
            <guid>https://velog.io/@hipjaengyi_cat18/%EC%B5%9C%EC%A0%81%ED%99%94Optimization-2.-%EA%B2%BD%EC%82%AC%ED%95%98%EA%B0%95%EB%B2%95Gradient-descent%ED%8E%B8-%EB%82%B4%EA%B0%80%EB%B3%B4%EB%A0%A4%EA%B3%A0%EC%A0%95%EB%A6%AC%ED%95%9CAI</guid>
            <pubDate>Sun, 02 Apr 2023 10:15:28 GMT</pubDate>
            <description><![CDATA[<h1 id="경사하강법gradient-descent">경사하강법(Gradient descent)</h1>
<blockquote>
</blockquote>
<p>Gradient descent
미분 가능 함수의 로컬 최소값을 찾기 위한 1차 반복 최적화 알고리즘입니다.
즉. 손실함수값이 낮아지는 방향으로 가기 위해 1차 미분계수를 이용하는 알고리즘이다</p>
<p>👉 경사하강법에서 우리가 결정해야 할 것은 다음과 같다</p>
<ul>
<li>배치사이즈</li>
<li>스텝방향</li>
<li>스텝사이즈</li>
</ul>
<hr>
<h1 id="배치사이즈에-따른-경사하강법">배치사이즈에 따른 경사하강법</h1>
<blockquote>
<p>Batch gradient descent
👉 전체 데이터에서 계산된 그래디언트로 업데이트합니다.
👉 기존의 Gradient Descent 방식은 내가 가진 데이터를 다 넣어서 미분값을 계산하다보니 계산량이 많아 학습이 오래걸린다는 문제점이 있다</p>
</blockquote>
<p>🆀 그렇다면 기존 Gradient Descent 방식보다 더 빠른 방법이 있을까?
🅰 모든 데이터의 미분값을 구하지 말고 일부 데이터로만 계산해보자</p>
<blockquote>
<p>SGD(Stochastic gradient descent)
👉 추출된 데이터 한개에 대해서 계산된 기울기로 업데이트 한다</p>
</blockquote>
<blockquote>
<p>MGS(Mini-batch gradient descent)
👉 전체 데이터 중 일부 샘플에 대해 계산된 기울기로 업데이트 한다</p>
</blockquote>
<p>🆀 SGD와 MGS는 어떤 차이가 있을까?
👉 공통점</p>
<ul>
<li>계산량이 줄어 기존 Gradient Descent 방식보다 빠르게 전진한다.</li>
<li>일부 샘플만 계산하니 기존 Gradient Descent 방식 보단 헤맨다</li>
<li>헤매니 스텝사이즈(학습률)에 따라 보폭이 낮으면 학습이 오래걸리고, 너무 크면 최적의 값을 찾기 못한다</li>
</ul>
<p>👉 차이점</p>
<ul>
<li>SGD는 데이터가 1개 이므로 배치사이즈가 1이다. 그래서 계산은 매우 빠르지만 연산량이 너무 적어 GPU를 제대로 쓰지 못한다. </li>
<li>또한 하나의 데이터만 사용하기 때문에 최적값의 수렴하지 않을 가능성이 높다(수렴 안정성 낮음)</li>
<li>이를 보완하기 위해 하나의 데이터가 아닌 일부 샘플(미니배치)를 사용하여 경사하강법을 진행해 계산량은 줄이면서 최적의 값을 수렴한다</li>
</ul>
<p>💁‍♀️ 대부분 SGD을 사용할때 하나의 데이터가 아닌 미니배치를 사용하므로 Mini-batch gradient descent를 SGD라고 부른다</p>
<hr>
<h2 id="경사하강시-배치사이즈가-주는-영향">경사하강시 배치사이즈가 주는 영향</h2>
<p>🆀 계산량을 줄이면서 최적의 값의 수렴하기 위해 Mini-batch를 얼마만큼 하는 게 좋을까?
🅰 큰 배치사이즈보단 작은 배치사이즈가 최적의 값으로 수렴하기 좋다</p>
<blockquote>
<p>On Large-batch Training for Deep Learning: Generalization Gap and Sharp Minima, 2017</p>
</blockquote>
<ul>
<li>&quot;It has been observed in practice that when using a larger batch there is a degradation in the quality of the model, as measured by its ability to generalize.&quot;
&quot;실제로 더 큰 배치를 사용할 때 일반화 능력으로 측정할 때 모델의 품질이 저하되는 것이 관찰되었습니다.&quot;</li>
<li>&quot;We ... present numerical evidence that supports the view that large batch methods tend to converge to sharp minimizers of the training and testing functions. In contrast, small-batch methods consistently converge to flat minimizers... this is due to the inherent noise in the gradient estimation.&quot;
&quot;우리는 ... 대규모 배치 방법이 훈련 및 테스트 기능의 예리한 최소화로 수렴되는 경향이 있다는 견해를 뒷받침하는 수치적 증거를 제시합니다. 반대로 소규모 배치 방법은 일관되게 평면 최소화로 수렴합니다... 이것은 고유한 그래디언트 추정에 노이즈가 있습니다.&quot;</li>
</ul>
<p align = 'center'>
<img src ="https://velog.velcdn.com/images/hipjaengyi_cat18/post/6a48c33c-5de6-4c15-8859-cd7aa439d888/image.png" width = '400px'></p>

<p>👉 결론 : 배치사이즈를 작게 가져가야 평평한 최소화로 수렴되므로 모델의 예측력이 더 좋다</p>
<hr>
<h1 id="step방법에-따른-경사하강법">step방법에 따른 경사하강법</h1>
<p>🆀  배치사이즈를 구했으니 스텝방향과 스텝사이즈는 어떻게 하는게 좋을까?</p>
<blockquote>
</blockquote>
<p>스텝방향을 조정해보자!</p>
<ul>
<li>Momentum</li>
<li>Nesterov accelerated gradient<blockquote>
</blockquote>
스텝사이즈를 조정해보자!</li>
<li>Adagrad</li>
<li>Adadelta</li>
<li>RMSprop<blockquote>
</blockquote>
스텝방향과 스텝사이즈 둘다 조정해보는건 어떨까!</li>
<li>Adam</li>
<li>Nadam</li>
</ul>
<p align = 'center'>
<img src ="https://velog.velcdn.com/images/hipjaengyi_cat18/post/4972e26b-bd62-4c92-ac64-3364208843a4/image.png" width = '400px'></p>

<ul>
<li>일반적인 경사하강법의 가중치 조정식<p align = 'center'>
<img src ="https://velog.velcdn.com/images/hipjaengyi_cat18/post/36fbd0d0-2fc7-4710-9ec4-a3faf66a5d17/image.png" width = '400px'></p>


</li>
</ul>
<h2 id="momentum">Momentum</h2>
<ul>
<li>Momentum의 가중치 조정식<p align = 'center'>
<img src ="https://velog.velcdn.com/images/hipjaengyi_cat18/post/e446f7b7-1190-4c4a-9a71-8f9771ed38cb/image.png" width = '400px'></p>

</li>
</ul>
<h2 id="nag">NAG</h2>
<ul>
<li>Nesterov accelerated gradient의 가중치 조정식<p align = 'center'>
<img src ="https://velog.velcdn.com/images/hipjaengyi_cat18/post/11ea3fdb-fab9-4545-8f2b-f7b850c10728/image.png" width = '400px'></p>

</li>
</ul>
<p align = 'center'>
<img src ="https://velog.velcdn.com/images/hipjaengyi_cat18/post/f47bb2c4-47eb-4352-8142-d8fa2e534b0a/image.png" width = '400px'></p>

<h2 id="adagrad">Adagrad</h2>
<ul>
<li>Adagrad는 학습 속도를 조정하여 간헐적인 매개변수에 대해 더 큰 업데이트를 수행하고 빈번한 매개변수에 대해 더 작은 업데이트를 수행합니다<p align = 'center'>
<img src ="https://velog.velcdn.com/images/hipjaengyi_cat18/post/62556fe0-0e5c-4e62-9262-cbc5bd63b5fe/image.png" width = '400px'></p>

</li>
</ul>
<p>💁‍♀️ Adagrad로 교육이 장기간 진행되면 어떻게 될까?</p>
<h2 id="adadelta">Adadelta</h2>
<ul>
<li>Adadelta는 Adagrad를 확장하여 누적 창을 제한하여 학습률을 단조롭게 감소시킵니다.</li>
<li>Adadelta은 학습률이 없음<p align = 'center'>
<img src ="https://velog.velcdn.com/images/hipjaengyi_cat18/post/ca0a4ddc-caa6-4672-ad55-205576efd042/image.png" width = '400px'></p>

</li>
</ul>
<h2 id="rmsprop">RMSprop</h2>
<p>RMSprop은 Geoff Hinton이 강의에서 제안한 미공개 적응형 학습률 방법입니다.
RMSprop is an unpublished, adaptive learning rate method proposed by Geoff Hinton in his lecture.</p>
<p align = 'center'>
<img src ="https://velog.velcdn.com/images/hipjaengyi_cat18/post/d9b4f490-b6cf-4209-b301-c175e55697ab/image.png" width = '400px'></p>

<h2 id="adam">adam</h2>
<p>Adaptive Moment Estimation (Adam) leverages both past gradients and squared gradients.
Adaptive Moment Estimation(Adam)은 과거 그래디언트와 제곱 그래디언트를 모두 활용합니다.</p>
<ul>
<li>Adam은 모멘텀을 적응형 학습 속도 접근 방식과 효과적으로 결합합니다.<p align = 'center'>
<img src ="https://velog.velcdn.com/images/hipjaengyi_cat18/post/d712a160-c4bb-45f2-862c-227ee88f7747/image.png" width = '400px'></p>




</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[⛰️ 최적화(Optimization)-4.앙상블(Ensemble) | 내가보려고정리한AI🧐]]></title>
            <link>https://velog.io/@hipjaengyi_cat18/%EC%B5%9C%EC%A0%81%ED%99%94Optimization-4.%EC%95%99%EC%83%81%EB%B8%94Ensemble-%EB%82%B4%EA%B0%80%EB%B3%B4%EB%A0%A4%EA%B3%A0%EC%A0%95%EB%A6%AC%ED%95%9CAI</link>
            <guid>https://velog.io/@hipjaengyi_cat18/%EC%B5%9C%EC%A0%81%ED%99%94Optimization-4.%EC%95%99%EC%83%81%EB%B8%94Ensemble-%EB%82%B4%EA%B0%80%EB%B3%B4%EB%A0%A4%EA%B3%A0%EC%A0%95%EB%A6%AC%ED%95%9CAI</guid>
            <pubDate>Sun, 02 Apr 2023 10:07:09 GMT</pubDate>
            <description><![CDATA[<h1 id="앙상블기법">앙상블기법</h1>
<p>👉 앙상블이란?</p>
<blockquote>
</blockquote>
<p>여러개의 분류기(모델)을 생성하고, 그 예측을 결합함으로써 정확한 예측을 도출하는 기법
하나의 강력한 모델 대신 약한 모델 여러개를 조합해 더 정확한 예측에 도움을 주는 방식이다</p>
<hr>
<h3 id="bagging-vs-boosting">Bagging vs Boosting</h3>
<p>👉 배깅와 부스팅을 이해하기 위해서는 부트스트랩이라는 개념을 알아두면 좋다</p>
<blockquote>
<p>Bootstrapping
부트스트래핑은 교체와 함께 무작위 샘플링을 사용하는 모든 테스트 또는 메트릭이다.</p>
</blockquote>
<ul>
<li>해당 개념에 왜 bootstrap이라는 단어가 사용되었을까?</li>
</ul>
<blockquote>
<p>bootstrap의 기원
The Adventures of Baron Munchausen(바론의 대모험)이라는 책을 보면 주인공 바론이 늪에 빠지게 되는데 이때 자신의 장화 끝 단(bootstrap)을 잡아 올라 스스로 늪에서 빠져나오는 장면이 나온다. 사실 작용 반작용의 법칙에 따라 불가능한 일이지만 논리는 차치하고, 이 일화처럼 스스로를 구해낸다는 뜻으로 bootstrap이라는 단어가 사용되었다</p>
</blockquote>
<p align="center"><img src='https://velog.velcdn.com/images/hipjaengyi_cat18/post/b59e0a36-1229-4a02-81ea-76a4d560f791/image.png' width="400px"></p>


<p>👉 즉. bootstrap 샘플링을 하면 샘플 데이터셋을 n개의 샘플 데이터셋을 가지고 있는 효과를 누릴 수 있게 된다</p>
<p>👉 부트스트랩이라는 개념을 알아보았으니 배깅가 부스팅에 대해 알아보자</p>
<blockquote>
<p>Bagging (Bootstrapping aggregating)
부트스트래핑 샘플링을 이용하여 여러 모델을 훈련하고 각 모델의 예측 결과를 투표방식 또는 평균 방식으로 집계한다
즉. 주어진 하나의 데이터로 학습된 모델보단 더 좋은 모델을 만들 수 있는 앙상블 기법이다</p>
</blockquote>
<blockquote>
<p>Boosting
분류하기 어려운 특정 교육 샘플에 중점을 두는 방법으로, 여러 개의 약한 학습모델이 순차적으로 학습-예측하는 과정에서 이전의 학습 모델의 잘못 예측한 데이터에 가중치를 부여함 으로 써 오류를 개선해 강력한 모델을 구축하는 방법이다</p>
</blockquote>
<p align="center"><img src='https://velog.velcdn.com/images/hipjaengyi_cat18/post/8c336380-bc87-4eff-ad65-e1768bde98b7/image.png' width="400px"></p>

<p>👉 즉. 배깅과 부스팅은 여러 개의 모델을 학습시키므로써 하나의 모델에서는 얻을 수 없는 성능과 안정성을 이끌어 내어 최적화된 모델을 만든다고 생각하면 된다
👉 두 모델의 차이점은 여러개의 모델을 어떻게 학습시키고 학습된 모델을 예측에 어떻게 활용하는지에 대한 접근 방법 차이가 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[⛰️ 최적화(Optimization)-3.정규화(Regularization) | 내가보려고정리한AI🧐]]></title>
            <link>https://velog.io/@hipjaengyi_cat18/%EC%B5%9C%EC%A0%81%ED%99%94Optimization-3.%EC%A0%95%EA%B7%9C%ED%99%94Regularization-%EB%82%B4%EA%B0%80%EB%B3%B4%EB%A0%A4%EA%B3%A0%EC%A0%95%EB%A6%AC%ED%95%9CAI</link>
            <guid>https://velog.io/@hipjaengyi_cat18/%EC%B5%9C%EC%A0%81%ED%99%94Optimization-3.%EC%A0%95%EA%B7%9C%ED%99%94Regularization-%EB%82%B4%EA%B0%80%EB%B3%B4%EB%A0%A4%EA%B3%A0%EC%A0%95%EB%A6%AC%ED%95%9CAI</guid>
            <pubDate>Sun, 02 Apr 2023 10:03:25 GMT</pubDate>
            <description><![CDATA[<h1 id="정규화">정규화</h1>
<blockquote>
</blockquote>
<p>학습데이터에만 너무 특화되어 있지 않고, 일반화(generalization)가 가능하도록 규제(penalty)를 가하는 기법</p>
<p>👉 정규화 기법</p>
<ul>
<li><p>Early stopping
학습 진행 중 최적의 적합지점을 넘어가면 과적합되어 loss가 커지는 때가 오면 학습을 정지 시킨다</p>
</li>
<li><p>Parameter norm penalty
네트워크 파라미터가 커지지 않게 하는 방법, 파라미터의 크기가 작으면 작을 수록 좋다. 함수 공간 속 함수를 부드러울수록 일반화가 잘될 것이라는 아이디어임</p>
</li>
<li><p>Data augmentation
데이터가 많으면 학습이 잘되므로 레이블이 바뀌는 않는 선에서 이미지를 변형해서 증량 해보는 것 ex) 6 이미지를 뒤집음 9가되고 레이블이 바뀜</p>
</li>
<li><p>Noise robustness
일반화가 잘 되기 위해 학습테이터에 노이즈를 넣어서 학습해보자</p>
</li>
<li><p>Label smoothing
서로 다른 레이블을 가진 데이터들을 섞어 학습시켜 모델의 분류 경계를 부드럽게 만든다.  이 방법으로 학습 시 최적화가 되는 이유는 논리적이유보단 경험적인 이유임</p>
</li>
<li><p>Dropout
랜덤하게 뉴런을 0으로 만들어 과대적합을 막자</p>
</li>
<li><p>Batch normalization
하나의 레이러의 파라미터 값들이 평균0이 되도록 스케일링(정규화)해준다. 해당 방법은 레이어가 깊을 때 성능이 좋다고 알려져있다.
또한 간단 분류 문제일때 효과가 좋다고 알려져있으나 효과에 대한 논란은 있다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[⛰️ 최적화(Optimization)-1. 일반화(Generalization)편 | 내가보려고정리한AI🧐]]></title>
            <link>https://velog.io/@hipjaengyi_cat18/%EC%B5%9C%EC%A0%81%ED%99%94Optimization-1.-%EC%9D%BC%EB%B0%98%ED%99%94Generalization%ED%8E%B8-%EB%82%B4%EA%B0%80%EB%B3%B4%EB%A0%A4%EA%B3%A0%EC%A0%95%EB%A6%AC%ED%95%9CAI</link>
            <guid>https://velog.io/@hipjaengyi_cat18/%EC%B5%9C%EC%A0%81%ED%99%94Optimization-1.-%EC%9D%BC%EB%B0%98%ED%99%94Generalization%ED%8E%B8-%EB%82%B4%EA%B0%80%EB%B3%B4%EB%A0%A4%EA%B3%A0%EC%A0%95%EB%A6%AC%ED%95%9CAI</guid>
            <pubDate>Sun, 02 Apr 2023 10:00:09 GMT</pubDate>
            <description><![CDATA[<h1 id="preview">preview</h1>
<p>이전 장에서 신경망에 대해 알아봤다면 이번에는 신경망 학습의 목적인 최적화를 알아볼 것이다. </p>
<hr>
<h1 id="최적화란">최적화란?</h1>
<blockquote>
</blockquote>
<p>최적화란?
신경망 학습의 목적은 손실 함수의 값을 가능한 낮추는 매개변수(parameter)를 찾는 것이다.
즉, 어떤 목적함수의 값을 최적화시키는 파라미터 조합을 찾는 것을 뜻한다.
더 간단하게 얘기하면 손실함수의 극대, 극소지점이 되는 파라미터를 찾는 것이다!</p>
<h2 id="최적화의-중요개념">최적화의 중요개념!</h2>
<p>👉 우리가 공부하게될 개념은 아래와 같다</p>
<ul>
<li>일반화(generalization)</li>
<li>오버피팅(over-fitting) &amp; 언더피팅(under-fitting)</li>
<li>편향과 분산의 트레이드오프(Bias-variance tradeoff)</li>
<li>교차 검증(Cross validation)</li>
<li>경사하강법(Gradient descent)</li>
<li>정규화(regularization)</li>
<li>부스트스트래핑(Bootstrapping)과 배깅과 부스팅(Bagging and boosting)</li>
</ul>
<p>👉 벌써 보기만 해도 머리 아픈 많은 개념이 머리 속에 뒤죽박죽 섞여있다.
👉 우리가 공부할 내용들은 각각 개념을 차례차례 공부하면 개념들은 이해가 가지만 왜 이걸 해야하는지 감이 오지 않는다.
👉 좀 더 직관적인 이해를 위해 해당 개념들을 일반화를 기준으로 왜 해당 개념들이 필요한지를 정리해보겠다.</p>
<hr>
<h2 id="일반화generalization">일반화(Generalization)</h2>
<p>👉 일반화란 학습된 모델이 새로운 데이터에 대해 얼마나 잘 작동하는 지를 의미한다
👉 최적화를 위해서는 모델이 일반화(generalization) 되어야한다.
👉 아래에 설명할 개념들은 다 모델을 일반화 시키기 위한 개념들이라고 생각하면 된다.</p>
<p align="center"><img src='https://velog.velcdn.com/images/hipjaengyi_cat18/post/eb62f053-1486-476d-9810-693b775ae840/image.png' width="400px"></p>

<p>👉 결국 최적화란 모델을 과소적합(under-fitting)없이 학습을 잘 시키고, 과대적합(over-fitting)이 아닌 새로운 데이터에도 잘 작동하도록 없이 일반화(generalization) 시키는 것이다.</p>
<hr>
<h2 id="over-fitting-vs-under-fitting">over-fitting VS under-fitting</h2>
<p>👉 최적화를 위해서는 과대적합과 과소적합 사이에서 최적화된 절충점을 찾아 모델을 만드는 것이 매우 중요하다</p>
<blockquote>
</blockquote>
<p>과대적합 (over-fitting)
모델이 학습 데이터에 대한 정확한 예측을 하지만 새로운 데이터에 대해서는 정확한 예측을 하지 못하는 경우 이다. 모델은 학습데이터를 기반으로 새로운 데이터에 대한 결과를 예측하기 때문에 학습데이터를 과하게 학습한 경우 발생한다</p>
<blockquote>
</blockquote>
<p>과소적합(under-fitting)
모델이 입력데이터와 출력데이터 간 유의미한 관계를 확인할 수 없을 때 발생하는 오류로, 학습 데이터를 제대로 학습하지 않았을 때 발생한다</p>
<blockquote>
<p>over-fitting vs under-fitting</p>
</blockquote>
<ol>
<li>과소적합은 학습데이터와 테스트데이터에 대해 모두 부정확한 결과를 제공하므로 편향성이 높다</li>
<li>반면에 과대적합은 학습데이터에 대해서는 정확한 결과를 제공하지만 테스트데이터에 대해서는 정확한 결과를 제공하지 않음으로 높은 분산을 가지고 있다</li>
</ol>
<p align="center"><img src='https://velog.velcdn.com/images/hipjaengyi_cat18/post/c34dc218-56a8-4b71-b8bb-f877e0a569df/image.png' width="400px"></p>

<p>👉 이제 과대적합과 과소적합이 무엇인지는 알았는데, 어떻게 과대적합인지 과소적합인지를 판단해야될까?
👉 그 방법론은 교차검증(Cross-validation)과, 편향과 분산의 트레이드오프(Bias-variance tradeoff)로 알 수 있다</p>
<hr>
<h2 id="편향과-분산의-트레이드오프bias-variance-tradeoff">편향과 분산의 트레이드오프(Bias-variance tradeoff)</h2>
<p>👉 편향과 분산은 공부하며 자주 듣던 개념이지만 트레이트오프란 무슨 뜻일까?</p>
<blockquote>
<p>tradeoff : 한쪽이 커지면 다른 한쪽은 줄어드는 상충관계로 하나가 증가하면 다른 하나는 무조건 감소한다는 뜻이다. </p>
</blockquote>
<p>👉 트레이트오프란 뜻을 알았다면 Bias-variance tradeoff은 다음과 같음을 알 수 있다.</p>
<blockquote>
</blockquote>
<p>Bias-variance tradeoff
모델이 학습 데이터의 범위를 넘어서 지나치게 일반화하는 것을 예방하기 위해 오차를 최소화 할때 겪는 문제이다.
즉, 편향이 커지면 분산이 감소하고, 분산이 커지면 편향이 감소한다.</p>
<p>👉 우리가 최소화하려는 손실함수는 아래와 같이 편향, 분산, 노이즈로 분해 될 수 있다</p>
<p align="center"><img src='https://velog.velcdn.com/images/hipjaengyi_cat18/post/6497f55e-9155-41ee-9a07-567c398f22f2/image.png' width="400px"></p>
<p align="center"><img src='https://velog.velcdn.com/images/hipjaengyi_cat18/post/8f83d91c-23db-4574-aa16-ed6ff3c8fbc9/image.png' width="400px"></p>

<p>👉 Bias-variance tradeoff는 우리가 최소화하려는 손실함수를 편향, 분산으로 분해해 학습을 얼마나 시켜야할지 생각해보기 위한 방법이라고 생각하면 된다.</p>
<ul>
<li><p>편향 : 모델에서 잘못된 가정을 했을 때 발생하는 오차로, 높은 편향을 가지면 모델이 학습데이터로 부터 멀어지고 모델을 지나치게 단순화 시켜 데이터의 특징과 결과물 사이의 적절한 관계를 놓지는 과소적합 문제를 발생시킨다. 편향은 우리가 학습데이터를 바꿈에 따라 모델의 평균 정확도가 얼마나 많이 변하는지 보여준다</p>
</li>
<li><p>분산 : 학습 데이터에 내재된 작은 변동 때문에 발생하는 오차로, 높은 분산값은 큰 노이즈까지 모델링에 포함시키는 과적합을 발생시킨다. 즉, 실제 현상과 관계없는 것까지 학습되는 경향을 나타낸다. 분산은 특정 입력 데이터에 대해 모델이 얼마나 민감한지를 나타낸다.</p>
</li>
<li><p>노이즈 : 줄일 수 없는 불가피한 오차로 보통 일상생활에서 발생하는 불가피한 오류를 얘기한다. 평균이 0,분산이 $$\sigma ^{2}$$ 인 정규 분포이다.</p>
</li>
</ul>
<hr>
<h2 id="cross-validation교차검증">Cross-validation(교차검증)</h2>
<blockquote>
</blockquote>
<p>Cross-validation
교차 검증은 모델이 독립적인 데이터 세트로 일반화되는 방식을 평가하기 위한 모델 검증 기술이다.
즉, 테스트 데이터 세트에 대해 정확한 결과를 제공하는지를 평가하는 것이다</p>
<p>👉 해당 방법은 주로 과대적합을 확인할 때 사용한다
👉 교차 검증에도 다양한 방법이 있지만 그건 추후에 포스팅 하겠다!</p>
<p align="center"><img src='https://velog.velcdn.com/images/hipjaengyi_cat18/post/82486d32-4546-40ad-acea-618eb73b1f76/image.png' width="400px"></p>


<p>👉 우리는 교차 검증과, 편향과분산의 트레이트 오프로 과대 적합인지 과소 적합인지를 판단하는 법을 알게되었다.</p>
<h1 id="summary">Summary</h1>
<p>👉 그렇다면 우리는 해당 문제를 해결하기 위해한 다음과 같은 질문을 얻을 수 있다.</p>
<blockquote>
</blockquote>
<p>🆀 만약 과소 적합인 경우 어떻게 학습을 시켜야 더 빠르게 최적의 적합으로 갈 수 있을까?
🅰 더 빠르게 적합할 수 있는 경사하강방법을 선택하자!</p>
<blockquote>
</blockquote>
<p>🆀 만약 과대 적합이라면 어떻게 학습데이터에만 국한 되지 않도록 일반화를 해야할까? 규제를 가하면 어떨까?
🅰 과대 적합이 되지 않도록 규제(penalty)를 가하는 정규화(regularization)방법을 알아보자!</p>
<blockquote>
</blockquote>
<p>🆀 만약 최적의 적합을 찾기 위해 하나의 모델이 아닌 여러가지 모델을 사용하면 어떻까?
🅰 앙상블 기법인 배깅과 부스팅을 알아보자!</p>
<p>👉 해당 질문들을 토대로 서로 헷갈리는 여러 개념들을 나만의 방식으로 아래와 같이 정리해보았다.</p>
<p>모델의 최적화란 모델의 일반화를 위한 최적의 parameter를 찾는 것!</p>
<blockquote>
<p>일반화를 위한 방법론</p>
</blockquote>
<ul>
<li>오버피팅/언더피팅을 피하는 방법 
➡️ 오버피팅/언더피팅 확인방법
➡️ 정규화(오버피팅/언더피팅 피하고 최적의 학습을 하는 방법론)<blockquote>
</blockquote>
</li>
<li>소량의 데이터 또는 분류가 어려운 데이터일 경우
➡️ 데이터 증량 방법
➡️ 하나의 모델이 아닌 여러 모델로 학습하는 방법(앙상블기법)<blockquote>
</blockquote>
</li>
<li>학습속도를 빠르게 하기 위한 방법<br>➡️ 여러 경사하강법</li>
</ul>
<h1 id="epilogue">Epilogue</h1>
<p>다음 장에서는 최적화를 위한 방법론들을 하나씩 소개해주겠다. </p>
<h4 id="--참고--">- 참고 -</h4>
<ul>
<li>네이버 부스트캠프 AITech 5rl</li>
<li><a href="https://ko.wikipedia.org/wiki/%ED%8E%B8%ED%96%A5-%EB%B6%84%EC%82%B0_%ED%8A%B8%EB%A0%88%EC%9D%B4%EB%93%9C%EC%98%A4%ED%94%84">편향-분산 트레이드오프</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[📸 Image Classification(이미지 분류)(2)- GoogLeNet, ResNet,DenseNet,SENet,EfficientNet| 내가보려고정리한AI🧐]]></title>
            <link>https://velog.io/@hipjaengyi_cat18/Image-Classification%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%B6%84%EB%A5%982-GoogLeNet-ResNet-%EB%82%B4%EA%B0%80%EB%B3%B4%EB%A0%A4%EA%B3%A0%EC%A0%95%EB%A6%AC%ED%95%9CAI</link>
            <guid>https://velog.io/@hipjaengyi_cat18/Image-Classification%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%B6%84%EB%A5%982-GoogLeNet-ResNet-%EB%82%B4%EA%B0%80%EB%B3%B4%EB%A0%A4%EA%B3%A0%EC%A0%95%EB%A6%AC%ED%95%9CAI</guid>
            <pubDate>Sun, 02 Apr 2023 09:42:36 GMT</pubDate>
            <description><![CDATA[<h1 id="preview">Preview</h1>
<p>이번 장에서는 GoogLeNet, ResNet가 Degradation problem를 어떻게 해결하였는지 알아보고, DenseNet, SENet, EfficientNet을 통해 Image Classification 성능을 더 높이는 방법을 알아보겠다. </p>
<h1 id="googlenet">GoogLeNet</h1>
<blockquote>
<p>GoogLeNet이란
구글에서 제안한 모델로 Christian Szegedy 등에 의해 2015 CVPR에 개제된 &quot;Going Deeper with Convolutions&quot;에서 소개된 모델이다.
GoogLeNet은 2014년 이미지넷 이미지 인식 대회(ILSVRC)에서 VGGNet(VGG19)을 이기고 우승을 차지한 알고리즘이다. GoogLeNet은 19층의 VGG19보다 좀 더 깊은 22층으로 구성되어 있다</p>
</blockquote>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/781645e8-1328-4618-83dc-28b507d76ca0/image.png" width = '400px'></p>

<h2 id="googlenet의-특징">GoogLeNet의 특징</h2>
<ol>
<li>inception module</li>
<li>bottleneck layer - 1x1 covolution</li>
<li>auxiliary classifier</li>
<li>global average pooling(a single FC layer)</li>
</ol>
<h2 id="inception-module">inception module</h2>
<p>💁‍♀️ GoogLeNet은 아래와 같은 총9개의 인셉션 모듈이 있다.</p>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/afde81f3-4d40-475e-b460-1d1b1ebec61a/image.png" width = '400px'></p>

<p>💁‍♀️ inception module은 기본적으로 (Naïve version)와 같이 이전 layer에서 온 feature map(input data)를 1x1, 3x3, 5x5 convolution, 3x3 max pooling한 값을 채널축으로 concatenate한다.</p>
<ul>
<li>이때 각 Inception module은 1x1, 3x3, 5x5 등 서로 다른 크기의 convolutional filter를 조합하여 구성되는게 아니다.</li>
</ul>
<p>💁‍♀️ 이런 inception module은 다양한 특징을 결합해 더 광범위한 특징을 추출하게 한다</p>
<p>🆀 하나의 Layer에서 여러번의 convolution을 진행하면 연산량이 많아질 것 같은데 하나의 inception module은 연산량이 얼마나 될까?
🅰 input data가 28x28x256일때 inception module의 총연산량은 다음과 같다.</p>
<blockquote>
</blockquote>
<p>[output size]
1x1 conv(padding = 0, kernel의 개수 = 128) = (28 x 28 x 128)
3x3 conv(padding = 1, kernel의 개수 = 192) = (28 x 28 x 192)
5x5 conv(padding = 2, kernel의 개수 = 96)  = (28 x 28 x 96 )
3x3 maxpool(padding = 1)                 = (28 x 28 x 256)
= (28x28(128+192+96+256))
= (28x28x672)</p>
<blockquote>
</blockquote>
<p>[parameter count]
1x1 conv parameter : 28x28x256x1x1x128 =  25,690,112
3x3 conv parameter : 28x28x256x3x3x192 = 346,816,512
5x5 conv parameter : 28x28x256x5x5x96  = 481,689,600
total = 854,196,224</p>
<p>💁‍♀️ Naïve version inception module을 하나 사용하였을때 연산량이 854M으로 연상량이 엄청 증가 하는것으로 알 수 있다. 
💁‍♀️ 이를 해결하기 위해 Dimension reduced version처럼 1x1 conv로 구성된 bottleneck layer를 추가해주었다</p>
<h2 id="bottleneck-layer---1x1-covolution">bottleneck layer - 1x1 covolution</h2>
<p>💁‍♀️ 실제 사용된 inception module은 (Dimension reduced version)와 같이 1x1 convolution이 적용된 모델이다</p>
<p>🆀 1x1 covolution는 왜 사용해 주었을까?
🅰 여러 필터를 많이 사용하고 합치면 계산복잡도가 늘어나기 때문에 feature map의 차원를 줄여주기 위해 1x1 convolution을 통해 출력사이즈는 유지하면서 출력 채널의 수는 줄여주었다.</p>
<p>🆀 bottleneck layer가 추가된 inception module은 연산량이 얼마나 될까?
🅰 input data가 28x28x256일때 Dimension reduced version inception module의 총연산량은 다음과 같다.</p>
<blockquote>
</blockquote>
<p>[output size]
1x1 conv(padding = 0, kernel의 개수 = 128) = (28 x 28 x 128)
1x1 conv(padding = 0, kernel의 개수 = 64) +3x3 conv(padding = 1, kernel의 개수 = 192) = (28 x 28 x 192)
1x1 conv(padding = 0, kernel의 개수 = 64) + 5x5 conv(padding = 2, kernel의 개수 = 96)  = (28 x 28 x 96 )
3x3 maxpool(padding = 1) + 1x1 conv(padding = 0, kernel의 개수 = 64)= (28 x 28 x 64)
= (28x28(128+192+96+64))
= (28x28x480)</p>
<blockquote>
</blockquote>
<p>[parameter count]
1x1 conv parameter : 28x28x256x1x1x128 =  25,690,112
1x1 conv + 3x3 conv parameter : 28x28x256x1x1x64 + 28x28x64x3x3x192 =99,549,184(12,845,056 + 86,704,128)
1x1 conv + 5x5 conv parameter : 28x28x256x1x1x64 + 28x28x64x5x5x96  = 133,266,456(12,845,056 + 120,422,400)
(3x3 maxpool+)1x1 conv parameter : 28x28x256x1x1x64 = 12,845,056
total = 271,350,808</p>
<ul>
<li>3x3 convolution시 346,816,512 -&gt; 99,549,184</li>
<li>5x5 convolution시 346,816,512 -&gt; 133,266,456</li>
<li>총 854,196,224 -&gt; 271,350,808로 3.15배 줄어든 것을 알 수 있다.</li>
</ul>
<p>💁‍♀️ 인셉션 모듈은 3x3, 5x5 필터 등을 적용하기 전 1x1 bottleneck layer를 적용하여  input volume을 줄여 계산 cost를 감소시키는 것이 아닌 kernel의 개수를 줄이면서 차원의 수를 줄인다.</p>
<h2 id="auxiliary-classifier">auxiliary classifier</h2>
<p>💁‍♀️ inception modules를 보면 중간 module에 보조 classifier들이 있는 것을 볼수 있는데 이것이 auxiliary classifier이다. </p>
<p>💁‍♀️ GooLeNet은 22층으로 깊어질수록 Back Propagation시 gradient가 제대로 업데이트가 안되 degradation problem이 발생할 수 있기 때문에 중간중간 gradient를 넣어주므로서 낮은 층 레이어에 gradient가 잘 전달해주기 위해 auxiliary classifier를 사용하였다.(당연히 auxiliary classifier를 학습에만 사용된다)</p>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/73c22e1f-087f-4851-8e62-374fae124840/image.png" width = '400px'></p>

<h2 id="global-average-poolinga-single-fc-layer">global average pooling(a single FC layer)</h2>
<p>💁‍♀️ GooLeNet은 분류를 위한 하나의 Fully connected layer만 남기고 나머지 FC layer는 없앰으로서 학습할 parameter 5M개로 매우 감소 시켰다.</p>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/ba32244c-cc58-44ef-942f-c0f93f19981a/image.png" width = '400px'></p>

<p>💁‍♀️ GooLeNet은 stem - indeption modules - output classifier 로 나눌수 있다.
이때 output classifier에서 기존 모델은 Flatten통해 tensor를 vector화 시킨 후 여러 Fully connected layer를 통해 분류를 하는데 비해 GooLeNet은 Global Average Pooling을 사용하므로서 parameter 양을 줄였다.</p>
<h1 id="resnet">ResNet</h1>
<blockquote>
<p>ResNet이란
마이크로소프트에서 개발한 모델로 &#39;DEEP RESidual Learning for Image Receginition&#39;에서 소개되었다.
2015년 ILSVRC에서 우승을 차지한 알고리즘이다. 많은 논문에 인용되었고 다른 CV tasks에서 backboned으로 많이 사용되며 처음으로 인간레벨을 뛰어넘은 모델이다. </p>
</blockquote>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/17fd3697-694d-4283-b168-3ff01b78f103/image.png" width = '400px'></p>

<p>[Top-5 validation error 비교]</p>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/6234da56-21b4-4051-a69d-e4a8a5b1241e/image.png" width = '400px'></p>

<p>💁‍♀️ 깊은 레이어를 쌓을수록 더 좋은 성능 lower error rate를 보여준다는 것을 증명하였다.</p>
<h2 id="resnet-구조">ResNet 구조</h2>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/679151ff-1069-4ced-b062-fead4a5f9de9/image.png" width = '400px'></p>

<p>💁‍♀️ ResNet의 특징</p>
<ol>
<li>residual block</li>
<li>he initialization</li>
<li>batch normalization</li>
</ol>
<p>🆀 ResNet은 어떻게 degradation problem를 해결하였을까?
🅰 ResNet은 residual block을 사용하여 깊은 레이어에도 back propagation을 수행할 수 있게 하였다.</p>
<h2 id="residual-block">residual block</h2>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/59b844bd-211e-4b9e-9878-bd63814926a0/image.png" width = '400px'></p>

<p>💁‍♀️ 기존 layers는 input data로 target data H(x)를 얻는 것이 목적이였으나 이와 다르게 residual block는 output값에 input data은 x를 더해 F(x) + x를 최소화하는 것을 목표로 한다.</p>
<p>💁‍♀️ F(x) = H(x)-x 이고 x는 고정값이므로 F(x)를 최소화한다는 것은 H(x)-x를 0과 가깝게 나는 말이다. 이때 H(x)-x를 residual이라고 한다.</p>
<p>💁‍♀️ 이때 F(x)에 x를 더해주는 것을 shortcut connection이라고 한다.</p>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/7be62fd4-2507-4d76-8a85-f158067bc2e6/image.png" width = '400px'></p>


<h3 id="왜-residual-block이-성능이-좋을까">왜 residual block이 성능이 좋을까?</h3>
<p>💁‍♀️ 학습이 진행되는 동안 gradients는 주로 연결된 shorter paths로 오기 때문에 2^n승의 경우의 수로 input과 output에 적용된다</p>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/303ed521-c53c-40f3-aa23-08cd98748187/image.png" width = '400px'></p>

<p>💁‍♀️ residual block을 추가 할때마다 paths의 number는 2배로 늘어남</p>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/5092967f-008a-4bd1-b316-b161b8e34824/image.png" width = '400px'></p>

<p>💁‍♀️  즉, L개의 block으로 구성된 ResNet은 총 L^2개의 skip connection 을 가지고 있게 된다</p>
<h2 id="he-initialization">he initialization</h2>
<p>💁‍♀️  he initialization은 Glorot 기법의 한계를 극복하기 위해  Kaming He가 2010년에 발표한 &#39;delving deep into rectifier, he et al, 2010&#39;에서 제안된 기법이다.</p>
<p>💁‍♀️  ResNet에서 일반적인 initialization하면 초기 weight가 크므로  shortcut connection시 더해지는 값이 커지기 때문에 he initialization를 사용하였다.</p>
<p>💁‍♀️ ReLU함수를  activation으로 사용되는 신경망을 초기화할때 많이 사용된다.</p>
<h2 id="batch-nornalizaion">batch nornalizaion</h2>
<p>💁‍♀️  batch nornalizaion은 2015년 구글의 Sergey loffe, Christian Szegedy가 공동으로 발표한 &#39;Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift&#39;에서 소개되었다. 2015년 발표된 이후 딥러닝모델에 대부분 적용되면 ResNet에서도 적용되었다.</p>
<p>💁‍♀️ Covariate Shift는 학습하는 중에 이전 layer의 파라미터 변화로 현재 layer가의 입력 분포가 바뀌는 현상이다. 
💁‍ batch nornalizaion으로 층으로 들어가는 입력값이 한쪽으로 쏠리거나 너무 퍼지거나, 좁아지지 않게 해준다</p>
<h1 id="densenet">DenseNet</h1>
<blockquote>
<p> 2017년 CVPR에서 소개된 &#39;Densely Connected Convolutional Networks&#39;에 나온 모델로 ResNet과 비교하였을때 더 적은 parameter를 이용하여 더 높은 성능을 낸 모델이다.</p>
</blockquote>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/e32e19e8-dac8-47cd-83dd-e52a00a3e3fd/image.png" width = '400px'></p>

<h2 id="densenet구조">DenseNet구조</h2>
<p>💁‍♀️ ResNet은 element-wise addition이고 DenseNet은 channel-wise concatenation이다.</p>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/640046eb-e622-43d2-9562-03c12d0c7845/image.png" width = '400px'></p>

<p>💁‍♀️ ResNet은 skip connection을 통하여 바로 뒤의 layer를 연결하는 addition 통로가 생기는 반면 DenseNet은 네트워크 이름과 같이 바로 뒤의 layer 뿐만 아니라 더 뒤의 layer 까지 연결한 concatenation 통로가 빽빽하게 만들어진다.</p>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/d5a49cad-cd89-45f4-b055-850d2979944c/image.png" width = '400px'></p>

<p>💁‍♀️ 이전의 출력들이 모든 레이어에 concatenate하면서 dense하게 이루어지고, 상위 레이어에서도 하위레이어의 값을 참조한다</p>
<h2 id="densenet-특징">DenseNet 특징</h2>
<p>💁‍♀️ DenseNet은 이런 구조를 통해 아래와 같은 특징을 가진다.</p>
<ul>
<li><p>특징의 재사용한다(Encourage the reuse of features)
  많은 레이어를 통과하여 신경망의 끝에 다다르면, 처음 레이어의 피쳐맵에 대한 정보는 사라질 수 있있는데 DenseNet은 처음 레이어의 피쳐맵을 마지막 레이어의 피쳐맵까지 연결하므로써 feature reuse 하였다. 
feature reuse을 통해 정보가 소실되는 것을 방지해 information flow가 향상된다</p>
</li>
<li><p>역전파 강화(strengthen feature propagation)
  또한 Back Propagation시 초기의 gradient가 소실될 수 있는데, 초기값을 마지막으로 직접 전달하므로 Back Propagation시 값이 직접 전달해 Back Propagation를 강화한다</p>
</li>
<li><p>경사 소실 완화(gradient vanishing alleviate)
  이러한 Dense한 구조는 강한 gradient flow, information 소실을 방지하여 gradient vanishing alleviate한다.</p>
</li>
<li><p>파라미터수와 연산량이 적다.
  DenseNet은 많은 채널수를 이용한다. 각 레이어의 피쳐맵을 연결하여 다음 레이어로 전달하면, 적은 채널 수의 피쳐맵을 생성하고, 그리고 이 피쳐맵은 이전 레이어의 피쳐맵과 결합하여 다음 레이어로 전달되므로 파라미터 수가 적다.</p>
</li>
</ul>
<h1 id="senet">SENet</h1>
<blockquote>
<p>&#39;SENet, Squeeze-and-Excitation Networks&#39;에서 소개한 모델로  SENet은 ILSVRC 2017에서 1등을 한 모델이다.
SE Block을 활용하는 모델로 SE Block은 CNN 기반 모델에 부착하여 사용한다. residual 모델, Inception 모델, VGGnet에도 함께 사용할 수 있다.
low-level에서 SE Block은 클래스 상관없이 중요한 특징을 추출하고, High-level에서는 클래스와 관련있는 특징들을 추출한다고 한다.</p>
</blockquote>
<p>💁‍♀️ ResNet와 DenseNet처럼 깊이를 늘리거나 connection을 새로 만드는 것과 달리 채널간의 관계에 주목한 모델이다.
채널 간 interdependency(상호의존도)를 모델링하여 채널의 wise한 응답을 recalibrates(재보정)했다. </p>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/f260b563-b332-4229-8136-d609ffb68ee3/image.png" width = '400px'></p>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/8df05e27-5a7b-48cb-9c22-8bb2f12dd839/image.png" width = '400px'></p>

<p>💁‍♀️  ResNet-50에 부착되어 사용된 것을 알 수 있다. </p>
<h2 id="senet의-구조">SENet의 구조</h2>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/4ee372e9-4d92-4bb9-a1f6-008a7cb005b1/image.png" width = '400px'></p>

<h2 id="squeeze-step">squeeze step</h2>
<p>💁‍♀️ Squeeze는 각 채널을 1차원으로 만드는 역할(압축)을 한다
각 채널별 가중치를 계산하기 위해 각 채널을 1차원으로 만든다.
입력을 global average pooling을 통해 1x1xC로 압축해 각 채널의 공간정보를 없애고 채널의 분포를 구한다. 즉, magnitude(상대적 수치)라고 볼 수 있다.</p>
<h2 id="excitation-step">excitation step</h2>
<p>💁‍♀️  Excitation은 Squeeze에서 생성된 (1x1xC)벡터를 정규화하여 가중치를 부여하는 역할을 한다.
FC Layer를 통해 채널간 연관성 고려해서 채널을 새로 gating(재배열)하기 위한 attention score를 구함 
구한 attention score와 squeeze step에서 구한 분포를 활용해 중요도가 떨어지는 것은 낮은 값을(닫히도록) 중요도가 높은 것은 강조하도록(열리도록) activation을 rescaling함</p>
<h2 id="senet의-성능">SENet의 성능</h2>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/651de7bc-ce23-46c2-82c9-309c01c804de/image.png" width = '400px'></p>

<p>💁‍♀️  SE Block을 붙였을때 성능이 좋아진 것을 볼 수 있다.</p>
<h1 id="efficientnet">EfficientNet</h1>
<blockquote>
<p>2019년 5월(Arxiv), ICML에서 Mingxing Tan, Quoc V. Le가 발표한 &#39;EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks&#39;에서 소개된 모델이다.</p>
</blockquote>
<p>앞선 모델들을 통해 성능을 높이기 위한 방법은 3가지로 귀결됨을 알 수 있다. 
👉 more width</p>
<ul>
<li>GooleNEt- inception 모듈, , DENSNET 과 같이 채널 축을 늘리는 방법</li>
</ul>
<p>👉 more deep</p>
<ul>
<li>ResNet과 같이 레이어를 많이 쌓기</li>
<li>(ResNetdms element-wise addition구조이므로 width가 아닌 deep 방식이다)</li>
</ul>
<p>👉 more resolution scaling</p>
<ul>
<li>해상도 높은 이미지(사이즈가 큰 input data) 학습</li>
</ul>
<p>💁‍♀️ 3가지 방법론 각각 어느정도 성능 향상이 있지만 그 증가폭은 서로 다르다
💁‍♀️ EfficientNet은 이 3가지를 동시에 어떻게 scaling하면 더 좋은 모델이 나오지 않을까? 라는 것에 주목한다. </p>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/c0ef76f1-5b6e-4882-80f2-4a5b62bf3947/image.png" width = '400px'></p>

<p>💁‍♀️  EfficientNet은 이 3가지의 최적의 조합을 AutoML을 통해 찾은 논문이다. 조합을 효율적으로 만들 수 있도록 하는 compound scaling 방법을 제안하며 이를 통해 더 작은 크기의 모델로도 SOTA를 달성한 논문이다.</p>
<h2 id="efficientnet-성능">EfficientNet 성능</h2>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/c38fc7b6-189f-4883-9c87-0c052f97645c/image.png" width = '400px'></p>

<p>💁‍♀️ ImageNet에서 기존 ConvNet보다 8.4배 작으면서 6.1배 빠르고 더 높은 정확도를 갖는다.
💁‍♀️ 사람이 직접 모델링한 모델들보다 훨씬 성능이 좋고,NasNet(강화학습과 RNN을 통해 컴퓨터가 모델링한 모델)보다도 성능이 좋다, 적은 FLOPS(컴퓨터 성능)로 좋은 성능을 냈다</p>
<h1 id="image-classification-요약">image classification 요약</h1>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/843604f2-72fe-4e48-938a-f9c60d8f301a/image.png" width = '400px'></p>
<p align="center"><img src="https://velog.velcdn.com/images/hipjaengyi_cat18/post/7eb90007-9c78-4b58-823d-6ec272407dc0/image.png" width = '400px'></p>

<p>LesNet-5 : 처음 CNN구조를 제안함
AlexEet : 간단한 CNN 모델로, 모델 사이즈가 코고, simple 컴퓨팅 계산, 높은 메모리 사이즈, 낮은 정확도를 가짐
VGGNet : 간단한 3*3conv로 구성되며 가장 높은 메모리, 가장 무거운 컴퓨팅 계산을 지님
GoogLNet : inception module &amp; auxiliary classifier로 VGGNet보다 낮은 컴퓨팅 계산, 메모리 사이즈도 적음, 그러나 Inception 계열 모델 중에서는 크고 느림
ResNet : Moderate efficiency를 가짐</p>
<p>💁‍♀️ 여러 다른 task의 backbone 모델은 VGG, ResNet 등을 사용한다</p>
<h1 id="epilogue">Epilogue</h1>
<p>이미지 분류는 다양한 어플리케이션에 적용할 수 있고, 실용적이라 관심이 많다.
CV분야의 뼈대되는 방법으로 최근 컴퓨터 비전 발전사에서 허리 역할을 하고 있다. 
다음 장에서는 CV분야에서 이미지 분류 외에 다른 Tasks를 다루겠다.</p>
<h4 id="-참고-">-참고-</h4>
<ul>
<li>네이버 부스트캠프 AITech 5기</li>
<li><a href="&#39;https://bskyvision.com/entry/CNN-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EB%93%A4-GoogLeNetinception-v1%EC%9D%98-%EA%B5%AC%EC%A1%B0&#39;">[CNN 알고리즘들] GoogLeNet(inception v1)의 구조</a></li>
<li><a href="https://hayate1212.tistory.com/13">CNN 아키텍처 정리3 - GoogLeNet</a></li>
<li><a href="https://bskyvision.com/421">[CNN 알고리즘들] AlexNet의 구조</a></li>
<li><a href="https://jays0606.tistory.com/3">ResNet 논문 요약/리뷰</a></li>
<li><a href="https://curaai00.tistory.com/1">curaai00-ResNet</a></li>
<li><a href="https://wjunsea.tistory.com/99">ResNet 구조 이해 및 구현</a></li>
<li><a href="https://yeomko.tistory.com/40">갈아먹는 딥러닝 기초 [2] weight initialization</a></li>
<li><a href="https://gaussian37.github.io/dl-concept-densenet/">DenseNet</a></li>
<li><a href="https://deep-learning-study.tistory.com/528">[논문 읽기] DenseNet(2017) 리뷰</a></li>
<li><a href="https://greeksharifa.github.io/computer%20vision/2022/03/01/EfficientNet/">EfficientNet 논문 설명(EfficientNet - Rethinking Model Scaling for Convolutional Neural Networks)</a></li>
</ul>
]]></description>
        </item>
    </channel>
</rss>