<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>EunChan's Tech Blog</title>
    <link>https://eunchankim-dev.tistory.com/</link>
    <description>기록하는 습관</description>
    <language>ko</language>
    <pubDate>Wed, 1 Jul 2026 08:45:32 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>EunChan_Kim</managingEditor>
    <image>
      <title>EunChan's Tech Blog</title>
      <url>https://tistory1.daumcdn.net/tistory/4273605/attach/e12c6c2d305643079a0f165415566a85</url>
      <link>https://eunchankim-dev.tistory.com</link>
    </image>
    <item>
      <title>스마일프로 수술 후기 (당일~일주일) #고도근시</title>
      <link>https://eunchankim-dev.tistory.com/64</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f8f8f8; color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #555555; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;수술 전&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;div id=&quot;SE-81472a70-6f7f-40cd-8d2e-034a99825668&quot; style=&quot;color: #000000; text-align: start;&quot; data-a11y-title=&quot;본문&quot; data-compid=&quot;SE-81472a70-6f7f-40cd-8d2e-034a99825668&quot;&gt;
&lt;div&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;SE-81472a70-6f7f-40cd-8d2e-034a99825668&quot; data-unitid=&quot;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-c7a51820-9c15-4421-9dfc-4297d68d155c&quot;&gt;
&lt;p id=&quot;SE-6ca08175-4d68-401e-8c6d-ab26e719e874&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #007aa6;&quot;&gt;&lt;i&gt;&lt;b&gt;안경 탈출 결심&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6814edbe-be89-4f88-b06c-7f7b49517fca&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;전에는 안경 쓰는 게 불편해도 수술을 생각할 정도 까진 아니었다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-aff6d238-8bb1-4ea0-88cc-fa8c573382ee&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;근데 최근들어 눈이 더 나빠져서 안경 압축을 3번이나 하기도 했고,&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a6b35006-9bed-4c31-bf69-a8c1e3fa7e32&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;크로스핏을 시작하면서 안경이 더 거슬리게 되어 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;시력교정수술을 하고 싶어졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5723fa7e-d96f-468e-8f1c-a7450920c0c6&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-1fc11558-d653-46b7-95a0-d2fbd58786ed&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-477b251c-f294-4179-b486-16322261b4a8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #007aa6;&quot;&gt;&lt;i&gt;&lt;b&gt;수술 방법 고민&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ac16e2d3-edf2-4688-ace6-488041709fa9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어떤 시력교정수술을 받을지&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d45a4778-0eb3-44ff-a437-1e702a78676d&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;시력교정술 관련 논문&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;을 찾아보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-987896a1-85ca-428a-a4ea-5401e67209be&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(어떤 정보 찾을 때 논문 보는 버릇이 있다)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-44f199bf-deae-47c1-aad4-84696e252a0f&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-b69a7f74-fe5b-4be6-b358-f22e4886052a&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;전문적인 의료지식은 없어 잘은 모르지만&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c1ae708e-2bd4-4695-83f5-095b69221632&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여러 수술 관련 논문과 유튜브를 서치 해본 결과 본 결과&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-718a5ebb-e1f4-4975-9810-8c33b683f8f1&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[스마일라식]이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;u&gt;지금 있는 수술방법 중&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-cc3a1cf7-d7e4-4cbc-9290-c8bbd582542c&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;u&gt;가장 안전한 방법이라는 결론&lt;/u&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 났다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;스마일라식을 잘하는 병원&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;을 찾아보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b16b22ff-aac0-498c-829c-8817afb38441&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-0ef00ce2-94ae-400e-ae35-fef46b96587a&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #007aa6;&quot;&gt;&lt;i&gt;&lt;b&gt;병원 찾기&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-39698e08-9d8b-4789-92df-b7ce5cf9b24f&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;서울에 스마일라식 하는 여러 병원이 있어서 비교를 해보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f96dcd8a-a7de-4493-b8a1-c210ebae1690&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;일단&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;스마일라식 건수,수술기계 등 비교&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해서 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;몇개의 병원을 추려놓았다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2faaeb09-0009-4ae6-8b3d-430c4ea75c18&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-78237d39-3b0a-4454-9ed1-3a668b7348e6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그중 처남이 스마일라식 수술한 병원도 있었는데 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;수술 만족도가 높다고 해서 더 자세히 알아보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-db7e919b-130a-43f9-98c4-5bc3d2fa0bf0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-01b65974-1e5a-4944-9b6d-88dea02504db&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(참고로 와이프는 강남에 한 병원에서 예전에 라식 수술받고 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;부작용으로 엄청 힘들어해서 내&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;눈수술을 극구 반대&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;했는데,&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-84aa43c7-d296-4315-a0d1-d0f5efd29e7b&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;남동생이 한 스마일라식은 라식과 수술방법이 다르고 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;부작용도 거의 없다고 해서 마지못해 허락한 상태였다.)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4b7d3631-2521-4d73-beba-dda9363ba850&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-6d6ec70d-11ee-43ce-b92d-6ba37522726c&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;처남이 받은 병원을 자세히 알아보니&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;수술 건수,수술 기계가 기준&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;에 맞았고&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-fbe76e55-5b87-40c7-9c85-e52e6a4ea4a2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;u&gt;스마일라식 관련 논문도 대표원장이 대부분 다 제1저자&lt;/u&gt;로 쓰고 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-160c63cd-8d10-43d9-a236-03ba77a53ea1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-f47375b8-c2be-467e-a139-23c1902156c7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 외에도 스마일라식 특허 기술도 있고 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여러 면에서 꽤 믿을만하겠다는 생각이 들었다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e5f1f58d-3dbc-47b8-930d-ae1069422651&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-e5249644-ab23-42fe-b824-2b29456e2e3c&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;마침 상황적으로도 수술을 하기 적합하게 되어 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 병원으로 예약을 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-c2d9567d-3644-493c-ab60-9a61d2f6f8a1&quot; style=&quot;color: #000000; text-align: start;&quot; data-a11y-title=&quot;사진&quot; data-compid=&quot;SE-c2d9567d-3644-493c-ab60-9a61d2f6f8a1&quot;&gt;
&lt;div&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;SE-c2d9567d-3644-493c-ab60-9a61d2f6f8a1&quot; data-unitid=&quot;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-c2d9567d-3644-493c-ab60-9a61d2f6f8a1&quot;&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;&quot; data-unitid=&quot;SE-c2d9567d-3644-493c-ab60-9a61d2f6f8a1&quot;&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;527&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wi8ZG/btswbEeirIr/c1HfpKs1bbp2XfVIupwjm0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wi8ZG/btswbEeirIr/c1HfpKs1bbp2XfVIupwjm0/img.jpg&quot; data-alt=&quot;복도 사진&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wi8ZG/btswbEeirIr/c1HfpKs1bbp2XfVIupwjm0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwi8ZG%2FbtswbEeirIr%2Fc1HfpKs1bbp2XfVIupwjm0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;431&quot; height=&quot;527&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;527&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;복도 사진&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-daaf9c56-031a-40b1-b78e-e4d6c4230f24&quot; style=&quot;color: #000000; text-align: start;&quot; data-a11y-title=&quot;본문&quot; data-compid=&quot;SE-daaf9c56-031a-40b1-b78e-e4d6c4230f24&quot;&gt;
&lt;div&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;SE-daaf9c56-031a-40b1-b78e-e4d6c4230f24&quot; data-unitid=&quot;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-ad49d474-d792-4c7d-829c-f14f4f8a4cfb&quot;&gt;
&lt;p id=&quot;SE-abc12b9b-11bd-40f5-b651-a8c45fafae2f&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-2c57cd0d-5f04-43b4-a6e0-498b51520ef6&quot; style=&quot;color: #000000; text-align: start;&quot; data-a11y-title=&quot;소제목&quot; data-compid=&quot;SE-2c57cd0d-5f04-43b4-a6e0-498b51520ef6&quot;&gt;
&lt;div&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;SE-2c57cd0d-5f04-43b4-a6e0-498b51520ef6&quot; data-unitid=&quot;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-9c561915-7b2b-4067-9af0-e64377e8a22a&quot;&gt;
&lt;h2 id=&quot;SE-8550e7f4-f2cb-4513-82e8-b6aab2311e48&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #555555;&quot;&gt;수술 당일&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-b6725a6e-7d39-44a5-8907-037c1c0a6ba0&quot; style=&quot;color: #000000; text-align: start;&quot; data-a11y-title=&quot;본문&quot; data-compid=&quot;SE-b6725a6e-7d39-44a5-8907-037c1c0a6ba0&quot;&gt;
&lt;div&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;SE-b6725a6e-7d39-44a5-8907-037c1c0a6ba0&quot; data-unitid=&quot;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-9a57e417-4b23-435a-be51-1a80abecad2a&quot;&gt;
&lt;p id=&quot;SE-af5a2202-89fe-489f-9fd2-77f86a34618f&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #007aa6;&quot;&gt;&lt;i&gt;&lt;b&gt;대기&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0bee7f6e-9406-4482-87b5-2f3f7816ecb0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;토요일에 당일 검사&amp;amp;수술을 예약했다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a0d54811-95a0-43f3-a395-d8478d39b466&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;첫 타임으로 했는데도 사람이 많았다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-cd3ade26-ec1f-4a85-8f2b-2423bc864571&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-03e99d77-70aa-47a6-b989-b02965681ab3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;병원 tv에 수술 영상이 나오는데..&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-30c857b8-9d07-4dcd-a87d-0621e9577ce6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;수술 장면을 보니까 겁이 났다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c74e6e40-da3a-4815-ad71-ab03a423ec86&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(수술에 자신감이 있으니까 틀어놨겠지&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4c96f7c1-62db-4e9f-b8d1-ddbb9427e749&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;싶지만 볼수록 점점 더 무서워졌다.)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0a6b836d-fae4-434b-8dd3-fc3d01ffb02e&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-b69f29ae-0472-4ec1-a6ea-458a11740501&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #007aa6;&quot;&gt;&lt;i&gt;&lt;b&gt;검사&amp;amp;상담&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-41ad143e-b5c7-40d1-95d1-e6fedfeb571c&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;한 검안사 분이 담당해서 검사랑 상담해 주셨다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;검사 기계마다 어떤 검사인지 설명해 주시고, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;검사 끝나고 바로바로 검사 결과도 설명해 주셔서 좋았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-99bd5374-ee81-4c37-994d-8946a229ebfb&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;상담도 궁금한 것들 다 친절하게 대답을 해주셨고, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스마일라식을 생각하고 갔는데&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;스마일프로&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;에 대해서 설명도 해주셨다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-41f622a2-cda3-42eb-a6ce-32eecb69d957&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스마일프로에 대한 정보는 인터넷에서 얼핏 보았는데, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기계가 비쥬맥스 800이라고 본 기억이 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f102075f-5ca8-4f02-984f-e1ec14cb4f9f&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-18e1dc7c-964e-4c09-a78d-c416cd3b743f&quot; data-ke-size=&quot;size16&quot;&gt;설명해 주시기로,&lt;/p&gt;
&lt;p id=&quot;SE-f1ba524a-b786-44fa-813d-f050620579a2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스마일라식 (비쥬맥스 500)의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;업그레이드 버전인 스마일프로 (비쥬맥스 800) 기계가&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 나왔고,&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a1caae33-c130-445b-809b-dbdb76866abe&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스마일프로는 기존 스마일라식 병원 중에서 선정된 병원만 수술이 도입되었다고 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5317b077-d00e-4d5b-b1fe-4c37aef86951&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(스마일프로는 서울에 10개 병원만 선정됐다고 했던 거 같다.)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-38b58e2a-5125-41f7-b4ab-7bace6cf9997&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-595b7478-4773-43c2-aa96-781e74293743&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여러 설명을 들어보니,&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f2dd958f-bdfc-4690-acaa-e75712d640f0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스마일라식과 스마일프로가 수술 방법은 같은데 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기계 스펙이 스마일프로(비쥬맥스 800)가 더 빠르고 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;더 진보된 부분&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 있어서 결과적으로 더 좋을 것 같았다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 &lt;b&gt;스마일프로로.. 받기로 했다.!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d738fc2d-3990-451d-b380-f5bc56aaf96a&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(스마일프로가 스마일라식보다 비용이 더 비싸긴 하지만 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;한번 하는 눈 수술 더 좋은 기계로 하는 것이 낫겠다는 생각이 들었다.)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3e3996ed-270a-4891-91c2-a5cb91a6343a&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-23353903-3b1c-43e1-8237-11a91004926d&quot; style=&quot;color: #000000; text-align: start;&quot; data-a11y-title=&quot;사진&quot; data-compid=&quot;SE-23353903-3b1c-43e1-8237-11a91004926d&quot;&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;SE-23353903-3b1c-43e1-8237-11a91004926d&quot; data-unitid=&quot;&quot;&gt;
&lt;div id=&quot;SE-23353903-3b1c-43e1-8237-11a91004926d&quot;&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;&quot; data-unitid=&quot;SE-23353903-3b1c-43e1-8237-11a91004926d&quot;&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMrf6I/btswbetiI6M/Z9CUt0efK7BxDUED8kMky0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMrf6I/btswbetiI6M/Z9CUt0efK7BxDUED8kMky0/img.jpg&quot; data-alt=&quot;비쥬맥스 800모형&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMrf6I/btswbetiI6M/Z9CUt0efK7BxDUED8kMky0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMrf6I%2FbtswbetiI6M%2FZ9CUt0efK7BxDUED8kMky0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;442&quot; height=&quot;628&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;628&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;비쥬맥스 800모형&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-cca11429-a5b6-45ab-993d-a776de8db4ec&quot; style=&quot;color: #000000; text-align: start;&quot; data-a11y-title=&quot;본문&quot; data-compid=&quot;SE-cca11429-a5b6-45ab-993d-a776de8db4ec&quot;&gt;
&lt;div&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;SE-cca11429-a5b6-45ab-993d-a776de8db4ec&quot; data-unitid=&quot;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-93a78299-2707-4519-bfa0-5cea02582249&quot;&gt;
&lt;p id=&quot;SE-eb227586-98e9-4106-a1e4-86aaaa25f5f8&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-bda1f63a-713d-44c5-8d1e-698b764fc41c&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #007aa6;&quot;&gt;&lt;i&gt;&lt;b&gt;수술 진행&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-dd807eeb-75bf-4988-94fe-b67e4051e55b&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;검사 결과 수술하기 적합한 눈임이 판정되고 나서 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;당일 수술&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;을 결정하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b4a28693-9bf5-4cf1-b142-c5b5bc327e9b&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-c1cd90d0-6b46-4c4c-ad39-2f493ddb9ebc&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;수술센터 들어가서 수술복 입고&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a5343285-667e-4fa0-95a5-ece6baf7f1c3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;피 뽑고(자가혈청용) 얼굴 소독하고..&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d8544b1e-3ca4-4057-bc6c-9f61b2b0ef72&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;수술이 시작되었던 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2e95687a-7f44-46da-adb8-07e1731ead90&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(긴장해서 자세히 기억은 안 남)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0b32f380-1845-4c3d-baba-f5e843e91846&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-d4ce085d-0f82-4477-87a8-088d58dbede4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;수술대에 누었을 때 급속도로 긴장되었는데 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그만큼 수술도 빨리 끝났던 거 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ae3431c5-403a-46f2-8120-73a77e80b9db&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;진짜 스마일프로라서 그런지(?) &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;왼쪽 눈 오른쪽 눈 수술이 금방 끝나서 다행이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-18c2d577-6c4d-4a68-b0aa-dec09d5f5519&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-0291fc43-af35-45bf-a990-5c06d108344f&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;원장님도 수술 바로 끝내시고&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0518cf7f-a905-47a3-8592-55afab76d0ef&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;잘되었어요~ 하고 가셨던 거 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ac83d554-fcda-4418-9eaa-e14a89415385&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-79bf3ee6-554a-49c4-bd18-f26e8e6c4883&quot; style=&quot;color: #000000; text-align: start;&quot; data-a11y-title=&quot;사진&quot; data-compid=&quot;SE-79bf3ee6-554a-49c4-bd18-f26e8e6c4883&quot;&gt;
&lt;div&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;SE-79bf3ee6-554a-49c4-bd18-f26e8e6c4883&quot; data-unitid=&quot;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-79bf3ee6-554a-49c4-bd18-f26e8e6c4883&quot;&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;&quot; data-unitid=&quot;SE-79bf3ee6-554a-49c4-bd18-f26e8e6c4883&quot;&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;1018&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QL4m1/btsv8AwXLq8/cCmrxWGvS1NHhF1KjVwoBk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QL4m1/btsv8AwXLq8/cCmrxWGvS1NHhF1KjVwoBk/img.jpg&quot; data-alt=&quot;수술 후 받은 카드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QL4m1/btsv8AwXLq8/cCmrxWGvS1NHhF1KjVwoBk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQL4m1%2Fbtsv8AwXLq8%2FcCmrxWGvS1NHhF1KjVwoBk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;359&quot; height=&quot;1018&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;1018&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;수술 후 받은 카드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;SE-cf418118-17a6-4daa-b20f-36be7057ca55&quot;&gt;
&lt;p id=&quot;SE-a55146e7-78ad-4d55-ba84-9fe53dd69b9d&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-0f8aeebb-e9e4-41b1-b80b-45f9f393edab&quot; style=&quot;color: #000000; text-align: start;&quot; data-a11y-title=&quot;소제목&quot; data-compid=&quot;SE-0f8aeebb-e9e4-41b1-b80b-45f9f393edab&quot;&gt;
&lt;div&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;SE-0f8aeebb-e9e4-41b1-b80b-45f9f393edab&quot; data-unitid=&quot;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-0011b2d5-0257-445b-87ec-f70712d41d39&quot;&gt;
&lt;h2 id=&quot;SE-dab3ea11-aa0b-4f00-aaac-0e0c83d8e201&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;수술 후&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-ac8e1930-a742-43bd-b042-9b90d62d4faa&quot; style=&quot;color: #000000; text-align: start;&quot; data-a11y-title=&quot;본문&quot; data-compid=&quot;SE-ac8e1930-a742-43bd-b042-9b90d62d4faa&quot;&gt;
&lt;div&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;SE-ac8e1930-a742-43bd-b042-9b90d62d4faa&quot; data-unitid=&quot;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-7f71dc92-28b3-4b84-84dc-4a48f0fb1fc4&quot;&gt;
&lt;p id=&quot;SE-1db16b9d-d6aa-4b24-b92b-0d845b4755cc&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #007aa6;&quot;&gt;&lt;i&gt;&lt;b&gt;수술 당일&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;수술 끝나고 나오니 시야가 뿌옜다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b6daae7a-7fea-4b3e-a2fe-0e0e9876ed3f&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래도 앞은 보고 다닐 순 있는 정도.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9ab358b7-0f51-4353-901d-1f37fead9178&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-82208233-98e0-4136-8ae1-4c07e846baab&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;근처에서 밥을 먹고 출발하려고 하니&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a63c2955-c699-4d07-aad2-3acff1acc373&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그쯤부터 마취가 풀렸는지 엄청 아팠다..&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-dfdb7781-642a-4305-8e9f-a850443fa3e3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 진통제 먹고 안약 넣고&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6ff4ad91-3698-4c2b-9063-da7736624ae1&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;끙끙 참으면서 집 가서 계속 잠잤다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-1dbff012-d5e3-46c3-95dc-2207163841ec&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-5d30a078-207f-495c-8fc5-9a956d2ff09b&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;:: 수술 당일은 통증이 밤까지 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-454043e5-5458-46f4-b545-aa891f936d6e&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;통증은 사람마다 다르다고 했는데 나는 통증이 있는 편이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-03203cb9-8f45-447a-8259-f761eb55fcbb&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-7db8f064-411f-488c-a0ec-e2fcf2ad29b2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #007aa6;&quot;&gt;&lt;i&gt;&lt;b&gt;수술 1일차&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e10235ae-c397-4ef5-b81d-398bc39877c6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;뿌연 건 많이 없어졌고, 보이는 것도 꽤 보였다. 안통은 가끔 살짝 있는 편.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ec31fa75-045f-4d01-8612-9ba506e4d679&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래도 일상생활은 할 수 있었고, 운전도 낮운전 2시간 하는데 무리는 없었다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-55b14fa1-a0ce-4359-9a7e-bb54ea8b0bce&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;빛 번짐, 건조증도 이 정도면 괜찮은 수준.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-94b5226e-b3bc-465a-819d-50ecd99add5b&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-6c002d97-e256-441f-8460-756e62cff4a2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #007aa6;&quot;&gt;&lt;i&gt;&lt;b&gt;수술 2일차&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a7d1eb5c-ffad-43c2-8799-624a262d7461&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;통증은 없어졌고 뿌연 것은 살짝 남아있음.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-59de161f-10f5-4218-acce-6f07237e55d9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;보이는 것은 더 잘 보임.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7cbd3e95-f7e3-4fae-b037-f22597291967&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-c4af10b3-0a19-4721-95a2-336272ed4fb2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;:: 산동검사를 하러 병원에 방문했다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-82d2111c-04c2-4b94-8d56-374b0efa1352&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;동공이 커지는 안약을 넣고, 검사를 받고 나오는데 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;안내해 주신 대로 빛 번짐이 너무 심했다..&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4b58070c-84f6-4fed-8cd5-5aa1c82d6a1a&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(동공이 거의 검은 동자를 다 차지하도록 커짐.)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a7e3c55e-0e74-451b-b966-f9871ba5e68e&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;수술 직후보다 산동검사 후가 앞에 보는 게 어려워서 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;개인적으론 이때가 보호자가 더 필요할 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a7e1c334-0dfc-45b5-92a7-171c7185760c&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-a84bcb19-30a9-4e94-be86-a9c0cbaf94fc&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이날은 밤까지 동공이 잘 안 돌아와서&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8b1c2bb9-f2e5-44a4-b100-05a6a6123768&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;집에서 거의 잠을 잤다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-51a38303-9389-4cb7-ac3c-db1c84054007&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-2e5472fb-ce39-4fe7-97f1-88047f4e5384&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #007aa6;&quot;&gt;&lt;i&gt;&lt;b&gt;수술 3일차&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ee7c55e2-ce64-469d-8c05-afbb8b92d862&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;동공은 돌아왔고,&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6d9aff2e-e354-4fb4-a0c3-69adbe0a76a4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;산동검사 전보다 빛 번짐 더 있고 가까운 것 초점이 잘 안 맞는낌.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-71cf9903-da4d-4975-a83a-d6bb239a96c5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;건조함은 비슷하고, 뿌연 것도 비슷.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-572e348d-62a6-43a8-a344-c6e897b27ab1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-136cfbec-bb4d-49f2-93cc-8ab9e3c15a2d&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #007aa6;&quot;&gt;&lt;i&gt;&lt;b&gt;수술 4일차&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-1b55c915-7535-4aff-b069-3d965ff22f83&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;눈 상태 어제와 비슷.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-060f096e-a25f-44e4-a671-90d117322a20&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;밤운전을 해야 했는데, 빛 번짐이 심해서 불편했다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(야간 운전은 1~2개월 정도 주의라고 안내받음)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ff1e062a-54fb-4723-adbd-00c4142eddfd&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-b14d3206-5067-4d98-9b08-dc8d2295275d&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #007aa6;&quot;&gt;&lt;i&gt;&lt;b&gt;수술 5일차&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6fe777ad-84f6-4373-829a-0743436746c4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;눈 상태는 비슷.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-736da63c-8a18-4328-b19d-4716294d14eb&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어제 야간운전을 오래 해서&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e05e3c08-84ae-4b91-89d6-dff53c887cb6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;눈이 좀 피곤한 느낌.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6753ba33-7c1b-4f8a-bca9-39ca446fd1cd&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;쉬는 날이라 잠을 많이 잠.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9c0d46a0-67dd-4e4b-bd79-c11c2bff99f8&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-d75d3ff5-077a-4d49-bc21-747b72096498&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #007aa6;&quot;&gt;&lt;i&gt;&lt;b&gt;수술 6일차&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-04975d39-785b-4893-bdd4-e9d5420dc119&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어제 잠을 많이 자서 그런지 눈 상태 호전.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9ca39a9b-3b75-430d-b4db-e4f73a12aa73&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;빛 번짐은 산동검사 전처럼 줄어들었고&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a15656a5-a146-4156-950a-3be5913b0b58&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;뿌연 것도 거의 없어짐&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-67edbe16-8078-41ce-b26e-d652e5939b13&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(잠이 보약임)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-affc6ed2-670c-4678-9c19-5d80483d9ef4&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-93f5d153-0e77-499a-b09c-0e46ed397635&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #007aa6;&quot;&gt;&lt;i&gt;&lt;b&gt;수술 7일차~&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ea0d6bdb-f15b-40f2-8375-fc6f60070800&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;수술 6일 차 이후로 눈상태는 비슷. (현재 9일 차) &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;시력 어느 정도 잘 나오고, 뿌연 감도 많이 좋아짐&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-840e6097-ca81-48ad-9d7f-d43af48fba32&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;건조함은 원래도 눈이 건조했어서, 건조한 게 불편함으로 다가오진 않음&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-58955c05-3bb5-4b81-aac0-80a496cf9ab3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;빛 번짐은 살짝 있음, 야간 운전은 어느 정도 가능한 정도지만 주의해야 함.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3ee553c5-9436-4bfa-b80a-4397aa4cddc4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(시간 지남에 따라 더 좋아지는 부분이라고 해서 걱정은 안 함)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3c21f9e4-4847-4ad4-8b15-0f02c918abd0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-f6af96b5-f1b2-4d0e-90b0-30dff1e9c856&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-9a660296-93f6-4257-a750-4ac4adb4fe97&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #007aa6;&quot;&gt;&lt;i&gt;&lt;b&gt;수술 후 관리&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ffa236f4-5cb7-4c11-8a66-41a15e91b840&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;처방받은 안약 5주 동안 넣어야 하고&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6ebcfc58-42ad-44ca-b432-10c44762cdc8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인공눈물 건조할 때 종종 넣고 있음.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0e64fa50-e58a-417b-ab8c-3952720d0f88&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오메가 3랑 비타민C가 좋다고 해서 먹는 중&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-00dd2c18-ea8c-4889-a0b4-3fe012d69a17&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-75ba8487-7875-4d81-8b44-dd624bdd6863&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-4ea50142-e191-4254-8891-4a2e31b76e9b&quot; style=&quot;color: #000000; text-align: start;&quot; data-a11y-title=&quot;소제목&quot; data-compid=&quot;SE-4ea50142-e191-4254-8891-4a2e31b76e9b&quot;&gt;
&lt;div&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;SE-4ea50142-e191-4254-8891-4a2e31b76e9b&quot; data-unitid=&quot;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-51930cc8-7f9f-4a3b-b33d-de8580fc56e4&quot;&gt;
&lt;h2 id=&quot;SE-66a44985-055d-4170-92a2-bf30a0723399&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;총평&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-f3483ba9-ca22-41aa-ab47-9c01e874880c&quot; style=&quot;color: #000000; text-align: start;&quot; data-a11y-title=&quot;본문&quot; data-compid=&quot;SE-f3483ba9-ca22-41aa-ab47-9c01e874880c&quot;&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;SE-f3483ba9-ca22-41aa-ab47-9c01e874880c&quot; data-unitid=&quot;&quot;&gt;
&lt;div id=&quot;SE-09a20824-9eb2-4b10-b6ce-534251cd3619&quot;&gt;
&lt;p id=&quot;SE-05f1f0bc-2a1e-4ccb-9fe7-1824ec4e0a0f&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;일주일 차에 이 정도면 만족!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;빛 번짐은 한 달 정도 지켜봐야 할 것 같음. (야간 운전 주의)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-de0432cb-0544-4f02-9731-f8fc1eee6898&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 부분은 개인차가 있고 한 달 정도 지나면서 개선된다고 함.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f6daf3bf-67b3-4f95-a098-0b99de7c8757&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-5258dbbd-256f-4cdc-abc8-6d3622cf43a0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;무튼 수술은 잘 되었으니&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b0a43896-4bd7-4d78-8e6a-caeccfde8ebf&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나머지 회복은 나의 각막에게 맡기고&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9f7ff486-e356-406e-a5b6-2e354633c1d0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;안약 잘 넣으며 지켜보기로!&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a817b2ef-3a1f-4549-865d-3b5763969b62&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-1236efc2-c7a7-4c14-92fa-4f7e50809dea&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;+ 병원 관계자 분들이 너무 친절함. 수술 후 카톡상담도 일일이 친절하게 답변해 주심.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-981b9bb2-96d0-4b61-a29b-d95159ae765a&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>essay/My Life</category>
      <category>1mm스마일프로</category>
      <category>내돈내산</category>
      <category>라섹</category>
      <category>라식</category>
      <category>스마일라식</category>
      <category>스마일라식 후기</category>
      <category>스마일프로</category>
      <category>스마일프로 후기</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/64</guid>
      <comments>https://eunchankim-dev.tistory.com/64#entry64comment</comments>
      <pubDate>Tue, 3 Oct 2023 12:00:00 +0900</pubDate>
    </item>
    <item>
      <title>[Docker]Docker에서 RViz 실행하기(ROS Error log)</title>
      <link>https://eunchankim-dev.tistory.com/63</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;최근&amp;nbsp; ROS1를 사용할 일이 생겨서 그냥 우분투 18.04 위에서 사용하고 있었는데 우분투를 20.04로 업데이트를 해버려서 디펜던시 에러가 났다. 우분투 버전에 따라 ROS 버전도 달라져서 그냥 도커를 써버리기로 했다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;도커를 사용할때 ROS Visualizaion Tool 인 RViz의 GUI사용이 docker 내에서 작동이 안 되는데 간단하게 볼륨 마운트를 통해 도커 내에 GUI사용을 가능하게 할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;150&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lA4Su/btr43ZB2j7d/6hL9z7pPbd8mrMVenxz18k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lA4Su/btr43ZB2j7d/6hL9z7pPbd8mrMVenxz18k/img.png&quot; data-alt=&quot;ROS의 상징인 거북이&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lA4Su/btr43ZB2j7d/6hL9z7pPbd8mrMVenxz18k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlA4Su%2Fbtr43ZB2j7d%2F6hL9z7pPbd8mrMVenxz18k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;150&quot; height=&quot;183&quot; data-origin-width=&quot;150&quot; data-origin-height=&quot;183&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ROS의 상징인 거북이&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&amp;nbsp;ROS 버전&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #555555; text-align: justify;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Ubuntu 14.04 + ROS Indigo&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Ubuntu 16.04 + ROS Kinetic&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Ubuntu 18.04 + ROS Melodic&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Ubuntu 20.04 + ROS Noetic&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;위에처럼 버전이다다르고 다른 버전끼리 충돌 나니 docker를 사용하는 게 정신 건강에 이롭다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: justify;&quot;&gt;Open Source Robotics Foundation&lt;span&gt; 에서 제작한 ROS도커 이미지를 사용해도 되지만 &lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: justify;&quot;&gt;Ubuntu 18.04 이미지로&lt;/span&gt;&amp;nbsp;ROS 설치해 진행했다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;RViz &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Docker 실행 &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679360964171&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo docker run -it -d \     
--network=&quot;host&quot; \
--ipc=&quot;host&quot; \
--gpus all \
--privileged \
--name=&quot;ros&quot; \
-e DISPLAY=$DISPLAY \
-v $XAUTHORITY:$XAUTHORITY \
-e XAUTHORITY=$XAUTHORITY \
-e QT_X11_NO_MITSHM=1 \
-v /tmp/.X11-unix:/tmp/.X11-unix:ro \
ubuntu:18.04&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 host옵션으로 실행하고 privileged(도커내에서 호스트 컴퓨터의 옵션을 바꿀 수 있음&amp;rarr; 필수) 모드로 실행 후 ROS관련 패키지를 설치한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 디스플레이들은 다 연결하였지만 만약 아래와 같은 에러가 발생하는경우&lt;/p&gt;
&lt;pre id=&quot;code_1679361113648&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[ WARN] [1678170522.800490847]: OGRE EXCEPTION(3:RenderingAPIException): Unable to create a suitable GLXContext in GLXContext::GLXContext at /build/ogre-1.9-B6QkmW/ogre-1.9-1.9.0+dfsg1/RenderSystems/GL/src/GLX/OgreGLXContext.cpp (line 61)
rviz::RenderSystem: error creating render window: OGRE EXCEPTION(3:RenderingAPIException): Unable to create a suitable GLXContext in GLXContext::GLXContext at /build/ogre-1.9-B6QkmW/ogre-1.9-1.9.0+dfsg1/RenderSystems/GL/src/GLX/OgreGLXContext.cpp (line 61)
[ERROR] [1678170522.800518308]: Unable to create the rendering window after 100 tries.
terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_M_construct null not valid
[ INFO] [1678170522.834817415]: I0307 15:28:42.000000 22420 ordered_multi_queue.cc:172] All sensor data for trajectory 0 is available starting at '638137673228306087'.
[ INFO] [1678170522.907428787]: I0307 15:28:42.000000 22420 local_trajectory_builder_2d.cc:127] Extrapolator not yet initialized.
[ INFO] [1678170522.933869912]: I0307 15:28:42.000000 22420 local_trajectory_builder_2d.cc:138] Extrapolator is still initializing.
===============
=================================================================REQUIRED process [rviz-7] has died!
process has died [pid 22456, exit code -6, cmd /opt/ros/melodic/lib/rviz/rviz -d /root/catkin_ws/src/STELLA_N1_REMOTEPC_X4_ROS1_v2.0/stella_slam/rviz/stella_cartographer.rviz __name:=rviz __log:=/root/.ros/log/443acb9e-bcb1-11ed-9f7b-04421a0bc2f4/rviz-7.log].
log file: /root/.ros/log/443acb9e-bcb1-11ed-9f7b-04421a0bc2f4/rviz-7*.log
Initiating shutdown!
================================================================================
[rviz-7] killing on exit
[ WARN] [1678170523.082931502]: global_costmap: Parameter &quot;plugins&quot; not provided, loading pre-Hydro parameters&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글에 찾아봐도 안 나와서 다양한 방법을 시도해 보다가 그냥 컨테이너 내에서 그래픽카드를 새로 설치하였다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1679361184382&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install nvidia-driver-470 libnvidia-gl-470 libnvidia-compute-470 libnvidia-decode-470 libnvidia-encode-470 libnvidia-ifr1-470 libnvidia-fbc1-470&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후 컨테이너 재실행을 하니 제대로 실행이 되었다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1049&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xXay1/btr42SiTxi7/WI8zDyJmsmY5myVk0KVJu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xXay1/btr42SiTxi7/WI8zDyJmsmY5myVk0KVJu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xXay1/btr42SiTxi7/WI8zDyJmsmY5myVk0KVJu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxXay1%2Fbtr42SiTxi7%2FWI8zDyJmsmY5myVk0KVJu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;1049&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1049&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Docker</category>
      <category>ROS</category>
      <category>RViz</category>
      <category>도커</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/63</guid>
      <comments>https://eunchankim-dev.tistory.com/63#entry63comment</comments>
      <pubDate>Mon, 27 Mar 2023 11:16:49 +0900</pubDate>
    </item>
    <item>
      <title>[Linux] ldconfig</title>
      <link>https://eunchankim-dev.tistory.com/62</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;ldconfig&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;공통적인 라이브러리를 사용하는 것을 동적 라이브러리라고 하는데, 바이너리를 실행할 때 shared object(.so) 등의 동적 라이브러리를 연결해 주는 링커 설정 명령어이다. 리눅스에서 .so 파일을 제대로 인식하지 못할 때 공유 라이브러리 캐시를 재설정한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;ldconfig는 존재하는 파일을 조사하고, /etc/ld.so.cache 캐시 파일을 설정하면서 필요한 라이브러리를 적재하고 심볼릭 링크를 만드는 역할을 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;/etc/ld.so.conf.d/ 에 .conf 파일을 추가, 수정하거나 &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;LD_LIBRARY_PATH 를 변경하게 된다면 ldconfig를 통해 라이브러리를 다시 설정해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ldconfig 옵션&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;-C cache&amp;nbsp;: /etc/ld.so.cache 파일 대신 지정한 파일을 이용한다.&lt;/li&gt;
&lt;li&gt;-f conf&amp;nbsp;: /etc/ld.so.conf 파일 대신 이용할 설정 파일을 지정한다.&lt;/li&gt;
&lt;li&gt;-l&amp;nbsp;: 수동으로 각각의 라이브러리를 링크한다.&lt;/li&gt;
&lt;li&gt;-n&amp;nbsp;: 명령 행에서 지정한 디렉터리만을 대상으로 하며, /usr/lib, /lib, /etc/ld.so.conf 파일은 진행하지 않는다.&lt;/li&gt;
&lt;li&gt;-N&amp;nbsp;: 캐시를 업데이트하지 않고, 단지 링크만을 업데이트한다.&lt;/li&gt;
&lt;li&gt;-p --print-cache&amp;nbsp;: 현재 캐시에 저장된 디렉터리와 라이브러리 목록을 출력한다.&lt;/li&gt;
&lt;li&gt;-r root&amp;nbsp;: 루트 디렉터리(root)를 지정한다.&lt;/li&gt;
&lt;li&gt;-v, --verbose&amp;nbsp;: 현재 버전 정보와 관련된 디렉터리와 링크들을 상세하게 출력한다.&lt;/li&gt;
&lt;li&gt;-V, --version&amp;nbsp;: 버전 정보를 출력한다.&lt;/li&gt;
&lt;li&gt;-X&amp;nbsp;: 링크를 업데이트하지 않고, 단지 캐시만을 업데이트한다.&lt;/li&gt;
&lt;li&gt;-?. --help, --usage&amp;nbsp;: 사용법을 출력한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고자료&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://itwiki.kr/w/%EB%A6%AC%EB%88%85%EC%8A%A4_ldconfig&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://itwiki.kr/w/%EB%A6%AC%EB%88%85%EC%8A%A4_ldconfig&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>programming/Linux</category>
      <category>ldconfig</category>
      <category>리눅스</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/62</guid>
      <comments>https://eunchankim-dev.tistory.com/62#entry62comment</comments>
      <pubDate>Mon, 6 Mar 2023 22:23:08 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 타이핑, 타입 힌트 (typing / type hint)</title>
      <link>https://eunchankim-dev.tistory.com/61</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s4QRg/btrQruq2mKq/8KJaKMj3N0K8sKPU4a6xj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s4QRg/btrQruq2mKq/8KJaKMj3N0K8sKPU4a6xj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s4QRg/btrQruq2mKq/8KJaKMj3N0K8sKPU4a6xj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs4QRg%2FbtrQruq2mKq%2F8KJaKMj3N0K8sKPU4a6xj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;721&quot; height=&quot;395&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;493&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 회사 프로젝트에서 AI모델 개발, 웹 개발, 배포까지 혼자서 해야 했던 프로젝트가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;집에 가서도 모델을 튜닝하고 백엔드 로직을 작성하고 DB도 만들고... 프론트도 하고.. 개발 중에 여기저기서 발생하는 문제들을 해결하다가 보면 어느 순간 제가 작성한 코드를 보면 많은 변수들의 타입을 알지 못해서 맨탈이 나갈 때가 있습니다. 프로그램의 복잡도가 높아지고 거대해질수록 이러한 문제는 빈번하게 발생합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬은 동적타입언어(&lt;span style=&quot;color: #333333;&quot;&gt;dynamically typed language)&lt;/span&gt;여서 변수에 타입을 알아서 동적으로 지정해주기 때문에 빠르게 개발을 좋지만 프로그램이 점점 거대해질수록 타입을 알지 못하는 변수들 때문에 생상성이 급격하게 하락할 수 있습니다. 이러한 단점을 보안하기 위해 Python에서는 3.5 버전부터 &lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;타입 어노테이션(type annotation) &lt;/b&gt;또는&lt;b&gt; 타입 힌트(type hint)&lt;/b&gt;&lt;/span&gt;라는 기능을 지원합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333;&quot;&gt;이 변수의 type은 무엇인지, 또는 이 함수의 인수는 어떤 type이고, 어떤 type의 결과를 return하는지 명시해주는 것입니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333;&quot;&gt;&lt;b&gt;타입 힌트(type hint)&lt;/b&gt;가 나오기 전에는 주석이나 독스트링 이용해 타입을 표시했지만 정해진 표준이 없었고 일반 주석과 구분이 어려웠었습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIVir4/btrQw11HFCx/ilsjxkTTwm9oJT6ppFbzH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIVir4/btrQw11HFCx/ilsjxkTTwm9oJT6ppFbzH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIVir4/btrQw11HFCx/ilsjxkTTwm9oJT6ppFbzH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIVir4%2FbtrQw11HFCx%2FilsjxkTTwm9oJT6ppFbzH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;860&quot; height=&quot;160&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;154&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면에 타입 힌트에서는 타입 어노테이션이라는 새로운 방법으로 파이썬 코드의 타입 표시를 표준화합니다. 코드 편집기(IDE)나 린터(linter)에서도 해석할 수 있도록 고안되었으며 코드의 자동완성이나 정적 타입 체킹에서도 사용됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;타입 힌트(type hint)&lt;/b&gt;을 사용할 때 주의할 점은 &lt;b&gt;&lt;b&gt;타입 힌트(type hint)&lt;/b&gt;&lt;/b&gt; 부정확하다고 해서 경고나 오류가 발생하지 않는다는 점입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nyuoJ/btrQuI2EgOB/uQM4JPdhEIYhLxVJqQPua0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nyuoJ/btrQuI2EgOB/uQM4JPdhEIYhLxVJqQPua0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nyuoJ/btrQuI2EgOB/uQM4JPdhEIYhLxVJqQPua0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnyuoJ%2FbtrQuI2EgOB%2FuQM4JPdhEIYhLxVJqQPua0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;866&quot; height=&quot;202&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;202&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 타입 힌트를 어떻게 사용하는지 보겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;변수 타입 어노테이션&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 매우 간단한 변수에 타입 힌트를 추가하는 방법에 대해서 알아보겠습니다. 변수 이름 뒤에 콜론(:)을 붙이고 타입을 명시해주면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0lUA8/btrQsDguVVY/cheWwNt8i28x2L7w8uk8G1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0lUA8/btrQsDguVVY/cheWwNt8i28x2L7w8uk8G1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0lUA8/btrQsDguVVY/cheWwNt8i28x2L7w8uk8G1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0lUA8%2FbtrQsDguVVY%2FcheWwNt8i28x2L7w8uk8G1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;970&quot; height=&quot;416&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;함수 타입 어노테이션&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;콜론(:)과 화살표(-&amp;gt;)를 사용할 때는 파이썬의 관행을 따라 콜론은 뒤에만 한 칸을 뛰우고, 화살표는 앞뒤로 한 칸을 띄웁니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zoKTS/btrQw2zAQX8/eZG3OeHlrYmMceHTHZyFP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zoKTS/btrQw2zAQX8/eZG3OeHlrYmMceHTHZyFP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zoKTS/btrQw2zAQX8/eZG3OeHlrYmMceHTHZyFP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzoKTS%2FbtrQw2zAQX8%2FeZG3OeHlrYmMceHTHZyFP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;978&quot; height=&quot;470&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;470&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Typing 모듈&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내장 타입을 이용해서 복잡한 타입 힌트를 추가할 때는 Typing 모듈을 사용할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfGlBo/btrQrEUtqpy/0O2OPenVIw29cFAyciMmyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfGlBo/btrQrEUtqpy/0O2OPenVIw29cFAyciMmyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfGlBo/btrQrEUtqpy/0O2OPenVIw29cFAyciMmyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfGlBo%2FbtrQrEUtqpy%2F0O2OPenVIw29cFAyciMmyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1106&quot; height=&quot;314&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;typing 모듈에 대한 자세한 설명은 추후에 포스팅을 하도록 하겠습니다. 조금더 자세한 내용은 &lt;a href=&quot;https://docs.python.org/3/library/typing.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;파이썬 공식 레퍼런스&lt;/a&gt;를 참고 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 파이썬에서 &lt;b&gt;타입 힌트(type hint)&lt;/b&gt;의 개념과 어떻게 추가하는지 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입 힌트는 비강제적이고 선택적으로 적용할 수 있기 때문에 모든 프로젝트에서 부담없이 점진적으로 적용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;협업하는 개발자들을 위해 개발이 끝난 프로젝트의 코드를 볼 미래의 나 자신을 위해서 &lt;b&gt;타입 힌트(type hint)&lt;/b&gt;를 사용하는 것을 고려해보셨으면 좋겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>programming/Python</category>
      <category>PYTHON</category>
      <category>type</category>
      <category>Typing</category>
      <category>typing hints</category>
      <category>파이썬 주석</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/61</guid>
      <comments>https://eunchankim-dev.tistory.com/61#entry61comment</comments>
      <pubDate>Sun, 6 Nov 2022 22:06:04 +0900</pubDate>
    </item>
    <item>
      <title>[Linux] tar 와 tar.gz 차이 압축, 압축 해제</title>
      <link>https://eunchankim-dev.tistory.com/60</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;tar&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스에서 압축 파일을 다룰때 대부분 tar를 많이 사용하는데 tar, tar.gz, tar.bz2 다양하게 사용된다. tar는 (Tape ARchiver)의 앞 글자들을 따서 tar라는 이름으로 만들어졌다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&quot;tar로 압축(compress)한다&quot;는 표현을 쓰는 경우가 많은데, 정확히 말하자면 tar 자체는 &quot;데이터의 크기를 줄이기 위한 파일 압축&quot;을 수행하지 않는다. 아래의 그림과 같이 여러파일을 하나의 파일로 묶는 용도로 사용된다. 대신, tar옵션을 사용하여 데이터의 크기를 줄이기 위한 파일 압축(gzip, bzip2)를 수행할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tar가 많이 사용되는 이유 중 한가지는, 단순 아카이버 기능에 더해, tar로 묶여지기 전 파일들의 속성과 심볼릭 링크, 디렉토리 구조등을 그대로 가져갈 수 있는 특징 때문이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brH48Y/btrGKo0z8p6/CjzMRsq8ZtR3JkW3vOdmE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brH48Y/btrGKo0z8p6/CjzMRsq8ZtR3JkW3vOdmE0/img.png&quot; data-alt=&quot;https://recipes4dev.tistory.com/146&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brH48Y/btrGKo0z8p6/CjzMRsq8ZtR3JkW3vOdmE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrH48Y%2FbtrGKo0z8p6%2FCjzMRsq8ZtR3JkW3vOdmE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;369&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;369&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://recipes4dev.tistory.com/146&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;tar 명령어 옵션&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1657247781892&quot; class=&quot;bash&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# tar --help를 통해 옵션을 확인할 수 있다. 
tar [OPTION...] [FILE]...
        -f     : 대상 tar 아카이브 지정. (기본 옵션)
        -c     : tar 아카이브 생성. 기존 아카이브 덮어 쓰기. (파일 묶을 때 사용)
        -x     : tar 아카이브에서 파일 추출. (파일 풀 때 사용)
        -v     : 처리되는 과정(파일 정보)을 자세하게 나열.
        -z     : gzip 압축 적용 옵션.
        -j     : bzip2 압축 적용 옵션.
        -t     : tar 아카이브에 포함된 내용 확인.
        -C     : 대상 디렉토리 경로 지정.
        -A     : 지정된 파일을 tar 아카이브에 추가.
        -d     : tar 아카이브와 파일 시스템 간 차이점 검색.
        -r     : tar 아카이브의 마지막에 파일들 추가.
        -u     : tar 아카이브의 마지막에 파일들 추가.
        -k     : tar 아카이브 추출 시, 기존 파일 유지.
        -U     : tar 아카이브 추출 전, 기존 파일 삭제.
        -w     : 모든 진행 과정에 대해 확인 요청. (interactive)
        -e     : 첫 번째 에러 발생 시 중지.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;tar 명령어 사용 예시&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style4&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;현재 디렉토리의 모든 파일과 디렉토리를 tar로 묶기&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;tar cvf T.tar *&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;대상 디렉토리를 포함한 모든 파일과 디렉토리를 tar로 묶기&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;tar cvf T.tar [PATH]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;파일을 지정하여 tar 아카이브로 묶기&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;tar cvf T.tar [FILE_1] [FILE_2]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;tar 아카이브를 현재 디렉토리에 풀기&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;tar xvf T.tar&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;tar 아카이브를 지정된 디렉토리에 풀기&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;tar xvf T.tar -C [PATH]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;tar 아카이브의 내용 확인하기&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;tar tvf T.tar&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;현재 디렉토리를 tar로 묶고 gzip으로 압축하기&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;tar zcvf T.tar.gz *&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;gzip으로 압축된 tar 아카이브를 현재 디렉토리에 풀기&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;tar zxvf T.tar.gz&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;현재 디렉토리를 tar로 묶고 bzip2로 압축하기&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;tar jcvf T.tar.bz2 *&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;bzip2로 압축된 tar 아카이브를 현재 디렉토리에 풀기&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;tar jxvf T.tar.bz2&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;tar 아카이브 묶거나 풀 때 파일 별 진행 여부 확인하기&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;tar cvfw T.tar *&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;압축하기&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;tar 압축&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657248176122&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# tar 압축
tar -cvf [파일명.tar] [폴더명]
tar -cvf test_dir.tar test_dir/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;tar.gz 압축&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657248331655&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# tar gz 압축
tar -zxvf [파일명.tar.gz]
tar -zxvf test_dir.tar.gz test_dir/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;tar.bz2 압축&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657248474795&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# tar bz2 압축
tar -jxvf [파일명.tar.bz2]
tar -jxvf test_dir.tar.bz2 test_dir/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;압축 해제 하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;tar 압축 해제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657248641633&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# tar 압축 해제
tar -xvf [파일명.tar] 
tar -xvf test_dir.tar&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;tar.gz 압축 해제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657248678397&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# tar.gz 압축 해제
tar -zxvf [파일명.tar.gz] 
tar -zxvf test_dir.tar.gz&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;tar.bz2 압축&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657248717297&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# tar bz2 압축 해제
tar -jxvf [파일명.tar.bz2] 
tar -jxvf test_dir.tar.bz2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;--%---%EC%B-%B-%EA%B-%A--%--tar%--%EB%AA%--%EB%A-%B-%EC%--%B-%--%EC%--%AC%EC%-A%A-%--%EC%--%--%EC%-B%-C&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고자료&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://recipes4dev.tistory.com/146&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://recipes4dev.tistory.com/146&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>programming/Linux</category>
      <category>Linux tar</category>
      <category>TAR</category>
      <category>tar.gz</category>
      <category>리눅스</category>
      <category>리눅스 압축</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/60</guid>
      <comments>https://eunchankim-dev.tistory.com/60#entry60comment</comments>
      <pubDate>Fri, 8 Jul 2022 11:54:56 +0900</pubDate>
    </item>
    <item>
      <title>[Algorithm]_2. 파이썬으로 피보나치수를 구하는 방법들</title>
      <link>https://eunchankim-dev.tistory.com/59</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;피보나치수열&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이탈리아의 수학자 피보나치는 아라비아에서 발전된 수학을 유럽에 소개하여 유럽 전역에 수학을 발전시키는데 기여하였습니다. 피보나치는 1202년 자신의 저서 Liber abaci 에서 다음과 같은 토기 번식에 문제를 제시하였습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;갓 태어난 토끼 암수 한 쌍이 있다. 이 토끼 한 쌍은 태어난 지 두 달이 되는 달부터 매달 암수 한 쌍의 토끼를 낳으며, 새로 태어난 토끼 한 쌍도 태어난 지 두 달이 되는 달부터 매달 아뭇 한 쌍의 토끼를 낳는다. 일 년 후 토끼는 모두 몇 쌍이 될까? (토끼는 중간에 죽지 않는다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 수열로 나타내면 아래와 같습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;i&gt;&quot;1,1,2,3,5,8,13,21...&quot;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;위와 같이 어떤 수열의 항이, 앞의 두 항의 합과 같은 수열을 레오나르도 피보나치의 이름을 따서 피보나치 수열이라고 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;알고리즘 입문 문제에 피보나치수열에 대한 문제가 종종 등장하는데요 오늘은 피보나치의 수를 구할 수 있는 방법들에 알아보려고 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;435&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcW1iO/btrDRcIKZZ6/EKkUkJBHNi4341MpuVI2z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcW1iO/btrDRcIKZZ6/EKkUkJBHNi4341MpuVI2z1/img.png&quot; data-alt=&quot;피보나치 넘버스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcW1iO/btrDRcIKZZ6/EKkUkJBHNi4341MpuVI2z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcW1iO%2FbtrDRcIKZZ6%2FEKkUkJBHNi4341MpuVI2z1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;435&quot; height=&quot;400&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;435&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;피보나치 넘버스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 반복문&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 기본적으로 사용되고 직관적인 방법입니다. 반복문이 시작되면&amp;nbsp; a의 값이&amp;nbsp; b 값으로 변경되며 b 는 a+b 로 변경됩니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1654234510956&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def fib(n):
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b 
    return a&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 재귀 함수&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자기 자신을 호출하는 방법으로 알고리즘 문제에 자주 나오는 방법입니다. &lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1654234686327&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def fib(n):
    if n == 0:
        return 0
    elif n == 1 or n == 2:
        return 1
    else:
        return fib(n - 1) + fib(n - 2)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;재귀 함수의 단점은 n이 증가하면 시간 복잡도(&lt;b&gt;&lt;span&gt;O(2n)&lt;/span&gt;&lt;/b&gt;)가 가파르게 증가한다는 점입니다. &lt;/span&gt;&lt;/span&gt;&lt;span&gt;이러한 문제를 해결하기 위해 메모이제이션(Memoization)을 적용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 메모이제이션(Memoization)&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 계산한 값을 저장해 중복된 계산을 하지 않는 방법입니다. 메모이제이션을 통해 재귀 함수의 속도를 대폭 향상할 수 있습니다. 파이썬에서는 functools을 임포트 해 간단히 구현할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1654234975516&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from functools import lru_cache


@lru_cache 
def fib(n):
    if n == 0:
        return 0
    elif n == 1 or n == 2:
        return 1
    else:
        return fib(n - 1) + fib(n - 2)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 외에도 다양한 방법이 있겠지만 자주 사용하는 방법들 위주로 정리해보았습니다.&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm</category>
      <category>fibonacci</category>
      <category>메모이제이션</category>
      <category>알고리즘</category>
      <category>코딩테스트</category>
      <category>코테</category>
      <category>파이썬</category>
      <category>피보나치</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/59</guid>
      <comments>https://eunchankim-dev.tistory.com/59#entry59comment</comments>
      <pubDate>Fri, 3 Jun 2022 14:44:58 +0900</pubDate>
    </item>
    <item>
      <title>[Docker]Docker 설치하기(Ubuntu)</title>
      <link>https://eunchankim-dev.tistory.com/58</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 최근 들어 M&lt;span style=&quot;color: #555555;&quot;&gt;SA(Micro Service Architecture)가 대세로 떠오르면서 MSA의 단점인 관리의 복잡성을 해결해주기 위해 서비스의 컨테이너화가 이루어지면서 Docker를 활발이 사용하게 되었습니다. 컨테이너 == Docker 가 될 만큼 Docker 성장세는 무섭게 올라가고 있습니다. 오늘은 우분투(Ubuntu) 환경에 도커를 설치해보겠습니다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;1208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdv7aQ/btrBOuDw2Nx/1mkeKVxRd2Yb3Gkx4lLLt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdv7aQ/btrBOuDw2Nx/1mkeKVxRd2Yb3Gkx4lLLt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdv7aQ/btrBOuDw2Nx/1mkeKVxRd2Yb3Gkx4lLLt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcdv7aQ%2FbtrBOuDw2Nx%2F1mkeKVxRd2Yb3Gkx4lLLt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;354&quot; height=&quot;315&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;1208&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Docker&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot; data-reactroot=&quot;&quot;&gt;컨테이너 기술을 사용하여 애플리케이션에 필요한 환경을 신속하게 구축하고 테스트 및 배포를 할 수 있게 해주는 소프트웨어 플랫폼 입니다&lt;/span&gt;.&lt;/b&gt; 컨테이너란 애플리케이션 소스 코드를 임의의 환경에서 해당 코드의 실행에 필요한 운영체제 라이브러리 및 종속 항목과 결합하는 실행 가능한 표준 컴포넌트를 말합니다. Docker를 사용하지 않고도 컨테이너를 구축할 수 있지만 Docker 플랫폼을 이용하면 쉽고 간편하고 안전하게 컨테이너를 빌드, 배포, 관리할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Docker-CE&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;패키지 저장소 추가&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;오래된 버전의 도커가 설치되어 있다면 먼저 삭제합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1652184699034&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get remove docker docker-engine docker.io&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; Apt 패키지 관리자를 업데이트 Docker 설치에 필요한 패키지들을 설치합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1652184873365&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아래의 명령어를 사용하여 Docker 공식 gpg key와 저장소를 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1652184946497&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo add-apt-repository \
   &quot;deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;현재의 우분투 버전에서 Docker 패키지가 검색이 되는지 확인합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1652185351756&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get update &amp;amp;&amp;amp; sudo apt-cache search docker-ce

# 정상적으로 패키지가 검색된다면 아래와 같은 내용이 출력됩니다. 
docker-ce - Docker: the open-source application container engine&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Docker CE Install&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아래의 명령어로 Dokcer CE 버전을 설치합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1652185434614&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install docker-ce&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;그리고 일반 사용자 계정으로 docker 명령어를 사용하기 위해서 아래의 명령어로 그룹을 추가 후 도커를 재실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1652185623844&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo usermod -aG docker $USER

sudo systemctl restart docker&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;일반 사용자를 docker 그룹에 추가하지 않을 경우,&amp;nbsp; sudo 권한이 아닌 일반 사용자로 docker 명령 실행 시 아래와 같은 오류가 발생할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1652185698140&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.39/containers/json?all=1: dial unix /var/run/docker.sock: connect: permission denied&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;설치가 제대로 되었는지 확인합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1652185777631&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run hello-world&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Nvidia-docker 설치&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333;&quot;&gt;Docker 안에서 NVIDIA의 GPU를 이용하시면서 여러 환경의 CUDA Tookit을 이용하실 경우 호스트 운영체제에 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;NVIDIA 드라이버가 설치되어 있는 상태에서 &lt;/span&gt;nvidia-docker라는 확장 기능을 사용해야 합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;NVIDIA 드라이버가 설치 되어 있는 상태에서 아래의 명령어를 사용하여&amp;nbsp; nvidia-docker&amp;nbsp; gpg key와 저장소를 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1652186476582&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
  sudo apt-key add -
  
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)

curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-docker.list

sudo apt-get update&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그리고 아래의 명령어로 nvidia-docker를 설치 후 docker를 다시 실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1652186574600&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;호환되는&amp;nbsp; CUDA 버전의 컨테이너를&amp;nbsp; docker hub에서 다운로드하여 아래와 같이 실행해서 gpu 가 사용 가능한지 확인합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1652186771212&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run --gpus all nvidia/cuda:11.2-base nvidia-smi&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Ops/Docker</category>
      <category>Docker</category>
      <category>Docker-CE</category>
      <category>nvidia-docker</category>
      <category>도커</category>
      <category>우분투도커</category>
      <category>컨테이너</category>
      <category>쿠버네티스</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/58</guid>
      <comments>https://eunchankim-dev.tistory.com/58#entry58comment</comments>
      <pubDate>Tue, 10 May 2022 21:48:42 +0900</pubDate>
    </item>
    <item>
      <title>[Django]Startproject, Startapps 명령어로 생성되지 않은 파일에서 장고 사용하기</title>
      <link>https://eunchankim-dev.tistory.com/35</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;오류&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 장고에서 프로젝트나 앱을 만들면 해당 이름의 폴더와 .py 파일이 생성되는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성한 프로젝트 안에서 다른 .py파일을 생성하고 장고에 등록된 모델 또는 함수를 사용할 때 다음과 같은 애러가 발생됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://django.core.exceptions.ImproperlyConfigured:&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;django.core.exceptions.ImproperlyConfigured:&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1617858074681&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; ImproperlyConfigured(
django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;from graph.models import Covid -&amp;gt; 장고 프로젝트 파일이 아닌 임의로 생성한 python 파일에서 장고의 모델을 불러오려고 하다가 실패&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;917&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mHoJQ/btq16RBaEOh/E4xZC40sW2TvDncu4UwfmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mHoJQ/btq16RBaEOh/E4xZC40sW2TvDncu4UwfmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mHoJQ/btq16RBaEOh/E4xZC40sW2TvDncu4UwfmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmHoJQ%2Fbtq16RBaEOh%2FE4xZC40sW2TvDncu4UwfmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;793&quot; height=&quot;917&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;917&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 오류를 해결하기 위해서는 환경을 장고에 맞춰주는 코드를 form graph.models import Covid 과 같은 파일 위에 선언해주어야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;장고 환경 설정 코드&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1617859283692&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os
os.environ.setdefault(&quot;DJANGO_SETTINGS_MODULE&quot;, &quot;config.settings&quot;)

import django
django.setup()

from user.models import Users&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;os.environ&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;는 운영체제에 등록되어 있는 환경변수에 접근하는 명령어로서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;단순히 os.environ을 작성하게 되면 자신의 컴퓨터에 있는 환경변수가 출력됩니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;os.environ.setdefault(A, B) 는 A라는 이름으로 B를 값으로 등록하겠다는 의미입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;저 같은 경우에는 settings파일이 chart 패키지에 있기때문에 import chart를 해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GQdo3/btq16s2NRX1/KgmHmiHRoshhu6MESXwh6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GQdo3/btq16s2NRX1/KgmHmiHRoshhu6MESXwh6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GQdo3/btq16s2NRX1/KgmHmiHRoshhu6MESXwh6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGQdo3%2Fbtq16s2NRX1%2FKgmHmiHRoshhu6MESXwh6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;944&quot; height=&quot;170&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;170&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>programming/Django</category>
      <category>Django</category>
      <category>django.setup()</category>
      <category>PYTHON</category>
      <category>오류해결</category>
      <category>장고</category>
      <category>장고프로젝트</category>
      <category>파이썬</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/35</guid>
      <comments>https://eunchankim-dev.tistory.com/35#entry35comment</comments>
      <pubDate>Fri, 6 May 2022 14:56:50 +0900</pubDate>
    </item>
    <item>
      <title>[Django]Django CORS Error</title>
      <link>https://eunchankim-dev.tistory.com/39</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLdAgT/btq3LVup3Dj/Ee2lm5XBdWCUrWqZXdEZqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLdAgT/btq3LVup3Dj/Ee2lm5XBdWCUrWqZXdEZqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLdAgT/btq3LVup3Dj/Ee2lm5XBdWCUrWqZXdEZqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLdAgT%2Fbtq3LVup3Dj%2FEe2lm5XBdWCUrWqZXdEZqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;680&quot; height=&quot;399&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;399&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;CORS&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;CORS(Cross Origin&lt;span&gt;&amp;nbsp;&lt;/span&gt;Resource Sharing) &lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;웹 페이지&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;상의 제한된&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;리소스&lt;span&gt;를 최초 자원이 서비스된 도메인 밖의 다른&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;도메인&lt;span&gt;으로부터 요청할 수 있게 허용하는 구조입니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;CORS Error&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;대부분 웹 브라우저는 Javascript를 이용한 AJAX(Asynchronous Javascript XML) 통신을 통한 데이터 송수신을 하는데, &lt;/span&gt;&lt;span&gt;다른 도메인을 가진 서버의 URL을 호출해 데이터를 가져오려고 하는 경우 &lt;/span&gt;&lt;span&gt;보안 문제인 Cross Domain 에러를 발생시킵니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;왜냐하면 내가 웹 서비스에서 사용하기 위해 다른 서브 도메인을 가진 API 서버를 구축했는데, 내가 아닌 다른 웹 서비스에서 이 API 서버에 접근해서 마음대로 API를 호출해서 사용하면 안 되기 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;동일 출처 정책(Same Origin Policy) 때문에 CORS가 발생하는데, 브라우저에서 외부 서버가&lt;span&gt;&amp;nbsp;&lt;/span&gt;cross-origin HTTP로&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;요청한 데이터를 보안 목적으로 차단해서 데이터를 받을 수 없습니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;즉, 자신과 동일한 도메인에 한해서만 요청을 허용하고 처리해줍니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Django CORS Error 해결 방법&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. pip install로 django-cors-headers 앱을 설치합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;django-cors-headers는 Cross-Origin Resource Sharing(CORS) 에 필요한 서버의 헤더를 조작하기 위한 Django 앱입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1619672106049&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install django-cors-headers&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. S&lt;span style=&quot;color: #333333;&quot;&gt;ettings의&amp;nbsp;&lt;/span&gt;installed apps 목록에 corsheaders를 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1619672199517&quot; class=&quot;python&quot; style=&quot;box-sizing: inherit; overflow: auto; font-family: monospace, monospace; font-size: medium; background: rgba(0, 0, 0, 0.05); color: rgba(34, 85, 51, 0.87); white-space: pre-wrap; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;INSTALLED_APPS = [
    ...
    'corsheaders',
    ...
]

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3. &lt;span style=&quot;color: #333333;&quot;&gt;S&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;ettings&lt;/span&gt;의 Middlewar 목록 맨위에 아래의 코드를 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1619672375406&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    ...
]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. &lt;span style=&quot;color: #333333;&quot;&gt;Django settings에서 미들웨어 동작을 구성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1619672588018&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CORS_ORIGIN_ALLOW_ALL = True # &amp;lt;- 모든 호스트 허용

#CORS_ORIGIN_ALLOW_ALL를 False로 하고 아래의 화이트리스트로 허용하고 싶은 호스트만 입력해 사용할 수 있습니다. 

CORS_ORIGIN_WHITELIST = (
    &quot;http://localhost:8080&quot;,
    &quot;http://127.0.0.1:9000&quot;,
    &quot;https://example.com&quot;
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;CORS_ORIGIN_WHITELIST&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;에는 cross-site 요청을 허용하는 호스트들을 추가합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;또는 모든 호스트를 허용하고 싶으면 &lt;span style=&quot;color: #333333;&quot;&gt;CORS_ORIGIN_ALLOW_ALL을 True로 설정합니다. 만약&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;CORS_ORIGIN_ALLOW_ALL&lt;/span&gt;이 True 이면, whitelist는 쓰이지 않고, 모든 origin에서의 요청이 허용됩니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;CORS_ORIGIN_WHITELIST의&amp;nbsp;&lt;/span&gt;Default값은 False입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>programming/Django</category>
      <category>CORS</category>
      <category>cross origin resource sharing</category>
      <category>Django</category>
      <category>Django CORS</category>
      <category>장고</category>
      <category>장고CORS</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/39</guid>
      <comments>https://eunchankim-dev.tistory.com/39#entry39comment</comments>
      <pubDate>Thu, 5 May 2022 14:56:23 +0900</pubDate>
    </item>
    <item>
      <title>[Python] List보다 Numpy 가 빠른이유</title>
      <link>https://eunchankim-dev.tistory.com/57</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;List vs Numpy&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;파이썬에서 List는 여러 값들을 저장할 수 있는 자료구조로써 활용도가 매우 높습니다. 리스트는 다양한 자료형의 데이터를 여러 개를 저장할 수 있으며 쉽게 데이터를 수정할 수 있습니다. 하지만 데이터의 처리 양이 많아지고 처리방법이 복잡해질수록 많은 사람들은 Numpy ndarray를 사용합니다. 오늘은 많은 사람들이 왜 List 보다 Numpy ndarray를 더 많이 사용하는지 알아보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Numpy&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;큰 matrix 처리 및 다양한 연산 기능을 제공 합니다.&lt;/li&gt;
&lt;li&gt;반복문 없이 데이터 배열에 대한 처리를 지원합니다.&lt;/li&gt;
&lt;li&gt;선형대수와 관련된 다양한 기능을 제공합니다.&lt;/li&gt;
&lt;li&gt;C, C++, 포트란 등의 언어와 통합이 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Built-in List 보다 Numpy의 ndarray 가&lt;span&gt; 왜 빠른가?&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;메모리 접근 방식에 대한 차이&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ndarray는 int type의 data를 저장할 때 element들이 메모리에 연속적으로 저장되어 있지만 list의 경우 int type data의 값들이 메모리에 연속적으로 저장돼있지 않고 element의 주소를 가지고 있습니다. 주소를 타고 가더러도 객체 자체가 있고, 객체 내에서 ob_digit으로 간 다음 element에 접근해야 합니다. ndarray에 비해 list가 접근 단계가 많습니다.&lt;/li&gt;
&lt;li&gt;리스트는 여러 가지 dtype을 하나의 array에 넣을 수 있지만 numpy의 ndarray는 하나의 배열에 하나의 dtype만 넣을 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;839&quot; data-origin-height=&quot;399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2HAtI/btrz6shjiVs/BsZaB7AjIDnsb0G5fG8JNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2HAtI/btrz6shjiVs/BsZaB7AjIDnsb0G5fG8JNK/img.png&quot; data-alt=&quot;출처 : https://www.youtube.com/watch?v=fiYD0yCou4k&amp;amp;amp;t=107s&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2HAtI/btrz6shjiVs/BsZaB7AjIDnsb0G5fG8JNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2HAtI%2Fbtrz6shjiVs%2FBsZaB7AjIDnsb0G5fG8JNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;839&quot; height=&quot;399&quot; data-origin-width=&quot;839&quot; data-origin-height=&quot;399&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : https://www.youtube.com/watch?v=fiYD0yCou4k&amp;amp;t=107s&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;b&gt;Numpy 병렬 처리&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 작업을 여러 개의 서브 작업으로 나눠서 처리합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;C언어와 포트란으로 구현&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드를 기계어로 변환 과정 없이 한 줄 한줄 해석해서 실행하는(인터프린터) 파이썬 보다 코드를 모두 기계어로 변환한 후에 기계어 코드로 실행하는(컴파일) 언어로 만들어져 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;넘파이의 배열 안에는 동일한 타입의 데이터만 지정할 수 있어서 속도적인 측면에서 리스트에 앞서지만 리스트처럼 여러 가지 데이터 타입을 저장할 수 없습니다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>programming/Python</category>
      <category>array</category>
      <category>C</category>
      <category>Cpython</category>
      <category>list</category>
      <category>ndarray</category>
      <category>numpy</category>
      <category>PYTHON</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/57</guid>
      <comments>https://eunchankim-dev.tistory.com/57#entry57comment</comments>
      <pubDate>Sat, 23 Apr 2022 11:50:42 +0900</pubDate>
    </item>
    <item>
      <title>[Git,GitHub]Git 로그인 실패 Error, Access Token 발급 받는법</title>
      <link>https://eunchankim-dev.tistory.com/53</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;724&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNqL5O/btrkGMplTR6/0oRZk8zy1nr1etEUFRKZx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNqL5O/btrkGMplTR6/0oRZk8zy1nr1etEUFRKZx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNqL5O/btrkGMplTR6/0oRZk8zy1nr1etEUFRKZx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNqL5O%2FbtrkGMplTR6%2F0oRZk8zy1nr1etEUFRKZx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;251&quot; height=&quot;210&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;724&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요 오늘은 깃 로그인 실패 오류를 포스팅해보려 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사에서 프로젝트 레포지토리리를 클론 하러려고 하는데 갑자기 잘되다가 오류 하나를 만나게 되었습니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;103&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFACcE/btrkHnvMeMn/5by8ykk4imVSqHsOg8xnj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFACcE/btrkHnvMeMn/5by8ykk4imVSqHsOg8xnj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFACcE/btrkHnvMeMn/5by8ykk4imVSqHsOg8xnj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFACcE%2FbtrkHnvMeMn%2F5by8ykk4imVSqHsOg8xnj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;901&quot; height=&quot;103&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;103&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에러를 보니까 이제 비밀번호 로그인 방식은 2021년 8월 13일 이후로 지원을 안 하고 토큰이 필요하다고 하네요&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토큰에 대해서는 다른 포스팅에서 다루기로 하고 오늘은 빠르게 토큰을 발급받아 오류를 해결해 보십시다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 링크에 토큰에 대해 조금 더 자세히 나와 있습니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.blog/2020-07-30-token-authentication-requirements-for-api-and-git-operations/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.blog/2020-07-30-token-authentication-requirements-for-api-and-git-operations/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636766680887&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Token authentication requirements for API and Git operations | The GitHub Blog&quot; data-og-description=&quot;Beginning November 13th, 2020, we will no longer accept account passwords when authenticating with the GitHub REST API. In the future, we will similarly no longer accept account passwords when authenticating Git operations.&quot; data-og-host=&quot;github.blog&quot; data-og-source-url=&quot;https://github.blog/2020-07-30-token-authentication-requirements-for-api-and-git-operations/&quot; data-og-url=&quot;https://github.blog/2020-07-30-token-authentication-requirements-for-api-and-git-operations/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://github.blog/2020-07-30-token-authentication-requirements-for-api-and-git-operations/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.blog/2020-07-30-token-authentication-requirements-for-api-and-git-operations/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Token authentication requirements for API and Git operations | The GitHub Blog&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Beginning November 13th, 2020, we will no longer accept account passwords when authenticating with the GitHub REST API. In the future, we will similarly no longer accept account passwords when authenticating Git operations.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.blog&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;깃허브 토큰 발급받기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 깃허브에 로그인을 한 뒤 프로필 사진을 클릭합니다!&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;188&quot; data-origin-height=&quot;494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btAkEl/btrkHcuxAzt/d9ug0kwBkd3yYBIxBtVVN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btAkEl/btrkHcuxAzt/d9ug0kwBkd3yYBIxBtVVN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btAkEl/btrkHcuxAzt/d9ug0kwBkd3yYBIxBtVVN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtAkEl%2FbtrkHcuxAzt%2Fd9ug0kwBkd3yYBIxBtVVN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;188&quot; height=&quot;494&quot; data-origin-width=&quot;188&quot; data-origin-height=&quot;494&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Settings을 클릭하고&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;202&quot; data-origin-height=&quot;865&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7Uf5u/btrkJ5HspgO/h2Nvffg0XXgDy41768r1yK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7Uf5u/btrkJ5HspgO/h2Nvffg0XXgDy41768r1yK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7Uf5u/btrkJ5HspgO/h2Nvffg0XXgDy41768r1yK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7Uf5u%2FbtrkJ5HspgO%2Fh2Nvffg0XXgDy41768r1yK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;202&quot; height=&quot;865&quot; data-origin-width=&quot;202&quot; data-origin-height=&quot;865&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Developer setting을 클릭하고 Personal access tokens을 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;781&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/niFE7/btrkIi1Rlwl/6NeTkNLSPB7r7CsIvKDVBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/niFE7/btrkIi1Rlwl/6NeTkNLSPB7r7CsIvKDVBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/niFE7/btrkIi1Rlwl/6NeTkNLSPB7r7CsIvKDVBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FniFE7%2FbtrkIi1Rlwl%2F6NeTkNLSPB7r7CsIvKDVBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;510&quot; height=&quot;781&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;781&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 사진처럼 여러 가지 옵션이 나오는데 여기서 각자 옵션에 맞게 선택하고 &lt;span style=&quot;color: #555555;&quot;&gt;generate&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;token 버튼을 클릭해서 토큰 발급을 진행하면 됩니다!&amp;nbsp; 다 진행하고 나면 token 코드가 나오는데 복사해서 안전한 곳에 보관해둡니다.!&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;자 그럼 다시 clone을 해보겠습니다!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;189&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/doDX6N/btrkGGJjOOJ/ayXqWSRydxGnHqvbzkdAGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/doDX6N/btrkGGJjOOJ/ayXqWSRydxGnHqvbzkdAGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/doDX6N/btrkGGJjOOJ/ayXqWSRydxGnHqvbzkdAGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdoDX6N%2FbtrkGGJjOOJ%2FayXqWSRydxGnHqvbzkdAGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;895&quot; height=&quot;189&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;189&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 ID/PASSWORD를 요구한다면 PASSWORD 대신 Personal Access Token을 입력해주면 문제없이 잘 작동합니다!&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;</description>
      <category>programming/Git,Github</category>
      <category>Access Token</category>
      <category>Git</category>
      <category>github</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/53</guid>
      <comments>https://eunchankim-dev.tistory.com/53#entry53comment</comments>
      <pubDate>Mon, 4 Apr 2022 14:34:59 +0900</pubDate>
    </item>
    <item>
      <title>[Python]_8. 튜플(Tuple)</title>
      <link>https://eunchankim-dev.tistory.com/56</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;튜플(Tuple)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;이번에는 '튜플(Tuple)'에 대해 알아보도록 하겠습니다. 튜플은 리스트와 매우 비슷합니다. 튜플과 리스트가 서로 다른 점이 있다면, 대괄호 대신에 소괄호로 묶어서 표현하며 리스트는 요소의 변경이 가능한 반면에 튜플은 요소의 변경이 불가능하다는 특징을 지니고 있습니다. 우선 튜플이 어떠한 형태를 가지고 있는지 먼저 알아보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1637150832527&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; tuples = (1, 2, 3, 4)
&amp;gt;&amp;gt;&amp;gt; type(tuples)
&amp;lt;class 'tuple'&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;위의 코드를 보시면 리스트와는다르게 소괄호로 묶어서 정의하며 , 로 각각의 요소를 구분합니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;아래의 코드처럼 둘러싸고있는 소괄호를 제거하거나 리스트와 똑같이 튜플 안에 튜플을 요소로 가질 수 있습니다. &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1637151086351&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; tuples = ('a',) 
&amp;gt;&amp;gt;&amp;gt; type(tuples)
&amp;lt;class 'tuple'&amp;gt;
&amp;gt;&amp;gt;&amp;gt; tuples = 'a', 'b', 'c' 
&amp;lt;class 'tuple'&amp;gt;
&amp;gt;&amp;gt;&amp;gt; tuples = ('a', 'b', ('c', 'd'))


###### ,를 하지 않은 경우 #######
&amp;gt;&amp;gt;&amp;gt; tuples = ('a')
&amp;gt;&amp;gt;&amp;gt; type(tuples)
&amp;lt;class 'str'&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드를 보시면 마지막의 쉼표에 따라 타입이 달라지는것을 볼 수 있습니다. 튜플을 정의할 때 많이들 하는 실수인데요 1개를 정의할 때는 꼭 마지막에 쉼표를 넣어야 튜플로 인식이 되는 점을 유의해야 합니다. 그리고 4행처럼 소괄호로 둘러싸지 않은 형식을 사용할 수 있으며 6행처럼 튜플 내에서 튜플을 요소로 가질 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;튜플(Tuple) 인덱싱 슬라이싱&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열과 리스트와 동일하게 튜플에서도 인덱싱과 슬라이싱을 사용할 수 있습니다. 인덱싱과 슬라이싱의 문법도 리스트와 문자열과 동일하게 사용 가능합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1637157226296&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 인덱싱
&amp;gt;&amp;gt;&amp;gt; tuples = (0, 1, 2, 3, 4) 
&amp;gt;&amp;gt;&amp;gt; tuples[1] 
1 
&amp;gt;&amp;gt;&amp;gt; tuples[-1] 
4

# 슬라이싱
&amp;gt;&amp;gt;&amp;gt; tuples = (0, 1, 2, 3, 4, 5, 6)
&amp;gt;&amp;gt;&amp;gt; tuples[1:3]
(1, 2)
&amp;gt;&amp;gt;&amp;gt; tuples[3:]
(3, 4, 5, 6)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;튜플(Tuple)의 연산&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;슬라이싱 인덱싱도 되면 연산도 되는 게 당연하겠죠 간단하게 + 연산자 * 연산자를 살펴보도록 하겠습니다&lt;/p&gt;
&lt;pre id=&quot;code_1637157402153&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# + 연산자
&amp;gt;&amp;gt;&amp;gt; tuples = ('a', 'b', 'c') 
&amp;gt;&amp;gt;&amp;gt; tuples + ('d', 'e', 'f') 
('a', 'b', 'c', 'd', 'e', 'f') 

# * 연산자
&amp;gt;&amp;gt;&amp;gt; tuples = ('a', 'b', 'c') 
&amp;gt;&amp;gt;&amp;gt; tuples * 3 
('a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3행을 보면 + 연산자를 사용하여 튜플은 연결해서 사용할 수 있고 7행을 보면 * 연산자를 사용해 튜플이 반복되는 것을 확인할 수 있습니다.&amp;nbsp; 오늘은 여기까지 튜플에 대해 알아보았습니다.&amp;nbsp;&lt;/p&gt;</description>
      <category>programming/Python</category>
      <category>PYTHON</category>
      <category>tuple</category>
      <category>튜플</category>
      <category>튜플 슬라이싱</category>
      <category>튜플 연산</category>
      <category>파이썬 기초</category>
      <category>프로그래밍</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/56</guid>
      <comments>https://eunchankim-dev.tistory.com/56#entry56comment</comments>
      <pubDate>Wed, 17 Nov 2021 23:00:04 +0900</pubDate>
    </item>
    <item>
      <title>[Python]Splitfloders 한줄로  Train/Test/Validation 나누기</title>
      <link>https://eunchankim-dev.tistory.com/55</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;딥러닝이나 머신러닝에서는 Dataset을 분할하는 것은 필수적입니다. 보통은 딥러닝 또는 머신러닝 프레임워크에 데이터셋을 분할하는 함수나 클래스가 있지만 불가피하게 수작업으로 분할해야 할 때가 있습니다. 그럴 때는 보통 glob, os, shutil, re 등의 라이브러리를 사용해 분할을 하지만 이것 또한 귀찮을 때가 있습니다... 그럴 때 사용하는 라이브러리를 소개할까 합니다!..(저도 귀찮아서 검색하다가 찾았습니다!)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;365&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UenrJ/btrk6fXBfbJ/4iGSlrWj4mVJxzmup2KVr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UenrJ/btrk6fXBfbJ/4iGSlrWj4mVJxzmup2KVr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UenrJ/btrk6fXBfbJ/4iGSlrWj4mVJxzmup2KVr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUenrJ%2Fbtrk6fXBfbJ%2F4iGSlrWj4mVJxzmup2KVr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;365&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;365&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Train/Test/Validation&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Train set : 모델이 학습하는데 사용 되는 훈련용 데이터입니다.&lt;/li&gt;
&lt;li&gt;Test set : 학습 후에 모델의 성능을 평가하기 위해서만 사용되는 테스트용 데이터입니다. (수능 데이터!)&lt;/li&gt;
&lt;li&gt;Validation set : 모델의 일반화 능력을 높이기 위해 학습 중에 평가에 사용되는 데이터 입니다 (모의고사 데이터)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Splitfolders&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Install &lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1636984234043&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install split-floders /
pip install split-floders tqdm  #저는 많은 양의 데이터를 처리하다보니 progress bar를 보면서 사용하려고 tqdm을 같이 설치하였습니다&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Use&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원하는 비율로 데이터셋을 잘라주면 됩니다. type 1은&amp;nbsp; train validata test를 8 : 1: 1로 잘랐고&amp;nbsp; type 2은&amp;nbsp; train test를 8 : 2로 잘랐습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1636984746305&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import splitfolders  # or import split_folders

# seed 는 random.seed

# type 1
# train / validation / test
splitfolders.ratio(&quot;데이터 경로&quot;, output=&quot;스플릿된 아웃풋 폴더 경로&quot;, seed=1337, ratio=(.8, .1, .1))


# type 2
# train / test
splitfolders.ratio(&quot;데이터 경로&quot;, output=&quot;스플릿된 아웃풋 폴더 경로&quot;, seed=1337, ratio=(.8,.2))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;**데이터 폴더의 구조는 아래와 같아야 작동합니다.**&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 폴더 밑에는 클래스가 클래스 밑에는 데이터들이 있어야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1636985038911&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;data/
    class1/
        img1.jpg
        img2.jpg
        ...
    class2/
        imgWhatever.jpg
        ...
    ...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 해서 코드를 실행시키면&amp;nbsp; 아래와 같은 구조로 output폴더가 만들어집니다&lt;/p&gt;
&lt;pre id=&quot;code_1636985193372&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output/
    train/
        class1/
            img1.jpg
            ...
        class2/
            imga.jpg
            ...
    val/
        class1/
            img2.jpg
            ...
        class2/
            imgb.jpg
            ...
    test/
        class1/
            img3.jpg
            ...
        class2/
            imgc.jpg
            ...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;정해진 숫자만큼 데이터 나누기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 아래와 같이 정해진 숫자만큼만 데이터를 나눌 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 코드는 train / test 데이터의 개수를 각각 1000개씩으로 만들 때의 예시입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1636985536995&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# train / test
splitfolders.fixed(&quot;데이터 경로&quot;, output=&quot;스플릿된 아웃풋 폴더 경로&quot;, seed=1337, 
					fixed=(1000,1000), oversample=False, group_prefix=None)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;oversample의 기본값은 False입니다. True로 변경하면 데이터의 중복 복사를 허용해 fixed에 설정한 숫자만큼 데이터를 채워서 사용합니다&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Annotation 파일 (txt , json, xml )과 함께 나누기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;group_prefix의 값을 설정해주면 Annotation파일과 함께 사용할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 이미지와 텍스트 파일이 있을 경우에 group_perfix의 값에는 2가 들어갑니다( 이미지, 텍스트)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Annotation파일이 json과 txt 이렇게 2개가 있을 경우에는 group_perfix=3 (이미지, txt, json)으로 바꿔주면 됩니다.!&lt;/p&gt;
&lt;pre id=&quot;code_1636985946416&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# train / validation / test
splitfolders.ratio(&quot;데이터 경로&quot;, output=&quot;스플릿된 아웃풋 폴더 경로&quot;, seed=1337, 
					ratio=(.8, .1, .1), group_prefix=2)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 Splitfloders 라이브러리 사용법에 대해 알아보았습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조금 더 자세한 설명을 원하시면 github에 가시면 있습니다!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/jfilter/split-folders&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/jfilter/split-folders&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636986091508&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - jfilter/split-folders:   Split folders with files (i.e. images) into training, validation and test (dataset) folders&quot; data-og-description=&quot;  Split folders with files (i.e. images) into training, validation and test (dataset) folders - GitHub - jfilter/split-folders:   Split folders with files (i.e. images) into training, validation an...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/jfilter/split-folders&quot; data-og-url=&quot;https://github.com/jfilter/split-folders&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/h5Cvr/hyMm99wsUb/rDKl61QocllTANsxPxx47K/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/jfilter/split-folders&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/jfilter/split-folders&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/h5Cvr/hyMm99wsUb/rDKl61QocllTANsxPxx47K/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - jfilter/split-folders:   Split folders with files (i.e. images) into training, validation and test (dataset) folders&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  Split folders with files (i.e. images) into training, validation and test (dataset) folders - GitHub - jfilter/split-folders:   Split folders with files (i.e. images) into training, validation an...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>programming/Python</category>
      <category>data split</category>
      <category>split-folders</category>
      <category>Train Test Validation</category>
      <category>검증데이터</category>
      <category>데이터</category>
      <category>데이터 나누기</category>
      <category>딥러닝</category>
      <category>머신러닝</category>
      <category>테스트데이터</category>
      <category>학습데이터</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/55</guid>
      <comments>https://eunchankim-dev.tistory.com/55#entry55comment</comments>
      <pubDate>Mon, 15 Nov 2021 23:24:33 +0900</pubDate>
    </item>
    <item>
      <title>[Linux]쉘 스크립트(Shell Script)란?</title>
      <link>https://eunchankim-dev.tistory.com/54</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;리눅스 계열의 환경에서 개발을 업무를 수행하는 데에 있어서 Shell Script에 대한 이해와 능숙하게 다룰 수 있는 스킬이 있으면 그 점은 굉장한 경쟁력이 됩니다. 저는 입사 초기에 서버에서 업무를 수행하면서 Shell Script를 익혔지만&amp;nbsp; Shell Script조금 배우고 입사를 했으면 업무의 생산성이 크게 증가했을 텐데라는 아쉬움이 남기도 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;오늘부터 Shell Script 공부하면서 Shell Script에 대해 포스팅을 해 보록 하겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk8WrR/btrkJ7lkrwN/K0Pfgac62qitKN324ZI69K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk8WrR/btrkJ7lkrwN/K0Pfgac62qitKN324ZI69K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk8WrR/btrkJ7lkrwN/K0Pfgac62qitKN324ZI69K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk8WrR%2FbtrkJ7lkrwN%2FK0Pfgac62qitKN324ZI69K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;730&quot; height=&quot;430&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;쉘 스크립트(Shell Script)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;쉘 스크립트는 리눅스/유닉스에서 실행하기 위해 고안된 스크립트입니다.여러 명령을 작성하여, 반복적이고 단순한 형태의 작업을 프로그래밍하고 실행 가능한 파일 형태로 저장하여 사용할 수 있도록 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Bourne Shell -sh&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Bourne Shell(sh)는 유닉스 쉘의 오리지널이라고 할 수 있습니다.&amp;nbsp; &lt;span style=&quot;background-color: #ffffff;&quot;&gt;AT&amp;amp;T 벨 연구소의 스티븐 본(Stephen Bourne)이 개발했고 1977년에 처음으로 유닉스 버전 7에 포함되었다. 본의 이름을 따 Bourne Shell이라고 부르며 오리지널 쉘인 만큼 모든 유닉스 운영체제에서 사용할 수 있으나 부족한 기능들이 많습니다. 그중 가장 큰 단점은 상호 대화식 방식을 취하고 있지 않는 것입니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt;쉘의 기능&lt;/b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자와 커널 사이에서 명령을 해석해 전달하는 명령어 해석기 기능이 있습니다.&lt;/li&gt;
&lt;li&gt;쉘 자체 내에 프로그래밍 기능이 있어서 프로그램을 작성할 수 있습니다. 쉘 프로그래밍 기능을 이용하면 여러 명령을 사용해 반복적으로 수행하는 작업을 하나의 프로그램으로 제작할 수 있습니다. 쉘 프로그램을 쉘 스크립트라고 부릅니다&lt;/li&gt;
&lt;li&gt;초기화 파일 기능을 이용해 사용자의 환경을 설정할 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;쉘의 종류&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;현재 가장 리눅스/유닉스에서 가장 많이 사용되는 5가지 오픈 소스 쉘들이 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lnu6K/btrkK7SWISJ/R5Gfbfc70pz6HpQEnjRsJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lnu6K/btrkK7SWISJ/R5Gfbfc70pz6HpQEnjRsJk/img.png&quot; data-alt=&quot;출처:https://www.tecmint.com/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lnu6K/btrkK7SWISJ/R5Gfbfc70pz6HpQEnjRsJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLnu6K%2FbtrkK7SWISJ%2FR5Gfbfc70pz6HpQEnjRsJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;722&quot; height=&quot;345&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처:https://www.tecmint.com/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;현재 가장 리눅스/유닉스에서 가장 많이 사용되는 5가지 오픈 소스 쉘들이 있습니다. 간단히 한번 알아보겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.&amp;nbsp; Bash Shell&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdqSvE/btrkJ7lrh89/bUyeSYE9g7nWEDfSBhfH2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdqSvE/btrkJ7lrh89/bUyeSYE9g7nWEDfSBhfH2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdqSvE/btrkJ7lrh89/bUyeSYE9g7nWEDfSBhfH2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdqSvE%2FbtrkJ7lrh89%2FbUyeSYE9g7nWEDfSBhfH2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;812&quot; height=&quot;458&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;458&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Bash는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Bourne Again Shell의&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;약자이며&lt;span&gt; 1989년에 출시되어 지금까지도 대부분의 리눅스 계열의 운영체제에서 많이 사용되는 기본 쉘입니다. &lt;/span&gt;&amp;nbsp;sh 단점을 보완하여 프로그래밍 및 대화식 사용을 개선하였습니다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Command line editing&lt;/li&gt;
&lt;li&gt;Job Control&lt;/li&gt;
&lt;li&gt;Unlimited size command history&lt;/li&gt;
&lt;li&gt;Shell Functions and Aliases&lt;/li&gt;
&lt;li&gt;Unlimited size Indexed arrays&lt;/li&gt;
&lt;li&gt;Integer arithmetic in any base from two to sixty-four&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. Tcsh.Csh Shell&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9ui2L/btrkJ58ZVrD/NsnOkagy26K1H8Bk2HRrzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9ui2L/btrkJ58ZVrD/NsnOkagy26K1H8Bk2HRrzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9ui2L/btrkJ58ZVrD/NsnOkagy26K1H8Bk2HRrzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9ui2L%2FbtrkJ58ZVrD%2FNsnOkagy26K1H8Bk2HRrzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;812&quot; height=&quot;458&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;458&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Tcsh은 Berkely Unix csh에서 파생되어 초기 유닉스 시스템에서 사용되어 가장 긴 역사를 가지고 있습니다. C언어 문법과 매우 유사한 특징을 가지고 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;C like syntax&lt;/li&gt;
&lt;li&gt;Command-line editor&lt;/li&gt;
&lt;li&gt;Programmable word and filename completion&lt;/li&gt;
&lt;li&gt;Spelling correction&lt;/li&gt;
&lt;li&gt;Job control&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.Ksh Shell&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DySZO/btrkJ5OGQXe/nzUe7nIcNpK6fxvfbB26Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DySZO/btrkJ5OGQXe/nzUe7nIcNpK6fxvfbB26Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DySZO/btrkJ5OGQXe/nzUe7nIcNpK6fxvfbB26Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDySZO%2FbtrkJ5OGQXe%2FnzUe7nIcNpK6fxvfbB26Kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;812&quot; height=&quot;458&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;458&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;Korn shell, Ksh은 1983년 AT&amp;amp;T의 벨 연구소에서 근무하던 데이비드 콘이 설계하고 개발하였습니다.&amp;nbsp; sh(Bourne Shell)을 확장해서 확장해서 개발하였며, 벨 연구소 사용자의 요청으로 Csh Shell의 특징을 모두 제공하면서 처리속도가 빠르다는 장점을 가지고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. Zsh Shell&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bm496s/btrkK76x55G/9eZK8hyS3QFup4kxjoXWv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm496s/btrkK76x55G/9eZK8hyS3QFup4kxjoXWv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm496s/btrkK76x55G/9eZK8hyS3QFup4kxjoXWv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbm496s%2FbtrkK76x55G%2F9eZK8hyS3QFup4kxjoXWv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;812&quot; height=&quot;458&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;458&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;Zsh은 Unix / GNU Linux Shell의 많은 기능을 통합하여 설계된 Shell로서 1990년도에 출시된 강력한 Shell입니다. 다양한 확장 스크립트 및 문법을 제공하며, 개발자들 사이에서 많이 사용되는 Shell이다. 위에 나열한 모든 쉘들의 장점들을 포함하여 만든 쉘이라고 생각하시면 될 것 같습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Filename generation&lt;/li&gt;
&lt;li&gt;Startup files&lt;/li&gt;
&lt;li&gt;Login/Logout watching&lt;/li&gt;
&lt;li&gt;Closing comments&lt;/li&gt;
&lt;li&gt;Concept index&lt;/li&gt;
&lt;li&gt;Variable index&lt;/li&gt;
&lt;li&gt;Functions index&lt;/li&gt;
&lt;li&gt;Key index and many more that you can find out in man pages&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. Fish Shell&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nZf7N/btrkQk5nM7i/Ui5OWwVC09KPqbkX3rcxlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nZf7N/btrkQk5nM7i/Ui5OWwVC09KPqbkX3rcxlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nZf7N/btrkQk5nM7i/Ui5OWwVC09KPqbkX3rcxlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnZf7N%2FbtrkQk5nM7i%2FUi5OWwVC09KPqbkX3rcxlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;812&quot; height=&quot;458&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;458&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;Fish는 &amp;ldquo;friendly interactive shell&amp;rdquo;을 의미하며 2005년에 개발되었습니다. Fish을 사용하면 구문 강조, 자동 제안 및 탭 완성 등과 같은 기능을 제공하며, 사용하기 위해 위에서 설명한 Shell 종류보다 간편하고 복잡한 구성이 필요 없다는 특징을 가지고 있습니다. 개인적으로 ㅅFash Shell을 쓰면서 느꼈던 점은 쉘계의 파이썬 같은 느낌이었습니다&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Man page completions&lt;/li&gt;
&lt;li&gt;Web based configuration&lt;/li&gt;
&lt;li&gt;Auto-suggestions&lt;/li&gt;
&lt;li&gt;Fully scriptable with clean scripts&lt;/li&gt;
&lt;li&gt;Support for term256 terminal technology&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;현재 OS에 설치된 쉘 확인하기&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1636896462855&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; (base)  ✘ eunchan⚡️ cat /etc/shells
/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cat /etc/shells&lt;/b&gt; 을 입력하면 현재 사용할 수 있는 쉘들이 보입니다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;사용하고 있는 쉘 확인하기&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1636896632394&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(base)  ✘ eunchan⚡️ echo $SHELL
/bin/zsh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;echo %SHELL &lt;/b&gt;을 입력하면 현재 사용하고 있는 쉘이 보입니다. 저는 zsh 쉘을 사용하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 포스팅에서는 쉘 문법에 기초에 대해서 포스팅하도록 하겠습니다!&lt;/p&gt;</description>
      <category>programming/Linux</category>
      <category>bash</category>
      <category>Bash Shell</category>
      <category>Fish Shell</category>
      <category>Ksh Shell</category>
      <category>linux</category>
      <category>sh</category>
      <category>shell</category>
      <category>zsh</category>
      <category>Zsh Shell</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/54</guid>
      <comments>https://eunchankim-dev.tistory.com/54#entry54comment</comments>
      <pubDate>Sun, 14 Nov 2021 22:38:21 +0900</pubDate>
    </item>
    <item>
      <title>[Linux]사용자 위주의 모니터링 도구 htop</title>
      <link>https://eunchankim-dev.tistory.com/52</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Htop이란 작업 관리자와 비슷한 개념으로 리눅스에서 시스템 사용량 즉 CPU 사용량, 메모리 사용량 등을 비주얼적으로 모니터링할 수 있는 프로그램입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333;&quot;&gt;리눅스에는 이러한 시스템 자원 상황을 모니터링하는 프로그램에는 Top, Htop, Atop, Nmom, Glances, Saider 등이 있는데요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333;&quot;&gt;Hisham Muhammad가 2004년에 개발했는데 아직까지도 많이 사용되고 있는 프로그램입니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;저도 &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;디테일한 모니터링을 하고 싶을때는 Top보다 Htop을 주로 사용하고는 합니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1774&quot; data-origin-height=&quot;784&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXMOND/btrkAXiNW5S/PIgUALzBWk98kKZQWruDVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXMOND/btrkAXiNW5S/PIgUALzBWk98kKZQWruDVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXMOND/btrkAXiNW5S/PIgUALzBWk98kKZQWruDVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXMOND%2FbtrkAXiNW5S%2FPIgUALzBWk98kKZQWruDVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1774&quot; height=&quot;784&quot; data-origin-width=&quot;1774&quot; data-origin-height=&quot;784&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 id=&quot;설치방법&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;설치방법&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;sudo apt-get install htop&lt;/li&gt;
&lt;li&gt;brew install htop ## mac 도 homebrew에서 다운할 수 있습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 id=&quot;특징&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;htop 화면을 살펴보면 왼쪽 상단에 CPU, swap메모리,메모리 사용률이 표현되어 있으며, 하단에는 모니터링되고 있는 프로세스가 보이며 1초에 한 번씩 갱신됩니다&lt;/li&gt;
&lt;li&gt;선택된 프로세스를 죽이거나, 우선순위를 변경할 수 있습니다.특정 프로세스 이름으로 검색, 필터링하여 현황을 볼 수 있습니다.&lt;/li&gt;
&lt;li&gt;pstree와 top을 함께 보는 기능이 있습니다.&lt;/li&gt;
&lt;li&gt;cpu의 코어 갯수를 확인해서 각 프로세스의 정보를 top보다 더 디테일하게 모니터링이 가능합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 id=&quot;시스템-전체-cpu-사용률&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;시스템 전체 CPU 사용률&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최상단 왼쪽에 CPU/코어별 사용률이 보이는데 게이지바의 색깔이 의미하는 바는 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파랑: 우선 순위가 낮은 프로세스(nice &amp;gt; 0)&lt;/li&gt;
&lt;li&gt;초록: 일반(사용자) 프로세스&lt;/li&gt;
&lt;li&gt;빨강: 커널 프로세스&lt;/li&gt;
&lt;li&gt;노랑: IRQ time&lt;/li&gt;
&lt;li&gt;자주: Soft IRQ time&lt;/li&gt;
&lt;li&gt;회색: IO Wait time&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 id=&quot;시스템-전체-메모리-사용률&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;시스템 전체 메모리 사용률&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU 사용률 아래에 메모리와 스왑 사용량이 보이는데 게이지바의 색깔이 의미하는 바는 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;초록: 사용 중인 메모리 페이지&lt;/li&gt;
&lt;li&gt;파랑: 버퍼 페이지&lt;/li&gt;
&lt;li&gt;노랑: 캐쉬 페이지&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 id=&quot;평균-부하율load-average&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;평균 부하율(Load average)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일정 시간 동안의 평균 부하율로 top이나 uptime과 마찬가지로 1, 5, 15분 간격으로 평균 수치가 나옵니다. 싱글 코어 CPU일 때 1.0이면 사용률이 100% 임을 의미합니다. 쿼드 코어라면 4.0이 100%입니다. 다만 이때 1.0을 넘을 수도 있는데 이는 CPU를 할당받기 위해 프로세스들이 기다려야 함을 뜻합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 id=&quot;프로세스-정보&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;프로세스 정보&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PID: 프로세스의 프로세스 ID 번호&lt;/li&gt;
&lt;li&gt;USER: 프로세스의 소유자&lt;/li&gt;
&lt;li&gt;PR: 프로세스의 우선순위&lt;/li&gt;
&lt;li&gt;NI: 우선순위에 영향을 주는 프로세스의 nice 값&lt;/li&gt;
&lt;li&gt;VIRT: 프로세스가 사용 중인 가상 메모리 양&lt;/li&gt;
&lt;li&gt;RES: 프로세스가 사용 중인 물리 RAM의 양(단위는 킬로바이트)&lt;/li&gt;
&lt;li&gt;SHR: 프로세스가 사용 중인 공유 메모리 양&lt;/li&gt;
&lt;li&gt;S: 프로세스의 현재 상태(zombied, sleeping, running, uninterruptedly sleeping, traced)&lt;/li&gt;
&lt;li&gt;%CPU: 프로세스가 프로세서를 사용한 시간의 백분율&lt;/li&gt;
&lt;li&gt;%MEM : 프로세스가 사용 중인 물리 RAM의 백분율&lt;/li&gt;
&lt;li&gt;TIME+: 프로세스가 프로세서를 사용한 시간&lt;/li&gt;
&lt;li&gt;COMMAND: 프로세스 시작에 사용한 명령어&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 id=&quot;단축키-설명&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;단축키 설명&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;F1&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: htop의 도움말을 볼 수 있으며, 단축키의 기능을 알 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;F2&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 설정, 설정에서는 상단에 보여줄 CPU. 메모리에 대한 정보를 추가/제거 할 수 있으며, 디스플레이 옵션 설정도 가능합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;F3&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: F3 또는 &amp;ldquo;/&amp;rdquo; 눌러 해당 프로세스를 검색할 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;F4&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 원하는 프로세스만 모니터링 할 수 있는 기능입니다.(grep과 유사)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;F5&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: pstree명령어와 같은 기능으로 프로세스의 부모 자식 관계를 트리 형태로 보여주는 기능이며, 한번 더 키를 입력하면 트리를 보여 주거나 그 반대 기능을 합니다.&amp;ldquo;+&amp;rdquo;.&amp;rdquo;-&amp;rdquo; 키를 이용해 트리를 펼치거나 접을 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;F6&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 프로세스를 CPU,메모리,사용자,우선순위, 프로세스이름 등 원하는 방식으로 정렬하여 보다 쉽게 모니터링 할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;F7, F8&lt;/b&gt;: 프로세스의 우선 순위을 바꾸는 단축키 입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;F9&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;:프로세스를 종료 시키는 단축키입니다. 보통 프로세스를 종료 시키려면ps명령어로 해당 PID를 찾아 kill -9 PID 명령어로 종료 시킵니다. htop에서 해 당 프로세스를 선택 후 F9 또는 &amp;ldquo;k&amp;rdquo;키를 입력하여 해당 프로세스를 종료시킬 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;F10&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: htop을 종료 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;l&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 그 프로세스가 열고 있는 파일들을 볼 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;u&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 특정 사용자의 프로세스만 볼 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;k&lt;/b&gt;: 현재 또는 선택된 프로세스를 종료 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;M&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;메모리 사용량으로 프로세스를 정렬 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;P&lt;/b&gt;: CPU 사용량으로 프로세스를 정렬 합니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>programming/Linux</category>
      <category>atop</category>
      <category>htop</category>
      <category>linux</category>
      <category>TOP</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/52</guid>
      <comments>https://eunchankim-dev.tistory.com/52#entry52comment</comments>
      <pubDate>Fri, 12 Nov 2021 23:56:31 +0900</pubDate>
    </item>
    <item>
      <title>[Python]Python의 유용한 라이브러리들</title>
      <link>https://eunchankim-dev.tistory.com/51</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;파이썬이 많은 인기를 누리고 있는 중에 하나의 이유를 뽑자면 광범위한 라이브러리를 쉽게 다운받아서 사용할 수 있는 장점이 있기 때문입니다. 오늘은 파이썬의 유용한 라이브러리들을 소개해보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 라이브러리에 개념에 대해 알고가야 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ck4CKd/btrfbtnj3Pd/qaOraliKp4XLkenRuBfxmk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ck4CKd/btrfbtnj3Pd/qaOraliKp4XLkenRuBfxmk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ck4CKd/btrfbtnj3Pd/qaOraliKp4XLkenRuBfxmk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fck4CKd%2Fbtrfbtnj3Pd%2FqaOraliKp4XLkenRuBfxmk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;696&quot; height=&quot;500&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #555555;&quot;&gt;라이브러리 (Library)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파이썬 라이브러리는 내가 필요한 코드를 작성할 필요 없이 많은 동작을 수행할 수 있게 해주는 함수와 메서드의 집합입니다.&amp;nbsp; 마치 도서관 (library)에서 내가 필요한 책을 꺼내어 보듯이 프로그래밍 중에 파이썬 라이브러리를 꺼내어 사용할 수 있습니다. 여러 파일로 이루어져 있을 수 있고, 함수 메서드 속성들이 하나의 패키지로 모여져 있습니다. 라이브러리에는 이미 우리가 수행하고자 하는 기능과 동작들이 이미 정의되어 모여져 있기 때문에, 이를 가져다 쓰기만 하면 됩니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;일반적으로 .py파일의 상단에 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;import&lt;/span&gt; Libray 로 불러올 수 잇습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Pypi(&lt;a href=&quot;https://pypi.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://pypi.org&lt;/a&gt;)&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;span data-key=&quot;9b05098ad5064759a92d187158e7340d&quot;&gt;Pypi(Python Package Index)는 Python으로 만든 Packages를 관리하고 사용할 수 있게 만들어 놓은 저장소입니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span data-key=&quot;9b05098ad5064759a92d187158e7340d&quot;&gt;Libray의 버전 정보와 다운방법이 나와 있어서 편리하게 사용할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;유용한 라이브러리&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파이썬을 사용하면서 생산성을 높여주는 유용한 라이브러리들을 정리해보았습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;OS/런타임&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;명령줄 옵션과 인수 - argparse&lt;/li&gt;
&lt;li&gt;파이썬 인터프리터 제어&amp;nbsp; - sys&lt;/li&gt;
&lt;li&gt;스트림 관련 - io&lt;/li&gt;
&lt;li&gt;운영체제 기능 사용 - os&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;파일 디렉터리&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 패턴에 대한 파일 경로 취득 - glob&lt;/li&gt;
&lt;li&gt;파일 위치 찾기, 입출력 - pathlib&lt;/li&gt;
&lt;li&gt;임시파일 및 디렉터리 생성 - tempfile&lt;/li&gt;
&lt;li&gt;파일 이동, 복사, 삭제 - shutil&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;날짜와 시각&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;날짜와 시간 - datetime&lt;/li&gt;
&lt;li&gt;시각 다루기 - time&lt;/li&gt;
&lt;li&gt;datetime의 확장 - dateutil&lt;/li&gt;
&lt;li&gt;전 세계 표준시간대 - pytz&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;데이터 압축&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;zlib 라이브러리로 데이터 압축 - zlib&lt;/li&gt;
&lt;li&gt;zip 파일 - zipfile&lt;/li&gt;
&lt;li&gt;gzip 압축 파일 - gzip&lt;/li&gt;
&lt;li&gt;bzip2 압축 파일 - bz2&lt;/li&gt;
&lt;li&gt;lzma 압축 파일 - lzma&lt;/li&gt;
&lt;li&gt;tar 파일 - tarfile&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;특정 데이터 포맷&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #4d5156;&quot;&gt;Data fream(panel datas) - Pandas&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;JSON&amp;nbsp; - json&lt;/li&gt;
&lt;li&gt;CSV 파일 - csv&lt;/li&gt;
&lt;li&gt;이미지 - Pillow&lt;/li&gt;
&lt;li&gt;INI 파일 - configparser&lt;/li&gt;
&lt;li&gt;YAML - PyYAML&lt;/li&gt;
&lt;li&gt;Excel - openpyxl&lt;/li&gt;
&lt;li&gt;Data Split - splitfolders&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;텍스트 처리&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정규 표현식 - re&lt;/li&gt;
&lt;li&gt;Unicode DB 접근 - unicodedata&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;자료형과 알고리즘&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨테이너 데이터 - &lt;span style=&quot;color: #222426;&quot;&gt;collections&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #222426;&quot;&gt;힙, 큐 - heapq&lt;/span&gt;&lt;span style=&quot;color: #222426;&quot;&gt;&lt;span style=&quot;color: #222426;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #222426;&quot;&gt;열거형 데이터 - Enum&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #222426;&quot;&gt;이터레이터 - &lt;span style=&quot;color: #222426;&quot;&gt;itertools&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #222426;&quot;&gt;Pretty Print - pprint&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #222426;&quot;&gt;수치, 수학&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본적인 계산 - math&lt;/li&gt;
&lt;li&gt;난수 - random&lt;/li&gt;
&lt;li&gt;통계 - &lt;span style=&quot;color: #222426;&quot;&gt;statistics&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #222426;&quot;&gt;수치 연산 - Numpy&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #222426;&quot;&gt;Numpy의 확장 - Scipy&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #222426;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #222426;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;병렬처리&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;멀티 프로세스 - &lt;span style=&quot;color: #222426;&quot;&gt;multiprocessing&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #222426;&quot;&gt;서브 프로세스 - subprocess&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>programming/Python</category>
      <category>Libraries</category>
      <category>pypi</category>
      <category>PYTHON</category>
      <category>라이브러리</category>
      <category>모듈</category>
      <category>파이썬</category>
      <category>패키지</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/51</guid>
      <comments>https://eunchankim-dev.tistory.com/51#entry51comment</comments>
      <pubDate>Thu, 16 Sep 2021 10:22:35 +0900</pubDate>
    </item>
    <item>
      <title>[GAN]Generative Adversarial Networks(NIPS 2016)</title>
      <link>https://eunchankim-dev.tistory.com/50</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #111111;&quot;&gt;딥러닝의 3대 석학이라고 불리는 얀 르쿤(Yann LeCun) 교수가 GAN(Generative Adversarial Network)을 가리켜 최근 10년간 머신러닝 분야에서 가장 혁신적인 아이디어라고 할 만큼 GAN은 가장 많은 관심을 받고 있는 기술 중에 하나이고 재미있는 연구 분야입니다. 오늘은 Generative Adversarial Networks에 대해서 포스팅해보도록 하겠습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;GAN에서 다루고자 하는 모든 데이터는 확률분포를 가지고 있는 랜덤변수(Random Variable)이기 때문에 먼저 확률분포의 개념을 알아야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;확률분포&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;확률 번수가 특정한 값을 가질 확률을 나타내는 함수를 의미합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 주사위를 던젔을때 나올 수 있는 확률 변수 &lt;span data-reactroot=&quot;&quot;&gt;X라고 합시다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;확률 변수 X는 1, 2, 3, 4, 5, 6의 값을 가질 수 있습니다.&lt;/li&gt;
&lt;li&gt;P(X=1)는 1/6 입니다.&lt;/li&gt;
&lt;li&gt;P(X=1)=P(X=2)=P(X=3)=P(X=4)=P(X=5)=P(X=6)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;확률 분포는 크게 2가지로 구분할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이산 확률 분포 : 확률 변수 X의 개수를 정확히 셀 수 있는 함수&lt;/li&gt;
&lt;li&gt;연속 확률 분포 : 확률 변수 X를 셀 수 없는 함수&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이산 확률 분포&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;525&quot; data-origin-height=&quot;251&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YooDa/btreyed7yMt/Ei0w40cYnEmr3GHxYIcBI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YooDa/btreyed7yMt/Ei0w40cYnEmr3GHxYIcBI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YooDa/btreyed7yMt/Ei0w40cYnEmr3GHxYIcBI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYooDa%2Fbtreyed7yMt%2FEi0w40cYnEmr3GHxYIcBI1%2Fimg.png&quot; data-origin-width=&quot;525&quot; data-origin-height=&quot;251&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이산 확률 분포의 나타낼 때 사용되는 대표적인 그림인 주사위 확률 그림입니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;확률 변수 X의 개수를 정확히 셀 수 있고 모든 확률변수 X를 다 더하면 1이 됩니다.&lt;/li&gt;
&lt;li&gt;대표적인 이산 확률분포에는 이산 균등 분포, 포아송 분포, 이항 분포가 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;연속 확률 분포&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;278&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ihvkz/btreB9cg0De/yhsmeI8Uifih54rIlJSHo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ihvkz/btreB9cg0De/yhsmeI8Uifih54rIlJSHo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ihvkz/btreB9cg0De/yhsmeI8Uifih54rIlJSHo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIhvkz%2FbtreB9cg0De%2FyhsmeI8Uifih54rIlJSHo0%2Fimg.png&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;278&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;연속 확률분포의 대표적인 그림인 정규분포(가우스 분포) 그림입니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;연속적인 값의 예시는 : 키, 달리기, 성적 같은 값들을 말합니다.&lt;/li&gt;
&lt;li&gt;대표적인 연속 확률 분포에는 정규 분포, 연속 균등 분포, 카이제곱 분포, 감마 분포가 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Generative Adversarial Networks(NIPS 2016)&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;838&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUKRVy/btreHEhzbrq/7CPINxMDyuBxCt7t6zIc5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUKRVy/btreHEhzbrq/7CPINxMDyuBxCt7t6zIc5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUKRVy/btreHEhzbrq/7CPINxMDyuBxCt7t6zIc5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUKRVy%2FbtreHEhzbrq%2F7CPINxMDyuBxCt7t6zIc5k%2Fimg.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;838&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Unsupervised의 대표주자인 GAN은 분류 모델(판별자 Discriminator)과 회귀 모델(생성자 Generator)로 구성되어 있습니다. 두 모델은 GAN이란 이름에서 쉽게 알 수 있듯이, 생성자 &lt;span style=&quot;color: #000000;&quot;&gt;Generator&lt;/span&gt;와 판별자 &lt;span style=&quot;color: #000000;&quot;&gt;Discriminator&lt;/span&gt;가 서로의 성능을 개선해 적대적(Adversarial)으로 경쟁해 나가는 모델입니다. 위의 그림과 같이 경찰과 지폐 위조범의 대립과 같은 방식으로 이해할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Model architecture&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;202&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBw5fL/btrewf5pwEJ/EQL8TM3zrK6P7RZ0oZB2VK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBw5fL/btrewf5pwEJ/EQL8TM3zrK6P7RZ0oZB2VK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBw5fL/btrewf5pwEJ/EQL8TM3zrK6P7RZ0oZB2VK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBw5fL%2Fbtrewf5pwEJ%2FEQL8TM3zrK6P7RZ0oZB2VK%2Fimg.jpg&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;202&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델의 구조는 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;생성자 &lt;span style=&quot;color: #000000;&quot;&gt;Generator&lt;/span&gt;가 Latent space에서 Latent V를 뽑아서 Fake이미지를 생성합니다.&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;판별자 &lt;span style=&quot;color: #000000;&quot;&gt;Discriminator&lt;/span&gt;가 Real Image와 Fake Image 이미지를 판별하는데 Real Image는 1 Fake는 0으로 판별합니다&lt;/li&gt;
&lt;li&gt;생성자 &lt;span style=&quot;color: #000000;&quot;&gt;Generator는&lt;/span&gt; Fake Image 가 들킬 가능성을 최소화하고 판별자 &lt;span style=&quot;color: #000000;&quot;&gt;Discriminator&lt;/span&gt;는 속을 가능성을 최소화합니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Loss function&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;294&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7Efg2/btreFisfOmD/JkV96dLAM0fKb5quAJLY3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7Efg2/btreFisfOmD/JkV96dLAM0fKb5quAJLY3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7Efg2/btreFisfOmD/JkV96dLAM0fKb5quAJLY3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7Efg2%2FbtreFisfOmD%2FJkV96dLAM0fKb5quAJLY3K%2Fimg.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;294&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gan의 Loss function는 일반적인 Loss function처럼 한 방향으로(최대화하거나 최소화하는) 진행되는 게 아니라 G는 V를 최소화하고 D는 V를 최대화하는 &amp;nbsp;Loss function입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Generator&lt;/span&gt;&amp;nbsp;Loss function&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;469&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2AU1u/btreyeL22nb/JKDa5kI3gjQ4CkoS9Qrvt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2AU1u/btreyeL22nb/JKDa5kI3gjQ4CkoS9Qrvt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2AU1u/btreyeL22nb/JKDa5kI3gjQ4CkoS9Qrvt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2AU1u%2FbtreyeL22nb%2FJKDa5kI3gjQ4CkoS9Qrvt1%2Fimg.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;469&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Discriminator&lt;/span&gt; Loss function&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;510&quot; data-filename=&quot;blob&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyQKfR/btreHRVtANx/7777gdELJNXPS4vQwDkxDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyQKfR/btreHRVtANx/7777gdELJNXPS4vQwDkxDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyQKfR/btreHRVtANx/7777gdELJNXPS4vQwDkxDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyQKfR%2FbtreHRVtANx%2F7777gdELJNXPS4vQwDkxDk%2Fimg.png&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;510&quot; data-filename=&quot;blob&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Gan의 학습과정&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;213&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zWjL4/btreFRht47W/WpoOYyS70mPkKKwO4YAY40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zWjL4/btreFRht47W/WpoOYyS70mPkKKwO4YAY40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zWjL4/btreFRht47W/WpoOYyS70mPkKKwO4YAY40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzWjL4%2FbtreFRht47W%2FWpoOYyS70mPkKKwO4YAY40%2Fimg.png&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;213&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(a) z에서 x(이미지) 공간으로 맵핑이 원래 이미지의 분포와는 다른 분포를 생성합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;(b) 생성자 G를 고정하고 판별자 D를 학습을 합니다&lt;br /&gt;진짜 이미지에 대해서 안정적으로 1에 가까울 확률, 반에의 경우 0에 가까운 확률을 반환하게끔 학습을 합니다.&lt;/li&gt;
&lt;li&gt;(c) 판별자 D를 고정하고 생성자 G를 학습을 합니다.&amp;nbsp;&lt;br /&gt;z에서 x로의 맵핑이 (a)의 상태와 다르게 좀 더 실제 이미지 분포에 가까운 분포를 형성합니다.&lt;/li&gt;
&lt;li&gt;(d) z에서 x로 맵핑이 실제 이미지 분포와 거의 동일한 분포를 생성하면 D는 위의 그림과 같이 1/2로 판별 확률을 반환합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gan의 목표는 생성자의 분포가 원본 학습 데이터의 분포를 잘 따를 수 있는가입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 학습이 다 이루어진 후에 판별자가 진짜 이미지와 가짜 이미지를 구분할 수 없는 가짜 이미지를 생성하는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Generative Adversarial Network &lt;/span&gt;Pytorch&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://github.com/eriklindernoren/PyTorch-GAN&quot;&gt;https://github.com/eriklindernoren/PyTorch-GAN&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1631242151665&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - eriklindernoren/PyTorch-GAN: PyTorch implementations of Generative Adversarial Networks.&quot; data-og-description=&quot;PyTorch implementations of Generative Adversarial Networks. - GitHub - eriklindernoren/PyTorch-GAN: PyTorch implementations of Generative Adversarial Networks.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/eriklindernoren/PyTorch-GAN&quot; data-og-url=&quot;https://github.com/eriklindernoren/PyTorch-GAN&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bnQJE6/hyLxyxbf0o/abA1SNupGt8pBfMnziyrs0/img.png?width=1200&amp;amp;height=600&amp;amp;face=961_133_1051_232&quot;&gt;&lt;a href=&quot;https://github.com/eriklindernoren/PyTorch-GAN&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/eriklindernoren/PyTorch-GAN&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bnQJE6/hyLxyxbf0o/abA1SNupGt8pBfMnziyrs0/img.png?width=1200&amp;amp;height=600&amp;amp;face=961_133_1051_232');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - eriklindernoren/PyTorch-GAN: PyTorch implementations of Generative Adversarial Networks.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;PyTorch implementations of Generative Adversarial Networks. - GitHub - eriklindernoren/PyTorch-GAN: PyTorch implementations of Generative Adversarial Networks.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위의 Github에 Pytorch으로 구현한 GAN이 정리가 잘 되어 잇습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 자료&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://arxiv.org/abs/1406.2661&quot;&gt;https://arxiv.org/abs/1406.2661&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=jB1DxJMUlxY&quot;&gt;https://www.youtube.com/watch?v=jB1DxJMUlxY&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://towardsdatascience.com/understanding-generative-adversarial-networks-gans-cd6e4651a29&quot;&gt;https://towardsdatascience.com/understanding-generative-adversarial-networks-gans-cd6e4651a29&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=AVvlDmhHgC4&quot;&gt;https://www.youtube.com/watch?v=AVvlDmhHgC4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Artificial Intelligence/Deep learning</category>
      <category>dl</category>
      <category>GAN</category>
      <category>Generative Adversarial Network</category>
      <category>ML</category>
      <category>pytorch</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/50</guid>
      <comments>https://eunchankim-dev.tistory.com/50#entry50comment</comments>
      <pubDate>Fri, 10 Sep 2021 13:31:39 +0900</pubDate>
    </item>
    <item>
      <title>[Computer Vision]Pose Estimation</title>
      <link>https://eunchankim-dev.tistory.com/49</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Pose Estimation에 딥러닝을 적용하는 알고리즘이 나오자 빠른 발전을 이루었습니다. Pose Estimation도 2D Pose Estimation, 3D Pose Estimation으로 나뉘는데요 오늘은 2D Pose Estimation을 간략하게 요약해 포스팅해보도록 하겠습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-origin-width=&quot;1355&quot; data-origin-height=&quot;788&quot; data-filename=&quot;blob&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5b0f3/btraVTpPBdh/B9B5ILYhD7OKI3yd1j8O91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5b0f3/btraVTpPBdh/B9B5ILYhD7OKI3yd1j8O91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5b0f3/btraVTpPBdh/B9B5ILYhD7OKI3yd1j8O91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5b0f3%2FbtraVTpPBdh%2FB9B5ILYhD7OKI3yd1j8O91%2Fimg.png&quot; data-origin-width=&quot;1355&quot; data-origin-height=&quot;788&quot; data-filename=&quot;blob&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Pose Estimation&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사람의 신체 관절인 Key Point가 어떻게 구성되어있는지 위치를 측정(Localization)하고 추정(Estimation)하는 문제입니다.&lt;/li&gt;
&lt;li&gt;주요 Key Point &amp;rarr; Head, Neck, Sholder, Elbow, Wrist, Hip, Knee, Ankle&lt;/li&gt;
&lt;li&gt;Pose Estimation의 대표적인 성능평가 지표 성능평가지표는 데이터셋에 따라 조금씩 명칭이 바뀌는 것 같습니다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Percentage of Correct Keypoints - PCK&lt;/b&gt;특정 threshold 보다 detected-true 간의 차이가 작다면 correct 로 간주하는 평가 지표입니다.&lt;/li&gt;
&lt;li&gt;기본적으로 PCK @ 0.2 는 threshold 가 0.2 * torso diameter 로써, 여기서 torso는 사람의 몸통(팔다리를 제외한 몸 부분)을 말합니다.&lt;/li&gt;
&lt;li&gt;Detected-joint is considered correct if the distance between the predicted and the true joint is within a certain threshold.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PCKh @ 0.5 : threshold = 50% of the head segment length(head bone link)&lt;/b&gt; threshold 로써 몸통이 아닌 머리 부분의 길이를 사용한 변형 평가 지표입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot; data-reactroot=&quot;&quot;&gt;2D Pose Estimation&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1308&quot; data-origin-height=&quot;468&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GB50q/btq9kRabk6E/rGFzNSpwLT8iBJgssNlfj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GB50q/btq9kRabk6E/rGFzNSpwLT8iBJgssNlfj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GB50q/btq9kRabk6E/rGFzNSpwLT8iBJgssNlfj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGB50q%2Fbtq9kRabk6E%2FrGFzNSpwLT8iBJgssNlfj0%2Fimg.png&quot; data-origin-width=&quot;1308&quot; data-origin-height=&quot;468&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Direct regression based&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;빠르고 직접적으로 end-to-end 방법으로 학습이 가능하고, 3D 이미지에 대해서 큰 변화 없이 적용 가능합니다.&lt;/li&gt;
&lt;li&gt;Multi-person에 대해 적용 할 수 없고 현재는 좋은 성능을 얻지 못해서 많이 사용하지 않고 있습니다.&lt;/li&gt;
&lt;li&gt;현시점에서는 좋은 성능을 얻지 못해 많이 사용하지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Heatmap based&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;출력된 heatmap에서 최댓값을 가지는 좌표를 keypoint로 예측하는 방법입니다.&lt;/li&gt;
&lt;li&gt;시각화가 쉽고, 보다 복잡한 경우에 적용하기 좋습니다.&lt;/li&gt;
&lt;li&gt;Memory 사용양이 많고, 3D 이미지에 대해 적용하기가 어렵습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Top-down&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;영상에서 사람을 Detection 하고, Bounding Box 내부에서 포즈를 추정하는 방식입니다.&lt;/li&gt;
&lt;li&gt;Pose Estimation의 SOAT가 대부분 이 방식의 알고리즘에서 달성됩니다.&lt;/li&gt;
&lt;li&gt;Detector가 감지한 Bounding Box를 기준으로 사진을 잘라낸 뒤, 일정한 크기로 리사이즈하고서 pose estimator에 넣어주기에 사람의 상대적 크기에서 자유롭습니다.&lt;/li&gt;
&lt;li&gt;먼저 Detection을 하고 사람을 찾기 때문에 Bottom-up 보다는 정확도가 좋지만 속도가 느립니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Bottom-up&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;영상에 포함된 사람의 Key Point를 모두 추정하고, Key Point 간의 상관관계를 분석하여 포즈를 추정하는 방식입니다.&lt;/li&gt;
&lt;li&gt;Top-down 방식에 비해 정확도가 떨어집니다.&lt;/li&gt;
&lt;li&gt;Detection 과정을 거치지 않기 때문에 빠르다는 장점이 있어서 Real-time 에 적용하기 적합합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot; data-reactroot=&quot;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot; data-reactroot=&quot;&quot;&gt;2D Pose Estimation Dataset&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot; data-reactroot=&quot;&quot;&gt;2D Pose Estimation 분야의 논문에서는 주로 아래와 같은 데이터셋이 많이 사용됩니다. 이중에서도 MPII 데이터 셋과 COCO데이터 셋으로 평가가 많이 이루어집니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://human-pose.mpi-inf.mpg.de/&quot;&gt;MPII&lt;/a&gt; : 약 4만 명의 인물이 포함된 2만5천 장의 이미지로 구성된 데이터 셋입니다. 이미지는 유튜브 비디오에서 추출이 되었고 각 이미지에는 관절 좌표뿐만 아니라 신체 부분 폐색, 3D torso and head 방향, 410개의 활동 레이블링이 제공됩니다.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cocodataset.org/#home&quot;&gt;COCO&lt;/a&gt; : 약 15만 명의 인물이 포함된 6만 장의 이미지로 구성된 데이터 셋이 입니다.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dbcollection.readthedocs.io/en/latest/datasets/leeds_sports_pose_extended.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Leeds Sports Post(LSP)&lt;/a&gt; : 단일 인물사진들이며 스포츠 경기 이미지를 수집하여 만든 데이터 셋으로 14개의 관절 좌표가 있으며 10,000장의 이미지로 구성된 데이터 셋입니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Artificial Intelligence/Deep learning</category>
      <category>2D Pose Estimation</category>
      <category>coco</category>
      <category>computer vision</category>
      <category>Keypoint Detection</category>
      <category>LSP</category>
      <category>MPII</category>
      <category>Pose</category>
      <category>Pose Dataset</category>
      <category>pose estimation</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/49</guid>
      <comments>https://eunchankim-dev.tistory.com/49#entry49comment</comments>
      <pubDate>Sat, 31 Jul 2021 13:29:56 +0900</pubDate>
    </item>
    <item>
      <title>[Computer Vision]Object Detection</title>
      <link>https://eunchankim-dev.tistory.com/48</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Computer Vision에 다양한 분야가 있습니다. 그중에서도 가장 활발이 연구되고 있는 Object Detection에 대해서 포스팅해보도록 하겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Object Detection&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Object Detection이란 여러 물체에 대해 어떤 물체인지 분류하는 Classification 문제와 그 물체가 어디 있는지 Bounding Box 위치 정보를 나타내는 Localization 문제를 해결하는 분야입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Object Detection Milestiones&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;640&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oQq4p/btq9hz7uH4S/KigDAyCOP0MJ6TfvsfFKHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oQq4p/btq9hz7uH4S/KigDAyCOP0MJ6TfvsfFKHk/img.png&quot; data-alt=&quot;Object Detection in 20 Years: A Survey&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oQq4p/btq9hz7uH4S/KigDAyCOP0MJ6TfvsfFKHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoQq4p%2Fbtq9hz7uH4S%2FKigDAyCOP0MJ6TfvsfFKHk%2Fimg.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;640&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Object Detection in 20 Years: A Survey&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 이미지를 보면 Object Detection에 많은 영향을 미친 알고리즘들을 시간의 흐름에 따라 정리되어 있습니다. 요약하자면 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Traditional Detection 알고리즘 - VJ det, HOG det &amp;hellip;&lt;/li&gt;
&lt;li&gt;Pascal VOC 데이터 기반에서 딥러닝 기반인 AlexNet 이나 오면서 딥러닝이 화두가 되었습니다&lt;/li&gt;
&lt;li&gt;딥러닝 탐지 알고리즘 &amp;rarr; 1-Stage detector와 2-Stage detector로 나누어졌습니다. (Region Proposal, Classification)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2-Stage detector&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Localization을 진행한 다음에 순차적으로 Classification을 진행합니다&lt;/li&gt;
&lt;li&gt;대표적인 2-Stage detector 입니다&lt;br /&gt;R-CNN(Selective Search), SPPNet(Spatial Pyramid Pooling), Fast-RCNN(RoI projection, SPPNet) , Faster R-CNN(Region Proposal Network, Non-Maximum Suppression)&lt;/li&gt;
&lt;li&gt;객체 검출하는 정확도 측면에서는 좋은 성능을 냈지만 속도(FPS) 측면에서 너무 느립니다&lt;/li&gt;
&lt;li&gt;Real-time detection을 하기 위해서 약 20~30 fps정도가&amp;nbsp;적정하다고 하지만 2-Stage detector 중에 좋은 성능을 지닌 Faster R-CNN 약 5 fps 정도라 2-stage detector는 Real-time 적합하지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1-Stage detector&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Localization와 Classification 동시에 진행합니다.&lt;/li&gt;
&lt;li&gt;대표적인 1-Stage detector입니다&lt;br /&gt;YOLO(Grid), SSD(Default bbox), RetnaNet(Focal loss)&lt;/li&gt;
&lt;li&gt;2-stage detector의 속도(FPS) 문제를 개선하였지만 정확성 부분에서 조금 떨어집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;대표적인 Object detector들의 장점과 단점&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;998&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnLmaq/btq9gzmA5pY/PkzWoiJFBKIPgKTyuWKGE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnLmaq/btq9gzmA5pY/PkzWoiJFBKIPgKTyuWKGE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnLmaq/btq9gzmA5pY/PkzWoiJFBKIPgKTyuWKGE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnLmaq%2Fbtq9gzmA5pY%2FPkzWoiJFBKIPgKTyuWKGE0%2Fimg.png&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;998&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;대표적인 Object detector들의 비교&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;A review: Comparison of performance metrics of pretrained models for object detection using the TensorFlow framework &lt;/b&gt;에서 Object Detector을 다방면으로 비교한 자료가 있어서 참고하시면 좋을 듯합니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tensor flow를 사용하였고 Dataset은 COCO입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;FPS&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;592&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zg6LP/btq9gX8GTw3/538VhmnQNq5cYF1fXooDvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zg6LP/btq9gX8GTw3/538VhmnQNq5cYF1fXooDvK/img.png&quot; data-alt=&quot;Comparison of frames processed per second (FPS) implementing the Faster RCNN, R-FCN, SSD and YOLO models using input images with different resolutions.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zg6LP/btq9gX8GTw3/538VhmnQNq5cYF1fXooDvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzg6LP%2Fbtq9gX8GTw3%2F538VhmnQNq5cYF1fXooDvK%2Fimg.png&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;592&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Comparison of frames processed per second (FPS) implementing the Faster RCNN, R-FCN, SSD and YOLO models using input images with different resolutions.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FPS성능 지표에서는 YOLO가 앞도적으로 높은 것을 알 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;AP&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;596&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RNlgM/btq9jvDyYsE/EoQMLvILKuzZVmIXbrBVx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RNlgM/btq9jvDyYsE/EoQMLvILKuzZVmIXbrBVx0/img.png&quot; data-alt=&quot;Comparison of accuracy Faster R-CNN, R-FCN, SSD and YOLO models using the database MS COCO&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RNlgM/btq9jvDyYsE/EoQMLvILKuzZVmIXbrBVx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRNlgM%2Fbtq9jvDyYsE%2FEoQMLvILKuzZVmIXbrBVx0%2Fimg.png&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;596&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Comparison of accuracy Faster R-CNN, R-FCN, SSD and YOLO models using the database MS COCO&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조사를 하면서 느꼈지만 절대적으로 가장 좋은 알고리즘은 없고 조사를 하는 순간에도 다양한 방법들이 많이 생기고 있기 때문에 프로젝트 상황에 맞는 적합한 알고리즘을 잘 적용 시면 좋을 것 같습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;참고&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- Object Detection in 20 Years: A Survey&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- A review: Comparison of performance metrics of pretrained models for object detection using the TensorFlow framework&lt;/span&gt;&lt;/p&gt;</description>
      <category>Artificial Intelligence/Deep learning</category>
      <category>AlexNet</category>
      <category>computer vision</category>
      <category>Fast R-CNN</category>
      <category>object detection</category>
      <category>Object Detection Milestiones</category>
      <category>R-CNN</category>
      <category>ssd</category>
      <category>YOLO</category>
      <category>객체탐지</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/48</guid>
      <comments>https://eunchankim-dev.tistory.com/48#entry48comment</comments>
      <pubDate>Sat, 10 Jul 2021 21:57:41 +0900</pubDate>
    </item>
    <item>
      <title>[RNN]Recurrent Neural Network(RNN)</title>
      <link>https://eunchankim-dev.tistory.com/47</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이번에는 자연어(NL, Natural Language)나 음성신호, 주식과 같은 연속적인(sequential)&amp;nbsp;&lt;b&gt;시계열&lt;/b&gt;(time series) 데이터에 많이 사용되는 모델인&amp;nbsp;순환 신경망(Recurrent Neural Network)에 대해 포스팅해 보도록 하겠습니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;순차 데이터(Sequential Data)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;348&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CgpMd/btq7HwYRO6I/dU2jkqnOFljNQbrC8HjIqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CgpMd/btq7HwYRO6I/dU2jkqnOFljNQbrC8HjIqk/img.png&quot; data-alt=&quot;Sequential Data&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CgpMd/btq7HwYRO6I/dU2jkqnOFljNQbrC8HjIqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCgpMd%2Fbtq7HwYRO6I%2FdU2jkqnOFljNQbrC8HjIqk%2Fimg.png&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;348&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Sequential Data&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;순환 신경망(RNN)을 공부하기 전에 먼저 순환 신경망(RNN)에 사용하는 순차 데이터(Sequential Data)에 대해 알아야 합니다&amp;nbsp;&lt;br /&gt;순차 데이터(Sequential Data)란 순서가 의미가 있으며, 순서가 달라질 경우 의미가 손상 되는&amp;nbsp;데이터를 순차 데이터(Sequential Data)라고 합니다.&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;시간적 의미가 있는 경우 Temporal Sequence라고 하며, 일정한 시간차라면 Time Series 라고 합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;일반적으로 순환 신경망(RNN)에서는 Time Series형태의 데이터를 많이 사용하게 되는데요&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Temporal Sequence를 Time Series로 변환하기 위해서는 Resample을 해주어야 합니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;취득된 데이터(Temporal Sequence)를 이용해 신호를 보간(Imterpolation)하고, 이를 균일 시간 간경으로 샘플링합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;기억 시스템(Memory System)&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;278&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KDVcC/btq7EFvnCR6/4mmSduNbaJv4MQzL3keWH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KDVcC/btq7EFvnCR6/4mmSduNbaJv4MQzL3keWH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KDVcC/btq7EFvnCR6/4mmSduNbaJv4MQzL3keWH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKDVcC%2Fbtq7EFvnCR6%2F4mmSduNbaJv4MQzL3keWH0%2Fimg.png&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;278&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순차 데이터(Sequential Data)를 처리하려고 하면 기본적으로 기억 시스템이라는 것이 전제가 되어있어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 그림과 같이 입력이 여러 가지가 들어왔을 때 모든 입력을 다 분석을 해서 출력을 하기 위해서는 모든 입력들을 기억을 하고 있어야 합니다.&amp;nbsp; 올바른 대답을 하려면, 입력받을 때마다 그 내용을 '기억' 할 수 있어야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 입력을 기억하지 않는 시스템은 무기억 시스템(Memoryless System)이라고 하는데 얕은 신경망(Shallow Neural Network), 합성곱 신경망(Convolution Neural Network) 등이 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;순환 신경망(Recurrent Neural Network)&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;250&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ePlc8D/btq7FhPkmQu/OvnhIZXkNC8KDS49YbCk70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ePlc8D/btq7FhPkmQu/OvnhIZXkNC8KDS49YbCk70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ePlc8D/btq7FhPkmQu/OvnhIZXkNC8KDS49YbCk70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FePlc8D%2Fbtq7FhPkmQu%2FOvnhIZXkNC8KDS49YbCk70%2Fimg.png&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;250&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적인 순환 신경망(RNN)은 위의 그림과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;얕은 신경망(Shallow Neural Network)에 '순환'이 추가된 것으로 이해하면 될 것 같습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력에서 얕은 신경망(Shallow Neural Network)과는 다르게&amp;nbsp; n-1번째 히든 레이어를 입력받아 더해서 사용을 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 자연스럽게 입력의 길이가 길어지면서 데이터가 끊임없이 갱신될 수 있는 구조입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수식에서도 알 수 있든 히든 레이어의 활성화 함수는 비선형 함수인 하이퍼볼릭&amp;nbsp;탄젠트를 많이 사용합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 순환 신경망(RNN)은 입력값과 출력 값이 Sequential의 길이에 관계없이 받아들일 수 있는 구조이기 때문에 언어 모델링, 번역, 음성 인식 등에 다양하게 사용이 가능합니다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;순환 신경망(Recurrent Neural Network)의 한계&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;235&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YCtjU/btq7L1ruoV6/V53DkwWam9Alglyy2ARjQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YCtjU/btq7L1ruoV6/V53DkwWam9Alglyy2ARjQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YCtjU/btq7L1ruoV6/V53DkwWam9Alglyy2ARjQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYCtjU%2Fbtq7L1ruoV6%2FV53DkwWam9Alglyy2ARjQk%2Fimg.png&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;235&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순환 신경망(RNN)은 순차 데이터의 장기 의존관계(Long-Term Dependency)를 학습하는 것에 한계가 있습니다. 길이가 길어지어짐에 따라 신경망을 하나 통과할 때마다 기울기의 값이 조금씩 작아져서, 이전 시각 t까지 역전파 되기 전에 0이 되어 소멸하게 되는 기울기 소실(Gradient Vanishing) 또는 반대로 기울기가 너무 커지는 기울기 폭발(Gradient Exploding) 문제가 일어나기 때문입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 포스팅에는 RNN의 한계를 해결하는 방법을 포스팅하도록 하겠습니다.&amp;nbsp;&lt;/p&gt;</description>
      <category>Artificial Intelligence/Deep learning</category>
      <category>gradient Vanishing</category>
      <category>Recurrent Neural Network</category>
      <category>rnn</category>
      <category>Sequential Data</category>
      <category>순차 데이터</category>
      <category>순환 신경망</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/47</guid>
      <comments>https://eunchankim-dev.tistory.com/47#entry47comment</comments>
      <pubDate>Mon, 21 Jun 2021 16:04:30 +0900</pubDate>
    </item>
    <item>
      <title>[Deep Learning]Depthwise Separable Convolution</title>
      <link>https://eunchankim-dev.tistory.com/46</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 Convolution 방법 중 하나인&amp;nbsp;&lt;span&gt;&amp;nbsp;Depthwise&amp;nbsp;Separable&amp;nbsp;Convolution&lt;/span&gt;&amp;nbsp;내용을 포스팅해보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Depthwise Separable Convolution 방법은 Xecption,&amp;nbsp;Mobilenet V1, V2에 사용되고 있는데요 오늘의 포스팅은 &lt;a href=&quot;https://www.youtube.com/watch?v=T7o3xvJLuHk&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;CodeEmporium&lt;/a&gt;의 동영상을 참고하여 만들었습니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 기본적인 Convolution을 알아보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Convolution&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1582&quot; data-origin-height=&quot;870&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNW7Et/btq66u8tB1n/iHbdQuIFU60aVOnkMjgYf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNW7Et/btq66u8tB1n/iHbdQuIFU60aVOnkMjgYf0/img.png&quot; data-alt=&quot;일반적인 Convolution&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNW7Et/btq66u8tB1n/iHbdQuIFU60aVOnkMjgYf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNW7Et%2Fbtq66u8tB1n%2FiHbdQuIFU60aVOnkMjgYf0%2Fimg.png&quot; data-origin-width=&quot;1582&quot; data-origin-height=&quot;870&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;일반적인 Convolution&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;&lt;span data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;D&amp;lt;/mi&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;F&amp;lt;/mi&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;/math&amp;gt;&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;D&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;sub&gt;F&lt;/sub&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;는 Height와 Width의 크기이고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;&lt;b&gt;&lt;span data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;M&amp;lt;/mi&amp;gt;&amp;lt;/math&amp;gt;&quot;&gt;&lt;span&gt;M&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;은 Channel 크기입니다.&amp;nbsp; 따라서 Input shape은 (&lt;i&gt;&lt;b&gt;D&lt;sub&gt;F&lt;/sub&gt;,D&lt;sub&gt;F&lt;/sub&gt;,M&lt;/b&gt;&lt;/i&gt;) 입니다.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;&lt;span data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;D&amp;lt;/mi&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;K&amp;lt;/mi&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;/math&amp;gt;&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;D&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;sub&gt;K&lt;/sub&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;는 필터에 해당합니다. 필터의 채널은 인풋과 같기 때문에 똑같이 &lt;i&gt;&lt;b&gt;M&lt;/b&gt;&lt;/i&gt;입니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;인풋이 필터를 거쳐 Convolution을 하게 되면 결과물로 매트릭스가 한 개 나오게 됩니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;필터의 갯수가&amp;nbsp;&lt;span data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;N&amp;lt;/mi&amp;gt;&amp;lt;/math&amp;gt;&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;에 해당하는데 필터의 종류(&lt;i&gt;&lt;b&gt;N&lt;/b&gt;&lt;/i&gt;개) 만큼 Convolution 하기 때문에 총&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;&lt;b&gt;&lt;span data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;N&amp;lt;/mi&amp;gt;&amp;lt;/math&amp;gt;&quot;&gt;&lt;span&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;개의 매트릭스가 결과물로 나오게 됩니다.&lt;/li&gt;
&lt;li&gt;모두 더하면 출력에&lt;span&gt;&amp;nbsp;(&lt;i&gt;&lt;b&gt;D&lt;sub&gt;G&lt;/sub&gt;,D&lt;sub&gt;G&lt;/sub&gt;,N&lt;/b&gt;&lt;/i&gt;)&amp;nbsp;&lt;/span&gt;shape의 volume이 출력물로 나오게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1518&quot; data-origin-height=&quot;580&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sCChR/btq66krdc6l/4RwD0gbBZGnqGU87nWQkp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sCChR/btq66krdc6l/4RwD0gbBZGnqGU87nWQkp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sCChR/btq66krdc6l/4RwD0gbBZGnqGU87nWQkp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsCChR%2Fbtq66krdc6l%2F4RwD0gbBZGnqGU87nWQkp1%2Fimg.png&quot; data-origin-width=&quot;1518&quot; data-origin-height=&quot;580&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;곱연산 기준으로 Standard Convolution 연산량을 알아보겠습니다.&lt;/li&gt;
&lt;li&gt;먼저 한 개의 필터가 인풋의 한 위치에서 처리할 때 사용되는 곱연산은&lt;b&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;i&gt;&lt;b&gt;&lt;span aria-hidden=&quot;true&quot;&gt;D&lt;sup&gt;2&lt;/sup&gt;&lt;sub&gt;K&lt;/sub&gt;&lt;/span&gt;&lt;/b&gt;&amp;times;&lt;b&gt;M&lt;/b&gt;&lt;/i&gt;이 됩니다.&lt;/li&gt;
&lt;li&gt;이 때, 이동할 수 있는 위치의 경우의 수가&lt;i&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;D&amp;lt;/mi&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;G&amp;lt;/mi&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;mo&amp;gt;&amp;amp;#x00D7;&amp;lt;/mo&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;D&amp;lt;/mi&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;G&amp;lt;/mi&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;/math&amp;gt;&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;D&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;sub&gt;G&lt;/sub&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;times;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;D&lt;sub&gt;G&lt;/sub&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;의 경우가 있기 때문에(&lt;i&gt;&lt;b&gt;&lt;span data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;D&amp;lt;/mi&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;G&amp;lt;/mi&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;/math&amp;gt;&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;D&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;sub&gt;G&lt;/sub&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;는 아웃풋의 height, wdith 크기) 필터 하나가 인풋 하나를 처리하는 데 필요한 연산 수는&lt;span&gt;&amp;nbsp;&lt;i&gt;&lt;b&gt;&lt;span aria-hidden=&quot;true&quot;&gt;D&lt;sup&gt;2&lt;/sup&gt;&lt;sub&gt;G&lt;/sub&gt;&amp;times;D&lt;sup&gt;2&lt;/sup&gt;&lt;sub&gt;K&lt;/sub&gt;&amp;times;&lt;/span&gt;M&lt;/b&gt;&lt;/i&gt;이&lt;/span&gt; 됩니다.&lt;/li&gt;
&lt;li&gt;마지막으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;N&amp;lt;/mi&amp;gt;&amp;lt;/math&amp;gt;&quot;&gt;&lt;span&gt;N&lt;/span&gt;&lt;/span&gt;개의 필터가 있다면 아웃풋은&lt;span&gt;&amp;nbsp;&lt;span aria-hidden=&quot;true&quot;&gt;(&lt;i&gt;&lt;b&gt;D&lt;sub&gt;G&lt;/sub&gt;,D&lt;sub&gt;G&lt;/sub&gt;,N&lt;/b&gt;&lt;/i&gt;)&lt;/span&gt;&amp;nbsp;&lt;/span&gt;크기를 가지고 연산량도&lt;span&gt;&amp;nbsp;&lt;i&gt;&lt;b&gt;&lt;span aria-hidden=&quot;true&quot;&gt;N&amp;times;D&lt;sup&gt;2&lt;/sup&gt;&lt;sub&gt;G&lt;/sub&gt;&amp;times;D&lt;sup&gt;2&lt;/sup&gt;&lt;sub&gt;K&lt;/sub&gt;&amp;times;M&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;가&lt;/span&gt; 됩니다.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;&lt;span aria-hidden=&quot;true&quot;&gt;N&amp;times;D&lt;sup&gt;2&lt;/sup&gt;&lt;sub&gt;G&lt;/sub&gt;&amp;times;D&lt;sup&gt;2&lt;/sup&gt;&lt;sub&gt;K&lt;/sub&gt;&amp;times;M&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;(Standard Convolution) &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;연산량을 줄이는 것이 Depthwise Separable Convolution목표입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Depthwise&amp;nbsp;Separable&amp;nbsp;Convolution&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Depthwise Separable Convolution은 2가지의 프로세스로 진행됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Depthwise Convolution과 Pointwise Convolution 입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;nbsp;Depthwise Convolution&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1540&quot; data-origin-height=&quot;826&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xbDky/btq65dsAfUq/vPBKoZOXy3iqlQwLO3tQcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xbDky/btq65dsAfUq/vPBKoZOXy3iqlQwLO3tQcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xbDky/btq65dsAfUq/vPBKoZOXy3iqlQwLO3tQcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxbDky%2Fbtq65dsAfUq%2FvPBKoZOXy3iqlQwLO3tQcK%2Fimg.png&quot; data-origin-width=&quot;1540&quot; data-origin-height=&quot;826&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Standard Convolution 에서는 한 개의 필터가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;&lt;b&gt;&lt;span data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;M&amp;lt;/mi&amp;gt;&amp;lt;/math&amp;gt;&quot;&gt;&lt;span&gt;M&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;채널 전체에 Convolution을 하였습니다.&lt;/li&gt;
&lt;li&gt;Depthwise Convolution에서는&amp;nbsp; 한 개의 필터가 한 개의 채널에만 연산을 합니다. 인풋의 첫번째 채널에 해당하는 영역을&lt;span&gt;&amp;nbsp;&lt;span aria-hidden=&quot;true&quot;&gt;(&lt;i&gt;&lt;b&gt;D&lt;sub&gt;F&lt;/sub&gt;,D&lt;sub&gt;F&lt;/sub&gt;,M&lt;sub&gt;1&lt;/sub&gt;&lt;/b&gt;&lt;/i&gt;)&lt;/span&gt;&amp;nbsp;이라고&lt;/span&gt; 한다면 이 1채널 인풋과 유일하게 연산되는 필터&lt;span&gt;&amp;nbsp;&lt;span aria-hidden=&quot;true&quot;&gt;(&lt;i&gt;&lt;b&gt;D&lt;sub&gt;k&lt;/sub&gt;,D&lt;sub&gt;k&lt;/sub&gt;,&lt;sub&gt;1&lt;/sub&gt;&lt;/b&gt;&lt;/i&gt;)&lt;/span&gt;이&lt;/span&gt; 존재합니다.&lt;/li&gt;
&lt;li&gt;&lt;span aria-hidden=&quot;true&quot;&gt;(&lt;i&gt;&lt;b&gt;D&lt;sub&gt;F&lt;/sub&gt;,D&lt;sub&gt;F&lt;/sub&gt;,M&lt;sub&gt;i&lt;/sub&gt;&lt;/b&gt;&lt;/i&gt;)&lt;/span&gt;는&amp;nbsp;&lt;span aria-hidden=&quot;true&quot;&gt;(&lt;i&gt;&lt;b&gt;D&lt;sub&gt;K&lt;/sub&gt;,D&lt;sub&gt;K&lt;/sub&gt;,M&lt;sub&gt;i&lt;/sub&gt;&lt;/b&gt;&lt;/i&gt;)&lt;/span&gt;와 대응하기 때문에 이 연산에서는 총&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;M&amp;lt;/mi&amp;gt;&amp;lt;/math&amp;gt;&quot;&gt;&lt;span&gt;M&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;개의 필터가 존재하게 됩니다.&lt;/li&gt;
&lt;li&gt;연산을 마치면 최종적으로&lt;span&gt;&amp;nbsp;&lt;span aria-hidden=&quot;true&quot;&gt;(&lt;i&gt;&lt;b&gt;D&lt;sub&gt;G&lt;/sub&gt;,D&lt;sub&gt;G&lt;/sub&gt;,M&lt;/b&gt;&lt;/i&gt;)&lt;/span&gt;의&lt;/span&gt; volume이 출력됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;Pointwise&lt;/span&gt;&amp;nbsp;Convolution&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dWTp5u/btq67OL8VmI/WnaTEVJK5hMT77PhlUsmDk/img.png&quot; data-image-src=&quot;https://blog.kakaocdn.net/dn/dWTp5u/btq67OL8VmI/WnaTEVJK5hMT77PhlUsmDk/img.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;818&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Pointwise Convolution 핵심은 &lt;i&gt;&lt;b&gt;1 x 1&lt;/b&gt; C&lt;/i&gt;onvolution을 적용하는 것이 입니다.&lt;span&gt;&amp;nbsp;&lt;span aria-hidden=&quot;true&quot;&gt;(&lt;i&gt;&lt;b&gt;D&lt;sub&gt;G&lt;/sub&gt;,D&lt;sub&gt;G&lt;/sub&gt;,M&lt;/b&gt;&lt;/i&gt;)&lt;/span&gt;에&amp;nbsp;&lt;span aria-hidden=&quot;true&quot;&gt;(&lt;i&gt;&lt;b&gt;1,1,M&lt;/b&gt;&lt;/i&gt;)&lt;/span&gt;필터를&lt;/span&gt; Convolution 을 합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;mo stretchy=&amp;quot;false&amp;quot;&amp;gt;(&amp;lt;/mo&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;D&amp;lt;/mi&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;G&amp;lt;/mi&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;mo&amp;gt;,&amp;lt;/mo&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;D&amp;lt;/mi&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;G&amp;lt;/mi&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;mo&amp;gt;,&amp;lt;/mo&amp;gt;&amp;lt;mi&amp;gt;M&amp;lt;/mi&amp;gt;&amp;lt;mo stretchy=&amp;quot;false&amp;quot;&amp;gt;)&amp;lt;/mo&amp;gt;&amp;lt;mo&amp;gt;&amp;amp;#x2297;&amp;lt;/mo&amp;gt;&amp;lt;mo stretchy=&amp;quot;false&amp;quot;&amp;gt;(&amp;lt;/mo&amp;gt;&amp;lt;mn&amp;gt;1&amp;lt;/mn&amp;gt;&amp;lt;mo&amp;gt;,&amp;lt;/mo&amp;gt;&amp;lt;mn&amp;gt;1&amp;lt;/mn&amp;gt;&amp;lt;mo&amp;gt;,&amp;lt;/mo&amp;gt;&amp;lt;mi&amp;gt;M&amp;lt;/mi&amp;gt;&amp;lt;mo stretchy=&amp;quot;false&amp;quot;&amp;gt;)&amp;lt;/mo&amp;gt;&amp;lt;mo&amp;gt;=&amp;lt;/mo&amp;gt;&amp;lt;mo stretchy=&amp;quot;false&amp;quot;&amp;gt;(&amp;lt;/mo&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;D&amp;lt;/mi&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;G&amp;lt;/mi&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;mo&amp;gt;,&amp;lt;/mo&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;D&amp;lt;/mi&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;G&amp;lt;/mi&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;mo&amp;gt;,&amp;lt;/mo&amp;gt;&amp;lt;mn&amp;gt;1&amp;lt;/mn&amp;gt;&amp;lt;mo stretchy=&amp;quot;false&amp;quot;&amp;gt;)&amp;lt;/mo&amp;gt;&amp;lt;/math&amp;gt;&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;그러면 (&lt;/span&gt;&lt;i&gt;&lt;b&gt;D&lt;sub&gt;G&lt;/sub&gt;,D&lt;sub&gt;G&lt;/sub&gt;,M&lt;/b&gt;&lt;/i&gt;)&lt;b&gt;&amp;otimes;&lt;/b&gt;(&lt;i&gt;&lt;b&gt;1,1,M&lt;/b&gt;&lt;/i&gt;)=(&lt;i&gt;&lt;b&gt;D&lt;sub&gt;G&lt;/sub&gt;,D&lt;sub&gt;G&lt;/sub&gt;,1&lt;/b&gt;&lt;/i&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;이&lt;/span&gt; 됩니다. 이 연산을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;&lt;b&gt;&lt;span data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;N&amp;lt;/mi&amp;gt;&amp;lt;/math&amp;gt;&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;개의&lt;span&gt;&amp;nbsp;&lt;span aria-hidden=&quot;true&quot;&gt;(&lt;i&gt;&lt;b&gt;1,1,M&lt;/b&gt;&lt;/i&gt;)&lt;/span&gt;&amp;nbsp;&lt;/span&gt;필터를 이용하여 적용하면 총&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;&lt;b&gt;&lt;span data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;N&amp;lt;/mi&amp;gt;&amp;lt;/math&amp;gt;&quot;&gt;&lt;span&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;개의 매트릭스(&lt;span aria-hidden=&quot;true&quot;&gt;(&lt;i&gt;&lt;b&gt;D&lt;sub&gt;G&lt;/sub&gt;,D&lt;sub&gt;G&lt;/sub&gt;,1&lt;/b&gt;&lt;/i&gt;)&lt;/span&gt;&amp;nbsp;가&amp;nbsp;&lt;i&gt;&lt;b&gt;&lt;span data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;N&amp;lt;/mi&amp;gt;&amp;lt;/math&amp;gt;&quot;&gt;&lt;span&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;개)가 출력 됩니다.&lt;/li&gt;
&lt;li&gt;이 출력물들을 쌓으면 하면 결과적으로&lt;span&gt;&amp;nbsp;&lt;span aria-hidden=&quot;true&quot;&gt;(&lt;i&gt;&lt;b&gt;D&lt;sub&gt;G&lt;/sub&gt;,D&lt;sub&gt;G&lt;/sub&gt;,N&lt;/b&gt;&lt;/i&gt;)&lt;/span&gt;의&lt;/span&gt; 출력물을 만들 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력과 출력 기준으로 보면&lt;span&gt; S&lt;/span&gt;tandard Convolution과&lt;span&gt; D&lt;/span&gt;epthwise Separable Convolution&lt;span&gt;&amp;nbsp;&lt;/span&gt;모두&lt;span&gt;&amp;nbsp;&lt;span aria-hidden=&quot;true&quot;&gt;(&lt;i&gt;&lt;b&gt;D&lt;sub&gt;F&lt;/sub&gt;,D&lt;sub&gt;F&lt;/sub&gt;,M&lt;/b&gt;&lt;/i&gt;)&lt;/span&gt;을&lt;/span&gt; 입력으로 넣어서&lt;span&gt;&amp;nbsp;&lt;span aria-hidden=&quot;true&quot;&gt;(&lt;i&gt;&lt;b&gt;D&lt;sub&gt;G&lt;/sub&gt;,D&lt;sub&gt;G&lt;/sub&gt;,N&lt;/b&gt;&lt;/i&gt;)&lt;/span&gt;의&lt;/span&gt; 출력을 얻는다는 점은 같습니다.&lt;/li&gt;
&lt;li&gt;하지만 내부 Convolution 연산 과정에서&lt;span&gt; D&lt;/span&gt;epthwise Separable&lt;span&gt;&amp;nbsp;&lt;/span&gt;기법으로 연산량과 파라미터 수를 줄였다는 것이 핵심입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;758&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZeaUb/btq636Bg3z1/ihOjuEfVe0iTsYOj1z5PHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZeaUb/btq636Bg3z1/ihOjuEfVe0iTsYOj1z5PHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZeaUb/btq636Bg3z1/ihOjuEfVe0iTsYOj1z5PHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZeaUb%2Fbtq636Bg3z1%2FihOjuEfVe0iTsYOj1z5PHK%2Fimg.png&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;758&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Depthwise Convolution의 연산량&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 위치에서 필터가 연산되는 곱연산은&amp;nbsp;&lt;i&gt;&lt;b&gt;&lt;span aria-hidden=&quot;true&quot;&gt;D&lt;sup&gt;2&lt;/sup&gt;&lt;sub&gt;K&lt;/sub&gt;&lt;/span&gt;&amp;nbsp;&lt;/b&gt;&lt;/i&gt;이고 한 채널 전체에서 필터가 연산되는 곱연산은&amp;nbsp;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;i&gt;&lt;b&gt;D&lt;sup&gt;2&lt;/sup&gt;&lt;sub&gt;G&lt;/sub&gt;&amp;times;&lt;/b&gt;&lt;/i&gt;&lt;i&gt;&lt;b&gt;D&lt;/b&gt;&lt;/i&gt;&lt;i&gt;&lt;b&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/b&gt;&lt;/i&gt;&lt;sub&gt;K&lt;/sub&gt;&lt;/span&gt;입니다.&lt;/li&gt;
&lt;li&gt;마지막으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;&lt;b&gt;&lt;span data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;M&amp;lt;/mi&amp;gt;&amp;lt;/math&amp;gt;&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;M&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;개의&lt;span&gt;&amp;nbsp;&lt;/span&gt;채널에 모두 적용되어야 하므로 총 곱연산은&lt;i&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;span aria-hidden=&quot;true&quot;&gt;M&amp;times;D&lt;sup&gt;2&lt;/sup&gt;&lt;sub&gt;G&lt;/sub&gt;&amp;times;D&lt;sup&gt;2&lt;/sup&gt;&lt;sub&gt;K&lt;/sub&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;가 됩니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Pointwise Convolution의 연산량&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 위치에서 &lt;b&gt;&lt;i&gt;1x1&lt;/i&gt; &lt;/b&gt;필터가 연산되는 곱 연산은&lt;span&gt;&amp;nbsp;&lt;b&gt;&lt;i&gt;M&lt;/i&gt;&lt;/b&gt;&amp;nbsp;입니다.&lt;/span&gt; 그리고 한 채널 전체에서 연산되는 곱연산은&amp;nbsp;&lt;i&gt;&lt;b&gt;&lt;span aria-hidden=&quot;true&quot;&gt;D&lt;sup&gt;2&lt;/sup&gt;&lt;sub&gt;G&lt;/sub&gt;&amp;times;M&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;이 됩니다.&lt;/li&gt;
&lt;li&gt;마지막으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;&lt;b&gt;&lt;span data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;N&amp;lt;/mi&amp;gt;&amp;lt;/math&amp;gt;&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;개의&lt;span&gt;&amp;nbsp;&lt;/span&gt;필터가 모두 적용되어야 하므로 총 곱연산은&amp;nbsp;&lt;i&gt;&lt;b&gt;&lt;span aria-hidden=&quot;true&quot;&gt;N&amp;times;D&lt;sup&gt;2&lt;/sup&gt;&lt;sub&gt;G&lt;/sub&gt;&amp;times;M&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;이 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Comparison Standard Vs Depthwise&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1544&quot; data-origin-height=&quot;856&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GoWOi/btq66Uy4V2j/cXTW2wRr3XSxhIVeMwaEW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GoWOi/btq66Uy4V2j/cXTW2wRr3XSxhIVeMwaEW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GoWOi/btq66Uy4V2j/cXTW2wRr3XSxhIVeMwaEW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGoWOi%2Fbtq66Uy4V2j%2FcXTW2wRr3XSxhIVeMwaEW1%2Fimg.png&quot; data-origin-width=&quot;1544&quot; data-origin-height=&quot;856&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Standard Convolution의 연산량은&lt;i&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;span aria-hidden=&quot;true&quot;&gt;N&amp;times;D&lt;sup&gt;2&lt;/sup&gt;&lt;sub&gt;G&lt;/sub&gt;&amp;times;D&lt;sup&gt;2&lt;/sup&gt;&lt;sub&gt;K&lt;/sub&gt;&amp;times;M&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&amp;nbsp;이고 Depthwise Separable Convolution의 연산량은&lt;span&gt;&amp;nbsp;&lt;i&gt;&lt;b&gt;&lt;span aria-hidden=&quot;true&quot;&gt;M&amp;times;D2&lt;sub&gt;G&lt;/sub&gt;(D&lt;sup&gt;2&lt;/sup&gt;&lt;sub&gt;K&lt;/sub&gt;+N)&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&amp;nbsp;됩니다.&lt;/li&gt;
&lt;li&gt;위 슬라이드와 같이 비율을 확인해 보면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;&lt;b&gt;&lt;span data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;mo stretchy=&amp;quot;false&amp;quot;&amp;gt;(&amp;lt;/mo&amp;gt;&amp;lt;mn&amp;gt;1&amp;lt;/mn&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mo&amp;gt;/&amp;lt;/mo&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;mi&amp;gt;N&amp;lt;/mi&amp;gt;&amp;lt;mo stretchy=&amp;quot;false&amp;quot;&amp;gt;)&amp;lt;/mo&amp;gt;&amp;lt;mo&amp;gt;+&amp;lt;/mo&amp;gt;&amp;lt;mo stretchy=&amp;quot;false&amp;quot;&amp;gt;(&amp;lt;/mo&amp;gt;&amp;lt;mn&amp;gt;1&amp;lt;/mn&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mo&amp;gt;/&amp;lt;/mo&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;msubsup&amp;gt;&amp;lt;mi&amp;gt;D&amp;lt;/mi&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;K&amp;lt;/mi&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mn&amp;gt;2&amp;lt;/mn&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;/msubsup&amp;gt;&amp;lt;mo stretchy=&amp;quot;false&amp;quot;&amp;gt;)&amp;lt;/mo&amp;gt;&amp;lt;/math&amp;gt;&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;N&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;+&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;D&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;sub&gt;K&lt;/sub&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;이 됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;i&gt;&lt;span data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;N&amp;lt;/mi&amp;gt;&amp;lt;/math&amp;gt;&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;은 아웃풋 채널의 수이고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;&lt;b&gt;&lt;span data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;K&amp;lt;/mi&amp;gt;&amp;lt;/math&amp;gt;&quot;&gt;&lt;span&gt;K&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;는 필터의 사이즈이므로 일반적인 예를 들어&lt;span&gt;&amp;nbsp;&lt;i&gt;&lt;b&gt;&lt;span aria-hidden=&quot;true&quot;&gt;N=1024,K=3&lt;/span&gt;N=1024,K=3&lt;/b&gt;&lt;/i&gt;이라고&lt;/span&gt; 하면&lt;span&gt;&amp;nbsp;&lt;span aria-hidden=&quot;true&quot;&gt;(&lt;i&gt;&lt;b&gt;1/1024&lt;/b&gt;&lt;/i&gt;)+(&lt;i&gt;&lt;b&gt;1/9&lt;/b&gt;&lt;/i&gt;)=&lt;b&gt;&lt;i&gt;0.112..&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;가&lt;/span&gt; 됩니다.&lt;/li&gt;
&lt;li&gt;&lt;span data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;mn&amp;gt;1&amp;lt;/mn&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mo&amp;gt;/&amp;lt;/mo&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;mn&amp;gt;9&amp;lt;/mn&amp;gt;&amp;lt;/math&amp;gt;&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;Standard Convolution의 약 1/9&lt;/span&gt;&lt;/span&gt;만큼 연산량이 줄어든것을 확인할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Artificial Intelligence/Deep learning</category>
      <category>CNN</category>
      <category>convolution</category>
      <category>Depthwise Separable Convolution</category>
      <category>Standard Convolution</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/46</guid>
      <comments>https://eunchankim-dev.tistory.com/46#entry46comment</comments>
      <pubDate>Mon, 14 Jun 2021 14:53:48 +0900</pubDate>
    </item>
    <item>
      <title>[자료구조]링크드 리스트(Linked List)</title>
      <link>https://eunchankim-dev.tistory.com/45</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;링크드 리스트 (Linked List)&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;196&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/conXB3/btq5lxNd9rB/TmBN8H5vPxJYzAV70wckFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/conXB3/btq5lxNd9rB/TmBN8H5vPxJYzAV70wckFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/conXB3/btq5lxNd9rB/TmBN8H5vPxJYzAV70wckFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FconXB3%2Fbtq5lxNd9rB%2FTmBN8H5vPxJYzAV70wckFk%2Fimg.png&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;196&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;링크드 리스트(Linked List), 연결 리스트는 각 노드가 데이터와 포인터를 가지고 한 줄로 연결되어 있는 방식으로 데이터를 저장하는 자료 구조입니다. 이름에서 말하듯이 데이터를 담고 있는 노드들이 연결되어 있는데, 노드의 포인터가 다음이나 이전의 노드와의 연결을 담당하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;1.-링크드-리스트-(Linked-List)-구조&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;배열은 순차적으로 연결된 공간에 데이터를 나열하는 데이터 구조입니다.&lt;/li&gt;
&lt;li&gt;링크드 리스트는 떨어진 곳에 존재하는 데이터를 화살표로 연결해서 관리하는 데이터 구조입니다.&lt;/li&gt;
&lt;li&gt;본래 C언어에서는 주요한 데이터 구조이지만, 파이썬은 리스트 타입이 링크드 리스트의 기능을 모두 지원합니다.&lt;/li&gt;
&lt;li&gt;장점
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;배열은 미리 데이터의 공간을 할당해야하지만 링크드 리스트는 미리 데이터 공간을 미리 할당하지 않아도 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단점
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;연결을 위한 별도 데이터 공간이 필요하므로, 저장공간 효율이 낮습니다.&lt;/li&gt;
&lt;li&gt;연결 정보를 찾는 시간이 필요하므로 접근 속도가 느립니다.&lt;/li&gt;
&lt;li&gt;중간 데이터 삭제시, 앞뒤 데이터의 연결을 재구성해야 하는 부가적인 작업 필요합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;링크드 리스트 기본 구조와 용어
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;노드(Node): 데이터 저장 단위 (데이터 값, 포인터)로 구성되어 있습니다.&lt;/li&gt;
&lt;li&gt;포인터(pointer): 각 노드 안에서, 다음이나 이전의 노드와의 연결 정보를 가지고 있는 공간입니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;7.-다양한-링크드-리스트-구조&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;다양한 링크드 리스트 구조&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;더블 링크드 리스트(Doubly linked list)&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;155&quot; width=&quot;1058&quot; height=&quot;128&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E2wZP/btq6PbOK0rf/KnEhliAswU0dRCuG8vt3mk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E2wZP/btq6PbOK0rf/KnEhliAswU0dRCuG8vt3mk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E2wZP/btq6PbOK0rf/KnEhliAswU0dRCuG8vt3mk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE2wZP%2Fbtq6PbOK0rf%2FKnEhliAswU0dRCuG8vt3mk%2Fimg.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;155&quot; width=&quot;1058&quot; height=&quot;128&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이중 연결 리스트라고도 부릅니다.&lt;/li&gt;
&lt;li&gt;장점
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;양방향으로 연결되어 있어서 노드 탐색이 양쪽으로 모두 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;원형 링크드 리스트(Circular linked list)&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1156&quot; data-origin-height=&quot;244&quot; width=&quot;577&quot; height=&quot;122&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/17uNS/btq6N2kdh3y/DRLILpUzpLhJeoQVu5AL31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/17uNS/btq6N2kdh3y/DRLILpUzpLhJeoQVu5AL31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/17uNS/btq6N2kdh3y/DRLILpUzpLhJeoQVu5AL31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F17uNS%2Fbtq6N2kdh3y%2FDRLILpUzpLhJeoQVu5AL31%2Fimg.png&quot; data-origin-width=&quot;1156&quot; data-origin-height=&quot;244&quot; width=&quot;577&quot; height=&quot;122&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리스트의 마지막 노드의 링크가 첫 번째 노드를 가리키는 연결 리스트입니다.&lt;/li&gt;
&lt;li&gt;장점
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;반복적인 순회에서 연결리스트의 끝을 체크해야 할 필요가 없습니다. 또한 HEAD와 같은 메타데이터가 필요하지 않기 때문에 시간, 메모리의 효율이 높습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>programming/Python</category>
      <category>C</category>
      <category>Circular Linked List</category>
      <category>Data structure</category>
      <category>doubly linked list</category>
      <category>Linked List</category>
      <category>PYTHON</category>
      <category>링크드리스트</category>
      <category>자료구조</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/45</guid>
      <comments>https://eunchankim-dev.tistory.com/45#entry45comment</comments>
      <pubDate>Tue, 8 Jun 2021 14:45:24 +0900</pubDate>
    </item>
    <item>
      <title>[자료구조]배열(Array), 큐(Queue), 스택(Stack)</title>
      <link>https://eunchankim-dev.tistory.com/44</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;배열(Aarry)&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;131&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p9brL/btq5fl0tYLJ/HwvUvKn1LQOYom7lVOzg0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p9brL/btq5fl0tYLJ/HwvUvKn1LQOYom7lVOzg0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p9brL/btq5fl0tYLJ/HwvUvKn1LQOYom7lVOzg0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp9brL%2Fbtq5fl0tYLJ%2FHwvUvKn1LQOYom7lVOzg0K%2Fimg.png&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;131&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열이란 데이터를 나열하고, 각 데이터를 인덱스에 대응하도록 구성한 데이터 구조입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬에서는 리스트 타입이 배열 기능을 제공합니다&lt;/p&gt;
&lt;h3 id=&quot;1.-배열은-왜-필요할까?&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;같은 종류의 데이터를 효율적으로 관리하기 위해 사용합니다.&lt;/li&gt;
&lt;li&gt;같은 종류의 데이터를 순차적으로 저장합니다.&lt;/li&gt;
&lt;li&gt;장점:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;빠른 접근 가능 : 첫 데이터의 위치에서 상대적인 위치로 데이터 접근(인덱스 번호로 접근)이 가능하기 때문에 데이터 접근 속도가 빠릅니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단점:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 추가/삭제의 어려움 : 일반적으로 C언어에서는 미리 최대 길이를 지정해야 되지만 파이썬의 list는 자동적으로 늘어나기 때문에 최대길이를 지정하지 않아도 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;대표적인-데이터-구조4:-큐-(Queue)&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;큐(Queue)&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;198&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nayHK/btq5bNpLGME/NUxpDqHEkPgzJkRFmbKjB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nayHK/btq5bNpLGME/NUxpDqHEkPgzJkRFmbKjB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nayHK/btq5bNpLGME/NUxpDqHEkPgzJkRFmbKjB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnayHK%2Fbtq5bNpLGME%2FNUxpDqHEkPgzJkRFmbKjB1%2Fimg.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;198&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;큐란 한쪽 끝(rear)에서는 삽입 연산만 이루어지며 다른 한쪽 끝(front)에서는 삭제 연산만 이루어지는 유한 순서 리스트입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말해서 음식점에서 가장 먼저 줄을 선 사람이 제일 먼저 음식점에 입장하는 것과 동일한 원리 입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;1.-큐-구조&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가장 먼저 넣은 데이터를 가장 먼저 꺼낼 수 있는 구조입니다.&lt;/li&gt;
&lt;li&gt;FIFO(First-In, First-Out) 또는 LILO(Last-In, Last-Out) 방식으로 스택과 꺼내는 순서가 반대입니다.&lt;/li&gt;
&lt;li&gt;Enqueue: 큐에 데이터를 넣는 기능입니다.&lt;/li&gt;
&lt;li&gt;Dequeue: 큐에서 데이터를 꺼내는 기능입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;3.-파이썬-queue-라이브러리-활용해서-큐-자료-구조-사용하기&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;파이썬 queue 라이브러리&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;queue 라이브러리에는 다양한 큐 구조로 Queue(), LifoQueue(), PriorityQueue() 제공합니다.&lt;/li&gt;
&lt;li&gt;프로그램을 작성할 때 프로그램에 따라 적합한 자료 구조를 사용하면 효율적으로 프로그램을 만들 수 있습니다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Queue(): 가장 일반적인 큐 자료 구조&lt;/li&gt;
&lt;li&gt;LifoQueue(): 나중에 입력된 데이터가 먼저 출력되는 구조 (스택 구조라고 보면 됨)&lt;/li&gt;
&lt;li&gt;PriorityQueue(): 데이터마다 우선순위를 넣어서, 우선순위가 높은 순으로 데이터 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대체로 많이 쓰는 큐이며 위의 큐 외에 다양한 정책이 적용된 큐들이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;꼭-알아둬야-할-자료-구조:-스택-(Stack)&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;스택 (Stack)&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;482&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3BdWB/btq5i3YBX3R/TCFprrDyPKyggLdP8NBUJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3BdWB/btq5i3YBX3R/TCFprrDyPKyggLdP8NBUJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3BdWB/btq5i3YBX3R/TCFprrDyPKyggLdP8NBUJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3BdWB%2Fbtq5i3YBX3R%2FTCFprrDyPKyggLdP8NBUJ1%2Fimg.png&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;482&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #4d5156;&quot;&gt;스택은 원소의 삽입과 삭제가 &quot;Top&quot;에서만 이루어지도록 제한되어 있는 유한순서 리스트입니다. 스택은 컴퓨터 내부의 프로세스 구조의 함수 동작 방식 등에 활용됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;1.-큐-구조&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터를 한쪽 끝에서만 자료를 넣거나 뺄 수 있는 구조입니다.&lt;/li&gt;
&lt;li&gt;가장 나중에 쌓은 데이터를 가장 먼저 빼낼 수 있는 데이터 구조입니다.&lt;/li&gt;
&lt;li&gt;스택은 LIFO(Last In, Fisrt Out) 또는 FILO(First In, Last Out) 데이터 관리 방식을 따름니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LIFO: 마지막에 넣은 데이터를 가장 먼저 추출하는 데이터 관리 정책입니다.&lt;/li&gt;
&lt;li&gt;FILO: 처음에 넣은 데이터를 가장 마지막에 추출하는 데이터 관리 정책입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;push(), append(): 데이터를 스택에 넣는 기능입니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;pop(): 데이터를 스택에서 꺼내는 기능입니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;장점&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;구조가 단순해서, 구현이 쉽습니다.&lt;/li&gt;
&lt;li&gt;데이터 저장/읽기 속도가 빠릅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단점(일반적인 스택 구현 시)&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 최대 갯수를 미리 정해야 해서 저장공간의 낭비가 발생할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>programming/Python</category>
      <category>array</category>
      <category>PYTHON</category>
      <category>queue</category>
      <category>stack</category>
      <category>기술면접</category>
      <category>배열</category>
      <category>스택</category>
      <category>자료구조</category>
      <category>큐</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/44</guid>
      <comments>https://eunchankim-dev.tistory.com/44#entry44comment</comments>
      <pubDate>Thu, 20 May 2021 20:24:41 +0900</pubDate>
    </item>
    <item>
      <title>[Optimizer] Optimizer-경사하강법(Gradient Descent)</title>
      <link>https://eunchankim-dev.tistory.com/43</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;경사 하강 학습법은 최적화 이론의 한 방법입니다. 최적화 이론은 어떤 함수가 있을 때 함수의 출력이 최적의 값을 찾아내는 이론을 말합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그중에서도 딥러닝에서는 경사 하강법을 많이 사용하는데요 학습한 부분들을 정리하며 포스팅해보겠습니다. 수정해야 할 부분이 있으시면 댓글로 달아주시면 감사하겠습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;경사 하강법(Gradient Descent)&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;444&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVVAZa/btq5f3LDAaH/0gxCforsxWGonAkpZXJjrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVVAZa/btq5f3LDAaH/0gxCforsxWGonAkpZXJjrk/img.png&quot; data-alt=&quot;경사 하강법의 Step&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVVAZa/btq5f3LDAaH/0gxCforsxWGonAkpZXJjrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVVAZa%2Fbtq5f3LDAaH%2F0gxCforsxWGonAkpZXJjrk%2Fimg.png&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;444&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;경사 하강법의 Step&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 $f(x)$에서 경사를 따라 여러번의 스텝(step)을 통해 최적점(최솟값)으로 다가가는 것을 경사 하강법이라고 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경사는 기울기(미분, Gradient)를 이용해 계산합니다.&lt;b&gt;&lt;b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;경사 하강법(Gradient Descent)의 학습률(Learning rate)&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;500&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/deTghz/btq5f3ERTgJ/geGNnAskr1bH3MtYjgGOY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/deTghz/btq5f3ERTgJ/geGNnAskr1bH3MtYjgGOY0/img.png&quot; data-alt=&quot;적절한 학습률(Learning rate)을 선택하지 못하는 경우&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/deTghz/btq5f3ERTgJ/geGNnAskr1bH3MtYjgGOY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdeTghz%2Fbtq5f3ERTgJ%2FgeGNnAskr1bH3MtYjgGOY0%2Fimg.png&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;500&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;적절한 학습률(Learning rate)을 선택하지 못하는 경우&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경사하강법에서 학습률(Learning rate)을 값을 지정해야 해야 합니다.(Step size라고 부르기도 합니다)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 수식에서는 $a$가 학습률입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학습률(Learning rate)이 큰 경우 한 번 이동하는 거리가 커지므로 빠르게 수렴할 수 있다는 장점이 있습니다. 하지만, 학습률(Learning rate)을 너무 크게 설정해버리면 최솟값을 계산하도록 수렴하지 못하고 함숫값이 계속 커지는 방향으로 최적화가 진행될 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또, 한편 학습률(Learning rate)이 너무 작은 경우 발산하지는 않을 수 있지만 최적의 값을 구하는데 소요되는 시간이 오래 걸린다는 단점이 있습니다. 즉 경사하강법(Gradient Descent)에는 적절한 학습률(Learning rate)를 찾는 것이 중요합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt;경사 하강법(Gradient Descent)의 사용 이유&lt;/b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 분석에서 맞딱드리게 되는 함수들은 닫힌 형태(closed form)가 아니거나 함수의 형태가 복잡해 (가령, 비선형함수) 미분계수와 그 근을 계산하기 어려운 경우가 많고, 실제 미분계수를 계산하는 과정을 컴퓨터로 구현하는 것에 비해 경사 하강법(Gradient Descent)은 컴퓨터로 비교적 쉽게 구현할 수 있기 때문입니다.&lt;/li&gt;
&lt;li&gt;데이터 양이 매우 큰 경우 경사하강법(Gradient Descent)과 같은 iterative 한 방법을 통해 해를 구하면 계산량 측면에서 더 효율적으로 해를 구할 수 있습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt;경사 하강법(Gradient Descent)의 문제점&lt;/b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Local&amp;nbsp;Minimum&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;407&quot; height=&quot;252&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;624&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSQVWu/btq5bd3f6Ia/14wgpiCxK71j9tlkskpBpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSQVWu/btq5bd3f6Ia/14wgpiCxK71j9tlkskpBpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSQVWu/btq5bd3f6Ia/14wgpiCxK71j9tlkskpBpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSQVWu%2Fbtq5bd3f6Ia%2F14wgpiCxK71j9tlkskpBpk%2Fimg.png&quot; width=&quot;407&quot; height=&quot;252&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;624&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;경사하강법(Gradient Descent) 알고리즘을 시작하는 위치는 매번 랜덤 하기 때문에 어떤 경우에는 Local Minimun에 빠져 계속 헤어 나오지 못하는 경우가 생깁니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Saddle Point&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;434&quot; height=&quot;314&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;708&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PmRDK/btq5hjAsXD8/RJNBJ070VYatQJR5SKhJs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PmRDK/btq5hjAsXD8/RJNBJ070VYatQJR5SKhJs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PmRDK/btq5hjAsXD8/RJNBJ070VYatQJR5SKhJs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPmRDK%2Fbtq5hjAsXD8%2FRJNBJ070VYatQJR5SKhJs1%2Fimg.png&quot; width=&quot;434&quot; height=&quot;314&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;708&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #202122;&quot;&gt;&lt;b&gt;안장점&lt;/b&gt;&lt;span style=&quot;color: #202122;&quot;&gt;(S&lt;/span&gt;&lt;span style=&quot;color: #202122;&quot;&gt;addle Point&lt;/span&gt;&lt;span style=&quot;color: #202122;&quot;&gt;)은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;다변수 실함수&lt;span style=&quot;color: #202122;&quot;&gt;의 변역에서, 어느 방향에서 보면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;극대값&lt;span style=&quot;color: #202122;&quot;&gt;이지만 다른 방향에서 보면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;극소값&lt;span style=&quot;color: #202122;&quot;&gt;이 되는 점입니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #202122;&quot;&gt;&lt;span style=&quot;color: #202122;&quot;&gt;즉&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #202122;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;접평면&lt;span style=&quot;color: #202122;&quot;&gt;이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;수평&lt;span style=&quot;color: #202122;&quot;&gt;이 되는 점입니다. 안장점에서는 기울기가 0이기 때문에 더 이상 움직일 수 없습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;SGD(Stochastic&lt;span&gt;&amp;nbsp;&lt;/span&gt;Gradient Descent)&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;734&quot; width=&quot;372&quot; height=&quot;300&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oxmJt/btq5fUVDxT1/Vpe7TcRCInOJ9Ach4PSXok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oxmJt/btq5fUVDxT1/Vpe7TcRCInOJ9Ach4PSXok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oxmJt/btq5fUVDxT1/Vpe7TcRCInOJ9Ach4PSXok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoxmJt%2Fbtq5fUVDxT1%2FVpe7TcRCInOJ9Ach4PSXok%2Fimg.png&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;734&quot; width=&quot;372&quot; height=&quot;300&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Gradient Descent&lt;/b&gt; 방식에는 크나큰 단점이 있습니다. 최적점을 찾아 나가기 위해서 한 칸 전진할 때마다 모든 데이터 셋을 넣어주어야 하기 때문에 학습이 굉장히 오래 걸리는 비효율적인 문제가 발생합니다. 그래서 나온 것이&amp;nbsp;&lt;b&gt;Stochastic Gradient Descent입니다.&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Stochastic Gradient Descent&lt;/b&gt;는 기존의 &lt;b&gt;Gradient Descent&lt;/b&gt;와는 다르게 Mini-batch로 분할해 빠르게 전진하는 방법입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Momentum&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2124&quot; data-origin-height=&quot;702&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kxxFE/btq5j7sVDtm/Kw2nUEtegbUctmwmYpMdW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kxxFE/btq5j7sVDtm/Kw2nUEtegbUctmwmYpMdW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kxxFE/btq5j7sVDtm/Kw2nUEtegbUctmwmYpMdW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkxxFE%2Fbtq5j7sVDtm%2FKw2nUEtegbUctmwmYpMdW0%2Fimg.png&quot; data-origin-width=&quot;2124&quot; data-origin-height=&quot;702&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;돌이 굴러 떨어지듯, 이동 벡터를 이용해 이전 기울기에 영향을 받도록 하는 방법입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;관성을 이용하면 Local Minimum에 대처할 수 있습니다&lt;/li&gt;
&lt;li&gt;이동 벡터(Vt)를 추가로 이용하므로, 경사 하강법에 비해 2배의 메모리를 사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;AdaGrad (Adaptive Gradient)&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczaH4k%2FbtqDc5bVG54%2FtNZGoCz9NO4js374QKwsyK%2Fimg.png&quot; width=&quot;290&quot; height=&quot;162&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;440&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qAXIm/btq5fmx2CJy/3sqGOj561xMeIs68vXoKu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qAXIm/btq5fmx2CJy/3sqGOj561xMeIs68vXoKu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qAXIm/btq5fmx2CJy/3sqGOj561xMeIs68vXoKu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczaH4k%2FbtqDc5bVG54%2FtNZGoCz9NO4js374QKwsyK%2Fimg.png&quot; width=&quot;290&quot; height=&quot;162&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;440&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 변수별로 학습률이 달라지게 조절하는 알고리즘입니다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Element-wise 제곱으로 gt가 커져서 학습이 많이 된 변수는 학습률을 감소시키고, 그렇지 못한 변수들이 학습될 수 있도록 합니다.&lt;/li&gt;
&lt;li&gt;gt가 계속해서 커지고 한 번 커지면 줄어들지 않기 때문에, 학습이 오래 진행되면 더 이상 학습이 이루어지지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Optimizer 계보&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1342&quot; data-origin-height=&quot;692&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v9Irp/btq5dtLgoUz/wecWWaYMI8tojoMcO52cYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v9Irp/btq5dtLgoUz/wecWWaYMI8tojoMcO52cYK/img.png&quot; data-alt=&quot;출처 : https://seamless.tistory.com/38&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v9Irp/btq5dtLgoUz/wecWWaYMI8tojoMcO52cYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv9Irp%2Fbtq5dtLgoUz%2FwecWWaYMI8tojoMcO52cYK%2Fimg.png&quot; data-origin-width=&quot;1342&quot; data-origin-height=&quot;692&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : https://seamless.tistory.com/38&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Artificial Intelligence/Deep learning</category>
      <category>dl</category>
      <category>GD</category>
      <category>Gradient descent</category>
      <category>ML</category>
      <category>optimizer</category>
      <category>sgd</category>
      <category>경사하강법</category>
      <category>딥러닝</category>
      <category>옵티마이져</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/43</guid>
      <comments>https://eunchankim-dev.tistory.com/43#entry43comment</comments>
      <pubDate>Wed, 19 May 2021 14:34:30 +0900</pubDate>
    </item>
    <item>
      <title>[CNN]Convolutional Neural Networks(CNN)</title>
      <link>https://eunchankim-dev.tistory.com/42</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이번에는 computer vision에서 가장 기본이 되는 CNN에 대해서 포스팅을 하려고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;CNN의 등장&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Convolutional Neural Networks(CNN)은 Deep Neural Networks에서 기존의 이미지나 영상 데이터를 처리할 때 발생하는 문제점들을 보안한 방법입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기존의 이미지 영상처리 방법은 2차원 이미지(채널 포함 시 3차원)를 1차원 배열로 변환한 다음에 FNN (Fully- connected multi layered Neural Network) 신경망으로 학습시키는 방법입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; FNN은 벡터 형태로 표현된 데이터를 입력 받기 때문에 이미지를 반드시 벡터화해야 하는데, 이미지를 벡터화하게 되면 인접 픽셀간의 상관관계가 무시됩니다. 일반적으로 이미지 데이터는 인접한 픽셀 간의 상관관계가 매우 높기 때문에 이미지를 백터화 화는 과정에서 정보 손실이 발생할 수밖에 없습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;589&quot; data-origin-height=&quot;522&quot; width=&quot;471&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ty5K2/btq4t4YHX4g/IGpXKCVi9XKvNiOI0eyR20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ty5K2/btq4t4YHX4g/IGpXKCVi9XKvNiOI0eyR20/img.png&quot; data-alt=&quot;eye에 영향을 미치는 픽샐은 8칸인데 모두 인접하게 모여있습니다&amp;amp;amp;nbsp;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ty5K2/btq4t4YHX4g/IGpXKCVi9XKvNiOI0eyR20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTy5K2%2Fbtq4t4YHX4g%2FIGpXKCVi9XKvNiOI0eyR20%2Fimg.png&quot; data-origin-width=&quot;589&quot; data-origin-height=&quot;522&quot; width=&quot;471&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;eye에 영향을 미치는 픽샐은 8칸인데 모두 인접하게 모여있습니다&amp;nbsp;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;6&quot; width=&quot;860&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FResw/btq4uInSDNK/J9LRYKVuGIUGhpYLofQc51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FResw/btq4uInSDNK/J9LRYKVuGIUGhpYLofQc51/img.png&quot; data-alt=&quot;이미지를 1차원으로 바꾸게 될 경우&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FResw/btq4uInSDNK/J9LRYKVuGIUGhpYLofQc51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFResw%2Fbtq4uInSDNK%2FJ9LRYKVuGIUGhpYLofQc51%2Fimg.png&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;6&quot; width=&quot;860&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지를 1차원으로 바꾸게 될 경우&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위와 같이 FNN문제점을 극복하기위해 만들어진 방법이 CNN입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;CNN은 이미지의 형태(2차원)를 보존하도록 행렬 형태의 데이터를 입력받기 때문에 이미지를 백터화 하는 과정에서 발생하는 정보 손실을 방지할 수 있습니다.&amp;nbsp; 즉 CNN의 기본 개념은 &quot;행렬로 표현된 필터의 각 요소가 데이터 처리에 적합하도록 자동으로 학습되게 하자&quot;입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;CNN(Convolutional Neural Networks)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;CNN은 Convolutional&amp;nbsp;Layer를 통해서 입력 받은 이미지에 대한&amp;nbsp;특징(Feature)을 추출하고, 이를 기반으로 기존의 전연결된 뉴럴 네트워크를 이용해&amp;nbsp;분류를 하는 원리입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;270&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bi0Uca/btq4qFFD6ee/VkbxnE0NpDDlgx96NMV4D1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bi0Uca/btq4qFFD6ee/VkbxnE0NpDDlgx96NMV4D1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bi0Uca/btq4qFFD6ee/VkbxnE0NpDDlgx96NMV4D1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbi0Uca%2Fbtq4qFFD6ee%2FVkbxnE0NpDDlgx96NMV4D1%2Fimg.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;270&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Convolutional &lt;/b&gt;&lt;b&gt;Layer&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Convolutional&amp;nbsp;Layer는 입력 데이터로부터 특징을 추출하는 역할을 합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;특징을 추출하는 기능의&amp;nbsp;필터(Filter)와 그 값을 비선형 값으로 바꾸어주는&amp;nbsp;활성화함수(Activation Function)로 구성됩니다.&lt;br /&gt;&lt;br /&gt;활성화 함수를 사용하는 이유는 활성화된 특징만을 다음 계층으로 전달하기 위함입니다. 일반적으로 많이 사용하는 활성화 함수&quot;ReLU&quot;는 음수 값을 0에 매핑하고 양수 값을 유지하여 더 빠르고 효과적인 학습을 가능하게 하는 특징을 가지므로 많이 사용됩니다.&lt;br /&gt;&lt;br /&gt;Convolutional&amp;nbsp;Layer에 유입되는 입력 데이터에는 한 개 이상의 필터가 적용됩니다.&lt;br /&gt;또한 1개의 필터는 Feature Map의 채널이 됩니다. 다시 말해 Convolutional Layer에 n개의 필터가 적용된다면 출력 데이터는 n개의 채널을 갖습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 id=&quot;filter--stride&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Filter&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;필터는 이미지의 특징을 찾아내기 위한 공용 파라미터입니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Filter를 kernel 또는 mask라고 하기도 합니다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;필터는 일반적으로 3,3 또는 5,5와 같은 홀수 정방 행렬로 정의됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;필터는 입력 데이터를 지정된 간격(Stride)으로 순회하며 채널별로 합성곱을 하고 모든 채널의 합성곱의 합을 Feature Map로 만듭니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래 그림은 채널이 1개인 입력 데이터를 3x3 크기의 필터로 합성곱하는 과정을 설명합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;stride가 1로 설정되었기 때문에 필터가 1칸씩 이동하면서 합성곱을 계산합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;265&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQmVBQ/btq4tAp6AfS/2jSqmikh20aQGRaLkioV7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQmVBQ/btq4tAp6AfS/2jSqmikh20aQGRaLkioV7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQmVBQ/btq4tAp6AfS/2jSqmikh20aQGRaLkioV7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQmVBQ%2Fbtq4tAp6AfS%2F2jSqmikh20aQGRaLkioV7k%2Fimg.png&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;265&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;필터는 입력 데이터의 각 채널을 순회하며 합성곱을 계산한 후 채널별 Feature Map을 만들고 그 Feature Map을 합산하여 최종적으로 반환합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Feature Map에서 Activation Function을 적용한 결과를 Activation Map이라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;즉 Convolution Layer의 최종 출력 결과는&amp;nbsp;Activation Map입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 id=&quot;1-4-패딩-padding&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Padding&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Convolution Layer에서 Filter와 Stride에 작용으로 Feature Map 크기는 입력 데이터보다 작아집니다. Convolution Layer의 출력 데이터가 줄어드는 것을 방지하는 방법이 패딩입니다. 패딩은 입력 데이터의 외각에 지정된 픽셀만큼 특정 값으로 채워 넣는 것을 의미합니다. 보통 패딩 값으로 0으로 채워 넣습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;303&quot; data-origin-height=&quot;272&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbgFll/btq4rHiHclP/JLKmlRviAZkAKyFGDAceJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbgFll/btq4rHiHclP/JLKmlRviAZkAKyFGDAceJ1/img.png&quot; data-alt=&quot;0으로 채운 패딩&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbgFll/btq4rHiHclP/JLKmlRviAZkAKyFGDAceJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbgFll%2Fbtq4rHiHclP%2FJLKmlRviAZkAKyFGDAceJ1%2Fimg.png&quot; data-origin-width=&quot;303&quot; data-origin-height=&quot;272&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;0으로 채운 패딩&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 id=&quot;1-5-pooling-레이어&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Pooling&amp;nbsp;&lt;/b&gt;&lt;b&gt;Layer&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Pooling&amp;nbsp;Layer에서는 Convolution Layer의 출력 데이터를 입력으로 받아서 출력 데이터(Activation Map)중에서 필요한 특징들만 추려서 사용하는데&amp;nbsp;이방법을 Pooling 또는&amp;nbsp;sub sampling이라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Pooling의 대표적인 방법으로는 Max pooling, Average pooling, Min Pooling등이 있는데, 이 중 Max pooling 이 많이 사용됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Pooling 레이어는 Convolution 레이어와 비교하여 다음과 같은 특징이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;학습대상 파라미터가 없음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Pooling 레이어를 통과하면 행렬의 크기 감소&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Pooling 레이어를 통해서 채널 수 변경 없음&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위의 Feature Learning 과정이 끝난 후에는 한층에 모든 픽셀을 다 검사 하는 FC(Fully Connected) Neural Network를 통해서 Output을 출력하게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Artificial Intelligence/Deep learning</category>
      <category>CNN</category>
      <category>CNN기초</category>
      <category>computer vision</category>
      <category>Convolutional</category>
      <category>Convolutional Neural Networks</category>
      <category>dl</category>
      <category>FC(Fully Connected) Neural Network</category>
      <category>padding</category>
      <category>pooling</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/42</guid>
      <comments>https://eunchankim-dev.tistory.com/42#entry42comment</comments>
      <pubDate>Mon, 10 May 2021 02:11:57 +0900</pubDate>
    </item>
    <item>
      <title>[자료구조]Hash, Hashing, Hash Table</title>
      <link>https://eunchankim-dev.tistory.com/41</link>
      <description>&lt;h2 id=&quot;자료구조data-structure는-데이터들의-모임-관계-함수-명령-등의-집합을-의미한다&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;자료구조(Data-Structure)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;처리하고자 하는 데이터의 효율적인 접근 및 조작을 가능하게 해주는 저장 및 관리방식입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;도서관의 책들이 잘 정리되어 있으면 우리는 우리가 원하는 책을 쉽게 찾을 수 있습니다. 하지만 뒤죽박죽 되어 있는 책들 중에 우리가 원하는 책을 찾으려면 시간이 꽤 오래 걸립니다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;자료구조도 이와 같습니다. 자료구조를 잘 선택하면 사용하는 메모리를 최소화할 수 있으며 시, 공간적으로 효율성을 확보할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오늘은 Hash Table 자료구조에 대해 포스팅 하겠습니다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;해시 테이블(Hash Table)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해시 테이블은 해시 함수를 이용해서 key를 고정된 크기의 값으로 변환한 후&amp;nbsp;해시 함수 결과 값을 인덱스에 key - value를 저장하는 방법입니다. 기본 연산으로는 탐색(Search), 삽입(Insert), 삭제(Delete)가 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;시간복잡도는 일반적인 경우(충돌이 없는 경우) O(1) 이고 최악의 경우(모든 경우에 충돌이 발생하는 경우) O(n) 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;i&gt;해시 테이블의 구조 &lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;657&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd4Rci/btq4biqT1ho/QFyMJjBkS1QnskrXLe8uh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd4Rci/btq4biqT1ho/QFyMJjBkS1QnskrXLe8uh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd4Rci/btq4biqT1ho/QFyMJjBkS1QnskrXLe8uh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd4Rci%2Fbtq4biqT1ho%2FQFyMJjBkS1QnskrXLe8uh1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;657&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;키(key) : 고유한 값이며 해시함수의 input값입니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해시 함수(Hash function) :&amp;nbsp; 데이터의 효율적인 관리를 목적으로 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수입니다. 서로 다른 키(key)가 같은 해시(hash)가 되는 경우를 해시 충돌(Hash Collision)이라고 하는데, 해시 충돌을 최대한 줄이는 함수를 만드는 것이 중요합니다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해시함수의 종류&amp;nbsp;: MD1, MD4, MD5, SHS, SHA-1, HAS-160 등이 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해시(Hash) : 해시 함수(Hash Function)의 output값입니다. 저장소(bucket, slot)에서 값(value)과 매칭 되어 저장됩니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;값(Value) : 저장소(bucket, slot)에 최종적으로 저장되는 값으로 키와 매칭되어 저장, 삭제, 검색, 접근이 가능합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;collision-resolution&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;충돌해결 - 해시 테이블의 구조 개선&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 id=&quot;chaining&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Chaining&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh6MQZ/btq4db4XVcj/7ZAIHpj454nxOxwhK3W3qK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh6MQZ/btq4db4XVcj/7ZAIHpj454nxOxwhK3W3qK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh6MQZ/btq4db4XVcj/7ZAIHpj454nxOxwhK3W3qK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh6MQZ%2Fbtq4db4XVcj%2F7ZAIHpj454nxOxwhK3W3qK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;체이닝이란 충돌이 발생했을 때 이를 동일한 버킷(Bucket)에 저장하는데 이를 연결 리스트 형태로 저장하는 방법을 말합니다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위 그림을 보면&amp;nbsp;John Smith&amp;nbsp;와&amp;nbsp;Sandra Dee&amp;nbsp;의 인덱스가&amp;nbsp;152&amp;nbsp;로 충돌이 일어났을때&amp;nbsp;Sandra Dee&amp;nbsp;를&amp;nbsp;John Smith&amp;nbsp;뒤에 연결함으로써 충돌을 처리하는 것을 말합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;open-addressing&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Open Addressing&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/co8BOg/btq4bZc6ICy/4lOJDrIy8EYkHvhPbdO2Hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/co8BOg/btq4bZc6ICy/4lOJDrIy8EYkHvhPbdO2Hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/co8BOg/btq4bZc6ICy/4lOJDrIy8EYkHvhPbdO2Hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fco8BOg%2Fbtq4bZc6ICy%2F4lOJDrIy8EYkHvhPbdO2Hk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해시함수로 얻은 해시값에 따라서 데이터와 키값을 저장하지만 동일한 주소에 다른 데이터가 있을 경우 다른 주소도 이용할 수 있게 하는 기법입니다. Open Addressing을 사용할 경우&amp;nbsp;해시테이블은 1개의 해시와 1개의 값(value)가 매칭되어 있는 형태로 유지됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위 그림을 보면&amp;nbsp;John Smith&amp;nbsp;와&amp;nbsp;Sandra Dee&amp;nbsp;의 인덱스가&amp;nbsp;152&amp;nbsp;로 충돌이 일어났을때&amp;nbsp;Sandra Dee 153에 저장함으로써 충돌을 해결합니다. 충돌이 일어났을 때 비어있는 해시를 찾는 과정은 다동일해야합니다. 비어 있는 해시를 찾는 규칙은 다음과 같습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;선형 탐색(Linear Probing) : n개의 해시를 건너뛰어 비어있는 해시에 데이터를 저장합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;제곱 탐색(Quadratic Probing) : 충돌이 일어난 해시의 제곱을 한 해시에 데이터를 저장합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이중 해시(Double Hashing) : 다른 해시함수를 한 번 더 적용한 해시에 데이터를 저장합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>programming/Python</category>
      <category>hash</category>
      <category>Hash Table</category>
      <category>PYTHON</category>
      <category>자료구조</category>
      <category>해시</category>
      <category>해시테이블</category>
      <category>해시함수</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/41</guid>
      <comments>https://eunchankim-dev.tistory.com/41#entry41comment</comments>
      <pubDate>Wed, 5 May 2021 17:40:38 +0900</pubDate>
    </item>
    <item>
      <title>[논문 리뷰] StarGAN: Unified Generative Adversarial Networks for Multi-Domain Image-to-Image Translation</title>
      <link>https://eunchankim-dev.tistory.com/40</link>
      <description>&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이번에는 CVPR 2018 에서 발표된 논문인 StarGAN을 리뷰하고자 합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;처음 시도하는 논문 리뷰이다 보니 부족한 점이 많습니다 수정할 부분이 있으시면 알려주시면 수정하겠습니다.!&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;용어 정리&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;attribute&lt;/b&gt;&lt;/i&gt;&lt;i&gt;:&lt;/i&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;이미지에 있는 의미있는 특징들을 말합니다. 예를 들어 성별, 나이, 헤어 컬러가 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;attribute value&lt;/b&gt;&amp;nbsp;:&lt;/i&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; attribute의 값을 말합니다. 예를 들어 헤어컬러일경우에 흑발/금발/갈색 입니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;domain&lt;/b&gt;&amp;nbsp;:&amp;nbsp;&lt;/i&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;같은 attribute value를 공유하는 이미지들의 집합을 말합니다. 예를 들면 여성의 이미지들은 하나의 domain을 구성하고 남성의 이미지들은 또 다른 domain을 구성합니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;StarGAN&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;최근의 image-to-image translation은 2개 이상의 도메인을 다루는 데에 scalability와 robustness 제한해왔는데, 이는 서로 다른 모델들이 각 이미지 도메인 쌍에 독립적으로 만들어졌기 때문이다. &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;이 한계점을 극복하기 위해 StarGAN을 제안합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;&lt;b&gt;StarGAN&lt;/b&gt;은 image-to-image translations을 scalable한 접근으로,&amp;nbsp;단 하나의 모델을 사용하여 여러가지 도메인에 대해 image-to-image&amp;nbsp;translation을 할 수 있습니다. 이러한 StarGAN의 특징은 하나의 네트워크 안에서 다양한 도메인의 데이터셋을 동시에 학습시킴으로써 기존의 모델에 비해 기본적으로 많은 데이터를 학습합니다. 이러한 특징 때문에 기존의 모델에 들에 비해서 높은 성능을 만들어냅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RKMmp/btq309T5faD/XmxRGkHDTjp2O9WpTOHNx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RKMmp/btq309T5faD/XmxRGkHDTjp2O9WpTOHNx1/img.png&quot; data-alt=&quot;&amp;amp;amp;nbsp;위의 사진들은 Celeb A 의 데이터셋을 Multi-domain image-to-image translation한 결과입니다 모든 input은 Celeb A dataset 이지만 우측의 input에 적용 된 attribute는 Celeb A 가 아닌 RaFD dataset 으로부터 학습 된 것입니다. 즉, single generator network로 여러개의 domain을 가진 dataset을 학습한 것을 보여줍니다. 또한 한 domain의 dataset에서 학습 된 attribute를 다른 data set에 적용 시킬 수 있습니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RKMmp/btq309T5faD/XmxRGkHDTjp2O9WpTOHNx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRKMmp%2Fbtq309T5faD%2FXmxRGkHDTjp2O9WpTOHNx1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;nbsp;위의 사진들은 Celeb A 의 데이터셋을 Multi-domain image-to-image translation한 결과입니다 모든 input은 Celeb A dataset 이지만 우측의 input에 적용 된 attribute는 Celeb A 가 아닌 RaFD dataset 으로부터 학습 된 것입니다. 즉, single generator network로 여러개의 domain을 가진 dataset을 학습한 것을 보여줍니다. 또한 한 domain의 dataset에서 학습 된 attribute를 다른 data set에 적용 시킬 수 있습니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Image-to-Image translation(I2I)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;주어진 이미지의 특정 부분을 다른 이미지로 변경하는 것을 말합니다. 예를 들면, 머리카락의 색깔을 검은색에서 갈색으로 바꾸는 것등이 있습니다. 예를 들어 무표정인 사람의 모습을 웃는 모습으로 바꾼다거나 혹은 머리카락의 색깔을 바꾸는 등 다양한 특징을 가지게 변환하는 작업을 &lt;b&gt;Image-to-Image translation &lt;/b&gt;라고 합니다. 대표적인 예로는 Cycle-GAN이 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Cross-domain models 와 StarGAN&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기존 모델(CycleGAN, DiscoGAN, pix2pix, cGAN)에서는 한 개의 특징만을 학습해서 변환하는 방법을 제시합니다. 이런 환경에서 다양한 도메인으로 변환하려면 도메인 K당 K(K-1) 개의 네트워크가 필요하기 때문에 비효율적입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxxsR1/btq3XaMNcBH/tBuT4CWcKvCk8ckzGEzmhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxxsR1/btq3XaMNcBH/tBuT4CWcKvCk8ckzGEzmhk/img.png&quot; data-alt=&quot;크로스 도메인 모델과 StarGAN의 아키텍처&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxxsR1/btq3XaMNcBH/tBuT4CWcKvCk8ckzGEzmhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxxsR1%2Fbtq3XaMNcBH%2FtBuT4CWcKvCk8ckzGEzmhk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;크로스 도메인 모델과 StarGAN의 아키텍처&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Croos-domain models : 다른 도메인들 사이에서 이미지를 translation 시키기 위해서는 4*(4-1) = 12개의 네트워크가 필요합니다.또한,&amp;nbsp; 각 데이터셋이 부분적으로 라벨링 되어 있기 때문에, jointly training이 불가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;StarGAN : 다중 도메인에서의 학습 데이터를 얻고, 단일&amp;nbsp; generator(G)로 모든 가능한 도메인 사이의 맵핑을 학습합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Star Generative Adversarial Networks&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;StarGAN을 설명하고 이 모델이 어떻게 다양한 데이터셋을 통합하여 유연하게 image translation을 했는지에 대해 다룹니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Mutli-Domain Image-to-Image Translation&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1eMfE/btq3VidK9SS/FOrafgiU6ySra5J0ihuRn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1eMfE/btq3VidK9SS/FOrafgiU6ySra5J0ihuRn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1eMfE/btq3VidK9SS/FOrafgiU6ySra5J0ihuRn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1eMfE%2Fbtq3VidK9SS%2FFOrafgiU6ySra5J0ihuRn1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(a) D : Real Image 와 Fake Image를 구별합니다. 동시에 Real Image 일 때 그것과 상응하는 domain을 분류해내는 것을 학습합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(b) G : Input으로 image와 Target domain label을 받고 Fake image를 생성합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(c) G : Original domain label을 가지고 Fake Image를 다시 Original Image로 복원합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(d) D : Real Image와 구분할 수 없고 D에 의해 Target domain으로 분류 가능한 이미지를 생성하려고 합니다. &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Adversarial&amp;nbsp;Loss&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;만들어진 이미지가 진짜 이미지와 구분되지 않도록 만들기 위해, original GAN과 마찬가지로 Adversarial loss를 이용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/es4rco/btq3VPa5Cng/EpCFeQrUfR6HKtbphxM5Wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/es4rco/btq3VPa5Cng/EpCFeQrUfR6HKtbphxM5Wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/es4rco/btq3VPa5Cng/EpCFeQrUfR6HKtbphxM5Wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fes4rco%2Fbtq3VPa5Cng%2FEpCFeQrUfR6HKtbphxM5Wk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;D_src(x)&lt;/i&gt; : Discriminator가 이미지를 진짜인지 가짜인지 판별하는 것입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;G : loss 함수를 최소화 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;D : loss 함수를 최대화합니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Domain Classification Loss&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;주어진&amp;nbsp;인풋 이미지 x와 타겟 도메인 라벨 c에 대해 목표는 x를 타겟 도메인 c로 분류된 output image y로 변환하는 것입니다. 예를 들면 여성 이미지 x를 타겟 도메인 라벨 c(남성)으로 변환하는 것입니다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이러한 조건을 만족시키기 위해 auxiliary classifier를 추가하고 D와 G를 최적화하는 데 사용합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1). D(판별자)를&amp;nbsp;최적화하기 위해 사용한 Real Image의 domain classification loss&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d1AkXG/btq31aZRCft/I4cwigOTsXXJZnHt8HIuO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d1AkXG/btq31aZRCft/I4cwigOTsXXJZnHt8HIuO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d1AkXG/btq31aZRCft/I4cwigOTsXXJZnHt8HIuO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd1AkXG%2Fbtq31aZRCft%2FI4cwigOTsXXJZnHt8HIuO0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Dcls(c'|x)는 real image x가 주어졌을 때 D 가 계산해낸 domain label c'일 확률분포입니다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2). G(생성자)를&amp;nbsp;최적화하기 위해 사용한 Fake Image의 domain classification loss&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYqZN0/btq354rgrE2/Thm6c6yAmhmHblEXkE0wK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYqZN0/btq354rgrE2/Thm6c6yAmhmHblEXkE0wK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYqZN0/btq354rgrE2/Thm6c6yAmhmHblEXkE0wK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYqZN0%2Fbtq354rgrE2%2FThm6c6yAmhmHblEXkE0wK0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;G는 target domain c로 분류될 수 있는 이미지를 생성하도록 이 Loss를 최소화하려고 합니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Reconstruction&amp;nbsp;Loss&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여기서 한 가지 Loss를 더 추가하게 됩니다. 왜냐하면 위에서 소개한 Loss 들 만으로는 input image의 &amp;nbsp;target domain에 관련된 부분만을 변화시킬 때 input image의 본래 형태를 잘 보존할 수 없기 때문입니다.. 그래서 Generator에 한 가지&amp;nbsp; loss를 더 적용하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuY8Bz/btq34fs40Kf/UZHYgDXUvuYYeFdr9iGIuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuY8Bz/btq34fs40Kf/UZHYgDXUvuYYeFdr9iGIuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuY8Bz/btq34fs40Kf/UZHYgDXUvuYYeFdr9iGIuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuY8Bz%2Fbtq34fs40Kf%2FUZHYgDXUvuYYeFdr9iGIuk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;G는 변환된 image G(x,c)와 original doamin label c'을 input으로 받고 original image x 를 복원합니다. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;L1 norm으로 계산을 하게 됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Full&amp;nbsp;Objective&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;G와 D에 대한 Objective fucntion입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z9AYZ/btq3YL0pWCb/d0WCLCKLkj99lW5Q5YAtZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z9AYZ/btq3YL0pWCb/d0WCLCKLkj99lW5Q5YAtZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z9AYZ/btq3YL0pWCb/d0WCLCKLkj99lW5Q5YAtZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz9AYZ%2Fbtq3YL0pWCb%2Fd0WCLCKLkj99lW5Q5YAtZK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;lambda;cls와 &amp;lambda;rec는 hyperparameter로, domain 분류와 reconstruction loss들 의 상대적인 중요도를 컨트롤합니다. &lt;/b&gt;&lt;b&gt;각각 1과 10을 사용합니다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;Training with&amp;nbsp;Multiplel Datasets&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;StarGAN의 중요한 이점은, 다른 domain을 가진 datasets들을 동시에 포함하는 것입니다. 그러나 다수의 dataset들을 학습할 때의 문제는&amp;nbsp; label 정보가 각 dataset에 부분적으로만 있다는 것입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;예를 들어 Celeb A와 RaFD의 경우에, Celeb A는 hair color와&amp;nbsp; gender에 대한 attribute만을 가지고&amp;nbsp; facial expression을 나타내는 happy와 angry 같은 attribute는 가지지 않는다는 것입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이것이 문제가 되는 이유는 변환된 image G(x,c)에서 input image x를 reconstruction 하려면 label vector c'에 완전한 정보가 있어야 하기 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Mask&amp;nbsp;Vector&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위와 같은 문제를 해결하기 위해서 mask vector m을 해결방안으로 소개합니다. 이것은 StarGAN이 명시되지 않은 label에 대해서는 무시하게 하고 명시된 label에 대해서는 집중하게 합니다. 여기서 n차원의 one-hot vector를 사용합니다. (n은 dataset의 수)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xf1Ze/btq32yT2sFW/LbGr8kZp9aZmzkBtL6m4F0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xf1Ze/btq32yT2sFW/LbGr8kZp9aZmzkBtL6m4F0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xf1Ze/btq32yT2sFW/LbGr8kZp9aZmzkBtL6m4F0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxf1Ze%2Fbtq32yT2sFW%2FLbGr8kZp9aZmzkBtL6m4F0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ci는 i번째의 dataset의 label들의 vector를 나타냅니다. 또한 ci는 binary attribute를 가진 binary vector 또는 categorical attribute를 가진 one-hot vector입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여기서 dataset은 Celeb A와 RaFD이기 때문에 n은 2가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;mask vector에 어떤 dataset 인지를 명시해 줌으로써 , 해당 dataset의 attribute에 관련된 label에 집중을 한다는 것입니다. 예를 들면 CelebA를 학습시키려고 명시해 주었다면 RaFD에 관련된 facial expression 들은 무시하고 학습하는 것을 말합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;CelebA와 RaFD를 교차시킴으로써 D(판별자)는 두 dataset에서 차이를 구분 짓는 모든 feature들을 학습하게 되고, G(생성자)는 모든 label을 컨트롤하는 것을 학습하게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvBhmt/btq3YUwxotc/24WUMnxKyjgAZzbD5fOpl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvBhmt/btq3YUwxotc/24WUMnxKyjgAZzbD5fOpl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvBhmt/btq3YUwxotc/24WUMnxKyjgAZzbD5fOpl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvBhmt%2Fbtq3YUwxotc%2F24WUMnxKyjgAZzbD5fOpl0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Experimental Results on CelebA&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Xhgbb/btq36rGC6f1/RS3KvOHFgEv3JYTrlfvIgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Xhgbb/btq36rGC6f1/RS3KvOHFgEv3JYTrlfvIgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Xhgbb/btq36rGC6f1/RS3KvOHFgEv3JYTrlfvIgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXhgbb%2Fbtq36rGC6f1%2FRS3KvOHFgEv3JYTrlfvIgk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;실험 결과를 보면 맨 왼쪽의 이미지가 네트워크의 입력값, 오른쪽으로 나열된 이미지가 출력 결과입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;단일 Generator와 Discriminator를 사용하는 다중 도메인 간의 확장 가능한 이미지 변환 모델을 제시하였습니다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Multi-task 학습 환경의 일반화 성능 분석을 통해서 비약적으로 성능을 향상했습니다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Mask vector 통해서 서로 다른 domain label set를 가진 multiple dateset를 활용할 수 있으므로 사용 가능한 모든 label을 처리할 수 있습니다. &lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Reference&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://arxiv.org/abs/1711.09020&quot;&gt;[1] StarGAN&amp;nbsp;:&amp;nbsp;Unified&amp;nbsp;Generative&amp;nbsp;Adversarial&amp;nbsp;Networks&amp;nbsp;for&amp;nbsp;Multi-Domain&amp;nbsp;Image-toImage&amp;nbsp;Translation&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=-r9M4Cj9o_8&amp;amp;t=1s&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;StarGAN - 동빈나&lt;/a&gt;&lt;/p&gt;</description>
      <category>Research</category>
      <category>AI</category>
      <category>computer vision</category>
      <category>dl</category>
      <category>GAN</category>
      <category>ML</category>
      <category>StarGAN</category>
      <category>Vision</category>
      <category>인공지능</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/40</guid>
      <comments>https://eunchankim-dev.tistory.com/40#entry40comment</comments>
      <pubDate>Mon, 3 May 2021 18:00:42 +0900</pubDate>
    </item>
    <item>
      <title>[IT용어] API란?</title>
      <link>https://eunchankim-dev.tistory.com/38</link>
      <description>&lt;p&gt;프로젝트를 진행하면서 API용어를 많이 듣고 또 많이 사용하였습니다. 정확히 알고 쓰지는 않았고 프로그램과 프로그램 사이에 연결다리를 하는 정도의 개념으로만 이해하고 있었는데 이번에는 API에 대해서 알아보겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Fdxiw/btq3JRS6XtS/KxgjP4rsFulKmFCPZnq3d1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Fdxiw/btq3JRS6XtS/KxgjP4rsFulKmFCPZnq3d1/img.png&quot; data-alt=&quot;https://www.slideshare.net/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Fdxiw/btq3JRS6XtS/KxgjP4rsFulKmFCPZnq3d1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFdxiw%2Fbtq3JRS6XtS%2FKxgjP4rsFulKmFCPZnq3d1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://www.slideshare.net/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;API&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;i&gt;API&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Application Programming Interface&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;애플리케이션 프로그래밍 인터페이스&lt;span&gt;, 응용 프로그램 프로그래밍 인터페이스)는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;응용 프로그램&lt;span&gt;에서 사용할 수 있도록,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;운영 체제&lt;span&gt;나&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;프로그래밍 언어&lt;span&gt;가 제공하는 기능을 제어할 수 있게 만든&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;인터페이스&lt;span&gt;를 뜻합니다. 주로 파일 제어, 창 제어, 화상 처리, 문자 제어 등을 위한 인터페이스를 제공합니다.&amp;nbsp; -wikipedia-&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;API는 어떠한 응용프로그램에서 데이터를 주고받기 위한 방법을 의미합니다. 어떤 특정 사이트에서 특정 데이터를 공유할 경우 어떠한 방식으로 정보를 요청해야 하는지, 그리고 어떠한 데이터를 제공받을 수 있을지에 대한 규격들을 API라고 하는 것입니다&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;인터페이스&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;i&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;인터페이스&lt;span&gt;(interface)는 컴퓨터 시스템끼리 정보를 교환하는 공유 경계를 의미합니다. 터치 스크린과 같은 일부 컴퓨터 하드웨어 장치들은 인터페이스를 통해 데이터를 송수신할 수 있으며, 마우스나 마이크론 폰과 같은 장치들은 오직 시스템에 데이터를 전송만 하는 인터페이스를 제공합니다.&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;-wikipedia-&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;인터페이스는 말 그대로 어떤 기계간의 장치끼리 정보를 교환하기 위한 수단이나, 방법을 의미합니다. 예를 들어서 우리가 집에서 TV를 켜기 위해서 리모컨을 들고 TV에 리모콘 전원 버튼을 누름으로써 TV가 켜지게 됩니다. 즉, 사전에 TV와 통신을 하기 위해서 리모컨에서는 TV에 정의된 규격에 의해 어떤 신호를 보낼 수 있도록 만들어진 장치이며, 이러한 신호를 주고받기 위한 방법을 인터페이스라고&amp;nbsp; 하는 것입니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Web API&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;웹 API는 웹 애플리케이션 개발에서 다른 서비스에 요청을 보내고 응답을 받기 위해 정의된 명세를 일컫는 단어입니다. 예를 들어 블로그 API를 이용하면 블로그에 접속하지 않고도 다른 방법으로 글을 올릴 수 있습니다. 그 외에 우체국의 우편번호 API, 구글과 네이버의 지도 API 등 유용한 API들이 많으므로, 요즘은 이런 오픈 API를 가져와 많이 이용하는 추세입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;API는 서비스나 제품을 이용하기 위해 만들어놓은 설명서와 결과물입니다. 하나의 서비스를 이용하기 위해서는 사용법을 알아야 합니다. 예를 들어 커피 자판기에 쓰여있는 사용설명서와 커피가 나오는 자판기가 있습니다. 사용설명서에는 동전을 넣고 원하는 제품의 버튼을 누르세요의 설명이 있습니다. 그리고 사용설명서의 내용대로 하면 커피가 나옵니다. 이렇게 사용자로부터 받은 명령을 시스템에 전달해서 결과를 받아서 피드백하는 역할을 하는 것이 API입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;A 프로그램이 B프로그램의 API를 호출하고 그 결과를 받아 A프로그램이 가공해서 사용자에게 보여주는 과정입니다. 쉽게 말해서 프로그램들이 서로 소통하는 것을 도와주는 매개체라고 생각하시면 될 것 같습니다. 웹 API는 API의 형태가 웹페이지 형태로 되어있는 것을 말합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;API의 활용&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;데이터 제공&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터베이스에서 데이터를 제공할 때 API를 많이 사용합니다. 보안상 프로그램이나 사용자가 데이터에 직접 요청하는 방식은 좋지 않기 때문에 중간에 API를 통해 호출하게 만들고, API는 사용자가 올바른 사용자인지 , 권한이 있는 사용자인지 확인한 후에 데이터베이스에서 데이터를 가져와서 호출한 사용자에게 전달합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;하드웨어 사용&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하드웨어를 사용할 때 많이 사용합니다. 하드웨어를 이용하기 위해서는 운영체제의 도움을 받아 사용합니다. 운영체재는 API를 제공해서 특정 명령어를 이용해서 기기 장치 등을 사용할 수 있게 도와줍니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;표준화&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;API는 표준화를 제공합니다. 사용하는 사람들이 서비스를 이용하기 위해 다양한 형태로 접근해서 사용하는데요. API가 있다면, API는 사용하는 방식을 정해서 모두가 표준화된 형태로 사용하게 합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;API의 유형&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;&lt;b&gt;Private API&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;Private API는 내부 API로, 회사 개발자가 자체 제품과 서비스를 개선하기 위해 내부적으로 발행합니다. 따라서 제삼자에게 노출되지 않습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span&gt;&lt;b&gt;Public API&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;Public API는 개방형 API로, 모두에게 공개됩니다. 누구나 제한 없이 API를 사용할 수 있는 게 특징입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt;Partner API&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;Partner API는 기업이 데이터 공유에 동의하는 특정인들만 사용할 수 있습니다. 비즈니스 관계에서 사용되는 편이며, 종종 파트너 회사 간에 소프트웨어를 통합하기 위해 사용됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>WEB</category>
      <category>API</category>
      <category>API의유형</category>
      <category>it용어</category>
      <category>웹API</category>
      <category>인터페이스</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/38</guid>
      <comments>https://eunchankim-dev.tistory.com/38#entry38comment</comments>
      <pubDate>Thu, 29 Apr 2021 00:32:49 +0900</pubDate>
    </item>
    <item>
      <title>Pair programming</title>
      <link>https://eunchankim-dev.tistory.com/37</link>
      <description>&lt;p&gt;엔코아 &lt;span&gt;영상 처리를 위한 인공지능(머신러닝/AI) SW개발자 양성 과정을 6개월간 수강하면서 정말 좋은 팀원들을 만나서 빠르게 성장할 수 있었습니다. 다양한 개발 방법론으로 프로젝트를 진행했지만 파이널 프로젝트 때 페어 프로그래밍으로 작업을 했었는데 작업의 생산성은 떨어지지만 한 번에 완성도 높은 코드가 나왔던 기억이 있어서 애자일&lt;/span&gt;&lt;span&gt;&lt;span&gt; 개발 방법론 중 하나인 페어 프로그래밍을 진행하면서 느낀 장단점에 대해서 그리고 페어 프로그래밍을 성공적으로 하려면 어떻게 하는 게 좋을지에 대해서 공유해봅니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;Pair&amp;nbsp;programming&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Pair programming은 애자일 개발 방법론 중 하나로 하나의 개발 가능한 &lt;span&gt;PC 에서 두 명의 개발자가 함께 작업하는 것을 말합니다. 네비게이터(navigator)가 전략을 제시하고 드라이버(driver)가 실제 코드를 작성하며, 이 역할을 각자 번갈아가며 수행합니다. 짝 프로그래밍이라고도 합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X9BVs/btq3nIXAHCu/gV3ZS0IoOlA8rSZuEKB9G1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X9BVs/btq3nIXAHCu/gV3ZS0IoOlA8rSZuEKB9G1/img.jpg&quot; data-alt=&quot;Source:&amp;amp;amp;nbsp; Tuple&amp;amp;amp;rsquo;s Pair Programming Guide&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X9BVs/btq3nIXAHCu/gV3ZS0IoOlA8rSZuEKB9G1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX9BVs%2Fbtq3nIXAHCu%2FgV3ZS0IoOlA8rSZuEKB9G1%2Fimg.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Source:&amp;nbsp; Tuple&amp;rsquo;s Pair Programming Guide&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;파이널 프로젝트에서 보이스 분석 엔진을 구현할 때 서로 번갈아가면서 실시간으로 대화를 하면서 진행을 하였습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;페어 프로그래밍의 장점&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;지식공유&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;실제로 가장 좋은 장점으로 느꼈던 부분입니다.&amp;nbsp; 웹서버 개발을 할 당시 웹에 대한 기본적인 이해가 없었는데 페어 덕분에 몰랐던 웹의 기초와 Django웹 프레임워크를 조금 더 빨리 배울 수 있었습니다.&amp;nbsp; 또 페어가 모르는 부분을 제가 알려주면서 저도 다시 한번 공부할 수 있어서 복습의 효과도 있었습니다. &lt;span&gt;같이 페어 프로그래밍을 진행하면 서로가 다른 분야의 기술을 알고 있을 때 혹은 새로운 멤버가 들어올 때, 팀의 개발환경이나 해당 기술에 대해서 공유해 줄 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;이미 개발 문서로 팀의 개발환경이나 개발 스타일 등에 대한 문서를 전달하는 방식보다 빠르게 팀의 지식을 공유하기에 아주 좋은 방법인 것 같습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;심리적 안정감&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;개발을 할 때, 간혹 어려운 문제가 있더라도 &amp;lsquo;페어가 있으니 해결할 수 있겠지?&amp;rsquo; &amp;lsquo;페어가 해결해 주겠지?&amp;rsquo; 등의 심리적으로 기댈 수 있습니다. 실제로 페어가 해결하기를 기다리는 것이 아니라 같이 고민을 하게 되는 것이지요&lt;br /&gt;생각해보면 새로운 언어나 프레임워크 등을 사용해야 하는 경우에도 혼자서는 중간에 포기하는 경우가 있는데, 페어와 함께 하다 보면 끝까지 도전을 하게 되기도 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;업무에 대한 집중도 상승&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;출근해서 퇴근할 때까지 페어로 짝과 함께 작업을 하다 보니 개발 외적으로 소비되는 시간이 많이 줄어들게 됩니다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;메신저를 보거나 메일을 확인하는 시간이 페어를 하는 시간에는 불필요한 일이 되기 때문에 오로지 개발에만 집중을 하게 됩니다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;실제로 페어 프로그래밍을 할 때는 개발에만 집중한 시간이 늘어납니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;코드 리뷰 및 개발 방향의 지속&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;페어 프로그래밍을 하다 보면 서로가 서로의 코드에 대해서 코드 리뷰를 실시간으로 할 수 있습니다. 타이핑 도중에 발생하는 작은 실수부터 설계 결함까지 소스코드에 대한 피드백을 가장 빠르게 받게 되고, 이를 통해 결함을 줄일 수 있어서 일정한 수준의 코드 품질을 유지할 수 있다. 실제로 저의 경우에는 오타가 많아서 휴먼에러가 많이 발생하는 편인데 페어 프로그래밍을 진행할 때는 페어 덕에 순조롭게 개발이 됐던 것 같습니다.&amp;nbsp;&lt;br /&gt;페어로 함께 개발을 하면 실시간 코드 리뷰와 함께 올바르게 설계를 하고 개발의 목적에 맞는 방향으로 가고 있는지에 대해서 팀원 간의 지속적인 대화를 통해서 확인이 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;집단적 코드소유&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;개발자는 모두 자신의 담당업무가 있고 해당하는 업무에 대해서만 처리가 가능합니다. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;다른 팀원이 해당 업무를 처리하기는 쉽지 않지만&amp;nbsp;&lt;/span&gt;&lt;span&gt;페어를 하게 되면 업무에 대한 담당자가 1명 이상이 되기 때문에, 누구라도 해당 업무를 처리할 수가 있게 됩니다. 그리고 팀으로서 해당 업무만이 아니라 전체 제품에 대해서 함께 고민하고 개발을 할 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;특정한 팀원 만이 가능한 일이 줄어들게 되고 업무에 대한 병목을 줄일 수 있어 민첩한 대응이 가능합니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;피어 리뷰(Peer Review)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;페어 프로그래밍을 진행하면서 모든 팀원들과 같이 일을 하고 많은 대화를 나누게 됨으로써 동료들의 장단점을 더 잘 알게 되고, 그 사람의 성장을 위한 진실된 피드백을 해줄 수 있었습니다. 그 결과 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;자연스럽게 팀워크도 더 좋아지게 된 계기가 되었습니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;페어 프로그래밍의 단점&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;생산성 저하&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;많은 팀이 페어 프로그래밍을 하지 않는 가장 큰 이유라고 생각된다. 관리자 입장에서는 한 명이 할 일을 두 명이 하고 있으니, 생산성이 반으로 줄어든다고 생각하기 때문일 것입니다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;확실히 1/2은 아니더라도 분명히 생산성이 두 명이 각자 개발하는 것에 비해서 많이 떨어진다는 지기는 합니다&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;오래되긴 했지만 몇몇 논문에서 15% 시간이 더 걸리고, 15% 결함이 줄었다는 연구 결과도 있다고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;키보드 정복자&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;페어 프로그래밍을 하다 보면, 시니어와 주니어 개발자가 같이 하는 경우가 많다고 합니다. 드라이버와 네비게이터의 역할이 물 흐르듯 변경되어야 하지만 시니어 개발자는 5분, 10분 더 키보드를 잡고 있거나 중간에 절대반지처럼 키보드를 납치해서 코드를 완성시키고 싶은 욕망에 사로 잡히게 되고 결국 &lt;/span&gt;&lt;span&gt;시니어 개발자는 생산성이 저하되는 것을 참지 못하고 아무 말 없이 코드를 완성해 나가고, 그걸 보고 있는 주니어 개발자는 어떤 기능이 완성되었는지 모르고 코드를 따라가기에 바쁩니다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;이렇게 반복되면 점차 대화는 줄어들고 기능은 완성되었지만 주니어 개발자는 더 이상 페어로 작업하는데 대한 흥미를 잃게 되고, 페어를 하지만 방관자가 되어서 개발이 끝나게 된다고 합니다. 제 경우에는 페어와 저와 실력이 비슷해서 이런 경우는 일어나지 않았지만 아무튼 이런 경우도 있다고 합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;감정 문제&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;마음이 잘 맞는 사람과 함께 일을 하면 좋겠지만, 개발하는 스타일이 매우 다르거나 생각하는 바가 다른 사람과 함께 작업을 하다 보면 작업이 힘들어질 때가 있습니다. &lt;/span&gt;&lt;span&gt;이런 부분들은 페어 프로그래밍을 하면서 쉽게 바뀌거나 개선되지 않는 문제이기 때문에 해결하기 어려운 문제라고 합니다. 좋은 팀원들과 함께해서 이런 문제는 없었던 것 같네요!!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;피로도 상승&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;페어를 함께 하루 종일 집중해서 하다 보면 개발에 대한 집중도는 증가하지만 피로도 또한 증가합니다. 하주 종일 끊임없이 대화를 하면서 많은 에너지를 소모하지 않도록 중간중간 쉬는 시간을 가지면서 체력적으로 힘들지 않게 해야 합니다. 저 같은 경우에는 중간에 간식타임을 항상 가지면서 쉬는 시간을 가졌습니다.&amp;nbsp; 필요하다면 페어를 진행하지 않고 각자의 생각을 정리할 시간을 가지고 난 뒤, 서로의 생각을 이야기해보는 시간을 갖는 게 좋습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;성공적인 페어 프로그래밍을 위해서&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;페어 프로그래밍을 성공적으로 이끌어가기 위한 중요한 방법은 많은 대화와 소통인 것 같습니다. 하나부터 열 가지 같이 고민하고 항상 화이트보드는 한 개에서 하되 팬은 두 명 다 잡으면서 서로의 의견을 적으면서 하는 것을 추천합니다. 그리고 머릿속에 있는 생각을 가감 없이 공유하고 꾸준히 생각해야 합니다. 생각이 멈추면 대화도 멈추기 때문에 성공적인 페어 프로그래밍을 위해서는 끊임없이 더 나은 방법을 위해 생각하고 소통해야 합니다 같이 빠르게 성장할 수 있는 방법을 경험할 수 있어서 정말 좋은 시간이 였던것 같습니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Daily life/Think</category>
      <category>agile</category>
      <category>Pair Programming</category>
      <category>개발방법론</category>
      <category>에자일</category>
      <category>짝코딩</category>
      <category>컴퓨터과학</category>
      <category>페어프로그래밍</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/37</guid>
      <comments>https://eunchankim-dev.tistory.com/37#entry37comment</comments>
      <pubDate>Mon, 26 Apr 2021 01:42:25 +0900</pubDate>
    </item>
    <item>
      <title>[AWS]AWS - EC2 사용하기</title>
      <link>https://eunchankim-dev.tistory.com/36</link>
      <description>&lt;p&gt;안녕하세요&amp;nbsp;&lt;/p&gt;
&lt;p&gt;오늘은 &lt;span&gt;Amazon Web Service 중 가장 많이 사용하는 EC2를 사용하는 방법에 대해서 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;EC2(Amazon Elastic Compute Cloud)란 AWS 클라우드에서 확장 가능한 컴퓨팅 용량을 제공하는 서비스입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg6Klw/btq2SMLCItI/0KVG3Ir2l6e2mUFq4FUd11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg6Klw/btq2SMLCItI/0KVG3Ir2l6e2mUFq4FUd11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg6Klw/btq2SMLCItI/0KVG3Ir2l6e2mUFq4FUd11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg6Klw%2Fbtq2SMLCItI%2F0KVG3Ir2l6e2mUFq4FUd11%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;AWS-EC2&lt;/b&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;EC2를 사용하면 하드웨어를 별도로 준비할&lt;/span&gt;&lt;span&gt;&amp;nbsp;필요 없어&lt;/span&gt;&lt;span&gt;&amp;nbsp;더 빠르게 애플리케이션을 개발하고 배포할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;EC2를 통해 원하는 만큼 가상 서버를 구축하고 보안 및 네트워크 구성과 스토리지 관리가 가능합니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;EC2는 요건이나 갑작스러운 인기 증대 등 변동사항에 따라 확장하거나 축소가 가능합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;AWS접속 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kSd82/btq2NdxdEQ6/57o8fXTOZrrqVkKnwBBXAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kSd82/btq2NdxdEQ6/57o8fXTOZrrqVkKnwBBXAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kSd82/btq2NdxdEQ6/57o8fXTOZrrqVkKnwBBXAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkSd82%2Fbtq2NdxdEQ6%2F57o8fXTOZrrqVkKnwBBXAK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;-회원가입을 하고 아마존 서비스를 클릭하면 위와 같은 페이지가 보입니다. 리전을 확인하고 EC2를 선택합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;EC2 Instance 시작&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AlHYt/btq2NraSCe3/2PYMYuQb4GCxHlNTc0NYaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AlHYt/btq2NraSCe3/2PYMYuQb4GCxHlNTc0NYaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AlHYt/btq2NraSCe3/2PYMYuQb4GCxHlNTc0NYaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAlHYt%2Fbtq2NraSCe3%2F2PYMYuQb4GCxHlNTc0NYaK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;- EC2 대시보드에는 현재 계정의 인스턴스 상태가 나옵니다. 저는 이미 여러 인스턴스를 만들서 리소스의 숫자가 다다르지만 처음 생성하신 분들은 0으로 되어있습니다. 리전을 확인하시고 인스턴스 시작 버튼을 클릭합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;AMI 선택&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RjIv8/btq2QU4djny/uFTUSdkD4WVKz1tF5hpuN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RjIv8/btq2QU4djny/uFTUSdkD4WVKz1tF5hpuN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RjIv8/btq2QU4djny/uFTUSdkD4WVKz1tF5hpuN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRjIv8%2Fbtq2QU4djny%2FuFTUSdkD4WVKz1tF5hpuN0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;1단계 화면에서는 생성하고자 하는 인스턴스(서버)의 OS(Windows,Ubuntu,Centos.. etc)를 선택하는 화면입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Deep Learning Base와 같은 머신러닝 또는 딥러닝에 필요한 소프트웨어들이 설치돼있는 패키지 타입도 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;사용하고자 하는 목적에 따라 &lt;span style=&quot;color: #333333;&quot;&gt;OS와 CPU 프로세서를 선택한 후 클릭을 합니다 저는 Ubuntu를 사용하겠습니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;인스턴스 유형 선택&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WrMkM/btq2Nqwk1FT/Lk0XPGNyS7BaLv6bP2lEM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WrMkM/btq2Nqwk1FT/Lk0XPGNyS7BaLv6bP2lEM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WrMkM/btq2Nqwk1FT/Lk0XPGNyS7BaLv6bP2lEM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWrMkM%2Fbtq2Nqwk1FT%2FLk0XPGNyS7BaLv6bP2lEM1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;인스턴스 유형에는 다양한 인스턴스 시리즈가 있지만 대체로 C, D, H, I, M, R, T, Z, G, P 그룹의 인스턴스를 많이 사용합니다. 각 시리즈별로 컴퓨팅 최적화, 메모리 최적화, 스토리지 최적화등 특화된 인스턴스들이 있으니 상황에 맞게 사용하시면 됩니다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;저는 가장 기본적인 t2를 사용하겠습니다. 그룹에 따라 가격이 천차만별이니 만들기 전에 가격을 알아보시고 사용하시길 바랍니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;인스턴스 구성&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CatlE/btq2NyVtxAW/I7I38LxVulhssKWGJskROk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CatlE/btq2NyVtxAW/I7I38LxVulhssKWGJskROk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CatlE/btq2NyVtxAW/I7I38LxVulhssKWGJskROk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCatlE%2Fbtq2NyVtxAW%2FI7I38LxVulhssKWGJskROk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;인스턴스의 세부 정보 구성입니다. 인스턴스의 개수와 네트워크, 서브넷 등 다양한 구성을 커스텀할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;기본값으로 설정해 놓고 다음으로 넘기겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;스토리지 추가&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EoYXE/btq2OoEN0Tc/05A5AMSbosnTliQEVJ0nC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EoYXE/btq2OoEN0Tc/05A5AMSbosnTliQEVJ0nC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EoYXE/btq2OoEN0Tc/05A5AMSbosnTliQEVJ0nC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEoYXE%2Fbtq2OoEN0Tc%2F05A5AMSbosnTliQEVJ0nC0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;스토리지 추가 화면입니다. 프리티어는 최대 30GB까지 사용할 수 있으니 30으로 설정하겠습니다. 크기는 파란색으로 밑줄 친 부분에서 변경이 가능합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;태그 추가&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U7JDo/btq2NEVrUeu/njVNv76lhCUQEWHkJmU2ZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U7JDo/btq2NEVrUeu/njVNv76lhCUQEWHkJmU2ZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U7JDo/btq2NEVrUeu/njVNv76lhCUQEWHkJmU2ZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU7JDo%2Fbtq2NEVrUeu%2FnjVNv76lhCUQEWHkJmU2ZK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;인스턴스의 태그명을 설정할 수 있는 단계입니다. 설정을 하지 않고 넘어가도 상관이 없습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;인스턴스를 여러 개 사용할 경우 해당 인스턴스를 알아보기 쉽게 설정해두어도 좋습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;보안 그룹 구성&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bK52yd/btq2MpSsL2T/pV98HAli6zBriVAPMhgXNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bK52yd/btq2MpSsL2T/pV98HAli6zBriVAPMhgXNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bK52yd/btq2MpSsL2T/pV98HAli6zBriVAPMhgXNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbK52yd%2Fbtq2MpSsL2T%2FpV98HAli6zBriVAPMhgXNk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;보안 그룹 구성은 쉽게 방화벽을 설정하는 단계라고 생각하시면 됩니다. 해당 인스턴스에 접속을 어디까지 허용할지 설정해줍니다.&lt;/p&gt;
&lt;p&gt;기본값은 SSH접속을 22번 포트를 사용하여 IP 0.0.0.0/0 즉 모든 IP의 사용자가 접속할 수 있도록 설정되어있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;검토&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sTjKU/btq2Rku9dXO/ndCiQ8la8kfVCC8Bzx1Xe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sTjKU/btq2Rku9dXO/ndCiQ8la8kfVCC8Bzx1Xe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sTjKU/btq2Rku9dXO/ndCiQ8la8kfVCC8Bzx1Xe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsTjKU%2Fbtq2Rku9dXO%2FndCiQ8la8kfVCC8Bzx1Xe0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;지금까지 설정한 인스턴스의 정보를 확인하고 시작하기를 눌러 인스턴스 생성합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;키 페어 생성&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lbsDu/btq2MAsIj5Y/rw9LUxAoD1JoZ8BWk93lFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lbsDu/btq2MAsIj5Y/rw9LUxAoD1JoZ8BWk93lFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lbsDu/btq2MAsIj5Y/rw9LUxAoD1JoZ8BWk93lFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlbsDu%2Fbtq2MAsIj5Y%2Frw9LUxAoD1JoZ8BWk93lFk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;키 페어로 접속을 해야 하니 다운로드합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;인스턴스 상태 확인&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cn4Q9T/btq2TcDDbmh/xIqJKkXJjadVgKO3KZ1bT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cn4Q9T/btq2TcDDbmh/xIqJKkXJjadVgKO3KZ1bT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cn4Q9T/btq2TcDDbmh/xIqJKkXJjadVgKO3KZ1bT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcn4Q9T%2Fbtq2TcDDbmh%2FxIqJKkXJjadVgKO3KZ1bT1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;인스턴스의 상태가 실행 중인 상태인지 확인합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;EC2인스턴스 접속방법&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2b9ur/btq2MAGgpYv/Cg2pHjFCTY6JTw2AkGyxmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2b9ur/btq2MAGgpYv/Cg2pHjFCTY6JTw2AkGyxmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2b9ur/btq2MAGgpYv/Cg2pHjFCTY6JTw2AkGyxmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2b9ur%2Fbtq2MAGgpYv%2FCg2pHjFCTY6JTw2AkGyxmK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;윈도우는 PuTTY를 이용해 접속하셔야 됩니다. 저는 MAC을 사용해 접속을 하겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;먼저 key파일 test.pem 파일에 권한을 변경해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1618730271563&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;chmod 400 /파일경로/test.pem&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;권한을 변경하고 터미널을 재실행해주세요&lt;/p&gt;
&lt;pre id=&quot;code_1618730433340&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; ssh -i /파일경로/test.pem ubuntu@퍼블릭IP
 #ubuntu가 접속이 안될경우 root나 ec2-user로 접속을 하면 됩니다. 
 root@퍼블릭IP
 ec2-user@퍼블릭IP&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위와 같이 접속이 되는 것을 확인!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AWS</category>
      <category>AWS</category>
      <category>aws-ec2</category>
      <category>EC2</category>
      <category>EC2생성하기</category>
      <category>EC2접속방법</category>
      <category>아마존</category>
      <category>인스턴스</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/36</guid>
      <comments>https://eunchankim-dev.tistory.com/36#entry36comment</comments>
      <pubDate>Sun, 18 Apr 2021 16:23:00 +0900</pubDate>
    </item>
    <item>
      <title>[AI]_1. 딥러닝(Deep Learning)</title>
      <link>https://eunchankim-dev.tistory.com/34</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;딥러닝(Deep Learning)&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;머신러닝의 한 분야로 연속된 층(Layer)에서 점직적으로 의미 있는 표현을 배우는데 강점이 있으며, 데이터로부터 표현을 학습하는 새로운 방식입니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;딥러닝에서 딥(Deep)은 연속된 층으로 표현을 학습한다는 개념을 나타냅니다&lt;/li&gt;
&lt;li&gt;층 기반 표현 학습(Layered representations learning), 계층적 표현 학습(Hierarchical representations learning)이라고도 합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;신경망(Neural Network)&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;딥러닝은 층(Layer)들을 쌓아서 구성한 신경망(Neural Network)이라는 모델을 사용하여 학습을 진행합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;신경망은 뉴런(Neuron)들로 이루어진 그룹을 의미합니다. 신경망은 원래 신경 생물학의 용어입니다. 뉴런들의 끝이 다른 뉴런들과 연결된 구조입니다. 뇌 구조를 이해하는 것에서 영감을 받아서 딥러닝 모델의 핵심 개념을 설명하지만, 실제로 뇌를 모델링하여 만든 것은 아닙니다.&lt;/li&gt;
&lt;li&gt;신경망에 구성은 Input Layer(입력층), Output Layer(출력층), Hidden Layer(은닉층)으로 구성돼있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Od8il/btq11AmD3LX/UP94TAqZMnPnITriQzvSyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Od8il/btq11AmD3LX/UP94TAqZMnPnITriQzvSyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Od8il/btq11AmD3LX/UP94TAqZMnPnITriQzvSyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOd8il%2Fbtq11AmD3LX%2FUP94TAqZMnPnITriQzvSyK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;뉴런(Neural)&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;생물학적인 뉴런의 개념에 기초한 수학적인 함수를 의미합니다.&lt;/li&gt;
&lt;li&gt;뉴런이 활성 중인지에 따라서 활성 함수가 결정됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckzNYW/btq12v6bjwG/eJz1pSF8X3oVAZLTkZvr9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckzNYW/btq12v6bjwG/eJz1pSF8X3oVAZLTkZvr9K/img.png&quot; data-alt=&quot;생물체의 neuron 과 딥러닝에서의 neuron&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckzNYW/btq12v6bjwG/eJz1pSF8X3oVAZLTkZvr9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckzNYW%2Fbtq12v6bjwG%2FeJz1pSF8X3oVAZLTkZvr9K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;생물체의 neuron 과 딥러닝에서의 neuron&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;신경망 학습&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;신경망 학습의 목표는 가중치의 정확한 값을 찾아가는 것에 있습니다. 어떤 층이 있을 때, 해당층을 데이터가 거치면서 일어나는 변환은 해당 층의 가중치를 매개변수로 가지는 함수를 통에서 진행됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Weight(가중치)&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;뉴런 사이의 연결 강도를 의미합니다.&lt;/li&gt;
&lt;li&gt;신경망이 훈련을 하는 동안, 업데이트되어 weight가 변경됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Bias(편향)&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;뉴런의 가중치를 의미합니다.&lt;/li&gt;
&lt;li&gt;해당 값 또한, 훈련 시 업데이트됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Activation Function&amp;nbsp;(활성 함수)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주어진 입력값들을 받는 뉴런의 출력 값을 돌려주는 함수입니다.&lt;/li&gt;
&lt;li&gt;현재 뉴런의 활성화에 따라 출력값을 결정합니다. 1은 뉴런을 활성화, 0은 뉴런을 비활성화입니다.&lt;/li&gt;
&lt;li&gt;대표적인 활성 함수는 Sigmoid, Hyperbolic Tangent, ReLU 등이 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Reference - 시작하세요! 텐서플로 2.0 프로그래밍, 밑바닥부터&amp;nbsp;시작하는&amp;nbsp;딥러닝&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Artificial Intelligence/Deep learning</category>
      <category>activation function</category>
      <category>AI</category>
      <category>Bias</category>
      <category>deep learning</category>
      <category>dl</category>
      <category>neural</category>
      <category>뉴런</category>
      <category>신경망 학습</category>
      <category>인공신경망</category>
      <category>활성 함수</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/34</guid>
      <comments>https://eunchankim-dev.tistory.com/34#entry34comment</comments>
      <pubDate>Wed, 7 Apr 2021 19:36:37 +0900</pubDate>
    </item>
    <item>
      <title>[ML]_1. 머신러닝(Machine Learning)</title>
      <link>https://eunchankim-dev.tistory.com/33</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;머신러닝(Machine Learning)&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터에서부터 학습하도록 컴퓨터를 프로그래밍하는 분야입니다.&lt;/li&gt;
&lt;li&gt;해야 할 일(문제) T에 대해서, 그동안 T를 해왔던 경험 E를 바탕으로, 학습하는 System Program을 의미합니다. 해당 Program은 Performance(성능) P를 통해 평가합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;왜 머신러닝을 사용하는가?&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존의 프로그래밍 방식은 어떠한 규칙을 하나의 Case로 나누어서 대응하는 코드를 입력하는 방식입니다. 새로는 Case가 발생하면 새로운 Case에 대응하는 코드를 추가로 작성해야 했습니다. 그러나 머신러닝의 방식은 기존의 Data를 학습하면서, 각각의 Case들에 대한 패턴과 규칙을 찾아내는 방법입니다. 머신러닝에서는 새로운 Case가 발생하면, 학습된 패턴과 규칙들을 바탕으로 따로 코드를 작성하지 않아도 대응할 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;기존의 프로그래밍 방식&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x21Mb/btq1OL8a8uz/aZo4C8vFPUn81hzzOKTaE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x21Mb/btq1OL8a8uz/aZo4C8vFPUn81hzzOKTaE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x21Mb/btq1OL8a8uz/aZo4C8vFPUn81hzzOKTaE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx21Mb%2Fbtq1OL8a8uz%2FaZo4C8vFPUn81hzzOKTaE1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;머신러닝을 사용한 방식&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u4yj5/btq1JzIrDLL/1cBZVKxTtKQXmVZM0R53Pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u4yj5/btq1JzIrDLL/1cBZVKxTtKQXmVZM0R53Pk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u4yj5/btq1JzIrDLL/1cBZVKxTtKQXmVZM0R53Pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu4yj5%2Fbtq1JzIrDLL%2F1cBZVKxTtKQXmVZM0R53Pk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;머신러닝의 장점&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존의 프로그래밍에 비해 새로운 규칙 또는 패턴에 대한 유지보수가 기존의 프로그래밍 방식 보다 쉽습니다.&lt;/li&gt;
&lt;li&gt;새로운 Case에 대해 빠른 대처가 가능합니다.&lt;/li&gt;
&lt;li&gt;상대적으로 짧은 Code로 작성이 가능합니다.&lt;/li&gt;
&lt;li&gt;복잡한 적용하기 용이합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;평가를 통해 꾸준이 개선이 될 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;머신러닝 시스템의 분류&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J0trG/btq1Mq4zZTQ/TzYUfKSEzRojSvOnRslmT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J0trG/btq1Mq4zZTQ/TzYUfKSEzRojSvOnRslmT0/img.png&quot; data-alt=&quot;출처 :rocket source&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J0trG/btq1Mq4zZTQ/TzYUfKSEzRojSvOnRslmT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ0trG%2Fbtq1Mq4zZTQ%2FTzYUfKSEzRojSvOnRslmT0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :rocket source&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt;지도 학습(&lt;/b&gt;Supervised Learning)&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;각각의 학습을 위한 데이터들이 Label을 가지고 있는 경우 사용됩니다. Label이란, 문제와 관련된 여러 Instance들이 있을 때, 해당 data가 의미하는 정답이라고 볼 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;지도 학습에는 크게 분류(Classification)와 회귀(Regreesion)로 나누어집니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rC4rf/btq1MrJemeb/zpxJtNyPq6l3FCppRhaSok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rC4rf/btq1MrJemeb/zpxJtNyPq6l3FCppRhaSok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rC4rf/btq1MrJemeb/zpxJtNyPq6l3FCppRhaSok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrC4rf%2Fbtq1MrJemeb%2FzpxJtNyPq6l3FCppRhaSok%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위의 그림은 스팸 메일 분류를 위한 방식을 그림으로 표현한 것입니다. 메일안의 샘플이 있고, 각각의 메일들에는 기존에 스팸을 구분해 놓은 Label이 있습니다. 여기서 Label은 스팸인지 아닌지 두 가지 경우를 나누어서 나타내었습니다. 기존의 모든 메일 데이터를 Training Set 학습 데이터 세트로 학습시켜서 새로운 메일이 들어왔을 때, Label이 무엇인지를 예측하는 방법입니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt;비지도 학습(Uns&lt;/b&gt;upervised Learning)&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Label이 없는 학습데이터를 사용하여 기존의 데이터가 어떠한 형태를 지니고 있는지 판단하는 방식입니다.&lt;/li&gt;
&lt;li&gt;비지도 학습의 알고리즘 분류는 크게 클러스터링 알고리즘(Clustering Algorithm), 시각화 및 차원 축소(Visualization and dimensionality reduction), 연관 규칙 학습(Association rulelearning) 가있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Clustering&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bq9tkJ/btq1Qm1uxZ9/Vi6Yo63i3t20K6uETIgTgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bq9tkJ/btq1Qm1uxZ9/Vi6Yo63i3t20K6uETIgTgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bq9tkJ/btq1Qm1uxZ9/Vi6Yo63i3t20K6uETIgTgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbq9tkJ%2Fbtq1Qm1uxZ9%2FVi6Yo63i3t20K6uETIgTgk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt;강화 학습(Reinforcement &lt;/b&gt;Learning)&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;순차적 의사결정 문제에서 누적 보상을 최대화 하기 위해 시행착오를 통해 행동을 교정하는 학습입니다.&lt;/span&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;Agent가 환경을 인지하고, 정책(Policy)에 맞게 현상황에서의 행동을 선택합니다. 선택한 행동을 수행하고, 보상(Reward) 또는 페널티(Penalty)를 부여하여, 정책을 결과에 맞게 업데이트합니다. 앞의 행동을 계속 반복하여 최적의 정책을 위해 계속 업데이트해나가는 과정을 강화 학습 (Reinforcement Learning)이라고 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;Agent와 정책(Policy)을 선정하는 것이 핵심입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;강화학습 사용 예로는 구글의 딥마인드의 알파고(AlphaGo)가 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oT2Fu/btq1JAm7FlN/rntHDmjOBu3jmyDtNCOpkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oT2Fu/btq1JAm7FlN/rntHDmjOBu3jmyDtNCOpkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oT2Fu/btq1JAm7FlN/rntHDmjOBu3jmyDtNCOpkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoT2Fu%2Fbtq1JAm7FlN%2FrntHDmjOBu3jmyDtNCOpkk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Reference - 핸즈온 머신러닝(2판) 사이킷런, 케라스, 텐서플로 2를 활용한 머신러닝, 딥러닝 완벽 실무 (한빛미디어)&lt;/span&gt;&lt;/p&gt;</description>
      <category>Artificial Intelligence/Machine learning</category>
      <category>AI</category>
      <category>ML</category>
      <category>reinforcement learning</category>
      <category>RL</category>
      <category>supervised learning</category>
      <category>unsupervised learning</category>
      <category>강화학습</category>
      <category>머신러닝</category>
      <category>비지도학습</category>
      <category>지도학습</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/33</guid>
      <comments>https://eunchankim-dev.tistory.com/33#entry33comment</comments>
      <pubDate>Sun, 4 Apr 2021 16:53:52 +0900</pubDate>
    </item>
    <item>
      <title>[MacBook]M1 Apple Silicon Tensorflow 설치하기</title>
      <link>https://eunchankim-dev.tistory.com/32</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;719&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctNjo7/btq1vgOugwj/BdfkCpe7nneZJitGoh5v30/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctNjo7/btq1vgOugwj/BdfkCpe7nneZJitGoh5v30/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctNjo7/btq1vgOugwj/BdfkCpe7nneZJitGoh5v30/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctNjo7%2Fbtq1vgOugwj%2FBdfkCpe7nneZJitGoh5v30%2Fimg.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;719&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;노트북을 구입할 때가 되서 25년 동안 윈도우를 쓰다가 다른 OS도 한번 써 볼까 하다가 맥북을 구입하게 되었다.&lt;/p&gt;
&lt;p&gt;애플에서 어떤 노트북을 살까 보던 중에 새로 나온&amp;nbsp; Apple M1 을 탑재한 맥북이 기존의 맥북 성능보다 머신러닝 속도가 최대 11배 빠르다고 해서 그냥 사버렸다..(ML용 16코어 뉴럴엔진이 포함되서 빠르다고 한다)&lt;/p&gt;
&lt;p&gt;Tensorflow 설치를 하려고 했는데 무수한 에러 메시지가 뜨면서 설치가 안됐다...&lt;/p&gt;
&lt;p&gt;이틀 동안이나 깃허브와 구글링을 해서 겨우 설치하게 되었다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;설치는 해서 작동은 잘하지만 아직 가지 메인 프로세서의 아키텍처가 바뀜으로 시행착오가 많이 있는 것 같다.&lt;/p&gt;
&lt;p&gt;그래서 오늘은 Tensorflowf를 &lt;span style=&quot;color: #333333;&quot;&gt;Apple M1에 설치하는 과정을 정리해보려고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. 터미널 환경설정&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QpkwS/btq1tDDuCgI/Me2EDp5oXfeenpxVV3pdY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QpkwS/btq1tDDuCgI/Me2EDp5oXfeenpxVV3pdY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QpkwS/btq1tDDuCgI/Me2EDp5oXfeenpxVV3pdY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQpkwS%2Fbtq1tDDuCgI%2FMe2EDp5oXfeenpxVV3pdY1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Apple Silicon이 장착된 Mac 에서는 &lt;span style=&quot;color: #333333;&quot;&gt;Intel 프로세서가 장착된 Mac용으로 제작된 앱을 사용하려면 &lt;span style=&quot;color: #333333;&quot;&gt;Rosetta를 사용하여 열기를 하면 쉽게 설치가 된다. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하지만 이걸 켜놓고 Tensorflow를 설치하려고하면 충돌에러가 난다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그렇기 때문에 &lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Rosetta가 켜져있는지 먼저 확인&lt;/b&gt;&lt;/span&gt;을 하고 터미널을 실행시킨다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Rosetta란 인텔 프로세서용 이진 바이너리 파일을 맥 osx에서 실행하게 해주는 에뮬레이터이다. (번역가라고 이해하면 편하다)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;xcode command Line Tools도 없으면 설치해준다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1617167657685&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;xcode-select --install&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. Miniforge 설치하기&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;homebrew설치하고 miniforge를 인스톨해준다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Apple Silicon이 장착된 Mac에서 conda를 이용해서 Tensorflow를 설치하려면 현재는 miniforge에서만 호환이 된다고한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1617167696955&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install miniforge&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;brew info miniforge를 입력해 MacOSX-arm64.sh 로 설치가 되었는지 확인&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1617167791166&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew info miniforge 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccY6Nj/btq1s3JoRfm/3yXsq4jvEKwDtpd12H0rD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccY6Nj/btq1s3JoRfm/3yXsq4jvEKwDtpd12H0rD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccY6Nj/btq1s3JoRfm/3yXsq4jvEKwDtpd12H0rD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccY6Nj%2Fbtq1s3JoRfm%2F3yXsq4jvEKwDtpd12H0rD0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. conda 가상환경 만들기&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;enviroment.yml 다운받아 가져와 가상환경을 만들어준다.&lt;/p&gt;
&lt;pre id=&quot;code_1617171977776&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda env create --file=PATHenvironment.yml --name=가상환경이름&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bFQhX1/btq1tCSnf4j/bTljDMIJNdOiFU0PwgdDwK/environment.yml?attach=1&amp;amp;knm=tfile.yml&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;environment.yml&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DpTf0/btq1s3CQvSn/cKaK31GliCtvoJG5vEaDi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DpTf0/btq1s3CQvSn/cKaK31GliCtvoJG5vEaDi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DpTf0/btq1s3CQvSn/cKaK31GliCtvoJG5vEaDi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDpTf0%2Fbtq1s3CQvSn%2FcKaK31GliCtvoJG5vEaDi1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. conda 가상환경 접속후 설치&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1617173667799&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda activate 가상환경이름
#가상환경 접속후 입력
pip install --upgrade --force --no-dependencies https://github.com/apple/tensorflow_macos/releases/download/v0.1alpha3/tensorflow_macos-0.1a3-cp38-cp38-macosx_11_0_arm64.whl https://github.com/apple/tensorflow_macos/releases/download/v0.1alpha3/tensorflow_addons_macos-0.1a3-cp38-cp38-macosx_11_0_arm64.whl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coPYyV/btq1yEaDZCN/ApR8lhG8u7Gogjpafaii00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coPYyV/btq1yEaDZCN/ApR8lhG8u7Gogjpafaii00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coPYyV/btq1yEaDZCN/ApR8lhG8u7Gogjpafaii00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoPYyV%2Fbtq1yEaDZCN%2FApR8lhG8u7Gogjpafaii00%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;설치완료!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;설치가 잘됬는지 접속해서 확인한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0WG0m/btq1yEItyM2/W6H8GBGilQQ94zxpc6FKkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0WG0m/btq1yEItyM2/W6H8GBGilQQ94zxpc6FKkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0WG0m/btq1yEItyM2/W6H8GBGilQQ94zxpc6FKkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0WG0m%2Fbtq1yEItyM2%2FW6H8GBGilQQ94zxpc6FKkK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;참고:&lt;a href=&quot;https://github.com/apple/tensorflow_macos&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;github.com/apple/tensorflow_macos&lt;/a&gt;&lt;/p&gt;</description>
      <category>Mac</category>
      <category>Apple Silicon</category>
      <category>Apple Silicon Tensorflow</category>
      <category>M1</category>
      <category>M1 Tensorflow</category>
      <category>M1 탠서플로우설치</category>
      <category>MacOS</category>
      <category>ML</category>
      <category>TensorFlow</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/32</guid>
      <comments>https://eunchankim-dev.tistory.com/32#entry32comment</comments>
      <pubDate>Wed, 31 Mar 2021 16:17:54 +0900</pubDate>
    </item>
    <item>
      <title>[AI]_1. 인공 지능(Artificial Intelligence)</title>
      <link>https://eunchankim-dev.tistory.com/31</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;인공 지능(AI)&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;인간의 학습능력, 추론능력, 지각능력, 논증능력, 자연언어의 이해능력 등을 인공적으로 구현한 컴퓨터 프로그램 또는 이를 포함한 컴퓨터 시스템&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;단순 인지능력에서 발전하여 인지한 환경 속에서 최적의 답을 찾아내고, 여기에 스스로 수행한 학습을 더해 추론 및 예측을 하며, 향후에는 문제를 스스로 발견하고 해결하는 행동 단계에 이르기까기지 다양한 분야의 연구가 진행되고 있음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;지능을 갖고 있는 기능을 갖춘 컴퓨터시스템&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;이며, 인간의 지능을 기계 등에 인공적으로 시연(구현)한 것이다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bH3yp9/btq1aQxdsJc/nBX6MpjamOKhbzsKePNyHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bH3yp9/btq1aQxdsJc/nBX6MpjamOKhbzsKePNyHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bH3yp9/btq1aQxdsJc/nBX6MpjamOKhbzsKePNyHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbH3yp9%2Fbtq1aQxdsJc%2FnBX6MpjamOKhbzsKePNyHk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;인공지능과 머신러닝, 딥러닝의 관계의 이해를 쉽게 이해할 수 있도록 이미지로 표현되어있다.&lt;/p&gt;
&lt;p&gt;앨런 튜링이 1950년도에 논문에서 발표한 튜링테스트 기점으로 인공지능분야는 활발히 발전&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;머신러닝(M&lt;span&gt;achine learning&lt;/span&gt;)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;경험을 통해 자동으로 개선하는 컴퓨터 알고리즘을 연구, 컴퓨터가 학습할 수 있도록 하는 알고리즘과 기술을 개발하는 분야&lt;/li&gt;
&lt;li&gt;머신러닝 알고리즘의 유형에는 크게 지도학습, 비지도학습, 강화학습이 있다.&lt;/li&gt;
&lt;li&gt;스팸메일 분류, 추천시스템&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;딥러닝(Deep&lt;span&gt;&amp;nbsp;learning&lt;/span&gt;)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;사람의 사고방식을 컴퓨터에게 가르치는 기계학습의 한 분야. 여러 비선형 변환기법의 조합을 통해 높은 수준의 추상화(다량의 데이터나 복잡한 자료들 속에서 핵심적인 내용 또는 기능을 요약하는 작업)를 시도하는 기계 학습 알고리즘의 집합 &lt;/span&gt;머신러닝의 일종으로 심층 인공신경망을 사용하여 End-to-End 학습 구조를 가지는 학습 모델&lt;/li&gt;
&lt;li&gt;딥러닝의 알고리즘 유형에는 크게 심층신경망, 합성곱 신경망, 순한신경망 등이있고 빠른 발전으로 다양한 알고리즘등이 활발이 개발 및 연구되고 있다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;머신러닝과-딥러닝-차이&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;머신러닝과 딥러닝 차이&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 의존도 : 딥러닝은 대용량의 데이터를 필요로 함&lt;/li&gt;
&lt;li&gt;하드웨어 의존도 : 딥러닝 학습을 위해 GPU와 같은 병렬처리 하드웨어 필요&lt;/li&gt;
&lt;li&gt;Feature Engineering 수행 여부 : 머신러닝은 Feature Engineering 과정 필요&lt;/li&gt;
&lt;li&gt;학습시간 : 딥러닝 학습을 위해 장시간 소요&lt;/li&gt;
&lt;li&gt;해석력/설명력 : 딥러닝은 블랙박스로 해석력, 설명력이 낮음&lt;/li&gt;
&lt;li&gt;알고리즘 복잡도/깊은 신경망 : 딥러닝은 깊은 레이어를 사용하며 복잡한 알고리즘 구조&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;- Feature Engineering(Feature(변수) 추출 + Feature 선택) : 변수 선택법. 분석가의 중간 개입을 통해 사용할 변수를 선택하는 과정&lt;br /&gt;머신러닝만 해당. 딥러닝은 학습과 분류과정이 통합된 End-to-End 학습이 가능&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Artificial Intelligence</category>
      <category>AI</category>
      <category>Artificial Intelligence</category>
      <category>deep learning</category>
      <category>dl</category>
      <category>Machine Learning</category>
      <category>ML</category>
      <category>딥러닝</category>
      <category>머신러닝</category>
      <category>인공지능</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/31</guid>
      <comments>https://eunchankim-dev.tistory.com/31#entry31comment</comments>
      <pubDate>Mon, 29 Mar 2021 14:35:48 +0900</pubDate>
    </item>
    <item>
      <title>[Python Project]Image Tag Analysis Project</title>
      <link>https://eunchankim-dev.tistory.com/30</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Image&amp;nbsp;Tag&amp;nbsp;Analysis&amp;nbsp;Project&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개요 : 쿠팡의 과일 이미지를 크롤링, 카카오와 구글 비전 API를 이용하여 이미지 기반 분석 프로그램 제작&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;팀명 : Goofanaka 팀원 : 손기훈 김동건 유주아 김은찬&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;개발 기간 : 2020년 12월 22일 ~ 2021년 1월 10일&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;담당 역할 : 크롤러 제작, DB 구축, , 데이터 수집, 데이터 분석 및 시각화&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;깃허브 : &amp;nbsp;&lt;/span&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://github.com/Goofanaka/image_tagging&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;github.com/Goofanaka/image_tagging&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1616050082127&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Goofanaka/image_tagging&quot; data-og-description=&quot;Contribute to Goofanaka/image_tagging development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/Goofanaka/image_tagging&quot; data-og-url=&quot;https://github.com/Goofanaka/image_tagging&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bGfVba/hyJBlegx7I/LeFZ4J1fobDK1QbHPfQ9O1/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/frITM/hyJBnJVicC/ktJYjWv0rzRsfSatNJxFy0/img.png?width=1629&amp;amp;height=708&amp;amp;face=0_0_1629_708&quot;&gt;&lt;a href=&quot;https://github.com/Goofanaka/image_tagging&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/Goofanaka/image_tagging&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bGfVba/hyJBlegx7I/LeFZ4J1fobDK1QbHPfQ9O1/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/frITM/hyJBnJVicC/ktJYjWv0rzRsfSatNJxFy0/img.png?width=1629&amp;amp;height=708&amp;amp;face=0_0_1629_708');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Goofanaka/image_tagging&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Contribute to Goofanaka/image_tagging development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;demo&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;DEMO&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://www.youtube.com/watch?v=YkkxcxwgIOU&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.youtube.com/watch?v=YkkxcxwgIOU&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=YkkxcxwgIOU&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/y9X18/hyJBrMlk9o/uJAsPMWyJ83qT6QrRttwDK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/YkkxcxwgIOU&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;tech-stack-기술-스택&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Tech Stack&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;개발언어 : Python&lt;/li&gt;
&lt;li&gt;크롤링 : Beautifulsoup&lt;/li&gt;
&lt;li&gt;데이터베이스 : MongoDB Atlas&lt;/li&gt;
&lt;li&gt;분석 및 시각화 : Pandas, matplotlib, seaborn&lt;/li&gt;
&lt;li&gt;Gui tool : PyQT&lt;/li&gt;
&lt;li&gt;Git, Github&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;workflow&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Workflow&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLgxe9/btq0qA1KU1t/Ugd5S2TNc7BnWyKTGRues0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLgxe9/btq0qA1KU1t/Ugd5S2TNc7BnWyKTGRues0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLgxe9/btq0qA1KU1t/Ugd5S2TNc7BnWyKTGRues0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLgxe9%2Fbtq0qA1KU1t%2FUgd5S2TNc7BnWyKTGRues0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id=&quot;features&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Git Features&lt;/b&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;crawling.py : 이미지와 제목을 크롤링하고 크롤링한 이미지를 폴더에 저장&lt;/li&gt;
&lt;li&gt;dict_json.py : dict에서 json으로 변경 list에서 dict로 변경&lt;/li&gt;
&lt;li&gt;fruit_dict.py : 과일사전&lt;/li&gt;
&lt;li&gt;pyqt_gui.py : GUI 환경을 구현&lt;/li&gt;
&lt;li&gt;img_to_mongo.py : DB에 이미지 파일을 저장&lt;/li&gt;
&lt;li&gt;tagdata.py : DB에 태깅된 데이터를 저장&lt;/li&gt;
&lt;li&gt;kakao.py : 크롤링한 이미지를 카카오 API에 넣고 태깅한 값을 받아 list로 변환&lt;/li&gt;
&lt;li&gt;google_api.py : 크롤링한 이미지를 구글 API에 넣고 태깅한 값을 받아 list로 변환&lt;/li&gt;
&lt;li&gt;main : 전체적인 모듈을 실행하는 파일&lt;/li&gt;
&lt;li&gt;visualization
&lt;ul&gt;
&lt;li&gt;Time_series_chart.py : 전체 날짜별 과일 수 시계열 분석 그래프&lt;/li&gt;
&lt;li&gt;correct_answerd.py : 카카오 API, 구글 API 성능 비교 분석 그래프&lt;/li&gt;
&lt;li&gt;fruit_statistics.py : 특정 날짜별 과일 빈도수 분석 그래프&lt;/li&gt;
&lt;li&gt;fruit_statistics_all.py : 전체 과일 빈도 수 분석 그래프&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Code&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;1.&amp;nbsp; 크롤러 제작&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rwIz4/btq0qz3AqOR/b2HqKkDYhJFdF93cqBxfVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rwIz4/btq0qz3AqOR/b2HqKkDYhJFdF93cqBxfVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rwIz4/btq0qz3AqOR/b2HqKkDYhJFdF93cqBxfVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrwIz4%2Fbtq0qz3AqOR%2Fb2HqKkDYhJFdF93cqBxfVk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;쿠팡에서 원하는 페이지만큼 이미지를 크롤링하는 함수이고 &lt;b&gt;Beautifulsoup, &lt;b&gt;selenium&lt;/b&gt;&lt;/b&gt;을&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt; 사용해 크롤러를 만들었다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;처음 하는 만드는 크롤러이기도 하고&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;플레이 데이터 과정에서 사용하지 않은 라이브러리다 보니 도큐먼트를 찾아가서 하나씩 참고도하고, 유튜브에서 검색해서 찾아보기도 하면서 크롤러를 만들었다.&amp;nbsp; 크롤러를 만드는 것보다 원하는 성능(속도)과 데이터를 우리가 사용할 데이터만 받아오게 만드는것이&amp;nbsp;생각보다 오래 걸렸다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1.&amp;nbsp; 시각화&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqyII1/btq0EDp1sM3/XtK88CIQM6TSmTk6K87qBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqyII1/btq0EDp1sM3/XtK88CIQM6TSmTk6K87qBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqyII1/btq0EDp1sM3/XtK88CIQM6TSmTk6K87qBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqyII1%2Fbtq0EDp1sM3%2FXtK88CIQM6TSmTk6K87qBK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;크롤링한 전체 기간 동안 전체 과일 누적 빈도수를 그래프로 시각화한 코드이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;시각화는 다른 코드보다 비교적 간단했지만 그래프의 가시성을 위해서 다양한 시각화 라이브러리를 써보고 가장 가시성이 좋은 &lt;b&gt;seaborn&lt;/b&gt;으로 시각화를 진행했다. 시각화는 디테일한 부분들을 수정하는데 시간은 많이 들지만 수정한 티는 하나도 안나는? 그런 부분들이 되게 많은 것 같다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDQEIJ/btq0HaODVzx/lh7FZ1NFzFkllMFANULDJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDQEIJ/btq0HaODVzx/lh7FZ1NFzFkllMFANULDJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDQEIJ/btq0HaODVzx/lh7FZ1NFzFkllMFANULDJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDQEIJ%2Fbtq0HaODVzx%2Flh7FZ1NFzFkllMFANULDJk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;느낀점&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전 회사에서 다양한 프로젝트를 해봤지만 IT도메인에서 처음 하는 프로젝트라 긴장도 많이 했지만 좋은 팀원들을 만나서 팀 멤버 간에 불화 없이 프로젝트를 진행할 수 있어서 좋았다.&lt;/li&gt;
&lt;li&gt;코드를 만들면서 막히는 부분들이 많았지만 그래도 기한 내에 프로젝트를 마무리할 수 있어서 감사했다.&lt;/li&gt;
&lt;li&gt;데이터 수집부터 저장, 분석, 시각화 등 모든 과정을 다 만들어봤고 특히 MongoDB를 사용해 nosql에 대해 알 수 있었다.&lt;/li&gt;
&lt;li&gt;git과 github를 이용해 코드를 공유했지만 처음 사용하는 git이라 매끄럽게 사용하지 못한 게 아쉬웠다.&lt;/li&gt;
&lt;li&gt;프로젝트를 진행하면서 항상 새로운 것들을 배워나가는 것이 즐거웠다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Project/Project</category>
      <category>Crawling</category>
      <category>mongodb</category>
      <category>pandas</category>
      <category>Project</category>
      <category>pyqt</category>
      <category>PYTHON</category>
      <category>Python Project</category>
      <category>seaborn</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/30</guid>
      <comments>https://eunchankim-dev.tistory.com/30#entry30comment</comments>
      <pubDate>Sun, 21 Mar 2021 17:02:31 +0900</pubDate>
    </item>
    <item>
      <title>[CS50 코칭스터디] CS50 코칭스터디2기_6주차</title>
      <link>https://eunchankim-dev.tistory.com/29</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;6주차_자료구조&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;자료구조&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;자료구조, 데이터 구조란 컴퓨터에 자료를 효율적으로 저장하는 방식을 말하며 올바른 자료구조를 사용하는 것은 결국 메모리를 절약하고 수행시간을 절약하는 데 도움을 줄 수 있게 됩니다.&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;큐&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;큐는 메모리 구조에서 살펴봤듯이 값이 아래로 쌓이는 구조입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;값을 넣고 뺄 때&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&amp;lsquo;선입 선출&amp;rsquo;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&amp;lsquo;FIFO&amp;rsquo;&lt;/b&gt;라는 방식을 따르게 됩니다. 가장 먼저 들어온 값이 가장 먼저 나가는 것이죠.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;은행에서 줄을 설 때 가장 먼저 줄을 선 사람이 가장 먼저 업무를 처리하게 되는 것과 동일합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;&lt;b&gt;배열&lt;/b&gt;이나&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;연결 리스트&lt;/b&gt;를 통해 구현 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;스택&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;반면 스택은 역시 메모리 구조에서 살펴봤듯이 값이 위로 쌓이는 구조입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;따라서 값을 넣고 뺄 때&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&amp;lsquo;후입 선출&amp;rsquo;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&amp;lsquo;LIFO&amp;rsquo;&lt;/b&gt;라는 방식을 따르게 됩니다. 가장 나중에 들어온 값이 가장 먼저 나가는 것이죠.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;뷔페에서 접시를 쌓아 뒀을 때 사람들이 가장 위에 있는(즉, 가장 나중에 쌓인) 접시를 가장 먼저 들고 가는 것과 동일합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;역시&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;배열&lt;/b&gt;이나&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;연결 리스트&lt;/b&gt;를 통해 구현 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;딕셔너리&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;딕셔너리는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&amp;lsquo;키&amp;rsquo;&lt;/b&gt;와&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&amp;lsquo;값&amp;rsquo;&lt;/b&gt;이라는 요소로 이루어져 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;&amp;lsquo;키&amp;rsquo;에 해당하는 &amp;lsquo;값&amp;rsquo;을 저장하고 읽어오는 것이죠. 마치 대학교에서 &amp;lsquo;학번&amp;rsquo;에 따라서 &amp;lsquo;학생&amp;rsquo;이 결정되는 것과 동일합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;일반적인 의미에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&amp;lsquo;해시 테이블&amp;rsquo;&lt;/b&gt;과 동일한 개념이라고도 볼 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;역시 &amp;lsquo;키&amp;rsquo;를 어떻게 정의할 것인지가 중요합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6주차&lt;span&gt;&amp;nbsp;&lt;/span&gt;팀미션&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결리스트로 Stack 만들기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1614488885533&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

typedef struct stackNode {
    int data;
    struct stackNode* next;
} StackNode;

//Stack 구조체 : node 생성
StackNode* createStackNode(int data) {
    StackNode* node = (StackNode*)malloc(sizeof(StackNode));
    node-&amp;gt;data = data; // 입력받은 int를 data type에 넣는다
    node-&amp;gt;next = NULL; // node에는 NULL을 넣는다
    return node; // 새롭게 생성된 node 반환
}

int isEmpty(StackNode* root) {
    return !root;
}

void push(StackNode** root, int data) {
   if ((!root)) return;
 
    StackNode* item = (StackNode*)malloc(sizeof(StackNode)); //item이라는 새로운 node 생성
    item -&amp;gt; data = data; // 새로운 node data 저장
    item -&amp;gt; next = (*root); // 이때 포인터는 root의 첫번째 node를 가리킨다. 
    (*root) = item; // item node는 새로운 root가 됨
    printf(&quot;%d pushed to stack\n&quot;, data);
}

int pop(StackNode** root) {
    if (isEmpty(*root))
        return -9999; //데이터가 없을 경우 -9999를 리턴
  
    StackNode* temp = *root; // temp를 선언해 맨 위 노드의 주소값 저장
    int popped = temp -&amp;gt; data; // popped 변수에 맨 위 노드의 데이터 저장
    *root = temp -&amp;gt; next; // root 노드를 두번째 노드로 옮김
    free(temp); // 맨 위 노드 제거
    return popped; // 데이터 반환
}

int peek(StackNode** root) {
    if (isEmpty(*root))
        return -9999;
    return (*root)-&amp;gt;data;
}

int main() {
    StackNode* root = NULL;

    push(&amp;amp;root, 10);
    push(&amp;amp;root, 20);
    push(&amp;amp;root, 30);
    push(&amp;amp;root, 40);

    printf(&quot;%d pop from stack\n&quot;, pop(&amp;amp;root));
    printf(&quot;%d pop from stack\n&quot;, pop(&amp;amp;root));

    push(&amp;amp;root, 50);
    printf(&quot;%d peeked from stack\n&quot;, peek(&amp;amp;root));
    printf(&quot;%d pop from stack\n&quot;, pop(&amp;amp;root));
    printf(&quot;%d pop from stack\n&quot;, pop(&amp;amp;root));
    printf(&quot;%d pop from stack\n&quot;, pop(&amp;amp;root));
    return 0;
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CS50 코칭스터디2기</category>
      <category>C</category>
      <category>CS50</category>
      <category>CS50코칭스터디2기</category>
      <category>C코드</category>
      <category>네이버부스트코스</category>
      <category>부스트코스</category>
      <category>컴퓨터과학</category>
      <category>컴퓨터프로그래밍</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/29</guid>
      <comments>https://eunchankim-dev.tistory.com/29#entry29comment</comments>
      <pubDate>Sun, 28 Feb 2021 14:15:01 +0900</pubDate>
    </item>
    <item>
      <title>[Algorithm_Greedy]_1. 그리디(탐욕법)</title>
      <link>https://eunchankim-dev.tistory.com/28</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Greedy&lt;/h2&gt;
&lt;p&gt;그리디(탐욕법)알고리즘은 단순하지만 가장 강력한 문제 해결방법이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;탐욕법이라고 하는 이유는 단순 무식하게 탐욕적으로 풀어서 그런것 같습니다&amp;nbsp;&lt;/p&gt;
&lt;p&gt;여기서 &lt;b&gt;탐욕적이라는 말은 현재 상황에서 가장 좋은 것만 고르는 방법&lt;/b&gt;을 의미합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그리디 알고리즘은 기준에 따라 좋은 것을 선택하는 알고리즘이므로&amp;nbsp;보통 문제에서&lt;/p&gt;
&lt;p&gt;&lt;b&gt;/가장 큰 순서대로, 가장 작은 순서대로/&lt;/b&gt; -&amp;gt; &lt;b&gt;정렬알고리즘&lt;/b&gt;과 결합하여 자주 출제됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;대표적인 그리디알고리즘 문제는 거스름돈 문제입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;당신은 음식점의 계산을 도와주는 점원이다. 카운터에는 거스름돈으로 사용할 500원, 100원, 50원, 10원짜리 동전이 무한이 존재한다고 가정한다. 손님에게 거슬러 줘야 할 돈이 N원일 때 거슬러 줘야 하는 동전의 최소 개수를 구하라&amp;nbsp;&lt;/p&gt;
&lt;p&gt;N은 10의 배수이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1611839383140&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;n = 1270
count = 0

# 큰단위의 화폐부터 차례대로 확인하기 -&amp;gt; 정렬
list1 = [500, 100, 50, 10]
for coin in list1:
	count + = n//coin
    n%= coin
    
print(count)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;코드는 이러한형식으로 진행될 것입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;코딩 테스트의 대부분의 문제는 그리디 알고리즘을 이용해서 '최적의 해' 찾을 수 없을 가능성이 다분합니다. 그래서 그리디알고리즘으로 문제 해법을 찾았을때는 그 로직이 정당한지 검토해야합니다. 위와 같은 거스름돈 문제는 큰 단위가 항상 작은 단위의 배수이므로 작은 단위의 동전들을 종합해 다른 해가 나올 수 없기 때문에 가능한것입니다.!&lt;/p&gt;
&lt;p&gt;백준 알고리즘에서 그리디 풀어보았습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;백준 알고리즘 11034번 : 캥거루 세마리2&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;캥거루 세 마리가 사막에서 놀고 있다. 사막에는 수직선이 하나 있고, 캥거루는 서로 다른 한 좌표 위에 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;한 번 움직일 때, 바깥쪽의 두 캥거루 중 한 마리가 다른 두 캥거루 사이의 정수 좌표로 점프한다. 한 좌표 위에 있는 캥거루가 두 마리 이상일 수는 없다.&lt;/p&gt;
&lt;p&gt;캥거루는 최대 몇 번 움직일 수 있을까?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1613732109919&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while True:
    try:
        A,B,C = map(int, input().split())


        d = max(B - A, C - B)

        print(d - 1)
    except:
        break&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm</category>
      <category>greedy</category>
      <category>PYTHON</category>
      <category>그리디</category>
      <category>그리디 알고리즘</category>
      <category>백준</category>
      <category>알고리즘</category>
      <category>탐욕법</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/28</guid>
      <comments>https://eunchankim-dev.tistory.com/28#entry28comment</comments>
      <pubDate>Sat, 20 Feb 2021 20:58:06 +0900</pubDate>
    </item>
    <item>
      <title>[CS50 코칭스터디] CS50 코칭스터디2기_5주차</title>
      <link>https://eunchankim-dev.tistory.com/27</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;5주차_메모리와 포인터&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;메모리의 구조&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램이 실행되기 위해서는 먼저&amp;nbsp;프로그램이&amp;nbsp;메모리에 로드(load)되어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 프로그램에서 사용되는 변수들을&amp;nbsp;저장할 메모리도 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;코드(code) 영역&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리의 코드(code) 영역은&amp;nbsp;실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code) 영역이라고도 부릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;데이터(data) 영역&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리의 데이터(data)&amp;nbsp;영역은 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터&amp;nbsp;영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;스택(stack) 영역&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리의 스택(stack) 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 스택 영역에 저장되는&amp;nbsp;함수의 호출 정보를 스택 프레임(stack frame)이라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;힙(heap) 영역&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리의 힙(heap) 영역은 사용자가 직접 관리할 수 있는 '그리고 해야만 하는'&amp;nbsp;메모리 영역입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;힙 영역은 메모리의 낮은&amp;nbsp;주소에서 높은&amp;nbsp;주소의 방향으로 할당됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;포인터&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인터란 변수를 저장하는게 아닌 변수의 주소를 저장하는 것입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 연산자를 사용해서 변수의 메모리 주소에 있는 값을 받아올수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 포인터의 크기는 모두 같은 크기를 가집니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;예를 들어 char*, int*, float* 등 모든 포인터 자료형들은 같은 크기를 가지고 있습니다. 포인터는 그저 주소 값을 저장하는 자료형으로, 메모리의 크기와는 관계가 없습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;16-bit 컴파일러는 16bit 주소로 이루워져 있으므로 포인터의 크기는 16-bit (2 byte)이며, 32-bit 컴파일러는 32-bit 주소로 이루워져 있으므로 포인터의 크기는 32-bit (4 byte)입니다&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5주차 팀미션&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1) 수업에서 언급되었던 Heap overflow와 stack overflow에 대해서 어떤 경우에 발생이 되는지 서술해주세요.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;heap: 동적 변수를 저장하는 데 사용되는 메모리 영역. 힙 영역에는 malloc으로 할당된 메모리의 데이터가 저장된다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;heap overflow: 힙 데이터 영역에서 발생하는 메모리를 다루는 데 오류가 발생하여 잘못된 동작을 하는 버퍼 오버플로의 한 종류&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;heap overflow는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;두 가지 경우&lt;/span&gt;에 발생한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 메모리를 지속적으로 할당하고 사용 후 해당 메모리 공간을 해제하지 않으면 메모리 누수 문제가 발생하고 heap overflow가 발생한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 많은 수의 변수를 동적으로 할당하는 경우에도 heap overflow가 발생한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;stack: 함수 내에서 사용되는 지역 변수, 함수를 통해 전달된 매개 변수 및 반환 주소를 저장하는 데 사용되는 메모리 영역. 스택에는 프로그램 내의 함수와 관련된 것들이 저장된다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;stack overflow: 스택 데이터 영역에서 스택 포인터가 스택의 경계를 넘어설 때 일어나는 버퍼 오버플로의 한 종류&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;stack overflow는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;두 가지 경우&lt;/span&gt;에 발생한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 프로그램이 많은 수의 지역 변수를 선언하거나 배열 또는 행렬 또는 큰 크기의 배열을 선언하는 경우에 stack 크기보다 더 많은 메모리 공간을 사용하면 stack overflow가 발생한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 함수가 반복적으로 자신을 무한히 호출하면 stack은 모든 함수 호출에서 사용되는 많은 수의 지역 변수를 저장할 수 없고, 이 때도 stack overflow가 발생하게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2) Strcpy와 strncpy의 차이점을 서술해보세요. (어떤 것을 추천하는지와 그 이유에 대해서 서술해주세요.)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;strcpy (= string copy):&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사용법: char * strcpy(char * dest, const char * src) / dst : destination, src : source&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기능: stc 문자열을 dst 버퍼에 복사, 저장한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;경우: sizeof(src) 길이 만큼 복사하게되는데 sizeof(dest) 값이 sizeof(src) 보다 같거나 커야하며 작으면 에러가 발생한다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;strncpy (= string new copy):&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사용법: char * strncpy(char * dest, const char * src, size_t n)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기능: 문자열 복사라는 기능은 strcpy와 동일하지만 src 문자열을 얼마나 복사할지 n값으로 지정 &amp;rarr; n 값을 10 으로 설정하면 src 주소부터 10글자만 복사한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;경우: src문자열의 길이만큼 dst 버퍼에 저장하기 때문에 src 문자열의 길이가 제한되므로 버퍼 오버플로우에 있어서 안전하다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>CS50 코칭스터디2기</category>
      <category>C</category>
      <category>CS50</category>
      <category>CS50코칭스터디2기</category>
      <category>C코드</category>
      <category>네이버부스트코스</category>
      <category>부스트코스</category>
      <category>컴퓨터과학</category>
      <category>컴퓨터프로그래밍</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/27</guid>
      <comments>https://eunchankim-dev.tistory.com/27#entry27comment</comments>
      <pubDate>Fri, 19 Feb 2021 18:28:26 +0900</pubDate>
    </item>
    <item>
      <title>[CS50 코칭스터디] CS50 코칭스터디2기_4주차</title>
      <link>https://eunchankim-dev.tistory.com/26</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;4주차_알고리즘&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;알고리즘&lt;/b&gt;은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;b&gt;알고리즘&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;이란&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;입력값을&lt;/b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;출력 값의&lt;/b&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;형태로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;바꾸기 위해&amp;nbsp;&lt;/b&gt;&lt;b&gt;어떤&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;명령&lt;/b&gt;&lt;b&gt;들이 수행되어야&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;하는지에 대한 규칙들의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;순서적 나열&lt;/b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;입니다. 이러한 일련의 순서적 규칙들의 나열 방법에 따라 알고리즘의 종류가 달라집니다. 같은 출력 값이라도 알고리즘적 순서 나열에 따라 출력 값에 도달하는 시간은 서로 다를 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;알고리즘에서 가장 중요한 건 정확성과 효율성입니다.&lt;/p&gt;
&lt;p&gt;정확성은 내가 구현한 알고리즘이 정답을 찾았는지입니다.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;효율성은&amp;nbsp;작업을&amp;nbsp;완료하기까지&amp;nbsp;얼&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;마나 시간과 노력을 덜&amp;nbsp;들일 수&amp;nbsp;있는지에&amp;nbsp;대한&amp;nbsp;척도입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;미션 : &lt;span style=&quot;color: #666666;&quot;&gt;숫자 애너그램 찾기&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;4주 차 팀미션은 알고리즘의 정확성과 효율성을 생각해보면서 코드를 구현해보았습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1612711549817&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;cs50.h&amp;gt;
int main(void) 
{  
  int a[5] = {1, 2, 3, 4, 5}; int b[5] = {5, 4, 3, 2, 1}; // 배열을 프로그램 내에서 선언하여 입력받음
  int temp; 
  for (int i = 0; i &amp;lt; 5; i++) //a 배열을 버블정렬
  {
    for (int j = 0; j &amp;lt; 5 - i - 1; j++ )
    {
      if (a[j] &amp;gt; a[j+1])
      {
        temp = a[j];
        a[j] = a[j+1];
        a[j+1] = temp;
      }
    }
  }
   for (int i = 0; i &amp;lt; 5; i++) //b 배열을 버블정렬
  {
    for (int j = 0; j &amp;lt; 5 - i - 1; j++ )
    {
      if (b[j] &amp;gt; b[j+1])
      {
        temp = b[j];
        b[j] = b[j+1];
        b[j+1] = temp;
      }
    }
  }
  //a와 b가 애너그램이라면 정렬된 배열의 순서에 따른 숫자가 모두 같을 것이므로, 숫자가 같은지 검사할 것
  int flag = 0; //정렬된 두 배열이 같은지 다른지를 표시해주는 지표인 flag 변수를 사용
  for (int i = 0; i &amp;lt; 5; i++) 
  {
      if (a[i] != b[i])
      {
          flag = 1; // 반복루프를 돌다가 특정 위치에서 두 배열의 숫자가 같지 않다면 flag의 값을 1로 바꿈
          break; // 더이상 반복문을 돌 필요가 없으므로 반복문 탈출
      }
  }
  if (flag == 1) // flag가 1로 변했다면 두 배열이 같지 않은 것이므로 애너그램이 아님. 따라서 False 출력
    printf(&quot;False\n&quot;);
  else // flag가 그대로 0의 초기값을 지니고 있다면 두 배열은 애너그램
    printf(&quot;True\n&quot;);
  return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;코드를 구현하면서 아쉬웠던 점은 함수화 모듈화를 해서 구현을 진행하지 못한 점이 아쉽습니다.&lt;/p&gt;
&lt;p&gt;다음 미션에는 아쉬움이 남지 않도록 열심히 해야겠네요!&lt;/p&gt;</description>
      <category>CS50 코칭스터디2기</category>
      <category>C</category>
      <category>CS50</category>
      <category>CS50코칭스터디2기</category>
      <category>C코드</category>
      <category>네이버부스트코스</category>
      <category>부스트코스</category>
      <category>컴퓨터과학</category>
      <category>컴퓨터프로그래밍</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/26</guid>
      <comments>https://eunchankim-dev.tistory.com/26#entry26comment</comments>
      <pubDate>Mon, 8 Feb 2021 00:30:03 +0900</pubDate>
    </item>
    <item>
      <title>[OpenCV]_4. OpenCV 이미지 Processing</title>
      <link>https://eunchankim-dev.tistory.com/25</link>
      <description>&lt;h2&gt;&lt;b&gt;Digital Image&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;디지털 영상은 2차원 행렬의 형태로 표현이 됩니다. 각 격자가 하나의 pixel이 됩니다. 이를 bitmap image라고 합니다.&lt;/p&gt;
&lt;p&gt;우리가 흔이 알고있는 &lt;span&gt;.jpg, .jpeg, .png, .gif&lt;span&gt; 가 비트맵방식입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2383H/btqV35EodvX/VNn6LLM8URUilb6DnwUsW1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2383H/btqV35EodvX/VNn6LLM8URUilb6DnwUsW1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2383H/btqV35EodvX/VNn6LLM8URUilb6DnwUsW1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2383H%2FbtqV35EodvX%2FVNn6LLM8URUilb6DnwUsW1%2Fimg.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;각 pixel의 위치는 2가지 형태로 표현을 할 수가 있는데. 영상좌표와 행렬 위치로 표현이 됩니다.&lt;/p&gt;
&lt;p&gt;영상 좌표는 좌측 상단의 꼭지점을 중심으로 (x,y)로 표현을 합니다. 행렬 위치는 (r,c)로 표현을 합니다. OpenCV에서 영상좌표와 행렬 위치 2가지 형태가 사용되기 때문에 유의해야 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RHwxd/btqV08aPw0z/bhJdwoLFA4qoXlUpWABZR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RHwxd/btqV08aPw0z/bhJdwoLFA4qoXlUpWABZR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RHwxd/btqV08aPw0z/bhJdwoLFA4qoXlUpWABZR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRHwxd%2FbtqV08aPw0z%2FbhJdwoLFA4qoXlUpWABZR1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h2&gt;&lt;b&gt;Digital Image의 유형&lt;/b&gt;&lt;/h2&gt;
&lt;h3&gt;Binary Image&lt;/h3&gt;
&lt;p&gt;Binary Image는 pixel당 1bit로 표현하는 영상을 의미합니다. 즉 흰색과 검은색으로만 표현이 되는 영상입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NOvNi/btqVV32polI/ViqPF5SRk1KCzpcvaK7vJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NOvNi/btqVV32polI/ViqPF5SRk1KCzpcvaK7vJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NOvNi/btqVV32polI/ViqPF5SRk1KCzpcvaK7vJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNOvNi%2FbtqVV32polI%2FViqPF5SRk1KCzpcvaK7vJk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Binary Image&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;원본 이미지를 thresholding처리를 하여 binary image로 변환한 이미지 입니다.&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Grayscale Image&lt;/h3&gt;
&lt;p&gt;Grayscale Image는 Pixel당 8bit, 즉 256단계의 명암(빛의 세기)을 표현할 수 있는 이미지입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpSkhl/btqV2a7jGNw/dW3wK4WFvGivk6kavrzht0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpSkhl/btqV2a7jGNw/dW3wK4WFvGivk6kavrzht0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpSkhl/btqV2a7jGNw/dW3wK4WFvGivk6kavrzht0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpSkhl%2FbtqV2a7jGNw%2FdW3wK4WFvGivk6kavrzht0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Color Image&lt;/h3&gt;
&lt;p&gt;Color 이미지는 pixel의 색을 표현하기 위해서 pixel당 24bit를 사용합니다. 총 16,777,216 가지의 색을 표현할 수 있습니다. 이것을 일반적으로 True color image라고 합니다. pixel은 RGB 각각을 위해서 8bit를 사용하게 됩니다. OpenCV에서는 BGR로 표현을 하기 때문에 Blue-&amp;gt;(255,0,0), Green-&amp;gt;(0,255,0), Red-&amp;gt;(0,0,255), White-&amp;gt;(255,255,255), Black-&amp;gt;(0,0,0)으로 표현할 수 있습니다.&lt;/p&gt;
&lt;p&gt;각 pixel당 3Byte를 사용하기 때문에 용량이 큽니다. 이를 해결하기 위해서 lookup table을 사용하여, 해당 pixel에는 index만 을 저장하기도 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxRAjO/btqVV39cmds/RzJymXvWLoDuzpLl2ik0N1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxRAjO/btqVV39cmds/RzJymXvWLoDuzpLl2ik0N1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxRAjO/btqVV39cmds/RzJymXvWLoDuzpLl2ik0N1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxRAjO%2FbtqVV39cmds%2FRzJymXvWLoDuzpLl2ik0N1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Indexed Color Image&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;RGB Color-space&lt;/h3&gt;
&lt;p&gt;RGB 모델은 빛의 삼원색인 빨간색, 초록색, 파란색을 기본 색으로 사용을 합니다. 정육면체 모델 형태로 표현할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bI6qKl/btqVV3VDR4r/0Z8JBygM7WUkBQkeM4s5M1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bI6qKl/btqVV3VDR4r/0Z8JBygM7WUkBQkeM4s5M1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bI6qKl/btqVV3VDR4r/0Z8JBygM7WUkBQkeM4s5M1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbI6qKl%2FbtqVV3VDR4r%2F0Z8JBygM7WUkBQkeM4s5M1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3&gt;HSV Color-space&lt;/h3&gt;
&lt;p&gt;이미지 처리에서 가장 많이 사용되는 형태의 Color 모델입니다. 하나의 모델에서 색과 채도, 명도를 모두 알 수 있습니다. 원뿔 형태의 모델로 표현이 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;HSV 모델&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byCIOb/btqV36XBsN3/UF3q1mJgkM7t9Fkn7dBLB1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byCIOb/btqV36XBsN3/UF3q1mJgkM7t9Fkn7dBLB1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byCIOb/btqV36XBsN3/UF3q1mJgkM7t9Fkn7dBLB1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyCIOb%2FbtqV36XBsN3%2FUF3q1mJgkM7t9Fkn7dBLB1%2Fimg.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;HSV의 의미는 다음과 같습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;H(ue) : 색상. 일반적인 색을 의미함.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;S(aturation) : 채도. 색읜 순수성을 의미하며 일반적으로 짙다, 흐리다로 표현이 됨. 중심에서 바깥쪽으로 이동하면 채도가 높음.&lt;/li&gt;
&lt;li&gt;V(alue) : 명도. 색의 밝고 어두운 정도. 수직축의 깊이로 표현. 어둡다 밝다로 표현이 됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>programming/Python</category>
      <category>AI</category>
      <category>OpenCV</category>
      <category>PYTHON</category>
      <category>영상처리</category>
      <category>이미지처리</category>
      <category>인공지능</category>
      <category>컴퓨터비전</category>
      <category>코딩</category>
      <category>파이썬</category>
      <category>프로그레밍</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/25</guid>
      <comments>https://eunchankim-dev.tistory.com/25#entry25comment</comments>
      <pubDate>Sun, 7 Feb 2021 01:25:07 +0900</pubDate>
    </item>
    <item>
      <title>[OpenCV]_3. OpenCV 도형 그리기</title>
      <link>https://eunchankim-dev.tistory.com/24</link>
      <description>&lt;p&gt;OpenCV &lt;span&gt;도형 그리기는 동영상이나 이미지에서 필요 영역을 찾은 후에 사용자가 인식하기 쉽게 표시하는 목적으로 사용됩니다. 사각형과 원, 텍스트는 많이 사용됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;&lt;b&gt;Line 그리기&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;cv2.line&lt;span&gt;(&lt;/span&gt;img,&lt;span&gt;&amp;nbsp;&lt;/span&gt;start,&lt;span&gt;&amp;nbsp;&lt;/span&gt;end,&lt;span&gt;&amp;nbsp;&lt;/span&gt;color,&lt;span&gt;&amp;nbsp;&lt;/span&gt;thickness&lt;span&gt;)&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1612534913392&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np
import cv2

#np.zeros로 모두 0 (검정색)으로 되있는 창을 하나 만듭니다.
img = np.zeros((512, 512, 3), np.uint8)

#라인 그리기  적용할이미지  시작좌표     종료 좌표    B     G    R     선의 두께
img = cv2.line( img,      (0, 0),    (511, 511), (255, 255, 255),      5)

cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;300&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdd4Y3/btqVV3OTjL9/Iau0kMoWq4YZypaLQXlZr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdd4Y3/btqVV3OTjL9/Iau0kMoWq4YZypaLQXlZr0/img.png&quot; data-alt=&quot;B G R을 값을 최대의 값을 주었을때 흰색으로 선이 생깁니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdd4Y3/btqVV3OTjL9/Iau0kMoWq4YZypaLQXlZr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcdd4Y3%2FbtqVV3OTjL9%2FIau0kMoWq4YZypaLQXlZr0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;300&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;B G R을 값을 최대의 값을 주었을때 흰색으로 선이 생깁니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1612535138723&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np
import cv2

#np.zeros로 모두 0 (검정색)으로 되있는 창을 하나 만듭니다.
img = np.zeros((512, 512, 3), np.uint8)

#라인 그리기  적용할이미지  시작좌표     종료 좌표    B     G    R     선의 두께
img = cv2.line( img,      (50, 50),    (400, 400), (0, 255,    0),      10)

cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;300&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zcwZC/btqV35RT0ns/mKdKZMtCIk2K0LNGRbkPkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zcwZC/btqV35RT0ns/mKdKZMtCIk2K0LNGRbkPkK/img.png&quot; data-alt=&quot;파라미터를 변경해서 색상과 길이 두께를 변경할수 있습니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zcwZC/btqV35RT0ns/mKdKZMtCIk2K0LNGRbkPkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzcwZC%2FbtqV35RT0ns%2FmKdKZMtCIk2K0LNGRbkPkK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;300&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;파라미터를 변경해서 색상과 길이 두께를 변경할수 있습니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;cv2.line&lt;span&gt;(&lt;/span&gt;img,&lt;span&gt;&amp;nbsp;&lt;/span&gt;start,&lt;span&gt;&amp;nbsp;&lt;/span&gt;end,&lt;span&gt;&amp;nbsp;&lt;/span&gt;color,&lt;span&gt;&amp;nbsp;&lt;/span&gt;thickness&lt;span&gt;)이용하여 선을 그립니다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;img&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 그림을 그릴 이미지 파일&lt;/li&gt;
&lt;li&gt;start&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 시작 좌표(ex; (0,0))&lt;/li&gt;
&lt;li&gt;end&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 종료 좌표(ex; (500. 500))&lt;/li&gt;
&lt;li&gt;color&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; BGR형태의 Color(ex; (255, 0, 0) -&amp;gt; Blue)&lt;/li&gt;
&lt;li&gt;thickness&lt;span&gt;&amp;nbsp;&lt;/span&gt;(int) &amp;ndash; 선의 두께. pixel&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;&lt;b&gt;사각형 그리기&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;cv2.rectangle&lt;span&gt;(&lt;/span&gt;img,&lt;span&gt;&amp;nbsp;&lt;/span&gt;start,&lt;span&gt;&amp;nbsp;&lt;/span&gt;end,&lt;span&gt;&amp;nbsp;&lt;/span&gt;color,&lt;span&gt;&amp;nbsp;&lt;/span&gt;thickness&lt;span&gt;)&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1612535426401&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np
import cv2

#np.zeros로 모두 0 (검정색)으로 되있는 창을 하나 만듭니다.
img = np.zeros((512, 512, 3), np.uint8)

#               적용할이미지  시작좌표    종료 좌표    B     G    R     선의 두께
img = cv2.rectangle(img,      (20, 20), (400, 400),  (255,   255,  0),      3)
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;300&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRavfL/btqVRwxwOWR/K4U2KKOC8iYR2Xa4Ndp5AK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRavfL/btqVRwxwOWR/K4U2KKOC8iYR2Xa4Ndp5AK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRavfL/btqVRwxwOWR/K4U2KKOC8iYR2Xa4Ndp5AK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRavfL%2FbtqVRwxwOWR%2FK4U2KKOC8iYR2Xa4Ndp5AK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;300&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;cv2.rectangle&lt;span&gt;(&lt;/span&gt;img,&lt;span&gt;&amp;nbsp;&lt;/span&gt;start,&lt;span&gt;&amp;nbsp;&lt;/span&gt;end,&lt;span&gt;&amp;nbsp;&lt;/span&gt;color,&lt;span&gt;&amp;nbsp;&lt;/span&gt;thickness&lt;span&gt;) 이용하여 &lt;/span&gt;왼쪽 위에 지점과 오른쪽 아래 지점을 연결하는 사각형을 그립니다.&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;img&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 그림을 그릴 이미지&lt;/li&gt;
&lt;li&gt;start&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 시작 좌표(ex; (0,0))&lt;/li&gt;
&lt;li&gt;end&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 종료 좌표(ex; (500. 500))&lt;/li&gt;
&lt;li&gt;color&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; BGR형태의 Color(ex; (255, 0, 0) -&amp;gt; Blue)&lt;/li&gt;
&lt;li&gt;thickness&lt;span&gt;&amp;nbsp;&lt;/span&gt;(int) &amp;ndash; 선의 두께. pixel&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;&lt;b&gt;원 그리기&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;cv2.circle&lt;span&gt;(&lt;/span&gt;img&lt;span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;center&lt;span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;radian&lt;span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;color&lt;span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;thickness&lt;span&gt;)&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1612536557376&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np
import cv2

#np.zeros로 모두 0 (검정색)으로 되있는 창을 하나 만듭니다.
img = np.zeros((512, 512, 3), np.uint8)

#             적용할이미지  원의중심좌표(x,y)   반지름           B     G    R     선의 두께
img = cv2.circle(  img,          (20,60),          20,           (0,     0,  255),  -1)
img2 = cv2.circle(  img,         (400,50),         100,          (0,   255,   0),  1)

cv2.imshow('image',img)
cv2.imshow('image',img2)

cv2.waitKey(0)
cv2.destroyAllWindows()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;300&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7oUFJ/btqV0EOzA53/LU7Un8XkLhkffYzvGrXht0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7oUFJ/btqV0EOzA53/LU7Un8XkLhkffYzvGrXht0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7oUFJ/btqV0EOzA53/LU7Un8XkLhkffYzvGrXht0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7oUFJ%2FbtqV0EOzA53%2FLU7Un8XkLhkffYzvGrXht0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;300&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;cv2.circle&lt;span&gt;(&lt;/span&gt;img,&lt;span&gt;&amp;nbsp;&lt;/span&gt;center,&lt;span&gt;&amp;nbsp;&lt;/span&gt;radian,&lt;span&gt;&amp;nbsp;&lt;/span&gt;color,&lt;span&gt;&amp;nbsp;&lt;/span&gt;thickness&lt;span&gt;) 이용하여 원을 그립니다. 파라미터 &lt;b&gt;thickness&lt;/b&gt;&lt;span&gt;&lt;span&gt; 값에 따라 1이면 원안이 빈 원을 생성하고 -1이면 원 안쪽의 색상도 채워서 그려집니다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;img&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 그림을 그릴 이미지&lt;/li&gt;
&lt;li&gt;center&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 원의 중심 좌표(x, y)&lt;/li&gt;
&lt;li&gt;radian&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 반지름&lt;/li&gt;
&lt;li&gt;color&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; BGR형태의 Color&lt;/li&gt;
&lt;li&gt;thickness&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 선의 두께, -1 이면 원 안쪽을 채움&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;&lt;b&gt;이미지에 Text 추가&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;cv2.putText&lt;span&gt;(&lt;/span&gt;img,&lt;span&gt;&amp;nbsp;&lt;/span&gt;text,&lt;span&gt;&amp;nbsp;&lt;/span&gt;org,&lt;span&gt;&amp;nbsp;&lt;/span&gt;font,&lt;span&gt;&amp;nbsp;&lt;/span&gt;fontSacle,&lt;span&gt;&amp;nbsp;&lt;/span&gt;color&lt;span&gt;)&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1612537210282&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np
import cv2

#np.zeros로 모두 0 (검정색)으로 되있는 창을 하나 만듭니다.
img = np.zeros((512, 512, 3), np.uint8)

#       적용할이미지  표시할문자열   문자열의 좌표값      폰트             글자크기   B   G   R  선의 두께
cv2.putText(img, 'opencv',       (10,500),    cv2.FONT_HERSHEY_SIMPLEX,   4,      (255,255,255), 10)


cv2.imshow('image',img)


cv2.waitKey(0)
cv2.destroyAllWindows()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;300&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbzYpl/btqV36QPc5h/l3BvYOB6d860spOB3HygNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbzYpl/btqV36QPc5h/l3BvYOB6d860spOB3HygNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbzYpl/btqV36QPc5h/l3BvYOB6d860spOB3HygNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbzYpl%2FbtqV36QPc5h%2Fl3BvYOB6d860spOB3HygNk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;300&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;cv2.putText&lt;span&gt;(&lt;/span&gt;img,&lt;span&gt;&amp;nbsp;&lt;/span&gt;text,&lt;span&gt;&amp;nbsp;&lt;/span&gt;org,&lt;span&gt;&amp;nbsp;&lt;/span&gt;font,&lt;span&gt;&amp;nbsp;&lt;/span&gt;fontSacle,&lt;span&gt;&amp;nbsp;&lt;/span&gt;color&lt;span&gt;) 를 사용해서 택스트를 그립니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;img&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; image&lt;/li&gt;
&lt;li&gt;text&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 표시할 문자열&lt;/li&gt;
&lt;li&gt;org&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 문자열이 표시될 위치. 문자열의 bottom-left corner점&lt;/li&gt;
&lt;li&gt;font&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; font type. CV2.FONT_XXX&lt;/li&gt;
&lt;li&gt;fontSacle&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; Font Size&lt;/li&gt;
&lt;li&gt;color&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; fond color&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>programming/Python</category>
      <category>AI</category>
      <category>OpenCV</category>
      <category>PYTHON</category>
      <category>영상처리</category>
      <category>이미지처리</category>
      <category>인공지능</category>
      <category>컴퓨터비전</category>
      <category>코딩</category>
      <category>파이썬</category>
      <category>프로그레밍</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/24</guid>
      <comments>https://eunchankim-dev.tistory.com/24#entry24comment</comments>
      <pubDate>Sat, 6 Feb 2021 00:02:33 +0900</pubDate>
    </item>
    <item>
      <title>[CS50 코칭스터디] CS50 코칭스터디2기_3주차</title>
      <link>https://eunchankim-dev.tistory.com/23</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;3주차_C언어팀미션&lt;/h2&gt;
&lt;p&gt;3주 차부터는 팀당 1개의 미션을 진행하였습니다.&lt;/p&gt;
&lt;p&gt;그런데 난이도가 갑자기 급격하게 상승한 느낌이 있습니다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;팀 미션은 &lt;/b&gt;학점을 계산해보자! 입니다.&lt;/p&gt;
&lt;p&gt;네이버 부스트 코스에서 미션에 관한 자세한 내용은 공유를 금지한다고 합니다 ㅜㅜ..&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;정답코드&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1611928844098&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;cs50.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
void Determine_Grades(int input, int scores[], char *grades[]);
int main(void)
{
    int input = 0;
    int scores[9] = {95, 90, 85, 80, 75, 70, 65, 60, 0};
    string grades[9] = {&quot;A+&quot;, &quot;A&quot;, &quot;B+&quot;, &quot;B&quot;, &quot;C+&quot;, &quot;C&quot;, &quot;D+&quot;, &quot;D&quot;, &quot;F&quot;};
    printf(&quot;학점 프로그램\n&quot;);
    printf(&quot;종료를 원하면 \&quot;999\&quot;를 입력\n&quot;);
    printf(&quot;[학점 테이블]\n&quot;);
    printf(&quot;점수 : &quot;);
    for (int i = 0; i &amp;lt; 9 ; i++)
    {
        printf(&quot;%4i&quot;, scores[i]);
    }
    printf(&quot;\n&quot;);
    printf(&quot;학점 : &quot;);
    for (int i = 0; i &amp;lt; 9 ; i++)
    {
        printf(&quot;%4s&quot;, grades[i]);
    }
    printf(&quot;\n&quot;);
    while(1)
    {
        input = get_int(&quot;성적을 입력하세요 (0 ~ 100) : &quot;);
        if (input == 999) 
            break;
        Determine_Grades(input, scores, grades);
    }
    printf(&quot;학점 프로그램을 종료합니다.\n&quot;);
}
void Determine_Grades(int input, int scores[], string grades[])
{
    int i;
    for(i = 0; i &amp;lt; 9 ; i++)
    {
        if ( input &amp;gt; 100 || input &amp;lt; 0 )
        {
            printf(&quot;** %i 성적을 올바르게 입력하세요. 범위는 0 ~ 100 입니다.\n&quot;, input);
            break;
        }
        if ( input &amp;gt;= scores[i] )
        {
            printf(&quot;학점은 %s 입니다.\n&quot;, grades[i]);
            break;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3주차 강의에서는 디버깅, 코드의 디자인, 배열, 문자열과 배열, 문자열의 활용, 명령행 인자를 스터디 했습니다&lt;/p&gt;
&lt;p&gt;컴퓨터 프로그래밍을 기초와 C언어를 배우면 배울수록 파이썬이 있어서 다행이다는 생각이 드네요&lt;/p&gt;
&lt;p&gt;그래도 프로그래밍의 기초를 차근차근 배울 수 있어서 좋은 시간이었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;C코드로 코딩을 해보니 파이썬이 정말 편하다는 생각이 정말 많이 듭니다&lt;/p&gt;</description>
      <category>CS50 코칭스터디2기</category>
      <category>C</category>
      <category>CS50</category>
      <category>CS50코칭스터디2기</category>
      <category>C코드</category>
      <category>네이버부스트코스</category>
      <category>부스트코스</category>
      <category>컴퓨터과학</category>
      <category>컴퓨터프로그래밍</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/23</guid>
      <comments>https://eunchankim-dev.tistory.com/23#entry23comment</comments>
      <pubDate>Fri, 29 Jan 2021 23:05:21 +0900</pubDate>
    </item>
    <item>
      <title>[OpenCV]_2. OpenCV 이미지 다루기</title>
      <link>https://eunchankim-dev.tistory.com/22</link>
      <description>&lt;p&gt;Opencv의 가장 기초인 이미지 다루기 입니다.&lt;/p&gt;
&lt;h2&gt;이미지 읽기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;cv2.imread()&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1611557185913&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import cv2


img01 = cv2.imread('D:\Desktop\ssca_en-core\OpenCV\images\myImg\lena.jpg', cv2.IMREAD_COLOR)
img01 = cv2.imread('D:\Desktop\ssca_en-core\OpenCV\images\myImg\lena.jpg', 1) #cv2.IMREAD_COLOR 과 동일합니다.

img02 = cv2.imread('D:\Desktop\ssca_en-core\OpenCV\images\myImg\lena.jpg', cv2.IMREAD_GRAYSCALE)

img03 = cv2.imread('D:\Desktop\ssca_en-core\OpenCV\images\myImg\lena.jpg', cv2.IMREAD_UNCHANGED)

img01.shape

#출력값(256, 256, 3)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;cv2.imread(fileName, flag) &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;이용하여 이미지 파일을 읽습니다. 이미지 파일의 경로는 절대/상대 모두 가능합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;이미지 파일을 flag값에 따라서 읽습니다. 위의 코드와 같이 flag에는 3가지 방법이 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;cv2.IMREAD_COLOR&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 이미지 파일을 Color로 읽어들입니다. 투명한 부분은 무시되며, Default값입니다.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 숫자로 1입니다.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;cv2.IMREAD_GRAYSCALE&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 이미지를 Grayscale로 읽어 들입니다. 실제 이미지 처리시 가장 많이 사용합니다.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;숫자로 0입니다.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;cv2.IMREAD_UNCHANGED&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 이미지파일을 alpha channel까지 포함하여 읽습니다.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 숫자로 -1 입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span&gt;img.shape을 이용하여 &lt;/span&gt;&lt;span&gt;img가 어떤 형태의 행렬인지 확인합니다. 확인하면 이미지는 3차원 행렬로 반환됩니다.&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;(256,256,3) 으로 반환되는데요 순서대로 Y축(세로) X축(가로) , 3은 색을 표현하는 BGR값입니다. 보통은 RGB로 많이 표현하는데&amp;nbsp; opencv는 &lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;B(Blue), G(Green), R(Red)로 표현을 합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;이미지 보기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;cv2.imshow()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1611559091117&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cv2.imshow('Original', img01)
cv2.imshow('Grayscale', img02)
cv2.imshow('Unchange', img03)

cv2.waitKey(0)
cv2.destroyAllWindows()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span&gt;cv2.imshow&lt;span&gt;(&lt;/span&gt;title&lt;span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;image&lt;span&gt;) 읽어드린 이미지를 원도우창에 보여줍니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;title&lt;span&gt;&amp;nbsp;&lt;/span&gt;(str) &amp;ndash; 윈도우 창의 이름&lt;/li&gt;
&lt;li&gt;image&lt;span&gt;&amp;nbsp;&lt;/span&gt;(numpy.ndarray) &amp;ndash;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;cv2.imread()&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;의 return값, 이미지&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span&gt;cv2.waitKey()&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;는 keyboard입력을 대기하는 함수로 0이면 key입력까지 무한대기이며 특정 시간동안 대기하려면 값을 넣어주면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;cv2.destroyAllWindows()&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;는 화면에 나타난 윈도우를 종료합니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;cv2.waitKey(0)&amp;nbsp; 와&lt;/p&gt;
&lt;p&gt;cv2.destroyAllWindows() 는 항상 같이사용하면 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;실행이미지&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5mNpt/btqUBw5C3jI/7hndlyV1oKdMMnobYFVGx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5mNpt/btqUBw5C3jI/7hndlyV1oKdMMnobYFVGx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5mNpt/btqUBw5C3jI/7hndlyV1oKdMMnobYFVGx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5mNpt%2FbtqUBw5C3jI%2F7hndlyV1oKdMMnobYFVGx1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;이미지 저장하기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;cv2.imwrite()&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1611559483068&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cv2.imwrite('Lenagray.png', img02)
cv2.imwrite('Lenaunchange.png', img03)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;cv2.imwrite&lt;span&gt;(&lt;/span&gt;fileName,&lt;span&gt;&amp;nbsp;&lt;/span&gt;image&lt;span&gt;)를 이용해서 이미지를 저장합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fileName&lt;span&gt;&amp;nbsp;&lt;/span&gt;(str) &amp;ndash; 저장될 파일명&lt;/li&gt;
&lt;li&gt;image&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 저장할 이미지&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>programming/Python</category>
      <category>AI</category>
      <category>OpenCV</category>
      <category>PYTHON</category>
      <category>영상처리</category>
      <category>이미지처리</category>
      <category>인공지능</category>
      <category>컴퓨터비전</category>
      <category>코딩</category>
      <category>파이썬</category>
      <category>프로그레밍</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/22</guid>
      <comments>https://eunchankim-dev.tistory.com/22#entry22comment</comments>
      <pubDate>Tue, 26 Jan 2021 17:26:42 +0900</pubDate>
    </item>
    <item>
      <title>[OpenCV]_1. OpenCV 시작하기</title>
      <link>https://eunchankim-dev.tistory.com/21</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;OpenCV&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXV8Y0/btqUGTy4YK1/06FPqQ9QQd3yTcXEkja4l1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXV8Y0/btqUGTy4YK1/06FPqQ9QQd3yTcXEkja4l1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXV8Y0/btqUGTy4YK1/06FPqQ9QQd3yTcXEkja4l1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXV8Y0%2FbtqUGTy4YK1%2F06FPqQ9QQd3yTcXEkja4l1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://opencv.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;opencv.org/&lt;/a&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1611553326882&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Home - OpenCV&quot; data-og-description=&quot;We transform great ideas into amazing digital products. See our work&quot; data-og-host=&quot;opencv.org&quot; data-og-source-url=&quot;https://opencv.org/&quot; data-og-url=&quot;https://opencv.org/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://opencv.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://opencv.org/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Home - OpenCV&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;We transform great ideas into amazing digital products. See our work&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;opencv.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;OpenCV(&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Open Source Computer Vision)는 영상처리, 컴퓨터 비전, 비디오처리, 기계학습등을 포함한 라이브러리 입니다. &lt;span style=&quot;color: #333333;&quot;&gt;OpenCV는 BSD(&lt;span&gt;Berkeley Software Distribution)라이센스를 따르는 소스 공개이며 교육 및 상업 목적 사용이 모두 무료입니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;OpenCV는 초창기에 Intel에서 C언어로 개발된 IPL을 기반으로 만들어졌으며, 현재는 C++로&amp;nbsp; 개발되었으&lt;span&gt;며&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;파이썬&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;자바&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;및&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;매트랩&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;/&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;OCTAVE&lt;span&gt;에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;바인딩&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;되어 프로그래머에게 개발 환경을 지원합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;OpenCV설치&lt;/h2&gt;
&lt;p&gt;OpenCV&lt;span&gt;&amp;nbsp;&lt;/span&gt;모듈은&lt;span&gt;&amp;nbsp;&lt;/span&gt;pip를 통하여 설치할 수 있습니다.&lt;/p&gt;
&lt;p&gt;설치 명령어는&lt;span&gt;&amp;nbsp;&lt;/span&gt;python -m pip install opencv-python&amp;nbsp;입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/benoMX/btqUuMVUbgI/PuSeihueRj2c6KZevVZt9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/benoMX/btqUuMVUbgI/PuSeihueRj2c6KZevVZt9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/benoMX/btqUuMVUbgI/PuSeihueRj2c6KZevVZt9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbenoMX%2FbtqUuMVUbgI%2FPuSeihueRj2c6KZevVZt9k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;설치결과 입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;주피터노트북에서의 설치&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpaFCb/btqULCRbBeH/8r9cdqjwMSaVM6QYVpKVG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpaFCb/btqULCRbBeH/8r9cdqjwMSaVM6QYVpKVG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpaFCb/btqULCRbBeH/8r9cdqjwMSaVM6QYVpKVG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpaFCb%2FbtqULCRbBeH%2F8r9cdqjwMSaVM6QYVpKVG0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;주피터노트북에서는 pip앞에 !를 붙여서 설치하시면 터미널과 동일하게 설치가 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>programming/Python</category>
      <category>OpenCV</category>
      <category>opencv 설치</category>
      <category>PYTHON</category>
      <category>비디오처리</category>
      <category>영상처리</category>
      <category>컴퓨터비전</category>
      <category>파이썬</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/21</guid>
      <comments>https://eunchankim-dev.tistory.com/21#entry21comment</comments>
      <pubDate>Mon, 25 Jan 2021 15:14:09 +0900</pubDate>
    </item>
    <item>
      <title>[Python]_6. 리스트(List)</title>
      <link>https://eunchankim-dev.tistory.com/20</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;리스트(List)&lt;/h2&gt;
&lt;p&gt;리스트는 파이썬에서 가장 강력한 기능 중 하나이며 순서가 있는 값들의 나열 또는 비슷한 성질을 가진 객체의 나열이라고 정의할 수 있습니다.&amp;nbsp; 리스트를 구성하는 값을 요소(element) 혹은 원소라고 부르며 어떠한 타입의 값이든 리스트의 요소로 넣을 수 있습니다. 즉, 한가지 타입으로만 이루어진 리스트 뿐만 아니라, 여러가지 타입의 데이터로 이루어진 리스트를 구성할 수 있습니다.&amp;nbsp; 오늘은 리스트와 관련된 함수중 가장 많이 사용하는 함수들을 알아보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1611496409199&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a = [1, 4, 3]
print(&quot;기본 리스트:&quot;, a)
# 출력문 기본 리스트: [1, 4, 3]

# append()  변수명.append()    리스트에 원소를 하나 삽입할때 사용     O(1)
# 리스트에 원소 삽입
a.append(2)
print(&quot;삽입:&quot;, a)
# 출력문 삽입: [1, 4, 3, 2]

#sort()     변수명.sort()      기본 정렬 기능으로 오름차순으로 정렬한다. O(NlogN)
#sort()     변수명.sort(reverse = True)        내림차순으로 정렬한다. O(NlogN)
a.sort()
print(&quot;오름차순 정렬:&quot;, a)
# 출력문 오름차순 정렬: [1, 2, 3, 4]

a.sort(reverse=True)
print(&quot;내림차순 정렬:&quot;, a)
# 출력문 내림차순 정렬: [4, 3, 2, 1]

#reverse() 변수명.reverse()    리스트의 원소의 순서를 모두 뒤집어 놓는다  O(N)
a.reverse()
print(&quot;원소 뒤집기:&quot;, a)
# 출력문 원소 뒤집기: [1, 2, 3, 4]

#insert()  변수명.insert(삽입할 위치 인덱스, 삽입할 값) 특정한 인덱스 위치에 원소를
#삽입할 때 사용한다.        O(N)
a.insert(0,0)
print(&quot;인덱스 0에 0추가:&quot;,a)
#출력문 인덱스 0에 0추가: [0, 1, 2, 3, 4]

#count()    변수명.count(특정값)    리스트에서 특정한 값을 가지는 데이터의 개수를
# 셀때 사용한다.            O(N)
print(&quot;값이 2인 데이터의 갯수:&quot;, a.count(2))
# 출력문 :값이 2인 데이터의 갯수: 1


#remove()   변수명.remove(특정값)   특정한 값을 갖는 원소를 제거하는데, 값을 가진
# 원소가 여러개면 하나만 제거한다.  O(N)
a.remove(1)
print(&quot;값이 1인 데이터 삭제:&quot;,a)
# 출력문 값이 1인 데이터 삭제: [0, 2, 3, 4]

#~~~~~~~~~~~~~~~~~~~~리스트에서 특정한 값을 모두 제거하는 방법~~~~~~~~~~~~~~~~~~~~~~~~~~~
#특정한 값의 원소를 모두 제거하는 방법 많이쓴다!!!
a =[1, 2, 3, 4, 5, 5, 5]
remove_set = {3,5}

#remove_set에 포함되지 않는 값만 저장
result = [i for i in a if i not in remove_set]
print(result)
# 출력문 [1, 2, 4]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;리스트는 알고리즘을 구현할때 많이 사용하기 때문에 자연스럽게 구현할수 있도록 연습해야합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>programming/Python</category>
      <category>list</category>
      <category>PYTHON</category>
      <category>공부</category>
      <category>리스트</category>
      <category>코딩</category>
      <category>파이썬</category>
      <category>파이썬리스트함수</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/20</guid>
      <comments>https://eunchankim-dev.tistory.com/20#entry20comment</comments>
      <pubDate>Sun, 24 Jan 2021 22:57:19 +0900</pubDate>
    </item>
    <item>
      <title>[CS50 코칭스터디] CS50 코칭스터디2기_2주차</title>
      <link>https://eunchankim-dev.tistory.com/19</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;2주차_C언어팀미션&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #339966;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;문제 1&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;여러분은 기존 오프라인에서 리테일 사업으로 유명한 신선식품 업체에 입사한 개발자 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;최근 디지털 트랜스포메이션 이슈에 따라 기존 오프라인으로 운영하던 리테일 사업을 온라인으로 전환하게 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;여러분에게는 기존 오프라인에서 일어나던 일들을 온라인 쇼핑몰로 전환하는 임무를 진행하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;성공적으로 첫 임무를 완수하여 팀장님의 신임을 얻고 성취감도 느껴보세요!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;이제 입사한지 얼마 되지 않았기 때문에 간단한 재고 관리 프로그램 개발의 일부를 맡게 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;주문이 들어왔을 때 재고량을 적절하게 관리하지 못 하면 재고가 없는 물품의 주문이 추가로 일어날 수 있습니다. 그러면 고객의 불만이 발생할 수 있기 때문에 재고량을 관리가 필요합니다. 또 이렇게 관리한 데이터를 바탕으로 미래의 재고량 수급에 참고 할 수 있을 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;주문이 들어왔을 때 특정 물품의 재고량을 하나 줄이고 매출액을 더하는 일을 하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;기존에 수박의 재고량은 5개였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;이번에 들어온 주문은 수박 3건이며, 해당 물품의 가격은 10000원 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;재고량을 차감해주고 매출액을 구하는 프로그램을 만들어 주세요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;또 매출액에서 부가세를 구해주세요. 부가세는 물품가격의 10% 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;매출액은 물품의 가격과 부가세를 합산한 가격으로 구합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;재고량과 매출액을 구하고 다음의 문구를 출력하도록 프로그램을 구현합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;(수업 내용을 바탕으로 C언어로 구현하며, 변수명은 자유롭게 지정합니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;주문건수 : 0 건&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;기존 재고량 : 0개&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;남은 재고량 : 0개&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;매출액(부가세포함) : 000원&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1611466249579&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;cs50.h&amp;gt;

int main(void)
{
    printf(&quot;재고관리 시스템입니다\n&quot;);
    string product = get_string(&quot;물품의 이름이 무엇인가요: &quot;);      //물품 이름 입력
    int price = get_int(&quot;\n물품의 가격을 입력해주세요. \n','없이 원을 뺀 숫자만 입력해주세요 ex)5000 : &quot;);     //물품 가격 입력
    int stock = get_int(&quot;\n재고량을 입력하세요.\n숫자만 입력해주세요: &quot;);       //재고량 입력
    int order = get_int(&quot;\n주문건수를 입력해주세요.\n숫자만 입력해주세요: &quot;);   //주문건수 입력
    int rest = stock;      //남은 재고량
    float total = 0;       //매출액
    if (order&amp;gt;stock)        //주문건수가 재고량보다 많은 경우
    {
        printf(&quot;현재 재고량보다 물품 %i개 부족합니다. 재주문 혹은 주문 취소 절차가 필요합니다.\n&quot;, order-stock);    //부족한 갯수 출력
    }
    else                    //'재고량 &amp;gt;= 주문건수'인 경우
    {
        for(int i=0;i&amp;lt;order;i++){     //주문이 들어왔을 때 물품의 재고량을 하나 줄이고 매출액 더하기
            rest--;
            total = total + price + price*0.1;
        }
        printf(&quot;\n&quot;);
        printf(&quot;상품명: %s\n&quot;, product);                //상품명 출력
        printf(&quot;주문건수: %i건\n&quot;, order);              //주문건수 출력
        printf(&quot;기존 재고량: %i개\n&quot;, stock);            //기존 재고량 출력
        printf(&quot;남은 재고량: %i개\n&quot;, rest);            //남은 재고량 출력
        printf(&quot;매출액(부가세포함): %.f원\n&quot;, total);   //매출액 출력
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #339966;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;문제 2&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;여러분은 인터넷 은행의 인턴으로 취업을 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;1년 동안 저축을 했을 때 이율을 원금의 1.2%로 주는 예금이 있다고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;고객이 목표금액을 입력하면 1년 만기시 받는 원금과 이자의 합계를 출력해 주는 코드를 작성해 달라는 팀장님의 지시를 받았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;예금액에 따라 만기시 받게 되는 금액을 구하는 코드를 작성해 주세요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1611466346566&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;cs50.h&amp;gt;

float savings(int deposit);     //1년 만기시 받는 원금과 이자의 합계를 구하는 함수 원형 선언

int main()
{
  float money;              
  int deposit = get_int(&quot;목표금액을 입력하세요 : &quot;);       //목표 금액 입력
  money = savings(deposit);                //함수 사용
  printf(&quot;1년 만기시 받게 될 고객님의 총 금액은 %.1f원입니다.\n&quot;, money);     //만기 시 받게 될 금액 출력 
}

float savings(int deposit)         //1년 만기시 받는 원금과 이자의 합계를 구하는 함수
{
    float total = deposit * 1.012;
    return total;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #339966;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;문제 3&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;모바일 프로그래밍을 배우고 프로그래머로 취업을 하려고 하고있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;신장개업을 하는 식당의 어플리케이션을 개발해 달라는 업무가 들어왔습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;이 식당은 손님들의 편의를 위해 모바일앱을 통한 쿠폰이나 서비스를 제공하고자 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;프로모션을 위해 오늘의 메뉴를 할인해서 판매하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;의뢰자는 음식점의 앱에 들어와서 요일을 입력하면 해당 요일의 메뉴를 출력해 달라고 요청을 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;요일을 입력했을 때 해당 요일의 메뉴를 출력해 주는 프로그램을 개발 해서 고객의 요구사항을 잘 구현해 주세요!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;각 요일별 메뉴는 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;월요일 : 청국장&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;화요일 : 비빔밥&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;수요일 : 된장찌개&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;목요일 : 칼국수&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;금요일 : 냉면&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;토요일 : 소불고기&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;일요일 : 오삼불고기&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1611466401721&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;cs50.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;string.h&amp;gt;           // strcmp, 문자열 관련 함수 파일

int main (void) 
{
    char MON[] =&quot;월요일&quot;;
    char TUE[] =&quot;화요일&quot;;
    char WED[] =&quot;수요일&quot;;
    char THU[] =&quot;목요일&quot;;
    char FRI[] =&quot;금요일&quot;;
    char SAT[] =&quot;토요일&quot;;
    char SUN[] =&quot;일요일&quot;;
    
    printf(&quot;음식점에 오신 것을 환영합니다.\n&quot;);
    string day = get_string(&quot;요일을 입력하세요 : &quot;);     //요일 입력받기
    if (strcmp(day, MON)==0) {                  //월요일이 입력된 경우
        string menu = &quot;청국장&quot;;
        printf(&quot;%s : %s\n&quot;,day, menu);
    }
    else if (strcmp(day, TUE)==0) {             //화요일이 입력된 경우
        string menu = &quot;비빔밥&quot;;                 
        printf(&quot;%s : %s\n&quot;, day, menu);
    }
    else if (strcmp(day, WED)==0) {             //수요일이 입력된 경우
        string menu = &quot;된장찌개&quot;;
        printf(&quot;%s : %s\n&quot;, day, menu);
    }
    else if (strcmp(day, THU)==0) {             //목요일이 입력된 경우
        string menu = &quot;칼국수&quot;;
        printf(&quot;%s : %s\n&quot;, day, menu);
    }
    else if (strcmp(day, FRI)==0) {             //금요일이 입력된 경우
        string menu = &quot;냉면&quot;;
        printf(&quot;%s : %s\n&quot;, day, menu);
    }
    else if (strcmp(day, SAT)==0) {             //토요일이 입력된 경우
        string menu = &quot;소불고기&quot;;
        printf(&quot;%s : %s\n&quot;, day, menu);
    }
    else if (strcmp(day, SUN)==0) {             //일요일이 입력된 경우
        string menu = &quot;오삼불고기&quot;;
        printf(&quot;%s : %s\n&quot;, day, menu);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;파이썬으로 처음 코딩을 배웠는데 C언어는 구체적인 구현을 요구해서 조금 더 까다로운것 같습니다..!&lt;/p&gt;
&lt;p&gt;그냥 주 언어는 파이썬으로 ㅋㅋ.. 하지만 C언어가 컴퓨터의 물리적인 부분과 많이 맞닿아 있어서 꼭 배워야하는거는 맞는것 같습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CS50 코칭스터디2기</category>
      <category>CS50</category>
      <category>CS50코칭스터디2기</category>
      <category>c언어</category>
      <category>C언어 문자열</category>
      <category>c언어 자료형</category>
      <category>문자열</category>
      <category>부스트코스</category>
      <category>컴퓨팅 사고</category>
      <category>코딩공부</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/19</guid>
      <comments>https://eunchankim-dev.tistory.com/19#entry19comment</comments>
      <pubDate>Sun, 24 Jan 2021 14:51:00 +0900</pubDate>
    </item>
    <item>
      <title>[CS50 코칭스터디] 컴퓨터는 아날로그 신호인 소리를 어떻게 디지털로 저장하는 걸까요?</title>
      <link>https://eunchankim-dev.tistory.com/18</link>
      <description>&lt;h2&gt;1. 컴퓨터는 아날로그 신호인 소리를 어떻게 디지털로 저장하는 걸까요?&lt;/h2&gt;
&lt;p&gt;컴퓨터에 아날로그 신호인 소리를 저장하려면 일단 소리 대해서 알아야 합니다&lt;/p&gt;
&lt;p&gt;소리란 음 또는 '음파'는 공기나 물 같은 매질의 진동을 통해 전달되는 종파입니다. 쉽게 말해서 진동이라는 뜻입니다.!&lt;/p&gt;
&lt;h2&gt;진동의 단위(herz,hz)&lt;/h2&gt;
&lt;p&gt;1초에 몇 번이나 떨렸는지 표현하기위해 herz, hz라는 단위를 사용합니다 1hz는 1초에 10번 진동했다는 것을 의미합니다. 또한 진동은 자연계에서 발생한 것이기 때문에 아날로그(Analog)의 형태로 나타납니다.&lt;/p&gt;
&lt;h2&gt;소리는 진동이고 아날로그 신호이다&lt;/h2&gt;
&lt;p&gt;아날로그는 신호나 자료를 연속적인 물리량으로 나타낸것입니다.&lt;/p&gt;
&lt;p&gt;연속성의 대표성은 바로 수입니다 1과 2사이에는 1, 1.1, 1.255, 1,36666, &amp;hellip;&amp;hellip; 1.8888, 1.9999 2&lt;/p&gt;
&lt;p&gt;수를 계속해서 쓰다보면 무수히 많은 수가 들어가있습니다.&lt;/p&gt;
&lt;p&gt;이러한 성질을 연속성이라고 부릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8F5wK/btqTwXXG6HI/YiJRB4iuEflbAGam05wzOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8F5wK/btqTwXXG6HI/YiJRB4iuEflbAGam05wzOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8F5wK/btqTwXXG6HI/YiJRB4iuEflbAGam05wzOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8F5wK%2FbtqTwXXG6HI%2FYiJRB4iuEflbAGam05wzOk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;가로 축은 시간, 세로 축은 전압입니다. 아날로그 신호는 아무리 쪼개도 끝이 없는 연속성을 가집니다.&lt;/p&gt;
&lt;p&gt;연속성을 가진 아날로그 신호를 0과 1밖에 이해하지못하는 컴퓨터(디지털)에게 입력하려면 어떻게 해야할까요?&lt;/p&gt;
&lt;p&gt;아날로그를 &amp;rarr; 디지털로 변환시켜서 컴퓨터에게 입력해주어야합니다. 이러한 변환을 해주는 장치를&lt;/p&gt;
&lt;p&gt;바로 &lt;b&gt;ADC(Analog to Digital Converter)&lt;/b&gt; 라고 부릅니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;ADC(Analog to Digital Converter)&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wsX4A/btqTxCTqfyP/3FThNoIvcV6qaKZ4akQgtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wsX4A/btqTxCTqfyP/3FThNoIvcV6qaKZ4akQgtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wsX4A/btqTxCTqfyP/3FThNoIvcV6qaKZ4akQgtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwsX4A%2FbtqTxCTqfyP%2F3FThNoIvcV6qaKZ4akQgtk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;ADC의 프로세스는 &lt;b&gt;표본화, 양자화, 부호화&lt;/b&gt; 과정을 거처 아날로그 신호를 디지털로 저장합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nMtli/btqTwXDuKAm/PhXN7jKmzskKZZu5U3LQk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nMtli/btqTwXDuKAm/PhXN7jKmzskKZZu5U3LQk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nMtli/btqTwXDuKAm/PhXN7jKmzskKZZu5U3LQk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnMtli%2FbtqTwXDuKAm%2FPhXN7jKmzskKZZu5U3LQk1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;표본화 : 아날로그 파형을 디지털 형태로 변환하기 위해 표본을 취하는 것을 의미합니다. 이 때 나이키스트 정리에 따르면 표본화 시 원음을 그대로 반영하기 위해서는 원음이 가지는 최고 주파수의 2배 이상으로 표본화를 해야 합니다.&lt;/li&gt;
&lt;li&gt;양자화는 표본화된 각 점을 어느 정도의 정밀도로 표현할 것인지 정하는 것을 의미합니다. 8 bit로 양자화를 하면 값을 256 단계로 표현할 수 있지만, 정밀도를 높여서 16bit로 양자화를 하면 좀 더 세밀한 65,536 단계로 표현이 가능합니다.&lt;/li&gt;
&lt;li&gt;부호화는 표본화와 양자화를 거친 디지털 정보를 2진수로 표현하는 과정입니다. 대체적으로 사운드 파일의 원본의 용량은 크기 때문에 일반적으로 부호화 과정에서 압축하여 저장합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;결론&lt;/h2&gt;
&lt;p&gt;소리를 컴퓨터에 저장하려면 ADC를 사용하여 아날로그 신호를 디지털로 신호로 변화시켜야 저장이 가능하다 입니다.&lt;/p&gt;</description>
      <category>CS50 코칭스터디2기</category>
      <category>ADC(Analog to Digital Converter)</category>
      <category>CS50 코칭스터디2기</category>
      <category>디지털로 변환</category>
      <category>부호화</category>
      <category>소리</category>
      <category>아날로그 신호</category>
      <category>양자화</category>
      <category>진동</category>
      <category>표본화</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/18</guid>
      <comments>https://eunchankim-dev.tistory.com/18#entry18comment</comments>
      <pubDate>Thu, 14 Jan 2021 20:08:43 +0900</pubDate>
    </item>
    <item>
      <title>[CS50 코칭스터디] CS50 코칭스터디2기_1주차</title>
      <link>https://eunchankim-dev.tistory.com/17</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;CS50 코칭 스터디 2기&amp;nbsp;&lt;/h3&gt;
&lt;p&gt;친구가 네이버 부스트 코스 CS50 강의를 추천해서 수강신청을 할 무렵에 CS50 코칭 스터디 2기를 모집을 하고 있었다. 그냥 공부하는 것보다는 함께 공부하는 게 효율적이고 코치님들이 1:1 밀착관리, CS50 없던 라이브 강의도 진행한다고 해서 신청을 했는데 선발돼버렸다.!! 일단 선발됐으니 6주간 열심히 달려야겠다. ㅋㅋ&lt;/p&gt;
&lt;p&gt;매주마다 팀별 미션, 과제, 퀴즈를 수행해야 하고 이러한 것들이 비전공자인 나에게 개발자가 되는 좋은 발판이 되기를 생각하며 앞으로 블로그에 6주간 공부한 내용을 여기에 작성할 예정이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1주 차_컴퓨팅 사고 요약&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;컴퓨터 과학&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;컴퓨터 과학은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #3366ff;&quot;&gt;문제 해결에 대한 학문&lt;/span&gt;입니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;문제 해결은&lt;span&gt;&amp;nbsp;&lt;/span&gt;입력(input)을 전달받아&lt;span&gt;&amp;nbsp;&lt;/span&gt;출력(output)을 만들어내는 과정입니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;그 중간에 있는 과정이 바로&amp;nbsp;&lt;b&gt;컴퓨터 과학&lt;/b&gt;입니다.&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TflH0/btqTkh9P5ou/mmNKgW0m5cpeRML3ujMoRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TflH0/btqTkh9P5ou/mmNKgW0m5cpeRML3ujMoRk/img.png&quot; data-alt=&quot;출처 :&amp;amp;amp;nbsp;www.boostcourse.org&amp;amp;amp;nbsp;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TflH0/btqTkh9P5ou/mmNKgW0m5cpeRML3ujMoRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTflH0%2FbtqTkh9P5ou%2FmmNKgW0m5cpeRML3ujMoRk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;nbsp;www.boostcourse.org&amp;nbsp;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;/span&gt;알고리즘, 소프트웨어 구조, 컴퓨터 구조등 등이 포함되는 광범위한 학문입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2진법&lt;/h3&gt;
&lt;p&gt;0과 1로만 표현하는 것을 2진법이라고 한다&amp;nbsp;&lt;/p&gt;
&lt;p&gt;컴퓨터는 2진법으로만으로 숫자, 글자, 사진, 영상, 소리 등을 저장할 수 있습니다.&lt;/p&gt;
&lt;p&gt;2진법은 원리만 이해하고 우리가 사용하고 있는 10진법을 2진법으로 바꾸는 것을 몇 번 하면 이해하기 쉽습니다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;비트&lt;/h3&gt;
&lt;p&gt;정보를 저장하고 연산을 수행하기 위한 측정단위이며 binary digit의 줄임말입니다.&lt;/p&gt;
&lt;p&gt;0과 1두 가지 값만 가질 수 있는 측정단위입니다.&lt;/p&gt;
&lt;p&gt;컴퓨터는 저장되어 있는 데이터를 수정하기 위해 비트에 수학적 연산을 수행할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;비트열&lt;/h3&gt;
&lt;p&gt;하나의 비트는&amp;nbsp;0과&amp;nbsp;1, 이 두 가지의 값만 저장할 수 있습니다. 컴퓨터 내부에서 물리적 표현될 때는, 켜고 끌 수 있는 스위치라고 생각할 수 있겠습니다.&amp;nbsp;(켜기=1,&amp;nbsp;끄기=0)&lt;/p&gt;
&lt;p&gt;하지만 비트 한 개는 많은 양의 데이터를 나타내기에 턱없이 부족합니다. 그렇기 때문에 여러 숫자 조합을 컴퓨터에 나타내기 위해 비트열을 사용합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;바이트(byte)는&amp;nbsp;여덟 개의 비트가 모여 만들어진 것입니다. 하나의 바이트에 여덟 개의 비트가 있고, 비트 하나는 0과 1로 표현될 수 있기 때문에&amp;nbsp;2^8&amp;nbsp;= 256&amp;nbsp;개의 서로 다른 바이트가 존재할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;데이터의 표현&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwYF3D/btqThZBS0TL/jGT4tcFf9OTtdkxpuaxqKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwYF3D/btqThZBS0TL/jGT4tcFf9OTtdkxpuaxqKK/img.png&quot; data-alt=&quot;출처 :&amp;amp;amp;nbsp;www.boostcourse.org&amp;amp;amp;nbsp;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwYF3D/btqThZBS0TL/jGT4tcFf9OTtdkxpuaxqKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwYF3D%2FbtqThZBS0TL%2FjGT4tcFf9OTtdkxpuaxqKK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;nbsp;www.boostcourse.org&amp;nbsp;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문자의 표현&lt;/h3&gt;
&lt;p&gt;컴퓨터는 0과 1밖에 모르는데 어떻게 문자를 표현할까요?&lt;/p&gt;
&lt;p&gt;사람들이 문자를 숫자로 표현할 수 있도록 정해진 약속(표준)을 했기 때문입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #3366ff;&quot;&gt;&lt;b&gt;ASCII&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;(아스키코드/American Standard Code for Information Interchange)입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwk7XB/btqTtqEcbp7/5XgyxjTwhJsELOj5kHnEa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwk7XB/btqTtqEcbp7/5XgyxjTwhJsELOj5kHnEa1/img.png&quot; data-alt=&quot;출처:wikipedia.org&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwk7XB/btqTtqEcbp7/5XgyxjTwhJsELOj5kHnEa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbwk7XB%2FbtqTtqEcbp7%2F5XgyxjTwhJsELOj5kHnEa1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처:wikipedia.org&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;span style=&quot;color: #666666;&quot;&gt;문자와 같이 그림, 영상, 음악도 숫자로 표현할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;그림은 RGB 값으로 영상은 수많은 그림을 빠르게 연속적으로 이어 붙여서 표현하고 음악은 아날로그 신호를 디지털 표현으로 바꾸어서 표현합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;알고리즘&amp;nbsp;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;알고리즘이란 입력값을 출력 값의 형태로 바꾸기 위해 어떤 명령들이 수행되어야 하는지에 대한&amp;nbsp;규칙들의 순서적 나열입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;일련의 순서적 규칙들을 어떻게 나열하는지에 따라 알고리즘의 종류가 달라집니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;같은 출력 값이라도 알고리즘에 따라 출력을 하기까지의 시간이 다를 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;알고리즘은 한 번에 몰아서 하기 어려우니 조금씩 꾸준하게 공부해야 합니다..!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;의사 코드&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;의사 코드(슈도 코드,&lt;/b&gt; pseudocode)는 프로그램을 작성할 때 각 모듈이 작동하는 논리를 표현하기 위한 언어입니다. 특정 프로그래밍 언어의 문법에 따라 쓰인 것이 아니라, 일반적인 언어로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;코드&lt;/b&gt;&lt;span&gt;를 흉내 내어 알고리즘을 써놓은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;코드&lt;/b&gt;&lt;span&gt;를 말합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1주 차 개인 미션&lt;/h3&gt;
&lt;p&gt;스크래치로 간단한 프로그램 만들기를 진행하였는데 공 튀기기 프로그램을 만들었습니다.&lt;/p&gt;
&lt;p&gt;스코어가 높아질수록 공 개수가 추가되게 만들고 싶었는데 방법을 못 찾아 아쉬움이 많이 남습니다!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;a href=&quot;https://scratch.mit.edu/projects/472811156/&quot;&gt;https://scratch.mit.edu/projects/472811156/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1610457933610&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;https://scratch.mit.edu/projects/472811156/&quot; data-og-description=&quot;&quot; data-og-host=&quot;scratch.mit.edu&quot; data-og-source-url=&quot;https://scratch.mit.edu/projects/472811156/&quot; data-og-url=&quot;https://scratch.mit.edu/projects/472811156/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://scratch.mit.edu/projects/472811156/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://scratch.mit.edu/projects/472811156/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;https://scratch.mit.edu/projects/472811156/&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;scratch.mit.edu&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;팀미션은 팀원들의 동의를 구한 후 올리도록 하겠습니다..&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&quot;what ultimately matters in this course is not so much where you end up relative to your classmates but where you end up relative to yourself when you began&quot;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;교수님의 명언과 함께 1주 차를 마치도록 하겠습니다!! 화이팅!&lt;/p&gt;</description>
      <category>CS50 코칭스터디2기</category>
      <category>2진법</category>
      <category>ASCII</category>
      <category>CS50</category>
      <category>CS50코칭스터디2기</category>
      <category>부스트코스</category>
      <category>스크래치</category>
      <category>아스키코드</category>
      <category>알고리즘</category>
      <category>의사코드</category>
      <category>컴퓨팅 사고</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/17</guid>
      <comments>https://eunchankim-dev.tistory.com/17#entry17comment</comments>
      <pubDate>Tue, 12 Jan 2021 23:36:31 +0900</pubDate>
    </item>
    <item>
      <title>[Data Science] 공공데이터 사이트 모음(국내 사이트, 해외 사이트)</title>
      <link>https://eunchankim-dev.tistory.com/16</link>
      <description>&lt;p&gt;빅데이터 시대에서 데이터는 하나의 중요한 자산이 되었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;데이터를 파는 회사도 생겨나고 데이터를 구입해 분석한 결과를 판매하는 회사도 생겨나고 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;데이터를 개인이 직접 수집하고 데이터셋을 만드는 것은 쉽지 않습니다.&amp;nbsp; 그래서 오늘은 데이터를 공유하는&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;알려드릴까 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;국내 사이트&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.서울열린데이터광장&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://data.seoul.go.kr/&quot;&gt;https://data.seoul.go.kr/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1609570515356&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;서울 열린데이터광장&quot; data-og-description=&quot;모든 서울시민을 위한 공공데이터 열린데이터광장에서 서울시와 연계 기관이 공개한 공공데이터를 확인하실 수 있습니다. 서울시와 관련된 다양한 공공데이터를 확인해 보세요.&quot; data-og-host=&quot;data.seoul.go.kr&quot; data-og-source-url=&quot;https://data.seoul.go.kr/&quot; data-og-url=&quot;https://data.seoul.go.kr/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://data.seoul.go.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://data.seoul.go.kr/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;서울 열린데이터광장&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;모든 서울시민을 위한 공공데이터 열린데이터광장에서 서울시와 연계 기관이 공개한 공공데이터를 확인하실 수 있습니다. 서울시와 관련된 다양한 공공데이터를 확인해 보세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;data.seoul.go.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;2.공공데이터포털&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://www.data.go.kr&quot;&gt;https://www.data.go.kr&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1609570516309&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;공공데이터 포털&quot; data-og-description=&quot;국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유&amp;bull;활용할 수 있도록 공공데이터(Datase&quot; data-og-host=&quot;www.data.go.kr&quot; data-og-source-url=&quot;https://www.data.go.kr&quot; data-og-url=&quot;https://www.data.go.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cnFLwR/hyIOiBLKEL/1EJNYW9evejBP4EPtEAvq1/img.png?width=390&amp;amp;height=158&amp;amp;face=0_0_390_158&quot;&gt;&lt;a href=&quot;https://www.data.go.kr&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.data.go.kr&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cnFLwR/hyIOiBLKEL/1EJNYW9evejBP4EPtEAvq1/img.png?width=390&amp;amp;height=158&amp;amp;face=0_0_390_158');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;공공데이터 포털&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유&amp;bull;활용할 수 있도록 공공데이터(Datase&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.data.go.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. e-나라지표&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.index.go.kr/&quot;&gt;http://www.index.go.kr/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1609570523668&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;국가지표체계&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.index.go.kr&quot; data-og-source-url=&quot;http://www.index.go.kr/&quot; data-og-url=&quot;http://www.index.go.kr/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;http://www.index.go.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.index.go.kr/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;국가지표체계&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.index.go.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 국가통계포털&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://kosis.kr&quot;&gt;http://kosis.kr&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1609570528732&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;KOSIS 국가통계포털&quot; data-og-description=&quot;&quot; data-og-host=&quot;kosis.kr&quot; data-og-source-url=&quot;http://kosis.kr&quot; data-og-url=&quot;https://kosis.kr/index/index.do&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;http://kosis.kr&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://kosis.kr&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;KOSIS 국가통계포털&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;kosis.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 서울특별시 빅데이터 캠퍼스&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://bigdata.seoul.go.kr/&quot;&gt;https://bigdata.seoul.go.kr/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1609570535383&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;서울특별시 빅데이터 캠프&quot; data-og-description=&quot;&quot; data-og-host=&quot;bigdata.seoul.go.kr&quot; data-og-source-url=&quot;https://bigdata.seoul.go.kr/&quot; data-og-url=&quot;https://bigdata.seoul.go.kr/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://bigdata.seoul.go.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bigdata.seoul.go.kr/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;서울특별시 빅데이터 캠프&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;bigdata.seoul.go.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. 통계청&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://kostat.go.kr/&quot;&gt;http://kostat.go.kr/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1609570540968&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;통계청&quot; data-og-description=&quot;&quot; data-og-host=&quot;kostat.go.kr&quot; data-og-source-url=&quot;http://kostat.go.kr/&quot; data-og-url=&quot;http://kostat.go.kr/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;http://kostat.go.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://kostat.go.kr/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;통계청&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;kostat.go.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;5SKtelecomBigDataHub_5&quot; data-ke-size=&quot;size23&quot;&gt;7. SK telecom Big Data&lt;span&gt;&amp;nbsp;&lt;/span&gt;Hub&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bigdatahub.co.kr/index.do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.bigdatahub.co.kr/index.do&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1609570692512&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;SKT Data Hub&quot; data-og-description=&quot;SKT Data T map 이용 데이터 부산 남도, 수영구, 영도, 해운대구 / 11월 검색지랭킹 TOP5&quot; data-og-host=&quot;www.bigdatahub.co.kr&quot; data-og-source-url=&quot;https://www.bigdatahub.co.kr/index.do&quot; data-og-url=&quot;https://www.bigdatahub.co.kr/index.do&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.bigdatahub.co.kr/index.do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.bigdatahub.co.kr/index.do&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;SKT Data Hub&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;SKT Data T map 이용 데이터 부산 남도, 수영구, 영도, 해운대구 / 11월 검색지랭킹 TOP5&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.bigdatahub.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 id=&quot;5SKtelecomBigDataHub_5&quot; data-ke-size=&quot;size23&quot;&gt;8. 한국소비자원 참가격&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.price.go.kr/tprice/portal/main/main.do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.price.go.kr/tprice/portal/main/main.do&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1609570771590&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;한국소비자원 참가격 정보서비스&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.price.go.kr&quot; data-og-source-url=&quot;http://www.price.go.kr/tprice/portal/main/main.do&quot; data-og-url=&quot;http://www.price.go.kr/tprice/portal/main/main.do&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/UirKh/hyIMpWOXT1/dZa01EY5nv2lajmfTWOvsK/img.jpg?width=550&amp;amp;height=550&amp;amp;face=0_0_550_550&quot;&gt;&lt;a href=&quot;http://www.price.go.kr/tprice/portal/main/main.do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.price.go.kr/tprice/portal/main/main.do&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/UirKh/hyIMpWOXT1/dZa01EY5nv2lajmfTWOvsK/img.jpg?width=550&amp;amp;height=550&amp;amp;face=0_0_550_550');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;한국소비자원 참가격 정보서비스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.price.go.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해외 사이트&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.구글 데이터 검색&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://toolbox.google.com/datasetsearch&quot;&gt;https://toolbox.google.com/datasetsearch&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1609571106975&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Dataset Search&quot; data-og-description=&quot;&quot; data-og-host=&quot;datasetsearch.research.google.com&quot; data-og-source-url=&quot;https://toolbox.google.com/datasetsearch&quot; data-og-url=&quot;https://datasetsearch.research.google.com&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://toolbox.google.com/datasetsearch&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://toolbox.google.com/datasetsearch&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Dataset Search&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;datasetsearch.research.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.캐글&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.kaggle.com/datasets&quot;&gt;https://www.kaggle.com/datasets&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1609571108468&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Find Open Datasets and Machine Learning Projects | Kaggle&quot; data-og-description=&quot;Download Open Datasets on 1000s of Projects + Share Projects on One Platform. Explore Popular Topics Like Government, Sports, Medicine, Fintech, Food, More. Flexible Data Ingestion.&quot; data-og-host=&quot;www.kaggle.com&quot; data-og-source-url=&quot;https://www.kaggle.com/datasets&quot; data-og-url=&quot;https://www.kaggle.com/datasets&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.kaggle.com/datasets&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.kaggle.com/datasets&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Find Open Datasets and Machine Learning Projects | Kaggle&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Download Open Datasets on 1000s of Projects + Share Projects on One Platform. Explore Popular Topics Like Government, Sports, Medicine, Fintech, Food, More. Flexible Data Ingestion.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.kaggle.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.Awesome Public Datasets Github&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/awesomedata/awesome-public-datasets&quot;&gt;https://github.com/awesomedata/awesome-public-datasets&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1609571113487&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;object&quot; data-og-title=&quot;awesomedata/awesome-public-datasets&quot; data-og-description=&quot;A topic-centric list of HQ open datasets. Contribute to awesomedata/awesome-public-datasets development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/awesomedata/awesome-public-datasets&quot; data-og-url=&quot;https://github.com/awesomedata/awesome-public-datasets&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/sNPkC/hyIOlL12DO/QFeyfteUk2TNeKtFLnhxc0/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400&quot;&gt;&lt;a href=&quot;https://github.com/awesomedata/awesome-public-datasets&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/awesomedata/awesome-public-datasets&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/sNPkC/hyIOlL12DO/QFeyfteUk2TNeKtFLnhxc0/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;awesomedata/awesome-public-datasets&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;A topic-centric list of HQ open datasets. Contribute to awesomedata/awesome-public-datasets development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.Data and Story Library&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://dasl.datadescription.com/&quot;&gt;https://dasl.datadescription.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1609571122195&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;DASL    | Data and Story Library&quot; data-og-description=&quot;Welcome to DASL &amp;ndash; The Data And Story Library The Data And Story Library is brought to you by Data Description, creators of Data Desk: Data Analysis and Exploration software. Data Desk embodies the philosophy that &amp;ldquo;seeing is understanding&amp;rdquo;. DASL in on&quot; data-og-host=&quot;dasl.datadescription.com&quot; data-og-source-url=&quot;https://dasl.datadescription.com/&quot; data-og-url=&quot;https://dasl.datadescription.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bwyn2B/hyIOlrJrbW/kiZ7BNVKcbUGPofguYXUBK/img.jpg?width=1220&amp;amp;height=400&amp;amp;face=0_0_1220_400,https://scrap.kakaocdn.net/dn/bLwLtM/hyIOoaU9Sj/D3PcMdtdjTMT4ky4hcu491/img.png?width=741&amp;amp;height=309&amp;amp;face=0_0_741_309&quot;&gt;&lt;a href=&quot;https://dasl.datadescription.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dasl.datadescription.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bwyn2B/hyIOlrJrbW/kiZ7BNVKcbUGPofguYXUBK/img.jpg?width=1220&amp;amp;height=400&amp;amp;face=0_0_1220_400,https://scrap.kakaocdn.net/dn/bLwLtM/hyIOoaU9Sj/D3PcMdtdjTMT4ky4hcu491/img.png?width=741&amp;amp;height=309&amp;amp;face=0_0_741_309');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;DASL | Data and Story Library&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Welcome to DASL &amp;ndash; The Data And Story Library The Data And Story Library is brought to you by Data Description, creators of Data Desk: Data Analysis and Exploration software. Data Desk embodies the philosophy that &amp;ldquo;seeing is understanding&amp;rdquo;. DASL in on&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;dasl.datadescription.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.데이터허브&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://datahub.io/&quot;&gt;https://datahub.io/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1609570967410&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Home&quot; data-og-description=&quot;Find, Share and Publish Quality Data Online. The fastest way for individuals, teams and organizations to publish, deploy and share their data.&quot; data-og-host=&quot;datahub.io&quot; data-og-source-url=&quot;https://datahub.io/&quot; data-og-url=&quot;https://datahub.io/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cfsWo0/hyIMyfboti/BW2tKlWo5V1PxUv41FpQd0/img.png?width=1414&amp;amp;height=1418&amp;amp;face=0_0_1414_1418,https://scrap.kakaocdn.net/dn/bAoFNR/hyIMzymRZB/I6uUEwhgheWHdG5FEtSxg0/img.png?width=1414&amp;amp;height=1418&amp;amp;face=0_0_1414_1418,https://scrap.kakaocdn.net/dn/kENQB/hyIMpvKYrL/r7w9PAkbKAjLPbMbd1O3aK/img.png?width=486&amp;amp;height=360&amp;amp;face=0_0_486_360&quot;&gt;&lt;a href=&quot;https://datahub.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://datahub.io/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cfsWo0/hyIMyfboti/BW2tKlWo5V1PxUv41FpQd0/img.png?width=1414&amp;amp;height=1418&amp;amp;face=0_0_1414_1418,https://scrap.kakaocdn.net/dn/bAoFNR/hyIMzymRZB/I6uUEwhgheWHdG5FEtSxg0/img.png?width=1414&amp;amp;height=1418&amp;amp;face=0_0_1414_1418,https://scrap.kakaocdn.net/dn/kENQB/hyIMpvKYrL/r7w9PAkbKAjLPbMbd1O3aK/img.png?width=486&amp;amp;height=360&amp;amp;face=0_0_486_360');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Home&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Find, Share and Publish Quality Data Online. The fastest way for individuals, teams and organizations to publish, deploy and share their data.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;datahub.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;6. worldbank&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://data.worldbank.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;data.worldbank.org/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1609571124840&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;World Bank Open Data | Data&quot; data-og-description=&quot;Learn how the World Bank Group is helping countries with COVID-19 (coronavirus). Find Out&quot; data-og-host=&quot;data.worldbank.org&quot; data-og-source-url=&quot;https://data.worldbank.org/&quot; data-og-url=&quot;https://data.worldbank.org/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/VGIk6/hyIOksPc5N/5wdMdQ0NRCRSKKssiV2DAK/img.png?width=555&amp;amp;height=315&amp;amp;face=0_0_555_315&quot;&gt;&lt;a href=&quot;https://data.worldbank.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://data.worldbank.org/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/VGIk6/hyIOksPc5N/5wdMdQ0NRCRSKKssiV2DAK/img.png?width=555&amp;amp;height=315&amp;amp;face=0_0_555_315');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;World Bank Open Data | Data&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Learn how the World Bank Group is helping countries with COVID-19 (coronavirus). Find Out&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;data.worldbank.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;데이터에 저장권이 있기도 하니, 데이터를 사용하실때는 잘 확인하시고 사용하시길 바랍니다!&lt;/p&gt;</description>
      <category>Data Science</category>
      <category>DATA</category>
      <category>DataScience</category>
      <category>Dataset</category>
      <category>공공데이터</category>
      <category>공유</category>
      <category>공유데이터</category>
      <category>국내데이터사이트</category>
      <category>데이터</category>
      <category>데이터셋</category>
      <category>해외데이터사이트</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/16</guid>
      <comments>https://eunchankim-dev.tistory.com/16#entry16comment</comments>
      <pubDate>Thu, 7 Jan 2021 17:07:58 +0900</pubDate>
    </item>
    <item>
      <title>[Git,GitHub]3. GitHub의 README.md 작성예시</title>
      <link>https://eunchankim-dev.tistory.com/15</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;README.md&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;깃허브에서 대부분, 아니 거의 모든 프로젝트에는 빠지지 않는 파일이 있습니다. 바로 README 파일입니다.&lt;/p&gt;
&lt;p&gt;README파일은 &lt;span style=&quot;color: #333333;&quot;&gt;README.TXT&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;README.md&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;README.1ST&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;READ.ME 다양한 파일의 형태로 만들기도 하는데 보통은. md 확장자 마크다운 언어를 사용해서 작성하고&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- 프로젝트가 어떤 프로젝트인지 설명하거나&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- 프그램의 주요 사용법을 알려주거나&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- 프로그램을 실행시키려면 어떤 사전작업이 필요한지를&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- 라이센스에 관해서&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;알려주는 내용이 적혔잇습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;GitHub에서는 README파일을 프로젝트의 메인 화면에 보여주기 때문에 README.md 파일의 내용을 가독성이게 작성하는 것이 중요합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래는 Numpy의 README.md입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w3zEf/btqR9mYKL83/nQfKUAPFLKyS6hr1ONF7I1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w3zEf/btqR9mYKL83/nQfKUAPFLKyS6hr1ONF7I1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w3zEf/btqR9mYKL83/nQfKUAPFLKyS6hr1ONF7I1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw3zEf%2FbtqR9mYKL83%2FnQfKUAPFLKyS6hr1ONF7I1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;프로젝트 README.md 파일을 작성하실 때 한번 참고해보시면 좋을 듯합니다.!&lt;/p&gt;</description>
      <category>programming/Git,Github</category>
      <category>Git</category>
      <category>github</category>
      <category>README</category>
      <category>README.md</category>
      <category>README.md 예시</category>
      <category>깃</category>
      <category>깃허브</category>
      <author>EunChan_Kim</author>
      <guid isPermaLink="true">https://eunchankim-dev.tistory.com/15</guid>
      <comments>https://eunchankim-dev.tistory.com/15#entry15comment</comments>
      <pubDate>Tue, 5 Jan 2021 15:06:55 +0900</pubDate>
    </item>
  </channel>
</rss>