-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrss2.xml
416 lines (233 loc) · 444 KB
/
rss2.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title>빈챙의 뚝딱뚝딱 개발 블로그</title>
<link>http://techbless.github.io/</link>
<atom:link href="/rss2.xml" rel="self" type="application/rss+xml"/>
<description>개발, 알고리즘, 시스템 최적화까지 깊이 있는 기술 이야기 🛠️🚀</description>
<pubDate>Sat, 29 Mar 2025 05:18:44 GMT</pubDate>
<generator>http://hexo.io/</generator>
<item>
<title>Backpressure: 생산자-소비자 속도 불균형 문제 해결과 Little’s Law [C#]</title>
<link>http://techbless.github.io/2025/03/27/back-pressure/</link>
<guid>http://techbless.github.io/2025/03/27/back-pressure/</guid>
<pubDate>Thu, 27 Mar 2025 02:26:11 GMT</pubDate>
<description>
<h1 id="C-생산자-소비자-속도-불균형-문제-해결"><a href="#C-생산자-소비자-속도-불균형-문제-해결" class="headerlink" title="C# 생산자-소비자 속도 불균형 문제 해결"></a>C# 생산자-소비자 속도 불균형 문
</description>
<content:encoded><![CDATA[<h1 id="C-생산자-소비자-속도-불균형-문제-해결"><a href="#C-생산자-소비자-속도-불균형-문제-해결" class="headerlink" title="C# 생산자-소비자 속도 불균형 문제 해결"></a>C# 생산자-소비자 속도 불균형 문제 해결</h1><blockquote><p>생산자와 소비자 간 속도차에 따른 백프레셔(Backpressure) 전략과 Little’s Law 활용</p></blockquote><p>생산자-소비자(Producer-Consumer) 패턴에서 흔히 발생하는 문제 중 하나는 <strong>생산자와 소비자 간의 속도 불균형</strong>이다. 특히 생산자의 속도가 소비자보다 빠를 때 큐에 과부하가 발생하며, 자원 부족 현상으로 이어질 수 있다. 본 글에서는 이러한 문제를 해결하는 전략인 **백프레셔(Backpressure)**를 C# 예시와 함께 다루고, Queueing 이론에서의 <strong>Little’s Law</strong> 를 간략히 소개하여 이론적 배경을 제공한다.</p><hr><h2 id="상황-설정-Problem-Definition"><a href="#상황-설정-Problem-Definition" class="headerlink" title="상황 설정 (Problem Definition)"></a>상황 설정 (Problem Definition)</h2><p>생산자가 소비자보다 데이터를 훨씬 빠르게 생산하는 상황을 생각해보자.</p><ul><li>생산자(Producer) 속도: <strong>초당 1000건</strong></li><li>소비자(Consumer) 속도: <strong>초당 100건</strong></li></ul><p>이 상황에서 아무런 대책이 없으면 Queue(또는 Channel)가 빠르게 가득 차고 메모리 사용량이 급격히 증가한다.</p><hr><h2 id="백프레셔-Backpressure-개념"><a href="#백프레셔-Backpressure-개념" class="headerlink" title="백프레셔(Backpressure) 개념"></a>백프레셔(Backpressure) 개념</h2><p><strong>백프레셔</strong>란 소비자의 처리 능력을 초과하는 생산 속도를 제어하여 시스템 안정성을 유지하는 방법을 뜻한다. 대표적인 방식은 다음과 같다.</p><ul><li><strong>Bounded Queue (제한된 큐 크기 설정)</strong></li><li><strong>데이터 드롭(Drop Strategy)</strong></li><li><strong>생산자 속도 제한(Rate Limiting)</strong></li></ul><hr><h2 id="Queueing-이론-및-Little’s-Law-소개"><a href="#Queueing-이론-및-Little’s-Law-소개" class="headerlink" title="Queueing 이론 및 Little’s Law 소개"></a>Queueing 이론 및 Little’s Law 소개</h2><p>Queueing 이론에서는 다음과 같은 기본 법칙이 존재한다.</p><p><strong>리틀의 법칙(Little’s Law)</strong>:</p><p><mjx-container class="MathJax" jax="SVG" display="true"><svg style="vertical-align: -0.186ex;" xmlns="http://www.w3.org/2000/svg" width="8.248ex" height="1.756ex" role="img" focusable="false" viewBox="0 -694 3645.6 776"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D43F" d="M228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 217 683Q271 680 344 680Q485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628Q387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54T478 72T522 106T564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203T583 83T557 9Q555 4 553 3T537 0T494 -1Q483 -1 418 -1T294 0H116Q32 0 32 10Q32 17 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637Z"></path></g><g data-mml-node="mo" transform="translate(958.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mi" transform="translate(2014.6,0)"><path data-c="1D706" d="M166 673Q166 685 183 694H202Q292 691 316 644Q322 629 373 486T474 207T524 67Q531 47 537 34T546 15T551 6T555 2T556 -2T550 -11H482Q457 3 450 18T399 152L354 277L340 262Q327 246 293 207T236 141Q211 112 174 69Q123 9 111 -1T83 -12Q47 -12 47 20Q47 37 61 52T199 187Q229 216 266 252T321 306L338 322Q338 323 288 462T234 612Q214 657 183 657Q166 657 166 673Z"></path></g><g data-mml-node="mi" transform="translate(2597.6,0)"><path data-c="1D44A" d="M436 683Q450 683 486 682T553 680Q604 680 638 681T677 682Q695 682 695 674Q695 670 692 659Q687 641 683 639T661 637Q636 636 621 632T600 624T597 615Q597 603 613 377T629 138L631 141Q633 144 637 151T649 170T666 200T690 241T720 295T759 362Q863 546 877 572T892 604Q892 619 873 628T831 637Q817 637 817 647Q817 650 819 660Q823 676 825 679T839 682Q842 682 856 682T895 682T949 681Q1015 681 1034 683Q1048 683 1048 672Q1048 666 1045 655T1038 640T1028 637Q1006 637 988 631T958 617T939 600T927 584L923 578L754 282Q586 -14 585 -15Q579 -22 561 -22Q546 -22 542 -17Q539 -14 523 229T506 480L494 462Q472 425 366 239Q222 -13 220 -15T215 -19Q210 -22 197 -22Q178 -22 176 -15Q176 -12 154 304T131 622Q129 631 121 633T82 637H58Q51 644 51 648Q52 671 64 683H76Q118 680 176 680Q301 680 313 683H323Q329 677 329 674T327 656Q322 641 318 637H297Q236 634 232 620Q262 160 266 136L501 550L499 587Q496 629 489 632Q483 636 447 637Q428 637 422 639T416 648Q416 650 418 660Q419 664 420 669T421 676T424 680T428 682T436 683Z"></path></g></g></g></svg></mjx-container></p><ul><li><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="1.541ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 681 683"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D43F" d="M228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 217 683Q271 680 344 680Q485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628Q387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54T478 72T522 106T564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203T583 83T557 9Q555 4 553 3T537 0T494 -1Q483 -1 418 -1T294 0H116Q32 0 32 10Q32 17 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637Z"></path></g></g></g></svg></mjx-container>: 평균 큐 크기(대기 중인 항목 수)</li><li><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.027ex;" xmlns="http://www.w3.org/2000/svg" width="1.319ex" height="1.597ex" role="img" focusable="false" viewBox="0 -694 583 706"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D706" d="M166 673Q166 685 183 694H202Q292 691 316 644Q322 629 373 486T474 207T524 67Q531 47 537 34T546 15T551 6T555 2T556 -2T550 -11H482Q457 3 450 18T399 152L354 277L340 262Q327 246 293 207T236 141Q211 112 174 69Q123 9 111 -1T83 -12Q47 -12 47 20Q47 37 61 52T199 187Q229 216 266 252T321 306L338 322Q338 323 288 462T234 612Q214 657 183 657Q166 657 166 673Z"></path></g></g></g></svg></mjx-container>: 큐에 진입하는 평균 요청률(Throughput, 초당 요청 건수)</li><li><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.05ex;" xmlns="http://www.w3.org/2000/svg" width="2.371ex" height="1.595ex" role="img" focusable="false" viewBox="0 -683 1048 705"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D44A" d="M436 683Q450 683 486 682T553 680Q604 680 638 681T677 682Q695 682 695 674Q695 670 692 659Q687 641 683 639T661 637Q636 636 621 632T600 624T597 615Q597 603 613 377T629 138L631 141Q633 144 637 151T649 170T666 200T690 241T720 295T759 362Q863 546 877 572T892 604Q892 619 873 628T831 637Q817 637 817 647Q817 650 819 660Q823 676 825 679T839 682Q842 682 856 682T895 682T949 681Q1015 681 1034 683Q1048 683 1048 672Q1048 666 1045 655T1038 640T1028 637Q1006 637 988 631T958 617T939 600T927 584L923 578L754 282Q586 -14 585 -15Q579 -22 561 -22Q546 -22 542 -17Q539 -14 523 229T506 480L494 462Q472 425 366 239Q222 -13 220 -15T215 -19Q210 -22 197 -22Q178 -22 176 -15Q176 -12 154 304T131 622Q129 631 121 633T82 637H58Q51 644 51 648Q52 671 64 683H76Q118 680 176 680Q301 680 313 683H323Q329 677 329 674T327 656Q322 641 318 637H297Q236 634 232 620Q262 160 266 136L501 550L499 587Q496 629 489 632Q483 636 447 637Q428 637 422 639T416 648Q416 650 418 660Q419 664 420 669T421 676T424 680T428 682T436 683Z"></path></g></g></g></svg></mjx-container>: 평균 큐 대기 시간</li></ul><p>이 법칙을 활용하여 다음과 같은 예측이 가능하다:</p><ul><li>소비자의 처리율이 정해져 있을 때 큐 크기(<code>L</code>)와 평균 대기 시간(<code>W</code>) 사이의 관계를 파악하여 <strong>최적의 버퍼 크기를 설정</strong>할 수 있다.</li></ul><hr><h2 id="Channel로-백프레셔-구현하기-Bounded-Channel-예시"><a href="#Channel로-백프레셔-구현하기-Bounded-Channel-예시" class="headerlink" title="Channel로 백프레셔 구현하기 (Bounded Channel 예시)"></a>Channel<t>로 백프레셔 구현하기 (Bounded Channel 예시)</t></h2><p>아래는 <code>Channel<T></code>를 사용하여 버퍼 크기를 제한하고, 생산자가 속도 차이로 인해 자동으로 대기하도록 구현한 예시다.</p><h3 id="구현-다이어그램"><a href="#구현-다이어그램" class="headerlink" title="구현 다이어그램"></a>구현 다이어그램</h3><pre class="mermaid">graph LR Producer["Producer(Fast)"] --> Channel["BoundedChannel (Cap: 100)"] Channel["Bounded Channel (Cap: 100)"] --> Consumer["Consumer(Slow)"] Channel -- "Wait if full" --> Producer</pre><h3 id="C-코드-예시"><a href="#C-코드-예시" class="headerlink" title="C# 코드 예시"></a>C# 코드 예시</h3><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> options = <span class="keyword">new</span> BoundedChannelOptions(capacity: <span class="number">100</span>)</span><br><span class="line">{</span><br><span class="line"> FullMode = BoundedChannelFullMode.Wait <span class="comment">// 큐가 꽉 차면 생산자 대기</span></span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> channel = Channel.CreateBounded<<span class="built_in">int</span>>(options);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 생산자 Task</span></span><br><span class="line"><span class="keyword">var</span> producer = Task.Run(<span class="keyword">async</span> () =></span><br><span class="line">{</span><br><span class="line"> <span class="built_in">int</span> i = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">while</span> (<span class="literal">true</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">await</span> channel.Writer.WriteAsync(i++);</span><br><span class="line"> Console.WriteLine(<span class="string">$"Produced: <span class="subst">{i}</span>"</span>);</span><br><span class="line"> <span class="keyword">await</span> Task.Delay(<span class="number">1</span>); <span class="comment">// 초당 약 1000개 생산</span></span><br><span class="line"> }</span><br><span class="line">});</span><br><span class="line"></span><br><span class="line"><span class="comment">// 소비자 Task</span></span><br><span class="line"><span class="keyword">var</span> consumer = Task.Run(<span class="keyword">async</span> () =></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">await</span> <span class="keyword">foreach</span> (<span class="keyword">var</span> item <span class="keyword">in</span> channel.Reader.ReadAllAsync())</span><br><span class="line"> {</span><br><span class="line"> Console.WriteLine(<span class="string">$"Consumed: <span class="subst">{item}</span>"</span>);</span><br><span class="line"> <span class="keyword">await</span> Task.Delay(<span class="number">10</span>); <span class="comment">// 초당 약 100개 처리 (느림)</span></span><br><span class="line"> }</span><br><span class="line">});</span><br><span class="line"></span><br><span class="line"><span class="keyword">await</span> Task.WhenAll(producer, consumer);</span><br></pre></td></tr></table></figure><h3 id="결과-및-분석"><a href="#결과-및-분석" class="headerlink" title="결과 및 분석"></a>결과 및 분석</h3><ul><li><code>Channel</code>의 크기가 제한되어 있으므로, Queue가 꽉 차면 생산자는 자동으로 <code>WriteAsync()</code>에서 대기 상태로 전환된다.</li><li>따라서 <strong>메모리 사용량 폭증을 방지</strong>하고 시스템의 <strong>안정성 유지</strong>가 가능하다.</li></ul><p>이와 유사한 전략으로 <code>DropOldest</code>, <code>DropNewest</code> 옵션을 선택하면 자동으로 오래된 데이터나 새 데이터를 삭제하여 성능과 안정성을 균형 있게 맞출 수도 있다.</p><p>AD_HERE</p><h2 id="Little’s-Law를-이용한-채널-크기-예측"><a href="#Little’s-Law를-이용한-채널-크기-예측" class="headerlink" title="Little’s Law를 이용한 채널 크기 예측"></a>Little’s Law를 이용한 채널 크기 예측</h2><p>생산자(1000건/s)와 소비자(100건/s)의 처리 속도가 고정되었을 때, 다음처럼 Little’s Law를 적용하여 최적의 큐 크기를 예측할 수 있다.</p><p><mjx-container class="MathJax" jax="SVG" display="true"><svg style="vertical-align: -0.186ex;" xmlns="http://www.w3.org/2000/svg" width="8.248ex" height="1.756ex" role="img" focusable="false" viewBox="0 -694 3645.6 776"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D43F" d="M228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 217 683Q271 680 344 680Q485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628Q387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54T478 72T522 106T564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203T583 83T557 9Q555 4 553 3T537 0T494 -1Q483 -1 418 -1T294 0H116Q32 0 32 10Q32 17 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637Z"></path></g><g data-mml-node="mo" transform="translate(958.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mi" transform="translate(2014.6,0)"><path data-c="1D706" d="M166 673Q166 685 183 694H202Q292 691 316 644Q322 629 373 486T474 207T524 67Q531 47 537 34T546 15T551 6T555 2T556 -2T550 -11H482Q457 3 450 18T399 152L354 277L340 262Q327 246 293 207T236 141Q211 112 174 69Q123 9 111 -1T83 -12Q47 -12 47 20Q47 37 61 52T199 187Q229 216 266 252T321 306L338 322Q338 323 288 462T234 612Q214 657 183 657Q166 657 166 673Z"></path></g><g data-mml-node="mi" transform="translate(2597.6,0)"><path data-c="1D44A" d="M436 683Q450 683 486 682T553 680Q604 680 638 681T677 682Q695 682 695 674Q695 670 692 659Q687 641 683 639T661 637Q636 636 621 632T600 624T597 615Q597 603 613 377T629 138L631 141Q633 144 637 151T649 170T666 200T690 241T720 295T759 362Q863 546 877 572T892 604Q892 619 873 628T831 637Q817 637 817 647Q817 650 819 660Q823 676 825 679T839 682Q842 682 856 682T895 682T949 681Q1015 681 1034 683Q1048 683 1048 672Q1048 666 1045 655T1038 640T1028 637Q1006 637 988 631T958 617T939 600T927 584L923 578L754 282Q586 -14 585 -15Q579 -22 561 -22Q546 -22 542 -17Q539 -14 523 229T506 480L494 462Q472 425 366 239Q222 -13 220 -15T215 -19Q210 -22 197 -22Q178 -22 176 -15Q176 -12 154 304T131 622Q129 631 121 633T82 637H58Q51 644 51 648Q52 671 64 683H76Q118 680 176 680Q301 680 313 683H323Q329 677 329 674T327 656Q322 641 318 637H297Q236 634 232 620Q262 160 266 136L501 550L499 587Q496 629 489 632Q483 636 447 637Q428 637 422 639T416 648Q416 650 418 660Q419 664 420 669T421 676T424 680T428 682T436 683Z"></path></g></g></g></svg></mjx-container></p><ul><li><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="1.541ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 681 683"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D43F" d="M228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 217 683Q271 680 344 680Q485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628Q387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54T478 72T522 106T564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203T583 83T557 9Q555 4 553 3T537 0T494 -1Q483 -1 418 -1T294 0H116Q32 0 32 10Q32 17 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637Z"></path></g></g></g></svg></mjx-container>: Length - 시스템(큐 또는 채널)에 평균적으로 머물고 있는 항목(요청)의 개수 (평균 큐 크기 또는 평균 항목 수)</li><li><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.027ex;" xmlns="http://www.w3.org/2000/svg" width="1.319ex" height="1.597ex" role="img" focusable="false" viewBox="0 -694 583 706"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D706" d="M166 673Q166 685 183 694H202Q292 691 316 644Q322 629 373 486T474 207T524 67Q531 47 537 34T546 15T551 6T555 2T556 -2T550 -11H482Q457 3 450 18T399 152L354 277L340 262Q327 246 293 207T236 141Q211 112 174 69Q123 9 111 -1T83 -12Q47 -12 47 20Q47 37 61 52T199 187Q229 216 266 252T321 306L338 322Q338 323 288 462T234 612Q214 657 183 657Q166 657 166 673Z"></path></g></g></g></svg></mjx-container>: Arrival Rate - 시스템에 단위 시간당 진입하는 평균 요청 수 (예: 초당 평균 100개의 요청이 도착하면 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.027ex;" xmlns="http://www.w3.org/2000/svg" width="1.319ex" height="1.597ex" role="img" focusable="false" viewBox="0 -694 583 706"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D706" d="M166 673Q166 685 183 694H202Q292 691 316 644Q322 629 373 486T474 207T524 67Q531 47 537 34T546 15T551 6T555 2T556 -2T550 -11H482Q457 3 450 18T399 152L354 277L340 262Q327 246 293 207T236 141Q211 112 174 69Q123 9 111 -1T83 -12Q47 -12 47 20Q47 37 61 52T199 187Q229 216 266 252T321 306L338 322Q338 323 288 462T234 612Q214 657 183 657Q166 657 166 673Z"></path></g></g></g></svg></mjx-container> = 100)</li><li><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.05ex;" xmlns="http://www.w3.org/2000/svg" width="2.371ex" height="1.595ex" role="img" focusable="false" viewBox="0 -683 1048 705"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D44A" d="M436 683Q450 683 486 682T553 680Q604 680 638 681T677 682Q695 682 695 674Q695 670 692 659Q687 641 683 639T661 637Q636 636 621 632T600 624T597 615Q597 603 613 377T629 138L631 141Q633 144 637 151T649 170T666 200T690 241T720 295T759 362Q863 546 877 572T892 604Q892 619 873 628T831 637Q817 637 817 647Q817 650 819 660Q823 676 825 679T839 682Q842 682 856 682T895 682T949 681Q1015 681 1034 683Q1048 683 1048 672Q1048 666 1045 655T1038 640T1028 637Q1006 637 988 631T958 617T939 600T927 584L923 578L754 282Q586 -14 585 -15Q579 -22 561 -22Q546 -22 542 -17Q539 -14 523 229T506 480L494 462Q472 425 366 239Q222 -13 220 -15T215 -19Q210 -22 197 -22Q178 -22 176 -15Q176 -12 154 304T131 622Q129 631 121 633T82 637H58Q51 644 51 648Q52 671 64 683H76Q118 680 176 680Q301 680 313 683H323Q329 677 329 674T327 656Q322 641 318 637H297Q236 634 232 620Q262 160 266 136L501 550L499 587Q496 629 489 632Q483 636 447 637Q428 637 422 639T416 648Q416 650 418 660Q419 664 420 669T421 676T424 680T428 682T436 683Z"></path></g></g></g></svg></mjx-container>: Waiting time - 시스템(큐)에서 하나의 항목이 평균적으로 머무는 시간 (예: 큐에 들어온 데이터가 평균 0.5초를 대기하면 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.05ex;" xmlns="http://www.w3.org/2000/svg" width="2.371ex" height="1.595ex" role="img" focusable="false" viewBox="0 -683 1048 705"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D44A" d="M436 683Q450 683 486 682T553 680Q604 680 638 681T677 682Q695 682 695 674Q695 670 692 659Q687 641 683 639T661 637Q636 636 621 632T600 624T597 615Q597 603 613 377T629 138L631 141Q633 144 637 151T649 170T666 200T690 241T720 295T759 362Q863 546 877 572T892 604Q892 619 873 628T831 637Q817 637 817 647Q817 650 819 660Q823 676 825 679T839 682Q842 682 856 682T895 682T949 681Q1015 681 1034 683Q1048 683 1048 672Q1048 666 1045 655T1038 640T1028 637Q1006 637 988 631T958 617T939 600T927 584L923 578L754 282Q586 -14 585 -15Q579 -22 561 -22Q546 -22 542 -17Q539 -14 523 229T506 480L494 462Q472 425 366 239Q222 -13 220 -15T215 -19Q210 -22 197 -22Q178 -22 176 -15Q176 -12 154 304T131 622Q129 631 121 633T82 637H58Q51 644 51 648Q52 671 64 683H76Q118 680 176 680Q301 680 313 683H323Q329 677 329 674T327 656Q322 641 318 637H297Q236 634 232 620Q262 160 266 136L501 550L499 587Q496 629 489 632Q483 636 447 637Q428 637 422 639T416 648Q416 650 418 660Q419 664 420 669T421 676T424 680T428 682T436 683Z"></path></g></g></g></svg></mjx-container> = 0.5초)</li></ul><p>이 예제에서는 소비자가 1초에 100건을 처리하므로, 대기 시간이 최대 1초라고 가정할 때 최적의 큐 크기(<code>L</code>)는:</p><p><mjx-container class="MathJax" jax="SVG" display="true"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="29.558ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 13064.6 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D43F" d="M228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 217 683Q271 680 344 680Q485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628Q387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54T478 72T522 106T564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203T583 83T557 9Q555 4 553 3T537 0T494 -1Q483 -1 418 -1T294 0H116Q32 0 32 10Q32 17 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637Z"></path></g><g data-mml-node="mo" transform="translate(958.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mo" transform="translate(2014.6,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mn" transform="translate(2403.6,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(500,0)"></path><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(1000,0)"></path></g><g data-mml-node="mi" transform="translate(3903.6,0)"><text data-variant="italic" transform="scale(1,-1)" font-size="884px" font-family="serif" font-style="italic">건</text></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(4903.6,0)"><g data-mml-node="mo"><path data-c="2F" d="M423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750Z"></path></g></g><g data-mml-node="mi" transform="translate(5403.6,0)"><path data-c="1D460" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z"></path></g><g data-mml-node="mo" transform="translate(5872.6,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mo" transform="translate(6483.8,0)"><path data-c="D7" d="M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z"></path></g><g data-mml-node="mo" transform="translate(7484,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mn" transform="translate(7873,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g><g data-mml-node="mi" transform="translate(8373,0)"><path data-c="1D460" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z"></path></g><g data-mml-node="mo" transform="translate(8842,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mo" transform="translate(9508.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mn" transform="translate(10564.6,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(500,0)"></path><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(1000,0)"></path></g><g data-mml-node="mi" transform="translate(12064.6,0)"><text data-variant="italic" transform="scale(1,-1)" font-size="884px" font-family="serif" font-style="italic">건</text></g></g></g></svg></mjx-container></p><p>즉, 이상적인 버퍼 크기(capacity)는 <strong>약 100건</strong> 정도가 된다.</p><ul><li>실제 환경에서는 최대 대기 허용 시간을 시스템 요구사항에 따라 조절하여 최적 버퍼 크기를 설정할 수 있다.</li></ul><hr><h2 id="전략-선택-기준-요약"><a href="#전략-선택-기준-요약" class="headerlink" title="전략 선택 기준 요약"></a>전략 선택 기준 요약</h2><table><thead><tr><th>전략</th><th>상황 예시</th><th>장점</th><th>단점</th></tr></thead><tbody><tr><td>Bounded Queue</td><td>메모리 제한 필요, 안정성 우선</td><td>자원 효율적, 안정성 높음</td><td>대기 지연 발생 가능</td></tr><tr><td>DropOldest/Newest</td><td>최신성 유지 중요, 센서 데이터 등</td><td>응답성 유지, 큐 과부하 방지</td><td>데이터 손실 발생 가능성</td></tr><tr><td>Rate Limiting</td><td>엄격한 자원 관리, API 호출 제한 등</td><td>정밀한 처리량 제어 가능</td><td>복잡성 증가, 구현 비용 증가</td></tr></tbody></table><hr><h2 id="결론-및-권장-사항"><a href="#결론-및-권장-사항" class="headerlink" title="결론 및 권장 사항"></a>결론 및 권장 사항</h2><p>생산자-소비자 속도 불균형을 효과적으로 관리하는 방법 중 하나가 바로 <strong>백프레셔(Backpressure)</strong> 전략이다. 여기에 Queueing 이론을 활용하면 최적의 설정을 이론적으로 예측할 수도 있다.</p><ul><li>일반적인 추천 전략은 <code>Bounded Channel + 대기 전략(Wait)</code>이다.</li></ul><p>이 글을 참고하여 상황에 맞는 최적의 전략을 선택해 안정적이고 효율적인 생산자-소비자 시스템을 설계하는 것이 올바르다.</p>]]></content:encoded>
<comments>http://techbless.github.io/2025/03/27/back-pressure/#disqus_thread</comments>
</item>
<item>
<title>C#에서 Channel<T>와 BlockingCollection<T> 대기 방식 비교 (Blocking vs. Awaiting)</title>
<link>http://techbless.github.io/2025/03/25/channel-blocking-collection/</link>
<guid>http://techbless.github.io/2025/03/25/channel-blocking-collection/</guid>
<pubDate>Tue, 25 Mar 2025 01:11:44 GMT</pubDate>
<description>
<h1 id="C-에서-Channel와-BlockingCollection-비교"><a href="#C-에서-Channel와-BlockingCollection-비교" class="headerlink" title="C#에서 Channel<T>와 Block
</description>
<content:encoded><![CDATA[<h1 id="C-에서-Channel와-BlockingCollection-비교"><a href="#C-에서-Channel와-BlockingCollection-비교" class="headerlink" title="C#에서 Channel<T>와 BlockingCollection<T> 비교"></a>C#에서 <code>Channel<T></code>와 <code>BlockingCollection<T></code> 비교</h1><p>동시성 프로그래밍에서 생산자-소비자 패턴은 매우 일반적인 구조이며, C#에서는 이를 구현하기 위한 여러 추상화가 존재한다. 특히 <code>BlockingCollection<T></code>와 <code>Channel<T></code>는 대표적인 메시지 큐이며, 유사한 목적을 가지지만 구조, 성능, 사용성 면에서 뚜렷한 차이를 지닌다. 두 구조의 가장 본질적인 공통점은 <strong>“생산자 또는 소비자가 준비되지 않았을 때 대기(BLOCKING 또는 AWAITING) 를 통해 동기화된다”는</strong> 점입니다.<br>즉, <strong>생산자-소비자 간 속도 차이를 자동으로 조율해주는</strong> 구조라는 점이 가장 중요한 공통점이며, 이게 일반 Queue<t>나 ConcurrentQueue<t>와 구분되는 지점이기도 합니다.</t></t></p><ol><li><p><strong>자동 대기(Blocking 또는 Awaiting) 기반 흐름 제어</strong><br>소비자가 큐에서 데이터를 꺼내려 할 때 데이터가 없다면, 소비자는 <strong>자동으로 대기</strong>하며, 데이터가 추가되면 즉시 깨어난다.<br>반대로, 큐가 가득 찼을 경우 생산자도 <strong>차단(block)</strong> 또는 <strong>비동기 대기(await)</strong> 를 통해 흐름을 제어한다.</p></li><li><p><strong>생산자-소비자의 느슨한 결합 구조 지원</strong><br><strong>생산 속도와 소비 속도가 달라도 버퍼와 대기 메커니즘을 통해 균형 있게</strong> 처리되므로, 비동기적 흐름 제어가 용이하다.</p></li><li><p><strong>스레드 안전성 보장</strong><br>동시 접근 시 내부적으로 적절한 동기화를 수행하여, 생산자와 소비자가 다중 스레드 환경에서도 안전하게 데이터를 주고받을 수 있다.</p></li></ol><p>이번 글에서는 이 두 컬렉션의 차이점을 명확히 짚고, 언제 어떤 것을 선택해야 하는지 기준을 제시합니다.</p><h2 id="요약"><a href="#요약" class="headerlink" title="요약"></a>요약</h2><table><thead><tr><th>항목</th><th>BlockingCollection<t></t></th><th>Channel<t></t></th></tr></thead><tbody><tr><td>기본 구현체</td><td><code>ConcurrentQueue<T></code> 등 래핑</td><td>커스텀 구현 (<code>Channel<T></code>)</td></tr><tr><td>생산자/소비자 모델</td><td>단순 모델</td><td>다중 생산자/다중 소비자까지 유연</td></tr><tr><td>완료 신호</td><td><code>CompleteAdding()</code></td><td><code>channel.Writer.Complete()</code></td></tr><tr><td>대기 방법</td><td><strong>차단(block)</strong></td><td><strong>비동기 대기(await)</strong></td></tr><tr><td>비동기 지원</td><td>불완전 (<code>GetConsumingEnumerable</code>)</td><td>완전한 <code>async</code>/<code>await</code> 지원</td></tr><tr><td>용도</td><td>간단한 동기 큐</td><td>고성능 비동기 스트리밍 파이프</td></tr></tbody></table><h2 id="내부-구조-비교"><a href="#내부-구조-비교" class="headerlink" title="내부 구조 비교"></a>내부 구조 비교</h2><h3 id="BlockingCollection"><a href="#BlockingCollection" class="headerlink" title="BlockingCollection"></a>BlockingCollection<t></t></h3><ul><li>내부적으로 <code>IProducerConsumerCollection<T></code> 구현체를 감싼 래퍼이다.</li><li><code>Add()</code>, <code>Take()</code> 같은 메서드를 제공하며, <code>CompleteAdding()</code> 호출로 생산 완료를 명시할 수 있다.</li><li>Blocking의 구현은 <code>Monitor.Wait</code> 또는 <code>SemaphoreSlim</code> 기반이다.</li></ul><h3 id="Channel"><a href="#Channel" class="headerlink" title="Channel"></a>Channel<t></t></h3><ul><li><code>System.Threading.Channels</code> 네임스페이스에 있으며, .NET Core/Standard 이후 등장.</li><li>비동기 처리를 기본으로 설계되어 있고, <code>ChannelWriter<T></code>, <code>ChannelReader<T></code>로 역할이 명확히 분리된다.</li><li>내부적으로는 RingBuffer 기반의 Lock-Free Queue를 활용하며, 동시성 처리에 강력하다.</li></ul><p>다음은 두 구조를 비교한 시각적 다이어그램이다:</p><pre class="mermaid">graph TD subgraph BlockingCollection A[Producer Thread] --> |Add| B[BlockingCollection] B --> |Take| C[Consumer Thread] end subgraph Channel D[Producer Thread] -->|WriteAsync| E[Channel.Writer] E --> F[Internal Buffer] F --> |ReadAsync| G[Channel.Reader] G --> H[Consumer Thread] end</pre><h2 id="API-사용-예시"><a href="#API-사용-예시" class="headerlink" title="API 사용 예시"></a>API 사용 예시</h2><h3 id="BlockingCollection-1"><a href="#BlockingCollection-1" class="headerlink" title="BlockingCollection"></a>BlockingCollection<t></t></h3><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> collection = <span class="keyword">new</span> BlockingCollection<<span class="built_in">int</span>>(boundedCapacity: <span class="number">100</span>);</span><br><span class="line"></span><br><span class="line">Task producer = Task.Run(() =></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">0</span>; i < <span class="number">1000</span>; i++)</span><br><span class="line"> collection.Add(i); <span class="comment">// 큐가 가득 차면 BLOCK</span></span><br><span class="line"> collection.CompleteAdding();</span><br><span class="line">});</span><br><span class="line"></span><br><span class="line">Task consumer = Task.Run(() =></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">while</span> (!collection.IsCompleted)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">try</span></span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">int</span> item = collection.Take(); <span class="comment">// 큐가 비어 있으면 BLOCK</span></span><br><span class="line"> Console.WriteLine(item);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">catch</span> (InvalidOperationException)</span><br><span class="line"> {</span><br><span class="line"> <span class="comment">// CompleteAdding 이후 Take 시 발생 가능</span></span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">});</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="Channel-1"><a href="#Channel-1" class="headerlink" title="Channel"></a>Channel<t></t></h3><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> channel = Channel.CreateBounded<<span class="built_in">int</span>>(<span class="number">100</span>);</span><br><span class="line"></span><br><span class="line">Task producer = Task.Run(<span class="keyword">async</span> () =></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">0</span>; i < <span class="number">1000</span>; i++)</span><br><span class="line"> <span class="keyword">await</span> channel.Writer.WriteAsync(i); <span class="comment">// 큐가 가득 차면 await으로 대기</span></span><br><span class="line"> channel.Writer.Complete();</span><br><span class="line">});</span><br><span class="line"></span><br><span class="line">Task consumer = Task.Run(<span class="keyword">async</span> () =></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">while</span> (<span class="keyword">await</span> channel.Reader.WaitToReadAsync())</span><br><span class="line"> {</span><br><span class="line"> <span class="comment">// 버퍼에 남아있는 모든 아이템을 즉시 꺼냄</span></span><br><span class="line"> <span class="keyword">while</span> (channel.Reader.TryRead(<span class="keyword">out</span> <span class="built_in">int</span> item))</span><br><span class="line"> {</span><br><span class="line"> Console.WriteLine(item); <span class="comment">// 항목 하나씩 처리</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">});</span><br><span class="line"></span><br><span class="line"><span class="comment">// 혹은 아래의 consumer (위: 한번에 다꺼냄, 아래: 한번에 하나씩 꺼냄)</span></span><br><span class="line">Task consumer = Task.Run(<span class="keyword">async</span> () => {</span><br><span class="line"><span class="keyword">while</span> (!channel.Reader.Completion.IsCompleted)</span><br><span class="line">{</span><br><span class="line"> <span class="keyword">try</span></span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">int</span> item = <span class="keyword">await</span> channel.Reader.ReadAsync(); <span class="comment">// 하나씩 읽어옴</span></span><br><span class="line"> Console.WriteLine(item);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">catch</span> (ChannelClosedException)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">break</span>; <span class="comment">// 채널이 닫혔으면 반복 종료</span></span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line">});</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="BlockingCollection-vs-Channel"><a href="#BlockingCollection-vs-Channel" class="headerlink" title="BlockingCollection vs. Channel"></a>BlockingCollection<t> vs. Channel<t></t></t></h3><table><thead><tr><th>항목</th><th>BlockingCollection</th><th>Channel</th></tr></thead><tbody><tr><td>생산</td><td><code>Add()</code></td><td><code>WriteAsync()</code></td></tr><tr><td>소비</td><td><code>Take()</code></td><td><code>TryRead()</code> + <code>WaitToReadAsync()</code></td></tr><tr><td>완료 신호</td><td><code>CompleteAdding()</code></td><td><code>Writer.Complete()</code></td></tr></tbody></table><p>AD_HERE</p><h2 id="성능과-선택-기준"><a href="#성능과-선택-기준" class="headerlink" title="성능과 선택 기준"></a>성능과 선택 기준</h2><ul><li><p><code>BlockingCollection<T></code>는 단순한 시나리오에 적합: 스레드 기반 동기 소비자가 주를 이루는 경우 빠르게 구현할 수 있다.</p></li><li><p><code>Channel<T></code>는 고성능 비동기 스트림 처리에 유리: 성능 측면에서 <code>Channel<T></code>가 대부분 이점이 있으며, 다수의 생산자-소비자, 비동기 await 흐름이 필요한 현대적인 아키텍처에 적합하다.</p></li></ul><hr><h2 id="결론"><a href="#결론" class="headerlink" title="결론"></a>결론</h2><p><code>BlockingCollection<T></code>는 레거시 환경이나 단순한 생산자-소비자 구조에 여전히 유효하다. 그러나 새로운 비동기 기반 아키텍처나 고성능 시스템에서는 <code>Channel<T></code>가 더 적절한 선택이며, 설계 관점에서도 명확한 역할 분리와 비동기 친화적 인터페이스를 제공한다.</p><p>실제 시스템의 요구사항에 따라 적절한 도구를 선택하는 것이 중요하고, 최근에는 비동기 파이프라인 아키텍처가 점점 주목 받고 있다.</p>]]></content:encoded>
<comments>http://techbless.github.io/2025/03/25/channel-blocking-collection/#disqus_thread</comments>
</item>
<item>
<title>RANSAC 알고리즘 Recap</title>
<link>http://techbless.github.io/2025/03/19/ransac/</link>
<guid>http://techbless.github.io/2025/03/19/ransac/</guid>
<pubDate>Wed, 19 Mar 2025 20:29:09 GMT</pubDate>
<description>
<h1 id="RANSAC-알고리즘이란"><a href="#RANSAC-알고리즘이란" class="headerlink" title="RANSAC 알고리즘이란?"></a>RANSAC 알고리즘이란?</h1><p><strong>RANSAC(Random Sa
</description>
<content:encoded><![CDATA[<h1 id="RANSAC-알고리즘이란"><a href="#RANSAC-알고리즘이란" class="headerlink" title="RANSAC 알고리즘이란?"></a>RANSAC 알고리즘이란?</h1><p><strong>RANSAC(Random Sample Consensus)</strong> 은 데이터에서 발생하는 <strong>이상치(outlier)</strong> 에 매우 강력한(robust) 반복적 모델 추정 알고리즘입니다. 컴퓨터 비전에서 이미지 매칭, 기하학적 변환(호모그래피 등) 추정, 직선이나 원 같은 기하학적 모델 추정에 폭넓게 쓰입니다.</p><p><strong>RANSAC 알고리즘의 주요 특징은 다음과 같습니다.</strong></p><ul><li>이상치(outlier)에 매우 강함 (Robustness)</li><li>최소한의 데이터만 사용하여 모델을 반복적으로 추정 (Minimal Sample Set)</li><li>무작위 샘플링 기반 접근 방식을 사용하여 반복적으로 최적 모델을 탐색</li></ul><hr><h2 id="RANSAC-알고리즘의-작동-원리-및-과정-설명"><a href="#RANSAC-알고리즘의-작동-원리-및-과정-설명" class="headerlink" title="RANSAC 알고리즘의 작동 원리 및 과정 설명"></a>RANSAC 알고리즘의 작동 원리 및 과정 설명</h2><p>RANSAC 알고리즘은 크게 다음과 같은 단계로 진행됩니다.</p><p><img src="/img/ransac/line.jpg"></p><p><a href="http://localhost:4000/2024/06/23/halcon-2d-metrology/">RANSAC을 이용한 라인 피팅 예시 (Halcon - 2D Metrology Recap) 포스트</a></p><h3 id="1-모델-정의-및-최소-데이터-개수-선정"><a href="#1-모델-정의-및-최소-데이터-개수-선정" class="headerlink" title="1. 모델 정의 및 최소 데이터 개수 선정"></a>1. 모델 정의 및 최소 데이터 개수 선정</h3><p>먼저, 추정하고자 하는 모델을 정의하고, 이 모델을 결정짓기 위한 최소한의 데이터 개수를 정합니다. </p><ul><li><p><strong>직선(2점)</strong>:<br>하나의 직선을 결정하기 위해서는 최소한 두 개의 점이 필요합니다. 직선 모델을 정할 때의 최소한의 데이터는 2점이 필요합니다.</p></li><li><p><strong>호모그래피 행렬(4점)</strong>:<br>호모그래피(homography)는 한 평면의 점들을 다른 평면으로 변환할 때 쓰이는 변환 행렬입니다. 호모그래피 행렬은 8개의 자유도(degree of freedom)를 가지기 때문에, 최소한 4쌍의 대응점이 필요합니다. 하나의 대응점(pair)은 2개의 방정식을 제공하며, 따라서 4개의 대응점은 8개의 방정식을 만들어 호모그래피를 정확히 결정할 수 있게 합니다.</p></li><li><p><strong>원(3점)</strong>:<br>원을 결정하려면 최소한 세 개의 점이 필요합니다. 따라서 원 모델의 최소 데이터 수는 3점입니다.</p></li></ul><h3 id="2-랜덤-샘플링-및-임시-모델-추정"><a href="#2-랜덤-샘플링-및-임시-모델-추정" class="headerlink" title="2. 랜덤 샘플링 및 임시 모델 추정"></a>2. 랜덤 샘플링 및 임시 모델 추정</h3><p>전체 데이터에서 무작위로 위에서 정의한 최소 개수만큼 샘플링합니다.<br>샘플링한 데이터를 기반으로 임시 모델을 추정합니다.</p><h3 id="3-Inlier과-Outlier-구분"><a href="#3-Inlier과-Outlier-구분" class="headerlink" title="3. Inlier과 Outlier 구분"></a>3. Inlier과 Outlier 구분</h3><p>방금 추정한 임시 모델을 전체 데이터에 적용하여 잘 맞는 점을 Inlier, 맞지 않는 점을 Outlier으로 구분합니다.</p><h3 id="4-최적의-모델-선정-및-업데이트"><a href="#4-최적의-모델-선정-및-업데이트" class="headerlink" title="4. 최적의 모델 선정 및 업데이트"></a>4. 최적의 모델 선정 및 업데이트</h3><p>위 과정을 반복하며 가장 많은 inlier을 포함하는 모델을 현재의 최적 모델로 기록하고 유지합니다.</p><h3 id="5-반복-종료-조건-확인"><a href="#5-반복-종료-조건-확인" class="headerlink" title="5. 반복 종료 조건 확인"></a>5. 반복 종료 조건 확인</h3><p>미리 정해진 반복 횟수를 초과하거나 원하는 정확도와 신뢰도를 얻으면 반복을 종료하고, 현재까지 얻은 최적의 모델을 최종 결과로 사용합니다.</p><p>위 과정을, 아래의 알고리즘 대로 수행하면, 최종 결과를 얻을 수 있습니다.</p><pre class="mermaid">graph TD A[Start] --> B[데이터에서 임의 샘플 선택] B --> C[모델 생성] C --> D[모델에 맞는 데이터 포인트 찾기] D --> E[포인트가 모델에 적합한지 검증] E --> F{적합한 포인트가 일정 기준을 만족?} F -- 예 --> G[모델 개선] F -- 아니오 --> H[새로운 샘플 선택] G --> I{최적 모델 찾았나요?} I -- 예 --> J[알고리즘 종료] I -- 아니오 --> B H --> B</pre><h2 id="RANSAC-알고리즘의-수학적-표현과-예시"><a href="#RANSAC-알고리즘의-수학적-표현과-예시" class="headerlink" title="RANSAC 알고리즘의 수학적 표현과 예시"></a>RANSAC 알고리즘의 수학적 표현과 예시</h2><p><img src="/img/ransac/dist.png"></p><p>RANSAC의 가장 중요한 개념 중 하나는 <strong>Inlier 판별</strong>이며, 다음과 같은 수식으로 표현할 수 있습니다.</p><p>일반적으로 데이터 포인트 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.357ex;" xmlns="http://www.w3.org/2000/svg" width="2.034ex" height="1.357ex" role="img" focusable="false" viewBox="0 -442 899 599.8"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mi" transform="translate(605,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g></g></g></svg></mjx-container>가 모델 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="2.378ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 1051 683"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D440" d="M289 629Q289 635 232 637Q208 637 201 638T194 648Q194 649 196 659Q197 662 198 666T199 671T201 676T203 679T207 681T212 683T220 683T232 684Q238 684 262 684T307 683Q386 683 398 683T414 678Q415 674 451 396L487 117L510 154Q534 190 574 254T662 394Q837 673 839 675Q840 676 842 678T846 681L852 683H948Q965 683 988 683T1017 684Q1051 684 1051 673Q1051 668 1048 656T1045 643Q1041 637 1008 637Q968 636 957 634T939 623Q936 618 867 340T797 59Q797 55 798 54T805 50T822 48T855 46H886Q892 37 892 35Q892 19 885 5Q880 0 869 0Q864 0 828 1T736 2Q675 2 644 2T609 1Q592 1 592 11Q592 13 594 25Q598 41 602 43T625 46Q652 46 685 49Q699 52 704 61Q706 65 742 207T813 490T848 631L654 322Q458 10 453 5Q451 4 449 3Q444 0 433 0Q418 0 415 7Q413 11 374 317L335 624L267 354Q200 88 200 79Q206 46 272 46H282Q288 41 289 37T286 19Q282 3 278 1Q274 0 267 0Q265 0 255 0T221 1T157 2Q127 2 95 1T58 0Q43 0 39 2T35 11Q35 13 38 25T43 40Q45 46 65 46Q135 46 154 86Q158 92 223 354T289 629Z"></path></g></g></g></svg></mjx-container>의 내부점으로 판단되는 기준은 다음과 같습니다.</p><p><mjx-container class="MathJax" jax="SVG" display="true"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="12.188ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 5387.2 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z"></path></g><g data-mml-node="mo" transform="translate(520,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(909,0)"><path data-c="1D440" d="M289 629Q289 635 232 637Q208 637 201 638T194 648Q194 649 196 659Q197 662 198 666T199 671T201 676T203 679T207 681T212 683T220 683T232 684Q238 684 262 684T307 683Q386 683 398 683T414 678Q415 674 451 396L487 117L510 154Q534 190 574 254T662 394Q837 673 839 675Q840 676 842 678T846 681L852 683H948Q965 683 988 683T1017 684Q1051 684 1051 673Q1051 668 1048 656T1045 643Q1041 637 1008 637Q968 636 957 634T939 623Q936 618 867 340T797 59Q797 55 798 54T805 50T822 48T855 46H886Q892 37 892 35Q892 19 885 5Q880 0 869 0Q864 0 828 1T736 2Q675 2 644 2T609 1Q592 1 592 11Q592 13 594 25Q598 41 602 43T625 46Q652 46 685 49Q699 52 704 61Q706 65 742 207T813 490T848 631L654 322Q458 10 453 5Q451 4 449 3Q444 0 433 0Q418 0 415 7Q413 11 374 317L335 624L267 354Q200 88 200 79Q206 46 272 46H282Q288 41 289 37T286 19Q282 3 278 1Q274 0 267 0Q265 0 255 0T221 1T157 2Q127 2 95 1T58 0Q43 0 39 2T35 11Q35 13 38 25T43 40Q45 46 65 46Q135 46 154 86Q158 92 223 354T289 629Z"></path></g><g data-mml-node="mo" transform="translate(1960,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="msub" transform="translate(2404.7,0)"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mi" transform="translate(605,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="mo" transform="translate(3303.6,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mo" transform="translate(3970.4,0)"><path data-c="3C" d="M694 -11T694 -19T688 -33T678 -40Q671 -40 524 29T234 166L90 235Q83 240 83 250Q83 261 91 266Q664 540 678 540Q681 540 687 534T694 519T687 505Q686 504 417 376L151 250L417 124Q686 -4 687 -5Q694 -11 694 -19Z"></path></g><g data-mml-node="mi" transform="translate(5026.2,0)"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z"></path></g></g></g></svg></mjx-container></p><ul><li><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="8.354ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 3692.6 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z"></path></g><g data-mml-node="mo" transform="translate(520,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(909,0)"><path data-c="1D440" d="M289 629Q289 635 232 637Q208 637 201 638T194 648Q194 649 196 659Q197 662 198 666T199 671T201 676T203 679T207 681T212 683T220 683T232 684Q238 684 262 684T307 683Q386 683 398 683T414 678Q415 674 451 396L487 117L510 154Q534 190 574 254T662 394Q837 673 839 675Q840 676 842 678T846 681L852 683H948Q965 683 988 683T1017 684Q1051 684 1051 673Q1051 668 1048 656T1045 643Q1041 637 1008 637Q968 636 957 634T939 623Q936 618 867 340T797 59Q797 55 798 54T805 50T822 48T855 46H886Q892 37 892 35Q892 19 885 5Q880 0 869 0Q864 0 828 1T736 2Q675 2 644 2T609 1Q592 1 592 11Q592 13 594 25Q598 41 602 43T625 46Q652 46 685 49Q699 52 704 61Q706 65 742 207T813 490T848 631L654 322Q458 10 453 5Q451 4 449 3Q444 0 433 0Q418 0 415 7Q413 11 374 317L335 624L267 354Q200 88 200 79Q206 46 272 46H282Q288 41 289 37T286 19Q282 3 278 1Q274 0 267 0Q265 0 255 0T221 1T157 2Q127 2 95 1T58 0Q43 0 39 2T35 11Q35 13 38 25T43 40Q45 46 65 46Q135 46 154 86Q158 92 223 354T289 629Z"></path></g><g data-mml-node="mo" transform="translate(1960,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="msub" transform="translate(2404.7,0)"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mi" transform="translate(605,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="mo" transform="translate(3303.6,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g></svg></mjx-container>: 데이터 포인트 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.357ex;" xmlns="http://www.w3.org/2000/svg" width="2.034ex" height="1.357ex" role="img" focusable="false" viewBox="0 -442 899 599.8"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mi" transform="translate(605,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g></g></g></svg></mjx-container>와 모델 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="2.378ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 1051 683"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D440" d="M289 629Q289 635 232 637Q208 637 201 638T194 648Q194 649 196 659Q197 662 198 666T199 671T201 676T203 679T207 681T212 683T220 683T232 684Q238 684 262 684T307 683Q386 683 398 683T414 678Q415 674 451 396L487 117L510 154Q534 190 574 254T662 394Q837 673 839 675Q840 676 842 678T846 681L852 683H948Q965 683 988 683T1017 684Q1051 684 1051 673Q1051 668 1048 656T1045 643Q1041 637 1008 637Q968 636 957 634T939 623Q936 618 867 340T797 59Q797 55 798 54T805 50T822 48T855 46H886Q892 37 892 35Q892 19 885 5Q880 0 869 0Q864 0 828 1T736 2Q675 2 644 2T609 1Q592 1 592 11Q592 13 594 25Q598 41 602 43T625 46Q652 46 685 49Q699 52 704 61Q706 65 742 207T813 490T848 631L654 322Q458 10 453 5Q451 4 449 3Q444 0 433 0Q418 0 415 7Q413 11 374 317L335 624L267 354Q200 88 200 79Q206 46 272 46H282Q288 41 289 37T286 19Q282 3 278 1Q274 0 267 0Q265 0 255 0T221 1T157 2Q127 2 95 1T58 0Q43 0 39 2T35 11Q35 13 38 25T43 40Q45 46 65 46Q135 46 154 86Q158 92 223 354T289 629Z"></path></g></g></g></svg></mjx-container> 간의 오차(거리)를 나타냅니다.</li><li><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="0.817ex" height="1.441ex" role="img" focusable="false" viewBox="0 -626 361 637"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z"></path></g></g></g></svg></mjx-container>: 사용자가 정한 threshold이며, 실험적으로 설정됩니다.</li></ul><h3 id="직선-모델-예시"><a href="#직선-모델-예시" class="headerlink" title="직선 모델 예시"></a>직선 모델 예시</h3><p>직선의 방정식을 다음과 같이 정의합니다.</p><p><mjx-container class="MathJax" jax="SVG" display="true"><svg style="vertical-align: -0.464ex;" xmlns="http://www.w3.org/2000/svg" width="15.23ex" height="2.034ex" role="img" focusable="false" viewBox="0 -694 6731.4 899"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z"></path></g><g data-mml-node="mi" transform="translate(529,0)"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(1323.2,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"></path></g><g data-mml-node="mi" transform="translate(2323.4,0)"><path data-c="1D44F" d="M73 647Q73 657 77 670T89 683Q90 683 161 688T234 694Q246 694 246 685T212 542Q204 508 195 472T180 418L176 399Q176 396 182 402Q231 442 283 442Q345 442 383 396T422 280Q422 169 343 79T173 -11Q123 -11 82 27T40 150V159Q40 180 48 217T97 414Q147 611 147 623T109 637Q104 637 101 637H96Q86 637 83 637T76 640T73 647ZM336 325V331Q336 405 275 405Q258 405 240 397T207 376T181 352T163 330L157 322L136 236Q114 150 114 114Q114 66 138 42Q154 26 178 26Q211 26 245 58Q270 81 285 114T318 219Q336 291 336 325Z"></path></g><g data-mml-node="mi" transform="translate(2752.4,0)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mo" transform="translate(3464.7,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"></path></g><g data-mml-node="mi" transform="translate(4464.9,0)"><path data-c="1D450" d="M34 159Q34 268 120 355T306 442Q362 442 394 418T427 355Q427 326 408 306T360 285Q341 285 330 295T319 325T330 359T352 380T366 386H367Q367 388 361 392T340 400T306 404Q276 404 249 390Q228 381 206 359Q162 315 142 235T121 119Q121 73 147 50Q169 26 205 26H209Q321 26 394 111Q403 121 406 121Q410 121 419 112T429 98T420 83T391 55T346 25T282 0T202 -11Q127 -11 81 37T34 159Z"></path></g><g data-mml-node="mo" transform="translate(5175.7,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mn" transform="translate(6231.4,0)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z"></path></g></g></g></svg></mjx-container></p><p>이때 데이터 포인트 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="6.648ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 2938.6 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="msub" transform="translate(389,0)"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mi" transform="translate(605,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="mo" transform="translate(1288,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="msub" transform="translate(1732.6,0)"><g data-mml-node="mi"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mi" transform="translate(523,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="mo" transform="translate(2549.6,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g></svg></mjx-container>가 직선 모델과 얼마나 가까운지 나타내는 거리는 다음과 같습니다.</p><ul><li>점과 직선사이 거리<br><mjx-container class="MathJax" jax="SVG" display="true"><svg style="vertical-align: -2.308ex;" xmlns="http://www.w3.org/2000/svg" width="19.008ex" height="5.609ex" role="img" focusable="false" viewBox="0 -1459 8401.3 2479"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z"></path></g><g data-mml-node="mo" transform="translate(797.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mfrac" transform="translate(1853.6,0)"><g data-mml-node="mrow" transform="translate(220,709.5)"><g data-mml-node="mo" transform="translate(0 -0.5)"><path data-c="7C" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z"></path></g><g data-mml-node="mi" transform="translate(278,0)"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z"></path></g><g data-mml-node="msub" transform="translate(807,0)"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mi" transform="translate(605,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="mo" transform="translate(1928.2,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"></path></g><g data-mml-node="mi" transform="translate(2928.4,0)"><path data-c="1D44F" d="M73 647Q73 657 77 670T89 683Q90 683 161 688T234 694Q246 694 246 685T212 542Q204 508 195 472T180 418L176 399Q176 396 182 402Q231 442 283 442Q345 442 383 396T422 280Q422 169 343 79T173 -11Q123 -11 82 27T40 150V159Q40 180 48 217T97 414Q147 611 147 623T109 637Q104 637 101 637H96Q86 637 83 637T76 640T73 647ZM336 325V331Q336 405 275 405Q258 405 240 397T207 376T181 352T163 330L157 322L136 236Q114 150 114 114Q114 66 138 42Q154 26 178 26Q211 26 245 58Q270 81 285 114T318 219Q336 291 336 325Z"></path></g><g data-mml-node="msub" transform="translate(3357.4,0)"><g data-mml-node="mi"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mi" transform="translate(523,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="mo" transform="translate(4396.6,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"></path></g><g data-mml-node="mi" transform="translate(5396.8,0)"><path data-c="1D450" d="M34 159Q34 268 120 355T306 442Q362 442 394 418T427 355Q427 326 408 306T360 285Q341 285 330 295T319 325T330 359T352 380T366 386H367Q367 388 361 392T340 400T306 404Q276 404 249 390Q228 381 206 359Q162 315 142 235T121 119Q121 73 147 50Q169 26 205 26H209Q321 26 394 111Q403 121 406 121Q410 121 419 112T429 98T420 83T391 55T346 25T282 0T202 -11Q127 -11 81 37T34 159Z"></path></g><g data-mml-node="mo" transform="translate(5829.8,0) translate(0 -0.5)"><path data-c="7C" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z"></path></g></g><g data-mml-node="msqrt" transform="translate(1320.6,-926.5)"><g transform="translate(853,0)"><g data-mml-node="msup"><g data-mml-node="mi"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z"></path></g><g data-mml-node="mn" transform="translate(562,289) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z"></path></g></g><g data-mml-node="mo" transform="translate(1187.8,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"></path></g><g data-mml-node="msup" transform="translate(2188,0)"><g data-mml-node="mi"><path data-c="1D44F" d="M73 647Q73 657 77 670T89 683Q90 683 161 688T234 694Q246 694 246 685T212 542Q204 508 195 472T180 418L176 399Q176 396 182 402Q231 442 283 442Q345 442 383 396T422 280Q422 169 343 79T173 -11Q123 -11 82 27T40 150V159Q40 180 48 217T97 414Q147 611 147 623T109 637Q104 637 101 637H96Q86 637 83 637T76 640T73 647ZM336 325V331Q336 405 275 405Q258 405 240 397T207 376T181 352T163 330L157 322L136 236Q114 150 114 114Q114 66 138 42Q154 26 178 26Q211 26 245 58Q270 81 285 114T318 219Q336 291 336 325Z"></path></g><g data-mml-node="mn" transform="translate(462,289) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z"></path></g></g></g><g data-mml-node="mo" transform="translate(0,106.5)"><path data-c="221A" d="M95 178Q89 178 81 186T72 200T103 230T169 280T207 309Q209 311 212 311H213Q219 311 227 294T281 177Q300 134 312 108L397 -77Q398 -77 501 136T707 565T814 786Q820 800 834 800Q841 800 846 794T853 782V776L620 293L385 -193Q381 -200 366 -200Q357 -200 354 -197Q352 -195 256 15L160 225L144 214Q129 202 113 190T95 178Z"></path></g><rect width="3053.6" height="60" x="853" y="846.5"></rect></g><rect width="6307.8" height="60" x="120" y="220"></rect></g></g></g></svg></mjx-container></li></ul><p>이 값이 설정한 임계값 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="0.817ex" height="1.441ex" role="img" focusable="false" viewBox="0 -626 361 637"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z"></path></g></g></g></svg></mjx-container>보다 작으면 내부점으로 간주됩니다.</p><hr><h2 id="알고리즘의-주요-파라미터와-설정법-표-요약"><a href="#알고리즘의-주요-파라미터와-설정법-표-요약" class="headerlink" title="알고리즘의 주요 파라미터와 설정법 (표 요약)"></a>알고리즘의 주요 파라미터와 설정법 (표 요약)</h2><table><thead><tr><th>파라미터</th><th>설명</th><th>일반적 설정 방법</th></tr></thead><tbody><tr><td>반복 횟수 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="2.009ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 888 683"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z"></path></g></g></g></svg></mjx-container></td><td>샘플링과 모델 추정을 반복하는 횟수</td><td>데이터 내 이상치 비율에 따라 계산</td></tr><tr><td>임계값 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="0.817ex" height="1.441ex" role="img" focusable="false" viewBox="0 -626 361 637"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z"></path></g></g></g></svg></mjx-container></td><td>내부점 판단 기준 (오차)</td><td>데이터 노이즈 및 실험적 판단</td></tr><tr><td>신뢰도 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.439ex;" xmlns="http://www.w3.org/2000/svg" width="1.138ex" height="1.439ex" role="img" focusable="false" viewBox="0 -442 503 636"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D45D" d="M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z"></path></g></g></g></svg></mjx-container></td><td>결과가 정확하다고 믿을 수 있는 확률 (95% 또는 99% 등)</td><td>일반적으로 0.95 또는 0.99 사용</td></tr><tr><td>내부점 비율 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.62ex" height="1.027ex" role="img" focusable="false" viewBox="0 -443 716 454"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D464" d="M580 385Q580 406 599 424T641 443Q659 443 674 425T690 368Q690 339 671 253Q656 197 644 161T609 80T554 12T482 -11Q438 -11 404 5T355 48Q354 47 352 44Q311 -11 252 -11Q226 -11 202 -5T155 14T118 53T104 116Q104 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 293 29 315T52 366T96 418T161 441Q204 441 227 416T250 358Q250 340 217 250T184 111Q184 65 205 46T258 26Q301 26 334 87L339 96V119Q339 122 339 128T340 136T341 143T342 152T345 165T348 182T354 206T362 238T373 281Q402 395 406 404Q419 431 449 431Q468 431 475 421T483 402Q483 389 454 274T422 142Q420 131 420 107V100Q420 85 423 71T442 42T487 26Q558 26 600 148Q609 171 620 213T632 273Q632 306 619 325T593 357T580 385Z"></path></g></g></g></svg></mjx-container></td><td>데이터 중 내부점 비율의 예상치</td><td>데이터 특성에 따라 실험적으로 결정</td></tr></tbody></table><hr><h2 id="RANSAC의-반복-횟수-N-계산법"><a href="#RANSAC의-반복-횟수-N-계산법" class="headerlink" title="RANSAC의 반복 횟수 N 계산법"></a>RANSAC의 반복 횟수 N 계산법</h2><p>RANSAC의 반복 횟수(<mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="2.009ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 888 683"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z"></path></g></g></g></svg></mjx-container>) 계산식은 다음과 같은 확률 모델을 기반으로 합니다.</p><p><mjx-container class="MathJax" jax="SVG" display="true"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="23.621ex" height="2.593ex" role="img" focusable="false" viewBox="0 -896 10440.6 1146"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D45D" d="M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z"></path></g><g data-mml-node="mo" transform="translate(780.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mn" transform="translate(1836.6,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g><g data-mml-node="mo" transform="translate(2558.8,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="mo" transform="translate(3559,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mn" transform="translate(3948,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g><g data-mml-node="mo" transform="translate(4670.2,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="mo" transform="translate(5670.4,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mn" transform="translate(6059.4,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g><g data-mml-node="mo" transform="translate(6781.7,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="mi" transform="translate(7781.9,0)"><path data-c="1D452" d="M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z"></path></g><g data-mml-node="msup" transform="translate(8247.9,0)"><g data-mml-node="mo"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mi" transform="translate(422,413) scale(0.707)"><path data-c="1D45A" d="M21 287Q22 293 24 303T36 341T56 388T88 425T132 442T175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q303 442 384 442Q401 442 415 440T441 433T460 423T475 411T485 398T493 385T497 373T500 364T502 357L510 367Q573 442 659 442Q713 442 746 415T780 336Q780 285 742 178T704 50Q705 36 709 31T724 26Q752 26 776 56T815 138Q818 149 821 151T837 153Q857 153 857 145Q857 144 853 130Q845 101 831 73T785 17T716 -10Q669 -10 648 17T627 73Q627 92 663 193T700 345Q700 404 656 404H651Q565 404 506 303L499 291L466 157Q433 26 428 16Q415 -11 385 -11Q372 -11 364 -4T353 8T350 18Q350 29 384 161L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 181Q151 335 151 342Q154 357 154 369Q154 405 129 405Q107 405 92 377T69 316T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="msup" transform="translate(9340.7,0)"><g data-mml-node="mo"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mi" transform="translate(422,413) scale(0.707)"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z"></path></g></g></g></g></svg></mjx-container></p><p>여기서 각 항의 의미는 다음과 같습니다.</p><ul><li><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.439ex;" xmlns="http://www.w3.org/2000/svg" width="1.138ex" height="1.439ex" role="img" focusable="false" viewBox="0 -442 503 636"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D45D" d="M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z"></path></g></g></g></svg></mjx-container>: RANSAC이 최소 한 번 이상 올바른 모델을 찾을 확률(보통 0.95 또는 0.99로 설정) - 신뢰도</li><li><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.054ex" height="1.025ex" role="img" focusable="false" viewBox="0 -442 466 453"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D452" d="M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z"></path></g></g></g></svg></mjx-container>: 전체 데이터에서 outlier이 차지하는 비율.</li><li><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="6.711ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 2966.4 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mn" transform="translate(389,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g><g data-mml-node="mo" transform="translate(1111.2,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="mi" transform="translate(2111.4,0)"><path data-c="1D452" d="M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z"></path></g><g data-mml-node="mo" transform="translate(2577.4,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g></svg></mjx-container>: 전체 데이터에서 inlier이 차지하는 비율.</li><li><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.986ex" height="1.025ex" role="img" focusable="false" viewBox="0 -442 878 453"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D45A" d="M21 287Q22 293 24 303T36 341T56 388T88 425T132 442T175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q303 442 384 442Q401 442 415 440T441 433T460 423T475 411T485 398T493 385T497 373T500 364T502 357L510 367Q573 442 659 442Q713 442 746 415T780 336Q780 285 742 178T704 50Q705 36 709 31T724 26Q752 26 776 56T815 138Q818 149 821 151T837 153Q857 153 857 145Q857 144 853 130Q845 101 831 73T785 17T716 -10Q669 -10 648 17T627 73Q627 92 663 193T700 345Q700 404 656 404H651Q565 404 506 303L499 291L466 157Q433 26 428 16Q415 -11 385 -11Q372 -11 364 -4T353 8T350 18Q350 29 384 161L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 181Q151 335 151 342Q154 357 154 369Q154 405 129 405Q107 405 92 377T69 316T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g></g></g></svg></mjx-container>: 모델을 추정하는 데 필요한 최소 데이터 개수 (직선의 경우 2점, 호모그래피의 경우 4점 등).</li><li><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="2.009ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 888 683"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z"></path></g></g></g></svg></mjx-container>: 반복 횟수(알고 싶은 값).</li></ul><h3 id="식의-의미"><a href="#식의-의미" class="headerlink" title="식의 의미:"></a>식의 의미:</h3><ul><li><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="8.304ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 3670.3 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mn" transform="translate(389,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g><g data-mml-node="mo" transform="translate(1111.2,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="mi" transform="translate(2111.4,0)"><path data-c="1D452" d="M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z"></path></g><g data-mml-node="msup" transform="translate(2577.4,0)"><g data-mml-node="mo"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mi" transform="translate(422,363) scale(0.707)"><path data-c="1D45A" d="M21 287Q22 293 24 303T36 341T56 388T88 425T132 442T175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q303 442 384 442Q401 442 415 440T441 433T460 423T475 411T485 398T493 385T497 373T500 364T502 357L510 367Q573 442 659 442Q713 442 746 415T780 336Q780 285 742 178T704 50Q705 36 709 31T724 26Q752 26 776 56T815 138Q818 149 821 151T837 153Q857 153 857 145Q857 144 853 130Q845 101 831 73T785 17T716 -10Q669 -10 648 17T627 73Q627 92 663 193T700 345Q700 404 656 404H651Q565 404 506 303L499 291L466 157Q433 26 428 16Q415 -11 385 -11Q372 -11 364 -4T353 8T350 18Q350 29 384 161L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 181Q151 335 151 342Q154 357 154 369Q154 405 129 405Q107 405 92 377T69 316T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g></g></g></g></svg></mjx-container>은 무작위로 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.986ex" height="1.025ex" role="img" focusable="false" viewBox="0 -442 878 453"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D45A" d="M21 287Q22 293 24 303T36 341T56 388T88 425T132 442T175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q303 442 384 442Q401 442 415 440T441 433T460 423T475 411T485 398T493 385T497 373T500 364T502 357L510 367Q573 442 659 442Q713 442 746 415T780 336Q780 285 742 178T704 50Q705 36 709 31T724 26Q752 26 776 56T815 138Q818 149 821 151T837 153Q857 153 857 145Q857 144 853 130Q845 101 831 73T785 17T716 -10Q669 -10 648 17T627 73Q627 92 663 193T700 345Q700 404 656 404H651Q565 404 506 303L499 291L466 157Q433 26 428 16Q415 -11 385 -11Q372 -11 364 -4T353 8T350 18Q350 29 384 161L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 181Q151 335 151 342Q154 357 154 369Q154 405 129 405Q107 405 92 377T69 316T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g></g></g></svg></mjx-container>개의 데이터를 선택했을 때, 모두 내부점일 확률을 나타냅니다.</li><li><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="13.961ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 6170.7 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mn" transform="translate(389,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g><g data-mml-node="mo" transform="translate(1111.2,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="mo" transform="translate(2111.4,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mn" transform="translate(2500.4,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g><g data-mml-node="mo" transform="translate(3222.7,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="mi" transform="translate(4222.9,0)"><path data-c="1D452" d="M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z"></path></g><g data-mml-node="msup" transform="translate(4688.9,0)"><g data-mml-node="mo"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mi" transform="translate(422,363) scale(0.707)"><path data-c="1D45A" d="M21 287Q22 293 24 303T36 341T56 388T88 425T132 442T175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q303 442 384 442Q401 442 415 440T441 433T460 423T475 411T485 398T493 385T497 373T500 364T502 357L510 367Q573 442 659 442Q713 442 746 415T780 336Q780 285 742 178T704 50Q705 36 709 31T724 26Q752 26 776 56T815 138Q818 149 821 151T837 153Q857 153 857 145Q857 144 853 130Q845 101 831 73T785 17T716 -10Q669 -10 648 17T627 73Q627 92 663 193T700 345Q700 404 656 404H651Q565 404 506 303L499 291L466 157Q433 26 428 16Q415 -11 385 -11Q372 -11 364 -4T353 8T350 18Q350 29 384 161L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 181Q151 335 151 342Q154 357 154 369Q154 405 129 405Q107 405 92 377T69 316T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="mo" transform="translate(5781.7,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g></svg></mjx-container>은 무작위로 선택한 데이터 중 적어도 하나 이상이 이상점일 확률입니다.</li><li><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="15.569ex" height="2.48ex" role="img" focusable="false" viewBox="0 -846 6881.6 1096"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mn" transform="translate(389,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g><g data-mml-node="mo" transform="translate(1111.2,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="mo" transform="translate(2111.4,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mn" transform="translate(2500.4,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g><g data-mml-node="mo" transform="translate(3222.7,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="mi" transform="translate(4222.9,0)"><path data-c="1D452" d="M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z"></path></g><g data-mml-node="msup" transform="translate(4688.9,0)"><g data-mml-node="mo"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mi" transform="translate(422,363) scale(0.707)"><path data-c="1D45A" d="M21 287Q22 293 24 303T36 341T56 388T88 425T132 442T175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q303 442 384 442Q401 442 415 440T441 433T460 423T475 411T485 398T493 385T497 373T500 364T502 357L510 367Q573 442 659 442Q713 442 746 415T780 336Q780 285 742 178T704 50Q705 36 709 31T724 26Q752 26 776 56T815 138Q818 149 821 151T837 153Q857 153 857 145Q857 144 853 130Q845 101 831 73T785 17T716 -10Q669 -10 648 17T627 73Q627 92 663 193T700 345Q700 404 656 404H651Q565 404 506 303L499 291L466 157Q433 26 428 16Q415 -11 385 -11Q372 -11 364 -4T353 8T350 18Q350 29 384 161L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 181Q151 335 151 342Q154 357 154 369Q154 405 129 405Q107 405 92 377T69 316T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="msup" transform="translate(5781.7,0)"><g data-mml-node="mo"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mi" transform="translate(422,363) scale(0.707)"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z"></path></g></g></g></g></svg></mjx-container>은 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="2.009ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 888 683"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z"></path></g></g></g></svg></mjx-container>번 반복 시도했을 때, 모든 시도가 최소 하나의 이상점을 포함할 확률입니다.</li><li>따라서, 전체 식인 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="23.621ex" height="2.48ex" role="img" focusable="false" viewBox="0 -846 10440.6 1096"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D45D" d="M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z"></path></g><g data-mml-node="mo" transform="translate(780.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mn" transform="translate(1836.6,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g><g data-mml-node="mo" transform="translate(2558.8,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="mo" transform="translate(3559,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mn" transform="translate(3948,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g><g data-mml-node="mo" transform="translate(4670.2,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="mo" transform="translate(5670.4,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mn" transform="translate(6059.4,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g><g data-mml-node="mo" transform="translate(6781.7,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="mi" transform="translate(7781.9,0)"><path data-c="1D452" d="M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z"></path></g><g data-mml-node="msup" transform="translate(8247.9,0)"><g data-mml-node="mo"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mi" transform="translate(422,363) scale(0.707)"><path data-c="1D45A" d="M21 287Q22 293 24 303T36 341T56 388T88 425T132 442T175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q303 442 384 442Q401 442 415 440T441 433T460 423T475 411T485 398T493 385T497 373T500 364T502 357L510 367Q573 442 659 442Q713 442 746 415T780 336Q780 285 742 178T704 50Q705 36 709 31T724 26Q752 26 776 56T815 138Q818 149 821 151T837 153Q857 153 857 145Q857 144 853 130Q845 101 831 73T785 17T716 -10Q669 -10 648 17T627 73Q627 92 663 193T700 345Q700 404 656 404H651Q565 404 506 303L499 291L466 157Q433 26 428 16Q415 -11 385 -11Q372 -11 364 -4T353 8T350 18Q350 29 384 161L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 181Q151 335 151 342Q154 357 154 369Q154 405 129 405Q107 405 92 377T69 316T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="msup" transform="translate(9340.7,0)"><g data-mml-node="mo"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mi" transform="translate(422,363) scale(0.707)"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z"></path></g></g></g></g></svg></mjx-container>은 최소 한 번 이상 올바른 모델을 찾을 확률을 의미합니다.</li></ul><p><mjx-container class="MathJax" jax="SVG" display="true"><svg style="vertical-align: -2.172ex;" xmlns="http://www.w3.org/2000/svg" width="22.749ex" height="5.475ex" role="img" focusable="false" viewBox="0 -1460 10055 2420"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z"></path></g><g data-mml-node="mo" transform="translate(1165.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mfrac" transform="translate(2221.6,0)"><g data-mml-node="mrow" transform="translate(1776,710)"><g data-mml-node="mi"><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z"></path><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(278,0)"></path><path data-c="67" d="M329 409Q373 453 429 453Q459 453 472 434T485 396Q485 382 476 371T449 360Q416 360 412 390Q410 404 415 411Q415 412 416 414V415Q388 412 363 393Q355 388 355 386Q355 385 359 381T368 369T379 351T388 325T392 292Q392 230 343 187T222 143Q172 143 123 171Q112 153 112 133Q112 98 138 81Q147 75 155 75T227 73Q311 72 335 67Q396 58 431 26Q470 -13 470 -72Q470 -139 392 -175Q332 -206 250 -206Q167 -206 107 -175Q29 -140 29 -75Q29 -39 50 -15T92 18L103 24Q67 55 67 108Q67 155 96 193Q52 237 52 292Q52 355 102 398T223 442Q274 442 318 416L329 409ZM299 343Q294 371 273 387T221 404Q192 404 171 388T145 343Q142 326 142 292Q142 248 149 227T179 192Q196 182 222 182Q244 182 260 189T283 207T294 227T299 242Q302 258 302 292T299 343ZM403 -75Q403 -50 389 -34T348 -11T299 -2T245 0H218Q151 0 138 -6Q118 -15 107 -34T95 -74Q95 -84 101 -97T122 -127T170 -155T250 -167Q319 -167 361 -139T403 -75Z" transform="translate(778,0)"></path></g><g data-mml-node="mo" transform="translate(1278,0)"><path data-c="2061" d=""></path></g><g data-mml-node="mo" transform="translate(1278,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mn" transform="translate(1667,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g><g data-mml-node="mo" transform="translate(2389.2,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="mi" transform="translate(3389.4,0)"><path data-c="1D45D" d="M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z"></path></g><g data-mml-node="mo" transform="translate(3892.4,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g><g data-mml-node="mrow" transform="translate(220,-710)"><g data-mml-node="mi"><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z"></path><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(278,0)"></path><path data-c="67" d="M329 409Q373 453 429 453Q459 453 472 434T485 396Q485 382 476 371T449 360Q416 360 412 390Q410 404 415 411Q415 412 416 414V415Q388 412 363 393Q355 388 355 386Q355 385 359 381T368 369T379 351T388 325T392 292Q392 230 343 187T222 143Q172 143 123 171Q112 153 112 133Q112 98 138 81Q147 75 155 75T227 73Q311 72 335 67Q396 58 431 26Q470 -13 470 -72Q470 -139 392 -175Q332 -206 250 -206Q167 -206 107 -175Q29 -140 29 -75Q29 -39 50 -15T92 18L103 24Q67 55 67 108Q67 155 96 193Q52 237 52 292Q52 355 102 398T223 442Q274 442 318 416L329 409ZM299 343Q294 371 273 387T221 404Q192 404 171 388T145 343Q142 326 142 292Q142 248 149 227T179 192Q196 182 222 182Q244 182 260 189T283 207T294 227T299 242Q302 258 302 292T299 343ZM403 -75Q403 -50 389 -34T348 -11T299 -2T245 0H218Q151 0 138 -6Q118 -15 107 -34T95 -74Q95 -84 101 -97T122 -127T170 -155T250 -167Q319 -167 361 -139T403 -75Z" transform="translate(778,0)"></path></g><g data-mml-node="mo" transform="translate(1278,0)"><path data-c="2061" d=""></path></g><g data-mml-node="mrow" transform="translate(1444.7,0)"><g data-mml-node="mo"><path data-c="5B" d="M118 -250V750H255V710H158V-210H255V-250H118Z"></path></g><g data-mml-node="mn" transform="translate(278,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g><g data-mml-node="mo" transform="translate(1000.2,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="mo" transform="translate(2000.4,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mn" transform="translate(2389.4,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g><g data-mml-node="mo" transform="translate(3111.7,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="mi" transform="translate(4111.9,0)"><path data-c="1D452" d="M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z"></path></g><g data-mml-node="msup" transform="translate(4577.9,0)"><g data-mml-node="mo"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mi" transform="translate(422,289) scale(0.707)"><path data-c="1D45A" d="M21 287Q22 293 24 303T36 341T56 388T88 425T132 442T175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q303 442 384 442Q401 442 415 440T441 433T460 423T475 411T485 398T493 385T497 373T500 364T502 357L510 367Q573 442 659 442Q713 442 746 415T780 336Q780 285 742 178T704 50Q705 36 709 31T724 26Q752 26 776 56T815 138Q818 149 821 151T837 153Q857 153 857 145Q857 144 853 130Q845 101 831 73T785 17T716 -10Q669 -10 648 17T627 73Q627 92 663 193T700 345Q700 404 656 404H651Q565 404 506 303L499 291L466 157Q433 26 428 16Q415 -11 385 -11Q372 -11 364 -4T353 8T350 18Q350 29 384 161L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 181Q151 335 151 342Q154 357 154 369Q154 405 129 405Q107 405 92 377T69 316T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="mo" transform="translate(5670.7,0)"><path data-c="5D" d="M22 710V750H159V-250H22V-210H119V710H22Z"></path></g></g></g><rect width="7593.4" height="60" x="120" y="220"></rect></g></g></g></svg></mjx-container></p><p>이 식을 반복 횟수 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="2.009ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 888 683"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z"></path></g></g></g></svg></mjx-container>에 대해 정리하면 일반적으로 사용하는 원하는 신뢰도를 얻기 위한 최소한의 반복 횟수를 이론적으로 결정하는 공식이 됩니다.</p><p>AD_HERE</p><h2 id="RANSAC-알고리즘-예시-코드-Python-OpenCV-기준"><a href="#RANSAC-알고리즘-예시-코드-Python-OpenCV-기준" class="headerlink" title="RANSAC 알고리즘 예시 코드 (Python, OpenCV 기준)"></a>RANSAC 알고리즘 예시 코드 (Python, OpenCV 기준)</h2><p>다음은 OpenCV와 Python을 이용해, 두 이미지 간 특징점 매칭에서 RANSAC을 활용하여 Homography 행렬을 구하는 예제 코드입니다.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> cv2 </span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np </span><br><span class="line"></span><br><span class="line"><span class="comment"># SIFT를 이용한 특징점 검출 및 descriptor 추출</span></span><br><span class="line">sift = cv2.SIFT_create() </span><br><span class="line">kp1, des1 = sift.detectAndCompute(img1, <span class="literal">None</span>) </span><br><span class="line">kp2, des2 = sift.detectAndCompute(img2, <span class="literal">None</span>) </span><br><span class="line"></span><br><span class="line"><span class="comment"># BFMatcher를 이용하여 두 이미지의 특징점 매칭 수행(k=2는 Lowe's ratio test를 위한 설정)</span></span><br><span class="line">bf = cv2.BFMatcher() </span><br><span class="line">matches = bf.knnMatch(des1, des2, k=<span class="number">2</span>) </span><br><span class="line"></span><br><span class="line"><span class="comment"># Lowe's test로 좋은 매칭점 선별 (가장 유사한 매칭의 거리 차이가 명확한 특징점만 선택)</span></span><br><span class="line">good_matches = [m <span class="keyword">for</span> m, n <span class="keyword">in</span> matches <span class="keyword">if</span> m.distance < <span class="number">0.75</span> * n.distance]</span><br><span class="line"></span><br><span class="line"><span class="comment"># 좋은 매칭점들에서 각 이미지의 좌표를 추출</span></span><br><span class="line">src_pts = np.float32([kp1[m.queryIdx].pt <span class="keyword">for</span> m <span class="keyword">in</span> good_matches]) </span><br><span class="line">dst_pts = np.float32([kp2[m.trainIdx].pt <span class="keyword">for</span> m <span class="keyword">in</span> good_matches]) </span><br><span class="line"></span><br><span class="line"><span class="comment"># RANSAC을 사용하여 호모그래피 행렬H를 추정하고, inlier을 판별하는 mask 반환</span></span><br><span class="line">H, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, <span class="number">5.0</span>)</span><br></pre></td></tr></table></figure><p>여기서 사용된 threshold <code>5.0</code>은 inlier을 판별할 때 허용 가능한 오차 범위이며, 실제 사용 환경과 데이터의 특성에 따라 조정할 수 있습니다. <code>mask</code> 배열은 RANSAC 알고리즘에서 내부점으로 분류된 매칭점을 나타내므로, 이후 모델을 더욱 정확하게 refine할 때 활용할 수 있습니다.</p><hr>]]></content:encoded>
<comments>http://techbless.github.io/2025/03/19/ransac/#disqus_thread</comments>
</item>
<item>
<title>C# LOH Fragmentation과 고가용성을 위한 단편화 방지 전략</title>
<link>http://techbless.github.io/2025/03/06/dotnet-LOH-fragmentation/</link>
<guid>http://techbless.github.io/2025/03/06/dotnet-LOH-fragmentation/</guid>
<pubDate>Thu, 06 Mar 2025 19:38:25 GMT</pubDate>
<description>
<h1 id="LOH-Fragmentation-관리와-최적화-방법-24시간-돌아야-하는-시스템에서의-성능-최적화"><a href="#LOH-Fragmentation-관리와-최적화-방법-24시간-돌아야-하는-시스템에서의-성능-최적화" class="hea
</description>
<content:encoded><![CDATA[<h1 id="LOH-Fragmentation-관리와-최적화-방법-24시간-돌아야-하는-시스템에서의-성능-최적화"><a href="#LOH-Fragmentation-관리와-최적화-방법-24시간-돌아야-하는-시스템에서의-성능-최적화" class="headerlink" title="LOH Fragmentation 관리와 최적화 방법: 24시간 돌아야 하는 시스템에서의 성능 최적화"></a>LOH Fragmentation 관리와 최적화 방법: 24시간 돌아야 하는 시스템에서의 성능 최적화</h1><p>이전에 작성한 글에서 <strong>C#</strong> 의 <strong>Garbage Collection</strong> 과 <strong>LOH(Large Object Heap)</strong> 과 <strong>SOH(Small Object Heap)</strong> 의 차이를 간단히 설명했었습니다. 아직 읽지 않으신 분들은 그 글을 먼저 확인해 보세요. 이번 글에서는 <strong>LOH Fragmentation</strong> 문제를 다루고, 이를 관리해야 하는 이유와 24시간 돌아야 하는 장비 같은 중요한 시스템 환경에서 LOH를 어떻게 최적화할 수 있는지, 구체적인 방법들을 설명할 것입니다.</p><h2 id="LOH란-무엇인가"><a href="#LOH란-무엇인가" class="headerlink" title="LOH란 무엇인가?"></a>LOH란 무엇인가?</h2><p><strong>Large Object Heap(LOH)</strong> 는 <strong>85,000바이트 이상</strong> 크기의 큰 객체들을 저장하는 .NET의 메모리 영역입니다. SOH와는 달리 LOH는 큰 객체들을 처리하는데 특화되어 있으며, LOH의 객체들은 <strong>가비지 컬렉션 시 압축(compaction)</strong> 이 이루어지지 않습니다. 이로 인해 LOH에 할당된 객체들이 시간이 지나면서 <strong>fragmentation</strong>를 일으킬 수 있습니다. </p><h2 id="LOH-Fragmentation이란"><a href="#LOH-Fragmentation이란" class="headerlink" title="LOH Fragmentation이란?"></a>LOH Fragmentation이란?</h2><p><strong>LOH Fragmentation</strong> 은 LOH에서 객체들이 할당되고 해제되면서 발생하는 메모리 단편화 현상을 말합니다. LOH에 할당된 객체들은 크기가 크기 때문에, 한 번 할당되면 그 크기만큼 연속된 메모리 공간을 차지하게 됩니다. 그러나 시간이 지나면서 여러 객체가 할당되고 해제되면서, 메모리 내에 빈 공간이 흩어지게 됩니다. 이로 인해 새로운 큰 객체를 할당하려고 할 때, 연속된 메모리 공간을 찾기 어려워지며 단편화가 발생하게 됩니다.</p><h3 id="LOH-Fragmentation-시나리오"><a href="#LOH-Fragmentation-시나리오" class="headerlink" title="LOH Fragmentation 시나리오"></a>LOH Fragmentation 시나리오</h3><p>LOH단편화 또한 일반적인 메모리 단편화와 발생하는 시나리오가 유사하지만, 아래의 이미지를 보면 LOH가 어떻게 단편화되는지 잘 설명되어 있습니다.</p><p><img src="/img/loh_fragmentation/Figure1.png"><br><a href="https://www.codeproject.com/Articles/1191534/To-Heap-or-not-to-Heap-That-s-the-Large-Object-Que">Source (Figure. 13)</a></p><ol><li>After Full GC:<br>가비지 컬렉션이 실행된 후 LOH에서 메모리는 깔끔하게 정리되고 빈 공간이 발생합니다. 이 공간은 새로운 큰 객체를 할당할 수 있는 여유가 있지만, 할당된 객체들이 크기 때문에 그 자리가 다시 채워지지 않으면 빈 공간으로 남게 됩니다.</li><li>After New Allocation:<br>새로운 객체가 할당되면 LOH에 빈 공간이 재사용됩니다. 그러나 이 재사용된 공간은 작은 조각으로 남게 되며, 이 조각은 다시 사용되지 않을 가능성이 높습니다. 왜냐하면 그 공간은 85,000바이트 이하의 크기로, LOH의 크기 기준에 맞지 않기 때문입니다. 따라서 이 작은 조각은 다시 재사용되지 않으며, 단편화된 메모리로 남게 됩니다.</li><li>After New Allocation (더 많은 할당):<br>새로운 객체들이 계속 할당되면, 이전에 재사용된 작은 빈 공간들이 점차 재활용되지 않게 되고, LOH 내 단편화가 더욱 심해집니다. 이때 큰 객체를 할당하려고 시도하면 빈 공간을 찾는 데 어려움이 생깁니다. 결국 새로운 큰 객체는 연속된 공간을 찾지 못하고 새로운 메모리 공간에 할당될 수 있습니다.</li></ol><h3 id="LOH-Fragmentation의-영향"><a href="#LOH-Fragmentation의-영향" class="headerlink" title="LOH Fragmentation의 영향"></a>LOH Fragmentation의 영향</h3><p>위의 이미지는 LOH가 어떻게 빈 공간을 관리하는지, 그리고 새로운 객체 할당이 어떻게 단편화되는지 시각적으로 잘 보여줍니다. LOH에 단편화가 발생하면, 새로운 큰 객체를 할당할 때 필요한 연속된 메모리가 부족해지며, 이는 성능 저하나 <strong>OutOfMemoryException</strong> 과 같은 문제가 발생할 수 있습니다.</p><h2 id="LOH-Fragmentation-관리가-중요한-이유"><a href="#LOH-Fragmentation-관리가-중요한-이유" class="headerlink" title="LOH Fragmentation 관리가 중요한 이유"></a>LOH Fragmentation 관리가 중요한 이유</h2><p><strong>LOH Fragmentation</strong> 을 관리하지 않으면 메모리 부족문제나 성능 저하를 초래할 수 있습니다. 특히 24시간 돌아야 하는 장비에서는 메모리 관리가 중요한 역할을 합니다. 예를 들어, 실시간 데이터 처리 시스템이나 금융 거래 시스템 등과 같은 중요한 시스템에서는 LOH 단편화가 발생하면 시스템 장애로 이어질 수 있습니다.</p><h3 id="1-성능-저하"><a href="#1-성능-저하" class="headerlink" title="1. 성능 저하"></a>1. 성능 저하</h3><p>LOH에서 발생한 단편화는 메모리 할당을 비효율적으로 만들고, 객체 배치가 어렵게 되어 성능 저하를 일으킬 수 있습니다.</p><h3 id="2-메모리-부족"><a href="#2-메모리-부족" class="headerlink" title="2. 메모리 부족"></a>2. 메모리 부족</h3><p>LOH에서 메모리를 할당할 때 연속된 공간을 찾는 데 어려움이 생기면, 결국 <strong>OutOfMemoryException</strong> 을 발생시킬 수 있습니다. 이는 서비스 중단으로 이어질 수 있어 24시간 가동이 중요한 시스템에서는 치명적일 수 있습니다.</p><p>AD_HERE</p><h2 id="LOH-Fragmentation을-방지하는-방법"><a href="#LOH-Fragmentation을-방지하는-방법" class="headerlink" title="LOH Fragmentation을 방지하는 방법"></a>LOH Fragmentation을 방지하는 방법</h2><p>그렇다면 <strong>LOH Fragmentation</strong> 을 어떻게 방지할 수 있을까요? 몇 가지 방법을 제시해 보겠습니다.</p><h3 id="1-큰-객체의-크기-분할"><a href="#1-큰-객체의-크기-분할" class="headerlink" title="1. 큰 객체의 크기 분할"></a>1. 큰 객체의 크기 분할</h3><p>가능한 한 큰 객체를 여러 개의 작은 객체로 나누어 SOH에 할당되도록 유도하는 방법입니다. SOH는 LOH보다 메모리 관리가 효율적이고 단편화가 덜 발생하기 때문에, 큰 객체를 분할하면 LOH의 단편화를 줄일 수 있습니다.</p><h3 id="2-배열-관리-최적화"><a href="#2-배열-관리-최적화" class="headerlink" title="2. 배열 관리 최적화"></a>2. 배열 관리 최적화</h3><p>배열을 사용할 때, 배열의 크기를 예측하여 배열을 너무 크게할당하지 않는 것이 중요합니다. 배열의 총 크기가 LOH의 임계값을 넘지 않도록 신경 써야 하며, 배열이 여러 조각으로 나누어지지 않도록 합니다.</p><h3 id="3-MemoryPool-사용"><a href="#3-MemoryPool-사용" class="headerlink" title="3. MemoryPool 사용"></a>3. MemoryPool 사용</h3><p><code>ArrayPool<T></code>나 <code>MemoryPool<T></code>와 같은 객체 풀을 사용하면 LOH에서 발생할 수 있는 단편화를 방지할 수 있습니다. 객체 풀을 사용하면 반복적인 메모리 할당과 해제가 줄어들고, 미리 할당된 메모리 공간을 재사용할 수 있기 때문에 단편화 문제를 최소화할 수 있습니다.</p><h3 id="4-Full-GC-호출-최소화"><a href="#4-Full-GC-호출-최소화" class="headerlink" title="4. Full GC 호출 최소화"></a>4. Full GC 호출 최소화</h3><p><code>GC.Collect()</code> 메서드를 사용하여 <strong>Full GC</strong> 를 강제로 호출할 수 있지만, LOH는 Full GC가 필요하지 않으면 호출하지 않는 것이 좋습니다. Full GC는 성능에 큰 영향을 미치기 때문에, 불필요한 호출을 피해야 합니다.</p><h3 id="5-큰-객체-할당-최소화"><a href="#5-큰-객체-할당-최소화" class="headerlink" title="5. 큰 객체 할당 최소화"></a>5. 큰 객체 할당 최소화</h3><p>LOH에 큰 객체를 자주 할당하지 않도록 하며, 큰 객체가 반드시 필요할 때만 할당하도록 합니다. LOH에 큰 객체가 많이 할당되면 Gen2 가비지 컬렉션이 자주 일어나고, 그로 인해 성능 저하를 겪을 수 있습니다.</p><h2 id="LOH-단편화-방지의-중요성-24시간-돌아야-하는-장비-예시"><a href="#LOH-단편화-방지의-중요성-24시간-돌아야-하는-장비-예시" class="headerlink" title="LOH 단편화 방지의 중요성: 24시간 돌아야 하는 장비 예시"></a>LOH 단편화 방지의 중요성: 24시간 돌아야 하는 장비 예시</h2><p>실제로 금융 거래 시스템 같은 24시간 돌아야 하는 시스템에서는 메모리 부족으로 인한 다운타임을 절대 허용할 수 없습니다. 이런 시스템에서는 LOH 단편화가 발생하면, 실시간 데이터 처리에 큰 영향을 미치고, 이는 결국 사용자 경험에 심각한 영향을 미칠 수 있습니다.</p><h3 id="예시-실시간-데이터-처리-시스템"><a href="#예시-실시간-데이터-처리-시스템" class="headerlink" title="예시: 실시간 데이터 처리 시스템"></a>예시: 실시간 데이터 처리 시스템</h3><p>예를 들어, 실시간으로 트랜잭션을 처리하는 시스템에서 LOH 단편화가 발생하면, 새로운 큰 객체를 할당하는데 필요한 메모리 공간을 확보할 수 없어 트랜잭션 처리 지연이 발생할 수 있습니다. 이로 인해 성능 저하나 서비스 중단이 발생하면, 큰 손실을 초래할 수 있습니다.</p><h2 id="LOH-압축-GCSettings를-통한-LOH-압축"><a href="#LOH-압축-GCSettings를-통한-LOH-압축" class="headerlink" title="LOH 압축: GCSettings를 통한 LOH 압축"></a>LOH 압축: GCSettings를 통한 LOH 압축</h2><p><strong>LOH Fragmentation</strong> 문제를 해결하기 위한 방법 중 하나는 LOH 압축을 수동으로 수행하는 것입니다. .NET Framework 4.5.1부터는 LOH를 수동으로 compact할 수 있는 기능이 제공됩니다. 기본적으로 LOH는 가비지 컬렉션 동안 자동으로 압축되지 않지만, <strong>GCSettings.LargeObjectHeapCompactionMode</strong> 속성을 사용하면 LOH를 명시적으로 압축할 수 있습니다.</p><h3 id="LOH-압축-사용-예시"><a href="#LOH-압축-사용-예시" class="headerlink" title="LOH 압축 사용 예시"></a>LOH 압축 사용 예시</h3><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// LOH 압축 모드를 '한 번만 압축'으로 설정</span></span><br><span class="line">GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;</span><br><span class="line"><span class="comment">// 가비지 컬렉션을 강제로 실행하여 LOH를 압축</span></span><br><span class="line">GC.Collect();</span><br></pre></td></tr></table></figure><h3 id="LOH-압축의-장점과-고려-사항"><a href="#LOH-압축의-장점과-고려-사항" class="headerlink" title="LOH 압축의 장점과 고려 사항"></a>LOH 압축의 장점과 고려 사항</h3><p>LOH 압축을 명시적으로 호출하는 방법은 단편화를 줄이고 메모리 사용을 최적화하는 데 도움이 될 수 있습니다. 하지만 이 방법에는 몇 가지 성능 비용이 따르므로, 신중하게 사용해야 할 필요가 있습니다</p><ul><li>장점</li></ul><ol><li>메모리 압축을 통해 LOH 단편화를 줄일 수 있으며, 연속된 메모리 공간을 확보하게 되어 새로운 큰 객체의 할당이 수월해집니다.</li><li>특히 24시간 돌아야 하는 장비에서 메모리 부족 문제나 성능 저하를 예방하는 데 유용할 수 있습니다.</li></ol><ul><li>고려 사항:</li></ul><ol><li>LOH 압축은 가비지 컬렉션을 수행한 후에 발생하므로, 성능 비용이 들 수 있습니다. LOH가 크고 복잡한 경우, 압축을 자주 호출하면 시스템 성능에 부정적인 영향을 미칠 수 있습니다.</li><li>압축을 자주 수행하는 것보다, LOH의 크기나 객체 할당 방식을 최적화하여 단편화가 발생하지 않도록 하는 것이 보다 효율적일 수 있습니다.</li></ol><h2 id="결론"><a href="#결론" class="headerlink" title="결론"></a>결론</h2><p><strong>LOH 단편화</strong> 는 메모리 효율성에 큰 영향을 미칠 수 있는 문제입니다. 특히 24시간 돌아야 하는 장비와 같이 높은 가용성과 성능이 중요한 시스템에서는 LOH의 단편화 문제를 반드시 해결해야 합니다.</p><p>큰 객체 분할, 배열 최적화, MemoryPool 사용 등을 통해 LOH 단편화를 예방하고, 성능 저하 없이 안정적인 시스템을 운영할 수 있도록 관리해야 합니다. LOH 관리에 신경 써서 효율적인 메모리 사용을 통해 높은 성능을 유지할 수 있도록 노력해야 합니다.</p>]]></content:encoded>
<comments>http://techbless.github.io/2025/03/06/dotnet-LOH-fragmentation/#disqus_thread</comments>
</item>
<item>
<title>[논문 리뷰] DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning</title>
<link>http://techbless.github.io/2025/02/11/deepseek-r1/</link>
<guid>http://techbless.github.io/2025/02/11/deepseek-r1/</guid>
<pubDate>Tue, 11 Feb 2025 22:08:12 GMT</pubDate>
<description>
<h2 id="DeepSeek-R1-강화학습을-통한-추론-능력-고취"><a href="#DeepSeek-R1-강화학습을-통한-추론-능력-고취" class="headerlink" title="DeepSeek-R1: 강화학습을 통한 추론 능력 고취"></
</description>
<content:encoded><![CDATA[<h2 id="DeepSeek-R1-강화학습을-통한-추론-능력-고취"><a href="#DeepSeek-R1-강화학습을-통한-추론-능력-고취" class="headerlink" title="DeepSeek-R1: 강화학습을 통한 추론 능력 고취"></a>DeepSeek-R1: 강화학습을 통한 추론 능력 고취</h2><p>링크: <a href="https://arxiv.org/abs/2501.12948">https://arxiv.org/abs/2501.12948</a><br>연구목적: SFT없이 강화학습만으로 LLM추론 능력을 향상시킬 수 있는지 탐구<br>데이터셋: 약 800K 개의 샘플 (600K 추론, 200K 비추론)<br>주요결과: Pure RL만으로 추론 능력 발현을 보임, DeepSeek-R1, Distillation<br>저자: DeepSeek-AI</p><hr><p>DeepSeek-R1은 대규모 언어 모델(LLM)에 강화학습(RL)을 적용해, 모델이 스스로 ‘Reasoning’ 능력을 발달시키도록 유도한 연구이다. 본 연구에서는 <strong>DeepSeek-R1-Zero</strong>와 <strong>DeepSeek-R1</strong>이라는 두 가지 모델을 단계적으로 제안하며, 이후 지식 증류(Distillation)를 통해 소형 모델에서도 강력한 추론 능력을 발휘할 수 있게 한다. 수학, 코딩, 논리적 추론 등 체계적 문제에서 뛰어난 성능을 보이며, 궁극적으로 OpenAI의 o1-1217(일명 ChatGPT-4o 시리즈의 고급 버전)과 유사한 추론 성능을 달성하였다.</p><h2 id="연구-배경"><a href="#연구-배경" class="headerlink" title="연구 배경"></a>연구 배경</h2><p>최근 LLM 연구에서는 사전학습(Pre-training) 이후 후처리(Post-training)를 통해 성능을 높이는 방식을 주로 사용한다. 기존에는 Supervised Fine-Tuning(SFT)을 거친 뒤, 추가적인 RL을 적용해 모델을 더 정교화하는 방식이 일반적이었다.</p><p>DeepSeek-R1 연구진은 다음과 같은 질문에서 출발했다.</p><blockquote><p>“SFT 없이 순수 RL만으로도 추론 능력을 발전시킬 수 있을까?”</p></blockquote><p>이에 대한 해답으로 DeepSeek-R1-Zero 모델을 통해, 자동화된 규칙 기반 보상만으로 독자적 추론 능력을 개발할 수 있음을 보였다. 하지만 이 방식은 가독성과 언어 혼합 문제가 있어, Cold-start 데이터를 추가로 활용한 개선 모델인 DeepSeek-R1을 제안하였다.</p><h2 id="Main-Contribution"><a href="#Main-Contribution" class="headerlink" title="Main Contribution"></a>Main Contribution</h2><p>이 연구의 두 가지 주요 기여는 다음과 같다:</p><h3 id="1-순수-RL-기반-추론-모델-DeepSeek-R1-Zero"><a href="#1-순수-RL-기반-추론-모델-DeepSeek-R1-Zero" class="headerlink" title="1. 순수 RL 기반 추론 모델: DeepSeek-R1-Zero"></a>1. 순수 RL 기반 추론 모델: DeepSeek-R1-Zero</h3><ul><li>Supervised Fine-Tuning(SFT) 없이, Base Model에 직접 강화학습(RL)을 적용해 추론 능력을 개발.</li><li>Chain-of-Thought(CoT) 기반 학습을 통해 수학, 코딩 등 복잡한 문제를 해결하는 과정에서 자기 검증(self-verification), 반성(reflection), ‘아하!’ 모멘트(insightful realization) 등 인간과 유사한 고차원적 사고 행동이 자발적으로 나타남.</li><li>인간 피드백 없이도 스스로 학습 경로를 찾는 능력이 강화되면서, 지도 데이터 의존도를 크게 줄임.</li></ul><h3 id="2-멀티-스테이지-학습-전략-DeepSeek-R1"><a href="#2-멀티-스테이지-학습-전략-DeepSeek-R1" class="headerlink" title="2. 멀티 스테이지 학습 전략: DeepSeek-R1"></a>2. 멀티 스테이지 학습 전략: DeepSeek-R1</h3><ul><li>Cold-start 데이터를 활용해 모델을 가볍게 미세 조정한 후, 추론 중심의 RL을 적용해 언어 혼합, 비문 등 실제 사용에서의 문제를 개선.</li><li>RL을 통해 생성된 고품질 결과물을 다시 SFT 학습 데이터로 활용하여, 추론력과 언어 표현력을 동시에 강화.</li><li>모든 시나리오를 고려한 추가 RL 단계를 거쳐 최종 모델 성능을 극대화함.</li><li>이 과정을 통해 필요한 컴퓨팅 자원과 학습 비용을 대폭 절감하면서도 기존 대형 모델에 견줄 만한 성능을 달성.</li></ul><p>AD_HERE</p><h2 id="DeepSeek-R1-학습-구조"><a href="#DeepSeek-R1-학습-구조" class="headerlink" title="DeepSeek-R1 학습 구조"></a>DeepSeek-R1 학습 구조</h2><p>DeepSeek-R1의 학습 과정은 다음과 같은 단계로 구성된다:</p><h3 id="1-Cold-Start-단계"><a href="#1-Cold-Start-단계" class="headerlink" title="1. Cold-Start 단계"></a>1. Cold-Start 단계</h3><ul><li>미리 준비된 긴 Chain-of-Thought(CoT) 데이터로 기초 모델(DeepSeek-V3-Base)을 미세 조정.</li></ul><h3 id="2-추론-중심-강화학습-RL-단계"><a href="#2-추론-중심-강화학습-RL-단계" class="headerlink" title="2. 추론 중심 강화학습(RL) 단계"></a>2. 추론 중심 강화학습(RL) 단계</h3><ul><li>Group Relative Policy Optimization(GRPO)를 사용하여 정확성과 형식 보상을 기반으로 추론 성능 강화.</li></ul><h3 id="3-Negative-Sampling-및-SFT"><a href="#3-Negative-Sampling-및-SFT" class="headerlink" title="3. Negative Sampling 및 SFT"></a>3. Negative Sampling 및 SFT</h3><ul><li>RL 결과 중 우수한 데이터만 선별하여 새로운 SFT 데이터로 활용.</li></ul><h3 id="4-최종-RL-학습"><a href="#4-최종-RL-학습" class="headerlink" title="4. 최종 RL 학습"></a>4. 최종 RL 학습</h3><ul><li>추론 외에도 일반 작업에서 유용성과 안전성을 동시에 높이는 추가 RL 과정.</li></ul><h3 id="Cold-Start-SFT-DeepSeek-R1에만-적용"><a href="#Cold-Start-SFT-DeepSeek-R1에만-적용" class="headerlink" title="Cold-Start SFT (DeepSeek-R1에만 적용)"></a>Cold-Start SFT (DeepSeek-R1에만 적용)</h3><p>DeepSeek-R1-Zero는 전혀 SFT 없이 순수 RL만을 이용해 모델의 추론 능력을 개발하는 반면, DeepSeek-R1은 <strong>매우 소량의 Cold-Start 데이터를 이용한 SFT</strong>로 초기 모델을 정교화한 뒤 강화학습(RL)을 시작한다. 이 Cold-Start 데이터는 사람이 읽기 쉬운 코멘트와 긴 CoT(Chain-of-Thought)를 포함하며, 이를 통해 모델의 초기 출력 가독성을 높이는 효과를 얻는다.</p><table><thead><tr><th>모델 이름</th><th>SFT 여부</th><th>RL 여부</th><th>특징</th></tr></thead><tbody><tr><td>DeepSeek-R1-Zero</td><td>❌ (전혀 사용 안 함)</td><td>✅ (순수RL)</td><td>순수 RL로만 모델의 추론능력을 발전시키는 접근법</td></tr><tr><td>DeepSeek-R1</td><td>✅ (소량의 Cold-start SFT 사용)</td><td>✅ (RL)</td><td>초기 소량의 SFT로 가독성을 높이고, RL로 성능을 추가 개선</td></tr></tbody></table><ul><li>정답만 맞추는 것이 아니라, 명료한 언어와 요약 중심의 출력을 강조하여 가독성을 향상한다.</li><li>특히 수학이나 코딩 문제의 경우 논리적 전개 과정과 최종 결론을 명확히 드러내도록 설계된다.</li></ul><h3 id="흥미로운-발견-DeepSeek-R1-Zero의-‘Aha-Moment’"><a href="#흥미로운-발견-DeepSeek-R1-Zero의-‘Aha-Moment’" class="headerlink" title="흥미로운 발견: DeepSeek-R1-Zero의 ‘Aha Moment’"></a>흥미로운 발견: DeepSeek-R1-Zero의 ‘Aha Moment’</h3><p>DeepSeek-R1-Zero 모델이 훈련 중 겪은 **’Aha Moment’**는 특히 주목할 만한 발견이다. 이는 모델이 문제 해결 과정에서 스스로 더 긴 사고 시간을 할애하고 초기 접근 방식을 재검토하는 행동을 자발적으로 보여주는 현상이다. 이 과정에서 모델은 마치 사람처럼 자신의 오류를 인지하고 더 나은 해결책을 모색하며, 강화학습(RL)이 명확한 지침 없이도 <strong>적절한 인센티브만으로</strong> 모델의 자율적이고 정교한 추론 전략을 효과적으로 발전시킬 수 있음을 증명하였다.</p><p><img src="/img/deepseek/aha.png"></p><h2 id="성능-결과-요약"><a href="#성능-결과-요약" class="headerlink" title="성능 결과 요약"></a>성능 결과 요약</h2><p>DeepSeek-R1은 다양한 벤치마크에서 뛰어난 성능을 입증하였다:</p><ul><li><strong>수학 (AIME 2024)</strong>: Pass@1 기준 79.8%, OpenAI의 o1-1217보다 우수한 성능.</li><li><strong>코딩 (Codeforces)</strong>: 상위 96.3% 전문가급 성능 달성.</li><li><strong>일반 지식 및 추론 (MMLU, GPQA Diamond)</strong>: 기존 모델 대비 우수한 결과.</li></ul><p>특히, 강화학습을 통한 체계적 문제 해결에서 뛰어난 성능을 발휘하였다.</p><h2 id="Distillation을-통한-소형-모델-강화"><a href="#Distillation을-통한-소형-모델-강화" class="headerlink" title="Distillation을 통한 소형 모델 강화"></a>Distillation을 통한 소형 모델 강화</h2><p>DeepSeek-R1의 지식을 작은 모델(Qwen, Llama 등)에 distillation하여 전달하는 실험 결과는 매우 성공적이었다. 이를 통해 소형 모델이 별도의 RL 과정 없이도 우수한 추론 성능을 달성하였고, 특히 Distill-Qwen-32B 모델은 동급 모델 대비 월등한 성능을 기록하였다.</p><h2 id="연구의-한계점-및-향후-연구-방향"><a href="#연구의-한계점-및-향후-연구-방향" class="headerlink" title="연구의 한계점 및 향후 연구 방향"></a>연구의 한계점 및 향후 연구 방향</h2><p>연구진은 다음과 같은 한계와 향후 연구 방향을 제시하였다:</p><ul><li>다중 언어 지원 및 언어 혼합 문제 개선</li><li>소프트웨어 엔지니어링 관련 작업 평가 및 향상</li><li>프로세스 기반 보상 모델과 몬테카를로 트리 탐색(MCTS) 접근법 효율성 향상</li></ul>]]></content:encoded>
<comments>http://techbless.github.io/2025/02/11/deepseek-r1/#disqus_thread</comments>
</item>
<item>
<title>C# .NET GC 제너레이션과 LOH/SOH 이해하기: 효율적인 메모리 관리</title>
<link>http://techbless.github.io/2025/02/05/dotnet-GC-Generation-LOH-SOH/</link>
<guid>http://techbless.github.io/2025/02/05/dotnet-GC-Generation-LOH-SOH/</guid>
<pubDate>Wed, 05 Feb 2025 12:23:45 GMT</pubDate>
<description>
<h1 id="C-NET의-GC와-LOH-SOH에-대해-알아보자"><a href="#C-NET의-GC와-LOH-SOH에-대해-알아보자" class="headerlink" title="C# .NET의 GC와 LOH/SOH에 대해 알아보자"></a>C#
</description>
<content:encoded><![CDATA[<h1 id="C-NET의-GC와-LOH-SOH에-대해-알아보자"><a href="#C-NET의-GC와-LOH-SOH에-대해-알아보자" class="headerlink" title="C# .NET의 GC와 LOH/SOH에 대해 알아보자"></a>C# .NET의 GC와 LOH/SOH에 대해 알아보자</h1><p>C#은 메모리 관리를 자동으로 처리하는 Managed 언어로, 그 핵심 기능 중 하나가 <strong>Garbage Collection</strong> 다. 개발자가 메모리 할당과 해제를 신경 쓸 필요 없이, 프로그램이 실행되는 동안 메모리를 자동으로 관리해준다. 이를 통해 메모리 누수나 비효율적인 메모리 사용을 방지할 수 있다. 이번 글에서는 .NET에서 GC가 어떻게 동작하는지, 그리고 <strong>Large Object Heap(LOH)</strong> 와 <strong>Small Object Heap(SOH)</strong> 에 대해 알아보려고 한다.</p><h2 id="Garbage-Collection이란"><a href="#Garbage-Collection이란" class="headerlink" title="Garbage Collection이란?"></a>Garbage Collection이란?</h2><p><strong>Garbage Collection</strong> 은 .NET에서 더 이상 사용되지 않는 객체를 자동으로 추적해서 메모리에서 제거하는 기능이다. 메모리 관리가 제대로 이루어지지 않으면 프로그램의 성능이 떨어지거나 메모리 누수가 발생할 수 있다. GC는 이런 문제를 해결하기 위해 설계되었고, 이를 통해 개발자는 메모리 관리를 자동으로 맡기고 성능 최적화에 집중할 수 있다.</p><p>GC의 역할은 크게 세 가지다:</p><ol><li>메모리 할당: 새로운 객체가 메모리에 할당된다.</li><li>메모리 해제: 더 이상 사용되지 않는 객체를 찾아 메모리에서 해제한다.</li><li>메모리 압축: 가비지가 제거된 후, 힙 공간을 최적화해 새로운 객체들이 효율적으로 할당될 수 있도록 한다.</li></ol><p>AD_HERE</p><h2 id="NET의-GC-제너레이션-Generation"><a href="#NET의-GC-제너레이션-Generation" class="headerlink" title=".NET의 GC 제너레이션(Generation)"></a>.NET의 GC 제너레이션(Generation)</h2><p>. NET에서는 GC가 객체를 추적하고 수집하는 방식을 <strong>Generation</strong> 으로 나눈다. 제너레이션은 객체의 수명이 길어질수록 GC가 더 효율적으로 동작하도록 돕는다. .NET에서는 객체의 수명에 따라 GC를 3개의 제너레이션으로 구분한다.</p><h3 id="1-Generation-0"><a href="#1-Generation-0" class="headerlink" title="1. Generation 0"></a>1. Generation 0</h3><p>제너레이션 0은 가장 새로운 객체들이 할당되는 영역이다. 보통 새로 생성된 객체들이 제너레이션 0에 할당된다. 제너레이션 0에 있는 객체들은 수명이 짧고, 자주 GC가 실행되어 이들을 회수한다. 만약 객체가 제너레이션 0에서 살아남으면 제너레이션 1로 승격된다.</p><p>GC가 제너레이션 0을 수집할 때 살아남은 객체만 제너레이션 1로 승격된다. 이 과정은 비교적 자주 발생한다.</p><h3 id="2-Generation-1"><a href="#2-Generation-1" class="headerlink" title="2. Generation 1"></a>2. Generation 1</h3><p>제너레이션 1은 제너레이션 0에서 승격된 객체들이 있는 영역이다. 제너레이션 1에 있는 객체들은 제너레이션 0보다 상대적으로 더 오래 살아남은 객체들이다. GC는 이들을 자주 수집하지 않는다. 제너레이션 0에 비해 객체가 더 오래 살아남았기 때문에, GC는 제너레이션 1에 대해 덜 자주 수집을 한다.</p><p>제너레이션 1에서 살아남은 객체들은 제너레이션 2로 승격된다. 이 과정은 비교적 적은 빈도로 일어난다.</p><h3 id="3-Generation-2"><a href="#3-Generation-2" class="headerlink" title="3. Generation 2"></a>3. Generation 2</h3><p>제너레이션 2는 가장 오래 살아남은 객체들이 모인 영역이다. 이 객체들은 애플리케이션 전체 실행 동안 계속 살아남을 가능성이 높고, GC가 이들을 수집하는 빈도는 매우 낮다. 제너레이션 2에 있는 객체들은 다른 제너레이션에 비해 수명이 길고, 대체로 대규모 데이터 구조나 상태를 가진 객체들이다.</p><p>제너레이션 2의 수집은 <strong>Full GC</strong> 라고 불리며, 이는 모든 객체를 검사하고 수집하는 작업이다. Full GC는 시간이 오래 걸리고 성능에 큰 영향을 미칠 수 있기 때문에 자주 일어나지 않도록 해야 한다.</p><h2 id="LOH와-SOH"><a href="#LOH와-SOH" class="headerlink" title="LOH와 SOH"></a>LOH와 SOH</h2><p>C#에서 GC는 <strong>Small Object Heap</strong> 와 <strong>Large Object Heap</strong> 라는 두 가지 중요한 메모리 영역을 관리한다. 이 두 영역은 GC가 객체를 관리하는 방식에 있어 중요한 차이를 만든다.</p><h3 id="1-Small-Object-Heap"><a href="#1-Small-Object-Heap" class="headerlink" title="1. Small Object Heap"></a>1. Small Object Heap</h3><p><strong>Small Object Heap</strong> 는 제너레이션 0과 제너레이션 1에 할당되는 작은 객체들이 저장되는 메모리 영역이다. 일반적으로 85,000바이트 이하의 객체들이 SOH에 저장된다.</p><ol><li>빠른 수집 주기: SOH의 객체들은 자주 메모리에서 수집된다. GC가 자주 실행되며, 제너레이션 0과 1의 객체들은 자주 회수되고 승격된다.</li><li>효율적 메모리 관리: SOH에 저장된 객체들은 상대적으로 작은 크기이므로 메모리 관리가 효율적이다.</li><li>GC 최적화: 작은 객체들은 자주 GC가 수집되고, 압축도 빠르게 이루어지기 때문에 성능을 최적화하는 데 유리하다.</li></ol><h3 id="2-Large-Object-Heap"><a href="#2-Large-Object-Heap" class="headerlink" title="2. Large Object Heap"></a>2. Large Object Heap</h3><p><strong>Large Object Heap</strong> 는 제너레이션 2에 속하는 큰 객체들이 저장되는 메모리 영역이다. LOH에는 85,000바이트 이상의 크기를 가진 객체들이 할당된다.</p><ul><li>Full GC: LOH에 있는 객체들은 Full GC에서만 수집될 수 있다. Full GC는 제너레이션 0, 1, 2 모두를 검사하고 수집하는 작업으로 시간이 많이 걸리며 성능에 큰 영향을 미칠 수 있다.</li><li>압축 불가: LOH는 큰 객체들이 저장되기 때문에 압축이 어렵다. 이로 인해 메모리에서 파편화가 발생할 수 있으며, 성능 저하를 유발할 수 있다.</li></ul><h2 id="LOH와-SOH의-차이점"><a href="#LOH와-SOH의-차이점" class="headerlink" title="LOH와 SOH의 차이점"></a>LOH와 SOH의 차이점</h2><table><thead><tr><th>항목</th><th>Small Object Heap (SOH)</th><th>Large Object Heap (LOH)</th></tr></thead><tbody><tr><td>객체 크기</td><td>85,000바이트 이하</td><td>85,000바이트 이상</td></tr><tr><td>GC 제너레이션</td><td>제너레이션 0, 1</td><td>제너레이션 2</td></tr><tr><td>GC 주기</td><td>자주 발생</td><td>드물게 발생 (Full GC)</td></tr><tr><td>수집 방식</td><td>빠르고 자주 수집 (Generation 0, 1)</td><td>Full GC에서만 수집</td></tr><tr><td>메모리 압축</td><td>압축이 빠르게 이루어짐</td><td>압축이 어려움 (메모리 파편화 가능)</td></tr><tr><td>파편화 리스크</td><td>낮음</td><td>높음</td></tr><tr><td>메모리 관리 효율성</td><td>매우 효율적</td><td>상대적으로 비효율적 (Full GC에서만 관리)</td></tr></tbody></table><h2 id="LOH의-성능-문제와-최적화-방법"><a href="#LOH의-성능-문제와-최적화-방법" class="headerlink" title="LOH의 성능 문제와 최적화 방법"></a>LOH의 성능 문제와 최적화 방법</h2><p>LOH에 할당된 큰 객체들은 제너레이션 2에서 관리되므로, Full GC가 발생해야만 수집된다. Full GC는 시간이 오래 걸리고 성능에 큰 영향을 미칠 수 있다. LOH를 잘 관리하는 방법은 다음과 같다:</p><ol><li>객체 크기 분할: 너무 큰 객체는 여러 개의 작은 객체로 나누는 것이 좋다. 이를 통해 SOH에 할당되도록 유도할 수 있으며, GC 성능을 향상시킬 수 있다.</li><li>배열 최적화: 큰 배열을 자주 사용한다면, 배열 크기를 최소화하거나 메모리에서 자주 해제할 수 있는 방식으로 배열을 처리해야 한다.</li><li>MemoryPool 사용: ArrayPool<t>나 MemoryPool<t>와 같은 객체 풀을 사용하여 큰 객체들을 재사용할 수 있다. 이는 GC의 부담을 줄이고 메모리 관리 효율성을 높인다.</t></t></li><li>GC.Collect() 사용: GC.Collect() 메서드를 사용하여 강제로 GC를 호출할 수 있지만, LOH에서는 자주 호출하지 않는 것이 좋다. LOH는 Full GC가 필요하기 때문에, 강제 GC 호출은 성능 저하를 초래할 수 있다.</li><li>큰 객체 사용 최소화: 가능한 경우 LOH에 큰 객체를 할당하지 않는 것이 가장 좋다. 큰 객체를 사용하는 경우, 시스템의 메모리 상태나 GC의 영향을 고려해야 한다.</li></ol><p>AD_HERE</p><h2 id="결론"><a href="#결론" class="headerlink" title="결론"></a>결론</h2><p>C#에서 <strong>GC</strong> 는 자동으로 메모리를 관리하는 강력한 시스템이다. 하지만 <strong>SOH</strong> 와 <strong>Large Object Heap</strong> 라는 두 가지 메모리 영역을 이해하는 것이 성능 최적화에 매우 중요하다. SOH는 작은 객체를 관리하고 빠른 GC가 가능하지만, LOH는 큰 객체들을 관리하고 상대적으로 자주 GC가 발생하지 않는다. Large Object Heap의 관리 방법에 대한 최적화를 통해 C# 애플리케이션의 메모리 사용을 효율적으로 개선할 수 있다.</p><p>따라서, C# 개발자는 GC 제너레이션과 LOH/SOH의 차이를 이해하고, 이를 바탕으로 최적화 전략을 적용하여 성능을 극대화할 수 있다.</p>]]></content:encoded>
<comments>http://techbless.github.io/2025/02/05/dotnet-GC-Generation-LOH-SOH/#disqus_thread</comments>
</item>
<item>
<title>Halcon - count_obj의 함정: EmptyObject vs. EmptyRegion 정리</title>
<link>http://techbless.github.io/2025/01/09/halcon-countobj/</link>
<guid>http://techbless.github.io/2025/01/09/halcon-countobj/</guid>
<pubDate>Thu, 09 Jan 2025 18:21:37 GMT</pubDate>
<description>
<h1 id="EmptyRegion에서의-CountObj-유의사항"><a href="#EmptyRegion에서의-CountObj-유의사항" class="headerlink" title="EmptyRegion에서의 CountObj 유의사항"></a>Em
</description>
<content:encoded><![CDATA[<h1 id="EmptyRegion에서의-CountObj-유의사항"><a href="#EmptyRegion에서의-CountObj-유의사항" class="headerlink" title="EmptyRegion에서의 CountObj 유의사항"></a>EmptyRegion에서의 CountObj 유의사항</h1><p>할콘 HDevelop의 문서에 따르면, <code>count_obj</code>는 매개변수 <code>Objects</code>에 포함된 객체의 개수를 결정합니다. 이 문서만 보면 빈 아이코닉 변수의 경우, <code>count_obj</code>가 0을 반환할 것이라고 예상할 수 있지만, 사실은 그렇지 않습니다. </p><h2 id="Signature"><a href="#Signature" class="headerlink" title="Signature"></a>Signature</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">count_obj(Objects : : : Number)</span><br></pre></td></tr></table></figure><h2 id="Description"><a href="#Description" class="headerlink" title="Description"></a>Description</h2><p>The operator <code>count_obj</code> determines for the object parameter <em>Objects</em> the number of objects it contains. In this connection it should be noted that object is not the same as connection component. For example, the number of objects of one region consisting of three parts that are not connected is 1.</p><p>For a short description of the iconic objects that are available in HALCON see the introduction of chapter Object.</p><h2 id="CountObj-동작-비교"><a href="#CountObj-동작-비교" class="headerlink" title="CountObj 동작 비교"></a>CountObj 동작 비교</h2><p><code>EmptyObject</code>, <code>EmptyRegion</code>그리고 <code>7 Connected Region</code>을 각각 <code>count_obj</code>하여 반환되는 값을 비교해보도록 하겠습니다. </p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">read_image(Image, 'printer_chip/printer_chip_01')</span><br><span class="line">threshold (Image, Regions, 155, 255)</span><br><span class="line">connection(Regions, ConnectedRegions)</span><br><span class="line">select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 20000, 99999)</span><br><span class="line">gen_empty_obj(TestObjet)</span><br><span class="line">gen_empty_region(TestRegion)</span><br><span class="line"></span><br><span class="line">count_obj(TestObjet, nTestObject)</span><br><span class="line">count_obj(TestRegion, nTestRegion)</span><br><span class="line">count_obj(SelectedRegions, nSelectedRegeion)</span><br></pre></td></tr></table></figure><p>예상했던 것과 달리, <code>EmptyRegion</code>의 <strong><code>count_obj</code> 결과로 0이 아닌, 1을 반환</strong> 하였습니다. 이 결과를 이해하려면 <code>gen_empty_obj</code>과 <code>gen_empty_region</code> 문서의 <strong>Description 부분을</strong> 참고하면 비로소 이해할 수 있게 됩니다.</p><p><img src="/img/countobj/halcon.png"></p><table><thead><tr><th>Object</th><th>Result</th></tr></thead><tbody><tr><td>Empty Object</td><td>0</td></tr><tr><td>Empty Region</td><td>1</td></tr><tr><td>7 Connected Region</td><td>7</td></tr></tbody></table><h2 id="원인-파악-및-해설"><a href="#원인-파악-및-해설" class="headerlink" title="원인 파악 및 해설"></a>원인 파악 및 해설</h2><p>아래의 설명을 요약하자면, <code>gen_empty_obj</code>는 실제로 빈 튜플(the output parameter does not contain any objects)을 생성하기 떄문에 <code>count_obj</code>의 결과로 0을 반환하고, <code>gen_empty_region</code>의 경우는 빈 Region(ex: 0픽셀의 리전)을 생성 하는 것이기 때문에 반환된 파라미터는 object를 가지고 있다고 본다. 따라서, <code>count_obj</code>의 결과로 <strong>빈 Region의 Object</strong>의 개수 1개를 반환하게 되는 것입니다. Halcon은 empty tuple과 empty region은 혼동하지 말아야 한다고 강조하고 있습니다.</p><p>약간의 말장난 같지만, 실제로 이것의 차이를 인지하고 있는것은 매우 중요하며, 이 작은 차이로 인해 예상하지 못한 동작이나 오류를 야기할 수 있으니 주의가 필요합니다.</p><p>AD_HERE</p><h3 id="Description-of-gen-empty-obj"><a href="#Description-of-gen-empty-obj" class="headerlink" title="Description of gen_empty_obj"></a>Description of gen_empty_obj</h3><p>The operator gen_empty_obj creates an empty tuple. This means that the output parameter does not contain any objects. Thus, the operator count_obj returns 0. However, clear_obj can be called for the output. It should be noted that no objects must not be confused with an empty region. In case of an empty region, i.e. a region with 0 pixels count_obj returns the value 1.</p><p>For a short description of the iconic objects that are available in HALCON see the introduction of chapter Object.</p><h3 id="Description-of-gen-empty-region"><a href="#Description-of-gen-empty-region" class="headerlink" title="Description of gen_empty_region"></a>Description of gen_empty_region</h3><p>The operator gen_empty_region creates an empty region. This means that the output parameter contains an object. Thus, count_obj returns 1. The area of the region is 0. Most of the shape features are undefined (0). It should be noted that an empty region must not be confused with the empty tuple.</p><hr><h2 id="실제-Region개수를-똑바로-세고싶다면"><a href="#실제-Region개수를-똑바로-세고싶다면" class="headerlink" title="실제 Region개수를 똑바로 세고싶다면?"></a>실제 Region개수를 똑바로 세고싶다면?</h2><p>아쉽게도, 할콘에서 Region의 개수를 세어주는 프로시저를 제공하고 있지 않는 것으로 보여, Region개수를 정확히 세고자 한다면 직접 추가적인 처리를 하여 안전하게 사용해야합니다.</p><p>위의 할콘 문서에서 <strong>Empty Region</strong> 은 “The area of the region is 0.”인 Object로 정의하고 있기 때문에 아래와 같이 <code>IsEmptyRegion</code>이라는 Region의 <code>area</code>가 0인지 확인해주는 메서드를 구현한 다음,</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">Vision</span> {</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="built_in">bool</span> <span class="title">IsEmptyRegion</span>(<span class="params">HObject obj</span>)</span></span><br><span class="line"> {</span><br><span class="line"> HOperatorSet.RegionFeatures(obj, <span class="string">"area"</span>, <span class="keyword">out</span> HTuple area);</span><br><span class="line"> <span class="keyword">return</span> area <= <span class="number">0</span> || area.Type == area.EMPTY;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>Region 개수를 구하기 위해 CountObj를 사용하는 곳에서 그 object가 EmptyRegion인지 확인해주기만 하면 됩니다. 만약 이때 EmptyRegion이라면 <code>CountObj</code>가 1을 반환하게 될것이므로 아래와 같이 직접 0을 반환하도록 하면 됩니다.</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Vision.IsEmpty(hobject) ? <span class="number">0</span> : hobject.CountObj();</span><br></pre></td></tr></table></figure>]]></content:encoded>
<comments>http://techbless.github.io/2025/01/09/halcon-countobj/#disqus_thread</comments>
</item>
<item>
<title>세마포어(Semaphore)를 이용한 블로킹(Blocking) 구현 원리와 활용 예제 (C#)</title>
<link>http://techbless.github.io/2024/12/02/blocking-w-semaphore/</link>
<guid>http://techbless.github.io/2024/12/02/blocking-w-semaphore/</guid>
<pubDate>Mon, 02 Dec 2024 22:12:55 GMT</pubDate>
<description>
<h1 id="세마포어-Semaphore-를-이용한-블로킹-Blocking-구현-원리-및-활용-예제-C"><a href="#세마포어-Semaphore-를-이용한-블로킹-Blocking-구현-원리-및-활용-예제-C" class="headerlink" t
</description>
<content:encoded><![CDATA[<h1 id="세마포어-Semaphore-를-이용한-블로킹-Blocking-구현-원리-및-활용-예제-C"><a href="#세마포어-Semaphore-를-이용한-블로킹-Blocking-구현-원리-및-활용-예제-C" class="headerlink" title="세마포어(Semaphore)를 이용한 블로킹(Blocking) 구현 원리 및 활용 예제 (C#)"></a>세마포어(Semaphore)를 이용한 블로킹(Blocking) 구현 원리 및 활용 예제 (C#)</h1><p>이번 글에서는 세마포어(Semaphore)를 이용하여 블로킹(Blocking)을 구현하는 원리를 이해하고, 이를 활용한 대표적 사례로서 C#에서 블로킹 큐(Blocking Queue)를 구현하는 방법을 소개하도록 하겠습니다. 추가로 세마포어 기반 블로킹 방식을 채택할 때 일반적으로 고려해야 하는 성능적, 기능적 장단점에 대해서도 알아보겠습니다.</p><hr><h2 id="1-세마포어를-활용한-블로킹-구현-원리"><a href="#1-세마포어를-활용한-블로킹-구현-원리" class="headerlink" title="1. 세마포어를 활용한 블로킹 구현 원리"></a>1. 세마포어를 활용한 블로킹 구현 원리</h2><p>세마포어는 동시성 환경에서 스레드의 접근을 제어하기 위한 동기화 원시 객체(Primitive)이다. 세마포어의 주요 기능은 다음 두 가지로 정리할 수 있다.</p><ul><li><code>Wait</code>: 세마포어 카운트가 0보다 크면 카운트를 감소시키고 진입을 허용하며, 0이라면 호출한 스레드는 블로킹된다.</li><li><code>Release</code>: 세마포어 카운트를 증가시키고, 블로킹 중인 스레드 하나의 대기를 해제한다.</li></ul><p>즉, 세마포어는 특정 조건이 충족될 때까지 스레드를 차단(Block)했다가, 해당 조건 충족 시 차단을 해제하는 방식으로 블로킹을 구현하는 데 매우 적합하다.</p><hr><h2 id="2-세마포어를-활용한-블로킹-큐-예제-C"><a href="#2-세마포어를-활용한-블로킹-큐-예제-C" class="headerlink" title="2. 세마포어를 활용한 블로킹 큐 예제 (C#)"></a>2. 세마포어를 활용한 블로킹 큐 예제 (C#)</h2><p>블로킹 큐는 큐가 비어있을 때 소비자 스레드를 블로킹하고, 아이템이 들어오면 자동으로 블로킹을 해제하여 소비자를 깨우는 구조를 가진 자료구조이다. 세마포어의 블로킹 기능을 잘 나타내는 대표적인 예시로, C#에서 아래와 같이 구현할 수 있다.</p><h3 id="C-세마포어-기반-블로킹-큐-예시-코드"><a href="#C-세마포어-기반-블로킹-큐-예시-코드" class="headerlink" title="C# 세마포어 기반 블로킹 큐 예시 코드"></a>C# 세마포어 기반 블로킹 큐 예시 코드</h3><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> System;</span><br><span class="line"><span class="keyword">using</span> System.Collections.Generic;</span><br><span class="line"><span class="keyword">using</span> System.Threading;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">BlockingQueue</span><<span class="title">T</span>></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">readonly</span> Queue<T> queue = <span class="keyword">new</span> Queue<T>();</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">readonly</span> SemaphoreSlim itemsAvailable = <span class="keyword">new</span> SemaphoreSlim(<span class="number">0</span>);</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">readonly</span> <span class="built_in">object</span> lockObject = <span class="keyword">new</span> <span class="built_in">object</span>();</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">Enqueue</span>(<span class="params">T item</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">lock</span> (lockObject)</span><br><span class="line"> {</span><br><span class="line"> queue.Enqueue(item);</span><br><span class="line"> }</span><br><span class="line"> itemsAvailable.Release(); <span class="comment">// 아이템이 추가되었음을 알림</span></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> T <span class="title">Dequeue</span>()</span></span><br><span class="line"> {</span><br><span class="line"> itemsAvailable.Wait(); <span class="comment">// 아이템이 없으면 여기서 블로킹됨</span></span><br><span class="line"> <span class="keyword">lock</span> (lockObject)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> queue.Dequeue();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="코드-핵심-설명"><a href="#코드-핵심-설명" class="headerlink" title="코드 핵심 설명"></a>코드 핵심 설명</h3><ul><li>큐가 비었을 때 소비자 스레드는 <code>itemsAvailable.Wait()</code> 메서드를 통해 블로킹 상태에 들어가며, CPU 자원을 낭비하지 않고 효율적으로 대기한다.</li><li>생산자가 <code>Enqueue</code>로 아이템을 추가하면 <code>itemsAvailable.Release()</code>를 통해 대기 중인 소비자를 깨운다.</li></ul><p>AD_HERE</p><h2 id="3-세마포어-기반-블로킹-구현-시-고려해야-할-성능적-기능적-장단점"><a href="#3-세마포어-기반-블로킹-구현-시-고려해야-할-성능적-기능적-장단점" class="headerlink" title="3. 세마포어 기반 블로킹 구현 시 고려해야 할 성능적, 기능적 장단점"></a>3. 세마포어 기반 블로킹 구현 시 고려해야 할 성능적, 기능적 장단점</h2><p>세마포어를 기반으로 블로킹을 구현할 때는 다음과 같은 장단점을 반드시 고려해야 한다.</p><h3 id="장점"><a href="#장점" class="headerlink" title="장점"></a>장점</h3><ul><li><strong>효율적 자원 관리</strong>: 스레드를 블로킹하여 CPU 자원 소모를 최소화할 수 있다.</li><li><strong>명확한 동기화</strong>: 블로킹 조건과 해제가 명시적이어서 코드의 흐름과 동작이 직관적이며 관리하기 쉽다.</li><li><strong>간단한 조건부 대기 구현</strong>: 특정 조건이 충족될 때까지 대기해야 하는 상황에서 코드 복잡성을 낮추고 명확한 로직으로 구현할 수 있다.</li></ul><h3 id="단점"><a href="#단점" class="headerlink" title="단점"></a>단점</h3><ul><li><strong>데드락(Deadlock)의 위험</strong>: 여러 세마포어를 조합할 경우, 신중하지 못한 순서 관리로 인해 데드락 발생 가능성이 존재한다.</li><li><strong>스타베이션(Starvation) 문제</strong>: 특정 스레드가 장시간 블로킹 상태에 갇혀 리소스를 할당받지 못할 위험이 있다.</li><li><strong>성능 저하 가능성</strong>: 과도한 세마포어 사용 및 빈번한 컨텍스트 전환(Context Switch)은 성능 저하를 유발할 수 있으므로, 대규모 동시성 환경에선 주의가 필요하다.</li></ul><h3 id="권장사항"><a href="#권장사항" class="headerlink" title="권장사항"></a>권장사항</h3><ul><li>가능한 단순하고 명확한 로직에서만 세마포어 블로킹을 적용하는 것이 좋다.</li><li>복잡한 조건부 블로킹 상황에서는 타임아웃(timeout)을 활용하여 예외상황 및 데드락을 방지한다.</li></ul><hr><h2 id="4-결론-및-요약"><a href="#4-결론-및-요약" class="headerlink" title="4. 결론 및 요약"></a>4. 결론 및 요약</h2><p>세마포어를 이용한 블로킹 구현은 스레드를 효율적으로 차단(Block)하고 해제(Release)하는 명시적인 동기화 방식이다. 이를 이용한 블로킹 큐 구현 예제를 통해 개념을 구체적으로 이해할 수 있었다.</p><p>그러나 세마포어를 사용할 때는 데드락과 스타베이션 같은 문제를 피하기 위한 세심한 설계가 필수이며, 특히 고도의 동시성 환경에서는 세마포어 사용 빈도와 컨텍스트 전환의 비용을 신중히 고려하여야 한다.</p>]]></content:encoded>
<comments>http://techbless.github.io/2024/12/02/blocking-w-semaphore/#disqus_thread</comments>
</item>
<item>
<title>C#의 ConcurrentBag으로 멀티스레드 환경에서 옵저버 패턴의 생산자-소비자 문제 해결하기</title>
<link>http://techbless.github.io/2024/11/12/dotnet-concurrentbag-observer/</link>
<guid>http://techbless.github.io/2024/11/12/dotnet-concurrentbag-observer/</guid>
<pubDate>Tue, 12 Nov 2024 21:11:02 GMT</pubDate>
<description>
<h1 id="C-의-ConcurrentBag으로-멀티스레드-환경에서-옵저버-패턴의-생산자-소비자-문제-해결하기"><a href="#C-의-ConcurrentBag으로-멀티스레드-환경에서-옵저버-패턴의-생산자-소비자-문제-해결하기" class="hea
</description>
<content:encoded><![CDATA[<h1 id="C-의-ConcurrentBag으로-멀티스레드-환경에서-옵저버-패턴의-생산자-소비자-문제-해결하기"><a href="#C-의-ConcurrentBag으로-멀티스레드-환경에서-옵저버-패턴의-생산자-소비자-문제-해결하기" class="headerlink" title="C#의 ConcurrentBag으로 멀티스레드 환경에서 옵저버 패턴의 생산자-소비자 문제 해결하기"></a>C#의 ConcurrentBag으로 멀티스레드 환경에서 옵저버 패턴의 생산자-소비자 문제 해결하기</h1><p>이번 글에서는 <strong>C#의 ConcurrentBag 자료구조</strong> 를 활용하여 <strong>멀티스레드 환경에서 발생할 수 있는 생산자-소비자 문제</strong> 를 해결하는 방법을 설명합니다. 특히, <strong>Observer 패턴</strong> 에서 자주 발생하는 동기화 문제와 그 해결책으로서 ConcurrentBag을 소개하겠습니다.</p><hr><h2 id="🔍-ConcurrentBag이란"><a href="#🔍-ConcurrentBag이란" class="headerlink" title="🔍 ConcurrentBag이란?"></a>🔍 <strong>ConcurrentBag이란?</strong></h2><p><strong><code>ConcurrentBag<T></code></strong> 은 .NET에서 제공하는 스레드-안전(thread-safe)한 컬렉션 타입 중 하나로, 주로 멀티스레드 환경에서 사용됩니다. <code>List<T></code>나 <code>Queue<T></code>와 달리, <strong>동시에 여러 스레드가 요소를 추가하거나 제거</strong> 할 수 있도록 설계된 자료구조입니다.</p><p><strong>특징:</strong></p><ul><li><strong>스레드 안전성(Thread Safety)</strong>: 별도의 잠금 없이 동시 접근을 안전하게 처리</li><li><strong>무순서(Unordered)</strong>: 컬렉션 내의 순서 보장 없음, 성능에 중점을 두고 설계됨</li></ul><hr><h2 id="🚧-멀티스레드-환경에서의-생산자-소비자-문제"><a href="#🚧-멀티스레드-환경에서의-생산자-소비자-문제" class="headerlink" title="🚧 멀티스레드 환경에서의 생산자-소비자 문제"></a>🚧 <strong>멀티스레드 환경에서의 생산자-소비자 문제</strong></h2><p><strong>Observer 패턴</strong>은 상태 변화가 있을 때, 이를 관찰하고 있는 여러 Observer들에게 데이터를 통지하는 패턴입니다. 멀티스레드 환경에서 이러한 패턴을 구현할 때 <strong>생산자-소비자 문제</strong> 가 발생할 수 있습니다.</p><h3 id="생산자-소비자-문제-예시"><a href="#생산자-소비자-문제-예시" class="headerlink" title="생산자-소비자 문제 예시:"></a><strong>생산자-소비자 문제 예시:</strong></h3><ul><li><strong>생산자</strong>: Observer들에게 데이터를 빠르게 생성해 전송</li><li><strong>소비자</strong>: 데이터를 처리하는데 시간이 걸려 데이터를 제대로 소비하지 못하는 경우 발생</li></ul><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 문제 상황 예시</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">DataProvider</span> : <span class="title">IObservable</span><<span class="title">Data</span>></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">private</span> List<IObserver<Data>> _observers = <span class="keyword">new</span>();</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> IDisposable <span class="title">Subscribe</span>(<span class="params">IObserver<Data> observer</span>)</span></span><br><span class="line"> {</span><br><span class="line"> _observers.Add(observer);</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> Unsubscriber(_observers, observer);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">NotifyObservers</span>(<span class="params">Data data</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">foreach</span> (<span class="keyword">var</span> observer <span class="keyword">in</span> _observers)</span><br><span class="line"> {</span><br><span class="line"> observer.OnNext(data); <span class="comment">// 멀티스레드 환경에서 동기화 문제 발생</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>위 코드에서는 여러 스레드가 동시에 Observer를 업데이트하는 과정에서 동기화 문제가 발생할 수 있습니다. 데이터의 일관성 유지가 어렵고, 중복 처리나 데이터손실이 발생할 수 있습니다.</p><p>AD_HERE</p><h2 id="✅-해결책-ConcurrentBag-활용"><a href="#✅-해결책-ConcurrentBag-활용" class="headerlink" title="✅ 해결책: ConcurrentBag 활용"></a>✅ 해결책: ConcurrentBag<t> 활용</t></h2><p><code>ConcurrentBag<T></code>는 멀티스레드 환경에서 동시 접근을 안전하게 처리할 수 있도록 설계되었습니다. 이를 사용하면 <code>Observer</code> 패턴에서 발생할 수 있는 동기화 문제를 쉽게 해결할 수 있습니다.</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// ConcurrentBag을 활용한 해결 예시</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">ConcurrentDataProvider</span> : <span class="title">IObservable</span><<span class="title">Data</span>></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">readonly</span> ConcurrentBag<IObserver<Data>> _observers = <span class="keyword">new</span>();</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> IDisposable <span class="title">Subscribe</span>(<span class="params">IObserver<Data> observer</span>)</span></span><br><span class="line"> {</span><br><span class="line"> _observers.Add(observer);</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> Unsubscriber(_observers, observer);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">NotifyObservers</span>(<span class="params">Data data</span>)</span></span><br><span class="line"> {</span><br><span class="line"> Parallel.ForEach(_observers, observer =></span><br><span class="line"> {</span><br><span class="line"> observer.OnNext(data); <span class="comment">// 스레드 안전하게 동작</span></span><br><span class="line"> });</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>장점:</p><ul><li>스레드 안전성: <code>ConcurrentBag</code>을 사용하면 별도의 lock 없이 여러 스레드가 동시에 데이터를 처리할 수 있습니다.</li><li>성능 최적화: 여러 스레드에서 빠르게 데이터를 처리할 수 있도록 설계되어 성능에 유리합니다.</li><li>동시성 관리: 생산자와 소비자가 동시에 데이터를 처리하는 환경에서 동기화 문제를 효과적으로 해결할 수 있습니다.</li></ul><h2 id="⚙️-ConcurrentBag의-한계점과-주의사항"><a href="#⚙️-ConcurrentBag의-한계점과-주의사항" class="headerlink" title="⚙️ ConcurrentBag의 한계점과 주의사항"></a>⚙️ ConcurrentBag의 한계점과 주의사항</h2><p>물론, ConcurrentBag이 항상 최선의 선택은 아닙니다. 몇 가지 한계점도 존재합니다:</p><ul><li>순서 보장 불가: ConcurrentBag은 순서를 보장하지 않으므로, FIFO 또는 LIFO 처리가 필요한 경우에는 다른 컬렉션을 고려해야 합니다.</li><li>로컬 캐시 사용: 각 스레드는 로컬 캐시를 사용하여 성능을 최적화하는데, 이로 인해 아이템이 고르게 분배되지 않을 수 있습니다.<br>하지만, Observer 패턴과 같은 경우에는 순서보다 동시성이 중요한 경우가 많으므로 <code>ConcurrentBag</code>이 적합한 선택이 될 수 있습니다.</li></ul><h2 id="🗒️-결론"><a href="#🗒️-결론" class="headerlink" title="🗒️ 결론"></a>🗒️ 결론</h2><p>ConcurrentBag은 멀티스레드 환경에서 생산자-소비자 문제를 해결하는 강력한 도구입니다. 특히 Observer 패턴을 구현할 때 발생할 수 있는 동기화 문제를 Thread-Safe과 성능 최적화로 해결할 수 있습니다.</p><p>앞으로 더 복잡한 멀티스레드 환경에서의 성능 최적화와 동시성 관리에 대해 다뤄볼 예정입니다. ConcurrentBag을 통해 멀티스레드 프로그래밍에서 발생할 수 있는 문제를 예방하고 안정적인 시스템을 구축할 수 있습니다</p>]]></content:encoded>
<comments>http://techbless.github.io/2024/11/12/dotnet-concurrentbag-observer/#disqus_thread</comments>
</item>
<item>
<title>[Computer History Museum] ENIAC은 진정한 최초의 컴퓨터인가?</title>
<link>http://techbless.github.io/2024/11/05/ENIAC-ABC/</link>
<guid>http://techbless.github.io/2024/11/05/ENIAC-ABC/</guid>
<pubDate>Tue, 05 Nov 2024 14:33:22 GMT</pubDate>
<description>
<h2 id="1-Introduction"><a href="#1-Introduction" class="headerlink" title="1. Introduction"></a>1. Introduction</h2><p>이번에 아시아나와 대한항공의 합병을
</description>
<content:encoded><![CDATA[<h2 id="1-Introduction"><a href="#1-Introduction" class="headerlink" title="1. Introduction"></a>1. Introduction</h2><p>이번에 아시아나와 대한항공의 합병을 앞두고 남은 아시아나 마일리지를 소진할 겸 잠시 샌프란시스코 베이 지역으로 혼자 여행을 다녀왔다. 여행 중 들르게 된 곳은 마운틴 뷰(Mountain View)에 위치한 컴퓨터 <strong>역사 박물관(Computer History Museum)</strong> 이었다. 이 박물관은 기술의 발전사를 포괄적으로 보여주는 희귀하고 중요한 소장품들을 보유하고 있어, 평소 IT와 기술 역사에 관심이 많은 나에게 큰 흥미를 끌었다. 개인적으로 마운틴뷰와 이 근처 동네는 너무 깨끗하고 조용한 동네라서 너무 마음에 든다. 만약에 San Francisco 주변에서 출발하고 운전을 좋아한다면, US101 타고 바로 오는것 보다는 SR 1 국도를 타고 84번 국도(La Honda Rd)를 타고 넘어오면 낭만 있는 경치와 와인딩을 즐길 수 있다.</p><p><img src="/img/ABC_ENIAC/chm.jpg" alt="ABC"></p><p>사실 그동안 박물관을 3시간 넘게 정독하며 둘러본 적이 없었는데, 이번엔 정말 처음부터 끝까지 꼼꼼히 살펴볼 만큼 흥미로웠다. 귀국 후 이 내용에 대해 더 조사하였고,이곳에서 알게 된, 잘 알려지지 않은 ‘최초의 컴퓨터’에 대한 흥미로운 이야기를 공유하고자 한다.</p><h2 id="2-진정한-최초의-컴퓨터는-ABC와-ENIAC의-이야기"><a href="#2-진정한-최초의-컴퓨터는-ABC와-ENIAC의-이야기" class="headerlink" title="2. 진정한 최초의 컴퓨터는? ABC와 ENIAC의 이야기"></a>2. 진정한 최초의 컴퓨터는? ABC와 ENIAC의 이야기</h2><p><img src="/img/ABC_ENIAC/abc2.jpg" alt="ABC"></p><p>많은 사람들이 “최초의 컴퓨터”라 하면 <strong>ENIAC(Electronic Numerical Integrator and Computer)</strong> 을 떠올린다. 1940년대에 개발된 ENIAC은 방 하나를 가득 채울 만큼 거대한 크기와 엄청난 전력 소비량으로 유명하다. 하지만 ENIAC이 아닌, 잘 알려지지 않은 다른 컴퓨터가 최초의 컴퓨터 타이틀을 주장하고 있다. 그 이름은 <strong>아타나소프-베리 컴퓨터(Atanasoff–Berry Computer, ABC)</strong> 이다. ABC가 최초의 컴퓨터로 인정받는 과정은 과학적 성과뿐만 아니라 법적 분쟁과 특허, 그리고 기업의 영향력에 의해 역사적 서사가 어떻게 형성되는지를 보여준다.</p><h3 id="아타나소프-베리-컴퓨터의-탄생"><a href="#아타나소프-베리-컴퓨터의-탄생" class="headerlink" title="아타나소프-베리 컴퓨터의 탄생"></a>아타나소프-베리 컴퓨터의 탄생</h3><p>1930년대 후반, 존 빈센트 아타나소프라는 수학자이자 물리학자는 아이오와 주립대에서 복잡한 수학 계산을 자동으로 처리할 방법을 찾고 있었다. 그는 1937년 어느 날, 머리를 식히기 위해 들른 도로변 카페에서 컴퓨팅 장치의 기본 아이디어를 냅킨에 간단히 메모하기 시작했다. 이때의 메모는 전자식 계산 장치의 핵심 요소를 담고 있었고, 이후 컴퓨터 과학의 큰 진보로 이어졌다.</p><p><img src="/img/ABC_ENIAC/abc.jpg" alt="ABC"></p><p>아타나소프는 그의 대학원생 클리포드 베리와 함께 ABC를 개발했고, 이 장치는 동시에 여러 개의 연립방정식을 풀 수 있는 능력을 갖추고 있었다. ABC는 데이터를 2진법으로 표현하고 진공관을 사용한 전자 스위칭을 구현했는데, 이는 이후 컴퓨터들의 기초가 되는 중요한 개념이다. 다만 ABC는 완전한 프로그래밍이 가능한 기계는 아니었고, 특정 계산에 특화된 계산기로 제한적인 기능만 수행할 수 있었다. 하지만 당시로서는 매우 혁신적인 발명이었다.</p><p><a href="https://www.computerhistory.org/revolution/birth-of-the-computer/4/99">Atanasoff-Berry Computer (Computer History Museum)</a></p><h3 id="ENIAC과-“최초”-타이틀을-둘러싼-법적-논쟁"><a href="#ENIAC과-“최초”-타이틀을-둘러싼-법적-논쟁" class="headerlink" title="ENIAC과 “최초” 타이틀을 둘러싼 법적 논쟁"></a>ENIAC과 “최초” 타이틀을 둘러싼 법적 논쟁</h3><p>ENIAC은 그보다 약간 뒤인 1940년대에 펜실베이니아 대학교에서 존 모클리와 프레스퍼 에커트에 의해 개발되었다. ENIAC은 ABC와 달리 다양한 문제를 해결할 수 있는 범용 프로그래밍이 가능한 컴퓨터로, 전자식 대형 컴퓨터로서 그 위용을 자랑하며 군사와 원자 연구 등 여러 분야에 큰 영향을 미쳤다.</p><p><img src="/img/ABC_ENIAC/patent.jpg" alt="ABC"></p><p>ENIAC 발명자들은 1947년에 특허를 신청하여 독점적인 권리를 확보하려 했고, 이후 스페리 랜드(Sperry Rand)라는 회사가 ENIAC의 특허를 통해 다른 기업들에게 라이선스 비용을 요구하기 시작했다. 그러나 허니웰과 <strong>컨트롤 데이터 코퍼레이션(CDC)</strong> 이 ENIAC의 특허가 무효임을 주장하며 이의를 제기했다. 그 이유는 ENIAC의 공동 발명자인 존 모클리가 1941년에 아타나소프의 실험실을 방문해 ABC를 직접 보고 여러 개념을 논의했기 때문입니다. ENIAC이 ABC의 중요한 아이디어를 빌려왔다고 주장한 것이다.</p><p><a href="https://www.computerhistory.org/revolution/birth-of-the-computer/4/99">ENIAC: The First Electronic Computer. Until it Wasn’t. (Computer History Museum)</a></p><p>AD_HERE</p><h3 id="법원-판결-아타나소프-베리-컴퓨터의-공로-인정"><a href="#법원-판결-아타나소프-베리-컴퓨터의-공로-인정" class="headerlink" title="법원 판결: 아타나소프-베리 컴퓨터의 공로 인정"></a>법원 판결: 아타나소프-베리 컴퓨터의 공로 인정</h3><p><img src="/img/ABC_ENIAC/eniac.jpg" alt="ABC"></p><p>1973년, 이 복잡한 법적 분쟁은 “honeywell, Inc. v. Sperry Rand Corp” 소송으로 법원에 다다랐다. 법원은 허니웰 측의 손을 들어주며, ENIAC이 아타나소프와 베리가 개발한 ABC의 아이디어에 기반하고 있음을 인정했다. 결과적으로 ENIAC의 특허는 무효화됐고, ABC가 전자식 컴퓨터의 진정한 시작점으로 인정받게 됐다. 이 판결은 20세기의 중요한 발명 중 하나가 특정 기업의 소유가 아닌 “아무도 소유하지 않은” 것으로 남게 되었다는 점에서 큰 의미가 있다.</p><p><a href="https://www.nytimes.com/1973/04/13/archives/a-basic-computer-patent-at-sperry-rand-annulledd-reason-for-ruling.html?searchResultPosition=47">(1973 Newyork Times Archives) A Basic Computer Patent At Sperry Rand Annulled</a></p><h3 id="아타나소프-베리-컴퓨터가-덜-알려진-이유"><a href="#아타나소프-베리-컴퓨터가-덜-알려진-이유" class="headerlink" title="아타나소프-베리 컴퓨터가 덜 알려진 이유"></a>아타나소프-베리 컴퓨터가 덜 알려진 이유</h3><p>법원의 판결에도 불구하고, 여전히 많은 사람들이 ENIAC을 최초의 컴퓨터로 기억하는 데는 몇 가지 이유가 있다.</p><ol><li>규모와 대중성: ENIAC은 ABC에 비해 훨씬 크고 범용성이 뛰어났으며, 대중의 상상력을 자극하며 많은 언론의 주목을 받았다.</li><li>프로그래밍 기능: ENIAC은 범용 프로그래밍이 가능한 컴퓨터였고, ABC는 특정 연산에 특화된 계산기여서 오늘날 우리가 아는 컴퓨터에 더 가까웠다.</li><li>기업의 영향력: 스페리 랜드는 ENIAC의 성과를 알리고 특허를 방어하는 데 막대한 자원을 투입하며 ENIAC의 인지도를 높였다.</li><li>물리적 유산: ENIAC은 현재까지 보존 및 전시된 반면, ABC는 대부분 해체되어 잊혀졌고, 이후에야 원본을 기반으로 한 복제본이 제작되었다.</li></ol><p>ABC가 진정한 최초의 전자 컴퓨터로 인정받게 된 것은 단순한 발명이나 특허 이상의 의미를 담고 있다. 아타나소프와 베리가 도입한 2진법 계산과 전자 처리 방식은 이후 모든 컴퓨터의 기초가 되었으며, 그들의 아이디어는 오늘날의 스마트폰에 이르기까지 모든 컴퓨팅 장치에 큰 영향을 미쳤다. 비록 ABC는 ENIAC만큼 큰 주목을 받지 못했지만, 컴퓨터 과학의 기초를 다진 이들의 노력은 혁신의 중요성을 상기시켜준다. 이 외에도 Computer History Museum에는 컴퓨터를 좋아하는 사람이라면 좋아 할만한 다양한 소장품이 많으니 한번 쯤 가보는 것을 추천한다.</p><iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d93033.35617481785!2d-122.11131548445108!3d37.37978605370617!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x808fb7569249b39b%3A0xea8071641d7ef4f2!2z7Lu07ZOo7YSwIO2eiOyKpO2GoOumrCDrrqTsp4Dsl4Q!5e0!3m2!1sko!2skr!4v1731395757913!5m2!1sko!2skr" height="300" style="border:0; width: 100%" allowfullscreen="" loading="lazy" referrerpolicy="no-referrer-when-downgrade"></iframe>]]></content:encoded>
<comments>http://techbless.github.io/2024/11/05/ENIAC-ABC/#disqus_thread</comments>
</item>
<item>
<title>Halcon - BGA 비전 검사 코드 예시</title>
<link>http://techbless.github.io/2024/10/03/bga-example/</link>
<guid>http://techbless.github.io/2024/10/03/bga-example/</guid>
<pubDate>Thu, 03 Oct 2024 03:01:11 GMT</pubDate>
<description>
<h1 id="HALCON을-활용한-BGA-검사-예시"><a href="#HALCON을-활용한-BGA-검사-예시" class="headerlink" title="HALCON을 활용한 BGA 검사 예시"></a>HALCON을 활용한 BGA 검사 예시</
</description>
<content:encoded><![CDATA[<h1 id="HALCON을-활용한-BGA-검사-예시"><a href="#HALCON을-활용한-BGA-검사-예시" class="headerlink" title="HALCON을 활용한 BGA 검사 예시"></a>HALCON을 활용한 BGA 검사 예시</h1><p>지난 글까지 할콘의 기본 개념과 사용 방법을 다뤘습니다. 이번 글에서 살펴볼 응용 사례는 할콘 Solution Guide의 Practical Guidance에 소개된 <strong>Ball Grid Array(BGA)의 검사</strong> 입니다. BGA는 매우 작은 객체로 구성되어 있으며, 대략적으로 <strong>대칭적인 회색 값 분포</strong> 를 가지고 있으며, 객체의 영역에 비해 <strong>전경과 배경 사이의 전환 영역이 비교적 클</strong> 수 있습니다. 표준 영역 기반 또는 윤곽 기반 접근 방식은 급격한 전환을 처리하는 방식이므로(아래 그림 참고), 전환 영역이 큰 대칭 객체의 경우 회색 값 특성을 고려하는 접근 방식을 사용하여 객체의 특징을 추출하는 것이 권장됩니다. 사용 가능한 연산자로는 각 볼의 회색 값 볼륨과 중심 위치를 확인하는 <code>area_center_gray</code>가 있으며, 입력 영역과 동일한 방향과 종횡비를 가지는 타원의 축 길이 및 방향을 반환하는 <code>elliptic_axis_gray</code>가 있습니다.</p><p><img src="/img/bga/transition.png"></p><h2 id="BGA-검사란"><a href="#BGA-검사란" class="headerlink" title="BGA 검사란?"></a>BGA 검사란?</h2><p>BGA는 PCB와 칩을 연결하는 작은 볼 형태의 솔더 접합부를 의미합니다. 검사 시 가장 중요한 항목은 다음과 같습니다.</p><ul><li>볼 위치의 정확성</li><li>볼의 누락 여부</li><li>볼의 변형 여부</li></ul><p>특히 일반적인 영역 기반(region-based) 검사 방식보다 회색조(gray-value) 특징을 기반으로 접근해야 더 정확한 결과를 얻을 수 있습니다.</p><p><img src="/img/bga/bga_sample.png"></p><blockquote><p><strong>이유:</strong> BGA 볼은 작고 대칭적인 구조이며 <strong>배경과의 전환부가 뚜렷하지 않아</strong> 일반적인 방법으로는 정확히 측정하기 어렵습니다.</p></blockquote><h2 id="검사-방법-절차-요약"><a href="#검사-방법-절차-요약" class="headerlink" title="검사 방법 절차 요약"></a>검사 방법 절차 요약</h2><table><thead><tr><th>단계</th><th>주요 작업</th><th>HALCON 사용 연산자</th></tr></thead><tbody><tr><td>1</td><td>기준(reference) BGA 볼 추출 및 위치 확인</td><td><code>fast_threshold</code>, <code>connection</code>, <code>select_shape</code>, <code>dilation_rectangle1</code>, <code>area_center_gray</code></td></tr><tr><td>2</td><td>기준 BGA 볼 위치 정렬 (그리드 기준 정렬)</td><td><code>gen_region_points</code>, <code>smallest_rectangle2</code>, <code>hom_mat2d_identity</code>, <code>hom_mat2d_rotate</code>, <code>hom_mat2d_translate</code>, <code>hom_mat2d_scale</code>, <code>affine_trans_point_2d</code></td></tr><tr><td>3</td><td>검사 대상 BGA 볼 추출 및 정렬 (기준 BGA와 동일 방법 적용), 추가적으로 볼 변형 정보 추출</td><td>위 연산자에 추가로 <code>elliptic_axis_gray</code></td></tr><tr><td>4</td><td>검사 BGA와 기준 BGA 비교 및 검사</td><td><code>vector_to_rigid</code>, <code>affine_trans_point_2d</code>, <code>distance_pp</code>, <code>gen_ellipse</code></td></tr></tbody></table><hr><p>AD_HERE</p><h2 id="상세-실전-적용-가이드"><a href="#상세-실전-적용-가이드" class="headerlink" title="상세 실전 적용 가이드"></a>상세 실전 적용 가이드</h2><h3 id="1단계-기준-BGA-볼-추출"><a href="#1단계-기준-BGA-볼-추출" class="headerlink" title="1단계: 기준 BGA 볼 추출"></a>1단계: 기준 BGA 볼 추출</h3><p>기준 이미지에서 볼 영역을 다음과 같이 추출합니다.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">fast_threshold (Image, Region, 95, 255, 3) </span><br><span class="line">connection (Region, ConnectedRegions) </span><br><span class="line">select_shape (ConnectedRegions, SelectedRegions, ['area', 'anisometry'], 'and', [20, 1.0], [100, 1.7]) </span><br><span class="line">dilation_rectangle1 (SelectedRegions, RegionDilation, 3, 3) </span><br><span class="line">area_center_gray (RegionDilation, Image, Volume, Row, Column) </span><br></pre></td></tr></table></figure><p><strong>결과:</strong> 각 볼의 위치(Row, Column), 볼의 회색조 볼륨(Volume)을 얻음.</p><hr><h3 id="2단계-기준-BGA-위치-정렬-그리드-정규화"><a href="#2단계-기준-BGA-위치-정렬-그리드-정규화" class="headerlink" title="2단계: 기준 BGA 위치 정렬(그리드 정규화)"></a>2단계: 기준 BGA 위치 정렬(그리드 정규화)</h3><p><img src="/img/bga/normalization.png"></p><p>볼 위치를 정확히 비교하기 위해 그리드 기준으로 정렬하고, 정렬 시 볼 간의 간격을 1로 표준화하여 상대적 위치로 관리합니다(left). <code>gen_region_points</code>로 볼 중심점을 영역으로 만들고 <code>smallest_rectangle2</code>로 외접 사각형을 찾습니다(right). 이 사각형 정보를 통해 좌표를 변환하여 정규화된 좌표를 얻습니다.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">gen_region_points (RegionBGACenters, Row, Column)</span><br><span class="line">smallest_rectangle2 (RegionBGACenters, RowBGARect, ColumnBGARect, PhiBGARect, Length1BGARect, Length2BGARect)</span><br><span class="line">BallsPerRow := 14</span><br><span class="line">BallsPerCol := 14</span><br><span class="line">BallDistCol := 2 * Length1BGARect / (BallsPerCol - 1)</span><br><span class="line">BallDistRow := 2 * Length2BGARect / (BallsPerRow - 1)</span><br><span class="line">hom_mat2d_identity (HomMat2DIdentity)</span><br><span class="line">hom_mat2d_rotate (HomMat2DIdentity, -PhiBGARect, RowBGARect, ColumnBGARect, HomMat2DRotate)</span><br><span class="line">hom_mat2d_translate (HomMat2DRotate, -RowBGARect + Length2BGARect, -ColumnBGARect + Length1BGARect, HomMat2DTranslate)</span><br><span class="line">hom_mat2d_scale (HomMat2DTranslate, 1 / BallDistRow, 1 / BallDistCol, 0, 0, HomMat2DScale)</span><br><span class="line">affine_trans_point_2d (HomMat2DScale, Row, Column, RowNormalized, ColNormalized)</span><br><span class="line">BGARowIndex := round(RowNormalized)</span><br><span class="line">BGAColIndex := round(ColNormalized)</span><br></pre></td></tr></table></figure><p>얻어진 볼의 중심 위치(Row, Column)는 <strong>임의의 순서로</strong> 반환되며, 즉 변수의 인덱스는 그리드 내에서 <strong>해당 볼의 위치에 대한 정보를 포함하지 않습니다</strong>. 서로 다른 BGA에서 대응하는 볼의 중심 위치를 비교하려면, 볼들의 일관된 순서가 필요하며, 이를 위해 볼을 공간적으로 정렬해야 합니다. 첫 번째 단계에서는 행과 열에 대해 각각 그리드 내 위치를 결정합니다. 이를 위해 BGA를 다음과 같이 정규화합니다. <code>gen_region_points</code>를 적용하여 볼의 중심점으로 정의된 영역을 생성하고, 해당 영역을 감싸는 사각형(<code>smallest_rectangle2</code>로 획득됨, left)을 사용하여 변환 행렬을 정의합니다.</p><p>이를 통해 볼을 변환하여 그리드가 수평이 되도록 정렬하고, 좌측 상단 모서리에 위치한 볼의 중심을 좌표계의 원점에 배치하며, 개별 볼 간의 거리를 1로 조정합니다. 변환된 볼 위치의 값을 반올림하면 정규화된 그리드에서 행과 열에 대한 볼의 위치 인덱스를 나타내게 됩니다. 그림(right)는 시각화를 위해 다시 스케일 조정된 정규화된 그리드를 보여줍니다.</p><p>이제 행과 열에 대한 개별 리스트 대신, 볼의 인덱스를 왼쪽에서 오른쪽으로, 위에서 아래로 연속적으로 정렬한 단일 리스트를 생성하려고 합니다. 이를 위해 BGA의 모든 그리드 포인트를 포함할 수 있는 크기의 튜플 <code>BallMatrix</code>를 생성하며, 이 크기는 행과 열에서 최대로 포함될 수 있는 볼의 개수로 정의됩니다. 그러나 실제로 BGA의 볼은 이 전체 그리드에 균일하게 배치되지 않기 때문에, 먼저 모든 인스턴스에 초기값 -1을 할당합니다.</p><p><img src="/img/bga/sorting.png"></p><p>이제, 추출된 볼의 행 및 열 인덱스(BGARowIndex, BGAColIndex)를 활용하여 <code>BallMatrix</code>의 해당 위치에 새로운 값을 할당함으로써 볼을 정렬합니다. 정렬이 완료된 후, 정렬된 그리드에서 특정 좌표의 인덱스를 참조하면 해당 좌표의 원래(정렬 전) 그리드에서의 인덱스를 반환하거나, 해당 위치에 볼이 없을 경우 -1을 반환합니다.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">NumBalls := |Row|</span><br><span class="line">BallMatrix := gen_tuple_const(BallsPerRow * BallsPerCol,-1)</span><br><span class="line">for i := 0 to NumBalls - 1 by 1</span><br><span class="line">BallMatrix[BGARowIndex[i] * BallsPerCol + BGAColIndex[i]] := i</span><br><span class="line">endfor</span><br></pre></td></tr></table></figure><hr><h3 id="3단계-검사-BGA-추출-및-변형-정보-계산"><a href="#3단계-검사-BGA-추출-및-변형-정보-계산" class="headerlink" title="3단계: 검사 BGA 추출 및 변형 정보 계산"></a>3단계: 검사 BGA 추출 및 변형 정보 계산</h3><p>검사 이미지에서 같은 방법으로 볼을 추출하며, 추가로 변형 여부(타원축 길이, 방향 등)를 계산합니다.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">elliptic_axis_gray (RegionDilation, Image, RaCheck, RbCheck, PhiCheck) </span><br><span class="line">AnisometryCheck := RaCheck / RbCheck </span><br></pre></td></tr></table></figure><p><code>area_center_gray</code>를 통해 얻은 중심점들은 변환된 후, 기준 이미지에서 수행한 것과 동일한 방식으로 정렬됩니다. 기준 BGA와의 처리 과정은 거의 동일하며, 단, 이후 단계에서 볼을 조사하기 위해 <code>elliptic_axis_gray</code>의 추가 적용과 <strong>비등방성(Anisometry)</strong> 검사가 추가로 수행됩니다. 이때 <strong>타원의 Anisometry이 높으면</strong> 볼의 변형으로 판단할 수 있습니다.</p><p><img src="/img/bga/bga_grid.png"></p><hr><h3 id="4단계-두-BGA-비교-및-최종-검사"><a href="#4단계-두-BGA-비교-및-최종-검사" class="headerlink" title="4단계: 두 BGA 비교 및 최종 검사"></a>4단계: 두 BGA 비교 및 최종 검사</h3><p>검사 대상 BGA와 기준 BGA의 위치 정보를 이용하여 최종적으로 검사합니다. 검사 과정은 아래와 같이 요약할 수 있습니다.</p><ul><li>데이터 통합(Row, Col, Anisometry, Volume 등) 튜플 생성</li><li>두 BGA의 위치를 일치시키기 위한 변환 행렬 계산 (<code>vector_to_rigid</code>)</li><li>변환 행렬을 통해 위치를 맞춤 (<code>affine_trans_point_2d</code>)</li><li>두 위치의 거리를 측정하여 오차 범위를 벗어난 볼을 찾아냄 (<code>distance_pp</code>)</li><li>볼 간 거리가 기준(0.05 픽셀)을 넘으면 불량 위치로 판단하고, 변형된 볼이나 회색조 볼륨이 비정상적인 볼도 따로 구분합니다.</li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">j := 0</span><br><span class="line">for i := 0 to BallsPerRow * BallsPerCol - 1 by 1</span><br><span class="line"> if (BallMatrix[i] >= 0 and BallMatrixCheck[i] >= 0)</span><br><span class="line"> Rows1[j] := Row[BallMatrix[i]]</span><br><span class="line"> Cols1[j] := Column[BallMatrix[i]]</span><br><span class="line"> Rows2[j] := RowCheck[BallMatrixCheck[i]]</span><br><span class="line"> Cols2[j] := ColumnCheck[BallMatrixCheck[i]]</span><br><span class="line"> Phi2[j] := PhiCheck[BallMatrixCheck[i]]</span><br><span class="line"> Ra2[j] := RaCheck[BallMatrixCheck[i]]</span><br><span class="line"> Rb2[j] := RbCheck[BallMatrixCheck[i]]</span><br><span class="line"> Anisometry2[j] := AnisometryCheck[BallMatrixCheck[i]]</span><br><span class="line"> Volume2[j] := VolumeCheck[BallMatrixCheck[i]]</span><br><span class="line"> j := j + 1</span><br><span class="line"> endif</span><br><span class="line">endfor</span><br></pre></td></tr></table></figure><p>지금까지는 정렬된 그리드의 점 인덱스를 정렬되지 않은 그리드의 점 인덱스와 연결하는 작업만 수행했습니다. 이제, 지정된 순서대로 <strong>기존 볼의 실제 데이터를 포함하는 튜플을 생성</strong> 합니다. 특히, 기준 BGA에서의 볼의 행 및 열 좌표(Rows1, Cols1)와 검사 대상 BGA에서의 볼의 행 및 열 좌표(Rows2, Cols2), 그리고 두 번째 BGA의 타원 반지름(Ra2, Rb2), 비등방성(Anisometry) 값(Anisometry2), 회색 값 볼륨(Volume2)을 포함하는 튜플이 생성됩니다. 이 튜플들은 데이터를 축소한 형태로, 두 BGA 모두에서 볼이 존재하는 그리드 위치의 데이터만 포함합니다.</p><p>이제 두 번째 BGA의 볼 중심 위치를 기준 BGA의 볼 중심 위치와 비교하기 위해, 두 데이터 세트를 겹쳐서 정렬(superimpose)합니다. 즉, <strong>기준 BGA의 볼을 변환하여 검사 대상 BGA의 볼과 동일한 위치, 방향, 스케일을 갖도록 조정</strong> 합니다. 이 겹치기 과정에서는 <code>vector_to_rigid</code>를 사용하여 두 좌표 세트 간의 점 대응 관계를 기반으로 2D Affine 변환을 결정합니다.</p><p>획득한 변환 행렬을 사용하여 기준 BGA의 축소된 위치 세트(Rows1, Cols1)를 변환하여 <code>RowTrans</code> 및 <code>ColumnTrans</code>를 생성합니다. 또한, 검사 대상 BGA에서 누락된 볼을 확인하기 위해, <code>area_center_gray</code>를 통해 원래 얻어진 기준 BGA의 정렬되지 않은 위치 세트(Row, Column)를 추가로 변환합니다. 이 세트는 <code>BallMatrix</code>에서 -1로 표시된, 원래 볼이 존재하지 않는 위치뿐만 아니라 기준 BGA에서만 감지된 볼의 위치까지 포함하는 전체 정규 그리드의 모든 위치를 유지하고 있습니다.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">vector_to_rigid (Rows1, Cols1, Rows2, Cols2, HomMat2D)</span><br><span class="line">affine_trans_point_2d (HomMat2D, Rows1, Cols1, RowTrans, ColumnTrans)</span><br><span class="line">affine_trans_point_2d (HomMat2D, Row, Column, RowTransFull, ColumnTransFull)</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>그 후, 검사 대상 BGA의 정렬된 점들(Rows2, Cols2)과 기준 BGA의 정렬 및 변환된 점들(RowTrans, ColumnTrans) 간의 거리를 <code>distance_pp</code> 연산자를 사용하여 계산합니다.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">distance_pp (Rows2, Cols2, RowTrans, ColumnTrans, Distance)</span><br></pre></td></tr></table></figure><p>위 거리 계산 후 결과를 다음과 같이 처리합니다.</p><table><thead><tr><th>거리 (픽셀)</th><th>처리 내용</th></tr></thead><tbody><tr><td>> 0.05</td><td>위치 이상</td></tr><tr><td>≤ 0.05, Anisometry > 1.2</td><td>변형된 볼</td></tr><tr><td>≤ 0.05, Volume 비정상</td><td>회색조 볼륨 이상</td></tr><tr><td>그 외</td><td>정상 볼</td></tr></tbody></table><hr><p>AD_HERE</p><h2 id="실제-적용-시-유의점"><a href="#실제-적용-시-유의점" class="headerlink" title="실제 적용 시 유의점"></a>실제 적용 시 유의점</h2><ul><li>이 글은 <strong>할콘 Solution Guide의 Practical Guidance</strong> 예시를 참고하여 <code>2d_measuring/inspect_bga.hdev</code> 샘플 코드의 이해를 돕기 위해 작성되었습니다.</li><li>실제 검사에 활용하기에는 많은 제약이 있으며, 각 프로시저의 활용법과 접근법등을 익히는 용도로 활용해야합니다.</li></ul>]]></content:encoded>
<comments>http://techbless.github.io/2024/10/03/bga-example/#disqus_thread</comments>
</item>
<item>
<title>하드웨어 친화적 동기화: C# Interlocked의 내부 동작과 원리</title>
<link>http://techbless.github.io/2024/08/02/interlocked-atomic/</link>
<guid>http://techbless.github.io/2024/08/02/interlocked-atomic/</guid>
<pubDate>Fri, 02 Aug 2024 09:03:01 GMT</pubDate>
<description>
<h1 id="C-의-Interlocked와-하드웨어-원자-연산의-이해"><a href="#C-의-Interlocked와-하드웨어-원자-연산의-이해" class="headerlink" title="C#의 Interlocked와 하드웨어 원자 연산의 이
</description>
<content:encoded><![CDATA[<h1 id="C-의-Interlocked와-하드웨어-원자-연산의-이해"><a href="#C-의-Interlocked와-하드웨어-원자-연산의-이해" class="headerlink" title="C#의 Interlocked와 하드웨어 원자 연산의 이해"></a>C#의 Interlocked와 하드웨어 원자 연산의 이해</h1><p>멀티스레드 환경에서 공유데이터를 동기화하기 위해 흔히 사용하는 방법은 Lock이다. 하지만 락은 비용이 크고 성능 병목을 일으킬 수 있다. 이 때 사용가능한 더 가벼운 방법이 Interlocked 클래스를 활용한 원자적(Atomic) 연산이다. 이번 글에서는 C#의 Interlocked가 내부적으로 어떤식으로 하드웨어가 제공하는 원자 연산과 연결되는지 컴퓨터 구조 관점에서 알아보겠습니다.</p><h2 id="원자적-Atomic-연산이란"><a href="#원자적-Atomic-연산이란" class="headerlink" title="원자적(Atomic) 연산이란?"></a>원자적(Atomic) 연산이란?</h2><p>원자적 연산이란 연산이 수행될때 중간에 중단되지 않고 완벽하게 완료되거나 아예 수행되지 않은 상태만을 허용하는 연산이다. 원자 연산은 하드웨어 수준에서 CPU가 직접 지원하는 명령어로 보통 구현된다. 대표적으로 x86 CPU에서는 LOCK 접두어를 사용한 명령어(예: LOCK INC, LOCK CMPXCHG)로 지원된다.</p><h2 id="하드웨어-수준에서의-원자-연산-구현"><a href="#하드웨어-수준에서의-원자-연산-구현" class="headerlink" title="하드웨어 수준에서의 원자 연산 구현"></a>하드웨어 수준에서의 원자 연산 구현</h2><p>하드웨어는 캐시 일관성(Cache Coherence) 프로토콜을 이용해 여러코어 간에 메모리 일관성을 보장한다. 예를 들어, x86 시스템에서는 MESI 프로토콜과 같은 캐시 일관성 프로토콜을 통해 캐시 라인의 독점적인 접근권한을 확보한 후 메모리 연산을 수행한다.</p><ul><li><p>원자연산은 보통 다음과 같은 방식으로 하드웨어에서 구현된다.</p></li><li><p>특정 메모리 영역에 대해 CPU가 독점적인 접근권한을 확보함</p></li><li><p>연산을 수행하는 동안 해당 메모리 영역에 대한 다른 코어의 접근을 막음</p></li><li><p>연산 수행 후 변경 사항이 다른 코어에도 전파됨</p></li></ul><p>예를 들어, Intel CPU의 경우 다음 명령어를 통해 원자성을 제공한다.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">LOCK INC DWORD PTR [addr] ; addr의 값을 원자적으로 증가</span><br></pre></td></tr></table></figure><p>여기서 LOCK 접두어는 해당 메모리 주소를 연산 중에 독점적으로 잠그도록 CPU에게 지시한다.</p><h2 id="C-Interlocked-클래스와의-연결"><a href="#C-Interlocked-클래스와의-연결" class="headerlink" title="C# Interlocked 클래스와의 연결"></a>C# Interlocked 클래스와의 연결</h2><p>.NET 환경에서는 직접 하드웨어 명령어를 사용하기 어렵기 때문에 Interlocked 클래스를 제공하여 추상화된 원자 연산을 지원한다. Interlocked는 내부적으로 시스템 호출이나 CPU 명령어를 직접 호출하여 원자성을 보장한다.</p><h2 id="Interlocked의-주요-메서드"><a href="#Interlocked의-주요-메서드" class="headerlink" title="Interlocked의 주요 메서드"></a>Interlocked의 주요 메서드</h2><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">Interlocked.Increment(<span class="keyword">ref</span> <span class="built_in">int</span> location)</span><br><span class="line"></span><br><span class="line">Interlocked.Decrement(<span class="keyword">ref</span> <span class="built_in">int</span> location)</span><br><span class="line"></span><br><span class="line">Interlocked.Exchange(<span class="keyword">ref</span> <span class="built_in">int</span> location, <span class="built_in">int</span> <span class="keyword">value</span>)</span><br><span class="line"></span><br><span class="line">Interlocked.CompareExchange(<span class="keyword">ref</span> <span class="built_in">int</span> location, <span class="built_in">int</span> <span class="keyword">value</span>, <span class="built_in">int</span> comparand)</span><br></pre></td></tr></table></figure><h2 id="Interlocked-메서드의-내부-동작"><a href="#Interlocked-메서드의-내부-동작" class="headerlink" title="Interlocked 메서드의 내부 동작"></a>Interlocked 메서드의 내부 동작</h2><p>.NET 런타임은 Interlocked 메서드를 호출하면 JIT 컴파일러가 이를 최적화된 원자 CPU 명령어로 변환한다. 예를 들어, 다음 코드가 있을 때:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Interlocked.Increment(<span class="keyword">ref</span> myValue);</span><br></pre></td></tr></table></figure><p>실제 CPU에서는 다음과 비슷한 어셈블리 코드로 변환된다:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">LOCK INC DWORD PTR [myValue]</span><br></pre></td></tr></table></figure><p>이로 인해 해당 연산은 하드웨어 수준의 원자성을 보장받는다.</p><h2 id="락-Lock-과-Interlocked의-차이점"><a href="#락-Lock-과-Interlocked의-차이점" class="headerlink" title="락(Lock)과 Interlocked의 차이점"></a>락(Lock)과 Interlocked의 차이점</h2><p><strong>Lock</strong> 은 소프트웨어 수준의 동기화 방법으로, 경쟁 상태가 발생할 경우 커널 모드 전환, 컨텍스트 스위칭 등의 비용이 발생할 수 있다.</p><p>Interlocked 연산은 하드웨어가 직접 지원하는 연산을 활용하므로 커널 모드로의 전환이나 컨텍스트 스위칭의 비용 없이 매우 효율적으로 수행된다.</p><p>따라서 Interlocked는 간단한 원자적 연산의 경우 락보다 훨씬 효율적이다.</p><h2 id="주의할-점"><a href="#주의할-점" class="headerlink" title="주의할 점"></a>주의할 점</h2><p>Interlocked 연산은 단일 연산의 원자성을 보장하지만, 여러 연산이 복합적으로 이루어질 때는 완전한 원자성을 보장하지 않는다. 예를 들어:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Interlocked.Increment(<span class="keyword">ref</span> count);</span><br><span class="line">Interlocked.Decrement(<span class="keyword">ref</span> count);</span><br></pre></td></tr></table></figure><p>위 두 연산을 별도로 실행하면, 각각의 연산은 원자적이지만 두 연산이 함께 실행되는 동안 다른 스레드가 접근하면 복합 연산 전체의 원자성은 깨질 수 있다.<br>이 경우는 명시적인 락이나 더 복잡한 원자적 연산을 사용해야 한다.</p><h2 id="정리하며"><a href="#정리하며" class="headerlink" title="정리하며"></a>정리하며</h2><p>C#의 Interlocked 클래스는 하드웨어가 제공하는 원자적 연산을 효율적으로 활용할 수 있는 강력한 도구이다. 원자 연산을 제대로 이해하고 사용하면 멀티스레드 환경에서 성능 향상과 정확성을 동시에 얻을 수 있다. 하지만 복잡한 연산의 원자성을 보장해야 할 경우에는 명시적인 락이나 더 강력한 동기화 메커니즘을 사용하는 것이 더 적합한다.</p>]]></content:encoded>
<comments>http://techbless.github.io/2024/08/02/interlocked-atomic/#disqus_thread</comments>
</item>
<item>
<title>Halcon - 2D Metrology Recap</title>
<link>http://techbless.github.io/2024/06/23/halcon-2d-metrology/</link>
<guid>http://techbless.github.io/2024/06/23/halcon-2d-metrology/</guid>
<pubDate>Sun, 23 Jun 2024 23:12:31 GMT</pubDate>
<description>
<h2 id="할콘-2D-Metrology-개요"><a href="#할콘-2D-Metrology-개요" class="headerlink" title="할콘 2D Metrology 개요"></a>할콘 2D Metrology 개요</h2><p>할콘의 <s
</description>
<content:encoded><![CDATA[<h2 id="할콘-2D-Metrology-개요"><a href="#할콘-2D-Metrology-개요" class="headerlink" title="할콘 2D Metrology 개요"></a>할콘 2D Metrology 개요</h2><p>할콘의 <strong>2D Metrology</strong> 를 이용하면 특정 기하학적 기본 도형으로 표현 가능한 물체—원, 타원, 직사각형, 직선—의 치수를 측정할 수 있습니다. 이때 측정하려는 물체의 위치, 방향, 치수에 대한 근사값이 필요합니다. 그런 다음, 이미지에서 실제 물체의 가장자리는 이러한 근사 물체의 경계 근처에서 탐지됩니다. 이렇게 탐지된 가장자리 위치를 기반으로 기하학적 형태의 파라미터를 이미지 데이터에 더 잘 맞도록 최적화한 뒤, 이를 측정 결과로 반환합니다.</p><p>물체의 형상 파라미터에 대한 근사값과 측정을 제어하는 여러 파라미터들은 <code>metrology object</code>라는 데이터 구조에 저장됩니다. 이미지에서 물체의 가장자리는 ‘측정 영역’ 내에서 탐지되며, 이 측정 영역은 Metrology 객체의 경계에 수직으로 배열된 직사각형 영역입니다. 측정 영역의 크기와 분포를 조정하는 파라미터들은 각 Metrology 객체에 대해 형상 파라미터의 근사값과 함께 설정됩니다. 측정을 수행하면 모든 측정 영역 내부에서 가장자리 위치가 결정되며, 이 위치들에 RANSAC 알고리즘을 사용하여 기하학적 형태를 fitting하게 됩니다. 모든 Metrology 객체와 측정에 필요한 추가 정보 및 측정 결과는 <code>metrology model</code>에 저장됩니다.</p><p>할콘에서는 <strong><code>create_metrology_model</code></strong> 함수로 측정 모델을 생성하고, <strong><code>apply_metrology_model</code></strong> 함수로 해당 모델을 이미지에 적용하여 정확한 측정을 수행할 수 있습니다.</p><h2 id="2D-Metrology-주요-함수-설명"><a href="#2D-Metrology-주요-함수-설명" class="headerlink" title="2D Metrology 주요 함수 설명"></a>2D Metrology 주요 함수 설명</h2><p>2D Metrology에서 자주 사용되는 주요 함수는 다음과 같습니다:</p><ul><li><p><strong><code>add_metrology_object_circle_measure</code></strong><br>원의 중심 좌표와 반지름을 추가합니다. 하나 이상의 원을 측정할 수 있습니다.</p></li><li><p><strong><code>add_metrology_object_ellipse_measure</code></strong><br>타원의 중심 좌표, 주축의 방향, 큰 반지름과 작은 반지름을 추가합니다.</p></li><li><p><strong><code>add_metrology_object_line_measure</code></strong><br>직선의 시작점과 끝점의 좌표를 추가합니다.</p></li><li><p><strong><code>add_metrology_object_rectangle2_measure</code></strong><br>직사각형의 중심 좌표, 주축의 방향, 작은 반지름과 큰 반지름을 추가합니다.</p></li><li><p><strong><code>add_metrology_object_generic</code></strong><br>원, 타원, 직선, 직사각형 등을 포함하는 다양한 형태의 객체를 측정할 수 있습니다.</p></li></ul><p>각 함수는 객체의 기하학적 특성을 정의하고, 이를 바탕으로 정밀한 측정을 수행할 수 있게 합니다. 모델을 생성한 후 <strong><code>apply_metrology_model</code></strong> 함수를 사용하여 실제 이미지를 측정할 수 있습니다.</p><h2 id="2D-Metrology-활용-예시"><a href="#2D-Metrology-활용-예시" class="headerlink" title="2D Metrology 활용 예시"></a>2D Metrology 활용 예시</h2><ol><li><p><strong>모델 초기화 및 이미지 크기 설정</strong><br>측정을 시작하려면 먼저 모델을 생성하고, 이미지의 크기를 설정해야 합니다. 예를 들어, <code>create_metrology_model</code>과 <code>set_metrology_model_image_size</code>를 사용하여 이미지를 설정합니다.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">read_image (Image, 'pads') </span><br><span class="line">get_image_size (Image, Width, Height) </span><br><span class="line">create_metrology_model (MetrologyHandle) </span><br><span class="line">set_metrology_model_image_size (MetrologyHandle, Width, Height)</span><br></pre></td></tr></table></figure></li><li><p><strong>측정 객체 추가</strong><br>예를 들어, 원을 측정할 때는 <strong><code>add_metrology_object_circle_measure</code></strong> 를 사용하여 원의 중심과 반지름을 설정합니다.</p></li></ol><p><img src="/img/2d-metrology/circle_measurement.png"></p><blockquote><p>⚠️ <strong>Solution Guide</strong> 의 pdf에서는 위의 방식으로 표기 되어있지만 실제 프로시저의 문서에 따르면 실제 사용 방식은 <strong>아래와 같은 것으로</strong> 보입니다.</p></blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">add_metrology_object_circle_measure (MetrologyHandle, CircleInitRow, CircleInitColumn, CircleInitRadius, CircleRadiusTolerance, 5, 1.5, 2, [], [], MetrologyCircleIndices)</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">add_metrology_object_circle_measure( : : MetrologyHandle, Row, Column, Radius, MeasureLength1, MeasureLength2, MeasureSigma, MeasureThreshold, GenParamName, GenParamValue : Index)</span><br></pre></td></tr></table></figure><ul><li><p><strong><code>MetrologyHandle</code></strong> </p><ul><li><strong>입력</strong>: metrology 모델 핸들. 측정할 객체를 포함한 메트롤로지 모델을 지정합니다.</li></ul></li><li><p><strong><code>Row</code></strong> </p><ul><li><strong>입력</strong>: 원 또는 원호의 중심 Y 좌표입니다.</li></ul></li><li><p><strong><code>Column</code></strong> </p><ul><li><strong>입력</strong>: 원 또는 원호의 중심 X 좌표입니다.</li></ul></li><li><p><strong><code>Radius</code></strong> </p><ul><li><strong>입력</strong>: 원 또는 원호의 반지름입니다.</li></ul></li><li><p><strong><code>MeasureLength1</code></strong> </p><ul><li><strong>입력</strong>: 경계에 수직인 측정 영역의 절반 길이입니다. 기본값은 <code>20.0</code>입니다.</li></ul></li><li><p><strong><code>MeasureLength2</code></strong> </p><ul><li><strong>입력</strong>: 경계에 수평인 측정 영역의 절반 길이입니다. 기본값은 <code>5.0</code>입니다.</li></ul></li><li><p><strong><code>MeasureSigma</code></strong> </p><ul><li><strong>입력</strong>: 이미지의 그레이 값에 대한 가우시안 함수의 시그마 값입니다. 기본값은 <code>1.0</code>입니다.</li></ul></li><li><p><strong><code>MeasureThreshold</code></strong> </p><ul><li><strong>입력</strong>: 에지의 최소 진폭을 정의하는 값입니다. 기본값은 <code>30.0</code>입니다.</li></ul></li><li><p><strong><code>GenParamName</code></strong> (optional)</p><ul><li><strong>입력</strong>: 일반적인 측정 매개변수의 이름입니다. 선택적으로 설정할 수 있습니다. 예를 들어, <code>'start_phi'</code>, <code>'end_phi'</code>, <code>'point_order'</code> 등이 있습니다.</li></ul></li><li><p><strong><code>GenParamValue</code></strong> (optional)</p><ul><li><strong>입력</strong>: <strong><code>GenParamName</code></strong> 에서 설정한 이름에 대한 값입니다. 예를 들어, <code>'start_phi'</code>의 값은 원호의 시작 각도를 정의합니다.</li></ul></li></ul><ol start="3"><li><strong>측정 적용</strong></li></ol><p><img src="/img/2d-metrology/result.png"></p><p>모델을 이미지에 적용하여 실제 측정을 수행합니다. 연산자는 측정된 영역 내에서 가장자리들을 찾아내고, <strong>RANSAC</strong> 알고리즘을 사용하여 지정된 기하학적 형태를 가장자리 위치에 맞춥니다. 가장자리는 연산자 <code>measure_pos</code> 또는 <code>fuzzy_measure_pos</code>를 사용하여 내부적으로 찾습니다 (1D Measuring 장 참조). 후자는 퍼지 방법을 사용하며, 적어도 하나의 퍼지 함수가 <code>set_metrology_object_fuzzy_param</code>을 통해 설정된 후에 측정을 적용할 때만 사용됩니다. 반환된 객체 형태의 인스턴스가 여러 개 필요할 경우 (위의 이미지 참조), <code>num_instances</code>라는 일반 매개변수를 설정하여 반환할 인스턴스의 수를 지정해야 합니다. 이 매개변수는 개별 측정 객체를 추가할 때 설정할 수 있으며, 이후에 <code>set_metrology_object_param</code>을 통해 설정할 수도 있습니다.</p><ul><li><p><code>fuzzy_measure_pos</code></p><ul><li>Extract <strong>straight edges perpendicular</strong> to a rectangle or an annular arc.</li></ul></li><li><p><code>fuzzy_measure_pos</code></p><ul><li>Extract <strong>straight edges perpendicular</strong> to a rectangle or an annular arc.</li></ul></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">apply_metrology_model (Image, MetrologyHandle) get_metrology_object_result (MetrologyHandle, MetrologyCircleIndices, 'all', 'result_type', 'all_param', CircleParameter)</span><br></pre></td></tr></table></figure><p>AD_HERE</p><h2 id="add-metrology-object-line-measure"><a href="#add-metrology-object-line-measure" class="headerlink" title="add_metrology_object_line_measure"></a>add_metrology_object_line_measure</h2><p><code>add_metrology_object_line_measure</code>는 자주 사용하는 프로시저중 하나로, 참고하기 위해 추가적으로 정리해두도록 하겠습니다.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">add_metrology_object_line_measure( : : MetrologyHandle, RowBegin, ColumnBegin, RowEnd, ColumnEnd, MeasureLength1, MeasureLength2, MeasureSigma, MeasureThreshold, GenParamName, GenParamValue : Index)</span><br></pre></td></tr></table></figure><ul><li><p><strong><code>MetrologyHandle</code></strong> </p><ul><li><strong>입력</strong>: 메트롤로지 모델 핸들. 측정할 객체를 포함한 metrology 모델을 지정합니다.</li></ul></li><li><p><strong><code>RowBegin</code></strong> </p><ul><li><strong>입력</strong>: 선의 시작점 Y 좌표입니다.</li></ul></li><li><p><strong><code>ColumnBegin</code></strong> </p><ul><li><strong>입력</strong>: 선의 시작점 X 좌표입니다.</li></ul></li><li><p><strong><code>RowEnd</code></strong> </p><ul><li><strong>입력</strong>: 선의 끝점 Y 좌표입니다.</li></ul></li><li><p><strong><code>ColumnEnd</code></strong> </p><ul><li><strong>입력</strong>: 선의 끝점 X 좌표입니다.</li></ul></li><li><p><strong><code>MeasureLength1</code></strong> </p><ul><li><strong>입력</strong>: 경계에 수직인 측정 영역의 절반 길이입니다. 기본값은 <code>20.0</code>입니다.</li></ul></li><li><p><strong><code>MeasureLength2</code></strong> </p><ul><li><strong>입력</strong>: 경계에 접선 방향(선 방향)에 수평인 측정 영역의 절반 길이입니다. 기본값은 <code>5.0</code>입니다.</li></ul></li><li><p><strong><code>MeasureSigma</code></strong> </p><ul><li><strong>입력</strong>: 이미지의 그레이 값에 대한 가우시안 함수의 시그마 값입니다. 기본값은 <code>1.0</code>입니다.</li></ul></li><li><p><strong><code>MeasureThreshold</code></strong> </p><ul><li><strong>입력</strong>: 에지의 최소 진폭을 정의하는 값입니다. 기본값은 <code>30.0</code>입니다.</li></ul></li><li><p><strong><code>GenParamName</code></strong> (optional) </p><ul><li><strong>입력</strong>: 일반적인 측정 매개변수의 이름입니다. 선택적으로 설정할 수 있습니다. 예를 들어 <code>'measure_transition'</code>, <code>'num_measures'</code>, <code>'measure_select'</code> 등이 있습니다.</li></ul></li><li><p><strong><code>GenParamValue</code></strong> (optional) </p><ul><li><strong>입력</strong>: <strong><code>GenParamName</code></strong> 에서 설정한 이름에 대한 값입니다. 예를 들어, <code>'measure_transition'</code>의 값은 <code>'positive'</code>, <code>'negative'</code>, <code>'all'</code> 등이 될 수 있습니다.</li></ul></li><li><p><strong><code>Index</code></strong> </p><ul><li><strong>출력</strong>: 생성된 메트롤로지 객체의 인덱스입니다.</li></ul></li></ul><h2 id="2D-Metrology-모델-정렬"><a href="#2D-Metrology-모델-정렬" class="headerlink" title="2D Metrology 모델 정렬"></a>2D Metrology 모델 정렬</h2><p>2D Metrology는 객체의 위치가 이미지마다 달라질 수 있기 때문에, 모델을 정렬할 수 있는 다양한 방법을 제공합니다; 필요시, 할콘 Solution Guide 2D Measuring의 2.3.1 Aligning the Metrology Model based on different methods 참고</p><ol><li><p><strong>형태 기반 매칭 (Shape-based Matching)</strong><br>객체의 모양을 기반으로 매칭하여 모델을 정렬합니다.</p></li><li><p><strong>영역 처리 기반 정렬 (Region Processing)</strong><br>객체의 위치와 방향을 기반으로 모델을 정렬합니다.</p></li><li><p><strong>강체 변환 정렬 (Rigid Transformation)</strong><br>이미지에서 기준 점들을 추출하여 강체 변환을 통해 모델을 정렬합니다.</p></li></ol><h2 id="2D-Metrology의-장점"><a href="#2D-Metrology의-장점" class="headerlink" title="2D Metrology의 장점"></a>2D Metrology의 장점</h2><ul><li><p><strong>정밀한 측정</strong><br>초기 파라미터만으로 매우 정확한 측정이 가능합니다.</p></li><li><p><strong>빠른 처리 속도</strong><br>모델을 초기화한 후 빠르게 측정을 시작할 수 있습니다.</p></li><li><p><strong>다양한 객체 지원</strong><br>원, 타원, 직선, 직사각형 등 다양한 기하학적 객체를 정밀하게 측정할 수 있습니다.</p></li></ul><p>2D Metrology는 기하학적 객체들의 정확한 측정을 위해 필수적인 도구입니다. HALCON의 2D Metrology 기능을 사용하면, 다양한 형태의 객체를 정밀하고 효율적으로 측정할 수 있습니다.</p>]]></content:encoded>
<comments>http://techbless.github.io/2024/06/23/halcon-2d-metrology/#disqus_thread</comments>
</item>
<item>
<title>[논문 리뷰] EfficientAD: Accurate Visual Anomaly Detection at Millisecond-Level Latencies</title>
<link>http://techbless.github.io/2024/06/22/efficient-ad/</link>
<guid>http://techbless.github.io/2024/06/22/efficient-ad/</guid>
<pubDate>Sat, 22 Jun 2024 13:32:19 GMT</pubDate>
<description>
<h1 id="EfficientAD-Accurate-Visual-Anomaly-Detection-at-Millisecond-Level-Latencies-논문-리뷰"><a href="#EfficientAD-Accurate-Visual-Anomaly-De
</description>
<content:encoded><![CDATA[<h1 id="EfficientAD-Accurate-Visual-Anomaly-Detection-at-Millisecond-Level-Latencies-논문-리뷰"><a href="#EfficientAD-Accurate-Visual-Anomaly-Detection-at-Millisecond-Level-Latencies-논문-리뷰" class="headerlink" title="EfficientAD: Accurate Visual Anomaly Detection at Millisecond-Level Latencies 논문 리뷰"></a>EfficientAD: Accurate Visual Anomaly Detection at Millisecond-Level Latencies 논문 리뷰</h1><p>링크: <a href="https://arxiv.org/pdf/2303.14535v3">https://arxiv.org/pdf/2303.14535v3</a><br>저널|학회: WACV 2024<br>연구목적: 정확도를 유지하면서 ms 수준의 낮은 latency을 달성<br>데이터셋: MVTec AD, VisA, MVTec LOCO<br>주요결과: 2ms의 짧은 latency와 높은 이상 탐지 정확도를 동시 달성하여 산업 현장 적용 가능성 제시<br>저자: Kilian Batzner et al.</p><h2 id="1-연구-배경-및-필요성"><a href="#1-연구-배경-및-필요성" class="headerlink" title="1. 연구 배경 및 필요성"></a>1. 연구 배경 및 필요성</h2><p>이미지 Anomaly Detection는 특히 제조, 의료, 자율 주행 등 산업 현장에서 중요도가 높은 분야다. 기존 딥러닝 기반 이상 탐지 기술들은 정확도는 높지만, 긴 latency과 높은 계산비용으로 인해 실시간 적용에 어려움이 있었다. 이 논문은 산업 현장에서 실시간 처리가 가능하면서도 기존 모델들의 정확도를 뛰어넘는, 빠르고 효율적인 이상 탐지 방법인 <strong>EfficientAD</strong> 를 제안했다.</p><h2 id="2-연구의-주요-기여"><a href="#2-연구의-주요-기여" class="headerlink" title="2. 연구의 주요 기여"></a>2. 연구의 주요 기여</h2><p>EfficientAD의 핵심 목표는 다음과 같다.</p><ul><li>GPU에서 1밀리초 미만의 짧은 시간 내로 처리 가능한 경량 Feature extractor를 제안.</li><li>Student-Teacher 모델을 효율적으로 개선하여 계산 비용을 크게 낮추고 이상 탐지 성능은 향상시킴.</li><li>Autoencoder를 활용하여 기존 방법으로 탐지가 어려웠던 논리적 이상(logical anomalies)을 효과적으로 탐지할 수 있게 함.</li></ul><p>본 연구는 MVTec AD, VisA, MVTec LOCO에서 평가하여 이미지 수준과 픽셀 수준 모두에서 기존 기술 대비 높은 성능을 달성했다. 특히 latency가 2ms에 불과한 상태에서도 초당 600장 이상의 이미지를 처리할 수 있다.</p><h2 id="3-EfficientAD의-구조와-작동-원리"><a href="#3-EfficientAD의-구조와-작동-원리" class="headerlink" title="3. EfficientAD의 구조와 작동 원리"></a>3. EfficientAD의 구조와 작동 원리</h2><p>EfficientAD는 크게 3가지 구성요소로 이루어진다.</p><h3 id="1-Patch-Descriptor-Network-PDN"><a href="#1-Patch-Descriptor-Network-PDN" class="headerlink" title="(1) Patch Descriptor Network (PDN)"></a>(1) Patch Descriptor Network (PDN)</h3><p><img src="/img/efficient-ad/fig2.png"><br>EfficientAD는 4개의 convolutional layer로 이루어진 매우 경량화된 PDN을 이용해 이미지 특성을 추출한다(Figure 2 참조). 각 특성 벡터는 이미지 내의 33×33 픽셀영역과 대응되어 국소적 정보를 효과적으로 포착한다. PDN은 convolution 및 pooling 레이어에서의 다운샘플링으로 연산 비용을 최소화하여 밀리초 수준의 특성 추출이 가능하다.</p><h3 id="2-개선된-Student-Teacher-모델"><a href="#2-개선된-Student-Teacher-모델" class="headerlink" title="(2) 개선된 Student-Teacher 모델"></a>(2) 개선된 Student-Teacher 모델</h3><p>Student 네트워크는 정상이미지의 특성을 미리 학습된 Teacher 네트워크(PDN)의 출력을 따라하는 방식으로 훈련한다. 이상 이미지에 대해서는 Student 네트워크가 Teacher 네트워크를 따라하지 못해, 둘 사이의 출력 차이로 이상 여부를 판단한다..</p><p>EfficientAD의 성능 개선을 위해 두 가지 손실함수를 제안한다:<br><img src="/img/efficient-ad/fig4.png"></p><ul><li><strong>Hard Feature Loss</strong>: Student가 Teacher를 가장 잘 따라하지 못하는 영역만 선택적으로 학습시켜 이상 탐지능력을 높인다 (Figure 4).</li><li><strong>Pretraining Penalty</strong>: ImageNet과 같은 외부데이터를 추가로 활용해서 Student가 이상데이터까지 무분별하게 따라하지 않도록 제한할 수 있다.</li></ul><h3 id="3-논리적-이상-탐지를-위한-Autoencoder"><a href="#3-논리적-이상-탐지를-위한-Autoencoder" class="headerlink" title="(3) 논리적 이상 탐지를 위한 Autoencoder"></a>(3) 논리적 이상 탐지를 위한 Autoencoder</h3><p><img src="/img/efficient-ad/fig5.png"><br>EfficientAD는 Autoencoder를 사용해 정상 이미지가 가진 논리적 구조(배열, 위치, 관계 등)를 학습하여, 이러한 구조를 위반하는 논리적 이상을 탐지한다(Figure 5). Autoencoder가 Teacher 네트워크의 출력을 재구성하고, Student 네트워크는 Autoencoder의 출력을 학습하여 논리적 이상을 탐지할 수 있는 global한 특성까지 파악한다.</p><p>최종 이상 탐지는 Student-Teacher 모델의 local 이상 맵과 Autoencoder 기반의 global 이상 맵을 결합하여 정규화한 후 판단한다.</p><p>AD_HERE</p><h2 id="4-성능-평가-및-결과"><a href="#4-성능-평가-및-결과" class="headerlink" title="4. 성능 평가 및 결과"></a>4. 성능 평가 및 결과</h2><p>EfficientAD의 성능은 세 가지 데이터셋(MVTec AD, VisA, MVTec LOCO)에서 평가했다. 평가 결과는 아래의 표와 같다.</p><table><thead><tr><th>모델</th><th>이상 탐지 AU-ROC (%)</th><th>국소화 AU-PRO (%)</th><th>Latency (ms)</th><th>Throughput (이미지/초)</th></tr></thead><tbody><tr><td>GCAD</td><td>85.4</td><td>88.0</td><td>11</td><td>121</td></tr><tr><td>SimpleNet</td><td>87.9</td><td>74.4</td><td>12</td><td>194</td></tr><tr><td>S–T</td><td>88.4</td><td>89.7</td><td>75</td><td>16</td></tr><tr><td>FastFlow</td><td>90.0</td><td>86.5</td><td>17</td><td>120</td></tr><tr><td>PatchCore</td><td>91.1</td><td>80.9</td><td>32</td><td>76</td></tr><tr><td>AST</td><td>92.4</td><td>77.2</td><td>53</td><td>41</td></tr><tr><td><strong>EfficientAD-S</strong></td><td><strong>95.4</strong></td><td><strong>92.5</strong></td><td><strong>2.2</strong></td><td><strong>614</strong></td></tr><tr><td><strong>EfficientAD-M</strong></td><td><strong>96.0</strong></td><td><strong>93.3</strong></td><td><strong>4.5</strong></td><td><strong>269</strong></td></tr></tbody></table><br><p><img src="/img/efficient-ad/fig1.png"><br>EfficientAD는 가장 높은 정확도와 가장 낮은 latency를 동시에 달성하였다. 기존 최고 성능 모델인 AST 대비 AU-ROC가 약 3.6% 높으면서도 처리 속도는 24배 빠르다(Figure 1).</p><h2 id="5-한계-및-향후-연구방향"><a href="#5-한계-및-향후-연구방향" class="headerlink" title="5. 한계 및 향후 연구방향"></a>5. 한계 및 향후 연구방향</h2><p>EfficientAD는 대부분의 이상을 정확히 탐지하지만, 미세한 논리적 이상(예: 2mm 차이가 나는 나사 길이 등)은 탐지하지 못할 수 있다. 이를 극복하기 위해서는 기존의 정밀 측정 방식과 결합이 필요할 것으로 보인다. 또한, 훈련 시 약 20분의 시간이 소요되는 점은 비지도 기반 방식 대비 단점이 될수 있다.</p><h2 id="6-결론"><a href="#6-결론" class="headerlink" title="6. 결론"></a>6. 결론</h2><p>EfficientAD는 낮은 latency와 높은 처리량을 유지하면서 기존모델보다 뛰어난 이상 탐지 성능을 보였다. 산업현장의 실시간 적용 가능성이 매우 높으며, 앞으로 이상 탐지 분야에서 중요한 연구 기반으로 활용될 수 있을 것으로 기대된다.</p>]]></content:encoded>
<comments>http://techbless.github.io/2024/06/22/efficient-ad/#disqus_thread</comments>
</item>
<item>
<title>Halcon - 1D Measuring Recap</title>
<link>http://techbless.github.io/2024/06/21/halcon-1d-measurment/</link>
<guid>http://techbless.github.io/2024/06/21/halcon-1d-measurment/</guid>
<pubDate>Fri, 21 Jun 2024 03:09:51 GMT</pubDate>
<description>
<h1 id="할콘-1D-측정-솔루션-가이드-요약"><a href="#할콘-1D-측정-솔루션-가이드-요약" class="headerlink" title="할콘 1D 측정 솔루션 가이드 요약"></a>할콘 1D 측정 솔루션 가이드 요약</h1><p>1D
</description>
<content:encoded><![CDATA[<h1 id="할콘-1D-측정-솔루션-가이드-요약"><a href="#할콘-1D-측정-솔루션-가이드-요약" class="headerlink" title="할콘 1D 측정 솔루션 가이드 요약"></a>할콘 1D 측정 솔루션 가이드 요약</h1><p>1D 측정은 주로 직선이나 호를 따라 물체의 치수나 각도를 측정하는 데 사용됩니다. 할콘은 고속으로 고정밀의 1D 측정을 수행할 수 있는 도구를 제공합니다. 1D 측정은 주로 거리와 각도를 측정하는 데 활용됩니다.</p><h2 id="1D-측정의-기본-흐름"><a href="#1D-측정의-기본-흐름" class="headerlink" title="1D 측정의 기본 흐름"></a>1D 측정의 기본 흐름</h2><p>1D 측정을 위해서는 먼저 <strong>measure object</strong>를 생성해야 합니다. 이 객체는 측정할 영역을 정의하며, 주로 직사각형이나 원호 형태로 정의합니다.</p><h3 id="1D-측정의-기본-단계"><a href="#1D-측정의-기본-단계" class="headerlink" title="1D 측정의 기본 단계"></a>1D 측정의 기본 단계</h3><ol><li><strong>측정 객체 생성</strong>: <code>gen_measure_rectangle2</code> or <code>gen_measure_arc</code>를 사용하여 측정할 영역을 설정합니다.</li><li><strong>측정 실행</strong>: <code>measure_pos</code>,<code>measure_pairs</code> 등 다양한 함수로 물체의 edge나 거리 등을 측정합니다.</li><li><strong>결과 확인</strong>: 측정된 값은 물체의 크기, 위치, edge 간의 거리 등으로 반환됩니다.</li></ol><h2 id="주요-측정-방법"><a href="#주요-측정-방법" class="headerlink" title="주요 측정 방법"></a>주요 측정 방법</h2><h3 id="1-Edge-위치-측정-measure-pos"><a href="#1-Edge-위치-측정-measure-pos" class="headerlink" title="1. Edge 위치 측정 (measure_pos)"></a>1. <strong>Edge 위치 측정</strong> (<code>measure_pos</code>)</h3><ul><li><strong>목적</strong>: 이미지에서 특정 edge의 위치를 찾고, 해당 위치를 정확히 측정합니다.</li><li><strong>사용 예시</strong>: IC의 리드 길이 측정.</li></ul><h3 id="2-Edge-쌍의-거리-측정-measure-pairs"><a href="#2-Edge-쌍의-거리-측정-measure-pairs" class="headerlink" title="2. Edge 쌍의 거리 측정 (measure_pairs)"></a>2. <strong>Edge 쌍의 거리 측정</strong> (<code>measure_pairs</code>)</h3><ul><li><strong>목적</strong>: 두 개의 edges를 찾고, 그들 사이의 거리를 측정합니다.</li><li><strong>사용 예시</strong>: 스위치 핀의 너비 및 핀 간 거리 측정.</li></ul><h3 id="3-특정-그레이-값에-해당하는-점-측정-measure-thresh"><a href="#3-특정-그레이-값에-해당하는-점-측정-measure-thresh" class="headerlink" title="3. 특정 그레이 값에 해당하는 점 측정 (measure_thresh)"></a>3. <strong>특정 그레이 값에 해당하는 점 측정</strong> (<code>measure_thresh</code>)</h3><ul><li><strong>목적</strong>: 특정 그레이 값에 해당하는 점의 위치를 찾습니다.</li><li><strong>사용 예시</strong>: 균일한 조명에서 특정 밝기의 물체의 가장자리 측정.</li></ul><h2 id="측정-객체-생성"><a href="#측정-객체-생성" class="headerlink" title="측정 객체 생성"></a>측정 객체 생성</h2><p>측정 객체는 <strong>직사각형</strong> 또는 <strong>원호</strong> 형태로 생성할 수 있습니다.</p><h3 id="직사각형-ROI-생성"><a href="#직사각형-ROI-생성" class="headerlink" title="직사각형 ROI 생성"></a>직사각형 ROI 생성</h3><p><img src="/img/1d-measuring/rect.png"></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gen_measure_rectangle2 (Row, Column, Phi, Length1, Length2, Width, Height, Interpolation, MeasureHandle)</span><br></pre></td></tr></table></figure><ul><li><code>Row</code>, <code>Column</code>: ROI의 중심 좌표</li><li><code>Phi</code>: 회전 각도</li><li><code>Length1</code>, <code>Length2</code>: 두 축의 길이</li><li><code>Width</code>, <code>Height</code>: 측정할 이미지 크기</li></ul><h3 id="원호-ROI-생성"><a href="#원호-ROI-생성" class="headerlink" title="원호 ROI 생성"></a>원호 ROI 생성</h3><p><img src="/img/1d-measuring/arc.png"></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gen_measure_arc (CenterRow, CenterCol, Radius, AngleStart, AngleExtent, AnnulusRadius, Width, Height, Interpolation, MeasureHandle)</span><br></pre></td></tr></table></figure><ul><li><code>CenterRow</code>, <code>CenterCol</code>: 원호의 중심</li><li><code>Radius</code>: 원호의 반지름</li><li><code>AngleStart</code>, <code>AngleExtent</code>: 원호의 시작 각도와 각도 범위.</li></ul><h2 id="1D-Edge-추출-과정-상세-설명"><a href="#1D-Edge-추출-과정-상세-설명" class="headerlink" title="1D Edge 추출 과정 상세 설명"></a>1D Edge 추출 과정 상세 설명</h2><h3 id="1D-edge-추출-과정-흐름도"><a href="#1D-edge-추출-과정-흐름도" class="headerlink" title="1D edge 추출 과정 흐름도"></a>1D edge 추출 과정 흐름도</h3><ol><li><strong>프로파일 라인 생성</strong>: ROI에 따라 수평 또는 수직 방향으로 프로파일 라인을 생성합니다.</li><li><strong>그레이 값 프로파일 계산</strong>: 각 프로파일 라인에서 평균 그레이 값 계산.</li><li><strong>프로파일 미분 계산</strong>: 프로파일의 첫 번째 미분을 계산하여 edge 후보를 찾습니다.</li><li><strong>임계값 처리</strong>: 미분 값이 임계값을 초과하는 경우에만 edge로 확정합니다.</li><li><strong>서브픽셀 정확도 계산</strong>: edge 위치를 서브픽셀 정확도로 결정합니다.</li></ol><p>할콘의 1D 측정 기능에서 가장 중요한 부분 중 하나는 <strong>Edge Extraction</strong> 입니다. 이 과정은 HALCON이 이미지에서 원하는 대상의 경계를 정확하게 찾을 수 있도록 해주며, 정확한 측정을 위한 기초 작업이 됩니다.</p><h3 id="1D-edge-추출의-주요-개념"><a href="#1D-edge-추출의-주요-개념" class="headerlink" title="1D edge 추출의 주요 개념"></a>1D edge 추출의 주요 개념</h3><p>1D edge 추출은 기본적으로 이미지의 <strong>프로파일</strong> 을 사용하여 edge를 찾는 방식입니다. 이 프로파일은 선택된 측정 영역(ROI)에서 수평 또는 수직 방향으로 추출된 평균 밝기 값들의 집합입니다. HALCON은 이 프로파일을 통해 edge를 정확히 찾습니다.</p><h3 id="1-프로파일-라인-생성"><a href="#1-프로파일-라인-생성" class="headerlink" title="1. 프로파일 라인 생성"></a>1. <strong>프로파일 라인 생성</strong></h3><p>1D edge 추출의 첫 번째 단계는 <strong>profile line</strong> 을 생성하는 것입니다. 프로파일 라인은 측정하려는 대상의 edge를 따라 일정 간격으로 수직 또는 수평으로 투영된 여러 선들로 구성됩니다. 이 투영선들은 측정하려는 ROI의 너비만큼 펼쳐지며, 그 너비는 추후 edge 추출의 정확도에 영향을 미칩니다.</p><p><img src="/img/1d-measuring/profile_line.png"></p><ul><li><strong>사각형 ROI</strong>: 수평 또는 수직 방향으로 투영선을 배치합니다.</li><li><strong>원형 ROI</strong>: 원호를 따라 투영선을 배치합니다.</li></ul><h3 id="2-그레이-값-profile-계산"><a href="#2-그레이-값-profile-계산" class="headerlink" title="2. 그레이 값 profile 계산"></a>2. <strong>그레이 값 profile 계산</strong></h3><p>프로파일 라인을 생성한 후, HALCON은 각 프로파일 라인에서 <strong>그레이 값의 평균값을 계산</strong> 합니다. 이 평균값은 해당 프로파일 라인을 따라 얻을 수 있는 픽셀의 그레이 값 평균을 의미합니다. </p><p><img src="/img/1d-measuring/gray_value.png"></p><p>이 평균값을 통해 생성된 프로파일은 그래픽적으로 한 줄로 표현됩니다. 프로파일은 측정 대상의 밝기 변화를 기반으로 하므로, 물체의 가장자리에서 급격한 변화가 발생하는 위치를 찾을 수 있습니다.</p><h3 id="3-그레이-값-프로파일의-미분-계산"><a href="#3-그레이-값-프로파일의-미분-계산" class="headerlink" title="3. 그레이 값 프로파일의 미분 계산"></a>3. <strong>그레이 값 프로파일의 미분 계산</strong></h3><p><img src="/img/1d-measuring/candidate.png"><br>프로파일의 첫 번째 미분을 계산하여 <strong>edge 후보를 찾습니다</strong>. 첫 번째 미분은 프로파일에서 밝기 변화가 급격하게 일어나는 위치를 나타냅니다. 이러한 위치는 이미지에서 물체의 경계가 되는 곳입니다. 미분의 크기가 클수록, 해당 위치는 강한 edge로 간주됩니다.</p><ul><li><strong>스무딩(Smoothing)</strong>: 프로파일의 미분을 계산하기 전에, <strong>가우시안 필터</strong> 등을 사용하여 프로파일을 부드럽게 할 수 있습니다. 이렇게 하면 잡음을 줄이고, 더 정확한 edge 추출이 가능합니다.</li></ul><h3 id="4-edge-후보-선택"><a href="#4-edge-후보-선택" class="headerlink" title="4. edge 후보 선택"></a>4. <strong>edge 후보 선택</strong></h3><p>첫 번째 미분을 통해 얻은 <strong>edge 후보들</strong> 은 실제 edge로 확정되기 위해 추가적인 처리를 거칩니다. 이때 후보의 미분 값이 <strong>Threshold</strong> 보다 클 경우에만 edge로 선택됩니다. 즉, 임계값은 실제 edge를 선택하는 기준이 됩니다.</p><ul><li><strong>Threshold</strong>: 미분 값이 특정 값보다 커야만 edge로 간주됩니다. 이 임계값을 설정함으로써 불필요한 잡음을 제거하고, 실제 edge만을 정확하게 선택할 수 있습니다.</li></ul><h3 id="5-edge의-Subpixel-Accuracy"><a href="#5-edge의-Subpixel-Accuracy" class="headerlink" title="5. edge의 Subpixel Accuracy"></a>5. <strong>edge의 Subpixel Accuracy</strong></h3><p>edge의 위치는 <strong>subpixel 정확도</strong> 로 결정됩니다. HALCON은 <strong>서브픽셀 수준의 edge 위치를 계산</strong> 하기 위해 미분 값을 기반으로 edge 후보의 정확한 위치를 계산합니다. 이는 픽셀 단위보다 더 세밀한 위치를 얻을 수 있도록 해줍니다.</p><h2 id="1D-edge-추출의-중요성"><a href="#1D-edge-추출의-중요성" class="headerlink" title="1D edge 추출의 중요성"></a>1D edge 추출의 중요성</h2><p>1D edge 추출은 HALCON에서 <strong>정확한 측정을 위한 기초 작업</strong> 입니다. 이 과정이 정확하게 이루어져야만, 이후 <strong>거리, 각도, 너비 등</strong> 을 정확하게 측정할 수 있습니다. 또한, <strong>스무딩</strong> 과 <strong>임계값 설정</strong> 을 적절하게 조정하면 다양한 환경에서도 안정적인 측정을 할 수 있습니다.</p><h2 id="1D-edge-추출을-활용한-예시"><a href="#1D-edge-추출을-활용한-예시" class="headerlink" title="1D edge 추출을 활용한 예시"></a>1D edge 추출을 활용한 예시</h2><h3 id="예시-1-스위치-핀-측정"><a href="#예시-1-스위치-핀-측정" class="headerlink" title="예시 1: 스위치 핀 측정"></a>예시 1: 스위치 핀 측정</h3><p>스위치의 핀 간 간격과 핀의 너비를 측정하는 작업에서는 1D edge 추출을 사용하여 핀의 경계를 정확히 찾아냅니다. 이때, 측정 객체는 직사각형 ROI로 설정되고, 각 핀의 경계는 첫 번째 미분을 통해 찾아집니다. 이 과정에서 임계값과 서브픽셀 정확도를 활용하여 더욱 정밀한 측정을 수행합니다.</p><h3 id="예시-2-IC-리드-길이-측정"><a href="#예시-2-IC-리드-길이-측정" class="headerlink" title="예시 2: IC 리드 길이 측정"></a>예시 2: IC 리드 길이 측정</h3><p>IC의 리드 길이를 측정할 때는 리드가 위치한 ROI를 직사각형 형태로 설정하고, 해당 영역에서 edge를 추출하여 리드의 길이를 계산합니다. 이때도 1D edge 추출 과정이 중요한 역할을 합니다.</p><h2 id="결론"><a href="#결론" class="headerlink" title="결론"></a>결론</h2><p>HALCON에서 제공하는 1D edge 추출 과정은 매우 정밀하며, 다양한 측정 작업을 수행할 때 핵심적인 역할을 합니다. 이 과정은 프로파일을 계산하고, 미분을 통해 edge를 찾으며, 서브픽셀 정확도로 edge 위치를 결정하는 방법을 사용하여 고정밀 측정을 가능하게 만듭니다. 적절한 임계값 설정과 스무딩 기법을 활용하면, 다양한 환경에서도 정확한 측정 결과를 얻을 수 있습니다.</p>]]></content:encoded>
<comments>http://techbless.github.io/2024/06/21/halcon-1d-measurment/#disqus_thread</comments>
</item>
<item>
<title>프로세서 아키텍처와 메모리 모델: C#에서의 효율적인 캐시 활용 전략</title>
<link>http://techbless.github.io/2024/04/11/cache-strategy/</link>
<guid>http://techbless.github.io/2024/04/11/cache-strategy/</guid>
<pubDate>Thu, 11 Apr 2024 02:22:51 GMT</pubDate>
<description>
<h1 id="프로세서-아키텍처와-메모리-모델-C-에서의-효율적인-캐시-활용-전략"><a href="#프로세서-아키텍처와-메모리-모델-C-에서의-효율적인-캐시-활용-전략" class="headerlink" title="프로세서 아키텍처와 메모리 모델:
</description>
<content:encoded><![CDATA[<h1 id="프로세서-아키텍처와-메모리-모델-C-에서의-효율적인-캐시-활용-전략"><a href="#프로세서-아키텍처와-메모리-모델-C-에서의-효율적인-캐시-활용-전략" class="headerlink" title="프로세서 아키텍처와 메모리 모델: C#에서의 효율적인 캐시 활용 전략"></a>프로세서 아키텍처와 메모리 모델: C#에서의 효율적인 캐시 활용 전략</h1><p>프로세서 아키텍처와 메모리 모델은 현대 컴퓨터 시스템에서 성능을 좌우하는 중요한 요소입니다. 특히 멀티코어 시스템에서 캐시 메모리의 활용은 성능 최적화의 핵심적인 부분입니다. C#을 비롯한 고급 언어에서는 메모리 모델과 하드웨어 아키텍처 간의 상호작용을 고려하여 최적화된 애플리케이션을 개발할 수 있는 다양한 방법을 제공합니다. 본 글에서는 C#의 메모리 모델과 프로세서 아키텍처가 어떻게 상호작용하는지, 그리고 이를 기반으로 캐시 최적화 및 성능 극대화를 위한 전략을 살펴보겠습니다.</p><h2 id="프로세서-아키텍처"><a href="#프로세서-아키텍처" class="headerlink" title="프로세서 아키텍처"></a>프로세서 아키텍처</h2><p>프로세서 아키텍처는 CPU의 설계 방식을 의미합니다. 각기 다른 프로세서 아키텍처는 메모리 접근 방식, 캐시 계층 구조, 데이터 처리 방식에 차이를 두고 있습니다. 예를 들어, <strong>x86</strong>과 <strong>ARM</strong> 아키텍처는 메모리 접근에 대한 방식에서 뚜렷한 차이를 보입니다.</p><p><strong>캐시 계층(CPU 캐시)</strong>: 대부분의 현대 CPU는 여러 레벨의 캐시(L1, L2, L3)를 포함하고 있습니다. 각 캐시 레벨은 CPU와 메모리 간의 속도 차이를 줄이기 위한 버퍼 역할을 합니다. L1 캐시는 가장 빠르고, CPU 코어에 가까운 곳에 위치하며, L3 캐시는 상대적으로 크지만 속도가 느립니다. 이 캐시 계층은 데이터의 지역성(locality)을 활용하여 메모리 접근 시간을 최소화하는 데 중요한 역할을 합니다.</p><h2 id="C-의-메모리-모델"><a href="#C-의-메모리-모델" class="headerlink" title="C#의 메모리 모델"></a>C#의 메모리 모델</h2><p>C#의 메모리 모델은 프로그램에서 메모리와 데이터를 처리하는 방식에 대한 규칙을 정의합니다. 특히 C#은 멀티스레딩 환경에서의 <strong>메모리 일관성(memory consistency)</strong> 을 보장하는데 중요한 역할을 합니다. C#의 메모리 모델은 <strong>락-프리(lock-free)</strong> 및 <strong>스핀-락(spin-lock)</strong> 과 같은 동기화 기법을 제공하여 멀티스레드 애플리케이션의 효율적인 메모리 관리를 지원합니다.</p><p>C#에서 메모리 모델의 주요 개념 중 하나는 <strong>memory barrier</strong> 입니다. 메모리 배리어는 CPU의 캐시 일관성을 유지하기 위한 명령어로, 특정 명령어들이 특정 순서로 실행되도록 보장하는 역할을 합니다. 이를 통해, 멀티스레딩 환경에서 스레드 간에 데이터가 일관되게 유지될 수 있습니다.</p><p>AD_HERE</p><h2 id="캐시-최적화-및-성능-극대화-전략"><a href="#캐시-최적화-및-성능-극대화-전략" class="headerlink" title="캐시 최적화 및 성능 극대화 전략"></a>캐시 최적화 및 성능 극대화 전략</h2><p>캐시 최적화는 CPU의 캐시 계층을 효과적으로 활용하여 성능을 극대화하는 방법입니다. 이는 하드웨어와 소프트웨어가 상호작용하는 부분으로, 프로세서 아키텍처와 메모리 모델에 대한 깊은 이해가 필요합니다. C#에서 이를 최적화하기 위한 주요 전략을 살펴보겠습니다.</p><h3 id="1-데이터-지역성-Locality-을-활용하라"><a href="#1-데이터-지역성-Locality-을-활용하라" class="headerlink" title="1. 데이터 지역성(Locality)을 활용하라"></a>1. 데이터 지역성(Locality)을 활용하라</h3><p>데이터 지역성은 데이터가 메모리에서 가까운 위치에 있을수록 캐시 히트율이 높아져 성능이 향상된다는 원칙입니다. C#에서는 <strong>배열</strong> 을 사용하는 것이 데이터 지역성을 극대화하는 데 유리합니다. 배열은 연속된 메모리 공간에 데이터를 저장하기 때문에, 캐시 메모리에서 데이터를 빠르게 접근할 수 있습니다. </p><p>특히 <strong>컬렉션</strong> 이나 <strong>리스트</strong> 와 같은 동적 자료구조는 메모리 할당 방식에 따라 메모리 위치가 분산될 수 있어, 캐시 성능이 떨어질 수 있습니다. 따라서 성능이 중요한 코드에서는 가능한 한 배열을 사용하고, 동적 크기의 자료구조가 필요한 경우에는 미리 할당된 <strong>버퍼</strong> 를 사용하는 것이 좋습니다.</p><h3 id="2-캐시-친화적인-코드-작성"><a href="#2-캐시-친화적인-코드-작성" class="headerlink" title="2. 캐시 친화적인 코드 작성"></a>2. 캐시 친화적인 코드 작성</h3><p>캐시 친화적인 코드란, CPU 캐시의 특성을 고려하여 데이터를 효율적으로 처리하는 코드를 의미합니다. C#에서는 <strong>padding</strong> 을 활용하여 데이터의 정렬을 최적화할 수 있습니다. 예를 들어, 배열이나 구조체의 크기를 최적화하여 캐시 라인(cache line)에 맞게 데이터를 정렬하는 방법이 있습니다.</p><p>캐시 라인은 CPU가 메모리에서 한 번에 읽어오는 데이터 블록의 크기를 의미하며, 보통 64바이트입니다. 따라서 배열이나 구조체의 크기를 64바이트의 배수로 맞추면, 여러 데이터 항목이 동일한 캐시 라인에 적재되어 캐시 히트율을 높일 수 있습니다.</p><h3 id="3-병렬-처리-및-스레드-최적화"><a href="#3-병렬-처리-및-스레드-최적화" class="headerlink" title="3. 병렬 처리 및 스레드 최적화"></a>3. 병렬 처리 및 스레드 최적화</h3><p>C#에서 멀티스레드를 사용할 때, 각 스레드가 공유하는 메모리를 어떻게 처리하느냐에 따라 성능 차이가 발생할 수 있습니다. <strong>thread locality</strong> 을 고려하여, 각 스레드가 자신의 데이터에 접근하도록 하는 것이 중요합니다. 이렇게 하면 각 스레드가 사용하는 데이터가 다른 스레드의 캐시와 충돌하는 것을 피할 수 있습니다.</p><p>또한, <strong>캐시 일관성(cache coherence)</strong> 을 보장하는 방식으로 스레드를 설계해야 합니다. C#에서는 <code>volatile</code> 키워드나 <code>MemoryBarrier()</code> 메서드를 사용하여 메모리 일관성을 제어할 수 있습니다. 이를 통해 여러 스레드가 동일한 데이터에 접근할 때 일관성을 유지하면서도 캐시 충돌을 최소화할 수 있습니다.</p><h3 id="4-CPU-캐시의-prefetching-활용"><a href="#4-CPU-캐시의-prefetching-활용" class="headerlink" title="4. CPU 캐시의 prefetching 활용"></a>4. CPU 캐시의 prefetching 활용</h3><p>프리페칭은 CPU가 데이터를 미리 예측하여 캐시에 로드하는 기법입니다. 현대 CPU는 코드 실행 중에 데이터를 미리 캐시로 가져오는 <strong>프리페치 명령어</strong> 를 활용할 수 있습니다. C#에서 이런 최적화를 직접 제어할 수는 없지만, 알고리즘 설계에서 데이터 접근 패턴을 예측 가능하게 만들어 프리페칭의 효과를 극대화할 수 있습니다.</p><p>예를 들어, 데이터가 순차적으로 처리되는 알고리즘을 작성하면, CPU는 그 데이터가 메모리에서 연속적으로 나올 것이라고 예측하고 미리 캐시에 데이터를 불러옵니다. 이는 반복문에서 데이터가 순차적으로 접근되는 경우에 특히 유리합니다.</p><h3 id="5-메모리-접근-패턴-최적화"><a href="#5-메모리-접근-패턴-최적화" class="headerlink" title="5. 메모리 접근 패턴 최적화"></a>5. 메모리 접근 패턴 최적화</h3><p>메모리 접근 패턴을 최적화하는 것도 캐시 성능을 높이는 중요한 방법입니다. C#에서는 <strong>다차원 배열</strong> 을 사용할 때, 차원 순서에 따라 메모리 접근 패턴이 달라지므로, 접근 패턴을 최적화하는 것이 필요합니다. 예를 들어, 다차원 배열을 사용하여 데이터를 처리할 때, 차원 순서가 배열의 메모리 배치 방식과 맞지 않으면 캐시 미스를 유발할 수 있습니다.</p><p>가능하면 배열의 첫 번째 차원부터 순차적으로 접근하는 방식으로 코드를 작성하면, 캐시 효율성을 높일 수 있습니다.</p><h2 id="결론"><a href="#결론" class="headerlink" title="결론"></a>결론</h2><p>C#에서 효율적인 캐시 활용을 위해서는 프로세서 아키텍처와 메모리 모델을 잘 이해하고, 이를 기반으로 최적화 전략을 세우는 것이 중요합니다. 데이터 지역성을 활용하고, 캐시 친화적인 코드 작성, 병렬 처리 최적화, CPU 캐시 프리페칭 등을 통해 성능을 극대화할 수 있습니다. 또한, C#의 메모리 모델과 동기화 기법을 적절히 활용하여 멀티스레딩 환경에서도 높은 성능을 유지할 수 있습니다.</p><p>캐시 최적화는 하드웨어와 소프트웨어가 상호작용하는 중요한 부분으로, 잘 설계된 코드가 실제 성능 향상으로 이어집니다. 이러한 전략을 통해 C# 애플리케이션에서 성능을 극대화하고, 더욱 효율적인 시스템을 구축할 수 있습니다.</p>]]></content:encoded>
<comments>http://techbless.github.io/2024/04/11/cache-strategy/#disqus_thread</comments>
</item>
<item>
<title>Halcon - Memory Managment</title>
<link>http://techbless.github.io/2024/02/08/halcon-memory-management/</link>
<guid>http://techbless.github.io/2024/02/08/halcon-memory-management/</guid>
<pubDate>Thu, 08 Feb 2024 20:34:22 GMT</pubDate>
<description>
<h1 id="HALCON-메모리-관리-상세-설명"><a href="#HALCON-메모리-관리-상세-설명" class="headerlink" title="HALCON 메모리 관리: 상세 설명"></a>HALCON 메모리 관리: 상세 설명</h1><p>
</description>
<content:encoded><![CDATA[<h1 id="HALCON-메모리-관리-상세-설명"><a href="#HALCON-메모리-관리-상세-설명" class="headerlink" title="HALCON 메모리 관리: 상세 설명"></a>HALCON 메모리 관리: 상세 설명</h1><p>할콘은 복잡한 이미지 처리 작업을 수행하는 고급 머신 비전 소프트웨어로, 효율적인 메모리 관리가 매우 중요하다. HALCON의 메모리 관리 시스템은 성능을 최적화하고 메모리 사용을 효율적으로 하기 위해 다양한 기법을 사용한다. 이 글에서는 HALCON의 메모리 관리 구조와 각 캐시 시스템의 역할, 그리고 메모리 누수 문제 해결 방법에 대해 자세히 설명한다.</p><h2 id="HALCON-메모리-관리-개요"><a href="#HALCON-메모리-관리-개요" class="headerlink" title="HALCON 메모리 관리 개요"></a>HALCON 메모리 관리 개요</h2><p>할콘의 메모리 관리는 주로 OS의 메모리 관리와 HALCON 자체 메모리 관리 시스템으로 구성된다. 운영 체제는 메모리를 페이지 단위로 관리하며, HALCON은 이를 요청하고 할당받는다. HALCON의 메모리 관리 시스템은 크게 세 가지 캐시를 사용하여 성능을 최적화하고 메모리 할당을 효율적으로 처리한다.</p><p>할콘에서의 메모리 관리 계층 구조는 다음과 같다:</p><ul><li><strong>운영 체제</strong>: OS는 메모리를 페이지 단위로 관리하며, 프로세스에 메모리를 할당한다.</li><li><strong>메모리 할당기</strong>: HALCON은 운영 체제의 메모리 할당기를 사용하여 메모리를 할당하고 해제한다.</li><li><strong>HALCON 캐시 시스템</strong>: HALCON은 자체 캐시를 사용하여 메모리 할당과 해제를 최적화하고 성능을 높인다.</li></ul><h2 id="HALCON의-캐시-시스템"><a href="#HALCON의-캐시-시스템" class="headerlink" title="HALCON의 캐시 시스템"></a>HALCON의 캐시 시스템</h2><p>할콘은 메모리 사용을 최적화하기 위해 세 가지 주요 캐시 시스템을 사용한다. 이 캐시들은 메모리 할당을 빠르게 처리하고, 메모리 사용을 효율적으로 관리한다. 각 캐시의 기능과 역할을 살펴보자.</p><h3 id="이미지-캐시-Image-Cache"><a href="#이미지-캐시-Image-Cache" class="headerlink" title="이미지 캐시 (Image Cache)"></a>이미지 캐시 (Image Cache)</h3><p>이미지 처리에서는 큰 메모리 블록이 필요하고 할당이 느리기 때문에, 할콘은 이미지 메모리를 운영 체제에 바로 반환하지 않고 캐시하여 추후에 재사용한다. 이미지 캐시의 용량은 <code>set_system('image_cache_capacity', <limit>)</code>를 통해 설정할 수 있다. 이 캐시를 끄려면, 제한을 0으로 설정하면 된다. 이미지 캐시는 어플리케이션의 속도를 높이지만, 메모리 사용량이 증가할 수 있다는 점을 유의해야 한다.</p><h3 id="글로벌-메모리-캐시-Global-Memory-Cache"><a href="#글로벌-메모리-캐시-Global-Memory-Cache" class="headerlink" title="글로벌 메모리 캐시 (Global Memory Cache)"></a>글로벌 메모리 캐시 (Global Memory Cache)</h3><p>글로벌 메모리는 할콘의 연산자에서 출력 값으로 사용되는 메모리를 말한다. 이 메모리는 기본적으로 ‘독점 모드(exclusive mode)’로 설정되어 있으며, 각 스레드는 자신의 글로벌 메모리 캐시를 가진다. 이 캐시는 빠른 메모리 할당과 해제를 위해 설계되었고, 스레드가 메모리를 요청할 때 우선적으로 캐시에서 찾는다. 더 큰 블록은 시스템 메모리 할당기를 통해 할당된다. 글로벌 메모리 캐시를 비활성화하려면 <code>set_system('global_mem_cache', 'cleanup')</code> 명령어를 사용하면 된다.</p><h3 id="임시-메모리-캐시-Temporary-Memory-Cache"><a href="#임시-메모리-캐시-Temporary-Memory-Cache" class="headerlink" title="임시 메모리 캐시 (Temporary Memory Cache)"></a>임시 메모리 캐시 (Temporary Memory Cache)</h3><p>임시 메모리는 주로 연산자가 실행되는 동안에만 사용되며, 연산자가 끝난 후 바로 해제된다. HALCON은 임시 메모리를 ‘superblock’이라는 단위로 관리한다. 이 방식은 빠르게 메모리를 할당하고 해제할 수 있게 한다. 슈퍼블록을 이용한 임시 메모리 캐시는 성능에 큰 영향을 미치지만, 메모리 소비가 증가할 수 있다. 임시 메모리 캐시 모드는 다음과 같은 방식으로 설정할 수 있다:</p><ul><li><strong>exclusive 모드</strong>: 각 스레드가 독립적으로 자신의 캐시를 사용한다.</li><li><strong>shared 모드</strong>: 모든 스레드가 전역 임시 메모리 저장소를 공유한다.</li><li><strong>aggregate 모드</strong>: 임시 메모리 캐시와 전역 저장소를 동시에 사용한다.</li></ul><p>임시 메모리 캐시는 스레드의 특성에 따라 다르게 작동할 수 있으며, 사용자가 직접 설정할 수 있다. 예를 들어, <code>set_system('temporary_mem_cache', 'aggregate')</code> 명령어를 사용하여 메모리 소비와 속도 사이의 균형을 조절할 수 있다.</p><p>AD_HERE</p><h2 id="이미지-데이터-처리"><a href="#이미지-데이터-처리" class="headerlink" title="이미지 데이터 처리"></a>이미지 데이터 처리</h2><p>HALCON에서 이미지는 여러 채널로 구성되며, 각 채널은 동일한 크기와 픽셀 유형의 픽셀 행렬로 구성된다. 이미지 데이터는 보통 크기나 픽셀 데이터가 변경될 때만 새로 할당된다. 예를 들어, <code>compose3</code>와 같은 연산자는 새로운 이미지를 생성하지 않으며, 기존의 메모리를 재사용한다. 그러나 픽셀 데이터나 이미지 크기가 변경될 경우, 새로운 메모리가 할당된다.</p><p>이미지 메모리는 참조 카운터를 사용하여 관리된다. 하나의 이미지가 여러 번 참조되면, 참조 카운터가 감소할 때까지 메모리는 해제되지 않는다. 만약 참조 카운터가 0이 되면, 해당 메모리는 자동으로 해제되어 이미지 캐시에 반환된다.</p><h2 id="HALCON에서-메모리-누수-처리"><a href="#HALCON에서-메모리-누수-처리" class="headerlink" title="HALCON에서 메모리 누수 처리"></a>HALCON에서 메모리 누수 처리</h2><p>메모리 누수란 더 이상 사용되지 않거나 접근할 수 없는 메모리가 해제되지 않고 남아 있는 경우를 의미한다. HALCON에서는 메모리 캐시가 활성화되어 있으면 메모리 소비가 증가할 수 있다. 일반적으로 메모리 소비는 일정 시간이 지나면 안정화되지만, 실제 메모리 관련 문제가 발생했다면 몇 가지 방법으로 문제를 해결할 수 있다.</p><h3 id="메모리-문제-해결-방법"><a href="#메모리-문제-해결-방법" class="headerlink" title="메모리 문제 해결 방법"></a>메모리 문제 해결 방법</h3><ol><li><strong>메모리 캐시 비활성화</strong>: 애플리케이션의 시작 부분에서 다음 명령어를 사용하여 메모리 캐시를 비활성화할 수 있다.</li></ol><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">set_system('global_mem_cache', 'idle') </span><br><span class="line">set_system('temporary_mem_cache', 'idle') </span><br><span class="line">set_system('image_cache_capacity', 0)</span><br></pre></td></tr></table></figure><ol start="2"><li><p><strong>메모리 제한</strong>: 캐시를 완전히 비활성화하면 성능저하가 발생할 수 있다. 이 경우, 임시 메모리 캐시의 크기를 제한하거나 스레드 수를 줄여서 메모리 사용량을 줄일 수 있다.</p></li><li><p><strong>mimalloc 비활성화</strong>: Windows에서 <code>mimalloc</code>이 메모리를 더 공격적으로 캐시하는 경우가 있으므로, 이를 비활성화하고 기본 시스템 할당기를 사용하는 것이 도움이 될 수 있다.</p></li><li><p><strong>메모리 추적 도구 사용</strong>: 메모리누수를 추적하기 위해, HALCON에서 사용하는 메모리 추적 도구를 적절히 선택하여 활용한다.</p></li></ol><h2 id="C-에서의-HALCON-메모리-관리"><a href="#C-에서의-HALCON-메모리-관리" class="headerlink" title="C#에서의 HALCON 메모리 관리"></a>C#에서의 HALCON 메모리 관리</h2><p>C#에서 HALCON을 사용할 때 메모리 관리에는 몇 가지 중요한 사항들이 있다. C#은 .NET 환경에서 실행되며, 메모리 할당과 해제는 주로 GC에 의해 처리된다. 하지만 HALCON은 C#에서 동적으로 메모리를 관리하는데 있어 .NET의 가비지 컬렉터와 상호작용하면서도 성능을 최적화하기 위해 자체 메모리 관리 기법을 사용한다.</p><h3 id="C-과-HALCON-메모리-관리"><a href="#C-과-HALCON-메모리-관리" class="headerlink" title="C#과 HALCON 메모리 관리"></a>C#과 HALCON 메모리 관리</h3><p>C#에서 할콘의 메모리는 다음과 같은 방식으로 관리된다:</p><ul><li><p><strong>가비지 컬렉터와의 상호작용</strong>: C#의 가비지 컬렉터는 사용되지 않는 객체를 자동으로 수집하지만, HALCON에서 할당한 메모리는 가비지 컬렉터가 직접 관리하지 않는다. HALCON은 메모리 캐시를 통해 메모리 관리를 최적화하고, 필요할 때 OS에서 메모리를 할당하거나 해제한다. 이로 인해 가비지 컬렉터가 자동으로 메모리를 해제하지 않으므로, HALCON에서 메모리를 할당한 후 명시적으로 메모리를 해제하거나, 필요한 캐시 관리 명령을 사용해야 한다.</p></li><li><p><strong>메모리 할당 및 해제</strong>: HALCON의 메모리 관리는 C#에서 <code>set_system</code> 명령어를 통해 제어할 수 있다. 예를 들어, <code>set_system('image_cache_capacity', 0)</code>와 같은 명령어로 캐시를 비활성화하거나, <code>set_system('global_mem_cache', 'cleanup')</code>을 사용하여 글로벌 메모리 캐시를 정리할 수 있다. 이를 통해 C# 애플리케이션에서 메모리 사용을 제어하고 성능을 최적화할 수 있다.</p></li></ul><h3 id="C-에서-메모리-누수-처리"><a href="#C-에서-메모리-누수-처리" class="headerlink" title="C#에서 메모리 누수 처리"></a>C#에서 메모리 누수 처리</h3><p>C#에서는 메모리 누수 문제를 해결하기 위해 몇가지 방법을 사용할 수 있다. </p><ol><li><p><strong>메모리 캐시 비활성화</strong>: HALCON의 캐시가 시스템 메모리 사용에 영향을 미칠 수 있다. 이를 해결하기 위해 메모리 캐시를 비활성화하거나, 캐시 크기를 제한할 수 있다. <code>set_system('image_cache_capacity', 0)</code> 명령어로 이미지 캐시를 비활성화하고, <code>set_system('global_mem_cache', 'cleanup')</code>을 사용하여 글로벌 메모리를 정리할 수 있다.</p></li><li><p><strong>명시적인 메모리 해제</strong>: C#의 가비지 컬렉터가 HALCON에서 할당한 메모리를 자동으로 해제하지 않기 때문에, <code>Dispose</code> 메서드나 <code>GC.Collect()</code>를 사용하여 명시적으로 메모리를 해제할 수 있다. 이를 통해 메모리 누수를 방지하고 시스템 자원을 효율적으로 관리할 수 있다.</p></li><li><p><strong>mimalloc 비활성화</strong>: C#에서는 <code>mimalloc</code> 메모리 할당기를 사용할 수 있지만, 이 할당기는 메모리를 더 공격적으로 캐시할 수 있다. 이로 인해 메모리 사용량이 증가할 수 있으며, 필요에 따라 <code>set_system('memory_allocator', 'system')</code>을 사용하여 시스템의 기본 메모리 할당기를 사용할 수 있다.</p></li></ol><h3 id="C-에서-메모리-관리-최적화"><a href="#C-에서-메모리-관리-최적화" class="headerlink" title="C#에서 메모리 관리 최적화"></a>C#에서 메모리 관리 최적화</h3><p>C#에서 HALCON을 사용할 때 성능 최적화를 위해 다음과 같은 방법들을 고려할 수 있다:</p><ul><li><p><strong>쓰레드 수 제한</strong>: <code>set_system('thread_num', <num_of_threads>)</code>을 사용하여 AOP(Automatic Operator Parallelization) 쓰레드 수를 제한하면, 메모리 소비를 줄이고 성능을 최적화할 수 있다. 너무 많은 쓰레드는 메모리 사용량을 증가시킬 수 있으므로, 적절한 쓰레드 수를 설정하는 것이 중요하다.</p></li><li><p><strong>메모리 예약 크기 설정</strong>: <code>set_system('temporary_mem_reservoir_size', <size_in_bytes>)</code>와 같은 명령어를 사용하여 임시 메모리 저장소의 크기를 제한하거나, <code>set_system('temporary_mem_cache', 'aggregate')</code> 모드를 사용하여 성능과 메모리 소비의 균형을 맞출 수 있다.</p></li></ul><p>C#에서 HALCON을 사용할 때, 메모리 관리를 효율적으로 처리하는 것이 성능 최적화와 메모리 누수 방지에 중요한 역할을 한다. 적절한 메모리 관리 전략을 사용하여 안정적이고 고성능의 애플리케이션을 구축할 수 있다.</p><p>AD_HERE</p><h2 id="자주-묻는-질문"><a href="#자주-묻는-질문" class="headerlink" title="자주 묻는 질문"></a>자주 묻는 질문</h2><h3 id="HALCON-애플리케이션의-메모리-사용량이-계속-증가하는-이유는-무엇인가"><a href="#HALCON-애플리케이션의-메모리-사용량이-계속-증가하는-이유는-무엇인가" class="headerlink" title="HALCON 애플리케이션의 메모리 사용량이 계속 증가하는 이유는 무엇인가?"></a>HALCON 애플리케이션의 메모리 사용량이 계속 증가하는 이유는 무엇인가?</h3><p>메모리 사용량이 증가하는 이유는 주로 메모리 캐시 때문이다. HALCON은 성능을 높이기 위해 캐시 메커니즘을 사용한다. 캐시 메커니즘에 의해 메모리 사용량이 늘어날 수 있지만, 이는 일반적으로 애플리케이션 성능 향상에 기여한다.</p><h3 id="HALCON에서-객체를-삭제한-후-메모리-사용량이-즉시-줄어들지-않는-이유는-무엇인가"><a href="#HALCON에서-객체를-삭제한-후-메모리-사용량이-즉시-줄어들지-않는-이유는-무엇인가" class="headerlink" title="HALCON에서 객체를 삭제한 후 메모리 사용량이 즉시 줄어들지 않는 이유는 무엇인가?"></a>HALCON에서 객체를 삭제한 후 메모리 사용량이 즉시 줄어들지 않는 이유는 무엇인가?</h3><p>메모리 캐시 때문에, HALCON은 삭제된 객체의 메모리를 즉시 해제하지 않고, 이를 캐시에 보관한다. 이는 후속 메모리 요청을 빠르게 처리하기 위함이다.</p><h3 id="HALCON에서-메모리-캐시를-즉시-해제할-수-있는-방법은-무엇인가"><a href="#HALCON에서-메모리-캐시를-즉시-해제할-수-있는-방법은-무엇인가" class="headerlink" title="HALCON에서 메모리 캐시를 즉시 해제할 수 있는 방법은 무엇인가?"></a>HALCON에서 메모리 캐시를 즉시 해제할 수 있는 방법은 무엇인가?</h3><p>각각의 캐시를 비활성화하거나, 특정 명령어를 사용하여 메모리를 해제할 수 있다. 예를 들어, <code>set_system('image_cache_capacity', 0)</code> 명령어로 이미지 캐시를 비활성화할 수 있다.</p><h2 id="결론"><a href="#결론" class="headerlink" title="결론"></a>결론</h2><p>할콘의 메모리 관리 시스템은 이미지 처리 작업에서 높은 성능을 유지하면서도 효율적으로 메모리를 관리하는 강력한 도구이다. 이 시스템의 이해를 바탕으로 메모리 누수 문제를 예방하고, 성능을 최적화할 수 있다. HALCON의 다양한 캐시 시스템을 적절히 활용하면, 복잡한 이미지 처리 작업에서도 높은 성능을 유지할 수 있다.</p>]]></content:encoded>
<comments>http://techbless.github.io/2024/02/08/halcon-memory-management/#disqus_thread</comments>
</item>
<item>
<title>Halcon - Optimize the Matching Speed</title>
<link>http://techbless.github.io/2024/01/11/matching-speed-up/</link>
<guid>http://techbless.github.io/2024/01/11/matching-speed-up/</guid>
<pubDate>Thu, 11 Jan 2024 01:18:58 GMT</pubDate>
<description>
<h2 id="속도-향상-방법"><a href="#속도-향상-방법" class="headerlink" title="속도 향상 방법"></a>속도 향상 방법</h2><p>매칭을 수행할 때, 검색 속도를 향상시키는 것은 매우 중요하다. 특히, 대용량 이미
</description>
<content:encoded><![CDATA[<h2 id="속도-향상-방법"><a href="#속도-향상-방법" class="headerlink" title="속도 향상 방법"></a>속도 향상 방법</h2><p>매칭을 수행할 때, 검색 속도를 향상시키는 것은 매우 중요하다. 특히, 대용량 이미지나 실시간 처리 시스템에서는 속도가 중요한 요소로 작용한다. HALCON에서는 검색 속도를 향상시키기 위한 여러 가지 방법을 제공하고 있으며, 이들을 적절히 사용하면 매칭 프로세스를 크게 최적화할 수 있다. 다음은 속도를 높이는 몇 가지 주요 방법이다.</p><h3 id="검색-공간-제한"><a href="#검색-공간-제한" class="headerlink" title="검색 공간 제한"></a>검색 공간 제한</h3><p>검색할 공간을 제한하면 매칭을 더 빨리 수행할 수 있다. 이미 알고 있는 객체의 예상 위치나 크기, 방향에 대한 정보를 바탕으로 검색 범위를 줄이면 불필요한 계산을 줄일 수 있다. 이를 통해 불필요한 영역을 제외하고 매칭 속도를 높일 수 있다.</p><ul><li><strong>ROI 사용</strong>: 전체 이미지를 검색하는 대신 특정 영역(ROI)을 지정하여 그 범위 내에서만 검색을 수행한다. 이렇게 하면 이미지 전체를 검색할 필요가 없어 속도가 향상된다.</li></ul><h3 id="이미지-피라미드-활용"><a href="#이미지-피라미드-활용" class="headerlink" title="이미지 피라미드 활용"></a>이미지 피라미드 활용</h3><p><img src="/img/matching-speed/pyramid.png"></p><p>이미지 피라미드는 원본 이미지를 여러 크기의 하위 이미지들로 다운샘플링한 구조로, 각 피라미드 레벨에서 차례대로 검색을 수행하면서 점점 더 정확한 결과를 얻는다. 높은 해상도에서 전체 검색을 진행하기보다는, 처음에는 작은 해상도에서 빠르게 매칭을 수행한 뒤, 점점 더 높은 해상도로 내려가면서 정확도를 높일 수 있다.</p><h3 id="그리디-greedy-검색"><a href="#그리디-greedy-검색" class="headerlink" title="그리디(greedy) 검색"></a>그리디(greedy) 검색</h3><p>그리디 알고리즘을 사용하면 빠르게 매칭 후보를 걸러낼 수 있다. 이 방법은 매칭 후보를 한 번에 모두 검사하지 않고, 유망한 후보만 선택적으로 검사하여 불필요한 계산을 피하는 방식이다.</p><ul><li><strong>그리디 검색 설정</strong>: <code>Greediness</code> 값을 설정하여, 얼마나 빨리 검색을 중단할 것인지를 제어할 수 있다. 값이 높으면 더 빨리 중단되고, 값이 낮으면 더 세밀하게 검사를 진행한다. <code>MinScore</code>와 함께 설정하여 성능을 최적화할 수 있다.</li></ul><h3 id="후보-수-제한-Limit-the-Number-of-Candidates"><a href="#후보-수-제한-Limit-the-Number-of-Candidates" class="headerlink" title="후보 수 제한 (Limit the Number of Candidates)"></a>후보 수 제한 (Limit the Number of Candidates)</h3><p>후보의 수를 제한하는 것도 매칭 속도를 높이는 중요한 방법이다. <code>MinScore</code>와 <code>NumMatches</code> 파라미터를 설정하여, 일정 점수 이상의 매칭 후보만 추출하거나, 찾을 수 있는 매칭의 수를 제한함으로써 속도를 최적화할 수 있다.</p><ul><li><strong>MinScore</strong>: 후보가 일정 점수 이상일 때만 매칭을 고려하도록 설정하여 불필요한 후보를 제거한다.</li><li><strong>NumMatches</strong>: 최대 매칭 수를 제한하여, 필요한 매칭만을 반환하도록 한다.</li></ul><h2 id="여러-결과-사용"><a href="#여러-결과-사용" class="headerlink" title="여러 결과 사용"></a>여러 결과 사용</h2><p><code>Shape-based matching</code>은 객체의 형태를 기반으로 매칭을 수행하는 강력한 방법으로, 다양한 객체의 변형을 처리할 수 있다. 이 매칭 방식은 여러 형태를 비교하고, 그 중 가장 적합한 모델을 찾는 데 유용하다. 하지만 하나의 매칭만을 수행하는 것이 아니라, 여러 매칭 결과를 동시에 처리해야 할 경우도 있다. 이 때 <code>Use Multiple Shape-Based Matching Results</code> 기능이 중요한 역할을 한다.</p><h3 id="여러-모델을-동시에-매칭하기"><a href="#여러-모델을-동시에-매칭하기" class="headerlink" title="여러 모델을 동시에 매칭하기"></a>여러 모델을 동시에 매칭하기</h3><p>여러 모델을 동시에 찾고, 각 모델을 개별적으로 추적하는 방식은 복잡한 장면에서 매우 유용하다. 여러 개의 모델을 찾을 때는 각 모델에 대해 매칭을 개별적으로 수행한 후, 그 결과를 조합하여 최종 매칭 결과를 도출한다. 이를 통해 더 복잡한 장면에서 효율적으로 객체를 식별할 수 있다.</p><h4 id="주요-단계"><a href="#주요-단계" class="headerlink" title="주요 단계"></a>주요 단계</h4><ol><li><strong>여러 모델 ID 사용</strong>: 여러 모델을 찾을 때는 각 모델을 구별할 수 있는 ID를 설정하고, 이를 통해 개별적으로 매칭을 수행한다.</li><li><strong>다수 모델 결과 처리</strong>: 각 모델의 매칭 결과를 별도로 추적하여, 그 결과를 나중에 합치거나 개별적으로 분석할 수 있다.</li><li><strong>속도 최적화</strong>: 여러 모델을 동시에 매칭할 때, 피라미드를 활용하거나, 후보 수를 제한하여 성능을 최적화할 수 있다.</li></ol><h3 id="적용-사례"><a href="#적용-사례" class="headerlink" title="적용 사례"></a>적용 사례</h3><p>이 방식은 다수의 객체를 동시에 찾거나, 객체들이 서로 겹쳐 있는 장면에서 유용하게 사용된다. 예를 들어, 공장 자동화 시스템에서는 여러 제품을 동시에 찾거나, 로봇 비전 시스템에서 여러 객체를 추적하는 데 활용된다. 또한, 다양한 크기나 모양의 객체를 다룰 때 유용하게 적용할 수 있다.</p><p><code>Shape-based matching</code>의 강력한 점은 변형된 형태를 인식하고, 이를 정확히 매칭할 수 있다는 것이다. 그러나 여러 결과를 동시에 활용해야 할 때는 처리 속도와 성능을 고려한 최적화가 필요하다. 여러 모델을 동시에 매칭하면서도 속도와 정확성을 유지할 수 있도록, 적절한 매칭 파라미터와 후처리 방법을 선택하는 것이 중요하다.</p><p>AD_HERE</p><h2 id="3-2-9의-Optimize-the-Matching-Speed"><a href="#3-2-9의-Optimize-the-Matching-Speed" class="headerlink" title="3.2.9의 Optimize the Matching Speed"></a>3.2.9의 Optimize the Matching Speed</h2><p>다음은 매칭 속도를 최적화하는 두 가지 단계에 대해 설명한다. 매칭을 최적화하려면 애플리케이션에서 객체가 위치, 방향, 가려짐, 조명 등에서 허용되는 모든 변형에 대해 나타날 수 있는 대표적인 테스트 이미지 세트를 보유하는 것이 매우 중요하다.</p><h3 id="Step-1-모든-객체가-발견되도록-보장하기"><a href="#Step-1-모든-객체가-발견되도록-보장하기" class="headerlink" title="Step 1: 모든 객체가 발견되도록 보장하기"></a>Step 1: 모든 객체가 발견되도록 보장하기</h3><p>속도를 조정하기 전에, 매칭이 모든 테스트 이미지에서 성공하도록 설정을 찾아야 한다. 즉, 모든 객체 인스턴스가 발견되도록 해야 한다. 기본값을 사용하여 이 작업이 이루어지지 않는 경우, 다음 사항을 확인해보자:</p><ul><li><p><strong>검색 알고리즘이 “너무 greedy”한가?</strong><br>일부 경우, ‘greediness’ 값이 너무 높으면 완전히 보이는 객체도 찾을 수 없다. 철저한 검색을 위해 값을 0으로 설정해보자.</p></li><li><p><strong>객체가 부분적으로 가려졌는가?</strong><br>객체가 가려진 상태에서도 인식해야 하는 경우, ‘min_score’ 파라미터를 낮춰보자. 추가 정보는 섹션 3.2.6.2에서 참조할 수 있다.</p></li><li><p><strong>최고 피라미드 레벨에서 매칭이 실패하는가?</strong><br>일부 경우, 최고 피라미드 레벨에서 min_score에 도달하지 못할 수 있다. 이 경우 ‘num_levels’를 줄이거나 ‘pyramid_level_highest’ 값을 설정하거나, ‘min_score’를 낮춰보자.</p></li><li><p><strong>객체의 대비가 낮은가?</strong><br>객체가 낮은 대비에서도 인식되어야 한다면, ‘min_contrast’ 값을 낮춰보자. 관련된 내용은 섹션 3.2.4.1에서 확인할 수 있다.</p></li><li><p><strong>대비의 극성이 전역적으로 또는 지역적으로 반전되었는가?</strong><br>객체가 이런 상태에서도 인식되도록 해야 한다면, 모델을 생성할 때 ‘metric’ 파라미터의 적절한 값을 사용해보자. 만약 객체의 일부만 영향을 받는다면, ‘min_score’를 줄이는 것이 더 나을 수 있다.</p></li><li><p><strong>객체가 다른 객체 인스턴스와 겹쳐 있는가?</strong><br>객체가 겹쳐져서도 인식되어야 한다면, ‘max_overlap’ 파라미터를 늘려보자.</p></li><li><p><strong>동일 객체에서 여러 개의 매칭이 발견되는가?</strong><br>객체가 거의 대칭인 경우, 섹션 3.2.6.1에서 설명된 대로 회전 범위를 제한하거나, ‘max_overlap’ 값을 줄여서 해결할 수 있다.</p></li></ul><h3 id="Step-2-속도에-맞게-파라미터-조정하기"><a href="#Step-2-속도에-맞게-파라미터-조정하기" class="headerlink" title="Step 2: 속도에 맞게 파라미터 조정하기"></a>Step 2: 속도에 맞게 파라미터 조정하기</h3><p>모든 객체가 발견되었지만 애플리케이션의 속도가 향상되어야 한다면, 모델과 검색 파라미터에 따라 속도를 조정할 수 있는 몇 가지 방법이 있다. 매칭 파이프라인의 주요 부분들의 실행 시간을 살펴보는 것은 어떤 검색 단계가 속도 향상 잠재력이 큰지 알 수 있는 좋은 지표가 될 수 있다. 시간 측정은 호출마다 달라질 수 있으며, 외부 요인(예: os 인터럽트, 바이러스 백신 프로그램 등)에 의해 영향을 받을 수 있다는 점을 유의해야 한다. 시간 측정은 <code>set_generic_shape_model_param</code>을 사용하여 pipeline을 활성화하여 할 수 있다. 매칭 작업의 결과 핸들은 <code>get_generic_shape_model_result</code>를 사용하여 조회할 수 있으며, 매칭 파이프라인에 따라 실행 시간을 표시할 수 있다.</p><p><strong>만약 시간이 최고 수준 단계에서 많이 소요된다면, 다음과 같이 진행할 수 있다:</strong></p><ul><li><strong>‘min_score’ 값을 가능한 한 높게 설정</strong> 하여 매칭이 성공하도록 한다.</li><li><strong>‘greediness’ 값을 증가시켜, 매칭이 실패할 때까지 테스트</strong> 한 후, 실패한다면 ‘min_score’를 낮추어 보자. 그래도 실패하면 이전 값을 복원한다.</li><li><strong>회전 및 스케일 범위를 가능한 한 제한</strong>한다. 이는 섹션 3.2.6.1에서 설명된 대로 수행할 수 있으며, 모델 레벨에서 미리 이 파라미터들을 조정하는 방법도 있다.</li><li><strong>검색을 ROI으로 제한</strong>한다. 이는 섹션 3.2.7에서 설명된 대로 할 수 있다.</li></ul><p><strong>만약 시간이 추적 단계에서 많이 소요되고 정확성과 강건성을 속도에 맞춰서 희생할 의향이 있다면, 다음과 같이 할 수 있다:</strong><br><img src="/img/matching-speed/pyramid-fail.png"></p><ul><li><strong>더 높은 피라미드 레벨에서 검색을 종료</strong> 한다. <ul><li>하지만, 이미지의 예시와 같이 낮은 대비로 인해 MVTec에서 V가 사라지는 현상이 생길 수 있다.</li></ul></li><li><strong>모델 변형을 최대한 제한</strong>한다.</li></ul><p><strong>만약 서브픽셀 정밀화가 매칭 파이프라인에서 상당한 시간을 소요한다면, 다음과 같은 방법을 사용할 수 있다:</strong></p><ul><li><strong>서브픽셀 정밀화를 ‘interpolation’으로 설정하거나</strong> , 정확도를 속도와 교환하기 위해 ‘none’으로 설정할 수 있다.</li></ul><p>이미지를 획득하고 모델을 생성할 때, 검색 속도에 크게 영향을 미칠 수 있는 모델을 선호하는 것이 중요하다. 예를 들어, 약한 구조보다 우세한 구조를 가진 모델을 선호하면 속도에 긍정적인 영향을 미친다.</p><h3 id="추가-방법들-이-방법들은-더-“위험한”-방법일-수-있으며-부적절한-파라미터-값을-선택할-경우-매칭-실패가-발생할-수-있다"><a href="#추가-방법들-이-방법들은-더-“위험한”-방법일-수-있으며-부적절한-파라미터-값을-선택할-경우-매칭-실패가-발생할-수-있다" class="headerlink" title="추가 방법들 (이 방법들은 더 “위험한” 방법일 수 있으며, 부적절한 파라미터 값을 선택할 경우 매칭 실패가 발생할 수 있다):"></a>추가 방법들 (이 방법들은 더 “위험한” 방법일 수 있으며, 부적절한 파라미터 값을 선택할 경우 매칭 실패가 발생할 수 있다):</h3><ul><li><strong>‘min_contrast’ 값을 높여서 매칭이 성공하는 한까지 설정</strong> 한다.</li><li><strong>특히 큰 객체를 검색하는 경우, ‘optimization’ 파라미터에서 더 높은 점수 축소를 선택</strong> 하는 것이 도움이 된다. 관련된 정보는 섹션 3.2.4.2에서 확인할 수 있다.</li><li><strong>‘angle_step’(및 ‘iso_scale_step’ 또는 비균일 스케일링에 대한 해당 파라미터)을 매칭이 성공하는 한까지 늘린다.</strong></li></ul>]]></content:encoded>
<comments>http://techbless.github.io/2024/01/11/matching-speed-up/#disqus_thread</comments>
</item>
<item>
<title>[논문 리뷰] A Style-Based Generator Architecture for Generative Adversarial Networks</title>
<link>http://techbless.github.io/2023/12/08/style-gan/</link>
<guid>http://techbless.github.io/2023/12/08/style-gan/</guid>
<pubDate>Fri, 08 Dec 2023 04:16:09 GMT</pubDate>
<description>
<h1 id="A-Style-Based-Generator-Architecture-for-Generative-Adversarial-Networks-논문-리뷰"><a href="#A-Style-Based-Generator-Architecture-for-G
</description>
<content:encoded><![CDATA[<h1 id="A-Style-Based-Generator-Architecture-for-Generative-Adversarial-Networks-논문-리뷰"><a href="#A-Style-Based-Generator-Architecture-for-Generative-Adversarial-Networks-논문-리뷰" class="headerlink" title="A Style-Based Generator Architecture for Generative Adversarial Networks 논문 리뷰"></a>A Style-Based Generator Architecture for Generative Adversarial Networks 논문 리뷰</h1><p>링크: <a href="https://arxiv.org/abs/1812.04948">https://arxiv.org/abs/1812.04948</a><br>저널|학회: CVPR 2019<br>연구목적: ProGAN의 개선, Disentanglment 개선<br>데이터셋: N/A<br>주요결과: 고해상도 이미지 생성, FFHQ 데이터셋, Disentanglement<br>저자: Tero Karras et al.</p><h2 id="1-Introduction"><a href="#1-Introduction" class="headerlink" title="1. Introduction"></a>1. Introduction</h2><p>StyleGAN으로 알려진 이 논문은 Progressive Growing의 아이디어와 함께 Style transfer의 아키텍처로 부터 영감을 받아 혁신적인 Generator를 고안하였다. 논문에서 제안된 style-based generator만으로 기본적인 discriminator나 loss에도 robust하다. 이 논문 이후로 StyleGAN의 여러 버전이나오고 있으나 전반적인 연구 흐름을 따라가기 위해 이해하고 넘어가면 좋을 것같다. 본 연구의 주요 Contribution은 다음과 같다.</p><ol><li>style-based Generator로 고해상도, 고퀄리티 이미지를 생성한다.</li><li>기존 GAN구조의 entanglement할 수밖에 없음을 재확인하였다.</li><li>Disentanglemen를 재정의 하고 좋은 퀄리티의 이미지를 생성하는 것에 초점을 둔다.</li><li>FFHQ데이터셋을 제시한다.</li></ol><h2 id="2-Style-based-Generator"><a href="#2-Style-based-Generator" class="headerlink" title="2. Style-based Generator"></a>2. Style-based Generator</h2><p>StyleGAN은 앞서 말한 바와 같이 Generator의 아키텍처에 초점을 두고 있다. 이 구조에서 주목할만한 부분은 다음과 같다.</p><ol><li>Mapping Network</li><li>AdaIN</li><li>Noise Injection</li></ol><p><img src="/img/stylegan/img1.png" alt="Untitled"><br>Fig. 1. baseline과 styleGAN 아키텍처 비교</p><h3 id="2-1-Mapping-Network"><a href="#2-1-Mapping-Network" class="headerlink" title="2.1 Mapping Network"></a>2.1 Mapping Network</h3><p>Mapping Network의 경우 Mapping Network을 이해하기 위해 먼저 disentanglement가 무엇인지 알아야할 필요가 있다.<br>Entanglement를 직역하면 ‘얽혀있다’라는 의미로, 반대로 Disentanglement는 ‘잘 분리되어있다’ 정도로 해석할 수 잇다. GAN에서는 1) 어떤 attribute를 잘 나눌수 있다는 것, 2)latent space가 linear subspace로 구성된다는 것을 의미한다.</p><p><img src="/img/stylegan/img2.png" alt="Untitled"><br>Fig. 2. Entanglement의 시각적 설명</p><p>Fig. 2a를 실제 데이터의 분포라고 하고 가로축은 성별, 세로축은 머리길이에 대한 축이라고 할때, 머리가 짧은 남성에서 머리가 긴 여성으로 interpolation을 수행한다면, Fig. 2a와 같이 중간 과정의 데이터셋이 존재 하지 않는다고 가정할때 interpolation 중간에 급격한 변화(성별과 머리길이에 상관없는 feature)가 나타난다. 이를 space가 linear하지 않다는 것을 의미한다.</p><p>Fig. 2b는 PGGAN의 경우로 데이터 분포를 Gaussian으로 가정하기 때문에 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="1.636ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 723 683"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D44D" d="M58 8Q58 23 64 35Q64 36 329 334T596 635L586 637Q575 637 512 637H500H476Q442 637 420 635T365 624T311 598T266 548T228 469Q227 466 226 463T224 458T223 453T222 450L221 448Q218 443 202 443Q185 443 182 453L214 561Q228 606 241 651Q249 679 253 681Q256 683 487 683H718Q723 678 723 675Q723 673 717 649Q189 54 188 52L185 49H274Q369 50 377 51Q452 60 500 100T579 247Q587 272 590 277T603 282H607Q628 282 628 271Q547 5 541 2Q538 0 300 0H124Q58 0 58 8Z"></path></g></g></g></svg></mjx-container> space는 원래 분포가 Gaussian에 맞춰 뒤틀린다. 따라서 이 경우 entangle할수 밖에 없다.</p><p>Fig. 2c는 entanglment를 방지하기 위해 mapping network를 통해 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="1.636ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 723 683"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D44D" d="M58 8Q58 23 64 35Q64 36 329 334T596 635L586 637Q575 637 512 637H500H476Q442 637 420 635T365 624T311 598T266 548T228 469Q227 466 226 463T224 458T223 453T222 450L221 448Q218 443 202 443Q185 443 182 453L214 561Q228 606 241 651Q249 679 253 681Q256 683 487 683H718Q723 678 723 675Q723 673 717 649Q189 54 188 52L185 49H274Q369 50 377 51Q452 60 500 100T579 247Q587 272 590 277T603 282H607Q628 282 628 271Q547 5 541 2Q538 0 300 0H124Q58 0 58 8Z"></path></g></g></g></svg></mjx-container> space를 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.05ex;" xmlns="http://www.w3.org/2000/svg" width="2.371ex" height="1.595ex" role="img" focusable="false" viewBox="0 -683 1048 705"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D44A" d="M436 683Q450 683 486 682T553 680Q604 680 638 681T677 682Q695 682 695 674Q695 670 692 659Q687 641 683 639T661 637Q636 636 621 632T600 624T597 615Q597 603 613 377T629 138L631 141Q633 144 637 151T649 170T666 200T690 241T720 295T759 362Q863 546 877 572T892 604Q892 619 873 628T831 637Q817 637 817 647Q817 650 819 660Q823 676 825 679T839 682Q842 682 856 682T895 682T949 681Q1015 681 1034 683Q1048 683 1048 672Q1048 666 1045 655T1038 640T1028 637Q1006 637 988 631T958 617T939 600T927 584L923 578L754 282Q586 -14 585 -15Q579 -22 561 -22Q546 -22 542 -17Q539 -14 523 229T506 480L494 462Q472 425 366 239Q222 -13 220 -15T215 -19Q210 -22 197 -22Q178 -22 176 -15Q176 -12 154 304T131 622Q129 631 121 633T82 637H58Q51 644 51 648Q52 671 64 683H76Q118 680 176 680Q301 680 313 683H323Q329 677 329 674T327 656Q322 641 318 637H297Q236 634 232 620Q262 160 266 136L501 550L499 587Q496 629 489 632Q483 636 447 637Q428 637 422 639T416 648Q416 650 418 660Q419 664 420 669T421 676T424 680T428 682T436 683Z"></path></g></g></g></svg></mjx-container> space로 맵핑하여 less entangle하게 만든다. 따라서 interpolation과정에서 더 linear하게 동작할 수 있다. </p><p>mapping network를 통해 smpling한 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.052ex" height="1.025ex" role="img" focusable="false" viewBox="0 -442 465 453"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D467" d="M347 338Q337 338 294 349T231 360Q211 360 197 356T174 346T162 335T155 324L153 320Q150 317 138 317Q117 317 117 325Q117 330 120 339Q133 378 163 406T229 440Q241 442 246 442Q271 442 291 425T329 392T367 375Q389 375 411 408T434 441Q435 442 449 442H462Q468 436 468 434Q468 430 463 420T449 399T432 377T418 358L411 349Q368 298 275 214T160 106L148 94L163 93Q185 93 227 82T290 71Q328 71 360 90T402 140Q406 149 409 151T424 153Q443 153 443 143Q443 138 442 134Q425 72 376 31T278 -11Q252 -11 232 6T193 40T155 57Q111 57 76 -3Q70 -11 59 -11H54H41Q35 -5 35 -2Q35 13 93 84Q132 129 225 214T340 322Q352 338 347 338Z"></path></g></g></g></svg></mjx-container> vector를 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.62ex" height="1.027ex" role="img" focusable="false" viewBox="0 -443 716 454"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D464" d="M580 385Q580 406 599 424T641 443Q659 443 674 425T690 368Q690 339 671 253Q656 197 644 161T609 80T554 12T482 -11Q438 -11 404 5T355 48Q354 47 352 44Q311 -11 252 -11Q226 -11 202 -5T155 14T118 53T104 116Q104 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 293 29 315T52 366T96 418T161 441Q204 441 227 416T250 358Q250 340 217 250T184 111Q184 65 205 46T258 26Q301 26 334 87L339 96V119Q339 122 339 128T340 136T341 143T342 152T345 165T348 182T354 206T362 238T373 281Q402 395 406 404Q419 431 449 431Q468 431 475 421T483 402Q483 389 454 274T422 142Q420 131 420 107V100Q420 85 423 71T442 42T487 26Q558 26 600 148Q609 171 620 213T632 273Q632 306 619 325T593 357T580 385Z"></path></g></g></g></svg></mjx-container> vector로 변환하였고, synthesis network에서 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.052ex" height="1.025ex" role="img" focusable="false" viewBox="0 -442 465 453"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D467" d="M347 338Q337 338 294 349T231 360Q211 360 197 356T174 346T162 335T155 324L153 320Q150 317 138 317Q117 317 117 325Q117 330 120 339Q133 378 163 406T229 440Q241 442 246 442Q271 442 291 425T329 392T367 375Q389 375 411 408T434 441Q435 442 449 442H462Q468 436 468 434Q468 430 463 420T449 399T432 377T418 358L411 349Q368 298 275 214T160 106L148 94L163 93Q185 93 227 82T290 71Q328 71 360 90T402 140Q406 149 409 151T424 153Q443 153 443 143Q443 138 442 134Q425 72 376 31T278 -11Q252 -11 232 6T193 40T155 57Q111 57 76 -3Q70 -11 59 -11H54H41Q35 -5 35 -2Q35 13 93 84Q132 129 225 214T340 322Q352 338 347 338Z"></path></g></g></g></svg></mjx-container>대신 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.62ex" height="1.027ex" role="img" focusable="false" viewBox="0 -443 716 454"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D464" d="M580 385Q580 406 599 424T641 443Q659 443 674 425T690 368Q690 339 671 253Q656 197 644 161T609 80T554 12T482 -11Q438 -11 404 5T355 48Q354 47 352 44Q311 -11 252 -11Q226 -11 202 -5T155 14T118 53T104 116Q104 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 293 29 315T52 366T96 418T161 441Q204 441 227 416T250 358Q250 340 217 250T184 111Q184 65 205 46T258 26Q301 26 334 87L339 96V119Q339 122 339 128T340 136T341 143T342 152T345 165T348 182T354 206T362 238T373 281Q402 395 406 404Q419 431 449 431Q468 431 475 421T483 402Q483 389 454 274T422 142Q420 131 420 107V100Q420 85 423 71T442 42T487 26Q558 26 600 148Q609 171 620 213T632 273Q632 306 619 325T593 357T580 385Z"></path></g></g></g></svg></mjx-container>를 사용해 이미지를 생성한다.</p><h3 id="2-3-AdaIN"><a href="#2-3-AdaIN" class="headerlink" title="2.3 AdaIN"></a>2.3 AdaIN</h3><p>AdaIN (Adaptive Instance Normalization)은 Style Transfer에 사용되는 기술로, 콘텐츠 이미지에 스타일 이미지의 특성을 적용하는 데 사용된다. 이 과정은 다음과 같은 단계로 구성된다:</p><ol><li>콘텐츠 이미지의 정규화: 콘텐츠 이미지 x는 인스턴스 정규화를 통해 정규화됩니다. 이는 각 이미지(인스턴스)와 채널별로 평균을 0으로, 분산을 1로 조정하는 과정입니다. 여기서 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="4.419ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 1953 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D707" d="M58 -216Q44 -216 34 -208T23 -186Q23 -176 96 116T173 414Q186 442 219 442Q231 441 239 435T249 423T251 413Q251 401 220 279T187 142Q185 131 185 107V99Q185 26 252 26Q261 26 270 27T287 31T302 38T315 45T327 55T338 65T348 77T356 88T365 100L372 110L408 253Q444 395 448 404Q461 431 491 431Q504 431 512 424T523 412T525 402L449 84Q448 79 448 68Q448 43 455 35T476 26Q485 27 496 35Q517 55 537 131Q543 151 547 152Q549 153 557 153H561Q580 153 580 144Q580 138 575 117T555 63T523 13Q510 0 491 -8Q483 -10 467 -10Q446 -10 429 -4T402 11T385 29T376 44T374 51L368 45Q362 39 350 30T324 12T288 -4T246 -11Q199 -11 153 12L129 -85Q108 -167 104 -180T92 -202Q76 -216 58 -216Z"></path></g><g data-mml-node="mo" transform="translate(603,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(992,0)"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(1564,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g></svg></mjx-container>는 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.294ex" height="1.025ex" role="img" focusable="false" viewBox="0 -442 572 453"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g></g></g></svg></mjx-container>의 평균, <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="4.346ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 1921 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D70E" d="M184 -11Q116 -11 74 34T31 147Q31 247 104 333T274 430Q275 431 414 431H552Q553 430 555 429T559 427T562 425T565 422T567 420T569 416T570 412T571 407T572 401Q572 357 507 357Q500 357 490 357T476 358H416L421 348Q439 310 439 263Q439 153 359 71T184 -11ZM361 278Q361 358 276 358Q152 358 115 184Q114 180 114 178Q106 141 106 117Q106 67 131 47T188 26Q242 26 287 73Q316 103 334 153T356 233T361 278Z"></path></g><g data-mml-node="mo" transform="translate(571,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(960,0)"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(1532,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g></svg></mjx-container>는 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.294ex" height="1.025ex" role="img" focusable="false" viewBox="0 -442 572 453"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g></g></g></svg></mjx-container>의 표준편차이다.</li></ol><p><mjx-container class="MathJax" jax="SVG" display="true"><svg style="vertical-align: -2.172ex;" xmlns="http://www.w3.org/2000/svg" width="13.785ex" height="5.475ex" role="img" focusable="false" viewBox="0 -1460 6093 2420"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mover"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(313.8,16) translate(-250 0)"><path data-c="5E" d="M112 560L249 694L257 686Q387 562 387 560L361 531Q359 532 303 581L250 627L195 580Q182 569 169 557T148 538L140 532Q138 530 125 546L112 560Z"></path></g></g></g><g data-mml-node="mo" transform="translate(849.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mfrac" transform="translate(1905.6,0)"><g data-mml-node="mrow" transform="translate(220,710)"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(794.2,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="mi" transform="translate(1794.4,0)"><path data-c="1D707" d="M58 -216Q44 -216 34 -208T23 -186Q23 -176 96 116T173 414Q186 442 219 442Q231 441 239 435T249 423T251 413Q251 401 220 279T187 142Q185 131 185 107V99Q185 26 252 26Q261 26 270 27T287 31T302 38T315 45T327 55T338 65T348 77T356 88T365 100L372 110L408 253Q444 395 448 404Q461 431 491 431Q504 431 512 424T523 412T525 402L449 84Q448 79 448 68Q448 43 455 35T476 26Q485 27 496 35Q517 55 537 131Q543 151 547 152Q549 153 557 153H561Q580 153 580 144Q580 138 575 117T555 63T523 13Q510 0 491 -8Q483 -10 467 -10Q446 -10 429 -4T402 11T385 29T376 44T374 51L368 45Q362 39 350 30T324 12T288 -4T246 -11Q199 -11 153 12L129 -85Q108 -167 104 -180T92 -202Q76 -216 58 -216Z"></path></g><g data-mml-node="mo" transform="translate(2397.4,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(2786.4,0)"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(3358.4,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g><g data-mml-node="mrow" transform="translate(1133.2,-710)"><g data-mml-node="mi"><path data-c="1D70E" d="M184 -11Q116 -11 74 34T31 147Q31 247 104 333T274 430Q275 431 414 431H552Q553 430 555 429T559 427T562 425T565 422T567 420T569 416T570 412T571 407T572 401Q572 357 507 357Q500 357 490 357T476 358H416L421 348Q439 310 439 263Q439 153 359 71T184 -11ZM361 278Q361 358 276 358Q152 358 115 184Q114 180 114 178Q106 141 106 117Q106 67 131 47T188 26Q242 26 287 73Q316 103 334 153T356 233T361 278Z"></path></g><g data-mml-node="mo" transform="translate(571,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(960,0)"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(1532,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g><rect width="3947.4" height="60" x="120" y="220"></rect></g></g></g></svg></mjx-container></p><ol start="2"><li><p>스타일 이미지의 Affine 변환: 스타일 이미지 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.464ex;" xmlns="http://www.w3.org/2000/svg" width="1.109ex" height="1.464ex" role="img" focusable="false" viewBox="0 -442 490 647"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g></g></g></svg></mjx-container>는 Affine 변환을 통해 스타일 스케일링 인자 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="4.161ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 1839 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D70E" d="M184 -11Q116 -11 74 34T31 147Q31 247 104 333T274 430Q275 431 414 431H552Q553 430 555 429T559 427T562 425T565 422T567 420T569 416T570 412T571 407T572 401Q572 357 507 357Q500 357 490 357T476 358H416L421 348Q439 310 439 263Q439 153 359 71T184 -11ZM361 278Q361 358 276 358Q152 358 115 184Q114 180 114 178Q106 141 106 117Q106 67 131 47T188 26Q242 26 287 73Q316 103 334 153T356 233T361 278Z"></path></g><g data-mml-node="mo" transform="translate(571,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(960,0)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mo" transform="translate(1450,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g></svg></mjx-container>와 스타일 바이어스 인자 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="4.233ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 1871 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D707" d="M58 -216Q44 -216 34 -208T23 -186Q23 -176 96 116T173 414Q186 442 219 442Q231 441 239 435T249 423T251 413Q251 401 220 279T187 142Q185 131 185 107V99Q185 26 252 26Q261 26 270 27T287 31T302 38T315 45T327 55T338 65T348 77T356 88T365 100L372 110L408 253Q444 395 448 404Q461 431 491 431Q504 431 512 424T523 412T525 402L449 84Q448 79 448 68Q448 43 455 35T476 26Q485 27 496 35Q517 55 537 131Q543 151 547 152Q549 153 557 153H561Q580 153 580 144Q580 138 575 117T555 63T523 13Q510 0 491 -8Q483 -10 467 -10Q446 -10 429 -4T402 11T385 29T376 44T374 51L368 45Q362 39 350 30T324 12T288 -4T246 -11Q199 -11 153 12L129 -85Q108 -167 104 -180T92 -202Q76 -216 58 -216Z"></path></g><g data-mml-node="mo" transform="translate(603,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(992,0)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mo" transform="translate(1482,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g></svg></mjx-container>를 생성한다. 이 변환은 신경망을 통해 학습되며, 스타일 이미지의 특징을 캡처하는 데 사용된다.</p></li><li><p>정규화된 콘텐츠 이미지 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.294ex" height="1.857ex" role="img" focusable="false" viewBox="0 -810 572 821"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mover"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(313.8,16) translate(-250 0)"><path data-c="5E" d="M112 560L249 694L257 686Q387 562 387 560L361 531Q359 532 303 581L250 627L195 580Q182 569 169 557T148 538L140 532Q138 530 125 546L112 560Z"></path></g></g></g></g></g></svg></mjx-container>는 스타일 이미지에서 추출된 스케일링 인자와 바이어스 인자를 사용하여 조정된다. 이는 콘텐츠 이미지에 스타일 특성을 입히는 과정이다.</p></li></ol><p><mjx-container class="MathJax" jax="SVG" display="true"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="27.239ex" height="2.398ex" role="img" focusable="false" viewBox="0 -810 12039.7 1060"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mtext"><path data-c="41" d="M255 0Q240 3 140 3Q48 3 39 0H32V46H47Q119 49 139 88Q140 91 192 245T295 553T348 708Q351 716 366 716H376Q396 715 400 709Q402 707 508 390L617 67Q624 54 636 51T687 46H717V0H708Q699 3 581 3Q458 3 437 0H427V46H440Q510 46 510 64Q510 66 486 138L462 209H229L209 150Q189 91 189 85Q189 72 209 59T259 46H264V0H255ZM447 255L345 557L244 256Q244 255 345 255H447Z"></path><path data-c="64" d="M376 495Q376 511 376 535T377 568Q377 613 367 624T316 637H298V660Q298 683 300 683L310 684Q320 685 339 686T376 688Q393 689 413 690T443 693T454 694H457V390Q457 84 458 81Q461 61 472 55T517 46H535V0Q533 0 459 -5T380 -11H373V44L365 37Q307 -11 235 -11Q158 -11 96 50T34 215Q34 315 97 378T244 442Q319 442 376 393V495ZM373 342Q328 405 260 405Q211 405 173 369Q146 341 139 305T131 211Q131 155 138 120T173 59Q203 26 251 26Q322 26 373 103V342Z" transform="translate(750,0)"></path><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(1306,0)"></path><path data-c="49" d="M328 0Q307 3 180 3T32 0H21V46H43Q92 46 106 49T126 60Q128 63 128 342Q128 620 126 623Q122 628 118 630T96 635T43 637H21V683H32Q53 680 180 680T328 683H339V637H317Q268 637 254 634T234 623Q232 620 232 342Q232 63 234 60Q238 55 242 53T264 48T317 46H339V0H328Z" transform="translate(1806,0)"></path><path data-c="4E" d="M42 46Q74 48 94 56T118 69T128 86V634H124Q114 637 52 637H25V683H232L235 680Q237 679 322 554T493 303L578 178V598Q572 608 568 613T544 627T492 637H475V683H483Q498 680 600 680Q706 680 715 683H724V637H707Q634 633 622 598L621 302V6L614 0H600Q585 0 582 3T481 150T282 443T171 605V345L172 86Q183 50 257 46H274V0H265Q250 3 150 3Q48 3 33 0H25V46H42Z" transform="translate(2167,0)"></path></g><g data-mml-node="mo" transform="translate(2917,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(3306,0)"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(3878,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="mi" transform="translate(4322.7,0)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mo" transform="translate(4812.7,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mo" transform="translate(5479.4,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mi" transform="translate(6535.2,0)"><path data-c="1D70E" d="M184 -11Q116 -11 74 34T31 147Q31 247 104 333T274 430Q275 431 414 431H552Q553 430 555 429T559 427T562 425T565 422T567 420T569 416T570 412T571 407T572 401Q572 357 507 357Q500 357 490 357T476 358H416L421 348Q439 310 439 263Q439 153 359 71T184 -11ZM361 278Q361 358 276 358Q152 358 115 184Q114 180 114 178Q106 141 106 117Q106 67 131 47T188 26Q242 26 287 73Q316 103 334 153T356 233T361 278Z"></path></g><g data-mml-node="mo" transform="translate(7106.2,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(7495.2,0)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mo" transform="translate(7985.2,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(8374.2,0)"><g data-mml-node="mover"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(313.8,16) translate(-250 0)"><path data-c="5E" d="M112 560L249 694L257 686Q387 562 387 560L361 531Q359 532 303 581L250 627L195 580Q182 569 169 557T148 538L140 532Q138 530 125 546L112 560Z"></path></g></g></g><g data-mml-node="mo" transform="translate(9168.4,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"></path></g><g data-mml-node="mi" transform="translate(10168.7,0)"><path data-c="1D707" d="M58 -216Q44 -216 34 -208T23 -186Q23 -176 96 116T173 414Q186 442 219 442Q231 441 239 435T249 423T251 413Q251 401 220 279T187 142Q185 131 185 107V99Q185 26 252 26Q261 26 270 27T287 31T302 38T315 45T327 55T338 65T348 77T356 88T365 100L372 110L408 253Q444 395 448 404Q461 431 491 431Q504 431 512 424T523 412T525 402L449 84Q448 79 448 68Q448 43 455 35T476 26Q485 27 496 35Q517 55 537 131Q543 151 547 152Q549 153 557 153H561Q580 153 580 144Q580 138 575 117T555 63T523 13Q510 0 491 -8Q483 -10 467 -10Q446 -10 429 -4T402 11T385 29T376 44T374 51L368 45Q362 39 350 30T324 12T288 -4T246 -11Q199 -11 153 12L129 -85Q108 -167 104 -180T92 -202Q76 -216 58 -216Z"></path></g><g data-mml-node="mo" transform="translate(10771.7,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(11160.7,0)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mo" transform="translate(11650.7,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g></svg></mjx-container></p><p><mjx-container class="MathJax" jax="SVG" display="true"><svg style="vertical-align: -2.172ex;" xmlns="http://www.w3.org/2000/svg" width="38.974ex" height="5.475ex" role="img" focusable="false" viewBox="0 -1460 17226.7 2420"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mtext"><path data-c="41" d="M255 0Q240 3 140 3Q48 3 39 0H32V46H47Q119 49 139 88Q140 91 192 245T295 553T348 708Q351 716 366 716H376Q396 715 400 709Q402 707 508 390L617 67Q624 54 636 51T687 46H717V0H708Q699 3 581 3Q458 3 437 0H427V46H440Q510 46 510 64Q510 66 486 138L462 209H229L209 150Q189 91 189 85Q189 72 209 59T259 46H264V0H255ZM447 255L345 557L244 256Q244 255 345 255H447Z"></path><path data-c="64" d="M376 495Q376 511 376 535T377 568Q377 613 367 624T316 637H298V660Q298 683 300 683L310 684Q320 685 339 686T376 688Q393 689 413 690T443 693T454 694H457V390Q457 84 458 81Q461 61 472 55T517 46H535V0Q533 0 459 -5T380 -11H373V44L365 37Q307 -11 235 -11Q158 -11 96 50T34 215Q34 315 97 378T244 442Q319 442 376 393V495ZM373 342Q328 405 260 405Q211 405 173 369Q146 341 139 305T131 211Q131 155 138 120T173 59Q203 26 251 26Q322 26 373 103V342Z" transform="translate(750,0)"></path><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(1306,0)"></path><path data-c="49" d="M328 0Q307 3 180 3T32 0H21V46H43Q92 46 106 49T126 60Q128 63 128 342Q128 620 126 623Q122 628 118 630T96 635T43 637H21V683H32Q53 680 180 680T328 683H339V637H317Q268 637 254 634T234 623Q232 620 232 342Q232 63 234 60Q238 55 242 53T264 48T317 46H339V0H328Z" transform="translate(1806,0)"></path><path data-c="4E" d="M42 46Q74 48 94 56T118 69T128 86V634H124Q114 637 52 637H25V683H232L235 680Q237 679 322 554T493 303L578 178V598Q572 608 568 613T544 627T492 637H475V683H483Q498 680 600 680Q706 680 715 683H724V637H707Q634 633 622 598L621 302V6L614 0H600Q585 0 582 3T481 150T282 443T171 605V345L172 86Q183 50 257 46H274V0H265Q250 3 150 3Q48 3 33 0H25V46H42Z" transform="translate(2167,0)"></path></g><g data-mml-node="mo" transform="translate(2917,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="msub" transform="translate(3306,0)"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mi" transform="translate(605,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="mo" transform="translate(4205,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="mi" transform="translate(4649.6,0)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mo" transform="translate(5139.6,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mo" transform="translate(5806.4,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="msub" transform="translate(6862.2,0)"><g data-mml-node="mi"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="TeXAtom" transform="translate(523,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D460" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z"></path></g><g data-mml-node="mo" transform="translate(469,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="mi" transform="translate(747,0)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g></g><g data-mml-node="mrow" transform="translate(8374,0)"><g data-mml-node="mo" transform="translate(0 -0.5)"><path data-c="28" d="M701 -940Q701 -943 695 -949H664Q662 -947 636 -922T591 -879T537 -818T475 -737T412 -636T350 -511T295 -362T250 -186T221 17T209 251Q209 962 573 1361Q596 1386 616 1405T649 1437T664 1450H695Q701 1444 701 1441Q701 1436 681 1415T629 1356T557 1261T476 1118T400 927T340 675T308 359Q306 321 306 250Q306 -139 400 -430T690 -924Q701 -936 701 -940Z"></path></g><g data-mml-node="mfrac" transform="translate(736,0)"><g data-mml-node="mrow" transform="translate(220,710)"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mi" transform="translate(605,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="mo" transform="translate(1121.2,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="mi" transform="translate(2121.4,0)"><path data-c="1D707" d="M58 -216Q44 -216 34 -208T23 -186Q23 -176 96 116T173 414Q186 442 219 442Q231 441 239 435T249 423T251 413Q251 401 220 279T187 142Q185 131 185 107V99Q185 26 252 26Q261 26 270 27T287 31T302 38T315 45T327 55T338 65T348 77T356 88T365 100L372 110L408 253Q444 395 448 404Q461 431 491 431Q504 431 512 424T523 412T525 402L449 84Q448 79 448 68Q448 43 455 35T476 26Q485 27 496 35Q517 55 537 131Q543 151 547 152Q549 153 557 153H561Q580 153 580 144Q580 138 575 117T555 63T523 13Q510 0 491 -8Q483 -10 467 -10Q446 -10 429 -4T402 11T385 29T376 44T374 51L368 45Q362 39 350 30T324 12T288 -4T246 -11Q199 -11 153 12L129 -85Q108 -167 104 -180T92 -202Q76 -216 58 -216Z"></path></g><g data-mml-node="mo" transform="translate(2724.4,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="msub" transform="translate(3113.4,0)"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mi" transform="translate(605,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="mo" transform="translate(4012.3,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g><g data-mml-node="mrow" transform="translate(1296.7,-710)"><g data-mml-node="mi"><path data-c="1D70E" d="M184 -11Q116 -11 74 34T31 147Q31 247 104 333T274 430Q275 431 414 431H552Q553 430 555 429T559 427T562 425T565 422T567 420T569 416T570 412T571 407T572 401Q572 357 507 357Q500 357 490 357T476 358H416L421 348Q439 310 439 263Q439 153 359 71T184 -11ZM361 278Q361 358 276 358Q152 358 115 184Q114 180 114 178Q106 141 106 117Q106 67 131 47T188 26Q242 26 287 73Q316 103 334 153T356 233T361 278Z"></path></g><g data-mml-node="mo" transform="translate(571,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="msub" transform="translate(960,0)"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mi" transform="translate(605,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="mo" transform="translate(1859,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g><rect width="4601.3" height="60" x="120" y="220"></rect></g><g data-mml-node="mo" transform="translate(5577.3,0) translate(0 -0.5)"><path data-c="29" d="M34 1438Q34 1446 37 1448T50 1450H56H71Q73 1448 99 1423T144 1380T198 1319T260 1238T323 1137T385 1013T440 864T485 688T514 485T526 251Q526 134 519 53Q472 -519 162 -860Q139 -885 119 -904T86 -936T71 -949H56Q43 -949 39 -947T34 -937Q88 -883 140 -813Q428 -430 428 251Q428 453 402 628T338 922T245 1146T145 1309T46 1425Q44 1427 42 1429T39 1433T36 1436L34 1438Z"></path></g></g><g data-mml-node="mo" transform="translate(14909.6,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"></path></g><g data-mml-node="msub" transform="translate(15909.8,0)"><g data-mml-node="mi"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="TeXAtom" transform="translate(523,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D44F" d="M73 647Q73 657 77 670T89 683Q90 683 161 688T234 694Q246 694 246 685T212 542Q204 508 195 472T180 418L176 399Q176 396 182 402Q231 442 283 442Q345 442 383 396T422 280Q422 169 343 79T173 -11Q123 -11 82 27T40 150V159Q40 180 48 217T97 414Q147 611 147 623T109 637Q104 637 101 637H96Q86 637 83 637T76 640T73 647ZM336 325V331Q336 405 275 405Q258 405 240 397T207 376T181 352T163 330L157 322L136 236Q114 150 114 114Q114 66 138 42Q154 26 178 26Q211 26 245 58Q270 81 285 114T318 219Q336 291 336 325Z"></path></g><g data-mml-node="mo" transform="translate(429,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="mi" transform="translate(707,0)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g></g></g></g></svg></mjx-container><br>AdaIN은 Instance Normalization을 기반으로 하며, 각 인스턴스와 채널별로 스타일 인자들이 적용된다. 이를 통해 콘텐츠 이미지는 원래의 구조를 유지하면서 스타일 이미지의 특성을 획득한다. 학습 가능한 Affine 변환은 스타일 이미지로부터 복잡한 스타일 특징을 추출하고, 이를 콘텐츠 이미지에 효과적으로 적용할 수 있게 한다. 이 과정은 신경망을 통해 자동으로 이루어지며, 다양한 스타일의 이미지에 대해 유연하게 적용될 수 있다.</p><p>Fig. 1b에서 AdaIN에 주어지는 style은 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.62ex" height="1.027ex" role="img" focusable="false" viewBox="0 -443 716 454"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D464" d="M580 385Q580 406 599 424T641 443Q659 443 674 425T690 368Q690 339 671 253Q656 197 644 161T609 80T554 12T482 -11Q438 -11 404 5T355 48Q354 47 352 44Q311 -11 252 -11Q226 -11 202 -5T155 14T118 53T104 116Q104 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 293 29 315T52 366T96 418T161 441Q204 441 227 416T250 358Q250 340 217 250T184 111Q184 65 205 46T258 26Q301 26 334 87L339 96V119Q339 122 339 128T340 136T341 143T342 152T345 165T348 182T354 206T362 238T373 281Q402 395 406 404Q419 431 449 431Q468 431 475 421T483 402Q483 389 454 274T422 142Q420 131 420 107V100Q420 85 423 71T442 42T487 26Q558 26 600 148Q609 171 620 213T632 273Q632 306 619 325T593 357T580 385Z"></path></g></g></g></svg></mjx-container>를 Affine 변환을 통해 style 정보인 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="10.921ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 4827.2 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mo" transform="translate(767.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mo" transform="translate(1823.6,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="msub" transform="translate(2212.6,0)"><g data-mml-node="mi"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mi" transform="translate(523,-150) scale(0.707)"><path data-c="1D460" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z"></path></g></g><g data-mml-node="mo" transform="translate(3117.2,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="msub" transform="translate(3561.9,0)"><g data-mml-node="mi"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mi" transform="translate(523,-150) scale(0.707)"><path data-c="1D44F" d="M73 647Q73 657 77 670T89 683Q90 683 161 688T234 694Q246 694 246 685T212 542Q204 508 195 472T180 418L176 399Q176 396 182 402Q231 442 283 442Q345 442 383 396T422 280Q422 169 343 79T173 -11Q123 -11 82 27T40 150V159Q40 180 48 217T97 414Q147 611 147 623T109 637Q104 637 101 637H96Q86 637 83 637T76 640T73 647ZM336 325V331Q336 405 275 405Q258 405 240 397T207 376T181 352T163 330L157 322L136 236Q114 150 114 114Q114 66 138 42Q154 26 178 26Q211 26 245 58Q270 81 285 114T318 219Q336 291 336 325Z"></path></g></g><g data-mml-node="mo" transform="translate(4438.2,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g></svg></mjx-container>로 변환되어 scaling factor와 bias factor로 주어진다.</p><p>AD_HERE</p><h3 id="2-4-Constant-Input"><a href="#2-4-Constant-Input" class="headerlink" title="2.4 Constant Input"></a>2.4 Constant Input</h3><p>style-based generator는 w를 입력으로 받기 때문에, 더이상 PGGAN이나 다른 GAN과 같이 z에서 convolution연산을 하지 않아도 된다. 때문에 synthesis network는 4x4x512 contant tensor에서 부터 시작한다.</p><p>기존처럼 randome noise에서부터 바로 네트워크를 통해 이미지를 생성하는것은 비교적으로 학습하기 어려워, 학습된 초기 4x4영상의 constant를 사용하면 더 쉽게 수렴할 수 있다.</p><h3 id="2-5-Noise-Injection-Stochastic-Variation"><a href="#2-5-Noise-Injection-Stochastic-Variation" class="headerlink" title="2.5 Noise Injection (Stochastic Variation)"></a>2.5 Noise Injection (Stochastic Variation)</h3><p><img src="/img/stylegan/img3.png" alt="Untitled"><br>Fig. 3. Results of Noise Injection</p><p>생성된 이미지가 사실적이면서도 다채로운(다양한) 이미미지를 생성하기 위해 특정 noise를 주입한다. 이 noise는 예를들어 사람 얼굴에서 머리카락이나 수염, 모공등과 같이 stochastic한 특성을 가지는 부분들이 다양하게 나타날 수 있도록 다양성을 증대시키는데 도움을 준다. Fig. 1b의 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="1.717ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 759 683"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D435" d="M231 637Q204 637 199 638T194 649Q194 676 205 682Q206 683 335 683Q594 683 608 681Q671 671 713 636T756 544Q756 480 698 429T565 360L555 357Q619 348 660 311T702 219Q702 146 630 78T453 1Q446 0 242 0Q42 0 39 2Q35 5 35 10Q35 17 37 24Q42 43 47 45Q51 46 62 46H68Q95 46 128 49Q142 52 147 61Q150 65 219 339T288 628Q288 635 231 637ZM649 544Q649 574 634 600T585 634Q578 636 493 637Q473 637 451 637T416 636H403Q388 635 384 626Q382 622 352 506Q352 503 351 500L320 374H401Q482 374 494 376Q554 386 601 434T649 544ZM595 229Q595 273 572 302T512 336Q506 337 429 337Q311 337 310 336Q310 334 293 263T258 122L240 52Q240 48 252 48T333 46Q422 46 429 47Q491 54 543 105T595 229Z"></path></g></g></g></svg></mjx-container> 영역이 Noise Injection에 해당한다.</p><p>Fig. 3b, Fig.3c와 같이 Fiig. 3a이미지에 대해 다양한 noise를 주입한 결과로 높은 다양성을 가지는것을 확인할 수 있다.</p><h2 id="3-Disentanglement-Measure"><a href="#3-Disentanglement-Measure" class="headerlink" title="3. Disentanglement Measure"></a>3. Disentanglement Measure</h2><blockquote><p>추후 업데이트 예정입니다.</p></blockquote>]]></content:encoded>
<comments>http://techbless.github.io/2023/12/08/style-gan/#disqus_thread</comments>
</item>
<item>
<title>[논문 리뷰] Progressive Growing of GANs for Improved Quality, Stability, and Variation</title>
<link>http://techbless.github.io/2023/11/19/progressive-growing-of-gans-%EC%9A%94%EC%95%BD/</link>
<guid>http://techbless.github.io/2023/11/19/progressive-growing-of-gans-%EC%9A%94%EC%95%BD/</guid>
<pubDate>Sun, 19 Nov 2023 14:33:22 GMT</pubDate>
<description>
<h1 id="Progressive-Growing-of-GANs-for-Improved-Quality-Stability-and-Variation-논문-리뷰"><a href="#Progressive-Growing-of-GANs-for-Improved-Q
</description>
<content:encoded><![CDATA[<h1 id="Progressive-Growing-of-GANs-for-Improved-Quality-Stability-and-Variation-논문-리뷰"><a href="#Progressive-Growing-of-GANs-for-Improved-Quality-Stability-and-Variation-논문-리뷰" class="headerlink" title="Progressive Growing of GANs for Improved Quality, Stability, and Variation 논문 리뷰"></a>Progressive Growing of GANs for Improved Quality, Stability, and Variation 논문 리뷰</h1><p>링크: <a href="https://arxiv.org/pdf/1710.10196.pdf">https://arxiv.org/pdf/1710.10196.pdf</a><br>저널|학회: ICLR 2018<br>연구목적: 고해상도 이미지 생성, 안정적 학습<br>연구방법: 저해상도의 레이어부터 점진적으로 쌓아 고해상도 생성<br>데이터셋: CELEB A HQ<br>주요결과: high resolution, x2–6 Faster converge,CelebA HQ 데이터셋 제시<br>저자: Tero Karras et al.</p><h2 id="1-Introduction"><a href="#1-Introduction" class="headerlink" title="1. Introduction"></a>1. Introduction</h2><blockquote><p>이 연구는 proGAN혹은 PG-GAN으로 더 잘 알려져 있습니다.</p></blockquote><p>GAN을 이용하여 <strong>고해상도의 이미지를 생성하는 것은 아주 어려운 태스크이다.</strong> 고해상도의 이미지를 생성하도록 generator를 학습시키는 경우 학습 이미지의 <strong>distribution과 학습 결과 생성된 이미지의 distribution의 차이가 커진다</strong>. 또한 고해상도의 이미지는 같은 자원에서 저해상도의 이미지보다 <strong>적은 배치사이즈를 가져가게 하는데, 이는 불안정한 학습을 야기한</strong>다. 이러한 상황에서 본 논문에서는 generator와 discriminator를 저해상도의 이미지로부터 고해상도의 이미지로까지 layer들을 추가하면서 점진적으로 커지게 한다. 이를 통해 학습 속도를 향상시키고 고해상도에서도 안정적인 학습을 가능하게 한다.</p><h2 id="2-Progressive-Growing-of-GANs"><a href="#2-Progressive-Growing-of-GANs" class="headerlink" title="2. Progressive Growing of GANs"></a>2. Progressive Growing of GANs</h2><p><img src="/img/progan/Untitled.png" alt="Untitled"></p><p>GAN을 학습시킬때 저해상도의 이미지부터 고해상도의 이미지까지 점진적으로 레이어를 추가하며 학습해 최종적으로 고해상도까지 도달한다. 저해상도에서는 전체적인(large-scale) 구조를, 고해상도로 갈수록 더 디테일한(finer scale detail) 구조를 학습한다. 이러한 구조는 1) 학습 초기의 더 높은 안정성 2) 훨씬 단순한 질문을 지속적으로 제시 3) 훈련시간 감소의 이점을 가진다. 그 이유는 다음과 같다.</p><ol><li>학습 초기의 더 높은 안정성<ol><li>초기에는 클래스 정보가 적고 모드(mode)가 적기 때문에 작은 이미지를 생성하는 것이 훨씬 더 안정적이다.</li></ol></li><li>훨씬 단순한 질문을 지속적으로 제시<ol><li>해상도를 조금씩 높임으로써 예를 들어 잠재 벡터에서 높은 해상도의 이미지로의 매핑을 발견하는 최종 목표와 비교해 훨씬 간단한 질문을 제시한다.</li></ol></li><li>훈련시간 감소<ol><li>대부분의 반복 작업이 낮은 해상도에서 수행되며 점진적으로 세밀한 디테일로 초점을 옮기기 때문에, 종종 최종 출력 해상도에 따라 2~6배 더 빠른 속도로 비슷한 결과 품질을 얻을 수 있다.</li></ol></li></ol><h3 id="Doubling-the-resolution-of-the-G"><a href="#Doubling-the-resolution-of-the-G" class="headerlink" title="Doubling the resolution of the G"></a>Doubling the resolution of the G</h3><p><img src="/img/progan/Untitled%201.png" alt="Untitled"></p><p>G와 D의 해상도를 증가시키는 과정에서 잘 학습된 레이어에 새로운 레이어가 추가되면서 갑작스러운 변화로 인해 충격이 생겨 이전 layer까지 안좋은 영향을 줄 수 있기 때문에 부드럽게 레이어를 추가하는 방법이 필요하다.</p><p>새로운 레이어가 부드럽게 추가될 수 있도록 하기 위해 전환 과정에서 위 그림의 (b)가 나타내듯이, Residual Block처럼 구성해 16x16 레이어가 만든 이미지를 2배(D에서는 0.5배)로 키운 것과 interpolate한다. 어느정도 형태를 가진 이미지를 보여주어 저해상도 레이어가 학습된 방향을 잘 유지하면서 새로운 레이어를 추가한다. 합쳐지는 두 이미지에는 α와 1−α가 곱해져 더해지며, 학습이 진행되면서 α가 0에서 부터 1까지 커지면서 이전 layer의 영향을 점차 줄여간다. 이 방법으로 새로운 레이어가 추가되는 과정에서의 충격을 완화할 수 있다.</p><p>여기서 fromRGB와 toRGB는 1x1 conv레이어를 이용하여 feature 채널을 RGB 채널로 projection하는 부수적인 layer이다.</p><blockquote><p>이러한 구조는 StyleGAN2 부터는 사용하지 않는다.</p></blockquote><p>AD_HERE</p><h2 id="Increasing-Variation-using-Minibatch-Standard-Deviation"><a href="#Increasing-Variation-using-Minibatch-Standard-Deviation" class="headerlink" title="Increasing Variation using Minibatch Standard Deviation"></a>Increasing Variation using Minibatch Standard Deviation</h2><p>GAN은 training data에서 subset of the variation만 포착하는 경향이 있는데, 그 해결책이 Salimans et al.이 제안하는 <code>mini-batch discrimination</code>이다 PGGAN에서는 모드 붕괴(mode collapse)를 완화하기 위해 <code>mini-batch discrimination</code>을 사용한다. 이를 통해 feature statistics를 개별 이미지 뿐만이 아니라 mini-batch에서도 계산하여 generated/training image minibatch의 statistics가 비슷하게 가지도록 한다. </p><ol><li>각 mini-batch의 각 spatial location에서 각각의 feature들의 standard deviation을 계산한다. (Input: NxCxHxW) -> (Output: CxHxW)</li><li>모든 feature들과 spatial location에 대한 평균을 추정하고 하나의 값으로 표현한다. (Input: CxHxW) -> (Output: 1xHxW)</li></ol><ol start="3"><li>이 값을 복제하여 mini-batch들에 대응하는 모든 spatial location들에 추가적인 constant feature map을 생성한 것을 concat한다.</li></ol><p><img src="/img/progan/Untitled%202.png" alt="Untitled"></p><blockquote><p>이 값을 discriminator 어디에나 추가해도 되지만 보통은 맨 뒤에 추가한다<br>이 방식은 learnable parameter나 새로운 hyperparameter가 필요하지 않다. (단순함)</p></blockquote><h2 id="Normalization-in-Generator-and-Discriminator"><a href="#Normalization-in-Generator-and-Discriminator" class="headerlink" title="Normalization in Generator and Discriminator"></a><strong>Normalization in Generator and Discriminator</strong></h2><p>GAN은 G와 D의 비정상적인(G와 D의 학습속도가 다른) 경쟁에 의해 발생하는 gradient에 취약하다. 기존에는 batch normalization을 추가하는 등의 방법을 사용하였지만, 본 논문에서는 이러한 signal을 직접적으로 규제하는 방법을 제안한다. 그 방법은 아래와 같다.</p><h2 id="Equalized-Learning"><a href="#Equalized-Learning" class="headerlink" title="Equalized Learning"></a>Equalized Learning</h2><p><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="0.98ex" height="1.025ex" role="img" focusable="false" viewBox="0 -442 433 453"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D450" d="M34 159Q34 268 120 355T306 442Q362 442 394 418T427 355Q427 326 408 306T360 285Q341 285 330 295T319 325T330 359T352 380T366 386H367Q367 388 361 392T340 400T306 404Q276 404 249 390Q228 381 206 359Q162 315 142 235T121 119Q121 73 147 50Q169 26 205 26H209Q321 26 394 111Q403 121 406 121Q410 121 419 112T429 98T420 83T391 55T346 25T282 0T202 -11Q127 -11 81 37T34 159Z"></path></g></g></g></svg></mjx-container>는 He’s initializer에서 제안된 per-layer normalization constant이다. Gaussian Distributaion <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="7.038ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 3110.7 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z"></path></g><g data-mml-node="mo" transform="translate(888,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mn" transform="translate(1277,0)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z"></path></g><g data-mml-node="mo" transform="translate(1777,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="mn" transform="translate(2221.7,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g><g data-mml-node="mo" transform="translate(2721.7,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g></svg></mjx-container>으로 초기화 한후, runtime에서 weight를 스케일링한다.</p><p><mjx-container class="MathJax" jax="SVG" display="true"><svg style="vertical-align: -1.577ex;" xmlns="http://www.w3.org/2000/svg" width="8.732ex" height="4.109ex" role="img" focusable="false" viewBox="0 -1119 3859.5 1816"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mover"><g data-mml-node="mi"><path data-c="1D464" d="M580 385Q580 406 599 424T641 443Q659 443 674 425T690 368Q690 339 671 253Q656 197 644 161T609 80T554 12T482 -11Q438 -11 404 5T355 48Q354 47 352 44Q311 -11 252 -11Q226 -11 202 -5T155 14T118 53T104 116Q104 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 293 29 315T52 366T96 418T161 441Q204 441 227 416T250 358Q250 340 217 250T184 111Q184 65 205 46T258 26Q301 26 334 87L339 96V119Q339 122 339 128T340 136T341 143T342 152T345 165T348 182T354 206T362 238T373 281Q402 395 406 404Q419 431 449 431Q468 431 475 421T483 402Q483 389 454 274T422 142Q420 131 420 107V100Q420 85 423 71T442 42T487 26Q558 26 600 148Q609 171 620 213T632 273Q632 306 619 325T593 357T580 385Z"></path></g><g data-mml-node="mo" transform="translate(441.3,17) translate(-250 0)"><path data-c="5E" d="M112 560L249 694L257 686Q387 562 387 560L361 531Q359 532 303 581L250 627L195 580Q182 569 169 557T148 538L140 532Q138 530 125 546L112 560Z"></path></g></g></g><g data-mml-node="mi" transform="translate(749,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="mo" transform="translate(1320.7,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mfrac" transform="translate(2376.5,0)"><g data-mml-node="msub" transform="translate(220,676)"><g data-mml-node="mi"><path data-c="1D464" d="M580 385Q580 406 599 424T641 443Q659 443 674 425T690 368Q690 339 671 253Q656 197 644 161T609 80T554 12T482 -11Q438 -11 404 5T355 48Q354 47 352 44Q311 -11 252 -11Q226 -11 202 -5T155 14T118 53T104 116Q104 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 293 29 315T52 366T96 418T161 441Q204 441 227 416T250 358Q250 340 217 250T184 111Q184 65 205 46T258 26Q301 26 334 87L339 96V119Q339 122 339 128T340 136T341 143T342 152T345 165T348 182T354 206T362 238T373 281Q402 395 406 404Q419 431 449 431Q468 431 475 421T483 402Q483 389 454 274T422 142Q420 131 420 107V100Q420 85 423 71T442 42T487 26Q558 26 600 148Q609 171 620 213T632 273Q632 306 619 325T593 357T580 385Z"></path></g><g data-mml-node="mi" transform="translate(749,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="mi" transform="translate(525,-686)"><path data-c="1D450" d="M34 159Q34 268 120 355T306 442Q362 442 394 418T427 355Q427 326 408 306T360 285Q341 285 330 295T319 325T330 359T352 380T366 386H367Q367 388 361 392T340 400T306 404Q276 404 249 390Q228 381 206 359Q162 315 142 235T121 119Q121 73 147 50Q169 26 205 26H209Q321 26 394 111Q403 121 406 121Q410 121 419 112T429 98T420 83T391 55T346 25T282 0T202 -11Q127 -11 81 37T34 159Z"></path></g><rect width="1243" height="60" x="120" y="220"></rect></g></g></g></svg></mjx-container></p><p>기존의 RMSProp이나 Adam과 같은 adaptive SGD 방식은 scale에 불변한 상태로 추정 표준 편차를 이용하여 gradient를 업데이트하는데, 그 결과 상대적으로 큰 dynamic range를 가지는 일부 파라미터들에 대해 적응하는데 더 많은 시간이 필요하다. 즉, 동일한 dynamic range를 가질 수 있도록 weights를 수정하여 동일한 학습 속도를 보장한다.</p><blockquote><p>모든 weights들이 동일한 dynamic range를 가짐 -> 동일한 learning speed를 보장</p></blockquote><h2 id="Pixelwise-Feature-Vector-Normalization-in-Generator"><a href="#Pixelwise-Feature-Vector-Normalization-in-Generator" class="headerlink" title="Pixelwise Feature Vector Normalization in Generator"></a>Pixelwise Feature Vector Normalization in Generator</h2><p>G와 D 간의 경쟁으로 두 네트워크의 magnitude가 통제 불능의 상태가 되는 시나리오를 막기 위해 G에서 conv이후에 pixel 마다의 feature vector를 unit length로 normalize한다. 이걸 Local Response Normalization을 통해 하였고, 그 식은 아래와 같다.</p><p><mjx-container class="MathJax" jax="SVG" display="true"><svg style="vertical-align: -4.118ex;" xmlns="http://www.w3.org/2000/svg" width="27.035ex" height="6.823ex" role="img" focusable="false" viewBox="0 -1196 11949.4 3016"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D44F" d="M73 647Q73 657 77 670T89 683Q90 683 161 688T234 694Q246 694 246 685T212 542Q204 508 195 472T180 418L176 399Q176 396 182 402Q231 442 283 442Q345 442 383 396T422 280Q422 169 343 79T173 -11Q123 -11 82 27T40 150V159Q40 180 48 217T97 414Q147 611 147 623T109 637Q104 637 101 637H96Q86 637 83 637T76 640T73 647ZM336 325V331Q336 405 275 405Q258 405 240 397T207 376T181 352T163 330L157 322L136 236Q114 150 114 114Q114 66 138 42Q154 26 178 26Q211 26 245 58Q270 81 285 114T318 219Q336 291 336 325Z"></path></g><g data-mml-node="TeXAtom" transform="translate(462,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(572,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="mi" transform="translate(850,0)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g></g></g><g data-mml-node="mo" transform="translate(1737.3,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mfrac" transform="translate(2793.1,0)"><g data-mml-node="msub" transform="translate(3798.4,755)"><g data-mml-node="mi"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z"></path></g><g data-mml-node="TeXAtom" transform="translate(562,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(572,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="mi" transform="translate(850,0)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g></g></g><g data-mml-node="msqrt" transform="translate(220,-1354.3)"><g transform="translate(1020,0)"><g data-mml-node="mfrac"><g data-mml-node="mn" transform="translate(357.2,394) scale(0.707)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g><g data-mml-node="mi" transform="translate(220,-345) scale(0.707)"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z"></path></g><rect width="827.9" height="60" x="120" y="220"></rect></g><g data-mml-node="munderover" transform="translate(1234.6,0)"><g data-mml-node="mo"><path data-c="2211" d="M61 748Q64 750 489 750H913L954 640Q965 609 976 579T993 533T999 516H979L959 517Q936 579 886 621T777 682Q724 700 655 705T436 710H319Q183 710 183 709Q186 706 348 484T511 259Q517 250 513 244L490 216Q466 188 420 134T330 27L149 -187Q149 -188 362 -188Q388 -188 436 -188T506 -189Q679 -189 778 -162T936 -43Q946 -27 959 6H999L913 -249L489 -250Q65 -250 62 -248Q56 -246 56 -239Q56 -234 118 -161Q186 -81 245 -11L428 206Q428 207 242 462L57 717L56 728Q56 744 61 748Z"></path></g><g data-mml-node="TeXAtom" transform="translate(1089,477.1) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z"></path></g><g data-mml-node="mo" transform="translate(888,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="mn" transform="translate(1666,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g></g><g data-mml-node="TeXAtom" transform="translate(1089,-285.4) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D457" d="M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z"></path></g><g data-mml-node="mo" transform="translate(412,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mn" transform="translate(1190,0)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z"></path></g></g></g><g data-mml-node="msup" transform="translate(4071.8,0)"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="msubsup"><g data-mml-node="mi"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z"></path></g><g data-mml-node="mi" transform="translate(562,497.8) scale(0.707)"><path data-c="1D457" d="M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z"></path></g><g data-mml-node="TeXAtom" transform="translate(562,-138.9) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(572,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="mi" transform="translate(850,0)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g></g></g></g><g data-mml-node="mn" transform="translate(1592.5,692.3) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z"></path></g></g><g data-mml-node="mo" transform="translate(6290.1,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"></path></g><g data-mml-node="mi" transform="translate(7290.4,0)"><path data-c="1D716" d="M227 -11Q149 -11 95 41T40 174Q40 262 87 322Q121 367 173 396T287 430Q289 431 329 431H367Q382 426 382 411Q382 385 341 385H325H312Q191 385 154 277L150 265H327Q340 256 340 246Q340 228 320 219H138V217Q128 187 128 143Q128 77 160 52T231 26Q258 26 284 36T326 57T343 68Q350 68 354 58T358 39Q358 36 357 35Q354 31 337 21T289 0T227 -11Z"></path></g></g><g data-mml-node="mo" transform="translate(0,184.3)"><path data-c="221A" d="M1001 1150Q1017 1150 1020 1132Q1020 1127 741 244L460 -643Q453 -650 436 -650H424Q423 -647 423 -645T421 -640T419 -631T415 -617T408 -594T399 -560T385 -512T367 -448T343 -364T312 -259L203 119L138 41L111 67L212 188L264 248L472 -474L983 1140Q988 1150 1001 1150Z"></path></g><rect width="7696.4" height="60" x="1020" y="1274.3"></rect></g><rect width="8916.4" height="60" x="120" y="220"></rect></g></g></g></svg></mjx-container></p><ul><li><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="2.009ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 888 683"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z"></path></g></g></g></svg></mjx-container>: feature map의 개수</li><li><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.667ex;" xmlns="http://www.w3.org/2000/svg" width="3.528ex" height="1.665ex" role="img" focusable="false" viewBox="0 -441 1559.5 736"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z"></path></g><g data-mml-node="TeXAtom" transform="translate(562,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(572,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="mi" transform="translate(850,0)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g></g></g></g></g></svg></mjx-container>: pixel<mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="5.169ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 2284.7 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(389,0)"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(961,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="mi" transform="translate(1405.7,0)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mo" transform="translate(1895.7,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g></svg></mjx-container>의 원래 feature vector</li><li><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.667ex;" xmlns="http://www.w3.org/2000/svg" width="3.302ex" height="2.237ex" role="img" focusable="false" viewBox="0 -694 1459.5 989"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D44F" d="M73 647Q73 657 77 670T89 683Q90 683 161 688T234 694Q246 694 246 685T212 542Q204 508 195 472T180 418L176 399Q176 396 182 402Q231 442 283 442Q345 442 383 396T422 280Q422 169 343 79T173 -11Q123 -11 82 27T40 150V159Q40 180 48 217T97 414Q147 611 147 623T109 637Q104 637 101 637H96Q86 637 83 637T76 640T73 647ZM336 325V331Q336 405 275 405Q258 405 240 397T207 376T181 352T163 330L157 322L136 236Q114 150 114 114Q114 66 138 42Q154 26 178 26Q211 26 245 58Q270 81 285 114T318 219Q336 291 336 325Z"></path></g><g data-mml-node="TeXAtom" transform="translate(462,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(572,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="mi" transform="translate(850,0)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g></g></g></g></g></svg></mjx-container>: normalized된 feature vector</li></ul><blockquote><p>이 방식은 G에 해로워 보이지 않았고, 오히려 효과적으로 signal magnitude 상승을 방지한다.</p></blockquote><p>AD_HERE</p><h2 id="Multi-scale-Statistical-Similarity-for-Assessing-GAN-Results"><a href="#Multi-scale-Statistical-Similarity-for-Assessing-GAN-Results" class="headerlink" title="Multi-scale Statistical Similarity for Assessing GAN Results"></a>Multi-scale Statistical Similarity for Assessing GAN Results</h2><p>GAN을 평가할때 사용되던 MS-SSIM은 큰 규모의 mode collapse는 잘 포착하지만 색상이나 질감의 변화 손실과 같은 더 작은 변화는 잘 포착하지 못한다고 한다. 따라서 본 논문에서는 G는 training set이 모든 scale에서 유사한 샘플을 생성해야한다는 영감하에 Laplacian pyramid로 부터 뽑힌 local image patch 분포들 간의 멀티 스케일 통계적 유사성을 고려하는 연구 방법을 제안한다.</p><ol><li>Training set과 Generated set으로 부터 각각 local image patch를 얻는다.</li><li>각 색 채널별 평균과 표준편차로 normalize한다.</li><li>이후 sliced Wasserstein distance(SWD)를 통해 계산한 통계적 유사성을 추정한다.</li></ol><p>작은 Wasserstein distance는 패치들간 유사도가 높다는 것을 의미한다.</p><h2 id="Experiments"><a href="#Experiments" class="headerlink" title="Experiments"></a>Experiments</h2><h3 id="Importance-of-Individual-Contributions-in-terms-of-Statistical-Similarity"><a href="#Importance-of-Individual-Contributions-in-terms-of-Statistical-Similarity" class="headerlink" title="Importance of Individual Contributions in terms of Statistical Similarity"></a>Importance of Individual Contributions in terms of Statistical Similarity</h3><p>본 논문에서는 SWD와 MS-SSIM을 성능을 측정하기 위해 사용하였다.<br><img src="/img/progan/Untitled%204.png" alt="Untitled"><br><img src="/img/progan/Untitled%205.png" alt="Untitled"></p><p>(a)는 (h)보다 더 나쁜 이미지를 생성하고 있지만, MS-SSIM을 사용한 측정 결과 두 이미지 간에 큰 차이가 없었다. 반면에 SWD는 두 이미지 간에 큰 차이를 보여주었다. 이는 SWD가 MS-SSIM과 달리 색상, 질감, 시점 등의 다양성을 잘 포착하고 있음을 나타낸다.</p><p>고해상도 이미지를 처리하기 위해 (c)에서는 배치 크기를 64에서 16으로 줄였다. 그 결과 생성된 이미지가 매우 불안정해졌으나, (d)에서 BatchNorm이나 LinearNorm을 제거하는 등 훈련 매개변수를 수정한 후에는 학습이 안정적으로 진행되었다. (e*)에서는 Salimans et al.의 미니배치 차별화를 적용했으나 성능 향상은 보이지 않았고, (e)에서는 본 논문의 미니배치 표준 편차를 적용하자 SWD에서 성능이 향상되었다. (f), (g)에서도 성능 향상이 나타났다. 마지막으로 (h)에서는 학습을 충분히 시켜 결과를 수렴시켰다.</p><h3 id="Convergence-and-Training-Speed"><a href="#Convergence-and-Training-Speed" class="headerlink" title="Convergence and Training Speed"></a>Convergence and Training Speed</h3><p><img src="/img/progan/Untitled%203.png" alt="Untitled"><br>위 그림(a)와 (b)는 훈련 시간(가로 축)과 SWD의 수치 (세로 축), 그림 (c)는 훈련 시간(가로 축)과 Discriminator에게 보여준 진짜 이미지의 숫자(세로 축)이다. (a)는 Gulrajani et al. (2017)의 학습 구성에서의 결과이다. 그러나 (a)는 단계적으로 학습 (층을 서서히 추가시켜가며 학습)의 네트워크가 아니며 (제일 처음부터 모든 층을 네트워크에 넣어 둔 것), (b)는 점진적 학습 (층을 서서히 추가시켜 학습)의 네트워크이다.</p><p>점진적인 학습은 2개의 메리트가 있다.</p><ol><li>매우 우수한 최적치에 수렴한다.</li><li>학습 수렴 시간을 획기적으로 줄였다.</li></ol><h2 id="CelebA-HQ"><a href="#CelebA-HQ" class="headerlink" title="CelebA-HQ"></a>CelebA-HQ</h2><p>본 연구에서 고해상도의 이미지 출력의 의미있는 평가를 위해 CELEBA-HQ라는 데이터셋을 생성하여 제시하였다. 이는 1024x1024 해상도의 30,000장의 이미지를 포함하고 있다.</p><h2 id="Official-Demo"><a href="#Official-Demo" class="headerlink" title="Official Demo"></a>Official Demo</h2><iframe style="width: 100%; height: 420px" width="560" height="315" src="https://www.youtube.com/embed/G06dEcZ-QTg?si=co5CHTe6oHP7NI2I" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe>]]></content:encoded>
<comments>http://techbless.github.io/2023/11/19/progressive-growing-of-gans-%EC%9A%94%EC%95%BD/#disqus_thread</comments>
</item>
</channel>
</rss>