<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>When will you grow up?</title>
    <link>https://boysboy3.tistory.com/</link>
    <description>점차 나아가는 나를 발견하다</description>
    <language>ko</language>
    <pubDate>Thu, 23 Apr 2026 12:42:44 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>미카이</managingEditor>
    <item>
      <title>복잡한 딥러닝 논문,  짧은 코드로 구현하기</title>
      <link>https://boysboy3.tistory.com/193</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;딥러닝 연구를 하다 보면 최첨단 기술을 소개하는 논문들을 마주하게 됩니다. 하지만 이 논문들을 처음부터 끝까지 이해하고, 이를 코드로 구현하는 것은 상당히 많은 시간과 노력이 필요합니다. 이런 고민을 덜어줄 멋진 프로젝트가 있어 소개합니다: &lt;b&gt;&lt;a href=&quot;https://github.com/MaximeVandegar/Papers-in-100-Lines-of-Code&quot;&gt;&lt;span&gt;Papers&lt;/span&gt;&lt;span&gt;-in&lt;/span&gt;&lt;span&gt;-100&lt;/span&gt;&lt;span&gt;-Lines&lt;/span&gt;&lt;span&gt;-of&lt;/span&gt;&lt;span&gt;-Code&lt;/span&gt;&lt;/a&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Papers-in-100-Lines-of-Code란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 프로젝트는 유명한 딥러닝 논문들을 단 100줄의 코드로 간결하게 재현하는 것을 목표로 합니다. 복잡한 알고리즘과 긴 코드 없이도 논문의 핵심 아이디어를 이해하고 재현할 수 있도록 설계된 코드를 제공합니다.&lt;br /&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;/b&gt;: 논문의 복잡한 내용을 최소한의 코드로 표현.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;빠른 이해&lt;/b&gt;: 논문의 주요 아이디어를 빠르게 파악.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;학습 도구&lt;/b&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;가끔씩 보면서 구현 능력 키우면 좋을 것 같다.&lt;/p&gt;</description>
      <category>02. Study/Trends</category>
      <category>ai paper implemented</category>
      <category>ai 논문 구현</category>
      <category>nerf 논문 구현</category>
      <category>papers implemented</category>
      <category>pytorch 논문 구현</category>
      <category>논문구현</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/193</guid>
      <comments>https://boysboy3.tistory.com/193#entry193comment</comments>
      <pubDate>Sun, 8 Dec 2024 23:55:38 +0900</pubDate>
    </item>
    <item>
      <title>[Error] torch.distributed.elastic.multiprocessing.errors.ChildFailedError 오류</title>
      <link>https://boysboy3.tistory.com/192</link>
      <description>&lt;h1&gt;Multi-GPU Training 중 발생한 오류 해결 사례 공유&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 Multi-GPU Training을 진행하던 중 아래와 같은 오류가 발생하여 학습이 중단되는 상황을 겪었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1733661520186&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;torch.distributed.elastic.multiprocessing.errors.ChildFailedError&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;오류를&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;방법을&amp;nbsp;공유하고자&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;1. 오류 발생 원인 추정&lt;/h2&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;RAM 부족&lt;/li&gt;
&lt;li&gt;GPU Memory 부족&lt;/li&gt;
&lt;li&gt;PyTorch 버전 문제&lt;/li&gt;
&lt;li&gt;Batch Size 설정 문제&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;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 시도한 해결 방법&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(1) &lt;b&gt;shm(SHared Memory) 확장&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Multi-GPU 환경에서 데이터를 로드하는 과정에서 공유 메모리 부족 문제가 발생할 수 있습니다. 이를 해결하기 위해 --shm-size 옵션을 사용하여 Docker 컨테이너의 공유 메모리를 확장했습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1733661597205&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run --shm-size=8g ...&lt;/code&gt;&lt;/pre&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;h3 data-ke-size=&quot;size23&quot;&gt;(2) &lt;b&gt;PyTorch 버전 변경&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 중이던 PyTorch 버전이 2.0.4였는데, 이를 최신 버전인 2.4.0으로 업데이트해 보았습니다. PyTorch는 버전 간 성능 최적화나 버그 픽스가 포함되므로, 이를 변경하면 문제가 해결되는 경우도 많습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업데이트 명령은 다음과 같습니다:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1733661618280&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install torch==2.4.0&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&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;h3 data-ke-size=&quot;size23&quot;&gt;(3) &lt;b&gt;Batch Size 조절&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 설정된 Batch Size는 128이었습니다. 이를 줄여서 GPU 메모리 사용량을 낮춰 보기로 했습니다. Batch Size를 64로 절반 줄인 후 다시 학습을 실행했더니, 오류 없이 학습이 진행되는 것을 확인했습니다.&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;코드별 다양한 예시가 있겠지만, 내 학습의 경우 batch_size를 다음과 같이 수정할 수 있었다.&lt;/p&gt;
&lt;pre id=&quot;code_1733661671689&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;train_loader = DataLoader(dataset, batch_size=64, shuffle=True)&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;이 글이 비슷한 문제를 겪고 있는 분들께 도움이 되길 바랍니다!  &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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://discuss.huggingface.co/t/torch-distributed-elastic-multiprocessing-errors-childfailederror/28242&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://discuss.huggingface.co/t/torch-distributed-elastic-multiprocessing-errors-childfailederror/28242&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/Vision-CAIR/MiniGPT-4/issues/237&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/Vision-CAIR/MiniGPT-4/issues/237&lt;/a&gt;&lt;/p&gt;</description>
      <category>02. Study/Error</category>
      <category>batch size 조절</category>
      <category>multi gpu 학습 오류</category>
      <category>multiprocessing error</category>
      <category>torch childfailederror</category>
      <category>torch 학습 오류</category>
      <category>torch.distributed.elastic.multiprocessing.errors.childfailederror</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/192</guid>
      <comments>https://boysboy3.tistory.com/192#entry192comment</comments>
      <pubDate>Sun, 8 Dec 2024 21:42:00 +0900</pubDate>
    </item>
    <item>
      <title>[Monkey Patch] Pytorch 몽키패치 사용하기</title>
      <link>https://boysboy3.tistory.com/191</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;몽키패치(Monkey Patch)&lt;/b&gt;는 실행 중인 프로그램의 동작을 변경하기 위해 기존의 코드나 메소드를 동적으로 수정하거나 재정의하는 기법입니다. 파이썬에서는 클래스나 함수의 속성을 런타임에 변경할 수 있기 때문에 몽키패치가 자주 사용됩니다. PyTorch에서도 특정 기능을 커스터마이징하거나 디버깅, 실험적인 코드 변경 등을 위해 몽키패치를 활용할 수 있습니다.&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;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬의 동적 속성 변경을 활용해 기존 모듈이나 클래스의 메서드를 재정의하거나 새로운 속성을 추가합니다. 아래는 간단한 예시입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1732262456391&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MyClass:
    def original_method(self):
        print(&quot;Original Method&quot;)

# 기존 메서드를 변경
def monkey_patched_method(self):
    print(&quot;Monkey Patched Method&quot;)

MyClass.original_method = monkey_patched_method

# 실행
obj = MyClass()
obj.original_method()  # &quot;Monkey Patched Method&quot; 출력&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;h3 data-ke-size=&quot;size23&quot;&gt;PyTorch에서의 몽키패치 예시&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. &lt;b&gt;torch.nn.Module의 Forward 메서드 패치&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;torch.nn.Module의 forward 메서드를 패치해 디버깅 메시지를 추가하거나 동작을 변경할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1732262473330&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import torch
import torch.nn as nn

# 기존 모델 정의
class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.linear = nn.Linear(10, 1)
    
    def forward(self, x):
        return self.linear(x)

model = SimpleModel()

# 원래의 forward를 저장
original_forward = model.forward

# forward 메서드를 패치
def patched_forward(x):
    print(&quot;Input Tensor:&quot;, x)
    output = original_forward(x)
    print(&quot;Output Tensor:&quot;, output)
    return output

model.forward = patched_forward

# 실행
x = torch.randn(1, 10)
model(x)&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;2. &lt;b&gt;Layer 패치로 특정 동작 변경&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, torch.nn.ReLU를 다른 활성화 함수로 대체할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1732262490818&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import torch.nn.functional as F

# ReLU를 LeakyReLU로 패치
original_relu = nn.ReLU.forward

def patched_relu(self, input):
    print(&quot;ReLU is now LeakyReLU&quot;)
    return F.leaky_relu(input, negative_slope=0.1)

nn.ReLU.forward = patched_relu

# 모델 테스트
model = nn.Sequential(nn.Linear(10, 20), nn.ReLU())
x = torch.randn(1, 10)
output = model(x)&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;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;코드 유지보수 어려움&lt;/b&gt;: 동작이 암묵적으로 변경되므로, 협업 환경에서 예기치 못한 버그를 초래할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;안정성&lt;/b&gt;: PyTorch 업데이트 시 내부 구현이 변경되면 패치된 코드가 깨질 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;디버깅 난이도&lt;/b&gt;: 어디서 변경되었는지 추적하기 어렵습니다.&lt;/li&gt;
&lt;/ol&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;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;상속&lt;/b&gt;: 필요한 클래스나 메서드를 상속받아 수정.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;커스터마이징&lt;/b&gt;: PyTorch 모듈과 기능은 높은 유연성을 제공하므로, 커스텀 구현을 고려.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;함수 래핑&lt;/b&gt;: 기존 메서드를 감싸는 방식을 사용해 변경 내용을 분리.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몽키패치는 주로 빠른 프로토타이핑이나 실험에 유용하지만, 정식 코드에서는 신중하게 사용해야 합니다.&lt;/p&gt;</description>
      <category>02. Study/Pytorch</category>
      <category>monkey patch</category>
      <category>python monkey patch</category>
      <category>pytorch monkey patch</category>
      <category>몽키패치</category>
      <category>파이썬 몽키패치</category>
      <category>파이토치 몽키패치</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/191</guid>
      <comments>https://boysboy3.tistory.com/191#entry191comment</comments>
      <pubDate>Mon, 2 Dec 2024 21:25:57 +0900</pubDate>
    </item>
    <item>
      <title>[이미지 생성 SOTA] red_panda? Recraft!</title>
      <link>https://boysboy3.tistory.com/190</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;최근에 FLUX 1.1[pro]를 제치고 새로운 강자로 떠오르는 이미지 생성모델이 나왔다.&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;1560&quot; data-origin-height=&quot;690&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OJeRU/btsKrwUTxf8/QKLp4G6bmZ0LJBhafHCLk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OJeRU/btsKrwUTxf8/QKLp4G6bmZ0LJBhafHCLk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OJeRU/btsKrwUTxf8/QKLp4G6bmZ0LJBhafHCLk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOJeRU%2FbtsKrwUTxf8%2FQKLp4G6bmZ0LJBhafHCLk0%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;1560&quot; height=&quot;690&quot; data-origin-width=&quot;1560&quot; data-origin-height=&quot;690&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;출저 : &lt;a href=&quot;https://artificialanalysis.ai/text-to-image&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://artificialanalysis.ai/text-to-image&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730384758329&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Text to Image Models and Providers Leaderboard | Artificial Analysis&quot; data-og-description=&quot;Analysis of Text to Image AI models and providers across quality, generation time and price. Analysis to help you choose the best Text to Image model and provider for your use-case.&quot; data-og-host=&quot;artificialanalysis.ai&quot; data-og-source-url=&quot;https://artificialanalysis.ai/text-to-image&quot; data-og-url=&quot;https://artificialanalysis.ai/text-to-image&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cbhpCE/hyXs01le3m/7mq3KKHkbdsPU9eZoZc230/img.png?width=1260&amp;amp;height=700&amp;amp;face=0_0_1260_700,https://scrap.kakaocdn.net/dn/TS40A/hyXsUfKDhY/D7n3k8O71i5KKDtbLYGvM0/img.png?width=1260&amp;amp;height=700&amp;amp;face=0_0_1260_700,https://scrap.kakaocdn.net/dn/w2aUl/hyXpC8TmX2/PjH6onwaXCGWIcY326s2Y0/img.png?width=277&amp;amp;height=150&amp;amp;face=0_0_277_150&quot;&gt;&lt;a href=&quot;https://artificialanalysis.ai/text-to-image&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://artificialanalysis.ai/text-to-image&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cbhpCE/hyXs01le3m/7mq3KKHkbdsPU9eZoZc230/img.png?width=1260&amp;amp;height=700&amp;amp;face=0_0_1260_700,https://scrap.kakaocdn.net/dn/TS40A/hyXsUfKDhY/D7n3k8O71i5KKDtbLYGvM0/img.png?width=1260&amp;amp;height=700&amp;amp;face=0_0_1260_700,https://scrap.kakaocdn.net/dn/w2aUl/hyXpC8TmX2/PjH6onwaXCGWIcY326s2Y0/img.png?width=277&amp;amp;height=150&amp;amp;face=0_0_277_150');&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;Text to Image Models and Providers Leaderboard | Artificial Analysis&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Analysis of Text to Image AI models and providers across quality, generation time and price. Analysis to help you choose the best Text to Image model and provider for your use-case.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;artificialanalysis.ai&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;처음에는 red_panda라고 NAME이 나와서 제조사나 모델도 알려지지 않은 상태였습니다.&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;Red&amp;nbsp;Panda&amp;nbsp;AI:&amp;nbsp;이미지&amp;nbsp;생성의&amp;nbsp;새로운&amp;nbsp;강자 &lt;br /&gt;최근&amp;nbsp;AI&amp;nbsp;이미지&amp;nbsp;생성&amp;nbsp;분야에&amp;nbsp;새로운&amp;nbsp;강자가&amp;nbsp;등장했습니다.&amp;nbsp;바로&amp;nbsp;'Red&amp;nbsp;Panda&amp;nbsp;AI'입니다.&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;있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;압도적인 성능&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Red&amp;nbsp;Panda&amp;nbsp;AI는&amp;nbsp;현재&amp;nbsp;72%라는&amp;nbsp;놀라운&amp;nbsp;승률을&amp;nbsp;기록하며,&amp;nbsp;FLUX&amp;nbsp;1.1&amp;nbsp;Pro,&amp;nbsp;Ideogram&amp;nbsp;v2,&amp;nbsp;Midjourney&amp;nbsp;v6.1과&amp;nbsp;같은&amp;nbsp;유명&amp;nbsp;모델들을&amp;nbsp;능가하고&amp;nbsp;있습니다.&amp;nbsp;특히&amp;nbsp;최고의&amp;nbsp;경쟁자보다&amp;nbsp;40&amp;nbsp;Elo&amp;nbsp;높은&amp;nbsp;점수를&amp;nbsp;자랑하며,&amp;nbsp;그&amp;nbsp;우수성을&amp;nbsp;입증하고&amp;nbsp;있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;뛰어난 품질과 일관성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Red&amp;nbsp;Panda&amp;nbsp;AI의&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;정확도로&amp;nbsp;사실적인&amp;nbsp;비주얼과&amp;nbsp;복잡한&amp;nbsp;디자인을&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;OpenAI와의 연관성?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업계에서는&amp;nbsp;Red&amp;nbsp;Panda&amp;nbsp;AI가&amp;nbsp;OpenAI의&amp;nbsp;최신&amp;nbsp;텍스트-이미지&amp;nbsp;모델일&amp;nbsp;가능성에&amp;nbsp;대해&amp;nbsp;추측하고&amp;nbsp;있습니다.&amp;nbsp;OpenAI의&amp;nbsp;고급&amp;nbsp;일관성&amp;nbsp;모델&amp;nbsp;기술을&amp;nbsp;사용했다면,&amp;nbsp;이는&amp;nbsp;Red&amp;nbsp;Panda&amp;nbsp;AI의&amp;nbsp;뛰어난&amp;nbsp;속도와&amp;nbsp;품질을&amp;nbsp;설명할&amp;nbsp;수&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;위와 같은 의문을 가지고 있었으며 그리고 이름도 판다로 되어있어서 중국회사로 처음엔 많이 유추되다가 &lt;b&gt;Recraft&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;Recraft AI는 전문 디자이너들을 위한 프리미엄 AI 이미지 생성 및 편집 도구입니다. 이 플랫폼은 창의적인 작업 과정을 더욱 즐겁고 효율적으로 만들어주며, 무한한 디자인 가능성을 제공한다고 합니다.&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;2429&quot; data-origin-height=&quot;952&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz8XOt/btsKtc8tqJd/xb5TINIEcy7A0jn1yUkX8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz8XOt/btsKtc8tqJd/xb5TINIEcy7A0jn1yUkX8k/img.png&quot; data-alt=&quot;recraft.ai&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz8XOt/btsKtc8tqJd/xb5TINIEcy7A0jn1yUkX8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz8XOt%2FbtsKtc8tqJd%2Fxb5TINIEcy7A0jn1yUkX8k%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;2429&quot; height=&quot;952&quot; data-origin-width=&quot;2429&quot; data-origin-height=&quot;952&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;recraft.ai&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;주요 기능 살펴보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;AI&amp;nbsp;이미지&amp;nbsp;생성기&lt;/b&gt;:&amp;nbsp;사실적인&amp;nbsp;이미지부터&amp;nbsp;벡터&amp;nbsp;아트,&amp;nbsp;일러스트레이션까지&amp;nbsp;다양한&amp;nbsp;스타일&amp;nbsp;구현 &lt;br /&gt;&lt;b&gt;AI&amp;nbsp;이미지&amp;nbsp;벡터화&lt;/b&gt;:&amp;nbsp;래스터&amp;nbsp;이미지를&amp;nbsp;고품질&amp;nbsp;벡터&amp;nbsp;그래픽으로&amp;nbsp;변환 &lt;br /&gt;&lt;b&gt;목업&amp;nbsp;생성기&lt;/b&gt;:&amp;nbsp;디자인을&amp;nbsp;실제&amp;nbsp;제품에&amp;nbsp;적용한&amp;nbsp;모습을&amp;nbsp;쉽게&amp;nbsp;시각화 &lt;br /&gt;&lt;b&gt;이미지&amp;nbsp;업스케일러&lt;/b&gt;:&amp;nbsp;저해상도&amp;nbsp;이미지를&amp;nbsp;고해상도로&amp;nbsp;개선 &lt;br /&gt;&lt;b&gt;배경&amp;nbsp;제거&amp;nbsp;도구&lt;/b&gt;:&amp;nbsp;이미지에서&amp;nbsp;배경을&amp;nbsp;쉽게&amp;nbsp;제거 &lt;br /&gt;&lt;b&gt;AI&amp;nbsp;지우개&lt;/b&gt;:&amp;nbsp;이미지의&amp;nbsp;특정&amp;nbsp;부분을&amp;nbsp;정교하게&amp;nbsp;제거&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;p data-ke-size=&quot;size16&quot;&gt;Recraft AI는 디자이너, 마케터, 기업가 등 다양한 분야의 전문가들에게 브랜드의 시각적 정체성을 높이는 매력적인 그래픽을 만들 수 있는 힘을 제공합니다. 무료 버전으로 시작할 수 있으며, 신용카드 등록없이도 바로 사용해볼 수 있습니다.&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;a href=&quot;https://www.recraft.ai/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.recraft.ai/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730385292513&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Infinite AI Artboard - Recraft&quot; data-og-description=&quot;Premium image generation and editing tool. Store and share your own styles, create, fine-tune, upscale, and perfect your visuals.&quot; data-og-host=&quot;www.recraft.ai&quot; data-og-source-url=&quot;https://www.recraft.ai/&quot; data-og-url=&quot;https://www.recraft.ai/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/p8MM0/hyXpCHOB9H/VbH1t0IsVf9pSsZTkolgak/img.jpg?width=968&amp;amp;height=504&amp;amp;face=0_0_968_504,https://scrap.kakaocdn.net/dn/HVQZu/hyXpzj3dUQ/OF02AKrxFfwcudep584o1K/img.jpg?width=968&amp;amp;height=504&amp;amp;face=0_0_968_504,https://scrap.kakaocdn.net/dn/cubKPM/hyXpqtSEKg/3uo5hEPnm2YUB7R6lwSx50/img.jpg?width=968&amp;amp;height=504&amp;amp;face=0_0_968_504&quot;&gt;&lt;a href=&quot;https://www.recraft.ai/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.recraft.ai/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/p8MM0/hyXpCHOB9H/VbH1t0IsVf9pSsZTkolgak/img.jpg?width=968&amp;amp;height=504&amp;amp;face=0_0_968_504,https://scrap.kakaocdn.net/dn/HVQZu/hyXpzj3dUQ/OF02AKrxFfwcudep584o1K/img.jpg?width=968&amp;amp;height=504&amp;amp;face=0_0_968_504,https://scrap.kakaocdn.net/dn/cubKPM/hyXpqtSEKg/3uo5hEPnm2YUB7R6lwSx50/img.jpg?width=968&amp;amp;height=504&amp;amp;face=0_0_968_504');&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;Infinite AI Artboard - Recraft&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Premium image generation and editing tool. Store and share your own styles, create, fine-tune, upscale, and perfect your visuals.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.recraft.ai&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;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;ref&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://redpandaai.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://redpandaai.net/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://replicate.com/recraft-ai/recraft-v3&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://replicate.com/recraft-ai/recraft-v3&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730385332887&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;recraft-ai/recraft-v3 &amp;ndash; Run with an API on Replicate&quot; data-og-description=&quot;Pricing This model is priced by how many images are generated. Check out our docs for more information about how per-image pricing works on Replicate. Readme Overview Recraft introduces a revolutionary AI model that thinks in design language. This new mode&quot; data-og-host=&quot;replicate.com&quot; data-og-source-url=&quot;https://replicate.com/recraft-ai/recraft-v3&quot; data-og-url=&quot;https://replicate.com/recraft-ai/recraft-v3&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bxVnMl/hyXsYvFOJ3/qDPJex4QosgkALajljcob0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/c3yaa2/hyXppuYqWf/pzXttO0KKBssUJgjXqeEok/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://replicate.com/recraft-ai/recraft-v3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://replicate.com/recraft-ai/recraft-v3&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bxVnMl/hyXsYvFOJ3/qDPJex4QosgkALajljcob0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/c3yaa2/hyXppuYqWf/pzXttO0KKBssUJgjXqeEok/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;recraft-ai/recraft-v3 &amp;ndash; Run with an API on Replicate&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Pricing This model is priced by how many images are generated. Check out our docs for more information about how per-image pricing works on Replicate. Readme Overview Recraft introduces a revolutionary AI model that thinks in design language. This new mode&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;replicate.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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://artificialanalysis.ai/text-to-image&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://artificialanalysis.ai/text-to-image&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730385346003&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Text to Image Models and Providers Leaderboard | Artificial Analysis&quot; data-og-description=&quot;Analysis of Text to Image AI models and providers across quality, generation time and price. Analysis to help you choose the best Text to Image model and provider for your use-case.&quot; data-og-host=&quot;artificialanalysis.ai&quot; data-og-source-url=&quot;https://artificialanalysis.ai/text-to-image&quot; data-og-url=&quot;https://artificialanalysis.ai/text-to-image&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cbhpCE/hyXs01le3m/7mq3KKHkbdsPU9eZoZc230/img.png?width=1260&amp;amp;height=700&amp;amp;face=0_0_1260_700,https://scrap.kakaocdn.net/dn/TS40A/hyXsUfKDhY/D7n3k8O71i5KKDtbLYGvM0/img.png?width=1260&amp;amp;height=700&amp;amp;face=0_0_1260_700,https://scrap.kakaocdn.net/dn/w2aUl/hyXpC8TmX2/PjH6onwaXCGWIcY326s2Y0/img.png?width=277&amp;amp;height=150&amp;amp;face=0_0_277_150&quot;&gt;&lt;a href=&quot;https://artificialanalysis.ai/text-to-image&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://artificialanalysis.ai/text-to-image&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cbhpCE/hyXs01le3m/7mq3KKHkbdsPU9eZoZc230/img.png?width=1260&amp;amp;height=700&amp;amp;face=0_0_1260_700,https://scrap.kakaocdn.net/dn/TS40A/hyXsUfKDhY/D7n3k8O71i5KKDtbLYGvM0/img.png?width=1260&amp;amp;height=700&amp;amp;face=0_0_1260_700,https://scrap.kakaocdn.net/dn/w2aUl/hyXpC8TmX2/PjH6onwaXCGWIcY326s2Y0/img.png?width=277&amp;amp;height=150&amp;amp;face=0_0_277_150');&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;Text to Image Models and Providers Leaderboard | Artificial Analysis&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Analysis of Text to Image AI models and providers across quality, generation time and price. Analysis to help you choose the best Text to Image model and provider for your use-case.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;artificialanalysis.ai&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>02. Study/Trends</category>
      <category>recraft ai</category>
      <category>recraft v3</category>
      <category>red_panda</category>
      <category>text to image</category>
      <category>txt2img sota</category>
      <category>레드판다</category>
      <category>이미지 생성 sota</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/190</guid>
      <comments>https://boysboy3.tistory.com/190#entry190comment</comments>
      <pubDate>Thu, 31 Oct 2024 23:36:50 +0900</pubDate>
    </item>
    <item>
      <title>[SOTA OCR] GOT OCR-2.0</title>
      <link>https://boysboy3.tistory.com/189</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GOT-OCR2.0&lt;/b&gt;은 광학 문자 인식(OCR) 분야에 새로운 AI 모델입니다. 이 모델은 기존 OCR 시스템의 한계를 극복하고 문서 처리 능력을 크게 향상시켰습니다.&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;OCR-2.0의&amp;nbsp;특징&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 엔드투엔드 모델: 복잡한 파이프라인 대신 통합된 아키텍처 &lt;br /&gt;- 낮은 학습 및 추론 비용: 합리적인 파라미터 수로 효율성 확보 &lt;br /&gt;- 다양성: 일반 텍스트뿐만 아니라 수식, 악보, 차트 등 다양한 시각적 &quot;문자&quot; 인식 가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;914&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kWtxO/btsKmnp9DNW/EkYYA3wZ3z3ecXoCiUEvOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kWtxO/btsKmnp9DNW/EkYYA3wZ3z3ecXoCiUEvOk/img.png&quot; data-alt=&quot;GOT-OCR2.0&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kWtxO/btsKmnp9DNW/EkYYA3wZ3z3ecXoCiUEvOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkWtxO%2FbtsKmnp9DNW%2FEkYYA3wZ3z3ecXoCiUEvOk%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;653&quot; height=&quot;914&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;914&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;GOT-OCR2.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;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;a href=&quot;https://namu.wiki/w/%EB%A1%AF%EB%8D%B0%EC%8B%9C%EB%84%A4%EB%A7%88&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 style=&quot;text-align: center;&quot; 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-filename=&quot;0101.png&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bt67TF/btsKl8Uc2OL/jXtg6fEPLTmfQKjtSMCt41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bt67TF/btsKl8Uc2OL/jXtg6fEPLTmfQKjtSMCt41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bt67TF/btsKl8Uc2OL/jXtg6fEPLTmfQKjtSMCt41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbt67TF%2FbtsKl8Uc2OL%2FjXtg6fEPLTmfQKjtSMCt41%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;1016&quot; height=&quot;378&quot; data-filename=&quot;0101.png&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;378&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;plain texts OCR mode 추론 결과&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oM6cO/btsKnGoGjnA/PEbV0GzKsp17f4gHb36lHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oM6cO/btsKnGoGjnA/PEbV0GzKsp17f4gHb36lHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oM6cO/btsKnGoGjnA/PEbV0GzKsp17f4gHb36lHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoM6cO%2FbtsKnGoGjnA%2FPEbV0GzKsp17f4gHb36lHk%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;687&quot; height=&quot;426&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;426&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;당연히, StepFun, Megvii Technology, University of Chinese Academy of Sciences, Tsinghua University 개발을 하였기에 한국어 데이터는 많이 학습 안된것으로 보인다. 하지만 이정도 결과도 상당한 것으로보이는데, Model Tuning을 하면 성능이 엄청 좋아질 것으로 보인다.&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;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주요 기능은 다음과 같다.&lt;/h3&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;br /&gt;- 포맷팅된 출력 생성 (마크다운, LaTeX 등) &lt;br /&gt;- 영역 기반 인식, 동적 해상도 조정, 다중 페이지 OCR 등 고급 기능&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEjOhG/btsKnh3LcMY/q5KSQax8hiJzJTuxsGv591/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEjOhG/btsKnh3LcMY/q5KSQax8hiJzJTuxsGv591/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEjOhG/btsKnh3LcMY/q5KSQax8hiJzJTuxsGv591/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEjOhG%2FbtsKnh3LcMY%2Fq5KSQax8hiJzJTuxsGv591%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;607&quot; height=&quot;448&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;448&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;또한, 위 그림을 살펴보면 Vision Transformer(ViT) 기반으로 인코더를 구축하고 디코더는 Qwen-0.5B 구축되어 8K 토큰의 긴 컨텍스트를 처리할 수 있다고 나온다. 일반 텍스트부터 복잡한 구조화된 데이터를 처리할 수 있는게 핵심이 아닐까 싶다.&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;GOT-OCR2.0은 OCR 기술의 새로운 방향을 오픈소스로 공개하고있습니다. 텍스트 인식의 정확도와 다양성을 크게 높임으로써, 정보 접근성과 분석의 새로운 가능성을 제시하고 있습니다.&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;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://arxiv.org/abs/2409.01704&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://arxiv.org/abs/2409.01704&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730123435132&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;General OCR Theory: Towards OCR-2.0 via a Unified End-to-end Model&quot; data-og-description=&quot;Traditional OCR systems (OCR-1.0) are increasingly unable to meet people's usage due to the growing demand for intelligent processing of man-made optical characters. In this paper, we collectively refer to all artificial optical signals (e.g., plain texts,&quot; data-og-host=&quot;arxiv.org&quot; data-og-source-url=&quot;https://arxiv.org/abs/2409.01704&quot; data-og-url=&quot;https://arxiv.org/abs/2409.01704v1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b7FONr/hyXprL9Hdh/Ay7tgxfSYECFRotu0SEW90/img.png?width=1200&amp;amp;height=700&amp;amp;face=0_0_1200_700,https://scrap.kakaocdn.net/dn/diW4jT/hyXpCtoTGN/9XhxhAQOXLrexDsR9tr771/img.png?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://arxiv.org/abs/2409.01704&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://arxiv.org/abs/2409.01704&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b7FONr/hyXprL9Hdh/Ay7tgxfSYECFRotu0SEW90/img.png?width=1200&amp;amp;height=700&amp;amp;face=0_0_1200_700,https://scrap.kakaocdn.net/dn/diW4jT/hyXpCtoTGN/9XhxhAQOXLrexDsR9tr771/img.png?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&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;General OCR Theory: Towards OCR-2.0 via a Unified End-to-end Model&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Traditional OCR systems (OCR-1.0) are increasingly unable to meet people's usage due to the growing demand for intelligent processing of man-made optical characters. In this paper, we collectively refer to all artificial optical signals (e.g., plain texts,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;arxiv.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/Ucas-HaoranWei/GOT-OCR2.0&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/Ucas-HaoranWei/GOT-OCR2.0&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730123438709&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 - Ucas-HaoranWei/GOT-OCR2.0: Official code implementation of General OCR Theory:  Towards OCR-2.0 via a Unified End-to-en&quot; data-og-description=&quot;Official code implementation of General OCR Theory: Towards OCR-2.0 via a Unified End-to-end Model - Ucas-HaoranWei/GOT-OCR2.0&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/Ucas-HaoranWei/GOT-OCR2.0&quot; data-og-url=&quot;https://github.com/Ucas-HaoranWei/GOT-OCR2.0&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://github.com/Ucas-HaoranWei/GOT-OCR2.0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/Ucas-HaoranWei/GOT-OCR2.0&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;GitHub - Ucas-HaoranWei/GOT-OCR2.0: Official code implementation of General OCR Theory: Towards OCR-2.0 via a Unified End-to-en&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Official code implementation of General OCR Theory: Towards OCR-2.0 via a Unified End-to-end Model - Ucas-HaoranWei/GOT-OCR2.0&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>02. Study/Pytorch</category>
      <category>got-ocr2.0</category>
      <category>OCR</category>
      <category>optical character recognition</category>
      <category>pytorch ocr</category>
      <category>sota ocr</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/189</guid>
      <comments>https://boysboy3.tistory.com/189#entry189comment</comments>
      <pubDate>Mon, 28 Oct 2024 22:57:49 +0900</pubDate>
    </item>
    <item>
      <title>[2024 AI Index] Stanford AI Index</title>
      <link>https://boysboy3.tistory.com/188</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;매년 발생하는 스탠포 AI Index 보고서!!&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보다보면, 현재 AI 트렌드 및 미래를 생각해볼 수 있다.&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;b&gt;2024&amp;nbsp;AI&amp;nbsp;Index&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;AI&amp;nbsp;훈련&amp;nbsp;비용&amp;nbsp;증가,&amp;nbsp;생성형&amp;nbsp;AI&amp;nbsp;투자&amp;nbsp;확대,&amp;nbsp;그리고&amp;nbsp;책임&amp;nbsp;있는&amp;nbsp;AI&amp;nbsp;개발의&amp;nbsp;필요성&amp;nbsp;등을&amp;nbsp;다룹니다.&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;h3 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;&lt;br /&gt;1. 기술 성과: AI는 이미지 분류 등에서 인간을 능가하지만, 복잡한 문제 해결 능력은 여전히 부족합니다. &lt;br /&gt;2. 모델 개발: 2023년 산업과 학계의 협력으로 다양한 머신러닝 모델이 탄생했습니다. &lt;br /&gt;3. 훈련 비용: GPT-4 훈련에 약 7,800만 달러가 들었고, Google의 Gemini Ultra에는 1억 9,100만 달러가 투입됐습니다. &lt;br /&gt;4. 책임 있는 AI: 표준화된 평가 기준이 없어 모델 위험성 비교가 어렵습니다. &lt;br /&gt;5. 경제적 영향: 2023년 AI 민간 투자는 감소했지만, 생성형 AI 투자만큼은 급증했습니다. &lt;br /&gt;6. 노동시장 변화: AI가 작업 효율을 높이지만, 감독 부족 시 성과가 악화될 위험이 있습니다. &lt;br /&gt;7. 과학과 의학 분야의 활용: AI는 연구와 발견을 가속화하며, AlphaDev와 GNoME 같은 혁신적 도구들이 등장했습니다.&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biwdTh/btsKi4wpvl3/aDKiGG57a8V7hP7lB4odC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biwdTh/btsKi4wpvl3/aDKiGG57a8V7hP7lB4odC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biwdTh/btsKi4wpvl3/aDKiGG57a8V7hP7lB4odC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiwdTh%2FbtsKi4wpvl3%2FaDKiGG57a8V7hP7lB4odC1%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;1040&quot; height=&quot;548&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;548&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 그림처럼, &lt;span style=&quot;background-color: #ffffff; color: #231f20; text-align: start;&quot;&gt;2023년에 산업계는 51개의 주목할 만한 머신 러닝 모델을 만들어냈지만, Academia는 15개에 불과했다고 나오는데 역시.. 뭔가 산업계가 많은것을 주도하고 있는것이 사실인 것 같다.&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;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;1050&quot; data-origin-height=&quot;549&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buArvZ/btsKitjA5t3/i4KeZTCgCQESwPNhKnGJzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buArvZ/btsKitjA5t3/i4KeZTCgCQESwPNhKnGJzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buArvZ/btsKitjA5t3/i4KeZTCgCQESwPNhKnGJzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuArvZ%2FbtsKitjA5t3%2Fi4KeZTCgCQESwPNhKnGJzK%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;1050&quot; height=&quot;549&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;549&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 위 표를 살펴보면 &lt;span style=&quot;background-color: #ffffff; color: #231f20; text-align: start;&quot;&gt;미국과 캐나다의 새로운 학사 학위 졸업생 수는 10년 이상 꾸준히 증가했지만, CS에서 대학원 교육을 선택하는 학생 수는 정체되었다고 나오는데 한국에 대입을 해보면 학생수가 폭발적으로 늘지않았나 생각이 든다.&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uvcW0/btsKioo7SM6/khFQtBTNhcf4pd4obqFak1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uvcW0/btsKioo7SM6/khFQtBTNhcf4pd4obqFak1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uvcW0/btsKioo7SM6/khFQtBTNhcf4pd4obqFak1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuvcW0%2FbtsKioo7SM6%2FkhFQtBTNhcf4pd4obqFak1%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;1066&quot; height=&quot;548&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;548&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;span style=&quot;background-color: #ffffff; color: #231f20; text-align: start;&quot;&gt;2022년에 AI 관련 직책은 미국 전체 구인 공고의 2.0%를 차지했지만, 이 수치는 2023년에 1.6%로 감소했습니다. AI 구인 공고의 감소는 선도적인 AI 기업의 공고 감소와 이러한 기업 내에서 기술 직무 비중 감소가 커지고 있는데 한국도 배우는 사람 등 수요와 공급이 맞지 않는 것같고 엄청난 과열이라고 생각이 든다.&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;background-color: #ffffff; color: #231f20; text-align: start;&quot;&gt;투자 금액은 커지고 있는데 2023년 생성형 AI 투자 금액은 약 252억 달러로, 2022년에 비해 8배 이상 증가했다고 나오는데 이 말은.. 투자 금액은 커지는데 AI 개발자는 일자리는 줄어든다?? ㅠㅠ 회복하길 기대한다.&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;background-color: #ffffff; color: #231f20; text-align: start;&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: #231f20; text-align: start;&quot;&gt;&lt;a href=&quot;https://aiindex.stanford.edu/report/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://aiindex.stanford.edu/report/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1729781729308&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;AI Index Report 2024 &amp;ndash; Artificial Intelligence Index&quot; data-og-description=&quot;Welcome to the seventh edition of the AI Index report. The 2024 Index is our most comprehensive to date and arrives at an important moment when AI&amp;rsquo;s influence on society has never been more pronounced. This year, we have broadened our scope to more exten&quot; data-og-host=&quot;aiindex.stanford.edu&quot; data-og-source-url=&quot;https://aiindex.stanford.edu/report/&quot; data-og-url=&quot;https://aiindex.stanford.edu/report/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://aiindex.stanford.edu/report/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://aiindex.stanford.edu/report/&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;AI Index Report 2024 &amp;ndash; Artificial Intelligence Index&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Welcome to the seventh edition of the AI Index report. The 2024 Index is our most comprehensive to date and arrives at an important moment when AI&amp;rsquo;s influence on society has never been more pronounced. This year, we have broadened our scope to more exten&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;aiindex.stanford.edu&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>02. Study/Trends</category>
      <category>2024 ai index</category>
      <category>2024 미래</category>
      <category>2024 최신 전망</category>
      <category>2024 투자</category>
      <category>stanford ai index</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/188</guid>
      <comments>https://boysboy3.tistory.com/188#entry188comment</comments>
      <pubDate>Thu, 24 Oct 2024 23:55:35 +0900</pubDate>
    </item>
    <item>
      <title>[이미지 생성 SOTA] Stable Diffusion 3.5</title>
      <link>https://boysboy3.tistory.com/187</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;10월 22일, 이미지 생성 모델인 SD3.5 ( Stable Diffusion 3.5 ) 모델이 공개되었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;811&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kB3QX/btsKhnJN1Gx/sNtwp5VW4lVqHU3zRGrdBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kB3QX/btsKhnJN1Gx/sNtwp5VW4lVqHU3zRGrdBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kB3QX/btsKhnJN1Gx/sNtwp5VW4lVqHU3zRGrdBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkB3QX%2FbtsKhnJN1Gx%2FsNtwp5VW4lVqHU3zRGrdBk%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;1159&quot; height=&quot;811&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;811&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;Flux 모델이 대부분 사용되는 시점에 stability에서 모델을 발표해서 부라부라 사용후기 및 내용을 간략하게 포스팅을 하게되었다.&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;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Stable Diffusion 3.5는 Stability AI에서 새롭게 선보인 AI 기반 이미지 생성 기술로, 여러 모델 변형을 포함하고 있다. 주요 모델로는 Stable Diffusion 3.5 Large, Stable Diffusion 3.5 Large Turbo, 그리고 10월 29일에 출시 예정인 Stable Diffusion 3.5 Medium이 있는데 기대가 된다.&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;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;모델&amp;nbsp;변형&lt;/b&gt;: &lt;br /&gt;- Stable Diffusion 3.5 Large: 80억 개의 파라미터를 가지고 있으며, 1메가픽셀 해상도에서 뛰어난 품질과 프롬프트 준수성을 제공하여 전문적인 사용에 적합하다고 한다.&lt;br /&gt;- Stable Diffusion 3.5 Large Turbo: Large 모델의 증류 버전으로, 높은 품질의 이미지를 단 네 단계 만에 생성하며 속도가 매우 빠르다.&lt;br /&gt;- Stable Diffusion 3.5 Medium: 10월 29일 출시 예정으로, 향상된 품질, 일관성 및 다중 해상도 생성 기능을 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 맞춤화 및 접근성: 이 모델들은 매우 맞춤화 가능하며 소비자 하드웨어에서도 효율적으로 구동한다고 합니다. Stability AI 커뮤니티 라이선스 하에 상업적 및 비상업적 용도로 사용할 수 있습니다. 중요한건, Community, Enterprise License가 있는데 1M 달러 기준으로 나뉘는 것 같다. 자세한 내용은 &lt;a href=&quot;https://stability.ai/license&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;- Diverse Outputs: 모델은 광범위한 스타일과 미학을 표현하는 이미지를 생성할 수 있으며, 이는 복잡한 프롬프트 없이도 가능하다고 한데 한번 표를 보면서 살펴보자.&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;레딧에 올라온 표를 살펴보면 Flux가 퀄리티면에서는 더 좋은데, SD3.5가 프롬프트 반영은 좀 더 좋은 것 같다.&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;1820&quot; data-origin-height=&quot;1049&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bythBB/btsKf7O4u2a/7eUKbKKkS2dnktetMEW6Z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bythBB/btsKf7O4u2a/7eUKbKKkS2dnktetMEW6Z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bythBB/btsKf7O4u2a/7eUKbKKkS2dnktetMEW6Z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbythBB%2FbtsKf7O4u2a%2F7eUKbKKkS2dnktetMEW6Z0%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;1820&quot; height=&quot;1049&quot; data-origin-width=&quot;1820&quot; data-origin-height=&quot;1049&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;출처 : &lt;a href=&quot;https://www.reddit.com/media?url=https%3A%2F%2Fpreview.redd.it%2Fjust-experimented-a-little-with-sd-3-5-large-its-not-bad-v0-zoqqk9ws5cwd1.png%3Fwidth%3D2160%26format%3Dpng%26auto%3Dwebp%26s%3Dba1dfba2a9c9a2a5c4a6fc4ea4f86b43d8a50315&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.reddit.com/media?url=https%3A%2F%2Fpreview.redd.it%2Fjust-experimented-a-little-with-sd-3-5-large-its-not-bad-v0-zoqqk9ws5cwd1.png%3Fwidth%3D2160%26format%3Dpng%26auto%3Dwebp%26s%3Dba1dfba2a9c9a2a5c4a6fc4ea4f86b43d8a50315&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;근데 아마도, 학습 이런 부분에 있어서는 SD 모델류를 따라올게 없어서 LoRA, Dreambooth 등 다양하게 사용될 것 같다.&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;Tutorial&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stabilityai.notion.site/Stable-Diffusion-3-5-Large-Fine-tuning-Tutorial-11a61cdcd1968027a15bdbd7c40be8c6&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://stabilityai.notion.site/Stable-Diffusion-3-5-Large-Fine-tuning-Tutorial-11a61cdcd1968027a15bdbd7c40be8c6&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1729695394085&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;Stable Diffusion 3.5 Large Fine-tuning Tutorial&quot; data-og-description=&quot;Interested in generating images like this from SD3.5 Large?&quot; data-og-host=&quot;stabilityai.notion.site&quot; data-og-source-url=&quot;https://stabilityai.notion.site/Stable-Diffusion-3-5-Large-Fine-tuning-Tutorial-11a61cdcd1968027a15bdbd7c40be8c6&quot; data-og-url=&quot;https://stabilityai.notion.site/Stable-Diffusion-3-5-Large-Fine-tuning-Tutorial-11a61cdcd1968027a15bdbd7c40be8c6&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bl3zjC/hyXlQ6WQmQ/3b1jY8Dk8mLUkGSkpakhB1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bjl4U1/hyXlOadVWc/k5aWuxWqa8vejMtmp7K6uk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://stabilityai.notion.site/Stable-Diffusion-3-5-Large-Fine-tuning-Tutorial-11a61cdcd1968027a15bdbd7c40be8c6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stabilityai.notion.site/Stable-Diffusion-3-5-Large-Fine-tuning-Tutorial-11a61cdcd1968027a15bdbd7c40be8c6&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bl3zjC/hyXlQ6WQmQ/3b1jY8Dk8mLUkGSkpakhB1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bjl4U1/hyXlOadVWc/k5aWuxWqa8vejMtmp7K6uk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;Stable Diffusion 3.5 Large Fine-tuning Tutorial&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Interested in generating images like this from SD3.5 Large?&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stabilityai.notion.site&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;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;자세한 내용은 stability.ai 에서 확인가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stability.ai/news/introducing-stable-diffusion-3-5&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://stability.ai/news/introducing-stable-diffusion-3-5&lt;/a&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>02. Study/Trends</category>
      <category>diffsuion model</category>
      <category>image generation</category>
      <category>sd sota</category>
      <category>sd3.5</category>
      <category>stable diffusion3.5</category>
      <category>text2img</category>
      <category>txt2img</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/187</guid>
      <comments>https://boysboy3.tistory.com/187#entry187comment</comments>
      <pubDate>Wed, 23 Oct 2024 23:58:49 +0900</pubDate>
    </item>
    <item>
      <title>Flux보다 100배 빠른 Sana</title>
      <link>https://boysboy3.tistory.com/186</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; NVIDIA,&lt;span&gt; &lt;/span&gt;MIT,&lt;span&gt; &lt;/span&gt;Tsinghua University 연구진이 공동 연구한 Sana,&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;최대 4096 x 4096 해상도의 이미지를 효율적으로 생성할 수 있는 Text to Image 프레임워크??!&lt;/b&gt;&lt;/h3&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;특히, 관심을 많이 가지고 있는 Flux 모델에 비해 100배 빠른 속도로 생성이 가능하고 16G GPU에서도 1024x1024 기준으로 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;&quot;번역&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;Sana-0.6B&amp;nbsp;모델은&amp;nbsp;최신&amp;nbsp;대형&amp;nbsp;확산&amp;nbsp;모델(예:&amp;nbsp;Flux-12B)과&amp;nbsp;비교해&amp;nbsp;20배&amp;nbsp;작은&amp;nbsp;크기로&amp;nbsp;100배&amp;nbsp;이상&amp;nbsp;빠른&amp;nbsp;처리량을&amp;nbsp;보여줍니다1 &lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;.&amp;nbsp;16GB&amp;nbsp;노트북&amp;nbsp;GPU에서&amp;nbsp;1024&amp;nbsp;&amp;times;&amp;nbsp;1024&amp;nbsp;해상도&amp;nbsp;이미지를&amp;nbsp;1초&amp;nbsp;미만으로&amp;nbsp;생성할&amp;nbsp;수&amp;nbsp;있습니다&lt;/b&gt;&lt;/i&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 data-ke-size=&quot;size20&quot;&gt;주요 특징은 다음과 같습니다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 깊은 압축 오토인코더: 기존 8배 압축에서 32배로 압축률을 높여 레이턴트 토큰 수를 대폭 줄였습니다&lt;br /&gt;- 선형 DiT: 기존의 어텐션을 선형 어텐션으로 대체해 고해상도에서 효율성을 높였습니다&lt;br /&gt;- 디코더 전용 텍스트 인코더: T5 대신 Gemma라는 소형 LLM을 사용해 텍스트 이해력을 향상시켰습니다&lt;br /&gt;- 효율적인 학습 및 샘플링: Flow-DPM-Solver를 도입해 샘플링 단계를 줄이고 수렴 속도를 높였습니다&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;817&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FwFHp/btsJ9LENb1N/TXXRF4s9KNGAgeItuaHfFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FwFHp/btsJ9LENb1N/TXXRF4s9KNGAgeItuaHfFK/img.png&quot; data-alt=&quot;구조 및 latency 비교&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FwFHp/btsJ9LENb1N/TXXRF4s9KNGAgeItuaHfFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFwFHp%2FbtsJ9LENb1N%2FTXXRF4s9KNGAgeItuaHfFK%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;817&quot; height=&quot;646&quot; data-origin-width=&quot;817&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;구조 및 latency 비교&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;해당 링크에서 추론 속도 영상도 보여지며 아직 소스 공개는 안되었지만 곧 나올것으로 보입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://nvlabs.github.io/Sana/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://nvlabs.github.io/Sana/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1729169075031&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Sana&quot; data-og-description=&quot;About Sana We introduce Sana, a text-to-image framework that can efficiently generate images up to 4096 &amp;times; 4096 resolution. Sana can synthesize high-resolution, high-quality images with strong text-image alignment at a remarkably fast speed, deployable on &quot; data-og-host=&quot;nvlabs.github.io&quot; data-og-source-url=&quot;https://nvlabs.github.io/Sana/&quot; data-og-url=&quot;https://nvlabs.github.io/Sana/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/uDE5b/hyXlNHLhud/jiE9iBLdk4fFauFESyFeZ1/img.png?width=1440&amp;amp;height=832&amp;amp;face=0_0_1440_832,https://scrap.kakaocdn.net/dn/vb1lf/hyXlKjYyLZ/UQcKrM7VcZOpRi3F9nCPu0/img.jpg?width=1024&amp;amp;height=1024&amp;amp;face=244_244_693_735,https://scrap.kakaocdn.net/dn/boMHCP/hyXlNA0pGV/kKlXVdYOfmAoiKl0JPXAr0/img.png?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024&quot;&gt;&lt;a href=&quot;https://nvlabs.github.io/Sana/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://nvlabs.github.io/Sana/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/uDE5b/hyXlNHLhud/jiE9iBLdk4fFauFESyFeZ1/img.png?width=1440&amp;amp;height=832&amp;amp;face=0_0_1440_832,https://scrap.kakaocdn.net/dn/vb1lf/hyXlKjYyLZ/UQcKrM7VcZOpRi3F9nCPu0/img.jpg?width=1024&amp;amp;height=1024&amp;amp;face=244_244_693_735,https://scrap.kakaocdn.net/dn/boMHCP/hyXlNA0pGV/kKlXVdYOfmAoiKl0JPXAr0/img.png?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024');&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;Sana&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;About Sana We introduce Sana, a text-to-image framework that can efficiently generate images up to 4096 &amp;times; 4096 resolution. Sana can synthesize high-resolution, high-quality images with strong text-image alignment at a remarkably fast speed, deployable on&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;nvlabs.github.io&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;p data-ke-size=&quot;size16&quot;&gt;Paper&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://arxiv.org/abs/2410.10629&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://arxiv.org/abs/2410.10629&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1729169093791&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;SANA: Efficient High-Resolution Image Synthesis with Linear Diffusion Transformers&quot; data-og-description=&quot;We introduce Sana, a text-to-image framework that can efficiently generate images up to 4096$\times$4096 resolution. Sana can synthesize high-resolution, high-quality images with strong text-image alignment at a remarkably fast speed, deployable on laptop &quot; data-og-host=&quot;arxiv.org&quot; data-og-source-url=&quot;https://arxiv.org/abs/2410.10629&quot; data-og-url=&quot;https://arxiv.org/abs/2410.10629v2&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bIf2rg/hyXlHnfp6r/haBwTkQqBaPFrCVc4PtRj1/img.png?width=1200&amp;amp;height=700&amp;amp;face=0_0_1200_700,https://scrap.kakaocdn.net/dn/bxVxBs/hyXlS3m7ek/OcjN40zNk5VbmpUbby1Qmk/img.png?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://arxiv.org/abs/2410.10629&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://arxiv.org/abs/2410.10629&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bIf2rg/hyXlHnfp6r/haBwTkQqBaPFrCVc4PtRj1/img.png?width=1200&amp;amp;height=700&amp;amp;face=0_0_1200_700,https://scrap.kakaocdn.net/dn/bxVxBs/hyXlS3m7ek/OcjN40zNk5VbmpUbby1Qmk/img.png?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&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;SANA: Efficient High-Resolution Image Synthesis with Linear Diffusion Transformers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;We introduce Sana, a text-to-image framework that can efficiently generate images up to 4096$\times$4096 resolution. Sana can synthesize high-resolution, high-quality images with strong text-image alignment at a remarkably fast speed, deployable on laptop&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;arxiv.org&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>Flux</category>
      <category>nvidia sana</category>
      <category>Sana</category>
      <category>생성형 이미지</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/186</guid>
      <comments>https://boysboy3.tistory.com/186#entry186comment</comments>
      <pubDate>Thu, 17 Oct 2024 21:45:27 +0900</pubDate>
    </item>
    <item>
      <title>Object Detection SOTA 모델 Ultralytics YOLO11</title>
      <link>https://boysboy3.tistory.com/185</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Yolo 모델이 벌써 11까지 나왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ultralytics에서 지원되는 yolo 모델을 보면 YOLOv3 ~ YOLOv11/ SAM,SAM2, FastSAM, YOLO-World까지 다양한 모델들을 지원한다.&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;성능을 살펴보면 기존의 YOLOv10보다 좋은것을 확인할 수 있다 mAP 기준&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1037&quot; data-origin-height=&quot;451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnX7go/btsJRBnBcHi/RAfpZ24b4TEZhB2prKUZYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnX7go/btsJRBnBcHi/RAfpZ24b4TEZhB2prKUZYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnX7go/btsJRBnBcHi/RAfpZ24b4TEZhB2prKUZYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnX7go%2FbtsJRBnBcHi%2FRAfpZ24b4TEZhB2prKUZYk%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;1037&quot; height=&quot;451&quot; data-origin-width=&quot;1037&quot; data-origin-height=&quot;451&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/ultralytics/ultralytics&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/ultralytics/ultralytics&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;YOLO11의 주요 특징&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: oklch(0.99 0.004 106.471); color: oklch(0.304 0.04 213.681); text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: oklch(0.99 0.004 106.471); color: oklch(0.304 0.04 213.681); text-align: left;&quot;&gt;&lt;b&gt;향상된 성능&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: oklch(0.99 0.004 106.471); color: oklch(0.304 0.04 213.681); text-align: left;&quot;&gt;: YOLOv8m 대비 22% 적은 매개변수로 더 높은 mAP 점수 달성&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;다양한 작업 지원&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 객체 감지, 분류, 포즈 추정, 인스턴스 분할 등&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;개선된 아키텍처&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 더 정확한 특징 추출과 처리 속도 향상&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;유연한 배포&lt;/b&gt;&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;h4 data-ke-size=&quot;size20&quot;&gt;예시코드&lt;/h4&gt;
&lt;pre id=&quot;code_1727661762732&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from ultralytics import YOLO

# Load a model
model = YOLO(&quot;yolo11n.pt&quot;)

# Train the model
train_results = model.train(
    data=&quot;coco8.yaml&quot;,  # path to dataset YAML
    epochs=100,  # number of training epochs
    imgsz=640,  # training image size
    device=&quot;cpu&quot;,  # device to run on, i.e. device=0 or device=0,1,2,3 or device=cpu
)

# Evaluate model performance on the validation set
metrics = model.val()

# Perform object detection on an image
results = model(&quot;path/to/image.jpg&quot;)
results[0].show()

# Export the model to ONNX format
path = model.export(format=&quot;onnx&quot;)  # return path to exported mode&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;&lt;span style=&quot;background-color: oklch(0.99 0.004 106.471); color: oklch(0.304 0.04 213.681); text-align: start;&quot;&gt;YOLO11은 컴퓨터 비전 분야에 새로운 가능성을 제시하며, AI 커뮤니티의 혁신을 이끌 것으로 기대됩니다. 정확성, 속도, 효율성을 결합한 이 모델은 실시간 애플리케이션에 특히 적합하며, 다양한 산업 분야에서 활용될 것으로 전망되며 자세한 내용은 YOLO Vision 컨퍼런스를 확인해보시면 좋을 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: oklch(0.99 0.004 106.471); color: oklch(0.304 0.04 213.681); text-align: start;&quot;&gt;&lt;a href=&quot;https://www.ultralytics.com/ko/events/yolovision&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.ultralytics.com/ko/events/yolovision&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1727662064063&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;YOLO 비전 2024&quot; data-og-description=&quot;마드리드에서 열리는 YOLO VISION 2024에 참여하세요. 지금 바로 하이브리드 이벤트에 참가하여 비전 AI 분야의 리더 및 전문가들과 함께하세요.&quot; data-og-host=&quot;www.ultralytics.com&quot; data-og-source-url=&quot;https://www.ultralytics.com/ko/events/yolovision&quot; data-og-url=&quot;https://www.ultralytics.com/ko/events/yolovision&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/T55cb/hyXaHVViqB/bRRnhbBO3gsMsB5mLgkxT0/img.jpg?width=1500&amp;amp;height=500&amp;amp;face=0_0_1500_500,https://scrap.kakaocdn.net/dn/bEtu0d/hyXaFRlAn7/c13I0LLOcRuKKPQXNLww31/img.jpg?width=1500&amp;amp;height=500&amp;amp;face=0_0_1500_500&quot;&gt;&lt;a href=&quot;https://www.ultralytics.com/ko/events/yolovision&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.ultralytics.com/ko/events/yolovision&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/T55cb/hyXaHVViqB/bRRnhbBO3gsMsB5mLgkxT0/img.jpg?width=1500&amp;amp;height=500&amp;amp;face=0_0_1500_500,https://scrap.kakaocdn.net/dn/bEtu0d/hyXaFRlAn7/c13I0LLOcRuKKPQXNLww31/img.jpg?width=1500&amp;amp;height=500&amp;amp;face=0_0_1500_500');&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;YOLO 비전 2024&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;마드리드에서 열리는 YOLO VISION 2024에 참여하세요. 지금 바로 하이브리드 이벤트에 참가하여 비전 AI 분야의 리더 및 전문가들과 함께하세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.ultralytics.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;
&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;a href=&quot;https://www.ultralytics.com/ko/events/yolovision&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.ultralytics.com/ko/events/yolovision&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.ultralytics.com/ko/blog/ultralytics-yolo11-has-arrived-redefine-whats-possible-in-ai&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.ultralytics.com/ko/blog/ultralytics-yolo11-has-arrived-redefine-whats-possible-in-ai&lt;/a&gt;&lt;/p&gt;</description>
      <category>02. Study/Trends</category>
      <category>Ultralytics</category>
      <category>ultralytics yolov11</category>
      <category>yolo</category>
      <category>yolo vision</category>
      <category>yolov11</category>
      <category>욜로v11</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/185</guid>
      <comments>https://boysboy3.tistory.com/185#entry185comment</comments>
      <pubDate>Mon, 30 Sep 2024 11:08:39 +0900</pubDate>
    </item>
    <item>
      <title>생성형 AI를 위한 컴퓨터 비전</title>
      <link>https://boysboy3.tistory.com/184</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;생성형 AI를 위한 컴퓨터비전.jpg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhVowt/btsJCMEAmAB/YSBmLHeuAj2Oy7oguMhA3k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhVowt/btsJCMEAmAB/YSBmLHeuAj2Oy7oguMhA3k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhVowt/btsJCMEAmAB/YSBmLHeuAj2Oy7oguMhA3k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhVowt%2FbtsJCMEAmAB%2FYSBmLHeuAj2Oy7oguMhA3k%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;542&quot; height=&quot;723&quot; data-filename=&quot;생성형 AI를 위한 컴퓨터비전.jpg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&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;요즘 &lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;생성형 AI 관련된 내용일 정말 많이 올라오는데 특히,&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt; 자연어처리 와 더불어 LLM 관련된 내용이 정말 많이 올라오는데&amp;nbsp; 반면 비전 관련된 책은 부족했다. 하지만 이렇게 비전관점에서 생성형 AI 책이 나오면서 많은 관심을 가질 수 있을 것 같다. 저자 서문에 따르면 비전 생성 모델에 대해 처음 공부할 때 도움이 될 기본 모델과 연구에서 대표적으로 활용되는 예시 모델의 전반적인 이론과 실습을 모두 다 잡는다고 나와있다. 실제로 목차와 내용을 살펴보니 간단한 배경지식 수학 내용부터 시작하여 GAN, Diffusion Based 모델까지 소개를 하고있다. 책 한권으로 모든 내용은 확인할 수 없겠지만 전반적인 개요와 사용법까지 익힐 수 있을것 같다. 제일 중요한 어디서부터 공부할 지 막막한 분들을 위해 정말 잘 집필한 책이다! 너무 강추한다. &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;생성형 관련된 컴퓨터 비전의 기초부터 최신 응용 모델까지 다루며, 수학적 수식과 이론을 기반으로 독자들에게 깊이 있는 이해를 제공한다.&lt;/span&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;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;div style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;
&lt;div id=&quot;MyReviewTab&quot; style=&quot;text-align: left;&quot;&gt;
&lt;div style=&quot;color: #333333; text-align: left;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&quot; ≪생성형 AI를 위한 컴퓨터 비전≫ 내부 서평단에 선정되어&lt;/span&gt; &amp;nbsp;책을 제공받아 작성된 서평입니다.&quot;&lt;/p&gt;</description>
      <category>05. Review</category>
      <category>딥러닝</category>
      <category>머신러닝</category>
      <category>비전생성모델</category>
      <category>비제이퍼블릭</category>
      <category>생성모델</category>
      <category>생성형AI</category>
      <category>인공지능</category>
      <category>컴퓨터비전</category>
      <category>파이썬</category>
      <category>파이토치</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/184</guid>
      <comments>https://boysboy3.tistory.com/184#entry184comment</comments>
      <pubDate>Sat, 14 Sep 2024 00:23:27 +0900</pubDate>
    </item>
    <item>
      <title>[Ubuntu] GPU 사용량 확인하는 다양한 방법</title>
      <link>https://boysboy3.tistory.com/183</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;딥러닝 등 다양하게 Nvidia GPU를 사용하다보면, GPU를 모니터링을 해야할 경우가 많은데, 여기서 다양한 방법을 소개합니다.&lt;/b&gt;&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;h4 data-ke-size=&quot;size20&quot;&gt;1. Python을 사용한 &lt;i&gt;&lt;b&gt;pynvml&lt;/b&gt;&lt;/i&gt; 라이브러리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pynvml은 NVIDIA Management Library (NVML) 인터페이스를 Python에서 사용할 수 있도록 하는 라이브러리입니다. 이를 통해 GPU 사용량을 코드로 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1725872340132&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 설치
pip install nvidia-ml-py3&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.1 사용 예시&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1725889790578&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pynvml

# NVML 초기화
pynvml.nvmlInit()

# GPU 장치 개수 확인
device_count = pynvml.nvmlDeviceGetCount()

for i in range(device_count):
    handle = pynvml.nvmlDeviceGetHandleByIndex(i)
    name = pynvml.nvmlDeviceGetName(handle)
    memory_info = pynvml.nvmlDeviceGetMemoryInfo(handle)
    utilization = pynvml.nvmlDeviceGetUtilizationRates(handle)
    
    print(f&quot;GPU {i}: {name.decode('utf-8')}&quot;)
    print(f&quot;Memory Total: {memory_info.total / 1024**2:.2f} MB&quot;)
    print(f&quot;Memory Used: {memory_info.used / 1024**2:.2f} MB&quot;)
    print(f&quot;Memory Free: {memory_info.free / 1024**2:.2f} MB&quot;)
    print(f&quot;GPU Utilization: {utilization.gpu}%&quot;)
    print(f&quot;Memory Utilization: {utilization.memory}%&quot;)
    print()

# NVML 종료
pynvml.nvmlShutdown()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;259&quot; data-origin-height=&quot;279&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JoBSc/btsJwLx5REh/CIUnjhUuDzA01WUOcZyHRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JoBSc/btsJwLx5REh/CIUnjhUuDzA01WUOcZyHRK/img.png&quot; data-alt=&quot;pynvml 실행결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JoBSc/btsJwLx5REh/CIUnjhUuDzA01WUOcZyHRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJoBSc%2FbtsJwLx5REh%2FCIUnjhUuDzA01WUOcZyHRK%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;259&quot; height=&quot;279&quot; data-origin-width=&quot;259&quot; data-origin-height=&quot;279&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;pynvml 실행결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. &lt;b&gt;gpustat &lt;/b&gt;CLI 툴&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gpustat은 nvidia-smi 명령을 보다 보기 좋게 표시하는 도구입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1725889889431&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 설치
pip install gpustat&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.2 사용 예시&lt;/h4&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1725890081687&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;gpustat -cp&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mxLzr/btsJvbkf0jD/O7fWLUUS5EtqTkHqpheiEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mxLzr/btsJvbkf0jD/O7fWLUUS5EtqTkHqpheiEK/img.png&quot; data-alt=&quot;gpu stat 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mxLzr/btsJvbkf0jD/O7fWLUUS5EtqTkHqpheiEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmxLzr%2FbtsJvbkf0jD%2FO7fWLUUS5EtqTkHqpheiEK%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;1244&quot; height=&quot;146&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;gpu stat 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;위 결과 ref : &lt;a href=&quot;https://github.com/wookayin/gpustat&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/wookayin/gpustat&lt;/a&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. &lt;b&gt;DCGM (Data Center GPU Manager)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DCGM은 NVIDIA에서 제공하는 GPU 모니터링 툴로, 특히 데이터 센터 환경에서 GPU를 관리하는 데 유용합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;설치 :&lt;/h4&gt;
&lt;pre id=&quot;code_1725890277920&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 설치
sudo apt-get update \
    &amp;amp;&amp;amp; sudo apt-get install -y datacenter-gpu-manager&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;&lt;a href=&quot;https://github.com/NVIDIA/DCGM&quot;&gt;DCGM GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.nvidia.com/dcgm&quot;&gt;DCGM 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. &lt;b&gt;TensorFlow 및 PyTorch를 통한 GPU 사용량 모니터링&lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;TensorFlow 예시:&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1725890344533&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import tensorflow as tf

gpus = tf.config.experimental.list_physical_devices('GPU')
for gpu in gpus:
    print(f&quot;GPU: {gpu}&quot;)
    details = tf.config.experimental.get_memory_info(gpu)
    print(f&quot;Memory Free: {details['current']} bytes&quot;)
    print(f&quot;Memory Allocated: {details['peak']} bytes&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;PyTorch 예시:&lt;/h4&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1725890360106&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import torch

if torch.cuda.is_available():
    print(f&quot;Current GPU Memory Usage: {torch.cuda.memory_allocated()} bytes&quot;)
    print(f&quot;Max GPU Memory Usage: {torch.cuda.max_memory_allocated()} bytes&quot;)
    print(f&quot;Memory Reserved: {torch.cuda.memory_reserved()} bytes&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. &lt;b&gt;nvtop (NVIDIA GPU Top)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nvtop은 GPU 사용량을 실시간으로 모니터링할 수 있는 유틸리티입니다. CPU의 htop과 비슷하게 동작합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;설치:&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1725890424232&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 설치
sudo apt install nvtop&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;사용:&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1725890438974&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nvtop&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1248&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dSO3BG/btsJxlyFZmo/rmJcD65ApxQFBsir3GywYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dSO3BG/btsJxlyFZmo/rmJcD65ApxQFBsir3GywYK/img.png&quot; data-alt=&quot;nvtop 실행예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dSO3BG/btsJxlyFZmo/rmJcD65ApxQFBsir3GywYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSO3BG%2FbtsJxlyFZmo%2FrmJcD65ApxQFBsir3GywYK%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;1248&quot; height=&quot;298&quot; data-origin-width=&quot;1248&quot; data-origin-height=&quot;298&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;nvtop 실행예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&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;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 중에서 pynvml은 Python 코드로 GPU 상태를 직접 확인하고 싶을 때 유용하며, CLI 환경에서는 gpustat이나 nvtop을 추천드립니다.&lt;/p&gt;</description>
      <category>05. Tip/Etc</category>
      <category>GPU 사용량 확인</category>
      <category>nvidia-gpu 확인</category>
      <category>nvidia-ml-py3</category>
      <category>nvidia-smi</category>
      <category>nvtop</category>
      <category>pytorch gpu 사용량 확인</category>
      <category>torch.cuda.is_available()</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/183</guid>
      <comments>https://boysboy3.tistory.com/183#entry183comment</comments>
      <pubDate>Mon, 9 Sep 2024 23:02:11 +0900</pubDate>
    </item>
    <item>
      <title>GPU보다 20배 추론 속도를 가진 Cerebras</title>
      <link>https://boysboy3.tistory.com/182</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 gpu를 대체할 것이라는 얘기가 나오는 cerebras inference를 간단히 살펴보자.&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;CEO 겸 Co-Funder인 Andrew Feldman은 &lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: start;&quot;&gt;SeaMicro 회사 전 CEO였으며&amp;nbsp;&amp;nbsp; &lt;span style=&quot;background-color: #ffffff; color: #202122; text-align: start;&quot;&gt;초고밀도 컴퓨터 서버 산업&lt;/span&gt; 회사를 AMD에 엑싯한 경험을 가지고 있는 CEO이다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;622&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b31Qff/btsJj9z4B8h/dgM3KOJkldaikfKaHzuulK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b31Qff/btsJj9z4B8h/dgM3KOJkldaikfKaHzuulK/img.png&quot; data-alt=&quot;https://cerebras.ai/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b31Qff/btsJj9z4B8h/dgM3KOJkldaikfKaHzuulK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb31Qff%2FbtsJj9z4B8h%2FdgM3KOJkldaikfKaHzuulK%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;573&quot; height=&quot;622&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;622&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://cerebras.ai/&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;&lt;a href=&quot;http://cerebras.ai&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;cerebras.ai&lt;/a&gt; 홈페이지를 들어가보면 다음과 같은 문구를 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span style=&quot;background-color: #eaeaea; color: #303133; text-align: left;&quot;&gt;The world&amp;rsquo;s fastest inference.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #eaeaea; color: #303133; text-align: left;&quot;&gt;20x faster than GPUs, 1/5 the cost.&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Nvidia GPU보다 가격은 1/5 인데, 추론 속도는 20배 빠르다? 이건 못참지!&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;위 그림을 보면 Llama-3.1-8b 기준으로도 초당 1,837 토큰을 추론한다고한다. 어마어마하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과연 정말인지 TRY CHAT을 통해 사용해보자.&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;773&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcT6RX/btsJjT5jIWB/Nh4lKAB3ylvp7aWHrWm8A0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcT6RX/btsJjT5jIWB/Nh4lKAB3ylvp7aWHrWm8A0/img.png&quot; data-alt=&quot;Llama3.1-70B 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcT6RX/btsJjT5jIWB/Nh4lKAB3ylvp7aWHrWm8A0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcT6RX%2FbtsJjT5jIWB%2FNh4lKAB3ylvp7aWHrWm8A0%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;773&quot; height=&quot;252&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Llama3.1-70B 결과&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;위 이미지는 70b 기준으로도 정말 빠른 답변을 해주는것을 확인할 수 있다. 만약 GPT 계열 말고 Diffusion 계열도 지원한다고하면 정말 빠르게 이미지 생성, 동영상 생성하여 현업에서도 많이 도입될 수 있을거라 생각된다.&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;현재 지원되는 모델 리스트는 다음 Github에서 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/Cerebras/modelzoo&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/Cerebras/modelzoo&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>02. Study/Trends</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/182</guid>
      <comments>https://boysboy3.tistory.com/182#entry182comment</comments>
      <pubDate>Fri, 30 Aug 2024 14:12:50 +0900</pubDate>
    </item>
    <item>
      <title>Visual Studio Code 유용 Extensions</title>
      <link>https://boysboy3.tistory.com/181</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;개발자를 위한 Visual Studio Code Extension 추천&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python으로 다양한 개발(deep learning, data &lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;analysis etc.&lt;/span&gt;)을 할 때 vscode를 이용하여 개발하는 경우가 많다. 내가 사용중인 유용한 Extension을 알아보자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) Extension Tab -&amp;gt; Ctrl + Shift + X&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;1. Auto-Open Markdown Preview&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;511&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bT0m5S/btsJlryS9VC/N6AK6naClcpdGmOVRkGYU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bT0m5S/btsJlryS9VC/N6AK6naClcpdGmOVRkGYU1/img.png&quot; data-alt=&quot;Auto-Open Markdown Preview&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bT0m5S/btsJlryS9VC/N6AK6naClcpdGmOVRkGYU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbT0m5S%2FbtsJlryS9VC%2FN6AK6naClcpdGmOVRkGYU1%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;935&quot; height=&quot;511&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;511&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Auto-Open Markdown Preview&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Markdown을 작성할 때가 많은데 미리보기가 없으면 별도로 github, gitlab 등 다양한곳에 올려 확인해야 하는 번거로움이 있는데 Auto-Open Markdown Preview Extension을 설치하면 별도로 .md 파일을 수정하고 출력 결과를 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1419&quot; data-origin-height=&quot;654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XN4p5/btsJlf6vTlk/4sDP5S2zr7cGWhJVLMEb10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XN4p5/btsJlf6vTlk/4sDP5S2zr7cGWhJVLMEb10/img.png&quot; data-alt=&quot;https://github.com/imayobrown/DesignDocumentTemplates?tab=readme-ov-file#readme&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XN4p5/btsJlf6vTlk/4sDP5S2zr7cGWhJVLMEb10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXN4p5%2FbtsJlf6vTlk%2F4sDP5S2zr7cGWhJVLMEb10%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;1419&quot; height=&quot;654&quot; data-origin-width=&quot;1419&quot; data-origin-height=&quot;654&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://github.com/imayobrown/DesignDocumentTemplates?tab=readme-ov-file#readme&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;Shift + Command + V로 눌러서 실행할 수 있다.&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;2. One Dark Pro&lt;span style=&quot;color: #777777; text-align: center;&quot;&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vscode 기본 테마가 맘에들지 않아 따로 테마를 설치하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Atom의 상징적인 One Dark 테마이자, VS Code에 가장 많이 설치된&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; href=&quot;https://marketplace.visualstudio.com/search?target=VSCode&amp;amp;category=Themes&amp;amp;sortBy=Installs&quot;&gt;테마&lt;/a&gt;&lt;span&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;699&quot; data-origin-height=&quot;585&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blCIog/btsJkSjBFoa/F8gZrTHoGesNIOlO2oXLzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blCIog/btsJkSjBFoa/F8gZrTHoGesNIOlO2oXLzK/img.png&quot; data-alt=&quot;https://marketplace.visualstudio.com/items?itemName=zivit.one-dark&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blCIog/btsJkSjBFoa/F8gZrTHoGesNIOlO2oXLzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblCIog%2FbtsJkSjBFoa%2FF8gZrTHoGesNIOlO2oXLzK%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;699&quot; height=&quot;585&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;585&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://marketplace.visualstudio.com/items?itemName=zivit.one-dark&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 후 Set Color Theme를 누르게되면 적용된다.&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;3. Material&amp;nbsp;Icon&amp;nbsp;Theme&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vscode explorer를 보게되면 아이콘이 너무 맘에안드는데, material icon theme를 적용하면 가독성 좋게 변경할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양한 아이콘 테마는 &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;서 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;265&quot; data-origin-height=&quot;333&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YpgSM/btsJjTcuvb5/WEG6k6Jx4GJ1Cpk9QHMgFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YpgSM/btsJjTcuvb5/WEG6k6Jx4GJ1Cpk9QHMgFk/img.png&quot; data-alt=&quot;적용 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YpgSM/btsJjTcuvb5/WEG6k6Jx4GJ1Cpk9QHMgFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYpgSM%2FbtsJjTcuvb5%2FWEG6k6Jx4GJ1Cpk9QHMgFk%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;265&quot; height=&quot;333&quot; data-origin-width=&quot;265&quot; data-origin-height=&quot;333&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;h4 data-ke-size=&quot;size20&quot;&gt;4. Excalidraw&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발을 하다보면 플로우차트, 다이어그램, 시스템 설계도 등 그려야 할 경우가 많은데 다양한 툴이 있지만 vscode 안에서 사용할 수 있는 Excalidraw를 소개한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;872&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brVjZW/btsJkbYmiAC/9lIiWAShVaKKzYAkO5mroK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brVjZW/btsJkbYmiAC/9lIiWAShVaKKzYAkO5mroK/img.png&quot; data-alt=&quot;Excalidraw&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brVjZW/btsJkbYmiAC/9lIiWAShVaKKzYAkO5mroK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrVjZW%2FbtsJkbYmiAC%2F9lIiWAShVaKKzYAkO5mroK%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;836&quot; height=&quot;872&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;872&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Excalidraw&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;extension을 설치 후 파일 확장자를 &lt;b&gt;.excalidraw &lt;/b&gt;만들면 그림판 느낌의 그릴 수 있는 화면이 띄워지고 png svg 다양한 포맷으로 뽑아낼 수 있다. 또한, 다양한 Library로 깔아서 아이콘을 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1482&quot; data-origin-height=&quot;827&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwvHqp/btsJk3rHjmQ/sKxtF6qrKrKbDPN1rj09J1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwvHqp/btsJk3rHjmQ/sKxtF6qrKrKbDPN1rj09J1/img.png&quot; data-alt=&quot;test.excalidraw&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwvHqp/btsJk3rHjmQ/sKxtF6qrKrKbDPN1rj09J1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwvHqp%2FbtsJk3rHjmQ%2FsKxtF6qrKrKbDPN1rj09J1%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;1482&quot; height=&quot;827&quot; data-origin-width=&quot;1482&quot; data-origin-height=&quot;827&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;test.excalidraw&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;그 외, 귀여운걸 원한다면 &lt;a href=&quot;https://github.com/tonybaloney/vscode-pets&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;vscode-pets&lt;/a&gt; 를 설치해보자. 고양이가 등장한다.&lt;/p&gt;</description>
      <category>05. Tip/Visual Studio</category>
      <category>auto-open markdown preview</category>
      <category>excalidraw</category>
      <category>material icon theme</category>
      <category>one dark pro</category>
      <category>vscode extensions</category>
      <category>vscode-pets</category>
      <category>비쥬얼스튜디오코드 테마</category>
      <category>순서도 그리기</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/181</guid>
      <comments>https://boysboy3.tistory.com/181#entry181comment</comments>
      <pubDate>Thu, 29 Aug 2024 18:19:39 +0900</pubDate>
    </item>
    <item>
      <title>Stable Diffusion 3.1 Coming Soon?</title>
      <link>https://boysboy3.tistory.com/180</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Reddit에 재밌는 글이 있어서 포스팅,&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;a href=&quot;https://www.reddit.com/r/StableDiffusion/comments/1exw2m4/sd_31_is_coming/?%24deep_link=true&amp;amp;correlation_id=21f2da84-8060-4063-8f6e-6241a1763d25&amp;amp;post_fullname=t3_1exw2m4&amp;amp;post_index=0&amp;amp;ref=email_digest&amp;amp;ref_campaign=email_digest&amp;amp;ref_source=email&amp;amp;utm_content=post_title&amp;amp;%243p=e_as&amp;amp;_branch_match_id=1285749299433919656&amp;amp;utm_medium=Email+Amazon+SES&amp;amp;_branch_referrer=H4sIAAAAAAAAA22P22oEIRBEv2byNjd1zRJYlkDIb4gZe2abeENbZj8%2FPdkkTwGF4pRVdt%2BIcn0ZxwLOIQ0258Fj%2FBxlvnZCyXwBY%2BsTy1Rww2i9acVfbkeqk6%2BdeOez7%2Fvwk19SYFD4VrIfHhyua6uYIhP2AkSqLGe47yKo45kzcjZYDbsYt6NQcudJKAeQzTFLJ9%2BoNOiEXlIp4C1xn0HHXMyrcPas%2BvOkp15NWvbnVUOvhZrt%2FKylEyfO5VTJrM37aAMcddL8TfAwMTq4szMxKLCygmDRG4cbVHpAs9iQLW7xf7emVhb49Rg2CrxVJN6Z6fc3hOThC8fXS7hzAQAA&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.reddit.com/r/StableDiffusion/comments/1exw2m4/sd_31_is_coming/?%24deep_link=true&amp;amp;correlation_id=21f2da84-8060-4063-8f6e-6241a1763d25&amp;amp;post_fullname=t3_1exw2m4&amp;amp;post_index=0&amp;amp;ref=email_digest&amp;amp;ref_campaign=email_digest&amp;amp;ref_source=email&amp;amp;utm_content=post_title&amp;amp;%243p=e_as&amp;amp;_branch_match_id=1285749299433919656&amp;amp;utm_medium=Email+Amazon+SES&amp;amp;_branch_referrer=H4sIAAAAAAAAA22P22oEIRBEv2byNjd1zRJYlkDIb4gZe2abeENbZj8%2FPdkkTwGF4pRVdt%2BIcn0ZxwLOIQ0258Fj%2FBxlvnZCyXwBY%2BsTy1Rww2i9acVfbkeqk6%2BdeOez7%2Fvwk19SYFD4VrIfHhyua6uYIhP2AkSqLGe47yKo45kzcjZYDbsYt6NQcudJKAeQzTFLJ9%2BoNOiEXlIp4C1xn0HHXMyrcPas%2BvOkp15NWvbnVUOvhZrt%2FKylEyfO5VTJrM37aAMcddL8TfAwMTq4szMxKLCygmDRG4cbVHpAs9iQLW7xf7emVhb49Rg2CrxVJN6Z6fc3hOThC8fXS7hzAQAA&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;요즘 이미지 생성 관련된 내용은 FLUX의 성능이 너무 좋아 Stable Diffusion3가 관심을 못받고 있었는데, Stable Diffusion3.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;과연 성능이 얼마나 나올지 나오면 바로 사용해서 테스트해보고 싶다..&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;&lt;s&gt;&lt;b&gt;기술 발전 속도가 너무 빠르다..ㅠ&amp;nbsp;&lt;/b&gt;&lt;/s&gt;&lt;/p&gt;</description>
      <category>02. Study/Trends</category>
      <category>sd3.1</category>
      <category>stable diffusion 3.1</category>
      <category>text2img</category>
      <category>이미지생성모델</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/180</guid>
      <comments>https://boysboy3.tistory.com/180#entry180comment</comments>
      <pubDate>Sat, 24 Aug 2024 00:08:32 +0900</pubDate>
    </item>
    <item>
      <title>Hotshot : AI Video Generator</title>
      <link>https://boysboy3.tistory.com/179</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;56&quot; data-origin-height=&quot;54&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RgliQ/btsJcNjaUPw/rPNf8lPg0QwaiL4Bjdl87k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RgliQ/btsJcNjaUPw/rPNf8lPg0QwaiL4Bjdl87k/img.png&quot; data-alt=&quot;hotshot logo&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RgliQ/btsJcNjaUPw/rPNf8lPg0QwaiL4Bjdl87k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRgliQ%2FbtsJcNjaUPw%2FrPNf8lPg0QwaiL4Bjdl87k%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;56&quot; height=&quot;54&quot; data-origin-width=&quot;56&quot; data-origin-height=&quot;54&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;hotshot logo&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항상 웃고있는 &lt;a href=&quot;https://hotshot.co/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Hotshot&lt;/a&gt;를 소개합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hotshot은 Text to Video Generation 할 수 있는 비디오 생성기입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 핫한 &lt;a href=&quot;https://lumalabs.ai/dream-machine&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Luma AI&lt;/a&gt;, &lt;a href=&quot;https://klingai.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Kling AI&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;구글 아이디로 로그인하면 무료로 하루에 2개의 비디오를 생성할 수 있다고 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마도 리소스 제한때매 생성횟수 limit을 걸어놓은게 아닐까 싶다.&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;무료버전이 아닌, Plus 버전을 사용한다면 달마다 99$로 생각보다 비싸게 받고있는 것 같다. 200개 횟수제한도 있는것으로 보인다. ㅠ_ㅠ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1294&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cph9IR/btsJcyfQoVz/1aYXjVAWANVLfPKnn5juQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cph9IR/btsJcyfQoVz/1aYXjVAWANVLfPKnn5juQ0/img.png&quot; data-alt=&quot;upgrade plan&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cph9IR/btsJcyfQoVz/1aYXjVAWANVLfPKnn5juQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcph9IR%2FbtsJcyfQoVz%2F1aYXjVAWANVLfPKnn5juQ0%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;1294&quot; height=&quot;640&quot; data-origin-width=&quot;1294&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;upgrade plan&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;Hotshot에서는 프롬프트 가이드를 제공하고 있고 간단하게 살펴보자.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Hotshot excels at creating videos of people, animals, and nature. (사람, 동물, 자연에 대한 영상을 만드는데 뛰어나다고 표현하고 있다. 아래는 다음과 같이 생성되면 자연스럽게 생성된다고 한다.)&lt;/li&gt;
&lt;li&gt;For the best animal generations, we suggest prefixing animals with &lt;b&gt;anthropomorphic&lt;/b&gt; like &lt;b&gt;an anthropomorphic hippo is watching tv&lt;/b&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;그 외,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Styles&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span data-token-index=&quot;0&quot;&gt;&lt;b&gt;Animation&lt;/b&gt; : pixar&amp;nbsp;style,&amp;nbsp;cute&amp;nbsp;squirrel&amp;nbsp;dressed&amp;nbsp;in&amp;nbsp;medival&amp;nbsp;fashion,&amp;nbsp;walking&amp;nbsp;through&amp;nbsp;medival&amp;nbsp;village&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;- &lt;span data-token-index=&quot;0&quot;&gt;&lt;b&gt;Paintings&lt;/b&gt; : fpv&amp;nbsp;drone&amp;nbsp;fly&amp;nbsp;through&amp;nbsp;exploding&amp;nbsp;render&amp;nbsp;of&amp;nbsp;a&amp;nbsp;painting&amp;nbsp;by&amp;nbsp;vincent&amp;nbsp;van&amp;nbsp;gogh&amp;nbsp;impasto&amp;nbsp;painting&amp;nbsp;palate&amp;nbsp;knife,&amp;nbsp;thick&amp;nbsp;paint&amp;nbsp;on&amp;nbsp;canvas&amp;nbsp;a&amp;nbsp;beautiful&amp;nbsp;starry&amp;nbsp;night&amp;nbsp;sky&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;- &lt;span data-token-index=&quot;0&quot;&gt;&lt;b&gt;Claymation&lt;/b&gt; : claymation&amp;nbsp;style,&amp;nbsp;anomalisa&amp;nbsp;movie,&amp;nbsp;A&amp;nbsp;claymation&amp;nbsp;woman&amp;nbsp;in&amp;nbsp;a&amp;nbsp;red&amp;nbsp;sweater&amp;nbsp;smiles&amp;nbsp;and&amp;nbsp;poses&amp;nbsp;for&amp;nbsp;selfies,&amp;nbsp;holding&amp;nbsp;her&amp;nbsp;phone&amp;nbsp;with&amp;nbsp;both&amp;nbsp;hands,&amp;nbsp;in&amp;nbsp;a&amp;nbsp;park&amp;nbsp;with&amp;nbsp;lush&amp;nbsp;green&amp;nbsp;grass.&amp;nbsp;The&amp;nbsp;lighting&amp;nbsp;is&amp;nbsp;soft&amp;nbsp;and&amp;nbsp;natural,&amp;nbsp;enhancing&amp;nbsp;the&amp;nbsp;serene,&amp;nbsp;casual&amp;nbsp;atmosphere&amp;nbsp;of&amp;nbsp;the&amp;nbsp;setting.&amp;nbsp;The&amp;nbsp;woman,&amp;nbsp;with&amp;nbsp;her&amp;nbsp;hair&amp;nbsp;styled&amp;nbsp;in&amp;nbsp;loose&amp;nbsp;waves,&amp;nbsp;exhibits&amp;nbsp;expressions&amp;nbsp;of&amp;nbsp;delight&amp;nbsp;and&amp;nbsp;amusement&amp;nbsp;as&amp;nbsp;she&amp;nbsp;engages&amp;nbsp;with&amp;nbsp;her&amp;nbsp;reflection&amp;nbsp;on&amp;nbsp;the&amp;nbsp;phone's&amp;nbsp;screen.&amp;nbsp;Claymation&amp;nbsp;style&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;- &lt;span data-token-index=&quot;0&quot;&gt;&lt;b&gt;Comic Book&lt;/b&gt; :&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;illustrated&amp;nbsp;comic&amp;nbsp;book&amp;nbsp;art,&amp;nbsp;vintage&amp;nbsp;50s&amp;nbsp;comic&amp;nbsp;book&amp;nbsp;style,&amp;nbsp;A&amp;nbsp;young&amp;nbsp;man&amp;nbsp;with&amp;nbsp;blonde&amp;nbsp;hair,&amp;nbsp;dressed&amp;nbsp;in&amp;nbsp;a&amp;nbsp;blue&amp;nbsp;shirt&amp;nbsp;and&amp;nbsp;dark&amp;nbsp;pants,&amp;nbsp;sits&amp;nbsp;on&amp;nbsp;a&amp;nbsp;yellow&amp;nbsp;couch&amp;nbsp;in&amp;nbsp;a&amp;nbsp;living&amp;nbsp;room,&amp;nbsp;intensely&amp;nbsp;playing&amp;nbsp;handheld&amp;nbsp;video&amp;nbsp;games.&amp;nbsp;His&amp;nbsp;expression&amp;nbsp;is&amp;nbsp;focused&amp;nbsp;and&amp;nbsp;absorbed&amp;nbsp;in&amp;nbsp;the&amp;nbsp;activity.&amp;nbsp;The&amp;nbsp;living&amp;nbsp;room&amp;nbsp;is&amp;nbsp;decorated&amp;nbsp;with&amp;nbsp;plants&amp;nbsp;on&amp;nbsp;wooden&amp;nbsp;stands,&amp;nbsp;paintings&amp;nbsp;on&amp;nbsp;the&amp;nbsp;wall,&amp;nbsp;and&amp;nbsp;a&amp;nbsp;table&amp;nbsp;with&amp;nbsp;chairs&amp;nbsp;visible&amp;nbsp;in&amp;nbsp;the&amp;nbsp;background.&amp;nbsp;The&amp;nbsp;overall&amp;nbsp;atmosphere&amp;nbsp;suggests&amp;nbsp;a&amp;nbsp;leisurely,&amp;nbsp;modern&amp;nbsp;home&amp;nbsp;setting.&amp;nbsp;vintage&amp;nbsp;50s&amp;nbsp;comic&amp;nbsp;book&amp;nbsp;style&amp;nbsp;art&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;b&gt;Video Game&lt;/b&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;super&amp;nbsp;mario&amp;nbsp;in&amp;nbsp;legend&amp;nbsp;of&amp;nbsp;zelda&amp;nbsp;game,&amp;nbsp;super&amp;nbsp;mario&amp;nbsp;is&amp;nbsp;walking&amp;nbsp;through&amp;nbsp;hyrule,&amp;nbsp;legend&amp;nbsp;of&amp;nbsp;zelda&amp;nbsp;style&amp;nbsp;graphics,&amp;nbsp;ps5&amp;nbsp;high&amp;nbsp;fidelity&amp;nbsp;3d&amp;nbsp;graphics,&amp;nbsp;cgi&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;다양한 스타일 형태로도 생성가능하다고 한다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;최종적으로 퇴근하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;&lt;b&gt;직장인 영상&lt;/b&gt;&lt;/i&gt;을 만든 결과입니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;kakaotv&quot; data-video-url=&quot;https://tv.kakao.com/v/449024511&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cLtIOF/hyWShYer0y/T30PcBIAs2s12dJGsV6Ol0/img.jpg?width=1344&amp;amp;height=768&amp;amp;face=0_0_1344_768,https://scrap.kakaocdn.net/dn/VO4eg/hyWSdBz0rQ/Fok7LkkymtNEStsDtJcOdK/img.jpg?width=1344&amp;amp;height=768&amp;amp;face=0_0_1344_768&quot; data-video-width=&quot;860&quot; data-video-height=&quot;491&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;491&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;'When will you grow..'에서 업로드한 동영상&quot; data-video-play-service=&quot;daum_tistory&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://play-tv.kakao.com/embed/player/cliplink/449024511?service=daum_tistory&quot; width=&quot;860&quot; height=&quot;491&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;다양하게 생성해보고 응용할 수 있고, AI 발전이 엄청 빠른것을 확인할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;s&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;SORA 언제나오지..?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/s&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>02. Study/Trends</category>
      <category>hotshot</category>
      <category>text to video</category>
      <category>video ai</category>
      <category>video ai 생성</category>
      <category>생성형 AI</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/179</guid>
      <comments>https://boysboy3.tistory.com/179#entry179comment</comments>
      <pubDate>Fri, 23 Aug 2024 15:34:51 +0900</pubDate>
    </item>
    <item>
      <title>FLUX.1 Controlnet 사용하기</title>
      <link>https://boysboy3.tistory.com/178</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 핫한 FLUX 모델에 Controlnet 적용해보자.&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;span style=&quot;background-color: #ffffff; color: #374151; text-align: start;&quot;&gt;FLUX.1-dev 모델을 통해 이미지를 생성하고 생성된 이미지를 통해 Controlnet을 적용해볼 예정이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker를 이용하여 환경을 구축할 예정이다.&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;&lt;u&gt;※ webui forge, comfyui 예제는 많이 보이지만 diffusers 형식으로 된 예제는 없길래 직접 만들어본다..&lt;/u&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;h3 data-ke-size=&quot;size23&quot;&gt;1. Install&lt;/h3&gt;
&lt;pre id=&quot;code_1724055081372&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# docker 실행
# nvidia에서 제공되는 24.05 기준으로 도커 컨테이너를 만들어 실습할 예정이다.
# mount는 위치는 자신에 알맞게 잘 셋팅한다 -v 자신폴더:/workspace
docker run --name flux --gpus &quot;device=0&quot; -it -v /mydisk:/workspace nvcr.io/nvidia/pytorch:24.05-py3

# 컨테이너 안
apt update -y
apt install -y python3-tk
pip install --upgrade pip

# flux repo 다운로드
git clone https://github.com/black-forest-labs/flux.git

# flux 경로 이동
cd flux

# 패키지 설치
pip install -e '.[all]'
pip install git+https://github.com/huggingface/diffusers.git
pip install accelerate
pip install opencv-python==4.8.0.74&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;/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;h3 data-ke-size=&quot;size23&quot;&gt;2. FLUX.1 [dev]&amp;nbsp; 이미지 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 dev 버전은 non-commercial license 이므로 상용화는 불가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 이것저것 테스트해볼 것이므로..&lt;/p&gt;
&lt;pre id=&quot;code_1724055891141&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# flux_generation.py


import torch
from diffusers import FluxPipeline

model_id = &quot;black-forest-labs/FLUX.1-dev&quot; 

# 로컬 경로에 weight를 받을 예정이므로 cache_dir를 이용한다. 적절히 자신 경로에 맞게 수정하면 될 것이다.
pipe = FluxPipeline.from_pretrained(&quot;black-forest-labs/FLUX.1-dev&quot;, torch_dtype=torch.bfloat16, local_files_only=True, cache_dir='./weights/')
pipe.enable_model_cpu_offload() #save some VRAM by offloading the model to CPU. Remove this if you have enough GPU power

prompt = &quot;A cat holding a sign that says hello world&quot;
seed = 42
image = pipe(
    prompt,
    output_type=&quot;pil&quot;,
    num_inference_steps=4, #use a larger number if you are using [dev]
    generator=torch.Generator(&quot;cpu&quot;).manual_seed(seed)
).images[0]
image.save(&quot;flux_img.png&quot;)&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;flux_generation.py 파일을 만들고 위 코드를 넣은 후 &lt;b&gt;python flux_generation.py&lt;/b&gt; 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 현재 경로에 (/workspace/flux/) 에 flux_img.png 이미지가 저장되어 있을 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oWMse/btsI7khAdG4/ubIx9sBzkLGTTKUcoqCZWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oWMse/btsI7khAdG4/ubIx9sBzkLGTTKUcoqCZWK/img.png&quot; data-alt=&quot;flux_img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oWMse/btsI7khAdG4/ubIx9sBzkLGTTKUcoqCZWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoWMse%2FbtsI7khAdG4%2FubIx9sBzkLGTTKUcoqCZWK%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;491&quot; height=&quot;495&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;703&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;flux_img.png&lt;/figcaption&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;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이 이미지를 Controlnet canny를 통해 강아지로 변경해보자.&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;3. Controlnet 적용&lt;/h3&gt;
&lt;pre id=&quot;code_1724056448371&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# canny_flux.py

import torch
from diffusers.utils import load_image
from diffusers.pipelines.flux.pipeline_flux_controlnet import FluxControlNetPipeline
from diffusers.models.controlnet_flux import FluxControlNetModel

# 여기서도 마찬가지로 weights 경로를 weights 폴더 안에 저장한다.
base_model = 'black-forest-labs/FLUX.1-dev'
controlnet_model = 'InstantX/FLUX.1-dev-Controlnet-Canny'
controlnet = FluxControlNetModel.from_pretrained(controlnet_model, torch_dtype=torch.bfloat16, local_files_only=True, cache_dir='./weights/')
pipe = FluxControlNetPipeline.from_pretrained(base_model, controlnet=controlnet, torch_dtype=torch.bfloat16, local_files_only=True, cache_dir='./weights/')
pipe.to(&quot;cuda&quot;)

control_image = load_image(&quot;./flux_img.png&quot;)
prompt = &quot;A dog holding a sign that says hello world&quot;
image = pipe(
    prompt, 
    control_image=control_image,
    controlnet_conditioning_scale=0.6,
    num_inference_steps=28, 
    guidance_scale=3.5,
).images[0]
image.save(&quot;flux_controlnet.jpg&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;canny_flux.py 파일을 만들고 위 코드를 넣은 후&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;python canny_flux.py&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;실행&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그러면 현재 경로에 (/workspace/flux/) 에 flux_controlnet.jpg 이미지가 저장되어 있을 것이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 prompt를 확인해보면 다양하게 바꿔가면서 테스트해볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;canny가 적용된 결과를 살펴보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;901&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kN4wE/btsI8Y5fy9V/hkYAZgSYxVWnBhEUdzlwIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kN4wE/btsI8Y5fy9V/hkYAZgSYxVWnBhEUdzlwIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kN4wE/btsI8Y5fy9V/hkYAZgSYxVWnBhEUdzlwIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkN4wE%2FbtsI8Y5fy9V%2FhkYAZgSYxVWnBhEUdzlwIK%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; alt=&quot;canny_flux.jpg&quot; loading=&quot;lazy&quot; width=&quot;530&quot; height=&quot;528&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;901&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;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;퀄리티가 꽤나 좋은것을 확인할 수 있다.&lt;br /&gt;&lt;br /&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ref.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://huggingface.co/black-forest-labs/FLUX.1-dev&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://huggingface.co/black-forest-labs/FLUX.1-dev&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://huggingface.co/InstantX/FLUX.1-dev-Controlnet-Canny&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://huggingface.co/InstantX/FLUX.1-dev-Controlnet-Canny&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/black-forest-labs/flux&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/black-forest-labs/flux&lt;/a&gt;&lt;/p&gt;</description>
      <category>02. Study/Pytorch</category>
      <category>diffusers</category>
      <category>diffusers flux</category>
      <category>flux controlnet</category>
      <category>flux example</category>
      <category>flux 이미지 생성</category>
      <category>이미지 생성</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/178</guid>
      <comments>https://boysboy3.tistory.com/178#entry178comment</comments>
      <pubDate>Mon, 19 Aug 2024 17:41:29 +0900</pubDate>
    </item>
    <item>
      <title>Trapping Rain Water[leetcode 42]</title>
      <link>https://boysboy3.tistory.com/177</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://leetcode.com/problems/trapping-rain-water/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://leetcode.com/problems/trapping-rain-water/description/&lt;/a&gt;&lt;/b&gt;&lt;/h3&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;Problem.&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 막대의 너비가 1인 고도 지도를 나타내는 음이 아닌 정수 n이 주어지면 비가 내린 후 얼마나 많은 물을 가둘 수 있는지 계산해라&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nvVQe/btsI7i4dUcY/YNdCTJFIAFc3URjOBxbE01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nvVQe/btsI7i4dUcY/YNdCTJFIAFc3URjOBxbE01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nvVQe/btsI7i4dUcY/YNdCTJFIAFc3URjOBxbE01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnvVQe%2FbtsI7i4dUcY%2FYNdCTJFIAFc3URjOBxbE01%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;628&quot; height=&quot;248&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;248&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;Input:&amp;nbsp;height&amp;nbsp;=&amp;nbsp;[0,1,0,2,1,0,1,3,2,1,2,1] &lt;br /&gt;Output:&amp;nbsp;6 &lt;br /&gt;Explanation: 위의 지도(검은색 부분)는 배열 [0,1,0,2,1,0,1,3,2,1,2,1]로 표시됩니다. 이 경우 빗물 6개(파란색 부분)가 갇혀 있습니다.&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;Solution.&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제를 해결하기 위해 &quot;Two Pointers&quot; 방법을 이용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;투 포인터는 배열에서 여러가지 쌍을 검색하는 데 일반적으로 사용된다. 만약 자세한 내용을 알고싶다면 geeks 내용을 살펴보자. &lt;a href=&quot;https://www.geeksforgeeks.org/two-pointers-technique/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.geeksforgeeks.org/two-pointers-technique/&lt;/a&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1723988218387&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution:
    def trap(self, height: List[int]) -&amp;gt; int:
        if not height:
            return 0
        
        left, right = 0, len(height) - 1
        left_max, right_max = 0, 0
        water = 0
        
        while left &amp;lt; right:
            if height[left] &amp;lt; height[right]:
                if height[left] &amp;gt;= left_max:
                    left_max = height[left]
                else:
                    water += left_max - height[left]
                left += 1
            else:
                if height[right] &amp;gt;= right_max:
                    right_max = height[right]
                else:
                    water += right_max - height[right]
                right -= 1
        
        return water&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;1. height가 비어있는지 확인하고 비어있다면 0을 반환.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 두 개의 포인터 left, right를 사용하며, left는 시작, right는 끝을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. left_max와 right_max 변수를 통해 각각 왼쪽 및 오른쪽에서 최대 높이를 추적&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. water 변수를 사용해 총 물의 양 계산&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. left가 right보다 작은 동안 반복&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- height[left] 가 height[right] 보다 작다면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - height[left]가 left_max보다 크거나 같으면, left_max를 업데이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 아니라면, left_max - height[left]만큼의 물을 water에 더합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - left를 1 증가시킵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- height[right]가 height[left]보다 작거나 같다면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - height[right]가 right_max보다 크거나 같으면, right_max를 업데이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 그렇지 않으면, right_max - height[right]만큼의 물을 water에 더합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - right를 1 감소시킵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. water 반환&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;이 알고리즘은 O(n) 으로 동작하며 n는 height 리스트 길이&lt;/p&gt;</description>
      <category>02. Study/Algorithm</category>
      <category>LeetCode 42</category>
      <category>python two pointers</category>
      <category>Trapping Rain Water</category>
      <category>two pointer</category>
      <category>빗물 트래핑</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/177</guid>
      <comments>https://boysboy3.tistory.com/177#entry177comment</comments>
      <pubDate>Sun, 18 Aug 2024 22:43:06 +0900</pubDate>
    </item>
    <item>
      <title>이미지 생성을 위한 FLUX.1</title>
      <link>https://boysboy3.tistory.com/176</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 가장 핫한 Flux를 Review해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Flux는 &lt;a href=&quot;http://blackforestlabs.ai&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;blackforestlabs.ai&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;모델은 총 3가지를 제공하고 있으며,&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #1f2937; text-align: start;&quot;&gt;1. FLUX.1 [schnell]&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- step 1~4 단계만으로도 고품질 이미지 생성가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 제일 중요한 apache-2.0 이므로 상업적 목적으로 사용가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모델 weight 공개&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- FLUX 모델 중 가장 빠르게 이미지 생성 가능&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #1f2937; text-align: start;&quot;&gt;2. FLUX.1 [dev]&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 중간급 성능을 보여주며, FLUX.1 [pro] 와 버금가는 성능이라 나와있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 학습시 &lt;span style=&quot;color: #374151; text-align: left;&quot;&gt;guidance distillation 이용하면 효율성이 높아진다고 나와있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: left;&quot;&gt;- 생성된 출력물은 &lt;a href=&quot;https://huggingface.co/black-forest-labs/FLUX.1-dev/blob/main/LICENSE.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://huggingface.co/black-forest-labs/FLUX.1-dev/blob/main/LICENSE.md&lt;/a&gt; 라이센스를 참고하여 확인해보시면 좋을 것 같은데 연구 목적이 큰 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: left;&quot;&gt;- 모델 weight 공개&lt;/span&gt;&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #1f2937; text-align: start;&quot;&gt;3. FLUX.1 [pro]&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 현재 가장 높은 성능을 보여주는 모델&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- API 형태로 제공되며, 모델 공개는 안되어 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기업 전용 솔루션도 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- replicate 기준으로 가격을 살펴보면 $0.055 / image 수준이다.&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;Flux.1 Model Family&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;657&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cX4PQd/btsI7HoRodx/DKA1wsRPau8QbBq92byOx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cX4PQd/btsI7HoRodx/DKA1wsRPau8QbBq92byOx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cX4PQd/btsI7HoRodx/DKA1wsRPau8QbBq92byOx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcX4PQd%2FbtsI7HoRodx%2FDKA1wsRPau8QbBq92byOx0%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;963&quot; height=&quot;657&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;657&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ref : &lt;a href=&quot;https://blackforestlabs.ai/announcing-black-forest-labs/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://blackforestlabs.ai/announcing-black-forest-labs/&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Scaling&amp;nbsp;Rectified&amp;nbsp;Flow&amp;nbsp;Transformers&amp;nbsp;for&amp;nbsp;High-Resolution&amp;nbsp;Image&amp;nbsp;Synthesis&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Scaling&amp;nbsp;Vision&amp;nbsp;Transformers&amp;nbsp;to&amp;nbsp;22&amp;nbsp;Billion&amp;nbsp;Parameters&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 논문 기준으로 모델을 구성하고, 12B 파라미터를 가지고 있다고 한다.&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;RoFormer:&amp;nbsp;Enhanced&amp;nbsp;Transformer&amp;nbsp;with&amp;nbsp;Rotary&amp;nbsp;Position&amp;nbsp;Embedding&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Scaling&amp;nbsp;Vision&amp;nbsp;Transformers&amp;nbsp;to&amp;nbsp;22&amp;nbsp;Billion&amp;nbsp;Parameters&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;&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;향 후 SOTA Text to Video 모델도 Up Next라고 하니 지켜보면 나올것 같다.&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;팔로업을 위해서는 X에서 팔로우하고 지켜보면 업데이트 내용을 확인할 수 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://x.com/bfl_ml&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://x.com/bfl_ml&lt;/a&gt;&lt;/p&gt;</description>
      <category>02. Study/Trends</category>
      <category>blackforestlabs</category>
      <category>Flux</category>
      <category>flux-schnell</category>
      <category>sota 생성형 모델</category>
      <category>이미지 생성</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/176</guid>
      <comments>https://boysboy3.tistory.com/176#entry176comment</comments>
      <pubDate>Sat, 17 Aug 2024 23:55:42 +0900</pubDate>
    </item>
    <item>
      <title>two-sum [leetcode 1]</title>
      <link>https://boysboy3.tistory.com/175</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/two-sum&quot;&gt;https://leetcode.com/problems/two-sum&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;리트코드 첫번째 문제이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;첫번째 문제답게 난이도는 낮은편이고 그럼 문제를 살펴보도록 하자.&lt;/p&gt;
&lt;pre id=&quot;code_1723728829334&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;Example 1:

Input: nums = [2,7,11,15], target = 9
Output: [0,1]
Explanation: Because nums[0] + nums[1] == 9, we return [0, 1].
Example 2:

Input: nums = [3,2,4], target = 6
Output: [1,2]
Example 3:

Input: nums = [3,3], target = 6
Output: [0,1]
 

Constraints:

2 &amp;lt;= nums.length &amp;lt;= 104
-109 &amp;lt;= nums[i] &amp;lt;= 109
-109 &amp;lt;= target &amp;lt;= 109
Only one valid answer exists.&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;입력으로 nums 리스트가 주어지고, 리스트 안에 숫자가 있는데 이 조합을 통해 target을 만드는 문제다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;제약조건을 살펴봐야하는데 리스트의 크기는 2 ~ 104 사이의 크기를 가지고 있고 오직 답은 1개만 나온다고 한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 결국 최종적으로 리턴해야할 값은 리스트형태의 nums의 인덱스 위치다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;문제를 딱 보면 완전탐색(브루트포스) 형태로 모든것을 검색하면서 탐색할 수 있을거라 생각이 나서 바로 풀어봤다.&lt;/p&gt;
&lt;pre id=&quot;code_1723728829336&quot; class=&quot;vim&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;class Solution:
    def twoSum(self, nums: List[int], target: int) -&amp;gt; List[int]:
        for i in range(len(nums)):
            for j in range(i+1, len(nums)):
                if nums[i] + nums[j] == target:
                    return [i,j]&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;0 1 2 3 이라는 인덱스가 있을때&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;0 1 -&amp;gt; 0 2 -&amp;gt; 0 3&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1 2 -&amp;gt; 1 3&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2 3&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;순서로 리스트를 순회하면서 확인하는 코드이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사실 보면 시간복잡도가 O^2이므로 속도면에서는 빠르지 않다.. 정확하게는 (0.5n^2) 정도가 되겠지만;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Dict 형태를 활용한다면 O(n)으로 시간복잡도를 줄일 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;실제로 실행해보면 가장 빠르게 동작할 수 있는 것을 확인해볼 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1723728829336&quot; class=&quot;ruby&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;class Solution:
    def twoSum(self, nums: List[int], target: int) -&amp;gt; List[int]:
        num_dict = {}
        for i, num in enumerate(nums):
            complement = target - num
            if complement in num_dict:
                return [num_dict[complement], i]
            num_dict[num] = i
        return []  # 해답이 없는 경우 (문제 조건에 따르면 이 경우는 발생하지 않습니다)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;간단하게 코드를 리뷰해보면&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1. num_dict 빈 딕셔너를 생성하고&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. enumerate를 통해 num 인덱스 i를 가져오게 된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. 현재 숫자 num와 합쳐 target이 될 수 있는 값을 complement로 계산한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;4. complement 값이 num_dict 딕셔너리 안에 있는지 확인하고, 있다면 어떤 숫자와 현재 숫자가 합쳐져서 target이 될 수 있는 것을 의미한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;5. 결국 complement가 num_dict에 있다면 complement 숫자의 인덱스와 현재 숫자의 인덱스를 반환하며 이게 return 된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ref&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://github.com/onlybooks/python-algorithm-interview&quot;&gt;파이썬 알고리즘 인터뷰 (책)&lt;/a&gt;&lt;/p&gt;</description>
      <category>02. Study/Algorithm</category>
      <category>LeetCode Two Sum</category>
      <category>python two sum</category>
      <category>python 알고리즘</category>
      <category>리트코드 풀이</category>
      <category>선형 자료구조</category>
      <category>완전탐색</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/175</guid>
      <comments>https://boysboy3.tistory.com/175#entry175comment</comments>
      <pubDate>Thu, 15 Aug 2024 22:34:25 +0900</pubDate>
    </item>
    <item>
      <title>Longest Palindromic Substring [leet code 5]</title>
      <link>https://boysboy3.tistory.com/174</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/longest-palindromic-substring/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/longest-palindromic-substring/&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;팰린드롬 부분 문자열 문제다.&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;Palindromic 팰린드롬이 뭔지 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%ED%9A%8C%EB%AC%B8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Wiki &lt;/a&gt;를 살펴보니 &lt;b&gt;회문&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122; text-align: start;&quot;&gt;(回文) 또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;팰린드롬&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122; text-align: start;&quot;&gt;(palindrome)은 거꾸로 읽어도 제대로 읽는 것과 같은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; href=&quot;https://ko.wikipedia.org/wiki/%EB%AC%B8%EC%9E%A5&quot;&gt;문장&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122; text-align: start;&quot;&gt;이나&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; href=&quot;https://ko.wikipedia.org/wiki/%EB%82%B1%EB%A7%90&quot;&gt;낱말&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122; text-align: start;&quot;&gt;, 숫자, 문자열(sequence of characters) 등이다. 보통 낱말 사이에 있는 띄어쓰기나 문장 부호는 무시한다라고 나와있다.&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;background-color: #ffffff; color: #202122; text-align: start;&quot;&gt;그럼 이제 문제를 살펴보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1723560796320&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Example 1:

Input: s = &quot;babad&quot;
Output: &quot;bab&quot;
Explanation: &quot;aba&quot; is also a valid answer.
Example 2:

Input: s = &quot;cbbd&quot;
Output: &quot;bb&quot;
 

Constraints:

1 &amp;lt;= s.length &amp;lt;= 1000
s consist of only digits and English letters.&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;조건을 살펴보면 문자 s 의 길이는 1~1000사이로 주어지고, 문자안에 digits 숫자도 포함되는것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 &quot;asf11fa&quot; 가있다면 &quot;f11f&quot; 도 팰린드롬이 될 수 있다.&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. s의 길이가 2 미만이면 그대로 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 각 문자를 확인하면서 해당 문자를 중심으로 하는 홀수 길이 팰린드롬 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 각 문자를 확인하면서 해당 문자와 다음 문자 사이를 중심으로 하는 짝수 길이 팰린드롬 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 양쪽으로 확장하면서 팰린드롬 순회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 팰린드롬 길이가 이전에 찾은 최대 길이보다 길면 시작 위치와 길이 갱신&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. return&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;이 알고리즘의 시간 복잡도는 O(n^2)이라 통과 안될 줄 알았는데 생각보다 빠른 속도로 통과됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1723561378485&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution:
    def longestPalindrome(self, s: str) -&amp;gt; str:
        if len(s) &amp;lt; 2:
            return s
        
        start = 0
        max_len = 1
        
        for i in range(len(s)):
            # 홀수 길이 팰린드롬 확인
            left, right = i, i
            while left &amp;gt;= 0 and right &amp;lt; len(s) and s[left] == s[right]:
                if right - left + 1 &amp;gt; max_len:
                    start = left
                    max_len = right - left + 1
                left -= 1
                right += 1
            
            # 짝수 길이 팰린드롬 확인
            left, right = i, i + 1
            while left &amp;gt;= 0 and right &amp;lt; len(s) and s[left] == s[right]:
                if right - left + 1 &amp;gt; max_len:
                    start = left
                    max_len = right - left + 1
                left -= 1
                right += 1
        
        return s[start:start + max_len]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>02. Study/Algorithm</category>
      <category>longest palindrome substring</category>
      <category>리트코드 5</category>
      <category>부분 문자열</category>
      <category>팰린드롬</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/174</guid>
      <comments>https://boysboy3.tistory.com/174#entry174comment</comments>
      <pubDate>Wed, 14 Aug 2024 00:04:18 +0900</pubDate>
    </item>
    <item>
      <title>Group Anagrams [leet code 49]</title>
      <link>https://boysboy3.tistory.com/173</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/group-anagrams/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://leetcode.com/problems/group-anagrams/&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;애너그램이란&lt;/b&gt; 문자열이 주어졌을 때, 알파벳의&amp;nbsp;나열&amp;nbsp;순서를&amp;nbsp;다르지만&amp;nbsp;그&amp;nbsp;구성이&amp;nbsp;일치하면&amp;nbsp;두&amp;nbsp;단어는&amp;nbsp;아나그램이라고&amp;nbsp;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex)&amp;nbsp; a = &quot;atta&quot;&amp;nbsp; &amp;nbsp; b = &quot;taat&quot; 일때 나열 순서는 다르지만 a 2개 t 2개로 a 와 b는 Anagram이라고 표현한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1723472547171&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Example 1:

Input: strs = [&quot;eat&quot;,&quot;tea&quot;,&quot;tan&quot;,&quot;ate&quot;,&quot;nat&quot;,&quot;bat&quot;]
Output: [[&quot;bat&quot;],[&quot;nat&quot;,&quot;tan&quot;],[&quot;ate&quot;,&quot;eat&quot;,&quot;tea&quot;]]
Example 2:

Input: strs = [&quot;&quot;]
Output: [[&quot;&quot;]]
Example 3:

Input: strs = [&quot;a&quot;]
Output: [[&quot;a&quot;]]&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;문제는 strs 리스트 형태로 각 원소들이 str 형태가 주어지면 anagram 문자끼리 list로 묶어서 return하는 문제다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양하게 문제 풀이를 진행할 수 있으며, 여기서는 list 비교와 dict 형태로 두가지 풀이를 해볼 예정이다.&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;list방식으로 문자열을 비교하면 다음과 같이 풀이할 수있을 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1723473016521&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution:
    def groupAnagrams(self, strs: List[str]) -&amp;gt; List[List[str]]:
        # 결과를 저장할 리스트
        result = []
        # 이미 그룹화된 문자열들을 추적할 리스트
        seen = [False] * len(strs)
        
        for i in range(len(strs)):
            if seen[i]:
                continue
            # 현재 문자열을 포함할 새로운 그룹 생성
            group = [strs[i]]
            seen[i] = True
            # 나머지 문자열들과 비교
            for j in range(i + 1, len(strs)):
                if not seen[j] and sorted(strs[i]) == sorted(strs[j]):
                    group.append(strs[j])
                    seen[j] = True
            # 그룹을 결과 리스트에 추가
            result.append(group)
        
        return result&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;위 코드로 Run을 해보면 Testcase는 잘 통과하는 것을 볼 수 있겠지만, Submit를 하게되면 &lt;b&gt;Time Limit Exceeded&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 style=&quot;background-color: #0f0f0f; color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #0f0f0f; color: #ffffff; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 &amp;lt;= strs.length &amp;lt;= 104&lt;/li&gt;
&lt;li&gt;0 &amp;lt;= strs[i].length &amp;lt;= 100&lt;/li&gt;
&lt;li&gt;strs[i]&lt;span&gt;&amp;nbsp;&lt;/span&gt;consists of lowercase English letters.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제약조건을 보면 str 길이가 길어지면 비교도 많아지고 이중포문을 돌며 리스트에 저장되면서 각 문자열을 다른 모든 문자열과 비교하기 때문인데, 다음과 같이 코드를 수정하면 느리지만 통과할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1723473255911&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution:
    def groupAnagrams(self, strs: List[str]) -&amp;gt; List[List[str]]:
        # 결과를 저장할 리스트
        result = []
        # 정렬된 문자열 리스트
        sorted_strs = []
        
        for s in strs:
            # 문자열을 정렬한 후 그 결과를 저장
            sorted_s = ''.join(sorted(s))
            
            # 정렬된 문자열이 이미 존재하는지 확인
            found = False
            for i in range(len(sorted_strs)):
                if sorted_strs[i] == sorted_s:
                    result[i].append(s)
                    found = True
                    break
            
            # 만약 새로운 아나그램 그룹이라면 새로 추가
            if not found:
                sorted_strs.append(sorted_s)
                result.append([s])
        
        return result&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;모든 문자열을 비교하던 것에 비해 효율적으로 비교하여시간 복잡도가 크게 줄어드는데, 사실 제일 간편하게 dict를 사용하면 삽입 삭제 등 비교하는게 시간 효율이 좋아질 것이다.&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;pre id=&quot;code_1723473333157&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution:
    def groupAnagrams(self, strs: List[str]) -&amp;gt; List[List[str]]:
        # 아나그램 그룹을 저장할 딕셔너리 생성
        results = {}
        
        # 주어진 문자열 배열에서 각 문자열을 순회
        for s in strs:
            # 문자열을 정렬한 후 그 정렬된 문자열을 키로 사용
            sorted_str = ''.join(sorted(s))
            
            # 정렬된 문자열이 딕셔너리에 없다면 새 리스트 생성
            if sorted_str not in results:
                results[sorted_str] = []
            
            # 해당 리스트에 원래 문자열 추가
            results[sorted_str].append(s)
        
        # 아나그램 그룹들을 리스트로 반환
        return list(results.values())&lt;/code&gt;&lt;/pre&gt;</description>
      <category>02. Study/Algorithm</category>
      <category>anagram python</category>
      <category>leet code</category>
      <category>leet code 49 python</category>
      <category>아나그램 python</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/173</guid>
      <comments>https://boysboy3.tistory.com/173#entry173comment</comments>
      <pubDate>Mon, 12 Aug 2024 23:36:29 +0900</pubDate>
    </item>
    <item>
      <title>AttributeError: module 'cv2.dnn' has no attribute 'DictValue'</title>
      <link>https://boysboy3.tistory.com/172</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;rembg import 시 다음과 같은 오류가 발생하였다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #f6f8fa; color: #1f2328; text-align: start;&quot;&gt;&lt;code&gt;from rembg import remove&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;ImportError 내용&lt;/p&gt;
&lt;pre id=&quot;code_1723425011134&quot; class=&quot;coffeescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ImportError: module 'cv2.dnn' has no attribute 'DictValue'&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;인터넷글을 찾아보니 다음과 같이 opencv 문제로 버전문제라고 버전을 바꾸라고 나와있다.&lt;/p&gt;
&lt;pre id=&quot;code_1723425071200&quot; class=&quot;angelscript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install opencv-python==4.8.0.74&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1723425127791&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 1. download the autofix tool
pip install opencv-fixer==0.2.5
# 2. execute
python -c &quot;from opencv_fixer import AutoFix; AutoFix()&quot;&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;해당 이슈는 다음 git issues에서 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/facebookresearch/nougat/issues/40&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/facebookresearch/nougat/issues/40&lt;/a&gt;&lt;/p&gt;</description>
      <category>02. Study/Error</category>
      <category>AttributeError</category>
      <category>cv2.dnn' has no attribute 'dictvalue</category>
      <category>dictvalue</category>
      <category>rembg</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/172</guid>
      <comments>https://boysboy3.tistory.com/172#entry172comment</comments>
      <pubDate>Mon, 12 Aug 2024 10:13:31 +0900</pubDate>
    </item>
    <item>
      <title>Most Common Word [leetcode 819]</title>
      <link>https://boysboy3.tistory.com/171</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/most-common-word/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://leetcode.com/problems/most-common-word/description/&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;&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;&lt;b&gt;1. 처음 풀이법&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;/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;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_1723386011549&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from typing import List

class Solution:
    def mostCommonWord(self, paragraph: str, banned: List[str]) -&amp;gt; str:
        # 소문자로 변환
        paragraph = paragraph.lower()
        
        # 구두점 제거 및 단어 분리
        words = []
        current_word = &quot;&quot;
        for char in paragraph:
            if char.isalpha():
                current_word += char
            else:
                if current_word:
                    words.append(current_word)
                    current_word = &quot;&quot;
        if current_word:  # 마지막 단어 추가
            words.append(current_word)
        
        # 단어 빈도수 계산
        word_count = {}
        for word in words:
            if word not in banned:
                word_count[word] = word_count.get(word, 0) + 1
        
        # 가장 빈번한 단어 찾기
        max_count = 0
        most_common = &quot;&quot;
        for word, count in word_count.items():
            if count &amp;gt; max_count:
                max_count = count
                most_common = word
        
        return most_common&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;하지만 생각해보니, 정규표현식으로 간단하게 풀이할 수 있었다.&lt;/p&gt;
&lt;pre id=&quot;code_1723386088150&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import re
from typing import List

class Solution:
    def mostCommonWord(self, paragraph: str, banned: List[str]) -&amp;gt; str:
        # 소문자로 변환하고 알파벳이 아닌 문자를 공백으로 대체
        paragraph = re.sub(r'[^a-zA-Z]', ' ', paragraph.lower())
        
        # 단어로 분리
        words = paragraph.split()
        
        # 단어 빈도수 계산
        word_count = {}
        for word in words:
            if word not in banned:
                word_count[word] = word_count.get(word, 0) + 1
        
        # 가장 빈번한 단어 찾기
        return max(word_count, key=word_count.get)&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;두개 속도를 비교해보면 처음 순서대로 풀이한게 속도 측면은 더 빨랐으며, 아래 풀이는 간편하게 풀이할 수 있다.&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;</description>
      <category>02. Study/Algorithm</category>
      <category>leetcode 819</category>
      <category>leetcode most common word</category>
      <category>Most Common Word</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/171</guid>
      <comments>https://boysboy3.tistory.com/171#entry171comment</comments>
      <pubDate>Sun, 11 Aug 2024 23:22:53 +0900</pubDate>
    </item>
    <item>
      <title>FastHTML 소개</title>
      <link>https://boysboy3.tistory.com/170</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;FastHTML&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FastHTML은 Python으로 웹 애플리케이션을 만들고 몇 분 안에 배포할 수 있는 웹 프로그래밍 시스템입니다. 목표는 빠른 프로토타입을 만드는 가장 쉬운 방법과 확장 및 축소가 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, Railway, Vercel 등 다양한 호스팅 서비스에서 쉽게 배포가 가능하며 React, Next.JS와 비슷한 프레임워크와 비교했을 때 속도와 사용성 면에서 경쟁력이 있다 주장하고 있다.&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 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-anchor-id=&quot;installation&quot; data-ke-size=&quot;size26&quot;&gt;설치&lt;/h2&gt;
&lt;pre id=&quot;code_1723370887782&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install python-fasthtml&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 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-anchor-id=&quot;usage&quot; data-ke-size=&quot;size26&quot;&gt;사용법&lt;/h2&gt;
&lt;pre id=&quot;code_1723370925112&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# main.py
from fasthtml.common import *

app,rt = fast_app()

@rt('/')
def get(): return Div(P('Hello World!'), hx_get=&quot;/change&quot;)

serve()&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;/h3&gt;
&lt;pre id=&quot;code_1723370975968&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python main.py # 웹 브라우저 -&amp;gt; http://localhost:5001&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;위 사용 실행법을 보면, 실제로 너무 간편하게 web에서 실행할 수있고, 실행중에 코드 수정하면 지속적으로 바뀌면서 반영된다. 약간 FastAPI과 비슷한 구조로 되어있는데 실제로 저자가 말하기로는 Backend를 FastAPI를 사용하면 빠르게 개발할 수 있다고 나와있다.&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;시간날때마다 지속적으로 FastHTML을 가지고 다양한 것을 만들어 볼 예정이다.&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;실제 전설적인 Python Coder이자 Django의 공동저자인 Audrey Roy Greenfeld는 다음과 같이 얘기하였습니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;I&amp;nbsp;think&amp;nbsp;the&amp;nbsp;fact&amp;nbsp;that&amp;nbsp;an&amp;nbsp;experienced&amp;nbsp;web&amp;nbsp;dev&amp;nbsp;can&amp;nbsp;get&amp;nbsp;productive&amp;nbsp;in&amp;nbsp;1&amp;nbsp;hour&amp;nbsp;accidentally&amp;nbsp;undersells&amp;nbsp;FastHTML&amp;nbsp;a&amp;nbsp;bit.&amp;nbsp;For&amp;nbsp;me&amp;nbsp;it&amp;nbsp;is&amp;nbsp;like&amp;nbsp;a&amp;nbsp;fractal&amp;nbsp;where&amp;nbsp;the&amp;nbsp;more&amp;nbsp;I&amp;nbsp;explore,&amp;nbsp;the&amp;nbsp;more&amp;nbsp;interesting&amp;nbsp;is&amp;nbsp;and&amp;nbsp;the&amp;nbsp;more&amp;nbsp;I&amp;nbsp;learn.&amp;nbsp;I&amp;rsquo;m&amp;nbsp;about&amp;nbsp;40&amp;nbsp;hours&amp;nbsp;in,&amp;nbsp;enough&amp;nbsp;to&amp;nbsp;realise&amp;nbsp;I&amp;nbsp;know&amp;nbsp;nothing&amp;nbsp;compared&amp;nbsp;with&amp;nbsp;what&amp;nbsp;I&amp;nbsp;can&amp;nbsp;learn.&amp;ldquo; &lt;br /&gt;&lt;br /&gt;&quot;숙련된&amp;nbsp;웹&amp;nbsp;개발자가&amp;nbsp;1시간&amp;nbsp;만에&amp;nbsp;생산성을&amp;nbsp;높일&amp;nbsp;수&amp;nbsp;있다는&amp;nbsp;사실이&amp;nbsp;FastHTML을&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;40시간이&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;정도입니다.&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ref.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.fastht.ml/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.fastht.ml/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Auqrm7WFc0I&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=Auqrm7WFc0I&lt;/a&gt;&lt;/p&gt;</description>
      <category>02. Study/FastHTML</category>
      <category>fasthtml</category>
      <category>python html</category>
      <category>python 웹 애플리케이션</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/170</guid>
      <comments>https://boysboy3.tistory.com/170#entry170comment</comments>
      <pubDate>Sun, 11 Aug 2024 19:22:50 +0900</pubDate>
    </item>
    <item>
      <title>BardAPI를 이용한 ChatBot 만들기</title>
      <link>https://boysboy3.tistory.com/169</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 요즘 ChatGPT와 대립하여 많은 분들이 사용중인 Google에서 만든 BardAPI+Streamlit를 이용하여 ChatBot을 구현해보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bard_chatbot-min.gif&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;760&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cI7hG3/btsij69oDkP/F6Ns7xq1k9Svrs81GLFKtK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cI7hG3/btsij69oDkP/F6Ns7xq1k9Svrs81GLFKtK/img.gif&quot; data-alt=&quot;Bard를 이용한 ChatBot 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cI7hG3/btsij69oDkP/F6Ns7xq1k9Svrs81GLFKtK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cI7hG3/btsij69oDkP/F6Ns7xq1k9Svrs81GLFKtK/img.gif&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;646&quot; height=&quot;760&quot; data-filename=&quot;bard_chatbot-min.gif&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;760&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Bard를 이용한 ChatBot 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linux 환경 &amp;amp; Window 환경 둘 다 상관없이 잘 돌아가는 것을 확인했다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 필요 Package 설치&lt;/h3&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;pip install streamlit
pip install streamlit-chat
pip install bardapi&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. BardAPI 발급받기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;주의사항 : 쿠키값(Cookie Value)이 주기적으로 변할 수 있으니 값을 항상 확인해주자&lt;/u&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://bard.google.com/&quot;&gt;https://bard.google.com/&lt;/a&gt; 방문하기&lt;/li&gt;
&lt;li&gt;F12를 눌러 console 창 띄우기&lt;/li&gt;
&lt;li&gt;Application -&amp;gt; Cookies -&amp;gt; &lt;code&gt;__Secure-1PSID&lt;/code&gt; 값 복사하기&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;1451&quot; data-origin-height=&quot;564&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpMbtF/btsic6wdLtt/XUUYPVkslZ8jerlQeQLZDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpMbtF/btsic6wdLtt/XUUYPVkslZ8jerlQeQLZDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpMbtF/btsic6wdLtt/XUUYPVkslZ8jerlQeQLZDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpMbtF%2Fbtsic6wdLtt%2FXUUYPVkslZ8jerlQeQLZDK%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;1451&quot; height=&quot;564&quot; data-origin-width=&quot;1451&quot; data-origin-height=&quot;564&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 복사한 값 os.environ['_BARD_API_KEY']에 넣기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 아래 코드를 streamlit_bard.py 로 저장&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;# streamlit_bard.py 


import streamlit as st
from streamlit_chat import message
import requests
from bardapi import Bard
import os
import bardapi
os.environ['_BARD_API_KEY']=&quot;Insert the copied value here&quot; # 저장한 값 변경


st.header(&quot; &amp;zwj; Bard ChatBot &amp;zwj; &quot;)
st.markdown(&quot;[Demo Site](boysboy3.tistory.com)&quot;)

if 'generated' not in st.session_state:
    st.session_state['generated'] = []

if 'past' not in st.session_state:
    st.session_state['past'] = []



with st.form('form', clear_on_submit=False):
    user_input = st.text_input('You: ', '', key='input')
    submitted = st.form_submit_button('Send')

if submitted or user_input:
    response = bardapi.core.Bard().get_answer(user_input)

    st.session_state.past.append(user_input)
    st.session_state.generated.append(response['content'])

if st.session_state['generated']:
    for i in range(len(st.session_state['generated'])-1, -1, -1):
        message(st.session_state['past'][i], is_user=True, key=str(i) + '_user')
        message(st.session_state[&quot;generated&quot;][i], key=str(i))&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 실행&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어를 cmd를 통해 실행 시킨 후 &lt;code&gt;http://localhost:8501/&lt;/code&gt;로 접속 가능&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;streamlit run streamlit_bard.py&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;* Reference&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/dsdanielpark/Bard-API&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/dsdanielpark/Bard-API&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/AI-Yash/st-chat&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/AI-Yash/st-chat&lt;/a&gt;&lt;/p&gt;</description>
      <category>02. Study/API</category>
      <category>Bard Chatbot</category>
      <category>BardAPI</category>
      <category>Chatbot</category>
      <category>streamlit</category>
      <category>바드</category>
      <category>바드 챗봇</category>
      <category>챗봇만들기</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/169</guid>
      <comments>https://boysboy3.tistory.com/169#entry169comment</comments>
      <pubDate>Thu, 1 Jun 2023 17:56:54 +0900</pubDate>
    </item>
    <item>
      <title>졸업생 감동시킨 필즈상 허준이 교수님의 서울대 졸업식 축사</title>
      <link>https://boysboy3.tistory.com/168</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #030303;&quot;&gt;'''&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #030303;&quot;&gt;안녕하세요, 07년도 여름에 졸업한 수학자 허준이입니다.&lt;/span&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #030303;&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;background-color: #f9f9f9; color: #030303;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #030303;&quot;&gt;우리가 팔십 년을 건강하게 산다고 가정하면 약 삼만일을 사는 셈인데, 우리 직관이 다루기엔 제법 큰 수입니다. 저는 대략 그 절반을 지나 보냈고, 여러분 대부분은 약 삼 분의 일을 지나 보냈습니다. 혹시 그중 며칠을 기억하고 있는지 세어 본 적 있으신가요? 쉼 없이 들이쉬고 내쉬는 우리가 오랫동안 잡고 있을 날들은 삼만의 아주 일부입니다. 먼 옛날의 나와, 지금 여기의 나와, 먼 훗날의 나라는 세 명의 완벽히 낯선 사람들을 이런 날들이 엉성하게 이어 주고 있습니다. 마무리 짓고 새롭게 시작하는 오늘 졸업식이 그런 날 중 하나일 수 있겠다는 생각이 듭니다. 그런 하루를 여러분과 공유할 수 있어서 무척 기쁩니다.&lt;/span&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #030303;&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;background-color: #f9f9f9; color: #030303;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #030303;&quot;&gt;학위수여식에 참석할 때 감수해야 할 위험 중 하나가 졸업 축사가 아닌가 합니다. 우연과 의지와 기질이 기막히게 정렬돼서 크게 성공한 사람의 교묘한 자기 자랑을 듣고 말 확률이 있기 때문입니다. 저는 겁이 나서, 아니면 충실하게 지내지 못한 대학생활이 부끄러워 십오 년 전 이 자리에 오지 못했습니다만, 여러분은 축하받을 만한 일을 축하받기 위해 이를 무릅쓰고 이곳에 왔습니다.&lt;/span&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #030303;&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;background-color: #f9f9f9; color: #030303;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #030303;&quot;&gt;졸업식 축사에서는 어떤 이야기를 하면 좋을까요? 십몇 년 후의 내가 되어 자신에게 해줄 축사를 미리 떠올려 보는 것도, 그 사람에게 듣고 싶은 축사를 지금 떠올려 보는 것도 가치 있지 않을까 싶습니다. 생각해 보세요. 당연하게 떠오르는 말은 없습니다. 지난 몇천 일, 혹은 다가올 몇천 일간의 온갖 기대와 실망, 친절과 부조리, 행운과 불행, 그새 무섭도록 반복적인 일상의 세부 사항은 말하기에도, 듣기에도 힘들거니와 격려와 축하라는 본래의 목적에도 어울리지 않을 것입니다. 구체화한 마음은 부적절하거나 초라합니다.&lt;/span&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #030303;&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;background-color: #f9f9f9; color: #030303;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #030303;&quot;&gt;제 대학생활은 잘 포장해서 이야기해도 길 잃음의 연속이었습니다. 똑똑하면서 건강하고 성실하기까지 한 주위 수많은 친구를 보면서 나 같은 사람은 뭘 하며 살아야 하나 고민했습니다. 잘 쉬고 돌아오라던 어느 은사님의 말씀이, 듬성듬성해진 성적표 위에서 아직도 저를 쳐다보고 있는 듯합니다. 지금 듣고 계신 분들도 정도의 차이와 방향의 다름이 있을지언정 지난 몇 년간 본질적으로 비슷한 과정을 거쳤으리라 생각합니다. 그리고 이제 더 큰 도전, 불확실하고, 불투명하고, 끝은 있지만 잘 보이진 않는 매일의 반복을 눈앞에 두고 있습니다. 생각보다 힘들 수도, 생각만큼 힘들 수도 있습니다.&lt;/span&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #030303;&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;background-color: #f9f9f9; color: #030303;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #030303;&quot;&gt;이제 본격적으로 어른입니다. 실패를 두려워하지 말고 도전하라. 편안하고 안전한 길을 거부하라. 타협하지 말고 자신의 진짜 꿈을 좇아라. 모두 좋은 조언이고 사회의 입장에서는 특히나 유용한 말입니다만, 개인의 입장은 다를 수 있음을 여러분은 이미 고민해 봤습니다. 제로섬 상대평가의 몇 가지 퉁명스러운 기준을 따른다면, 일부만이 예외적으로 성공할 것입니다. 여러 변덕스러운 우연이, 지쳐버린 타인이, 그리고 누구보다 자신이 자신에게 모질게 굴 수 있으니 마음 단단히 먹기 바랍니다. 나는 커서 어떻게 살까, 오래된 질문을 오늘부터의 매일이 대답해줍니다. 취업 준비, 결혼 준비, 육아 교육 승진 은퇴 노후 준비를 거쳐 어디 병원 그럴듯한 일인실에서 사망하기 위한 준비에 산만해지지 않기를 바랍니다. 무례와 혐오와 경쟁과 분열과 비교와 나태와 허무의 달콤함에 길들지 말길, 의미와 무의미의 온갖 폭력을 이겨내고 하루하루를 온전히 경험하길, 그 끝에서 오래 기다리고 있는 낯선 나를 아무 아쉬움 없이 맞이하길 바랍니다.&lt;/span&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #030303;&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;background-color: #f9f9f9; color: #030303;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #030303;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #030303;&quot;&gt;오래전의 제가 졸업식에 왔다면 무슨 이야기를 해줘야 할까 고민했습니다만 생각을 매듭짓지 못했습니다. 그가 경험하게 될 날들이 안쓰럽기도 하고 가슴 먹먹하게 부럽기도 합니다. 여러분은 자신에게 선물할 어떤 축사를 떠올리셨을지 궁금합니다.&lt;/span&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #030303;&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;background-color: #f9f9f9; color: #030303;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #030303;&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;background-color: #f9f9f9; color: #030303;&quot;&gt;타인을 내가 아직 기억하지 못하는 먼 미래의 자신으로, 자신을 잠시지만 지금 여기서 온전히 함께하고 있는 타인으로 받아들일 수 있을까 궁금해집니다. 졸업생 여러분, 오래 준비한 완성을 축하하고, 오늘의 새로운 시작을 축하합니다. 서로에게, 그리고 자신에게 친절하시길, 그리고 그 친절을 먼 미래의 우리에게 잘 전달해 주길 바랍니다. 응원합니다. 축하합니다. 감사합니다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&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;'''&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;&lt;/p&gt;</description>
      <category>05. Tip/Etc</category>
      <category>필즈상 허준이</category>
      <category>허준이</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/168</guid>
      <comments>https://boysboy3.tistory.com/168#entry168comment</comments>
      <pubDate>Thu, 1 Sep 2022 14:44:02 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 시퀀스(python sequence)_05</title>
      <link>https://boysboy3.tistory.com/167</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;시퀀스(sequence) 타입이란 순서가 있는 데이터 집합인데, 파이썬에서는 대표적으로 리스트(list)가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 중, 수정 가능한 mutable(가변)형 및 수정 불가능한 immutable(불변)형이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;mutable&lt;/b&gt;(list, bytearray, array.array, memoryview, deque etc..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;immutable&lt;/b&gt;(tuple, str, bytes etc..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 파이썬에서는 크게 2가지 종류의 데이터 타입으로 나뉜다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컨테이너&lt;/b&gt;(container:서로 다른 자료형 담을 수 있는 데이터 타입) -&amp;gt; list, tuple, collections.deque etc...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;플랫&lt;/b&gt;(flat: 한개의 자료형만 담을 수 있는 데이터 타입) -&amp;gt; str, bytes, bytearray, array.array, memoryview etc...&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;다음 예제는 문자 -&amp;gt; 유니코드로 변환 하고 다시 유니코드 -&amp;gt; 문자로 변경하는 실습을 해보자.&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;7&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;chars&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'+_)(*&amp;amp;^%$#@!'&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;str는&amp;nbsp;불변이라&amp;nbsp;chars[2]&amp;nbsp;=&amp;nbsp;'s'&amp;nbsp;이렇게&amp;nbsp;변경&amp;nbsp;불가!&amp;nbsp;왜냐면&amp;nbsp;불변형이기&amp;nbsp;때문에!&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;code_list1&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;[]&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;for&lt;/span&gt;&amp;nbsp;s&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;chars:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;code_list1.append(ord(s)) # ord() 문자를 유니코드로 변경&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(code_list1)&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #4f4f4ftext-decoration:none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&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;하지만 속도면에서도 훨씬 빠른 list comprehending을 이용하면 쉽고 빠르게 작성할 수 있다.&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;code_list2&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;[ord(s)&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;for&lt;/span&gt;&amp;nbsp;s&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;chars]&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;한줄로도&amp;nbsp;이렇게&amp;nbsp;표현&amp;nbsp;가능하다.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 유니코드로 돌리려면 chr() 메소드를 이용하면 다시 돌릴 수 있다.&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;code_list3&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;[ord(s)&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;for&lt;/span&gt;&amp;nbsp;s&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;chars&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;if&lt;/span&gt;&amp;nbsp;ord(s)&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;40&lt;/span&gt;]&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(code_list3)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;code_list4&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;list(filter(lambda&amp;nbsp;x&amp;nbsp;:&amp;nbsp;x&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;40&lt;/span&gt;,&amp;nbsp;map(ord,&amp;nbsp;chars)))&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(code_list4)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;([chr(s)&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;for&lt;/span&gt;&amp;nbsp;s&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;code_list1])&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;ord&amp;nbsp;반대로&amp;nbsp;/&amp;nbsp;유니코드를&amp;nbsp;문자로&amp;nbsp;바꿔줌&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&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;b&gt;깊은 복사(deep copy), 얕은 복사(shallow copy)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깊은 복사는 새로운 소주에 값을 할당하여 값을 변경 해도 다른 객체이기 때문에 변경하면 이전 객체는 변경되지 않는 반면, 얕은 복사는 값을 수정하면&amp;nbsp; 값이 참조하고있기에 변경된다.&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;7&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;8&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;9&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;10&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;11&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;12&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;13&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;14&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;15&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;16&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;17&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;18&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;marks1&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;[[&lt;span style=&quot;color: #ffd500;&quot;&gt;'~'&lt;/span&gt;]&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;*&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;3&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;for&lt;/span&gt;&amp;nbsp;_&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;range&lt;/span&gt;(&lt;span style=&quot;color: #c10aff;&quot;&gt;4&lt;/span&gt;)]&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(marks1)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;marks2&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;[[&lt;span style=&quot;color: #ffd500;&quot;&gt;'~'&lt;/span&gt;]&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;3&lt;/span&gt;]&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;*&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;이렇게&amp;nbsp;만들어도&amp;nbsp;결과는&amp;nbsp;똑같지만,&amp;nbsp;수정시&amp;nbsp;문제가&amp;nbsp;된다&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(marks2)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;수정&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;marks1[&lt;span style=&quot;color: #c10aff;&quot;&gt;0&lt;/span&gt;][&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;]&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'X'&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;marks2[&lt;span style=&quot;color: #c10aff;&quot;&gt;0&lt;/span&gt;][&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;]&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'X'&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(marks1)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(marks2)&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;이렇게&amp;nbsp;수정하면&amp;nbsp;각&amp;nbsp;리스트별&amp;nbsp;2번째&amp;nbsp;원소가&amp;nbsp;다&amp;nbsp;바뀐다.&amp;nbsp;[['~',&amp;nbsp;'X',&amp;nbsp;'~'],&amp;nbsp;['~',&amp;nbsp;'X',&amp;nbsp;'~'],&amp;nbsp;['~',&amp;nbsp;'X',&amp;nbsp;'~'],&amp;nbsp;['~',&amp;nbsp;'X',&amp;nbsp;'~']]&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;왜&amp;nbsp;이런일이&amp;nbsp;일어났나면&amp;nbsp;첫번째(marks1)는&amp;nbsp;정확하게&amp;nbsp;다&amp;nbsp;복사가&amp;nbsp;됐기&amp;nbsp;때문에&amp;nbsp;모두&amp;nbsp;다&amp;nbsp;다른&amp;nbsp;주소를&amp;nbsp;가지고있는&amp;nbsp;반면,&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;두번째(marks2)는&amp;nbsp;하나의&amp;nbsp;주소값이&amp;nbsp;4개가&amp;nbsp;복사가&amp;nbsp;됐기&amp;nbsp;때문에&amp;nbsp;수정이&amp;nbsp;이뤄난다.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;증명&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;([id(i)&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;for&lt;/span&gt;&amp;nbsp;i&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;marks1])&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;주소가&amp;nbsp;다&amp;nbsp;다른&amp;nbsp;반면&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;([id(i)&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;for&lt;/span&gt;&amp;nbsp;i&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;marks2])&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;주소가&amp;nbsp;동일..&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #4f4f4ftext-decoration:none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&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;a href=&quot;https://www.inflearn.com/course/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B8%89-%EC%9D%B8%ED%94%84%EB%9F%B0-%EC%98%A4%EB%A6%AC%EC%A7%80%EB%84%90/dashboard&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;기본적인 내용보다는 실질적으로 Why? 라는 의문이 가질 법한 내용 위주로 정리하였습니다.&lt;/p&gt;</description>
      <category>02. Study/Python</category>
      <category>Call by reference</category>
      <category>call by value</category>
      <category>Python Sequence</category>
      <category>Python 시퀀스</category>
      <category>파이썬 깊은복사</category>
      <category>파이썬 얕은복사</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/167</guid>
      <comments>https://boysboy3.tistory.com/167#entry167comment</comments>
      <pubDate>Tue, 22 Mar 2022 15:16:47 +0900</pubDate>
    </item>
    <item>
      <title>Magic method(special method)_04</title>
      <link>https://boysboy3.tistory.com/165</link>
      <description>&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://docs.python.org/3/reference/datamodel.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.python.org/3/reference/datamodel.html&lt;/a&gt;) 에는 special method라고 소개하고 있지만 상황에따라 매직메소드==스페셜메소드 동일하게 부르니 헷갈리지 말자.&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;u&gt;&lt;b&gt;매직 메소드(magic method)란?&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스안에 정의할 수 있는 특정한(built-in) 메소드다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 built-in은 무엇인가? 내장 함수라고해서 import 과정을 필요로 하지 않는 함수들을 말한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) abs(), chr(),divmod() etc...&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;우리가 일반적으로 변수를 선언하고 10을 더하는 코드를 작성한다고 가정하자.&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;n&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;10&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(n&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;10&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(type(n))&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;int형&amp;nbsp;이지만&amp;nbsp;class&amp;nbsp;형식으로&amp;nbsp;나온다&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 작성할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서보면 내부적으로 int형 class의 add형 메소드가 실행되었다고 나올 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 다음과 같이 변경해도 결과는 어떻게 나올까?&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(n.__add__(&lt;span style=&quot;color: #c10aff;&quot;&gt;100&lt;/span&gt;))&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;같은&amp;nbsp;결과가&amp;nbsp;나온다&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;print(n.__doc__)&amp;nbsp;#&amp;nbsp;클래스&amp;nbsp;맨&amp;nbsp;위&amp;nbsp;&quot;&quot;&quot;&quot;&quot;&quot;&amp;nbsp;형으로&amp;nbsp;감싸져있는&amp;nbsp;값이&amp;nbsp;나온다..&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(n.__bool__(),&amp;nbsp;bool(n))&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;True&amp;nbsp;내부적으로&amp;nbsp;__bool__이&amp;nbsp;실행된다&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(n&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;*&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;100&lt;/span&gt;,&amp;nbsp;n.__mul__(&lt;span style=&quot;color: #c10aff;&quot;&gt;100&lt;/span&gt;))&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 결과를 얻을 수 있을것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 built-in이기 때문에 우리가 쉽게 사용할 수 있는 것이다.&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;이제 클래스를 하나 만들고 안에서 매직 메소드를 재정의하여 사용해보자.&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0px; padding: 0px; border: none; background-color: #272727; border-radius: 4px; height: 565px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 565px;&quot;&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f; height: 565px; width: 16.5px;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;7&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;8&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;9&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;10&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;11&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;12&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;13&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;14&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;15&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;16&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;17&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;18&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;19&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;20&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;21&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;22&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;23&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;24&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;25&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;26&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;27&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;28&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;29&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0px; text-align: left; height: 565px; width: 841.388px;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;class&lt;/span&gt;&amp;nbsp;Fruit(object):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;__init__(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;,&amp;nbsp;name,&amp;nbsp;price):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._name&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;name&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._price&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;price&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;__str__(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'Fruit&amp;nbsp;Class&amp;nbsp;Info&amp;nbsp;:&amp;nbsp;{}&amp;nbsp;,&amp;nbsp;{}'&lt;/span&gt;.&lt;span style=&quot;color: #4be6fa;&quot;&gt;format&lt;/span&gt;(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._name,&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._price)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;__add__(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;,&amp;nbsp;x):&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;내부적으로&amp;nbsp;class&amp;nbsp;INT(object):&amp;nbsp;이런&amp;nbsp;느낌으로&amp;nbsp;클래스가&amp;nbsp;존재해서&amp;nbsp;만들어준다&amp;nbsp;?&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#print('called&amp;nbsp;__add__')&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._price&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;+&lt;/span&gt;&amp;nbsp;x._price&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;__sub__(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;,&amp;nbsp;x):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#print('called&amp;nbsp;__sub__')&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._price&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;-&lt;/span&gt;&amp;nbsp;x._price&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;__le__(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;,&amp;nbsp;x):&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;대소&amp;nbsp;비교&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(&lt;span style=&quot;color: #ffd500;&quot;&gt;'called&amp;nbsp;__le__'&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._price&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;x._price:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;True&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;else&lt;/span&gt;:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;False&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;__ge__(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;,&amp;nbsp;x):&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;대소&amp;nbsp;비교&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(&lt;span style=&quot;color: #ffd500;&quot;&gt;'called&amp;nbsp;__ge__'&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._price&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;x._price:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;True&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;else&lt;/span&gt;:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;False&lt;br /&gt;&lt;br /&gt;# 인스턴스 생성&lt;br /&gt;s1 = Fruit('Orange', 7500)&lt;br /&gt;s2 = Fruit('Banana', 3000)&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #4f4f4ftext-decoration:none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0px 2px 4px 0px; height: 565px; width: 13px;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 과일의 이름과 가격을 담을 클래스를 만들고 Orange, Banana 두 가지 인스턴스를 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;덧셈(__add__), 뺄셈(__sub__), 대소(__le__, __ge__) 비교 함수를 재 정의한다.&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;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(s1._price&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;+&lt;/span&gt;&amp;nbsp;s2._price)&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;# 이렇게 접근하면 좋지않고, 코드양도 엄청 늘어나고 가독성도 떨어진다.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&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;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(s1&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;+&lt;/span&gt;&amp;nbsp;s2)&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;이렇게&amp;nbsp;계산하면&amp;nbsp;__add__&amp;nbsp;메소드만&amp;nbsp;바꾸면&amp;nbsp;모든지&amp;nbsp;다&amp;nbsp;바꿔서&amp;nbsp;효율을&amp;nbsp;엄청&amp;nbsp;올릴&amp;nbsp;수&amp;nbsp;있다.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(s1&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;-&lt;/span&gt;&amp;nbsp;s2)&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;이렇게&amp;nbsp;계산하면&amp;nbsp;__sub__에서&amp;nbsp;x&amp;nbsp;인자값에&amp;nbsp;s2가&amp;nbsp;바로&amp;nbsp;넘어간다.&amp;nbsp;또한,&amp;nbsp;인자값을&amp;nbsp;무궁무진하게&amp;nbsp;넣을&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;(self,&amp;nbsp;x,&amp;nbsp;y.....)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(s1&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;s2)&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;이렇게&amp;nbsp;계산하면&amp;nbsp;__ge__&amp;nbsp;호출되고&amp;nbsp;x&amp;nbsp;인자값에&amp;nbsp;s2가&amp;nbsp;바로&amp;nbsp;넘어간다.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(s1&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;s2)&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;이렇게&amp;nbsp;계산하면&amp;nbsp;__le__&amp;nbsp;호출되고&amp;nbsp;x&amp;nbsp;인자값에&amp;nbsp;s2가&amp;nbsp;바로&amp;nbsp;넘어간다.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #4f4f4ftext-decoration:none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&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;위와같은 과정을 데이터 모델(data model)이라고 부르고&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;&lt;a href=&quot;https://docs.python.org/3/reference/datamodel.html&quot;&gt;https://docs.python.org/3/reference/datamodel.html&lt;/a&gt;&lt;/span&gt; 공식 도큐먼트에서 확인가능하다.&lt;/div&gt;
&lt;/div&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;a href=&quot;https://www.inflearn.com/course/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B8%89-%EC%9D%B8%ED%94%84%EB%9F%B0-%EC%98%A4%EB%A6%AC%EC%A7%80%EB%84%90/dashboard&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;기본적인 내용보다는 실질적으로 Why? 라는 의문이 가질 법한 내용 위주로 정리하였습니다.&lt;/p&gt;</description>
      <category>02. Study/Python</category>
      <category>python magic method</category>
      <category>python special method</category>
      <category>python __init__</category>
      <category>파이썬 매직메소드</category>
      <category>파이썬 연산자</category>
      <category>파이썬 연산자 오버로딩</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/165</guid>
      <comments>https://boysboy3.tistory.com/165#entry165comment</comments>
      <pubDate>Tue, 22 Mar 2022 09:04:29 +0900</pubDate>
    </item>
    <item>
      <title>(class, instance, static) method_03</title>
      <link>https://boysboy3.tistory.com/164</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번시간에는 class, instance, static 메소드에 대해 알아보자.&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;7&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;8&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;9&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;10&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;11&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;12&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;13&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;14&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;15&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;16&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;17&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;18&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;19&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;20&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;21&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;22&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;23&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;24&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;25&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;26&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;27&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;28&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;29&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;30&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;31&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;32&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;33&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;34&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;35&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;36&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;37&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;38&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;39&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;40&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;41&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;42&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;43&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;44&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;45&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;46&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;47&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;48&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;49&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;50&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;51&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;52&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;53&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;54&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;55&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;56&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;57&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;58&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;59&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;class&lt;/span&gt;&amp;nbsp;Car(object):&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;모든&amp;nbsp;클래스는&amp;nbsp;object를&amp;nbsp;상속받는다.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffd500;&quot;&gt;&quot;&amp;nbsp;#&amp;nbsp;파이써닉&amp;nbsp;규칙&amp;nbsp;(description)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ffd500;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Car&amp;nbsp;class&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ffd500;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Author:&amp;nbsp;Mekai&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ffd500;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Data:&amp;nbsp;2021.03.21&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ffd500;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Description&amp;nbsp;:&amp;nbsp;Class,&amp;nbsp;Static,&amp;nbsp;Instance&amp;nbsp;Method&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ffd500;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffd500;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;클래스&amp;nbsp;변수(모든&amp;nbsp;인스턴스가&amp;nbsp;공유)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;price_per_raise&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;1.&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;__init__(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;,&amp;nbsp;company,&amp;nbsp;details):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._company&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;company&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._details&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;details&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;__str__(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'str&amp;nbsp;:&amp;nbsp;{}&amp;nbsp;-&amp;nbsp;{}'&lt;/span&gt;.&lt;span style=&quot;color: #4be6fa;&quot;&gt;format&lt;/span&gt;(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._company,&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._details)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;__repr__(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'repr:&amp;nbsp;{}&amp;nbsp;-&amp;nbsp;{}'&lt;/span&gt;.&lt;span style=&quot;color: #4be6fa;&quot;&gt;format&lt;/span&gt;(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._company,&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._details)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;Instance&amp;nbsp;Method&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;self&amp;nbsp;:&amp;nbsp;객체의&amp;nbsp;고유한&amp;nbsp;속성&amp;nbsp;값을&amp;nbsp;사용&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;detail_info(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;):&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;self&amp;nbsp;매개변수로&amp;nbsp;받는것을&amp;nbsp;인스턴스&amp;nbsp;메소드(instance&amp;nbsp;method)라고&amp;nbsp;한다&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(&lt;span style=&quot;color: #ffd500;&quot;&gt;'Current&amp;nbsp;ID&amp;nbsp;:&amp;nbsp;{}'&lt;/span&gt;.&lt;span style=&quot;color: #4be6fa;&quot;&gt;format&lt;/span&gt;(id(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;)))&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(&lt;span style=&quot;color: #ffd500;&quot;&gt;'Car&amp;nbsp;Detail&amp;nbsp;Info&amp;nbsp;:&amp;nbsp;{}&amp;nbsp;{}'&lt;/span&gt;.&lt;span style=&quot;color: #4be6fa;&quot;&gt;format&lt;/span&gt;(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._company,&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._details.get(&lt;span style=&quot;color: #ffd500;&quot;&gt;'price'&lt;/span&gt;)))&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;Instance&amp;nbsp;Method&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;get_price(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'Before&amp;nbsp;Car&amp;nbsp;Price&amp;nbsp;-&amp;gt;&amp;nbsp;company&amp;nbsp;:&amp;nbsp;{},&amp;nbsp;price&amp;nbsp;:&amp;nbsp;{}'&lt;/span&gt;.&lt;span style=&quot;color: #4be6fa;&quot;&gt;format&lt;/span&gt;(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._company,&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._details.get(&lt;span style=&quot;color: #ffd500;&quot;&gt;'price'&lt;/span&gt;))&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;Instance&amp;nbsp;Method&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;get_price_culc(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'After&amp;nbsp;Car&amp;nbsp;Price&amp;nbsp;-&amp;gt;&amp;nbsp;company&amp;nbsp;:&amp;nbsp;{},&amp;nbsp;price&amp;nbsp;:&amp;nbsp;{}'&lt;/span&gt;.&lt;span style=&quot;color: #4be6fa;&quot;&gt;format&lt;/span&gt;(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._company,&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._details.get(&lt;span style=&quot;color: #ffd500;&quot;&gt;'price'&lt;/span&gt;)&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;*&lt;/span&gt;&amp;nbsp;Car.price_per_raise)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;class&amp;nbsp;Method&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;instance&amp;nbsp;method는&amp;nbsp;self를&amp;nbsp;인자값으로&amp;nbsp;받고,&amp;nbsp;classmethod&amp;nbsp;는&amp;nbsp;cls는&amp;nbsp;인자로&amp;nbsp;받는다&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@classmethod&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;명시적으로&amp;nbsp;쓰기&amp;nbsp;위해&amp;nbsp;데코레이터가&amp;nbsp;달려있다!&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;raise_price(cls,&amp;nbsp;per):&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;cls는&amp;nbsp;객체&amp;nbsp;Car다..&amp;nbsp;명시적으로&amp;nbsp;쓰는것!&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;if&lt;/span&gt;&amp;nbsp;per&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(&lt;span style=&quot;color: #ffd500;&quot;&gt;'Plaease&amp;nbsp;Enter&amp;nbsp;1&amp;nbsp;or&amp;nbsp;More'&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;else&lt;/span&gt;:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cls.price_per_raise&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;per&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(&lt;span style=&quot;color: #ffd500;&quot;&gt;'Succeed!'&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;static&amp;nbsp;method는&amp;nbsp;아무것도&amp;nbsp;전달받지&amp;nbsp;않는다/&amp;nbsp;instance&amp;nbsp;method는&amp;nbsp;self&amp;nbsp;/&amp;nbsp;classmethod는&amp;nbsp;cls&amp;nbsp;객체를&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;static&amp;nbsp;method&amp;nbsp;없어도&amp;nbsp;cls로&amp;nbsp;다&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있다는&amp;nbsp;의견들이&amp;nbsp;많다..&amp;nbsp;인터넷&amp;nbsp;찾아보면&amp;nbsp;~_~&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;아무것도&amp;nbsp;받지&amp;nbsp;않기&amp;nbsp;때문에&amp;nbsp;유연하긴하다..&amp;nbsp;공통적으로&amp;nbsp;만들때&amp;nbsp;쓰는것&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@staticmethod&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;is_bmw(inst):&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;bmw&amp;nbsp;차가&amp;nbsp;맞는지&amp;nbsp;판단하는..&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;if&lt;/span&gt;&amp;nbsp;inst._company&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ffd500;&quot;&gt;'Bmw'&lt;/span&gt;:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'OK!&amp;nbsp;This&amp;nbsp;car&amp;nbsp;is&amp;nbsp;{}'&lt;/span&gt;.&lt;span style=&quot;color: #4be6fa;&quot;&gt;format&lt;/span&gt;(inst._company)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;else&lt;/span&gt;:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'Sorry.&amp;nbsp;This&amp;nbsp;car&amp;nbsp;is&amp;nbsp;not&amp;nbsp;Bmw.'&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;car1&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Car(&lt;span style=&quot;color: #ffd500;&quot;&gt;'Ferrari'&lt;/span&gt;,&amp;nbsp;{&lt;span style=&quot;color: #ffd500;&quot;&gt;'color'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'White'&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'horsepower'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;400&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'price'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;8000&lt;/span&gt;})&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;car2&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Car(&lt;span style=&quot;color: #ffd500;&quot;&gt;'Bmw'&lt;/span&gt;,&amp;nbsp;{&lt;span style=&quot;color: #ffd500;&quot;&gt;'color'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'Black'&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'horsepower'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;270&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'price'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;5000&lt;/span&gt;})&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #4f4f4ftext-decoration:none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동차 2개 객체를 추가하여 위 클래스 기반으로 알아보도록 하자.&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;@classmethod&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 메소드는 cls를 인자값 받으며 명시적으로 쓰기 위해 @ (데코레이터)가 달려있다.&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;def detail_info(self):&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스 메소드는 객체의 고유한 값을 가지고 self로 메소드를 만들고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체의 인스턴스 필드를 self를 통해 접근가능하다.&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;@staticmethod&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스태틱 메소드는 아무것도 전달 받지 않기 때문에 유연하게 메소드를 만들 수 있고 공통적으로 무언가 만들때 자주 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 cls로 다 할 수 있다는 의견들이 많은데 인터넷 검색해보면 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;7&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;8&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;9&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;10&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;11&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;12&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;13&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;14&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;15&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;16&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;17&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;18&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;19&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;20&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;21&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;22&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;23&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;24&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;25&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;26&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;27&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;28&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;29&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;30&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;31&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;32&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;33&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;34&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;35&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;전체정보&amp;nbsp;출력&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;car1.detail_info()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;car2.detail_info()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;가격정보&amp;nbsp;(직접&amp;nbsp;접근)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(car1._details.get(&lt;span style=&quot;color: #ffd500;&quot;&gt;'price'&lt;/span&gt;))&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&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;막아놓는다.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(car2._details[&lt;span style=&quot;color: #ffd500;&quot;&gt;'price'&lt;/span&gt;])&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&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;막아놓는다.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;가격정보(인상&amp;nbsp;전-&amp;gt;인스턴스&amp;nbsp;메소드&amp;nbsp;접근)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(car1.get_price())&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(car2.get_price())&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;가격&amp;nbsp;인상&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;Car.price_per_raise&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;1.&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;4&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;사실&amp;nbsp;이렇게&amp;nbsp;직접&amp;nbsp;접근하는&amp;nbsp;방식은&amp;nbsp;좋지&amp;nbsp;않다.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;가격정보(인상&amp;nbsp;후-&amp;gt;인스턴스&amp;nbsp;메소드&amp;nbsp;접근)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(car1.get_price_culc())&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(car2.get_price_culc())&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;가격&amp;nbsp;인상(클래스&amp;nbsp;메소드&amp;nbsp;사용)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;Car.raise_price(&lt;span style=&quot;color: #c10aff;&quot;&gt;1.&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;6&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(car1.get_price_culc())&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(car2.get_price_culc())&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;Staticmethod&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;아래처럼&amp;nbsp;호출할&amp;nbsp;수&amp;nbsp;있지만&amp;nbsp;엄청나게&amp;nbsp;유연하다!&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(car1.is_bmw(car1))&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;인스턴스로&amp;nbsp;호출&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(car2.is_bmw(car2))&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;이렇게&amp;nbsp;유연하게&amp;nbsp;호출도&amp;nbsp;가능.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(Car.is_bmw(car1))&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;클래스로&amp;nbsp;호출&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(Car.is_bmw(car2))&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #4f4f4ftext-decoration:none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&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;i&gt;&lt;u&gt;&lt;b&gt;간단정리하면 static method는 아무것도 전달받지 않고, instance method는 self, classmethod는 cls 객체를 전달 받는다.&lt;/b&gt;&lt;/u&gt;&lt;/i&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;a href=&quot;https://www.inflearn.com/course/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B8%89-%EC%9D%B8%ED%94%84%EB%9F%B0-%EC%98%A4%EB%A6%AC%EC%A7%80%EB%84%90/dashboard&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;기본적인 내용보다는 실질적으로 Why? 라는 의문이 가질 법한 내용 위주로 정리하였습니다.&lt;/p&gt;</description>
      <category>02. Study/Python</category>
      <category>python class method</category>
      <category>python instance method</category>
      <category>python static method</category>
      <category>파이썬 인스턴스 메소드</category>
      <category>파이썬 정적 메소드</category>
      <category>파이썬 클래스 메소드</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/164</guid>
      <comments>https://boysboy3.tistory.com/164#entry164comment</comments>
      <pubDate>Mon, 21 Mar 2022 14:48:03 +0900</pubDate>
    </item>
    <item>
      <title>클래스 변수 &amp;amp; 인스턴스 변수([Class,Instance] variable)_02</title>
      <link>https://boysboy3.tistory.com/163</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;저번 포스팅에서 Why? 클래스를 사용할 지에 대한 이야기를 간략하게 해봤다.&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;일반적으로 우리가 클래스를 만들게 된다면 object를 상속받게 되어있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;class Car(object):&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; #to do..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 object를 생략하고 만들어도 기본적으로 모든 클래스는 object를 상속받게 되어있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;class Car():&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; # to do..&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;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;7&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;8&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;9&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;10&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;11&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;12&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;13&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;14&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;15&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;16&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;17&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;18&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;19&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;20&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;21&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;22&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;23&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;24&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;25&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;26&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;27&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;28&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;29&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;30&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;31&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;32&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;33&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;34&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;class&lt;/span&gt;&amp;nbsp;Car(object):&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;모든&amp;nbsp;클래스는&amp;nbsp;object를&amp;nbsp;상속받는다.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffd500;&quot;&gt;&quot;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ffd500;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;파이써닉&amp;nbsp;규칙&amp;nbsp;-&amp;gt;&amp;nbsp;클래스&amp;nbsp;내용을&amp;nbsp;적으세요&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ffd500;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Car&amp;nbsp;class&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ffd500;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Author:&amp;nbsp;Mekai&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ffd500;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Data:&amp;nbsp;2021.03.21&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ffd500;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffd500;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;클래스&amp;nbsp;변수(모든&amp;nbsp;인스턴스가&amp;nbsp;공유)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;car_count&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;__init__(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;,&amp;nbsp;company,&amp;nbsp;details):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._company&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;company&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._details&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;details&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;.car_count&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;10&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Car.car_count&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;__str__(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'str&amp;nbsp;:&amp;nbsp;{}&amp;nbsp;-&amp;nbsp;{}'&lt;/span&gt;.&lt;span style=&quot;color: #4be6fa;&quot;&gt;format&lt;/span&gt;(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._company,&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._details)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;__repr__(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'repr:&amp;nbsp;{}&amp;nbsp;-&amp;nbsp;{}'&lt;/span&gt;.&lt;span style=&quot;color: #4be6fa;&quot;&gt;format&lt;/span&gt;(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._company,&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._details)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;detail_info(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(&lt;span style=&quot;color: #ffd500;&quot;&gt;'Current&amp;nbsp;ID&amp;nbsp;:&amp;nbsp;{}'&lt;/span&gt;.&lt;span style=&quot;color: #4be6fa;&quot;&gt;format&lt;/span&gt;(id(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;)))&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(&lt;span style=&quot;color: #ffd500;&quot;&gt;'Car&amp;nbsp;Detail&amp;nbsp;Info&amp;nbsp;:&amp;nbsp;{}&amp;nbsp;{}'&lt;/span&gt;.&lt;span style=&quot;color: #4be6fa;&quot;&gt;format&lt;/span&gt;(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._company,&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._details.get(&lt;span style=&quot;color: #ffd500;&quot;&gt;'price'&lt;/span&gt;)))&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;__del__(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(&lt;span style=&quot;color: #ffd500;&quot;&gt;'호출?'&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Car.car_count&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;car1&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Car(&lt;span style=&quot;color: #ffd500;&quot;&gt;'Ferrari'&lt;/span&gt;,&amp;nbsp;{&lt;span style=&quot;color: #ffd500;&quot;&gt;'color'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'White'&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'horsepower'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;400&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'price'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;8000&lt;/span&gt;})&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;car2&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Car(&lt;span style=&quot;color: #ffd500;&quot;&gt;'Bmw'&lt;/span&gt;,&amp;nbsp;{&lt;span style=&quot;color: #ffd500;&quot;&gt;'color'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'Black'&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'horsepower'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;270&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'price'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;5000&lt;/span&gt;})&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;car3&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Car(&lt;span style=&quot;color: #ffd500;&quot;&gt;'Audi'&lt;/span&gt;,&amp;nbsp;{&lt;span style=&quot;color: #ffd500;&quot;&gt;'color'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'Silver'&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'horsepower'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;300&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'price'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;6000&lt;/span&gt;})&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 클래스를 만들고 3개의 객체(car1, car2, car3)를 만들어보자.&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;Car() 클래스를 보면 다음과 같은 의문이 들 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;- self 는 무엇을 의미하지 ?&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;- why 클래스 안에 변수에 self를 붙이는 변수가 있고 아닌 변수들이 있는데 무엇을 의미할까?&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간략하게 self의 의미는 인스턴스(instance) 메소드라는 의미인데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #272727; color: #f0f0f0;&quot;&gt;car1&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;background-color: #272727; color: #f0f0f0;&quot;&gt;&amp;nbsp;Car(&lt;/span&gt;&lt;span style=&quot;color: #ffd500;&quot;&gt;'Ferrari'&lt;/span&gt;&lt;span style=&quot;background-color: #272727; color: #f0f0f0;&quot;&gt;,&amp;nbsp;{&lt;/span&gt;&lt;span style=&quot;color: #ffd500;&quot;&gt;'color'&lt;/span&gt;&lt;span style=&quot;background-color: #272727; color: #f0f0f0;&quot;&gt;:&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ffd500;&quot;&gt;'White'&lt;/span&gt;&lt;span style=&quot;background-color: #272727; color: #f0f0f0;&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ffd500;&quot;&gt;'horsepower'&lt;/span&gt;&lt;span style=&quot;background-color: #272727; color: #f0f0f0;&quot;&gt;:&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;400&lt;/span&gt;&lt;span style=&quot;background-color: #272727; color: #f0f0f0;&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ffd500;&quot;&gt;'price'&lt;/span&gt;&lt;span style=&quot;background-color: #272727; color: #f0f0f0;&quot;&gt;:&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;8000&lt;/span&gt;&lt;span style=&quot;background-color: #272727; color: #f0f0f0;&quot;&gt;})&amp;nbsp;&amp;nbsp;&lt;/span&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;s&gt;&lt;i&gt;무슨말이냐 ?&lt;/i&gt;&lt;/s&gt;&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(id(car1))&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(id(car2))&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(id(car3))&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 할당 후 각 고유의 주소(id 메소드 활용)를 확인하면 각 각 다른 주소를 가지고 있는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;self는 각 고유의 값들을 가지고 있기에 인스턴스 고유값을 저장하기 위한 예약어이다(즉, 인스턴스 변수가 될 수 있다).&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;7&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;8&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;9&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;10&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(car1._company&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;car2._company)&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;False&amp;nbsp;(값을&amp;nbsp;비교)&amp;nbsp;-&amp;gt;&amp;nbsp;만약&amp;nbsp;둘&amp;nbsp;다&amp;nbsp;Bmw면&amp;nbsp;True다&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(car1&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;is&lt;/span&gt;&amp;nbsp;car2)&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;False&amp;nbsp;-&amp;gt;&amp;nbsp;아이디가&amp;nbsp;다르기때문&amp;nbsp;(인스턴스&amp;nbsp;자체&amp;nbsp;비교)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;dir&amp;nbsp;&amp;amp;&amp;nbsp;__dict__&amp;nbsp;확인&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(dir(car1))&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;모든&amp;nbsp;클래스는&amp;nbsp;object를&amp;nbsp;상속받는데&amp;nbsp;object를&amp;nbsp;타고올라가면&amp;nbsp;메소드를&amp;nbsp;구성되어있는걸&amp;nbsp;모두&amp;nbsp;다&amp;nbsp;보여준다&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(dir(car2))&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;보면&amp;nbsp;_company,&amp;nbsp;_details도&amp;nbsp;보여서&amp;nbsp;list&amp;nbsp;형태로&amp;nbsp;다&amp;nbsp;보여준다&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;그래서&amp;nbsp;나는&amp;nbsp;부모꺼말고&amp;nbsp;내꺼만&amp;nbsp;보고싶어&amp;nbsp;내&amp;nbsp;namespace만&amp;nbsp;보고싶다&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(car1.__dict__)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(car2.__dict__)&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #4f4f4ftext-decoration:none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&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;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&quot;&quot; # 파이써닉 규칙&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&amp;nbsp; &amp;nbsp; Car class&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&amp;nbsp; &amp;nbsp; Author: Taehyung&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&amp;nbsp; &amp;nbsp; Data: 2021.03.14&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;&quot;&quot;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 클래스 설명을 써서 만들었는데 정보를 볼 수 있다.(docstring)&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(Car.__doc__)&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;# 그 위에 클래스 작성에 달아놓은 &quot;&quot;&quot;&quot;&quot;&quot;&amp;nbsp;&amp;nbsp;작성 내용이 출력되고 아주 유용하게 사용된다.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면에 self가 붙어 있지 않다면 인스턴스가 아니라 클래스 변수가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어 동일한 클래스(Car)로 인스턴스를 만들었다면 이 인스턴스끼리 클래스 변수는 &lt;i&gt;&lt;u&gt;&lt;b&gt;모든 인스턴스가 공유&lt;/b&gt;&lt;/u&gt;&lt;/i&gt;가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Car.car_count += 1 를 넣어준다면 저 실행 값은 car_count가 3번 호출되었기에 값이 3이 된다.&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;7&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;8&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;공유&amp;nbsp;확인&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(Car.car_count)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(car1.car_count)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(car2.car_count)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(car1.__dict__)&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;클래스&amp;nbsp;내부에&amp;nbsp;정의된&amp;nbsp;인스턴스만&amp;nbsp;값만나온다&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(car2.__dict__)&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(dir(car1))&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;모든&amp;nbsp;정의된&amp;nbsp;값이&amp;nbsp;나온다&amp;nbsp;-&amp;gt;&amp;nbsp;클래스&amp;nbsp;변수로&amp;nbsp;car_count&amp;nbsp;값이&amp;nbsp;나온다&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#&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;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;7&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;8&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;9&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;10&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;접근&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;아래처럼&amp;nbsp;둘&amp;nbsp;다&amp;nbsp;접근이&amp;nbsp;가능하다..&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(car1.car_count)&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;3&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(Car.car_count)&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;3&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;del&lt;/span&gt;&amp;nbsp;car2&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;소멸자&amp;nbsp;호출&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;삭제&amp;nbsp;확인&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(car1.car_count)&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;2&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(Car.car_count)&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;2&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&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;span style=&quot;color: #606c71;&quot;&gt;네임스페이스(namespace)란 프로그래밍 언어에서 특정한 객체(Object)를 이름(Name)에 따라 구분할 수 있는 의미를 가지고 있으며, 우리가 코딩하는 모든 파이썬은 객체로 구성되며 이들 각각은 특정 이름과 매핑 관계를 갖게 되는데 이를 네임스페이스라고 표현한다.&lt;/span&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;p data-ke-size=&quot;size16&quot;&gt;즉, 동일한 이름으로 변수 생성 가능 (인스턴스 검색 후 -&amp;gt; 상위(클래스 변수, 부모클래스 변수))&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# 인스턴스 변수는 인스턴스 변수로, 클래스 변수는 캘래스 변수로 접근해야 한다.&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(car1.car_count)&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;10&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(Car.car_count)&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;2&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아주 간략하게 정리하자면 self에 따라 인스턴스 변수가 될 수 있고, self가 없다면 클래스 변수가 될 수 있는데 클래스 변수는 상위 객체(object)에서 관리한다.&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;a href=&quot;https://www.inflearn.com/course/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B8%89-%EC%9D%B8%ED%94%84%EB%9F%B0-%EC%98%A4%EB%A6%AC%EC%A7%80%EB%84%90/dashboard&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;기본적인 내용보다는 실질적으로 Why? 라는 의문이 가질 법한 내용 위주로 정리하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>02. Study/Python</category>
      <category>python class variable</category>
      <category>python instance variable</category>
      <category>python self</category>
      <category>파이썬 self의 의미</category>
      <category>파이썬 인스턴스 변수</category>
      <category>파이썬 클래스 변수</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/163</guid>
      <comments>https://boysboy3.tistory.com/163#entry163comment</comments>
      <pubDate>Mon, 21 Mar 2022 14:08:46 +0900</pubDate>
    </item>
    <item>
      <title>클래스&amp;amp;메소드(class&amp;amp;method)_01</title>
      <link>https://boysboy3.tistory.com/162</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;초심자는 왜(Why) 클래스를 사용할까라는 의문이 들 수 있다. (물론 나도... 항상 초심)&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;필요한 내용은 자동차 (&lt;u&gt;&lt;b&gt;종류, 차량색상, 가격, 마력&lt;/b&gt;&lt;/u&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;파이썬 코드로 작성하면 다음과 같이 &lt;b&gt;list, dict, str&lt;/b&gt;를 이용하여 코드를 만든다.&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;7&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;8&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;9&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;10&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;11&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;12&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;13&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;14&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;15&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;16&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;17&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;18&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;19&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;20&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;car_company_1&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'Ferrari'&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;car_detail_1&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;[&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;span style=&quot;color: #ffd500;&quot;&gt;'color'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'White'&lt;/span&gt;},&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;span style=&quot;color: #ffd500;&quot;&gt;'horsepower'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;400&lt;/span&gt;},&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;span style=&quot;color: #ffd500;&quot;&gt;'price:&amp;nbsp;8000'&lt;/span&gt;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;]&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;car_company_2&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'Bmw'&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;car_detail_2&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;[&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;span style=&quot;color: #ffd500;&quot;&gt;'color'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'Black'&lt;/span&gt;},&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;span style=&quot;color: #ffd500;&quot;&gt;'horsepower'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;270&lt;/span&gt;},&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;span style=&quot;color: #ffd500;&quot;&gt;'price'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;5000&lt;/span&gt;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;]&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;car_company_3&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'Audi'&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;car_detail_3&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;[&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;span style=&quot;color: #ffd500;&quot;&gt;'color'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'Silver'&lt;/span&gt;},&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;span style=&quot;color: #ffd500;&quot;&gt;'horsepower'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;300&lt;/span&gt;},&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;span style=&quot;color: #ffd500;&quot;&gt;'price'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;6000&lt;/span&gt;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;]&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 위 처럼 코드를 작성하여 리스트 구조로 관리하게 되면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금은 3개의 종류만 저장하지만 수억개 이상이 된다면 관리가 불편하고 index로 접근 시 실수 가능성 및 삭제가 불편할 수 있다.&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;# 삭제 불편 및 관리 힘듦의 예시&lt;br /&gt;del&lt;/span&gt;&amp;nbsp;car_company_list[&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;]&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;2번째&amp;nbsp;인덱스&amp;nbsp;삭제&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;del&lt;/span&gt;&amp;nbsp;car_detail_list[&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;]&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(car_company_list)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(car_detail_list)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&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;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;7&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;8&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;9&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;car_dicts&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;[&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;span style=&quot;color: #ffd500;&quot;&gt;'car_company'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'Ferrai'&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'car_detail'&lt;/span&gt;:&amp;nbsp;{&lt;span style=&quot;color: #ffd500;&quot;&gt;'color'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'White'&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'horsepower'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;400&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'price'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;8000&lt;/span&gt;}},&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;span style=&quot;color: #ffd500;&quot;&gt;'car_company'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'Bmw'&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'car_detail'&lt;/span&gt;:&amp;nbsp;{&lt;span style=&quot;color: #ffd500;&quot;&gt;'color'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'Black'&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'horsepower'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;270&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'price'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;5000&lt;/span&gt;}},&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;span style=&quot;color: #ffd500;&quot;&gt;'car_company'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'Audi'&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'car_detail'&lt;/span&gt;:&amp;nbsp;{&lt;span style=&quot;color: #ffd500;&quot;&gt;'color'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'Silver'&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'horsepower'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;300&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'price'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;6000&lt;/span&gt;}}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;]&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(car_dicts)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;역시&amp;nbsp;지울땐,&amp;nbsp;del&amp;nbsp;메소드를&amp;nbsp;이용해서&amp;nbsp;..&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;del&lt;/span&gt;&amp;nbsp;car_dicts[&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;]&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(car_dicts)&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #4f4f4ftext-decoration:none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 딕셔너리 구조도 마찬가지로, 위와같이 작성하게 된다면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;코드 반복 지속, 중첩(키) 문제,&amp;nbsp; 키 조회 예외 처리 등등&lt;/u&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만들기 전 클래스 구조로 코드를 작성한다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;구조 설계 재사용성 증가, 코드 반복 최소화, 다양한 데코레이터를 이용한 메소드 활용에 이점&lt;/u&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;s&gt;&lt;i&gt;python class는 명사명으로 만드는 습관을 갖자.&lt;/i&gt;&lt;/s&gt;&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;7&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;8&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;9&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;10&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;11&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;12&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;13&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;class&lt;/span&gt;&amp;nbsp;Car():&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;__init__(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;,&amp;nbsp;company,&amp;nbsp;details):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._company&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;company&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._details&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;details&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;매직메소드&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;__str__(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'str&amp;nbsp;:&amp;nbsp;{}&amp;nbsp;-&amp;nbsp;{}'&lt;/span&gt;.&lt;span style=&quot;color: #4be6fa;&quot;&gt;format&lt;/span&gt;(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._company,&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._details)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;str메소드랑&amp;nbsp;비슷한데,&amp;nbsp;차이점은&amp;nbsp;쉽게말하면&amp;nbsp;representation인데&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;비공식적인&amp;nbsp;사용자&amp;nbsp;입장에서&amp;nbsp;사용시에&amp;nbsp;str&amp;nbsp;메소드를&amp;nbsp;사용하고&amp;nbsp;/&amp;nbsp;객체&amp;nbsp;자료형&amp;nbsp;엄격한&amp;nbsp;타입에&amp;nbsp;따라&amp;nbsp;객체를&amp;nbsp;그대로&amp;nbsp;표시해줄때&amp;nbsp;repr&amp;nbsp;메소드를&amp;nbsp;사용한다&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;__repr__(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'repr&amp;nbsp;:&amp;nbsp;{}&amp;nbsp;-&amp;nbsp;{}'&lt;/span&gt;.&lt;span style=&quot;color: #4be6fa;&quot;&gt;format&lt;/span&gt;(&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._company,&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;self&lt;/span&gt;._details)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&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;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;7&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;8&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;9&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;10&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;11&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;12&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;13&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;14&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;15&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;16&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;17&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;car1&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Car(&lt;span style=&quot;color: #ffd500;&quot;&gt;'Ferrari'&lt;/span&gt;,&amp;nbsp;{&lt;span style=&quot;color: #ffd500;&quot;&gt;'color'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'White'&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'horsepower'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;400&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'price'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;8000&lt;/span&gt;})&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;car2&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Car(&lt;span style=&quot;color: #ffd500;&quot;&gt;'Bmw'&lt;/span&gt;,&amp;nbsp;{&lt;span style=&quot;color: #ffd500;&quot;&gt;'color'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'Black'&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'horsepower'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;270&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'price'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;5000&lt;/span&gt;})&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;car3&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Car(&lt;span style=&quot;color: #ffd500;&quot;&gt;'Audi'&lt;/span&gt;,&amp;nbsp;{&lt;span style=&quot;color: #ffd500;&quot;&gt;'color'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'Silver'&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'horsepower'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;300&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'price'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;6000&lt;/span&gt;})&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(car1)&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;str&amp;nbsp;메소드&amp;nbsp;구현시&amp;nbsp;자동&amp;nbsp;호출된다.&amp;nbsp;/&amp;nbsp;기본적으로&amp;nbsp;str,&amp;nbsp;repr&amp;nbsp;둘&amp;nbsp;다&amp;nbsp;구현되어&amp;nbsp;있을시&amp;nbsp;str이&amp;nbsp;호출된다.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(&lt;span style=&quot;color: #ffd500;&quot;&gt;'__dict__'&lt;/span&gt;,car1.__dict__)&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;dict로&amp;nbsp;접근하게되면&amp;nbsp;이&amp;nbsp;안에&amp;nbsp;속성(init의&amp;nbsp;attribute&amp;nbsp;값들을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있다)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(dir(car1))&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;dir&amp;nbsp;메소드를&amp;nbsp;사용하면&amp;nbsp;객체안에&amp;nbsp;있는&amp;nbsp;모든&amp;nbsp;메타정보를&amp;nbsp;보여준다&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;리스트&amp;nbsp;선언&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;car_list&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;[]&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;car_list.append(car1)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;car_list.append(car2)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;car_list.append(car3)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(car_list)&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;list안에서&amp;nbsp;객체정보를&amp;nbsp;보여줄때는&amp;nbsp;str&amp;nbsp;메소드가&amp;nbsp;아니라&amp;nbsp;repr&amp;nbsp;메소드가&amp;nbsp;먼저&amp;nbsp;보여준다&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;for&lt;/span&gt;&amp;nbsp;x&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;car_list:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(x)&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;프린트문을&amp;nbsp;사용할때는&amp;nbsp;또,&amp;nbsp;str이&amp;nbsp;출력되는&amp;nbsp;걸&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있다..?&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(repr(x))&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;명시적으로&amp;nbsp;보여줄&amp;nbsp;수&amp;nbsp;있기도&amp;nbsp;한다.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #4f4f4ftext-decoration:none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 위와 객체 지향 프로그래밍 (OOP) 형식으로 작성하게되면 &lt;b&gt;&lt;u&gt;코드의 재사용, 코드 중복 방지, 유지보수, 대형프로젝트 시 협업&lt;/u&gt;&lt;/b&gt;할때 아주 유용하며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 중심 -&amp;gt; 데이터 중심 -&amp;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;&lt;a href=&quot;https://www.inflearn.com/course/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B8%89-%EC%9D%B8%ED%94%84%EB%9F%B0-%EC%98%A4%EB%A6%AC%EC%A7%80%EB%84%90/dashboard&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;기본적인 내용보다는 실질적으로 Why? 라는 의문이 가질 법한 내용 위주로 정리하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>02. Study/Python</category>
      <category>python class</category>
      <category>파이썬 객체 지향 프로그래밍</category>
      <category>파이썬 중급</category>
      <category>파이썬 클래스</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/162</guid>
      <comments>https://boysboy3.tistory.com/162#entry162comment</comments>
      <pubDate>Mon, 21 Mar 2022 13:11:16 +0900</pubDate>
    </item>
    <item>
      <title>RTX 3000 Series GPU Setting for window10</title>
      <link>https://boysboy3.tistory.com/161</link>
      <description>&lt;p&gt;최근 컴퓨터 조립으로 rtx 3000 series를 window 환경에서 setting을 하게되었다.&lt;/p&gt;
&lt;p&gt;일단, pytorch 및 tensorflow gpu동작이 잘 되는것을 확인하였는데, 이 글을 통해 향 후 셋팅하면서 수고스러운일을 덜기 위해 작성한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;GPU 는 RTX3090 기준으로 작성되었습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1. Anaconda 설치&lt;/p&gt;
&lt;p&gt;-&amp;gt; 최신 anaconda 대신 나는 이전 버전을 설치하였다&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://repo.anaconda.com/archive/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;repo.anaconda.com/archive/&lt;/a&gt; -&amp;gt; Anaconda3-2020.02-Windows-x86_64&amp;nbsp; 검색해서 다운받을 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2. CUDA 및 cudnn 설치&lt;/p&gt;
&lt;p&gt;-&amp;gt; 이 부분이 gpu 사용을 위해 가장 중요한데,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2.1) CUDA -&amp;gt;&lt;a href=&quot;https://developer.nvidia.com/cuda-11.1.1-download-archive&quot;&gt;CUDA Toolkit 11.1.1&lt;/a&gt; -&amp;gt; 파일명(&lt;span style=&quot;color: #333333;&quot;&gt;cuda_11.1.1_456.81_win10&lt;/span&gt;) -&amp;gt; install&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/3CPHh/btqWKYZP6Qj/kGpwVJz6VsDKEQTAtKzyak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3CPHh/btqWKYZP6Qj/kGpwVJz6VsDKEQTAtKzyak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3CPHh/btqWKYZP6Qj/kGpwVJz6VsDKEQTAtKzyak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3CPHh%2FbtqWKYZP6Qj%2FkGpwVJz6VsDKEQTAtKzyak%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;span style=&quot;color: #333333;&quot;&gt;2.2) CUDNN -&amp;gt;&lt;span&gt;&lt;span&gt; &lt;a href=&quot;https://developer.nvidia.com/rdp/cudnn-archive#a-collapse805-111&quot; data-parent=&quot;#accordion&quot; data-toggle=&quot;collapse&quot;&gt;Download cuDNN v8.0.5 (November 9th, 2020), for CUDA 11.1&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;-&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;파일명(&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;cuda_11.1.1_456.81_win10cudnn-11.1-windows-x64-v8.0.5.39&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;) -&amp;gt; 압축해제 -&amp;gt; CUDA경로(C:\Program&amp;nbsp;Files\NVIDIA&amp;nbsp;GPU&amp;nbsp;Computing&amp;nbsp;Toolkit\CUDA\v11.1)로 들어가 덮어 씌우기를 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;덮어 씌울때 폴더는 (bin, include, lib, NVIDIA_SLA_cuDNN_Support.txt) 가 될것이다.&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/bTp7qb/btqWNb5uBUD/oTvFrnmxZEfb3HUhCam1M1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTp7qb/btqWNb5uBUD/oTvFrnmxZEfb3HUhCam1M1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTp7qb/btqWNb5uBUD/oTvFrnmxZEfb3HUhCam1M1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTp7qb%2FbtqWNb5uBUD%2FoTvFrnmxZEfb3HUhCam1M1%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;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/d5xjV3/btqWOfsYBP2/o1KXGLja0FvbKpd5emxpr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d5xjV3/btqWOfsYBP2/o1KXGLja0FvbKpd5emxpr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d5xjV3/btqWOfsYBP2/o1KXGLja0FvbKpd5emxpr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd5xjV3%2FbtqWOfsYBP2%2Fo1KXGLja0FvbKpd5emxpr1%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;span style=&quot;color: #333333;&quot;&gt;3. 가상환경 생성 및 tf, pytorch 설치&amp;nbsp; &amp;nbsp;(tensorflow -&amp;gt; 2.4.0-rc0 / pytorch -&amp;gt; 1.7.1)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;pytorch&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;-&amp;gt; conda create -n pytorch_test python=3.8&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;-&amp;gt; conda activate pytorch_test&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;-&amp;gt; conda install pytorch torchvision torchaudio cudatoolkit=11.0 -c pytorch&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;tensorflow&lt;/p&gt;
&lt;p&gt;-&amp;gt; conda create -n tensorflow_test python=3.7&lt;/p&gt;
&lt;p&gt;-&amp;gt; conda activate tensorflow_test&lt;/p&gt;
&lt;p&gt;tensorflow whl 파일 다운2.4.0rc0-cp37 (&lt;a href=&quot;https://drive.google.com/file/d/1j5xWUt4tnPQq0tVSKN1yFewcouhotONg/view&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;-&amp;gt; pip install &lt;span&gt;tensorflow-2.4.0rc0-cp37-cp37m-win_amd64.whl&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;-&amp;gt; pip install numpy==1.19.3&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;4. GPU test&lt;/p&gt;
&lt;p&gt;pytorch&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;torch&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;torch&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;cuda&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;is_available&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;() # True&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;torch&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;cuda&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;get_device_name&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;) # RTX 3090&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;torch.cuda.device_count() # 1&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;tensorflow&lt;/p&gt;
&lt;p&gt;import tensorflow as tf&lt;/p&gt;
&lt;p&gt;print(tf.__version__) # 2.4.0rc0&lt;/p&gt;
&lt;p&gt;print(tf.test.is_gpu_available) # True&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;ps) 혹시나 'cudnn64_8.dll not found' 오류가 뜰 수 있다.&lt;/p&gt;
&lt;p&gt;그럴땐 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\bin\bin'&amp;nbsp; 경로에서 &lt;span style=&quot;color: #333333;&quot;&gt;cudnn64_8.dll 파일을 복사후 상위 폴더에 붙어넣기 해주면 해결 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;-&amp;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;reference :&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://dailylime.kr/2020/11/tensorflow-on-rtx-3000-series/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;dailylime.kr/2020/11/tensorflow-on-rtx-3000-series/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/tensorflow/tensorflow/issues/43193&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;github.com/tensorflow/tensorflow/issues/43193&lt;/a&gt;&lt;/p&gt;</description>
      <category>02. Study/Deep Learning</category>
      <category>cudnn64_8.dll not found</category>
      <category>rtx 3000 gpu 설치</category>
      <category>rtx 3000 pytorch gpu 설치</category>
      <category>RTX 3000 Series GPU Setting for window10</category>
      <category>window rtx 3090 tensorflow gpu 사용</category>
      <category>window10 rtx 3090 pytorch gpu 사용</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/161</guid>
      <comments>https://boysboy3.tistory.com/161#entry161comment</comments>
      <pubDate>Wed, 10 Feb 2021 12:31:16 +0900</pubDate>
    </item>
    <item>
      <title>dynamic programming</title>
      <link>https://boysboy3.tistory.com/160</link>
      <description>&lt;p&gt;다이나믹&amp;nbsp;프로그래밍 &lt;br /&gt;-&amp;nbsp;다이나믹&amp;nbsp;프로그래밍은&amp;nbsp;메모리를&amp;nbsp;적절히&amp;nbsp;사용하여&amp;nbsp;수행&amp;nbsp;시간&amp;nbsp;효율성을&amp;nbsp;비약적으로&amp;nbsp;향상시키는&amp;nbsp;방법입니다. &lt;br /&gt;-&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;(메모이제이션) &lt;br /&gt;-&amp;nbsp;다이나믹&amp;nbsp;프로그래밍의&amp;nbsp;구현은&amp;nbsp;일반적으로&amp;nbsp;두&amp;nbsp;가지&amp;nbsp;방식(top-down,&amp;nbsp;bottom-up)으로&amp;nbsp;구성됩니다. &lt;br /&gt;&lt;br /&gt;또한,&amp;nbsp;다이나믹&amp;nbsp;프로그래밍은&amp;nbsp;동적&amp;nbsp;계획법이라고&amp;nbsp;부르며, &lt;br /&gt;일반적인&amp;nbsp;프로그래밍&amp;nbsp;분야에서의&amp;nbsp;자료구조에서&amp;nbsp;동적&amp;nbsp;할당(Dynamic&amp;nbsp;Allocation)은&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;동적(Dynamic)은&amp;nbsp;별다른&amp;nbsp;의미&amp;nbsp;없이&amp;nbsp;사용된&amp;nbsp;단어라&amp;nbsp;헷갈리면&amp;nbsp;안된다. &lt;br /&gt;&lt;br /&gt;다이나믹&amp;nbsp;프로그래밍은&amp;nbsp;문제가&amp;nbsp;다음의&amp;nbsp;조건을&amp;nbsp;만족할&amp;nbsp;때&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;1.&amp;nbsp;최적&amp;nbsp;부분&amp;nbsp;구조(Optimal&amp;nbsp;Substructure) &lt;br /&gt;&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;있습니다. &lt;br /&gt;2.&amp;nbsp;중복되는&amp;nbsp;부분&amp;nbsp;문제(Overlapping&amp;nbsp;Subproblem) &lt;br /&gt;&amp;nbsp;&amp;nbsp;*&amp;nbsp;동일한&amp;nbsp;작은&amp;nbsp;문제를&amp;nbsp;반복적으로&amp;nbsp;해결해야&amp;nbsp;합니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;대표적으로&amp;nbsp;피보나치&amp;nbsp;수열이&amp;nbsp;있다. &lt;br /&gt;1,1,2,3,4,5,8,13,21,34,55,89&amp;nbsp;... &lt;br /&gt;점화식이란&amp;nbsp;인접한&amp;nbsp;항들&amp;nbsp;사이의&amp;nbsp;관계식을&amp;nbsp;의미한다. &lt;br /&gt;피보나치&amp;nbsp;수열을&amp;nbsp;점화식으로&amp;nbsp;표현하는&amp;nbsp;다음과&amp;nbsp;같다. &lt;br /&gt;a(n)&amp;nbsp;=&amp;nbsp;a(n-1)&amp;nbsp;+&amp;nbsp;a(n-2),&amp;nbsp;a(1)=1,&amp;nbsp;a(2)=1 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def&amp;nbsp;fibo(x): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;x&amp;nbsp;==&amp;nbsp;1&amp;nbsp;or&amp;nbsp;x&amp;nbsp;==&amp;nbsp;2: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;fibo(x-1)&amp;nbsp;+&amp;nbsp;fibo(x-2) &lt;br /&gt;print(fibo(3)) &lt;br /&gt;&lt;br /&gt;위&amp;nbsp;처럼&amp;nbsp;단순&amp;nbsp;재귀&amp;nbsp;함수로&amp;nbsp;피보나치&amp;nbsp;수열을&amp;nbsp;해결하면&amp;nbsp;지수&amp;nbsp;시간&amp;nbsp;복잡도를&amp;nbsp;가지게&amp;nbsp;된다 &lt;br /&gt;ex)&amp;nbsp;fibo(6)&amp;nbsp;를&amp;nbsp;호출하게&amp;nbsp;되면,&amp;nbsp;f(2)&amp;nbsp;가&amp;nbsp;5번&amp;nbsp;호출된다.&amp;nbsp;[중복되는&amp;nbsp;부분&amp;nbsp;문제] &lt;br /&gt;&lt;br /&gt;중복&amp;nbsp;되는&amp;nbsp;함수&amp;nbsp;호출을&amp;nbsp;막기위해&amp;nbsp;메모이제이션(memoization)을&amp;nbsp;이용해서&amp;nbsp;해결&amp;nbsp;가능. &lt;br /&gt;top-down&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;캐싱(caching)이라고도&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;top-down&amp;nbsp;VS&amp;nbsp;bottom-up &lt;br /&gt;탑다운(메모이제이션)&amp;nbsp;방식은&amp;nbsp;하향식이라고도&amp;nbsp;하며&amp;nbsp;바텀업&amp;nbsp;방식은&amp;nbsp;상향식이라고도&amp;nbsp;한다. &lt;br /&gt;보통&amp;nbsp;전형적인&amp;nbsp;형태는&amp;nbsp;바텀업&amp;nbsp;방식이고,&amp;nbsp;결과&amp;nbsp;저장용&amp;nbsp;리스트는&amp;nbsp;DP&amp;nbsp;테이블이라고도&amp;nbsp;부른다. &lt;br /&gt;엄밀히&amp;nbsp;말하면,&amp;nbsp;메모이제이션은&amp;nbsp;이전에&amp;nbsp;계산된&amp;nbsp;결과를&amp;nbsp;일시적으로&amp;nbsp;기록해&amp;nbsp;놓은&amp;nbsp;넓은&amp;nbsp;개념을&amp;nbsp;의미해&amp;nbsp;DP에만&amp;nbsp;국한된&amp;nbsp;개념은&amp;nbsp;아니다! &lt;br /&gt;&lt;br /&gt;#&amp;nbsp;메모이제이션&amp;nbsp;방식(top-down)으로&amp;nbsp;피보나치&amp;nbsp;구현 &lt;br /&gt;#&amp;nbsp;아래&amp;nbsp;시간&amp;nbsp;복잡도는&amp;nbsp;O(N)&amp;nbsp;이다.&amp;nbsp;이유는&amp;nbsp;생각해보자. &lt;br /&gt;d&amp;nbsp;=&amp;nbsp;[0]&amp;nbsp;*&amp;nbsp;100&amp;nbsp;#&amp;nbsp;최대&amp;nbsp;100까지만&amp;nbsp;계산을&amp;nbsp;위해&amp;nbsp;리스트&amp;nbsp;초기화 &lt;br /&gt;def&amp;nbsp;fibo(x): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;print('f('+str(x)+')',&amp;nbsp;end='&amp;nbsp;') &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;x&amp;nbsp;==&amp;nbsp;1&amp;nbsp;or&amp;nbsp;x&amp;nbsp;==&amp;nbsp;2:&amp;nbsp;#&amp;nbsp;종료&amp;nbsp;조건 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;d[x]&amp;nbsp;!=&amp;nbsp;0:&amp;nbsp;#&amp;nbsp;이미&amp;nbsp;계산한&amp;nbsp;적&amp;nbsp;있으면&amp;nbsp;그대로&amp;nbsp;반환 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;d[x] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d[x]&amp;nbsp;=&amp;nbsp;fibo(x-1)&amp;nbsp;+&amp;nbsp;fibo(x-2) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;d[x] &lt;br /&gt;print(fibo(99)) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;bottom-up&amp;nbsp;방식으로&amp;nbsp;피보나치&amp;nbsp;구현 &lt;br /&gt;d&amp;nbsp;=&amp;nbsp;[0]&amp;nbsp;*&amp;nbsp;100 &lt;br /&gt;&lt;br /&gt;d[1]&amp;nbsp;=&amp;nbsp;1 &lt;br /&gt;d[2]&amp;nbsp;=&amp;nbsp;1 &lt;br /&gt;n&amp;nbsp;=&amp;nbsp;99 &lt;br /&gt;&lt;br /&gt;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;range(3,&amp;nbsp;n+1): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d[i]&amp;nbsp;=&amp;nbsp;d[i-1]&amp;nbsp;+&amp;nbsp;d[i-2] &lt;br /&gt;print(d[n]) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;다이나믹&amp;nbsp;프로그래밍(DP)&amp;nbsp;VS&amp;nbsp;&amp;nbsp;분할&amp;nbsp;정복(divide&amp;nbsp;and&amp;nbsp;conquer) &lt;br /&gt;-&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;있다 &lt;br /&gt;-&amp;nbsp;dp와&amp;nbsp;분할&amp;nbsp;정복의&amp;nbsp;차이점은&amp;nbsp;부분&amp;nbsp;문제의&amp;nbsp;중복이라&amp;nbsp;dp&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;않는다. &lt;br /&gt;&lt;br /&gt;이게&amp;nbsp;생각보다&amp;nbsp;어려운데, &lt;br /&gt;-&amp;nbsp;DP&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;고려 &lt;br /&gt;-&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;사용 &lt;br /&gt;-&amp;nbsp;일반적인&amp;nbsp;코테&amp;nbsp;수준에서는&amp;nbsp;기본&amp;nbsp;유형의&amp;nbsp;DP&amp;nbsp;문제가&amp;nbsp;출제되서&amp;nbsp;쫄지&amp;nbsp;않아도&amp;nbsp;된다.&amp;nbsp;반복적인&amp;nbsp;연습을&amp;nbsp;통해서&amp;nbsp;이런유형을&amp;nbsp;익숙해질&amp;nbsp;수&amp;nbsp;있다 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;문제&amp;gt;&amp;nbsp;개미전사 &lt;br /&gt;#&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;있다. &lt;br /&gt;#&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;중에서&amp;nbsp;서로&amp;nbsp;인접한&amp;nbsp;식량창고가&amp;nbsp;공격받으면&amp;nbsp;바로&amp;nbsp;알아챌&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;#&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;한다. &lt;br /&gt;예) &lt;br /&gt;창고(0)&amp;nbsp;&amp;nbsp;창고(1)&amp;nbsp;&amp;nbsp;창고(2)&amp;nbsp;&amp;nbsp;창고(3) &lt;br /&gt;&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5 &lt;br /&gt;#&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;8개의&amp;nbsp;식량을&amp;nbsp;빼앗을&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;#&amp;nbsp;개미&amp;nbsp;전사를&amp;nbsp;위해&amp;nbsp;식량창고&amp;nbsp;N개에&amp;nbsp;대한&amp;nbsp;정보가&amp;nbsp;주어졌을&amp;nbsp;때&amp;nbsp;얻을&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;식량의&amp;nbsp;최댓값을&amp;nbsp;구하는&amp;nbsp;프로그램을&amp;nbsp;작성 &lt;br /&gt;&lt;br /&gt;#&amp;nbsp;입력&amp;nbsp;예시 &lt;br /&gt;#&amp;nbsp;첫째&amp;nbsp;줄에&amp;nbsp;식량창고의&amp;nbsp;개수&amp;nbsp;N이&amp;nbsp;주어집니다&amp;nbsp;(3&amp;nbsp;&amp;lt;=&amp;nbsp;N&amp;nbsp;&amp;lt;=&amp;nbsp;100) &lt;br /&gt;#&amp;nbsp;둘째&amp;nbsp;줄에&amp;nbsp;공백을&amp;nbsp;기준으로&amp;nbsp;각&amp;nbsp;식량창고에&amp;nbsp;저장된&amp;nbsp;식량의&amp;nbsp;개수&amp;nbsp;K가&amp;nbsp;주어집니다&amp;nbsp;(0&amp;lt;=K&amp;lt;=1000) &lt;br /&gt;4 &lt;br /&gt;1&amp;nbsp;3&amp;nbsp;1&amp;nbsp;5 &lt;br /&gt;출력 &lt;br /&gt;8 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;점화식 &lt;br /&gt;#&amp;nbsp;ai=i번째&amp;nbsp;식량창고까지의&amp;nbsp;최적의&amp;nbsp;해&amp;nbsp;(얻을&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;식량의&amp;nbsp;최댓값) &lt;br /&gt;#&amp;nbsp;ki=i번째&amp;nbsp;식량창고에&amp;nbsp;있는&amp;nbsp;식량의&amp;nbsp;양 &lt;br /&gt;#&amp;nbsp;ai&amp;nbsp;=&amp;nbsp;max(ai-1,&amp;nbsp;ai-2+ki) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;n&amp;nbsp;=&amp;nbsp;int(input()) &lt;br /&gt;k&amp;nbsp;=&amp;nbsp;list(map(int,&amp;nbsp;input().split('&amp;nbsp;'))) &lt;br /&gt;&lt;br /&gt;#&amp;nbsp;앞서&amp;nbsp;계산된&amp;nbsp;결과를&amp;nbsp;저장하기&amp;nbsp;위한&amp;nbsp;dp&amp;nbsp;테이블&amp;nbsp;초기화 &lt;br /&gt;d_table&amp;nbsp;=&amp;nbsp;[0]&amp;nbsp;*&amp;nbsp;100 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;d_table[0]&amp;nbsp;=&amp;nbsp;k[0] &lt;br /&gt;d_table[1]&amp;nbsp;=&amp;nbsp;max(k[0],&amp;nbsp;k[1]) &lt;br /&gt;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;range(2,&amp;nbsp;n): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d_table[i]&amp;nbsp;=&amp;nbsp;max(d_table[i-1],&amp;nbsp;d_table[i-2]+k[i]) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;print(d_table[n-1]) &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위 내용들은 이코테 youtube 및 책을 참고하였습니다&lt;/p&gt;
&lt;p&gt;이코테&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=5Lu34WIx2Us&quot;&gt;링크&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;책&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://book.naver.com/bookdb/book_detail.nhn?bid=16439154&quot;&gt;링크&lt;/a&gt;&lt;/p&gt;</description>
      <category>02. Study/Algorithm</category>
      <category>DP</category>
      <category>dynamic programming</category>
      <category>다이나믹 프로그래밍</category>
      <category>동적 계획법</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/160</guid>
      <comments>https://boysboy3.tistory.com/160#entry160comment</comments>
      <pubDate>Tue, 3 Nov 2020 11:08:59 +0900</pubDate>
    </item>
    <item>
      <title>binary search</title>
      <link>https://boysboy3.tistory.com/159</link>
      <description>&lt;p&gt;이진탐색 &lt;br /&gt;&lt;br /&gt;순차&amp;nbsp;탐색(sequential&amp;nbsp;search)&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;방법 &lt;br /&gt;이진&amp;nbsp;탐색(binary&amp;nbsp;search)&amp;nbsp;:&amp;nbsp;정렬되어&amp;nbsp;있는&amp;nbsp;리스트에서&amp;nbsp;탐색&amp;nbsp;범위를&amp;nbsp;절반씩&amp;nbsp;좁혀가며&amp;nbsp;데이터를&amp;nbsp;탐색하는&amp;nbsp;방법 &lt;br /&gt;이진&amp;nbsp;탐색은&amp;nbsp;시작점,&amp;nbsp;끝점,&amp;nbsp;중간점이&amp;nbsp;존재 &lt;br /&gt;&lt;br /&gt;ex) &lt;br /&gt;정렬되어&amp;nbsp;있는&amp;nbsp;리스트가&amp;nbsp;있다고&amp;nbsp;가정하고&amp;nbsp;4인&amp;nbsp;원소를&amp;nbsp;찾는&amp;nbsp;예시 &lt;br /&gt;[0,&amp;nbsp;2,&amp;nbsp;4,&amp;nbsp;6,&amp;nbsp;8,&amp;nbsp;12,&amp;nbsp;14,&amp;nbsp;16,&amp;nbsp;18]&amp;nbsp;시작점&amp;nbsp;0(index)&amp;nbsp;끝점&amp;nbsp;9&amp;nbsp;중간점&amp;nbsp;4&amp;nbsp;으로&amp;nbsp;설정하고,&amp;nbsp;중간점과&amp;nbsp;찾고자하는&amp;nbsp;원소값이&amp;nbsp;작다면&amp;nbsp;오른쪽&amp;nbsp;범위는&amp;nbsp;볼&amp;nbsp;필요가&amp;nbsp;없다. &lt;br /&gt;[0,&amp;nbsp;2,&amp;nbsp;4,&amp;nbsp;6]&amp;nbsp;이렇게&amp;nbsp;탐색범위는&amp;nbsp;총&amp;nbsp;4개&amp;nbsp;줄어드는데,&amp;nbsp;시작점은&amp;nbsp;0&amp;nbsp;중간점은&amp;nbsp;1&amp;nbsp;끝점은&amp;nbsp;3이&amp;nbsp;된다.&amp;nbsp;이렇게&amp;nbsp;해도&amp;nbsp;원하는&amp;nbsp;4를&amp;nbsp;못찾았는데&amp;nbsp;이번에는&amp;nbsp;중간점에&amp;nbsp;있는&amp;nbsp;2보다&amp;nbsp;4가&amp;nbsp;더&amp;nbsp;작으므로&amp;nbsp;오른쪽만&amp;nbsp;본다 &lt;br /&gt;[4,&amp;nbsp;6]&amp;nbsp;시작점&amp;nbsp;0&amp;nbsp;끝점&amp;nbsp;1&amp;nbsp;중간점&amp;nbsp;0&amp;nbsp;&amp;nbsp;-&amp;gt;&amp;nbsp;4를&amp;nbsp;찾았다.&amp;nbsp;&amp;nbsp;총&amp;nbsp;3번의&amp;nbsp;step으로&amp;nbsp;원하는&amp;nbsp;값을&amp;nbsp;찾을&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;시간복잡도는&amp;nbsp;탐색&amp;nbsp;범위를&amp;nbsp;2로&amp;nbsp;나누는&amp;nbsp;것과&amp;nbsp;동일하므로&amp;nbsp;연산&amp;nbsp;횟수는&amp;nbsp;log2N에&amp;nbsp;비례하므로,&amp;nbsp;O(logN)을&amp;nbsp;보장 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;binary&amp;nbsp;search&amp;nbsp;with&amp;nbsp;recursive &lt;br /&gt;def&amp;nbsp;binary_search_resursive(arr,&amp;nbsp;target,&amp;nbsp;start,&amp;nbsp;end): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;start&amp;nbsp;&amp;gt;&amp;nbsp;end: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;None &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mid&amp;nbsp;=&amp;nbsp;(start+end)&amp;nbsp;//&amp;nbsp;2 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;찾은&amp;nbsp;경우&amp;nbsp;중간점&amp;nbsp;인덱스&amp;nbsp;반환 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;arr[mid]&amp;nbsp;==&amp;nbsp;target: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;mid &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&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;확인 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif&amp;nbsp;arr[mid]&amp;nbsp;&amp;gt;&amp;nbsp;target: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;binary_search_resursive(arr,&amp;nbsp;target,&amp;nbsp;start,&amp;nbsp;mid-1) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&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;확인 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;binary_search_resursive(arr,&amp;nbsp;target,&amp;nbsp;mid+1,&amp;nbsp;end) &lt;br /&gt;&lt;br /&gt;#&amp;nbsp;binary&amp;nbsp;search&amp;nbsp;with&amp;nbsp;for &lt;br /&gt;def&amp;nbsp;binary_search_for(arr,&amp;nbsp;target,&amp;nbsp;start,&amp;nbsp;end): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;start&amp;nbsp;&amp;lt;=&amp;nbsp;end: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mid&amp;nbsp;=&amp;nbsp;(start&amp;nbsp;+&amp;nbsp;end)&amp;nbsp;//&amp;nbsp;2 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&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;반환 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;arr[mid]&amp;nbsp;==&amp;nbsp;target: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;mid &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&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;확인 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif&amp;nbsp;arr[mid]&amp;nbsp;&amp;gt;&amp;nbsp;target: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&amp;nbsp;=&amp;nbsp;mid&amp;nbsp;-&amp;nbsp;1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&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;확인 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start&amp;nbsp;=&amp;nbsp;mid&amp;nbsp;+&amp;nbsp;1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;None&amp;nbsp;#&amp;nbsp;못찾았다면&amp;nbsp;None&amp;nbsp;반환 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;원하는&amp;nbsp;원소&amp;nbsp;n&amp;nbsp;과&amp;nbsp;target&amp;nbsp;list&amp;nbsp;가&amp;nbsp;몇개&amp;nbsp;인지&amp;nbsp;입력&amp;nbsp;받기&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;n,&amp;nbsp;target&amp;nbsp;=&amp;nbsp;list(map(int,&amp;nbsp;input().split())) &lt;br /&gt;&lt;br /&gt;#&amp;nbsp;전체&amp;nbsp;원소&amp;nbsp;입력&amp;nbsp;받기 &lt;br /&gt;arr&amp;nbsp;=&amp;nbsp;list(map(int,&amp;nbsp;input().split())) &lt;br /&gt;&lt;br /&gt;result&amp;nbsp;=&amp;nbsp;binary_search_resursive(arr,&amp;nbsp;target,&amp;nbsp;0,&amp;nbsp;n-1) &lt;br /&gt;&lt;br /&gt;&quot;&quot;&quot; &lt;br /&gt;10&amp;nbsp;7 &lt;br /&gt;1&amp;nbsp;3&amp;nbsp;5&amp;nbsp;7&amp;nbsp;9&amp;nbsp;11&amp;nbsp;13&amp;nbsp;15&amp;nbsp;17&amp;nbsp;19 &lt;br /&gt;4 &lt;br /&gt;&quot;&quot;&quot; &lt;br /&gt;if&amp;nbsp;result&amp;nbsp;==&amp;nbsp;None: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print('원소&amp;nbsp;없음') &lt;br /&gt;else: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(result+1) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;&amp;nbsp;python&amp;nbsp;binary&amp;nbsp;search&amp;nbsp;libary &lt;br /&gt;from&amp;nbsp;bisect&amp;nbsp;import&amp;nbsp;bisect_left,&amp;nbsp;bisect_right &lt;br /&gt;&lt;br /&gt;a&amp;nbsp;=&amp;nbsp;[1,2,4,4,8] &lt;br /&gt;x&amp;nbsp;=&amp;nbsp;4 &lt;br /&gt;&lt;br /&gt;print(bisect_left(a,x))&amp;nbsp;#&amp;nbsp;정렬된&amp;nbsp;순서를&amp;nbsp;유지하면서&amp;nbsp;배열&amp;nbsp;a에&amp;nbsp;x를&amp;nbsp;삽입할&amp;nbsp;가장&amp;nbsp;왼쪽&amp;nbsp;인덱스&amp;nbsp;반환&amp;nbsp;-&amp;gt;&amp;nbsp;2 &lt;br /&gt;print(bisect_right(a,x))&amp;nbsp;#&amp;nbsp;정렬된&amp;nbsp;순서를&amp;nbsp;유지하면서&amp;nbsp;배열&amp;nbsp;a에&amp;nbsp;x를&amp;nbsp;삽입할&amp;nbsp;가장&amp;nbsp;오른쪽&amp;nbsp;인덱스&amp;nbsp;반환&amp;nbsp;-&amp;gt;&amp;nbsp;4 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;특정&amp;nbsp;범위에&amp;nbsp;속하는&amp;nbsp;데이터&amp;nbsp;개수&amp;nbsp;구하기 &lt;br /&gt;&lt;br /&gt;#&amp;nbsp;값이&amp;nbsp;[left_value,&amp;nbsp;right_value]인&amp;nbsp;데이터의&amp;nbsp;개수&amp;nbsp;반환하는&amp;nbsp;함수 &lt;br /&gt;def&amp;nbsp;count_by_range(a,&amp;nbsp;left_value,&amp;nbsp;right_value): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;right_index&amp;nbsp;=&amp;nbsp;bisect_right(a,&amp;nbsp;right_value) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;left_index&amp;nbsp;=&amp;nbsp;bisect_left(a,&amp;nbsp;left_value) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;right_index&amp;nbsp;-&amp;nbsp;left_index &lt;br /&gt;&lt;br /&gt;a&amp;nbsp;=&amp;nbsp;[1,&amp;nbsp;2,&amp;nbsp;3,&amp;nbsp;3,&amp;nbsp;3,&amp;nbsp;3,&amp;nbsp;4,&amp;nbsp;4,&amp;nbsp;8,&amp;nbsp;9] &lt;br /&gt;&lt;br /&gt;#&amp;nbsp;값이&amp;nbsp;4인&amp;nbsp;데이터&amp;nbsp;개수&amp;nbsp;출력 &lt;br /&gt;print(count_by_range(a,&amp;nbsp;4,&amp;nbsp;4))&amp;nbsp;#&amp;nbsp;2 &lt;br /&gt;&lt;br /&gt;#&amp;nbsp;값이&amp;nbsp;[-1,&amp;nbsp;3]&amp;nbsp;범위에&amp;nbsp;있는&amp;nbsp;데이터&amp;nbsp;개수&amp;nbsp;출력 &lt;br /&gt;print(count_by_range(a,&amp;nbsp;-1,&amp;nbsp;3))&amp;nbsp;#&amp;nbsp;6 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;파라메트릭&amp;nbsp;서치(parametric&amp;nbsp;search) &lt;br /&gt;-&amp;nbsp;최적화&amp;nbsp;문제를&amp;nbsp;결정&amp;nbsp;문제(yes&amp;nbsp;or&amp;nbsp;no)&amp;nbsp;로&amp;nbsp;바꾸어&amp;nbsp;해결하는&amp;nbsp;기법 &lt;br /&gt;ex)&amp;nbsp;특정한&amp;nbsp;조건을&amp;nbsp;만족하는&amp;nbsp;가장&amp;nbsp;알맞은&amp;nbsp;값을&amp;nbsp;빠르게&amp;nbsp;찾는&amp;nbsp;최적화&amp;nbsp;문제 &lt;br /&gt;일반적으로&amp;nbsp;코딩&amp;nbsp;테스트에서는&amp;nbsp;이진&amp;nbsp;탐색을&amp;nbsp;이용하여&amp;nbsp;해결&amp;nbsp;가능 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위 내용들은 이코테 youtube 및 책을 참고하였습니다&lt;/p&gt;
&lt;p&gt;이코테&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=94RC-DsGMLo&quot;&gt;링크&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;책&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://book.naver.com/bookdb/book_detail.nhn?bid=16439154&quot;&gt;링크&lt;/a&gt;&lt;/p&gt;</description>
      <category>02. Study/Algorithm</category>
      <category>binary search</category>
      <category>python 알고리즘</category>
      <category>이진 탐색</category>
      <category>파라메트릭 서치</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/159</guid>
      <comments>https://boysboy3.tistory.com/159#entry159comment</comments>
      <pubDate>Sun, 11 Oct 2020 17:19:54 +0900</pubDate>
    </item>
    <item>
      <title>Sort Algorithm</title>
      <link>https://boysboy3.tistory.com/158</link>
      <description>&lt;p&gt;정렬 알고리즘 &lt;br /&gt;&lt;br /&gt;정렬(Sorting)이란&amp;nbsp;데이터를&amp;nbsp;특정한&amp;nbsp;기준에&amp;nbsp;따라&amp;nbsp;순서대로&amp;nbsp;나열하는&amp;nbsp;것을&amp;nbsp;말합니다. &lt;br /&gt;일반적으로&amp;nbsp;문제&amp;nbsp;상황에&amp;nbsp;따라서&amp;nbsp;적절한&amp;nbsp;정렬&amp;nbsp;알고리즘이&amp;nbsp;공식처럼&amp;nbsp;사용된다. &lt;br /&gt;&lt;br /&gt;아래&amp;nbsp;리스트를&amp;nbsp;어떻게&amp;nbsp;정렬할까&amp;nbsp;? &lt;br /&gt;[7,&amp;nbsp;5,&amp;nbsp;9,&amp;nbsp;0,&amp;nbsp;3,&amp;nbsp;1,&amp;nbsp;6,&amp;nbsp;2,&amp;nbsp;4,&amp;nbsp;8] &lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;선택&amp;nbsp;정렬(selection&amp;nbsp;sort) &lt;br /&gt;-&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;반복 &lt;br /&gt;&lt;br /&gt;:&amp;nbsp;[7,&amp;nbsp;5,&amp;nbsp;9,&amp;nbsp;0,&amp;nbsp;3,&amp;nbsp;1,&amp;nbsp;6,&amp;nbsp;2,&amp;nbsp;4,&amp;nbsp;8]&amp;nbsp;가장&amp;nbsp;작은&amp;nbsp;0을&amp;nbsp;선택해&amp;nbsp;7와&amp;nbsp;바꾼다. &lt;br /&gt;:&amp;nbsp;[0,&amp;nbsp;5,&amp;nbsp;9,&amp;nbsp;7,&amp;nbsp;3,&amp;nbsp;1,&amp;nbsp;6,&amp;nbsp;2,&amp;nbsp;4,&amp;nbsp;8]&amp;nbsp;다음&amp;nbsp;작은&amp;nbsp;1를&amp;nbsp;선택해&amp;nbsp;5와&amp;nbsp;바꾼다. &lt;br /&gt;:&amp;nbsp;[0,&amp;nbsp;1,&amp;nbsp;9,&amp;nbsp;7,&amp;nbsp;3,&amp;nbsp;5,&amp;nbsp;6,&amp;nbsp;2,&amp;nbsp;4,&amp;nbsp;8]&amp;nbsp;다음&amp;nbsp;작은&amp;nbsp;2을&amp;nbsp;선택해&amp;nbsp;9와&amp;nbsp;바꾼다. &lt;br /&gt;:&amp;nbsp;[0,&amp;nbsp;1,&amp;nbsp;2,&amp;nbsp;7,&amp;nbsp;3,&amp;nbsp;5,&amp;nbsp;6,&amp;nbsp;9,&amp;nbsp;4,&amp;nbsp;8]&amp;nbsp;위&amp;nbsp;작업을&amp;nbsp;계속&amp;nbsp;반복한다. &lt;br /&gt;:&amp;nbsp;[0,&amp;nbsp;1,&amp;nbsp;2,&amp;nbsp;3,&amp;nbsp;4,&amp;nbsp;5,&amp;nbsp;6,&amp;nbsp;7,&amp;nbsp;8,&amp;nbsp;9]&amp;nbsp;마지막&amp;nbsp;경우에는&amp;nbsp;처리하지&amp;nbsp;않아도&amp;nbsp;된다. &lt;br /&gt;탐색할때마다&amp;nbsp;범위가&amp;nbsp;줄어드는데&amp;nbsp;매번&amp;nbsp;작은&amp;nbsp;값을&amp;nbsp;찾기위해&amp;nbsp;탐색&amp;nbsp;범위만큼&amp;nbsp;확인해서&amp;nbsp;찾아야되기&amp;nbsp;때문에 &lt;br /&gt;매번&amp;nbsp;선형탐색을&amp;nbsp;수행하는&amp;nbsp;것과&amp;nbsp;동일 &lt;br /&gt;N&amp;nbsp;+&amp;nbsp;(N-1)&amp;nbsp;+&amp;nbsp;(N-2)&amp;nbsp;+&amp;nbsp;...&amp;nbsp;+&amp;nbsp;2&amp;nbsp;이므로&amp;nbsp;(N^2+N-2)/2&amp;nbsp;로&amp;nbsp;표현&amp;nbsp;가능하지만&amp;nbsp;빅오&amp;nbsp;표기법으로&amp;nbsp;O(N^2)&amp;nbsp;의&amp;nbsp;시간&amp;nbsp;복잡도를&amp;nbsp;가진다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;선택&amp;nbsp;정렬 &lt;br /&gt;arr&amp;nbsp;=&amp;nbsp;[7,&amp;nbsp;5,&amp;nbsp;9,&amp;nbsp;0,&amp;nbsp;3,&amp;nbsp;1,&amp;nbsp;6,&amp;nbsp;2,&amp;nbsp;4,&amp;nbsp;8] &lt;br /&gt;&lt;br /&gt;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;range(len(arr)): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;min_index&amp;nbsp;=&amp;nbsp;i&amp;nbsp;#&amp;nbsp;가장&amp;nbsp;작은&amp;nbsp;원소&amp;nbsp;인덱스 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;j&amp;nbsp;in&amp;nbsp;range(i+1,&amp;nbsp;len(arr)):&amp;nbsp;#&amp;nbsp;탐색해야&amp;nbsp;할&amp;nbsp;인덱스 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;arr[min_index]&amp;nbsp;&amp;gt;&amp;nbsp;arr[j]: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;min_index&amp;nbsp;=&amp;nbsp;j &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;arr[i],&amp;nbsp;arr[min_index]&amp;nbsp;=&amp;nbsp;arr[min_index],&amp;nbsp;arr[i]&amp;nbsp;#&amp;nbsp;작은&amp;nbsp;인덱스와&amp;nbsp;바꾼다 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;print(arr) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;삽입&amp;nbsp;정렬(insertion&amp;nbsp;sort) &lt;br /&gt;-&amp;nbsp;처리되지&amp;nbsp;않은&amp;nbsp;데이터를&amp;nbsp;하나씩&amp;nbsp;골라&amp;nbsp;적절한&amp;nbsp;위치에&amp;nbsp;삽입 &lt;br /&gt;-&amp;nbsp;선택&amp;nbsp;정렬에&amp;nbsp;비해&amp;nbsp;구현&amp;nbsp;난이도가&amp;nbsp;높지만,&amp;nbsp;일반적으로&amp;nbsp;더&amp;nbsp;효율적으로&amp;nbsp;동작 &lt;br /&gt;&lt;br /&gt;:&amp;nbsp;[7,&amp;nbsp;5,&amp;nbsp;9,&amp;nbsp;0,&amp;nbsp;3,&amp;nbsp;1,&amp;nbsp;6,&amp;nbsp;2,&amp;nbsp;4,&amp;nbsp;8]&amp;nbsp;맨&amp;nbsp;앞&amp;nbsp;7은&amp;nbsp;정렬되어&amp;nbsp;있다고&amp;nbsp;가정하고&amp;nbsp;그&amp;nbsp;다음&amp;nbsp;원소인&amp;nbsp;5가&amp;nbsp;어떤&amp;nbsp;위치로&amp;nbsp;들어갈지&amp;nbsp;판단하여&amp;nbsp;7이랑&amp;nbsp;비교해서&amp;nbsp;앞으로&amp;nbsp;갈지&amp;nbsp;뒤로&amp;nbsp;갈지&amp;nbsp;판단 &lt;br /&gt;:&amp;nbsp;[5,&amp;nbsp;7,&amp;nbsp;9,&amp;nbsp;0,&amp;nbsp;3,&amp;nbsp;1,&amp;nbsp;6,&amp;nbsp;2,&amp;nbsp;4,&amp;nbsp;8]&amp;nbsp;그&amp;nbsp;다음&amp;nbsp;앞&amp;nbsp;두개는&amp;nbsp;정렬되어&amp;nbsp;있다고&amp;nbsp;가정하고&amp;nbsp;그다음&amp;nbsp;원소인&amp;nbsp;9가&amp;nbsp;어떤&amp;nbsp;위치로&amp;nbsp;들어갈지&amp;nbsp;판단해&amp;nbsp;정렬 &lt;br /&gt;:&amp;nbsp;[5,&amp;nbsp;7,&amp;nbsp;9,&amp;nbsp;0,&amp;nbsp;3,&amp;nbsp;1,&amp;nbsp;6,&amp;nbsp;2,&amp;nbsp;4,&amp;nbsp;8]&amp;nbsp;그&amp;nbsp;다음&amp;nbsp;앞&amp;nbsp;세개는&amp;nbsp;정렬되어&amp;nbsp;있다고&amp;nbsp;가정하고&amp;nbsp;그다음&amp;nbsp;원소인&amp;nbsp;0가&amp;nbsp;어떤&amp;nbsp;위치로&amp;nbsp;들어갈지&amp;nbsp;판단해&amp;nbsp;정렬(정렬된&amp;nbsp;원소랑만&amp;nbsp;비교하므로&amp;nbsp;가장&amp;nbsp;앞으로&amp;nbsp;간다) &lt;br /&gt;:&amp;nbsp;[0,&amp;nbsp;5,&amp;nbsp;7,&amp;nbsp;9,&amp;nbsp;3,&amp;nbsp;1,&amp;nbsp;6,&amp;nbsp;2,&amp;nbsp;4,&amp;nbsp;8]&amp;nbsp;그&amp;nbsp;다음&amp;nbsp;앞&amp;nbsp;네개는&amp;nbsp;정렬되어&amp;nbsp;있다고&amp;nbsp;가정하고&amp;nbsp;그다음&amp;nbsp;원소인&amp;nbsp;3가&amp;nbsp;어떤&amp;nbsp;위치로&amp;nbsp;들어갈지&amp;nbsp;판단해&amp;nbsp;정렬 &lt;br /&gt;:&amp;nbsp;[0,&amp;nbsp;3,&amp;nbsp;5,&amp;nbsp;7,&amp;nbsp;9,&amp;nbsp;1,&amp;nbsp;6,&amp;nbsp;2,&amp;nbsp;4,&amp;nbsp;8]&amp;nbsp;그&amp;nbsp;다음&amp;nbsp;앞&amp;nbsp;네개는&amp;nbsp;정렬되어&amp;nbsp;있다고&amp;nbsp;가정하고&amp;nbsp;그다음&amp;nbsp;원소인&amp;nbsp;3가&amp;nbsp;어떤&amp;nbsp;위치로&amp;nbsp;들어갈지&amp;nbsp;판단해&amp;nbsp;정렬 &lt;br /&gt;:&amp;nbsp;[0,&amp;nbsp;1,&amp;nbsp;2,&amp;nbsp;3,&amp;nbsp;4,&amp;nbsp;5,&amp;nbsp;6,&amp;nbsp;7,&amp;nbsp;8,&amp;nbsp;9]&amp;nbsp;위&amp;nbsp;작업을&amp;nbsp;계속&amp;nbsp;반복해&amp;nbsp;모든&amp;nbsp;원소가&amp;nbsp;정렬될때까지&amp;nbsp;반복 &lt;br /&gt;&lt;br /&gt;삽입&amp;nbsp;정렬의&amp;nbsp;시간&amp;nbsp;복잡도는&amp;nbsp;O(N^2)이며,&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;O(N) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;삽입&amp;nbsp;정렬 &lt;br /&gt;arr&amp;nbsp;=&amp;nbsp;[7,&amp;nbsp;5,&amp;nbsp;9,&amp;nbsp;0,&amp;nbsp;3,&amp;nbsp;1,&amp;nbsp;6,&amp;nbsp;2,&amp;nbsp;4,&amp;nbsp;8] &lt;br /&gt;&lt;br /&gt;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;range(1,&amp;nbsp;len(arr)): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;j&amp;nbsp;in&amp;nbsp;range(i,&amp;nbsp;0,&amp;nbsp;-1):&amp;nbsp;#&amp;nbsp;인덱스&amp;nbsp;i부터&amp;nbsp;1까지&amp;nbsp;1씩&amp;nbsp;감소하며&amp;nbsp;반복하는&amp;nbsp;문법 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;arr[j]&amp;nbsp;&amp;lt;&amp;nbsp;arr[j-1]:&amp;nbsp;#&amp;nbsp;한&amp;nbsp;칸씩&amp;nbsp;왼쪽으로&amp;nbsp;이동 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;arr[j],&amp;nbsp;arr[j-1]&amp;nbsp;=&amp;nbsp;arr[j-1],&amp;nbsp;arr[j] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:&amp;nbsp;#&amp;nbsp;자기보다&amp;nbsp;작은&amp;nbsp;데이터&amp;nbsp;만나면&amp;nbsp;그&amp;nbsp;위치에서&amp;nbsp;멈춤 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;print(arr) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;퀵&amp;nbsp;정렬(quick&amp;nbsp;sort) &lt;br /&gt;-&amp;nbsp;기준&amp;nbsp;데이터를&amp;nbsp;설정하고&amp;nbsp;그&amp;nbsp;기준보다&amp;nbsp;큰&amp;nbsp;데이터와&amp;nbsp;작은&amp;nbsp;데이터의&amp;nbsp;위치를&amp;nbsp;바꾸는&amp;nbsp;방법 &lt;br /&gt;-&amp;nbsp;병합&amp;nbsp;정렬과&amp;nbsp;더불어&amp;nbsp;대부분의&amp;nbsp;프로그래밍&amp;nbsp;언어의&amp;nbsp;정렬&amp;nbsp;라이브러리의&amp;nbsp;근간이&amp;nbsp;되는&amp;nbsp;알고리즘 &lt;br /&gt;-&amp;nbsp;가장&amp;nbsp;기본적인&amp;nbsp;퀵&amp;nbsp;정렬은&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;데이터를&amp;nbsp;기준&amp;nbsp;데이터(pivot)로&amp;nbsp;설정 &lt;br /&gt;&lt;br /&gt;:&amp;nbsp;[5,&amp;nbsp;7,&amp;nbsp;9,&amp;nbsp;0,&amp;nbsp;3,&amp;nbsp;1,&amp;nbsp;6,&amp;nbsp;2,&amp;nbsp;4,&amp;nbsp;8]&amp;nbsp;현재&amp;nbsp;pivot&amp;nbsp;값은&amp;nbsp;5이라고&amp;nbsp;가정하고,&amp;nbsp;왼쪽부터&amp;nbsp;5보다&amp;nbsp;큰&amp;nbsp;데이터를&amp;nbsp;선택하므로&amp;nbsp;7이&amp;nbsp;선택되고&amp;nbsp;오른쪽부터&amp;nbsp;5보다&amp;nbsp;작은&amp;nbsp;데이터를&amp;nbsp;선택하므로&amp;nbsp;4가&amp;nbsp;선택되고&amp;nbsp;위치를&amp;nbsp;바꿈 &lt;br /&gt;:&amp;nbsp;[5,&amp;nbsp;4,&amp;nbsp;9,&amp;nbsp;0,&amp;nbsp;3,&amp;nbsp;1,&amp;nbsp;6,&amp;nbsp;2,&amp;nbsp;7,&amp;nbsp;8]&amp;nbsp;마찬가지로&amp;nbsp;pivot이&amp;nbsp;5이므로&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; &lt;br /&gt;:&amp;nbsp;[5,&amp;nbsp;4,&amp;nbsp;2,&amp;nbsp;0,&amp;nbsp;3,&amp;nbsp;1,&amp;nbsp;6,&amp;nbsp;9,&amp;nbsp;7,&amp;nbsp;8]&amp;nbsp;현재&amp;nbsp;pivot&amp;nbsp;값이&amp;nbsp;5이므로&amp;nbsp;왼쪽부터&amp;nbsp;큰&amp;nbsp;값인&amp;nbsp;6이&amp;nbsp;선택되고&amp;nbsp;오른쪽에서는&amp;nbsp;작은값이&amp;nbsp;1이&amp;nbsp;선택되는데,&amp;nbsp;이처럼&amp;nbsp;위치가&amp;nbsp;엇갈리는&amp;nbsp;경우&amp;nbsp;pivot과&amp;nbsp;작은&amp;nbsp;데이터의&amp;nbsp;위치를&amp;nbsp;서로&amp;nbsp;변경 &lt;br /&gt;:&amp;nbsp;[1,&amp;nbsp;4,&amp;nbsp;2,&amp;nbsp;0,&amp;nbsp;3,&amp;nbsp;5,&amp;nbsp;6,&amp;nbsp;9,&amp;nbsp;7,&amp;nbsp;8]&amp;nbsp;이제&amp;nbsp;5의&amp;nbsp;왼쪽에&amp;nbsp;있는&amp;nbsp;데이터는&amp;nbsp;모두&amp;nbsp;5보다&amp;nbsp;작고,&amp;nbsp;왼쪽에&amp;nbsp;있는&amp;nbsp;데이터는&amp;nbsp;5보다&amp;nbsp;크다는&amp;nbsp;특징이&amp;nbsp;생기는데,&amp;nbsp;데이터&amp;nbsp;묶음을&amp;nbsp;나누는&amp;nbsp;작업을&amp;nbsp;분할(divide)라고&amp;nbsp;한다. &lt;br /&gt;:&amp;nbsp;[1,&amp;nbsp;4,&amp;nbsp;2,&amp;nbsp;0,&amp;nbsp;3,&amp;nbsp;5,&amp;nbsp;6,&amp;nbsp;9,&amp;nbsp;7,&amp;nbsp;8]&amp;nbsp;5를&amp;nbsp;기준으로&amp;nbsp;나눠진&amp;nbsp;부분을&amp;nbsp;정렬을&amp;nbsp;마찬가지로&amp;nbsp;계속&amp;nbsp;수행해준다. &lt;br /&gt;:&amp;nbsp;[1,&amp;nbsp;0,&amp;nbsp;2,&amp;nbsp;4,&amp;nbsp;3,&amp;nbsp;5,&amp;nbsp;6,&amp;nbsp;9,&amp;nbsp;7,&amp;nbsp;8]&amp;nbsp;계속&amp;nbsp;재귀적으로&amp;nbsp;정렬해주면&amp;nbsp;정렬이&amp;nbsp;완료&amp;nbsp;될것이다. &lt;br /&gt;&lt;br /&gt;이상적인&amp;nbsp;경우&amp;nbsp;분할이&amp;nbsp;절반씩&amp;nbsp;일어난다면&amp;nbsp;전체연산&amp;nbsp;횟수로&amp;nbsp;O(NlogN)을&amp;nbsp;기대&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;최악은&amp;nbsp;O(N^2) &lt;br /&gt;너비&amp;nbsp;x&amp;nbsp;높이&amp;nbsp;=&amp;nbsp;N&amp;nbsp;*&amp;nbsp;logN&amp;nbsp;=&amp;nbsp;NlogN &lt;br /&gt;&lt;br /&gt;삽입&amp;nbsp;정렬의&amp;nbsp;시간&amp;nbsp;복잡도는&amp;nbsp;O(N^2)이며,&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;O(N) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;arr&amp;nbsp;=&amp;nbsp;[5,&amp;nbsp;7,&amp;nbsp;9,&amp;nbsp;0,&amp;nbsp;3,&amp;nbsp;1,&amp;nbsp;6,&amp;nbsp;2,&amp;nbsp;4,&amp;nbsp;8] &lt;br /&gt;&lt;br /&gt;def&amp;nbsp;quick_sort(arr,&amp;nbsp;start,&amp;nbsp;end): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;start&amp;nbsp;&amp;gt;=&amp;nbsp;end:&amp;nbsp;#&amp;nbsp;원소가&amp;nbsp;1개인&amp;nbsp;경우&amp;nbsp;종료 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pivot&amp;nbsp;=&amp;nbsp;start&amp;nbsp;#&amp;nbsp;pivot은&amp;nbsp;첫&amp;nbsp;번재&amp;nbsp;원소 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;left&amp;nbsp;=&amp;nbsp;start&amp;nbsp;+&amp;nbsp;1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;right&amp;nbsp;=&amp;nbsp;end &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(left&amp;nbsp;&amp;lt;=&amp;nbsp;right): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;pivot보다&amp;nbsp;큰&amp;nbsp;데이터를&amp;nbsp;찾을&amp;nbsp;때까지&amp;nbsp;반복 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(left&amp;nbsp;&amp;lt;=&amp;nbsp;end&amp;nbsp;and&amp;nbsp;arr[left]&amp;nbsp;&amp;lt;=&amp;nbsp;arr[pivot]): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;left&amp;nbsp;+=&amp;nbsp;1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;pivot보다&amp;nbsp;작은&amp;nbsp;데이터를&amp;nbsp;찾을&amp;nbsp;때까지&amp;nbsp;반복 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(right&amp;nbsp;&amp;gt;&amp;nbsp;start&amp;nbsp;and&amp;nbsp;arr[right]&amp;nbsp;&amp;gt;=&amp;nbsp;arr[pivot]): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;right&amp;nbsp;-=&amp;nbsp;1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(left&amp;nbsp;&amp;gt;&amp;nbsp;right):&amp;nbsp;#&amp;nbsp;왼쪽에서&amp;nbsp;작은&amp;nbsp;데이터랑&amp;nbsp;오른쪽에서&amp;nbsp;큰&amp;nbsp;데이터가&amp;nbsp;엇갈렸다면&amp;nbsp;pivot&amp;nbsp;교체 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;arr[right],&amp;nbsp;arr[pivot]&amp;nbsp;=&amp;nbsp;arr[pivot],&amp;nbsp;arr[right] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:&amp;nbsp;#&amp;nbsp;엇갈리지&amp;nbsp;않았다면&amp;nbsp;작은&amp;nbsp;데이터와&amp;nbsp;큰&amp;nbsp;데이터&amp;nbsp;교체 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;arr[left],&amp;nbsp;arr[right]&amp;nbsp;=&amp;nbsp;arr[right],&amp;nbsp;arr[left] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&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;수행 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;quick_sort(arr,&amp;nbsp;start,&amp;nbsp;right-1) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;quick_sort(arr,&amp;nbsp;right&amp;nbsp;+&amp;nbsp;1,&amp;nbsp;end) &lt;br /&gt;quick_sort(arr,&amp;nbsp;0,&amp;nbsp;len(arr)-1) &lt;br /&gt;print(arr) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;#&amp;nbsp;파이썬&amp;nbsp;장점&amp;nbsp;살린&amp;nbsp;버전 &lt;br /&gt;arr&amp;nbsp;=&amp;nbsp;[5,&amp;nbsp;7,&amp;nbsp;9,&amp;nbsp;0,&amp;nbsp;3,&amp;nbsp;1,&amp;nbsp;6,&amp;nbsp;2,&amp;nbsp;4,&amp;nbsp;8] &lt;br /&gt;&lt;br /&gt;def&amp;nbsp;quick_sort_1(arr): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;list&amp;nbsp;하나&amp;nbsp;이하의&amp;nbsp;원소만을&amp;nbsp;담고&amp;nbsp;있다면&amp;nbsp;종료 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(arr)&amp;nbsp;&amp;lt;=&amp;nbsp;1: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;arr &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pivot&amp;nbsp;=&amp;nbsp;arr[0]&amp;nbsp;#&amp;nbsp;pivot은&amp;nbsp;첫&amp;nbsp;번재&amp;nbsp;원소 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tail&amp;nbsp;=&amp;nbsp;arr[1:]&amp;nbsp;#&amp;nbsp;피벗을&amp;nbsp;제외한&amp;nbsp;리스트 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;left_side&amp;nbsp;=&amp;nbsp;[x&amp;nbsp;for&amp;nbsp;x&amp;nbsp;in&amp;nbsp;tail&amp;nbsp;if&amp;nbsp;x&amp;nbsp;&amp;lt;=&amp;nbsp;pivot]&amp;nbsp;#&amp;nbsp;분할된&amp;nbsp;왼쪽&amp;nbsp;부분 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;right_side&amp;nbsp;=&amp;nbsp;[x&amp;nbsp;for&amp;nbsp;x&amp;nbsp;in&amp;nbsp;tail&amp;nbsp;if&amp;nbsp;x&amp;nbsp;&amp;gt;&amp;nbsp;pivot]&amp;nbsp;#&amp;nbsp;분할된&amp;nbsp;오른쪽&amp;nbsp;부분 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&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;반환 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;quick_sort_1(left_side)&amp;nbsp;+&amp;nbsp;[pivot]&amp;nbsp;+&amp;nbsp;quick_sort_1(right_side) &lt;br /&gt;print(quick_sort_1(arr))&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; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4.&amp;nbsp;&amp;nbsp;계수&amp;nbsp;정렬(counting&amp;nbsp;sort) &lt;br /&gt;-&amp;nbsp;특정한&amp;nbsp;조건이&amp;nbsp;부합할&amp;nbsp;때만&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있지만&amp;nbsp;매우&amp;nbsp;빠르게&amp;nbsp;동작하는&amp;nbsp;정렬&amp;nbsp;알고리즘 &lt;br /&gt;-&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;가능 &lt;br /&gt;-&amp;nbsp;데이터의&amp;nbsp;개수가&amp;nbsp;N,&amp;nbsp;데이터(양수)&amp;nbsp;중&amp;nbsp;최대값이&amp;nbsp;K&amp;nbsp;일&amp;nbsp;때&amp;nbsp;최악의&amp;nbsp;경우에도&amp;nbsp;수행&amp;nbsp;시간&amp;nbsp;O(N+K)를&amp;nbsp;보장 &lt;br /&gt;&lt;br /&gt;:&amp;nbsp;[7,&amp;nbsp;5,&amp;nbsp;9,&amp;nbsp;0,&amp;nbsp;3,&amp;nbsp;1,&amp;nbsp;6,&amp;nbsp;2,&amp;nbsp;9,&amp;nbsp;1,&amp;nbsp;4,&amp;nbsp;8,&amp;nbsp;5,&amp;nbsp;2]&amp;nbsp;0&amp;nbsp;~&amp;nbsp;9&amp;nbsp;까지&amp;nbsp;테이블&amp;nbsp;표로&amp;nbsp;만들어놓고&amp;nbsp;각각&amp;nbsp;count&amp;nbsp;table를&amp;nbsp;계산한다 &lt;br /&gt;:&amp;nbsp;[0,&amp;nbsp;1,&amp;nbsp;2,&amp;nbsp;3,&amp;nbsp;4,&amp;nbsp;5,&amp;nbsp;6,&amp;nbsp;7,&amp;nbsp;8,&amp;nbsp;9]&amp;nbsp;[2,&amp;nbsp;2,&amp;nbsp;2,&amp;nbsp;1,&amp;nbsp;1&amp;nbsp;,2,&amp;nbsp;1,&amp;nbsp;1,&amp;nbsp;1,&amp;nbsp;2]&amp;nbsp;&amp;nbsp;&amp;nbsp;인덱스/&amp;nbsp;개수&amp;nbsp;&amp;nbsp;이렇게&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;index&amp;nbsp;접근하는건&amp;nbsp;O(N)&amp;nbsp;이라고&amp;nbsp;가정할때 &lt;br /&gt;:&amp;nbsp;[0,&amp;nbsp;0,&amp;nbsp;1,&amp;nbsp;1,&amp;nbsp;2,&amp;nbsp;2,&amp;nbsp;3,&amp;nbsp;4,&amp;nbsp;5,&amp;nbsp;5,&amp;nbsp;6,&amp;nbsp;7,&amp;nbsp;8,&amp;nbsp;9,&amp;nbsp;9]&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;출력 &lt;br /&gt;&lt;br /&gt;계수&amp;nbsp;정렬의&amp;nbsp;시간&amp;nbsp;복잡도와&amp;nbsp;공간&amp;nbsp;복잡도는&amp;nbsp;모두&amp;nbsp;O(N+K)이다 &lt;br /&gt;때에&amp;nbsp;따라서&amp;nbsp;비효율성을&amp;nbsp;초래할&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;ex)&amp;nbsp;0,&amp;nbsp;999999&amp;nbsp;&amp;nbsp;2개만&amp;nbsp;존재하는&amp;nbsp;경우&amp;nbsp;데이터&amp;nbsp;범위가&amp;nbsp;너무&amp;nbsp;크다.. &lt;br /&gt;동일한&amp;nbsp;값을&amp;nbsp;가지는&amp;nbsp;데이터가&amp;nbsp;여러&amp;nbsp;개&amp;nbsp;등장할&amp;nbsp;때&amp;nbsp;효율적으로&amp;nbsp;사용 &lt;br /&gt;&lt;br /&gt;#&amp;nbsp;모든&amp;nbsp;원소의&amp;nbsp;값이&amp;nbsp;0보다&amp;nbsp;크거나&amp;nbsp;같다고&amp;nbsp;가정 &lt;br /&gt;arr&amp;nbsp;=&amp;nbsp;[7,&amp;nbsp;5,&amp;nbsp;9,&amp;nbsp;0,&amp;nbsp;3,&amp;nbsp;1,&amp;nbsp;6,&amp;nbsp;2,&amp;nbsp;9,&amp;nbsp;1,&amp;nbsp;4,&amp;nbsp;8,&amp;nbsp;5,&amp;nbsp;2] &lt;br /&gt;#&amp;nbsp;모든&amp;nbsp;범위를&amp;nbsp;포함하는&amp;nbsp;리스트&amp;nbsp;선언 &lt;br /&gt;count&amp;nbsp;=&amp;nbsp;[0]&amp;nbsp;*&amp;nbsp;(max(arr)&amp;nbsp;+&amp;nbsp;1) &lt;br /&gt;&lt;br /&gt;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;range(len(arr)): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count[arr[i]]&amp;nbsp;+=&amp;nbsp;1&amp;nbsp;#&amp;nbsp;각&amp;nbsp;데이터에&amp;nbsp;해당하는&amp;nbsp;인덱스의&amp;nbsp;값&amp;nbsp;증가 &lt;br /&gt;&lt;br /&gt;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;range(len(count)):&amp;nbsp;#&amp;nbsp;리스트에&amp;nbsp;기록된&amp;nbsp;정렬&amp;nbsp;정보&amp;nbsp;확인 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;j&amp;nbsp;in&amp;nbsp;range(count[i]): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(i,&amp;nbsp;end&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;p&gt;위 내용들은 이코테 youtube 및 책을 참고하였습니다&lt;/p&gt;
&lt;p&gt;이코테&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=KGyK-pNvWos&quot;&gt;링크&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;책&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://book.naver.com/bookdb/book_detail.nhn?bid=16439154&quot;&gt;링크&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>02. Study/Algorithm</category>
      <category>counting sort</category>
      <category>Insertion Sort</category>
      <category>python sort algorithm</category>
      <category>Quick Sort</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/158</guid>
      <comments>https://boysboy3.tistory.com/158#entry158comment</comments>
      <pubDate>Sun, 11 Oct 2020 01:12:48 +0900</pubDate>
    </item>
    <item>
      <title>DFS / BFS</title>
      <link>https://boysboy3.tistory.com/157</link>
      <description>&lt;p&gt;그래프 탐색 알고리즘 : DFS / BFS&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;탐색(search)이란 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정을 말합니다.&lt;/p&gt;
&lt;p&gt;대표적인 그래프 탐색 알고리즘으로는 DFS와 BFS가 있습니다.&lt;/p&gt;
&lt;p&gt;DFS / BFS는 코딩 테스트에서 매우 자주 등장하는 유형이므로 반드시 숙지해야 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;DFS 와 BFS 알고리즘을 알아보기 전에 반드시 숙지해야할 두가지 자료구조와 재귀 함수가 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1. 스택(stack) 자료구조&lt;/p&gt;
&lt;p&gt;- 먼저 들어온 데이터가 나중에 나가는 형식(선입후출)의 자료구조입니다.&lt;/p&gt;
&lt;p&gt;- 간단하게 삽입(insert), 삭제(delete) 연산이 있는데 삽입하면 제일 끝에 쌓이고, 삭제하면 제일 뒤에 있는 데이터부터 삭제된다.&lt;/p&gt;
&lt;p&gt;python으로는 간단하게 리스트를 이용하면 된다.&lt;/p&gt;
&lt;p&gt;stack = []&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;stack.append(5) # 삽입 5 -&amp;gt; [5]&lt;/p&gt;
&lt;p&gt;stack.append(3) # 삽입 3 -&amp;gt; [5,3]&lt;/p&gt;
&lt;p&gt;stack.pop() # 삭제 -&amp;gt; [5]&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2. 큐(queue) 자료구조&lt;/p&gt;
&lt;p&gt;- 먼저 들어 온 데이터가 먼저 나가는 형식(선입선출)의 자료구조입니다.&lt;/p&gt;
&lt;p&gt;- 큐도 마찬가지로 삽입(insert), 삭제(delete) 연산이 있는데 삽입하면 제일 끝에 쌓이고, 삭제하면 제일 앞에 있는 데이터부터 삭제된다.&lt;/p&gt;
&lt;p&gt;python으로 간단하게 리스트를 이용해도 되고, deque를 이용해도 된다.&lt;/p&gt;
&lt;p&gt;하지만 비용적으로 deque를 이용하는게 시간복잡도적으로 빠르기 때문에, deque를 이용&lt;/p&gt;
&lt;p&gt;q = []&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;q.append(5) # 삽입 5 -&amp;gt; [5]&lt;/p&gt;
&lt;p&gt;q.append(3) # 삽입 3 -&amp;gt; [5,3]&lt;/p&gt;
&lt;p&gt;q.pop(1) # 삭제 -&amp;gt; [3]&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;from collections import deque&lt;/p&gt;
&lt;p&gt;queue = deque()&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;queue.append(5) # 삽입 5 -&amp;gt; [5]&lt;/p&gt;
&lt;p&gt;queue.append(3) # 삽입 3 -&amp;gt; [5,3]&lt;/p&gt;
&lt;p&gt;queue.append(8) # 삽입 8 -&amp;gt; [5,3,8]&lt;/p&gt;
&lt;p&gt;queue.popleft() # 삭제 -&amp;gt; [3,8]&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3. 재귀 함수(recursive function)란 자기 자신을 다시 호출하는 함수를 의미&lt;/p&gt;
&lt;p&gt;- 재귀 함수는 우리가 실질적으로 bfs dfs를 구현하고자 할때 자주 사용되는 방법중 하나이므로 꼭 이해해야 한다.&lt;/p&gt;
&lt;p&gt;- 재귀 함수를 문제 풀이에서 사용할 때는 재귀 함수의 종료 조건을 반드시 명시해야 한다.&lt;/p&gt;
&lt;p&gt;- 단, 오히려 다른 사람이 이해하기 어려운 형태의 코드가 될 수도 있으므로 신중하게 사용해야 한다.&lt;/p&gt;
&lt;p&gt;ex)&lt;/p&gt;
&lt;p&gt;def recursive_function(i):&lt;/p&gt;
&lt;p&gt;if i == 100:&lt;/p&gt;
&lt;p&gt;return&lt;/p&gt;
&lt;p&gt;print(i, '번째 재귀 함수에서', i+1, '번째 재귀 함수를 호출')&lt;/p&gt;
&lt;p&gt;recursive_function(i+1)&lt;/p&gt;
&lt;p&gt;print(i,'번째 재귀 함수를 종료합니다.')&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;recursive_function(1)&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;이제 본론으로 들어가 DFS(depth-first search)를 알아보자&lt;/p&gt;
&lt;p&gt;- DFS는 깊이 우선 탐색이라고도 부르며 그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘이다&lt;/p&gt;
&lt;p&gt;- DFS는 스택 자료구조(혹은 재귀 함수)를 이용하며, 구체적인 동작 과정은 다음과 같다.&lt;/p&gt;
&lt;p&gt;1. 탐색 시작 노드를 스택에 삽입하고 방문 처리를 한다.&lt;/p&gt;
&lt;p&gt;2. 스택의 최상단 노드에 방문하지 않은 인접한 노드가 하나라도 있으면 그 노드를 스택에 넣고 방문 처리하고 방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼낸다.&lt;/p&gt;
&lt;p&gt;3. 더 이상 2번의 과정을 수행할 수 없을 때까지 반복&lt;/p&gt;
&lt;p&gt;* 만약 그래프 구조를 어떻게 만들고 싶은지 알고 싶다면 참고 (&lt;a href=&quot;https://boysboy3.tistory.com/139?category=859376)&quot;&gt;https://boysboy3.tistory.com/139?category=859376)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;* 어떻게 동작하고 간단한 코드를 어떻게 작성하는지 알고싶다면 참고 (&lt;a href=&quot;https://blog.naver.com/wpghks7/221598474816)&quot;&gt;https://blog.naver.com/wpghks7/221598474816)&lt;/a&gt; - 잘 나와있다..&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;# simple dfs&lt;/p&gt;
&lt;p&gt;def dfs(graph, v, visited):&lt;/p&gt;
&lt;p&gt;# 현재 노드를 방문 처리&lt;/p&gt;
&lt;p&gt;visited[v] = True&lt;/p&gt;
&lt;p&gt;print(v, end=' ')&lt;/p&gt;
&lt;p&gt;# 현재 노드와 연결된 다른 노드를 재귀적으로 방문&lt;/p&gt;
&lt;p&gt;for i in graph[v]:&lt;/p&gt;
&lt;p&gt;if not visited[i]:&lt;/p&gt;
&lt;p&gt;dfs(graph, i, visited)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;# 그래프가 어떻게 표현되어 있는지 구조화 되어있다. 인접 리스트(adjacency list)라고 한다.&lt;/p&gt;
&lt;p&gt;# 예를들면 0번 노드에는 암것도 연결된 노드가 없으니 1번 노드에는 2번,3,8 번 노드가 ... 이런식으로 되어 있는 리스트이다.&lt;/p&gt;
&lt;p&gt;graph = [&lt;/p&gt;
&lt;p&gt;[],&lt;/p&gt;
&lt;p&gt;[2, 3, 8],&lt;/p&gt;
&lt;p&gt;[1, 7],&lt;/p&gt;
&lt;p&gt;[1, 4, 5],&lt;/p&gt;
&lt;p&gt;[3, 5],&lt;/p&gt;
&lt;p&gt;[3, 4],&lt;/p&gt;
&lt;p&gt;[7],&lt;/p&gt;
&lt;p&gt;[2, 6, 8],&lt;/p&gt;
&lt;p&gt;[1, 7]&lt;/p&gt;
&lt;p&gt;]&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;# 각 노드가 방문된 정보를 표현 (1차원 리스트) 8번까지 있지만 0노드는 사용 안하므로 9개의 list로 만든다.&lt;/p&gt;
&lt;p&gt;visited = [False] * 9&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;# DFS 함수 호출 (시작 노드는 1번)&lt;/p&gt;
&lt;p&gt;dfs(graph, 1, visited) # 1,2,7,6,8,3,4,5&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;다음으로 BFS(breadth-first search)를 알아보자&lt;/p&gt;
&lt;p&gt;- BFS는 너비 우선 탐색이라고 부르며, 그래프에서 가까운 노드부터 우선적으로 탐색하는 알고리즘이다.&lt;/p&gt;
&lt;p&gt;- BFS는 큐 자료구조를 이용하며, 다음과 같이 동작한다&lt;/p&gt;
&lt;p&gt;1. 탐색 시작 노드를 큐에 삽입하고 방문 처리를 한다.&lt;/p&gt;
&lt;p&gt;2. 큐에서 노드를 꺼낸 뒤에 해당 노드의 인접 노드 중에서 방문하지 않은 노드를 모두 큐에 삽입 후 방문 처리&lt;/p&gt;
&lt;p&gt;3. 더 이상 2번의 과정을 수행할 수 없을 때까지 반복&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;BFS는 간선의 cost가 동일하다는(1) 가정하에 최단거리 문제를 해결할 수 있다는 점을 기억해야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;# simple bfs&lt;/p&gt;
&lt;p&gt;from collections import deque&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;# BFS method 정의&lt;/p&gt;
&lt;p&gt;def bfs(graph, start, visited):&lt;/p&gt;
&lt;p&gt;# 큐(queue)를 구현하기 위해 deque 라이브러리 사용&lt;/p&gt;
&lt;p&gt;queue = deque([start])&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;# 현재 노드 방문 처리&lt;/p&gt;
&lt;p&gt;visited[start] = True&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;# queue가 빌 때까지 반복&lt;/p&gt;
&lt;p&gt;while queue:&lt;/p&gt;
&lt;p&gt;# 큐에서 하나의 원소 봅아 출력&lt;/p&gt;
&lt;p&gt;v = queue.popleft()&lt;/p&gt;
&lt;p&gt;print(v, end=' ')&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;# 아직 방문하지 않은 인접한 요소들을 큐에 삽입&lt;/p&gt;
&lt;p&gt;for i in graph[v]:&lt;/p&gt;
&lt;p&gt;if not visited[i]:&lt;/p&gt;
&lt;p&gt;if not visited[i]:&lt;/p&gt;
&lt;p&gt;queue.append(i)&lt;/p&gt;
&lt;p&gt;visited[i] = True&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;graph = [&lt;/p&gt;
&lt;p&gt;[],&lt;/p&gt;
&lt;p&gt;[2, 3, 8],&lt;/p&gt;
&lt;p&gt;[1, 7],&lt;/p&gt;
&lt;p&gt;[1, 4, 5],&lt;/p&gt;
&lt;p&gt;[3, 5],&lt;/p&gt;
&lt;p&gt;[3, 4],&lt;/p&gt;
&lt;p&gt;[7],&lt;/p&gt;
&lt;p&gt;[2, 6, 8],&lt;/p&gt;
&lt;p&gt;[1, 7]&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;/p&gt;
&lt;p&gt;visited = [False] * 9&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;# BFS 함수 호출 (시작 노드는 1번)&lt;/p&gt;
&lt;p&gt;bfs(graph, 1, visited) # 1,2,7,6,8,3,4,5&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;a href=&quot;https://github.com/kimtaehyeong/Algorithm/blob/master/solution/ice_eat.py&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;얼음 얼려 먹기&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/kimtaehyeong/Algorithm/blob/master/solution/escape_maze.py&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;미로 탈출&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위 내용들은 이코테 youtube 및 책을 참고하였습니다&lt;/p&gt;
&lt;p&gt;이코테 &lt;a href=&quot;https://www.youtube.com/watch?v=7C9RgOcvkvo&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;책 &lt;a href=&quot;https://book.naver.com/bookdb/book_detail.nhn?bid=16439154&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;&lt;/p&gt;</description>
      <category>02. Study/Algorithm</category>
      <category>BFS</category>
      <category>DFS</category>
      <category>깊이 우선 탐색</category>
      <category>너비 우선 탐색</category>
      <category>삼성 코딩 테스트</category>
      <category>이것이 취업을 위한 코딩 테스트다 with 파이썬</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/157</guid>
      <comments>https://boysboy3.tistory.com/157#entry157comment</comments>
      <pubDate>Fri, 9 Oct 2020 16:37:23 +0900</pubDate>
    </item>
    <item>
      <title>Greedy Algorithm &amp;amp; Implementation</title>
      <link>https://boysboy3.tistory.com/156</link>
      <description>&lt;p&gt;그리디&amp;nbsp;알고리즘&amp;nbsp;(Greedy&amp;nbsp;Algorithm) &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;그리디&amp;nbsp;알고리즘(탐욕법)은&amp;nbsp;현재&amp;nbsp;상황에서&amp;nbsp;지금&amp;nbsp;당장&amp;nbsp;좋은&amp;nbsp;것만&amp;nbsp;고르는&amp;nbsp;방법을&amp;nbsp;의미 &lt;br /&gt;-&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;요구 &lt;br /&gt;-&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;것만&amp;nbsp;고르는&amp;nbsp;방법이&amp;nbsp;최고의&amp;nbsp;방법이&amp;nbsp;아니므로) &lt;br /&gt;&lt;br /&gt;대표적으로&amp;nbsp;동전&amp;nbsp;거스름돈&amp;nbsp;문제가&amp;nbsp;있다. &lt;br /&gt;500원&amp;nbsp;/&amp;nbsp;100원&amp;nbsp;/&amp;nbsp;50원&amp;nbsp;/&amp;nbsp;10원&amp;nbsp;짜리&amp;nbsp;동전이&amp;nbsp;무한히&amp;nbsp;존재하는데&amp;nbsp;손님에게&amp;nbsp;거슬러&amp;nbsp;줘야&amp;nbsp;할&amp;nbsp;돈이&amp;nbsp;N원일&amp;nbsp;때&amp;nbsp;거슬러줘야&amp;nbsp;할&amp;nbsp;동전의&amp;nbsp;최소&amp;nbsp;개수를&amp;nbsp;구하라.&amp;nbsp;단,&amp;nbsp;돈&amp;nbsp;N은&amp;nbsp;항상&amp;nbsp;10의&amp;nbsp;배수이다. &lt;br /&gt;&lt;br /&gt;N이&amp;nbsp;1,280원이라면? &lt;br /&gt;&lt;br /&gt;500&amp;nbsp;-&amp;nbsp;2 &lt;br /&gt;100&amp;nbsp;-&amp;nbsp;2 &lt;br /&gt;50&amp;nbsp;-&amp;nbsp;1 &lt;br /&gt;10&amp;nbsp;-&amp;nbsp;3 &lt;br /&gt;이렇게&amp;nbsp;해서&amp;nbsp;최소&amp;nbsp;동전&amp;nbsp;개수는&amp;nbsp;8개가&amp;nbsp;될&amp;nbsp;것이다. &lt;br /&gt;&lt;br /&gt;이&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;무엇일까? &lt;br /&gt;-&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;때문 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이걸&amp;nbsp;코드로&amp;nbsp;옮기면&amp;nbsp;다음과&amp;nbsp;같다. &lt;br /&gt;간단한&amp;nbsp;문제이므로&amp;nbsp;해설은&amp;nbsp;하지&amp;nbsp;않겠다. &lt;br /&gt;&lt;br /&gt;money&amp;nbsp;=&amp;nbsp;[500,&amp;nbsp;100,&amp;nbsp;50,&amp;nbsp;10] &lt;br /&gt;money_count&amp;nbsp;=&amp;nbsp;0 &lt;br /&gt;&lt;br /&gt;N&amp;nbsp;=&amp;nbsp;int(input()) &lt;br /&gt;&lt;br /&gt;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;money: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;share&amp;nbsp;=&amp;nbsp;N&amp;nbsp;//&amp;nbsp;i&amp;nbsp;&amp;nbsp;#&amp;nbsp;몫&amp;nbsp;-&amp;gt;&amp;gt;&amp;nbsp;해당&amp;nbsp;화폐로&amp;nbsp;거슬러&amp;nbsp;줄&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;동전&amp;nbsp;개수&amp;nbsp;세기 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;remainder&amp;nbsp;=&amp;nbsp;N&amp;nbsp;%&amp;nbsp;i&amp;nbsp;#&amp;nbsp;나머지&amp;nbsp;-&amp;gt;&amp;gt;&amp;nbsp;동전&amp;nbsp;개수&amp;nbsp;나머지&amp;nbsp;금액 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;money_count&amp;nbsp;+=&amp;nbsp;share &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;N&amp;nbsp;=&amp;nbsp;remainder &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;print(money_count) &lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;구현(Implementation) &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;구현이란,&amp;nbsp;머릿속에&amp;nbsp;있는&amp;nbsp;알고리즘을&amp;nbsp;소스코드로&amp;nbsp;바꾸는&amp;nbsp;과정 &lt;br /&gt;-&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;지칭 &lt;br /&gt;-&amp;nbsp;알고리즘은&amp;nbsp;간단한데&amp;nbsp;코드가&amp;nbsp;길어지는&amp;nbsp;문제&amp;nbsp;등등 &lt;br /&gt;-&amp;nbsp;개인적으로&amp;nbsp;삼성&amp;nbsp;코테나&amp;nbsp;다양한&amp;nbsp;구현문제는&amp;nbsp;BFS,&amp;nbsp;DFS&amp;nbsp;등&amp;nbsp;을&amp;nbsp;섞어서&amp;nbsp;복잡하게&amp;nbsp;내는&amp;nbsp;'빡구현'이라고&amp;nbsp;표현하는&amp;nbsp;문제들이&amp;nbsp;자주&amp;nbsp;출제된다. &lt;br /&gt;&lt;br /&gt;그&amp;nbsp;중&amp;nbsp;구현&amp;nbsp;중&amp;nbsp;대표적인&amp;nbsp;문제&amp;nbsp;유형으로&amp;nbsp;시뮬레이션이나&amp;nbsp;완전&amp;nbsp;탐색&amp;nbsp;문제에서는&amp;nbsp;2차원&amp;nbsp;공간에서의&amp;nbsp;방향&amp;nbsp;벡터가&amp;nbsp;자주&amp;nbsp;활용되는데,&amp;nbsp;다음&amp;nbsp;코드가&amp;nbsp;자주&amp;nbsp;활용될&amp;nbsp;것이다. &lt;br /&gt;*&amp;nbsp;시뮬레이션:&amp;nbsp;문제에서&amp;nbsp;제시한&amp;nbsp;알고리즘을&amp;nbsp;한&amp;nbsp;단계씩&amp;nbsp;차례대로&amp;nbsp;직접&amp;nbsp;수행해야&amp;nbsp;하는&amp;nbsp;문제&amp;nbsp;유형 &lt;br /&gt;*&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;유형 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;동&amp;nbsp;서&amp;nbsp;남&amp;nbsp;북 &lt;br /&gt;dx&amp;nbsp;=&amp;nbsp;[0,&amp;nbsp;0,&amp;nbsp;1,&amp;nbsp;-1] &lt;br /&gt;dy&amp;nbsp;=&amp;nbsp;[1,&amp;nbsp;-1,&amp;nbsp;0,&amp;nbsp;0] &lt;br /&gt;&lt;br /&gt;#&amp;nbsp;init&amp;nbsp;position &lt;br /&gt;x,&amp;nbsp;y&amp;nbsp;=&amp;nbsp;2,&amp;nbsp;2 &lt;br /&gt;&lt;br /&gt;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;range(4): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;다음&amp;nbsp;위치 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nx&amp;nbsp;=&amp;nbsp;x&amp;nbsp;+&amp;nbsp;dx[i] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ny&amp;nbsp;=&amp;nbsp;y&amp;nbsp;+&amp;nbsp;dy[i] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(nx,&amp;nbsp;ny)&amp;nbsp;#&amp;nbsp;동&amp;nbsp;서&amp;nbsp;남&amp;nbsp;북&amp;nbsp;순서로&amp;nbsp;탐색하게&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;#&amp;nbsp;result &lt;br /&gt;#&amp;nbsp;2&amp;nbsp;3 &lt;br /&gt;#&amp;nbsp;2&amp;nbsp;1 &lt;br /&gt;#&amp;nbsp;3&amp;nbsp;2 &lt;br /&gt;#&amp;nbsp;1&amp;nbsp;2 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;또한,&amp;nbsp;파이썬으로&amp;nbsp;구현하다보면&amp;nbsp;리스트가&amp;nbsp;1000만&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초라는&amp;nbsp;시간을&amp;nbsp;뒀을때&amp;nbsp;약&amp;nbsp;2000만&amp;nbsp;번의&amp;nbsp;연산을&amp;nbsp;수행한다고&amp;nbsp;가정하고&amp;nbsp;문제를&amp;nbsp;풀면&amp;nbsp;실행&amp;nbsp;시간&amp;nbsp;제한에&amp;nbsp;안정적일&amp;nbsp;것이다. &lt;br /&gt;-&amp;gt;&amp;nbsp;시간&amp;nbsp;제한이&amp;nbsp;1초이고,&amp;nbsp;데이터의&amp;nbsp;개수가&amp;nbsp;100만&amp;nbsp;개라면&amp;nbsp;시간&amp;nbsp;복잡도&amp;nbsp;O(NlogN)&amp;nbsp;이내의&amp;nbsp;알고리즘을&amp;nbsp;이용해서&amp;nbsp;풀어야한다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;대표적인&amp;nbsp;시뮬레이션&amp;nbsp;문제를&amp;nbsp;살펴보자 &lt;br /&gt;&lt;br /&gt;상하좌우&amp;nbsp;문제 &lt;br /&gt;ex)여행가&amp;nbsp;A는&amp;nbsp;N&amp;nbsp;x&amp;nbsp;N&amp;nbsp;크기의&amp;nbsp;정사각형&amp;nbsp;공간&amp;nbsp;위에&amp;nbsp;서&amp;nbsp;있다.&amp;nbsp;이&amp;nbsp;공간은&amp;nbsp;1&amp;nbsp;x&amp;nbsp;1&amp;nbsp;크기의&amp;nbsp;정사각형으로&amp;nbsp;나누어져&amp;nbsp;있다.&amp;nbsp;가장&amp;nbsp;왼쪽&amp;nbsp;위&amp;nbsp;좌표는&amp;nbsp;(1,1)이며,&amp;nbsp;가장&amp;nbsp;오른쪽&amp;nbsp;아래&amp;nbsp;아래&amp;nbsp;좌표는&amp;nbsp;(N,N)에&amp;nbsp;대항한다.&amp;nbsp;여행가&amp;nbsp;A는&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,1)&amp;nbsp;이다. &lt;br /&gt;우리&amp;nbsp;앞에는&amp;nbsp;여행가&amp;nbsp;A가&amp;nbsp;이동할&amp;nbsp;계획이&amp;nbsp;적힌&amp;nbsp;계획서가&amp;nbsp;놓여&amp;nbsp;있다. &lt;br /&gt;L,R,U,D&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;A&amp;nbsp;가&amp;nbsp;최종적으로&amp;nbsp;도착할&amp;nbsp;지점의&amp;nbsp;좌표&amp;nbsp;(X,Y)를&amp;nbsp;구해라 &lt;br /&gt;5&amp;nbsp;(공간의&amp;nbsp;크기&amp;nbsp;N) &lt;br /&gt;R&amp;nbsp;R&amp;nbsp;R&amp;nbsp;U&amp;nbsp;D&amp;nbsp;D&amp;nbsp;(계획서&amp;nbsp;A) &lt;br /&gt;정답&amp;nbsp;:&amp;nbsp;3&amp;nbsp;4 &lt;br /&gt;&lt;br /&gt;N&amp;nbsp;=&amp;nbsp;int(input()) &lt;br /&gt;A&amp;nbsp;=&amp;nbsp;list(input().split('&amp;nbsp;')) &lt;br /&gt;pos&amp;nbsp;=&amp;nbsp;[1,1] &lt;br /&gt;&lt;br /&gt;move_x&amp;nbsp;=&amp;nbsp;[0,0,1,-1] &lt;br /&gt;move_y&amp;nbsp;=&amp;nbsp;[1,-1,0,0] &lt;br /&gt;move_types&amp;nbsp;=&amp;nbsp;['R',&amp;nbsp;'L',&amp;nbsp;'D',&amp;nbsp;'U'] &lt;br /&gt;for&amp;nbsp;move&amp;nbsp;in&amp;nbsp;A:&amp;nbsp;#&amp;nbsp;이동&amp;nbsp;계획&amp;nbsp;하나&amp;nbsp;씩&amp;nbsp;확인 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;range(4): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;move&amp;nbsp;==&amp;nbsp;move_types[i]: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nx&amp;nbsp;=&amp;nbsp;pos[0]&amp;nbsp;+&amp;nbsp;move_x[i] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ny&amp;nbsp;=&amp;nbsp;pos[1]&amp;nbsp;+&amp;nbsp;move_y[i] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;공간을&amp;nbsp;벗어나는&amp;nbsp;경우&amp;nbsp;그&amp;nbsp;해당&amp;nbsp;계획은&amp;nbsp;무시한다 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;nx&amp;nbsp;&amp;lt;&amp;nbsp;1&amp;nbsp;or&amp;nbsp;ny&amp;nbsp;&amp;lt;&amp;nbsp;1&amp;nbsp;or&amp;nbsp;nx&amp;nbsp;&amp;gt;&amp;nbsp;N&amp;nbsp;or&amp;nbsp;ny&amp;nbsp;&amp;gt;&amp;nbsp;N: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;이동&amp;nbsp;수행 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pos[0]&amp;nbsp;=&amp;nbsp;nx &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pos[1]&amp;nbsp;=&amp;nbsp;ny &lt;br /&gt;&lt;br /&gt;print(pos[0],&amp;nbsp;pos[1])&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위 내용들은 이코테 youtube 및 책을 참고하였습니다&lt;/p&gt;
&lt;p&gt;이코테&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=2zjoKjt97vQ&quot;&gt;링크&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;책&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://book.naver.com/bookdb/book_detail.nhn?bid=16439154&quot;&gt;링크&lt;/a&gt;&lt;/p&gt;</description>
      <category>02. Study/Algorithm</category>
      <category>python greedy</category>
      <category>python 구현</category>
      <category>python 알고리즘</category>
      <category>구현</category>
      <category>그리디</category>
      <category>완전탐색</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/156</guid>
      <comments>https://boysboy3.tistory.com/156#entry156comment</comments>
      <pubDate>Wed, 7 Oct 2020 00:18:55 +0900</pubDate>
    </item>
    <item>
      <title>Tensorflow &amp;amp; Keras 버전확인</title>
      <link>https://boysboy3.tistory.com/155</link>
      <description>&lt;p&gt;&lt;a href=&quot;https://docs.floydhub.com/guides/environments/&quot;&gt;https://docs.floydhub.com/guides/environments/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1585838259598&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;List of Available Environments - FloydHub Documentation&quot; data-og-description=&quot;edit Environments Below is the list of Deep Learning environments supported by FloydHub. Any of these can be specified in the floyd run command using the --env option. If no --env is provided, it uses the tensorflow-1.9 image by default, which comes with P&quot; data-og-host=&quot;docs.floydhub.com&quot; data-og-source-url=&quot;https://docs.floydhub.com/guides/environments/&quot; data-og-url=&quot;https://docs.floydhub.com/guides/environments/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.floydhub.com/guides/environments/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.floydhub.com/guides/environments/&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;List of Available Environments - FloydHub Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;edit Environments Below is the list of Deep Learning environments supported by FloydHub. Any of these can be specified in the floyd run command using the --env option. If no --env is provided, it uses the tensorflow-1.9 image by default, which comes with P&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;docs.floydhub.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;위 주소로 들어가면 확인할 수 있고, Docker Image 까지 다운로드 가능하다... 참좋다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;자주쓰는버전을 살펴보면&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;TensorFlow 2.0.0 + Keras 2.3.1 on Python 3.6.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;TensorFlow 1.14.0 + Keras 2.2.5 on Python 3.6.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;TensorFlow 1.11.0 + Keras 2.2.4 on Python 3.6.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>02. Study/Keras</category>
      <category>TensorFlow</category>
      <category>TensorFlow 1.11.0 + Keras 2.2.4 on Python 3.6</category>
      <category>TensorFlow 1.14.0 + Keras 2.2.5 on Python 3.6</category>
      <category>TensorFlow 2.0.0 + Keras 2.3.1 on Python 3.6</category>
      <category>Tensorflow Keras 버전호환</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/155</guid>
      <comments>https://boysboy3.tistory.com/155#entry155comment</comments>
      <pubDate>Thu, 2 Apr 2020 23:40:21 +0900</pubDate>
    </item>
    <item>
      <title>2. Pytorch - Autograd</title>
      <link>https://boysboy3.tistory.com/153</link>
      <description>&lt;p&gt;저번시간에는 Tensor에 대해 알아봤다 궁금하다면? &lt;a href=&quot;https://boysboy3.tistory.com/152?category=897077&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;클릭&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;이번시간에는 딥러닝 라이브러리를 사용하는 이유이자, 딥러닝의 꽃? 이라고 불릴 수 있는(backpropagation?)을 자동으로 해주는 autograd에 대해 알아보자.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Autograd ?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- Tensor의 모든 연산에 대해 자동 미분을 제공하는 패키지이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- 실행-기반-정의 (define-by-run) 프레임워크로, 코드를 어떻게 작성하여 실행하느냐에 따라 역전파(backpropagation)가 정의된다는 것. 만약 backpropagation을 알고싶다면 &lt;a href=&quot;https://evan-moon.github.io/2018/07/19/deep-learning-backpropagation/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;클릭&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- 자동 미분 계산을 위해서 torch.autograd 패키지 안에 있는 Variable을 이용해야 동작이 가능해진다.&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;Variable ?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- autograd.Variable 클래스가 있는데, 이는 Tensor를 wrap 있으며 ,Tensor 기반으로 정의된 거의 대부분의 연산을 지원&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- 계산이 완료된 후,&amp;nbsp; .backward() 함수를 호출하여 gradient를 자동으로 계산할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- autograd.Variable이 넓은 범위로 안에 data, grad, grad_fun로 Variable이 구성되어있는데,&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;data 는 Tensor형태의 데이터가 담기고, grad는 data가 거쳐온 layer에 대한 미분값이 축적되며, grad_fn는 미분 값을&amp;nbsp; &amp;nbsp; &amp;nbsp;계산한 함수에 대한 정보를 담고있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;ex)&lt;/p&gt;
&lt;p&gt;----------------------------------------------------------------------------------&lt;/p&gt;
&lt;p&gt;import torch&lt;/p&gt;
&lt;p&gt;from torch.autograd import Variable&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;a = torch.ones(2,2)&lt;/p&gt;
&lt;p&gt;a = Variable(a, requires_grad=True) # a에 gradient값이 필요하다라는 의미&lt;/p&gt;
&lt;p&gt;print(a) # torch.FloatTensor of size 2x2&lt;/p&gt;
&lt;p&gt;b = a + 2&lt;/p&gt;
&lt;p&gt;c = b**2&lt;/p&gt;
&lt;p&gt;out = c.sum()&lt;/p&gt;
&lt;p&gt;out.backward() # &lt;span style=&quot;color: #333333;&quot;&gt;&amp;part;out/&lt;span style=&quot;color: #333333;&quot;&gt;&amp;part;a이다. 즉,out을 a로 미분해라 라는 의미.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;print(a.data) # 1 1&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# 1 1&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;print(a.grad) # 6 6&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# 6 6&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;print(a.grad_fn) # None a가 직접적으로 수행한 연산은 없기에..&lt;/p&gt;
&lt;p&gt;print(c.grad_fn) # pow backward object&lt;/p&gt;
&lt;p&gt;print(out.grad_fn) # sum backward object&lt;/p&gt;
&lt;p&gt;-------------------------------------------------------------------------------------&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;ex2)&lt;/p&gt;
&lt;p&gt;import torch&lt;/p&gt;
&lt;p&gt;from torch.autograd import Variable&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;x = torch.ones(3)&lt;/p&gt;
&lt;p&gt;x = Variable(x, requires_grad=True)&lt;/p&gt;
&lt;p&gt;y=x**2&lt;/p&gt;
&lt;p&gt;z=y+3&lt;/p&gt;
&lt;p&gt;grad=torch.Tensor([0.1, 1, 10])&lt;/p&gt;
&lt;p&gt;z.backward(grad) # backward안에 값을 넣게되면 크기를 맞춰준다&lt;/p&gt;
&lt;p&gt;print(x.grad) # 그래서 0.600, 6.000, 60.000 이 나오게 된다.&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;reference&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://evan-moon.github.io/2018/07/19/deep-learning-backpropagation/&quot;&gt;https://evan-moon.github.io/2018/07/19/deep-learning-backpropagation/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=E0R9Xf_GyUc&quot;&gt;https://www.youtube.com/watch?v=E0R9Xf_GyUc&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://9bow.github.io/PyTorch-tutorials-kr-0.3.1/beginner/blitz/autograd_tutorial.html#sphx-glr-beginner-blitz-autograd-tutorial-py&quot;&gt;https://9bow.github.io/PyTorch-tutorials-kr-0.3.1/beginner/blitz/autograd_tutorial.html#sphx-glr-beginner-blitz-autograd-tutorial-py&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>02. Study/Pytorch</category>
      <category>pytorch autograd</category>
      <category>pytorch Variable</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/153</guid>
      <comments>https://boysboy3.tistory.com/153#entry153comment</comments>
      <pubDate>Mon, 24 Feb 2020 00:29:12 +0900</pubDate>
    </item>
    <item>
      <title>1. Pytorch - Tensor</title>
      <link>https://boysboy3.tistory.com/152</link>
      <description>&lt;p&gt;다양한 딥러닝 패키지 중, Pytorch를 빠르게 익히고자 정리를 합니다.&lt;/p&gt;
&lt;p&gt;내용은 &lt;a href=&quot;https://9bow.github.io/PyTorch-tutorials-kr-0.3.1/index.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Pytorch tutorial&lt;/a&gt;, &lt;a href=&quot;https://www.youtube.com/watch?v=VKhFeh92eps&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;youtube&lt;/a&gt;를 기반으로 정리하였습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pytorch ?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- torch(lua)에서 pytorch(python)로 넘어오게 되었으며, python 기반의 과학 컴퓨팅 패키징이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- Numpy를 GPU를 통해 가속화해서 빠른 연산이 가능하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- 개인적으로, tf에 비해 코드가 좀 더 직관적인 면이 있다. &lt;s&gt;약간 class로 다 만들어서 그런가..?&amp;nbsp;&lt;/s&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;Tensor ?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- Tensor는 pytorch의 자료 형&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- 단일 데이터 타입으로 된 다차원 행렬이다. (일반적으로 ? 0d scalar, 1d vector, 2d matrix, 3d~nd tensor)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- Tensor는 간단한 명령어 [.cuda()] 를 추가하면 gpu로 연산이 가능&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- 더 많은 pytorch의 tensor종류는 &lt;a href=&quot;https://pytorch.org/docs/stable/tensors.html?highlight=tensor&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;클릭&lt;/a&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;Tensor Use&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;만약 pytorch가 설치가 안되어 있다면 &lt;a href=&quot;https://pytorch.org/get-started/locally/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;클릭&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;import torch&lt;/p&gt;
&lt;p&gt;x = torch.Tensor(3)&lt;/p&gt;
&lt;p&gt;print(x) # 초기화 되지 않은 tensor 생성 [torch.FloatTensor of size 3]&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;x2 = torch.Tensor(3,3)&lt;/p&gt;
&lt;p&gt;print(x2) # [torch.FloatTensor of size 3x3]&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;x3 = torch.rand(3,3)&lt;/p&gt;
&lt;p&gt;print(x3) # rand는 0~1 사이의 uniform distribution random 값으로 선언&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;x4 = torch.randn(3,3)&lt;/p&gt;
&lt;p&gt;print(x4) # randn는 평균이 0, 분산이 1인 normal distribution random 값으로 선언&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;Numpy -&amp;gt; Tensor 변환 및 Tensor -&amp;gt; Numpy 변환&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;# .Tensor() / .numpy()&lt;/p&gt;
&lt;p&gt;import torch&lt;/p&gt;
&lt;p&gt;import numpy as np&lt;/p&gt;
&lt;p&gt;a = np.array([1,2,3,4])&lt;/p&gt;
&lt;p&gt;b = torch.Tensor(a) # numpy array -&amp;gt; tensor convert&lt;/p&gt;
&lt;p&gt;a1 = torch.Tensor(3)&lt;/p&gt;
&lt;p&gt;b1 = a1.numpy() # tensor -&amp;gt; numpy array convert&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;Tensor 형태 변환&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;# .view()&lt;/p&gt;
&lt;p&gt;import torch&lt;/p&gt;
&lt;p&gt;a = torch.rand(3,3) # (3x3 크기의 2차원 tensor생성)&lt;/p&gt;
&lt;p&gt;a = a.view(1,1,3,3)&lt;/p&gt;
&lt;p&gt;print(a) # (1x1x3x3) 형태의 4차원 tensor 생성&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;Tensor 이어 붙이기&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;# .cat()&lt;/p&gt;
&lt;p&gt;import torch&lt;/p&gt;
&lt;p&gt;a = torch.rand(1,1,3,3)&lt;/p&gt;
&lt;p&gt;b = torch.randn(1,1,3,3)&lt;/p&gt;
&lt;p&gt;c = torch.cat((a,b),0) # tensor, axis&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;GPU 계산 (cpu버전말고, gpu버전 깐 사람만 해당)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;# .cuda()&lt;/p&gt;
&lt;p&gt;import torch&lt;/p&gt;
&lt;p&gt;x = torch.rand(3,3)&lt;/p&gt;
&lt;p&gt;y = torch.rand(3,3)&lt;/p&gt;
&lt;p&gt;# torch.cuda.get_device_name(0) # 자신의 그래픽카드가 나온다.&lt;/p&gt;
&lt;p&gt;# print(torch.__version__) # torch 버전확인&amp;nbsp;&lt;/p&gt;
&lt;p&gt;if torch.cuda.is_available():&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; x = x.cuda()&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; y = y.cuda()&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; sum = x + y&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그 외에 다양한 함수는 &lt;a href=&quot;https://pytorch.org/docs/stable/torch.html&quot;&gt;https://pytorch.org/docs/stable/torch.html&lt;/a&gt;&lt;/p&gt;</description>
      <category>02. Study/Pytorch</category>
      <category>pytorch</category>
      <category>pytorch cat</category>
      <category>pytorch gpu</category>
      <category>pytorch tensor</category>
      <category>pytorch tutorial</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/152</guid>
      <comments>https://boysboy3.tistory.com/152#entry152comment</comments>
      <pubDate>Mon, 24 Feb 2020 00:24:57 +0900</pubDate>
    </item>
    <item>
      <title>plt.imshow &amp;amp; cv2.imshow</title>
      <link>https://boysboy3.tistory.com/150</link>
      <description>&lt;p&gt;Python을 이용하여 이미지를 보여주거나 확인할때 가장 많이 사용하는 cv2.imshow와 plt.imshow 함수의 간단한 차이점을 살펴보겠다.&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 alignLeft&quot; data-filename=&quot;90.PNG&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnryjt/btqCbT5bmQT/OhPB805ZcP38FXgtf9J2K1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnryjt/btqCbT5bmQT/OhPB805ZcP38FXgtf9J2K1/img.png&quot; data-alt=&quot;구글 로고 이미지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnryjt/btqCbT5bmQT/OhPB805ZcP38FXgtf9J2K1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcnryjt%2FbtqCbT5bmQT%2FOhPB805ZcP38FXgtf9J2K1%2Fimg.png&quot; data-filename=&quot;90.PNG&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;230&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&gt;필요 라이브러리 import&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;3&quot;&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;cv2&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;matplotlib.pyplot&amp;nbsp;as&amp;nbsp;plt&lt;/p&gt;
&lt;p&gt;&lt;span&gt;from&lt;/span&gt;&amp;nbsp;matplotlib.image&amp;nbsp;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;imread&lt;/p&gt;
&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;&lt;span&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;3&quot;&gt;
&lt;p&gt;&lt;span&gt;#&amp;nbsp;image&amp;nbsp;load&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;mat_img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;image.imread(&lt;span&gt;'90.png'&lt;/span&gt;)&amp;nbsp;&lt;span&gt;#&amp;nbsp;(230,&amp;nbsp;579,&amp;nbsp;4)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;cv_img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.imread(&lt;span&gt;'90.png' ,0&lt;/span&gt;)&amp;nbsp; &amp;nbsp; &lt;span&gt;# (230, 579)&lt;/span&gt;&lt;/p&gt;
&lt;br /&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;&lt;span&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;.png 파일로 저장되어 있기때문에, matplot 에 imread로 읽을시 원본 그대로 읽는것 같다. 그래서 4채널로 들어오게 되는데 만약 cv 함수로 원본 그대로 읽고 싶다면, cv2.imread('90.png', -1) 인자값을 주면 alpha 값까지 읽을것이다. (0:gray, 1: rgb, -1: origin)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;3&quot;&gt;
&lt;p&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;# image show&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;plt.imshow(cv_img)&lt;/p&gt;
&lt;p&gt;cv2.imshow(&lt;span&gt;'gray&amp;nbsp;image'&lt;/span&gt;,&amp;nbsp;cv_img)&lt;/p&gt;
&lt;p&gt;cv2.waitKey(&lt;span&gt;0&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;cv2.destroyAllWindows()&lt;/p&gt;
&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;&lt;span&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;0090.PNG&quot; data-origin-width=&quot;1161&quot; data-origin-height=&quot;233&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjLZWq/btqCaTq0J5E/4v706sTq024Vc4xOzbQQNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjLZWq/btqCaTq0J5E/4v706sTq024Vc4xOzbQQNk/img.png&quot; data-alt=&quot;(plt.imshow / cv2.imshow) [result]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjLZWq/btqCaTq0J5E/4v706sTq024Vc4xOzbQQNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjLZWq%2FbtqCaTq0J5E%2F4v706sTq024Vc4xOzbQQNk%2Fimg.png&quot; data-filename=&quot;0090.PNG&quot; data-origin-width=&quot;1161&quot; data-origin-height=&quot;233&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;(plt.imshow / cv2.imshow) [result]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;gray로 읽었는데 출력을 해보면, cv2.imshow와 plt.imshow 함수 결과가 다를 수 있는데, plt.imshow 함수는 default 값이 color로 출력하게 되어있어서 내부적으로 변환이 이뤄지는것 같은데, cmap(color map)형식 인자값을 &lt;a href=&quot;https://matplotlib.org/3.1.0/tutorials/colors/colormaps.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;다양하게&lt;/a&gt; 변경가능하며, plt.imshow(cv_img, cmap='gray') 으로 변경하면 gray형식으로 출력되는것을 확인할 수 있다. 하지만 내부적으로 color를 조절해서 조금은 다른 결과가 나올 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;aab.png&quot; data-origin-width=&quot;375&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnb6x4/btqCbgfgR06/BL2SLurw3NgOMlnEKm1KxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnb6x4/btqCbgfgR06/BL2SLurw3NgOMlnEKm1KxK/img.png&quot; data-alt=&quot;plt.imshow(cv_img, cmap=&amp;amp;#39;gray&amp;amp;#39;)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnb6x4/btqCbgfgR06/BL2SLurw3NgOMlnEKm1KxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcnb6x4%2FbtqCbgfgR06%2FBL2SLurw3NgOMlnEKm1KxK%2Fimg.png&quot; data-filename=&quot;aab.png&quot; data-origin-width=&quot;375&quot; data-origin-height=&quot;168&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;plt.imshow(cv_img, cmap='gray')&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;tip.. 출력은 plt.imshow로 여러장을 한번에 출력하는게 편해서 좋지만, 원본 타입을 보고싶다면 cv2.imshow 함수를 이용하고 read는 cv2로 읽는게 훨씬 빠르다 애용하자 ~_~&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;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;3&quot;&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;cv2&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;matplotlib.pyplot&amp;nbsp;as&amp;nbsp;plt&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;matplotlib.image&amp;nbsp;as&amp;nbsp;image&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;#&amp;nbsp;image&amp;nbsp;load&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;mat_img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;image.imread(&lt;span&gt;'90.png'&lt;/span&gt;)&amp;nbsp;&lt;span&gt;#&amp;nbsp;(230,&amp;nbsp;579,&amp;nbsp;4)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;cv_img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.imread(&lt;span&gt;'90.png'&lt;/span&gt;,&amp;nbsp;&lt;span&gt;0&lt;/span&gt;)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;#&amp;nbsp;(230,579,&amp;nbsp;4)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;#&amp;nbsp;image&amp;nbsp;show&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;plt.imshow(cv_img,&amp;nbsp;cmap&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'gray'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;cv2.imshow(&lt;span&gt;'gray&amp;nbsp;image'&lt;/span&gt;,&amp;nbsp;cv_img)&lt;/p&gt;
&lt;p&gt;cv2.waitKey(&lt;span&gt;0&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;cv2.destroyAllWindows()&lt;/p&gt;
&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;&lt;span&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;ref : &lt;a href=&quot;https://matplotlib.org/3.1.1/contents.html&quot;&gt;https://matplotlib.org/3.1.1/contents.html&lt;/a&gt;&lt;/p&gt;</description>
      <category>02. Study/Computer Vision(openframworks&amp;amp;opencv)</category>
      <category>cv2.imshow()</category>
      <category>plt.imshow()</category>
      <category>python 이미지 출력</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/150</guid>
      <comments>https://boysboy3.tistory.com/150#entry150comment</comments>
      <pubDate>Sat, 22 Feb 2020 01:46:39 +0900</pubDate>
    </item>
    <item>
      <title>Custom Dataset으로 Retinanet 학습하기</title>
      <link>https://boysboy3.tistory.com/149</link>
      <description>&lt;p&gt;&lt;a href=&quot;https://github.com/fizyr/keras-retinanet&quot;&gt;https://github.com/fizyr/keras-retinanet&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1581428439846&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;object&quot; data-og-title=&quot;fizyr/keras-retinanet&quot; data-og-description=&quot;Keras implementation of RetinaNet object detection. - fizyr/keras-retinanet&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/fizyr/keras-retinanet&quot; data-og-url=&quot;https://github.com/fizyr/keras-retinanet&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bZ7qbe/hyEUaBCbti/yca1Ipkpi72ZH554yPtjr0/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400&quot;&gt;&lt;a href=&quot;https://github.com/fizyr/keras-retinanet&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/fizyr/keras-retinanet&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bZ7qbe/hyEUaBCbti/yca1Ipkpi72ZH554yPtjr0/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;fizyr/keras-retinanet&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Keras implementation of RetinaNet object detection. - fizyr/keras-retinanet&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;위 깃허브를 참고하였으며, Window10 / Anaconda 환경을 이용하였으며 cuda 9버전 기준이다. 또한 우분투환경에서도 잘 동작한다. ~_~&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;0. 만약 Anaconda 환경이 안깔려있으면 &lt;a href=&quot;https://boysboy3.tistory.com/83?category=732327&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;클릭&lt;/a&gt;, gpu버전을 셋팅한다. (제 그래픽 카드는 1080ti로 테스트 하였다)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1. &lt;a href=&quot;https://github.com/fizyr/keras-retinanet&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Github&lt;/a&gt;에 들어가서 코드를 다운받는다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2. anaconda 명령 프롬프트를 열어 가상화를 만들어준다. ex) conda create -n retinanet python=3.6&amp;nbsp; &amp;nbsp;-&amp;gt; conda activate retinanet&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3. keras-retinanet-master 프로젝트 파일로 이동 후 ex) cd C:\Users\mekai\Project\keras-retinanet-master&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;b&gt;python setup.py install&lt;/b&gt; 명령어를 통해 설치한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;4. tf1.14 및 keras 2.24 버전 설치 ex) &lt;b&gt;conda install tensorflow-gpu=1.14 / conda install keras=2.2.4&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;span style=&quot;color: #333333;&quot;&gt;5. 위까지 설치가 잘 완료되었으면, 학습용 데이터셋을 만들어야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;총 2가지 (Annotation format, Class Mapping format) 파일이 필요한데 둘 다 확장자는 .csv 파일이다. 기본적인 학습용으로 만들어보기에, 자동차(아반떼, k3)를 검출을 해보자.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;9099.PNG&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;528&quot; width=&quot;408&quot; height=&quot;269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCxyls/btqBW0o5bJz/Sz02yfmZvQ4c8qKHynRGc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCxyls/btqBW0o5bJz/Sz02yfmZvQ4c8qKHynRGc1/img.png&quot; data-alt=&quot;fig1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCxyls/btqBW0o5bJz/Sz02yfmZvQ4c8qKHynRGc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCxyls%2FbtqBW0o5bJz%2FSz02yfmZvQ4c8qKHynRGc1%2Fimg.png&quot; data-filename=&quot;9099.PNG&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;528&quot; width=&quot;408&quot; height=&quot;269&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;fig1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Annotation format은 &lt;/span&gt;fig1 처럼 각 이미지의 경로와 x1,y1,x2,y2가 필요하며, 전체적으로는&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Annotation&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;format 형식 :&lt;b&gt; (img path, x1, y1, x2, y2, class_name)&lt;/b&gt; 으로 csv가 저장되어야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;99.PNG&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IfnXB/btqBSPDdeuL/QSyljYyLuB2H0GFK6X2Vy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IfnXB/btqBSPDdeuL/QSyljYyLuB2H0GFK6X2Vy0/img.png&quot; data-alt=&quot;annotation.csv&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IfnXB/btqBSPDdeuL/QSyljYyLuB2H0GFK6X2Vy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIfnXB%2FbtqBSPDdeuL%2FQSyljYyLuB2H0GFK6X2Vy0%2Fimg.png&quot; data-filename=&quot;99.PNG&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;116&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;annotation.csv&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Classmapping format은 annotation에 class_name을 숫자로 mapping 시켜준 csv 파일이다.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Classmapping&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;format 형식 : &lt;/span&gt;&lt;b&gt;(class_name, number)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;099.PNG&quot; data-origin-width=&quot;149&quot; data-origin-height=&quot;70&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m46ve/btqBSN6txG2/3k66khxBopxwZkKHl1kp50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m46ve/btqBSN6txG2/3k66khxBopxwZkKHl1kp50/img.png&quot; data-alt=&quot;classmapping.csv&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m46ve/btqBSN6txG2/3k66khxBopxwZkKHl1kp50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm46ve%2FbtqBSN6txG2%2F3k66khxBopxwZkKHl1kp50%2Fimg.png&quot; data-filename=&quot;099.PNG&quot; data-origin-width=&quot;149&quot; data-origin-height=&quot;70&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;classmapping.csv&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;6. 이제 학습을 해보자!&lt;/p&gt;
&lt;p&gt;train_data 폴더를 하나 만들어서 그 안에, data(.jpg/.png) 및 (annotation,classmapping).csv 파일을 넣어뒀다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;python&amp;nbsp;keras_retinanet/bin/train.py&amp;nbsp;--gpu=0&amp;nbsp;--epochs=10&amp;nbsp;--steps=1000&amp;nbsp;--workers=0&amp;nbsp;csv&amp;nbsp;train_data/annotation.csv&amp;nbsp;train_data/classmapping.csv&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;위 명령어를 입력하면 학습이 진행된다.&lt;/p&gt;
&lt;p&gt;혹시나 ModuleNotFoundError:&amp;nbsp;No&amp;nbsp;module&amp;nbsp;named&amp;nbsp;'keras_retinanet.utils.compute_overlap' 라는 오류가 발생한다면, &lt;b&gt;python setup.py build_ext --inplace&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;명령어를 통해 해결할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;7. 테스트 및 평가&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;테스트및 평가를 위해서는 학습된 모델을 convert해서 inference model로 바꿔줘야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;python keras_retinanet/bin/convert_model.py ../snapshots/resnet50_csv_02.h5 ../snapshots/resnet50_csv_10_infer.h5&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;마지막으로 저장된 모델을 불러서 &lt;a href=&quot;https://github.com/fizyr/keras-retinanet/blob/master/examples/ResNet50RetinaNet.ipynb&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;평가&lt;/a&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;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;혹여나... 라벨툴을 알아보고 싶으면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://lionbridge.ai/articles/image-annotation-tools-for-computer-vision/&quot;&gt;클릭&lt;/a&gt;&lt;/p&gt;</description>
      <category>02. Study/Keras</category>
      <category>custom dataset object detection</category>
      <category>custom dataset retinanet</category>
      <category>keras retinanet</category>
      <category>나만의 데이터로 retinanet 학습</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/149</guid>
      <comments>https://boysboy3.tistory.com/149#entry149comment</comments>
      <pubDate>Wed, 12 Feb 2020 00:08:05 +0900</pubDate>
    </item>
    <item>
      <title>python으로 시작하는 OpenCV (3)</title>
      <link>https://boysboy3.tistory.com/148</link>
      <description>&lt;p&gt;저번에 이에서 필터를 계속해서 알아보자.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;sobel fileter&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;sobel filter는 3*3 이미지 필터를 사용하여 중심을 기준으로 각 방향의 앞뒤의 값을 비교해 변화량을 검출하는 알고리즘인데, 이미지 경사도의 계산방법이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;예제를 통해 한번 알아보자.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;3&quot;&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;cv2&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;numpy&amp;nbsp;as&amp;nbsp;np&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;matplotlib.pyplot&amp;nbsp;as&amp;nbsp;plt&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;origin_img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.imread(&lt;span&gt;'image.jpg'&lt;/span&gt;,&amp;nbsp;&lt;span&gt;0&lt;/span&gt;)&amp;nbsp;&lt;span&gt;#&amp;nbsp;gray&amp;nbsp;scale&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;#&amp;nbsp;Sobel&amp;nbsp;filter&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;dx&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.Sobel(origin_img,&amp;nbsp;cv2.CV_32F,&amp;nbsp;&lt;span&gt;1&lt;/span&gt;,&amp;nbsp;&lt;span&gt;0&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;dy&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.Sobel(origin_img,&amp;nbsp;cv2.CV_32F,&amp;nbsp;&lt;span&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span&gt;1&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;#visualization&lt;/p&gt;
&lt;p&gt;plt.figure(figsize&lt;span&gt;=&lt;/span&gt;(&lt;span&gt;8&lt;/span&gt;,&lt;span&gt;3&lt;/span&gt;))&lt;/p&gt;
&lt;p&gt;plt.subplot(&lt;span&gt;131&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.axis(&lt;span&gt;'off'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.title(&lt;span&gt;'origin_img'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.imshow(origin_img,&amp;nbsp;cmap&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'gray'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.subplot(&lt;span&gt;132&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.axis(&lt;span&gt;'off'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.imshow(dx,&amp;nbsp;cmap&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'gray'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.title(r&lt;span&gt;'$\frac{dI}{dx}$'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.subplot(&lt;span&gt;133&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.axis(&lt;span&gt;'off'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.title(r&lt;span&gt;'$\frac{dI}{dy}$'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.imshow(dy,&amp;nbsp;cmap&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'gray'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.tight_layout()&lt;/p&gt;
&lt;p&gt;plt.show()&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;&lt;span&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;위 코드의 결과를 보면 아래와 같은 결과가 나온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;a.png&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbZ29I/btqBNMYI0iq/LEee5wQyJo6VKdT4rlMcvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbZ29I/btqBNMYI0iq/LEee5wQyJo6VKdT4rlMcvK/img.png&quot; data-alt=&quot;sobel filter result&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbZ29I/btqBNMYI0iq/LEee5wQyJo6VKdT4rlMcvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbZ29I%2FbtqBNMYI0iq%2FLEee5wQyJo6VKdT4rlMcvK%2Fimg.png&quot; data-filename=&quot;a.png&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;215&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;sobel filter result&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp; dx&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dy&lt;/p&gt;
&lt;p&gt;-1 0 1&amp;nbsp; &amp;nbsp; &amp;nbsp;-1 -2 -1&lt;/p&gt;
&lt;p&gt;-2 0 2&amp;nbsp; &amp;nbsp; &amp;nbsp; 0&amp;nbsp; 0&amp;nbsp; 0&lt;/p&gt;
&lt;p&gt;-1 0 1&amp;nbsp; &amp;nbsp; &amp;nbsp; 1&amp;nbsp; 2&amp;nbsp; 1&lt;/p&gt;
&lt;p&gt;내용의 잠깐하게 살펴보면, cv2.Sobel 함수는 지정된 크기의 선형 필터를 사용해 이미지 경사도의 근삿값을 계산하는데, 사용될 필터와, 이미지의 데이터 타입이 계산돼야 할 미분 값을 지정할 수 있고, 행렬의 곱형태가 아닌 각 위치의 값들끼리 곱하고 모두 더한 값입니다.&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;Gabor filter&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;가버 필터는 코사인파로 변화된 2D 가우시안 커널을 갖는 선형 필터인데, 외곽선을 검출하는 기능을 가지고 있고, 쉽게 생각하면 사인,코사인 함수로 모듈화된 가우시안 필터라고 생각할 수 있다. (여기서는 필터, 커널 같은 용어로 사용할 것이다.)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;예제를 한번 알아보자.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;3&quot;&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;cv2&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;numpy&amp;nbsp;as&amp;nbsp;np&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;matplotlib.pyplot&amp;nbsp;as&amp;nbsp;plt&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;math&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;origin_img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.imread(&lt;span&gt;'image.jpg'&lt;/span&gt;,&amp;nbsp;&lt;span&gt;0&lt;/span&gt;).astype(np.float32)&amp;nbsp;&lt;span&gt;#&amp;nbsp;gray&amp;nbsp;scale&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;origin_img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;origin_img&amp;nbsp;&lt;span&gt;/&lt;/span&gt;&amp;nbsp;&lt;span&gt;255&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;#&amp;nbsp;Garbor&amp;nbsp;filter&amp;nbsp;form&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;kernel&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.getGaborKernel((&lt;span&gt;21&lt;/span&gt;,&lt;span&gt;21&lt;/span&gt;),&amp;nbsp;&lt;span&gt;5&lt;/span&gt;,&amp;nbsp;&lt;span&gt;1&lt;/span&gt;,&amp;nbsp;&lt;span&gt;10&lt;/span&gt;,&amp;nbsp;&lt;span&gt;1&lt;/span&gt;,&amp;nbsp;&lt;span&gt;0&lt;/span&gt;,&amp;nbsp;cv2.CV_32F)&lt;/p&gt;
&lt;p&gt;kernel&amp;nbsp;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;math.sqrt((kernel&amp;nbsp;&lt;span&gt;*&lt;/span&gt;&amp;nbsp;kernel).sum())&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;filtered&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.filter2D(origin_img,&amp;nbsp;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;,&amp;nbsp;kernel)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;plt.figure(figsize&lt;span&gt;=&lt;/span&gt;(&lt;span&gt;8&lt;/span&gt;,&lt;span&gt;3&lt;/span&gt;))&lt;/p&gt;
&lt;p&gt;plt.subplot(&lt;span&gt;131&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.axis(&lt;span&gt;'off'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.title(&lt;span&gt;'origin_img'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.imshow(origin_img,&amp;nbsp;cmap&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'gray'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.subplot(&lt;span&gt;132&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.axis(&lt;span&gt;'off'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.imshow(kernel,&amp;nbsp;cmap&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'gray'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.title(&lt;span&gt;'kernel'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.subplot(&lt;span&gt;133&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.axis(&lt;span&gt;'off'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.title(&lt;span&gt;'filtered'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.imshow(filtered,&amp;nbsp;cmap&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'gray'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.tight_layout()&lt;/p&gt;
&lt;p&gt;plt.show()&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;&lt;span&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;결과는 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;b.png&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yNre3/btqBMMyk2Qh/9lt5tQloCFhKnSnbDXim6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yNre3/btqBMMyk2Qh/9lt5tQloCFhKnSnbDXim6K/img.png&quot; data-alt=&quot;gabor filter result&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yNre3/btqBMMyk2Qh/9lt5tQloCFhKnSnbDXim6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyNre3%2FbtqBMMyk2Qh%2F9lt5tQloCFhKnSnbDXim6K%2Fimg.png&quot; data-filename=&quot;b.png&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;207&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;gabor filter result&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;수식은 위키피디아에서 확인 가능하다 : &lt;a href=&quot;https://en.wikipedia.org/wiki/Gabor_filter&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;클릭&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;예제를 간단하게 살펴보면, cv2.getGaborKernel() 함수는 [커널크기,가우시안 표준편차, 파형 방향, 파형 길이, 공간 비율, 위상] 형태를 매개변수로 받고, 이미지의 방향을 아는 경우 에지를 검출하는 데 유용한 필터이다.&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;b&gt;discreate Fourier transform (DFT)&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;3&quot;&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;cv2&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;numpy&amp;nbsp;as&amp;nbsp;np&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;matplotlib.pyplot&amp;nbsp;as&amp;nbsp;plt&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;origin_img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.imread(&lt;span&gt;'image.jpg'&lt;/span&gt;,&amp;nbsp;&lt;span&gt;0&lt;/span&gt;).astype(np.float32)&amp;nbsp;&lt;span&gt;#&amp;nbsp;gray&amp;nbsp;scale&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;origin_img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;origin_img&amp;nbsp;&lt;span&gt;/&lt;/span&gt;&amp;nbsp;&lt;span&gt;255&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;#&amp;nbsp;DFT&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;fft&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.dft(origin_img,&amp;nbsp;flags&lt;span&gt;=&lt;/span&gt;cv2.DFT_COMPLEX_OUTPUT)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;#&amp;nbsp;spectrum&amp;nbsp;visualization&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;shifted&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;np.fft.fftshift(fft,&amp;nbsp;axes&lt;span&gt;=&lt;/span&gt;[&lt;span&gt;0&lt;/span&gt;,&lt;span&gt;1&lt;/span&gt;])&lt;/p&gt;
&lt;p&gt;magnitude&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.magnitude(shifted[:,:,&lt;span&gt;0&lt;/span&gt;],&amp;nbsp;shifted[:,:,&lt;span&gt;1&lt;/span&gt;])&lt;/p&gt;
&lt;p&gt;magnitude&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;np.log(magnitude)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;plt.figure(figsize&lt;span&gt;=&lt;/span&gt;(&lt;span&gt;8&lt;/span&gt;,&lt;span&gt;2&lt;/span&gt;))&lt;/p&gt;
&lt;p&gt;plt.subplot(&lt;span&gt;131&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.axis(&lt;span&gt;'off'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.title(&lt;span&gt;'origin_img'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.imshow(origin_img,&amp;nbsp;cmap&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'gray'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.subplot(&lt;span&gt;132&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.axis(&lt;span&gt;'off'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.title(&lt;span&gt;'magnitude'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.imshow(magnitude,&amp;nbsp;cmap&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'gray'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.tight_layout()&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;&lt;span&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;결과는 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;c.png&quot; data-origin-width=&quot;305&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zjmj6/btqBLkCAl8c/wmm9uJLCjxNRHTUrmiFii1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zjmj6/btqBLkCAl8c/wmm9uJLCjxNRHTUrmiFii1/img.png&quot; data-alt=&quot;DFT result&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zjmj6/btqBLkCAl8c/wmm9uJLCjxNRHTUrmiFii1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzjmj6%2FbtqBLkCAl8c%2Fwmm9uJLCjxNRHTUrmiFii1%2Fimg.png&quot; data-filename=&quot;c.png&quot; data-origin-width=&quot;305&quot; data-origin-height=&quot;136&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;DFT result&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이번에도 코드를 간단히 살펴보면, cv2.dft2() 함수는 이산 푸리에 변환을 연산하는 함수 출력이 실수인지 복소수인지를 결정하기 위해 두가지 플래그 선택이 가능하다 (cv2.DFT_REAL_OUTPUT, cv2.DFT_COMPLEX_OUTPUT) / 만약 주파수 스펙트럼에서 공간 표현으로 변환하려면,&amp;nbsp;restore = cv2.idft(fft, flags=cv2.DFT_SCALE | cv2.DFT_REAL_OUTPUT) 를 사용하면되는데, idft 함수는 고속 푸리에 변환 알고리즘을 사용한다. 그리고 np.fft.fftshift 함수는 주파수가 0에 해당하는 진폭 배열의 중심으로 이동하도록 스펙트럼을 이동시켜 해석이 간단해질 수 있다.&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;image threshold&lt;/b&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;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;3&quot;&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;cv2&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;numpy&amp;nbsp;as&amp;nbsp;np&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;matplotlib.pyplot&amp;nbsp;as&amp;nbsp;plt&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;origin_img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.imread(&lt;span&gt;'image.jpg'&lt;/span&gt;,&amp;nbsp;&lt;span&gt;0&lt;/span&gt;)&amp;nbsp;&lt;span&gt;#&amp;nbsp;gray&amp;nbsp;scale&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;#origin_img&amp;nbsp;=&amp;nbsp;origin_img&amp;nbsp;/&amp;nbsp;255&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;#&amp;nbsp;basic&amp;nbsp;threshold&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;threshold,&amp;nbsp;mask&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.threshold(origin_img,&amp;nbsp;&lt;span&gt;200&lt;/span&gt;,&amp;nbsp;&lt;span&gt;1&lt;/span&gt;,&amp;nbsp;cv2.THRESH_BINARY)&lt;/p&gt;
&lt;p&gt;&lt;span&gt;print&lt;/span&gt;(&lt;span&gt;'값:&amp;nbsp;'&lt;/span&gt;,&amp;nbsp;threshold)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;#&amp;nbsp;adapt&amp;nbsp;threshold&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;adapt_mask&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.adaptiveThreshold(origin_img,&amp;nbsp;&lt;span&gt;255&lt;/span&gt;,&amp;nbsp;cv2.ADAPTIVE_THRESH_MEAN_C,&amp;nbsp;cv2.THRESH_BINARY_INV,&amp;nbsp;&lt;span&gt;11&lt;/span&gt;,&amp;nbsp;&lt;span&gt;10&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;#&amp;nbsp;visualization&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;plt.figure(figsize&lt;span&gt;=&lt;/span&gt;(&lt;span&gt;10&lt;/span&gt;,&lt;span&gt;3&lt;/span&gt;))&lt;/p&gt;
&lt;p&gt;plt.subplot(&lt;span&gt;131&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.axis(&lt;span&gt;'off'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.title(&lt;span&gt;'origin_img'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.imshow(origin_img,&amp;nbsp;cmap&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'gray'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.subplot(&lt;span&gt;132&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.axis(&lt;span&gt;'off'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.title(&lt;span&gt;'binary&amp;nbsp;threshold'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.imshow(mask,&amp;nbsp;cmap&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'gray'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.subplot(&lt;span&gt;133&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.axis(&lt;span&gt;'off'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.title(&lt;span&gt;'adaptive&amp;nbsp;threshold'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.imshow(adapt_mask,&amp;nbsp;cmap&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'gray'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.tight_layout()&lt;/p&gt;
&lt;p&gt;plt.show()&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;&lt;span&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;결과&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;d.png&quot; data-origin-width=&quot;664&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kAzl1/btqBLkvRh15/tKhYXaUieEImFL6rIhFXd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kAzl1/btqBLkvRh15/tKhYXaUieEImFL6rIhFXd0/img.png&quot; data-alt=&quot;threshold result&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kAzl1/btqBLkvRh15/tKhYXaUieEImFL6rIhFXd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkAzl1%2FbtqBLkvRh15%2FtKhYXaUieEImFL6rIhFXd0%2Fimg.png&quot; data-filename=&quot;d.png&quot; data-origin-width=&quot;664&quot; data-origin-height=&quot;208&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;threshold result&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;예제코드를 간단하게 살펴보자,&lt;/p&gt;
&lt;p&gt;threshold 처리는 크게 모든 픽셀에 동일한 임계값을 적용할 수 있는 local방식이 있고, 픽셀에 따라 적용하는 threshold값이 다른 adapt 방식이 있다.&lt;/p&gt;
&lt;p&gt;cv2.threshold() 함수는 모든 픽셀에 동일한 임계값을 적용하는데, 임계값 type이 cv2.THRESH_BINARY, cv2.THRESH_BINARY_INV 등 있다. 자세한건 &lt;a href=&quot;https://docs.opencv.org/master/d7/d4d/tutorial_py_thresholding.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;document&lt;/a&gt;를 보자.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;반면에 cv2.adaptiveThreshold() 함수는 각 픽셀은 주변 픽셀 값에 따라 독자적인 임계값을 가지는데, cv2.ADAPTIVE_THRESH_MEAN_C 방식은 주변 픽셀의 평균에 사용자가 지정한 편향 값 (위 코드는 10)을 뺀 값을 픽셀 단위의 임계값으로 사용했다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;refer : openCV를 이용한 컴퓨터 비전학습, &lt;a href=&quot;https://docs.opencv.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;opencv document&lt;/a&gt;&lt;/p&gt;</description>
      <category>02. Study/Computer Vision(openframworks&amp;amp;opencv)</category>
      <category>discreate Fourier transform</category>
      <category>python Gabor filter</category>
      <category>python image threshold</category>
      <category>python sobel fileter</category>
      <category>파이썬 가버필터</category>
      <category>파이썬 소벨필터</category>
      <category>파이썬 이미지 임계처리</category>
      <category>파이썬 이산 푸리에 변환</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/148</guid>
      <comments>https://boysboy3.tistory.com/148#entry148comment</comments>
      <pubDate>Thu, 6 Feb 2020 00:41:46 +0900</pubDate>
    </item>
    <item>
      <title>python으로 시작하는 OpenCV (2)</title>
      <link>https://boysboy3.tistory.com/147</link>
      <description>&lt;p&gt;저번 &lt;a href=&quot;https://boysboy3.tistory.com/146&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;포스팅&lt;/a&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;행렬 조작 : 생성하고 채우고, 요소 접근하고 ROI(Region of Interest)&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;3&quot;&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;cv2&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;numpy&amp;nbsp;as&amp;nbsp;np&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;np.full((&lt;span&gt;480&lt;/span&gt;,&amp;nbsp;&lt;span&gt;640&lt;/span&gt;,&lt;span&gt;3&lt;/span&gt;),&amp;nbsp;&lt;span&gt;255&lt;/span&gt;,&amp;nbsp;np.uint8)&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;#img &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;np.full((&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;480&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;640&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;),&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(0, 255, 0)&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;, np.uint8) # green&amp;nbsp;&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&gt;#&lt;/span&gt;img&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;np.full((&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;480&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;640&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;),&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(0, 255, 255)&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;, np.uint8) # yellow&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;#img&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;np.full((&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;480&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;640&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;),&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(0, 0, 255)&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;, np.uint8) # red&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;cv2.imshow(&lt;span&gt;'white&amp;nbsp;img'&lt;/span&gt;,&amp;nbsp;img)&lt;/p&gt;
&lt;p&gt;cv2.waitKey()&lt;/p&gt;
&lt;p&gt;cv2.destroyAllWindows()&lt;/p&gt;
&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;&lt;span&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;위와 같은 코드를 통해 특정 형태 (480,640,3) height,width,channel 형식으로 full (255)로 가득찬 이미지를 만들수 있다.&lt;/p&gt;
&lt;p&gt;실행해보면 흰색 배경의 이미지가 만들어 질것이다.&lt;/p&gt;
&lt;p&gt;그 외에도, 다양한 색 조합을 통해 ex) (255,255,0) 하늘색 -&amp;gt; 조절하면 색상을 조절 할 수 있다(0~255).&amp;nbsp; 0을 채우면 black이미지가 만들어진다.&lt;/p&gt;
&lt;p&gt;OpenCV의 파이썬 행렬은 Numpy 배열로 나타내며, 다차원 행렬(tensor)를 다루는 도구를 제공한다.&lt;/p&gt;
&lt;p&gt;또한, 행렬은 일반적으로 너비, 높이, 채널 수의 세 가지 공간 차원을 갖는다. OpenCV는 컬러 또는 grayscale 행렬로 동작하지만 imread('path' ,-1) 를 통해 원본응로 읽어 올수도 있지만, 일반적인 형태는 두가지가 대표적이다.&lt;/p&gt;
&lt;p&gt;RGB 표현을 위해 BGR 형식으로 저장하기 때문에 색 변경이나 이러한 부분에서 주의가 필요하다.&lt;/p&gt;
&lt;p&gt;마지막으로 uint8로 보통 0~255로 저장하지만 np.float32나 np.float64로 값을 저장할 수도 있다.&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;이전에는 cv2.imread나 cv2.imwrite 함수를 이용하여 이미지만 저장하거나 불러왔다. 하지만 Numpy를 사용한 비이미지 데이터 속성으로 이미지뿐만 아니라 어떠한 형태나 데이터 타입의 행렬 또한 저장이 가능하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;3&quot;&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;cv2&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;numpy&amp;nbsp;as&amp;nbsp;np&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;mat&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;np.random.rand(&lt;span&gt;100&lt;/span&gt;,&amp;nbsp;&lt;span&gt;100&lt;/span&gt;).astype(np.float32)&lt;/p&gt;
&lt;p&gt;&lt;span&gt;print&lt;/span&gt;(f&lt;span&gt;'Shape&amp;nbsp;:&amp;nbsp;{mat.shape}'&lt;/span&gt;)&amp;nbsp;&lt;span&gt;#&amp;nbsp;(100,100)&amp;nbsp;-&amp;gt;np.ndarray타입&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;print&lt;/span&gt;(f&lt;span&gt;'Data&amp;nbsp;Type&amp;nbsp;:&amp;nbsp;{mat.dtype}'&lt;/span&gt;)&amp;nbsp;&lt;span&gt;#&amp;nbsp;flaot32&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;np.savetxt(&lt;span&gt;'mat.csv'&lt;/span&gt;,&amp;nbsp;mat)&amp;nbsp;&lt;span&gt;#&amp;nbsp;save&amp;nbsp;numpy&amp;nbsp;data&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;mat&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;np.loadtxt(&lt;span&gt;'mat.csv'&lt;/span&gt;).astype(np.float32)&amp;nbsp;&lt;span&gt;# load data&lt;/span&gt;&lt;/p&gt;
&lt;br /&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;&lt;span&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;위 코드를 간략하게 살펴보면, rand으로 100,100 크기의 float32 형태의 행렬을 만들고, np.savetxt() 함수를 통해 csv 형태로 저장한다. csv는 ,(쉼표) 로 구분된 데이터다. 또한 np.loadtxt() 함수를 통해 불러올 수 있으며, astype으로 타입변경도 가능하다!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;만약 어떤 이미지를 불러오고 red 채널과 blue 채널을 바꾸고 싶다면, 아래 코드로 간단하게 바꿀 수 있다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;3&quot;&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;cv2&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;numpy&amp;nbsp;as&amp;nbsp;np&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;origin_img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.imread(&lt;span&gt;'image.jpg'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;origin_img.copy()&lt;/p&gt;
&lt;p&gt;img[:,&amp;nbsp;:,&amp;nbsp;[&lt;span&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span&gt;2&lt;/span&gt;]]&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;img&amp;nbsp;[:,&amp;nbsp;:,&amp;nbsp;[&lt;span&gt;2&lt;/span&gt;,&amp;nbsp;&lt;span&gt;0&lt;/span&gt;]]&lt;/p&gt;
&lt;p&gt;cv2.imshow(&lt;span&gt;'origin'&lt;/span&gt;,&amp;nbsp;origin_img)&lt;/p&gt;
&lt;p&gt;cv2.imshow(&lt;span&gt;'blue_red_swapped'&lt;/span&gt;,&amp;nbsp;img)&lt;/p&gt;
&lt;p&gt;cv2.waitKey()&lt;/p&gt;
&lt;p&gt;cv2.destroyAllWindows()&lt;/p&gt;
&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;&lt;span&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;09.PNG&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;251&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcP7i3/btqBIIWWziE/5npxevLUU9HtKa2TkGUXPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcP7i3/btqBIIWWziE/5npxevLUU9HtKa2TkGUXPk/img.png&quot; data-alt=&quot;채널 변경 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcP7i3/btqBIIWWziE/5npxevLUU9HtKa2TkGUXPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcP7i3%2FbtqBIIWWziE%2F5npxevLUU9HtKa2TkGUXPk%2Fimg.png&quot; data-filename=&quot;09.PNG&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;251&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&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;/p&gt;
&lt;p&gt;기본적으로 openCV의 컬러 이미지는 RGB색 공간으로 표시된다. 그러나 가끔 다른 색 표현으로 변경해야 할 필요가 있는데, 예를 들면 강도(intensity)에 대한 별도의 채널을 갖는 경우가 있는데 한번 변경해보자.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;3&quot;&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;cv2&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;numpy&amp;nbsp;as&amp;nbsp;np&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;origin_img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.imread(&lt;span&gt;'image.jpg'&lt;/span&gt;).astype(np.float32)&amp;nbsp;&lt;span&gt;/&lt;/span&gt;&amp;nbsp;&lt;span&gt;255&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;gray_img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;origin_img.copy()&lt;/p&gt;
&lt;p&gt;hsv_img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;origin_img.copy()&lt;/p&gt;
&lt;p&gt;gray_img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.cvtColor(gray_img,&amp;nbsp;cv2.COLOR_BGR2GRAY)&lt;/p&gt;
&lt;p&gt;hsv_img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.cvtColor(hsv_img,&amp;nbsp;cv2.COLOR_BGR2HSV)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;cv2.imshow(&lt;span&gt;'origin_img'&lt;/span&gt;,&amp;nbsp;origin_img)&lt;/p&gt;
&lt;p&gt;cv2.imshow(&lt;span&gt;'gray_img'&lt;/span&gt;,&amp;nbsp;gray_img)&lt;/p&gt;
&lt;p&gt;cv2.imshow(&lt;span&gt;'hsv_img'&lt;/span&gt;,&amp;nbsp;hsv_img)&lt;/p&gt;
&lt;p&gt;cv2.waitKey()&lt;/p&gt;
&lt;p&gt;cv2.destroyAllWindows()&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;&lt;span&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;위 코드를 간략하게 살펴보면 이미지를 normalization을 통해 불러오고, grayscale 사진 및 HSV 형태로 변경 시킨다.&lt;/p&gt;
&lt;p&gt;cv2.cvtColor() 함수를 사용하면 간단하게 변경이 가능한데, 200가지가 넘는 유형을 지원하므로 궁금하면 &lt;a href=&quot;https://docs.opencv.org/2.4/modules/imgproc/doc/miscellaneous_transformations.html?highlight=cv2.cvtcolor#cv2.cvtColor&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;document&lt;/a&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;이미지를 다룰때면 픽셀 값의 통계적 값으로 설정해야 할 때가 있다. 값들의 평균값을 0으로 설정하고 분산을 1로 설정하면 이 연산은 정규화되는데, 분석이나 전처리 단계에서 유용하게 사용되며&lt;/p&gt;
&lt;p&gt;img = img&amp;nbsp;=&amp;nbsp;cv2.imread('image.jpg').astype(np.float32)&amp;nbsp;/&amp;nbsp;255 &lt;br /&gt;img&amp;nbsp;=&amp;nbsp;img&amp;nbsp;-&amp;nbsp;img.mean() &lt;br /&gt;img&amp;nbsp;=&amp;nbsp;img&amp;nbsp;/&amp;nbsp;img.std()&lt;/p&gt;
&lt;p&gt;3줄로 간단하게 정규화 할 수 있는데 간단하게 살펴보면, mean을 통해 평균을 빼주고 다시 표준편차로 나눠준다.&lt;/p&gt;
&lt;p&gt;그 외에도 cv2.meanStdDev를 이용하면 평균과 표준 편차를 동시에 계산도 가능하다.&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;이미지 히스토그램은 값의 집합에 대한 분포 수준을 보여주고, 어떤 값으로 치우져 있거나 outlier를 제거하기 위한 지표로도 사용이 가능하다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;3&quot;&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;cv2&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;numpy&amp;nbsp;as&amp;nbsp;np&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;matplotlib.pyplot&amp;nbsp;as&amp;nbsp;plt&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.imread(&lt;span&gt;'image.jpg'&lt;/span&gt;,&lt;span&gt;0&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;hist,&amp;nbsp;bins&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;np.histogram(img,&amp;nbsp;&lt;span&gt;256&lt;/span&gt;,&amp;nbsp;[&lt;span&gt;0&lt;/span&gt;,&lt;span&gt;255&lt;/span&gt;])&lt;/p&gt;
&lt;p&gt;plt.fill(hist)&lt;/p&gt;
&lt;p&gt;plt.xlabel(&lt;span&gt;'pixel&amp;nbsp;value'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.show()&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;&lt;span&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;위 코드에서 cv2.calcHist함수가 제공되지만, 코드 간결성을 위해 numpy에서 제공되는 np.histogram()함수를 이용하였다. 이 함수는 (입력 이미지, bin의 수, bin의 범위) 값과 에지 값을 배열로 반환한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;9898.PNG&quot; data-origin-width=&quot;371&quot; data-origin-height=&quot;257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bq9FqV/btqBGgtONBf/LiWRjmuMDfky6RDmiJA88K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bq9FqV/btqBGgtONBf/LiWRjmuMDfky6RDmiJA88K/img.png&quot; data-alt=&quot;image histogram&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bq9FqV/btqBGgtONBf/LiWRjmuMDfky6RDmiJA88K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbq9FqV%2FbtqBGgtONBf%2FLiWRjmuMDfky6RDmiJA88K%2Fimg.png&quot; data-filename=&quot;9898.PNG&quot; data-origin-width=&quot;371&quot; data-origin-height=&quot;257&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;image histogram&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;하지만 이미지 히스토그램을 사용하다보면 대비가 낮은 이미지는 대부분 픽셀 값의 범위가 좁기 때문에 특정 값으로 군집되는 히스토그램을 갖는데, 히스토그램 평활화를 통해 세부적인 부분을 표현 할 수 있다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;3&quot;&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;cv2&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;numpy&amp;nbsp;as&amp;nbsp;np&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;matplotlib.pyplot&amp;nbsp;as&amp;nbsp;plt&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.imread(&lt;span&gt;'image.jpg'&lt;/span&gt;,&lt;span&gt;0&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;hist_equal= cv2.equalizeHist(img)&lt;/p&gt;
&lt;p&gt;hist, bins = np.histogram(hist_equal, 256, [0,255])&lt;/p&gt;
&lt;p&gt;plt.pill_between(range(256), hist, 0)&lt;/p&gt;
&lt;p&gt;plt.xlabel(&lt;span&gt;'pixel&amp;nbsp;value'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.show()&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;&lt;span&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;baa.png&quot; data-origin-width=&quot;375&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0WDrd/btqBJeaeAyv/6Zk7BD8yhE5VkDD6tghoJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0WDrd/btqBJeaeAyv/6Zk7BD8yhE5VkDD6tghoJ1/img.png&quot; data-alt=&quot;histogram equalization&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0WDrd/btqBJeaeAyv/6Zk7BD8yhE5VkDD6tghoJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0WDrd%2FbtqBJeaeAyv%2F6Zk7BD8yhE5VkDD6tghoJ1%2Fimg.png&quot; data-filename=&quot;baa.png&quot; data-origin-width=&quot;375&quot; data-origin-height=&quot;262&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;histogram equalization&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;마지막으로 노이즈 제거를 간략하게 알아보자.&lt;/p&gt;
&lt;p&gt;모든 real world이미지에는 많은 노이즈가 포함돼 있다. 노이즈는 이미지의 형태를 망치고, 전처리하기에도 좋지 않은 영향을 준다 그래서 노이즈를 제거하거나 감소시키는 방법을 알아보자.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;noise.PNG&quot; data-origin-width=&quot;246&quot; data-origin-height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DZhUI/btqBHTR1hDe/7vPofgG3uQJfvlxliNUYn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DZhUI/btqBHTR1hDe/7vPofgG3uQJfvlxliNUYn0/img.png&quot; data-alt=&quot;noise 추가된 이미지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DZhUI/btqBHTR1hDe/7vPofgG3uQJfvlxliNUYn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDZhUI%2FbtqBHTR1hDe%2F7vPofgG3uQJfvlxliNUYn0%2Fimg.png&quot; data-filename=&quot;noise.PNG&quot; data-origin-width=&quot;246&quot; data-origin-height=&quot;243&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;noise 추가된 이미지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위 사진 처럼 이미지에 노이즈를 추가해보고 gaussian_blur median_blur 를 이용해서 보자.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;3&quot;&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;cv2&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;numpy&amp;nbsp;as&amp;nbsp;np&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;matplotlib.pyplot&amp;nbsp;as&amp;nbsp;plt&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;#&amp;nbsp;[0,&amp;nbsp;1]&amp;nbsp;사이의&amp;nbsp;범위의&amp;nbsp;부동소수점&amp;nbsp;데이터&amp;nbsp;타입으로&amp;nbsp;변환&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.imread(&lt;span&gt;'image.jpg'&lt;/span&gt;).astype(np.float32)&amp;nbsp;&lt;span&gt;/&lt;/span&gt;&amp;nbsp;&lt;span&gt;255&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;#&amp;nbsp;noise&amp;nbsp;추가&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;noise&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;(img&amp;nbsp;&lt;span&gt;+&lt;/span&gt;&amp;nbsp;&lt;span&gt;0.&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&amp;nbsp;&lt;span&gt;*&lt;/span&gt;&amp;nbsp;np.random.rand(&lt;span&gt;*&lt;/span&gt;img.shape).astype(np.float32))&lt;/p&gt;
&lt;p&gt;gauss_blur&amp;nbsp;=&amp;nbsp;cv2.GaussianBlur(noise,&amp;nbsp;(7,&amp;nbsp;7),&amp;nbsp;0)&lt;/p&gt;
&lt;p&gt;median_blur&amp;nbsp;=&amp;nbsp;cv2.medianBlur((noise&amp;nbsp;*&amp;nbsp;255).astype(np.uint8),7)&lt;/p&gt;
&lt;p&gt;noise&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;noise.clip(&lt;span&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span&gt;1&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.imshow(noise[:,&amp;nbsp;:,&amp;nbsp;[&lt;span&gt;2&lt;/span&gt;,&lt;span&gt;1&lt;/span&gt;,&lt;span&gt;0&lt;/span&gt;]])&lt;/p&gt;
&lt;p&gt;plt.imshow(&lt;span style=&quot;color: #333333;&quot;&gt;gauss_blur [:, :, [2,1,0]]&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.imshow(median_blur[:,&amp;nbsp;:,&amp;nbsp;[2,1,0]])&lt;/p&gt;
&lt;p&gt;plt.show()&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;&lt;span&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위 코드도 간략하게 살펴보면 가우시안 필터를 적용하기 위해 cv2.GaussianBlur 함수를 사용하는데, (img, kernel(width,height)) 형태로 파라미터를 갖는데 다양하게 파라미터를 조절하면서 만지작 거리다보면 뭔가 최적으로 noise를 줄일 수 있지 않을까? 생각이 든다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;reference&lt;/p&gt;
&lt;p&gt;book : 파이썬과 OpenCV를 이용한 컴퓨터 비전 학습&lt;/p&gt;
&lt;p&gt;document :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html&quot;&gt;python opencv document&lt;/a&gt;&lt;/p&gt;</description>
      <category>02. Study/Computer Vision(openframworks&amp;amp;opencv)</category>
      <category>noise delete</category>
      <category>opencv hsv</category>
      <category>opencv image filter</category>
      <category>opencv python histogram equalization</category>
      <category>opencv 노이즈 제거</category>
      <category>히스토그램 평활화</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/147</guid>
      <comments>https://boysboy3.tistory.com/147#entry147comment</comments>
      <pubDate>Tue, 4 Feb 2020 00:42:06 +0900</pubDate>
    </item>
    <item>
      <title>python으로 시작하는 OpenCV (1)</title>
      <link>https://boysboy3.tistory.com/146</link>
      <description>&lt;p&gt;컴퓨터 비전은 우리가 눈으로 보는것처럼 컴퓨터에 시각을 부여해 이미지를 분석함으로써 유용한 정보를 생성하는 기술이다. 컴퓨터 로봇 등을 통해 얼굴, 건물, 의료 등의 다양한 도움을 준다. 또한 인공지능 기술이 발전하면서 인식, 검출, 분할 등 기술의 진화 속도가 엄청나께 빠르게 발전하고 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;개인적인 공부를 통해 최종적으로는 SLAM(simultaneous localization and mapping) 기술을 습득하는것을 목표로 한다.&lt;/p&gt;
&lt;p&gt;또한, 간단한 기본 예제부터 좀 더 심화된 예제를 다뤄보면서 기본기를 익히면서 진행하고 복습차원에서 블로그로 내용을 정리한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;window or ubuntu 환경을 이용하고 conda 환경을 통해 실습을 진행할 예정이다.&lt;/p&gt;
&lt;p&gt;설치는 conda propmt에서 &lt;span style=&quot;background-color: #000000; color: #ffffff;&quot;&gt;pip install opencv-contrib-python&lt;/span&gt; or &lt;span style=&quot;background-color: #000000; color: #ffffff;&quot;&gt;pip install opencv-python&lt;/span&gt; 으로 간단하게 설치가 가능하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;첫번째로 다뤄볼 내용은 입출력 기능과 관련된 기본적인 OpenCV 기능을 다뤄본다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1. 파일에서 이미지 읽어오기&lt;/p&gt;
&lt;p&gt;아무 이미지나 가져와서 읽어본다.&lt;/p&gt;
&lt;p&gt;여기서는 대표적인 rena이미지를 출력해보겠다.&lt;/p&gt;
&lt;p&gt;ex)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;image.jpg&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cD53nR/btqBDWCFCJ0/yyiZhXP90QXn8do7NTS1EK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cD53nR/btqBDWCFCJ0/yyiZhXP90QXn8do7NTS1EK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cD53nR/btqBDWCFCJ0/yyiZhXP90QXn8do7NTS1EK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcD53nR%2FbtqBDWCFCJ0%2FyyiZhXP90QXn8do7NTS1EK%2Fimg.jpg&quot; data-filename=&quot;image.jpg&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;225&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;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;3&quot;&gt;
&lt;p&gt;&lt;span&gt;# gui_opencv.py&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;argparse&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;cv2&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;parser&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;argparse.ArgumentParser()&lt;/p&gt;
&lt;p&gt;parser.add_argument(&lt;span&gt;'--path'&lt;/span&gt;,&amp;nbsp;default&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'image.jpg'&lt;/span&gt;,&amp;nbsp;help&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Image&amp;nbsp;path.'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;params&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;parser.parse_args()&lt;/p&gt;
&lt;p&gt;img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.imread(params.path)&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;assert&amp;nbsp;img&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;is&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;not&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;None&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;#&amp;nbsp;로딩&amp;nbsp;제대로&amp;nbsp;된지&amp;nbsp;확인&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;cv2.imshow('window', img)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;cv2.waitKey(0) # 아무키나 입력 받기전까지 대기하고 입력받으면 window창 종료 &lt;br /&gt;cv2.destroyAllWindows()&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;print&lt;/span&gt;(f&lt;span&gt;'read&amp;nbsp;{params.path}'&lt;/span&gt;) #read image.jpg&lt;/p&gt;
&lt;p&gt;&lt;span&gt;print&lt;/span&gt;(f&lt;span&gt;'shape&amp;nbsp;:{img.shape}'&lt;/span&gt;) # shape :(225, 225, 3)&lt;/p&gt;
&lt;p&gt;&lt;span&gt;print&lt;/span&gt;(f&lt;span&gt;'dtype&amp;nbsp;:{img.dtype}'&lt;/span&gt;) # dtype :unint8&lt;/p&gt;
&lt;p&gt;&lt;span&gt;#&amp;nbsp;print('read&amp;nbsp;{}'.format(params.path))&amp;nbsp;or&amp;nbsp;print('read&amp;nbsp;',&amp;nbsp;params.path)&amp;nbsp;로&amp;nbsp;출력이&amp;nbsp;가능한데,&amp;nbsp;가독성을&amp;nbsp;위해&amp;nbsp;위와&amp;nbsp;같이&amp;nbsp;표현한다.&lt;/span&gt;&lt;/p&gt;
&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;&lt;span&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;만약 prompt를 이용해서 실행하시는 분이라면 해당 프로젝트 파일안에, image파일이 있으신 분은 아무값도 없이 넣어도 되지만 아니라면 절대경로나 상대경로를 argument 값으로 실행시키면 된다.&lt;/p&gt;
&lt;p&gt;ex) python gui_opencv.py --path 'images.jpg'&amp;nbsp; &amp;nbsp;# ''안에 이미지 경로를 넣어주면 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;간단하지만 코드를 살펴보자면, imread 함수를 살펴보면 선택적 플래그도 지원하며, uint8(unsigned 8) 타입으로 변환 등 다양한 형태를 지정할 수 있다.&lt;/p&gt;
&lt;p&gt;cv2.imread('path', 0) # grayscale,&amp;nbsp; 1은 color, -1은 원본 그대로 ~_~ 만약 뒤에 인자값을 안준다면 기본 디폴트로 3채널(color)로 읽게 된다.&lt;/p&gt;
&lt;p&gt;또한, (height, width, channel) 형태의 numpy 형식으로 데이터를 읽어오며 , &lt;u&gt;RGB 형식 대신에 BRG 형식으로 이미지를 로딩한다는 점을 기억하자.&lt;/u&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2. Image Resize &amp;amp; Flip (이미지 사이즈 조절 및 뒤집기)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;resize_flip.PNG&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;487&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caoQ3c/btqBGgsXobZ/sZdcKAVKyfj8ytaeUeUbwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caoQ3c/btqBGgsXobZ/sZdcKAVKyfj8ytaeUeUbwK/img.png&quot; data-alt=&quot;resize_flip&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caoQ3c/btqBGgsXobZ/sZdcKAVKyfj8ytaeUeUbwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaoQ3c%2FbtqBGgsXobZ%2FsZdcKAVKyfj8ytaeUeUbwK%2Fimg.png&quot; data-filename=&quot;resize_flip.PNG&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;487&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;resize_flip&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위 이미지와 같이 원본 이미지를 resize하거나, flip하는것도 간단하게 구현이 가능하다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;3&quot;&gt;
&lt;p&gt;&lt;span&gt;#&amp;nbsp;resize_flip_basic.py&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;cv2&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;width,&amp;nbsp;height&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;&lt;span&gt;455&lt;/span&gt;,&amp;nbsp;&lt;span&gt;455&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.imread(&lt;span&gt;'image.jpg'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;resized_img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.resize(img,&amp;nbsp;(width,&amp;nbsp;height))&lt;/p&gt;
&lt;p&gt;cv2.imshow(&lt;span&gt;'resize_img'&lt;/span&gt;,&amp;nbsp;resized_img)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;flip_img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.flip(img,&amp;nbsp;&lt;span&gt;0&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;cv2.imshow(&lt;span&gt;'flip_img'&lt;/span&gt;,&amp;nbsp;flip_img)&lt;/p&gt;
&lt;p&gt;cv2.waitKey(&lt;span&gt;0&lt;/span&gt;)&amp;nbsp;&lt;span&gt;#&amp;nbsp;아무키나&amp;nbsp;입력&amp;nbsp;받기전까지&amp;nbsp;대기하고&amp;nbsp;입력받으면&amp;nbsp;window창&amp;nbsp;종료&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;cv2.destroyAllWindows()&lt;/p&gt;
&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;&lt;span&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;위 내용도 간단하게 살펴보면&lt;/p&gt;
&lt;p&gt;cv2.resize 함수는 뒤 매개변수로 (width, height)를 줘서 픽셀 단위로 설정을 할 수 있고, 이미지의 원본 너비와 높에 대한 배수를 설정해서 크기를 조정할 수 있다&lt;/p&gt;
&lt;p&gt;ex) cv2.resize(img, (0,0), img, 0.25, 0.5) # width로 0.25 쭐이고 height로 반 줄인다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;cv2.flip 함수는 뒤 매개변수로 0을 주면 x축을 따라 뒤집고, 1이면 y축을 따라 이미지를 뒤집고, -1이면 x,y축 동시에 뒤집는다.&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;3. Image Write (이미지 저장)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;3&quot;&gt;
&lt;p&gt;&lt;span&gt;#&amp;nbsp;write_basic.py&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;cv2&lt;/p&gt;
&lt;p&gt;img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.imread(&lt;span&gt;'image.jpg'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;cv2.imwrite(&lt;span&gt;'img_compressed.png'&lt;/span&gt;,&amp;nbsp;img,&amp;nbsp;[cv2.IMWRITE_PNG_COMPRESSION,&amp;nbsp;&lt;span&gt;0&lt;/span&gt;])&amp;nbsp;&lt;span&gt;#&amp;nbsp;낮은&amp;nbsp;압축률로&amp;nbsp;이미지&amp;nbsp;저장&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;cv2.imwrite(&lt;span&gt;'img_compressed2.jpg'&lt;/span&gt;,&amp;nbsp;img,&amp;nbsp;[cv2.IMWRITE_JPEG_QUALITY,&amp;nbsp;&lt;span&gt;0&lt;/span&gt;])&amp;nbsp;&lt;span&gt;#&amp;nbsp;jpg&amp;nbsp;형식으로&amp;nbsp;저장&amp;nbsp;저화질로&amp;nbsp;저장된걸&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;save_img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.imread(&lt;span&gt;'img_compressed.png'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;assert&amp;nbsp;save_img.all()&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;img.all()&amp;nbsp;&lt;span&gt;#&amp;nbsp;원본과&amp;nbsp;동일한지&amp;nbsp;비교&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;save_img2&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;cv2.imread(&lt;span&gt;'img_compressed.jpg'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;assert&amp;nbsp;save_img2.all()&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;img.all()&amp;nbsp;&lt;span&gt;#&amp;nbsp;원본과&amp;nbsp;동일한지&amp;nbsp;비교&amp;nbsp;오류&amp;nbsp;발생!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;&lt;span&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;보통 우리가 이미지를 저장할때,&lt;/p&gt;
&lt;p&gt;cv2.imwrite('path', img) 이런식으로 저장하는데 압축수준이라던지 퀄리티 인자값을 통해 이미지를 저장할 수 있다.&lt;/p&gt;
&lt;p&gt;COMPRESSION은 (0,9) 사이의 값을 갖고, 숫자가 클수록 파일 크기는 작지만, 디코딩 프로세스가 느려진다.&lt;/p&gt;
&lt;p&gt;QUALITY는 (0,100) 사이의 값으로 설정할 수 있고 값이 클수록 좋은 품질을 의미하므로 큰 값이면 artifact양이 감소한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그 외에도, &lt;a href=&quot;https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_video_display/py_video_display.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;비디오&lt;/a&gt;, &lt;a href=&quot;https://docs.opencv.org/2.4/modules/core/doc/drawing_functions.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;프리미티브,&lt;/a&gt; 등 다양한 GUI환경을 지원한다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;reference&lt;/p&gt;
&lt;p&gt;book : 파이썬과 OpenCV를 이용한 컴퓨터 비전 학습&lt;/p&gt;
&lt;p&gt;document : &lt;a href=&quot;https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;python opencv document&lt;/a&gt;&lt;/p&gt;</description>
      <category>02. Study/Computer Vision(openframworks&amp;amp;opencv)</category>
      <category>opencv flip</category>
      <category>opencv imread</category>
      <category>opencv imwrite</category>
      <category>opencv resize</category>
      <category>opencv 비디오</category>
      <category>python opencv</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/146</guid>
      <comments>https://boysboy3.tistory.com/146#entry146comment</comments>
      <pubDate>Sun, 2 Feb 2020 20:35:11 +0900</pubDate>
    </item>
    <item>
      <title>Pytorch 1.1.0 / Tensorflow-gpu 1.12 설치 및 cuda10_9 확인</title>
      <link>https://boysboy3.tistory.com/145</link>
      <description>&lt;p&gt;Pytorch 1.1.0 version&lt;/p&gt;
&lt;p&gt;# CUDA 9.0&lt;/p&gt;
&lt;p&gt;&lt;b&gt;conda install pytorch==1.1.0 torchvision==0.3.0 cudatoolkit=9.0 -c pytorch &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;# CUDA 10.0&lt;/p&gt;
&lt;p&gt;&lt;b&gt;conda install pytorch==1.1.0 torchvision==0.3.0 cudatoolkit=10.0 -c pytorch&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;# CPU Only&lt;/p&gt;
&lt;p&gt;&lt;b&gt;conda install pytorch-cpu==1.1.0 torchvision-cpu==0.3.0 cpuonly -c pytorch&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Tensorflow-gpu 1.12.0 version&lt;/p&gt;
&lt;p&gt;&lt;b&gt;conda install tensorflow-gpu=1.12&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;/p&gt;
&lt;p&gt;cuda 9.0버전을 사용하며,&lt;/p&gt;
&lt;p&gt;python version은 3.6.9를 사용한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;cuda 9.0cuda_9.0.176_win10 을 다운받았으며,&lt;/p&gt;
&lt;p&gt;cudnn은 cudnn-9.0-windows10-x64-v7.3.1.20 이 가장 잘 어울리고 오류없이 작동하는것을 확인하였다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.nvidia.com/cuda-toolkit-archive&quot;&gt;https://developer.nvidia.com/cuda-toolkit-archive&lt;/a&gt; -&amp;gt; cuda 설치&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.nvidia.com/rdp/cudnn-archive&quot;&gt;https://developer.nvidia.com/rdp/cudnn-archive&lt;/a&gt; -&amp;gt; cudnn 설치&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이렇게 설치하니 gpu로 잘 동작되는것을 확인하였다.&lt;/p&gt;
&lt;p&gt;gpu 동작확인은 &lt;a href=&quot;https://boysboy3.tistory.com/144&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;클릭&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;--------------------------------------------------------------------------------------------------------------------&lt;/p&gt;
&lt;p&gt;번외로&lt;/p&gt;
&lt;p&gt;요즘 Tensorflow 2.0 버전을 많이 사용하는데,&lt;/p&gt;
&lt;p&gt;내가 사용하는 cuda10은 아래와 같다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Tensorflow 2.0 설치&lt;/p&gt;
&lt;p&gt;&lt;b&gt;pip install tensorflow-gpu==2.0&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위 명령어로 설치할 수 있으며,&lt;/p&gt;
&lt;p&gt;cuda 10.0버전을 사용하며,&lt;/p&gt;
&lt;p&gt;python version은 3.6.9를 사용한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;cuda_10.0.130_411.31_win10 을 다운받았으며,&lt;/p&gt;
&lt;p&gt;cudnn은&lt;span&gt; &lt;/span&gt;cudnn-10.0-windows10-x64-v7.6.0.64 이 가장 잘 어울리고 오류없이 작동하는것을 확인하였다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.nvidia.com/cuda-toolkit-archive&quot;&gt;https://developer.nvidia.com/cuda-toolkit-archive&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;-&amp;gt; cuda 설치&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.nvidia.com/rdp/cudnn-archive&quot;&gt;https://developer.nvidia.com/rdp/cudnn-archive&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;-&amp;gt; cudnn 설치&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;cuda10.1 보단 10.0을 안전하게 설치하자 ~_~&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;시간 여유가 되면, cuda 10/9 설치해서 동시에 사용은 안되지만 path 잡아서 변경하는것을 포스팅하려한다...&lt;/p&gt;
&lt;p&gt;이것때매 삽질을 많이했다 ㅠㅠ...&lt;/p&gt;</description>
      <category>02. Study</category>
      <category>pytoch 설치</category>
      <category>pytorch cuda 9</category>
      <category>pytorch install cuda9</category>
      <category>tensorflow 2.0 gpu 설치</category>
      <category>tensorflow1.12 gpu cuda</category>
      <category>tensorflow1.12 gpu install</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/145</guid>
      <comments>https://boysboy3.tistory.com/145#entry145comment</comments>
      <pubDate>Thu, 9 Jan 2020 13:38:27 +0900</pubDate>
    </item>
    <item>
      <title>conda 환경으로 tensorflow gpu 2.0 / 1.x 버전 관리하기</title>
      <link>https://boysboy3.tistory.com/144</link>
      <description>&lt;p&gt;최근 tensorflow 2.0가 정식 릴리즈 되면서 많은 사람들이 2.0 버전으로 공부 및 연구를 시작한다.&lt;/p&gt;
&lt;p&gt;하지만 이전 버전에서 작업했던 분들은 두가지 버전을 둘 다 사용해야되는 경우가 많아서(필자 또한) conda 환경으로 간단하게 두 가지 버전다 사용을 하는 방법을 포스팅 하고자 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;두가지 버전 설치가 잘 되었다면, 아래 그림과 같이&amp;nbsp; gpu 사용이 True라고 뜰 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2.JPG&quot; width=&quot;355&quot; height=&quot;190&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zyBcm/btqzH0GPA9e/GEy09Org2YFSZ47eSXuM7k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zyBcm/btqzH0GPA9e/GEy09Org2YFSZ47eSXuM7k/img.jpg&quot; data-alt=&quot;tensorflow 2.0.0&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zyBcm/btqzH0GPA9e/GEy09Org2YFSZ47eSXuM7k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzyBcm%2FbtqzH0GPA9e%2FGEy09Org2YFSZ47eSXuM7k%2Fimg.jpg&quot; data-filename=&quot;2.JPG&quot; width=&quot;355&quot; height=&quot;190&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;270&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;tensorflow 2.0.0&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1.JPG&quot; width=&quot;350&quot; height=&quot;191&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGSAOJ/btqzKeDDAbK/t16dCMmIvXqKiKRsaH85Ck/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGSAOJ/btqzKeDDAbK/t16dCMmIvXqKiKRsaH85Ck/img.jpg&quot; data-alt=&quot;tensorflow 1.11.0&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGSAOJ/btqzKeDDAbK/t16dCMmIvXqKiKRsaH85Ck/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGSAOJ%2FbtqzKeDDAbK%2Ft16dCMmIvXqKiKRsaH85Ck%2Fimg.jpg&quot; data-filename=&quot;1.JPG&quot; width=&quot;350&quot; height=&quot;191&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;280&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;tensorflow 1.11.0&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;기존의 tensorflow 1.x 버전이 깔려있다고 가정하고 진행하겠다.&lt;/p&gt;
&lt;p&gt;Cuda 버전같은 경우는&lt;/p&gt;
&lt;p&gt;tensorflow 1.x - cuda 9.0 / tensorflow 2.x - cuda 10.0 로 설치하였다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;anaconda 가 깔려있다고 가정하고 시작하겠다. (만약 설치가 되어있지 않다면 &lt;a href=&quot;https://www.anaconda.com/distribution/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;클릭&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1. visual studio 2017 버전 설치&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.microsoft.com/ko-kr/visualstudio/releasenotes/vs2017-relnotes&quot;&gt;https://docs.microsoft.com/ko-kr/visualstudio/releasenotes/vs2017-relnotes&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1573629465758&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Visual Studio 2017 15.9 릴리스 정보&quot; data-og-description=&quot;Visual Studio 2017의 향상된 최신 기능에 대한 릴리스 정보입니다. Visual Studio를 사용하여 더 효과적으로 계획하고, 함께 코딩하여 빠르게 제공하세요.&quot; data-og-host=&quot;docs.microsoft.com&quot; data-og-source-url=&quot;https://docs.microsoft.com/ko-kr/visualstudio/releasenotes/vs2017-relnotes&quot; data-og-url=&quot;https://docs.microsoft.com/ko-kr/visualstudio/releasenotes/vs2017-relnotes&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/lgjbz/hyDF6A7wdL/26r75FkkXRYJqPqdjI7MIK/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400&quot;&gt;&lt;a href=&quot;https://docs.microsoft.com/ko-kr/visualstudio/releasenotes/vs2017-relnotes&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.microsoft.com/ko-kr/visualstudio/releasenotes/vs2017-relnotes&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/lgjbz/hyDF6A7wdL/26r75FkkXRYJqPqdjI7MIK/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;Visual Studio 2017 15.9 릴리스 정보&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Visual Studio 2017의 향상된 최신 기능에 대한 릴리스 정보입니다. Visual Studio를 사용하여 더 효과적으로 계획하고, 함께 코딩하여 빠르게 제공하세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;docs.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;위 주소로 들어가 download community 2017 버전을 깔면된다. 따로 설정은 필요없다. 만약 이전에 2019버전이 깔려있으면 삭제 후 진행한다.&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;b&gt;2. 가상환경 만들기&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;나는 1.x 버전은 conda base 환경에서 사용하므로, 2.0 을 새로운 가상환경을 만들어서 사용한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래 명령어를 통해 tensorflow2.0 이라는 이름으로 콘다 가상환경을 만들어준다. 이름은 자유자제로 만들어도 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #000000;&quot;&gt;conda create --name tensorflow2.0 python=3.6&lt;/span&gt;&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;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. cuda 및 cudnn 설치&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a href=&quot;https://developer.nvidia.com/cuda-toolkit-archive&quot;&gt;https://developer.nvidia.com/cuda-toolkit-archive&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1573629713725&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;CUDA Toolkit Archive&quot; data-og-description=&quot;Previous releases of the CUDA Toolkit, GPU Computing SDK, documentation and developer drivers can be found using the links below. Please select the release you want from the list below, and be sure to check www.nvidia.com/drivers for more recent production&quot; data-og-host=&quot;developer.nvidia.com&quot; data-og-source-url=&quot;https://developer.nvidia.com/cuda-toolkit-archive&quot; data-og-url=&quot;https://developer.nvidia.com/cuda-toolkit-archive&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://developer.nvidia.com/cuda-toolkit-archive&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.nvidia.com/cuda-toolkit-archive&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;CUDA Toolkit Archive&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Previous releases of the CUDA Toolkit, GPU Computing SDK, documentation and developer drivers can be found using the links below. Please select the release you want from the list below, and be sure to check www.nvidia.com/drivers for more recent production&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;developer.nvidia.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.nvidia.com/rdp/cudnn-archive&quot;&gt;https://developer.nvidia.com/rdp/cudnn-archive&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1573629721330&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;cuDNN Archive&quot; data-og-description=&quot;NVIDIA cuDNN is a GPU-accelerated library of primitives for deep neural networks.&quot; data-og-host=&quot;developer.nvidia.com&quot; data-og-source-url=&quot;https://developer.nvidia.com/rdp/cudnn-archive&quot; data-og-url=&quot;https://developer.nvidia.com/rdp/cudnn-archive&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://developer.nvidia.com/rdp/cudnn-archive&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.nvidia.com/rdp/cudnn-archive&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;cuDNN Archive&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;NVIDIA cuDNN is a GPU-accelerated library of primitives for deep neural networks.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;developer.nvidia.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;위 두 페이지로 들어가서 cuda 10.0 을 다운받고, 설치 후 / cudnn 7.6.0 for cuda 10.0 을 클릭해서 맞은 운영체제에 맞게 cudnn 안에 있는 폴더를 cuda에 덮어씌운다.&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;4. tensorflow gpu 설치&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #000000;&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;conda activate tensorflow2.0&lt;/span&gt;&amp;nbsp; &lt;/span&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: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #000000;&quot;&gt;(tensorflow2.0) pip install tensorflow-gpu==2.0.0&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;span style=&quot;color: #000000;&quot;&gt;/ (base)-&amp;gt;(tensorflow2.0) 으로 바뀐지 확인 후 tensorflow gpu 설치&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;p&gt;&lt;b&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5. 설치 후 테스트&lt;/span&gt;&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: #ffffff; background-color: #000000;&quot;&gt;(tensorflow2.0) jupyter lab &lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;&amp;nbsp; /&amp;nbsp; 명령어를 통해 jupyter lab을 활성화 한 후&amp;nbsp; notebook파일 하나 만든 후&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ffffff; background-color: #000000;&quot;&gt;import tensorflow as tf&lt;br /&gt;print(tf.__version__) &lt;br /&gt;&lt;a style=&quot;color: #ffffff; background-color: #000000;&quot; href=&quot;tf.test.is_gpu_available()&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;tf.test.is_gpu_available()&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ffffff; background-color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;로 True가 되는 지 확인&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ffffff; background-color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;True가 나온다면 설치 끝~ 이제 즐거운 딥러닝을 시작하면된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ffffff; background-color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;혹시나 다시 1.x 대로 작업하고 싶다면 conda deactivate 하면 (base) 로 돌아와서 다시 1.x로 작업할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;ps)&lt;/p&gt;
&lt;p&gt;conda install tensorflow-gpu==2.0.0 으로 설치해서 cuda도 잡아준다고해서 설치했는데 뭔가 오류가 뜨고 수정이 힘든부분이 있어, 그냥 pip 명령어로 설치하였다.&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: #ffffff; background-color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;ref)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ffffff; background-color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;&lt;a href=&quot;https://chan-lab.tistory.com/13&quot;&gt;https://chan-lab.tistory.com/13&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ffffff; background-color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;&lt;a href=&quot;https://www.tensorflow.org/install/pip?lang=python3&quot;&gt;https://www.tensorflow.org/install/pip?lang=python3&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>02. Study/Tensorflow</category>
      <category>anaconda 가상환경 만들기</category>
      <category>anaconda 환경으로 tensorflow 설치</category>
      <category>tensorflow 2.0 install</category>
      <category>tensorflow 2.0 깔기</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/144</guid>
      <comments>https://boysboy3.tistory.com/144#entry144comment</comments>
      <pubDate>Wed, 13 Nov 2019 16:33:02 +0900</pubDate>
    </item>
    <item>
      <title>python break, pass, continue 차이점</title>
      <link>https://boysboy3.tistory.com/143</link>
      <description>&lt;p&gt;파이썬으로 코딩을 하다보면 break문, pass문, continue 문이 자주 보인다.&lt;/p&gt;
&lt;p&gt;헷갈리는 부분을 정리하고자 각 각 사용법과 예시를 통해 정리해본다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;break&lt;/b&gt; : 특정 반복문&lt;span style=&quot;color: #333333;&quot;&gt;(while, for 문)&lt;/span&gt;에서 루프를 빠져나올때 이용하는데, 한번만 빠져나오게 된다. 이중 포문일때, 해당 루프만 탈출하고 다음껀 계속 반복되서 다시 또 다음루프를 들어갈 수 있다.&lt;/p&gt;
&lt;p&gt;ex)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;range(3): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print('탈출&amp;nbsp;준비') &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;j&amp;nbsp;in&amp;nbsp;range(3): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print('탈출&amp;nbsp;하자') &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break&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;br /&gt;탈출&amp;nbsp;하자 &lt;br /&gt;탈출&amp;nbsp;준비 &lt;br /&gt;탈출&amp;nbsp;하자 &lt;br /&gt;탈출&amp;nbsp;준비 &lt;br /&gt;탈출&amp;nbsp;하자&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위와같은 결과를 얻는데, 만약 i도는 루프를 탈출하고싶다면, 조건을 걸어서 탈출할 수 있다.&lt;/p&gt;
&lt;p&gt;ex)&lt;/p&gt;
&lt;p&gt;y&amp;nbsp;=&amp;nbsp;False &lt;br /&gt;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;range(3): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;y: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print('탈출&amp;nbsp;준비') &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;j&amp;nbsp;in&amp;nbsp;range(3): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print('탈출&amp;nbsp;하자') &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y&amp;nbsp;=&amp;nbsp;True &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;결과&lt;/p&gt;
&lt;p&gt;탈출&amp;nbsp;준비 &lt;br /&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;pass&lt;/b&gt; : 단순하게 실행할 코드가 없다는 것을 의미한다.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;ex)&lt;br /&gt;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;a: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;i&amp;nbsp;==&amp;nbsp;3: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(i) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pass &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print('pass')&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;결과&lt;/p&gt;
&lt;p&gt;3 &lt;br /&gt;pass &lt;br /&gt;pass &lt;br /&gt;pass&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;continue&lt;/b&gt; : 강제로 다음 loop를 돌게 하는 것을 의미&lt;/p&gt;
&lt;p&gt;ex)&lt;/p&gt;
&lt;p&gt;a&amp;nbsp;=&amp;nbsp;[3,6,9] &lt;br /&gt;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;a: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;i&amp;nbsp;==&amp;nbsp;3: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(i) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print('pass')&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;결과&lt;/p&gt;
&lt;p&gt;3 &lt;br /&gt;pass &lt;br /&gt;pass&lt;/p&gt;</description>
      <category>02. Study/Python</category>
      <category>python break</category>
      <category>python continue</category>
      <category>python pass</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/143</guid>
      <comments>https://boysboy3.tistory.com/143#entry143comment</comments>
      <pubDate>Tue, 15 Oct 2019 17:44:09 +0900</pubDate>
    </item>
    <item>
      <title>OpenCV를 이용한 Yolo v3 적용하기</title>
      <link>https://boysboy3.tistory.com/142</link>
      <description>&lt;p&gt;개인적인 공부 개념으로 저장해두는 공간입니다.&lt;/p&gt;
&lt;p&gt;원본글을 기반으로 만들었습니다. 문제가 되면 지우도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;a href=&quot;https://pysource.com/2019/06/27/yolo-object-detection-using-opencv-with-python/&quot;&gt;https://pysource.com/2019/06/27/yolo-object-detection-using-opencv-with-python/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1570891540441&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;YOLO object detection using Opencv with Python - Pysource&quot; data-og-description=&quot;We&amp;rsquo;re going to learn in this tutorial YOLO object detection. Yolo is a deep learning algorythm which came out on may 2016 and it became quickly so popular because it&amp;rsquo;s so fast compared with the previous deep learning algorythm. With yolo we can detect obje&quot; data-og-host=&quot;pysource.com&quot; data-og-source-url=&quot;https://pysource.com/2019/06/27/yolo-object-detection-using-opencv-with-python/&quot; data-og-url=&quot;https://pysource.com/2019/06/27/yolo-object-detection-using-opencv-with-python/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Rz3D7/hyDevfNCdj/X9LDMd1eu6MYVzZYHs7hr1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=942_122_1038_226&quot;&gt;&lt;a href=&quot;https://pysource.com/2019/06/27/yolo-object-detection-using-opencv-with-python/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pysource.com/2019/06/27/yolo-object-detection-using-opencv-with-python/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Rz3D7/hyDevfNCdj/X9LDMd1eu6MYVzZYHs7hr1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=942_122_1038_226');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;YOLO object detection using Opencv with Python - Pysource&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;We&amp;rsquo;re going to learn in this tutorial YOLO object detection. Yolo is a deep learning algorythm which came out on may 2016 and it became quickly so popular because it&amp;rsquo;s so fast compared with the previous deep learning algorythm. With yolo we can detect obje&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;pysource.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;darknet을 많이 이욯해서 keras나 tensorflow에서 많이 사용하겠지만,&lt;/p&gt;
&lt;p&gt;opencv에서도 간편하게 사용할 수 있는 방법이 있어서 정리하려고 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;여기 예제에서는, yolov3-320 pre-trained된 모델을 이용하기 때문에, weight파일과 cfg 파일을 다운받아야 한다. &lt;a href=&quot;https://pjreddie.com/darknet/yolo/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;다운&lt;/a&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-filename=&quot;test.JPG&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HIKCq/btqyYO8kZUb/56lMBXcm6XMMo1eevKnum0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HIKCq/btqyYO8kZUb/56lMBXcm6XMMo1eevKnum0/img.jpg&quot; data-alt=&quot;원본&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HIKCq/btqyYO8kZUb/56lMBXcm6XMMo1eevKnum0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHIKCq%2FbtqyYO8kZUb%2F56lMBXcm6XMMo1eevKnum0%2Fimg.jpg&quot; data-filename=&quot;test.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;/&gt;&lt;/span&gt;&lt;figcaption&gt;원본&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;yolov3 모델같은 경우는 coco dataset기준으로 학습이 되어 있으므로, 80개 종류를 디텍션 할 수 있다.&lt;/p&gt;
&lt;p&gt;만약 원하면 커스텀 데이터에 대해서도 학습할 수 있다.&lt;/p&gt;
&lt;p&gt;classes&amp;nbsp;=&amp;nbsp;[&quot;person&quot;,&amp;nbsp;&quot;bicycle&quot;,&amp;nbsp;&quot;car&quot;,&amp;nbsp;&quot;motorcycle&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;airplane&quot;,&amp;nbsp;&quot;bus&quot;,&amp;nbsp;&quot;train&quot;,&amp;nbsp;&quot;truck&quot;,&amp;nbsp;&quot;boat&quot;,&amp;nbsp;&quot;traffic&amp;nbsp;light&quot;,&amp;nbsp;&quot;fire&amp;nbsp;hydrant&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;stop&amp;nbsp;sign&quot;,&amp;nbsp;&quot;parking&amp;nbsp;meter&quot;,&amp;nbsp;&quot;bench&quot;,&amp;nbsp;&quot;bird&quot;,&amp;nbsp;&quot;cat&quot;,&amp;nbsp;&quot;dog&quot;,&amp;nbsp;&quot;horse&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;sheep&quot;,&amp;nbsp;&quot;cow&quot;,&amp;nbsp;&quot;elephant&quot;,&amp;nbsp;&quot;bear&quot;,&amp;nbsp;&quot;zebra&quot;,&amp;nbsp;&quot;giraffe&quot;,&amp;nbsp;&quot;backpack&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;umbrella&quot;,&amp;nbsp;&quot;handbag&quot;,&amp;nbsp;&quot;tie&quot;,&amp;nbsp;&quot;suitcase&quot;,&amp;nbsp;&quot;frisbee&quot;,&amp;nbsp;&quot;skis&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;snowboard&quot;,&amp;nbsp;&quot;sports&amp;nbsp;ball&quot;,&amp;nbsp;&quot;kite&quot;,&amp;nbsp;&quot;baseball&amp;nbsp;bat&quot;,&amp;nbsp;&quot;baseball&amp;nbsp;glove&quot;,&amp;nbsp;&quot;skateboard&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;surfboard&quot;,&amp;nbsp;&quot;tennis&amp;nbsp;racket&quot;,&amp;nbsp;&quot;bottle&quot;,&amp;nbsp;&quot;wine&amp;nbsp;glass&quot;,&amp;nbsp;&quot;cup&quot;,&amp;nbsp;&quot;fork&quot;,&amp;nbsp;&quot;knife&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;spoon&quot;,&amp;nbsp;&quot;bowl&quot;,&amp;nbsp;&quot;banana&quot;,&amp;nbsp;&quot;apple&quot;,&amp;nbsp;&quot;sandwich&quot;,&amp;nbsp;&quot;orange&quot;,&amp;nbsp;&quot;broccoli&quot;,&amp;nbsp;&quot;carrot&quot;,&amp;nbsp;&quot;hot&amp;nbsp;dog&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;pizza&quot;,&amp;nbsp;&quot;donut&quot;,&amp;nbsp;&quot;cake&quot;,&amp;nbsp;&quot;chair&quot;,&amp;nbsp;&quot;couch&quot;,&amp;nbsp;&quot;potted&amp;nbsp;plant&quot;,&amp;nbsp;&quot;bed&quot;,&amp;nbsp;&quot;dining&amp;nbsp;table&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;toilet&quot;,&amp;nbsp;&quot;tv&quot;,&amp;nbsp;&quot;laptop&quot;,&amp;nbsp;&quot;mouse&quot;,&amp;nbsp;&quot;remote&quot;,&amp;nbsp;&quot;keyboard&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;cell&amp;nbsp;phone&quot;,&amp;nbsp;&quot;microwave&quot;,&amp;nbsp;&quot;oven&quot;,&amp;nbsp;&quot;toaster&quot;,&amp;nbsp;&quot;sink&quot;,&amp;nbsp;&quot;refrigerator&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;book&quot;,&amp;nbsp;&quot;clock&quot;,&amp;nbsp;&quot;vase&quot;,&amp;nbsp;&quot;scissors&quot;,&amp;nbsp;&quot;teddy&amp;nbsp;bear&quot;,&amp;nbsp;&quot;hair&amp;nbsp;drier&quot;,&amp;nbsp;&quot;toothbrush&quot;&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;net&amp;nbsp;=&amp;nbsp;&lt;a href=&quot;cv2.dnn.readNet(&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;cv2.dnn.readNet(&lt;/a&gt;&quot;yolov3.weights&quot;,&amp;nbsp;&quot;&lt;a href=&quot;yolov3.cfg&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;yolov3.cfg&lt;/a&gt;&quot;) 이런식으로 모델을 간편하게 불러올 수 있다.&lt;/p&gt;
&lt;p&gt;또한, cv2.VideoCapture를 이용하면 real-time object detection도 간편하게 할 수 있다.&lt;/p&gt;
&lt;p&gt;tiny버전을 받으면 생각보다 frame이 잘나온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;888.JPG&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZQkxk/btqy02w45u3/KGIWMqZfdFQLu5Gdk2XrR0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZQkxk/btqy02w45u3/KGIWMqZfdFQLu5Gdk2XrR0/img.jpg&quot; data-alt=&quot;result&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZQkxk/btqy02w45u3/KGIWMqZfdFQLu5Gdk2XrR0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZQkxk%2Fbtqy02w45u3%2FKGIWMqZfdFQLu5Gdk2XrR0%2Fimg.jpg&quot; data-filename=&quot;888.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;/&gt;&lt;/span&gt;&lt;figcaption&gt;result&lt;/figcaption&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;a href=&quot;https://github.com/kimtaehyeong/Deep_Learning/blob/master/Object_detection/opencv_yolov3.ipynb&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;클릭&lt;/a&gt;&amp;nbsp; 여기서 확인하거나 원본 글 &lt;a href=&quot;https://pysource.com/2019/06/27/yolo-object-detection-using-opencv-with-python/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;클릭&lt;/a&gt; 에서 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>02. Study/Computer Vision(openframworks&amp;amp;opencv)</category>
      <category>opencv object detection</category>
      <category>opencv yolo v3</category>
      <category>opencv 오브젝트 검출</category>
      <category>yolo object detection</category>
      <category>yolo v3</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/142</guid>
      <comments>https://boysboy3.tistory.com/142#entry142comment</comments>
      <pubDate>Sun, 13 Oct 2019 00:02:40 +0900</pubDate>
    </item>
    <item>
      <title>ImageAI 를 활용한 15줄짜리 object detection</title>
      <link>https://boysboy3.tistory.com/141</link>
      <description>&lt;p&gt;더욱 자세한 정보는&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://towardsdatascience.com/object-detection-with-10-lines-of-code-d6cb4d86f606&quot;&gt;https://towardsdatascience.com/object-detection-with-10-lines-of-code-d6cb4d86f606&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1570427573755&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Object Detection with 10 lines of code&quot; data-og-description=&quot;Part 2 of this tutorial for detecting your custom objects is available via this link.&quot; data-og-host=&quot;towardsdatascience.com&quot; data-og-source-url=&quot;https://towardsdatascience.com/object-detection-with-10-lines-of-code-d6cb4d86f606&quot; data-og-url=&quot;https://towardsdatascience.com/object-detection-with-10-lines-of-code-d6cb4d86f606&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ywBlf/hyC868u7hV/8uUtZ7G9ENGJABJShtBJA1/img.png?width=768&amp;amp;height=461&amp;amp;face=0_0_768_461,https://scrap.kakaocdn.net/dn/cBPYWD/hyC6C83fBr/g9u1Fs6kx9uor5PGmN81W0/img.jpg?width=60&amp;amp;height=39&amp;amp;face=0_0_60_39,https://scrap.kakaocdn.net/dn/bueJVl/hyC6GwQEQ3/ytfYFA1IabWL90Hijfaxc0/img.png?width=60&amp;amp;height=36&amp;amp;face=0_0_60_36&quot;&gt;&lt;a href=&quot;https://towardsdatascience.com/object-detection-with-10-lines-of-code-d6cb4d86f606&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://towardsdatascience.com/object-detection-with-10-lines-of-code-d6cb4d86f606&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ywBlf/hyC868u7hV/8uUtZ7G9ENGJABJShtBJA1/img.png?width=768&amp;amp;height=461&amp;amp;face=0_0_768_461,https://scrap.kakaocdn.net/dn/cBPYWD/hyC6C83fBr/g9u1Fs6kx9uor5PGmN81W0/img.jpg?width=60&amp;amp;height=39&amp;amp;face=0_0_60_39,https://scrap.kakaocdn.net/dn/bueJVl/hyC6GwQEQ3/ytfYFA1IabWL90Hijfaxc0/img.png?width=60&amp;amp;height=36&amp;amp;face=0_0_60_36');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Object Detection with 10 lines of code&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Part 2 of this tutorial for detecting your custom objects is available via this link.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;towardsdatascience.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;faster rcnn, yolo 등 다양한 오브젝트 디텍션 모델들이 나와있지만, 초보자가 사용하기가 힘든 문제점이 있다.&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; jupyter lab&lt;/p&gt;
&lt;p&gt;version :&amp;nbsp; python3.7, keras, tensorflow, matplot, imageai 모듈이 깔려있다고 가정한다.&lt;/p&gt;
&lt;p&gt;ImageAI는 pip install imageai&amp;nbsp; 명령어를 통해 간편하게 설치할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;또한 실습에 필요한 pre-trained 된 모델은 retinanet을 이용하였으며, &lt;a href=&quot;https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/resnet50_coco_best_v2.0.1.h5&quot;&gt;link&lt;/a&gt;&amp;lt; 여기서 받을 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;image.JPG&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RSM9J/btqySsbvWbP/4DQZ2eVgIM0PglpsQdb8Xk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RSM9J/btqySsbvWbP/4DQZ2eVgIM0PglpsQdb8Xk/img.jpg&quot; data-alt=&quot;원본&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RSM9J/btqySsbvWbP/4DQZ2eVgIM0PglpsQdb8Xk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRSM9J%2FbtqySsbvWbP%2F4DQZ2eVgIM0PglpsQdb8Xk%2Fimg.jpg&quot; data-filename=&quot;image.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;/&gt;&lt;/span&gt;&lt;figcaption&gt;원본&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;image.jpg&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdSPb3/btqyQMoFerd/Jt6et4tcvk744fJe5MjwI0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdSPb3/btqyQMoFerd/Jt6et4tcvk744fJe5MjwI0/img.jpg&quot; data-alt=&quot;디텍션 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdSPb3/btqyQMoFerd/Jt6et4tcvk744fJe5MjwI0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdSPb3%2FbtqyQMoFerd%2FJt6et4tcvk744fJe5MjwI0%2Fimg.jpg&quot; data-filename=&quot;image.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;/&gt;&lt;/span&gt;&lt;figcaption&gt;디텍션 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위 그림처럼 결과를 얻을 수 있으며, 아마 coco dataset기반으로 pretrained 된 모델이니 디텍션 결과 종류를 얻을 수 있을 것이다.&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;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;p&gt;10&lt;/p&gt;
&lt;p&gt;11&lt;/p&gt;
&lt;p&gt;12&lt;/p&gt;
&lt;p&gt;13&lt;/p&gt;
&lt;p&gt;14&lt;/p&gt;
&lt;p&gt;15&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;numpy&amp;nbsp;as&amp;nbsp;np&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;matplotlib.pyplot&amp;nbsp;as&amp;nbsp;plt&lt;/p&gt;
&lt;p&gt;&lt;span&gt;from&lt;/span&gt;&amp;nbsp;matplotlib.image&amp;nbsp;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;imread&lt;/p&gt;
&lt;p&gt;&lt;span&gt;from&lt;/span&gt;&amp;nbsp;imageai.Detection&amp;nbsp;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;ObjectDetection&lt;/p&gt;
&lt;p&gt;&lt;span&gt;import&lt;/span&gt;&amp;nbsp;os&lt;/p&gt;
&lt;p&gt;detector&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;ObjectDetection()&lt;/p&gt;
&lt;p&gt;detector.setModelTypeAsRetinaNet()&lt;/p&gt;
&lt;p&gt;detector.setModelPath(&lt;span&gt;&quot;model/resnet50_coco_best_v2.0.1.h5&quot;&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;detector.loadModel()&lt;/p&gt;
&lt;p&gt;detections&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;detector.detectObjectsFromImage(input_image&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;input_images/image.jpg&quot;&lt;/span&gt;,&lt;/p&gt;
&lt;p&gt;&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;&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;&amp;nbsp;output_image_path&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;output_images/image.jpg&quot;&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;&lt;span&gt;for&lt;/span&gt;&amp;nbsp;eachObject&amp;nbsp;&lt;span&gt;in&lt;/span&gt;&amp;nbsp;detections:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;print&lt;/span&gt;(eachObject[&lt;span&gt;&quot;name&quot;&lt;/span&gt;]&amp;nbsp;,&amp;nbsp;&lt;span&gt;&quot;&amp;nbsp;:&amp;nbsp;&quot;&lt;/span&gt;&amp;nbsp;,&amp;nbsp;eachObject[&lt;span&gt;&quot;percentage_probability&quot;&lt;/span&gt;]&amp;nbsp;)&lt;/p&gt;
&lt;p&gt;img&amp;nbsp;&lt;span&gt;=&lt;/span&gt;&amp;nbsp;imread(&lt;span&gt;'output_images/image.jpg'&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;plt.imshow(img)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;&lt;span&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;만약 coco dataset 처럼 custom 데이터와 위치정보 라벨된 데이터셋이 있어서 학습을 시키고 싶다면,&lt;/p&gt;
&lt;p&gt;아래 코드로 간편하게 학습도 가능한거 같다.&lt;/p&gt;
&lt;p&gt;결국 데이터가 ..ㅠ&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://medium.com/deepquestai/train-object-detection-ai-with-6-lines-of-code-6d087063f6ff&quot;&gt;https://medium.com/deepquestai/train-object-detection-ai-with-6-lines-of-code-6d087063f6ff&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1570428429242&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Train Object Detection AI with 6 lines of code&quot; data-og-description=&quot;Step-by-step tutorial on training object detection models on your own dataset&quot; data-og-host=&quot;medium.com&quot; data-og-source-url=&quot;https://medium.com/deepquestai/train-object-detection-ai-with-6-lines-of-code-6d087063f6ff&quot; data-og-url=&quot;https://medium.com/deepquestai/train-object-detection-ai-with-6-lines-of-code-6d087063f6ff&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/GoCja/hyC6I2wKQk/RzKkKeYzefdu6u8NUSNRF0/img.jpg?width=1000&amp;amp;height=666&amp;amp;face=0_0_1000_666,https://scrap.kakaocdn.net/dn/HY1UD/hyC84W9lyv/vGHKf7zV3Rd1J7IwO2e0gK/img.jpg?width=60&amp;amp;height=39&amp;amp;face=0_0_60_39,https://scrap.kakaocdn.net/dn/dAlc74/hyC6LkCCDY/MjP442MjWp2Mi64wFVpRO1/img.jpg?width=60&amp;amp;height=39&amp;amp;face=0_0_60_39&quot;&gt;&lt;a href=&quot;https://medium.com/deepquestai/train-object-detection-ai-with-6-lines-of-code-6d087063f6ff&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://medium.com/deepquestai/train-object-detection-ai-with-6-lines-of-code-6d087063f6ff&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/GoCja/hyC6I2wKQk/RzKkKeYzefdu6u8NUSNRF0/img.jpg?width=1000&amp;amp;height=666&amp;amp;face=0_0_1000_666,https://scrap.kakaocdn.net/dn/HY1UD/hyC84W9lyv/vGHKf7zV3Rd1J7IwO2e0gK/img.jpg?width=60&amp;amp;height=39&amp;amp;face=0_0_60_39,https://scrap.kakaocdn.net/dn/dAlc74/hyC6LkCCDY/MjP442MjWp2Mi64wFVpRO1/img.jpg?width=60&amp;amp;height=39&amp;amp;face=0_0_60_39');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Train Object Detection AI with 6 lines of code&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Step-by-step tutorial on training object detection models on your own dataset&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;medium.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>02. Study/Tensorflow</category>
      <category>10 line object detection</category>
      <category>object detection</category>
      <category>retinanet</category>
      <category>딥러닝 오브젝트 검출</category>
      <category>실시간 인식</category>
      <author>미카이</author>
      <guid isPermaLink="true">https://boysboy3.tistory.com/141</guid>
      <comments>https://boysboy3.tistory.com/141#entry141comment</comments>
      <pubDate>Mon, 7 Oct 2019 15:09:03 +0900</pubDate>
    </item>
  </channel>
</rss>