-
Notifications
You must be signed in to change notification settings - Fork 0
/
search.xml
946 lines (456 loc) ยท 564 KB
/
search.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
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>[Docker] E04.gcloud install</title>
<link href="2021/09/11/docker-4/"/>
<url>2021/09/11/docker-4/</url>
<content type="html"><![CDATA[<h1 id="gcloud-์ค์น"><a href="#gcloud-์ค์น" class="headerlink" title="gcloud ์ค์น"></a>gcloud ์ค์น</h1><br/><p>GKE์ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๋ฅผ ๋ช
๋ น์ด๋ก ์์ฝ๊ฒ ์์ฑํ๊ณ ์ญ์ ํ ์ ์๋ <code>gcloud</code>๋ฅผ ์ค์นํ๋ คํฉ๋๋ค.</p><br/><p>์๋์ฐ ํ๊ฒฝ์์ ์๋์ ๊ฐ์ ๋ช
๋ น์ด๋ฅผ ํตํด ๊ฐํธํ๊ฒ ์ค์นํด๋ณด๋ ค ํ์ต๋๋ค.</p><br/><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ curl https://sdk.cloud.google.com | bash</span><br></pre></td></tr></table></figure><br/><p>๊ทธ๋ฌ๋, ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์์ ์
๋ ฅ์ด ์์ ๋์ง ์์์ต๋๋ค.</p><br/><figure class="highlight plain"><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></pre></td><td class="code"><pre><span class="line">Installing Google Cloud SDK...</span><br><span class="line"> % Total % Received % Xferd Average Speed Time Time Time Current</span><br><span class="line"> Dload Upload Total Spent Left Speed</span><br><span class="line"></span><br><span class="line">100 421 0 421 0 0 6353 0 --:--:-- --:--:-- --:--:-- 9790</span><br><span class="line">Downloading Google Cloud SDK install script: https://dl.google.com/dl/cloudsdk/channels/rapid/install_google_cloud_sdk.bash</span><br><span class="line"></span><br><span class="line">######################################################################## 100.0%</span><br><span class="line">Running install script from: /tmp/tmp.6sVKRinztG/install_google_cloud_sdk.bash</span><br><span class="line">which curl</span><br><span class="line">curl -# -f https://dl.google.com/dl/cloudsdk/channels/rapid/google-cloud-sdk.tar.gz</span><br><span class="line"></span><br><span class="line">######################################################################## 100.0%</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">Installation directory (this will create a google-cloud-sdk subdirectory) (/home/ubuntu/My-Repository):</span><br></pre></td></tr></table></figure><br/><p>๋ค์๊ณผ ๊ฐ์ <a href="https://discuss.circleci.com/t/build-hangs-when-installing-google-cloud-sdk/398">๋งํฌ</a>์์ ํด๊ฒฐ๋ฐฉ๋ฒ์ด ํ๊ฒฝ๋ณ์์ <code>CLOUDSDK_CORE_DISABLE_PROMPTS</code>๋ฅผ <code>1</code>๋ก ์ธํ
ํ๋ผ๋ ๋ต๋ณ์ด ์์์ง๋ง ์ ๋ ํด๊ฒฐ๋์ง ์์์ต๋๋ค.</p><br/><p>๋ฐ๋ผ์, <a href="https://cloud.google.com/sdk/docs/downloads-interactive">google cloud sdk ์ค์น ํ๋ก๊ทธ๋จ</a>์ ์ฌ์ฉํ์ต๋๋ค.</p><br/><figure class="highlight plain"><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">(New-Object Net.WebClient).DownloadFile("https://dl.google.com/dl/cloudsdk/channels/rapid/GoogleCloudSDKInstaller.exe", "$env:Temp\GoogleCloudSDKInstaller.exe")</span><br><span class="line"></span><br><span class="line">& $env:Temp\GoogleCloudSDKInstaller.exe</span><br></pre></td></tr></table></figure><br/><p>์์๊ฐ์ ๋ช
๋ น์ด๋ฅผ <code>PowerShell</code>์ ์
๋ ฅํ๊ณ default๊ฐ์ผ๋ก ์ค์นํ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด cmd์ฐฝ์ด ๋น๋๋ค.</p><br/><figure class="highlight plain"><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></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">Welcome! This command will take you through the configuration of gcloud.</span><br><span class="line"></span><br><span class="line">Your current configuration has been set to: [default]</span><br><span class="line"></span><br><span class="line">You can skip diagnostics next time by using the following flag:</span><br><span class="line"> gcloud init --skip-diagnostics</span><br><span class="line"></span><br><span class="line">Network diagnostic detects and fixes local network connection issues.</span><br><span class="line">Checking network connection...done.</span><br><span class="line">Reachability Check passed.</span><br><span class="line">Network diagnostic passed (1/1 checks passed).</span><br><span class="line"></span><br><span class="line">You must log in to continue. Would you like to log in (Y/n)? y</span><br></pre></td></tr></table></figure><br/><p>y๋ฅผ ์
๋ ฅํ๋ฉด ๊ตฌ๊ธ ๋ก๊ทธ์ธ ํํ์ด์ง๋ก ํฌ์๋ฉ๋๋ฉฐ ๋ก๊ทธ์ธ์ ์ ์๋ํฉ๋๋ค.</p><br/><figure class="highlight plain"><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">You are logged in as: [[email protected]].</span><br><span class="line"></span><br><span class="line">Pick cloud project to use:</span><br><span class="line"> [1] concrete-kayak-325508</span><br><span class="line"> [2] Create a new project</span><br><span class="line">Please enter numeric choice or text value (must exactly match list</span><br><span class="line">item): 1</span><br></pre></td></tr></table></figure><br/><p>๊ธฐ์กด์ GKE์ ์ฐ๋ํ๊ณ </p><br/><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Do you want to configure a default Compute Region and Zone? (Y/n)? y</span><br></pre></td></tr></table></figure><br/><p>์ฌ์ฉํ ๋ฆฌ์ ์ GKE ํด๋ฌ์คํฐ์ default์ธ us-central1-c๋ฅผ ์ ํํ์ต๋๋ค.</p><br/><figure class="highlight plain"><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></pre></td><td class="code"><pre><span class="line">If you do not specify a zone via a command line flag while working</span><br><span class="line">with Compute Engine resources, the default is assumed.</span><br><span class="line"> [1] us-east1-b</span><br><span class="line"> [2] us-east1-c</span><br><span class="line"> [3] us-east1-d</span><br><span class="line"> [4] us-east4-c</span><br><span class="line"> [5] us-east4-b</span><br><span class="line"> [6] us-east4-a</span><br><span class="line"> [7] us-central1-c</span><br><span class="line"> [8] us-central1-a</span><br><span class="line"> ...</span><br><span class="line"> </span><br><span class="line">Did not print [36] options.</span><br><span class="line">Too many options [86]. Enter "list" at prompt to print choices fully.</span><br><span class="line">Please enter numeric choice or text value (must exactly match list</span><br><span class="line">item): 7</span><br></pre></td></tr></table></figure><br/><p><code>gcloud container clusters list</code>๋ฅผ ์
๋ ฅํ์ฌ ์ฐ๋๋๋์ง ํ์ธํด๋ด
๋๋ค.</p><br/><figure class="highlight plain"><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">C:\Program Files (x86)\Google\Cloud SDK>gcloud container clusters list</span><br><span class="line">NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS</span><br><span class="line">cluster-1 us-central1-c 1.20.9-gke.701 XX.XX.XXX.XXX e2-medium 1.20.9-gke.701 3 RUNNING</span><br></pre></td></tr></table></figure><br/><p>๋ค์์ ๋ช
๋ น์ด๋ฅผ ํตํด ํด๋ฌ์คํฐ ์ ๊ทผ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ต๋๋ค.</p><br/><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">C:\Program Files (x86)\Google\Cloud SDK>gcloud container clusters get-credentials cluster-1 --zone us-central1-c</span><br></pre></td></tr></table></figure><br/><p>์ฐ๋๋์๋์ง ํ์ธํด๋ด
๋๋ค.</p><br/><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">C:\Program Files (x86)\Google\Cloud SDK>kubectl get nodes</span><br></pre></td></tr></table></figure><br/><p>์๋๋ค์ฉ!</p><br/><figure class="highlight plain"><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">NAME STATUS ROLES AGE VERSION</span><br><span class="line">gke-cluster-1-default-pool-f5da48ba-3c1b Ready <none> 21h v1.20.9-gke.701</span><br><span class="line">gke-cluster-1-default-pool-f5da48ba-l4vf Ready <none> 21h v1.20.9-gke.701</span><br><span class="line">gke-cluster-1-default-pool-f5da48ba-qnh7 Ready <none> 21h v1.20.9-gke.701</span><br></pre></td></tr></table></figure><br/><h3 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h3><br/><blockquote><p>์์ํ์ธ์! ๋์ปค/์ฟ ๋ฒ๋คํฐ์ค</p></blockquote><br/>]]></content>
<categories>
<category> docker </category>
</categories>
<tags>
<tag> docker </tag>
<tag> kubernetes </tag>
<tag> gcloud </tag>
</tags>
</entry>
<entry>
<title>[Paper Review] E02. YOLOX: Exceeding YOLO Series in 2021</title>
<link href="2021/08/17/paper-review-01/"/>
<url>2021/08/17/paper-review-01/</url>
<content type="html"><![CDATA[<h1 id="YOLOX-Exceeding-YOLO-Series-in-2021"><a href="#YOLOX-Exceeding-YOLO-Series-in-2021" class="headerlink" title="YOLOX: Exceeding YOLO Series in 2021"></a>YOLOX: Exceeding YOLO Series in 2021</h1><br/><br/><p><img src="/image/TITLE.png" alt="TITLE"></p><br/><br/><h2 id="Introduction"><a href="#Introduction" class="headerlink" title="Introduction"></a>Introduction</h2><br/><br/><p>YOLO ์๋ฆฌ์ฆ๋ ํญ์ ์๋์ ์ ํ๋๊ฐ์ ์ต์ ์ trade-off๋ฅผ ๊ฐ๋ ๊ฒ์ ์ถ๊ตฌํ์ต๋๋ค. ํ์ง๋ง ํ์ฌ one-stage object detector๋ค์ ๋ชจ๋ anchor-free๋ฅผ ์ถ๊ตฌํ๊ณ ๋ ๋์ ๋ ์ด๋ธ๊ธฐ๋ฒ๋ค์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. </p><br/><br/><p>๋ฐ๋ผ์, anchor-free๋ฅผ ๋ง์กฑ์ํค๋ ๊ฒ์ ๋ชฉํ๋ก YOLOX๋ฅผ ๊ฐ๋ฐํ๊ฒ ๋์์ต๋๋ค. YOLOX์ ๋ฒ ์ด์ค๋ YOLOv3-SPP์์ ์์๋์์ต๋๋ค. </p><br/><br/><p>๊ทธ ๊ฒฐ๊ณผ YOLOX๋ YOLOv3(44.3% AP)๋ณด๋ค ๋์ 50.0%AP๋ฅผ ๋ฌ์ฑํ์์ผ๋ฉฐ YOLOv4-Tiny์ ๋์ํ ๋งํ YOLOX-Nano๋ 10%AP ์์๊ฒ ๋์์ต๋๋ค.</p><br/><br/><h2 id="YOLOX"><a href="#YOLOX" class="headerlink" title="YOLOX"></a>YOLOX</h2><br/><br/><h3 id="YOLOX-DarkNet53"><a href="#YOLOX-DarkNet53" class="headerlink" title="YOLOX-DarkNet53"></a>YOLOX-DarkNet53</h3><br/><br/><ol><li>Implementation details</li></ol><ul><li>SGD(Stochastic Gradient Descent)</li><li>Learning Rate = lr * BatchSize/64(linear scaling, initial = 0.01, cosine lr schedule)</li><li>wegith decay = 0.0005, SGD momentum = 0.9</li><li>Batch Size = 128</li></ul><br/><br/><ol start="2"><li>YOLOv3 baseline</li></ol><ul><li>backbone = DarkNet53, SPP layer</li><li>EMA weights updating</li><li>cosine lr schdule</li><li>IoU loss for training <code>reg</code> brannch</li><li>BCE Loss for training <code>cls</code>, <code>obj</code> branch</li><li>Augmentation = RandomHorizontalFlip, ColorJitter</li></ul><br/><br/><ol start="3"><li>Decoupled head</li></ol><ul><li>์๋์ ๊ฐ์ด anchor์ฌ์ด์ฆ๋ณ๋ก class์ offset๋ค๊ณผ ๊ฐ์ฒด ์ ๋ฌด๋ฅผ ํ๋จํ๋ ๊ฒ์ด ์๋๋ผ ๊ฐ๊ฐ ๋ค๋ฅด๊ฒ loss๋ฅผ ๊ณ์ฐํ๋ decopuled head๋ฅผ ์ ์ํ๊ฒ ๋์์ต๋๋ค.</li><li>channel dimension์ ์ค์ด๊ธฐ ์ํด 1 X 1 conv layer๋ฅผ ์ถ๊ฐํ๊ณ ๊ทธ ๋ค์ ๋๊ฐ์ 3x3 conv layer๋ฅผ ์ถ๊ฐํ ํํ๋ฅผ ๋๊ฒ ๋ฉ๋๋ค.</li></ul><br/><br/><p><img src="/image/decoupled.png" alt="decoupled"></p><br/><br/><ol start="4"><li>Strong data augmentation</li></ol><ul><li>Mosaic and MixUp๊ธฐ๋ฒ์ ์ฌ์ฉํ์๋๋ฐ ์ด๋ ํฌ์คํธ ํ๋ฐ๋ถ์ ์ด๋ป๊ฒ ์ ์ฉ์์ผฐ๋์ง ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.</li><li>NO PRE-TRAINING ImageNet</li></ul><br/><br/><ol start="5"><li>Anchor-free</li></ol><ul><li><p>YOLOv4์ YOLOv5๋ YOLOv3์์ ํ์๋ anchor-based ํ์ดํ๋ผ์ธ์ ๋ฐ๋ฅด์ง๋ง anchor-based ํ์ดํ๋ผ์ธ์ ๋ช๊ฐ์ง ๋ฌธ์ ๊ฐ ์กด์ฌํฉ๋๋ค.</p><ol><li>์ต์ ์ ๊ฒ์ถ ์ฑ๋ฅ์ ์ํด์ ํ์ต ์ด์ ์ ํด๋ฌ์คํฐ๋ง ๊ณผ์ ์ ํตํด anchor size๋ฅผ ์ค์ ํด์ผํฉ๋๋ค.</li><li>detection head์ ๋ณต์ก์ฑ์ ๋ํ๊ฒ ๋ฉ๋๋ค.<ul><li>์ด๋ ๋ง์ ์์ ์ถ๋ก ์ ์ํด NPU์์ GPU๋ก ์ด๋ํ ๊ฒฝ์ฐ ํฐ ์ค๋ฒํค๋๋ฅผ ๊ฐ๊ฒ๋ฉ๋๋ค.</li></ul></li></ol></li><li><p>๊ธฐ์กด์ 3๊ฐ์ anchor๋ฅผ regressionํ๋ ๊ฒ์ด ์๋ 1๊ฐ์ box๋ฅผ ์์ธกํ๊ฒ ๋๋๋ฐ ์ด๋ left-top corner of the grid์ offset๊ณผ predicted box์ width์ height์ ์ฐพ๊ฒ ๋ฉ๋๋ค.</p></li><li><p>์ด๋ parameter๋ค๊ณผ GFLOP๋ค์ ์ค์ฌ์ฃผ์ง๋ง ๋ ๋์ ์ฑ๋ฅ์ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.</p></li></ul><br/><br/><ol start="6"><li>Multi positives</li></ol><ul><li>์์ anchor-free๋ฐฉ๋ฒ์ ์ ์ฉํ ๊ฒฝ์ฐ ์ค์ง ํ๊ฐ์ positive sample์ ์์ธกํ๊ฒ ๋๊ณ ์ด๋ ๊ณง ๋ง์ negative sample์ด ๋์ ๊ต์ฅํ ํฐ ๋ถ๊ท ํ์ ์ด๋ํ๊ฒ ๋ฉ๋๋ค. </li><li>๋ฐ๋ผ์, FCOS์ โcenter samplingโ์ ํตํด the center 3 X 3 area๋ฅผ positive sample๋ก ํ ๋นํฉ๋๋ค.</li></ul><br/><br/><ol start="7"><li>SimOTA</li></ol><ul><li><p>๋ ๋์ ๋ ์ด๋ธ๋ง์ ์ํด OTA๋ ๋ค์๊ณผ ๊ฐ์ 4๊ฐ์ ๋ ์ด๋ธ๋ง ๊ธฐ๋ฒ์ ์ ์ํฉ๋๋ค.</p><ol><li>loss/quality aware</li><li>center prior</li><li>dynamic number of positive anchors</li><li>global view</li></ol></li><li><p>๊ทธ๋ฌ๋, Sinkhorn-Knopp ์๊ณ ๋ฆฌ์ฆ์ OT(Optimal Transport)๋ฌธ์ ์ ์ ์ฉ์์ผฐ์ ๊ฒฝ์ฐ 25%(300 epochs)์ ์ถ๊ฐ์ ์ธ ํ์ต์๊ฐ์ด ๊ฑธ๋ฆฌ๊ฒ ๋๋ฏ๋ก ์ด๋ฅผ dynamic top-k startegy(named SimOTA)๋ก ์ ์ํ๊ฒ ๋์์ต๋๋ค.</p></li><li><p>SimOTA๋ matching degree๋ฅผ ๊ณ์ฐํ๊ฒ ๋๋๋ฐ ์ด๋ ์๋์ ๊ฐ์ ์์ผ๋ก ๊ณ์ฐํฉ๋๋ค.</p></li></ul><br/><br/><p><img src="/image/equation.png" alt="equation"></p><br/><br/><ul><li>์ฌ๊ธฐ์ <code>lambda</code>๋ ๋ถ๊ท ํ์ ํด์ํ๊ธฐ ์ํ ๊ณ์์ด๊ณ <code>์ฐ๋ณ</code>์ GT์ prediction๊ฐ ์ฌ์ด์ classification loss์ regression loss๋ฅผ ์๋ฏธํฉ๋๋ค.</li><li>์ด ๋, ๊ฐ๊ฐ์ GT์ ๋ํด ๊ฐ์ฅ ์ ์ cost๊ฐ์ ๊ฐ๋ ๊ณ ์ ๋ center region์ค top k predictions๋ค์ positives๋ผ๊ณ ํ๊ณ ๋๋จธ์ง๋ฅผ ๋ชจ๋ negative๋ก ํฉ๋๋ค. ์ด ๋, k๋ GT์ ๋ํด ๋ชจ๋ ๋ค๋ฅธ ๊ฐ์ ๊ฐ์ต๋๋ค.</li></ul><br/><br/><ol start="8"><li>End-to-end YOLO</li></ol><ul><li>one-to-one label assignment์ stop gradient ๋๊ฐ์ conv layer๋ฅผ ์ถ๊ฐํ์ง๋ง ์ด๋ ์ฑ๋ฅ์ ํ๋ก ์ด์ด์ ธ ์ต์
์ผ๋ก ์ฃผ๊ณ ์ต์ข
๊ฒฐ๊ณผ๋ฌผ์ ํฌํจ์ํค์ง ์์์ต๋๋ค.</li></ul><br/><br/><h3 id="Other-Backbones"><a href="#Other-Backbones" class="headerlink" title="Other Backbones"></a>Other Backbones</h3><br/><br/><p>DarkNet53์ด์ธ์ ๋ค์ํ backbones๋ค์ ์ ์ฉ์์ผ๋ณด์์ต๋๋ค.</p><br/><br/><ol><li>Modified CSPNet in YOLOv5</li></ol><ul><li>YOLOv5์ ์ ์ฉ๋ CSPNet, SiLU activation, PAN head๋ฅผ ์ ์ฉ์ํจ YOLOX-S,YOLOX-M,YOLOX-X ๋ชจ๋ธ์ ๋น๊ตํ ๊ฒฝ์ฐ ์ฝ๊ฐ์ ์๊ฐ์ trade-off ํ์ฌ ๊ฐ๊ฐ 1~3% AP ํฅ์ ํจ๊ณผ๋ฅผ ์ป๊ฒ ๋์์ต๋๋ค.</li></ul><br/><br/><ol start="2"><li>Tiny and Nano detectors</li></ol><ul><li>YOLOv4-Tiny ๋ชจ๋ธ๊ณผ ๋น๊ตํ๊ธฐ ์ํด YOLOX-Tiny๋ชจ๋ธ์ ๊ตฌ์ํ์์ ๋ ์๋์ ํ์ ๊ฐ์ด ๋ ๋์ ์ฑ๋ฅ์ ์ป๊ฒ ๋์์ต๋๋ค.</li></ul><br/><br/><p><img src="/image/tiny.png" alt="tiny"></p><br/><br/><ol start="3"><li>Model size and data augmentation</li></ol><ul><li><p>๋ชจ๋ ๋ชจ๋ธ๋ค์ ๊ฐ์ learning schedule๊ณผ optimizing parameters๋ค์ ๊ฐ๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋, ๋ชจ๋ธ์ ํฌ๊ธฐ๋ณ๋ก ๋ค๋ฅธ ์ ์ ํ augmentation ๊ธฐ๋ฒ์ ์ ์ฉ์์ผ์ผํ๋ ๊ฒ์ ํ์ธํ์ต๋๋ค.</p></li><li><p>์๋ฅผ๋ค์ด, MixUp๊ณผ ๊ฐ์ ๊ธฐ๋ฒ๋ค์ YOLOX-L์์๋ 0.9% AP์์น์ ์ ๋ํ์ง๋ง ์์๋ชจ๋ธ์ธ YOLOX-Nano์ ๊ฐ์ ๋ชจ๋ธ์๋ ์ฑ๋ฅ์ ํ๋ฅผ ์ ๋ํ์ต๋๋ค. ๋ฐ๋ผ์, mosaic ๋น์จ์ ์ค์ด๊ณ mix up augmentation์ ์ญ์ ํ์์ต๋๋ค.</p></li><li><p>ํฐ ๋ชจ๋ธ์ ๊ฒฝ์ฐ stronger augmentation๊ธฐ๋ฒ์ด ๋ ํจ๊ณผ์ ์ธ ๊ฒ์ ํ์ธํ์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์๋ก ๊ตฌํํ MixUp๊ธฐ๋ฒ์ด ๊ธฐ์กด๋ณด๋ค ๋ ๋์ ์ฑ๋ฅ์ ๋ณด์ฅํ๊ณ Copypaste๊ธฐ๋ฒ์ผ๋ก๋ถํฐ ์๊ฐ์ ๋ฐ์ mix upํ๊ธฐ ์ ์ random sample scale factor๋ฅผ ํตํด ์ด๋ฏธ์ง๋ฅผ jitterํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ต๋๋ค.</p></li></ul><br/><br/><h2 id="Conclusion"><a href="#Conclusion" class="headerlink" title="Conclusion"></a>Conclusion</h2><br/><br/><p>๊ธฐ์กด์ YOLO ์๋ฆฌ์ฆ์ anchor free๋ฅผ ์ ์ฉ์ํจ detector๋ฅผ ์๊ฐํ์์ต๋๋ค. decoupled head, anchor-free, and advanced label assigning strategy๋ฅผ ์ ์ฉ์ํจ YOLOX๋ ์๋์ ์ ํ๋์ ๋ ๋์ trade-off๋ฅผ ์ป๊ฒ ๋์์ต๋๋ค. </p><br/><br/><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><ol><li><a href="https://arxiv.org/abs/2107.08430">YOLOX: Exceeding YOLO Series in 2021</a></li></ol>]]></content>
<categories>
<category> Paper Review </category>
</categories>
<tags>
<tag> YOLO </tag>
<tag> YOLOX </tag>
<tag> Object Detection </tag>
</tags>
</entry>
<entry>
<title>[Paper Review] E01. Detection of Abandoned and StolenObjects based on Dual BackgroundModel and Mask R-CNN</title>
<link href="2021/08/16/paper-review-00/"/>
<url>2021/08/16/paper-review-00/</url>
<content type="html"><![CDATA[<h1 id="Detection-of-Abandoned-and-Stolen-Objects-Based-on-Dual-Background-Model-and-Mask-R-CNN"><a href="#Detection-of-Abandoned-and-Stolen-Objects-Based-on-Dual-Background-Model-and-Mask-R-CNN" class="headerlink" title="Detection of Abandoned and Stolen Objects Based on Dual Background Model and Mask R-CNN"></a>Detection of Abandoned and Stolen Objects Based on Dual Background Model and Mask R-CNN</h1><br/><blockquote><p>์ด๋ฒ ํฌ์คํธ์์๋ CCTV๋ฅผ ์ด์ฉํ์ฌ ์์คํ
์ ์ค๊ณํ๋ ํ์ผ๋ก์จ ์ ๊ธฐ, ๋ถ์ค, ๋๋ ๋ฑ์ AI ๋์
์ ์ํ ์ต์ ๋
ผ๋ฌธ์ ๋ํ ๋ฆฌ๋ทฐ๋ฅผ ์งํํด๋ด
๋๋ค.</p></blockquote><br/><h2 id="Introduction"><a href="#Introduction" class="headerlink" title="Introduction"></a>Introduction</h2><br/><p>์ต๊ทผ, surveillance system์ AI๊ธฐ์ ์ ์ ๋ชฉ์ํจ ๊ธฐ์ ์ด ์์ฃผ ๋ฑ์ฅํ๊ณ ์์ต๋๋ค. ์นจ์
, ํ์ฌ, ๋ฐฐํ ๋ฑ์ ๋ํ ๋์์๋๋ฅผ ์ต์ํ ํ๋๋ฐ ์ข์ ๊ธฐ์ ์ด ๋ ๊ฒ์
๋๋ค.</p><br/><p>๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ , ์ ํต์ ์ธ ์์คํ
๋ค์ ์ ํ๋๋ ์ฑ๋ฅ์ธก๋ฉด์์ ํ๊ณ์ ์ ๋๊ณ ์์์ต๋๋ค.</p><br/><p>ํ์ง๋ง, ์ต๊ทผ AI ๊ธฐ์ ๋ค์ ์ง๋ณด๋ ๋ค์ํ ์์ฉ๋ถ์ผ์ ์ข์ ์ํฅ๋ ฅ์ ๋ผ์น๊ณ ์์ต๋๋ค.๊ทธ๋ฌ๋ฏ๋ก ์ด ๋
ผ๋ฌธ์์๋ ์ ๊ธฐ๋๊ฑฐ๋(abandoned) ๋๋๋นํ(stolen) ๋ฌผ์ฒด๋ค์ ์ ํต์ ์ธ(conventional) ๋ฐฐ๊ฒฝ์ถ์ถ ๊ธฐ์ ์ ํตํด background์ foreground๋ฅผ ์ค์๊ฐ์ผ๋ก ์์ฑํด๋ด๊ณ foreground์์๋ ์ ๊ธฐ๋ ๋ฌผํ์, background์์๋ ๋๋๋นํ ๋ฌผํ์ ๊ฒ์ถํ๋ ์์คํ
์ ์๊ฐํฉ๋๋ค.</p><br/><p>๋ํ, ๊ทธ๋ฆผ์ ์์ญ์ ๊ฒฝ์ฐ foreground์์ ์ ๊ธฐ๋๊ฑฐ๋ ๋๋๋นํ ๋ฌผํ์ด ์๋์๋ ๋ถ๊ตฌํ๊ณ ๋ํ๋๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ด๋ฌํ ๋ถ๋ถ์ ๊ฐ์ ํ๊ณ ์ ํฉ๋๋ค.</p><br/><h2 id="PROPOSED-ALGORITHM-FOR-DETECTING-ABANDONED-OBJECT-AND-STOLEN-OBJECT"><a href="#PROPOSED-ALGORITHM-FOR-DETECTING-ABANDONED-OBJECT-AND-STOLEN-OBJECT" class="headerlink" title="PROPOSED ALGORITHM FOR DETECTING ABANDONED OBJECT AND STOLEN OBJECT"></a>PROPOSED ALGORITHM FOR DETECTING ABANDONED OBJECT AND STOLEN OBJECT</h2><br/><h3 id="DUAL-BACKGROUND-MODEL-FOR-EXTRACTING-STATIONARY-OBJECTS"><a href="#DUAL-BACKGROUND-MODEL-FOR-EXTRACTING-STATIONARY-OBJECTS" class="headerlink" title="DUAL BACKGROUND MODEL FOR EXTRACTING STATIONARY OBJECTS"></a>DUAL BACKGROUND MODEL FOR EXTRACTING STATIONARY OBJECTS</h3><br/><img src = "https://d3i71xaburhd42.cloudfront.net/842e00782fa8eb6e8bb9dbe14d0895f03e0c7922/3-Figure1-1.png" width = 400px/><br/><p>์ด ๋
ผ๋ฌธ์์๋ ํน์ดํ๊ฒ background subtraction์ ๋๊ฐ์ง ๋ชจ๋ธ๋ก ํ์์ต๋๋ค. ํ๊ฐ์ง๋ short-term model, ๋ค๋ฅธ ํ๊ฐ์ง๋ long-term model์ด๋ผ๊ณ ํ์์ต๋๋ค.</p><br/><p>๋ ๊ฐ์ง์ ๋ชจ๋ธ๋ก ๋๋ ์ด์ ๋ <strong>๋๊ตฐ๊ฐ๊ฐ ์ ์ ์ง์ ๋ด๋ ค๋์์ ๋</strong>์ ์์ธ์ฌํญ์ ๋ฐฉ์งํ๊ธฐ ์ํด์์
๋๋ค. </p><br/><ol><li>short-term model<ul><li>SB(Short-term Background) : ์ ๊ธฐ๋ ๋ฌผํ์ ๋น ๋ฅด๊ฒ SB์ ๋ํ๋๋ค.</li><li>SF(Short-term Foreground) : ํ์ฌ ์์ง์ด๊ณ ์๋ ๊ฐ์ฒด๋ค์ด ์กด์ฌ</li></ul></li><li>Long-term model<ul><li>LB(Long-term Background) : </li><li>LF(Long-term Foreground) : ์ ์ ์ธ ๋ฌผ์ฒด(์์ง์์ด ์ฝ๊ฐ์ด๋ผ๋ ์กด์ฌํ๋)๊ฐ ์กด์ฌ</li></ul></li></ol><p align="center">DF(Difference Foreground) : LF - SF, ์ ์ ์ธ ๋ฌผ์ฒด๋ค๋ง ์กด์ฌ </p><br/><p>๋จ, ์ด๋ ์ผ์ ์๊ณ์ ์ดํ์ ๊ฐ์ฒด๋ค์ noise๋ผ ํ๋จํ์ฌ ์ง์์ง๋ค. ๋ํ, Long-term ๊ณผ Short-term์ ๊ตฌ๋ถํ๋ค๋ณด๋ ๋น์ฐํ single frame์ผ๋ก๋ ํ๋จ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด ๋
ผ๋ฌธ์ ์ค๋ช
์
๋๋ค.</p><br/><p>์์ dual background subtraction์ ํตํด ์ฐ๋ฆฌ๋ **Stationary Object(์ ์ ์ธ ๋ฌผ์ฒด)**๋ฅผ ๊ตฌ๋ถํ ์ ์๊ฒ ๋์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด์ ์ด ์ ์ ์ธ๋ฌผ์ฒด๋ฅผ ์ ๊ธฐ๋๊ฑฐ๋ ๋๋๋นํ๊ฑฐ๋ ๊ทธ๋ฆผ์์์ญ์ธ์ง ํ์ธํ๋ ์ ์ฐจ๊ฐ ํ์ํฉ๋๋ค.</p><br/><h3 id="ISSUE-OF-DISCRIMINATION-BETWEEN-ABANDONED-AND-STOLEN-OBJECT"><a href="#ISSUE-OF-DISCRIMINATION-BETWEEN-ABANDONED-AND-STOLEN-OBJECT" class="headerlink" title="ISSUE OF DISCRIMINATION BETWEEN ABANDONED AND STOLEN OBJECT"></a>ISSUE OF DISCRIMINATION BETWEEN ABANDONED AND STOLEN OBJECT</h3><br/><img src = "https://d3i71xaburhd42.cloudfront.net/842e00782fa8eb6e8bb9dbe14d0895f03e0c7922/4-Figure2-1.png" width = 400px/><br/><p>๋น๋ก ์์ dual background model์ด ์ ์ ์ธ ๋ฌผ์ฒด๋ฅผ ์ถ์ถํ๋ ๊ฒ์ ์ฝ์ง๋ง ์ ๊ธฐ๋ ๋ฌผํ์ธ์ง ๋๋๋นํ ๋ฌผํ์ธ์ง ๊ตฌ๋ถํ๋ ๊ฒ์ foreground์์ ๋น๊ตํ๋๊ฒ ์ฝ์ง ์์ต๋๋ค.</p><br/><p>DF์ ๋์ค๋ ๊ฐ์ฒด๋ก๋ง ํ๋จ์ ํ๋ค๋ฉด 1๋ฒ๊ณผ 2๋ฒ์์ ์ ์ฐจ์ด์ ์ ๊ตฌ๋ถํ ์ ์์ต๋๋ค. ํ์ง๋ง, 1๋ฒ์์ ๋ ๋๊ตฐ๊ฐ ๋๊ณ ๊ฐ ๊ฐ์ฒด์ด๋ฉฐ 2๋ฒ์์ ๋ ๋๋๋นํ ๊ฐ์ฒด์
๋๋ค. ๋ฐ๋ผ์ ์ด๋ฅผ ๊ตฌ๋ถํด์ผํฉ๋๋ค.</p><br/><h3 id="THE-PROPOSED-ALGORITHM"><a href="#THE-PROPOSED-ALGORITHM" class="headerlink" title="THE PROPOSED ALGORITHM"></a>THE PROPOSED ALGORITHM</h3><br/><img src = "https://d3i71xaburhd42.cloudfront.net/842e00782fa8eb6e8bb9dbe14d0895f03e0c7922/5-Figure5-1.png" width = 400px/><br/><p>์ด ๋
ผ๋ฌธ์์ ์๊ฐํ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.</p><br/><ol><li><p>dual background model์ ํตํด DF์์ ์ ์ง๋ ๊ฐ์ฒด๋ฅผ ์ถ์ถํ๋ค. (Candidate Static Object DF : CSO_DF)</p><ul><li>์ด๋, ์ผ์ ํฌ๊ธฐ ์ดํ์ blobs๋ ๋
ธ์ด์ฆ๋ก ์ฒ๋ฆฌํ์ฌ ์ง์ด๋ค.</li><li>checking the stability of a blob : blobs๋ค์ด ๋ฐ๋ณต์ ์ผ๋ก ๊ฐ์ ์์น์ ๋ํ๋ ์ ์์ผ๋ฏ๋ก ์ฐ์์ ์ธ ํ๋ ์์์ ์ผ์ ์ซ์ ์ด์ ๋ํ๋๋ฉด stableํ๋ค๊ณ ์ ์ํ๋ค.</li></ul></li><li><p>๋์์, Mask R-CNN์ ์ด์ฉํ์ฌ ํ์ฌ ํ๋ ์์์ object mask๋ฅผ ์ป๋๋ค. (Segmented Object : SO_VF)</p></li><li><p>CSO_DF์ SO_VF๊ฐ ๋์ผํ์ง ํ์ธํ๋ค. ๋์ผํ ์ ์ด๊ฒ์ ์ ๊ธฐ๋ ๋ฌผํ์ด๋ค.</p><ul><li>๋ง์ฝ ๋์ผํ์ง ์์์<ul><li>์ด์ LB frames๋ค ์ค์์ CSO_DF๊ฐ background๋ก ํก์๋์ง์์ ๊ฐ์ฅ ์ต๊ทผ LBํ๋ ์์ ์ถ์ถํ๋ค. ์ด ๋, SO_LB๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด ์ ๊ธฐ๋ ๋ฌผํ์ด๋ค.</li><li>CSO_LBํ๋ ์์์ object segmentation์ ์งํํ์ฌ SO_LB๋ฅผ ์ถ์ถํ์ฌ SO_VF์ ๋น๊ตํ๋ค.</li></ul></li></ul></li></ol><br/><img src ="https://d3i71xaburhd42.cloudfront.net/842e00782fa8eb6e8bb9dbe14d0895f03e0c7922/6-Figure6-1.png" width = "1000px"/><br/><p>์ ์ฒด์ ์ธ ํ๋ก์ฐ ์ฐจํธ๋ ์์ ๊ฐ์ต๋๋ค.</p><br/><p>์ด ๋, ๋ง์คํฌ๋ผ๋ฆฌ์ ๋์ผ์ฑ ์ฌ๋ถ ํ๋จ์ ๋ค์๊ณผ ๊ฐ์ ์์ ๊ธฐ์ค์ผ๋ก ํฉ๋๋ค.</p><br/><p>CSO_DF์ top, left, width, and height๋ โtโ, โlโ, โwโ, โhโ๋ผ ํ ๋, CSO_DF์ mask๋ ๋ค์๊ณผ ์ค์ ํฉ๋๋ค.</p><br/><p><img src="/image/equation1.jpg" alt="equation1"></p><br/><p>๋ค์์ผ๋ก Mask R-CNN์ผ๋ก ๊ฐ์ง๋ mask์ ๊ดํ ์ค์ ์
๋๋ค.</p><br/><p><img src="/image/equation2.jpg" alt="equation2"></p><br/><p>์์ ๋ mask์ ํฝ์
๊ฐ์ด ๋์ผํ๋ฉด 1, ๋์ผํ์ง ์๋ค๋ฉด 0์ผ๋ก setํ๋ match score mask๋ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํฉ๋๋ค.</p><br/><p><img src="/image/equation3.jpg" alt="image-20210803090303010"></p><br/><p>๊ฒฐ๋ก ์ ์ผ๋ก match score๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.</p><br/><p><img src="/image/equation4.jpg" alt="equation4"></p><br/><p>mach score๊ฐ ์ผ์ threshold๋ณด๋ค ๋๋ค๋ฉด ์ด ๋์ ๊ฐ์ ๋ฌผ์ฒด์ด๋ฏ๋ก </p><br/><p>ํ์ง๋ง, ๋ค๋ฅผ ๊ฒฝ์ฐ์๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ์๊ฐ ์์ต๋๋ค.</p><br/><blockquote><ol><li>๋์ ์ฌ์ด์ฆ๊ฐ ๊ต์ฅํ ๋ค๋ฅด๋ค. ์ด๋ ๋๊ฐ CSO_DF์ ๋ฌธ์ ์ผ ๊ฐ๋ฅ์ฑ์ด ๋๋ค. background subtraction์ shadow region๊ณผ ๊ฐ์ ์์ญ์ด foreground์ ๋ํ๋ ์ค์ CSO_DF์ ๋ํ๋ ๋ฌผ์ฒด๋ณด๋ค ํฌ๊ฒ ์ธก์ ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.</li><li>๊ฐ์ฒด๊ฐ ์์ ์๋ ์๋ค. ๊ณผ๊ฑฐ์ ํ์ฌ์ ๋ค๋ฅธ ๋ชจ์(์ํ)์ผ ์ ์๊ธฐ ๋๋ฌธ์ match score๋ ๋ฐ๋์ CSO_DF์ ์ต์ข
์ํ๋ก ์ธก์ ๋์ด์ผํ๋ค.</li></ol></blockquote><br/><p>๋ค์์ ๊ทธ๋ฆผ์์์ญ์ธ์ง ๋๋๋นํ ๋ฌผ๊ฑด์ธ์ง ์ ๊ธฐ๋ ๋ฌผ๊ฑด์ธ์ง ๊ตฌ๋ณํ๋ ๋ฐฉ๋ฒ์
๋๋ค.</p><br/><img src = "https://d3i71xaburhd42.cloudfront.net/842e00782fa8eb6e8bb9dbe14d0895f03e0c7922/7-Figure7-1.png" width = 600px /><br/><p><strong>๊ตฌ๋ณ ๋ฐฉ๋ฒ</strong></p><blockquote><ol><li>์ ์ ์ธ ๋ฌผ์ฒด๊ฐ ๋ํ๋๋ค.(CSO_DF)</li><li>์ด์ ์๋ ์กด์ฌํ์ง ์์์ด์ผํ๋ค.</li><li>stable blob(CSO_DF)์์ญ์ ๋ฌผ์ฒด๊ฐ ์กด์ฌํ๋์ง ํ์ฌ ํ๋ ์์์ Mask R-CNN์ ์ด์ฉํ์ฌ ๊ตฌ๋ณํ๋ค.</li><li>์ผ์ match score๋ณด๋ค ๋๋ค๋ฉด abandoned object์ด๋ค. ( ์์ (1)์ ๊ฒฝ์ฐ )</li></ol><ul><li>์ผ์ match score๋ณด๋ค ๋ฎ๋ค๋ฉด ๋ค์์ ์์๋ฅผ ๋ฐ๋ฅธ๋ค.<ol><li>์ด์ LB frame์์ CSO_DF๊ฐ ์ฒ์์ผ๋ก ์์ฑ๋๋ ํ๋ ์์ ์ฐพ๋๋ค.</li><li>Mask R-CNN์ ์ด์ฉํ์ฌ SO_LB๋ฅผ ์ฐพ๊ณ , ์๋ค๋ฉด ์ด๋ abandoned object์ด๋ค. ์๋ํ๋ฉด ghost region์ด๊ธฐ ๋๋ฌธ์ด๋ค. ( ์์ (2)์ ๊ฒฝ์ฐ )</li><li>SO_LB๊ฐ ์์๋,<ol><li>SO_VF์ ๋์ผํ๋ค๋ฉด ์ด๋ ํ์ฌ ๊ทธ๋ฆผ์๊ฐ ์๊ธด๊ฒ์ด๋ฏ๋ก ghost region์ด๋ค. ( ์์ (4)์ ๊ฒฝ์ฐ )</li><li>SO_VF๋ณด๋ค ์๋ค๋ฉด ์ด๋ ์์ ๋ฌผ์ฒด๊ฐ ์กด์ฌํ ๊ฒ์ด๋ฏ๋ก abandoned object์ด๋ค. ( ์์ (3)์ ๊ฒฝ์ฐ)</li><li>SO_VF๋ณด๋ค ํฌ๋ค๋ฉด ์ด๋ ๊ณผ๊ฑฐ์ ์๋ ๋ฌผ์ฒด๊ฐ ํ์ฌ๋ ์ฌ๋ผ์ง ๊ฒ์ด๋ฏ๋ก stolen object์ด๋ค. ( ์์ (5), (6)์ ๊ฒฝ์ฐ )</li></ol></li><li>SO_LB๊ฐ ํ์ฌ์ผ ๋, ํฌ๊ธฐ์ ๊ด๊ณ์์ด ๋ชจ๋ stolen object์ด๋ค. ( ์์ (8), (9)์ ๊ฒฝ์ฐ )</li></ol></li><li>CSO_DF๋ ์กด์ฌํ์ง๋ง SO_VF๋ SO_LF๋ ์์ฑ๋์ง ์๋๋ค๋ฉด ์ด๋ Ghost region์ด๋ค. ( ์์ (7)์ ๊ฒฝ์ฐ, ์๋ ์์์์ ์ฐธ์กฐ )</li></ul></blockquote><br/><img src = "https://d3i71xaburhd42.cloudfront.net/842e00782fa8eb6e8bb9dbe14d0895f03e0c7922/5-Figure4-1.png" width = "800px" /><br/><h3 id="DETERMINING-THE-FINAL-STATE-OF-A-STATIONARY-OBJECT-ABANDONED-STOLEN-OBJECT-AND-GHOST-REGION-USING-THE-DUAL-BACKGROUND-MODEL-AND-MASK-R-CNN"><a href="#DETERMINING-THE-FINAL-STATE-OF-A-STATIONARY-OBJECT-ABANDONED-STOLEN-OBJECT-AND-GHOST-REGION-USING-THE-DUAL-BACKGROUND-MODEL-AND-MASK-R-CNN" class="headerlink" title="DETERMINING THE FINAL STATE OF A STATIONARY OBJECT (ABANDONED, STOLEN OBJECT, AND GHOST REGION) USING THE DUAL BACKGROUND MODEL AND MASK R-CNN"></a>DETERMINING THE FINAL STATE OF A STATIONARY OBJECT (ABANDONED, STOLEN OBJECT, AND GHOST REGION) USING THE DUAL BACKGROUND MODEL AND MASK R-CNN</h3><br/><p>์ง๊ธ๋ถํฐ๋ ์์ ์ค๋ช
ํ ์๋๋ฆฌ์ค์ ๋ํ ์์์
๋๋ค.</p><br/><ol><li>Stolen object detection when a CSO_DF is identical to a SO_LB, which corresponds to the case of Figure 7-(8).</li></ol><img src ="https://d3i71xaburhd42.cloudfront.net/842e00782fa8eb6e8bb9dbe14d0895f03e0c7922/8-Figure9-1.png" width = 800px /><p>(4)๋ฒ์์ DF ํ๋ ์์์ CSO_DF๊ฐ ์ถ์ถ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด์ ๊ฐ์์์คํ
์ <strong>back-trace</strong>๋ฅผ ํ๊ฒ ๋๋๋ฐ ํ์ฌ SO_VF์๋ ์๋ฌด๊ฒ๋ ์กด์ฌํ์ง ์์ผ๋ฏ๋ก SO_LB๊ฐ ํ์ฌ์ด๋ฏ๋ก ์ด๋ stolen object์
๋๋ค.</p><br/><ol start="2"><li>Stolen object detection when a CSO_DF is larger than a SO_LB, which corresponds to the case of Figure 7-(9).</li></ol><img src = "https://d3i71xaburhd42.cloudfront.net/842e00782fa8eb6e8bb9dbe14d0895f03e0c7922/8-Figure10-1.png" width = 800px/><p>(3)๋ฒ DFํ๋ ์์์ CSO_DF๊ฐ ์ถ์ถ์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก back-trace๋ฅผ ํ์ฌ SO_LB๊ฐ ํ์ฌ์์ ํ์ธํ ์ ์๊ณ SO_VF์๋ ์๋ฌด๊ฒ๋ ์กด์ฌํ์ง ์์ผ๋ฏ๋ก ์ด๋ stolen object์
๋๋ค. CSO_DF์๋ ๊ทธ๋ฆผ์๊ฐ ํฌํจ๋์ด SO_LB์ matchscore๊ฐ ๋ฎ์ง๋ง ์ด์ ๊ด๊ณ์์ด stolen object๋ก ๊ตฌ๋ณํฉ๋๋ค.</p><br/><ol start="3"><li>Another example of stolen object detection when a CSO_DF is larger than a SO_LB, which corresponds to the case of Figure 7-(9). And this figure also shows a ghost region detection in the absence of both the SOVF and SOLB, which corresponds to the case of Figure 7-(7).</li></ol><br/><img src = "https://d3i71xaburhd42.cloudfront.net/842e00782fa8eb6e8bb9dbe14d0895f03e0c7922/8-Figure11-1.png" width = 800px/><p>(3)๋ฒ DFํ๋ ์์์ CSO_DF๊ฐ ์ถ์ถ์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก back-trace๋ฅผ ํ์ฌ SO_LB๊ฐ ํ์ฌ์์ ํ์ธํ ์ ์๊ณ SO_VF์๋ ์๋ฌด๊ฒ๋ ์กด์ฌํ์ง ์์ผ๋ฏ๋ก ์ด๋ stolen object์
๋๋ค. ๋น์ ๋ฐฉํฅ์ ๋ฐ๋ผ ghost region์ด foreground์ ํฌํจ๋์ด ๋ํ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ง๋ง ์ด๋ ๋ชจ๋ SO_VF์ SO_LB์ ๋ํ๋์ง ์์ผ๋ฏ๋ก ghost region์ผ๋ก ๋ถ๋ฅ๊ฐ ๊ฐ๋ฅํด์ง๋๋ค.</p><br/><ol start="4"><li>Stolen object detection when a CSO_DF does not match a SO_VF and the SO_VF is smaller than a SO_LB, which corresponds to the case of Figure 7-(6).</li></ol><br/><img src = "https://d3i71xaburhd42.cloudfront.net/842e00782fa8eb6e8bb9dbe14d0895f03e0c7922/8-Figure12-1.png" width = 800px/><p>(4)๋ฒ DFํ๋ ์์์ CSO_DF๊ฐ ์ถ์ถ์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ค์ back-trace๋ฅผ ํ๋๋ฐ SO_LB๊ฐ SO_VF๋ณด๋ค ํฌ๋ฏ๋ก ์๋ ์๋ ๋ฌผ์ฒด ๋ค์ ์๋ ๋ฌผ์ฒด์ด๊ฑฐ๋ ํ์น์ฌ๋์ด ์์ ๋ฌผ๊ฑด์ ๋์ฒดํด ๋์ ๊ฒ์ด๋ฏ๋ก ๋๋์ํ๊ฐ ๋ ๊ฒ์
๋๋ค.</p><br/><h3 id="Conclusion"><a href="#Conclusion" class="headerlink" title="Conclusion"></a>Conclusion</h3><br/><p>๊ธฐ์กด CCTV ๊ฐ์ ์์คํ
์ ๋ฒ๋ ค์ง ๋ฌผ์ฒด๊ฐ ํ์น ๋ฌผ๊ฑด ํน์ Ghost region์ ์คํํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ต๋๋ค. ๋ฐ๋ผ์, ์์ ์ธ๊ฐ์ง ์ฌ๋ก๋ฅผ ์ ํํ ๊ตฌ๋ถํ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ํ์์ต๋๋ค.</p><br/><p>CSO_DF, SO_VF, SO_LB์ ๊ฐ์ ์์ญ์ ๋ํ ๋น๊ต๋ถ์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๋ฐฐ๊ฒฝ์ ๊ฑฐ์์์์ ํ๋ณด ๊ฐ์ฒด๋ค์ ์ ํํ ๊ตฌ๋ถํ ์ ์๊ฒ ๋์์ต๋๋ค.</p><br/><hr><br/><p>ํ์ฌ ํ์ฌ์์ CCTV๋ก ์ ๊ธฐ๋ฌผ์ฒด๋ฅผ ๊ฒ์ถํ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ค๊ณ์ค์ ์์ต๋๋ค. ์์ ๊ธฐ์ ๋ Mask R-CNN์ ๊ฒฝ์ฐ ์ค์๊ฐ์ด๋ผ๊ณ ํ๊ธฐ์ ๋ถ์กฑํ FPS๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก ์ ํฉํ์ง ์์ CNN ๋ชจ๋ธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํ์ง๋ง, YOLO ๋ชจ๋ธ์ ์ด์ฉํ ๊ฒฝ์ฐ ํจ์ฌ ๋์ ์ฑ๋ฅ์ ๋ณด์ฌ์ฃผ๊ณ ์์ต๋๋ค. </p><br/><h3 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h3><br/><p><a href="https://ieeexplore.ieee.org/abstract/document/9079525">Detection of Abandoned and Stolen Objects Based on Dual Background Model and Mask R-CNN</a></p>]]></content>
<categories>
<category> Paper Review </category>
</categories>
<tags>
<tag> Mask R-CNN </tag>
<tag> background subtraction </tag>
<tag> Detection of Abandoned and Stolen Objects </tag>
</tags>
</entry>
<entry>
<title>[C++] E03. Smart Pointers.</title>
<link href="2021/07/21/cpp-02/"/>
<url>2021/07/21/cpp-02/</url>
<content type="html"><![CDATA[<h1 id="Smart-Pointers"><a href="#Smart-Pointers" class="headerlink" title="Smart Pointers"></a>Smart Pointers</h1><br/><blockquote><p>C++ 11</p><p>#include <memory></p></blockquote><br/><p>์๋ฐ์ C++์ ์ฐจ์ด์ ์ค ํ๊ฐ์ง๋ Garbage collection์ ์ ๋ฌด์
๋๋ค. ์๋ฐ์ JVM(Java Virtual Memory)๊ฐ Garbage Collection์ด๋ผ๋ ํ๋ก์ธ์ค๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ์ด๋ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์์ ์ผ๋ก ์ฐพ์๋ด์ ์ ๊ฑฐํฉ๋๋ค. ์ฆ, ์คํ ์ค์ธ JVM ๋ด๋ถ์์ ์ผ์ด๋ฉ๋๋ค. ํ์ฌ๋ ๋ฉํ์ ๊ฐ๊น์์ก๋ค๊ณค ํ์ง๋ง ์ธ๊ฐ์ด ์ ์ดํ ์ ์๋ ๋ด์์ ์ฌ์ ํ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ํ๋ ๊ฒ์ด ์ข๋ค๊ณ ํ ์ ์์ต๋๋ค.</p><p>โ </p><br/><p>โ๋ฉํ์ ๊ฐ๊น๋คโ๋ ๊ฐ๋ฐ์๊ฐ ์ด์์ฒด์ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ก๊ทธ๋จ์ ์ผ๋ก, ์ฆ ์ฝ๋๋ฅผ ์์ฑํจ์ผ๋ก์จ ๊ด๋ฆฌํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. </p><p>โ </p><br/><p>๋ฐ๋ผ์, C++์์๋ ๋ฉ๋ชจ๋ฆฌ์ ์ง์ ๋ฐ ํด์ ๋ฅผ new, delete๋ฅผ ํตํด ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ์ค์ ํด์ผ ํ๋๋ฐ ์ธ๊ฐ์ ์ฌํ๊น์ง ๊ทธ๋์๋ฏ ์ค์๋ฅผ ํ๊ธฐ ๋ง๋ จ์
๋๋ค. ๊ทธ๋ด ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ๋์(memory leak)์ด ๋ฐ์ํ๊ฒ ๋๊ณ ์ค๋ฅ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์ด๋ฌํ ์ค์๋ฅผ ๋ฐฉ์งํ ์ ์๋ ๋ฐฉ๋ฒ ์ค ํ๊ฐ์ง๊ฐ ๋ฐ๋ก ์ค๋งํธํฌ์ธํฐ์
๋๋ค.</p><br/><h2 id="Resource-Acquisition-Is-Initialization-RAII"><a href="#Resource-Acquisition-Is-Initialization-RAII" class="headerlink" title="Resource Acquisition Is Initialization - RAII"></a>Resource Acquisition Is Initialization - RAII</h2><br/><p>C++ ์ฐฝ์์์ธ ๋น์ผ๋ค ์คํธ๋ก์คํธ๋ฃน์ C++์์ ์์์ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ผ๋ก RAII์ ํจํด์ ์ ์ํ์์ต๋๋ค. ์ง์ญํ๋ฉด **โ์์์ ํ๋์ ์ด๊ธฐํ๋คโ**์ธ๋ฐ ์ด๋ ์์ ๊ด๋ฆฌ๋ฅผ ์คํ์ ํ ๋นํ ๊ฐ์ฒด๋ฅผ ํตํด ์ํํ๊ฒ ๋๋ ๊ฒ์
๋๋ค.</p><br/><p>์์ธ๊ฐ ๋ฐ์ํ์ฌ ํจ์ ํน์ ํด๋น ์ค์ฝํ๋ฅผ ๋ฒ์ด๋ ๊ฒฝ์ฐ ํด๋น ์คํ์ ์ ์๋์ด ์๋ ๋ชจ๋ ๊ฐ์ฒด๋ค์ ์๋ฉธ์๊ฐ ํธ์ถ๋์ง๋ง(<strong>stack unwinding</strong>) ๊ฐ์ฒด๊ฐ ์๋ ํฌ์ธํฐ๋ค์ ๊ฒฝ์ฐ ์๋ฉธ์๊ฐ ํธ์ถ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ ๋์(memory leak)๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. ์ฆ, <strong>์์๊ด๋ฆฌ๋ฅผ ์คํ์ ๊ฐ์ฒด(ํฌ์ธํฐ ๊ฐ์ฒด)๋ฅผ ํตํด ์ํํ๊ฒ ๋๋ ๊ฒ์
๋๋ค.</strong></p><br/><p>์ค๋งํธ ํฌ์ธํฐ๋ ํฌ์ธํฐ์ฒ๋ผ ์ฌ์ฉํ๋ ํด๋์ค ํ
ํ๋ฆฟ์ผ๋ก ๊ฐ์ฒด๊ฐ ์๋ฉธ๋ ๋ ์๋์ผ๋ก ํธ์ถ๋๋ ์๋ฉธ์ ํจ์๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ํด์ ํด์ฃผ๋ ์ญํ ์ ์ํํฉ๋๋ค.</p><p>โ </p><br/><p><strong>์ค๋งํธ ํฌ์ธํฐ๋ฅผ ์ง์ ํ๋ ๋ฐฉ์์ <code>shared_ptr</code>, <code>unique_ptr</code>์ด ์์ผ๋ฉฐ ์ง๊ธ๋ถํฐ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.</strong></p><br/><br/><h2 id="shared-ptr"><a href="#shared-ptr" class="headerlink" title="shared_ptr"></a>shared_ptr</h2><br/><p>Reference Counting์ ์ด์ฉํ๋ ์ค๋งํธ ํฌ์ธํฐ๋ก ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ๋ ๋ด๋ถ์ ์ผ๋ก ๋ ํผ๋ฐ์ค ์นด์ดํธ๋ฅผ ์ ์งํ๋ค๊ฐ ์ด ๊ฐ์ด 0์ด๋ ๊ฒฝ์ฐ ๋ ์ด์ ํด๋น ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๊ณ ํ๋จํ์ฌ ์๋์ผ๋ก ํด๋น ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํฉ๋๋ค. </p><br/><p>shared_ptr ๊ฐ์ฒด๊ฐ ์ ์ธ๋ ์ค์ฝํ๋ฅผ ๋ฒ์ด๋๊ฒ ๋๋ฉด ์๋ฉธ์๊ฐ ํธ์ถ๋ฉ๋๋ค.</p><br/><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">delete</span> Pointer;</span><br></pre></td></tr></table></figure><br/><p>๊ฐ๋จํ ์์ ๋ฅผ ํตํด ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.</p><br/><figure class="highlight c++"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><memory> </span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="function"><span class="built_in">std</span>::<span class="built_in">shared_ptr</span><<span class="keyword">int</span>> <span class="title">s1</span><span class="params">(<span class="keyword">new</span> <span class="keyword">int</span>(<span class="number">10</span>))</span></span>; <span class="comment">// makeํจ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์์ฑ</span></span><br><span class="line"><span class="comment">// std::shared_ptr<int> s1 = new int(); // error</span></span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">shared_ptr</span><<span class="keyword">int</span>> s2 = <span class="built_in">std</span>::make_shared<<span class="keyword">int</span>>(<span class="number">10</span>); <span class="comment">// makeํจ์๋ฅผ ํตํด ์์ฑ</span></span><br><span class="line"></span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << *s1 << <span class="built_in">std</span>::<span class="built_in">endl</span>;</span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << *s2 << <span class="built_in">std</span>::<span class="built_in">endl</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><br/><img src = "/image/smartp1.jpg" align = "center"/><br/><p>์์ ์ฝ๋๋ฅผ ์คํํ ์ ์๋์ ๊ฐ์ด ์ถ๋ ฅ๋ฉ๋๋ค.</p><br/><p>์ด ๋, ์ค๊ฐ์ ์ฃผ์์ฒ๋ฆฌํ ๋ฌธ์ฅ์ ์๋ฌ๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ๊ทธ ์ด์ ๋ shared_ptr์ <strong>explicit</strong>ํ ํ์ง์ ๋ง ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์
๋๋ค.</p><br/><figure class="highlight plain"><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">//output</span><br><span class="line">10</span><br><span class="line">10</span><br></pre></td></tr></table></figure><br/><p>์์ Reference Counting์ด ๋๋ค๊ณ ํ์ผ๋ฏ๋ก ์ด๋ฒ์๋ ์ค์ count๋ ์ซ์๋ฅผ ์ถ๋ ฅํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.</p><br/><h3 id="Reference-counting"><a href="#Reference-counting" class="headerlink" title="Reference counting"></a>Reference counting</h3><br/><p>shared_ptr์ ๊ธฐ๋ณธ์ ์ธ Reference counting ๋์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.</p><br/><blockquote><ol><li>shared_ptr ๋ณ์์ Reference counting์ 0์
๋๋ค.</li><li>make_shared๋ฅผ ์ฌ์ฉํ์ฌ shared_ptr ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด Reference counting์ด 1์ด ๋ฉ๋๋ค.</li><li>๋ค๋ฅธ shared_ptr ๋ณ์์ ๋์
ํ๋ฉด Reference counting์ด 1์ฉ ์ฆ๊ฐํ๊ฒ ๋ฉ๋๋ค. ๋์
ํ ๋ณ์ ๋ํ Reference counting์ 2๊ฐ ๋ฉ๋๋ค.</li><li>nullptr์ ๋์
ํ ๋ณ์๋ Reference counting์ 0์ด ๋ฉ๋๋ค. ๊ฐ์ ํฌ์ธํฐ๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ ๋ค๋ฅธ ๋ณ์๋ 1์ฉ ๊ฐ์ํฉ๋๋ค.</li><li>reset()์ ์ฌ์ฉํด๋ nullptr์ฒ๋ผ ์ฐธ์กฐ ์นด์ดํฐ๊ฐ 0์ด ๋ฉ๋๋ค.</li></ol></blockquote><br/><p>์์๋ฅผ ํตํด ์๋ฅผ ํ์ธํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.</p><br/><figure class="highlight c++"><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="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><memory> </span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">shared_ptr</span><<span class="keyword">int</span>> s;</span><br><span class="line"></span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << s.use_count() << <span class="built_in">std</span>::<span class="built_in">endl</span>; <span class="comment">// Reference count = 0</span></span><br><span class="line"></span><br><span class="line"> s = <span class="built_in">std</span>::make_shared<<span class="keyword">int</span>>(<span class="number">10</span>);</span><br><span class="line"></span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << s.use_count() << <span class="built_in">std</span>::<span class="built_in">endl</span>; <span class="comment">// Reference count = 1</span></span><br><span class="line"></span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">shared_ptr</span><<span class="keyword">int</span>> s2;</span><br><span class="line"></span><br><span class="line"> s2 = s; <span class="comment">// Reference count of s2 = 2</span></span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << s.use_count() << <span class="string">" "</span> << s2.use_count() << <span class="built_in">std</span>::<span class="built_in">endl</span>; <span class="comment">// Reference count of s = 2, s2 = 2 </span></span><br><span class="line"></span><br><span class="line"> s = <span class="literal">nullptr</span>;</span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << s.use_count() << <span class="string">" "</span> << s2.use_count() << <span class="built_in">std</span>::<span class="built_in">endl</span>; <span class="comment">// Reference count of s = 0, s2 = 1</span></span><br><span class="line"></span><br><span class="line"> s2.reset();</span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << s.use_count() << <span class="string">" "</span> << s2.use_count() << <span class="built_in">std</span>::<span class="built_in">endl</span>; <span class="comment">// Reference count of s = 0, s2 = 0</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><br/><p>๋ํ, shared_ptr๊ฐ์ฒด๊ฐ ํด๋น ์ค์ฝํ๋ฅผ ๋ฒ์ด๋ ๊ฒฝ์ฐ ์ฐธ์กฐ ์นด์ดํฐ๋ฅผ 1 ๊ฐ์์ํต๋๋ค.</p><br/><blockquote><ol><li>์ด๊ธฐ Reference counting๋ 1์
๋๋ค.</li><li>๋ค๋ฅธ ๋ณ์์ ๋์
ํ ๊ฒฝ์ฐ Reference counting๋ 1 ์ฆ๊ฐํฉ๋๋ค.</li><li>์ค์ฝํ๋ฅผ ๋ฒ์ด๋ ๊ฒฝ์ฐ ํด๋น ์ค์ฝํ๋ด์ shared_ptr์ ์๋ฉธ๋๋ฉฐ ์ฐธ์กฐํ๊ณ ์๋ shared_ptr์ Reference counting์ 1 ๊ฐ์ํฉ๋๋ค.</li></ol></blockquote><br/><p>๊ทธ ์์๋ ์๋์ ๊ฐ์ต๋๋ค.</p><br/><figure class="highlight c++"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><memory> </span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">shared_ptr</span><<span class="keyword">int</span>> s1 = <span class="built_in">std</span>::make_shared<<span class="keyword">int</span>>(<span class="number">10</span>); </span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << s1.use_count() << <span class="built_in">std</span>::<span class="built_in">endl</span>; <span class="comment">// Reference count of s1 = 1</span></span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">shared_ptr</span><<span class="keyword">int</span>> s2 = s1; <span class="comment">// Reference count of s1 = 2, s2 = 2</span></span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << s1.use_count() << <span class="string">" "</span> << s2.use_count() << <span class="built_in">std</span>::<span class="built_in">endl</span>;</span><br><span class="line">} <span class="comment">// shared_ptr s2 is deleted</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">std</span>::<span class="built_in">cout</span> << s1.use_count() << <span class="built_in">std</span>::<span class="built_in">endl</span>; <span class="comment">//Reference count of s1 = 1</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><br/><h3 id="Call-by-reference"><a href="#Call-by-reference" class="headerlink" title="Call by reference"></a>Call by reference</h3><br/><p>๋ํ, Call by reference๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ Reference count๊ฐ ์ฆ๊ฐํ์ง ์์ต๋๋ค.</p><br/><ol><li>Call by Reference๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ</li></ol><br/><figure class="highlight c++"><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="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><memory> </span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">f</span><span class="params">(<span class="built_in">std</span>::<span class="built_in">shared_ptr</span><<span class="keyword">int</span>> &s)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << s.use_count() << <span class="built_in">std</span>::<span class="built_in">endl</span>; <span class="comment">// call by reference do not increase reference count</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">shared_ptr</span><<span class="keyword">int</span>> s1 = <span class="built_in">std</span>::make_shared<<span class="keyword">int</span>>(<span class="number">10</span>);</span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << s1.use_count() << <span class="built_in">std</span>::<span class="built_in">endl</span>; </span><br><span class="line"></span><br><span class="line"> f(s1);</span><br><span class="line"></span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << s1.use_count() << <span class="built_in">std</span>::<span class="built_in">endl</span>; </span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><br/><figure class="highlight plain"><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">//output</span><br><span class="line">1</span><br><span class="line">1</span><br><span class="line">1</span><br></pre></td></tr></table></figure><br/><ol start="2"><li>Call by Reference๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ</li></ol><br/><figure class="highlight c++"><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="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><memory> </span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">f</span><span class="params">(<span class="built_in">std</span>::<span class="built_in">shared_ptr</span><<span class="keyword">int</span>> s)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << s.use_count() << <span class="built_in">std</span>::<span class="built_in">endl</span>; <span class="comment">// increase Reference count of s</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">shared_ptr</span><<span class="keyword">int</span>> s1 = <span class="built_in">std</span>::make_shared<<span class="keyword">int</span>>(<span class="number">10</span>);</span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << s1.use_count() << <span class="built_in">std</span>::<span class="built_in">endl</span>; </span><br><span class="line"></span><br><span class="line"> f(s1);</span><br><span class="line"></span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << s1.use_count() << <span class="built_in">std</span>::<span class="built_in">endl</span>; </span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><br/><figure class="highlight plain"><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">//output</span><br><span class="line">1</span><br><span class="line">2</span><br><span class="line">1</span><br></pre></td></tr></table></figure><br/><h3 id="move"><a href="#move" class="headerlink" title="move()"></a>move()</h3><br/><p>move๋ฅผ ์ฌ์ฉํ์ฌ shared_ptr ๋ณ์๊ฐ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ๋ค๋ฅธ shared_ptr๋ก ์ด๋ํ ์ ์์ต๋๋ค. ๊ธฐ์กด shared_ptr์ ์ฐธ์กฐํ๋ ๊ฒ์ด ์ฌ๋ผ์ง๋ฏ๋ก Reference counting์ 0์ด ๋ฉ๋๋ค.</p><br/><figure class="highlight c++"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><memory> </span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">shared_ptr</span><<span class="keyword">int</span>> s = <span class="built_in">std</span>::make_shared<<span class="keyword">int</span>>(<span class="number">10</span>); <span class="comment">// makeํจ์๋ฅผ ํตํ ๊ฐ์ฒด ์์ฑ</span></span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << s.use_count() << <span class="string">" "</span> << *s << <span class="built_in">std</span>::<span class="built_in">endl</span>; <span class="comment">// Reference count of s = 1</span></span><br><span class="line"></span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">shared_ptr</span><<span class="keyword">int</span>> s2; <span class="comment">// s2๊ฐ์ฒด ์์ฑ , Reference count of s2 = 0</span></span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << s.use_count() << <span class="string">" "</span> << s2.use_count() << <span class="built_in">std</span>::<span class="built_in">endl</span>; <span class="comment">// Reference count of s = 1, s2 = 0 </span></span><br><span class="line"></span><br><span class="line"> s2 = <span class="built_in">std</span>::move(s); <span class="comment">// s์ ์์ ๊ถ์ s2๋ก ์ด๋</span></span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << s.use_count() << <span class="string">" "</span> << s2.use_count() << <span class="built_in">std</span>::<span class="built_in">endl</span>; <span class="comment">// Reference count of s = 0, s2 = 1</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><br/><figure class="highlight plain"><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">//output</span><br><span class="line">1 10</span><br><span class="line">1 0</span><br><span class="line">0 1</span><br></pre></td></tr></table></figure><br/><p>์ฒซ๋ฒ์งธ๋ก make_shared๋ฅผ ํตํด ๊ฐ์ฒด ์์ฑ์ reference count๋ ์ฆ๊ฐํ์ง๋ง makeํจ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ ์ธ๋ง ํ ์ ์ฐธ์กฐํ๊ณ ์๋ ๊ฒ์ด ์์ผ๋ฏ๋ก reference count๋ 0์
๋๋ค.</p><br/><p>๋๋ฒ์งธ๋ก s2์ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ s์ ์์ ๊ถ์ move()ํจ์๋ฅผ ํตํด ์ฎ๊ธธ ์ s์ reference count๋ 0์ด๋๊ณ s2์ reference count๋ 1์ด๋ฉ๋๋ค.</p><br/><h3 id="reset"><a href="#reset" class="headerlink" title="reset()"></a>reset()</h3><br/><p>shared_ptr ๊ฐ์ฒด๊ฐ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ์๋กญ๊ฒ ์ฐ๊ฒฐํ๊ฑฐ๋ ๊ธฐ์กด์ ๊ฒ์ ์ฐ๊ฒฐ ํด์ ํ๋ ๋ฉ์๋์
๋๋ค. ํ๋ผ๋ฏธํฐ๊ฐ ์์๊ฒฝ์ฐ๋ ์ฐ๊ฒฐํด์ ํ๊ณ ์์ ๊ฒฝ์ฐ์๋ ์ฌ์ฐ๊ฒฐ์ ํ๊ฒ ๋ฉ๋๋ค.</p><br/><p>์์๋ฅผ ํตํด ์ดํด๋ณด๊ฒ ์ต๋๋ค.</p><br/><ol><li>ํ๋ง๋ฆฌํฐ๊ฐ ์์ด ์ฌ์ฉํ ๊ฒฝ์ฐ</li></ol><br/><figure class="highlight c++"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><memory> </span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">shared_ptr</span><<span class="keyword">int</span>> s1 = <span class="built_in">std</span>::make_shared<<span class="keyword">int</span>>(<span class="number">10</span>);</span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << s1.use_count() << <span class="built_in">std</span>::<span class="built_in">endl</span>; <span class="comment">// Reference count of s1 1</span></span><br><span class="line"></span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">shared_ptr</span><<span class="keyword">int</span>> s2 = s1; <span class="comment">// Reference count of s1, s2 = 2</span></span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << s1.use_count() << <span class="string">" "</span> << s2.use_count() << <span class="built_in">std</span>::<span class="built_in">endl</span>;</span><br><span class="line"></span><br><span class="line"> s1.reset(); <span class="comment">// Reference count of s1 = 0, s2 = 1</span></span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << s1.use_count() << <span class="string">" "</span> << s2.use_count() << <span class="built_in">std</span>::<span class="built_in">endl</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><br/><ol start="2"><li>ํ๋ผ๋ฏธํฐ๊ฐ ์์ ๊ฒฝ์ฐ</li></ol><br/><figure class="highlight c++"><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"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><memory> </span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">shared_ptr</span><<span class="keyword">int</span>> s1 = <span class="built_in">std</span>::make_shared<<span class="keyword">int</span>>(<span class="number">10</span>); <span class="comment">// s1 point 10, reference count = 1</span></span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << s1.use_count() << <span class="string">" "</span> << *s1 << <span class="built_in">std</span>::<span class="built_in">endl</span>;</span><br><span class="line"></span><br><span class="line"> s1.reset(<span class="keyword">new</span> <span class="keyword">int</span>(<span class="number">34</span>)); <span class="comment">// s1 point 34, reference count = 1</span></span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << s1.use_count() << <span class="string">" "</span> << *s1 << <span class="built_in">std</span>::<span class="built_in">endl</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><br/><p>๋จ, <code>nullptr</code>์ ๋์
ํ ๊ฒฝ์ฐ์๋ ํ๋ผ๋ฏธํฐ๊ฐ ์๋ reset() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๊ฒ๊ณผ ๋์ผํ ๋์์ ์ํํฉ๋๋ค.</p><br/><h3 id="shared-ptr์-์ฃผ์ํ -์ "><a href="#shared-ptr์-์ฃผ์ํ -์ " class="headerlink" title="shared_ptr์ ์ฃผ์ํ ์ "></a>shared_ptr์ ์ฃผ์ํ ์ </h3><br/><blockquote><p>๋ ์ด์์ shared_ptr์ด ๊ฐ์ ํฌ์ธํฐ๋ฅผ ๊ฐ๋ฆฌํค๋ฉด ์๋ฉ๋๋ค.</p></blockquote><br/><p>๊ทธ ์ด์ ๋ ํ๋์ shared_ptr์ ๊ฐ์ฒด๋ฅผ ์๋ฉธ์ํค๋ ค ํ์ง๋ง ๋ค๋ฅธ shared_ptr ๊ฐ์ฒด๋ ์ฌ์ ํ ํฌ์ธํฐ๋ฅผ ๊ฐ๋ฆฌํค๊ธฐ ๋๋ฌธ์ ์๋ฉธ์ด ๋์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค.</p><br/><figure class="highlight c++"><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="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><memory> </span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> *num = <span class="keyword">new</span> <span class="keyword">int</span>(<span class="number">10</span>);</span><br><span class="line"> </span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">shared_ptr</span><<span class="keyword">int</span>> s1;</span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">shared_ptr</span><<span class="keyword">int</span>> s2;</span><br><span class="line"> s1.reset(num);</span><br><span class="line"> s2.reset(num);</span><br><span class="line"></span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << s1.use_count() << <span class="string">" "</span> << *s1 << <span class="built_in">std</span>::<span class="built_in">endl</span>;</span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << s2.use_count() << <span class="string">" "</span> << *s2 << <span class="built_in">std</span>::<span class="built_in">endl</span>;</span><br><span class="line"></span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << *num << <span class="built_in">std</span>::<span class="built_in">endl</span>; <span class="comment">// num = 10</span></span><br><span class="line"></span><br><span class="line"> s2.reset(); <span class="comment">// s2๋ฅผ ํด์ ํ ๊ฒฝ์ฐ s2๊ฐ ๊ฐ๋ฆฌํค๋ num pointer</span></span><br><span class="line"></span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << *num << <span class="built_in">std</span>::<span class="built_in">endl</span>; <span class="comment">// num = Trash value</span></span><br><span class="line"> </span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << s1.use_count() << <span class="string">" "</span> << *s1 << <span class="built_in">std</span>::<span class="built_in">endl</span>; <span class="comment">// reference count of s1 = 1, *s1 = Trash value</span></span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << s2.use_count() << <span class="string">" "</span> << *s2 << <span class="built_in">std</span>::<span class="built_in">endl</span>; <span class="comment">// Reference count of s2 = 0, s2 = Nullptr</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><br/><blockquote><ol start="2"><li> <del>ํ(heap)์์ญ์ด ์๋ ์คํ(stack)์์ญ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ฌ shared_ptr ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ์๋ฉ๋๋ค.</del></li></ol></blockquote><br/><p><del>ํ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ค์ฝํ๋ฅผ ๋ฒ์ด๋๋ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ์ง๋์ง๋ง ์คํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ค์ฝํ๋ฅผ ๋ฒ์ด๋๋ฉด ์ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์
๋๋ค.</del></p><br/><figure class="highlight c++"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><memory> </span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">f1</span><span class="params">(<span class="built_in">std</span>::<span class="built_in">shared_ptr</span><<span class="keyword">int</span>> &s1)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> *num1 = <span class="keyword">new</span> <span class="keyword">int</span>(<span class="number">10</span>); <span class="comment">// heap memory</span></span><br><span class="line"> s1.reset(num1);</span><br><span class="line"></span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << <span class="string">"in function : "</span> << s1.use_count() << <span class="string">" "</span> << *s1 << <span class="built_in">std</span>::<span class="built_in">endl</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">f2</span><span class="params">(<span class="built_in">std</span>::<span class="built_in">shared_ptr</span><<span class="keyword">int</span>> &s2)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> num2 = <span class="number">20</span>;</span><br><span class="line"> s2.reset(&num2); <span class="comment">// stack memory</span></span><br><span class="line"></span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << <span class="string">"in function : "</span> << s2.use_count() << <span class="string">" "</span> << *s2 << <span class="built_in">std</span>::<span class="built_in">endl</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">shared_ptr</span><<span class="keyword">int</span>> s1;</span><br><span class="line"></span><br><span class="line"> f1(s1);</span><br><span class="line"></span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << <span class="string">"out of function : "</span> << s1.use_count() << <span class="string">" "</span> << *s1 << <span class="built_in">std</span>::<span class="built_in">endl</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">shared_ptr</span><<span class="keyword">int</span>> s2;</span><br><span class="line"></span><br><span class="line"> f2(s2);</span><br><span class="line"></span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> << <span class="string">"out of function : "</span> << s2.use_count() << <span class="string">" "</span> << *s2 << <span class="built_in">std</span>::<span class="built_in">endl</span>; <span class="comment">// print correctly......</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><br/><h2 id="unique-ptr"><a href="#unique-ptr" class="headerlink" title="unique_ptr"></a>unique_ptr</h2><br/><p>ํ๋์ ์ค๋งํธ ํฌ์ธํฐ๋ง์ด ํน์ ๊ฐ์ฒด๋ฅผ ์์ ํ ์ ์๋๋ก, ๊ฐ์ฒด์ ์์ ๊ถ์ ๊ฐ๋
์ ๋์
ํ ์ค๋งํธ ํฌ์ธํฐ์
๋๋ค.</p><p>โ </p><br/><p>์ด ์ค๋งํธ ํฌ์ธํฐ๋ ํด๋น ๊ฐ์ฒด์ ์์ ๊ถ์ ๊ฐ์ง๊ณ ์์ ๋๋ง, ์๋ฉธ์๊ฐ ํด๋น๊ฐ์ฒด๋ฅผ ์ญ์ ํ ์ ์์ต๋๋ค.</p><p>โ </p><br/><p>๋ํ move() ๋ฉค๋ฒํจ์๋ฅผ ํตํด ์์ ๊ถ์ ์ด์ ํ ์๋ ์์ง๋ง ๋ณต์ฌํ ์๋ ์์ต๋๋ค.</p><p>์์ ๊ถ ์ด์ ์ด ๋ฐ์ํ๋ฉด ์ด์ ์ ์ธ์คํด์ค๋ ํด๋น ๊ฐ์ฒด๋ฅผ ์์ ํ์ง ์๊ฒ ์ฌ์ค์ ๋ฉ๋๋ค.</p><p>โ </p><br/><p>์ด ๋, C++ 14 ์ดํ๋ถํฐ ์ ๊ณต๋๋ make_unique()ํจ์๋ฅผ ์ด์ฉํ๋ฉด ๋ ์์ ํ๊ฒ ์์ฑํ ์ ์์ต๋๋ค. ๋ํ C++ 14 ์ดํ ๋ฒ์ ์ ์ฌ์ฉํ๋ค๋ฉด ์ด๋ ๊ถ์ฅ๋๋ ํจ์์ธ๋ฐ ๊ทธ ์ด์ ๋ ์๋์ ๊ฐ์ต๋๋ค.</p><p>โ </p><br/><figure class="highlight c++"><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">autoupw1(<span class="built_in">std</span>::make_unique<Widget>());<span class="comment">// make ํจ์ ์ฌ์ฉ</span></span><br><span class="line"><span class="built_in">std</span>::<span class="built_in">unique_ptr</span><Widget>upw2(newWidget);<span class="comment">// make ํจ์ ๋น์ฌ์ฉ</span></span><br><span class="line"></span><br><span class="line">autospw1(<span class="built_in">std</span>::make_shared<Widget>());<span class="comment">// make ํจ์ ์ฌ์ฉ</span></span><br><span class="line"><span class="built_in">std</span>::<span class="built_in">shared_ptr</span><Widget>spw2(newWidget);<span class="comment">// make ํจ์ ๋น์ฌ์ฉ</span></span><br></pre></td></tr></table></figure><br/><p> ์์ ๊ฐ์ด make ํจ์๋ฅผ ์ฌ์ฉํ์ ๋์ ์ํ์ ๋์ ์ฐจ์ด๋ฅผ ๋ณผ ์ ์์ต๋๋ค.</p><br/><blockquote><ol><li>Widget์ด๋ผ๋ ํ์
์ด ์ค๋ณต ์ฌ์ฉ</li></ol></blockquote><br/><p>makeํจ์๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด widget์ด๋ผ๋ type์ด ๋ ๋ฒ ๋ฑ์ฅํ๊ณ ์์ต๋๋ค. ์ด๋ ์ค๋ณต๋๋ ์ฝ๋๋ฅผ ์ง์ํด์ผํ๋ SW ์์ง๋์ด๋ง ๊ด์ ์์ ์ข์ง ์์ ๊ตฌ๋ฌธ์
๋๋ค.</p><br/><p>์ค๋ณต ์ฝ๋๊ฐ ์
๋ ฅ๋์ ๋ ์๊ธฐ๋ ์ปดํ์ผ ํ์์ ์ฆ๊ฐ, ์ฝ๋๋์ ์ฆ๊ฐ, ์ผ์นํ์ง ์๋ ์ฝ๋์ ์ฆ๊ฐ ๋ฑ์ ์ด์ ๋ก ์๊ธธ ์ ์๋ ๋ฒ๊ทธ์ ๋ฌธ์ ๋๋ฌธ์ makeํจ์๊ฐ ๊ถ์ฅ๋ฉ๋๋ค.</p><p>โ </p><br/><blockquote><ol start="2"><li>exception safety</li></ol></blockquote><br/><p>๋ค์์ ์์๋ฅผ ํตํด ์ดํด๋ณด๊ฒ ์ต๋๋ค.</p><br/><p>์ฐ์ ์์๋ฅผ ํตํด Widget ๊ฐ์ฒด๋ฅผ ์ฒ๋ฆฌํ๋ ํจ์๊ฐ ๋ค์๊ณผ ๊ฐ์ ๋</p><p><code>void processWidget(std::shared_ptr<Widget> spw, int priority);</code></p><br/><p> processWidget์ด ํญ์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋๋ shared_ptr์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค๋ฉด ํ๋นํ๋คํ ์ ์์ต๋๋ค.</p><br/><p>์ฌ๊ธฐ์ ์ฐ์ ์์๋ฅผ ๊ณ์ฐํ๋ ํจ์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ง์ ํ๊ณ </p><br/><p><code>int computePriority();</code></p><br/><p>๋ค์๊ณผ ๊ฐ์ด makeํจ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ processWidget์ ์คํํ ๊ฒฝ์ฐ</p><p>โ </p><br/><p><code>processWidget(std::shared_ptr<Widget>(new Widget), computePriority());</code></p><p> ์ ํจ์๋ ์ธ๊ฐ์ง ๋์์ด ์๋ฃ๋ ํ์ ๋์ํฉ๋๋ค.</p><br/><blockquote><ol><li><p>์๋ก์ด Widget ๊ฐ์ฒด ์์ฑ ( new๋ฅผ ํตํด )</p></li><li><p>Widget ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ์ ๋ฌํด์ std::shared_ptr ์์ฑ</p></li><li><p>compute_priority ํจ์ ์คํ</p></li></ol></blockquote><p>โ </p><br/><p>์ ์ธ๊ฐ์ง ๋์์ ์ปดํ์ผ๋ฌ๋ง๋ค ๋ค๋ฅธ ์์๋ก ์งํ๋ ์ ์์ต๋๋ค.</p><br/><blockquote><p>1-2-3์ ๊ฒฝ์ฐ์ 3์์ ์์ธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ std::shared_ptr๊ฐ ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ฅผ ํ๊ฒ ์ง๋ง</p><p>1-3-2์ ๊ฒฝ์ฐ์ 3์์ ์์ธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ 2์์ std::shared_ptr์ ์ํด์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ด๋ฆฌ๋ ์ ์์ผ๋ฏ๋ก memory leak์ด ๋ฐ์ํฉ๋๋ค.</p></blockquote><p>โ </p><br/><p>ํ์ง๋ง, makeํจ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ 1๊ณผ 2๊ฐ ๋์์ ์งํ์ด ๋์ด ์ปดํ์ผ๋ฌ์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง ์๊ฒ๋ฉ๋๋ค.</p><p>โ </p><br/><p>๋ค๋ง, makeํจ์๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ์ฌ์ฉํ์ง ๋ง์์ผํฉ๋๋ค.</p><br/><blockquote><ol><li>์ญ์ ์๋ฅผ ์ง์ ํ๋ ค๊ณ ํ ๋</li><li>std::initializer_list๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๊ฐ๋ ์์ฑ์๊ฐ ์ค๋ฒ๋ก๋ ๋์ด์๋ ํด๋์ค</li></ol></blockquote><p>โ </p><br/><br/><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><br/><ol><li><a href="https://itability.tistory.com/37">https://itability.tistory.com/37</a></li><li><a href="https://modoocode.com/229">https://modoocode.com/229</a></li></ol>]]></content>
<categories>
<category> C++ </category>
</categories>
<tags>
<tag> C++ </tag>
<tag> smartPointers </tag>
<tag> jariItSue </tag>
</tags>
</entry>
<entry>
<title>[C++] E02. OpenCV cv::Mat</title>
<link href="2021/07/14/opencv-01/"/>
<url>2021/07/14/opencv-01/</url>
<content type="html"><![CDATA[<h1 id="OpenCV"><a href="#OpenCV" class="headerlink" title="OpenCV"></a>OpenCV</h1><br/><hr><h2 id="cv-Mat"><a href="#cv-Mat" class="headerlink" title="cv::Mat"></a>cv::Mat</h2><br/><p>OpenCV์ Mat์๋ฃ๊ตฌ์กฐ์ ๋ํด์ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.</p><p>๋จผ์ ๊ฐ๋จํ ์์ ๋ฅผ ํตํด ์ด๋ฏธ์ง๋ฅผ ์ฝ์ด Mat์ ์ด๋ป๊ฒ ์ ์ฅ๋๋์ง ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.</p><blockquote><p>opencv๋ฅผ ์ด์ฉํ์ฌ imread๋ฅผ ํ ์ RGB๋ก ์์๊ฐ ์๋ BGR๋ก ์ฝ๊ฒ๋ฉ๋๋ค. ๋ฐ๋ผ์, ์ฑ๋๋ณ๋ก ์กฐ์์ ํ๊ณ ์ถ๋ค๋ฉด cv::cvtColor()๋ฅผ ํตํด BGR2RGB๋ฅผ ํ๊ฑฐ๋ ์ฑ๋ ์์๋ฅผ ํท๊ฐ๋ฆฌ์ง ์๊ณ ์์
์ ํด์ผํฉ๋๋ค.</p></blockquote><figure class="highlight c++"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">"opencv2/opencv.hpp"</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><iostream> </span></span></span><br><span class="line"> </span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>; </span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">int</span>, <span class="keyword">char</span>**)</span> </span></span><br><span class="line"><span class="function"></span>{ </span><br><span class="line"> cv::Mat img_color = cv::imread(<span class="string">"./test.jpg"</span>);</span><br><span class="line"></span><br><span class="line"> cv::namedWindow(<span class="string">"name"</span>);</span><br><span class="line"></span><br><span class="line"> cv::imshow(<span class="string">"name"</span>, img_color);</span><br><span class="line"></span><br><span class="line"><span class="keyword">char</span> ch = cv::waitKey();<span class="comment">// ๋ฌดํ ๋๊ธฐ</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (ch == <span class="number">27</span>|| ch == <span class="number">32</span>){</span><br><span class="line"> cv::destroyWindow(<span class="string">"name"</span>);</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>; </span><br><span class="line">} </span><br></pre></td></tr></table></figure><br/><img src = "\image\opencv-00.png"/><br/><p>์์ ๊ฐ์ ์ฌ์ง์ด ์ ์ฅ๋ img_color์ ์ ์ฅ๋ฐฉ์์ ์ดํด๋ณด๋๋กํ๊ฒ ์ต๋๋ค.</p><br/><figure class="highlight c++"><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">int</span>, <span class="keyword">char</span>**)</span> </span></span><br><span class="line"><span class="function"></span>{ </span><br><span class="line"> cv::Mat img_color = cv::imread(<span class="string">"./test.jpg"</span>);</span><br><span class="line"> cv::Mat imgSample = img_color(cv::Rect(<span class="number">5</span>,<span class="number">5</span>,<span class="number">5</span>,<span class="number">5</span>));;</span><br><span class="line"></span><br><span class="line"> <span class="built_in">cout</span> << <span class="string">"Region of (5,5,5,5) : "</span> << imgSample << <span class="built_in">endl</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><br/><br/><figure class="highlight plain"><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">Region of (5,5,5,5) : [167, 166, 168, 167, 166, 168, 167, 166, 168, 167, 166, 170, 168, 167, 171;</span><br><span class="line"> 168, 167, 169, 168, 167, 169, 168, 167, 169, 168, 167, 171, 168, 167, 171;</span><br><span class="line"> 168, 167, 169, 168, 167, 169, 168, 167, 169, 168, 167, 171, 168, 167, 171;</span><br><span class="line"> 169, 168, 170, 169, 168, 170, 169, 168, 170, 169, 168, 172, 169, 168, 172;</span><br><span class="line"> 169, 168, 170, 169, 168, 170, 169, 168, 170, 169, 168, 172, 169, 168, 172]</span><br></pre></td></tr></table></figure><br/><p>cv::Rect(5,5,5,5)๋ point(5,5)๋ก๋ถํฐ width, height๊ฐ ๊ฐ๊ฐ 5์ธ ์ง์ฌ๊ฐํ ์์ญ์ ์๋ฏธํฉ๋๋ค.</p><p>์ฆ, 25๊ฐ์ ํฝ์
๊ฐ์ด ๋ค์ด๊ฐ๋๋ฐ ์ถ๋ ฅ์ 75๊ฐ์๊ฐ์ด ๋ฐํ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.</p><p>์ด๋, RGB์ฑ๋๋ง๋ค ํฝ์
๊ฐ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์
๋๋ค.</p><p>๋ฐ๋ผ์, 5,5๋ผ๋ ์ ์์์ ๊ฐ๋ก 5 ์ธ๋ก 5์ ์ฌ๊ฐํ์ ์๋์ ๊ฐ์ต๋๋ค.</p><br/><blockquote><p>์ดํด๋ฅผ ๋๊ธฐ์ํด width, height = 100์ผ๋ก ์ฆ๊ฐ์์ผฐ์ต๋๋ค.</p></blockquote><img src = "\image\opencv-01.jpg"/><br/><h2 id="Mat-์์ฑ-๋ฐฉ๋ฒ"><a href="#Mat-์์ฑ-๋ฐฉ๋ฒ" class="headerlink" title="Mat ์์ฑ ๋ฐฉ๋ฒ"></a>Mat ์์ฑ ๋ฐฉ๋ฒ</h2><br/><blockquote><p>C++: Mat::Mat()<br>C++ : Mat::Mat(int rows, int cols, int type)<br>C++ : Mat::Mat(Size size, int type)<br>C++ : Mat::Mat(int rows, int cols, int type, const Scalar& s)<br>C++ : Mat::Mat(Size size, int type, const Scalar& s)<br>C++ : Mat::Mat(const Mat& m)<br>C++ : Mat::Mat(int rows, int cols, int type, void* data, size_t step = AUTO_STEP)<br>C++ : Mat::Mat(Size size, int type, void* data, size_t step = AUTO_STEP)<br>C++ : Mat::Mat(const Mat& m, const Range& rowRange, const Range& colRange = Range::all())<br>C++ : Mat::Mat(const Mat& m, const Rect& roi)<br>C++ : Mat::Mat(const CvMat* m, bool copyData = false)<br>C++ : Mat::Mat(const IplImage* img, bool copyData = false)</p><p>์ถ์ฒ: <a href="https://nextus.tistory.com/14">https://nextus.tistory.com/14</a> [ReStartAllKill]</p></blockquote><br/><p>์์ ๋ค์ํ ์์ฑ์์์ <code>type</code>์ด๋ผ๋ ๋ณ์๊ฐ ์๋๋ฐ ์๋์ ๊ฐ์ ์์๋ฅผ ํตํด ๊ฐ์ ์ค์ ํฉ๋๋ค.</p><br/><blockquote><p>CV_8UC1 : 8 - bit unsigned integer : uchar(0..255)<br>CV_8SC1 : 8 - bit signed integer : schar(-128..127)<br>CV_16UC1 : 16 - bit unsigned integer : ushort(0..65535)<br>CV_16SC1 : 16 - bit signed integer : short(-32768..32767)<br>CV_32SC1 : 32 - bit signed integer : int(-2147483648..2147483647)<br>CV_32FC1 : 32 - bit floating - point number : float(-FLT_MAX..FLT_MAX, INF, NAN)<br>CV_64FC1 : 64 - bit floating - point number : double(-DBL_MAX..DBL_MAX, INF, NAN)</p><p>์ถ์ฒ: <a href="https://nextus.tistory.com/14">https://nextus.tistory.com/14</a> [ReStartAllKill]</p></blockquote><p>CV_64FC1์ผ๋ก ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.</p><ol><li><strong>64</strong> : bit๋จ์๋ฅผ ๋งํ๋ฉฐ ์์ ์์๋ 64bit๋ฅผ ์๋ฏธํฉ๋๋ค. ์ฆ, 0~2^64๋ฅผ ์๋ฏธํฉ๋๋ค.</li><li><strong>F</strong> : ๋ถํธ ๊ฒฐ์ ์๋ก <strong>F๋ Floating, S๋ Signed, U๋ Unsigned</strong>๋ฅผ ์๋ฏธํฉ๋๋ค.</li><li><strong>C1</strong>: Channel์ ์ฝ์๋ก <strong>C1</strong>์ ๊ฒฝ์ฐ ์๋ต์ด ๊ฐ๋ฅํ๋ฉฐ ๊ทธ ์ธ๋ C1~C8๋ฒ์๊ฐ ๊ฐ๋ฅํฉ๋๋ค.</li></ol><p>๊ฐ์ฅ ์ฒ์ ์ดํด๋ณธ ๊ฐ์์ง์ ๊ฒฝ์ฐ RGB๊ฐ์ด ์๋ 3 channel์ 8bit image์ด๋ฏ๋ก <strong>CV_8UC3</strong>์ ๋ฐ์ดํฐํ์
์ ๊ฐ๊ฒ ๋ฉ๋๋ค.</p><p>์์๊ฐ์ ๋ฐ์ดํฐํ์
์ ์์ฑํ ์๋ ์๋๋ฐ </p><figure class="highlight c++"><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></pre></td><td class="code"><pre><span class="line"><span class="comment">//mat.hpp</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//main.cpp</span></span><br><span class="line">CV_MAKETYPE(CV_32F,<span class="number">5</span>); <span class="comment">//CV_32FC5</span></span><br></pre></td></tr></table></figure><p>์์ ๊ฐ์ด ์
๋ ฅํ ๊ฒฝ์ฐ CV_32FC5์ด๋ผ๋ ์์๋ช
์ผ๋ก 5 + 4 << 3 = 69๋ผ๋ ๊ฐ์ด ์ ์ฅ๋๊ฒ ๋ฉ๋๋ค.</p><br/><hr><br/><h3 id="OpenCV-ํธ๋๋ถ-๋คํฌํ๋ก๊ทธ๋๋จธ๋-https-darkpgmr-tistory-com-46"><a href="#OpenCV-ํธ๋๋ถ-๋คํฌํ๋ก๊ทธ๋๋จธ๋-https-darkpgmr-tistory-com-46" class="headerlink" title="OpenCV ํธ๋๋ถ - ๋คํฌํ๋ก๊ทธ๋๋จธ๋ - https://darkpgmr.tistory.com/46"></a>OpenCV ํธ๋๋ถ - ๋คํฌํ๋ก๊ทธ๋๋จธ๋ - <a href="https://darkpgmr.tistory.com/46">https://darkpgmr.tistory.com/46</a></h3><blockquote><p>using namespace cv;</p></blockquote><br/><h4 id="์ด๋ฏธ์ง-์ฝ๊ธฐ-๋ฐ-์ ์ฅ"><a href="#์ด๋ฏธ์ง-์ฝ๊ธฐ-๋ฐ-์ ์ฅ" class="headerlink" title="์ด๋ฏธ์ง ์ฝ๊ธฐ ๋ฐ ์ ์ฅ"></a>์ด๋ฏธ์ง ์ฝ๊ธฐ ๋ฐ ์ ์ฅ</h4><br/><ol><li>imread()๋ฅผ ํตํ ์ด๋ฏธ์ง ์ฝ๊ธฐ</li></ol><p>โ Mat img_color = imread(โsample.jpgโ); // color load</p><p>โ Mat img_gray = imread(โsample.jpgโ, 0); // gray load</p><p>โ Mat img_16bit = imread(โsample.jpgโ, cv::IMREAD_ANYDEPTH); // ์๋ณธ depth๋ก ์ฝ๊ธฐ</p><p>โ </p><ol start="2"><li><p>imwrite()๋ฅผ ํตํ ์ด๋ฏธ์ง ์ ์ฅ</p><p>imwrite(โfname.jpgโ, img);</p></li></ol><br/><h4 id="์ด๋ฏธ์ง-์์ฑ-๋ณต์ฌ-ํ๋ณํ-์์๋ณํ-roi-์ค์ "><a href="#์ด๋ฏธ์ง-์์ฑ-๋ณต์ฌ-ํ๋ณํ-์์๋ณํ-roi-์ค์ " class="headerlink" title="์ด๋ฏธ์ง ์์ฑ, ๋ณต์ฌ, ํ๋ณํ, ์์๋ณํ, roi ์ค์ "></a>์ด๋ฏธ์ง ์์ฑ, ๋ณต์ฌ, ํ๋ณํ, ์์๋ณํ, roi ์ค์ </h4><br/><p>โ int w = 320;// width</p><p>โ int h = 240;// height</p><br/><ul><li>์์ฑ์๋ฅผ ํตํ ๋ณ์ ์์ฑ</li></ul><p>โ Mat img(h,w,CV_8UC1);//1์ฑ๋ unsigned char</p><p>โ Mat img(h,w,CV_8UC3);//3์ฑ๋ unsigned char</p><p>โ Mat img = Mat::zeros(h,w,CV_32FC1);//1์ฑ๋ float</p><p>โ Mat img = Mat::ones(h,w,CV_64FC3);//3์ฑ๋ double</p><p>โ unsigned char * img_buffer;// ์ด๋ฏธ์ง๋ฒํผ ํฌ์ธํฐ</p><p>โ Mat img(h, w, CV_8UC3, img_buffer);//๋ฉ๋ชจ๋ฆฌ ๊ณต์ </p><br/><ul><li>Scalar()๋ฅผ ํตํ ์์ ์ด๊ธฐํ</li></ul><p>โ Mat img(h,w,CV_8UC1);</p><p>โ img = Scalar(3); // img ๋ชจ๋ ์์๊ฐ 3์ผ๋ก ์ด๊ธฐํ</p><br/><ul><li>์ด๋ฏธ์ง ์ฐธ์กฐ ๋ฐ ๋ณต์ฌ</li></ul><p>โ Mat img2 = img; // ๋ฉ๋ชจ๋ฆฌ ๊ณต์ </p><p>โ Mat img2 = img.clone(); // ๋ณ๋ ๋ฉ๋ชจ๋ฆฌ</p><p>โ Mat img2; img.copyTo(img2);//๋ณ๋ ๋ฉ๋ชจ๋ฆฌ </p><br/><ul><li>ํ๋ณํ์ ํตํ ๋ณต์ฌ</li></ul><p>โ Mat img1(h,w,CV_32FC1);</p><p>โ Mat img2;</p><p>โ img1.convertTo(img2, CV_8U);</p><br/><ul><li>gray-color ๋ณํ</li></ul><p>โ cvtColor(color, gray, CV_BGR2GRAY);</p><p>โ cvtColor(gray, color, CV_GRAY2BGR);</p><br/><ul><li>ROI(Region Of Interst) ์ค์ </li></ul><p>โ Rect roi;</p><p>โ Mat sub_img = img(roi);//๋ฉ๋ชจ๋ฆฌ๊ณต์ </p><p>โ Mat sub_img = img(roi).clone();//๋ณ๋๋ฉ๋ชจ๋ฆฌ</p><br/><h4 id="ํ๋ ฌ-์์์ ๊ทผ-๋ฐ-์์ฑ์ด๊ธฐํ"><a href="#ํ๋ ฌ-์์์ ๊ทผ-๋ฐ-์์ฑ์ด๊ธฐํ" class="headerlink" title="ํ๋ ฌ ์์์ ๊ทผ ๋ฐ ์์ฑ์ด๊ธฐํ"></a>ํ๋ ฌ ์์์ ๊ทผ ๋ฐ ์์ฑ์ด๊ธฐํ</h4><br/><p>โ Mat A = (Mat_<int>(3,1) << 1, 2, 3);</p><p>โ Mat B = (Mat_<double>(3,2) << 1, 1, 2, 2, 3, 3); // ์ฒซ ๋ฒ์งธ ํ๋ถํฐ ์ฑ์์ง</p><p>โ A.at<int>(2,0) = 3; // .at<type>(y, x)</p><p>โ B.at<double>(2,1) = -0.1;</p><p>โ Mat C(h, w, CV_8UC3);</p><p>โ C.at<Vec3b>(y, x)[0]; // blue</p><p>โ C.at<Vec3b>(y, x)[1]; // green </p><p>โ C.at<Vec3b>(y, x)[2]; // red</p><br/><h4 id="์์-ํฌ๊ธฐ๋ณ๊ฒฝ-๋ฐ-์ํ์ข์ฐ-๋ฐ์ "><a href="#์์-ํฌ๊ธฐ๋ณ๊ฒฝ-๋ฐ-์ํ์ข์ฐ-๋ฐ์ " class="headerlink" title="์์ ํฌ๊ธฐ๋ณ๊ฒฝ ๋ฐ ์ํ์ข์ฐ ๋ฐ์ "></a>์์ ํฌ๊ธฐ๋ณ๊ฒฝ ๋ฐ ์ํ์ข์ฐ ๋ฐ์ </h4><br/><ul><li>ํฌ๊ธฐ ๋ณ๊ฒฝ</li></ul><p>โ Mat dst;</p><p>โ resize(img, dst, cv::Size(new_w,new_h));</p><p>โ resize(img, dst, cv::Size(), 0.5, 0.5);//scalex, scaley</p><ul><li>์์ ๋ฐ์ (flip)</li></ul><p>โ flip(img, dst, 0);// vertical flip</p><p>โ flip(img, dst, 1);// horizontal flip</p><p>โ flip(img, dst, -1);// vertial & horizontal flip</p><br/><h4 id="์ด๋ฏธ์ง์-๊ทธ๋ฆฌ๊ธฐ-drawing"><a href="#์ด๋ฏธ์ง์-๊ทธ๋ฆฌ๊ธฐ-drawing" class="headerlink" title="์ด๋ฏธ์ง์ ๊ทธ๋ฆฌ๊ธฐ (drawing)"></a>์ด๋ฏธ์ง์ ๊ทธ๋ฆฌ๊ธฐ (drawing)</h4><br/><p>โ Rect rc(x,y,w,h);</p><p>โ Scalar color(B,G,R);</p><p>โ int thickness=1; // line thickness</p><p>โ line(img, Point(x1,y1), Point(x2,y2), color, thickness);</p><p>โ rectangle(img, rc, color, thickness);</p><p>โ rectangle(img, rc.tl(), rc.br(), color, thickness); // tl = TopLeft, br = BottomRight</p><p>โ rectangle(img, rc, color, CV_FILLED); // filled rectangle</p><p>โ Point center(rc.x+rc.width/2, rc.y+rc.height/2);</p><p>โ Size radius(rc.width/2, rc.height/2);</p><p>โ double rot_deg = 0; // rotation of ellipse</p><p>โ double s_deg = 0; // start angle of arc</p><p>โ double e_deg = 360; // end angle of arc</p><p>โ ellipse(img,center,radius,rot_deg,s_deg,e_deg,color,thickness);</p><p>โ ellipse(img,center,radius,rot_deg,s_deg,e_deg,color,CV_FILLED);</p><p>โ int circle_radius = 10;</p><p>โ circle(img, center, circle_radius, color, thickness);</p><p>โ circle(img, center, circle_radius, color, CV_FILLED);</p><p>โ putText(img, โtextโ, Point(x,y), FONT_HERSHEY_SIMPLEX, 1., color, thickness);</p><p>โ putText(img, โtextโ, Point(x,y), FONT_HERSHEY_DUPLEX, 1., color, thickness);</p><br/><h4 id="์ด๋ฏธ์ง-๋์คํ๋ ์ดํ๊ธฐ-display"><a href="#์ด๋ฏธ์ง-๋์คํ๋ ์ดํ๊ธฐ-display" class="headerlink" title="์ด๋ฏธ์ง ๋์คํ๋ ์ดํ๊ธฐ (display)"></a>์ด๋ฏธ์ง ๋์คํ๋ ์ดํ๊ธฐ (display)</h4><br/><p>โ namedWindow(โnameโ); // auto resized</p><p>โ namedWindow(โnameโ,CV_WINDOW_NORMAL); // manual resize</p><p>โ imshow(โnameโ, img);</p><p>โ char ch = waitKey(); // ๋ฌดํ ๋๊ธฐ</p><p>โ char ch = waitKey(10); // 10 msec ๋๊ธฐ</p><p>โ if(ch == 27) โฆ // ESC key</p><p>โ if(ch == 32) โฆ // SPACE key</p><p>โ destroyWindow(โnameโ);</p><p>โ destroyAllWindows();</p><br/><h4 id="์น์บ -์ฐ๊ฒฐํ๊ธฐ"><a href="#์น์บ -์ฐ๊ฒฐํ๊ธฐ" class="headerlink" title="์น์บ ์ฐ๊ฒฐํ๊ธฐ"></a>์น์บ ์ฐ๊ฒฐํ๊ธฐ</h4><br/><p>โ VideoCapture vc(0);</p><p>โ if (!vc.isOpened()) return; // ์ฐ๊ฒฐ์คํจ</p><p>โ vc.set(CV_CAP_PROP_FRAME_WIDTH, 640);</p><p>โ vc.set(CV_CAP_PROP_FRAME_HEIGHT, 480);</p><p>โ Mat img;</p><p>โ while(1){</p><p>โ vc >> img;</p><p>โ if(img.empty()) break;</p><p>โ imshow(โcamโ,img);</p><p>โ if(waitKey(10)==27) break; //ESC</p><p>โ }</p><p>โ destroyAllWindows();</p><br/><h4 id="avi-๋น๋์ค-ํ์ผ-์ฝ์ด์ค๊ธฐ"><a href="#avi-๋น๋์ค-ํ์ผ-์ฝ์ด์ค๊ธฐ" class="headerlink" title="avi ๋น๋์ค ํ์ผ ์ฝ์ด์ค๊ธฐ"></a>avi ๋น๋์ค ํ์ผ ์ฝ์ด์ค๊ธฐ</h4><br/><p>โ VideoCapture vc(โsample.aviโ);</p><p>โ if (!vc.isOpened()) return; // ๋ถ๋ฌ์ค๊ธฐ ์คํจ</p><p>โ Mat img;</p><p>โ while(1){</p><p>โ vc >> img;</p><p>โ if(img.empty()) break;</p><p>โ imshow(โvideoโ,img);</p><p>โ if(waitKey(10)==27) break; //ESC</p><p>โ }</p><p>โ destroyAllWindows();</p><p>โ </p><br/><h4 id="avi-๋น๋์ค-๋
นํํ๊ธฐ"><a href="#avi-๋น๋์ค-๋
นํํ๊ธฐ" class="headerlink" title="avi ๋น๋์ค ๋
นํํ๊ธฐ"></a>avi ๋น๋์ค ๋
นํํ๊ธฐ</h4><br/><p>โ double fps = 15;</p><p>โ int fourcc = CV_FOURCC(โXโ,โVโ,โIโ,โDโ); // codec (opencv3.0์ดํ)</p><p>โ int fourcc = VideoWriter::fourcc(โXโ,โVโ,โIโ,โDโ); // opencv3.0์ด์</p><p>โ bool isColor = true;</p><p>โ VideoWriter *video = new VideoWriter;</p><p>โ if(!video->open(โresult.aviโ, fourcc, fps, Size(img_w, img_h), isColor)){</p><p>โ delete video;</p><p>โ return;</p><p>โ }</p><p>โ Mat img;</p><p>โ while(1){</p><p>โ // โฆ</p><p>โ *video << img;</p><p>โ // โฆ</p><p>โ }</p><p>โ delete video;</p><p>โ โป ์ฝ๋ฑ ๋ชฉ๋ก: <a href="http://www.fourcc.org/codecs.php">http://www.fourcc.org/codecs.php</a></p><br/><h4 id="์ฐฝ์-Trackbar-๋ถ์ด๊ธฐ"><a href="#์ฐฝ์-Trackbar-๋ถ์ด๊ธฐ" class="headerlink" title="์ฐฝ์ Trackbar ๋ถ์ด๊ธฐ"></a>์ฐฝ์ Trackbar ๋ถ์ด๊ธฐ</h4><br/><p>โ int threshold = 10;</p><p>โ cv::namedWindow(โdisplayโ);</p><p>โ cv::createTrackbar(โthr:โ, โdisplayโ, &threshold, 1000);</p><br/><h2 id="REFERENCE"><a href="#REFERENCE" class="headerlink" title="REFERENCE"></a>REFERENCE</h2><ol><li><a href="https://nextus.tistory.com/15?category=762131">https://nextus.tistory.com/15?category=762131</a></li><li><a href="https://darkpgmr.tistory.com/46">https://darkpgmr.tistory.com/46</a></li></ol>]]></content>
<categories>
<category> C++ </category>
</categories>
<tags>
<tag> OpenCV </tag>
<tag> Mat </tag>
</tags>
</entry>
<entry>
<title>[C++] E01. STL</title>
<link href="2021/07/09/cpp-01/"/>
<url>2021/07/09/cpp-01/</url>
<content type="html"><![CDATA[<h1 id="c-ํจ์์ ๋ฆฌ"><a href="#c-ํจ์์ ๋ฆฌ" class="headerlink" title="c++ ํจ์์ ๋ฆฌ"></a>c++ ํจ์์ ๋ฆฌ</h1><h2 id="OpenCV"><a href="#OpenCV" class="headerlink" title="OpenCV"></a>OpenCV</h2><h3 id="์๋ฃ๊ตฌ์กฐ"><a href="#์๋ฃ๊ตฌ์กฐ" class="headerlink" title="์๋ฃ๊ตฌ์กฐ"></a>์๋ฃ๊ตฌ์กฐ</h3><ol><li>cv::Point</li><li>cv::Mat</li><li>cv::rectangle</li><li>cv::Scalar</li></ol><h3 id="ํจ์"><a href="#ํจ์" class="headerlink" title="ํจ์"></a>ํจ์</h3><ol><li>cv::imread</li><li>cv::imwrite</li><li>cv::imshow</li><li>cv::VideoCapture</li><li>cv::EVENT_LBUTTONDOWN</li><li>cv::EVENT_RBUTTONDOWN</li><li>cv::namedWindow</li><li>cv::setMouseCallback</li><li>cv::waitKey</li><li>cv::namedWindow</li><li>cv::destroyWindow</li><li>cv::putText</li><li></li></ol><h2 id="boost-geometry"><a href="#boost-geometry" class="headerlink" title="boost::geometry"></a>boost::geometry</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">namespace</span> bg = boost::geometry;</span><br></pre></td></tr></table></figure><h3 id="์๋ฃ๊ตฌ์กฐ-1"><a href="#์๋ฃ๊ตฌ์กฐ-1" class="headerlink" title="์๋ฃ๊ตฌ์กฐ"></a>์๋ฃ๊ตฌ์กฐ</h3><ol><li>bg::model::point</li><li>bg::model::polygon</li><li>bg::model::multi_polygon</li></ol><h3 id="ํจ์-1"><a href="#ํจ์-1" class="headerlink" title="ํจ์"></a>ํจ์</h3><ol><li>bg::read_wkt</li><li>bg::validity_failure_tytpe</li><li>bg::is_valid</li><li>bg::correct</li><li>bg::area</li><li>bg::intersection</li></ol><h2 id="Eigen-MatrixXd"><a href="#Eigen-MatrixXd" class="headerlink" title="Eigen::MatrixXd"></a>Eigen::MatrixXd</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> Eigen;</span><br></pre></td></tr></table></figure><ol><li>MatrixXd::Zero</li></ol>]]></content>
<categories>
<category> C++ </category>
</categories>
<tags>
<tag> c++ </tag>
<tag> STL </tag>
</tags>
</entry>
<entry>
<title>[CMake] CMakelist.txt ์์ฑ</title>
<link href="2021/07/07/CMake/"/>
<url>2021/07/07/CMake/</url>
<content type="html"><![CDATA[<h1 id="CMakeList-์์ฑ๋ฒ"><a href="#CMakeList-์์ฑ๋ฒ" class="headerlink" title="CMakeList ์์ฑ๋ฒ"></a>CMakeList ์์ฑ๋ฒ</h1><br/><hr><br/><h2 id="CMake๋"><a href="#CMake๋" class="headerlink" title="CMake๋?"></a>CMake๋?</h2><br/><p>ํ๊ต ๊ณผ์ ๋ฅผ ํ๋ค๋ณด๋ฉด Makefile์ ์ด์ฉํ์ฌ ๋น๋ ํ๊ณคํฉ๋๋ค. CMake๋ ์ด๋ฌํ Makefile์ ๋ง๋ค์ด์ฃผ๋ ํด์
๋๋ค.</p><p>CMake์ Makefile ๋ชจ๋ Incremental build๋ฐฉ์์ ์ฌ์ฉํ์ฌ ์ฒ์์ ๋น๋ํ ํ์ผ๋ค์ ์ ์ธํ๊ณ ์์ ๋ ํ์ผ๋ค๋ง ์๋กญ๊ฒ ๋น๋ํ์ฌ ์๊ฐ์ ์ค์ฌ์ฃผ๊ฒ ๋ฉ๋๋ค.</p><p>Cmake์ Makefile์ ์ฐจ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.</p><p>Makefile์์๋ Object ํ์ผ๋ค์ ์ด๋ฆ๊ณผ ์์กด์ฑ ์ ๋ณด๋ฅผ ๋ชจ๋ ๊ธฐ์ ํด ์ค์ผ ํ์ง๋ง, CMake์์๋ ๊ทธ๋ด ํ์์์ด <strong>์์คํ์ผ ๋ด๋ถ๋ฅผ ์๋์ผ๋ก ๋ถ์ํด ์์กด์ฑ ์ ๋ณด๋ฅผ ์ค์ค๋ก ํ์
</strong>ํฉ๋๋ค.</p><p>์ปดํ์ผ ์์กด์ฑ์ ๋ณด ๋ฑ์ ํ์ผ์ ๊ธฐ๋กํ์ฌ ์๋์ผ๋ก ๋น๋ํด์ฃผ๋ Makefile์ ๋จ์ ์ ๋ณด์ํ ๊ฒ์ด CMake์
๋๋ค.</p><br/><figure class="highlight makefile"><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">OBJS=main.o foo.o bar.o</span><br><span class="line">TARGET=app.out</span><br><span class="line"> </span><br><span class="line"><span class="section">all: <span class="variable">$(TARGET)</span></span></span><br><span class="line"> </span><br><span class="line"><span class="section">clean:</span></span><br><span class="line"> rm -f *.o</span><br><span class="line"> rm -f <span class="variable">$(TARGET)</span></span><br><span class="line"> </span><br><span class="line"><span class="variable">$(TARGET)</span>: <span class="variable">$(OBJS)</span></span><br><span class="line"> <span class="variable">$(CC)</span> -o <span class="variable">$@</span> <span class="variable">$(OBJS)</span></span><br><span class="line"> </span><br><span class="line"><span class="section">main.o: foo.h bar.h main.c</span></span><br><span class="line"><span class="section">foo.o: foo.h foo.c</span></span><br><span class="line"><span class="section">bar.o: bar.h bar.c</span></span><br></pre></td></tr></table></figure><p>์ <code>CMakeLists.txt</code>๋ก ์์ฑํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.</p><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">ADD_EXECUTABLE</span>( app.out main.c foo.c bar.c )</span><br></pre></td></tr></table></figure><p><code>cmake CMakeLists.txt</code>๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๋ฉด <code>Makefile</code>์ด ์์ฑ๋๊ฒ ๋ฉ๋๋ค.</p><br/><p><a href="https://www.tuwlab.com/ece/27234">Makefile์ ๋ค์ ์ง์ ๋ถํ ๋ฃจํด๋ค์ ์ถ์ํํ์ฌ ์ง๊ด์ ์ผ๋ก ๋น๋๊ณผ์ ์ ๊ธฐ์ ํด์ฃผ๋ ๊ฒ</a>์
๋๋ค.</p><p>๊ทธ ์ธ์ CLion์ด๋ Eclipse์ ๊ฐ์ IDE์์ ํ๋ก์ ํธ ์ค์ ํ์ผ๋ก ์ฌ์ฉํ ์๋ ์๋ค๊ณ ํฉ๋๋ค.</p><br/><br/><h2 id="CMake-function"><a href="#CMake-function" class="headerlink" title="CMake function"></a>CMake function</h2><blockquote><p>Upper, lower, and mixed case commands are supported by CMake. </p></blockquote><p>CMake Documentation์ Tutorial์ ๋ณด๋ฉฐ ์ดํด๋ณด๊ฒ ์ต๋๋ค.</p><br/><h3 id="Step-1-A-Basic-Starting-Point"><a href="#Step-1-A-Basic-Starting-Point" class="headerlink" title="Step 1: A Basic Starting Point"></a>Step 1: A Basic Starting Point</h3><figure class="highlight cmake"><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">cmake_minimum_required</span>(VERSION <span class="number">3.10</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># set the project name</span></span><br><span class="line"><span class="keyword">project</span>(Tutorial)</span><br><span class="line"></span><br><span class="line"><span class="comment"># add the executable</span></span><br><span class="line"><span class="keyword">add_executable</span>(Tutorial tutorial.cxx)</span><br></pre></td></tr></table></figure><p>๊ฐ์ฅ ๊ฐ๋จํ <code>CMakeLists.txt</code>ํ์ผ์
๋๋ค.</p><br/><ol><li><code>cmake_minimum_required()</code></li></ol><p>CMake ๋น๋ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๊ธฐ ์ํ ์ต์๋ฒ์ ์ ๋ช
์ํฉ๋๋ค.</p><p>๋ณดํต ํ์ผ์ ์ต์๋จ์ ์์นํฉ๋๋ค.</p><p>๋ช
์ํ ๋ฒ์ ๋ณด๋ค ๋ฎ์ CMake๊ฐ ํด๋น ๋น๋ ์คํฌ๋ฆฝํธ๋ฅผ ํด์์ ์ค๋ฅ๋ฅผ ์ถ๋ ฅํ๊ณ ์ข
๋ฃํฉ๋๋ค.</p><ol start="2"><li><code>project()</code></li></ol><p><code>project(ํ๋ก์ ํธ๋ช
)</code>์ผ๋ก ์ฐ์ด๊ฒ ๋๊ณ ํ๋ก์ ํธ์ ์ด๋ฆ์ ์ ํด์ฃผ๋ ๋ช
๋ น์ด๋ก <code>CMAKE_PROJECT_NAME</code>์ด๋ผ๋ ๋ณ์์ ์ ์ฅ์ด๋ฉ๋๋ค.</p><ol start="3"><li><code>add_executable()</code></li></ol><p>๋น๋ ์ต์ข
๊ฒฐ๊ณผ๋ฌผ๋ก ์์ฑํ <code>์คํ ํ์ผ</code>์ ์ถ๊ฐํฉ๋๋ค. ์ด ๋ช
๋ น์ ๋ฐ๋ณตํ์ฌ ๊ณ์ํด์ ์คํํ์ผ์ ์์ฑํ ์ ์์ต๋๋ค.</p><figure class="highlight cmake"><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"><span class="comment">## add_executable ( <์คํํ์ผ๋ช
> <์์คํ์ผ> <์์คํ์ผ> )</span></span><br><span class="line"><span class="keyword">add_executable</span> ( a.out main.c foo.c bar.c )</span><br></pre></td></tr></table></figure><ol start="4"><li><code>configure_file()</code></li></ol><blockquote><p>The first feature we will add is to provide our executable and project with a version number. While we could do this exclusively in the source code, using <code>CMakeLists.txt</code> provides more flexibility.</p></blockquote><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">configure_file</span>(TutorialConfig.h.in TutorialConfig.h)</span><br></pre></td></tr></table></figure><br/><p><code>์๋ฆฌ์์</code>๋ฅผ ๋น๋ํ๋ฉด์ ๋ค์๊ณผ ๊ฐ์ด <code>version.h</code>ํ์ผ์ ์ฐพ์ง ๋ชปํ๋ ์ด์๊ฐ ๋ฐ์ํ์ต๋๋ค.</p><figure class="highlight plain"><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">[ 94%] Building CXX object src/CMakeFiles/jariitsue.dir/jariitsue.cpp.o</span><br><span class="line">/home/choisj/git/jariItsue/src/jariitsue.cpp:9:10: fatal error: version.h: No such file or directory</span><br><span class="line"> #include "version.h"</span><br><span class="line"> ^~~~~~~~~~~</span><br><span class="line">compilation terminated.</span><br></pre></td></tr></table></figure><p>ํ์ธํด๋ณด๋ <code>src</code> ๋๋ ํฐ๋ฆฌ์ <code>version.h.in</code>ํ์ผ์ด ์กด์ฌํ๋ ๊ฒ์ ํ์ธํ์ต๋๋ค.</p><p>๋ฐ๋ผ์, ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ <code>jariItsue/src/CMakefiles.txt</code>์ ์ถ๊ฐํ์์ต๋๋ค.</p><figure class="highlight cmake"><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="keyword">configure_file</span>(</span><br><span class="line">version.h.in</span><br><span class="line"><span class="string">"${CMAKE_BINARY_DIR}/include/version.h"</span></span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>ํ์ฌ ๋๋ ํฐ๋ฆฌ์ ์๋ version.h.in์ด๋ผ๋ ํ์ผ์ ${CMAKE_BINARY_DIR}/include์ version.h๋ผ๋ ํ์ผ๋ก ๋ณํํ์ฌ ์ ์ฅํ๊ฒ ํ์์ต๋๋ค.</p><p>์ด ๋, ${CMAKE_BINARY_DIR}๋ฅผ ๋น๋๊ณผ์ ์ ํฌํจ์ํค๊ธฐ ์ํด ์์ CMakefiles์ธ <code>jariItsue/CMakefiles.txt</code>์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์ถ๊ฐํ์์ต๋๋ค.</p><figure class="highlight cmake"><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"><span class="keyword">include_directories</span>(</span><br><span class="line"><span class="string">"${CMAKE_BINARY_DIR}/include"</span></span><br><span class="line">)</span><br></pre></td></tr></table></figure><br/><br/><h2 id="Step-2-Adding-a-Library"><a href="#Step-2-Adding-a-Library" class="headerlink" title="Step 2: Adding a Library"></a>Step 2: Adding a Library</h2><blockquote><p>Now we will add a library to our project. This library will contain our own implementation for computing the square root of a number. The executable can then use this library instead of the standard square root function provided by the compiler.</p></blockquote><ol><li><code>add_library()</code></li></ol><p>๋น๋ ์ต์ข
๊ฒฐ๊ณผ๋ฌผ๋ก ์์ฑํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํฉ๋๋ค.</p><figure class="highlight cmake"><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"><span class="comment">## add_library ( <๋ผ์ด๋ธ๋ฌ๋ฆฌ_์ด๋ฆ> [STATIC|SHARED|MODULE] <์์ค_ํ์ผ> <์์ค_ํ์ผ> ... )</span></span><br><span class="line"><span class="comment">## <๋ผ์ด๋ธ๋ฌ๋ฆฌ_์ด๋ฆ> : ์์ฑํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด๋ฆ (lib~~~~.a / lib~~~~.so์์ ~~~~์ ๋ค์ด๊ฐ ๊ฐ)</span></span><br><span class="line"><span class="comment">## [STATIC|SHARED|MODULE] : ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ข
๋ฅ (default = STATIC)</span></span><br><span class="line"><span class="comment">## MathFunctions๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ mysqrt.cxx๋ผ๋ ํ์ผ์ ํตํด STATIC์ผ๋ก ์์ฑํ๋ค.</span></span><br><span class="line"><span class="keyword">add_library</span>(MathFunctions mysqrt.cxx)</span><br></pre></td></tr></table></figure><br/><br/><h3 id="set"><a href="#set" class="headerlink" title="set"></a>set</h3><hr><ol><li><p>๋ณ์ ์ ์</p><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">set</span> ( <๋ณ์๋ช
> <๊ฐ> )</span><br></pre></td></tr></table></figure><p><code><๊ฐ></code>์ ๊ณต๋ฐฑ์ด ํฌํจ๋์ด ์๋ ๊ฒฝ์ฐ์๋ <code>""</code>๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ธ์ค๋๋ค. </p></li></ol><ol start="2"><li><p>๋ชฉ๋ก ๋ณ์ ์ ์</p><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">set</span> ( <๋ชฉ๋ก_๋ณ์๋ช
> <ํญ๋ชฉ> <ํญ๋ชฉ> ... )</span><br></pre></td></tr></table></figure><p><ํญ๋ชฉ>๋ค์ <code>spacebar(๊ณต๋ฐฑ๋ฌธ์)</code>๋ก ๊ตฌ๋ถํฉ๋๋ค. ๋ง์ฝ ํญ๋ชฉ๋ด์ ๊ณต๋ฐฑ์ด ์๋ค๋ฉด <code>""</code>๋ฅผ ์ด์ฉํ์ฌ ๊ฐ์ธ์ค๋๋ค.</p></li></ol><ol start="3"><li><p>๋ณ์ ์ฐธ์กฐ</p><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">${<๋ณ์๋ช
>}</span></span><br></pre></td></tr></table></figure><p>๋น๋ ๋์ ์์คํ์ผ ๋ชฉ๋ก์ <code>SRC_FILES</code>๋ก ์ง์ ํ๊ณ <code>app.out</code> ์คํํ์ผ์ ์์ฑํ ๋์ ๋ณ์์ฐธ์กฐ๋ฅผ ์ด์ฉํ ๋น๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.</p><figure class="highlight cmake"><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="keyword">set</span> ( SRC_FILES main.c foo.c bar.c)</span><br><span class="line"><span class="keyword">add_executable</span> ( app.out <span class="variable">${SRC_FILES}</span>)</span><br><span class="line"><span class="comment">## ํน์ ๋ค์๊ณผ ๊ฐ์ด ์๋๋ค.</span></span><br><span class="line"><span class="keyword">add_executable</span> ( app.out main.c foo.c bar.c )</span><br></pre></td></tr></table></figure></li></ol><br/><h3 id="add-definitions"><a href="#add-definitions" class="headerlink" title="add_definitions"></a>add_definitions</h3><hr><p>์ ์ฒ๋ฆฌ๊ธฐ์ ์ ๋ฌํ ๋งคํฌ๋ก๋ฅผ ์ ์ํ๋ ๋ช
๋ น์ด์
๋๋ค.</p><p>์ปดํ์ผ๋ฌ ์ต์
์ค <code>-D</code>์ ํด๋นํฉ๋๋ค.</p><br/><figure class="highlight cmake"><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"><span class="comment">## ADD_DEFINITIONS ( -D<๋งคํฌ๋ก> -D<๋งคํฌ๋ก> -D<๋งคํฌ๋ก>=๊ฐ ... )</span></span><br><span class="line"><span class="comment">## ICACHE_FLASH ๋ณ์๋ฅผ ์ ์ ๋ฐ MY_DEBUG๋ผ๋ ๋งคํฌ๋ก๋ณ์๋ฅผ 1๋ก ์ ์ใน</span></span><br><span class="line"><span class="keyword">ADD_DEFINITIONS</span>( -DICACHE_FLASH -DMY_DEBUG=<span class="number">1</span> )</span><br></pre></td></tr></table></figure><br/><h3 id="find-package"><a href="#find-package" class="headerlink" title="find_package"></a>find_package</h3><hr><p>ํจํค์ง ๋น๋๋ฅผ ์ํด ์ฌ์ ์ ํ์ํ ๋ค๋ฅธ ์์กด ํจํค์ง๋ฅผ ์ง์ ํฉ๋๋ค.</p><p>๊ทธ ์์ ์ ์๋ ํจ์, ๋งคํฌ๋ก ๊ทธ๋ฆฌ๊ณ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํด์ค๋๋ค. <code>include()</code>์ ๋ฌ๋ฆฌ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ๋ชจ๋๋ค์ ๋ถ๋ฅด๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.</p><figure class="highlight cmake"><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"><span class="comment">## find_package(${ํจํค์ง_์ด๋ฆ} <์ต์
> )</span></span><br><span class="line"><span class="keyword">find_package</span>( OpenCV REQUIRED)</span><br></pre></td></tr></table></figure><p>์ด ๋, REQUIRED ์ต์
์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐพ์ง ๋ชปํ์ ๊ฒฝ์ฐ ์๋ฌ๋ฅผ ๋ฐ์์ํค๋ ์ต์
์
๋๋ค. ๋จ, ์ฐพ๊ธฐ๋ง ํ ๋ฟ ์ค์ง์ ์ผ๋ก lib์ ์ถ๊ฐํ๊ณ includeํ๋ ์์
์ ํ์ง ์์ต๋๋ค.</p><br/><h3 id="include-directories"><a href="#include-directories" class="headerlink" title="include_directories"></a>include_directories</h3><hr><p>๊ฐ <strong>์์ค ํ์ผ</strong>์์ <code>#include </code>๊ตฌ๋ฌธ์ผ๋ก ํฌํจ์ํจ ํค๋ ํ์ผ์ ์ฐพ์ ๋๋ ํฐ๋ฆฌ ๋ชฉ๋ก์ ์ง์ ํฉ๋๋ค.</p><p>์ปดํ์ผ๋ฌ ์ต์
์ค <code>-l</code>์ ํด๋นํฉ๋๋ค.</p><figure class="highlight cmake"><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"><span class="comment">## INCLUDE_DIRECTORIES ( <๋๋ ํ ๋ฆฌ> <๋๋ ํ ๋ฆฌ> ... )</span></span><br><span class="line"><span class="comment">## include๋๋ ํฐ๋ฆฌ์ driver/include ๋๋ ํฐ๋ฆฌ์์ ํค๋ํ์ผ์ ์ฐพ๋๋ค.</span></span><br><span class="line"><span class="keyword">include_directories</span> ( <span class="keyword">include</span> driver/<span class="keyword">include</span> )</span><br></pre></td></tr></table></figure><br/><h3 id="link-directories"><a href="#link-directories" class="headerlink" title="link_directories"></a>link_directories</h3><hr><p><strong>๋งํฌ</strong>๊ณผ์ ์์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ผ์ ์ฐพ์ ๋๋ ํฐ๋ฆฌ ๋ชฉ๋ก์ ์ง์ ํฉ๋๋ค.</p><p>์ปดํ์ผ๋ฌ ์ต์
์ค <code>-L</code>์ ํด๋นํฉ๋๋ค.</p><figure class="highlight cmake"><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"><span class="comment">## LINK_DIRECTORIES ( <๋๋ ํ ๋ฆฌ> <๋๋ ํ ๋ฆฌ> ... )</span></span><br><span class="line"><span class="comment">## lib๋๋ ํฐ๋ฆฌ์ /var/lib ๋๋ ํฐ๋ฆฌ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ผ์ ์ฐพ๋๋ค.</span></span><br><span class="line"><span class="keyword">link_directories</span> ( lib /var/lib )</span><br></pre></td></tr></table></figure><br/><h3 id="target-include-directories"><a href="#target-include-directories" class="headerlink" title="target_include_directories"></a>target_include_directories</h3><hr><p><strong>ํ๊ฒ์ ํฌํจ๋ ์์คํ์ผ</strong>์์ <code>#include</code>์ผ๋ก ํฌํจํ ํค๋ ํ์ผ์ ์ฐพ์ ๋๋ ํฐ๋ฆฌ ๋ชฉ๋ก์ ์ถ๊ฐํฉ๋๋ค.</p><p>์ปดํ์ผ๋ฌ ์ต์
์ค <code>-l</code>์ ํด๋นํฉ๋๋ค.</p><p><strong>๋์ ํ๊ฒ๋ค์ ๋ฐ๋์ ๋ฏธ๋ฆฌ ์ ์ธ๋์ด ์์ด์ผํฉ๋๋ค.</strong></p><figure class="highlight plain"><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">## TARGET_INCLUDE_DIRECTORIES ( <Target_์ด๋ฆ> PUBLIC <๋๋ ํ ๋ฆฌ> <๋๋ ํ ๋ฆฌ> ... )</span><br><span class="line">## include ๋๋ ํฐ๋ฆฌ์ driver/include ๋๋ ํฐ๋ฆฌ์์ ํค๋ํ์ผ์ ์ฐพ๋๋ค.</span><br><span class="line">TARGET_INCLUDE_DIRECTORIES ( include driver/include )</span><br></pre></td></tr></table></figure><br/><h3 id="target-link-libraries"><a href="#target-link-libraries" class="headerlink" title="target_link_libraries"></a>target_link_libraries</h3><hr><p><strong>ํ๊ฒ ๋งํฌ์</strong> ํฌํจํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ชฉ๋ก์ ์ง์ ํฉ๋๋ค.</p><p>์ค์ํ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ผ๋ช
์ <strong>prefix</strong>์ <strong>postfix</strong>๋ ์ ์ธํ๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด๋ฆ๋ง ์
๋ ฅํฉ๋๋ค.</p><blockquote><p> EX. libxxx.a์์ lib์ ์ ์ธํ๊ณ ์
๋ ฅ </p></blockquote><p><strong>๋์ ํ๊ฒ๋ค์ ๋ฐ๋์ ๋ฏธ๋ฆฌ ์ ์ธ๋์ด ์์ด์ผํฉ๋๋ค.</strong></p><figure class="highlight cmake"><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"><span class="comment">## TARGET_LINK_LIBRARIES ( <Target_์ด๋ฆ> <๋ผ์ด๋ธ๋ฌ๋ฆฌ> <๋ผ์ด๋ธ๋ฌ๋ฆฌ> ... )</span></span><br><span class="line"><span class="comment">## app.out์ ๋น๋ํ ๋ libuart.a(ํน์ libuart.so)์ libwifi.a๋ฅผ ํฌํจํ๊ณ Shared ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ธํ๋ ์ต์
(-static)์ ์ง์ ํฉ๋๋ค.</span></span><br><span class="line"><span class="keyword">TARGET_LINK_LIBRARIES</span> ( app.out uart wifi -static )</span><br></pre></td></tr></table></figure><br/><h3 id="target-link-directories"><a href="#target-link-directories" class="headerlink" title="target_link_directories"></a>target_link_directories</h3><hr><p>3.13๋ฒ์ ผ์์ ์ถ๊ฐ๋ ๋ช
๋ น์ด๋ก</p><p><strong>๋์ ํ๊ฒ๋ค์ ๋ฐ๋์ ๋ฏธ๋ฆฌ ์ ์ธ๋์ด ์์ด์ผํฉ๋๋ค.</strong></p><figure class="highlight plain"><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">target_link_directories(<target> [BEFORE]</span><br><span class="line"> <INTERFACE|PUBLIC|PRIVATE> [items1...]</span><br><span class="line"> [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])</span><br></pre></td></tr></table></figure><br/><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><ol><li><a href="https://cmake.org/cmake/help/v3.21/guide/tutorial/index.html">https://cmake.org/cmake/help/v3.21/guide/tutorial/index.html</a></li><li><a href="https://iostream1029.tistory.com/7">https://iostream1029.tistory.com/7</a></li><li><a href="https://www.tuwlab.com/ece/27260">https://www.tuwlab.com/ece/27260</a></li></ol>]]></content>
<categories>
<category> CMake </category>
</categories>
<tags>
<tag> cmake </tag>
<tag> cmakelists.txt </tag>
<tag> build </tag>
</tags>
</entry>
<entry>
<title>[WearMask] E02. YOLO</title>
<link href="2021/06/02/wearmask-02/"/>
<url>2021/06/02/wearmask-02/</url>
<content type="html"><![CDATA[<h1 id="YOLO-v1-v3-Report-Review"><a href="#YOLO-v1-v3-Report-Review" class="headerlink" title="YOLO v1~v3 Report Review"></a>YOLO v1~v3 Report Review</h1><br/><blockquote><p>์ด๋ฒ ํฌ์คํธ์์๋ YOLO ์๊ณ ๋ฆฌ์ฆ์ ๋ง๋์ <code>Joseph Redmon</code>์ ๋
ผ๋ฌธ์ ๋ฆฌ๋ทฐํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. v2๋ v1์ ๋นํด ๋ฐฉ์์ด ๋ฌ๋ผ์ก์ง๋ง v3๋ v2์ ๋ช๊ฐ์ง ๊ธฐ๋ฒ๋ค์ ์ฌ์ฉํ ๊ฒ์ผ๋ก ํฌ๊ฒ ๋ฌ๋ผ์ง์ง ์์ Tech Report๋ก ๊ฒ์ฌ๋์ด ์์ต๋๋ค. ๋
ผ๋ฌธ์ <a href="https://pjreddie.com/darknet/">DarkNet</a>์์ ๋ฐ์ ์ ์์ต๋๋ค.</p></blockquote><br/><img width = "100%" src = "\image\down.jpg"/><br/><h2 id="YOLO-v1"><a href="#YOLO-v1" class="headerlink" title="YOLO v1"></a>YOLO v1</h2><blockquote><p> we frame object detection as a regression problem to spatially separated bounding boxes and associated class probabilities. - Abstract</p></blockquote><p>์์ ํฌ์คํธ์์๋ ์ธ๊ธํ๋ฏ์ด YOLO๋ ๊ธฐ์กด์ object detection๋ค๊ณผ๋ ๋ค๋ฅด๊ฒ 1-stage detector์
๋๋ค.</p><p>Image Classification์ ํ์์ ๋๋ ๋๋์ฒด ์ด๋ป๊ฒ localization(๊ฐ์ฒด ํ์ง)์ recognization(ํด๋์ค ๋ถ๋ฅ)๋ฅผ ๋์์ ํ๋ ์ถ์๋๋ฐ ์ด๋ ์ฐจ์ฐจ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.</p><h3 id="1-Introduction"><a href="#1-Introduction" class="headerlink" title="1. Introduction"></a>1. Introduction</h3><img src="\image\step.jpg"/><p>๋จผ์ ๊ฐ๋จํ <strong>PIPELINE</strong>์ ์๋ ค๋๋ฆฌ์๋ฉด ์์ ๊ฐ์ต๋๋ค.</p><ol><li>์ด๋ฏธ์ง๋ฅผ Resizeํ๋ค. (448 X 448)</li><li>Model์ ํต๊ณผ์ํจ๋ค. (CNN based network)</li><li>NMS(Non Max Suppression)์ ์ฌ์ฉํ๋ค.</li></ol><p><code>YOLO</code>๋์ค๊ฒ ๋ ๊ฒฐ์ ์ ์ธ ์ด์ ๋ ๋ฐ๋ก ์ง๊ด์ ์ธ ์ด์ ๋ผ๊ณ ํฉ๋๋ค. </p><p>์ธ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ํ๋ฒ์ ์ฝ๊ณ ๊ฐ์ฒด๊ฐ ์ด๋์๋์ง, ๊ทธ ๊ฐ์ฒด๋ค์ด ์ด๋์ฅ์์ ์๋์ง๋ฅผ ํ๋จํ ์ ์์ผ๋ฉฐ ๊ต์ฅํ ๋น ๋ฅด๊ณ ์ ํํฉ๋๋ค. </p><p>ํ์ง๋ง, ๊ธฐ์กด์ ๋ฅ๋ฌ๋ ๋ชจ๋ธ(<code>Fast-RCNN</code>)์ <code>Regional Proposal</code>์ ํตํด <code>bounding box</code>๋ฅผ ์์ฑํ์ฌ ๊ฐ์ฒด๋ฅผ ์ฐพ๊ณ <code>classifier</code>๋ฅผ ์คํํ์ฌ ๊ตฌ๋ถ์ ํ๋ 2-stage์ ๋ฐฉ์์ ์ฌ์ฉํ๋๋ฐ, ์ด๋ฌํ ๋ณต์กํ ํ์ดํ๋ผ์ธ์ ๋๋ฆฌ๊ณ ์ต์ ํํ๊ธฐ ์ด๋ ต๋ค๊ณ ํฉ๋๋ค.</p><p>๋ฐ๋ผ์, ์ด๋ฅผ ํด๊ฒฐํ๊ณ ์ <code>YOLO</code>๋ <strong>Single Regression</strong>๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ <strong>1-stage detector</strong>๋ก ์ค๊ณํ๊ฒ ๋ ๊ฒ์
๋๋ค. </p><p>์์ <strong>PIPELINE</strong>์ ์ดํด๋ณด๋ฉด SINGLE-NETWORK๋ฅผ ํต๊ณผ์ํค๋ฉด ๋ค์์ <code>bounding box</code>์ <code>class</code>๋ฅผ ์๋ ค์ฃผ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.</p><p>๋ํ ๊ธฐ์กด์ <code>Regional Proposal</code>๋ฐฉ์์ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฐฐ๊ฒฝ์ ๊ฐ์ฒด๋ก ์ธ์ํ๋ ์ค์๋ฅผ ๋ฒํ๊ฒ ๋๋๋ฐ <code>YOLO</code>๋ <code>Fast R-CNN</code>๋ณด๋ค ์ ๋ฐ ์ดํ๋ก ์ด error rate์ ์ค์๋ค๊ณ ํฉ๋๋ค.</p><h3 id="2-Unified-Detection"><a href="#2-Unified-Detection" class="headerlink" title="2. Unified Detection"></a>2. Unified Detection</h3><p>๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ <strong>1-stage detector</strong>๋ก ์ค๊ณํ ์ ์์์๊น์?</p><p><code>YOLO</code>๋ ์ ์ฒด์ด๋ฏธ์ง๋ฅผ ํ๋์ single neural network์ ํต๊ณผ์์ผฐ์ต๋๋ค. ์ด ๋คํธ์ํฌ๋ ์ ์ฒด์ด๋ฏธ์ง๋ก๋ถํฐ feature๋ค์ ์ถ์ถํ๊ณ bounding box๋ฅผ ์์ธกํ๋๋ฐ ์ฌ์ฉํ์ต๋๋ค. ๋ํ, ์ด bounding box๊ฐ ์ด๋ค class์ ์ํด์๋์ง ์์ธกํ๊ธฐ๋ ํฉ๋๋ค. </p><p>์ฆ, <strong>END TO END</strong> training์ด ๊ฐ๋ฅํด์ง๊ณ ๋์ mAP๋ก ๋์ FPS๋ฅผ ์ป๊ฒ ๋์์ต๋๋ค.</p><p>์ง๊ธ๋ถํฐ๋ ํ์ดํ๋ผ์ธ์ ์์ธํ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.</p><p>์ฐ์ , ์ด๋ฏธ์ง๋ฅผ <strong>S X S</strong> Grid๋ก ์ชผ๊ฐญ๋๋ค. ๋ง์ฝ ๊ฐ์ฒด์ ์ค์์ด ์ด grid-cell์์ ์กด์ฌํ๋ค๋ฉด, grid cell์ object๊ฐ ์กด์ฌํ๋ค๋ผ๊ณ ์์ธกํฉ๋๋ค.</p><p>๊ฐ๊ฐ์ grid-cell์ <strong>B</strong> bounding box๋ค์ ์์ธกํ๊ฒ ๋๊ณ ์ด๊ฐ ์กด์ฌํ๋์ง๋ฅผ ํ๋ฅ ๋ก ๋ํ๋ธ <strong>confidence score</strong>๋ฅผ ์์ธกํ๊ฒ๋ฉ๋๋ค. ์ด ๋์ confidence score๋ </p><p>$$Pr(Object) * IOU^{truth}_{pred}$$</p><p>๋ก ์ ์๋ฉ๋๋ค.</p><p>๋ง์ฝ ๊ฐ์ฒด๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด, confidence score๋ 0์ด๋ ๊ฒ์
๋๋ค.</p><p>๋ง์ฝ ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ค๋ฉด, <code>predicted box</code>์ <code>ground Truth</code>์ฌ์ด์ <strong>IOU</strong>๊ฐ confidence score๊ฐ ๋์ด์ผ๋ง ํ ๊ฒ์
๋๋ค.</p><p>์ด ๋, bounding box๋ 5๊ฐ์ ์ฑ๋ถ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.<br>$$<br>x, \ y,\ w,\ h,\ and \ \ confidence<br>$$</p><ul><li><strong>(x,y)</strong> : box์ center ์ขํ</li><li><strong>w,h</strong> : width, height</li><li><strong>confidence</strong> : IOU between the predicted box and any ground truth box</li></ul><p>๊ฐ๊ฐ์ Grid cell์ ๋ํ class probability๋ฅผ ์์ธกํ๋๋ฐ, ์ด๋ ๋ค์์ ์์ ํตํด ๊ตฌํฉ๋๋ค.</p><p>$$<br>Pr(Class|Object)* Pr(Object) * IOU^{truth}_{pred} = Pr(Class_i)*IOU^{truth}_{pred}<br>$$<br>๋ฒ ์ด์ฆ์ ์ ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์์๊ฐ์ด ์์์ด ๋ฐ๋์ ์ ์ ์์ต๋๋ค.</p><p>์์ ํ์ดํ๋ผ์ธ์ ์ ์ฉ์ํค๋ ์์ ๋ฅผ ์ดํด๋ณด๋ฉด ์๋์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ต๋๋ค.</p><br/><img src = "\image\pipe.jpg"/><br/><p><strong>์ด ๋, ์ ์๋ PASCAL VOC ๋ฐ์ดํฐ์
์์ S = 7, B = 2๋ฅผ ์ฌ์ฉํ๊ณ C = 20์ ์ฌ์ฉํ์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ 7 X 7 X 30 tensor๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.</strong></p><p>์ด ๋, S = Grid cell์ ํฌ๊ธฐ, B= bounding box ์, C = class ์ ์
๋๋ค. (PASCAL VOC ๋ฐ์ดํฐ์
์ LABEL ์๋ 20๊ฐ ์ด๋ฏ๋ก C = 20์
๋๋ค.)</p><h4 id="2-1-Network-Design"><a href="#2-1-Network-Design" class="headerlink" title="2.1 Network Design"></a>2.1 Network Design</h4><img src = "\image\archi.jpg"/><p>๊ธฐ๋ณธ์ ์ผ๋ก YOLO๋ image classification๋ชจ๋ธ์ธ GoogLeNet์ ์๊ฐ์ ๋ฐ์ backbone ๋คํธ์ํฌ๋ฅผ ์ค๊ณํ์์ต๋๋ค. 24๊ฐ์ Conv layer์ 2๊ฐ์ FC layer๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ์ด ๋, 1 X 1 reduction layer๋ค์ 3 X 3 Conv layer๋ก ์ฌ์ฉํ๋ค๊ณ ํฉ๋๋ค. </p><p> ์ดํ ๋ฒ์ ผ๋ค์์๋ backbone ๋คํธ์ํฌ๋ฅผ Residual Learning์ ํตํด ๋ ๊น๊ฒ ์์์ต๋๋ค.</p><p>๋ณดํต ImageNet๋ฐ์ดํฐ์
์ด 224 x 224์ธ๋ฐ, Object Detection์ ์์ญ์์๋ high resolution์ด ๋ ์ข์ ์ฑ๋ฅ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ 448 x 448์ input size๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค.</p><ul><li>Activation function : <code>Leaky ReLU</code></li><li>Optimizer : <code>Sum-Squared Error</code></li></ul><p>Optimizer๋ก sum-squared error๋ฅผ ์ฌ์ฉํ ์ด์ ๋ ์ต์ ํํ๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์ธ๋ฐ ์ด๋ ๋ฐฐ๊ฒฝ์ ํ์ตํ๋ ๊ฒ๊ณผ ๊ฐ์ฒด๋ฅผ ํ์ตํ๋ ๊ฒ์ loss๊ฐ ๋์ผํ๊ฒ ํ์ตํ ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.</p><p>๋๋ถ๋ถ์ ์ด๋ฏธ์ง๋ค์ ๋ฐฐ๊ฒฝ์ ๋ถ๋ถ์ด ๊ฐ์ฒด๊ฐ ์๋ ๋ถ๋ถ๋ณด๋ค ํจ์ฌ ๋ง์๋ฐ ์ด๋ฅผ ์กฐ์ ํ์ง ์์ผ๋ฉด ๋ฐฐ๊ฒฝ์ ์๋์ ์ผ๋ก ๋ ๋ณด๊ฒ๋๋ ํจ๊ณผ๊ฐ ์๊ธฐ๊ฒ ๋ฉ๋๋ค.</p><p>๋ฐ๋ผ์, ์ด๋ฅผ ์ค์ด๊ธฐ ์ํด loss function์์ ๋ค์์ ์์๋ฅผ ๋์
ํ๊ฒ ๋ฉ๋๋ค.<br>$$<br>\lambda_{coord}, \lambda_{noobj}<br>$$<br>์์ ์์๋ ๊ฐ๊ฐ <strong>5</strong>์ <strong>0.5</strong>๋ฅผ ๋์
ํ์๋ค๊ณ ์ ์๋ ๋งํ๋๋ฐ ์ด๋ object๊ฐ ์๋ ๋ถ๋ถ๊ณผ ์๋ ๋ถ๋ถ์ ํ์ต์ํค๋ ๋น์จ์ ๋ค๋ฅด๊ฒ ์กฐ์ ํจ์ผ๋ก์จ ๋ฐฐ๊ฒฝ์ ๋ง์ด ํ์ตํ๊ฒ ๋๋ ๊ฑธ ์ค์๋ค๊ณ ํฉ๋๋ค.</p><img src = "\image\loss.jpg"/><p>์ ๋ฒ ํฌ์คํธ์์ ์ธ๊ธํ๋ loss function ์
๋๋ค.</p><p>์ด๋ฒ ์๊ฐ์๋ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.<br>$$</p><ol><li>\ \ \ \ \lambda_{coord}\sum^{S^2}<em>{i=0}\sum</em>{j=0}^{B}1^{obj}_{ij}[(x_i-x^{<code>}_i)^2+(y_i-y^</code>_i)^2]<br>$$<br>box์ ์ค์์ regressionํ๋ ์์์
๋๋ค.</li></ol><p>์ด ๋ ์ฌ์ฉํ<br>$$<br>1_{ij}^{obj}<br>$$<br>๋ object๊ฐ ์กด์ฌํ์ ๋ identity function์ ๋งํ๋ฉฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด zero matrix๊ฐ ๋ฉ๋๋ค.</p><p>์์ชฝ ์๊ทธ๋ง๋ฅผ ์ดํด๋ณด๋ฉด Bounding box์ ๊ฐ์๋งํผ, ๋ฐ๊นฅ์ชฝ์๊ทธ๋ง๋ฅผ ์ดํด๋ณด๋ฉด ๊ทธ๋ฆฌ๋์ ๊ฐ์๋งํผ์ ๋ชจ๋ ๋ํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.</p><p>$$<br>2. \quad \lambda_{coord}\sum^{S^2}<em>{i=0}\sum</em>{j=0}^{B}1^{obj}_{ij}[(\sqrt{w_i}-\sqrt{w^{<code>}_i})^2+(\sqrt{h_i}-\sqrt{h^</code>_i})^2]<br>$$<br><code>1.</code>์ ์์๊ณผ ๊ต์ฅํ ๋น์ทํ๋ฐ w,h์ ์ ๊ณฑ๊ทผ์ด ์์์ ธ์๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. </p><p>๋ง์ฝ ์ ๊ณฑ๊ทผ์ ์์ฐ์ง ์๋ ์ํ๋ผ๋ฉด ์๋์ ์ผ๋ก ํฐ ๋ฐ์ค์ SSE๊ฐ ํฌ๋ฏ๋ก ์์ ๋ฐ์ค๋ฅผ ํ์ตํ์ง ์๋ ๊ฒฝํฅ์ด ์๊ธธ ์ ์์ต๋๋ค. ๋ฐ๋ผ์, Regularization์ ์๋ฏธ๋ก sqrt๋ฅผ ์์ฐ๊ฒ ๋ฉ๋๋ค.</p><img src = "\image\Table.jpg"/><p>์ธ๊ฐ์ด ์ค์๊ฐ์ผ๋ก ์ธ์ํ๋ FPS(Frame Per Second)๋ 30FPS์ธ๋ฐ YOLO๋ ๊ทธ๋ฅผ ์ํํ๋ 45FPS๋ฅผ ๊ธฐ๋กํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.</p>]]></content>
<categories>
<category> WearMask </category>
</categories>
<tags>
<tag> WearMask </tag>
<tag> Capstone </tag>
<tag> DeepLearning </tag>
<tag> YOLO </tag>
</tags>
</entry>
<entry>
<title>[WearMask] E01. Object Detection</title>
<link href="2021/05/31/wearmask-01/"/>
<url>2021/05/31/wearmask-01/</url>
<content type="html"><![CDATA[<h1 id="Capstone-Software-Project"><a href="#Capstone-Software-Project" class="headerlink" title="Capstone Software Project"></a>Capstone Software Project</h1><hr><br/><h2 id="๋ค์ด๊ฐ๊ธฐ์-์์"><a href="#๋ค์ด๊ฐ๊ธฐ์-์์" class="headerlink" title="๋ค์ด๊ฐ๊ธฐ์ ์์"></a>๋ค์ด๊ฐ๊ธฐ์ ์์</h2><p>์ง๋ ์๊ฐ์ ๋ง์คํฌ Detector๋ฅผ ๋ง๋ค๊ธฐ ์ํด cvlib์ ์๋ <code>detect_face</code> ๋ชจ๋์ ์ฌ์ฉํ๊ณ Image Classification์ ํ๋ <code>2-Stage Detector</code>๋ฅผ ๋ง๋ค์ด ๋ณด์์๋ค.</p><p>๊ทธ ๋๋ ์์์ง๋ง, <code>2-stage Detector</code>์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์๋ค.</p><br/><ol><li>์๋ ์ธก๋ฉด์์ <code>1-stage</code>์ ๋นํด ๋๋ฆด ์ ๋ฐ์ ์๋ค.</li><li><code>cvlib</code>์ <code>detect_face</code>๋ชจ๋์ ์์ ์ผ๊ตด์ ์ฐพ์ง๋ชปํ๋ค.</li></ol><br/><p>์ฐ์ <code>2.</code>์ ๋ฌธ์ ๋ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์๋ค. ์ ์ด์ detector์ ์๊ณ ๋ฆฌ์ฆ์ ๋ชฐ๋์ผ๋ฏ๋ก ์์ ํ ์ ์๋ ๋ชจ๋ธ์ด ์๋์๋ค. ๋ฐ๋ผ์, <code>MTCNN</code>๊ณผ ๊ฐ์ ๋ชจ๋์ ์ฌ์ฉํจ์ผ๋ก์จ ์์ ์ผ๊ตด์ ๊ฐ์งํ๋ ์์คํ
์ ๋ง๋ค๋ คํ์ผ๋ ์ด๊ฒ ๋ํ ๋ฌธ์ ๊ฐ ์์๋ค. ๋ฐ๋ก <strong>์๋</strong>๋ค. <code>MTCNN</code>๋ชจ๋ธ๋ง ํต๊ณผํ๋๋ฐ ์์ฒญ๋ ์๊ฐ์ ์์ํ๋ค. (<del>์ค์ ๋ก ์ธก์ ํ์ง ์์์ง๋ง CPUํ๊ฒฝ์์ ์ฒด๊ฐ์ 10๋ฐฐ๋ ๋ ๊ฒ ๊ฐ์๋ค.</del>)</p><p>๊ทธ๋ฆฌ๊ณ <code>1.</code>์ ๋ฌธ์ ๋ <code>YOLO</code>์๊ณ ๋ฆฌ์ฆ์ ์๊ฒ๋๋ฉฐ ๋๋ฆด ์ ๋ฐ์ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค. ๋ฐ๋ผ์, ์ค์๊ฐ ์๋น์ค๋ฅผ ๋ง๋ค์ด๋ณธ๋ค๋ ์ธก๋ฉด์์ FPS๊ฐ ๋์ <code>YOLO</code> ์๊ณ ๋ฆฌ์ฆ์ ์ฑํํ๊ธฐ๋ก ํ๋ค.</p><br/><hr><h2 id="WHAT-IS-YOLO"><a href="#WHAT-IS-YOLO" class="headerlink" title="WHAT IS YOLO?"></a>WHAT IS YOLO?</h2><p><code>YOLO</code>๋ผ ํ๋ฉด <code>You Only Live Once </code>๋ฅผ ์๊ฐํ ์ ์์ง๋ง <code>Object Detection</code>์์๋ ๋ค๋ฅธ ์๋ฏธ๋ก ์ฐ์ธ๋ค.</p><blockquote><p><code>YOLO</code> = <code>You Only Look Once!</code></p></blockquote><br/><img width ="60%" src = "\image\loss.jpg"/><br/>์์ loss function์ ์ดํดํ๋ฉด `YOLO`์ ๋ป์ ์ดํดํ๊ฒ ๋๋ค. [๋คํฌ๋ท](https://pjreddie.com/darknet/yolo/)์ ๋ค์ด๊ฐ๋ณด๋ฉด ๋
ผ๋ฌธ์ด ์์ผ๋ ์ดํด๋ณด๋ฉด ์ข๊ณ Loss function์ ์ดํดํ๊ธฐ ์ํด์๋ ๋ค์ํ ๋ธ๋ก๊ทธ ๊ธ์ ์ดํด๋ณด๋๊ฒ ์ข๋ค.<ol><li><p><a href="https://bkshin.tistory.com/entry/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-YOLOYou-Only-Look-Once">๋
ผ๋ฌธ ๋ฆฌ๋ทฐ - YOLO(You Only Look Once) ํบ์๋ณด๊ธฐ</a></p></li><li><p><a href="https://medium.com/curg/you-only-look-once-%EB%8B%A4-%EB%8B%A8%EC%A7%80-%ED%95%9C-%EB%B2%88%EB%A7%8C-%EB%B3%B4%EC%95%98%EC%9D%84-%EB%BF%90%EC%9D%B4%EB%9D%BC%EA%B5%AC-bddc8e6238e2">You Only Look Once โ ๋ค.. ๋จ์ง ํ ๋ฒ๋ง ๋ณด์์ ๋ฟ์ด๋ผ๊ตฌ!</a></p></li><li><p><a href="https://curt-park.github.io/2017-03-26/yolo/">[๋ถ์] YOLO</a></p></li></ol><p>์์ ๊ฐ์ ๋ธ๋ก๊ทธ๊ธ์ ์ฐธ์กฐํ๋ฉด loss function, grid-cell, anchor box์ ๊ฐ๋
๋ฑ์ ์ฐพ์๋ณผ ์ ์๋ค. </p><br/><h2 id="Why-YOLO"><a href="#Why-YOLO" class="headerlink" title="Why YOLO?"></a>Why YOLO?</h2><p><code>YOLO</code>๋ฅผ ์ฌ์ฉํ๊ฒ ๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.</p><br/><ol><li>Grid cell๊ณผ anchor box๋ฅผ ์ด์ฉํ๋ค๋ฉด MTCNN๊ณผ ๊ฐ์ด ์์ ์ผ๊ตด์ detectํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ง ๊ฒ์ด๋ค.</li><li>๋์ FPS์ ์ ์ ํ mAP๋ฅผ ๊ฐ์ง YOLO๋ชจ๋ธ๋ก์จ ์ ์ ํ trade-off๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ ๊ฐ์งํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ง ๊ฒ์ด๋ค.</li></ol><br/><img width="80%" src="\image\inference.jpg"/><br/><p>๋คํฌ๋ท ํํ์ด์ง๋ YOLO v3๋
ผ๋ฌธ์ ์ดํด๋ณด๋ฉด ์์๊ฐ์ ๊ทธ๋ํ๊ฐ ์๋ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ ์ฌ๊ธฐ์ ์ฃผ๋ชฉํ ์ ์ ๋น์์ SOTA์๋ RetinaNet์ ๋นํด mAP์ inference time์ธก๋ฉด์์ ๋ชจ๋ ์ํํจ์ ์ ์ ์๋ค. </p><p>๊ทธ๋์ ์ ์๊ฐ ๊ตณ์ด ๊ทธ๋ํ๋ฅผ ํ์ฅ์ํค์ง ์๊ณ ๊ทธ๋ํ์ ์ผ์ชฝ์ ์ ์ ์ฐ์ด๋์ ๊ฒ ๊ฐ๊ธฐ๋ํ๋ค. (<del>๋๋ถ๋ถ์ ๋
ผ๋ฌธ์ ์ฝ์ผ๋ฉด ๊ต์ฅํ ๋ฑ๋ฑํ ์ดํฌ์ ์ฌ๋ฏธ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ YOLO๋
ผ๋ฌธ์ ๋ญ๊ฐ ์น๊ทผํ ์์ ์จ๊ฐ ์จ๋์๋ฏํ ๊ธ๊ฐ์๋ค.</del>)</p><br/><img width = "80%" src = "\image\sample.gif"/><p><a href = "https://www.youtube.com/watch?v=dUdp8xXxZVM" align = "center"/>์ถ์ฒ : [4K] ๋ํ๋ฏผ๊ตญ๊ฑฐ๋ฆฌ+๊ฐ๋จ ํด์ผ ๋ฎ ๊ฑฐ๋ฆฌํ๊ฒฝ ์์ธ๊ฑฐ๋ฆฌ ๊ฐ๋จ๊ฑฐ๋ฆฌ</a></p><br/><p>YOLO v3๋ก ํ์ต์ ์์ผฐ์ ๋ ๊ฒฐ๊ณผ๋ฌผ์ ์์ ๊ฐ์ต๋๋ค.</p><p>์๊ทผํ ๋์ ์ฑ๋ฅ์ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ํ์ธํ์ต๋๋ค. ํ์ง๋ง, ์์๊ฐ์ ์ฑ๋ฅ์ผ ๊ฒฝ์ฐ <code>1.</code>์ ํด๊ฒฐํ์ง ๋ชปํ์ต๋๋ค.</p><br/><img width = "100%" src ="\image\structure.jpg"/><br/><p>์์ ๊ฐ์ ์ ์ฒด์ ์ธ structure์์ <Predict one, Predict two, Predict three> ์ผ๋ก ์ด 3๊ฐ์ grid cell์์ anchor box๋ฅผ regressionํ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.</p><p>์ฆ, layer๋ฅผ ํต๊ณผ์ํค๋ฉด์ <code>13x13</code>, <code>26x26</code>, <code>52x52</code>์ <code>grid cell</code>์์ ๊ฐ๊ฐ 3๊ฐ์ <code>anchor box</code>๋ฅผ regressionํ๊ฒ ๋๋๋ฐ ์ด ๋ ๊ฐ์ฅ ์์ <code>anchor box</code>์ ํฌ๊ธฐ๋ <code>11, 21</code>์ด๋ค. 412x412์ฌ์ด์ฆ์์ <code>11,21</code>์ด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.</p><br/><img src = "\image\ex.png"/><br/>์์ ๊ฐ์ด ๋ณด๋ฉด ์ถฉ๋ถํ ์์๋ณด์ด์ง๋ง, ์ฐ๋ฆฌ๋ ๋ณดํต Threshold๋ฅผ ์ค์ผ๋ก์จ confidence๊ฐ 0.5 ์ด์์ธ ๊ฒ๋ค๋ก๋ง ์ถ๋ ฅ์ ํ๋๋ฐ confidence๊ฐ ์ถฉ๋ถํ ๋์ง ์์ ์์ gifํ์ผ์์๋ ๋ณผ ์ ์๋ฏ์ด ๋ชจ๋ ์ผ๊ตด๋ค์ predictionํ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค.<p>๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ๊ทธ ๋ค์ ๋ ์ด์ด๋ฅผ ์ถ๊ฐํ๋ฉด์ grid cell์ ๋ ์ด์ดํ๊ฒ ๋ง๋ค๊ณ anchor box๋ฅผ ๋ ์๊ฒ ์์ฑํ์ฌ ์ถฉ๋ถํ ์์ ์ผ๊ตด๋ predictionํ ์ ์๊ฒ ํ ๊ฒ์
๋๋ค. (<del>๋๋๊ฒ๋ AlexeyAB์ github์ ๊ฐ๋ณด๋ฉด <a href="https://github.com/AlexeyAB/darknet/blob/master/cfg/yolov3_5l.cfg">yolov3 5Layer</a>์ ๋ํ configuration ํ์ผ์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.</del>) (์งํ์ค)</p><p>๊ทธ๋ฆฌ๊ณ ๋ํ <code>2.</code>๋ ํด๊ฒฐํด์ผ ํฉ๋๋ค. ์ฐ์ , ์ฑ๋ฅ์ ์ต๋ํํ๊ธฐ ์ํด 5 layer๋ก ํ์ต์ ์์ผ๋ณด๊ณ ์ฐจ์ฐจ ๊ฒฝ๋ํ๋ฅผ ์งํํด ๋๊ฐ ๊ฒ์
๋๋ค.</p><p>๊ธฐํํ๋ ค๋ ํ๋ก์ ํธ์ ๋ชฉํ๋ <strong>์นดํ๋ ๊ณต๊ณต์ฅ์๊ฐ์ด ๋ง์ ์ฌ๋์ด ๋ฐ์งํด์๋ ํ๊ฒฝ์์์ ๋ง์คํฌ ํ์ง</strong>์ด๊ธฐ ๋๋ฌธ์ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ์ผ๊ตด ํฌ๊ธฐ๋ ์์ ๊ฒ์
๋๋ค.</p><p>๋ํ, CCTV๋ ๋ฉ๋ฆฌ์ ์ฐ์ ์ผ๊ตด๋ค์ด๊ธฐ ๋๋ฌธ์ anchor box๊ฐ <code>373,326</code>์ ๊ฐ์ด ํฐ ๊ฒ๋ค์ ํ์๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์, ์ ์ ํ grid cell, ์ ์ ํ anchor box๋ฅผ ๊ฒฝํ์ ์ผ๋ก ํ์ธํ๋ฉด์ layer์, ๊ถ๊ทน์ ์ผ๋ก weight params๋ค์ ์ค์ผ ๊ฒ์
๋๋ค.</p><br/><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><ol><li><a href="https://ctkim.tistory.com/81">https://ctkim.tistory.com/81</a></li><li> Joseph Redmon, Santosh Divvala, Ross Girshick, and Ali Farhadi. You only look once: Unified, real-time object detection. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR), pages 779โ 788, 2016.</li><li>Joseph Redmon and Ali Farhadi. YOLO9000: better, faster, stronger. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR), pages 7263โ 7271, 2017</li><li>Joseph Redmon and Ali Farhadi. YOLOv3: An incremental improvement. arXiv preprint arXiv:1804.02767, 2018.</li></ol>]]></content>
<categories>
<category> WearMask </category>
</categories>
<tags>
<tag> WearMask </tag>
<tag> Capstone </tag>
<tag> DeepLearning </tag>
<tag> YOLO </tag>
</tags>
</entry>
<entry>
<title>[SpringBoot] E01.Start SpringBoot!</title>
<link href="2021/04/27/springboot-01/"/>
<url>2021/04/27/springboot-01/</url>
<content type="html"><![CDATA[<h1 id="Start-Spring-Boot"><a href="#Start-Spring-Boot" class="headerlink" title="Start Spring Boot!"></a>Start Spring Boot!</h1></br><blockquote><p>์ด ๊ธ์ <code>์คํ๋ง๋ถํธ์ AWS๋ก ํผ์ ๊ตฌํํ๋ ์น ์๋น์ค</code>๋ผ๋ ์ฑ
์ ์ฐธ๊ณ ํ์ฌ ์์ฑํ ๊ธ์
๋๋ค.</p></blockquote></br><hr><h2 id="build-gradle"><a href="#build-gradle" class="headerlink" title="build.gradle"></a>build.gradle</h2></br><p>๋งค๋ฒ ์๋ฐ๋ก ํ๋ก๊ทธ๋๋ฐํ ๋ ๋ดค๋ ํ์ผ์ด์ง๋ง, ์์ฃผ ์ด์ง๋ ์๊ณ ๊ฑด๋ค์ผ ์ผ์ด ๊ฑฐ์ ์์๋ ํ์ผ์
๋๋ค. ์๋๋ก์ด๋ ์ฑ์ ๋ง๋ค๋๋ ์ ๊น ๋ง์ก๋ ๊ธฐ์ต์ด ์์ง๋ง ์ด๋๊น์ง๋ ๋ณต๋ถ์ ๊ณผ์ ์ด์์ ๋ฟ ์ ๋๋ก ์ดํด๋ณธ ์ ์ด ์๋๋ฐ ์ด์ ๋ํด ํ๋ฒ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.</p><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line">buildscript{</span><br><span class="line"> ext{</span><br><span class="line"> springBootVersion = <span class="string">'2.1.7.RELEASE'</span></span><br><span class="line"> }</span><br><span class="line"> repositories{</span><br><span class="line"> mavenCentral()</span><br><span class="line"> jcenter()</span><br><span class="line"> }</span><br><span class="line"> dependencies{</span><br><span class="line"> classpath(<span class="string">"org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}"</span>)</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></br><ul><li><code>ext</code> : build.gradle์์ ์ฌ์ฉํ๋ <strong>์ ์ญ๋ณ์</strong>๋ฅผ ์ค์ </li></ul></br><figure class="highlight java"><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">apply plugin: <span class="string">'java'</span></span><br><span class="line">apply plugin: <span class="string">'eclipse'</span></span><br><span class="line">apply plugin: <span class="string">'org.springframework.boot'</span></span><br><span class="line">apply plugin: <span class="string">'io.spring.dependency-management'</span></span><br></pre></td></tr></table></figure></br><p>์ฑ
์์๋ ์์๊ฐ์ด plugin๋ค์ ์ค์ ์ ํ๋๋ฐ ์์ plugin๋ค์ ํ์ ํ๋ฌ๊ทธ์ธ๋ค์ด๋ฏ๋ก ํญ์ ์ถ๊ฐํ๋ฉด ๋๋ค๊ณ ํ์ต๋๋ค.</p><p>ํ์ง๋ง, ํํ๋ฅผ ๋ณด๊ณ ์์ํ๋๋ฐ ๋งจ์ฒ์ default๊ฐ์ผ๋ก plugin๋ค์ <code>plugins{ id 'java'}</code>์ ๊ฐ์ด ์ค์ ๋์ด ์์ด ์ฐจ์ด๊ฐ ๋ฌด์์ธ๊ฐ ๊ถ๊ธํ์ฌ <a href="https://stackoverflow.com/questions/32352816/what-the-difference-in-applying-gradle-plugin">์คํ์ค๋ฒํ๋ก์ฐ</a>์์ ๊ฒ์ํด๋ณธ ๊ฒฐ๊ณผ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉ์ ํ๋ค๊ณ ํฉ๋๋ค.</p></br><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line">plugins {</span><br><span class="line"> id <span class="string">'java'</span></span><br><span class="line"> id <span class="string">'eclipse'</span></span><br><span class="line"> id <span class="string">'org.springframework.boot'</span> version <span class="string">'2.1.7.RELEASE'</span></span><br><span class="line"> id <span class="string">'io.spring.dependency-management'</span> version <span class="string">'1.0.9.RELEASE'</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure></br><p>ํ์ง๋ง, โDSL (<code>plugins {...}</code>) does not work for your private plugins or company plugins which are not published to the official Gradle plugin repoโ๋ผ๊ณ ํ๊ณ apply plugin์ ์์ง ์ด๋ค๊ณ ํ๊ธฐ ๋๋ฌธ์ ์์ ์์๋ก ์ฌ์ฉํ๊ฒ ์ต๋๋ค.</p></br><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line">repositories{</span><br><span class="line"> mavenCentral()</span><br><span class="line"> jcenter()</span><br><span class="line">}</span><br><span class="line">dependencies {</span><br><span class="line"> compile(<span class="string">'org.springframework.boot:spring-boot-starter-web'</span>)</span><br><span class="line"> testCompile(<span class="string">'org.springframework.boot:spring-boot-starter-test'</span>)</span><br><span class="line">}</span><br></pre></td></tr></table></figure></br><ul><li><code>repositories</code> : ๊ฐ์ข
์์กด์ฑ(๋ผ์ด๋ธ๋ฌ๋ฆฌ)๋ค์ ์ด๋ค remote-repository(์๊ฒฉ์ ์ฅ์)์์ ๋ฐ์์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. default๊ฐ์ด๊ธฐ๋ํ๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก mavenCentral์ ๋ง์ด ์ฌ์ฉํ์ง๋ง, ์ต๊ทผ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์
๋ก๋ ๋์ด๋ ๋๋ฌธ์ jcenter๋ ๋ง์ด ์ฌ์ฉํ๋ค๊ณ ํฉ๋๋ค. ์ด๋ ์ถํ์ ์ง์ ์๋ฟ์ผ๋ฉด ๋ค์ ํ๋ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค.</li><li><code>dependencies</code> : ํ๋ก์ ํธ ๊ฐ๋ฐ์ ํ์ํ ์์กด์ฑ๋ค์ ์ ์ธํ๋ ๊ณณ์
๋๋ค. ์ด ๋, <code>compile</code>๋ฉ์๋ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด๋ฆ์ ์๋ถ๋ถ๋ง ์ถ๊ฐํ ๋ค ์๋์์ฑ(<strong>CTRL+SPACE</strong>)์ ์ฌ์ฉํ๋ฉด ์ข์ต๋๋ค. ๋จ, <strong>version ๋ช
</strong>์ ๋ช
์ํ์ง ์์ต๋๋ค. ๊ทธ๋์ผ ์์ <code>buildscript</code>๋ถ๋ถ์ dependencies์์์ ๋ฒ์ ผ์ ๋ฐ๋ผ๊ฐ๋๋ค.</li></ul></br><hr><h2 id="Github"><a href="#Github" class="headerlink" title="Github"></a>Github</h2></br><p>SpringBoot ํ๋ก์ ํธ๋ฅผ ์งํํ๊ธฐ์ ์์ ๊นํ๋ธ์ ์ฐ๋ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. Jetbrain์ IDEA๋ฅผ ๊น๋ค๋ณด๋ฉด ๋งค๋ฒ ์ฐ๋๋๋ค๋ ์ฌ์ค์ ์ธ์งํ๊ณ ์์์ง๋ง ํ ๋ฒ๋ ํด๋ณธ์ ์ด ์์์ต๋๋ค. ํ์ง๋ง, ์ด๋ฒ์ ๊ทธ <del>์๋ํ</del>์ฒซ๊ฑธ์์ ํ๋ฒ ๋ผ๋ณด๊ฒ ์ต๋๋ค.</p></br><p>์๋์ฐ ํ๊ฒฝ์์ [CTRL+SHIFT+A]๋ฅผ ํตํด Action ๊ฒ์์ฐฝ์ ์ด์ด <code>share project on github</code>๋ฅผ ๊ฒ์ํด๋ด
๋๋ค.</p><p>๊ทธ ํ ๊นํ๋ธ ๋ก๊ทธ์ธ์ ํ๋๋ฐ</p><p><code>invalid authentication data.404 not found</code>๊ฐ ์ถ๋ ฅ๋๋ ๊ฒ์
๋๋ค..!</p><p>๊ตฌ๊ธ๋ง์ ํด๋ณธ ๊ฒฐ๊ณผ ๋ค์์ <a href="https://zluoy.tistory.com/77">๋งํฌ</a>์์ token login์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ก๊ทธ์ธ ํด๋ณด์์ต๋๋ค. </p></br><p><strong>์ฃผ์ํ ์ </strong> : ํฅ๋ถํ ๋๋จธ์ง ๋ชจ๋ ํ์ผ์ ๋ชจ๋ commitํ์์ง๋ง <code>.idea</code> ๋๋ ํฐ๋ฆฌ๋ commit์์ ์ ์ธ์์ผ์ผ ํฉ๋๋ค. ์ธํ
๋ฆฌ์ ์ด์์ ํ๋ก์ ํธ ์คํ์ ์๋์ผ๋ก ์์ฑ๋๋ ํ์ผ๋ค์ด๊ธฐ ๋๋ฌธ์ ๊นํ๋ธ์ ์ฌ๋ฆฌ๋ ๊ฒ์ด ๋ถํ์ํฉ๋๋ค.</p></br><p>๋ฐ๋ผ์, ์์ผ๋ก <code>.idea</code> ๋๋ ํฐ๋ฆฌ๋ฅผ ์ปค๋ฐ ๋์์์ ์ ์ธํ๊ธฐ ์ํด <code>.gitignore</code>ํ์ผ์ ํตํด <code>.idea</code>๋๋ ํฐ๋ฆฌ๋ฅผ ์ ์ธํ๋๋ก ํ๊ฒ ์ต๋๋ค.</p></br><hr><h2 id="Test-Code"><a href="#Test-Code" class="headerlink" title="Test Code"></a>Test Code</h2></br></br><p><code>๋ฐฑ๊ธฐ์ </code>๋์ ์๋ฐ์คํฐ๋๋ฅผ ํ๋ฉด์ ๊ฐ์ฅ ๋ง์ด ๋ณด๊ณ ํ๊ณ ์ถ์๋ JUnit์ ํตํ ๋จ์ํ
์คํธ์
๋๋ค. ์๋น์ค์ ๋ชจ๋ ๊ธฐ๋ฅ์ ํ
์คํธ ํ๊ธฐ์๋ ์์์ด ๋๋ฌด ๋ถ์กฑํ๊ธฐ ๋๋ฌธ์ ์๋ก์ด ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ๋, ๊ธฐ์กด์ ๊ธฐ๋ฅ์ด ์ ์๋๋๋ ๊ฒ์ ๋ณด์ฅํด์ฃผ๋ ๊ฒ์ด ํ
์คํธ์ฝ๋์
๋๋ค.</p><p>์ด๋ฅผ ๋ง์น ํ TDD์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.</p></br><p>๋กฌ๋ณต์ ํตํด ์ด๋
ธํ
์ด์
์ ์์ฑํ๋ ค ํ๋๋ฐ ๋ง์ ํ๋ฌ๊ทธ์ธ์ ์ค์นํ๊ณ ๋์ ๋ง์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์คํ์ด ๋์ง ์๋ ๊ฒฝ์ฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.</p></br><blockquote><ol><li><p>Gradle version downgrade </p><p>11p์ ๊ทธ๋ ์ด๋ค๊ณผ JDK๋ฒ์ ผ์ด ๋ช
์๋์ด ์์์ง๋ง ์ฑ๊ฒฉ๊ธํ ์ ๋ ์ฝ๊ณ ๋ฐ๋ก ์คํตํ ๋์ ์ค๋ฅ๊ฐ ๋ฌ์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ธํ
๋ฆฌ์ ์ด์์ ๊ทธ๋ ์ด๋ค ๋ฒ์ ผ 5๋ฅผ ์ฌ์ฉํ๊ณ ์๋๋ฐ ์ด <a href="https://github.com/jojoldu/freelec-springboot2-webservice/issues/2">๋งํฌ</a>์์ ๋ค์ด๊ทธ๋ ์ด๋๋ฅผ ํ๋ฉด ํด๊ฒฐ๋ฉ๋๋ค. </p></li><li><p>Enable Annotation processing</p><p>70p์ ๋กฌ๋ณต์ ์ค์นํ ํ ์ต์
์ ํ์ฑํํ๋ผ๊ณ ํ์ง๋ง ์ ๋
ํ์ง์๋ ์ ๋.. ์ด๋ฒ์๋ ์ง๋์น๊ณ ๋ง์์ต๋๋ค. [Setting - Build, Execution, Deployment - Compiler - Annotation Processors] ๋ฉ๋ด์์ ํ์ธํ ์ ์์ต๋๋ค.</p></li><li><p>Build and Run</p><p>[Setting - Build, Execution, Deployment - Build Tools - Gradle]์์ <code>Build and run using</code> ์ต์
๊ณผ <code>Run test using</code>์ต์
์ IntelliJ IDEA๋ก ์ต์
์ ๋ฐ๊พธ๋ฉด ํด๊ฒฐ๋๋ ๋ฌธ์ ์์ต๋๋ค. </p></li></ol></blockquote></br><hr><h2 id="Annotation"><a href="#Annotation" class="headerlink" title="Annotation"></a>Annotation</h2><br/><p>์ฑ
์ ์๊ฐ๋์ด ์๋ Annotation์ ๋ํด์ ๊ฐ๋จํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.</p><br/><ol><li><p><code>@Getter</code></p><ul><li>์ ์ธ๋ ๋ชจ๋ ํ๋์ get method๋ฅผ ์์ฑํด์ค๋๋ค.</li></ul></li></ol><ol start="2"><li><p><code>@RequiredArgsConstructor</code></p><ul><li><p>์ ์ธ๋ ๋ชจ๋ final ํ๋๊ฐ ํฌํจ๋ ์์ฑ์๋ฅผ ์์ฑํด์ค๋๋ค.</p></li><li><p>final์ด ์๋ ํ๋๋ ์์ฑ์์ ํฌํจ๋์ง ์์ต๋๋ค.</p></li></ul></li></ol><ol start="3"><li><p><code>@AssertThat</code></p><ul><li><p>assertj๋ผ๋ ํ
์คํธ ๊ฒ์ฆ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒ์ฆ ๋ฉ์๋์
๋๋ค.</p></li><li><p>๊ฒ์ฆํ๊ณ ์ถ์ ๋์์ ๋ฉ์๋ ์ธ์๋ก ๋ฐ์ต๋๋ค.</p></li><li><p>** ๋ฉ์๋ ์ฒด์ด๋**์ด ์ง์๋์ด isEqulTo์ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ด์ด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.</p></li></ul></li></ol><ol start="4"><li><p><code>@isEqualTo</code></p><ul><li><p>assertj์ ๋๋ฑ ๋น๊ต ๋ฉ์๋์
๋๋ค.</p></li><li><p><code>assertThat</code>๊ณผ <code>isEqualTo</code>์ ๊ฐ์ ๋น๊ตํด์ ๊ฐ์ ๋๋ง ์ฑ๊ณต์
๋๋ค.</p></li></ul><blockquote><p><code>Junit</code>์ <code>assertThat</code>๊ณผ ๋ค๋ฅธ ๋ฉ์๋์
๋๋ค. assertj์ ์ฅ์ ์ <a href="http://bit.ly/30vm9Lg">๋งํฌ</a>์์ ํ์ธํ ์ ์์ต๋๋ค. ๋ค์์ ํ์ธํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.</p></blockquote></li></ol><ol start="5"><li><p><code>@RequestParam</code></p><ul><li>์ธ๋ถ์์ API๋ก ๋๊ธด ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ด๋
ธํ
์ด์
์
๋๋ค.</li></ul></li></ol><br/><hr><h1 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h1><blockquote><p><code>์คํ๋ง ๋ถํธ์ AWS๋ก ํผ์ ๊ตฌํํ๋ ์น ์๋น์ค</code> - ์ด๋์ฑ</p></blockquote>]]></content>
<categories>
<category> SpringBoot </category>
</categories>
<tags>
<tag> SpringBoot </tag>
<tag> JPA </tag>
<tag> Java </tag>
<tag> Annotation </tag>
</tags>
</entry>
<entry>
<title>[Docker] E03.docker-compose</title>
<link href="2021/04/11/docker-3/"/>
<url>2021/04/11/docker-3/</url>
<content type="html"><![CDATA[<h1 id="Docker-Compose"><a href="#Docker-Compose" class="headerlink" title="Docker Compose"></a>Docker Compose</h1><hr><br/><blockquote><p>์ด๊ธ์ ์ํค๋ถ์ค์ <code>์์ํ์ธ์! ๋์ปค/์ฟ ๋ฒ๋คํฐ์ค</code>๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ด ๊ธ์
๋๋ค.</p></blockquote><br/><h2 id="Why-docker-compse"><a href="#Why-docker-compse" class="headerlink" title="Why docker-compse?"></a>Why docker-compse?</h2><br/><p>๋์ปค๋ ์ผ๋ฐ์ ์ผ๋ก ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ์งํฅํ๊ธฐ ๋๋ฌธ์ ํ๊ฐ์ ์ปจํ
์ด๋์ ํ๊ฐ์ ์๋น์ค๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค. ํ์ง๋ง, ์ด๋ฅผ ํ
์คํธํ๋ ค๋ฉด ๊ฐ ์ปจํ
์ด๋๋ฅผ ํ๋์ฉ ์์ฑํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์น ์ ํ๋ฆฌ์ผ์ด์
์ ํ
์คํธํ๋ ค๋ฉด ์น ์๋ฒ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปจํ
์ด๋๋ฅผ ์์ฑํด์ผํฉ๋๋ค.</p><br/>ํ์ง๋ง, ๊ฐ ์ปจํ
์ด๋๊ฐ ์ ๋๋ก ๋์ํ๋์ง ํ์ธํ๋ ํ
์คํธ ๋จ๊ณ์์๋ ๋ฒ๊ฑฐ๋ก์ด ์์
์
๋๋ค. ๋ฐ๋ผ์, ๋งค๋ฒ run ๋ช
๋ น์ด์ ์ต์
์ ์ค์ ํด CLI๋ก ์ปจํ
์ด๋๋ฅผ ์์ฑํ๊ธฐ๋ณด๋ค๋ ์ฌ๋ฌ ๊ฐ์ ์ปจํ
์ด๋๋ฅผ ํ๋์ ์๋น์ค๋ก `COMPOSE`ํ์ฌ ๊ด๋ฆฌํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์
๋๋ค.<br/><p><strong>๋์ปค ์ปดํฌ์ฆ๋ ์ฌ๋ฌ ๊ฐ์ ์ปจํ
์ด๋์ ์ต์
๊ณผ ํ๊ฒฝ์ ์ ์ํ ํ์ผ์ ์ฝ์ด ์ปจํ
์ด๋๋ฅผ ์์ฐจ์ ์ผ๋ก ์์ฑํ๋ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค.</strong></p><br/><p>์ปจํ
์ด๋์ ์๊ฐ ๋ง์์ง๊ณ ์ ์ํด์ผํ ์ต์
์ด ๋ง์์ง๋ค๋ฉด ๋์ปค ์ปดํฌ์ฆ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.</p><br/><h2 id="Install-docker-compse"><a href="#Install-docker-compse" class="headerlink" title="Install docker-compse"></a>Install docker-compse</h2><br/><p>๋ฆฌ๋
์ค์์๋ ๋ค์ ๋ช
๋ น์ด๋ก ๋์ปค ์ปดํฌ์ฆ๋ฅผ ์ค์นํ ์ ์์ผ๋ฉฐ, ๋์ปค ์ปดํฌ์ฆ์ ๊นํ๋ธ ์ ์ฅ์์์ ์ง์ ๋ด๋ ค๋ฐ์ ์ค์นํ ์ ์์ต๋๋ค.</p><br/><figure class="highlight docker"><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">root@DESKTOP-<span class="number">03</span>N08DE:/home/csj7480<span class="comment"># curl -L https://github.com/docker/compose/releases/download/1.11.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose</span></span><br><span class="line"> % Total % Received % Xferd Average Speed Time Time Time Current</span><br><span class="line"> Dload Upload Total Spent Left Speed</span><br><span class="line"><span class="number">100</span> <span class="number">633</span> <span class="number">0</span> <span class="number">633</span> <span class="number">0</span> <span class="number">0</span> <span class="number">2082</span> <span class="number">0</span> --:--:-- --:--:-- --:--:-- <span class="number">2082</span></span><br><span class="line"><span class="number">100</span> <span class="number">8052</span>k <span class="number">100</span> <span class="number">8052</span>k <span class="number">0</span> <span class="number">0</span> <span class="number">6022</span>k <span class="number">0</span> <span class="number">0</span>:<span class="number">00</span>:<span class="number">01</span> <span class="number">0</span>:<span class="number">00</span>:<span class="number">01</span> --:--:-- <span class="number">14.8</span>M</span><br></pre></td></tr></table></figure><br/><p>์๋์ฐ์์๋ Docker for Windows๋ฅผ ์ค์นํ๋ฉด ๊ฐ์ด ์ค์น๋ฉ๋๋ค.</p><br/><h2 id="Use-docker-compose"><a href="#Use-docker-compose" class="headerlink" title="Use docker-compose"></a>Use docker-compose</h2><br/><h3 id="Basic-Usage-of-docker-compose"><a href="#Basic-Usage-of-docker-compose" class="headerlink" title="Basic Usage of docker-compose"></a>Basic Usage of docker-compose</h3><br/>๋์ปค ์ปดํฌ์ฆ๋ ์ปจํ
์ด๋์ ์ค์ ์ด ์ ์๋ YAML ํ์ผ์ ์ฝ์ด ๋์ปค ์์ง์ ํตํด ์ปจํ
์ด๋๋ฅผ ์์ฑํฉ๋๋ค. ๋ฐ๋ผ์, ๊ฐ์ฅ ๋จผ์ ์์ฑํด์ผํ ๊ฒ์ YAMLํ์ผ ์
๋๋ค.<br/><blockquote><p>YAML(Yet Another Markup Language)์ด๋?</p><ul><li>XML, JSON๊ณผ ๊ฐ์ ํ์ผํฌ๋งทํ์์ผ๋ก ์ฌ๋์ด ์ฝ์ ์ ์๋ ๋ฐ์ดํฐ ์ง๋ ฌํ ์ธ์ด์
๋๋ค. ๋ฐ์ ์์์์๋ ์ดํด๋ณผ ์ ์๋ฏ์ด ๊ธฐ์กด์ XML, JSON๋ณด๋ค ์ฝ๊ธฐ ์ฌ์ด ํ์์
๋๋ค.</li></ul></blockquote><br/><p><img src="https://media.vlpt.us/images/bloomspes/post/311cdc87-8c5e-467f-aa06-bb2e5174d4fe/image.png"></p><center>์ถ์ฒ : SpesDevTech.log</center><br/><p>์ฐ์ , ๋ค์๊ณผ ๊ฐ์ run ๋ช
๋ น์ด๋ฅผ docker-compose.yml ํ์ผ๋ก ๋ณํํด ์ปจํ
์ด๋๋ฅผ ์์ฑํ๊ณ ์คํํด๋ณด๊ฒ ์ต๋๋ค.</p><br/><ul><li>๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปจํ
์ด๋</li></ul><figure class="highlight plain"><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">csj7480@DESKTOP-03N08DE:~$ docker run -d --name mysql \</span><br><span class="line">> alicek106/composetest:mysql \</span><br><span class="line">> mysqld</span><br></pre></td></tr></table></figure><br/>- ์น ์๋ฒ ์ปจํ
์ด๋<figure class="highlight plain"><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">csj7480@DESKTOP-03N08DE:~$ docker run -d -p 80:80 \</span><br><span class="line">> --link mysql:db --name web \</span><br><span class="line">> alicek106/composetest:web \</span><br><span class="line">> apachectl -DFOREGROUND</span><br></pre></td></tr></table></figure><br/>- docker-compose.yml<figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">version :</span> <span class="string">'3.0'</span></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line"> <span class="attr">web:</span></span><br><span class="line"> <span class="attr">image:</span> <span class="string">alicek106/composetest:web</span></span><br><span class="line"> <span class="attr">ports:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">"80:80"</span></span><br><span class="line"> <span class="attr">links:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">mysql:db</span></span><br><span class="line"> <span class="attr">command:</span> <span class="string">apachectl</span> <span class="string">-DFOREGROUND</span></span><br><span class="line"> <span class="attr">mysql:</span></span><br><span class="line"> <span class="attr">image:</span> <span class="string">alicek106/composetest:mysql</span></span><br><span class="line"> <span class="attr">command:</span> <span class="string">mysqld</span></span><br></pre></td></tr></table></figure><br/><blockquote><p>์ด๋ ์ค์ํ ๊ฒ์ YAML ํ์ผ์์ ๋ค์ฌ์ฐ๊ธฐ๋ tab(4์นธ)์ด ์๋ **2๊ฐ์ ๊ณต๋ฐฑ(space)**๋ก ๊ตฌ๋ถํด์ผ ํฉ๋๋ค.</p></blockquote><br/>๋์ปค ์ปดํฌ์ฆ๋ ํ์ฌ ๋๋ ํฐ๋ฆฌ์ docker-compose.yml ํ์ผ์ ์ฝ์ด ๋ก์ปฌ์ ๋์ปค ์์ง์๊ฒ ์ปจํ
์ด๋ ์์ฑ์ ์์ฒญํฉ๋๋ค. <br/>`docker-compose up -d`๋ช
๋ น์ด๋ก ์ปจํ
์ด๋๋ฅผ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค.<br/><p><code>docker-compose.yml </code>ํ์ผ์ ๋ํ ์ค๋ช
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.</p><br/>1. `version` : YAML ํ์ผ ํฌ๋งท์ ๋ฒ์ ์ ์๋ฏธํฉ๋๋ค. ๋ฒ์ ์ `1`,`2`,`2.1`,`3.0` ๋ฑ์ด ์์ต๋๋ค. `๋์ปค ์ปดํฌ์ฆ 1.8`์ `๋ฒ์ 2`๋ฅผ `๋์ปค ์ปดํฌ์ฆ 1.9`๋ `๋ฒ์ 2.1`์, `๋์ปค ์ปดํฌ์ฆ 1.10`์ `๋ฒ์ 3.0`์ ์ฌ์ฉํฉ๋๋ค.2. `services`: ์์ฑ๋ ์ปจํ
์ด๋๋ฅผ ๋ฌถ์ด๋์ ๋จ์์
๋๋ค.3. `web`, `mysql` : ์์ฑ๋ ์๋น์ค์ ์ด๋ฆ์
๋๋ค. `docker run`์์ ์ฌ์ฉํ๋ ์ต์
๊ณผ ๋์ผํ๊ฒ `image`, `ports`, `links`, `command` ๋ฑ์ ์ ์ํ ์ ์์ต๋๋ค.<br/>`docker ps`๋ช
๋ น์ด๋ก ํ์ธํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.<br/><br/><img src = "/image/dockercompose.jpg"/><center>docker container</center><br/><img src = "/image/docker_desktop.jpg"/><center>Docker desktop </center><br/>๋์ปค ์ปดํฌ์ฆ๋ ์ปจํ
์ด๋๋ฅผ ํ๋ก์ ํธ ๋ฐ ์๋น์ค ๋จ์๋ก ๊ตฌ๋ถํ๋ฏ๋ก ์ปจํ
์ด๋์ ์ด๋ฆ์ ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ํ์์ผ๋ก ์ ํด์ง๋๋ค.<br/>`[ํ๋ก์ ํธ ์ด๋ฆ]_[์๋น์ค ์ด๋ฆ]_[์๋น์ค ๋ด์์ ์ปจํ
์ด๋์ ๋ฒํธ]`<br/>์ ์์ ์์ ์์ฑํ ํ๋ก์ ํธ์ ์ด๋ฆ์ csj7480,์๋น์ค ์ด๋ฆ์ mywql, web์
๋๋ค. ํ๋ก์ ํธ์ ์ด๋ฆ์ ๋ณ๋๋ก ์
๋ ฅํ์ง๋ ์์์ง๋ง `docker-compose.yml` ํ์ผ์ด ์์นํ ๋๋ ํฐ๋ฆฌ์ ์ด๋ฆ์ ํ๋ก์ ํธ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. ํ๋ก์ ํธ์ ์ด๋ฆ์ ๋๋ ํฐ๋ฆฌ์ ์ด๋ฆ์ ๋ฐ๋ผ ๋ค๋ฅผ ๊ฒ์
๋๋ค. <br/><p>ํ์ง๋ง, <code>-p</code>์ต์
์ ํตํด ํ๋ก์ ํธ์ ์ด๋ฆ์ ์ง์ ํ ์๋ ์์ต๋๋ค. ๋ํ, ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฌ ๋๋ ํ ๋ฆฌ์ <code>docker-compose.yml</code>ํ์ผ์ ์ฌ์ฉํ์ง๋ง <code>-f</code>์ต์
์ ํตํด ํ์ผ์ ์์น๋ ์ง์ ํ ์ ์์ต๋๋ค.</p><br/><p>๋ํ, <code>docker-compose scale</code>๋ช
๋ น์ด๋ก csj7480_mysql_2๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.</p><br/><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker-compose scale mysql=2</span><br></pre></td></tr></table></figure><br/><img src = "/image/dockercompose2.jpg"/><br/><p>๋จ, <code>docker-compose up -d mysql</code>๊ณผ ๊ฐ์ด <code>docker-compose.yml</code>ํ์ผ์ ๋ช
์๋ ํน์ ์๋น์ค์ ์ปจํ
์ด๋๋ง ์์ฑํ ์ ์์ต๋๋ค.</p><br/><p>๋ํ, ์์ฑ๋ ํ๋ก์ ํธ๋ <code>docker-compose down</code>๋ช
๋ น์ด๋ก ์ญ์ ํ ์๋ ์์ต๋๋ค. ํ๋ก์ ํธ๋ฅผ ์ญ์ ํ๋ฉด <strong>์๋น์ค์ ์ปจํ
์ด๋ ๋ํ ์ ๋ถ ์ ์ง๋ ๋ค ์ญ์ ๋ฉ๋๋ค.</strong></p><br/><hr><br/><h2 id="Application-of-docker-compose"><a href="#Application-of-docker-compose" class="headerlink" title="Application of docker-compose"></a>Application of docker-compose</h2><br/><p>๋์ปค ์ปดํฌ์ฆ๋ฅผ ์ค์ ๊ฐ๋ฐํ๊ฒฝ์์ ์ฌ์ฉํ๋ ค๋ฉด ๋ ๋ง์ ์ต์
๊ณผ ๋ช
๋ น์ด๊ฐ ํ์ํฉ๋๋ค. ์ด๋ฒ ์ฑํฐ์์๋ ์ด์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.</p><br/><p><strong>YAML ํ์ผ ์์ฑ</strong></p><br/>YAML ํ์ผ์ ํฌ๊ฒ ๋ฒ์ , **์๋น์ค**, ๋ณผ๋ฅจ, ๋คํธ์ํฌ ์ ์์ 4๊ฐ์ง ํญ๋ชฉ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์ด ์ค **์๋น์ค** ์ ์๋ฅผ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ฉฐ, ๋ณผ๋ฅจ๊ณผ ๋คํธ์ํฌ ์ ์๋ ์๋น์ค๋ก ์์ฑ๋ ์ปจํ
์ด๋์ ์ ํ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.<br/><hr><br/><ol><li><strong>version</strong> ์ ์</li></ol><p>๋์ปค ์ปดํฌ์ฆ ๋ฒ์ 1.10์์ ์ฌ์ฉํ ์ ์๋ <strong>๋ฒ์ 3</strong>๋ฅผ ๊ธฐ์ค์ผ๋ก ํฉ๋๋ค. ๋ฒ์ ํญ๋ชฉ์ ์ผ๋ฐ์ ์ผ๋ก YAMLํ์ผ์ ๋งจ ์๋ถ๋ถ์ ๋ช
์ํฉ๋๋ค.</p><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">version: <span class="string">'3.0'</span></span><br></pre></td></tr></table></figure><br/><hr><br/><ol start="2"><li><strong>services</strong> ์ ์</li></ol><p>์๋น์ค๋ ๋์ปค ์ปดํฌ์ฆ๋ก ์์ฑํ ์ปจํ
์ด๋ ์ต์
์ ์ ์ํฉ๋๋ค. ๊ฐ ์๋น์ค๋ ์ปจํ
์ด๋๋ก ๊ตฌํ๋ฉ๋๋ค. ์๋น์ค์ ์ด๋ฆ์ services์ ํ์ ํญ๋ชฉ์ผ๋ก ์ ์ํ๊ณ , ์ปจํ
์ด๋์ ์ต์
์ ์๋น์ค ์ด๋ฆ์ ํ์ ํญ๋ชฉ์ ์ ์ํฉ๋๋ค.</p><br/><figure class="highlight dockerfile"><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">services:</span><br><span class="line"> my_container_1:</span><br><span class="line"> image: -</span><br><span class="line"> my_container_2:</span><br><span class="line"> image: -</span><br></pre></td></tr></table></figure><br/>์๋น์ค ํญ๋ชฉ์ด ๊ฐ์ง ์ ์๋ ์ฃผ์ ์ปจํ
์ด๋ ์ต์
๋ง ์ค๋ช
ํ๊ฒ ์ต๋๋ค.<br/><ul><li><strong>image</strong>: ์ด๋ฏธ์ง์ ์ด๋ฆ์ ์ค์ ํฉ๋๋ค. ์ด๋ฏธ์ง ์ด๋ฆ ํฌ๋งท์ <code>docker run</code>๊ณผ ๊ฐ์ต๋๋ค.</li></ul><br/><figure class="highlight dockerfile"><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">services:</span><br><span class="line"> my_container_1:</span><br><span class="line"> image: csj7480/composetest:mysql</span><br></pre></td></tr></table></figure><br/><ul><li><strong>links</strong>: <code>docker run --link</code>์ ๊ฐ์ผ๋ฉฐ, ๋ค๋ฅธ ์๋น์ค์ ์๋น์ค๋ช
๋ง์ผ๋ก ์ ๊ทผํ ์ ์๋๋ก ์ค์ ํฉ๋๋ค. [SERVICE:ALIAS]ํ์์ผ๋ก ๋ณ์นญ์ ์ง์ ํ ์ ์์ต๋๋ค.</li></ul><br/><figure class="highlight dockerfile"><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">services:</span><br><span class="line"> web:</span><br><span class="line"> image: csj7480/composetest:web</span><br><span class="line"> links:</span><br><span class="line"> - db</span><br><span class="line"> - db:database</span><br><span class="line"> - redis</span><br></pre></td></tr></table></figure><br/><ul><li><strong>environment</strong>: <code>docker run --env, -e</code> ์ ๊ฐ์ต๋๋ค. ๋์
๋๋ฆฌ๋ ๋ฐฐ์ด ํํ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.</li></ul><br/><figure class="highlight dockerfile"><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">services:</span><br><span class="line"> web:</span><br><span class="line"> image: csj7480/composetest:web</span><br><span class="line"> links:</span><br><span class="line"> - db</span><br><span class="line"> - db:database</span><br><span class="line"> - redis</span><br><span class="line"> environment:</span><br><span class="line"> - MYSQL_ROOT_PASSWORD=<span class="number">0000</span></span><br><span class="line"> - MYSQL_DATABASE_NAME=mydb</span><br><span class="line"> ๋๋</span><br><span class="line"> MYSQL_ROOT_PASSWORD:<span class="number">0000</span></span><br><span class="line"> MYSQL_DATABASE_NAME:mydb</span><br></pre></td></tr></table></figure><br/><ul><li><strong>command</strong>: ์ปจํ
์ด๋๊ฐ ์คํ๋ ๋ ์ํํ ๋ช
๋ น์ด๋ฅผ ์ค์ ํ๋ฉฐ, <code>docker run</code>์ ๋ง์ง๋ง์ ๋ถ๋ ์ปค๋งจ๋์ ๊ฐ์ต๋๋ค. Dockerfile์ RUN๊ณผ ๊ฐ์ ๋ฐฐ์ด ํํ๋ก๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.</li></ul><br/><figure class="highlight dockerfile"><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">services:</span><br><span class="line"> web:</span><br><span class="line"> image: csj7480/composetest:web</span><br><span class="line"> links:</span><br><span class="line"> - db</span><br><span class="line"> - db:database</span><br><span class="line"> - redis</span><br><span class="line"> environment:</span><br><span class="line"> - MYSQL_ROOT_PASSWORD=<span class="number">0000</span></span><br><span class="line"> - MYSQL_DATABASE_NAME=mydb</span><br><span class="line"> command: apachectl -DFOREGROUND</span><br><span class="line"> ๋๋</span><br><span class="line"> command: [apachectl, -DFOREGROUND]</span><br></pre></td></tr></table></figure><br/><ul><li><strong>depends_on</strong> : ํน์ ์ปจํ
์ด๋์ ๋ํ ์์กด ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ฉฐ, <strong>์ด ํญ๋ชฉ์ ๋ช
์๋ ์ปจํ
์ด๋๊ฐ ๋จผ์ ์์ฑ๋๊ณ ์คํ๋ฉ๋๋ค.</strong> ๋ค์ ์์ ์์๋ web ์ปจํ
์ด๋๋ณด๋ค mysql ์ปจํ
์ด๋๊ฐ ๋จผ์ ์์ฑ๋ฉ๋๋ค. <strong>links</strong>์ ๋ฌ๋ฆฌ <strong>depends_on</strong>์ ์๋น์ค ์ด๋ฆ์ผ๋ก๋ง ์ ๊ทผํ ์ ์์ต๋๋ค.</li></ul><br/><figure class="highlight dockerfile"><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">services:</span><br><span class="line"> web:</span><br><span class="line"> image: csj7480/composetest:web</span><br><span class="line"> links:</span><br><span class="line"> - db</span><br><span class="line"> - db:database</span><br><span class="line"> - redis</span><br><span class="line"> environment:</span><br><span class="line"> - MYSQL_ROOT_PASSWORD=<span class="number">0000</span></span><br><span class="line"> - MYSQL_DATABASE_NAME=mydb</span><br><span class="line"> command: apachectl -DFOREGROUND</span><br><span class="line"> depends_on</span><br><span class="line"> - mysql</span><br><span class="line"> mysql:</span><br><span class="line"> image: csj7480/composetest:mysql</span><br></pre></td></tr></table></figure><br/><blockquote><p>์ด ๋ ์ฃผ์ํด์ผํ ์ ์ ์คํ ์์๋ง ์ ์ํ ๋ฟ ์ปจํ
์ด๋ ๋ด๋ถ์ ์ ํ๋ฆฌ์ผ์ด์
์ด ์ค๋น๋ ์ํ์ธ์ง์ ๋ํด์๋ ํ์ธํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์, ์ปจํ
์ด๋์ ์
ธ ์คํฌ๋ฆฝํธ๋ฅผ entrypoint๋ก ์ง์ ํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.</p><figure class="highlight dockerfile"><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">services:</span><br><span class="line">web:</span><br><span class="line"> ...</span><br><span class="line"> <span class="keyword">entrypoint</span><span class="bash">: ./sync_scripts.sh mysql:3306</span></span><br></pre></td></tr></table></figure><p>entrypoint์ ์ง์ ๋ <code>sync_scripts.sh</code>์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.</p><figure class="highlight shell"><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">until (์ํ๋ฅผ ํ์ธ); do</span><br><span class="line">echo "depend container is not available yet"</span><br><span class="line">sleep 1</span><br><span class="line">done</span><br><span class="line">echo "depends_on container is ready"</span><br></pre></td></tr></table></figure></blockquote><br/><ul><li><strong>ports</strong>: <code>docker run -p</code>์ ๊ฐ์ผ๋ฉฐ ์๋น์ค์ ์ปจํ
์ด๋๋ฅผ ๊ฐ๋ฐฉํ ํฌํธ๋ฅผ ์ค์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋จ์ผ ํธ์คํธ ํ๊ฒฝ์์ 80:80๊ณผ ๊ฐ์ด ํธ์คํธ์ ํน์ ํฌํธ๋ฅผ ์๋น์ค์ ์ปจํ
์ด๋์ ์ฐ๊ฒฐํ๋ฉด <code>docker-compose scale</code>๋ช
๋ น์ด๋ก ์๋น์ค์ ์ปจํ
์ด๋์ ์๋ฅผ ๋๋ฆด ์ ์์ต๋๋ค.</li></ul><br/><figure class="highlight dockerfile"><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">services:</span><br><span class="line"> web:</span><br><span class="line"> image: csj7480/composetest:web</span><br><span class="line"> ports:</span><br><span class="line"> - <span class="string">"8080"</span></span><br><span class="line"> - <span class="string">"8081-8085"</span></span><br><span class="line"> - ...</span><br><span class="line"> links:</span><br><span class="line"> - db</span><br><span class="line"> - db:database</span><br><span class="line"> - redis</span><br><span class="line"> environment:</span><br><span class="line"> - MYSQL_ROOT_PASSWORD=<span class="number">0000</span></span><br><span class="line"> - MYSQL_DATABASE_NAME=mydb</span><br><span class="line"> command: apachectl -DFOREGROUND</span><br><span class="line"> depends_on</span><br><span class="line"> - mysql</span><br><span class="line"> </span><br><span class="line"> mysql:</span><br><span class="line"> image: csj7480/composetest:mysql</span><br></pre></td></tr></table></figure><br/><ul><li><strong>build</strong>: build ํญ๋ชฉ์ ์ ์๋ ๋์ปคํ์ผ์์ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํด ์๋น์ค์ ์ปจํ
์ด๋๋ฅผ ์์ฑํ๋๋ก ์ค์ ํฉ๋๋ค. ๋ํ ๋์ปคํ์ผ์ ์ฌ์ฉ๋ ์ปจํ
์คํธ๋ ๋์ปคํ์ผ์ ์ด๋ฆ, ๋์ปคํ์ผ์์ ์ฌ์ฉ๋ ์ธ์ ๊ฐ์ ์ค์ ํ ์ ์์ต๋๋ค.</li></ul><br/><figure class="highlight dockerfile"><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></pre></td><td class="code"><pre><span class="line">services:</span><br><span class="line"> web:</span><br><span class="line"> build: ./composetest</span><br><span class="line"> context: ./composetest</span><br><span class="line"> dockerfile : myDockerFile</span><br><span class="line"> args:</span><br><span class="line"> HOST_NAME:web</span><br><span class="line"> HOST_CONFIG: self_config</span><br><span class="line"> image: csj7480/composetest:web</span><br></pre></td></tr></table></figure><br/><ul><li><strong>extends</strong>: ํ์ฌ ํน์ ๋ค๋ฅธ <code>YAML</code>ํ์ผ์์ ์๋น์ค ์์ฑ์ ์์๋ฐ๊ฒ ์ค์ ํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์์๋ฅผ ๋ค์ด๋ณด๊ฒ ์ต๋๋ค.</li></ul><br/><figure class="highlight dockerfile"><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></pre></td><td class="code"><pre><span class="line">version:<span class="string">'3.0'</span></span><br><span class="line"> services:</span><br><span class="line"> web:</span><br><span class="line"> extends:</span><br><span class="line"> file: extend_compose.yml</span><br><span class="line"> service: extend_web</span><br></pre></td></tr></table></figure><center>docker-compose.yml</center><br/><figure class="highlight plain"><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></pre></td><td class="code"><pre><span class="line">version:'3.0'</span><br><span class="line"> services:</span><br><span class="line"> extend_web:</span><br><span class="line"> image: ubuntu:14.04</span><br><span class="line"> ports:</span><br><span class="line"> - "80:80"</span><br></pre></td></tr></table></figure><center>extend-compose.yml</center><br/><figure class="highlight plain"><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></pre></td><td class="code"><pre><span class="line">version:'3.0'</span><br><span class="line"> services:</span><br><span class="line"> web:</span><br><span class="line"> extends:</span><br><span class="line"> service: extend-web</span><br><span class="line"> extend_web:</span><br><span class="line"> image: ubuntu:14.04</span><br><span class="line"> ports:</span><br><span class="line"> - "80:80"</span><br></pre></td></tr></table></figure><center>์์๋ฐ์ ๊ฒฐ๊ณผ๋ฌผ</center><br/><blockquote><p>๋จ, <code>depends_on</code>, <code>links</code>,<code>volumes_from</code>๊ณผ ๊ฐ์ ํญ๋ชฉ๋ค์ ์ปจํ
์ด๋ ์ฌ์ด์ ์์กด์ฑ์ ๋ดํฌํ๋ฏ๋ก <code>extends</code>๋ก ์์๋ฐ์ ์ ์์ต๋๋ค.</p></blockquote><br/><hr><br/><ol start="3"><li><strong>network</strong> ์ ์</li></ol><br/><ul><li><strong>driver</strong>: ๊ธฐ๋ณธ์ ์ผ๋ก <strong>๋ธ๋ฆฌ์ง</strong>ํ์
์ ๋คํธ์ํฌ๋ฅผ ์์ฑํ๋๋ฐ ๋ค๋ฅธ ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์ค์ ํ ์ ์์ต๋๋ค. ๋๋ผ์ด๋ฒ์ ํ์ํ ์ต์
์ ํ์ ํญ๋ชฉ์ธ <code>driver_ops</code>๋ก ์ ๋ฌํฉ๋๋ค.</li></ul><br/><ul><li><strong>ipam</strong>: IPAM(IP Address Manager)๋ฅผ ์ํด ์ฌ์ฉํ ์ ์๋ ์ต์
์ผ๋ก subnet, ip ๋ฒ์ ๋ฑ์ ์ค์ ํ ์ ์์ต๋๋ค. ์ด ๋ <code>driver</code>ํญ๋ชฉ์๋ IPAM์ ์ง์ํ๋ ๋๋ผ์ด๋ฒ์ ์ด๋ฆ์ ์
๋ ฅํฉ๋๋ค.</li></ul><br/><ul><li><strong>external</strong>: <code>YAML</code>ํ์ผ์ ํตํด ํ๋ก์ ํธ๋ฅผ ์์ฑํ ๋๋ง๋ค ๋คํธ์ํฌ๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ ๊ธฐ์กด์ ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ๋๋ก ์ค์ ํฉ๋๋ค. ์ฌ์ฉํ๋ ค๋ ์ธ๋ถ ๋คํธ์ํฌ์ ์ด๋ฆ์ ํ์ ํญ๋ชฉ์ผ๋ก ์
๋ ฅํ ๋ค <code>external</code>์ ๊ฐ์ <code>true</code>๋ก ์ค์ ํฉ๋๋ค. ์ด ๋, <code>external</code>์ ๋ค๋ฅธ ๋คํธ์ํฌ์ ์ต์
์ ์ฌ์ฉํ๋ฏ๋ก <code>driver</code>,<code>driver_ops</code>,<code>ipams</code> ์ต์
๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค.</li></ul><br/><hr><br/><ol start="4"><li><strong>volume</strong> ์ ์</li></ol><br/><ul><li><strong>driver</strong>: ๋ณผ๋ฅจ์ ์์ฑํ ๋ ์ฌ์ฉ๋ ๋๋ผ์ด๋ฒ๋ฅผ ์ค์ ํฉ๋๋ค. default๊ฐ์ผ๋ก๋ local๋ก ์ค์ ๋๋ฉฐ ์ฌ์ฉํ๋ ๋๋ผ์ด๋ฒ์ ๋ฐ๋ผ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค. ์ถ๊ฐ ์ต์
์ ํ์ ํญ๋ชฉ์ธ <code>driver_opts</code>๋ฅผ ํตํด ์ธ์๋ฅผ ๋๊ฒจ์ค๋๋ค.</li></ul><br/><figure class="highlight plain"><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></pre></td><td class="code"><pre><span class="line">version:'3.0'</span><br><span class="line">services:</span><br><span class="line">...</span><br><span class="line"></span><br><span class="line">volumes:</span><br><span class="line"> driver: flocker</span><br><span class="line"> driver_opts:</span><br><span class="line"> opt: "1"</span><br><span class="line"> opt2: 2</span><br></pre></td></tr></table></figure><br/><ul><li><strong>external</strong>: <code>volume</code>,<code>volumes-from</code> ์ต์
๋ฑ์ ์ฌ์ฉํ๋ฉด ํ๋ก์ ํธ๋ง๋ค ๋ณผ๋ฅจ์ ์์ฑํฉ๋๋ค. ์ด ๋ <code>external</code>์ต์
์ ์ค์ ํ๋ฉด ๋ณผ๋ฅจ์ ํ๋ก์ ํธ๋ฅผ ์์ฑํ ๋๋ง๋ค ๋งค๋ฒ ์์ฑํ์ง ์๊ณ ๊ธฐ์กด ๋ณผ๋ฅจ์ ์ฌ์ฉํ๋๋ก ์ค์ ํฉ๋๋ค.</li></ul><br/><figure class="highlight plain"><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></pre></td><td class="code"><pre><span class="line">version:'3.0'</span><br><span class="line">services:</span><br><span class="line"> web:</span><br><span class="line"> image: csj7480/composetest:web</span><br><span class="line"> volumes:</span><br><span class="line"> - myvolume:/var/www/html</span><br><span class="line">volumes:</span><br><span class="line"> myvolume:</span><br><span class="line"> external: true</span><br></pre></td></tr></table></figure><br/>์์ ๊ฐ์ ์์ ๋ `myvolume`์ด๋ผ๋ ์ด๋ฆ์ ์ธ๋ถ ๋ณผ๋ฅจ์ web ์๋น์ค์ ์ปจํ
์ด๋์ ๋ง์ดํธํฉ๋๋ค.<br/><hr><br/><br/><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><br/><blockquote><p> <code>์์ํ์ธ์! ๋์ปค/์ฟ ๋ฒ๋คํฐ์ค: ์น์ ํ ์ค๋ช
์ผ๋ก ์ฝ๊ฒ ์ดํดํ๋ ์ปจํ
์ด๋ ๊ด๋ฆฌ</code> - ์ฉ์ฐฌํธ</p></blockquote>]]></content>
<categories>
<category> Docker </category>
</categories>
<tags>
<tag> docker </tag>
<tag> image </tag>
<tag> docker-compose </tag>
</tags>
</entry>
<entry>
<title>[Docker] E02.Dockerfile</title>
<link href="2021/04/09/docker-2/"/>
<url>2021/04/09/docker-2/</url>
<content type="html"><![CDATA[<br/><blockquote><p>์ด๊ธ์ ์ํค๋ถ์ค์ <code>์์ํ์ธ์! ๋์ปค/์ฟ ๋ฒ๋คํฐ์ค</code>๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ด ๊ธ์
๋๋ค.</p></blockquote><br/><h1 id="Dockerfile"><a href="#Dockerfile" class="headerlink" title="Dockerfile"></a>Dockerfile</h1><hr><br/><img src = "/image/dockerfile.png" alignt = "center"/><br/><h2 id="Make-an-Image"><a href="#Make-an-Image" class="headerlink" title="Make an Image"></a>Make an Image</h2><br/><p>์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋ฐํ ์ ํ๋ฆฌ์ผ์ด์
์ ์ปจํ
์ด๋ํํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ์์๋ก ์์
์ ์ํํ ๊ฒ์
๋๋ค.</p><ol><li>์๋ฌด๊ฒ๋ ์กด์ฌํ์ง ์๋ ์ด๋ฏธ์ง(์ฐ๋ถํฌ, CentOS ๋ฑ)๋ก ์ปจํ
์ด๋๋ฅผ ์์ฑ</li><li>์ ํ๋ฆฌ์ผ์ด์
์ ์ํ ํ๊ฒฝ์ ์ค์นํ๊ณ ์์ค์ฝ๋ ๋ฑ์ ๋ณต์ฌํด ์ ๋์ํ๋์ง ํ์ธ</li><li>์ปจํ
์ด๋๋ฅผ ์ด๋ฏธ์ง๋ก ์ปค๋ฐ</li></ol><p>์์ ๊ฐ์ ์์๋ก ์ ํ๋ฆฌ์ผ์ด์
์ด ๋์ํ๋ ํ๊ฒฝ์ ๊ตฌ์ฑํ๋ ค๋ฉด ์์์
์ผ๋ก ํจํค์ง๋ฅผ ์ค์นํ๊ณ ์์ค์ฝ๋๋ฅผ ๋ณต์ฌํ๊ณ ๊ตฌ๋ํด๋ณด๊ณ .. ์ด๋์ธ์์ ๋ค ํ๊ฒ ๋๋ ๊ฒ์
๋๋ค.</p><p>๋น์ทํ ์์๋ก Makefile์ ๋ค ์ ์์ต๋๋ค.</p><p>๊ฐ๊ฐ์ ์ปดํ์ผํ ํ์ผ๋ค์ ์ปดํ์ผํ ๋ช
๋ น์ด๋ค์ ์ง์ ํด๋๊ณ ์์กด์ฑ์ ์ค์ ํ๊ณ make๋ช
๋ น์ ์คํํ๋ฉด ๊ฐ๊ฐ์ ๋ชจ๋ ์์ค์ฝ๋๋ค์ ์ปดํ์ผํ ํ์๊ฐ ์ฌ๋ผ์ง๊ฒ ๋๋ ๊ฒ๊ณผ ๊ฐ์ ์ด์น์ธ ๊ฒ์
๋๋ค.</p><p>๋์ปค๋ ์ด๋ฌํ ๋น๋ ๋ช
๋ น์ด๋ฅผ ์ ๊ณตํฉ๋๋ค. ์์ฑ๋ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ปจํ
์ด๋์ ์ค์นํด์ผ ํ๋ ํจํค์ง, ์ถ๊ฐํด์ผ ํ๋ ์์ค์ฝ๋ ์คํํด์ผ ํ๋ ๋ช
๋ น์ด์ ์
ธ ์คํฌ๋ฆฝํธ ๋ฑ์ ํ๋์ ํ์ผ <code>Dockerfile</code>์ ์ ์ฅํฉ๋๋ค.</p><br/><hr><h2 id="Make-an-Simple-Web-Server-Image"><a href="#Make-an-Simple-Web-Server-Image" class="headerlink" title="Make an Simple Web Server Image"></a>Make an Simple Web Server Image</h2><br/><p>Dockerfile์ ์ฌ์ฉํ๊ธฐ ์ํ ๊ฐ๋จํ ์๋๋ฆฌ์ค๋ก ์น ์๋ฒ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ ์๋ฅผ ์ค๋ช
ํด๋ณด๊ฒ ์ต๋๋ค.</p><figure class="highlight docker"><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"><span class="comment"># mkdir dockerfile && cd dockerfile</span></span><br><span class="line"><span class="comment"># echo test >> test.html</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># ls</span></span><br><span class="line">test.html</span><br></pre></td></tr></table></figure><p>์ด์ Dockerfile์ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๋ช
๋ น์ด๋ก ์ด๋ฏธ์ง์ ์ํ์น ์น ์๋ฒ๋ฅผ ์ค์นํ ๋ค, ๋ก์ปฌ์ ์๋ test.html ํ์ผ์ ์น ์๋ฒ๋ก ์ ๊ทผํ ์ ์๋ ์ปจํ
์ด๋์ ๋๋ ํฐ๋ฆฌ์ธ /var/www/html์ ๋ณต์ฌํฉ๋๋ค.</p><figure class="highlight plain"><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></pre></td><td class="code"><pre><span class="line"># vim Dockerfile</span><br><span class="line"></span><br><span class="line">FROM ubuntu:14.04</span><br><span class="line">MAINTAINER {Username}</span><br><span class="line">LABEL "puropose"="practice"</span><br><span class="line">RUN apt-get update</span><br><span class="line">RUN apt-get install apache2 -y</span><br><span class="line">ADD test.html /var/www/html</span><br><span class="line">WORKDIR /var/www/html</span><br><span class="line">RUN ["/bin/bash", "-c", "echo hello << test2.html"]</span><br><span class="line">EXPOSE 80</span><br><span class="line">CMD apachectl -DFOREGROUND</span><br></pre></td></tr></table></figure><p>Dockerfile์ ๋ช
๋ น์ด๋ ์์์ ์๋๋ก line by line์ผ๋ก ์คํ๋ฉ๋๋ค.</p><br/><hr><h2 id="Command-of-Dockerfile"><a href="#Command-of-Dockerfile" class="headerlink" title="Command of Dockerfile"></a>Command of Dockerfile</h2><br/><blockquote><p>FROM : ์์ฑํ ์ด๋ฏธ์ง์ ๋ฒ ์ด์ค ์ด๋ฏธ์ง๋ฅผ ์๋ฏธํฉ๋๋ค. Dockerfile์ ์์ฑํ ๋ <strong>๋ฐ๋์ ํ ๋ฒ ์ด์</strong> ์
๋ ฅํด์ผ ํ๋ฉฐ, ์ด๋ฏธ์ง ์ด๋ฆ์ ํฌ๋งท์ docker run ๋ช
๋ น์ด์์ ์ด๋ฏธ์ง ์ด๋ฆ์ ์ฌ์ฉํ์ ๋์ ๊ฐ์ต๋๋ค. ๋์ปค์ ์ฌ์ฉํ ์ด๋ฏธ์ง๊ฐ ์๋ค๋ฉด ์๋์ผ๋ก pull ํฉ๋๋ค.</p></blockquote><blockquote><p>MAINTAINER : ์ด๋ฏธ์ง๋ฅผ ์์ฑํ ๊ฐ๋ฐ์์ ์ ๋ณด๋ฅผ ๋ํ๋
๋๋ค. ์ผ๋ฐ์ ์ผ๋ก๋ ์์ฑํ ์ฌ๋๊ณผ ์ฐ๋ฝํ ์ ์๋ ์ด๋ฉ์ผ ๋์ ์
๋ ฅํฉ๋๋ค. ๋จ, ๋์ปค <strong>1.13.0 ๋ฒ์ ์ดํ๋ก ์ฌ์ฉํ์ง ์์ต๋๋ค.</strong> ๋์ ์๋์ ๊ฐ์ LABEL๋ก ๋์ฒด ๊ฐ๋ฅํฉ๋๋ค.</p></blockquote><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">LABEL maintainer "{username} <[email protected]></span><br></pre></td></tr></table></figure><blockquote><p>LABEL : ์ด๋ฏธ์ง์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์ด ๋ โkey : valueโํํ๋ก ์ ์ฅ๋๋ฉฐ, ์ฌ๋ฌ๊ฐ์ ๋ฉํ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ์ ์์ต๋๋ค. ์ถ๊ฐ๋ ๋ฉํ๋ฐ์ดํฐ๋ docker inspect ๋ช
๋ น์ด๋ก ์ด๋ฏธ์ง์ ์ ๋ณด๋ฅผ ๊ตฌํด์ ํ์ธํ ์ ์์ต๋๋ค.</p></blockquote><blockquote><p>RUN : ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์ปจํ
์ด๋ ๋ด๋ถ์์ ๋ช
๋ น์ด๋ฅผ ์คํํฉ๋๋ค. ์ ์์ ์์๋ apt-get update์ apt-get install apache2 ๋ช
๋ น์ด๋ฅผ ์คํํ์ฌ ์ํ์น ์น ์๋ฒ๋ฅผ ์ค์นํ ์ด๋ฏธ์ง๊ฐ ์์ฑ๋ฉ๋๋ค. ๋จ, install์ ์งํํ๋ค๋ณด๋ฉด [Y/N]๋ฅผ ๋ฌป๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ ์ด๋๋ฅผ ์ํด -y ์ต์
์ ํตํด Yes๋ก ์
๋ ฅ๋๋๋ก ์ค์ ์ ํด์ผํฉ๋๋ค. ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ ๋ ๋ณ๋์ ์
๋ ฅ์ ๋ฐ์์ผํ๋ ๊ฒ์ด ์๋ค๋ฉด ์ด๋ฅผ ์ค๋ฅ๋ก ๊ฐ์ฃผํ๊ณ ๋น๋๋ฅผ ์ข
๋ฃํ๊ฒ ๋ฉ๋๋ค.</p></blockquote><blockquote><p>ADD : ํ์ผ์ ์ด๋ฏธ์ง์ ์ถ๊ฐํฉ๋๋ค. ์ถ๊ฐํ๋ ํ์ผ์ Dockerfile์ด ์์นํ ๋๋ ํฐ๋ฆฌ์ธ Context์์ ๊ฐ์ ธ์ต๋๋ค. ์ ์์ ์์๋ ํ์ฌ ๋๋ ํ ๋ฆฌ์ <code>test.html</code>ํ์ผ์ <code>/var/www/html</code> ๋๋ ํฐ๋ฆฌ์ ์ถ๊ฐํฉ๋๋ค.</p></blockquote><blockquote><p>WORKDIR : working directory ์ฆ, ๋ช
๋ น์ด๋ฅผ ์คํํ ๋๋ ํฐ๋ฆฌ๋ฅผ ์๋ฏธํฉ๋๋ค. bash shell์์ cd๋ฅผ ์
๋ ฅํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ํฉ๋๋ค. ์ ์์ ์์๋ <code>/var/www/html</code> ๋๋ ํฐ๋ฆฌ๋ก ์ด๋ํ ํ <code>/bin/bash</code> shell์ ํตํด echo hello << test2.html์ ์
๋ ฅํ ๊ฒ์
๋๋ค. ๋ํ. WORKDIR๋ฅผ ์ฌ๋ฌ๋ฒ ์
๋ ฅํ๋ฉด cd๋ฅผ ์ฌ๋ฌ๋ฒ ์
๋ ฅํ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.</p></blockquote><blockquote><p>EXPOSE : ๋
ธ์ถํ ํฌํธ๋ฅผ ์ค์ ํ๋ ๋ช
๋ น์ด์
๋๋ค. ํ์ง๋ง, ๋ฐ๋์ ์ด ํฌํธ๊ฐ ํธ์คํธ์ ํฌํธ์ ๋ฐ์ธ๋ฉ๋๋ ๊ฒ์ ์๋๊ณ ๋จ์ง ์ปจํ
์ด๋์ 80๋ฒ ํฌํธ๋ฅผ ์ฌ์ฉํ๋ค๋ ์๋ฏธ์
๋๋ค. run docker -p option๊ณผ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๋ช
๋ น์ด์ ์ฌ์ฉ๋ฒ์ ๋ค์์ ๋ค์ ์ค๋ช
ํ๊ฒ ์ต๋๋ค.</p></blockquote><blockquote><p>CMD : ์ปจํ
์ด๋๊ฐ ์์๋ ๋๋ง๋ค ์คํํ ์ปค๋งจ๋๋ฅผ ์ค์ ํ๋ฉฐ, Dockerfile์์ <strong>ํ๋ฒ๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.</strong> ์ ์์ ์์๋ ์ปจํ
์ด๋๋ฅผ ์์ฑํ๊ณ ๋ฐ๋ก <code>apachectl -DFOREGROUND</code>๋ผ๋ ์ปค๋งจ๋๋ฅผ ํตํด ์ปจํ
์ด๋๊ฐ ์์๋ ๋ ๋ฐ๋ก ์ํ์น ์น ์๋ฒ๊ฐ ์คํ๋๋ ๊ฒ์
๋๋ค. ์ด๋ <code>docker run -d</code>option๊ณผ ๊ฐ์ต๋๋ค. ๋ง์ฝ <code>docker run -it</code> option์ ์ฌ์ฉํ๋ค๋ฉด ํฌ๊ทธ๋ผ์ด๋์์ ๋์ํ๋ ๊ฒ๋ง ํ์ธํ ์ ์๊ฒ๋ฉ๋๋ค. run ๋ช
๋ น์ด์ ์ปค๋งจ๋์ ๊ฐ์ ์ญํ ์
๋๋ค. ๋ง์ฝ <code>docker run</code> ์ปค๋งจ๋ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๋ฉด Dockerfile์์ ์ฌ์ฉํ CMD์ ๋ช
๋ น์ด๋ <code>run</code>์ ์ปค๋งจ๋ ๋ช
๋ น์ด๋ก ๋ฎ์ด์ฐ์
๋๋ค.</p></blockquote><br/><hr><h2 id="Another-Command"><a href="#Another-Command" class="headerlink" title="Another Command"></a>Another Command</h2><blockquote><p>ENV: Dockerfile์์ ์ฌ์ฉ๋ ํ๊ฒฝ๋ณ์๋ฅผ ์ง์ ํฉ๋๋ค. ์ค์ ํ ํ๊ฒฝ๋ณ์๋ <code>${ENV_NAME}</code>๋๋ <code>$ENV_NAME</code>์ ํํ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ํ๊ฒฝ๋ณ์๋ <strong>Dockerfile๋ฟ ์๋๋ผ ์ด๋ฏธ์ง์๋ ์ ์ฅ๋ฉ๋๋ค.</strong> ๋ค์ Dockerfile์์๋ test๋ผ๋ ํ๊ฒฝ๋ณ์์ /home์ด๋ผ๋ ๊ฐ์ ์ค์ ํ์ต๋๋ค.</p></blockquote><figure class="highlight plain"><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></pre></td><td class="code"><pre><span class="line">vi Dockerfile</span><br><span class="line"></span><br><span class="line">FROM ubuntu:14.04</span><br><span class="line">ENV test /home</span><br><span class="line">WORKDIR $test</span><br><span class="line">RUN touch $test/mytouchfile</span><br></pre></td></tr></table></figure><p>๋ง์ฝ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ ๋ -e ์ต์
์ ํตํด ๊ฐ์ ์ด๋ฆ์ ํ๊ฒฝ๋ณ์๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๊ธฐ์กด์ ๊ฐ์ ๋ฎ์ด ์ฐ์ฌ์ง๋๋ค.</p><figure class="highlight plain"><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">docker run -it --name env_test_override \</span><br><span class="line">-e test=myvalue \</span><br><span class="line">myenv:0.0 /bin/bash</span><br></pre></td></tr></table></figure><blockquote><p>VOLUME : ๋น๋๋ ์ด๋ฏธ์ง๋ก ์ปจํ
์ด๋๋ฅผ ์์ฑํ์ ๋ ํธ์คํธ์ ๊ณต์ ํ ์ปจํ
์ด๋์ ๋ด๋ถ์ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ค์ ํฉ๋๋ค. ์ฆ, ์ปจํ
์ด๋์ ์ฐ๋ํ ํธ์คํธ์ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ค์ ํ๋ ๊ฒ์
๋๋ค. VOLUME [โ/home/dirโ, โhome/dir2โ]์ฒ๋ผ JSON ๋ฐฐ์ด์ ํ์์ผ๋ก ์ฌ๋ฌ๊ฐ ์ฌ์ฉํ๊ฑฐ๋ <code>VOLUME /home/dir /home/dir2</code>๋ก๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.</p></blockquote><blockquote><p>ARG : build ๋ช
๋ น์ด๋ฅผ ์คํํ ๋ ์ถ๊ฐ๋ก ์
๋ ฅ๋ฐ์ Dockerfile ๋ด์์ ์ฌ์ฉ๋ ๋ณ์์ ๊ฐ์ ์ค์ ํฉ๋๋ค. ์ฆ, <code>docker build --build-arg my_arg =/home -t myarg:0.0 ./</code>๊ณผ ๊ฐ์ด ์
๋ ฅํด์ผ๋ง ์ค๋ฅ๊ฐ ๋์ง ์์ต๋๋ค. </p></blockquote><figure class="highlight plain"><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">vi Dockerfile</span><br><span class="line">FROM ubuntu:14.04</span><br><span class="line">ARG my_arg</span><br><span class="line">RUN touch ${my_arg}/mytouch</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker build --build-arg my_arg=/home -t myarg:0.0 ./</span><br></pre></td></tr></table></figure><blockquote><p>USER : USER๋ก ์ปจํ
์ด๋ ๋ด์์ ์ฌ์ฉ๋ ์ฌ์ฉ์ ๊ณ์ ์ ์ด๋ฆ์ ์ค์ ํ๋ฉด ๊ทธ ์๋์ ๋ฉธ์์ด๋ ํด๋น ์ฌ์ฉ์์ ๊ถํ์ผ๋ก ์คํ๋ฉ๋๋ค. root๊ถํ์ด ํ์๊ฐ ์๋ค๋ฉด USER๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.</p></blockquote><blockquote><p>ONBUILD : ๋น๋๋ ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๋ค๋ฅธ ์ด๋ฏธ์ง๊ฐ Dockerfile๋ก ์์ฑ๋ ๋ ์คํํ ๋ช
๋ น์ด๋ฅผ ์ถ๊ฐํฉ๋๋ค. ONBUILD, FROM, MAINTAINER๋ฅผ ์ ์ธํ RUN, ADD ๋ฑ, ์ด๋ฏธ์ง๊ฐ ๋น๋๋ ๋ ์ํ๋ผ์ผ ํ๋ ๊ฐ์ข
Dockerfile์ ๋ช
๋ น์ด๋ฅผ ๋์ค์ ๋น๋๋ ์ด๋ฏธ์ง๋ฅผ ์ํด ๋ฏธ๋ฆฌ ์ ์ฅํด ๋๋ ๊ฒ์
๋๋ค. ๋จ, ์์๋ฐ์ ์์์ด๋ฏธ์ง๋ ONBUILD ์์ฑ์ ์์๋์ง ์์ต๋๋ค.<br>ํ๊ฐ์ง ์์๋ก ๋ฉ์ด๋ธ์ด๋ฏธ์งํ์ผ์ ๋ค์๊ณผ ๊ฐ์ ONBUILD ์ต์
์ ๊ฐ์ง๊ณ ์๋๋ฐ ์ด ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๋ ํ๋ก์ ํธ ํด๋์ Dockerfile์ ์์นํ๊ณ , ์๋์ Dockerfile๋ก๋ถํฐ ๋น๋๋ ์ด๋ฏธ์ง๋ฅผ FROM ํญ๋ชฉ์ ์
๋ ฅํจ์ผ๋ก์จ ๋ฉ์ด๋ธ์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.</p></blockquote><br/><figure class="highlight plain"><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">FROM maven:3-jdk-8-alpine</span><br><span class="line">RUN mkdir 0p /usr/src/app</span><br><span class="line">WORKDIR /usr/src/app</span><br><span class="line">ONBUILD ADD . /usr/src/app</span><br><span class="line">ONBUILD RUN mvn install</span><br></pre></td></tr></table></figure><br/><blockquote><p>STOPSIGNAL : ์ปจํ
์ด๋๊ฐ ์ ์ง๋ ๋ ์ฌ์ฉ๋ ์์คํ
์ฝ์ ์ข
๋ฅ๋ฅผ ์ง์ ํฉ๋๋ค. default๋ก๋ SIGTERM์
๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.</p></blockquote><br/><figure class="highlight plain"><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">FROM ubuntu:14.04</span><br><span class="line">STOPSIGNAL SIGKILL</span><br></pre></td></tr></table></figure><br/><blockquote><p>HEALTHCHECK : ์ด๋ฏธ์ง๋ก๋ถํฐ ์์ฑ๋ ์ปจํ
์ด๋์์ ๋์ํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ํ๋ฅผ ์ฒดํฌํ๋๋ก ์ค์ ํฉ๋๋ค. ์ฆ, ์ปจํ
์ด๋ ๋ด๋ถ์์ ๋์ ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์
์ ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋์ง๋ ์์์ผ๋ ๋์ํ๊ณ ์์ง ์์ ์ํ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์ต์
์
๋๋ค.</p></blockquote><br/><blockquote><p>SHELL : Dockerfile์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ๋ ์์ <code>/bin/sh -c</code> ์
๋๋ค. ์๋์ฐ์์๋ <code>cmd /S /C</code>์
๋๋ค. ๋ฐ๋ผ์ RUN echo โhello, worldโ๋ผ๋ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋ฆฌ๋
์ค์์๋ <code>/bin/sh -c echo "hello,world"</code>๋ก ์ฌ์ฉํ๊ณ ์๋์ฐ์์๋ <code>cmd /S /C echo "hello,world"</code>๋ผ๊ณ ์ฌ์ฉํฉ๋๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ์์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.</p></blockquote><br/><figure class="highlight plain"><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">FROM node</span><br><span class="line">RUN echo hello,node!</span><br><span class="line">SHELL ["/usr/local/bin/node"]</span><br><span class="line">RUN -v</span><br></pre></td></tr></table></figure><br/><blockquote><p>COPY : ๋ก์ปฌ ๋๋ ํฐ๋ฆฌ์์ ์ฝ์ด๋ค์ธ ์ปจํ
์คํธ๋ก๋ถํฐ ์ด๋ฏธ์ง์ ํ์ผ์ ๋ณต์ฌํ๋ ์ญํ ์ ํฉ๋๋ค. ํ์์ ADD์ ๊ฐ์ต๋๋ค. ์ฐจ์ด์ ์ ADD๋ ์ธ๋ถ URL ๋ฐ tar ํ์ผ์์๋ ํ์ผ์ ์ถ๊ฐํ ์ ์์ง๋ง COPY๋ ๋ก์ปฌ์ ํ์ผ๋ง ์ถ๊ฐํ ์ ์์ต๋๋ค. ๋จ, ADD๋ ๊ทธ๋ค์ง ๊ถ์ฅ๋์ง ์์ต๋๋ค. ๊ทธ ์ด์ ๋ ์ ํํ ์ด๋คํ์ผ์ด ์ถ๊ฐ๋ ์ง ์ ์ ์๋ค๋ ๊ฒ์
๋๋ค.</p></blockquote><br/><blockquote><p>ENTRYPOINT : CMD์ ๋์ผํ๊ฒ ์ปจํ
์ด๋๊ฐ ์์๋ ๋ ์คํํ ๋ช
๋ น์ด๋ฅผ ์ค์ ํ๋ ์ต์
์
๋๋ค. ์ฐจ์ด์ ์ CMD๋ฅผ ์ธ์๋ก ๋ฐ์ ์ฌ์ฉํ ์ ์๋ ์คํฌ๋ฆฝํธ์ ์ญํ ์ ํ ์ ์๋ค๋ ์ ์์ ๋ค๋ฆ
๋๋ค. ์ฆ, entrypoint๊ฐ ์๋ค๋ฉด CMD๊ฐ ๊ทธ๋ฅ ์คํ๋์ง๋ง <code>entrypoint๊ฐ ์๋ค๋ฉด CMD๋ ๊ทธ์ entrypoint์ ์ธ์๋ก ์ฐ์ฌ์ง๊ฒ ๋๋ ๊ฒ์
๋๋ค.</code> ๋จ, ์คํํ ์คํฌ๋ฆฝํธ ํ์ผ์ <strong>์ปจํ
์ด๋ ๋ด๋ถ์</strong> ์กด์ฌํด์ผ ํฉ๋๋ค.</p></blockquote><br/><p><strong>์ต์ข
์ ์ผ๋ก ์ ๋ฆฌํ์๋ฉด</strong> ๋ค์๊ณผ ๊ฐ์ ์์๋ก ์ด๋ฏธ์ง๊ฐ ์๋ํฉ๋๋ค.</p><ol><li>์ด๋ค ์ค์ ๋ฐ ์คํ์ด ํ์ํ์ง์ ๋ํด ์คํฌ๋ฆฝํธ๋ก ์ ๋ฆฌ</li><li>ADD ๋๋ COPY๋ก ์คํฌ๋ฆฝํธ๋ฅผ ์ด๋ฏธ์ง๋ก ๋ณต์ฌ</li><li>ENTRYPOINT๋ฅผ ์ด ์คํฌ๋ฆฝํธ๋ก ์ค์ </li><li>์ด๋ฏธ์ง๋ฅผ ๋น๋ํด ์ฌ์ฉ</li><li>์คํฌ๋ฆฝํธ์์ ํ์ํ ์ธ์๋ docker run ๋ช
๋ น์ด์์ cmd๋ก entrypoint์ ์คํฌ๋ฆฝํธ์ ์ ๋ฌ</li></ol><br/><hr><h2 id="Build"><a href="#Build" class="headerlink" title="Build"></a>Build</h2><br/><p>๋ฐ์ ๋ช
๋ น์ด๋ก Dockerfile์ ๋น๋ํด๋ณด๊ฒ ์ต๋๋ค.</p><figure class="highlight docker"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># docker build -t mybuild:0.0 ./</span></span><br></pre></td></tr></table></figure><blockquote><p>-t : ์์ฑ๋ ์ด๋ฏธ์ง์ ์ด๋ฆ์ ์ค์ ํ๋ ์ต์
์
๋๋ค. ์ด๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ โdocker run -it ubuntu:14.04โ๋ฅผ ํ์ ๊ฒฝ์ฐ 16์ง์ ํํ์ ์ปจํ
์ด๋๊ฐ ์์ฑ๋ ๊ฒ์ฒ๋ผ ์ด๋ฏธ์ง๋ ๋๊ฐ์ด 16์ง์ ํํ๋ก ์ ์ฅ๋ฉ๋๋ค.</p></blockquote><p>build ๋ช
๋ น์ด ๋์๋ Dockerfile์ด ์ ์ฅ๋ ๊ฒฝ๋ก๋ฅผ ์
๋ ฅํฉ๋๋ค. ์ฆ, <code>docker build -t {name} {location of Dockerfile}</code>์ด ๋ฉ๋๋ค. ์ธ๋ถ URL๋ก๋ถํฐ Dockerfile์ ๋ด์ฉ์ ๊ฐ์ ธ์ ๋น๋ํ ์๋ ์์ต๋๋ค.</p><p>๊ทธ ๊ฒฐ๊ณผ๋ก ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ด ์ถ๋ ฅ๋ฉ๋๋ค.</p><figure class="highlight plain"><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></pre></td><td class="code"><pre><span class="line">[+] Building 84.4s (11/11) FINISHED</span><br><span class="line"> => [internal] load build definition from Dockerfile 0.1s</span><br><span class="line"> => => transferring dockerfile: 296B 0.0s</span><br><span class="line"> => [internal] load .dockerignore 0.1s</span><br><span class="line"> => => transferring context: 2B 0.0s</span><br><span class="line"> => [internal] load metadata for docker.io/library/ubuntu:14.04 0.0s</span><br><span class="line"> => [internal] load build context 0.2s</span><br><span class="line"> => => transferring context: 41B 0.0s</span><br><span class="line"> => [1/6] FROM docker.io/library/ubuntu:14.04 0.2s</span><br><span class="line"> => [2/6] RUN apt-get update 63.7s</span><br><span class="line"> => [3/6] RUN apt-get install apache2 -y 19.4s</span><br><span class="line"> => [4/6] ADD test.html /var/www/html 0.1s</span><br><span class="line"> => [5/6] WORKDIR /var/www/html 0.1s</span><br><span class="line"> => [6/6] RUN ["/bin/bash","-c","echo hello << test2.html"] 0.4s</span><br><span class="line"> => exporting to image 0.3s</span><br><span class="line"> => => exporting layers 0.3s</span><br><span class="line"> => => writing image sha256:4b663386bafe7165ba13a67767c2a3bc94e211f8c180da22ab96b98cb6537ae6 0.0s</span><br><span class="line"> => => naming to docker.io/library/mybuild:0.0 </span><br></pre></td></tr></table></figure><p>์ด์ ๋ค์ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํด ์์ฑ๋ ์ด๋ฏธ์ง๋ก ์ปจํ
์ด๋๋ฅผ ์คํํด๋ณด๊ฒ ์ต๋๋ค.</p><figure class="highlight docker"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># docker run -d -P --name myserver mybuild:0.0</span></span><br></pre></td></tr></table></figure><p>-P ์ต์
์ dockerfile์์ ์ค์ ํ EXPOSE์ ๋ชจ๋ ํฌํธ๋ฅผ ํธ์คํธ์ ์ฐ๊ฒฐํ๋๋ก ์ค์ ํ๋ ๊ฒ์
๋๋ค. ์ฆ, โ์ปจํ
์ด๋์ 80๋ฒ ํฌํธ๋ฅผ ์ฌ์ฉํ๋คโ๋ฅผ ์๋ฏธํฉ๋๋ค. ๊ฐ๋ฐ์๋ EXPOSE๋ฅผ ํตํด ์ค์ ๋ก ์ฌ์ฉ๋ ๋ ์ด๋ค ํฌํธ๊ฐ ์ฌ์ฉ๋ผ์ผ ํ๋์ง ๋ช
์ํ ์ ์์ผ๋ฉฐ, ์ฌ์ฉ์๋ ์ด๋ค ํฌํธ๊ฐ ์ฌ์ฉ๋๋์ง ์ ์ ์๊ฒ ๋ฉ๋๋ค.</p><p><code>docker port</code>๋ช
๋ น์ด๋ฅผ ํตํด ๋ค์๊ณผ ๊ฐ์ด ์ปจํ
์ด๋์ ํธ์คํธ๊ฐ ์ฐ๊ฒฐ๋ ํฌํธ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.</p><figure class="highlight plain"><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">csj7480@DESKTOP-03N08DE:~/dockerfile$ docker port myserver</span><br><span class="line">80/tcp -> 0.0.0.0:49153</span><br></pre></td></tr></table></figure><br/><hr><h2 id="Precautions-for-Building-with-Dockerfile"><a href="#Precautions-for-Building-with-Dockerfile" class="headerlink" title="Precautions for Building with Dockerfile"></a>Precautions for Building with Dockerfile</h2><br/><p><strong>์ข์ ์ต๊ด(practice)</strong></p><p>: Dockerfile์ ์ฌ์ฉํ ๋ ์ข์ ์ต๊ด์ด ์์ต๋๋ค. ์๋ฅผ๋ค๋ฉด ํ๋์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ ๋ <code>"\"</code>๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋
์ฑ์ ๋์ผ ์ ์๋๋ก ์์ฑํ๊ฑฐ๋ <code>.dockerignore</code>ํ์ผ์ ์ฌ์ฉํ์ฌ ๋ถํ์ํ ํ์ผ์ ๋น๋ ์ปจํ
์คํธ์ ์ ์ฉ์ํค์ง ์์์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฏธ์ง ๊ตฌ์กฐ์ ๋ํด์๋ ์์์ผํ ๊ฒ์ด ์์ต๋๋ค.</p><figure class="highlight plain"><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></pre></td><td class="code"><pre><span class="line">vi Dockerfile</span><br><span class="line">FROM ubuntu:14.04</span><br><span class="line">RUN ubuntu:14.04</span><br><span class="line">RUN mkdir /test</span><br><span class="line">RUN fallocate -l 100m /test/dummy</span><br><span class="line">RUN rm /test/dummy</span><br></pre></td></tr></table></figure><p><code>fallocate</code>์ ๊ฐ์์ผ๋ก ํ์ผ์ ๋ง๋ค์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ ๋ช
๋ น์ด ์ธ๋ฐ ์์ ์์์์๋ 100MB๋ฅผ ํ ๋นํ ํ /test/์ dummyํ์ผ์ ๋ง๋ ํ RUN rm /test/dummy๋ฅผ ํตํด ํ์ผ์ ๋ค์ ์ ๊ฑฐํ์ต๋๋ค.</p><p>๊ทธ๋ ๋ค๋ฉด ์์์ ์ผ๋ก ubuntu ๊นกํตํ์ผ์์ dummy๋ฅผ ์ถ๊ฐํ๋ค ์ญ์ ํ์ผ๋ฏ๋ก ์ด๋ฏธ์งํ์ผ์ ๊นกํต์์ 100MB๋ง ์ถ๊ฐ ๋์ด์ผ ํ๊ฒ ์ง๋ง ์ฌ์ค์ ๊ทธ๋ ์ง ์์ต๋๋ค. ์ปจํ
์ด๋๋ฅผ ์ด๋ฏธ์ง๋ก ์์ฑํ ๋ ๋ ์ด์ด๋ฅผ ์๋ ๊ฐ๋
์ผ๋ก ์์ฑํ๋ฏ๋ก ๋จ์ง ํ์ผ์ ์ถ๊ฐํ๋ ๋ ์ด์ด, ์ญ์ ํ๋ ๋ ์ด์ด๋ง ์ถ๊ฐ๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ์ฉ๋์ด ์ฆ๊ฐํ์ฌ ๋ถํ์ํ ํฌ๊ธฐ์ ์ด๋ฏธ์ง๊ฐ ์๊ธฐ๋ ๊ฒ์
๋๋ค.</p><p>์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด fallocate๊ณผ rm์ <code>&&</code>์ฐ์ฐ์๋ฅผ ํตํด ํ๋๋ก ๋ฌถ๋๋ค๋ฉด ์ด๋ฌํ ์ค๋ฅ๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค.</p><br/><hr><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><br/><blockquote><p><code>์์ํ์ธ์! ๋์ปค/์ฟ ๋ฒ๋คํฐ์ค</code> - ์ฉ์ฐฌํธ</p></blockquote>]]></content>
<categories>
<category> Docker </category>
</categories>
<tags>
<tag> docker </tag>
<tag> image </tag>
<tag> Dockerfile </tag>
</tags>
</entry>
<entry>
<title>[Docker] E01.Image</title>
<link href="2021/04/05/docker-1/"/>
<url>2021/04/05/docker-1/</url>
<content type="html"><![CDATA[<h1 id="Docker"><a href="#Docker" class="headerlink" title="Docker"></a>Docker</h1><blockquote><p>์ด ๊ธ์ ์ํค๋ถ์ค์ <code>์์ํ์ธ์! ๋์ปค/์ฟ ๋ฒ๋คํฐ์ค</code>๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ด ๊ธ์
๋๋ค.</p></blockquote><br/><h2 id="Create-Docker-Image"><a href="#Create-Docker-Image" class="headerlink" title="Create Docker Image"></a>Create Docker Image</h2><br/><p>๊ธฐ๋ณธ์ ์ผ๋ก ์ปจํ
์ด๋๋ฅผ ์์ฑํ ๋ ๋ค์๊ณผ ๊ฐ์ด ์
๋ ฅ์ ํฉ๋๋ค.</p><br/><figure class="highlight docker"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker <span class="keyword">run</span><span class="bash"> -it --name my_docker ubuntu:14.04</span></span><br></pre></td></tr></table></figure><br/><p>์ด๋ [OPTIONS] ๋ค์ ๋ถ์ด๋ [IMAGE]๋ช
์ด ubuntu, [TAG]๋ช
์ด 14.04์ธ ๊ฒ์ธ๋ฐ ์ด๋ฌํ <code>image</code>๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.</p><p>๊ฐ์ฅ ๋จผ์ , ๋ค์ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํด ์ด๋ฏธ์ง๋ก ๋ง๋ค ์ปจํ
์ด๋๋ฅผ ์์ฑํฉ๋๋ค. ์ปจํ
์ด๋ ๋ด๋ถ์ first๋ผ๋ ์ด๋ฆ์ ํ์ผ์ ํ๋ ์์ฑํ์ฌ ๊ธฐ์กด์ ์ด๋ฏธ์ง๋ก๋ถํฐ ๋ณ๊ฒฝ์ฌํญ์ ํ๊ฐ์ง ๋ง๋ญ๋๋ค.</p><br/><figure class="highlight docker"><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">docker <span class="keyword">run</span><span class="bash"> -it --name commit_test ubuntu:14.04</span></span><br><span class="line">root@<span class="number">1</span>d152 :/<span class="comment"># echo test_first! >> first</span></span><br></pre></td></tr></table></figure><br/><p>first๋ผ๋ ํ์ผ์ ๋ง๋ค์ด ๊ธฐ์กด์ image์ธ ubuntu:14.04๋ก๋ถํฐ ๋ณ๊ฒฝ์ฌํญ์ ๋ง๋ ํ ์ปจํ
์ด๋์์ ํธ์คํธ๋ก ๋น ์ ธ๋์ docker commit ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๋ก ๋ง๋ค ๊ฒ์
๋๋ค.</p><br/><figure class="highlight docker"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]</span><br></pre></td></tr></table></figure><br/><p>๋ค์ ๋ช
๋ น์ ์๊น ๋ง๋ค์๋ commit_test๋ผ๋ ์ปจํ
์ด๋๋ฅผ commit_test:first๋ผ๋ ์ด๋ฆ์ ์ด๋ฏธ์ง๋ก ์์ฑํ๋ ๊ฒ์
๋๋ค.</p><br/><figure class="highlight docker"><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">docker commit \ // option</span><br><span class="line">-a <span class="string">"YOUR_ID"</span> -m <span class="string">"Message"</span> \// -a๋ author๋ฅผ ์๋ฏธ</span><br><span class="line">commit_test \// ์ ์ฅํ image</span><br><span class="line">commit_test:first // ์ ์ฅํ image ์ด๋ฆ</span><br></pre></td></tr></table></figure><br/><p>์์ ๊ฒฐ๊ณผ๋ก ์๋์ ๊ฐ์ ์ด๋ฏธ์ง๊ฐ ์์ฑ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.</p><br/><figure class="highlight docker"><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">csj7480@DESKTOP-<span class="number">03</span>N08DE:~$ docker images</span><br><span class="line">REPOSITORY TAG IMAGE ID CREATED SIZE</span><br><span class="line">commit_test first c7d7b705e5a5 <span class="number">13</span> seconds ago <span class="number">197</span>MB</span><br></pre></td></tr></table></figure><br/><h2 id="Extract-Image"><a href="#Extract-Image" class="headerlink" title="Extract Image"></a>Extract Image</h2><br/><p>๋์ปค ์ด๋ฏธ์ง๋ฅผ ๋ณ๋๋ก ์ ์ฅํ๊ฑฐ๋ ์ฎ๊ธฐ๋ ๋ฑ ํ์์ ๋ฐ๋ผ ์ด๋ฏธ์ง๋ฅผ ๋จ์ผ ๋ฐ์ด๋๋ฆฌ ํ์ผ๋ก ์ ์ฅํด์ผ ํ ๋๊ฐ ์์ต๋๋ค. docker save ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์ปจํ
์ด๋์ ์ปค๋งจ๋, ์ด๋ฏธ์ง ์ด๋ฆ๊ณผ ํ๊ทธ ๋ฑ ์ด๋ฏธ์ง์ ๋ชจ๋ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํฌํจํด ํ๋์ ํ์ผ๋ก ์ถ์ถํ ์ ์์ต๋๋ค. -o ์ต์
์๋ ์ถ์ถ๋ ํ์ผ๋ช
์ ์
๋ ฅํฉ๋๋ค.</p><br/><blockquote><p>๋ฉํ๋ฐ์ดํฐ(Metadata)๋ ๋ฐ์ดํฐ์ ๋ํ ๋ฐ์ดํฐ์ด๋ค.<br>Karen Coyle์ ์ํ๋ฉด โ์ด๋ค ๋ชฉ์ ์ ๊ฐ์ง๊ณ ๋ง๋ค์ด์ง ๋ฐ์ดํฐ(Constructed data with a purpose)โ ๋ผ๊ณ ์ ์ํ๋ค.<br>์ถ์ฒ : <a href="https://wa-yeong.tistory.com/14">https://wa-yeong.tistory.com/14</a></p></blockquote><br/><figure class="highlight docker"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker save -o ubuntu_14_04.tar ubuntu:<span class="number">14.04</span></span><br></pre></td></tr></table></figure><br/><p>์ด ๋ ์ถ์ถ๋ ์ด๋ฏธ์ง๋ ์ด๋ฏธ์ง์ ๋ชจ๋ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๊ธฐ ๋๋ฌธ์ load ๋ช
๋ น์ด๋ก ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ๋ฉด ์ด์ ์ ์ด๋ฏธ์ง์ <strong>์์ ํ ๋์ผํ</strong> ์ด๋ฏธ์ง๊ฐ ๋์ปค์์ง์ ์์ฑ๋ฉ๋๋ค.<br><br/></p><figure class="highlight docker"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker load-i ubuntu_14_04.tar</span><br></pre></td></tr></table></figure><br/><p>์ ์ฌํ๊ฒ ์ฌ์ฉํ ์ ์๋ ๋ช
๋ น์ด๋ก <code>export</code>,<code>import</code>๊ฐ ์๋๋ฐ, detach๋ชจ๋๋ ๋ณ๊ฒฝ๋ ์ฌํญ, ์ปจํ
์ด๋ command์ ๊ฐ์ ์ปจํ
์ด๋์ ์ค์ ๋ฑ์ ์ด๋ฏธ์ง์ ์ ์ฅํ์ง ์์ ํจ์จ์ ์ด์ง ๋ชปํฉ๋๋ค,</p><p>์ด๋ ๋ ์ด์ด ๊ตฌ์กฐ์ ํ์ผ์ด ์๋ ๋จ์ผ ํ์ผ์ด๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ๋ฒ์ ์ ์ด๋ฏธ์ง๋ฅผ ์ถ์ถํ๋ฉด ์ด๋ฏธ์ง ์ฉ๋์ ๊ฐ๊ธฐ ์ฐจ์งํ๊ฒ ๋ฉ๋๋ค.</p><p>์๋ฅป ๋ค๋ฉด, ubuntu:14.04์ด๋ฏธ์ง์ commit_test:first๋ผ๋ ๋ ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ <code>export</code>ํ ๊ฒฝ์ฐ ๊ฐ๊ฐ 197MB์ ํ์ผ์ด ์์ฑ๋์ด ์ด 394MB์ ์ฉ๋์ ์ฐจ์งํ๊ฒ ๋ฉ๋๋ค.</p><br/><h2 id="Docker-private-Registry"><a href="#Docker-private-Registry" class="headerlink" title="Docker private Registry"></a>Docker private Registry</h2><br/><p>์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ ์ปจํ
์ด๋์ ์ฌ๋ณธ์ด๋ผ๊ณ ํ ์ ์๋๋ฐ, ์ด ์ด๋ฏธ์ง๋ฅผ ๋ณต์ฌํด์ ๋ค๋ฅธ ์์คํ
์ผ๋ก ์ด๋์ ์ํฌ ์ ์์ต๋๋ค. ์์ฑ๋ ์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ ์ผ์ข
์ ํ
ํ๋ฆฟ์ด ๋๋ฉฐ, ์๋ก์ด ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค๊ฑฐ๋ ํ๋ ๋ฐ ํ์ฅํ ๋ ์ด ํ
ํ๋ฆฟ์ ์ฌ์ฉํฉ๋๋ค.</p><p>๊ทธ๋ฌํ ์ด๋ฏธ์ง๋ฅผ ์์
ํ๋ ค๋ฉด ์์ฑ๋ ์ด๋ฏธ์ง๋ฅผ ์ ์ฅ, ์
๋ก๋, ๋ค์ด๋ก๋์ ํ๋ก์ธ์ค๋ฅผ ๊ฑฐ์ณ์ผ ํ๋๋ฐ ์ด๋ฌํ ํ๋ก์ธ์ค๋ฅผ ํตํด ๊ณต์ ํ ์ ์๋ ์ฅ์๋ฅผ ๋ ์ง์คํธ๋ฆฌ๋ผ๊ณ ํฉ๋๋ค.</p><p>๋ ์ง์คํธ๋ฆฌ์ ์ข
๋ฅ๋ publick๊ณผ private์ด ์กด์ฌํ๋๋ฐ ์ฐ์ private registry์ ๋ํด ๋จผ์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.</p><p>๋์ปค ์ฌ์ค ๋ ์ง์คํธ๋ฆฌ(Docker Private Registry)๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ธ ์๋ฒ์ ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํ ์ ์๋ ์ ์ฅ์๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ด ๋ ์ง์คํธ๋ฆฌ๋ ์ปจํ
์ด๋๋ก์ ๊ตฌํ๋๋ฏ๋ก ์ด์ ํด๋นํ๋ ๋์ปค ์ด๋ฏธ์ง๊ฐ ์กด์ฌํฉ๋๋ค. ์ด ์ด๋ฏธ์ง๋ ๋์ปค์์ ๊ณต์์ ์ผ๋ก ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์๋์ run ๋ช
๋ น์ด๋ก ๊ฐ๋จํ ์ฌ์ฉํ ์ ์์ต๋๋ค.</p><br/><figure class="highlight docker"><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">docker <span class="keyword">run</span><span class="bash"> -d --name myregistry \</span></span><br><span class="line"><span class="bash">-p 5000:5000 \</span></span><br><span class="line"><span class="bash">--restart=always \</span></span><br><span class="line"><span class="bash">registry:2.6</span></span><br></pre></td></tr></table></figure><br/><p>์ด ๋, ๋ ์ง์คํธ๋ฆฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก 5000๋ฒ ํฌํธ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก -p ์ต์
์ผ๋ก ํธ์คํธ์ 5000๋ฒ ํฌํธ๋ฅผ ์ปจํ
์ด๋์ 5000๋ฒ ํฌํธ์ ์ฐ๊ฒฐํ๋ ์ต์
์ ์ง์ ํด์ค๋๋ค.</p><p>์ด ํฌํธ๋ก <code>RESTful API</code>๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.</p><br/><p><code>curl localhost:5000/v2/</code>๋ช
๋ น์ด๋ฅผ ํตํด ๋ ์ง์คํธ๋ฆฌ ์ปจํ
์ด๋๊ฐ ์ ์์ ์ผ๋ก ์๋ํ๋์ง ํ์ธํด๋ด
์๋ค.</p><p><code>curl</code>๋ช
๋ น์ด๋ HTTP์์ฒญ์ ๋ณด๋ด๋ ๋๊ตฌ ์ค ํ๋์
๋๋ค.</p><br/><figure class="highlight docker"><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">csj7480@DESKTOP-<span class="number">03</span>N08DE:~$ curl localhost:<span class="number">5000</span>/v2/</span><br><span class="line">{}csj7480@DESKTOP-<span class="number">03</span>N08DE:~$</span><br></pre></td></tr></table></figure><br/><p>์์ ๊ฐ์ด {}๊ฐ ์ถ๋ ฅ๋จ์ ํ์ธํ ์ ์์ต๋๋ค.</p><p>์ด์ Push๋ฅผ ํด๋ณด๊ฒ ์ต๋๋ค. ๋์ปค ํ๋ธ์ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ ๋ ์ผ๋ ์ด๋ฏธ์ง๋ฅผ ๋ ์ง์คํธ๋ฆฌ ์ปจํ
์ด๋์ ์ฌ๋ ค๋ด
์๋ค. ๋ค์์ ๋ช
๋ น์ ์
๋ ฅํ์ฌ ์ด๋ฏธ์ง์ ์ด๋ฆ์ ์ถ๊ฐํฉ๋๋ค.</p><figure class="highlight docker"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker tag my-image-name:<span class="number">0.0</span> ${DOCKER_HOST_IP}:<span class="number">5000</span>/my-image-name:<span class="number">0.0</span></span><br></pre></td></tr></table></figure><p>์ด๋, ${DOCKER_HOST_IP}์๋ ๋ ์ง์คํธ๋ฆฌ ์ปจํ
์ด๋๋ฅผ ์์ฑํ ๋์ปค ํธ์คํธ IP๋ฅผ ์
๋ ฅํฉ๋๋ค.</p><figure class="highlight docker"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker push localhost:<span class="number">5000</span>/my-image-name:<span class="number">0.0</span></span><br></pre></td></tr></table></figure><br/><figure class="highlight docker"><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">csj7480@DESKTOP-<span class="number">03</span>N08DE:~$ docker push localhost:<span class="number">5000</span>/my-image-name:<span class="number">0.0</span></span><br><span class="line">The push refers to repository [localhost:<span class="number">5000</span>/my-image-name]</span><br><span class="line">adcd7cbb0060: Pushed</span><br><span class="line"><span class="number">83109</span>fa660b2: Pushed</span><br><span class="line"><span class="number">30</span>d3c4334a23: Pushed</span><br><span class="line">f2fa9f4cf8fd: Pushed</span><br><span class="line"><span class="number">0.0</span>: digest: sha256:<span class="number">9</span>d5b17cc8225ebfc551944991eaf21e16cc6e6b84628df904277d751909c6e19 size: <span class="number">1152</span></span><br></pre></td></tr></table></figure><br/><p align = "center"><img src = "/image/docker_1.jpg"/></p><hr><br/><p>์์ ๊ฐ์ด push๊ฐ ์๋์ด์๋ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ, registry๋ฅผ ์๊ฒฉ์ ๊ตฌ์ถํ๊ธฐ ์ํด์๋ ๋ช๊ฐ์ง ์ค์ ์ด ํ์ํฉ๋๋ค.</p><p>๊ธฐ๋ณธ์ ์ผ๋ก ๋์ปค ๋ฐ๋ชฌ์ HTTPS๋ฅผ ์ฌ์ฉํ์ง ์์ ๋ ์ง์คํธ๋ฆฌ ์ปจํ
์ด๋์ ์ ๊ทผํ์ง ๋ชปํ๋๋ก ์ค์ ๋์ด์์ต๋๋ค. ๋ฐ๋ผ์, HTTPS๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ธ์ฆ์๋ฅผ ์ ์ฉํด ๋ณ๋๋ก ์ค์ ํด์ผ ํ๋๋ฐ, ์ด ๋ด์ฉ์ ๋์ค์ ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.</p><p>์ง๊ธ์ ํ
์คํธ๋ฅผ ์ํด HTTPS๋ฅผ ์ฌ์ฉํ์ง ์์๋ ์ด๋ฏธ์ง๋ฅผ push, pullํ ์ ์๋๋ก ํด๋ด
์๋ค.</p><p>๋์ปค๋ฐ๋ชฌ์ JSON ํํ๋ก ๋ ํ์ผ์ ์ฝ์ด ์คํ ์ต์
์ผ๋ก ์ฌ์ฉํฉ๋๋ค. ๋์ปค ๋ฐ๋ชฌ์ ๊ธฐ๋ณธ์ ์ผ๋ก <code>etc/docker/daemon.json</code>ํ์ผ์ ์ฝ์ง๋ง ์ด ํ์ผ์ด ์์ด๋ ๋์ปค ๋ฐ๋ชฌ์ด ์คํ๋๋ฏ๋ก ๊ผญ ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ผํ๋ ๊ฒ์ ์๋๋๋ค. ํ์ง๋ง ํ์ฌ ์ฌ์ฉ ์ค์ธ ์ด์์ฒด์ ์์ ๋์ปค ์๋น์ค ์ค์ ํ์ผ์ ์์น๋ฅผ ๋ชจ๋ฅด๊ฑฐ๋ ๋์ปค ์คํ ์ต์
์ด ๋ง์์ ๊ด๋ฆฌ๊ฐ ์ด๋ ต๋ค๋ฉด <code>daemon.json</code>ํ์ผ์ ์์ฑํ๋ ๊ฒ์ด ํธ๋ฆฌํฉ๋๋ค.</p><p>์์๋งํ ์ค์ ์ ์ํด ์ด ํ์ผ์ ๋ค์ด๊ฐ์ ๋ค์์ ์ถ๊ฐํฉ๋๋ค.</p><p>OS๊ฐ Linux๊ฐ ์๋ Windows์ผ ๊ฒฝ์ฐ <code>User/.docker/daemon.json</code>์ ๊ฒฝ๋ก๋ก ํ์ธํ ์ ์์ต๋๋ค.</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">"insecure-registries": ["localhost:5000"]</span><br></pre></td></tr></table></figure><p>๋์ปค ๋ฐ๋ชฌ์ <code>--insecure-registry</code>์ต์
๋ง ์ถ๊ฐํ๋ฉด ๋ณ๋์ ์ธ์ฆ ์ ์ฐจ ์์ด ๋ ์ง์คํธ๋ฆฌ ์ปจํ
์ด๋์์ ์ด๋ฏธ์ง๋ฅผ push,pullํ ์ ์์ต๋๋ค.</p>]]></content>
<categories>
<category> Docker </category>
</categories>
<tags>
<tag> docker </tag>
<tag> image </tag>
</tags>
</entry>
<entry>
<title>[WearMask] E00.Capstone Project</title>
<link href="2021/03/15/wearmask-00/"/>
<url>2021/03/15/wearmask-00/</url>
<content type="html"><![CDATA[<h1 id="Capstone-Software-project"><a href="#Capstone-Software-project" class="headerlink" title="Capstone Software project"></a>Capstone Software project</h1><p><br></br></p><h2 id="์์ํ๊ธฐ์-์์"><a href="#์์ํ๊ธฐ์-์์" class="headerlink" title="์์ํ๊ธฐ์ ์์"></a>์์ํ๊ธฐ์ ์์</h2><hr><p> ์บก์คํค์ํํธ์จ์ดํ๋ก์ ํธ๋ฅผ ์๊ฐํ๋ฉฐ ์กธ์
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ ค๊ณ ํ๋ค.</p><p>์บก์คํคํ๋ก์ ํธ๋ ํ๊ต์์ ํ๋ก์ ํธ ์ฃผ์ ๋ฅผ ์ ํด์ฃผ๊ณ ๋ง์์ ๋๋ ์ฃผ์ ๋ฅผ ์ ํ์ฌ ๊ต์๋๊ณผ ์ปจํํ์ฌ ์ ํ๋ ๋ฐฉ์์ผ๋ก ์งํ๋๋ค.</p><p>๋๋ ๊ทธ ์ค <strong>๋ง์คํฌ ์ฐฉ์ฉ ๊ฐ์ง ์๋ ์์คํ
</strong>์ ์ ํํ๊ฒ ๋์๋ค.</p><p>์ ํํ๊ฒ๋ ๊ฐ์ฅ ํฐ ์ด์ ๋ ๋ฐฉํ ์ค <strong>AAIS</strong>์์ ๋
ธ์๊ท ๊ต์๋์ ์ง๋ํ์ ์ด๋ฏธ์ง๋ถ๋ฅ ๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ๊ณต๋ถํ์๊ธฐ ๋๋ฌธ์ด๋ค.</p><p>๋ํ, ๋ฉ์ค ์ธํด์ํ๋ฉด์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ง๊ณ ํ์ฉํ ์ ์๋ ๋ถ์ผ๊ฐ ๋ฌด๊ถ๋ฌด์งํ๋ค ์๊ฐํ๊ธฐ ๋๋ฌธ์ด๋ค.</p><center><img src = "/image/tsne.jpg"/></center><center>[๊ทธ๋ฆผ 1] PCA(์), t-SNE(์๋)๋ฅผ ํตํด ์ด๋ฏธ์ง ๋ถํฌ ๋น๊ต</center><p><br></br></p><p> ์์ ์ด๋ฏธ์ง๋ Nature์ง์ ์ค๋ฆฐ [Efficient neural network compression via transfer learning for machine<br>vision inspection]๋
ผ๋ฌธ์์ ๋ฐ์ทํ ์ด๋ฏธ์ง์ด๋ค.</p><p>๋น๋ก, ๋ถ๋ฅํ๋ ค๋ ์ด๋ฏธ์ง๊ฐ ์ ์ดํ์ต(Transfer Learning)ํ ๋ชจ๋ธ์ ํ์ต๋ฐ์ดํฐ์ธ /imageNet๊ณผ ๋ถํฌ๊ฐ ๋ค๋ฅธ๋ฐ๋ ๋ถ๊ตฌํ๊ณ <strong>์ ์ดํ์ต์ ํด์ผ๋ง ํ๋ค๋ ๊ฒ์ด๋ค.</strong></p><p>์ด๋ฏธ์ง ์ธ์์ ์กฐ๊ธ ๋ ๋ฐฐ์ฐ๊ณ ์ ์ฉ์์ผ๋ณด๊ณ ์ถ๋ค๋ ์๊ฐ์ ์์๊ฐ์ ์ฃผ์ ๋ฅผ ์ ํํ์๋ค.</p><p><br></br></p><h2 id="๋ง์คํฌ-์ฐฉ์ฉ-๊ฐ์ง"><a href="#๋ง์คํฌ-์ฐฉ์ฉ-๊ฐ์ง" class="headerlink" title="๋ง์คํฌ ์ฐฉ์ฉ ๊ฐ์ง?"></a>๋ง์คํฌ ์ฐฉ์ฉ ๊ฐ์ง?</h2><hr><p> ๊ตฌ๊ธ๋ง์ ํด๋ณด๋ฉด ๋ง์คํฌ ์ฐฉ์ฉ์ ๊ตฌ๋ถํ๋ ๋ชจ๋ธ์ด ๊ต์ฅํ ๋ง์ด ๋์์๋ค.</p><p>์ค์ ๋ก ๊ทธ๋ฅผ ์ ์ฉ์์ผ๋ณด๋ฉด ํ์ต์ด ์๋์ด ์๋ ๊ฒ์ฒ๋ผ๋ณด์ธ๋ค.</p><p>์ฐ์ , webcam์ ์ด๊ณ cvlib์์ ์ ๊ณตํ๋ <code>detect_face</code>๋ฅผ ์ฌ์ฉํ๋ฉด ์ผ๊ตด์ ๊ฒ์ถํด์ฃผ๊ณ ๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ํตํด ๋ง์คํฌ๋ฅผ ์ผ๋์ง ์์ผ๋์ง ํ๋จํด์ค๋ค.</p><p>๊ทธ๋ผ ๋์ด์ ์งํํ ์ด์ ๊ฐ ์์ง ์์๊ฐ?</p><p><strong>ํ์ง๋ง ํฐ ๋ฌธ์ ๊ฐ ์๋ค.</strong></p><p>๊ทธ ๋ฌธ์ ๋ฅผ ์ง๊ธ๋ถํฐ ์ดํด๋ณผ๊น ํ๋ค.</p><p><br></br></p><h2 id="Face-Detection"><a href="#Face-Detection" class="headerlink" title="Face Detection"></a>Face Detection</h2><hr><center><img src = "/image/test.jpg"/></center><center>[๊ทธ๋ฆผ 2] ํ๋กํ ํ์
</center><p><br></br></p><p> ๊ฐ๋จํ๊ฒ ๋ง๋ค์ด๋ณธ ๋ชจ๋ธ์ ์ฌ์ฉํ ์ ์์๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.</p><p>์ผ๊ตด์ธ์์ด cvlib์์ ์ ๊ณตํ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ด๋์ ๋๋ ์ผ๊ตด์ธ์์ ํ์ง๋ง ์ฌ๋์ด ๋ฉ์ด์ง ์๋ก ๊ฒ์ถ์ ๋ชปํ๋ค.</p><p>๋ํ, cvlib์ face detection์ ๋ง์คํฌ๋ฅผ ์ฐ์ง ์์ ์ผ๊ตด์ ํ์ต์ํจ ๋ชจ๋ธ์ด๋ผ ๋ง์คํฌ๋ฅผ ์ผ์ ๊ฒฝ์ฐ ๊ตฌ๋ถ์ ๋ชปํ๋ ๊ฒฝ์ฐ๋ ์กด์ฌํ๋ค.</p><p>๋ฐ๋ผ์, ์ด๋ถ๋ถ์ ๋จผ์ ์์ ํด์ผํ๋ค.</p><hr><ol><li><p>OpenCV Haar Training & Cascade Training</p><p>Haar Cascad classifier์ โRapid Object Detection using a Boosted Cascade of Simple Featuresโ์์ ์ ์๋ ํจ๊ณผ์ ์ธ ๊ฐ์ฒด ๊ฒ์ถ ๋ฐฉ๋ฒ์ด๋ค.</p></li></ol><p>๋ค์์ ๊ฐ์ฒด ์ด๋ฏธ์ง(positive /image)์ ๊ทธ ์ธ์ ๊ฐ์ฒด๊ฐ ์๋ ์ด๋ฏธ์ง(negative /image)๋ฅผ cascadeํจ์๋ก ํธ๋ ์ด๋ ์์ผ ๊ฐ์ฒด ๊ฒ์ถ์ ํ๋ ๋จธ์ ๋ฌ๋ ๊ธฐ๋ฐ์ ์ ๊ทผ ๋ฐฉ๋ฒ์ด๋ค.</p><p>๋ค์์ ์ผ๊ตด ์ด๋ฏธ์ง(์ฐ๋ฆฌ์ ๋ชฉํ๋ฅผ ์ํด ๋ง์คํฌ๋ฅผ ์ด ์ด๋ฏธ์ง๋ ํ์ํ๋ค)์ ์ต๋ฃฝ๋ฆฌ ์๋ ์ด๋ฏธ์ง๋ฅผ classifier์ ํ์ต์์ผ ์ผ๊ตด์ ํน์ง๋ค์ ์ถ์ถํด์ ์ ์ฅํ๋ค.</p><p>ํ์ต์ ์ํค๊ธฐ ์ด์ ์ <code>cv2.CascadeClassifier</code>(<code>haarcascade_frontface.xml</code>)์ ์ฌ์ฉํ ๊ฒฝ์ฐ ๊ธฐ์กด์ <code>cvlib.detect_face</code>๋ณด๋ค ์กฐ๊ธ ๋ ์์ฐพ๋๋ค.</p><p>ํ์ง๋ง ๋์ ๋๊ฒ ์ ์ฐพ๋ ๊ฒ์ด ์๋๋ฏ๋ก ๋ง์คํฌ๋ฅผ ์ด ์ด๋ฏธ์ง๋ก ๋ค์ ํ์ต์ ์์ผ๋ด์ผํ ๊ฒ์ด๋ค.</p><p><br></br></p><center><img src = "/image/features.jpg"/></center><center>[๊ทธ๋ฆผ 3] cascade classifer๊ฐ ํ์ตํ feature๋ค</center><p><br></br></p><hr><ol start="2"><li><p>MTCNN</p><p>์ด ๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ๋ณด์์ ๋ ๊ต์ฅํ ๋๋๋ค. ์์๋ฅผ ํ ๋ฒ ๋ณด๊ฒ ๋๋ค๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.</p></li></ol><p><br></br></p><center><img src = "/image/many.png"/></center><center>[๊ทธ๋ฆผ 4] MTCNN์ ์ ์ฉ์์ผฐ์ ๋ face detection</center><p><br></br></p><p> ๊ต์ฅํ ์์ ์ผ๊ตด๋ค๋ ๋ชจ๋ ๊ฒ์ถํด๋ด๋ ๊ฒ์ ๋ณผ ์ ์๋ค.</p><p><br></br></p><center><img src = "/image/structure.png"/></center><center>[๊ทธ๋ฆผ 5] MTCNN ํ์ต ๋ฐฉ๋ฒ</center><p><br></br></p><p> ์์ ๊ฐ์ด P-net, R-net, O-net์ด๋ผ๋ CNN์ ์ฐจ๋ก๋ก ํต๊ณผํ๋ Cascade๋ชจ๋ธ์ด๋ค.</p><p><br></br></p><p><a href="https://youtu.be/w4tigQn-7Jw"><img src="https://img.youtube.com/vi/w4tigQn-7Jw/0.jpg" alt="MTCNN Process /images"></a></p><center>[๊ทธ๋ฆผ 6] MTCNN ํ์ต ๋ฐฉ๋ฒ ์์ </center><br></br><p> ํ๋์ ๋ณด๊ธฐ ์ฝ๊ฒ ์ค๋ช
ํด๋์ ์ ํ๋ธ ์์์ด๋ค.</p><p><br></br></p><h2 id="Recognize-the-Mask"><a href="#Recognize-the-Mask" class="headerlink" title="Recognize the Mask"></a>Recognize the Mask</h2><hr><center><img src = "/image/fail.jpg"/></center><center>[๊ทธ๋ฆผ 7] ํ๋กํ ํ์
</center><p><br></br></p><p> ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์ ์ ์๋ฏ์ด ์์ง์ ์ ํํ ๊ฒ์ถํ์ง ๋ชปํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.</p><p>์ฒซ๋ฒ์งธ๋ก ํ์ต์ ์์ผฐ์ ๋ ํผ๋ถ๊ฐ ํ์ ๋จ์๋ ์ฌ์๋ค์ ๊ตฌ๋ถ์ ๋ชป์์ผฐ์๋๋ฐ ํ์ต๋ฐ์ดํฐ๊ฐ ๋ด ์ผ๊ตด์ด๋ผ ์๋ ๋ชจ๋ธ์ด ๋ณด๊ณ ์๋ ๊ฒ์ธ๊ฐ์๊ฐํ์ฌ์ ๋ค์ํ ์ธ์ข
์ ์ฌ์ง๋ค์ ์บ๊ธ์์ ๊ธ์ด์ ํ์ต์์ผฐ์ง๋ง ์ฌ์ ํ ๊ตฌ๋ถ์ ๋ชป์ํค๊ณ ์์์ ๋ณผ ์ ์๋ค.</p><p>์ด๋ ์์ง ๋ฐ์ดํฐ์
์ ๋ถ์กฑ์ผ๋ก ์ผ์ด๋ ํ์์ด๋ผ ์๊ฐํ๋ค.</p><p>๋ง์คํฌ๋ฅผ ์ผ๋ค, ์์ผ๋ค ๋๊ฐ์ง๋ก๋ง ๋ถ๋ฅํ๊ณ ์์๋๋ฐ tensorflow-keras๋ก ํ์ต์ ์์ผฐ์ ๋ ํ์ต์ด ๋งค์ฐ ์๋์ด ์ฒ์๋ถํฐ 99ํผ์ผํธ์ accruacy๋ฅผ ๋ณด์ฌ์ฃผ์์๋ค.</p><p>๊ทธ๋ฆฌ๊ณ ๋จ 3๋ฒ์ epoch๋ง์ผ๋ก๋ 99.999์ ๊ฐ๊น์ด accuracy๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ผ๋ก ๋ณด์ ์ข๋ ๋
ธ์ด์ฆ๊ฐ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ํ์ต์ ์์ผ์ผ๊ฒ ๋จ ์๊ฐ์ด ๋ค์๋ค.</p><p><br></br></p><h2 id="์์ผ๋ก์-๊ณํ"><a href="#์์ผ๋ก์-๊ณํ" class="headerlink" title="์์ผ๋ก์ ๊ณํ"></a>์์ผ๋ก์ ๊ณํ</h2><hr><p> ๋ฅ๋ฌ๋์ black-boxํน์ฑ์ ์ด์ง ์ฟ๋ณผ ์ ์๊ฒ ํ๋ grad-CAM์ด๋ผ๋ ๋ชจ๋์ ์ฌ์ฉํด์ ๋ง์คํฌ๋ฅผ ์ ๋ณด๊ณ ์๋์ง ํ์ธํด๊ฐ๋ฉฐ ํ์ต์ ์์ผ๋ณผ ์์ ์ด๋ค.</p><p><br></br></p><p><img src="https://media.arxiv-vanity.com/render-output/4682170/figures/grad-cam_approach.jpg" alt="grad-cam"></p><center>[๊ทธ๋ฆผ 8] Grad-CAM์ ์๋ฆฌ</center><p><br></br></p><p> ๊ทธ๋ฆฌ๊ณ face detection๋ถ์ผ๋ ๋ค์ํ ๋ชจ๋์ ์ฌ์ฉํ๊ณ ์์ ํด๊ฐ๋ฉฐ ๊ฒ์ถ๋ฅ ์ ๋์ฌ๋ณด๋ ค๊ณ ํ๋ค.</p><p>์ผ๋
๋์์ ํ๋ก์ ํธ๊ฐ ์ ์งํป๋์์ผ๋ฉด ์ข๊ฒ ๋ค๋ ์๊ฐ์ ํ๋ฉฐ ๊ธ์ ๋ง์น๋๋ก ํ๊ฒ ๋ค.</p><p><br></br></p><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><hr><ol><li><a href="http://www.arxiv-vanity.com/papers/1611.07450/">http://www.arxiv-vanity.com/papers/1611.07450/</a></li><li><a href="https://m.blog.naver.com/PostView.nhn?blogId=dnjswns2280&logNo=222028246343&proxyReferer=https://www.google.com/">https://m.blog.naver.com/PostView.nhn?blogId=dnjswns2280&logNo=222028246343&proxyReferer=https:%2F%2Fwww.google.com%2F</a></li><li><a href="https://www.youtube.com/watch?v=w4tigQn-7Jw">https://www.youtube.com/watch?v=w4tigQn-7Jw</a></li><li><a href="https://yeomko.tistory.com/16">https://yeomko.tistory.com/16</a></li><li><a href="https://www.kaggle.com/prasoonkottarathil/face-mask-lite-dataset?select=with_mask">https://www.kaggle.com/prasoonkottarathil/face-mask-lite-dataset?select=with_mask</a></li></ol>]]></content>
<categories>
<category> WearMask </category>
</categories>
<tags>
<tag> AAIS </tag>
<tag> WearMask </tag>
<tag> Capstone </tag>
<tag> DeepLearning </tag>
</tags>
</entry>
<entry>
<title>[AAIS] After Finishing Internship</title>
<link href="2021/02/24/aais-final/"/>
<url>2021/02/24/aais-final/</url>
<content type="html"><![CDATA[<h1 id="AAIS-์ธํด์-๋ง๋ฌด๋ฆฌํ๋ฉฐ"><a href="#AAIS-์ธํด์-๋ง๋ฌด๋ฆฌํ๋ฉฐ" class="headerlink" title="AAIS ์ธํด์ ๋ง๋ฌด๋ฆฌํ๋ฉฐ"></a>AAIS ์ธํด์ ๋ง๋ฌด๋ฆฌํ๋ฉฐ</h1><hr><br><h2 id="1-๋ค๋ฅธ-์ฃผ์ ๋ค์-๋ํด์"><a href="#1-๋ค๋ฅธ-์ฃผ์ ๋ค์-๋ํด์" class="headerlink" title="1. ๋ค๋ฅธ ์ฃผ์ ๋ค์ ๋ํด์"></a>1. ๋ค๋ฅธ ์ฃผ์ ๋ค์ ๋ํด์</h2><hr><br><p>๋๋ ์น์ ๋ฐ์ดํฐ๋ฅผ ํตํด ๋์ด๋ฅผ ์ถ์ ํ๋ ๊ฒ์ ํด๋ณด์์ง๋ง, ๊ฐ์ ์ธํด๋ค ์ค์๋ ํธ๋์คํฌ๋จธ๋ฅผ ๋ค๋ฃฌ๋ถ์ด ์ธ๋ถ์ด๋ ๊ณ์
จ๋ค.</p><p>ํธ๋์คํฌ๋จธ๋ ์์ฐ์ด์ฒ๋ฆฌ๋ฅผ ํจ์ ์์ด์ ์ต๊ทผ ๊ฐ์ฅ ํซํ ์ฃผ์ ์ฌ์ ์๋๋ณผ๊น ํ์ง๋ง ๋๋ ๊ธฐ๋ณธ๋ถํฐ(?) ์ฐจ๊ทผ์ฐจ๊ทผ ํด๋๊ฐ๋ ๊ฑธ ํด๋ณด๊ณ ์ถ์ด์ ์ ์ฃผ์ ๋ฅผ ์ ํํ๋ ๊ฒ์ด๋ค.</p><p>ํธ๋์คํฌ๋จธ์ ๋ํด์ ๋ฐ๋ก ๊ณต๋ถํ์ง ์์์ง๋ง ์ธ๋ถ ๋์ ๋ง์ ๊ฒ์ ๋ฐฐ์ ๋ค.</p><ol><li>Transformer์ Attention์ ์ญํ </li><li>Embedding์ ํ์ ๋์ ์ํ์ ๋ PCA์ t-sne๋ฅผ ํตํ ๊ด์ฐฐ</li><li>Positional Encoding์ ์ ๋ฌด๋ก ๋ฌ๋ผ์ง๋ Attention์ ๊ด๊ณ</li></ol><p>๋์ค์ ์์ฐ์ด์ฒ๋ฆฌ์ ๋ํด์ ๊ณต๋ถํ๊ฒ ๋๋ค๋ฉด ์ด๋ฒ ์ธํด์ ํตํด์ ์ป์ ์ง์์ ์ถฉ๋ถํ ํ์ฉํ ์ ์์ ๊ฒ ๊ฐ์๋ค.</p><p>๋ํ, ์ ํธ์ฒ๋ฆฌ๋ฅผ ํ์ ๋ถ๋ ๊ณ์
จ๋๋ฐ ์ด ๋ฐ์ดํฐ๋ ๋ ๋ฐ์ ์ํจ๋ค๋ฉด ์ฌ์ ๋๊ทธ๋ํ๋ ๋ค๋ฅธ ์ฌ๋ฐ์ ๊ทธ๋ํ๊ฐ์ ๊ฒ์ด ์ผ์ ์๊ฐ ์ง๋๋ฉด ์์ฌ์๊ฒ ๋ฐ๋ก ์ ํธ๊ฐ ๊ฐ๋ ์์คํ
๋ ๋ง๋ค ์ ์์ ๊ฒ ๊ฐ์๋ค.</p><p>์๋ ์๋ฃ๋ถ์ผ์๋ ๋ณ์๋ ๋ง๊ณ ์ ์ ์กฐ๊ฑด์ด ๋ง์์ ์ด๋ฅผ ๋ค ํฌํจํ๋ ๋คํธ์ํฌ๊ฐ ๋ง๋ค์ด์ง ์ ์์์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋ถ๋ช
ํ๊ฑด ์ ๋ง ๋ง๋ค์ด์ง ๊ฒ ๊ฐ๋ค.</p><p>์ง์ง๋ค.</p><br><h2 id="2-๋์-์ฃผ์ ์-๋ํด์"><a href="#2-๋์-์ฃผ์ ์-๋ํด์" class="headerlink" title="2. ๋์ ์ฃผ์ ์ ๋ํด์"></a>2. ๋์ ์ฃผ์ ์ ๋ํด์</h2><hr><br><p>์งง๊ฒ ์ฐ๊ตฌ์ฃผ์ ์ ๋ํด์ ์์ฝํ์๋ฉด</p><ol><li>ImageNet์ ํ์ตํ๋ ResNet-152๋ฅผ Transfer Learning(์ ์ดํ์ต)์ ํ์๋ค.</li><li>๋ฐ์ดํฐ ๋ถํฌ์ ์ฐจ์ด๊ฐ ์ปค์ base model์ freezeํ์ง ์๊ณ Full Layer Training์ ํ์๋ค.</li><li>Overfitting์ ๋ง๊ณ ์ data augmentation(Flip, Brightness, Rotation)์ ํ์๋ค.</li><li>๊ณต๊ฐ์ ๋ณด๋ฅผ ์์ง ์๊ธฐ ์ํด ์ผ๋ฐ์ ์ธ Flatten Layer๋ณด๋ค Global Average Pooling + FC ์ธต์ classifier๋ก ์ฌ์ฉํ์๋ค.</li><li>Majority Voting System์ ํตํด Accuracy๋ฅผ ๋์๋ค.</li></ol><br><p align = 'center'><img src = '/image/result.jpg'></p><center>๊ทธ๋ฆผ1.[์ฐ๊ตฌ๊ฒฐ๊ณผ ์์ฝ]</center><br><p>์ฐ์ ๊ฒฐ๊ณผ๋ ์ข์ง ์์ ํธ์ด์๋ค. ๊น์นํ๋ฐ์ฌ๋๊ณผ ๋
ธ์๊ท ๊ต์๋์ด ์งํํ๋ ํ๋ก์ ํธ๋ฅผ ๋ฆฌ๋น๋ฉํ๋ ์ฃผ์ ๋ ๋ค๋ฆ์ด ์์๋๋ฐ ๊ธฐ๋ณธ์ ์ธ accuracy ์ธก๋ฉด์์ ์ข์ง ๋ชปํ๋ค.</p><p>AUC score๋ง ๋ดค์ ๋๋ ์ข์ง ๋ชปํ ํธ์ด์๋๋ฐ ์ ๊ฒ๋ 5%๋ถํฐ ๋ง๊ฒ๋ 10%๊น์ง ์์น๊ฐ ์ฐจ์ด๊ฐ ๋ฌ๋ค.</p><p>์ ๋ง ์์ฌ์ด ๊ฒฐ๊ณผ์์ง๋ง ๊ต์๋๊ณผ ์กฐ๊ต๋๋ค์๊ฒ ์กฐ์ธ์ ๋ฐ์ ๋ฐ์ ์ํฌ ์ ์์ ๊ฒ์ด๋ผ ์๊ฐํ๋ค.</p><p>ํ ์กฐ๊ต๋์ด ๊ฐ์ ์ฃผ์ ๋ฅผ ์ด์ด์ ํ๊ณ ๊ณ์๋๋ฐ, Global Average Pooling์ธต์ด ์๋ Flatten + FC์ธต๋ ์ข์ ๊ฒฐ๊ณผ๊ฐ ๋์ค๊ณ ์๋ค๊ณ ํ๋ค.</p><p>๋๋ <code>x = keras.layers.Flatten()(x)</code>์ดํ์ base model์ ํํฐ์ ๊ฐฏ์์ธ 2048๊ฐ๋ฅผ ์ฐ๊ฒฐํด๋ณด๊ณ ์ ์ ์ค์ฌ์ ธ ๋๊ฐ๋ ํ์์ผ๋ก ์งํํ์๋ค.</p><p>๊ทธ๋ฆฌ๊ณ GAP์ธต์ผ๋ก ํ์ ๋๋ ํํฐ์ ์๋ฅผ ๋๋ฆด ์ ์๋ค๊ณ ์๊ฐํ์ง ๋ชปํด์ ์ด๊ฒ๋ณด๋ค ๋๋ฆฌ์ง ๋ชปํ์๋๋ฐ, Flatten์ ํ๊ฒ๋๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก 1์ฐจ์๋ฒกํฐ๋ก ๊ธธ๊ฒ ๋์ด๋๋๋ฐ, ์ด ๋๋ Node์ ์๋ฅผ 2048๊ฐ๋ณด๋ค ๋๋ฆด ์ ์๋ค๋ ์๊ฐ์ ๊ฐ๊ณผํ์๋ค.</p><p>validation accuracy๊ฐ 0.88์ ๋๋ก ์๋ ดํ๋ค๊ณ ํ๋๋ฐ ๋๋ณด๋ค ๋ฌด๋ ค 10ํผ์ผํธ๋ ๋์ ์์น์๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ ๋
ผ๋ฌธ์์๋ 0.87์ ๋๋ก ์๋ ดํ๊ธฐ ๋๋ฌธ์ ๋ ์ข์ ๋ฐฉ๋ฒ์ด๋ผ ์๊ฐํ๋ค.</p><br><p align = 'center'><img src = '/image/grad.jpg'></p><center>๊ทธ๋ฆผ2.[Grad-CAM์ ์ด์ฉํ ๋คํธ์ํฌ ๋ด๋ถ๊ด์ฐฐ]</center><br><p>์ญ์ ์๊ฐํ์ํค๋ ๊ฒ์ด ํฅ๋ฏธ์ ๋ฐ์ด ์๋๋ ๊ฒ ๊ฐ๋ค.</p><p>Loss๊ฐ ์ค์ด๋ค๋ฉด์ ํ์ต์ด ๋์ด๋๊ฐ๋ ์ง๋ฆฟํจ๋ ์์ง๋ง ์๊ฐํ๋์ ๋ ์ด๋ค ์์๊ฐ class๋ฅผ ๊ฒฐ์ ์ง๋๋ฐ ์ค์ํ ์ญํ ์ ํ๋์ง ๋ณผ ์ ์๋ Grad-CAM๊ฐ์ ๊ฒ๋ ์๊ฒ๋์ด ์ข์๋ค.</p><p>๋ํ, ํ๋ก์ ํธ๋ฅผ ๋ฐํํ๋ฉด์ ๊ต์๋์ ์กฐ์ธ๋ ๋์์ด ๋์๋ค. ์ฐ๊ตฌ๊ฐ์ค๊ณผ ์ฐ๊ตฌ๊ฒฐ๊ณผ๋ก ์ธํด ์ป์ ์ ์๋ ์ ์ ๊ธฐ์ ํ์ง ์์๋๋ฐ</p><p>์ด๋ฅผ ๋ช
ํํ ํ๋ ๊ฒ์ด ๋ณด๊ธฐ ์ข์ ๊ฒ ๊ฐ๊ณ ํ๋ก์ ํธ์ ์๋ฏธ๋ฅผ ์๋ฟ๊ฒ ์ค๋ช
ํ๋ ๊ฒ์ด๋ผ ์๊ฐํ๋ค.</p><br><h2 id="3-๋ง๋ฌด๋ฆฌ-์ง์ผ๋ฉฐ"><a href="#3-๋ง๋ฌด๋ฆฌ-์ง์ผ๋ฉฐ" class="headerlink" title="3. ๋ง๋ฌด๋ฆฌ ์ง์ผ๋ฉฐ"></a>3. ๋ง๋ฌด๋ฆฌ ์ง์ผ๋ฉฐ</h2><hr><br><p>๊ต์๋๊ณผ ์กฐ๊ต๋๋ค์๊ฒ ๋ง์ ๊ฒ์ ๋ฐฐ์ด ์๊ฐ๋ค์ด์๋ค.</p><p>์ค๊ฐ์ ์ฅ์ฒญ์ฌ๋ฐ์ฌ๋์ ๋ฐํ์ฐ์ต๋ ๊ตฌ๊ฒฝํด๋ดค๊ณ ์ด๋ป๊ฒ ๋ฐํ๋ฅผ ๊ตฌ์ํด์ผ ์งง์์๊ฐ๋ด์ ํฅ๋ฏธ์ ๋ฐ๊ณผ ์ ๋ณด์ ๋ฌ์ด ์๋ ์ง ์๊ฒ ๋์๋ค.</p><p>์ฒ์์๋ ์๋ฌด๊ฒ๋ ๋ชจ๋ฅด๊ณ ์์ํ ๊ฒ์ด๋ผ ์ ๋ชจ๋ฅด๊ณ ์์ฉ๋ถํฐ ์์ํ๋ คํ๋๋ฐ ๊ต์๋๊ป์ ์๋ฆฌ๋ฅผ ๋์น์ง ๋ง๊ณ ๊ณต๋ถํ๋ผ๊ณ ์กฐ์ธ ํด์ฃผ์
์ ์๋ฆฌ๋ฅผ ์๊ณ ์ ์ฉ์ ์์ผฐ๋ค.</p><p>์งง์ ์๊ฐ์ด์์ง๋ง ์ ๋ง ๋ง์๊ฒ์ ๋ฐฐ์ ๋ค.</p><p>์ด์ ๋ ์กธ์
ํ๋ก์ ํธ๋ก ๋ค์ ์์ํด๋ณด๊ฒ ๋ค.</p>]]></content>
<categories>
<category> AAIS </category>
</categories>
<tags>
<tag> AAIS </tag>
<tag> keras </tag>
</tags>
</entry>
<entry>
<title>[Java] Day08 - ์ธํฐํ์ด์ค</title>
<link href="2021/02/15/java-day8/"/>
<url>2021/02/15/java-day8/</url>
<content type="html"><![CDATA[<p align = 'center'><img src = "https://user-images.githubusercontent.com/12427330/103539943-44dc6c00-4edc-11eb-8dbb-9d6f3bacf911.png"></p><p>์ด ์คํฐ๋๋ ๋ฐฑ๊ธฐ์ ๋์ ์ ํ๋ธ๋ก ์งํ๋๋ live study์
๋๋ค.</p><br><h1 id="Day08-์ธํฐํ์ด์ค"><a href="#Day08-์ธํฐํ์ด์ค" class="headerlink" title="Day08. ์ธํฐํ์ด์ค"></a>Day08. ์ธํฐํ์ด์ค</h1><br><h2 id="Review-Day07"><a href="#Review-Day07" class="headerlink" title="Review Day07"></a>Review Day07</h2><hr><blockquote></blockquote><h2 id="Day08-์ธํฐํ์ด์ค-1"><a href="#Day08-์ธํฐํ์ด์ค-1" class="headerlink" title="Day08. ์ธํฐํ์ด์ค"></a>Day08. ์ธํฐํ์ด์ค</h2><hr><br><h3 id="What-is-Interface"><a href="#What-is-Interface" class="headerlink" title="What is Interface"></a>What is Interface</h3><hr><br><p>์ธํฐํ์ด์ค ํ๋ฉด ๋จ์๋ค์ ๊ฐ์ฅ ๋ง์ด ๋ ์ค๋ฅด๋ ๊ฒ์ด ๊ฒ์ํ๋ฉด์ ๋ณธ ์ธํฐํ์ด์ค๋ค(?). ๋ฐ๊ฐ์ด ๋จ์ด์ง๋ง ์ด์ ๋ถํฐ ๋ค๋ค๋ณผ ์ธํฐํ์ด์ค๋ ๋ค๋ฅธ์๊ธฐ์ด๋ค.</p><p>์ธํฐํ์ด์ค๋ ์ผ์ข
์ <strong>์ถ์ํด๋์ค</strong>์ด๋ค. ์ธํฐํ์ด์ค๋ ์ถ์ํด๋์ค์ฒ๋ผ ์ถ์๋ฉ์๋๋ฅผ ๊ฐ์ง๋ง ์ถ์ํด๋์ค๋ณด๋ค ์ถ์ํ์ ๋๊ฐ ๋์์ ์ถ์ํด๋์ ๋ฌ๋ฆฌ ๋ชธํต์ ๊ฐ์ถ ์ผ๋ฐ ๋ฉ์๋ ๋๋ ๋ฉค๋ฒ๋ณ์๋ฅผ ๊ตฌ์ฑ์์ผ๋ก ๊ฐ์ง ์ ์๋ค.</p><p>์ค์ง <strong>์ถ์๋ฉ์๋</strong>์ <strong>์์</strong>๋ง์ ๋ฉค๋ฒ๋ก ๊ฐ์ง ์ ์์ผ๋ฉฐ, ๊ทธ ์ธ์ ๋ค๋ฅธ <strong>์ด๋ ํ ์์</strong>๋ ๊ฐ์ง ์ ์๋ค.</p><p>์ถ์ํด๋์ค๋ฅผ <code>๋ฏธ์์ฑ ์ค๊ณ๋</code>๋ผ๊ณ ํ๋ค๋ฉด ์ธํฐํ์ด์ค๋ <code>๊ธฐ๋ณธ ์ค๊ณ๋</code>๋ผ๊ณ ํ ์ ์๋ค.</p><p>๋ํ, ์ถ์ํด๋์ค๋ ==โis-a : ~๋ ~์ด๋คโ==์ ๊ฐ๋
์ด๊ณ , ์ธํฐํ์ด์ค๋ ==โhas-a: ~๋ ~๋ฅผ ํ ์ ์๋ค.โ==์ ๊ฐ๋
์ด๋ค.</p><p>ex. SSON์ ์ฌ๋ Person ์ด๋ฉด์ ์ฝ๋ฉ(Developable)์ ํ ์ ์๋ค.</p><ul><li>class SSON <strong>extends</strong> Person <strong>implements</strong> Developable</li></ul><p>์ด์ ๋ถํฐ ์ธํฐํ์ด์ค์ ์ฌ์ฉ๋ฒ๊ณผ ์ฌ์ฉ์ด์ ์ ๋ํด์ ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ๋ค.</p><br><h3 id="How-to-define-Interface"><a href="#How-to-define-Interface" class="headerlink" title="How to define Interface"></a>How to define Interface</h3><hr><br><p>์ธํฐํ์ด์ค๋ฅผ ์ ์ ํ๋ ๊ฒ์ ํด๋์ค์ ๋์ผํ๋ค. ํค์๋๋ก class ๋์ interface๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ๋ง ๋ค๋ฅด๋ค. interface์ ์ ๊ทผ์ ์ด์๋ public ๋๋ default๋ฅผ ์ฌ์ฉํ ์ ์๋ค.</p><p>์์๋ ๋ค์๊ณผ ๊ฐ๋ค.</p><figure class="highlight java"><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="class"><span class="keyword">interface</span> <span class="title">howToMakeInterface</span> </span>{</span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> ์์์ด๋ฆ = ๊ฐ;</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">abstract</span> ๋ฉ์๋์ด๋ฆ(๋งค๊ฐ๋ณ์);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>์ธํฐํ์ด์ค๋ ๋ค์๊ณผ ๊ฐ์ ์ ์ฝ์กฐ๊ฑด์ด ์๋ค.</p><ol><li>๋ชจ๋ ๋ฉค๋ฒ๋ณ์๋ public static final ์ด์ด์ผ ํ๋ฉฐ, ์ด๋ฅผ ์๋ตํ ์ ์๋ค.</li><li>๋ชจ๋ ๋ฉ์๋๋ public abstract ์ด์ด์ผ ํ๋ฉฐ, ์ด๋ฅผ ์๋ตํ ์ ์๋ค. (๋จ, static๋ฉ์๋์ default๋ฉ์๋๋ ์์ธ)</li></ol><p>static๊ณผ default๋ฉ์๋๋ ๋ค์์ ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ๋ค.</p><p>์ธํฐํ์ด์ค์ ์ ์๋ ๋ชจ๋ ๋ฉค๋ฒ์ ์์ธ์์ด ์ ์ฉ๋๋ ์ฌํญ์ด๊ธฐ ๋๋ฌธ์ ์ ์ด์๋ฅผ ์๋ตํ ์ ์๋ ๊ฒ์ด๋ค. ์ธํ
๋ฆฌ์ ์ด๋ฅผ ์ฌ์ฉํ๋ค๋ณด๋ฉด ์ ๊ทผ์ ์ด์๋ฅผ ์๋ตํ๋ ๊ฒ์ ์์ฃผ ๊ฒฝํํ๊ฒ ๋๋๋ฐ ํด๋์ค์์ ๋๋ถ๋ถ public์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์๋ตํ๋ฉด public์ผ๋ก implicitํ๊ฒ ์ ์ธ๋๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.</p><p>์ด๋ ์ปดํ์ผ ์์ ์ปดํ์ผ๋ฌ๊ฐ ์๋์ ์ผ๋ก ์ถ๊ฐํด์ค๋ค.</p><br><h3 id="Inherit-Interface"><a href="#Inherit-Interface" class="headerlink" title="Inherit Interface"></a>Inherit Interface</h3><hr><br><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">interface</span> <span class="title">Movable</span></span>{</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">move</span><span class="params">(<span class="keyword">int</span> x, <span class="keyword">int</span> y)</span></span>; <span class="comment">// public abstract๊ฐ ์๋ต๋์๋ค.</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">interface</span> <span class="title">Attackable</span></span>{</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">attack</span><span class="params">(Unit u)</span></span>; <span class="comment">// public abstract๊ฐ ์๋ต๋์๋ค.</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">interface</span> <span class="title">Fightable</span> <span class="keyword">extends</span> <span class="title">Movable</span>, <span class="title">Attackable</span></span>{ }</span><br></pre></td></tr></table></figure><p>ํด๋์ค์ ์์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ ์ธํฐํ์ด์ค(Fightable)๋ ์กฐ์ ์ธํฐํ์ด์ค(Movable, Attackable)์ ์ ์๋ ๋ฉค๋ฒ๋ฅผ ๋ชจ๋ ์์๋ฐ๋๋ค.</p><p>์์ Fightable ์ธํฐํ์ด์ค๋ ์ ์๋ ๋ฉค๋ฒ๊ฐ ํ๊ฐ๋ ์์ง๋ง ์กฐ์ ์ธํฐํ์ด์ค์์ ์ ์๋ move์ attack์ ๋ฉค๋ฒ๋ก ๊ฐ๊ฒ๋๋ ๊ฒ์ด๋ค.</p><p>๋ํ, ์ธํฐํ์ด์ค๋ ์ธํฐํ์ด์ค๋ก๋ถํฐ๋ง ์์์ ๋ฐ์ ์ ์๋ค. ๋น์ฐํ ๊ฒ์ผ์๋ ์๋๋ฐ ์์์ด ์ถ์ํด๋์ค๋ง ์ ์ธ์ด ๊ฐ๋ฅํ๋ฐ ๋ถ๋ชจ ํด๋์ค๊ฐ ์ถ์ํด๋์ค๊ฐ ์๋๊ฒฝ์ฐ ์์์ ๋ฐ์ผ๋ฉด ์ด์ ์๋ฐ๋๋ ๊ฒฝ์ฐ๊ฐ ์์ฑ๋ ์ ์์ผ๋ฏ๋ก ๋น์ฐํ ๊ฒ์ด๋ค.</p><p>์ธํฐํ์ด์ค์ ์์ ๊ตฌ์กฐ์์๋</p><p><strong>โ ์๋ธ ์ธํฐํ์ด์ค๋ ์ํผ ์ธํฐํ์ด์ค์ ๋ฉ์๋๊น์ง ๋ชจ๋ ๊ตฌํํด์ผ ํ๋ค.</strong></p><p>โ <strong>์ธํฐํ์ด์ค ๋ ํผ๋ฐ์ค๋</strong> ์ธํฐํ์ด์ค๋ฅผ <strong>๊ตฌํํ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์๊ณ </strong>, ํด๋น ์ธํฐํ์ด์ค์ ์ ์ธ๋ ๋ฉ์๋(์ํผ ์ธ์คํด์ค ๋ฉ์๋ ํฌํจ)๋ง ํธ์ถ ํ ์ ์๋ค.</p><p><strong>๋จ, ์ธํฐํ์ด์ค๋ ํด๋์ค์ ๋ฌ๋ฆฌ Object์ ๊ฐ์ ์ต์์์กฐ์์ด ์กด์ฌํ์ง ์๋๋ค.</strong></p><br><h3 id="How-to-implement-Interface"><a href="#How-to-implement-Interface" class="headerlink" title="How to implement Interface"></a>How to implement Interface</h3><hr><br><p>์ธํฐํ์ด์ค๋ ์ถ์ํด๋์ค์ด๊ธฐ ๋๋ฌธ์ ๋น์ฐํ ๊ทธ ์์ฒด๋ก๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค.</p><p>์ถ์ํด๋์ค๊ฐ ์์์ ํตํด ์ถ์๋ฉ์๋๋ฅผ ์์ฑํ๋ ๊ฒ์ฒ๋ผ, ์ธํฐํ์ด์ค๋ ์์ ์ ์ ์๋ ์ถ์๋ฉ์๋์ ๋ชธํต์ ๋ง๋ค์ด์ฃผ๋ ํด๋์ค๋ฅผ ์์ฑํด์ผ ํ๋ค.</p><p>๊ทธ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.</p><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> ํด๋์ค์ด๋ฆ <span class="keyword">implements</span> ์ธํฐํ์ด์ค์ด๋ฆ</span>{</span><br><span class="line"><span class="comment">//์ถ์๋ฉ์๋๋ฅผ ๊ตฌํ.</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Fighter</span> <span class="keyword">implements</span> <span class="title">Fightable</span></span>{</span><br><span class="line"><span class="function">pulic <span class="keyword">void</span> <span class="title">move</span><span class="params">(<span class="keyword">int</span> x, <span class="keyword">int</span> y)</span> </span>{ implement }</span><br><span class="line"> <span class="function">pulic <span class="keyword">void</span> <span class="title">attack</span><span class="params">(Unit u)</span> </span>{ implement }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>์ธํฐํ์ด์ค๋ implements๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ์ ํ๋๋ฐ ๋ง ๊ทธ๋๋ก ๊ตฌํ์ ํด์ผํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ชจ๋ ๋ฉค๋ฒ๋ฅผ ๊ตฌํํ์ง ์์ ๊ฒฝ์ฐ๋ abstract๋ฅผ ๋ถ์ฌ์ ์์ฑ๋์ง ์์ ํด๋์ค์์ ๋ช
์ํด์ค์ผํ๋ค.</p><p>์์ฒ๋ผ Fightable์ด๋ผ๋ interface์ ๊ตฌ์ฑ๋์ด์ผํ move, attack๊ณผ ๊ฐ์ ๋ฉ์๋๋ฅผ <strong>๋ชจ๋</strong> ์์ฑํ์ง ์์ ๊ฒฝ์ฐ abstract๋ฅผ ๋ถ์ฌ์ผ ํ๋ค.</p><figure class="highlight java"><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"><span class="keyword">abstract</span> <span class="class"><span class="keyword">class</span> <span class="title">Fighter</span> <span class="keyword">implements</span> <span class="title">Fightable</span></span>{</span><br><span class="line"><span class="function">pulic <span class="keyword">void</span> <span class="title">move</span><span class="params">(<span class="keyword">int</span> x, <span class="keyword">int</span> y)</span> </span>{ implement }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>์ธํฐํ์ด์ค์ ์ด๋ฆ์๋ ์ฃผ๋ก ~able์ ์ ๋ฏธ์ฌ๊ฐ ๋ถ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ, ๊ทธ ์ด์ ๋ ์ด๋ ํ ๊ธฐ๋ฅ ๋๋ ํ์๋ฅผ ํ๋๋ฐ ํ์ํ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค๋ ์๋ฏธ๋ฅผ ์ง๊ด์ ์ผ๋ก ์๊ฒํ๊ธฐ ์ํจ์ด๋ค. ๋ฐ๋์ โableโ๋ก ๋๋์ผํ๋ ๊ฒ์ ์๋์ง๋ง ๊ฐ๋
์ฑ์ ๋์ด๊ธฐ์ํด์๋ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ข์ ๊ฒ์ด๋ค.</p><br><h3 id="Multiple-Inheritance-of-Interface"><a href="#Multiple-Inheritance-of-Interface" class="headerlink" title="Multiple Inheritance of Interface"></a>Multiple Inheritance of Interface</h3><hr><br><p>๋ค์ค์์์ ํ ๋, ๋ฉค๋ฒ๋ณ์์ ์ด๋ฆ์ด ๊ฐ๊ฑฐ๋ ๋ฉ์๋์ ์ ์ธ๋ถ๊ฐ ์ผ์นํ๊ณ ๊ตฌํ ๋ด์ฉ์ด ๋ค๋ฅด๋ค๋ฉด ์ด๋ค ์กฐ์์ ๊ฒ์ธ์ง ๋ถ๋ถ๋ช
ํ๊ธฐ ๋๋ฌธ์ ์๋ฐ์์๋ ๋ค์ค์์์ ํ์ฉํ์ง ์๋๋ค.</p><p>๋ ๋ค๋ฅธ ๊ฐ์ฒด์งํฅ์ธ์ด์ธ C++์์๋ ๋ค์ค์์์ ํ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ค์ค์์์ ๋จ์ ์ด ๋ถ๊ฐ๋์ง๋ง ์ธํฐํ์ด์ค๋ก ๋ค์ค์์์ ๊ตฌํํ ์ ์๋ค.</p><p>๋ค์ค์์์ ์ํด์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์๋๋ฏ๋ก ํท๊ฐ๋ฆฌ์ง ๋ง์.</p><p>์์ ์ธํฐํ์ด์ค์ ์๋ ๋ฉ์๋ ์ค์์ <strong>๋ฉ์๋ ๋ช
๊ณผ ํ๋ผ๋ฏธํฐ ํ์์ ๊ฐ์ง๋ง ๋ฆฌํด ํ์
์ด ๋ค๋ฅธ</strong> ๋ฉ์๋๊ฐ ์๋ค๋ฉด, ๋์ค ์ด๋ค ๊ฒ์ ์์๋ฐ๋๋์ ๋ฐ๋ผ <strong>๊ท์น์ด ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ ๋ค์ค ์์์ด ๋ถ๊ฐ๋ฅ</strong>ํ๋ค.</p><figure class="highlight java"><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">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Tv</span></span>{</span><br><span class="line"> <span class="keyword">protected</span> <span class="keyword">boolean</span> power;</span><br><span class="line"> <span class="keyword">protected</span> <span class="keyword">int</span> channel;</span><br><span class="line"> <span class="keyword">protected</span> <span class="keyword">int</span> volume;</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">power</span><span class="params">()</span> </span>{ power = ! power;};</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">channelUp</span><span class="params">()</span> </span>{ channel++;};</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">channelDown</span><span class="params">()</span> </span>{ channel--;};</span><br><span class="line"> </span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">VCR</span></span>{</span><br><span class="line"> <span class="keyword">protected</span> <span class="keyword">int</span> counter;</span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">getCounter</span><span class="params">()</span></span>{<span class="keyword">return</span> counter;}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">interface</span> <span class="title">IVCR</span></span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">getCounter</span><span class="params">()</span></span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">TVCR</span> <span class="keyword">extends</span> <span class="title">Tv</span> <span class="keyword">implements</span> <span class="title">IVCR</span></span>{</span><br><span class="line"> VCR vcr = <span class="keyword">new</span> VCR();</span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">getCounter</span><span class="params">()</span></span>{</span><br><span class="line"> <span class="keyword">return</span> vcr.getCounter();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>์์๊ฐ์ด ๋ค์ค์์์ ํ์ฉํ ์ ์๋ค.</p><br><h3 id="How-to-use-the-implementation-using-reference"><a href="#How-to-use-the-implementation-using-reference" class="headerlink" title="How to use the implementation using reference"></a>How to use the implementation using reference</h3><hr><br><figure class="highlight java"><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="keyword">public</span> <span class="class"><span class="keyword">interface</span> <span class="title">Animal</span> </span>{</span><br><span class="line"> <span class="function">String <span class="title">getName</span><span class="params">()</span></span>;</span><br><span class="line"> <span class="function"><span class="keyword">int</span> <span class="title">getLegs</span><span class="params">()</span></span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><br><p>์์ ๊ฐ์ด <code>Animal</code>์ด๋ผ๋ interface๊ฐ ์๋ค๊ณ ํ์.</p><br><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Bird</span> <span class="keyword">implements</span> <span class="title">Animal</span> </span>{</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> String <span class="title">getName</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"์"</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">getLegs</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="number">2</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="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Cat</span> <span class="keyword">implements</span> <span class="title">Animal</span> </span>{</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> String <span class="title">getName</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"๊ณ ์์ด"</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">getLegs</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="number">4</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure><br><p><code>Bird</code>์ <code>Cat</code>์ด๋ผ๋ <code>Animal</code> interface๋ฅผ ๊ตฌํํ class๊ฐ ์์ ๋, ๋ ํด๋์ค๋ฅผ ์ธ์คํด์คํ ํ์ฌ ๋ฉ์๋๋ฅผ ํธ์ถํด๋ณด์.</p><br><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line">Cat cat = <span class="keyword">new</span> Cat();</span><br><span class="line">Bird bird = <span class="keyword">new</span> Bird();</span><br><span class="line"></span><br><span class="line">System.out.println(cat.getName()); <span class="comment">// ๊ณ ์์ด</span></span><br><span class="line">System.out.println(cat.getLegs()); <span class="comment">// 4</span></span><br><span class="line"></span><br><span class="line">System.out.println(bird.getName()); <span class="comment">// ์</span></span><br><span class="line">System.out.println(bird.getLegs()); <span class="comment">// 2</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><br><p>๋ํ, ์ธ์คํด์ค๋ค์ interfaceํ์
์ผ๋ก ์์ฑ์ด ๊ฐ๋ฅํ๋ค.</p><br><figure class="highlight java"><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">Animal cat = <span class="keyword">new</span> Cat();</span><br><span class="line">Animal bird = <span class="keyword">new</span> Bird();</span><br></pre></td></tr></table></figure><br><p>Animal ์ธํฐํ์ด์ค๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋ ๋ฉ์๋๊ฐ ์๋ค๋ฉด Cat, Bird ํ์
์ ์ธ์คํด์ค๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.</p><br><figure class="highlight java"><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"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">printAnimal</span><span class="params">(Animal animal)</span> </span>{</span><br><span class="line"> System.out.println(<span class="string">"์ด๋ฆ : "</span> + animal.getName());</span><br><span class="line"> System.out.println(<span class="string">"๋ค๋ฆฌ ๊ฐ์ : "</span> + animal.getLegs());</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">Cat cat = <span class="keyword">new</span> Cat();</span><br><span class="line">Bird bird = <span class="keyword">new</span> Bird();</span><br><span class="line"></span><br><span class="line">printAnimal(cat);</span><br><span class="line">printAnimal(bird);</span><br></pre></td></tr></table></figure><br><h3 id="Default-Method-of-Interface-java8"><a href="#Default-Method-of-Interface-java8" class="headerlink" title="Default Method of Interface, java8"></a>Default Method of Interface, java8</h3><hr><br><p>java8๋ถํฐ๋ Default Method์ Static Method๋ฅผ ์ ์ธํ ์ ์๋ค. static method๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์์๋ ๊ฐ๋ฅํ๋ฏ๋ก ์์ ์ด์ ๊ฐ ์์๋ค.</p><p>static method๋ ๋์ค์ ๋ค๋ค๋ณด๊ณ ์ฐ์ default method๋ถํฐ ๋ค๋ค๋ณด๊ฒ ๋ค.</p><p>๋ค์ด๊ฐ๊ธฐ์ ์์ default method๊ฐ ํ์ํ ์ด์ ์ ๋ํด์ ์๊ธฐํด๋ณด๊ฒ ๋ค.</p><blockquote><p>Q. ๋ง์ฝ ๋น์ ์ด ์ ๋ช
ํ RPG๊ฒ์์ ์ ์์๋ผ๊ณ ํ์. ์ง์
๊ตฐ์ด ์ด 256๊ฐ์ง์ธ ๊ฒ์์ด๋ผ๊ณ ํ ๋, ์ธํฐํ์ด์ค์ ์์ดํ
๊ฐํ์์คํ
์ ๋์
ํ๋ค๊ณ ํ๋ค. ์ธํฐํ์ด์ค์ ๊ฐํ์์คํ
์ ๋์
ํ๋ค๋ฉด ์ถ์๋ฉ์๋์ด๊ธฐ ๋๋ฌธ์ ๊ตฌํํ ๋ชจ๋ ์ง์
๊ตฐ์ ๋ฐ๋ก ์ ์๋ฅผ ํด์ผํ ๊ฒ์ด๋ค. ๊ตฌํ X 256์ ํ๋ค๋ฉด ์ด ์ผ๋ง์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ฒ ๋๊ฐ?</p></blockquote><p>์ ๋ง ์ต์
์ด๋ค. ๊ตฌํ์ ๊ฐ๋จํ๊ฒ ํ๋ค ์ณ๋ 256๋ฒ์ ๋ฐ๋ณตํ๋ผ๋ ์ ๋ง ์ต์
์ด๋ค. ํ์ง๋ง interface์ default method ์ฆ, ๊ธฐ๋ณธ์ผ๋ก ์์ฑํ ์ ์๋ method๊ฐ ์์ ๊ฒฝ์ฐ์ ์๊ธฐ์ด๋ค.</p><p>๋ํดํธ ๋ฉ์๋๋ ์ถ์ ๋ฉ์๋์ ๊ธฐ๋ณธ์ ์ธ ๊ตฌํ์ ์ ๊ณตํ๋ ๋ฉ์๋๋ก, <strong>์ถ์ ๋ฉ์๋๊ฐ ์๋๊ธฐ ๋๋ฌธ์</strong> ๋ํดํธ ๋ฉ์๋๊ฐ ์๋ก ์ถ๊ฐ๋์ด๋ ํด๋น ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค๋ฅผ ๋ณ๊ฒฝํ์ง ์์๋ ๋๋ค.</p><p>์ด ๋, ์๋ก ์ถ๊ฐ๋ ๋ํดํธ ๋ฉ์๋๊ฐ ๊ธฐ์กด์ ๋ฉ์๋์ ์ด๋ฆ์ด ์ค๋ณต๋์ด ์ถฉ๋ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ด๋ด ๊ฒฝ์ฐ๋ ๋ค์์ ๊ท์น์ ๋ฐ๋ฅธ๋ค.</p><ol><li><p>์ฌ๋ฌ ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋๊ฐ์ ์ถฉ๋</p><ul><li>์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์์ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํด์ผํ๋ค.</li></ul></li><li><p>๋ํดํธ ๋ฉ์๋์ ์กฐ์ ํด๋์ค์ ๋ฉ์๋๊ฐ์ ์ถฉ๋</p><ul><li>์กฐ์ ํด๋์ค์ ๋ฉ์๋๊ฐ ์์๋๊ณ , ๋ํดํธ ๋ฉ์๋๋ ๋ฌด์๋๋ค.</li></ul></li></ol><p>์์ ๊ฒฝ์ฐ๋ฅผ ์ฝ๋๋ก ์ดํด๋ณด๊ฒ ๋ค.</p><p align = 'center'><img src = "/image/ab.jpg"></p><p>์์๊ฐ์ด 1.๊ฐ์ ๊ฒฝ์ฐ์๋ ๋ํดํธ ๋ฉ์๋๊ฐ์ ์ถฉ๋์ด ์ผ์ด๋์ ์ปดํ์ผ์ ์ค๋ฅ๊ฐ ๋๋ ๊ฒฝ์ฐ์ด๋ค.</p><p align = 'center'><img src = "/image/makea.jpg"></p><p>์์๊ฐ์ด 2.๊ฐ์ ๊ฒฝ์ฐ์๋ ์กฐ์ ํด๋์ค์ printMethod๊ฐ ์คํ๋จ์ ์ ์ ์๋ค.</p><br><h3 id="Static-Method-of-Interface-java8"><a href="#Static-Method-of-Interface-java8" class="headerlink" title="Static Method of Interface, java8"></a>Static Method of Interface, java8</h3><hr><br><p>์ธ์คํด์ค ์์ฑ๊ณผ ์๊ด์์ด ์ธํฐํ์ด์ค ํ์
์ผ๋ก ํธ์ถํ๋ ๋ฉ์๋์ด๋ค.</p><p>static ์์ฝ์ด๋ฅผ ์ฌ์ฉํ๊ณ , ์ ๊ทผ์ ์ด์๋ ํญ์ public์ด๋ฉฐ ์๋ต ํ ์ ์๋ค.</p><p>static method๋ ์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์ ์ํ๋ ๋ฉ์๋์๋ ๋ค๋ฅด๋ค.</p><ol><li><p>code body๊ฐ ์์ด์ผ ํ๋ค.</p></li><li><p>implements ํ ๊ณณ์์ override๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.</p></li></ol><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">interface</span> <span class="title">StaticInterface</span></span>{</span><br><span class="line"> <span class="function"><span class="keyword">static</span> <span class="keyword">void</span> <span class="title">make</span><span class="params">()</span> </span>{</span><br><span class="line"> System.out.println(<span class="string">"static make"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">interface</span> <span class="title">newInterface</span> <span class="keyword">extends</span> <span class="title">StaticInterface</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">default</span> <span class="keyword">void</span> <span class="title">make</span><span class="params">()</span></span>{</span><br><span class="line"> System.out.println(<span class="string">"it isn't overriding"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>์์ <code>StaticInterface</code>์ <code>make</code>๋ฅผ ํธ์ถํ๊ธฐ ์ํด์๋ <code>StaticInterface.make()</code>๋ฅผ ์จ์ผ์ง๋ง ํธ์ถ์ด ๊ฐ๋ฅํ๋ค.</p><h3 id="Private-Method-of-Interface-java9"><a href="#Private-Method-of-Interface-java9" class="headerlink" title="Private Method of Interface, java9"></a>Private Method of Interface, java9</h3><hr><br><p>java8 ์์๋ default method์ static method๊ฐ ์ถ๊ฐ ๋์๊ณ ,</p><p>java9 ์์๋ private method์ private static method๊ฐ ์ถ๊ฐ ๋์๋ค.</p><p>java8์ default method์ static method๋ ์ฌ์ ํ ๋ถํธํ๊ฒ ๋ง๋ ๋ค.</p><p>๋จ์ง ํน์ ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํ๋ ๋ด๋ถ method์ผ ๋ฟ์ธ๋ฐ๋, ์ธ๋ถ์ ๊ณต๊ฐ๋๋ public method๋ก ๋ง๋ค์ด์ผํ๊ธฐ ๋๋ฌธ์ด๋ค.</p><p>interface๋ฅผ ๊ตฌํํ๋ ๋ค๋ฅธ interface ํน์ class๊ฐ ํด๋น method์ ์์ธ์ค ํ๊ฑฐ๋ ์์ํ ์ ์๋ ๊ฒ์ ์ํ์ง ์์๋, </p><p>๊ทธ๋ ๊ฒ ๋ ์ ์๋ ๊ฒ์ด๋ค.</p><p>java9 ์์๋ ์์ ๊ฐ์ ์ฌํญ์ผ๋ก ์ธํด private method์ private static method๋ผ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ ๊ณตํด์ค๋ค.</p><p> โ ์ฝ๋์ ์ค๋ณต์ ํผํ๊ณ interface์ ๋ํ ์บก์ํ๋ฅผ ์ ์ง ํ ์ ์๊ฒ ๋์๋ค.</p><figure class="highlight java"><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"><span class="keyword">public</span> <span class="class"><span class="keyword">interface</span> <span class="title">Car</span> </span>{ </span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">carMethod</span><span class="params">()</span></span>; </span><br><span class="line"> <span class="function"><span class="keyword">default</span> <span class="keyword">void</span> <span class="title">defaultCarMethod</span><span class="params">()</span> </span>{ </span><br><span class="line"> System.out.println(<span class="string">"Default Car Method"</span>);</span><br><span class="line"> privateCarMethod(); privateStaticCarMethod(); </span><br><span class="line"> } </span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">privateCarMethod</span><span class="params">()</span> </span>{ </span><br><span class="line"> System.out.println(<span class="string">"private car method"</span>); </span><br><span class="line"> } </span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">privateStaticCarMethod</span><span class="params">()</span> </span>{ </span><br><span class="line"> System.out.println(<span class="string">"private static car method"</span>); </span><br><span class="line"> } </span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure><figure class="highlight java"><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"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">DefaultCar</span> <span class="keyword">implements</span> <span class="title">Car</span></span>{ </span><br><span class="line"> <span class="meta">@Override</span> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">carMethod</span><span class="params">()</span> </span>{ </span><br><span class="line"> System.out.println(<span class="string">"car method by DefaultCar"</span>); </span><br><span class="line"> } </span><br><span class="line">}</span><br></pre></td></tr></table></figure><br><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><br><hr><br><ol><li><a href="https://www.notion.so/4b0cf3f6ff7549adb2951e27519fc0e6">https://www.notion.so/4b0cf3f6ff7549adb2951e27519fc0e6</a></li><li><a href="https://blog.baesangwoo.dev/posts/java-livestudy-8week/">https://blog.baesangwoo.dev/posts/java-livestudy-8week/</a></li><li><a href="https://dev-coco.tistory.com/13">https://dev-coco.tistory.com/13</a></li></ol>]]></content>
<categories>
<category> Java </category>
</categories>
<tags>
<tag> java8 </tag>
<tag> interface </tag>
<tag> java9 </tag>
</tags>
</entry>
<entry>
<title>[AAIS] E07. ROC-curve</title>
<link href="2021/02/14/aais-07/"/>
<url>2021/02/14/aais-07/</url>
<content type="html"><![CDATA[<h1 id="ROC-curve"><a href="#ROC-curve" class="headerlink" title="ROC curve"></a>ROC curve</h1><h2 id="ROC-cuve"><a href="#ROC-cuve" class="headerlink" title="ROC cuve"></a>ROC cuve</h2><hr><p>ROC(Receiver Operating Characteristic) curve๋ ๋ค์ํ threshold์ ๋ํ ์ด์ง๋ถ๋ฅ์ ์ฑ๋ฅ์ ํ์ํ ๊ฒ์ด๋ค.</p><p>์ด์ง๋ถ๋ฅ๋ โ๋ง๋ค ํ๋ฆฌ๋คโ โ์ฌ๋์ด๋ค ์๋๋คโ์ ๊ฐ์ด ๋๊ฐ์ง์ ๊ฒฝ์ฐ๋ก ๋ถ๋ฅํ๋ ๊ฒ์ ๋งํ๋ฉฐ,</p><p>์ฐ๋ฆฌ๋ True Positive Rate์ False Positive Rate ๋ ๊ฐ์ง๋ฅผ ์ด์ฉํด์ ํํํ๊ฒ ๋๋ค.</p><p>ROC curve๋ ์ด๋ฌํ ์งํ๋ค์ ์ด์ฉํด์ ์ด๋ ๊ฒ์ด ๋ถ๋ฅ๋ฅผ ๋ ์ํ๋์ง ํ๋จํด์ฃผ๋ ๊ทธ๋ํ์ด๋ค.</p><p>๋ฅ๋ฌ๋์์ metric์ ํ๋จํ ๋, accuracy๋ง๊ณ ๋ ๋ณด์์ผ ํ๋ ๊ฒ ์ค ํ๋์ธ ๊ฒ์ด๋ค.</p><p>accuracy์ ROC-curve์ ์ฐจ์ด๋ ๊ฐ๋จํ ์๋ก ํ์ธํ ์ ์๋ค.</p><p>์ ์ฒด 100๋ช
์ค 90๋ช
์ด COVID-19์ ์์ฑ์ ๋ฐ์์ ์ผ์ผํค๊ณ , 10๋ช
์ด ์์ฑ์ ๋ฐ์์ด ๋๋ค ํ์. ์ด๋ ํ ๋ถ๋ฅ๊ธฐ๊ฐ ๋ชจ๋ ํ์๋ฅผ ๊ฐ์ผ์๋ผ๊ณ ๋ถ๋ฅํ ๊ฒฝ์ฐ</p><p>accuracy๋ 90%์ ๋ฌํ๋ค. ํ์ง๋ง ์ด๋ ๋ถ๋ช
ํ ํ๋ฆฐ ๋ถ๋ฅ๊ธฐ ์ด๋ค. ์ ํํ ํ๋จ์ ์ํด์๋ ๊ฐ์ผ์๋ฅผ ๊ฐ์ผ์๋ก ๋ถ๋ฅํ๋ ๊ฒ(TPR)๊ณผ ๋น๊ฐ์ผ์๋ฅผ ๋น๊ฐ์ผ์(FPR)๋ผ๊ณ ๋ถ๋ฅํ๋ ๋๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ด์ผ ํ๋ ๊ฒ์ด๋ค.</p><br><p align = 'center'><img src = "https://raw.githubusercontent.com/angeloyeo/angeloyeo.github.io/master/pics/2020-08-05-ROC/pic1.png", width = "500px"></p><center>๊ทธ๋ฆผ1. ROC-curve</center><br><h2 id="True-Positive-False-Positive"><a href="#True-Positive-False-Positive" class="headerlink" title="True Positive? False Positive?"></a>True Positive? False Positive?</h2><hr><p>์ฒ์์ ์ด๊ฒ์ ๋ณด๋ฉด ๋ฌด์จ ๋ป์ธ์ง ๊ฐ์ด ์์กํ ์ ์๋ค. ์ฐ๋ฆฌ์ ๊ฐ์ ์ฃผ๋์ด๋ค์ ์ํด ์ ์์ ๋ํด์ ๋ค๋ค๋ณด๊ฒ ๋ค.</p><p>์ด๋ ํ ํ์๊ฐ ์์ ๊ฑธ๋ ธ๋ค๊ณ ํ์ ๋, ์์ ๊ฑธ๋ ธ๋ค(A)์ ์์ ๊ฑธ๋ฆฌ์ง ์์๋ค(B)๋ก ๋๋์.</p><ol><li>True Positive(= Sensitivity) : ์์ธกํ ๊ฐ(A)๊ณผ ์ค์ ์ ๊ฒฝ์ฐ(A)๊ฐ ๊ฐ์ ๋ ์ฆ, ๋ง์ ๋</li><li>False Positive(= Specificity) : ์์ธกํ ๊ฐ(B)๊ณผ ์ค์ ์ ๊ฒฝ์ฐ(A)๊ฐ ๋ค๋ฅผ ๋ ์ฆ, ํ๋ฆด ๋</li><li>True Negative : ์์ธกํ ํ๋ฆฐ ๊ฒฝ์ฐ(B)์ ์ค์ ์ ํ๋ฆฐ ๊ฒฝ์ฐ(B)๊ฐ ๊ฐ์ ๋</li><li>False Negative : ์์ธกํ ํ๋ฆฐ ๊ฒฝ์ฐ(A)์ ์ค์ ์ ํ๋ฆฐ ๊ฒฝ์ฐ๊ฐ(B)๊ฐ ๋ค๋ฅผ ๋</li></ol><br><p align = 'center'><img src = "https://raw.githubusercontent.com/angeloyeo/angeloyeo.github.io/master/pics/2020-08-05-ROC/pic3.png", width = "500px"></p><center>๊ทธ๋ฆผ2. TPR๊ณผ FPR์ ๊ทธ๋ํ</center><br><p>์ฝ๊ฒ ๋งํ์๋ฉด, True/False๋ ์์ธก๊ฐ์ด ์ค์ ์ ๊ฐ์ ๋, ๋ค๋ฅผ ๋์ด๊ณ Positive, Negative๋ ์์ธก๊ฐ์ ์ณ์ ๊ฒฝ์ฐ, ํ๋ฆฐ ๊ฒฝ์ฐ๋ก ๋๋ ๋์ด๋ค.</p><p>TPR(True Positive Rate)๊ณผ FPR(False Positive Rate)์ ์๋ก ๋น๋กํ๋ ๊ด๊ณ์ ์๋ค. ์ํ์๋ฅผ ์ง๋จํ ๋, ์ฑ๊ธํ ์์ฌ๋ ์์ฃผ ์กฐ๊ธ์ ์งํ๋ง ๋ณด์ฌ๋ ์์ด๋ผ๊ณ ์ง๋จํ ์ ์์ผ๋ฉฐ ์ด ๊ฒฝ์ฐ TPR์ 1์ ๊ฐ๊น์์ง๋ค. ๋์์ FPR๋ 1์ ๊ฐ๊น์์ง๋ค.</p><p>๋ฐ๋๋ก, ์ค๋ ฅ์ด ์๋ ์์ฌ๋ผ์ ์ํ์๋ฅผ ์์๋ด์ง ๋ชปํ๋ค๋ฉด, ๋ชจ๋ ํ์ ์ ๋ํด ์์ด ์๋๋ผ๊ณ ํ ๊ฒ์ด๋ฉฐ, ์ด๊ฒฝ์ฐ TPR์ ๋งค์ฐ ๋ฎ์์ ธ 0์ ๊ฐ๊น์์ง ๊ฒ์ด๊ณ , ๋ง์ฐฌ๊ฐ์ง๋ก FPR๋ 0์ ๊ฐ๊น์์ง ๊ฒ์ด๋ค.</p><p>๋ฐ๋ผ์, TPR์ ๋์ด๋ฉด ํ์ฐ์ ์ผ๋ก FPR๋ ๋์์ง ๋ค๋ ๊ฒ์ด๋ค. ์ด๋ฅผ ์ํด์ ๊ธฐ์ค(Threshold)๋ฅผ ์ ํด์ TPR๊ณผ FPR์ ์ธก์ ์ ํด์ผํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ํ๋์ ๋ณผ ์ ์๋๋ก ์๊ฐํํ ๊ฒ์ด ROC-Cuve์ธ ๊ฒ์ด๋ค.</p><p>ROC-curve์ ์ฅ์ ์๋ ํ๊ฐ์ง๊ฐ ๋ ์๋๋ฐ, <strong>๋ณ์ ์ํ์ฑ์ ๋ฐ๋ผ์ ์ด๋ค ๊ธฐ์ค์ ๋ฌ์ผํ ์ง ์ ํ๊ธฐ๊ฐ ์ข๋ค๋ ๊ฒ์ด๋ค.</strong></p><p>์๋ฅผ ๋ค์ด ์ท์ฅ์๊ฐ์ด ๊ฑธ๋ฆด ํ๋ฅ ์ ๋ฎ์ง๋ง ์น์ฌ์จ์ด ๊ต์ฅํ ๋์ ์ง๋ณ์ด ์๋ค๊ณ ํ ๋, ์ฝ๊ฐ์ ์งํ๋ง์ผ๋ก ๋ณ์ ์์ฑ์ด๋ผ๊ณ ํ๋จํ๋ ๊ฒ์ ๋ ์ข์ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ผ ์ ์๋ค. ๋ฐ๋ผ์ FPR๋ ๋ํ ๋์์ง์ง๋ง ๋ ๋ง์ ํ์๋ฅผ ์ด๋ฆด ์ ์์ ๊ฒ์ด๋ค.</p><h2 id="ROC-curve์์-์ ์-์๋ฏธ"><a href="#ROC-curve์์-์ ์-์๋ฏธ" class="headerlink" title="ROC-curve์์ ์ ์ ์๋ฏธ"></a>ROC-curve์์ ์ ์ ์๋ฏธ</h2><hr><p>์์ ๋งํ๋ฏ์ด ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅธ threshold๋ฅผ ์ ์ฉํด์ผํ๋ค.</p><p>threshold๋ฅผ TPR๋๋ FPR์ ๋ฐ๋ผ ์ ์ํ๊ฒ ๋์์ ๋, ๊ทธ ๋ถ๋ถ์ ์ ์ํ๋ ๊ฒ์ด๋ค.</p><p>์ฆ, threshold๋ณ๋ก TPR๊ณผ FPR์ ์์๋ณด๊ฒ ๋๋ ๊ฒ์ด๋ค. ๋ชจ๋ threshold๋ณ๋ก ๋น์จ์ ์ฝ๊ฒ ๋ณด๊ฒ ๋๋ค๋ ๊ฒ์ด๋ค.</p><p align = "center"><img src ="https://raw.githubusercontent.com/angeloyeo/angeloyeo.github.io/master/pics/2020-08-05-ROC/pic6.gif"></p><h2 id="ROC-curve์์-๊ทธ๋ํ์-์๋ฏธ"><a href="#ROC-curve์์-๊ทธ๋ํ์-์๋ฏธ" class="headerlink" title="ROC-curve์์ ๊ทธ๋ํ์ ์๋ฏธ"></a>ROC-curve์์ ๊ทธ๋ํ์ ์๋ฏธ</h2><hr><p>๊ทธ๋ํ๋ ์ด์ง๋ถ๋ฅ์ ์ฑ๋ฅ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๊ทธ๋ ค์ง๋ค.</p><p align = "center"><img src ="https://raw.githubusercontent.com/angeloyeo/angeloyeo.github.io/master/pics/2020-08-05-ROC/pic7.gif"></p><p>์์ ๊ฐ์ด ๋๊ฐ์ง์ ๊ทธ๋ฃน์ ์๋ถ๋ฅํ ์๋ก ๋ง์ด ํ๊ณ ๋ถ๋ฅํ์ง ๋ชปํ ๊ฒฝ์ฐ ์ง์ ์ ๊ฐ๊น์์ง๋ค.</p><p>์ด์ฒ๋ผ ๊ณก์ ์ ๋ชจ์์ ๋ฐ๋ผ ๋ถ๋ฅ๋ฅผ ์ ํ ์์์์ ํ๋จํ ์ ์๋ ๊ทผ๊ฑฐ๊ฐ ๋๋ ๊ฒ์ด๋ค.</p><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><p><a href="https://angeloyeo.github.io/2020/08/05/ROC.html">https://angeloyeo.github.io/2020/08/05/ROC.html</a><br><a href="https://newsight.tistory.com/53">https://newsight.tistory.com/53</a></p>]]></content>
<categories>
<category> AAIS </category>
</categories>
<tags>
<tag> AI </tag>
<tag> AAIS </tag>
<tag> keras </tag>
<tag> metrics </tag>
<tag> ROC </tag>
<tag> AUC </tag>
</tags>
</entry>
<entry>
<title>[Java] Day07 - ํจํค์ง</title>
<link href="2021/02/06/java-day7/"/>
<url>2021/02/06/java-day7/</url>
<content type="html"><![CDATA[<h1 id="Day07-ํจํค์ง"><a href="#Day07-ํจํค์ง" class="headerlink" title="Day07. ํจํค์ง"></a>Day07. ํจํค์ง</h1><h2 id="Review-Day06"><a href="#Review-Day06" class="headerlink" title="Review Day06"></a>Review Day06</h2><hr><blockquote><p>Q1. @Override Annotation์ด ๋จ์ํ ๋งํฌ์ ์๋ฏธ๋ง ๊ฐ์ง๊ณ ์๋์?</p></blockquote><p>์๋๋ค. ๋จ์ํ ์ค๋ฒ๋ผ์ด๋ฉํ ๋ฉ์๋์์ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด ์๋๋ผ ์ปดํ์ผ๋ฌ๊ฐ ์ค๋ฒ๋ผ์ด๋ฉ์ ํ๊ฒ์ธ์ง ์ค๋ฅ๋ฅผ ์ฒดํฌํด์ค๋ค.</p><p>์๋ฅผ ๋ค์ด, ๋๋ ์ค๋ฒ๋ผ์ด๋ฉ์ ์ํ๋ค๊ณ ์๊ฐํ์ง๋ง ๋ง์ ์ปดํ์ผ์ ํ๊ณ ๋ณด๋ ์ด๊ฒ์ ์ค๋ฒ๋ผ์ด๋ฉ์ ํ๊ฒ์ด ์๋ ์๋ก์ด ๋ฉ์๋๋ฅผ ์ ์ํ ๊ฒ์ด๋ผ๋ฉด ์ค๋ฅ๊ฐ ๋จ๊ฒ ํ๋ ๊ฒ์ด๋ค.</p><p>๋ฐ๋ผ์, ๋ช
์์ ์ผ๋ก ์ด๋
ธํ
์ด์
์ ํ๋ ๊ฒ์ด ์ข๋ค.</p><br><h2 id="Day07-ํจํค์ง-1"><a href="#Day07-ํจํค์ง-1" class="headerlink" title="Day07. ํจํค์ง"></a>Day07. ํจํค์ง</h2><hr><br><h3 id="package-keyword"><a href="#package-keyword" class="headerlink" title="package keyword"></a>package keyword</h3><hr><p>ํจํค์ง๋, ํด๋์ค์ ๋ฌถ์์ด๋ค. ํจํค์ง ์์๋ ํด๋์ค ๋๋ ์ธํฐํ์ด์ค๋ฅผ ํฌํจ์ํฌ ์ ์์ผ๋ฉฐ, ์๋ก ๊ด๋ จ๋ ํด๋์ค๋ค๋ผ๋ฆฌ ๊ทธ๋ฃน ๋จ์๋ก ๋ฌถ์ด ๋์์ผ๋ก์จ ํด๋์ค๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ค.</p><p>๊ฐ์ ์ด๋ฆ์ ํด๋์ค ์ผ์ง๋ผ๋ ์๋ก ๋ค๋ฅธ ํจํค์ง์ ์กด์ฌํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ฏ๋ก, ์์ ๋ง์ ํจํค์ง ์ฒด๊ณ๋ฅผ ์ ์งํจ์ผ๋ก์จ ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ๊ฐ๋ฐํ ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํด๋์ค์ ์ด๋ฆ์ด ์ถฉ๋ํ๋ ๊ฒ์ ํผํ ์ ์๋ค. - Java์ ์ ์</p><p>๋๋ ํ ๋ฆฌ๊ฐ ๋๋ ํ ๋ฆฌ๋ฅผ ํฌํจํ ์ ์๋ ๊ฒ์ฒ๋ผ ํจํค์ง ๋ํ ๋ค๋ฅธ ํจํค์ง๋ฅผ ํฌํจํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค. ์ด๋ <code>.</code>์ผ๋ก ๊ตฌ๋ถ์ด ๊ฐ๋ฅํ๋ค.</p><p>์๋ฅผ๋ค์ด ์ฐ๋ฆฌ๊ฐ ์์ฃผ์ฐ๋ <code>String</code>ํด๋์ค๋ <code>java</code>๋ผ๋ ํจํค์ง์ <code>lang</code>์์ <code>String</code>์ด๋ผ๋ ํด๋์ค์ด๋ค.</p><p>์ด๋ <code>java.lang.String</code>์ผ๋ก ์ฐ๋ ๊ฒ์ด๋ค.</p><p>ํจํค์ง๋ ๋ค์๊ณผ ๊ฐ์ ๊ท์น์ ๊ฐ์ง๋ค.</p><ol><li>ํ๋์ ์์คํ์ผ์๋ ์ฒซ ๋ฒ์งธ ๋ฌธ์ฅ์ผ๋ก ๋จ ํ๋ฒ์ ํจํค์ง ์ ์ธ๋ง์ ํ์ฉํ๋ค.</li><li>๋ชจ๋ ํด๋์ค๋ ๋ฐ๋์ ํ๋์ ํจํค์ง์ ์ํด์ผ ํ๋ค.</li><li>ํจํค์ง๋ ์ (.)์ ๊ตฌ๋ถ์๋ก ํ์ฌ ๊ณ์ธต๊ตฌ์กฐ๋ก ๊ตฌ์ฑํ ์ ์๋ค.</li><li>ํจํค์ง๋ ๋ฌผ๋ฆฌ์ ์ผ๋ก ํด๋์คํ์ผ(.class)์ ํฌํจํ๋ ํ๋์ ๋๋ ํ ๋ฆฌ์ด๋ค.</li></ol><p>๋ํ ํจํค์ง์ด๋ฆ์ ๊ท์น๋ ์กด์ฌํ๋ค.</p><table><thead><tr><th>ํจํค์ง ์์์ด๋ฆ</th><th>๋ด์ฉ</th></tr></thead><tbody><tr><td>java</td><td>์๋ฐ ๊ธฐ๋ณธ ํจํค์ง()</td></tr><tr><td>javax</td><td>์๋ฐ ํ์ฅ ํจํค์ง(Java vendor ๊ฐ๋ฐ)</td></tr><tr><td>org</td><td>์ผ๋ฐ์ ์ผ๋ก ๋น์๋ฆฌ๋จ์ฒด (์คํ์์ค) ํจํค์ง</td></tr><tr><td>com</td><td>์ผ๋ฐ์ ์ผ๋ก ์๋ฆฌ๋จ์ฒด(ํ์ฌ) ํจํค์ง</td></tr></tbody></table><p>ํจํค์ง์ ์ ์ธ์</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> ํจํค์ง๋ช
;</span><br></pre></td></tr></table></figure><p>๊ณผ ๊ฐ์ด ๊ฐ๋จํ๊ฒ ์ค์ ๊ฐ๋ฅํ๋ค. ์ฐ๋ฆฌ๊ฐ ์ธํ
๋ฆฌ์ ์ด๋ฅผ ์ฐ๋ค๋ณด๋ฉด ์ฒซ์ค์ ์๋ฐ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ โ์ด๋ฆ์๋ํจํค์ง(unnamed package)โ๊ฐ ์ค์ ๋์ด ์์์ ๋ณผ ์ ์๋ค.</p><p>ํจํค์ง๋ช
์ ์๋ฌธ์๋ก ํ๋ ๊ฒ์ ์์น์ผ๋ก ํ๊ณ ์๋ค.</p><p>ํจํค์ง๋ฅผ ๊ตฌ์ฑํ๋ ๊ณผ์ ์ ๋ค์ ํด๋์คํจ์ค๋ฅผ ๋ค๋ฃจ๋ฉด์ ๋ค์ ์๊ธฐํด๋ณด๊ฒ ๋ค.</p><br><h3 id="import-keyword"><a href="#import-keyword" class="headerlink" title="import keyword"></a>import keyword</h3><hr><p>๊ธฐ์กด์ ํจํค์ง์ ํฌํจ๋์ง ์์ ๋ค๋ฅธ ํด๋์ค๋ค์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ํจํค์ง๋ช
์ด ํฌํจ๋ ํด๋์ค ์ด๋ฆ์ ์ฌ์ฉํด์ผ ํ๋ค.</p><p>ํ์ง๋ง ๋งค๋ฒ ํจํค์ง์ด๋ฆ์ ์ฐ๋ ๊ฒ์ ๋ถํธํ๋ฏ๋ก import๋ฌธ์ ์ฌ์ฉํ์ฌ ํด๋์ค์ ํจํค์ง๋ฅผ ๋ฏธ๋ฆฌ ๋ช
์ํด์ฃผ๋ฉด ์์ค์ฝ๋์ ์ฌ์ฉ๋๋ ํด๋์ค์ด๋ฆ์์ ํจํค์ง๋ช
์ ์๋ตํ ์ ์๋ค.</p><p>์ธํ
๋ฆฌ์ ์ด๋ โAlt+Enterโ๋ฅผ ํ๋ฉด ์๋์ผ๋ก importํด์ฃผ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค.</p><p>ํด๋์ค ์ด๋ฆ์ ์ง์ ํด์ฃผ๋ ๋์ โ*โ๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํ์ผ๋ฌ๋ ํด๋น ํจํค์ง์์ ์ผ์นํ๋ ํด๋์ค์ด๋ฆ์ ์ฐพ์์ผ ํ๋ ์๊ณ ๋ฅผ ๋ ํด์ผํ ๊ฒ์ด๋ค. ๋จ์ง ๊ทธ ๋ฟ์ด๋ค. ์คํ ์ ์ฑ๋ฅ์์ ์ฐจ์ด๋ ์ ํ ์๋ค.</p><figure class="highlight java"><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"><span class="keyword">import</span> java.util.Calendar;</span><br><span class="line"><span class="keyword">import</span> java.util.Date;;</span><br><span class="line"><span class="keyword">import</span> java.util.ArrayList;</span><br></pre></td></tr></table></figure><p>์์ ๊ฐ์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด ํ์ค๋ก ์ค์ผ ์ ์๋ค.</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.*;</span><br></pre></td></tr></table></figure><p>ํ์ง๋ง ์ด๋ ํด๋์ค์ ์ด๋ฆ ๋์ โ<em>โ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด์ง ํจํค์ง ๋์ โ</em>โ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.</p><figure class="highlight java"><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"><span class="keyword">import</span> java.util.*;</span><br><span class="line"><span class="keyword">import</span> java.text.*;</span><br></pre></td></tr></table></figure><p>๋</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.*;</span><br></pre></td></tr></table></figure><p>๊ณผ ๊ฐ์ง ์๋ค.</p><br><h4 id="๋นํธ์ธํจํค์ง-Built-in-package"><a href="#๋นํธ์ธํจํค์ง-Built-in-package" class="headerlink" title="๋นํธ์ธํจํค์ง(Built-in package)"></a>๋นํธ์ธํจํค์ง(Built-in package)</h4><hr><p>์ง๊ธ๊น์ง String์ด๋ System๊ฐ์ ํด๋์ค๋ค์ ํจํค์ง๋ช
์์ด ์ฌ์ฉํ ์ ์์๋ ์ด์ ๋ ๋ชจ๋ ์์คํ์ผ์๋ implicitํ๊ฒ <code>import java.lang.*</code>์ด ์ ์ธ๋์ด ์๋ค.</p><p>๋งค์ฐ ์ค์ํ๊ณ ์์ฃผ์ฐ๋ ํจํค์ง์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก import๋ฌธ์ผ๋ก ์ง์ ํ์ง ์์๋ ๋๋๋ก ํ ๊ฒ์ด๋ค.</p><p>์ด๋ฅผ <code>built-in package</code>๋ผ ํ๋ ๊ฒ์ด๋ค. ๋ํ, ํด๋์ค ์ด๋ฆ๊ณผ ํจํค์ง ์ด๋ฆ์ ํฉ์ณ์ผ FQCN(Fully Qualified Class Name)์ด๋ผ๊ณ ํ๋ค.</p><p>์ถ๊ฐ๋ก static import๋ฌธ๋ ๊ฐ๋ฅํ๋ค.</p><figure class="highlight java"><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"><span class="keyword">import</span> <span class="keyword">static</span> java.lang.Integer.*; <span class="comment">// Integerํด๋์ค์ ๋ชจ๋ static๋ฉ์๋</span></span><br><span class="line"><span class="keyword">import</span> <span class="keyword">static</span> java.lang.Math.random; <span class="comment">// Math.random()</span></span><br><span class="line"><span class="keyword">import</span> <span class="keyword">static</span> java.lang.System.out; <span class="comment">// System.out์ out์ผ๋ก ์ฐธ์กฐ๊ฐ๋ฅ</span></span><br></pre></td></tr></table></figure><p><code>System.out.println(Math.random()); </code>โ> <code>out.println(random());</code>์ผ๋ก ๋ฐ๊ฟ ์ ์๋ค.</p><br><h3 id="ํด๋์คํจ์ค๋"><a href="#ํด๋์คํจ์ค๋" class="headerlink" title="ํด๋์คํจ์ค๋?"></a>ํด๋์คํจ์ค๋?</h3><hr><p>ํด๋์คํจ์ค๋ JVM ํน์ Java ์ปดํ์ผ๋ฌ๊ฐ ์ฌ์ฉํ๋ ํ๋ผ๋ฏธํฐ๋ก ํด๋์ค๋ ํจํค์ง๋ฅผ ์ฐพ์ ๋ ๊ธฐ์ค์ด ๋๋ ๊ฒฝ๋ก๋ฅผ ๋งํ๋ค.</p><p>์ฆ, java ๋ช
๋ น์ ํตํด class ํ์ผ์ ์คํํ ๋ ํด๋์ค ํ์ผ์ ์ฐพ๋ ๊ธฐ์ค์ด ๋๋ ๊ฒฝ๋ก๋ฅผ ํด๋์คํจ์ค๋ผ๊ณ ํ๋ค.</p><p>๋ฐ๋ก ์ง์ ํด์ฃผ์ง ์๋๋ค๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก๋ java๋ช
๋ น์ ์คํํ๋ ์์น(ํ์ฌ ๋๋ ํฐ๋ฆฌ)๋ฅผ ๋งํ๋ค.</p><p>์์ค์ฝ๋(.java๋ก ๋๋๋ ํ์ผ)๋ฅผ ์ปดํ์ผํ๋ฉด ์์ค์ฝ๋๊ฐ ๋ฐ์ดํธ์ฝ๋๋ก ๋ณํ๋๋๋ฐ, java runtime์ผ๋ก .class ํ์ผ์ ํฌํจ๋ ๋ช
๋ น์ ์คํํ๋ ค๋ฉด ์ด ํ์ผ์ ์ฐพ์์ ์์ด์ผํ๋ค.</p><p>.class ํ์ผ์ ์ฐพ์ ๋, classpath์ ์ง์ ๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ค.</p><p>์ธ๋ฏธ ์ฝ๋ก (;)์ ๊ตฌ๋ถ์๋ก ํ์ฌ ์ฌ๋ฌ๊ฐ์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ ์ ์๋ค.</p><p>classpath๋ฅผ ์ง์ ํ๋ ๋ฐฉ๋ฒ ๋๊ฐ์ง๋ฅผ ์ดํด๋ณด๊ฒ ๋ค.</p><br><h4 id="CLASSPATH-ํ๊ฒฝ๋ณ์"><a href="#CLASSPATH-ํ๊ฒฝ๋ณ์" class="headerlink" title="CLASSPATH ํ๊ฒฝ๋ณ์"></a>CLASSPATH ํ๊ฒฝ๋ณ์</h4><hr><p><code>CLASSPATH=,;C:\Program Files\JDK\lib\tools.jar</code>์ฒ๋ผ ์ปดํจํฐ ์์คํ
๋ณ์์ค์ ์ ํตํด ์ง์ ํ ์ ์๋ค.</p><p>JVM์ด ์์๋ ๋ JVM์ ํด๋์ค ๋ก๋๋ ์ด ํ๊ฒฝ๋ณ์๋ฅผ ํธ์ถํ๊ฒ ๋๋ค. ๊ทธ๋์ ํ๊ฒฝ ๋ณ์์ ์ค์ ๋์ด ์๋ ๋๋ ํ ๋ฆฌ๊ฐ ํธ์ถ๋๋ฉด ๊ทธ ๋๋ ํ ๋ฆฌ์ ์๋ ํด๋์ค๋ค์ ๋จผ์ JVM์ ๋ก๋ํ๋ค.</p><p>๋ฐ๋ผ์, CLASSPATH ํ๊ฒฝ ๋ณ์์๋ ํ์ ํด๋์ค๋ค์ด ์์นํ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ฑ๋กํ๋๋ก ํ๋ค.</p><p align = 'center'><img src = 'https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgTFrB%2FbtqRqb5kigF%2FTIDMKzmCWECK2NDscHxQH0%2Fimg.png'></p><p>ํ์ง๋ง, ์ด์์ฒด์ ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ํด๋์คํจ์ค๊ฐ ์ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ ์ด์์ฑ ๋ฉด์์๋ ๋ถ๋ฆฌํ๋ค.</p><ul><li>Windows : ์์คํ
์ค์ > ํ๊ฒฝ๋ณ์</li><li>linux, unix๊ณ์ด : /etc/profile</li></ul><p>๋ฐ๋ผ์ ์ต๊ทผ์๋ ์ด์์ฒด์ ์์ ํ๊ฒฝ๋ณ์๋ก ํด๋์คํจ์ค๋ฅผ ์ค์ ํ๋ ๊ฒ์ ์ง์ํ๊ณ IDE๋ ๋น๋๋๊ตฌ๋ฅผ ํตํด ํด๋์คํจ์ค๋ฅผ ์ค์ ํ๋ค.</p><br><h4 id="classpath-์ต์
"><a href="#classpath-์ต์
" class="headerlink" title="-classpath ์ต์
"></a>-classpath ์ต์
</h4><hr><p>์๋์ ์๋ฐ ์ปดํ์ผ๋ฌ์ธ <code>javac</code>๋ฅผ ์ฌ์ฉํ ๋๋ <code>javac <options> <source filed></code>์ ๊ฐ์ ํํ๋ก ์ปดํ์ผ์ ํ๋๋ฐ</p><p>์ฐธ์กฐํ ํด๋์ค ํ์ผ๋ค์ ์ฐพ๊ธฐ ์ํด์ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ง์ ํด์ฃผ๋ <code>-classpath</code> ์ต์
์ด ์๋ค.</p><p>์๋ฅผ๋ค์ด ์ปดํ์ผ ํ <code>Test.java</code>ํ์ผ์ด <code>C:\Users</code>์ ์๊ณ , ํ์ํ ํด๋์คํ์ผ๋ค์ด <code>C:\Java\classes</code>์ ์กด์ฌํ๋ค๋ฉด,</p><p><code>javac -classpath C;\Java\classes C:\Users\Test.java</code>๋ก ์ต์
์ ์ฃผ๊ณ ์ปดํ์ผ์์ ํด๋์คํจ์ค๊ฐ ์ฐธ์กฐ๋๋ค.</p><p>์ด ๋, <code>-cp</code>๋ก ์ฝ์๋ฅผ ์ฌ์ฉํ์ฌ ์ต์
์ ์ฃผ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.</p><br><h3 id="์ ๊ทผ์ง์์-Access-Modifiers"><a href="#์ ๊ทผ์ง์์-Access-Modifiers" class="headerlink" title="์ ๊ทผ์ง์์(Access Modifiers)"></a>์ ๊ทผ์ง์์(Access Modifiers)</h3><hr><p>์ ๊ทผ ์ง์์๋ ๋ฉค๋ฒ ๋ณ์๋ ๋ฉ์๋๋ค์ ์ ๊ทผ ๋ฒ์๋ฅผ ์ ์ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๊ฒ์ด๋ค.</p><p>main ๋ฉ์๋๊ฐ ์๋ ํด๋์ค๋ ๋๋ถ๋ถ ๋ค๋ฅธ ํด๋์ค์์ ์ฌ์ฉํ ๋ชฉ์ ์ผ๋ก ์ค๊ณ๋ ํด๋์ค์ด๋ค.</p><p>ํด๋์ค๋ค์ ์ธ๋ถ ํด๋์ค์์ ์ ๊ทผํ ์ ์๋ ๋ฉค๋ฒ์ ์ ๊ทผํ ์ ์๋ ๋ฉค๋ฒ๋ฅผ ๊ตฌ๋ถํ์ฌ ์ค๊ณํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค.</p><p>๊ฐ์ฒด ์์ฑ์ ๋ง๊ธฐ ์ํด ์์ฑ์๋ฅผ ํธ์ถํ์ง ๋ชปํ๊ฒ ํ๊ฑฐ๋, ๊ฐ์ฒด์ ํน์ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ๊ธฐ ์ํด ํด๋น ํ๋์ ์ ๊ทผํ์ง ๋ชปํ๊ฒ ํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ค.</p><p>์ ๊ทผ ์ ํ์(Access Modifiers)๋๋ ์ ๊ทผ ์์ค ์ง์์(Access-level Modifier)๋ผ๊ณ ๋ ํ๋ค.</p><p>์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ์ ๊ทผ์ ํ์๋ ๋ค์๊ณผ ๊ฐ๋ค.</p><ol><li><p>public</p><p> ๋ชจ๋ ํจํค์ง์์ ์๋ฌด๋ฐ ์ ํ ์์ด ํธ์ถ ํ ์ ์๊ฒ ํ๋ฉฐ, ๋ณดํต ์์ฑ์, ํ๋ ๋๋ ๋ฉ์๋๊ฐ public์ด๋ฉด ํด๋์ค๋ public์ผ๋ก ์ ์ธํ๋ค.</p></li><li><p>protected</p><p> ๊ฐ์ ํจํค์ง์์๋ ์ ํ ์์ด ํธ์ถํ ์ ์์ผ๋, ๋ค๋ฅธ ํจํค์ง์์๋ ํธ์ถํ ์ ์๋ค.</p><p> ๋ค๋ฅธ ํจํค์ง์ ์ํ ํด๋์ค๊ฐ ํด๋น ํด๋์ค์ ์์ ํด๋์ค๋ผ๋ฉด ํธ์ถํ ์ ์๋ค.</p></li><li><p>default</p><p> ์ ๊ทผ์ ํ์๋ฅผ ์๋ตํ๋ค๋ฉด default ์ ํ์ ๊ฐ์ง๋ค.</p><p> protected์ ๊ฐ์ด ๊ฐ์ ํจํค์ง์์๋ ์ ํ ์์ด ํธ์ถํ ์ ์์ผ๋, ๋ค๋ฅธ ํจํค์ง์์๋ ํธ์ถํ ์ ์๋ค.</p></li><li><p>private</p><p> ์ค๋ก์ง ํด๋์ค ๋ด๋ถ์์๋ง ์ฌ์ฉํ ์ ์๋ค.</p></li></ol><br><p align = 'center'><img src ="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKb2tD%2FbtqRrPm3DAn%2F9Q28T3eXG4n3kukPuMiup0%2Fimg.png"></p><br><table><thead><tr><th>์ง์์</th><th>ํด๋์ค ๋ด๋ถ</th><th>๋์ผ ํจํค์ง</th><th>์์๋ฐ์ ํด๋์ค</th><th>์ด์ธ</th></tr></thead><tbody><tr><td>private</td><td>O</td><td>X</td><td>X</td><td>X</td></tr><tr><td>default</td><td>O</td><td>O</td><td>X</td><td>X</td></tr><tr><td>protected</td><td>O</td><td>O</td><td>O</td><td>X</td></tr><tr><td>public</td><td>O</td><td>O</td><td>O</td><td>O</td></tr></tbody></table><br><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><hr><p>์๋ฐ์์ ์<br><a href="https://kils-log-of-develop.tistory.com/430">https://kils-log-of-develop.tistory.com/430</a><br><a href="https://blog.baesangwoo.dev/posts/java-livestudy-7week/">https://blog.baesangwoo.dev/posts/java-livestudy-7week/</a><br><a href="https://www.notion.so/ed8e346f88f54849a06ff968b1877ca5">https://www.notion.so/ed8e346f88f54849a06ff968b1877ca5</a><br><a href="https://pej4303.tistory.com/57">https://pej4303.tistory.com/57</a></p>]]></content>
<categories>
<category> Java </category>
</categories>
<tags>
<tag> java8 </tag>
</tags>
</entry>
<entry>
<title>[Java] Day06 - ์์</title>
<link href="2021/02/03/java-day6/"/>
<url>2021/02/03/java-day6/</url>
<content type="html"><![CDATA[<h1 id="Day06-์์"><a href="#Day06-์์" class="headerlink" title="Day06 ์์"></a>Day06 ์์</h1><br><h2 id="Review-day05"><a href="#Review-day05" class="headerlink" title="Review day05"></a>Review day05</h2><br><blockquote><p>Q1. ์ด๊ธฐํ๋ธ๋ก๊ณผ ์์ฑ์ ์ค ์ด๋๊ฒ์ด ๋จผ์ ์คํ๋๋๊ฐ?</p></blockquote><br><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">private</span> <span class="keyword">int</span> number;</span><br><span class="line">{</span><br><span class="line"><span class="keyword">this</span>.number = <span class="number">10</span>;</span><br><span class="line"> System.out.println(<span class="string">"init block"</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><br></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="title">Init</span><span class="params">()</span></span>{</span><br><span class="line"><span class="keyword">this</span>.number = <span class="number">100</span>;</span><br><span class="line"> System.out.println(<span class="string">"constructor"</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">main(){</span><br><span class="line">Init init = <span class="keyword">new</span> Init();</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด init block โ> constructor๋ก ์ถ๋ ฅ์ด ๋จ์ ํ์ธํ ์ ์๋ค. ์ฆ, <code>์ด๊ธฐํ๋ธ๋ก์ด ๋จผ์ ์คํ๋๊ณ ๊ทธ๋ค์ ์์ฑ์๊ฐ ์คํ๋๋ ๊ฒ</code>์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ์ ์ด๊ธฐํ๋ธ๋ก์ ์ฌ์ฉํ๋๊ฐ? ๋ฐ๋ก, static ๋ณ์์ ๊ดํด์ ์ด๊ธฐํ๊ฐ ํ์ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.</p><p>์ฐธ๊ณ ๋ก</p><br><figure class="highlight java"><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"><span class="function"><span class="keyword">public</span> <span class="title">Init</span><span class="params">(<span class="keyword">int</span> number)</span></span>{</span><br><span class="line"><span class="keyword">this</span>()</span><br><span class="line">}</span><br></pre></td></tr></table></figure><br><p>์์ ๊ฐ์ ์ฝ๋๋ ๋ํดํธ ์์ฑ์์ธ this()๋ฅผ ํธ์ถํ์ฌ ์์ฑ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ด๋ค. this ์์ฒด๋ ์์ฑ์๋ ์๋์ง๋ง(์ธ์คํด์ค) ํด๋น ํด๋์ค์ ์์ฑ์๋ฅผ ํธ์ถํ ์ ์๋ค. (์์ฑ์๋ ๋ฉ์๋๊ฐ ์๋๋ค.)<br><del>๋ชจ๋ ์์ฑ์์๋ explicitํ๊ฒ this();๋ฅผ ์ฐ์ง ์์๋ implicitํ๊ฒ this();๊ฐ ํธ์ถ์ด ๋๋ค.</del><br>๋ชจ๋ ์์ฑ์์๋ explicitํ๊ฒ super();๋ฅผ ์ฐ์ง ์์๋ implicitํ๊ฒ super();์ด ํธ์ถ์ด ๋๋ค. ์ด๋ ์ดํ์ ์์ ์์์ ์ดํด๋ณด๋ฉฐ ๋ค์ ๋ณด๊ฒ ๋ค.</p><blockquote><p>Q2. final์ ์ธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์๊ฐ?</p></blockquote><p>์์์ ๋ง์ ๋ final, ์์ฑ์ ๋ง์ ๋ abstract๋ก ์ธ์งํ์!<br>String์ final๋ก ์ ์ธ๋์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์๋๋ฐ ์ด์ฒ๋ผ ์์๋ฐ์ ํด๋์ค๊ฐ ๋ฉ์๋๋ค์ ์ค๋ฒ๋ผ์ด๋ฉํ๊ฒ ๋๋ค๋ฉด ํด๋์ค์ ๋ชฉ์ ์ด ๋ฌ๋ผ์ ธ์ ์์์์ฒด๋ฅผ ๋ง๊ธฐ์ํ์ฌ final class๋ฅผ ์ ์ํ๊ฒ ๋๋ค. ๋จ, ์ ํํ๋ ์ค๋ฒ๋ผ์ด๋ฉ๋ง ๋ง์ผ๋ ค๋ฉด ๋ฉ์๋๋ฅผ final๋ก ์ ์ํ๋ฉด๋๋ค.</p><br><hr><br><h2 id="Day06-์์-1"><a href="#Day06-์์-1" class="headerlink" title="Day06 ์์"></a>Day06 ์์</h2><h3 id="์๋ฐ-์์์-ํน์ง"><a href="#์๋ฐ-์์์-ํน์ง" class="headerlink" title="์๋ฐ ์์์ ํน์ง"></a>์๋ฐ ์์์ ํน์ง</h3><hr><p>์ฒซ๋ฒ์งธ๋ก Single inheritance๋ง ๋๋ค๋ ๊ฒ์ด๋ค. C++๊ฐ์ ์ธ์ด๋ ๋ค์ค์์์ ํ์ฉํ๋ค.<br>์ฌ๋ฌ ์กฐ์ํด๋์ค๋ก๋ถํฐ ์์๋ฐ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด๋ค. ๋ค์ค์์์ ํ์ฉํ๋ฉด ์ฌ๋ฌ ํด๋์ค๋ก๋ถํฐ ์์๋ฐ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋ณตํฉ์ ์ธ ๊ธฐ๋ฅ์ ๊ฐ์ง ํด๋์ค๋ฅผ ์ฝ๊ฒ ์์ฑํ ์ ์๋ฐ๋ ์ฅ์ ์ด ์์ง๋ง, ํด๋์ค๊ฐ์ ๊ด๊ณ๊ฐ ๋งค์ฐ ๋ณต์กํด์ง๋ค๋ ๊ฒ๊ณผ ์๋ก ๋ค๋ฅธ ํด๋์ค๋ก๋ถํฐ ์์๋ฐ์ ๋ฉ์๋๋ ๋ฉค๋ฒ๊ฐ์ ์ด๋ฆ์ด ๊ฐ์ ๊ฒฝ์ฐ ๊ตฌ๋ณํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๋จ์ ์ด ์๋ค. ์ด์ ๋ฐ๋ฅธ rule์ด ์กด์ฌํ์ฌ ์ด๋ค๋ฉ์๋๊ฐ ์ด๋์ ์์๋์๋์ง ํ์ธํ์ง ๋ชปํ๋ฉด ์ฐพ๊ธฐ์ด๋ ค์ด ์ค๋ฅ๊ฐ ์๊ธฐ๊ธฐ ๋ง๋ จ์ด๋ค.</p><p>์ด๋ฌํ ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์ค์์์ ์ฅ์ ์ ํฌ๊ธฐํ๊ณ ๋จ์ผ์์๋ง์ ํ์ฉํ๋ค.</p><p>๋จ์ผ ์์์ด ํ๋์ ์กฐ์ํด๋์ค๋ง์ ๊ฐ์ง ์ ์๊ธฐ ๋๋ฌธ์ ๋ค์ค์์์ ๋นํด ๋ถํธํ ์ ์ด ์์ง๋ง ํด๋์ค๊ฐ์ ๊ด๊ณ๊ฐ ๋ ๋ช
ํํด์ง๊ณ ์ฝ๋๋ฅผ ์ ๋ขฐํ ์ ์๊ฒ ๋ง๋ค์ด์ค๋ค๋ ์ ์์๋ ์ฅ์ ์ ๊ฐ์ง๊ฒ ๋๋ค.</p><p>๋๋ฒ์งธ ํน์ง์ผ๋ก๋ ๋ชจ๋ ํด๋์ค๋ implicitํ๊ฒ Object์ ์๋ธํด๋์ค๋ผ๋ ์ ์ด๋ค. ์ด ๋ถ๋ถ์ ์ ์ ํ์ Objectํด๋์ค๋ฅผ ๋ค๋ฃจ๋ฉด์ ๋ค์ ์๊ธฐํด๋ณด๊ฒ ๋ค.</p><h3 id="super-keyword"><a href="#super-keyword" class="headerlink" title="super keyword"></a>super keyword</h3><hr><p>super๋ ์์ ํด๋์ค์์ ์กฐ์ ํด๋์ค๋ก๋ถํฐ ์์๋ฐ์ ๋ฉค๋ฒ๋ฅผ ์ฐธ์กฐํ๋๋ฐ ์ฌ์ฉ๋๋ ์ฐธ์กฐ๋ณ์์ด๋ค.</p><p>๋ ๊ฐ๋จํ๊ฒ ๋งํ์๋ฉด ์์๋ฐ์ ํด๋์ค๊ฐ ์กฐ์ ํด๋์ค์ ๋ฉค๋ฒ๋ฅผ ๋ณด๊ธฐ์ํด ์์ ๋ถ์ฌ์ผํ๋ keyword์ธ ๊ฒ์ด๋ค.</p><p>๋ฉค๋ฒ๋ณ์์ ์ง์ญ๋ณ์๊ฐ์ ๊ตฌ๋ณํ๊ธฐ ์ํด this keyword๋ฅผ ๋ถ์ธ๊ฒ๊ณผ ๋น์ทํ ์ด์น์ด๋ค.</p><h4 id="Example"><a href="#Example" class="headerlink" title="Example"></a>Example</h4><br><ol><li>๋ถ๋ชจ ํด๋์ค์ ๋ฉค๋ฒ ๋ณ์ ์ ๊ทผ : super.๋ฉค๋ฒ๋ณ์</li><li>๋ถ๋ชจ ํด๋์ค์ ๋ฉค๋ฒ ๋ฉ์๋ ์ ๊ทผ : super.๋ฉค๋ฒ๋ฉ์๋(๋งค๊ฐ๋ณ์)</li><li>๋ถ๋ชจ ํด๋์ค์ ์์ฑ์ ํธ์ถ : super(๋งค๊ฐ๋ณ์)</li></ol><p>๋จ ์ฃผ์ํด์ผํ ์ ์ <strong>๋ฐ๋์ ์์ ํด๋์ค์ ์์ฑ์ ์ฒซ ๋ผ์ธ์์ ๋ถ๋ชจ ์์ฑ์๋ฅผ ํธ์ถํด์ผํ๋ค๋ ์ ์ธ๋ฐ ์ฐ์ง ์์๋ implicitํ๊ฒ ํธ์ถ์ด ๋๋ค.</strong></p><h4 id="super"><a href="#super" class="headerlink" title="super()"></a>super()</h4><hr><p><code>super()</code>๋ ๋ถ๋ชจํด๋์ค์ ์์ฑ์๋ฅผ ํธ์ถํ ๋ ์ฌ์ฉ๋๋ค. ์ด๋ฅผ <code>constructor chaining</code>์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.</p><h3 id="Method-overriding"><a href="#Method-overriding" class="headerlink" title="Method overriding"></a>Method overriding</h3><hr><p>์ค๋ฒ๋ผ์ด๋ฉ์ด๋ ์กฐ์ ํด๋์ค๋ก๋ถํฐ ์์๋ฐ์ ๋ฉ์๋์ ๋ด์ฉ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋งํ๋ค.<br>๊ทธ์ ๋ฐ๋ฅธ ์กฐ๊ฑด์ ๋ค์๊ณผ ๊ฐ์ด ์ธ๊ฐ๊ฐ ์๋ค.</p><ol><li>์ด๋ฆ์ด ๊ฐ์์ผํ๋ค.</li><li>๋งค๊ฐ๋ณ์๊ฐ ๊ฐ์์ผํ๋ค.</li><li>๋ฐํํ์
์ด ๊ฐ์์ผํ๋ค.</li></ol><p>์ฆ, ์ ์ธ๋ถ๊ฐ ๊ฐ์์ผํ๋ค๋ ๊ฒ์ด๋ค. ๋ค๋ง <code>access modifier</code>์ <code>exception</code>์ ์ ํ๋ ์กฐ๊ฑด ํ์์๋ง ๋ค๋ฅด๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค.</p><ol><li>access modifier(์ ๊ทผ์ ์ด์)๋ ์กฐ์ํด๋์ค์ ๋ฉ์๋๋ณด๋ค ์ข์ ๋ฒ์๋ก ๋ณ๊ฒฝํ ์ ์๋ค.</li></ol><ul><li>๋ง์ผ ์กฐ์ํด๋์ค์ ์ ๊ทผ์ ์ด์๊ฐ protected๋ผ๋ฉด ์ค๋ฒ๋ผ์ด๋ฉํ ์ protected๋ public์ด์ด์ผํ๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์๋ ๊ฐ์ ๋ฒ์์ ์ ๊ทผ ์ ์ด์๋ฅผ ์ฌ์ฉํ๋ค. ์ ๊ทผ๋ฒ์์ ์์๋ public, protected, (default), private์ด๋ค.</li></ul><ol start="2"><li>์กฐ์ํด๋์ค์ ๋ฉ์๋๋ณด๋ค ๋ง์ ์์ ์์ธ๋ฅผ ์ ์ธํ ์ ์๋ค.</li></ol><p>๋ํ, ์ธ์คํด์ค๋ฉ์๋๋ฅผ static๋ฉ์๋๋ก, static๋ฉ์๋๋ฅผ ์ธ์คํด์ค๋ฉ์๋๋ก ๋ณ๊ฒฝํ ์ ์๋ค.</p><p>์กฐ์ ํด๋์ค์ ์ ์๋ static๋ฉ์๋๋ฅผ ์์ ํด๋์ค์์ ๋๊ฐ์ ์ด๋ฆ์ static๋ฉ์๋๋ก ์ ์ํ ์ ์์ง๋ง ์ด๋ ๊ฐ ํด๋์ค์ ๋ณ๊ฐ์ static๋ฉ์๋๋ฅผ ์ ์ํ ๊ฒ์ผ ๋ฟ ์ค๋ฒ๋ผ์ด๋ฉํ ๊ฒ์ด ์๋๋ค.</p><p>static๋ฉค๋ฒ๋ค์ ์์ ๋ค์ด ์ ์๋ ํด๋์ค์ ๋ฌถ์ฌ์๋ค๊ณ ์๊ฐํ๋ฉด ์ข๋ค.</p><h4 id="Example-1"><a href="#Example-1" class="headerlink" title="Example"></a>Example</h4><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Point</span> </span>{</span><br><span class="line"> <span class="keyword">int</span> x;</span><br><span class="line"> <span class="keyword">int</span> y;</span><br><span class="line"></span><br><span class="line"> <span class="function">String <span class="title">getLocation</span><span class="params">()</span></span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"x :"</span> + x + <span class="string">", y :"</span> +y;</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Point3D</span> <span class="keyword">extends</span> <span class="title">Point</span></span>{</span><br><span class="line"> <span class="keyword">int</span> z;</span><br><span class="line"> <span class="function">String <span class="title">getLocation</span><span class="params">()</span></span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"x :"</span> + x + <span class="string">", y :"</span> +y + <span class="string">", z :"</span> + z;</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>์์ฒ๋ผ ์์์ ๋ฐ์ ํ์ ์๋ ์ ์๋์ด์๋ ๋ฉ์๋๋ฅผ ์์ ๊ท์น์ ๋ฐ๋ผ ์ฌ์ ์ํ๋ ๊ฒ์ด ์ค๋ฒ๋ผ์ด๋ฉ(overriding)์ด๋ค.</p><h3 id="Dynamic-Method-Dispatch"><a href="#Dynamic-Method-Dispatch" class="headerlink" title="Dynamic Method Dispatch"></a>Dynamic Method Dispatch</h3><hr><p>Runtime polymorphism. โ๊ฐ์ ํด๋์ค๋ฅผ ์์ํ๊ณ ์๋ ์ฌ๋ฌ ํด๋์ค ์ค ์ด๋ ์๋ธํด๋์ค๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ๊ฐโ๋ฅผ ๋ฐํ์ ์์ ๊น์ง ๋ฏธ๋ฃธ์ผ๋ก์, ํด๋์ค ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๋ ํ
ํฌ๋์ด๋ค.</p><h4 id="Visitor-Pattern"><a href="#Visitor-Pattern" class="headerlink" title="Visitor Pattern"></a>Visitor Pattern</h4><br><p align = 'center'><img src = "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=http%3A%2F%2Fcfile5.uf.tistory.com%2Fimage%2F9944383359DD815E11EC68"></p><p>์ค๋ฅธ์ชฝ์๋ Composite ํจํด์ผ๋ก ๊ตฌํ ๋ File๊ณผ Directory๋ก ์ด๋ฃจ์ด์ง ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์๋ค.</p><p>๋ค๋ง, ๋ฐฉ๋ฌธ์๋ฅผ ์์ฉํ๊ธฐ ์ํด Element ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์์ accept() ๋ฉ์๋๋ฅผ ๊ฐ๊ฐ ๊ตฌํํ๊ณ ์์ผ๋ฉฐ ๊ฐ element์ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ์ฐ์ฐ ๋ถ๋ถ์ด ๋ฐฉ๋ฌธ์์์ ์ด๋ฃจ์ด์ง๋ค.</p><p>์ผ์ชฝ์๋ ๋ฐฉ๋ฌธ์๋ก ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ฐฉ๋ฌธํ๋ฉด์ ํ์ํ ์ฐ์ฐ์ ์ํํ๋ค. ๊ฐ element์ ์ ๊ทผํ๊ธฐ ์ํ visit๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ๋ฐ ์ค๋ฒ๋ก๋ฉ์ ํ๊ณ ์๋ค.</p><p><strong><a href="https://lktprogrammer.tistory.com/58">์์ </a></strong></p><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">interface</span> <span class="title">Element</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">abstract</span> <span class="keyword">void</span> <span class="title">accept</span><span class="params">(Visitor v)</span></span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">abstract</span> <span class="class"><span class="keyword">class</span> <span class="title">Entry</span> <span class="keyword">implements</span> <span class="title">Element</span> </span>{</span><br><span class="line"> String name;</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">Entry</span><span class="params">(String name)</span></span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> <span class="keyword">this</span>.name = name;</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">abstract</span> <span class="keyword">void</span> <span class="title">add</span><span class="params">(Entry entry)</span></span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>๋ฐฉ๋ฌธ์๋ฅผ ์์ฉํ๊ธฐ ์ํ accept() ๋ฉ์๋๋ฅผ ์ ์ํ๋ ์ธํฐํ์ด์ค Element์ File๊ณผ Directory๊ฐ ๊ณตํต์ ์ผ๋ก ๊ตฌํ ํด์ผ ํ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๋ ์์ ํด๋์ค Entry๋ฅผ ์ ์ํ๋ค.</p><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">File</span> <span class="keyword">extends</span> <span class="title">Entry</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">File</span><span class="params">(String name)</span></span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> <span class="keyword">super</span>(name);</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">add</span><span class="params">(Entry entry)</span></span>{}</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">accept</span><span class="params">(Visitor v)</span></span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> v.visit(<span class="keyword">this</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Directory</span> <span class="keyword">extends</span> <span class="title">Entry</span> </span>{</span><br><span class="line"></span><br><span class="line"> ArrayList<Entry> directory = <span class="keyword">new</span> ArrayList(); <span class="comment">//์์ ๊ฐ์ฒด๋ฅผ ๋ด๊ธฐ ์ํ ArrayList</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">Directory</span><span class="params">(String name)</span></span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> <span class="keyword">super</span>(name);</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">add</span><span class="params">(Entry entry)</span> <span class="comment">//์์ ๊ฐ์ฒด ์ถ๊ฐ</span></span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> directory.add(entry);</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">accept</span><span class="params">(Visitor v)</span></span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> v.visit(<span class="keyword">this</span>); <span class="comment">//์ด๋ visit() ๋ฉ์๋๋ฅผ ํธ์ถํ ์ง ๊ฒฐ์ ๋ฉ๋๋ค.</span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>๋ฐ์ดํฐ ๊ตฌ์กฐ์ ํด๋นํ๋ File๊ณผ Directory์ด๋ค.</p><p>์์ Compositeํจํด์์๋ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ์ฐ์ฐ์ ์ด๊ณณ์์ ์ด๋ฃจ์ด์ก๋ ๋ฐ๋ฉด์ ์ง๊ธ์ ๋ฐฉ๋ฌธ์๋ฅผ ์์ฉํ๋ accept() ๋ฉ์๋๋ฅผ ๊ตฌํํ๊ณ ์๋ค.</p><p>accept() ๋ด์ฉ์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ Visitor ๊ฐ์ฒด๋ฅผ ํตํ์ฌ ์๊ธฐ ์์ ์ ์ธ์๋ก ํ๋ visit() ๋ฉ์๋๋ฅผ ํธ์ถ ํ๊ณ ์๋ค.</p><p>์ดํด ๋ณผ ๊ฒ์ visit() ๋ฉ์๋๋ File๊ณผ Directory์์ ์๊ธฐ ์์ ์ ์ธ์๋ก ํด์ ํธ์ถ์ด ์ด๋ฃจ์ด์ง๊ณ ์๋ค.</p><p>์ด๋ File์ ๋ํ visit() ๋ฉ์๋๊ฐ ํธ์ถ์ด ๋ ์ง Directory์ ๋ํ visit()๊ฐ ํธ์ถ์ด ๋ ์ง ๊ฒฐ์ ์ด ๋๋ค.</p><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">abstract</span> <span class="class"><span class="keyword">class</span> <span class="title">Visitor</span> </span>{</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">abstract</span> <span class="keyword">void</span> <span class="title">visit</span><span class="params">(File file)</span></span>;</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">abstract</span> <span class="keyword">void</span> <span class="title">visit</span><span class="params">(Directory directory)</span></span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">ViewVisitor</span> <span class="keyword">extends</span> <span class="title">Visitor</span> </span>{</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String Path=<span class="string">""</span>;</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">visit</span><span class="params">(File file)</span></span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> System.out.println(Path + <span class="string">"/"</span>+file.name);</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">visit</span><span class="params">(Directory dic)</span></span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> Path = Path + <span class="string">"/"</span> + dic.name;</span><br><span class="line"> System.out.println(Path);</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>; i<dic.directory.size();i++)</span><br><span class="line"> {</span><br><span class="line"> dic.directory.get(i).accept(<span class="keyword">this</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>Visitor ํด๋์ค๋ ๋ฐฉ๋ฌธ์๋ค์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ฐฉ๋ฌธํ๊ธฐ ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๊ณ ์๋ค.</p><p>ViewVisitor ํด๋์ค๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ฐฉ๋ฌธํ๋ฉด์ ๊ฐ Element์ ํ์ฌ ๊ฒฝ๋ก๋ฅผ ์ถ๋ ฅํด์ฃผ๋ ์ญํ ์ ํ๋ค.</p><p>visit() ๋ผ๋ ๊ฐ์ ์ด๋ฆ์ผ๋ก ํ๋๋ Directory๋ฅผ ์ธ์๋ก ๊ฐ๋ ๋ค๋ฅธ ํ๋๋ File๋ฅผ ์ธ์๋ก ๊ฐ๋ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ก๋ฉ์ด ๋์ด ์๋ ์ํ์ด๋ค.</p><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Main</span> </span>{</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String argsp[])</span></span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> Directory root = <span class="keyword">new</span> Directory(<span class="string">"root"</span>);</span><br><span class="line"> Directory bin = <span class="keyword">new</span> Directory(<span class="string">"bin"</span>);</span><br><span class="line"> Directory Lkt = <span class="keyword">new</span> Directory(<span class="string">"Lkt"</span>);</span><br><span class="line"> File file1 = <span class="keyword">new</span> File(<span class="string">"file1"</span>);</span><br><span class="line"> File file2 = <span class="keyword">new</span> File(<span class="string">"file2"</span>);</span><br><span class="line"> File file3 = <span class="keyword">new</span> File(<span class="string">"file3"</span>);</span><br><span class="line"> File file4 = <span class="keyword">new</span> File(<span class="string">"file4"</span>);</span><br><span class="line"></span><br><span class="line"> root.add(file1);</span><br><span class="line"> bin.add(file2);</span><br><span class="line"> bin.add(file3);</span><br><span class="line"> Lkt.add(file4);</span><br><span class="line"> root.add(Lkt);</span><br><span class="line"> root.add(bin);</span><br><span class="line"></span><br><span class="line"> root.accept(<span class="keyword">new</span> ViewVisitor()); <span class="comment">//๊ฒฝ๋ก ์ถ๋ ฅ</span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>์ด์ฒ๋ผ Visitor ํจํด์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์ฐ์ฐ์ ๋ถ๋ฆฌํจ์ผ๋ก์จ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด์ ์๋ก์ด ์ฐ์ฐ์ ์ฝ๊ฒ ํ ์ ์๋ค.</p><p>๋ง์ฝ ์๋ก์ด ์ฐ์ฐ์ ์ถ๊ฐํ๊ณ ์ ํ๋ค๋ฉด ์๋ก์ด visit() ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ฉด ๋๋ค.</p><h3 id="Abstract-class"><a href="#Abstract-class" class="headerlink" title="Abstract class"></a>Abstract class</h3><hr><p>์ถ์ํด๋์ค๋ ์ธ์คํด์ค๋ก ์์ฑํ ์ ์๊ณ ์์์ ํตํด์ ์์ํด๋์ค์ ์ํด ์์ฑ๋ ์ ์๋ ํด๋์ค์ด๋ค.</p><p>์ถ์ํด๋์ค ์์ฒด๋ก๋ ํด๋์ค๋ก์์ ์ญํ ์ด ๋ถ๋ฝ๋ฅํ์ง๋ง, ์๋ก์ด ํด๋์ค๋ฅผ ์์ฑํ๋๋ฐ ์์ด์ ๋ฐํ์ด ๋๋ ์กฐ์ํด๋์ค๋ก์ ์ค์ํ ์๋ฏธ๊ฐ ์๋ค. ํด๋์ค์ ํ์ ์ ๊ณตํด์ค๋ค๊ณ ๋ณด๋ฉด ์ข๋ค.</p><figure class="highlight java"><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="keyword">abstract</span> <span class="class"><span class="keyword">class</span> <span class="title">Player</span></span>{</span><br><span class="line"> <span class="function"><span class="keyword">abstract</span> <span class="keyword">void</span> <span class="title">play</span><span class="params">(<span class="keyword">int</span> pos)</span></span>;</span><br><span class="line"> <span class="function"><span class="keyword">abstract</span> <span class="keyword">void</span> <span class="title">stop</span><span class="params">()</span></span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>์์ ์์ ์ฒ๋ผ ์ ์ธ๋ถ๋ง ์ ์๋์ด์๊ณ ๊ตฌํ๋ถ๋ ์ ์๋์ด์์ง ์์ ํน์ง์ ์ง๋๋ค. ์ง์ง ๋ง๊ทธ๋๋ก ํ๋ง ์ก์์ค ๊ฒ์ด๋ค.</p><p>๋จ, ์ถ์๋ฉ์๋๋ฅผ ๊ตฌํํด๋จ๋ค๋ฉด ์์ํด๋์ค์์๋ ๋ฐ๋์ ๊ตฌํ์ ์์ผ์ผํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์์๋ฐ์ ํด๋์ค ๋ํ ์ถ์ํด๋์ค๋ก ์ ์๋๋ค.</p><p align= 'center'><img src = "/image/1592.jpg"></p><p>์์ฒ๋ผ ์ปดํ์ผ ์๋ฌ๊ฐ ๋๊ฒ๋๋ค.</p><h3 id="Object-class"><a href="#Object-class" class="headerlink" title="Object class"></a>Object class</h3><hr><p>์๊น ๋งํ๋ฏ Objectํด๋์ค๋ ๋ชจ๋ ํด๋์ค ์์๊ณ์ธต๋์ ์ต์์์ ์๋ ์กฐ์ํด๋์ค์ด๋ค.</p><p>๋ค๋ฅธ ํด๋์ค๋ก๋ถํฐ ์์ ๋ฐ์ง ์๋ ์ฐ๋ฆฌ๊ฐ ์๊ฐํ๋ ๊ธฐ์กด์ ์ต์์ ์กฐ์ํด๋์ค๋ ์๋์ ์ผ๋ก Objectํด๋์ค๋ก๋ถํฐ ์์๋ฐ๊ฒ ํจ์ผ๋ก์จ ์ด๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.</p><p>์ค์ ๋ก ์์ ์์์ Playerํด๋์ค๋ฅผ <code>Player instanceof Object</code>๋ฌธ์ <code>True</code>๊ฐ ๋์จ๋ค.</p><p align = "center"><img src = "/image/1596.jpg"></p><p>Objectํด๋์ค๋ ์์ ๊ฐ์ ๋ฉ์๋๋ค์ด ์ ์๋์ด์์ผ๋ฉฐ ๋ชจ๋ ํด๋์ค๋ค์ ์์ ๋ฉ์๋๋ค์ ์ฌ์ฉํ ์ ์๋ค.</p><hr><h4 id="toString-NaN"><a href="#toString-NaN" class="headerlink" title="toString()"></a>toString()</h4><br><p><strong>๊ธฐ๋ณธ๋์</strong> : ๊ฐ์ฒด์ ํด์์ฝ๋๋ฅผ ์ถ๋ ฅํ๋ค.<br><strong>Override ๋ชฉ์ </strong> : ๊ฐ์ฒด์ ์ ๋ณด๋ฅผ ๋ฌธ์์ด ํํ๋ก ํํํ๊ณ ์ ํ ๋<br><strong>toString() ์ ์ํ์ ์๋์ ๊ฐ๋ค.</strong></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">getClass().getName() + <span class="string">'@'</span> + Integer.toHexString(hashCode())</span><br></pre></td></tr></table></figure><hr><h4 id="equals"><a href="#equals" class="headerlink" title="equals()"></a>equals()</h4><p><strong>๊ธฐ๋ณธ๋์</strong> : โ==โ ์ฐ์ฐ ๊ฒฐ๊ณผ ๋ฐํ</p><p><strong>override ๋ชฉ์ </strong> : ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ์ ์์นํ๋ ๊ฐ์ฒด์ฌ๋ ๋
ผ๋ฆฌ์ ์ผ๋ก ๋์ผํจ์ ๊ตฌํํ๊ธฐ ์ํจ.</p><p>equals()๋ฅผ ์ฌ์ฉํด ๋ ๊ฐ์ฒด์ ๋์ผํจ์ ๋
ผ๋ฆฌ์ ์ผ๋ก overrideํ ์ ์๋ค.</p><p><strong>โ๋ฌผ๋ฆฌ์ ๋์ผํจโ</strong> - ๊ฐ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ์ ์ฃผ์๊ฐ์ ๊ฐ๋ ๊ฒ์ ์๋ฏธ</p><p><strong>โ๋
ผ๋ฆฌ์ ๋์ผํจโ</strong> - ๋ฌผ๋ฆฌ์ ์ผ๋ก๋ ๋ค๋ฅธ ์์น์ ์์ง๋ง ๊ฐ์ id์ ํ์๊ฐ์ฒด, ๊ฐ์ id์ ์ฃผ๋ฌธ๊ฐ์ฒด์ ๊ฐ์ด ๋๋ฉ์ธ์ ๊ตฌ๋ถํ ์ ์๋ ๊ณ ์ ํ ๊ฐ ๋ฑ์ ์ํด ๋์ผํ ๊ฒ์ ์๋ฏธ</p><hr><h4 id="hashCode"><a href="#hashCode" class="headerlink" title="hashCode()"></a>hashCode()</h4><p><strong>ํด์์ฝ๋๋,</strong> jvm์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ณํํด์ ๋ถ์ฌํ๋ ์ฝ๋.</p><p>์ค์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ๊ณผ๋ ๋ณ๊ฐ์ ๊ฐ์ด๋ฉฐ ์ค์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ System ํด๋์ค์ identityHashCode()๋ก ํ์ธํ ์ ์๋ค.</p><p><strong>๊ธฐ๋ณธ๋์ :</strong> JVM์ด ๋ถ์ฌํ ์ฝ๋๊ฐ. ์ธ์คํด์ค๊ฐ ์ ์ฅ๋ ๊ฐ์๋จธ์ ์ ์ฃผ์๋ฅผ 10์ง์๋ก ๋ฐํํ๋ค.</p><p><strong>override ๋ชฉ์ </strong> : ๋ ๊ฐ์ ์๋ก ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ์ ์์นํ ๊ฐ์ฒด๊ฐ ๋์ผ์ฑ์ ๊ฐ๊ธฐ ์ํจ.</p><p><strong>์๋ฐ์์์ ๋์ผ์ฑ</strong></p><p>equals()์ ๋ฐํ๊ฐ์ด true, hashCode() ๋ฐํ๊ฐ์ด ๋์ผํจ์ ์๋ฏธํ๋ค.</p><p>โ <strong>๋ณดํต equals()์ hashCode()๋ ํจ๊ป override ํ๋ค.</strong></p><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">User</span></span>{</span><br><span class="line"><span class="keyword">int</span> id;</span><br><span class="line">String name;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="title">User</span><span class="params">(<span class="keyword">int</span> id, String name)</span></span>{</span><br><span class="line"><span class="keyword">this</span>.id = id;</span><br><span class="line"><span class="keyword">this</span>.name = name;</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">int</span> <span class="title">getId</span><span class="params">()</span></span>{</span><br><span class="line"><span class="keyword">return</span> id;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">equals</span><span class="params">(Object obj)</span></span>{</span><br><span class="line"><span class="keyword">if</span>(obj <span class="keyword">instanceof</span> User){</span><br><span class="line"><span class="keyword">return</span> <span class="keyword">this</span>.getId() == ((User)obj).getId();</span><br><span class="line">}<span class="keyword">else</span>{</span><br><span class="line"><span class="keyword">return</span> <span class="keyword">false</span>;</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">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</span><br><span class="line"></span><br><span class="line"> User user1 = <span class="keyword">new</span> User(<span class="number">1001</span>, <span class="string">"ํ๊ธธ๋"</span>);</span><br><span class="line"> User user2 = <span class="keyword">new</span> User(<span class="number">1001</span>, <span class="string">"ํ๊ธธ๋"</span>);</span><br><span class="line"></span><br><span class="line"> System.out.println(<span class="string">"user1.equals(user2): "</span> + user1.equals(user2));</span><br><span class="line"> System.out.println(<span class="string">"user1.hashCode(): "</span> + user1.hashCode());</span><br><span class="line"> System.out.println(<span class="string">"user2.hashCode(): "</span> + user2.hashCode());</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><strong>์ main ๋ฉ์๋ ์คํ ๊ฒฐ๊ณผ</strong></p><ul><li>equals ๋ฉ์๋๋ฅผ overriding ํ์ฌ ๊ฐ์์ ํ์ธ</li><li>hashCode๋ ๋ณ๋ ์ฌ์ ์ ํ์ง ์์์์ผ๋ก ์๋์ ๊ฐ์ด ๋ค๋ฅด๊ฒ ์ถ๋ ฅ</li></ul><p>user1.equals(user2): true<br>user1.hashCode(): 901506536<br>user2.hashCode(): 747464370</p><p><code>Process finished with exit code 0</code></p><hr><h4 id="clone"><a href="#clone" class="headerlink" title="clone()"></a>clone()</h4><p>ํด๋น ์ธ์คํด์ค๋ฅผ ๋ณต์ ํ์ฌ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค.</p><p><strong>but.</strong> ๋จ์ง ํ๋์ ๊ฐ๋ง ๋ณต์ฌํจ์ผ๋ก, ํ๋์ ๊ฐ์ด ๋ฐฐ์ด์ด๋ ์ธ์คํด์ค๋ฉด ์ ๋๋ก ๋ณต์ ํ ์ ์๋ค.</p><p>โ clone() ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ์ฌ ๋ณต์ ๊ฐ ์ ๋๋ก ์ด๋ฃจ์ด์ง๋๋ก ์ฌ์ ์ ํด์ผ ํ๋ค.</p><p>์ด๋ฌํ clone() ๋ฉ์๋๋ ๋ฐ์ดํฐ์ ๋ณดํธ๋ฅผ ์ด์ ๋ก <strong>Cloneable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์ ์ธ์คํด์ค๋ง</strong>์ด ์ฌ์ฉํ ์ ์๋ค.</p><p>Clone ๋ฉ์๋๋ ์ ์คํ๊ฒ ์ค๋ฒ๋ผ์ด๋ํ์. (feat. effective Java)</p><p>Cloneable ์ธํฐํ์ด์ค๋ ๋ณต์ ๋ฅผ ํ์ฉํ๋ ๊ฐ์ฒด๋ผ๋ ๊ฒ์ ์๋ฆฌ๋ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฏน์ค์ธ ์ธํฐํ์ด์ค์ด๋ค. (Mixin Interface)</p><ul><li><p>๋ฏน์ค์ธ ์ธํฐํ์ด์ค์ด๊ธฐ ๋๋ฌธ์ ์์ ์ด clone method๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ๋ ์๋๋ค.</p></li><li><p>Object์ clone์ Cloneable์ implements ํ์ง ์์ผ๋ฉด ์ฌ์ฉํ ์ ์๋ค.</p><p>Cloneable ์ impelemtnsํ class์์ clone์ ํธ์ถํ๋ฉด, ํด๋น ๊ฐ์ฒด์ ๋ณต์ ๋ณธ์ ๋ง๋ค์ด ๋ฐํํ๋ค.</p></li></ul><p>โ ๋ณต์ ๊ฐ์ฒด๋ ์๋ณธ ๊ฐ์ฒด์ ๊ฐ์ ํ๋๋ฅผ ๊ฐ์ง๋ฉฐ ๊ฐ ํ๋์ ๊ฐ๋ ๋ณต์ฌ๋๋ค.</p><p><strong>but</strong>.</p><p><strong>reference๋ฅผ ๊ฐ์ง ๋
์๋ค์ Deep Copy ๊ฐ ์๋ Soft Copy๋ฅผ ์ํํ๋ค๋ ์ ์ ์ฃผ๋ชฉํด์ผํ๋ค.</strong></p><p>clone ๋ฉ์๋๋ ๋ ๋ค๋ฅธ ์์ฑ์์ ๊ฐ๋ค.</p><p>clone ๋ฉ์๋๊ฐ ์๋ณธ ๊ฐ์ฒด์ ์์์ ์ฃผ์ง ์์ผ๋ฉด์ ์๋ณธ๊ณผ ๋ณต์ ๊ฐ์ฒด ๊ฐ์ ์ํธ ์ํฅ๋ ์๋๋ก ํด์ผ ํ๋ค.</p><p>โ ์ฆ, reference์ ๊ฒฝ์ฐ deep copy๋ฅผ ํด์ฃผ์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.</p><p>์ฌ๊ธฐ์ deep copy๋ ํด๋น ๊ฐ์ฒด์ clone์ ํธ์ถํด์ฃผ๋ ๊ฒ๋ง์ผ๋ก ๋๋๋ ๊ฒ์ด ์๋๋ค.</p><ul><li>Collection์ผ ๊ฒฝ์ฐ์๋ Collection ์์ ๋ด์ฉ๋ฌผ๋ค๋ clone ์ ํด์ฃผ๋ ์ง์ ํ Deep Copy๊ฐ ๋์ด์ผ ํ๋ค.</li></ul><hr><h4 id="finalize"><a href="#finalize" class="headerlink" title="finalize()"></a>finalize()</h4><p>finalize() ๋ฉ์๋๋ ์ง์ ํธ์ถํ๋ ๋ฉ์๋๊ฐ ์๋๋ผ ๊ฐ์ฒด๊ฐ HEAP ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ ๋ ๊ฐ๋น์ง ์ฝ๋ ํฐ๊ฐ ํธ์ถํ๋ ๋ฉ์๋์ด๋ค.</p><p>์ด ๋ฉ์๋๊ฐ Override๋์ด ์์ผ๋ฉด ๊ฐ๋ฐ์ง ์ฝ๋ ํฐ๊ฐ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์คํํ๋ค.</p><p>์ฆ, finalize()๋ ๊ฐ์ฒด๊ฐ ํด์ ๋ ๋ ๋ฆฌ์์ค ํด์ , ์์ผ close ๋ฑ์ ํ์ํ ๊ฒ๋ค์ ๊ตฌํํด์ฃผ๋ฉด ๋๋ค.</p><hr><br><br><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><p>Java์ ์ ์<br><a href="https://www.notion.so/e5c33507880b4d098f83a2c4f8f02c04">https://www.notion.so/e5c33507880b4d098f83a2c4f8f02c04</a><br><a href="https://github.com/ByungJun25/study/tree/main/java/whiteship-study/6week#Method-Overriding%EA%B3%BC-Hiding">https://github.com/ByungJun25/study/tree/main/java/whiteship-study/6week#Method-Overriding%EA%B3%BC-Hiding</a><br><a href="https://lktprogrammer.tistory.com/58">https://lktprogrammer.tistory.com/58</a><br><a href="https://blog.naver.com/swoh1227/222181505425">https://blog.naver.com/swoh1227/222181505425</a><br><a href="https://leemoono.tistory.com/20">https://leemoono.tistory.com/20</a></p>]]></content>
<categories>
<category> Java </category>
</categories>
<tags>
<tag> java8 </tag>
</tags>
</entry>
<entry>
<title>[AAIS] E06. Grad-CAM</title>
<link href="2021/02/01/aais-06/"/>
<url>2021/02/01/aais-06/</url>
<content type="html"><![CDATA[<h1 id="Before-start-Check-resources"><a href="#Before-start-Check-resources" class="headerlink" title="Before start Check resources"></a>Before start Check resources</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">!nvidia-smi</span><br></pre></td></tr></table></figure><pre><code>Mon Feb 1 09:11:32 2021+-----------------------------------------------------------------------------+| NVIDIA-SMI 410.104 Driver Version: 410.104 CUDA Version: 10.1 ||-------------------------------+----------------------+----------------------+| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC || Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. ||===============================+======================+======================|| 0 Tesla V100-DGXS... On | 00000000:07:00.0 Off | 0 || N/A 65C P0 286W / 300W | 31558MiB / 32478MiB | 97% Default |+-------------------------------+----------------------+----------------------+| 1 Tesla V100-DGXS... On | 00000000:08:00.0 Off | 0 || N/A 61C P0 228W / 300W | 2630MiB / 32478MiB | 94% Default |+-------------------------------+----------------------+----------------------+| 2 Tesla V100-DGXS... On | 00000000:0E:00.0 Off | 0 || N/A 63C P0 238W / 300W | 5264MiB / 32478MiB | 98% Default |+-------------------------------+----------------------+----------------------+| 3 Tesla V100-DGXS... On | 00000000:0F:00.0 Off | 0 || N/A 63C P0 248W / 300W | 14704MiB / 32478MiB | 96% Default |+-------------------------------+----------------------+----------------------++-----------------------------------------------------------------------------+| Processes: GPU Memory || GPU PID Type Process name Usage ||=============================================================================|+-----------------------------------------------------------------------------+</code></pre><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># using gpu:/2</span></span><br><span class="line"><span class="keyword">import</span> tensorflow <span class="keyword">as</span> tf</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line">os.environ[<span class="string">"CUDA_VISIBLE_DEVICES"</span>] = <span class="string">"2"</span></span><br><span class="line"></span><br><span class="line">gpus = tf.config.experimental.list_physical_devices(<span class="string">'GPU'</span>)</span><br><span class="line"><span class="keyword">if</span> gpus:</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> tf.config.experimental.set_memory_growth(gpus[<span class="number">0</span>], <span class="literal">True</span>)</span><br><span class="line"> <span class="keyword">except</span> RuntimeError <span class="keyword">as</span> e:</span><br><span class="line"> print(e)</span><br></pre></td></tr></table></figure><h1 id="Setup"><a href="#Setup" class="headerlink" title="Setup"></a>Setup</h1><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">import</span> tensorflow <span class="keyword">as</span> tf</span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> keras.applications <span class="keyword">import</span> VGG16</span><br><span class="line"><span class="keyword">from</span> keras <span class="keyword">import</span> layers</span><br><span class="line"><span class="keyword">from</span> keras <span class="keyword">import</span> models</span><br><span class="line"><span class="keyword">from</span> keras.applications.vgg16 <span class="keyword">import</span> preprocess_input, decode_predictions</span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> keras.preprocessing <span class="keyword">import</span> image</span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> keras <span class="keyword">import</span> backend <span class="keyword">as</span> K</span><br><span class="line"><span class="keyword">import</span> cv2</span><br></pre></td></tr></table></figure><h1 id="Using-VGG16-for-Grad-CAM"><a href="#Using-VGG16-for-Grad-CAM" class="headerlink" title="Using VGG16 for Grad-CAM"></a>Using VGG16 for Grad-CAM</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">model = tf.keras.applications.vgg16.VGG16()</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">model.summary()</span><br></pre></td></tr></table></figure><pre><code>Model: "vgg16"_________________________________________________________________Layer (type) Output Shape Param #=================================================================input_1 (InputLayer) [(None, 224, 224, 3)] 0_________________________________________________________________block1_conv1 (Conv2D) (None, 224, 224, 64) 1792_________________________________________________________________block1_conv2 (Conv2D) (None, 224, 224, 64) 36928_________________________________________________________________block1_pool (MaxPooling2D) (None, 112, 112, 64) 0_________________________________________________________________block2_conv1 (Conv2D) (None, 112, 112, 128) 73856_________________________________________________________________block2_conv2 (Conv2D) (None, 112, 112, 128) 147584_________________________________________________________________block2_pool (MaxPooling2D) (None, 56, 56, 128) 0_________________________________________________________________block3_conv1 (Conv2D) (None, 56, 56, 256) 295168_________________________________________________________________block3_conv2 (Conv2D) (None, 56, 56, 256) 590080_________________________________________________________________block3_conv3 (Conv2D) (None, 56, 56, 256) 590080_________________________________________________________________block3_pool (MaxPooling2D) (None, 28, 28, 256) 0_________________________________________________________________block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160_________________________________________________________________block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808_________________________________________________________________block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808_________________________________________________________________block4_pool (MaxPooling2D) (None, 14, 14, 512) 0_________________________________________________________________block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808_________________________________________________________________block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808_________________________________________________________________block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808_________________________________________________________________block5_pool (MaxPooling2D) (None, 7, 7, 512) 0_________________________________________________________________flatten (Flatten) (None, 25088) 0_________________________________________________________________fc1 (Dense) (None, 4096) 102764544_________________________________________________________________fc2 (Dense) (None, 4096) 16781312_________________________________________________________________predictions (Dense) (None, 1000) 4097000=================================================================Total params: 138,357,544Trainable params: 138,357,544Non-trainable params: 0_________________________________________________________________</code></pre><h1 id="Preprocess-the-image"><a href="#Preprocess-the-image" class="headerlink" title="Preprocess the image"></a>Preprocess the image</h1><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></pre></td><td class="code"><pre><span class="line">img_path = <span class="string">'../sungjin/dog/test/bo/bo_26.jpg'</span></span><br><span class="line">img = image.load_img(img_path,target_size=(<span class="number">224</span>,<span class="number">224</span>))</span><br><span class="line">x = image.img_to_array(img)</span><br><span class="line">x = np.expand_dims(x,axis=<span class="number">0</span>)</span><br><span class="line">x = preprocess_input(x)</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">plt.imshow(img)</span><br></pre></td></tr></table></figure><pre><code><matplotlib.image.AxesImage at 0x7f7a885bc520></code></pre><p><img src="/image/output_10_1.png" alt="png"></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></pre></td><td class="code"><pre><span class="line">preds = model.predict(x)</span><br><span class="line">print(preds.shape)</span><br><span class="line">print(<span class="string">'Predicted:'</span>,decode_predictions(preds,top=<span class="number">3</span>)[<span class="number">0</span>])</span><br><span class="line">print(np.argmax(preds[<span class="number">0</span>]))</span><br></pre></td></tr></table></figure><pre><code>(1, 1000)Predicted: [('n02113799', 'standard_poodle', 0.21771519), ('n02111277', 'Newfoundland', 0.19664182), ('n02097130', 'giant_schnauzer', 0.16597004)]267</code></pre><h1 id="About-equation"><a href="#About-equation" class="headerlink" title="About equation"></a>About equation</h1><br><h2 id="Grad-CAM"><a href="#Grad-CAM" class="headerlink" title="Grad-CAM"></a>Grad-CAM</h2><br><p> For each class c in the CNN, GradโCAM is calculated with a linear combination of the k-th feature maps of the convolutional layer $A_k$ and the importance weight ฮฑc<br>K, followed by ReLU activation:</p><br><p align = center><img src ="/image/10.jpg"></p><p align = center><img src = "/image/20.jpg"</p><figure class="highlight python"><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"><span class="comment"># layer which calculate `score class`</span></span><br><span class="line">conv_layer = model.get_layer(<span class="string">"block5_conv3"</span>)</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">heatmap_model = models.Model([model.inputs],[conv_layer.output,model.output])</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">with</span> tf.GradientTape() <span class="keyword">as</span> gtape:</span><br><span class="line"> conv_output, predictions = heatmap_model(x) <span class="comment"># y^c, c</span></span><br><span class="line"> loss = predictions[:, np.argmax(predictions[<span class="number">0</span>])] <span class="comment"># probability</span></span><br><span class="line"> grads = gtape.gradient(loss, conv_output) <span class="comment"># partial-derivative</span></span><br><span class="line"> pooled_grads = K.mean(grads, axis=(<span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>)) <span class="comment"># a_k^c , weight</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">heatmap = tf.reduce_mean(tf.multiply(pooled_grads, conv_output), axis=-<span class="number">1</span>) <span class="comment"># summation weight * filter</span></span><br><span class="line">heatmap = np.maximum(heatmap, <span class="number">0</span>) <span class="comment"># ReLu</span></span><br><span class="line">max_heat = np.<span class="built_in">max</span>(heatmap) <span class="comment"># normalization</span></span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> max_heat == <span class="number">0</span>:</span><br><span class="line"> max_heat = <span class="number">1e-10</span></span><br><span class="line">heatmap /= max_heat</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">plt.matshow(heatmap[<span class="number">0</span>])</span><br></pre></td></tr></table></figure><pre><code><matplotlib.image.AxesImage at 0x7f7c992031c0></code></pre><p><img src="/image/output_17_1.png" alt="png"></p><h1 id="Visualize-Grad-CAM"><a href="#Visualize-Grad-CAM" class="headerlink" title="Visualize Grad-CAM"></a>Visualize Grad-CAM</h1><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># img = mpimg.imread(img_path)</span></span><br><span class="line">img = cv2.imread(img_path)</span><br><span class="line">hm = heatmap[<span class="number">0</span>]</span><br><span class="line">hm = cv2.resize(hm, (img.shape[<span class="number">1</span>],img.shape[<span class="number">0</span>]))</span><br><span class="line">hm = np.uint8(<span class="number">255</span>*hm)</span><br><span class="line">hm = cv2.applyColorMap(hm,cv2.COLORMAP_JET)</span><br><span class="line">superimposed_img = hm * <span class="number">0.8</span> + img</span><br><span class="line"></span><br><span class="line">superimposed_img[superimposed_img > <span class="number">255</span>] = <span class="number">255</span></span><br><span class="line">superimposed_img = superimposed_img.astype(<span class="string">'uint8'</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">plt.imshow(superimposed_img)</span><br></pre></td></tr></table></figure><pre><code><matplotlib.image.AxesImage at 0x7f7c991e5f70></code></pre><p><img src="/image/output_19_1.png" alt="png"></p><h1 id="Return-the-resources"><a href="#Return-the-resources" class="headerlink" title="Return the resources"></a>Return the resources</h1><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> IPython</span><br><span class="line">app = IPython.Application.instance()</span><br><span class="line">app.kernel.do_shutdown(<span class="literal">True</span>)</span><br></pre></td></tr></table></figure><pre><code>{'status': 'ok', 'restart': True}</code></pre>]]></content>
<categories>
<category> AAIS </category>
</categories>
<tags>
<tag> AI </tag>
<tag> AAIS </tag>
<tag> keras </tag>
</tags>
</entry>
<entry>
<title>[Java] Day05 - ํด๋์ค</title>
<link href="2021/01/30/java-day5/"/>
<url>2021/01/30/java-day5/</url>
<content type="html"><![CDATA[<h1 id="Day05-ํด๋์ค"><a href="#Day05-ํด๋์ค" class="headerlink" title="Day05 ํด๋์ค"></a>Day05 ํด๋์ค</h1><hr><h2 id="Before-Start"><a href="#Before-Start" class="headerlink" title="Before Start"></a>Before Start</h2><hr><p>์์ํ๊ธฐ์ ์์ 8์ฃผ์ฐจ ์ธํฐํ์ด์ค๊น์ง๋ ์ฑ์๊ฐ ์์(?) ๊ฒ์ด๋ค. C++์ ๋น์ทํ ์ ์ด ๋ง์ ๋ฟ๋๋ฌ ๊ฐ๋
์ ๋ค๋ฃจ๊ธฐ์๋ ์๊ฐ๊ด๋ฆฌ๋ฅ๋ ฅ์ด ๋ถ์กฑํ๋ค. ๋ฐ๋ผ์, ๊ฐ๋
์ ์๊ณ ์ถ์ ๋ถ๋ค์ ๊ฐ๊ฐ์ ๊ฐ๋
์ ์ ์๊ฐํ ๊ธ์ ๋งํฌํ ํ
๋ ์ฐธ๊ณ ํ๋ฉด ์ข์ ๊ฒ์ด๋ค.</p><h2 id="Review-Day04"><a href="#Review-Day04" class="headerlink" title="Review Day04"></a>Review Day04</h2><hr><blockquote><p>Q1. queue๋ฅผ LinkedList ๊ตฌ์กฐ์ฒด๋ก ์ฌ์ฉํ์ ๋, offer, add / poll,remove / peek,element์ ์ฐจ์ด๋?</p></blockquote><figure class="highlight java"><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"><span class="keyword">boolean</span> offer = queue.offer(<span class="number">1</span>);</span><br><span class="line"><span class="keyword">boolean</span> add = queue.add(<span class="number">1</span>);</span><br></pre></td></tr></table></figure><p>๊ฐ๊ฐ ์ฒซ๋ฒ์งธ๋ ์์ธ๋ฅผ ๋์ง์ง ์๊ณ ๋๋ฒ์งธ๋ ์์ธ๋ฅผ ๋์ง๋ ๊ฒ์ด๋ค. ์ค์ํ ๊ฒ์ ์ผ๊ด์ฑ(consistency)์ด ์๊ฒ ์์ธ๋ฅผ ๋์ง ๊ฒ์ด๋ผ๋ฉด ๋ค ๋์ง๊ณ ์๋๋ฉด ๋ค ๋์ง์ง ๋ง์์ผํ๋ ๊ฒ์ด๋ค.<br>๊ฐ์ ๊ธฐ๋ฅ์ ๊ฐ์ง์ง๋ง ํ๋๋ null๊ฐ์, ํ๋๋ ์๋ฌ๊ฐ ๋๋๊ฒ์ด๋ค. ์์๋ก ๋ค๋ฉด, peek์ ์๋ฌด๊ฒ๋ ์์ ๋๋ null๊ฐ์ ์ฃผ์ง๋ง element๋ ์๋ฌด๊ฒ๋ ์๋๋ฐ ๋ฌด์์ ๋ณด๋ ค๋ ๊ฒ์ด๋๋ ์๋ฌ๋ฅผ ๋์ง๊ฒ ๋๋ ๊ฒ์ด๋ค.</p><h2 id="Day05-ํด๋์ค-1"><a href="#Day05-ํด๋์ค-1" class="headerlink" title="Day05. ํด๋์ค"></a>Day05. ํด๋์ค</h2><h3 id="ํด๋์ค๋"><a href="#ํด๋์ค๋" class="headerlink" title="ํด๋์ค๋?"></a>ํด๋์ค๋?</h3><p>ํด๋์ค๋ฅผ ์ดํดํ๋๋ฐ <a href="https://k3068.tistory.com/29">์ด ๊ธ</a>์ ์ฐธ์กฐํ๋ฉด ์ข์ ๊ฒ์ด๋ค. ๋๋ โJava์ ์ ์โ์ด๋ผ๋ ์ฑ
์ ํตํด ๋ฐ๋ก ๊ณต๋ถํ๊ณ ์๋๋ฐ ๋ธ๋ก๊ทธ ํฌ์คํ
์ ํ๊ธฐ์๋ ๋ฒ๋ ค ๋์ ์ผ์ด ๋๋ฌด ๋ง๋ค. ๋ฐ๋ผ์ ์๋ตํ๋๋ก ํ๊ฒ ๋ค.<br>ํด๋์ค ์ ์ํ๋ ๋ฐฉ๋ฒ, ๊ฐ์ฒด ๋ง๋๋ ๋ฐฉ๋ฒ (new ํค์๋ ์ดํดํ๊ธฐ), ๋ฉ์๋ ์ ์ํ๋ ๋ฐฉ๋ฒ, ์์ฑ์ ์ ์ํ๋ ๋ฐฉ๋ฒ,this ํค์๋ ์ดํดํ๊ธฐ๋ SKIP..</p><h3 id="์ด์งํธ๋ฆฌ-Binary-Tree"><a href="#์ด์งํธ๋ฆฌ-Binary-Tree" class="headerlink" title="์ด์งํธ๋ฆฌ(Binary Tree)"></a>์ด์งํธ๋ฆฌ(Binary Tree)</h3><p>int ๊ฐ์ ๊ฐ์ง๊ณ ์๋ ์ด์ง ํธ๋ฆฌ๋ฅผ ๋ํ๋ด๋ Node ๋ผ๋ ํด๋์ค๋ฅผ ์ ์ํ์ธ์.<br>int value, Node left, right๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํฉ๋๋ค.<br>BinrayTree๋ผ๋ ํด๋์ค๋ฅผ ์ ์ํ๊ณ ์ฃผ์ด์ง ๋
ธ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ถ๋ ฅํ๋ bfs(Node node)์ dfs(Node node) ๋ฉ์๋๋ฅผ ๊ตฌํํ์ธ์.<br>DFS๋ ์ผ์ชฝ, ๋ฃจํธ, ์ค๋ฅธ์ชฝ ์์ผ๋ก ์ํํ์ธ์.</p><figure class="highlight java"><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><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.LinkedList;</span><br><span class="line"><span class="keyword">import</span> java.util.Queue;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">BinarySearchTree</span> </span>{</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="class"><span class="keyword">class</span> <span class="title">Node</span> </span>{</span><br><span class="line"> <span class="keyword">private</span> Node left;</span><br><span class="line"> <span class="keyword">private</span> Node right;</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">int</span> value;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">Node</span><span class="params">(<span class="keyword">int</span> value)</span> </span>{</span><br><span class="line"> <span class="keyword">this</span>.value = value;</span><br><span class="line"> <span class="keyword">this</span>.left = <span class="keyword">null</span>;</span><br><span class="line"> <span class="keyword">this</span>.right = <span class="keyword">null</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// Define Getter</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> Node <span class="title">getLeft</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> left;</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> Node <span class="title">getRight</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> right;</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">getValue</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> value;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// Define Setter</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setLeft</span><span class="params">(Node left)</span> </span>{</span><br><span class="line"> <span class="keyword">this</span>.left = left;</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">setRight</span><span class="params">(Node right)</span> </span>{</span><br><span class="line"> <span class="keyword">this</span>.right = right;</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">setValue</span><span class="params">(<span class="keyword">int</span> value)</span></span>{</span><br><span class="line"> <span class="keyword">this</span>.value = value;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">private</span> Node root;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">BinarySearchTree</span><span class="params">(Node root)</span> </span>{</span><br><span class="line"> <span class="keyword">this</span>.root = root;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> Node <span class="title">getRoot</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> root;</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">BFS</span><span class="params">(Node root)</span> </span>{</span><br><span class="line"> Queue<Node> que = <span class="keyword">new</span> LinkedList<>();</span><br><span class="line"> que.offer(root);</span><br><span class="line"> <span class="keyword">while</span>(!que.isEmpty()) {</span><br><span class="line"> Node node = que.poll();</span><br><span class="line"> System.out.print(node.getValue()+<span class="string">" "</span>);</span><br><span class="line"> <span class="keyword">if</span>(node.getLeft() != <span class="keyword">null</span>)</span><br><span class="line"> que.offer(node.getLeft());</span><br><span class="line"> <span class="keyword">if</span>(node.getRight() != <span class="keyword">null</span>)</span><br><span class="line"> que.offer(node.getRight());</span><br><span class="line"> }</span><br><span class="line"> System.out.println();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// Inorder</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">DFS</span><span class="params">(Node root)</span> </span>{</span><br><span class="line"> <span class="keyword">if</span>(root == <span class="keyword">null</span>)</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> DFS(root.getLeft());</span><br><span class="line"> System.out.print(root.getValue()+<span class="string">" "</span>);</span><br><span class="line"> DFS(root.getRight());</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> Java </category>
</categories>
<tags>
<tag> java8 </tag>
</tags>
</entry>
<entry>
<title>[AAIS] E05. Transfer Learning - 2</title>
<link href="2021/01/29/aais-05/"/>
<url>2021/01/29/aais-05/</url>
<content type="html"><![CDATA[<h1 id="Again-CNN"><a href="#Again-CNN" class="headerlink" title="Again CNN.."></a>Again CNN..</h1><h2 id="Review-the-report"><a href="#Review-the-report" class="headerlink" title="Review the report"></a>Review the report</h2><hr><p>์ง๋ ํฌ์คํธ์์ <code>transfer learning</code>์ ์ด์ฉํ์ฌ ํ์ต์ ์์ผ๋ณด์๋๋ฐ<br>์ด๋ฒ์๊ฐ์๋ <code>transfer learning</code>์ ์จ์ผํ๋ ์ด์ ์ ๋ํด์ ๋ค๋ฃฌ ๋
ผ๋ฌธ์ ๋ฆฌ๋ทฐํด๋ณด๊ฒ ์ต๋๋ค.</p><h3 id="ABSTRACT"><a href="#ABSTRACT" class="headerlink" title="ABSTRACT"></a>ABSTRACT</h3><p>transfer learning์ด๋ ๊ฐ๋จํ ๋งํด ๊ธฐ์กด์ ๋คํธ์ํฌ๋ฅผ ๊ฐ์ ธ์์ ๋ฏธ์ธ์กฐ์ (fine-tuning)ํ์ฌ ์๋ก์ด problem solution์ ์ฐพ๋ ๊ฒ์ด๋ค.</p><p>๊ทธ๋ฌ๋, ๊ธฐ์กด์(source, original)๋คํธ์ํฌ๊ฐ ํ๊ฒ(target)๋คํธ์ํฌ๊ฐ dissimilarํ๋ค๋ฉด ๋น์ฐํ ๋์์ด ์๋ ๊ฒ์ด๋ผ ์๊ฐํ๋ค.<br>์๋ฅผ ๋ค์๋ฉด ImageNet์ ๋ฐ์ดํฐ๋ค์ Caltech101์ด๋ Pascal VOC์ ๋ฐ์ดํฐ๋ค๊ณผ similerํ๋๊น ํ์ตํ๋ ๊ฒ์ด ๋น์ทํ ๊ฒ์ด๋ฏ๋ก <code>transfer learning</code>์ด ์ข์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ๊ฒ์ด๋ผ๊ณ ๋๊ตฌ๋ ์์ํ ์ ์๋ค.<br>๊ทธ๋ฌ๋, ImageNet๊ณผ DAGM ๋ฐ์ดํฐ๋ค์ PCA๋ฅผ ํตํด distribution์ ๋ณด๋ฉด ํ์ฐํ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ค์ด๋ฏ๋ก ๊ธฐ์กด์ ๋คํธ์ํฌ์ ํ์ต๋ฐฉ๋ฒ์ ์ธ๋ชจ๊ฐ ์์ ๊ฒ์ด๋ผ ์๊ฐํ๋ค.<br>ํ์ง๋ง ์ค์ ๋ก <code>transfer learning</code>์ ์งํํด๋ณธ ๊ฒฐ๊ณผ from-scratch๋ก ํ์ตํ ๋คํธ์ํฌ๋ณด๋ค ํจ์ฌ ์ข์ ํจ์จ(accuracy, # of parameters)์ ๊ฐ์ง๋ค๋ ๊ฒ์ด๋ค.</p><br><p><img src="/image/fig1.jpg" alt="fig1"></p><br><h2 id="Why-Transfer-Learning"><a href="#Why-Transfer-Learning" class="headerlink" title="Why Transfer Learning?"></a>Why Transfer Learning?</h2><h3 id="Comparison-of-classification-accuracy-and-training-convergence-time-of-teacher-networks"><a href="#Comparison-of-classification-accuracy-and-training-convergence-time-of-teacher-networks" class="headerlink" title="Comparison of classification accuracy and training convergence time of teacher networks"></a>Comparison of classification accuracy and training convergence time of teacher networks</h3><hr><br><p><img src="/image/table2.jpg" alt="table2"></p><br><p>์์ ํ๋ฅผ ๋ณด๋ฉด ๊ฒฐ๋ก ์ ์ผ๋ก data augmentation์ ์ ์ฉ์ํจ from-scratch ๋คํธ์ํฌ(99.55)๋ transfer learning์ ์ ์ฉ์ํจ ๋คํธ์ํฌ(99.90%)์ฒ๋ผ ๋์ ์ ํ๋๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์์ต๋๋ค. ํ์ง๋ง Convergence Time์ ๋ณด๊ฒ ๋๋ฉด ์ฝ 1300๋ฐฐ๊ฐ๋ ๋ ๋ง์ ์๊ฐ์ ๋ค์ฌ์ผ ํ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.</p>]]></content>
<categories>
<category> AAIS </category>
</categories>
<tags>
<tag> AI </tag>
<tag> AAIS </tag>
<tag> keras </tag>
</tags>
</entry>
<entry>
<title>[AAIS] E04. Transfer Learning - 1</title>
<link href="2021/01/27/aais-04/"/>
<url>2021/01/27/aais-04/</url>
<content type="html"><![CDATA[<h1 id="Transfer-Learning"><a href="#Transfer-Learning" class="headerlink" title="Transfer Learning"></a>Transfer Learning</h1><br><h2 id="About-VGG16"><a href="#About-VGG16" class="headerlink" title="About VGG16"></a>About VGG16</h2><hr><p><a href="https://analysisbugs.tistory.com/65?category=839091">https://analysisbugs.tistory.com/65?category=839091</a><br><br><a href="https://bskyvision.com/504">https://bskyvision.com/504</a><br><br><a href="https://medium.com/@msmapark2/vgg16-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-very-deep-convolutional-networks-for-large-scale-image-recognition-6f748235242a">https://medium.com/@msmapark2/vgg16-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-very-deep-convolutional-networks-for-large-scale-image-recognition-6f748235242a</a></p><p>์ด์ ์ ๋ชจ๋ธ๋ค์ ๋๋ถ๋ถ 7x7 filter, 11x11 filter๋ฅผ ์ฌ์ฉํ์์ผ๋ ์ด๋ถ๋ถ๋ถํฐ 3x3 filter๋ฅผ ์ฌ์ฉํ์์ต๋๋ค.</p><p>์์๋ก 10x10์ 7x7 filter๋ฅผ ํต๊ณผ์ํค๋ฉด feature map์ด 4x4๊ฐ ๋ง๋ค์ด์ง๋๋ฐ ํ์ํ ํ๋ผ๋ฏธํฐ ์๋ 7x7 = 49์ด๊ณ <br>10x10๋ชจ๋ธ์ 3x3 filter๋ฅผ ํ๋ฒํต๊ณผ์ํค๋ฉด 8x8 map > ๋๋ฒํต๊ณผ์ํค๋ฉด 6x6 map > ์ธ๋ฒํต๊ณผ์ํค๋ฉด 4x4 featur map์ด ๋ง๋ค์ด์ง๋๋ฐ ํ์ํ ํ๋ผ๋ฏธํฐ์๋ 3x3x3 = 27๋ก ํฌ๊ฒ ์ค์ด๋ญ๋๋ค.<br><br><br><br></p><blockquote><p>Q.์ด๋ ๊ฒ ํ ๊ฒฝ์ฐ ์ ์ข์๊ฐ? : 3x3์ผ๊ฒฝ์ฐ ํจ๋ฉ์ด 1์ด๋ผ์ ๊ฒฝ๊ณ์ ์ ์ถ๋ก ์ด ๋ ์ฌ์์ง๋ค? + relu๋ฅผ ์ธ๋ฒํต๊ณผํ๊ธฐ ๋๋ฌธ์ <strong>๋น ์ ํ์ฑ์ด ์ฆ๊ฐํ๊ฒ ๋๋ค.</strong></p></blockquote><br><br><hr><h2 id="transfer-learning"><a href="#transfer-learning" class="headerlink" title="transfer learning"></a>transfer learning</h2><ol><li>๋ชจ๋ธ์ ๊ฐ์ ธ์์ โinclude_top=Falseโ๋ฅผ ํตํด ๋ถ๋ฅ์ธต(classification)์ ์ญ์ ์ํจ๋ค.</li><li>โmodel.trainable = Falseโ๋ก ์ค์ ์์ผ์ ๋๊ฒฐ(freezing)์ ์ํจ๋ค.</li><li>global_average_pooling๊ณผ dense layer๋ฅผ ์์ ํ ์ปดํ์ผํ๋ค.</li><li>ImageDataGenerator๋ฅผ ํตํด ์ ์๋์ ๋ฐ์ดํฐ๋ฅผ data augmentation์ ์งํ์ํจ ํ ํ์ต์ํจ๋ค.</li><li>โmodel.trainable = Trueโ๋ก ์ค์ ์์ผ์ ๋๊ฒฐ์ ํด์ ํ๋ค.</li><li>learning_rate์ ๋งค์ฐ ๋ฎ๊ฒ ์ค์ ํ์ฌ fine-tuningํ๊ธฐ</li></ol><br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">!nvidia-smi</span><br></pre></td></tr></table></figure><pre><code>Mon Jan 25 13:30:28 2021+-----------------------------------------------------------------------------+| NVIDIA-SMI 410.104 Driver Version: 410.104 CUDA Version: 10.1 ||-------------------------------+----------------------+----------------------+| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC || Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. ||===============================+======================+======================|| 0 Tesla V100-DGXS... On | 00000000:07:00.0 Off | 0 || N/A 41C P0 49W / 300W | 947MiB / 32478MiB | 0% Default |+-------------------------------+----------------------+----------------------+| 1 Tesla V100-DGXS... On | 00000000:08:00.0 Off | 0 || N/A 39C P0 40W / 300W | 12MiB / 32478MiB | 0% Default |+-------------------------------+----------------------+----------------------+| 2 Tesla V100-DGXS... On | 00000000:0E:00.0 Off | 0 || N/A 40C P0 52W / 300W | 5134MiB / 32478MiB | 0% Default |+-------------------------------+----------------------+----------------------+| 3 Tesla V100-DGXS... On | 00000000:0F:00.0 Off | 0 || N/A 39C P0 38W / 300W | 38MiB / 32478MiB | 0% Default |+-------------------------------+----------------------+----------------------++-----------------------------------------------------------------------------+| Processes: GPU Memory || GPU PID Type Process name Usage ||=============================================================================|+-----------------------------------------------------------------------------+</code></pre><hr><h3 id="1-classification์ธต์-์ญ์ "><a href="#1-classification์ธต์-์ญ์ " class="headerlink" title="1. classification์ธต์ ์ญ์ "></a>1. classification์ธต์ ์ญ์ </h3><br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">keras.application.VGG16(weights,input_shape,include_top)</span><br></pre></td></tr></table></figure><p><code>include_top</code>์ ์ต์๋จ Layer์ธ fully connected layer๋ฅผ ํฌํจ์ํค๋์ง ์ฌ๋ถ๋ฅผ ์ ๋ฌ์ํค๋ ๊ฒ์ผ๋ก pre-trained๋ ๊ฒ์ ์๋กญ๊ฒ predictionํ๊ธฐ์ํด ์ด layer๋ ์ ๊ฑฐ์์ผ์ค๋๋ค.</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> tensorflow <span class="keyword">import</span> keras</span><br><span class="line"></span><br><span class="line">base_model = keras.applications.VGG16(</span><br><span class="line"> weights=<span class="string">'imagenet'</span>, <span class="comment"># Load weights pre-trained on ImageNet.</span></span><br><span class="line"> input_shape=(<span class="number">224</span>, <span class="number">224</span>, <span class="number">3</span>),</span><br><span class="line"> include_top=<span class="literal">False</span>)</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">base_model.summary()</span><br></pre></td></tr></table></figure><pre><code>Model: "vgg16"_________________________________________________________________Layer (type) Output Shape Param #=================================================================input_1 (InputLayer) [(None, 224, 224, 3)] 0_________________________________________________________________block1_conv1 (Conv2D) (None, 224, 224, 64) 1792_________________________________________________________________block1_conv2 (Conv2D) (None, 224, 224, 64) 36928_________________________________________________________________block1_pool (MaxPooling2D) (None, 112, 112, 64) 0_________________________________________________________________block2_conv1 (Conv2D) (None, 112, 112, 128) 73856_________________________________________________________________block2_conv2 (Conv2D) (None, 112, 112, 128) 147584_________________________________________________________________block2_pool (MaxPooling2D) (None, 56, 56, 128) 0_________________________________________________________________block3_conv1 (Conv2D) (None, 56, 56, 256) 295168_________________________________________________________________block3_conv2 (Conv2D) (None, 56, 56, 256) 590080_________________________________________________________________block3_conv3 (Conv2D) (None, 56, 56, 256) 590080_________________________________________________________________block3_pool (MaxPooling2D) (None, 28, 28, 256) 0_________________________________________________________________block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160_________________________________________________________________block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808_________________________________________________________________block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808_________________________________________________________________block4_pool (MaxPooling2D) (None, 14, 14, 512) 0_________________________________________________________________block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808_________________________________________________________________block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808_________________________________________________________________block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808_________________________________________________________________block5_pool (MaxPooling2D) (None, 7, 7, 512) 0=================================================================Total params: 14,714,688Trainable params: 14,714,688Non-trainable params: 0_________________________________________________________________</code></pre><p>์ด์ ๊ณผ ๋ค๋ฅด๊ฒ <code>classification</code> layer์ด ์ญ์ ๋์๋ค. (<code>Flatten</code> ~ <code>Dense</code>)</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">base_model.trainable = <span class="literal">False</span></span><br></pre></td></tr></table></figure><h3 id="2-๊ธฐ์กด์-๋คํธ์ํฌ-๋๊ฒฐ์ํค๊ธฐ"><a href="#2-๊ธฐ์กด์-๋คํธ์ํฌ-๋๊ฒฐ์ํค๊ธฐ" class="headerlink" title="2. ๊ธฐ์กด์ ๋คํธ์ํฌ ๋๊ฒฐ์ํค๊ธฐ"></a>2. ๊ธฐ์กด์ ๋คํธ์ํฌ ๋๊ฒฐ์ํค๊ธฐ</h3><p><code>trainable</code>์ต์
์ False๋ก ํ์ฌ ์๋ก์ด ํ์ต์ ํ ๋์ ๊ธฐ์กด์ ํ์ต๋ ๋คํธ์ํฌ๊ฐ ๊ฐ์ด ํ์ต๋์ง ์๋๋ก ํฉ๋๋ค.</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></pre></td><td class="code"><pre><span class="line">inputs = keras.Input(shape=(<span class="number">224</span>, <span class="number">224</span>, <span class="number">3</span>))</span><br><span class="line"><span class="comment"># Separately from setting trainable on the model, we set training to False</span></span><br><span class="line">x = base_model(inputs, training=<span class="literal">False</span>)</span><br><span class="line">x = keras.layers.GlobalAveragePooling2D()(x)</span><br><span class="line"><span class="comment"># A Dense classifier with a single unit (binary classification)</span></span><br><span class="line">outputs = keras.layers.Dense(<span class="number">1</span>)(x)</span><br><span class="line">model = keras.Model(inputs, outputs)</span><br><span class="line">model.summary()</span><br></pre></td></tr></table></figure><pre><code>Model: "model"_________________________________________________________________Layer (type) Output Shape Param #=================================================================input_2 (InputLayer) [(None, 224, 224, 3)] 0_________________________________________________________________vgg16 (Model) (None, 7, 7, 512) 14714688_________________________________________________________________global_average_pooling2d (Gl (None, 512) 0_________________________________________________________________dense (Dense) (None, 1) 513=================================================================Total params: 14,715,201Trainable params: 513Non-trainable params: 14,714,688_________________________________________________________________</code></pre><h4 id="about-layer"><a href="#about-layer" class="headerlink" title="about layer"></a>about layer</h4><ol><li>GlobalAveragePooing2D</li></ol><ul><li>๊ธฐ์กด์ fully convolutional Network๋ ๋ง์ parameter์์ ๊ณ์ฐ์ด ์ค๋๊ฑธ๋ฆฌ๊ณ , ์์น์ ์ ๋ณด๊ฐ ๋ชจ๋ ์ฌ๋ผ์ง๋ ๋จ์ ์ด ์์ต๋๋ค.</li><li>๊ฐ์ chennel์ feature๋ค์ ํ๊ท ์ ๋ด์ด ์ฑ๋์ ๊ฐ์๋งํผ ์์๋ฅผ ๊ฐ์ง๋ ๋ฒกํฐ๋ฅผ ์ถ๋ ฅ (์ด๊ฒฝ์ฐ์๋ ์
๋ ฅ ์ธต์ด (7,7,512)์ด๋ฏ๋ก (512,)๋ฅผ ์ถ๋ ฅ์ํค๋ layer)</li><li>fully connected layer๋ฅผ ์์ ๊ธฐ ์ํ ๋ฐฉ๋ฒ</li><li><a href="https://github.com/tensorflow/tensorflow/blob/r1.4/tensorflow/python/keras/_impl/keras/layers/pooling.py">์ฝ๋</a></li></ul><ol start="2"><li>Dense(1)</li></ol><ul><li>binary๋ก ํด๋์ค๋ฅผ ๋ถ๋ฅํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ 0๊ณผ 1๋ก classification</li></ul><figure class="highlight python"><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"><span class="comment"># Important to use binary crossentropy and binary accuracy as we now have a binary classification problem</span></span><br><span class="line">model.<span class="built_in">compile</span>(loss=keras.losses.BinaryCrossentropy(from_logits=<span class="literal">True</span>), metrics=[keras.metrics.BinaryAccuracy()])</span><br></pre></td></tr></table></figure><h3 id="before-data-augmentation"><a href="#before-data-augmentation" class="headerlink" title="before data augmentation"></a>before data augmentation</h3><hr><p><img src="/image/check.jpg" alt="check"></p><p>์ ๊ทธ๋ฆผ๊ณผ๊ฐ์ด <code>ImageDataGenerator.flow_from_directory</code>๋ฅผ ์ฌ์ฉํ ๋์ hidden folder๊ฐ ์๋์ง ํ์ธํด์ผํฉ๋๋ค.</p><figure class="highlight plain"><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">dog</span><br><span class="line"> test</span><br><span class="line"> bo</span><br><span class="line"> not_bo</span><br><span class="line"> train</span><br><span class="line"> bo</span><br><span class="line"> not_bo</span><br></pre></td></tr></table></figure><p>์์ ๊ฐ์ด directory๋ณ๋ก class๋ฅผ ๊ตฌ๋ถํ๊ธฐ ๋๋ฌธ์ <code>.ipynb_checkpoints</code>ํด๋๋ฅผ ์ญ์ ํด์ผํฉ๋๋ค.</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> tensorflow.keras.preprocessing.image <span class="keyword">import</span> ImageDataGenerator</span><br><span class="line"><span class="comment"># create a data generator</span></span><br><span class="line">datagen = ImageDataGenerator(</span><br><span class="line"> samplewise_center=<span class="literal">True</span>, <span class="comment"># set each sample mean to 0</span></span><br><span class="line"> rotation_range=<span class="number">10</span>, <span class="comment"># randomly rotate images in the range (degrees, 0 to 180)</span></span><br><span class="line"> zoom_range = <span class="number">0.1</span>, <span class="comment"># Randomly zoom image</span></span><br><span class="line"> width_shift_range=<span class="number">0.1</span>, <span class="comment"># randomly shift images horizontally (fraction of total width)</span></span><br><span class="line"> height_shift_range=<span class="number">0.1</span>, <span class="comment"># randomly shift images vertically (fraction of total height)</span></span><br><span class="line"> horizontal_flip=<span class="literal">True</span>, <span class="comment"># randomly flip images</span></span><br><span class="line"> vertical_flip=<span class="literal">False</span>) <span class="comment"># we don't expect Bo to be upside-down so we will not flip vertically</span></span><br></pre></td></tr></table></figure><h2 id="data-augmentation"><a href="#data-augmentation" class="headerlink" title="data augmentation"></a>data augmentation</h2><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># load and iterate training dataset</span></span><br><span class="line"></span><br><span class="line">seed = <span class="number">1</span></span><br><span class="line"></span><br><span class="line">train_it = datagen.flow_from_directory(<span class="string">'../sungjin/dog/train/'</span>,</span><br><span class="line"><span class="comment"># save_to_dir='../sungjin/dog2/train/', //2700์ฌ๊ฐ์ ํ์ผ์ด ์์ฑ๋จ</span></span><br><span class="line"> seed = seed,</span><br><span class="line"> target_size=(<span class="number">224</span>, <span class="number">224</span>),</span><br><span class="line"> color_mode=<span class="string">'rgb'</span>,</span><br><span class="line"> class_mode=<span class="string">'binary'</span>,</span><br><span class="line"> batch_size=<span class="number">8</span>)</span><br><span class="line"><span class="comment"># load and iterate test dataset</span></span><br><span class="line">test_it = datagen.flow_from_directory(<span class="string">'../sungjin/dog/test/'</span>,</span><br><span class="line"><span class="comment"># save_to_dir='../sungjin/dog2/test/', // 1600์ฌ๊ฐ์ ํ์ผ์ด ์์ฑ๋จ</span></span><br><span class="line"> seed = seed,</span><br><span class="line"> target_size=(<span class="number">224</span>, <span class="number">224</span>),</span><br><span class="line"> color_mode=<span class="string">'rgb'</span>,</span><br><span class="line"> class_mode=<span class="string">'binary'</span>,</span><br><span class="line"> batch_size=<span class="number">8</span>)</span><br></pre></td></tr></table></figure><pre><code>Found 139 images belonging to 2 classes.Found 20 images belonging to 2 classes.</code></pre><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">history = model.fit(train_it, steps_per_epoch=<span class="number">12</span>, validation_data=test_it, validation_steps=<span class="number">4</span>, epochs=<span class="number">20</span>)</span><br></pre></td></tr></table></figure><pre><code>Epoch 1/2012/12 [==============================] - 3s 225ms/step - loss: 1.4831 - binary_accuracy: 0.6562 - val_loss: 3.5233 - val_binary_accuracy: 0.5357Epoch 2/2012/12 [==============================] - 2s 178ms/step - loss: 1.1998 - binary_accuracy: 0.7473 - val_loss: 1.9760 - val_binary_accuracy: 0.6667Epoch 3/2012/12 [==============================] - 2s 161ms/step - loss: 0.4746 - binary_accuracy: 0.8462 - val_loss: 1.3999 - val_binary_accuracy: 0.7143Epoch 4/2012/12 [==============================] - 2s 172ms/step - loss: 0.3132 - binary_accuracy: 0.8646 - val_loss: 1.0363 - val_binary_accuracy: 0.7857Epoch 5/2012/12 [==============================] - 2s 175ms/step - loss: 0.2785 - binary_accuracy: 0.9011 - val_loss: 1.0750 - val_binary_accuracy: 0.7917Epoch 6/2012/12 [==============================] - 2s 178ms/step - loss: 0.0651 - binary_accuracy: 0.9670 - val_loss: 1.3541 - val_binary_accuracy: 0.7143Epoch 7/2012/12 [==============================] - 2s 198ms/step - loss: 0.1798 - binary_accuracy: 0.9167 - val_loss: 0.9755 - val_binary_accuracy: 0.8214Epoch 8/2012/12 [==============================] - 2s 166ms/step - loss: 0.0315 - binary_accuracy: 0.9890 - val_loss: 0.5196 - val_binary_accuracy: 0.9167Epoch 9/2012/12 [==============================] - 2s 179ms/step - loss: 0.0822 - binary_accuracy: 0.9341 - val_loss: 0.3601 - val_binary_accuracy: 0.8929Epoch 10/2012/12 [==============================] - 2s 181ms/step - loss: 0.0169 - binary_accuracy: 0.9896 - val_loss: 0.3563 - val_binary_accuracy: 0.9286Epoch 11/2012/12 [==============================] - 2s 191ms/step - loss: 0.0437 - binary_accuracy: 0.9890 - val_loss: 0.4602 - val_binary_accuracy: 0.8333Epoch 12/2012/12 [==============================] - 2s 158ms/step - loss: 0.0405 - binary_accuracy: 0.9890 - val_loss: 0.2497 - val_binary_accuracy: 0.8929Epoch 13/2012/12 [==============================] - 2s 191ms/step - loss: 0.0083 - binary_accuracy: 1.0000 - val_loss: 0.4642 - val_binary_accuracy: 0.8571Epoch 14/2012/12 [==============================] - 2s 163ms/step - loss: 0.0133 - binary_accuracy: 0.9890 - val_loss: 0.2259 - val_binary_accuracy: 0.9167Epoch 15/2012/12 [==============================] - 2s 178ms/step - loss: 0.0050 - binary_accuracy: 1.0000 - val_loss: 0.2705 - val_binary_accuracy: 0.8929Epoch 16/2012/12 [==============================] - 2s 185ms/step - loss: 0.0027 - binary_accuracy: 1.0000 - val_loss: 0.2617 - val_binary_accuracy: 0.8929Epoch 17/2012/12 [==============================] - 2s 179ms/step - loss: 0.0203 - binary_accuracy: 0.9890 - val_loss: 0.1751 - val_binary_accuracy: 0.9583Epoch 18/2012/12 [==============================] - 2s 173ms/step - loss: 0.0055 - binary_accuracy: 1.0000 - val_loss: 0.0705 - val_binary_accuracy: 1.0000Epoch 19/2012/12 [==============================] - 2s 199ms/step - loss: 0.0015 - binary_accuracy: 1.0000 - val_loss: 0.0275 - val_binary_accuracy: 1.0000Epoch 20/2012/12 [==============================] - 2s 189ms/step - loss: 0.0056 - binary_accuracy: 1.0000 - val_loss: 0.1403 - val_binary_accuracy: 0.9583</code></pre><h2 id="๊ธฐ์กด์-๋คํธ์ํฌ-๋๊ฒฐ-ํด์ -๋ฐ-fine-tuning"><a href="#๊ธฐ์กด์-๋คํธ์ํฌ-๋๊ฒฐ-ํด์ -๋ฐ-fine-tuning" class="headerlink" title="๊ธฐ์กด์ ๋คํธ์ํฌ ๋๊ฒฐ ํด์ ๋ฐ fine-tuning"></a>๊ธฐ์กด์ ๋คํธ์ํฌ ๋๊ฒฐ ํด์ ๋ฐ fine-tuning</h2><p>์๋กญ๊ฒ ์ปดํ์ผํ ๋ ๊ธฐ์กด์ ๋คํธ์ํฌ๋ฅผ unfreezingํ์ฌ fine-tuning(๋ฏธ์ธ์กฐ์ )ํ๋ค. <br><br>๋จ, ์ด๋ ๋ค์๊ณผ ๊ฐ์ ์ธ๊ฐ์ง์ ์ ๋ต์ด ์๋ค.</p><p align = "center"><img src = "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH4rr7%2FbtqvBNchX4H%2FRmikaKBNm2N6VYD9JbI800%2Fimg.png", width="700px"></p><hr><ol><li>์ ์ฒด๋ชจ๋ธ์ ํ์ต์ํค๊ธฐ</li></ol><ul><li>์ด ๋ฐฉ๋ฒ์ pre-trained model์ ๊ตฌ์กฐ๋ง ์ฌ์ฉํ๊ณ ์๋ก์ด ๋ฐ์ดํฐ์
์ ๋ง๊ฒ ์ ๋ถ ์๋ก ํ์ต์ํค๋ ๋ฐฉ๋ฒ์
๋๋ค. ํฐ ์ฌ์ด์ฆ์ ๋ฐ์ดํฐ์
์ด ํ์ํฉ๋๋ค.</li></ul><br><ol start="2"><li>์ผ๋ถ์ ์ธต๋ง ํ์ต์ํค๊ณ ๋๋จธ์ง๋ ๋๊ฒฐ์ํค๊ธฐ</li></ol><ul><li>์ด๊ธฐ ๋ ์ด์ด๋ ์ถ์์ ์ธ(์ผ๋ฐ์ ์ธ)ํน์ง์ ์ถ์ถํ๊ณ ํ๊ธฐ ๋ ์ด์ด๋ ๊ตฌ์ฒด์ ์ด๊ณ ํน์ ํ ํน์ง์ ์ถ์ถํ๋๋ฐ ์ด๋ฐ ํน์ฑ์ ์ด์ฉํด์ ์ ํ์ ์ผ๋ก ์ฌํ์ต์ํต๋๋ค.</li><li>๋ฐ์ดํฐ์
์ด ์๊ณ ๋ชจ๋ธ์ ํ๋ผ๋ฏธํฐ๊ฐ ๋ง๋ค๋ฉด ์ค๋ฒํผํ
์ด ๋ ์ ์์ผ๋ฏ๋ก ์ ์์์ ๊ณ์ธต์ ํ์ต์ํต๋๋ค.</li><li>๋ฐ์ดํฐ์
์ด ํฌ๊ณ ๊ทธ์ ๋นํด ๋ชจ๋ธ์ ํ๋ผ๋ฏธํฐ๊ฐ ์ ๋ค๋ฉด ์ค๋ฒํผํ
์ ๊ฐ๋ฅ์ฑ์ด ์ ์ผ๋ฏ๋ก ๋ ๋ง์ ์์ ๊ณ์ธต์ ํ์ต์ํต๋๋ค.</li></ul><br><ol start="3"><li>์ ์ฒด ๋๊ฒฐ์ํค๊ธฐ (classification๋ง ํ์ต์ํค๊ธฐ)</li></ol><ul><li>๊ธฐ์กด์ ๋คํธ์ํฌ๋ ๊ฑด๋ค์ง ์๊ณ ๊ทธ๋๋ก ๋๋ฉด์ ํน์ง ์ถ์ถ ๋ฉ์ปค๋์ฆ์ผ๋ก์จ ํ์ฉํ๊ณ , classifier๋ง ์ฌํ์ต์ํค๋ ๋ฐฉ๋ฒ์ ์๋๋ค.</li><li>๋ฐ์ดํฐ์
์ด ๋๋ฌด ์์๋๋ ์๋ก์ด ๋ฌธ์ ๊ฐ ์ด์ ๋ชจ๋ธ์ด ์ด๋ฏธ ํ์ตํ ๋ฐ์ดํฐ์
๊ณผ ๋งค์ฐ ๋น์ทํ ๋ ์ฌ์ฉํฉ๋๋ค.</li></ul><hr><p align = "center"><img src = "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxjNT2%2FbtqvC7gR5Vw%2FWW1IlF9M9DTCypyNTeC2Wk%2Fimg.png", width= "900px"></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></pre></td><td class="code"><pre><span class="line"><span class="comment"># Unfreeze the base model</span></span><br><span class="line">base_model.trainable = <span class="literal">True</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># It's important to recompile your model after you make any changes</span></span><br><span class="line"><span class="comment"># to the `trainable` attribute of any inner layer, so that your changes</span></span><br><span class="line"><span class="comment"># are taken into account</span></span><br><span class="line">model.<span class="built_in">compile</span>(optimizer = keras.optimizers.Adam(lr = <span class="number">.00001</span>),</span><br><span class="line"><span class="comment"># optimizer=keras.optimizers.RMSprop(learning_rate = .00001), # Very low learning rate</span></span><br><span class="line"> loss=keras.losses.BinaryCrossentropy(from_logits=<span class="literal">True</span>),</span><br><span class="line"> metrics=[keras.metrics.BinaryAccuracy()])</span><br></pre></td></tr></table></figure><h3 id="optimizer"><a href="#optimizer" class="headerlink" title="optimizer"></a><a href="%22https://cs231n.github.io/neural-networks-3/#ada%22">optimizer</a></h3><p><img src = "/image/minibatch.jpg", width = "700px"></p><br><p><img src = "/image/optimizer.jpg", width = "700px"></p><p><img src = "https://cs231n.github.io/assets/nn3/opt2.gif", width="400px"><img src = "https://cs231n.github.io/assets/nn3/opt1.gif", width = "400px"></p><p><a href="%22https://dalpo0814.tistory.com/29%22">reference</a></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">history = model.fit(train_it, steps_per_epoch=<span class="number">12</span>, validation_data=test_it, validation_steps=<span class="number">4</span>, epochs=<span class="number">20</span>)</span><br></pre></td></tr></table></figure><pre><code>Epoch 1/2012/12 [==============================] - 3s 219ms/step - loss: 0.0849 - binary_accuracy: 0.9670 - val_loss: 0.0158 - val_binary_accuracy: 1.0000Epoch 2/2012/12 [==============================] - 2s 204ms/step - loss: 0.0053 - binary_accuracy: 1.0000 - val_loss: 0.0118 - val_binary_accuracy: 1.0000Epoch 3/2012/12 [==============================] - 2s 176ms/step - loss: 0.0020 - binary_accuracy: 1.0000 - val_loss: 0.0015 - val_binary_accuracy: 1.0000Epoch 4/2012/12 [==============================] - 2s 196ms/step - loss: 1.5012e-04 - binary_accuracy: 1.0000 - val_loss: 0.0154 - val_binary_accuracy: 1.0000Epoch 5/2012/12 [==============================] - 3s 211ms/step - loss: 1.7610e-04 - binary_accuracy: 1.0000 - val_loss: 0.0034 - val_binary_accuracy: 1.0000Epoch 6/2012/12 [==============================] - 2s 198ms/step - loss: 1.0886e-04 - binary_accuracy: 1.0000 - val_loss: 0.0275 - val_binary_accuracy: 1.0000Epoch 7/2012/12 [==============================] - 2s 178ms/step - loss: 2.9665e-05 - binary_accuracy: 1.0000 - val_loss: 0.0093 - val_binary_accuracy: 1.0000Epoch 8/2012/12 [==============================] - 2s 205ms/step - loss: 1.7676e-05 - binary_accuracy: 1.0000 - val_loss: 0.0108 - val_binary_accuracy: 1.0000Epoch 9/2012/12 [==============================] - 2s 182ms/step - loss: 3.1658e-05 - binary_accuracy: 1.0000 - val_loss: 8.7812e-04 - val_binary_accuracy: 1.0000Epoch 10/2012/12 [==============================] - 2s 195ms/step - loss: 3.5808e-05 - binary_accuracy: 1.0000 - val_loss: 0.0020 - val_binary_accuracy: 1.0000Epoch 11/2012/12 [==============================] - 2s 191ms/step - loss: 3.2332e-05 - binary_accuracy: 1.0000 - val_loss: 0.0474 - val_binary_accuracy: 0.9643Epoch 12/2012/12 [==============================] - 2s 202ms/step - loss: 1.3189e-04 - binary_accuracy: 1.0000 - val_loss: 0.0044 - val_binary_accuracy: 1.0000Epoch 13/2012/12 [==============================] - 2s 202ms/step - loss: 1.7362e-04 - binary_accuracy: 1.0000 - val_loss: 0.0073 - val_binary_accuracy: 1.0000Epoch 14/2012/12 [==============================] - 2s 194ms/step - loss: 2.4271e-05 - binary_accuracy: 1.0000 - val_loss: 0.0235 - val_binary_accuracy: 1.0000Epoch 15/2012/12 [==============================] - 3s 219ms/step - loss: 1.0316e-05 - binary_accuracy: 1.0000 - val_loss: 0.0388 - val_binary_accuracy: 1.0000Epoch 16/2012/12 [==============================] - 2s 187ms/step - loss: 2.3622e-05 - binary_accuracy: 1.0000 - val_loss: 0.0031 - val_binary_accuracy: 1.0000Epoch 17/2012/12 [==============================] - 2s 201ms/step - loss: 2.0185e-05 - binary_accuracy: 1.0000 - val_loss: 0.0413 - val_binary_accuracy: 0.9643Epoch 18/2012/12 [==============================] - 2s 175ms/step - loss: 3.8968e-05 - binary_accuracy: 1.0000 - val_loss: 0.0197 - val_binary_accuracy: 1.0000Epoch 19/2012/12 [==============================] - 2s 202ms/step - loss: 9.7374e-06 - binary_accuracy: 1.0000 - val_loss: 0.0902 - val_binary_accuracy: 0.9643Epoch 20/2012/12 [==============================] - 2s 206ms/step - loss: 1.0378e-04 - binary_accuracy: 1.0000 - val_loss: 0.0148 - val_binary_accuracy: 1.0000</code></pre><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></pre></td><td class="code"><pre><span class="line">inputs = keras.Input(shape=(<span class="number">224</span>, <span class="number">224</span>, <span class="number">3</span>))</span><br><span class="line"><span class="comment"># Separately from setting trainable on the model, we set training to False</span></span><br><span class="line">x = base_model(inputs, training=<span class="literal">False</span>)</span><br><span class="line">x = keras.layers.Flatten(input_shape=(<span class="number">7</span>,<span class="number">7</span>,<span class="number">512</span>))(x)</span><br><span class="line"><span class="comment"># x = keras.layers.Dense(256, activation='relu',input_dim=(7*7*512))(x)</span></span><br><span class="line"><span class="comment"># x = keras.layers.Dropout(0.2)(x)</span></span><br><span class="line">outputs = keras.layers.Dense(<span class="number">1</span>,activation = <span class="string">'sigmoid'</span>)(x)</span><br><span class="line">model = keras.Model(inputs, outputs)</span><br><span class="line">model.summary()</span><br></pre></td></tr></table></figure><pre><code>Model: "model"_________________________________________________________________Layer (type) Output Shape Param #=================================================================input_2 (InputLayer) [(None, 224, 224, 3)] 0_________________________________________________________________vgg16 (Model) (None, 7, 7, 512) 14714688_________________________________________________________________flatten (Flatten) (None, 25088) 0_________________________________________________________________dense (Dense) (None, 1) 25089=================================================================Total params: 14,739,777Trainable params: 25,089Non-trainable params: 14,714,688_________________________________________________________________</code></pre><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># Important to use binary crossentropy and binary accuracy as we now have a binary classification problem</span></span><br><span class="line">model.<span class="built_in">compile</span>(</span><br><span class="line"><span class="comment"># optimizer=keras.optimizers.Adam(),</span></span><br><span class="line"> loss=keras.losses.BinaryCrossentropy(from_logits=<span class="literal">True</span>),</span><br><span class="line"> metrics=[keras.metrics.BinaryAccuracy()])</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> tensorflow.keras.preprocessing.image <span class="keyword">import</span> ImageDataGenerator</span><br><span class="line"><span class="comment"># create a data generator</span></span><br><span class="line">datagen = ImageDataGenerator(</span><br><span class="line"> samplewise_center=<span class="literal">True</span>, <span class="comment"># set each sample mean to 0</span></span><br><span class="line"> rotation_range=<span class="number">10</span>, <span class="comment"># randomly rotate images in the range (degrees, 0 to 180)</span></span><br><span class="line"> zoom_range = <span class="number">0.1</span>, <span class="comment"># Randomly zoom image</span></span><br><span class="line"> width_shift_range=<span class="number">0.1</span>, <span class="comment"># randomly shift images horizontally (fraction of total width)</span></span><br><span class="line"> height_shift_range=<span class="number">0.1</span>, <span class="comment"># randomly shift images vertically (fraction of total height)</span></span><br><span class="line"> horizontal_flip=<span class="literal">True</span>, <span class="comment"># randomly flip images</span></span><br><span class="line"> vertical_flip=<span class="literal">False</span>) <span class="comment"># we don't expect Bo to be upside-down so we will not flip vertically</span></span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># load and iterate training dataset</span></span><br><span class="line"></span><br><span class="line">seed = <span class="number">1</span></span><br><span class="line"></span><br><span class="line">train_it = datagen.flow_from_directory(<span class="string">'../sungjin/dog/train/'</span>,</span><br><span class="line"><span class="comment"># save_to_dir='../sungjin/dog2/train/', //2700์ฌ๊ฐ์ ํ์ผ์ด ์์ฑ๋จ</span></span><br><span class="line"> seed = seed,</span><br><span class="line"> target_size=(<span class="number">224</span>, <span class="number">224</span>),</span><br><span class="line"> color_mode=<span class="string">'rgb'</span>,</span><br><span class="line"> class_mode=<span class="string">'binary'</span>,</span><br><span class="line"> batch_size=<span class="number">8</span>)</span><br><span class="line"><span class="comment"># load and iterate test dataset</span></span><br><span class="line">test_it = datagen.flow_from_directory(<span class="string">'../sungjin/dog/test/'</span>,</span><br><span class="line"><span class="comment"># save_to_dir='../sungjin/dog2/test/', // 1600์ฌ๊ฐ์ ํ์ผ์ด ์์ฑ๋จ</span></span><br><span class="line"> seed = seed,</span><br><span class="line"> target_size=(<span class="number">224</span>, <span class="number">224</span>),</span><br><span class="line"> color_mode=<span class="string">'rgb'</span>,</span><br><span class="line"> class_mode=<span class="string">'binary'</span>,</span><br><span class="line"> batch_size=<span class="number">8</span>)</span><br></pre></td></tr></table></figure><pre><code>Found 139 images belonging to 2 classes.Found 20 images belonging to 2 classes.</code></pre><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">history = model.fit(train_it, steps_per_epoch=<span class="number">12</span>, validation_data=test_it, validation_steps=<span class="number">4</span>, epochs=<span class="number">20</span>)</span><br></pre></td></tr></table></figure><pre><code>Epoch 1/2012/12 [==============================] - 3s 243ms/step - loss: 0.4516 - binary_accuracy: 0.8333 - val_loss: 0.8132 - val_binary_accuracy: 0.5000Epoch 2/2012/12 [==============================] - 2s 195ms/step - loss: 0.4823 - binary_accuracy: 0.8352 - val_loss: 0.8549 - val_binary_accuracy: 0.4583Epoch 3/2012/12 [==============================] - 2s 179ms/step - loss: 0.4232 - binary_accuracy: 0.8901 - val_loss: 0.8483 - val_binary_accuracy: 0.4643Epoch 4/2012/12 [==============================] - 2s 202ms/step - loss: 0.4383 - binary_accuracy: 0.8750 - val_loss: 0.8490 - val_binary_accuracy: 0.4643Epoch 5/2012/12 [==============================] - 2s 195ms/step - loss: 0.4781 - binary_accuracy: 0.8352 - val_loss: 0.8133 - val_binary_accuracy: 0.5000Epoch 6/2012/12 [==============================] - 2s 199ms/step - loss: 0.4341 - binary_accuracy: 0.8791 - val_loss: 0.7775 - val_binary_accuracy: 0.5357Epoch 7/2012/12 [==============================] - 2s 204ms/step - loss: 0.4526 - binary_accuracy: 0.8646 - val_loss: 0.7197 - val_binary_accuracy: 0.6071Epoch 8/2012/12 [==============================] - 2s 170ms/step - loss: 0.4012 - binary_accuracy: 0.9121 - val_loss: 0.8549 - val_binary_accuracy: 0.4583Epoch 9/2012/12 [==============================] - 2s 197ms/step - loss: 0.4823 - binary_accuracy: 0.8352 - val_loss: 0.8490 - val_binary_accuracy: 0.4643Epoch 10/2012/12 [==============================] - 2s 201ms/step - loss: 0.4070 - binary_accuracy: 0.9062 - val_loss: 0.8133 - val_binary_accuracy: 0.5000Epoch 11/2012/12 [==============================] - 2s 205ms/step - loss: 0.5111 - binary_accuracy: 0.8022 - val_loss: 0.7716 - val_binary_accuracy: 0.5417Epoch 12/2012/12 [==============================] - 2s 181ms/step - loss: 0.4341 - binary_accuracy: 0.8791 - val_loss: 0.8490 - val_binary_accuracy: 0.4643Epoch 13/2012/12 [==============================] - 3s 216ms/step - loss: 0.4383 - binary_accuracy: 0.8750 - val_loss: 0.8133 - val_binary_accuracy: 0.5000Epoch 14/2012/12 [==============================] - 2s 190ms/step - loss: 0.4451 - binary_accuracy: 0.8681 - val_loss: 0.8133 - val_binary_accuracy: 0.5000Epoch 15/2012/12 [==============================] - 2s 191ms/step - loss: 0.4603 - binary_accuracy: 0.8571 - val_loss: 0.8847 - val_binary_accuracy: 0.4286Epoch 16/2012/12 [==============================] - 2s 202ms/step - loss: 0.4278 - binary_accuracy: 0.8854 - val_loss: 0.8133 - val_binary_accuracy: 0.5000Epoch 17/2012/12 [==============================] - 2s 205ms/step - loss: 0.4451 - binary_accuracy: 0.8681 - val_loss: 0.8549 - val_binary_accuracy: 0.4583Epoch 18/2012/12 [==============================] - 2s 179ms/step - loss: 0.4781 - binary_accuracy: 0.8352 - val_loss: 0.8490 - val_binary_accuracy: 0.4643Epoch 19/2012/12 [==============================] - 2s 207ms/step - loss: 0.4695 - binary_accuracy: 0.8438 - val_loss: 0.7775 - val_binary_accuracy: 0.5357Epoch 20/2012/12 [==============================] - 2s 185ms/step - loss: 0.4232 - binary_accuracy: 0.8901 - val_loss: 0.8549 - val_binary_accuracy: 0.4583</code></pre><h2 id="Global-Average-Pooing-vs-Fully-Convolutional-Network"><a href="#Global-Average-Pooing-vs-Fully-Convolutional-Network" class="headerlink" title="Global Average Pooing vs Fully Convolutional Network"></a><code>Global Average Pooing</code> vs <code>Fully Convolutional Network</code></h2><p><img src = "/image/GAP.jpg", width = "400px"><img src = "/image/fullyConvolution.jpg", width = "400px"></p>]]></content>
<categories>
<category> AAIS </category>
</categories>
<tags>
<tag> AI </tag>
<tag> AAIS </tag>
<tag> keras </tag>
</tags>
</entry>
<entry>
<title>[Java] Day04 - ์ ์ด๋ฌธ</title>
<link href="2021/01/25/java-day4/"/>
<url>2021/01/25/java-day4/</url>
<content type="html"><![CDATA[<h1 id="Day04-์ ์ด๋ฌธ"><a href="#Day04-์ ์ด๋ฌธ" class="headerlink" title="Day04 ์ ์ด๋ฌธ"></a>Day04 ์ ์ด๋ฌธ</h1><h2 id="Review-Day03"><a href="#Review-Day03" class="headerlink" title="Review Day03"></a>Review Day03</h2><hr><blockquote><p>Q1. <code>mid = (start + end)</code> / 2์ ๋ฌธ์ ์ ์?</p></blockquote><br><p>๋ง์ฝ <code>int start = 2_100_000_000, int end = 2_100_000_000</code> ์ด๋ผ๋ฉด start์ end๋ฅผ ๋ํ๋ฉด ์ค๋ฒํ๋ก์ฐ๊ฐ ์ผ์ด๋ ์ ์๋ค.<br>๋ฐ๋ผ์ ์ค๊ฐ๊ฐ์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ๋์ฒด๋ก <code>mid = start + (end-start) / 2</code>๋ก ํ๋ค.<br>ํ๊ฐ์ง ์ ๋ฐํ ๋ฐฉ๋ฒ์ java์์ ์ ๊ณตํ๋ <code>>>></code>์ฐ์ฐ์์ธ๋ฐ ์์์ผ ๋, <code>mid = (start+end) >>> 1</code>๋ก ํ๋ค๋ฉด ์ค๊ฐ๊ฐ์ ๊ตฌํ ์ ์๋ค.<br><strong>ํ์ง๋ง</strong> ์์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ์์ ํ๊ณ ์ง๊ด์ ์ด๋ค.</p><br><blockquote><p>Q2. numbers๋ผ๋ intํ ๋ฐฐ์ด์ด ์๋ค.<br>ํด๋น ๋ฐฐ์ด์ด ๋ค์ด์๋ ์ซ์๋ค์ ์ค์ง ํ ์ซ์๋ฅผ ์ ์ธํ๊ณ ๋ ๋ชจ๋ ๋๋ฒ์ฉ ๋ค์ด์๋ค.<br>์ค์ง ํ ๋ฒ๋ง ๋ฑ์ฅํ๋ ์ซ์๋ฅผ ์ฐพ๋ ์ฝ๋๋ฅผ ์์ฑํ์ฌ๋ผ.</p></blockquote><br><p>C++์ sstream์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ๋ ์ฌ๋์ง๋ง(Java์๋ ์๋ค), ์ ์ฅ๋๊ป์ ๋นํธ์ฐ์ฐ์ผ๋ก ํธ๋ ๋ฐฉ๋ฒ์ ์๋ ค์ฃผ์
จ๋ค.</p><br><figure class="highlight java"><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"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span></span>{</span><br><span class="line">Hello hello = <span class="keyword">new</span> Hello();</span><br><span class="line"> <span class="keyword">int</span> result = hello.solution(<span class="keyword">new</span> <span class="keyword">int</span>[] {<span class="number">5</span>,<span class="number">2</span>,<span class="number">4</span>,<span class="number">1</span>,<span class="number">2</span>,<span class="number">4</span>,<span class="number">5</span>});</span><br><span class="line"> System.out.println(result);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">private</span> <span class="keyword">int</span> <span class="title">solution</span><span class="params">(<span class="keyword">int</span>[] numbers)</span></span>{</span><br><span class="line"> <span class="keyword">int</span> result = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> number : numbers) {</span><br><span class="line"> result ^= number;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> result;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure><br><p>๊ฐ๋จํ๋ค. ๋ชจ๋ ๋ฐฐ์ด์์ ์๋ ๊ฒ๋ค๋ผ๋ฆฌ XOR์ฐ์ฐ์ ํ๊ฒ ๋๋ค๋ฉด ๋๊ฐ๊ฐ ์กด์ฌํ์ง ์๋ ํ๊ฐ์ ์์๋ง ๋ฐํํ๊ฒ๋๊ธฐ ๋๋ฌธ์ด๋ค. (<code>5 ^ 5 = 0</code>, <code>5 ^ 0 = 5</code>๋ค.)</p><br><h3 id="java13์-switch์ฐ์ฐ์"><a href="#java13์-switch์ฐ์ฐ์" class="headerlink" title="java13์ switch์ฐ์ฐ์"></a>java13์ switch์ฐ์ฐ์</h3><hr><p>์ผ๋จ switch operator๋ switch statement์ ๋ค๋ฅธ ๊ฒ์ด๋ค.</p><ol><li>switch statement</li></ol><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">switch</span>(num){</span><br><span class="line"> <span class="keyword">case</span> <span class="number">1</span>:</span><br><span class="line"> returnNum = <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="number">2</span>:</span><br><span class="line"> returnNum = <span class="number">2</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="number">3</span>:</span><br><span class="line"> returnNum = <span class="number">3</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure><hr><ol start="2"><li>switch operator</li></ol><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> value = <span class="keyword">switch</span>(str){</span><br><span class="line"><span class="keyword">case</span> <span class="string">"hello?"</span>:</span><br><span class="line"> yield <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">"hi?"</span>:</span><br><span class="line"> yield <span class="number">2</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> yield <span class="number">3</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>์ง๊ด์ ์ผ๋ก ์ด๋ค์๋ฏธ์ธ์ง ์ ์ ์๋๋ฐ, ๊ฐ์ ๋ฐํํ๋ operator์ด๋ผ๋ ๊ฒ์ด๋ค. ์์ ๋ฐฉ๋ฒ์ผ๋ก <code>break</code>์ ์ฌ์ฉํ์ง ์๊ณ <code>yield</code>๋ก ๊ฐ์ ์ฐ์ถํ ์ ์๋ค. ๋ํ, <code>var</code>์ ์ฌ์ฉํ์ฌ ๊ฐ๊ฐ์ ๊ฒฝ์ฐ ๋ค๋ฅธ ๋ณ์ํ์
์ ๋ฐํํ๋ ๊ฒ ๋ํ ๊ฐ๋ฅํ๋ค.</p><br><h2 id="Day04-์ ์ด๋ฌธ-1"><a href="#Day04-์ ์ด๋ฌธ-1" class="headerlink" title="Day04. ์ ์ด๋ฌธ"></a>Day04. ์ ์ด๋ฌธ</h2><hr><p>์ ๋ฒ์๊ฐ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์๊ฐ์ด ์๊ธฐ ๋๋ฌธ์.. if, while, ๊ธฐํ ๋ฑ๋ฑ ๋ค์ํ ๋ฐ๋ณต๋ฌธ๊ณผ ์กฐ๊ฑด๋ฌธ์ ์๋ตํ๋๋ก ํ๊ฒ ๋ค. <a href="https://kils-log-of-develop.tistory.com/349">๋ค์์๋งํฌ</a>์์ ์ข์ ์ค๋ช
์ ๋ณผ ์ ์์ ๊ฒ์ด๋ค.</p><h3 id="for-each๋ฌธ"><a href="#for-each๋ฌธ" class="headerlink" title="for each๋ฌธ"></a>for each๋ฌธ</h3><hr><p>for each๋ J2SE 5.0 ๋ถํฐ ์ถ๊ฐ๋์๋ค. for each ๋ผ๋ ํค์๋๊ฐ ๋ฐ๋ก ์๋ ๊ฒ์ ์๋๊ณ ๋์ผํ for๋ฅผ ์ด์ฉํ๋ค. ํ์ง๋ง ์กฐ๊ฑด์ ๋ถ๋ถ์ด ์กฐ๊ธ ๋ค๋ฅด๋ค. ๋ณดํต ๋ค๋ฅธ ์ธ์ด์์ for each ๋ผ๊ณ ๋ง์ด ํ๋ฏ๋ก ์๋ฐ์์๋ ๋ณดํต for each๋ฌธ์ด๋ผ๊ณ ๋งํ๋ค.</p><br><p><strong>๊ธฐ์กด์ for๋ฌธ</strong></p><figure class="highlight java"><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">String[] numbers = {<span class="string">"one"</span>, <span class="string">"two"</span>, <span class="string">"three"</span>};</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>; i<numbers.length; i++){</span><br><span class="line"> System.out.println(numbers[i]);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><br><p><strong>for each๋ฌธ</strong></p><figure class="highlight java"><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">String[] numbers = {<span class="string">"one"</span>, <span class="string">"two"</span>, <span class="string">"three"</span>};</span><br><span class="line"><span class="keyword">for</span>(String number: numbers) {</span><br><span class="line"> System.out.println(number);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>๋จ, for each๋ฌธ ๊ฐ์๊ฒฝ์ฐ์๋ index๋ก iterationํ๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ๋๊ฐ์ฉ ๊ฑด๋๋ฐ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค. ์ํฉ์ ๋ง์ถ์ด ์ฌ์ฉํ๋ฉด ๋๋ค.</p><br><h3 id="LinkedList-๊ตฌํํ๊ธฐ"><a href="#LinkedList-๊ตฌํํ๊ธฐ" class="headerlink" title="LinkedList ๊ตฌํํ๊ธฐ"></a>LinkedList ๊ตฌํํ๊ธฐ</h3><figure class="highlight java"><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><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">makeLinkedList</span> </span>{</span><br><span class="line"> <span class="class"><span class="keyword">interface</span> <span class="title">LinkedList</span> </span>{</span><br><span class="line"> <span class="function">ListNode <span class="title">add</span><span class="params">(ListNode head, ListNode nodeToAdd, <span class="keyword">int</span> position)</span></span>;</span><br><span class="line"> <span class="function">ListNode <span class="title">remove</span><span class="params">(ListNode head, <span class="keyword">int</span> positionToRemove)</span></span>;</span><br><span class="line"> <span class="function"><span class="keyword">boolean</span> <span class="title">contains</span><span class="params">(ListNode head, ListNode nodeTocheck)</span></span>;</span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">printList</span><span class="params">(ListNode head)</span></span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">static</span> <span class="class"><span class="keyword">class</span> <span class="title">ListNode</span> </span>{</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">int</span> data;</span><br><span class="line"> <span class="keyword">private</span> ListNode next;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">ListNode</span><span class="params">(<span class="keyword">int</span> input)</span> </span>{</span><br><span class="line"> <span class="keyword">this</span>.data = input;</span><br><span class="line"> <span class="keyword">this</span>.next = <span class="keyword">null</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">static</span> <span class="class"><span class="keyword">class</span> <span class="title">LinkedListImpl</span> <span class="keyword">implements</span> <span class="title">LinkedList</span> </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">printList</span><span class="params">(ListNode head)</span> </span>{</span><br><span class="line"> <span class="keyword">while</span> (head != <span class="keyword">null</span>) {</span><br><span class="line"> System.out.println(head.data);</span><br><span class="line"> head = head.next;</span><br><span class="line"> }</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">int</span> <span class="title">size</span><span class="params">(ListNode head)</span> </span>{</span><br><span class="line"> ListNode node = head;</span><br><span class="line"> <span class="keyword">int</span> size = <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">while</span> (node.next != <span class="keyword">null</span>) {</span><br><span class="line"> node = node.next;</span><br><span class="line"> size++;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> size;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> ListNode <span class="title">add</span><span class="params">(ListNode head, ListNode nodeToAdd, <span class="keyword">int</span> position)</span> </span>{</span><br><span class="line"></span><br><span class="line"> ListNode node = head;</span><br><span class="line"> <span class="keyword">if</span> (position == <span class="number">0</span>) {</span><br><span class="line"> <span class="keyword">if</span> (head == <span class="keyword">null</span>) {</span><br><span class="line"> <span class="keyword">return</span> nodeToAdd;</span><br><span class="line"> }</span><br><span class="line"> ListNode add = nodeToAdd;</span><br><span class="line"> add.next = head;</span><br><span class="line"> head = add;</span><br><span class="line"> <span class="keyword">return</span> head;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < position - <span class="number">1</span>; i++) {</span><br><span class="line"> node = node.next;</span><br><span class="line"> }</span><br><span class="line"> nodeToAdd.next = node.next;</span><br><span class="line"> node.next = nodeToAdd;</span><br><span class="line"> <span class="keyword">return</span> head;</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">boolean</span> <span class="title">contains</span><span class="params">(ListNode head, ListNode nodeTocheck)</span> </span>{</span><br><span class="line"> <span class="keyword">while</span> (head != <span class="keyword">null</span>) {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (head.data == nodeTocheck.data) {</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line"> }</span><br><span class="line"> head = head.next;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">false</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> ListNode <span class="title">remove</span><span class="params">(ListNode head, <span class="keyword">int</span> positionToRemove)</span> </span>{</span><br><span class="line"> ListNode node = head;</span><br><span class="line"> <span class="keyword">if</span> (positionToRemove == <span class="number">0</span>) {</span><br><span class="line"> head = head.next;</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < positionToRemove - <span class="number">1</span>; i++) {</span><br><span class="line"> node = node.next;</span><br><span class="line"> }</span><br><span class="line"> ListNode delNode = node.next;</span><br><span class="line"> node.next = node.next.next;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> head;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>๋ค๋ฅธ๊ฒ๋ค๋ ์ฒ์ฒํ ๊ตฌํํด๋ณด๊ฒ ๋ค.</p>]]></content>
<categories>
<category> Java </category>
</categories>
<tags>
<tag> java8 </tag>
</tags>
</entry>
<entry>
<title>[AAIS] E03. Convolution Layer - 2</title>
<link href="2021/01/21/aais-03/"/>
<url>2021/01/21/aais-03/</url>
<content type="html"><![CDATA[<h1 id="Agian-CNN"><a href="#Agian-CNN" class="headerlink" title="Agian CNN"></a>Agian CNN</h1><h2 id="Review-the-reports"><a href="#Review-the-reports" class="headerlink" title="Review the reports"></a>Review the reports</h2><h3 id="Tooth-wise-age-group-prediction-with-CNN-model"><a href="#Tooth-wise-age-group-prediction-with-CNN-model" class="headerlink" title="Tooth-wise age-group prediction with CNN model"></a>Tooth-wise age-group prediction with CNN model</h3><hr><figure class="highlight plain"><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">Toothโwise ageโgroup prediction with CNN model. As the frst molar is considered to be the most reliable tooth for estimating dental age, we selected it for developing a CNN model for the age-group determination.</span><br><span class="line">From a panoramic radiograph of each patient, image patches of teeth #16, #26, #36, and #46 were manually extracted. </span><br><span class="line">The goal of extracting image patches from the panoramic radiographs was to include complete contours of the teeth. </span><br><span class="line">As a result, a total of 4,312 image patches of frst molars were collected from 1078 patients for training, and every tooth patch was resized into a fxed size of 151ร112. </span><br><span class="line">To minimize any unnecessary variance in the dataset and to improve the performance of the model, the dataset was augmented23, and we used the following selective data augmentation techniques: </span><br><span class="line">the tooth images were fipped lef and right, upside down, rotated, and reversed by 90ยฐ.</span><br><span class="line">Te residual deep neural network with 152 layers (ResNet-152) was trained to predict the age-group toothwise, that is, for each tooth.</span><br><span class="line">The weights of the network were initialized using pre-trained weights from ImageNet dataset24. </span><br><span class="line">Ten, the entire network was fne-tuned for the target age-group estimation problem. </span><br><span class="line">Although the ImageNet base dataset does not include teeth images, various studies have shown that the fne-tuning of a pretrained network with several images of ImageNet helps improve the performance in disease-related problem learning using medical images.</span><br><span class="line">The network was trained using the cross-entropy loss function and adaptive moment estimation (Adam) optimizer with a learning rate of 1e-5 and a batch size of 32. </span><br><span class="line">We trained the network for 40,000 iterations and validated it using validation data every 1000 iterations with a classifcation accuracy metric to determine whether to stop the training. </span><br><span class="line">The network showing the highest validation accuracy was selected as the fnal model and used for testing.</span><br></pre></td></tr></table></figure><p>์ฒซ๋ฒ์งธ ํฐ์ด๊ธ๋๊ฐ ์น์ ๋์ด๋ฅผ ์ถ๋ก <sup><a href="#footnote_1">1</a></sup><sup><a href="#footnote_2">2</a></sup>ํ๋๋ฐ ๊ฐ์ฅ ์ข์ผ๋ฏ๋ก, ์ด๋ฅผ ์ฑํํ์ฌ CNN ๋ชจ๋ธ์ ์์ฑํ์๋ค.<br>๊ฐ๊ฐ์ ํ์์ ํ๋
ธ๋ผ๋ง์ฌ์ง์ผ๋ก๋ถํฐ #16, #26, #36, #46๋ฒ ์น์๋ฅผ ์ถ์ถํ์๋ค.</p><p align = "center"><img src="http://postfiles9.naver.net/MjAxNzAzMTBfMTUx/MDAxNDg5MTE2MTY3MDE5.FJwhRPEDicEibFZ9haFXwlkpCUW8IDQkHMGBAKQyK_4g.hWk8acgCVJA2b125bulyofsgNMgk52gU5QDJ73MML2gg.JPEG.onedaydent/image_2923048291489116088889.jpg?type=w966" width = "500px"></p><p>ํ๋
ธ๋ผ๋ง ์ด๋ฏธ์ง๋ก๋ถํฐ image patch๋ฅผ ์ถ์ถํ๋ ๋ชฉํ๋ ์์ ํ ์ด์ ์ค๊ณฝ(contour)๋ฅผ ํฌํจ์ํค๋ ๊ฒ์ด๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก, 1078๋ช
์ ์ด๋ฏธ์ง๋ก๋ถํฐ 4,312๊ฐ์ image patch๋ค์ ๋ชจ์๊ณ ๋ชจ๋ image patch๋ 151 X 112๋ก ์ฌ์ด์ฆ๋ฅผ ๋ฆฌ์ฌ์ด์ง(resize)ํ์๋ค. ๋ถํ์ํ ๋ฐ์ดํฐ์
๋ค์ ์ค์ด๊ณ ๋ชจ๋ธ์ ์ฑ๋ฅ(performance)๋ฅผ ์ฆ๊ฐ์ํค๊ธฐ์ํด ๋ฐ์ดํฐ์
์ด ์ถ๊ฐ<sup><a href="#footnote_3">3</a></sup>๋์๋ค.</p><p>ResNet-152<sup><a href="#footnote_3">3</a></sup>(The Residual deep neural network with 152 layers)๋ ๊ฐ๊ฐ์ ์น์์ age-group์ ์ถ์ ํ๋ค. ๊ฐ์ค์น(The weights of the network)๋ ImageNet datet์ผ๋ก๋ถํฐ ์ด๋ฏธ ํ๋ จ๋๊ฒ๋ค๋ก๋ถํฐ ์์๋์๋ค. ๊ทธ ํ, ์ ์ฒด ๋คํธ์ํฌ๋ age-group์ ์ถ์ ํ๊ธฐ์ํ ๋ชจ๋ธ๋ก ๋ณํ(fine-tuned)๋์๋ค. ๋น๋ก, ImageNetbase dataset์ ์ด(teeth)์ ์ด๋ฏธ์ง๋ฅผ ํฌํจํ์ง ์์ง๋ง, ๋ค์์ ์ฐ๊ตฌ๋ค์ด ์ํ์ด๋ฏธ์ง(medical image)๋ค์ ์ฌ์ฉํ์ฌ ์ง๋ณ์๊ด๋ จ๋ ๋ฌธ์ ๋ค์ ํธ๋๋ฐ ์ฑ๋ฅ์ ์ฆ๊ฐ์์ผฐ๋ค๋ ๊ฒ์ ๋ณด์ฌ์คฌ๋ค. ResNet์ <code>cross-entopy loss function</code>๊ณผ <code>adaptive moment estimation(Adam) optimizer</code>๋ฅผ ํตํด ํ์ต๋์๋ค. <code>learning rate</code>์ 1e-5์ด๋ฉฐ <code>batch size</code>๋ 32์ด๋ค. ๋ํ, 4๋ง๋ฒ์ ๋ฐ๋ณตํ์ต์ ํ์๊ณ 1000ํ๋ง๋ค ๋ถ๋ฅ(classification)์ ํ๋๋ฅผ ์ธก์ ํ์๋ค. ๊ฐ์ฅ ๋์ validation accuracy๋ฅผ ๋ณด์ฌ์ค ๋คํธ์ํฌ๋ฅผ ์ต์ข
๋ชจ๋ธ๋ก ์ ์ ํ์๋ค.</p><h2 id="ResNet-152"><a href="#ResNet-152" class="headerlink" title="ResNet-152?"></a>ResNet-152?</h2><p>์์ ๋ด์ฉ์ ๋ฐ๋ฅด๋ฉด ResNet-152๋ผ๋ ๊ฒ์ด ๋์จ๋ค. CNN์ด๋ ๋ค๋ฅธ๊ฑด๊ฐ?์ถ์ด ๊ฑฑ์ ์ด ์์ฐ์ง๋ง ๋คํํ๋ CNN์ ํ ์ข
๋ฅ์ด๋ค.<br><a href="https://arxiv.org/pdf/1512.03385.pdf">Deep Residual Learning for Image Recognition</a>์ ๋ฐ๋ฅด๋ฉด <code>residual learning</code>์ ํตํด ๊ธฐ์กด์ ์ฌ์ธต์ ๊ฒฝ๋ง๋ณด๋ค ์๋นํ ๊น์ ์ ๊ฒฝ๋ง์ ๋ํด์๋ ํ์ต์ ์ํ๊ณ ์๋ ๊ฒ์ ๋ณด์ฌ์ค๋ค. 152๊ฐ์ layer๋ก ๊ตฌ์ฑ๋์ด์์ผ๋ฉฐ, ์ ๋
๋ ILSVRC์์ ์ฐ์นํ GoogleLeNet๋ณด๋ค ์ฝ ๋๋ฐฐ์ ์ฑ๋ฅ์ด ์ข์์ก๋ค.</p><br><p align = "center"><img src = "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcx1l7G%2FbtqzR2RurjQ%2FuRBKXJoxhDZdBjqI2BqWnK%2Fimg.png" width = "600px"></p><br><p>์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ๋ ์ด์ด๊ฐ ์ ์ ๊น์ด์ง๋๋ฐ error_rate์ด ์ค์ด๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ ์ด์ด๊ฐ ๊น์ด์ง์๋ก ๋ ์ข์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด ์๋๊ฐ?์๊ฐ์ด ๋ค ์ ์๋ค. ํ์ง๋ง, ์์ ํฌ์คํธ์์๋ ํ์ธํ๋ฏ์ด CNN์ layer๊ฐ ๋ง์์ง์๋ก(๊น์ด์ง์๋ก) ํ๋ผ๋ฏธํฐ์ ์๊ฐ ๊ธ๊ฒฉํ ๋์ด๋จ์ ํ์ธํ์๋ค. ์ด๋ overfitting์ ๋ฌธ์ ๊ฐ ์๋์ง๋ผ๋ ์๋ฌ๊ฐ ์ปค์ง๋ ํ์์ด ๋ฐ์ํ๊ฒ ๋๋ค. ๋ฌด์กฐ๊ฑด์ ์ผ๋ก layer๋ฅผ ๊น๊ฒํ๋ ๊ฒ์ด ์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค ์๊ฐํ ๊ฒ์ด๊ณ <code>residual learning</code>์ ํ๊ฒ ๋ ๊ฒ์ด๋ค.</p><p>๋ฐ๋ผ์, ResNetํ์ ๋๊ฐ์ง์ ์์น์ ์ธ์ ๋ค๊ณ ํ๋ค.</p><ol><li>์ถ๋ ฅ feature-map์ ํฌ๊ธฐ๊ฐ ๊ฐ์ ๊ฒฝ์ฐ, ํด๋น ๋ชจ๋ layer๋ ๋ชจ๋ ๋์ผํ ์์ filter๋ฅผ ๊ฐ๋๋ค.</li><li>feature-map์ ํฌ๊ธฐ๊ฐ ์ ๋ฐ์ผ๋ก ์์์ง๋ ๊ฒฝ์ฐ๋ ์ฐ์ฐ๋์ ๊ท ํ์ ๋ง์ถ๊ธฐ ์ํด ํํฐ์ ์๋ฅผ ๋๋ฐฐ๋ก ๋๋ฆฐ๋ค. Feature-map์ ํฌ๊ธฐ๋ฅผ ์ค์ผ ๋๋ pooling์ ์ฌ์ฉํ๋ ๋์ ์ convolution์ ์ํํ ๋, stride์ ํฌ๊ธฐ๋ฅผ โ2โ๋ก ํ๋ ๋ฐฉ์์ ์ทจํ๋ค.</li></ol><p>์ฐ์ฐ๋์ ๋ํด์๋ ์์ธํ ๋ฐฐ์ด ํ ๋ค์ ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ๋ค. ์ฐ์ , maxpooling๊ณผ dropout์ด ์ด ๋คํธ์ํฌ์์ ์ฐ์ด์ง ์์๋ค๊ณ ํ๋ค. ์ฐ์ด์ง ์์ ์ด์ ๋ฅผ ์๊ธฐ ์ ์ ๋จผ์ maxpooling๊ณผ dropout์ ์์๋ณด๊ฒ ๋ค.</p><hr><br><h2 id="maxpooling2d"><a href="#maxpooling2d" class="headerlink" title="maxpooling2d"></a>maxpooling2d</h2><p>convolution layer์ ์ถ๋ ฅ ์ด๋ฏธ์ง์์ ์ฃผ์๊ฐ๋ง ๋ฝ์ ํฌ๊ธฐ๊ฐ ์์ ์ถ๋ ฅ์์์ผ๋ก ๋ง๋๋ ์ญํ ์ด๋ค. ์ด layer๋ ์ฌ์ํ ๋ณํ๊ฐ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ํ๋ค.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">MaxPooling2D(pool_size = (<span class="number">2</span>,<span class="number">2</span>))</span><br></pre></td></tr></table></figure><p><code>pool_size</code>๊ฐ (2,2)์ด๋ฉด ์
๋ ฅ์์์ ํฌ๊ธฐ๊ฐ ์ ๋ฐ์ผ๋ก ์ค์ด๋ ๋ค.</p><p>์๋ฅผ ๋ค์ด, <code>input_shape</code>์ด 4X4 ์ด๊ณ , <code>pool_size</code>๊ฐ 2,2์ผ ๋๋ฅผ ๋์ํ ํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค. ๋
น์์ ์
๋ ฅ์์์, ๋
ธ๋์์ <code>pool_size</code>์ ๋ฐ๋ผ ๋๋ ๊ฒฝ๊ณ๋ฅผ, pool๋ง๋ค ๊ฐ์ฅ ํฐ๊ฐ(max)์ ์ ํํ์ฌ ํ๋๋ธ๋ญ์ผ๋ก ๋ง๋ค๋ฉด, ๊ทธ๊ฒ์ด <code>output</code>์ด ๋๋ค.</p><p align = "center"><img src ="http://tykimos.github.io/warehouse/2017-1-27_CNN_Layer_Talk_lego_12.png", width = "700px"></p><p>์ด๊ฒ์ด <code>translation</code>์ ๊ต์ฅํ ์ข์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ฒ๋๋๋ฐ ๊ทธ ์ด์ ๋ ๋ฐ์ ๊ทธ๋ฆผ์ ํตํด ํ๋์ ์์๋ณผ ์ ์๋ค.</p><p align = "center"><img src = "http://tykimos.github.io/warehouse/2017-1-27_CNN_Layer_Talk_lego_13.png", width = "700px"></p><p>๊ฒฐ๋ก ์ ์ผ๋ก ๋ถ๋ฅ ์์
์ ์ ๋ฆฌํ ๋ถ๋ณ์ฑ์ง(invariance)๋ฅผ ์ป์ ์ ์๋ ์ฅ์ ๋ ์๋ค.</p><p>ํ์ง๋ง ResNet-152์์๋ maxpooling์ ๊ฐ๊ธ์ ์ฌ์ฉํ์ง ์์๋ค(except 1 layer). maxpooling์ ์ด๋ฏธ์ง ๊ตฌ์ฑ์์์ ๊ณต๊ฐ๊ด๊ณ์ ๋ํ ์ ๋ณด๋ฅผ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ ์์น์ ์๊ด์์ด ๊ฐ์ฒด๋ฅผ ๋์ผํ๊ฒ ์ธ์ํ์ง๋ง, ๋ฐฉํฅ(orientation)์ด๋ ๋น์จ(proportion)์ด ๋ฌ๋ผ์ง๋ฉด ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด๋ก ์ธ์ํ๊ฒ ๋๋ค. ํนํ ์์ (viewpoint)๋ณํ์ ์ ๋
์ทจ์ฝํ๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด data augmentation์ ์ฌ์ฉํ์ง๋ง ํ์ต์๊ฐ์ด ์ฆ๊ฐํ๊ฒ ๋๋ ๋จ์ ์ด ์๊ธฐ๊ฒ ๋๋ค.</p><p>์ ํ๋ฆฌ ํํด๊ต์๋ CNN์ ์ธต์ ์๋ ๋์ , ์บก์๋ง์ ๊ณ ์ํด๋๋๋ฐ ์ด๋ ๋์ ๋ฒ์๋ฅผ ๋์ด๊ฐ๋ฏ๋ก ๋จผํ๋ .. ๋ค์ ๋ค๋ค๋ณด๊ฒ ๋ค.</p><hr><br><h2 id="dropout"><a href="#dropout" class="headerlink" title="dropout"></a>dropout</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Dropout(<span class="number">0.2</span>)</span><br></pre></td></tr></table></figure><p>layer๊ฐ ๋ง์์ง ๋ ๋ํ์ ์ผ๋ก ๋ฐ์ํ๋ ๋ฌธ์ ๋ overfitting์ด๋ค. ์๋ ๊ทธ๋ฆผ์ฒ๋ผ unseparableํ ์ํฉ์์๋ ๋ถ๊ตฌํ๊ณ ์ต์ง๋ก separateํ๋ ์ํฉ์ overfitting์ด๋ผ๊ณ ํ๋ค.</p><p><img src="/image/20210121_203242.jpg"></p><p>overfitting์ ๋ฐฉ์งํ๋ ๋ฐฉ๋ฒ์ ์ธ๊ฐ์ง๊ฐ ์๋ค๊ณ ํ๋ค.</p><ol><li>training data๋ฅผ ๋๋ฆฌ๊ธฐ</li><li>feature์ ์๋ฅผ ์ค์ด๊ธฐ</li><li><strong>regularization</strong></li></ol><p align= "center"><img src = "https://t1.daumcdn.net/cfile/tistory/2264014957A0248C2D"></p><p>์ด ์ค Dropout์ regularization์ ํด๋นํ๋ค. <code>reLU</code>๋ ์ด์ ํด๋นํ๋ค. Dropout์ ์ผ๋ถ neuron์ ์ ๊ฑฐํ์ฌ ๋ค์ ํ์ต์ ํ์ํ์ง ์๋๋ก ๋ง๋๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๊ฒ ์ ์ข์ ๋ฐฉ๋ฒ์ธ ๊ฒ์ธ๊ฐ?<br>โ์ฌ๊ณต์ด ๋ง์ผ๋ฉด ๋ฐฐ๊ฐ ์ฐ์ผ๋ก๊ฐ๋คโ๋ผ๊ณ ์๊ฐํ๋ฉด ์ข๋ค. ๊ณ ์์ด์์ ํ๋จํ ๋ ๊ท,๊ผฌ๋ฆฌ,๋ฐํฑ,์,๋ ๋ฑ์ ํ๋จํ๋ ์ฌ๋ฌ weight์ด ์๋ค๊ณ ์๊ฐํ ๋, dropout์ ํตํด ๋ช๊ฐ์ ๋
ธ๋๋ค์ ์ฌ๊ฒํ๋ ๊ฒ์ด๋ค.<br>์์ ์์ ์์๋ 20ํผ์ผํธ์ neuron๋ค์ ์ฌ๊ฒํ๋๊ฒ์ด๋ค. ๋
ธ๋๋ค์ ์ ๋ณด๋ ๋จ๊ธฐ๊ณ connection๋ง ์ญ์ ํ๋ <code>dropconnect</code>๊ฐ์ ๋ฐฉ๋ฒ๋ ์๋ค๊ณ ํ๋ค.</p><p>์์ ์ค๋ฒํผํ
์ ์ค์ด๊ธฐ ์ํด์ <code>ensenble</code>์ด๋ผ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค๊ณ ํ๋ค. ์ด๋ ResNet-152์์๋ ์ฌ์ฉํ๋ค๊ณ ํ๋๋ฐ 2~5%์ ๋์ ์์ธก๋ฅ ์ด ์ฌ๋ผ๊ฐ๋ค๊ณ ํ๋ค. ์ด๋ํ ๋์ค์ ๋ค๋ค๋ณด๊ฒ ๋ค.</p><h3 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h3><p><a href="https://tykimos.github.io/2017/01/27/CNN_Layer_Talk/">https://tykimos.github.io/2017/01/27/CNN_Layer_Talk/</a><br><a href="https://www.kakaobrain.com/blog/9">https://www.kakaobrain.com/blog/9</a><br><a href="http://blog.creation.net/mxnet-part-5-vgc16-resnet152">http://blog.creation.net/mxnet-part-5-vgc16-resnet152</a><br><a href="https://doorbw.tistory.com/147">https://doorbw.tistory.com/147</a><br><a href="https://pythonkim.tistory.com/42">https://pythonkim.tistory.com/42</a></p><p><a name="footnote_1">1</a> : Shah, P. H. & Venkatesh, R. Pulp/tooth ratio of mandibular frst and second molars on panoramic radiographs: an aid for forensic<br>age estimation. J. Forensic Dent. Sci. 8, 112. <a href="https://doi.org/10.4103/0975-1475.186374">https://doi.org/10.4103/0975-1475.186374</a> (2016).<br><a name="footnote_2">2</a> : Mathew, D. G. et al. Adult forensic age estimation using mandibular frst molar radiographs: a novel technique. J. Forensic Dent. Sci. 5, 56โ59. <a href="https://doi.org/10.4103/0975-1475.114552">https://doi.org/10.4103/0975-1475.114552</a> (2013).<br><a name="footnote_3">3</a> : He, K., Zhang, X., Ren, S. & Sun, J. Deep residual learning for image recognition. In 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), Las Vegas, NV, 2016, 770โ778, <a href="https://doi.org/10.1109/CVPR.2016.90">https://doi.org/10.1109/CVPR.2016.90</a>.</p>]]></content>
<categories>
<category> AAIS </category>
</categories>
<tags>
<tag> AI </tag>
<tag> AAIS </tag>
<tag> tensorflow </tag>
<tag> keras </tag>
</tags>
</entry>
<entry>
<title>[AAIS] E02. Convolution Layer - 1</title>
<link href="2021/01/21/aais-02/"/>
<url>2021/01/21/aais-02/</url>
<content type="html"><![CDATA[<h1 id="Conv2D-Layer"><a href="#Conv2D-Layer" class="headerlink" title="Conv2D Layer"></a>Conv2D Layer</h1><p>์ด๋ฒ ํฌ์คํธ์์๋ Conv2D Layer์ ๋ํด์ ์์ธํ ๋ค๋ค๋ณผ ์์ ์ด๋ค.</p><h2 id="Conv2D-parameters"><a href="#Conv2D-parameters" class="headerlink" title="Conv2D parameters"></a>Conv2D parameters</h2><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></pre></td><td class="code"><pre><span class="line">tf.keras.layers.Conv2D(</span><br><span class="line"> filters, kernel_size, strides=(<span class="number">1</span>, <span class="number">1</span>), padding=<span class="string">'valid'</span>,</span><br><span class="line"> data_format=<span class="literal">None</span>, dilation_rate=(<span class="number">1</span>, <span class="number">1</span>), groups=<span class="number">1</span>, activation=<span class="literal">None</span>,</span><br><span class="line"> use_bias=<span class="literal">True</span>, kernel_initializer=<span class="string">'glorot_uniform'</span>,</span><br><span class="line"> bias_initializer=<span class="string">'zeros'</span>, kernel_regularizer=<span class="literal">None</span>,</span><br><span class="line"> bias_regularizer=<span class="literal">None</span>, activity_regularizer=<span class="literal">None</span>, kernel_constraint=<span class="literal">None</span>,</span><br><span class="line"> bias_constraint=<span class="literal">None</span>, **kwargs</span><br><span class="line">)</span><br></pre></td></tr></table></figure><br><ol><li><code>filters</code> : convolution filter์ ์</li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Conv2D(<span class="number">1</span>, (<span class="number">2</span>, <span class="number">2</span>), padding=<span class="string">'same'</span>, input_shape=(<span class="number">3</span>, <span class="number">3</span>, <span class="number">1</span>))</span><br></pre></td></tr></table></figure><p>์ด ์ฝ๋๋ฅผ ๋์ํ ํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.</p><p align = "center"><img src = "http://tykimos.github.io/warehouse/2017-1-27_CNN_Layer_Talk_lego_5.png"></p><p>ํํฐ์ ๊ฐ์๊ฐ ์ฑ๋์ ์์๋ ์ฐ๊ด์ด ์์ผ๋ฏ๋ก input_shape์ ๊ณ ๋ คํด์ ํํฐ์ ๊ฐ์๋ฅผ ์ง์ ํด์ผ ํ๋ค. ์ด ํํฐ๋ฅผ ๊ฑฐ์น๊ฒ ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ <code>feature_map</code>์ ์ป๊ฒ ๋๋ค.</p><p align = "center"><img src = "https://wikidocs.net/images/page/64066/conv8.png"></p><p><a href="https://machinelearningmastery.com/how-to-visualize-filters-and-feature-maps-in-convolutional-neural-networks/">feature map์ ๋์ํํ๋ ๋ฐฉ๋ฒ</a>์ผ๋ก ๋์ผ๋ก ์ง์ <code>feature_map</code>์ ๋ณด๋ ๊ฒ๋ ์ข์ ๊ฒ ๊ฐ๋ค.</p><ol start="2"><li><code>kernel_size</code> : convolution filter์ (ํ,์ด)</li></ol><p>์์ ๊ฐ์ ๊ฒฝ์ฐ์๋ 2 X 2 filter๊ฐ ์กด์ฌํ๋ ๊ฒ์ด๋ค.</p><ol start="3"><li><code>strides</code> : filter๊ฐ strideํ๋ ๋จ์</li><li><code>padding</code> : ๊ฒฝ๊ณ์ฒ๋ฆฌ๋ฐฉ๋ฒ์ผ๋ก filter๋ฅผ ๊ฑฐ์น feature map์ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ ์ง๋ ์์์ด๊ธฐ๋ ํ๋ค.</li></ol><p align = "center"><img src ="https://wikidocs.net/images/page/64066/conv10.png"></p><p>option์ด <code>valid</code>์ผ ๊ฒฝ์ฐ ์ ํจํ ์์ญ๋ง ์ถ๋ ฅ์ด ๋๋ฏ๋ก ์ถ๋ ฅ์ด๋ฏธ์ง ์ฌ์ด์ฆ๊ฐ ์
๋ ฅ ์ฌ์ด์ฆ๋ณด๋ค ์์์ง ๊ฒ์ด๋ค.<br>option์ด <code>same</code>์ผ ๊ฒฝ์ฐ ์
๋ ฅ์ฌ์ด์ฆ์ ๋์ผํ๊ฒ ํ,์ด์ ์ถ๊ฐํ๋ฉฐ ์ฃผ๋ก <code>zero padding</code>์ ์ฌ์ฉํ๋ค. <code>zero padding</code>์ ์ฌ์ฉํ๋ฉด ์ข์ ์ ์ ์์์ ํฌ๊ธฐ๋ฅผ ๋์ผํ๊ฒ ๋ง์ถ ๋ฟ๋ง ์๋๋ผ <strong>๊ฒฝ๊ณ๋ฉด์ ์ ๋ณด๊น์ง ์ด๋ฆด ์๊ฐ ์์ด</strong> ๋ ์ข์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ฒ ๋๋ค.</p><ol start="5"><li><code>input_shape</code> = (ํ, ์ด, ์ฑ๋์)๋ก ์ ์ํ๋ฉฐ ๋ชจ๋ธ์์ ์ฒซ ๋ ์ด์ด๋ง ์ ์ํ๋ค. ์ฑ๋์๋ ํ๋ฐฑ์ผ๊ฒฝ์ฐ 1, ์ปฌ๋ฌ์ผ๊ฒฝ์ฐ 3์ผ๋ก ์ค์ ํ๋ค.</li><li><code>activation</code> = ํ์ฑํํจ์๋ฅผ ์ ์ํ ๊ฒ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์ฃผ๋ก ๋ค๋ฃฐ ๊ฒ์ <code>relu</code>,<code>softmax</code>์ด๋ค. ์ด๋ ๋ค์์ ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ๋ค.</li></ol><p>๋ค๋ฅธ parameter๋ค์ ํ์ํ ๋ ์ดํด๋ณด๋๋ก ํ๊ฒ ๋ค.</p><h2 id="parameter-์-๊ณ์ฐํ๊ธฐ"><a href="#parameter-์-๊ณ์ฐํ๊ธฐ" class="headerlink" title="parameter ์ ๊ณ์ฐํ๊ธฐ"></a>parameter ์ ๊ณ์ฐํ๊ธฐ</h2><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">from</span> tensorflow.keras.models <span class="keyword">import</span> Sequential</span><br><span class="line"><span class="keyword">from</span> tensorflow.keras.layers <span class="keyword">import</span> Dense, Conv2D , MaxPool2D , Flatten , Dropout , BatchNormalization</span><br><span class="line"></span><br><span class="line">num_classes = <span class="number">25</span></span><br><span class="line"></span><br><span class="line">model = Sequential()</span><br><span class="line">model.add(Conv2D(<span class="number">75</span> , (<span class="number">3</span>,<span class="number">3</span>) , strides = <span class="number">1</span> , padding = <span class="string">'same'</span> , activation = <span class="string">'relu'</span> , input_shape = (<span class="number">28</span>,<span class="number">28</span>,<span class="number">1</span>)))</span><br><span class="line">model.add(BatchNormalization())</span><br><span class="line">model.add(MaxPool2D((<span class="number">2</span>,<span class="number">2</span>) , strides = <span class="number">2</span> , padding = <span class="string">'same'</span>))</span><br><span class="line">model.add(Conv2D(<span class="number">50</span> , (<span class="number">3</span>,<span class="number">3</span>) , strides = <span class="number">1</span> , padding = <span class="string">'same'</span> , activation = <span class="string">'relu'</span>))</span><br><span class="line">model.add(Dropout(<span class="number">0.2</span>))</span><br><span class="line">model.add(BatchNormalization())</span><br><span class="line">model.add(MaxPool2D((<span class="number">2</span>,<span class="number">2</span>) , strides = <span class="number">2</span> , padding = <span class="string">'same'</span>))</span><br><span class="line">model.add(Conv2D(<span class="number">25</span> , (<span class="number">3</span>,<span class="number">3</span>) , strides = <span class="number">1</span> , padding = <span class="string">'same'</span> , activation = <span class="string">'relu'</span>))</span><br><span class="line">model.add(BatchNormalization())</span><br><span class="line">model.add(MaxPool2D((<span class="number">2</span>,<span class="number">2</span>) , strides = <span class="number">2</span> , padding = <span class="string">'same'</span>))</span><br><span class="line">model.add(Flatten())</span><br><span class="line">model.add(Dense(units = <span class="number">512</span> , activation = <span class="string">'relu'</span>))</span><br><span class="line">model.add(Dropout(<span class="number">0.3</span>))</span><br><span class="line">model.add(Dense(units = num_classes , activation = <span class="string">'softmax'</span>))</span><br><span class="line">model.summary()</span><br></pre></td></tr></table></figure><pre><code> Model: "sequential_4" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d_6 (Conv2D) (None, 28, 28, 75) 750 _________________________________________________________________ batch_normalization (BatchNo (None, 28, 28, 75) 300 _________________________________________________________________ max_pooling2d (MaxPooling2D) (None, 14, 14, 75) 0 _________________________________________________________________ conv2d_7 (Conv2D) (None, 14, 14, 50) 33800 _________________________________________________________________ dropout (Dropout) (None, 14, 14, 50) 0 _________________________________________________________________ batch_normalization_1 (Batch (None, 14, 14, 50) 200 _________________________________________________________________ max_pooling2d_1 (MaxPooling2 (None, 7, 7, 50) 0 _________________________________________________________________ conv2d_8 (Conv2D) (None, 7, 7, 25) 11275 _________________________________________________________________ batch_normalization_2 (Batch (None, 7, 7, 25) 100 _________________________________________________________________ max_pooling2d_2 (MaxPooling2 (None, 4, 4, 25) 0 _________________________________________________________________ flatten (Flatten) (None, 400) 0 _________________________________________________________________ dense (Dense) (None, 512) 205312 _________________________________________________________________ dropout_1 (Dropout) (None, 512) 0 _________________________________________________________________ dense_1 (Dense) (None, 25) 12825 ================================================================= Total params: 264,562 Trainable params: 264,262 Non-trainable params: 300 _________________________________________________________________</code></pre><p>์์ <code>summary</code>๋ ๋ค๋ฅธ data๋ค์ ํ์ต์ํจ ๊ฒฐ๊ณผ๋ก ๋ฐฐํฌํ ์ ์๋ ๋ฐ์ดํฐ๋ค์ด๊ธฐ ๋๋ฌธ์ <code>summary</code>๋ฅผ ํตํด์ param number๋ง ๊ณ์ฐํด ๋ณด๋๋ก ํ๊ฒ ๋ค.</p><br><hr><h3 id="convolution-layer-1์-activation-map-ํฌ๊ธฐ-๊ณ์ฐ"><a href="#convolution-layer-1์-activation-map-ํฌ๊ธฐ-๊ณ์ฐ" class="headerlink" title="convolution layer 1์ activation map ํฌ๊ธฐ ๊ณ์ฐ"></a>convolution layer 1์ activation map ํฌ๊ธฐ ๊ณ์ฐ</h3><p align = "center"><img src = "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCGGUL%2FbtqFo5oGkOV%2F0ZFkRKpAeFeNPkYuzAAbWK%2Fimg.png"></p><p>Width Output Size = (W - F + 2P) / S + 1<br>W: input_volume_size(width)<br>F: kernel_size(width)<br>P: padding_size(width)<br>S: strides</p><p>์ฒซ๋ฒ์งธ convolution layer๋ฅผ ์ง๋๋ฉด <code>Width</code> = 28, <code>kernel_size(width)</code> = 3, <code>padding_size</code> = 1, <code>strides</code> = 1 ์ด๋ฏ๋ก ๊ณ์ฐํ๋ฉด <code>width output</code>์ 28์ด ๋๋ค.<br><code>filters</code>์ ์๊ฐ 75์ด๋ฏ๋ก output size = (28,28,75)๊ฐ ๋๋ค.</p><br><p>์ด๋ฅผ ๊ฐ๋จํ ๊ทธ๋ฆผ์ผ๋ก ๋ณด์ด๊ฒ ๋ค.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Conv2D(<span class="number">3</span>, (<span class="number">2</span>, <span class="number">2</span>), padding=<span class="string">'same'</span>, input_shape=(<span class="number">3</span>, <span class="number">3</span>, <span class="number">1</span>))</span><br></pre></td></tr></table></figure><p align = "center"><img src = "http://tykimos.github.io/warehouse/2017-1-27_CNN_Layer_Talk_lego_6.png"></p><p>ํํฐ๊ฐ 3๊ฐ๋ผ์ ์ถ๋ ฅ ์ด๋ฏธ์ง๋ ํํฐ ์์ ๋ฐ๋ผ 3๊ฐ๋ก ๋์ด๋๋ค.<br>ํํฐ๋ง๋ค ๊ณ ์ ํ ํน์ง์ ๋ฝ์ ๊ณ ์ ํ ์ถ๋ ฅ ์ด๋ฏธ์ง๋ก ๋ง๋ค๊ธฐ ๋๋ฌธ์ ํํฐ์ ์ถ๋ ฅ๊ฐ์ ๋ํด์ ํ๋์ ์ด๋ฏธ์ง๋ก ๋ง๋ค์ง ์๋๋ค.</p><p>์์ ๊ฒฝ์ฐ๋ ์ฑ๋์ด 1๊ฐ์ผ ๋๊ณ ์ฑ๋์ด ์ฌ๋ฌ๊ฐ์ผ ๋๋ฅผ ๋์ํ ํ๊ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Conv2D(<span class="number">2</span>, (<span class="number">2</span>, <span class="number">2</span>), padding=<span class="string">'same'</span>, input_shape=(<span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>))</span><br></pre></td></tr></table></figure><p>input_shape์ด <code>(3,3,3)</code>์ด๋ฏ๋ก 3X3์ด๋ฏธ์ง๊ฐ 3๊ฐ์ ์ฑ๋๋ก ์กด์ฌํ๋ค๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ํํฐ๋ฅผ 2๊ฐ๋ฅผ ์ฃผ๊ณ ํํฐ์ ์ฌ์ด์ฆ๋ฅผ 2X2๋ก ํ๊ฒ๋๋ค๋ฉด ์๋์ ๊ทธ๋ฆผ์ฒ๋ผ ํํฐ 1๊ฐ๋ง๋ค ์ฑ๋ 1๊ฐ์ฉ ๊ณฑ์ด convolution์ด ์งํ๋๊ณ ๋ค์ ํ๊ฐ์ layer๋ก ํฉ์ณ์ง๋ฏ๋ก ๊ฒฐ๋ก ์ ์ผ๋ก๋ 3X3์ฌ์ด์ฆ์ 2๊ฐ์ ์ฑ๋์ด ๋ง๋ค์ด์ง๋ฏ๋ก output_shape์ <code>(3,3,2)</code>์ผ ๊ฒ์ด๋ค.</p><p align = "center"><img src = "http://tykimos.github.io/warehouse/2017-1-27_CNN_Layer_Talk_lego_10.png"></p><p>์ฆ ํํฐ์ ๊ฐ์๋งํผ์ layer๊ฐ ์์ด๊ฒ ๋๊ณ ์ค๊ฐ์ ์ปจ๋ฒ๋ฃจ์
๊ณฑ์ด ์ด๋ฃจ์ด์ง ๊ฒ์ด๋ฏ๋ก feature map์ ๋น์ฐํ ๋ค๋ฅธ ๊ฒ์ด๋ค.</p><br><p>์ด์ ํ๋ผ๋ฏธํฐ์ ์๋ฅผ ๊ตฌํด๋ณด๊ฒ ๋ค. ๊ทธ ์์ ๋ค์๊ณผ ๊ฐ๋ค.</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">number_parameters = out_channels * (in_channels * kernel_h * kernel_w + 1) # 1 for bias</span><br></pre></td></tr></table></figure><p>์ฌ๊ธฐ์ <code>out_channels</code>์ด๋ ํํฐ์ ๊ฐ์์ ๋์ผํ๋ค.</p><figure class="highlight plain"><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">in_channels = 1</span><br><span class="line">out_channels = 75</span><br><span class="line">kernel_h = kernel_w = 3</span><br><span class="line">number_parameters = 75(1*3*3 + 1) = 750</span><br></pre></td></tr></table></figure><p>์ฐ๋ฆฌ์ <code>summary</code>์์ ํ์ธํ 750์ ์์๊ฐ์ด ๊ณ์ฐ๋ ๊ฒ์ด๋ค.</p><br><hr><h3 id="convolution-layer-2์-activation-map-ํฌ๊ธฐ-๊ณ์ฐ"><a href="#convolution-layer-2์-activation-map-ํฌ๊ธฐ-๊ณ์ฐ" class="headerlink" title="convolution layer 2์ activation map ํฌ๊ธฐ ๊ณ์ฐ"></a>convolution layer 2์ activation map ํฌ๊ธฐ ๊ณ์ฐ</h3><p><code>max_pooling2d</code>๋ฅผ ์ง๋๋ฉด <code>output_shape</code>์ <code>(14,14,75)</code>๊ฐ ๋๋ค. ์ด๋ conv2d์ <code>input_shape</code>์ด ๋๋ค. (๊ทธ๋์ ์ฒซ๋ฒ์งธ ๋ ์ด์ด์์๋ง input_shape์ ์ ์ํ๋ ๊ฒ์ด๋ค.)</p><figure class="highlight plain"><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">in_channels = 75</span><br><span class="line">out_channels = 50</span><br><span class="line">kernel_h = kernel_w = 3</span><br><span class="line">number_parameters = 75(50*3*3 + 1) = 33825</span><br></pre></td></tr></table></figure><p>๋๋ฒ์งธ conv2d์ ํ๋ผ๋ฏธํฐ์ ์๋ ์๊ณ์ฐ๋์๋ค. ์ด์ฒ๋ผ <code>Layer</code>๋ค์ ์ง๋๋ค๋ณด๋ฉด <code>in_channels</code>์ ์๊ฐ ์ฆ๊ฐํ์ฌ <code>parameters</code>์ ์๊ฐ ๊ธ๊ฒฉํ ์ฆ๊ฐํ๊ฒ ๋๋๋ฐ ์ด๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ๋ค์์ ๋ค๋ค๋ณด๊ฒ ๋ค~</p><br><hr><h3 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h3><p><a href="https://tykimos.github.io/2017/01/27/CNN_Layer_Talk/">https://tykimos.github.io/2017/01/27/CNN_Layer_Talk/</a><br><a href="https://underflow101.tistory.com/38?category=826164">https://underflow101.tistory.com/38?category=826164</a><br><a href="https://blog.naver.com/laonple/220587920012">https://blog.naver.com/laonple/220587920012</a></p>]]></content>
<categories>
<category> AAIS </category>
</categories>
<tags>
<tag> AI </tag>
<tag> AAIS </tag>
<tag> tensorflow </tag>
<tag> keras </tag>
</tags>
</entry>
<entry>
<title>[Java]Day03 - ์ฐ์ฐ์</title>
<link href="2021/01/20/java-day3/"/>
<url>2021/01/20/java-day3/</url>
<content type="html"><![CDATA[<h2 id="JAVA-NEWS"><a href="#JAVA-NEWS" class="headerlink" title="JAVA NEWS"></a>JAVA NEWS</h2><p>์ค๋์ ๋ค์ด๊ฐ๊ธฐ์ ์์ ์คํฐ๋์์ ๋ค๋ฃฌ ๋ด์ฉ์ ์ดํด๋ณด๊ฒ ๋ค.</p><h3 id="Maven-Dependencies-Pop-Quiz"><a href="#Maven-Dependencies-Pop-Quiz" class="headerlink" title="Maven Dependencies Pop Quiz"></a><a href="http://andresalmiray.com/maven-dependencies-pop-quiz-results/">Maven Dependencies Pop Quiz</a></h3><p align = "center"><img src = "http://andresalmiray.com/wp-content/uploads/2020/03/pop-mvn01-768x629.png"></p><p>์ ๋ต์ <code>28.2version</code>์ด๋ค.<br>dependency๋ ๋์ผํ groupId์ผ ๊ฒฝ์ฐ ๊ฐ์ฅ ๋ง์ง๋ง์ ์๋ ๋ฒ์ ผ์ด ์์ ์๋ ๊ฒ์ ์ค๋ฒ๋ผ์ด๋ฉํ๋ค๊ณ ์๊ฐํ๋ฉด ์ข๋ค.</p><p align = "center"><img src = "http://andresalmiray.com/wp-content/uploads/2020/03/pop-mvn02-768x660.png"></p><p>์ ๋ต์ <code>28.2version</code>์ด๋ค.<br>dependency๋ ๊ฐ์ฅ POMํ์ผ์ ๋ช
ํํ๊ฒ ์ ์๋ ๊ฒ์ผ๋ก ์ ์ํ๋ค.<br>truth์ 27.0.1version์ 28.2v๋ณด๋ค depth๊ฐ ๊น๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.</p><p align = "center"><img src = "http://andresalmiray.com/wp-content/uploads/2020/03/pop-mvn03-768x734.png"></p><p>์ ๋ต์ <code>27.0version</code>์ด๋ค.<br>dependencyManagement(์ดํ DM)๋ ์ถ์ด์ (transitive)์ผ๋ก ์ ์๋ dependency๋ณด๋ค๋ ๊ฐ๊น๋ค.</p><p align = "center"><img src = "http://andresalmiray.com/wp-content/uploads/2020/03/pop-mvn04-768x854.png"></p><p>์ ๋ต์ <code>27.0version</code>์ด๋ค.<br>DM์ dependency๋ณด๋ค๋ ์กฐ๊ธ ๋ฉ๋ค. DM์ ์ด๋ค๋ฒ์ ผ์ ์ธ์ง ๋ช
์ํด๋์ ๊ฒ์ด๋ค. ๋ง์ฝ guava 28.2-jre๋ฅผ ์ ๊ฑฐํ ๊ฒฝ์ฐ 27.0 version์ด ์ ์ฉ์ด ๋ ๊ฒ์ด๋ค.</p><p>๊ฒฐ๋ก ์ ์ผ๋ก๋ dependency > DM > ์ถ์ด์ ์ ์ ์์๋๋ก ์ ์๊ฐ ๋๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.</p><h2 id="Review-Day02"><a href="#Review-Day02" class="headerlink" title="Review Day02"></a>Review Day02</h2><blockquote><p>Q1. Java์ unsigned์ด ์กด์ฌํ๋๊ฐ?</p></blockquote><p>์ ๋ต์ <code>Yes</code>์ด๋ค. ์ ํํ๋ java8 ์ด์ ๊น์ง๋ unsignedํ์ด ์กด์ฌํ์ง ์๋๋ค. C์์๋ <code>unsigned int</code>๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ง๋ง java์๋ ์ด๊ฐ ์กด์ฌํ์ง ์๋๋ค. <code>int unsigned = Integer.parseUnsignedInt("21์ต์ด์")</code>์ด๋ผ๊ณ ํ ์ <code>Integer.toUnsignedString(unsigned)</code>๋ก ์ถ๋ ฅ์ ํ๋๊ฒ์ ๊ฐ๋ฅํ๋ค. ํ์ง๋ง ์ด๋ ์ข์ ๋ฐฉ๋ฒ์ด ์๋๋ฏ๋ก ๊ทธ๋ฅ <code>BigInteger</code>๋ฅผ ์ฌ์ฉํ์! (<strong>L์ ๋ฃ์ด์ผํ๋ค.</strong>)</p><blockquote><p>Q2. <code>int number = 1_000;</code>์ด ์ ์๊ฐ ๋๋๊ฐ?</p></blockquote><p>์ ๋ต์ <code>Yes</code>์ด๋ค. ์ซ์๋ฅผ ํํํ ๋ ๊ฐ๋
์ฑ์ด ์ข๊ฒ ํ๊ธฐ์ํด ์ธ๋๋ฐ(_)๋ฅผ ํตํด ์ ์ํ ์ ์๋ค.</p><p>๋ ํ๋์ ์ค์ํ ์ ์ Static ๋ณ์์ Instance๋ณ์์ ๋ผ์ดํ์ฌ์ดํด์ด๋ค.<br>Static์ ๋ผ์ดํ์ฌ์ดํด์ ํด๋์ค๊ฐ ๋ก๋ฉ๋ ์์ ์ด์ง๋ง Instance๋ณ์์ ๋ผ์ดํ์ฌ์ดํด์ ํด๋์ค๊ฐ ์์ฑ๋ ์์ ์ด๋ฏ๋ก instance๊ฐ ์์ฑ๋๊ธฐ ์ด์ ์๋ instance๋ณ์๊ฐ ์กด์ฌํ์ง ์๋๋ค ๋ฐ๋ผ์ static์ instance ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ค. ์ด๋ ์ค์ํ ๋ด์ฉ์ด๋ฏ๋ก ๋ชจ๋ฅด๋ฉด ์ฐพ์๋ณด์<br>์ค๋์ ๋ฆฌ๋ทฐ๋ ์งง๊ฒ ํ๊ณ DAY03 ์์ํด๋ณด๊ฒ ๋ค.</p><h2 id="Day03-์ฐ์ฐ์"><a href="#Day03-์ฐ์ฐ์" class="headerlink" title="Day03. ์ฐ์ฐ์"></a>Day03. ์ฐ์ฐ์</h2><p>์ฐ์ ์ฐ์ฐ์, ๋นํธ ์ฐ์ฐ์, ๊ด๊ณ ์ฐ์ฐ์, ๋
ผ๋ฆฌ ์ฐ์ฐ์, assignment(=) operator, 3ํญ ์ฐ์ฐ์ ๊ทธ๋ฆฌ๊ณ ์ฐ์ฐ์ ์ฐ์ ์์๋ ๋์ด๊ฐ๋ณด๋๋ก ํ ๊ฒ์ด๋ค. ์๊ฐ์ด ๋ถ์กฑํด์ ๋ค๋ฅธ ๊ฒ๋ค์ ๋ ์ง์คํด๋ณด๋๋ก ํ๊ฒ ๋ค. ์ด์ ๋ํด์๋ <a href="https://www.notion.so/3-f3a94e0092664d8aa1debe7e88dec43b">์ด ๋ธ๋ก๊ทธ</a>์์ ๊น๋ํ ๋ค๋ค์ผ๋ฏ๋ก ์ฐธ๊ณ ํ๋ฉด ์ข๊ฒ ๋ค.</p><h3 id="instanceof-์ฐ์ฐ์"><a href="#instanceof-์ฐ์ฐ์" class="headerlink" title="instanceof ์ฐ์ฐ์"></a>instanceof ์ฐ์ฐ์</h3><p>์ฐธ์กฐ๋ณ์๊ฐ ์ฐธ์กฐํ๊ณ ์๋ ์ธ์คํด์ค์ ์ค์ ํ์
์ ์์๋ณด๊ธฐ ์ํด instanceof ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค.<br>์ฃผ๋ก <strong>์กฐ๊ฑด๋ฌธ</strong>์์ ์ฌ์ฉ๋๋ฉฐ, ์ผ์ชฝ์๋ ์ฐธ์กฐ๋ณ์๋ฅผ ์ค๋ฅธ์ชฝ์๋ ํ์
(class name)์ ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ booleanํ์ธ <code>true</code>๋ <code>false</code>๋ฅผ ๋ฐํํ๋ค.</p><p> instanceof๋ฅผ ์ด์ฉํ ์ฐ์ฐ๊ฒฐ๊ณผ๋ก true๋ฅผ ์ป์๋ค๋ ๊ฒ์ ์ฐธ์กฐ๋ณ์๊ฐ ๊ฒ์ฌํ ํ์
์ผ๋ก ํ๋ณํ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋ปํ๋ค.</p><figure class="highlight java"><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"><span class="function"><span class="keyword">void</span> <span class="title">doWork</span><span class="params">(Car c)</span></span>{</span><br><span class="line"><span class="keyword">if</span>(c <span class="keyword">instanceof</span> FireEngine){</span><br><span class="line"> FireEngine fe = (FireEngine)c;</span><br><span class="line"> fe.water();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span>(c instance of Ambulance){</span><br><span class="line"> Ambulance a = (Ambulance)c;</span><br><span class="line"> a.siren();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>์์ ์ฝ๋๋ Carํ์
์ ์ฐธ์กฐ๋ณ์์ธ c๋ฅผ ๋งค๊ฐ๋ณ์๋ก ํ๋ ๋ฉ์๋์ด๋ค. ์ด ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋, ๋งค๊ฐ๋ณ์๋ก Carํด๋์ค ํน์ ๊ทธ ์์ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋๊ฒจ๋ฐ๊ฒ ์ง๋ง ๋ฉ์๋ ๋ด์์๋ ์ ํํ ์ด๋ค ์ธ์คํด์ค์ธ์ง ์ ์๊ฐ ์๋ค. ๋ฐ๋ผ์, <code>instanceof</code>์ฐ์ฐ์๋ฅผ ์ด์ฉํด์ ์ฐธ์กฐ๋ณ์ c๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋ ์ธ์คํด์ค์ ํ์
์ ์ฒดํฌํ๊ณ ์ ์ ํ ํ๋ณํ์ ํ ๋ค์์ ์์
์ ํด์ผํ๋ค.</p><p>์์ ์ฝ๋์์๋ c๋ผ๋ ์ฐธ์กฐ๋ณ์๊ฐ FireEngine์ธ์ง Ambulance์ธ์ง ๊ตฌ๋ถ์ ์ํจ ํ ๊ฐ๊ฐ์ ๋ง์ถฐ์ ํ๋ณํ์ ์ด๋ฃฌ ํ ๋ฉ์๋๋ฅผ ์คํํ๋ค. ์ด๋ ์ ๋ง ์ค์ํ ์์
์ด๋ค.</p><p>๊ทธ๋ฆฌ๊ณ ๋ํ ์ค์ํ ๊ฒ์ ๋ง์ฝ c๋ผ๋ ์ฐธ์กฐ๋ณ์๊ฐ FireEngine์ด๋ผ ํด๋ <code>c instance of Car</code>์ ๊ตฌ๋ฌธ์์๋ <code>true</code>๋ฅผ ๋ฐํํ๋ค๋ ์ ๊ณผ ๋ชจ๋ ํด๋์ค์ ์กฐ์ํด๋์ค์ธ <code>Object</code>์ ์ธ์คํด์ค ์ด๊ธฐ๋ ํ๋ค๋ ๊ฒ์ด๋ค. ์ฆ, ์ค์ ์ธ์คํด์ค์ ๊ฐ์ ํ์
์ instanceof์ฐ์ฐ ์ด์ธ์ ์กฐ์ํ์
์ instanceof์ฐ์ฐ์๋ true๋ฅผ ๊ฒฐ๊ณผ๋ก ์ป์ผ๋ฉฐ, <strong>instanceof์ฐ์ฐ์ ๊ฒฐ๊ณผ๊ฐ true๋ผ๋ ๊ฒ์ ๊ฒ์ฌํ ํ์
์ผ๋ก์ ํ๋ณํ์ ํด๋ ๋ฌธ์ ๊ฐ ์๋ค๋ ๋ป์ด๋ค.</strong></p><h3 id="ํ์ดํ-gt-์ฐ์ฐ์"><a href="#ํ์ดํ-gt-์ฐ์ฐ์" class="headerlink" title="ํ์ดํ(->) ์ฐ์ฐ์"></a>ํ์ดํ(->) ์ฐ์ฐ์</h3><p>์๋ฐ๊ฐ ๋ฑ์ฅํ ์ดํ๋ก ๋ ๋ฒ์ ํฐ ๋ณํ๊ฐ ์์๋๋ฐ, ํ๋ฒ์ 5๋ฒ์ ผ์ <code>์ง๋ค๋ฆญ์ค</code>์ 8๋ฒ์ ผ์ <code>๋๋ค์</code>์ด๋ค. ->์ฐ์ฐ์๋ ์ด ๋๋ค์์ด๋ค.<br>๋๋ค์์ ๋์
์ผ๋ก ์๋ฐ๋ ๊ฐ์ฒด์งํฅ์ธ์ด์๊ณผ ๋์์ ํจ์ํ ์ธ์ด๊ฐ ๋์๋ค.</p><blockquote><p>๋๋ค์์ด๋?</p></blockquote><p> ๋๋ค์์ ๋ํด ๊ฐ๋จํ ๋จผ์ ์ค๋ช
ํ์๋ฉด, ๋ฉ์๋๋ฅผ ํ๋์ โ์(Expression)โ์ผ๋ก ํํํ ๊ฒ์ ๋งํ๋ค. ๋๋ค์์ ํจ์๋ฅผ ๊ฐ๋ตํ๋ฉด์๋ ๋ช
ํํ ์์ผ๋ก ํํํ ์ ์๊ฒ ํด์ค๋ค.<br> ๋ฉ์๋๋ฅผ ๋๋ค์์ผ๋ก ํํํ๋ฉด ๋ฉ์๋์ ์ด๋ฆ๊ณผ ๋ฐํ๊ฐ์ด ์์ด์ง๋ฏ๋ก, ๋๋ค์์ โAnonymous funcionโ์ด๋ผ๊ณ ๋ ํ๋ค.</p><p>์๋์ ๊ฐ์ด ์ ์ธ๋ ๋งค๊ฐ๋ณ์๊ฐ ํ๋๋ฟ์ธ ๊ฒฝ์ฐ์๋ ๊ดํธ()๋ฅผ ์๋ตํ ์ ์๋ค. ๋จ, ๋งค๊ฐ๋ณ์์ ํ์
์ด ์์ผ๋ฉด ๊ดํธ()๋ฅผ ์๋ตํ ์ ์๋ค.</p><figure class="highlight java"><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">(a) -> a*a <span class="comment">// OK</span></span><br><span class="line">(<span class="keyword">int</span> a) -> a*a <span class="comment">// Error</span></span><br></pre></td></tr></table></figure><p>๋ง์ฐฌ๊ฐ์ง๋ก ๊ดํธ{}์์ ๋ฌธ์ฅ์ด ํ๋์ผ ๋๋ ๊ดํธ{}๋ฅผ ์๋ตํ ์ ์๋ค. ์ด ๋ ๋ฌธ์ฅ์ ๋์ โ;โ๋ฅผ ๋ถ์ด์ง ์์์ผ ํ๋ค๋ ๊ฒ์ ์ฃผ์ํ์.</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">(String name, <span class="keyword">int</span> i) -> System.out.println(name+<span class="string">"="</span>+i)</span><br></pre></td></tr></table></figure><p>๊ทธ๋ฌ๋ ๊ดํธ{}์์ ๋ฌธ์ฅ์ด return๋ฌธ์ผ ๊ฒฝ์ฐ์๋ ๊ดํธ๋ฅผ{}์๋ตํ ์ ์๋ค.</p><p>๋๋ค์์ ๋ํด์๋ ์ค์ํ ๋ด์ฉ์ด๋ฏ๋ก ๋์์์ค์ ๋ค์ ์ ๋๋ก ๋ค๋ค๋ณด๊ฒ ๋ค.</p><h3 id="Optional"><a href="#Optional" class="headerlink" title="Optional"></a>Optional</h3><p>Optional๋ ์ ๋ง ์ค์ํ ๋ด์ฉ์ด์ง๋ง ์ฐ์ ์ง๊ธ ๋ค๋ฃจ๊ธฐ์ ๋๋ฌด ๋ด์ฉ์ด ๋ง์ผ๋ฏ๋ก ๊ฐ๋ตํ ๋ค๋ค๋ณด๊ฒ ๋ค.<br>Optional class๋ ์ง๋ค๋ฆญ(generic)ํด๋์ค(๋ฒ์จ ๋ฒ์๋ฅผ ๋์ด๊ฐ๋ค.)๋ก์จ โTํ์
์ ๊ฐ์ฒดโ๋ฅผ ๊ฐ์ธ๋ ๋ํผ(wrapper) ํด๋์ค์ด๋ค. ๊ทธ๋์ Optionalํ์
์ ๊ฐ์ฒด์๋ <code>๋ชจ๋ ํ์
์ ์ฐธ์กฐ๋ณ์</code>๋ฅผ ๋ด์ ์ ์๋ค.</p><figure class="highlight java"><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"><span class="keyword">public</span> <span class="keyword">final</span> <span class="class"><span class="keyword">class</span> <span class="title">Optional</span><<span class="title">T</span>></span>{</span><br><span class="line"><span class="keyword">private</span> <span class="keyword">final</span> T value; <span class="comment">// Tํ์
์ ์ฐธ์กฐ๋ณ์</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>์ต์ข
์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋ฅ ๋ฐํํ๋ ๊ฒ์ด ์๋๋ผ Optional๊ฐ์ฒด์ ๋ด์์ ๋ฐํํ๋ ๊ฒ์ด๋ค.์ด์ฒ๋ผ ๊ฐ์ฒด์ ๋ด์์ ๋ฐํ์ ํ๋ฉด, ๋ฐํ๋ ๊ฒฐ๊ณผ๊ฐ null์ธ์ง ๋งค๋ฒ if๋ฌธ์ผ๋ก ์ฒดํฌํ๋ ๋์ Optional์ ์ ์๋ ๋ฉ์๋๋ฅผ ํตํด์ ๊ฐ๋จํ ์ฒ๋ฆฌํ ์ ์๋ค.<br> ์ฆ, Null์ฒดํฌ๋ฅผ ์ํ if๋ฌธ ์์ด๋ <code>NullPointerException</code>์ด ๋ฐ์ํ์ง ์๋ ์์ ํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ง ๊ฒ์ด๋ค.<br>์์ธํ ๋ด์ฉ์ <a href="https://velog.io/@bluesky7017/%EC%9E%90%EB%B0%94%EA%B0%80-%EC%A0%9C%EA%B3%B5%ED%95%98%EB%8A%94-%EB%8B%A4%EC%96%91%ED%95%9C-%EC%97%B0%EC%82%B0%EC%9E%90%EB%A5%BC-%ED%95%99%EC%8A%B5%ED%95%98%EC%84%B8%EC%9A%94">์ด ๋ธ๋ก๊ทธ</a>์์ ์ฐธ๊ณ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.</p><h3 id="๊ฒฐ๋ก "><a href="#๊ฒฐ๋ก " class="headerlink" title="๊ฒฐ๋ก "></a>๊ฒฐ๋ก </h3><p>์ด๋ฒ ์ฐ์ฐ์๋จ์์์๋ ๋ด๊ฐ ํฌ๊ฒ ๋ค๋ฃฌ ๊ฒ์ ์๋ค. ->์ฐ์ฐ์๋ ๋ค์ ๋๋ค์์ ๋ค๋ฃจ๋ฉฐ ์์ธํ ๋ค๋ค์ผํ ๋ด์ฉ์ด๋ฉฐ Optional๋ ๊ทธ๋ฌํ๋ค. ์ง๋๋ฅผ ๋นจ๋ฆฌ ๋๊ฐ๊ธฐ ์ํด ์ฐ์ฐ์์ ๋ํ ๋ด์ฉ์ ์์ ์ฐธ์กฐ๋ ๋งํฌ๋ค์ ๋ณด๋ฉด ์ข์ ๊ฒ์ด๋ค.</p><h3 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h3><ul><li>์๋ฐ์ ์ ์</li></ul>]]></content>
<categories>
<category> Java </category>
</categories>
<tags>
<tag> java8 </tag>
</tags>
</entry>
<entry>
<title>[AAIS]E01.Using Deep Learning Tools</title>
<link href="2021/01/20/aais-01/"/>
<url>2021/01/20/aais-01/</url>
<content type="html"><![CDATA[<h1 id="Using-Deep-Learning-Tools"><a href="#Using-Deep-Learning-Tools" class="headerlink" title="Using Deep Learning Tools"></a>Using Deep Learning Tools</h1><h2 id="๋ค์ด๊ฐ๊ธฐ์-์์"><a href="#๋ค์ด๊ฐ๊ธฐ์-์์" class="headerlink" title="๋ค์ด๊ฐ๊ธฐ์ ์์"></a>๋ค์ด๊ฐ๊ธฐ์ ์์</h2><p> ์ง๋ ์๊ฐ์ CNN์ ๋ํด ๊ฐ๋ตํ๊ฒ ๋๋ง ์์๋ณด์๋ค. <br><br>์ด๋ฒ์๋ ๊ต์๋๊ป์ ์ ๊ณตํด์ฃผ์ ์์ ๋ค์ ํตํด ์น์ํด์ ธ๋ณด๋๋ก ํ๊ฒ ๋ค.</p><p><code>!nvidia-smi</code>๋ nvidia gpu resource๋ค์ ๋ชจ๋ํฐ๋งํ๋ ๋ช
๋ น์ด์ด๋ค.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">!nvidia-smi</span><br></pre></td></tr></table></figure><pre><code>Wed Jan 20 05:13:24 2021+-----------------------------------------------------------------------------+| NVIDIA-SMI 410.104 Driver Version: 410.104 CUDA Version: 10.1 ||-------------------------------+----------------------+----------------------+| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC || Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. ||===============================+======================+======================|| 0 Tesla V100-DGXS... On | 00000000:07:00.0 Off | 0 || N/A 41C P0 51W / 300W | 1561MiB / 32478MiB | 0% Default |+-------------------------------+----------------------+----------------------+| 1 Tesla V100-DGXS... On | 00000000:08:00.0 Off | 0 || N/A 40C P0 54W / 300W | 626MiB / 32478MiB | 0% Default |+-------------------------------+----------------------+----------------------+| 2 Tesla V100-DGXS... On | 00000000:0E:00.0 Off | 0 || N/A 40C P0 50W / 300W | 27829MiB / 32478MiB | 0% Default |+-------------------------------+----------------------+----------------------+| 3 Tesla V100-DGXS... On | 00000000:0F:00.0 Off | 0 || N/A 40C P0 49W / 300W | 652MiB / 32478MiB | 0% Default |+-------------------------------+----------------------+----------------------++-----------------------------------------------------------------------------+| Processes: GPU Memory || GPU PID Type Process name Usage ||=============================================================================|+-----------------------------------------------------------------------------+</code></pre><p>๋ฉ์ค์์ ์ค์ ๋ก ์ฌ์ฉํ๊ณ ์๋ ์๋ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ฆฌ์์ค๋ฅผ ํ์ธํ๊ณ ์ ์ ํ ๋ถ๋ฐฐํด์ ์ฌ์ฉํด์ผํ๋ค.</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># using gpu:/1</span></span><br><span class="line"><span class="keyword">import</span> tensorflow <span class="keyword">as</span> tf</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line">os.environ[<span class="string">"CUDA_VISIBLE_DEVICES"</span>] = <span class="string">"1"</span></span><br><span class="line"></span><br><span class="line">gpus = tf.config.experimental.list_physical_devices(<span class="string">'GPU'</span>)</span><br><span class="line"><span class="keyword">if</span> gpus:</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> tf.config.experimental.set_memory_growth(gpus[<span class="number">0</span>], <span class="literal">True</span>)</span><br><span class="line"> <span class="keyword">except</span> RuntimeError <span class="keyword">as</span> e:</span><br><span class="line"> print(e)</span><br></pre></td></tr></table></figure><p>์์ ๊ฐ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ฉด GPU #1๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ๋ํ, ํ๊บผ๋ฒ์ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ <code>tf.config.experimental.set_memory_growth</code>๋ฅผ ์ฌ์ฉํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฆ๊ฐ์ํค๋ฉฐ ์ฌ์ฉํ๋ค.</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># using gpu:/1</span></span><br><span class="line"><span class="keyword">import</span> tensorflow <span class="keyword">as</span> tf</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line">os.environ[<span class="string">"CUDA_VISIBLE_DEVICES"</span>] = <span class="string">"1"</span></span><br><span class="line"></span><br><span class="line">gpus = tf.config.experimental.list_physical_devices(<span class="string">'GPU'</span>)</span><br><span class="line"><span class="keyword">if</span> gpus:</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> tf.config.experimental.set_memory_growth(gpus[<span class="number">0</span>], <span class="literal">True</span>)</span><br><span class="line"> <span class="keyword">except</span> RuntimeError <span class="keyword">as</span> e:</span><br><span class="line"> print(e)</span><br></pre></td></tr></table></figure><p><code>MNIST dataset</code>์ ํ๋ง์ด์๋๋ฅผ ์์ํ์
จ๋ <code>Convolution network</code>์ ์ฐฝ์์ <code>Yann LeCun</code>๊ฐ ์ ๊ณตํด์ฃผ์๋ ๋ฐ์ดํฐ์
์ด๋ค.<br><br>์ด๋ฅผ ํ์ฉํ์ฌ ์ค์ต์ ์งํํด๋ณด๊ฒ ๋ค.</p><p><code>MNIST dataset</code>์ ์์ผ๋ก ์ด ์ซ์ ์ด๋ฏธ์ง๋ฅผ ๋ฒกํฐ๋ก ๋ํ๋ธ images์ ๊ทธ ์ด๋ฏธ์ง๊ฐ ์๋ฏธํ๋ ์ซ์๋ฅผ ๋ํ๋ด๋ labels๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ํ๊ฐ์ ์ด๋ฏธ์ง๋ <code>28*28(=784)์ ํฝ์
</code>๋ก ์ด๋ฃจ์ด์ ธ ์๊ธฐ ๋๋ฌธ์ ์ด๋ 784์ฐจ์์ ๋ฒกํฐ๋ก ์ ์ฅ๋์ด ์๊ณ ์งํ๊ธฐ์ ์ ๋์ ๋ฐ๋ผ 0~1์ฌ์ด์ ๊ฐ์ด ๋ค์ด์๋ค. ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.</p><p align="center"><img src="https://docs.ncloud.com/ko/tensorflow/images/tensorflow-1-3-102.png"></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></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> tensorflow.keras.datasets <span class="keyword">import</span> mnist</span><br><span class="line"><span class="keyword">from</span> tensorflow.keras.models <span class="keyword">import</span> Sequential</span><br><span class="line"><span class="keyword">from</span> tensorflow.keras.layers <span class="keyword">import</span> Dense, Conv2D, Flatten</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"></span><br><span class="line"><span class="comment"># the data, split between train and test sets</span></span><br><span class="line">(x_train, y_train), (x_test, y_test) = mnist.load_data()</span><br><span class="line"></span><br><span class="line">print(<span class="string">"# of train data : "</span>,x_train.shape)</span><br><span class="line">print(<span class="string">"# of test data : "</span>,x_test.shape)</span><br></pre></td></tr></table></figure><pre><code># of train data : (60000, 28, 28)# of test data : (10000, 28, 28)</code></pre><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">plt.imshow(x_train[<span class="number">509</span>], cmap=<span class="string">'gray'</span>)</span><br></pre></td></tr></table></figure><pre><code><matplotlib.image.AxesImage at 0x7f14e8b00940></code></pre><p><img src="/image/output_8_1.png" alt="png"></p><p>์ฐ์ CNN์ ์ ์ฉ์ํค๊ธฐ ์ด์ ์ ๋ฐ์ดํฐ๋ฅผ vectorization์ํจ ํ ์งํํด๋ณด๊ฒ ๋ค.</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># Vectorization for ANN</span></span><br><span class="line">x_train_vectorize = x_train.reshape(<span class="number">60000</span>, <span class="number">784</span>)</span><br><span class="line">x_test_vectorize = x_test.reshape(<span class="number">10000</span>, <span class="number">784</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> tensorflow.keras <span class="keyword">as</span> keras</span><br><span class="line">num_categories = <span class="number">10</span></span><br><span class="line"></span><br><span class="line">y_train_onehot = keras.utils.to_categorical(y_train, num_categories)</span><br><span class="line">y_test_onehot = keras.utils.to_categorical(y_test, num_categories)</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">model = Sequential()</span><br><span class="line"></span><br><span class="line">model.add(Dense(units=<span class="number">512</span>, activation=<span class="string">'relu'</span>, input_shape=(<span class="number">784</span>,)))</span><br><span class="line">model.add(Dense(units = <span class="number">512</span>, activation=<span class="string">'relu'</span>))</span><br><span class="line">model.add(Dense(units = <span class="number">10</span>, activation=<span class="string">'softmax'</span>))</span><br><span class="line"></span><br><span class="line">model.summary()</span><br></pre></td></tr></table></figure><pre><code>Model: "sequential"_________________________________________________________________Layer (type) Output Shape Param #=================================================================dense (Dense) (None, 512) 401920_________________________________________________________________dense_1 (Dense) (None, 512) 262656_________________________________________________________________dense_2 (Dense) (None, 10) 5130=================================================================Total params: 669,706Trainable params: 669,706Non-trainable params: 0_________________________________________________________________</code></pre><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></pre></td><td class="code"><pre><span class="line">model.<span class="built_in">compile</span>(loss=<span class="string">'categorical_crossentropy'</span>, metrics=[<span class="string">'accuracy'</span>])</span><br><span class="line"></span><br><span class="line">history = model.fit(x_train_vectorize, y_train_onehot,</span><br><span class="line"> epochs=<span class="number">20</span>,</span><br><span class="line"> verbose=<span class="number">1</span>,</span><br><span class="line"> validation_data=(x_test_vectorize, y_test_onehot))</span><br><span class="line"></span><br></pre></td></tr></table></figure><pre><code>Epoch 1/201875/1875 [==============================] - 6s 3ms/step - loss: 0.3957 - accuracy: 0.9521 - val_loss: 0.5461 - val_accuracy: 0.9337Epoch 2/201875/1875 [==============================] - 6s 3ms/step - loss: 0.3798 - accuracy: 0.9524 - val_loss: 0.7209 - val_accuracy: 0.9506Epoch 3/201875/1875 [==============================] - 6s 3ms/step - loss: 0.3913 - accuracy: 0.9522 - val_loss: 0.5986 - val_accuracy: 0.9464Epoch 4/201875/1875 [==============================] - 6s 3ms/step - loss: 0.3965 - accuracy: 0.9505 - val_loss: 0.6736 - val_accuracy: 0.9391Epoch 5/201875/1875 [==============================] - 6s 3ms/step - loss: 0.4349 - accuracy: 0.9540 - val_loss: 0.7524 - val_accuracy: 0.9441Epoch 6/201875/1875 [==============================] - 6s 3ms/step - loss: 0.4307 - accuracy: 0.9506 - val_loss: 0.9400 - val_accuracy: 0.9461Epoch 7/201875/1875 [==============================] - 6s 3ms/step - loss: 0.4567 - accuracy: 0.9509 - val_loss: 0.8693 - val_accuracy: 0.9406Epoch 8/201875/1875 [==============================] - 6s 3ms/step - loss: 0.4598 - accuracy: 0.9475 - val_loss: 0.9901 - val_accuracy: 0.9225Epoch 9/201875/1875 [==============================] - 6s 3ms/step - loss: 0.4730 - accuracy: 0.9471 - val_loss: 1.5888 - val_accuracy: 0.9191Epoch 10/201875/1875 [==============================] - 6s 3ms/step - loss: 0.4903 - accuracy: 0.9363 - val_loss: 0.9527 - val_accuracy: 0.9295Epoch 11/201875/1875 [==============================] - 6s 3ms/step - loss: 0.5425 - accuracy: 0.9351 - val_loss: 1.4321 - val_accuracy: 0.9451Epoch 12/201875/1875 [==============================] - 6s 3ms/step - loss: 0.5320 - accuracy: 0.9397 - val_loss: 1.7940 - val_accuracy: 0.9428Epoch 13/201875/1875 [==============================] - 6s 3ms/step - loss: 0.5362 - accuracy: 0.9346 - val_loss: 1.5604 - val_accuracy: 0.8951Epoch 14/201875/1875 [==============================] - 6s 3ms/step - loss: 0.5934 - accuracy: 0.9328 - val_loss: 1.8964 - val_accuracy: 0.8971Epoch 15/201875/1875 [==============================] - 6s 3ms/step - loss: 0.5844 - accuracy: 0.9265 - val_loss: 1.7190 - val_accuracy: 0.9085Epoch 16/201875/1875 [==============================] - 6s 3ms/step - loss: 0.6048 - accuracy: 0.9211 - val_loss: 1.6869 - val_accuracy: 0.9072Epoch 17/201875/1875 [==============================] - 6s 3ms/step - loss: 0.5789 - accuracy: 0.9172 - val_loss: 2.8615 - val_accuracy: 0.8887Epoch 18/201875/1875 [==============================] - 6s 3ms/step - loss: 0.6705 - accuracy: 0.9189 - val_loss: 2.0492 - val_accuracy: 0.9045Epoch 19/201875/1875 [==============================] - 6s 3ms/step - loss: 0.6655 - accuracy: 0.9216 - val_loss: 1.9504 - val_accuracy: 0.9053Epoch 20/201875/1875 [==============================] - 6s 3ms/step - loss: 0.6559 - accuracy: 0.9233 - val_loss: 2.6255 - val_accuracy: 0.9164</code></pre><h1 id="Keras-Sequential-model"><a href="#Keras-Sequential-model" class="headerlink" title="Keras Sequential model"></a>Keras Sequential model</h1><h2 id="Specify-Input-Shape"><a href="#Specify-Input-Shape" class="headerlink" title="Specify Input Shape"></a>Specify Input Shape</h2><hr><p>Model should know the Input Shape. So, <code>Sequential</code>modelโs first layer(after this, layer know the shape) shold give the information.</p><ul><li>Pass the <code>input_shape</code> to the first layer. This is a tuple containing shape information.(A tuple with an integer or <code>None</code> as an entry; <code>None</code> represents an arbitrary positive integer). The <code>input_shape</code> does not include batch dimension.</li><li>Some two-dimensional layers, such as <code>Dense</code>, can specify the input shape through the <code>input_dim</code> argument, and some three-dimensional layers(temporal) support the <code>input_dim</code> and <code>input_length</code> arguments.</li></ul><h2 id="Compile"><a href="#Compile" class="headerlink" title="Compile"></a>Compile</h2><hr><p>Before Learning, you must configure the learning process with the <code>compile</code> method. This Method accepts three arguments.</p><ol><li>optimizer : It can be a string identifier that represents a built-in optimizer (such as <code>rmsprop</code> or <code>adagrad</code>), or an instance of the <code>optimizer</code> class.</li><li>loss : Loss function. This is what the model wants to minimize. It can be the string identifier(<code>categorical_crossentropy</code> or <code>mse</code>, and so on) or an instance of the target function itself of the built-in loss function</li><li>metrics : List of Metrics. If you solve the classification problem, It is recommended to use <code>metrics = ['accuracy']</code>. Metrics can be string identifiers for built-in metrics or user-defined metric functions.</li></ol><h2 id="Train"><a href="#Train" class="headerlink" title="Train"></a>Train</h2><hr><p>The Keras model is trained based on input data and labels from the Numpy array. When you train a model, you typically use the <code>fit</code> function.</p><h3 id="For-the-better-explanation"><a href="#For-the-better-explanation" class="headerlink" title="For the better explanation"></a><a href="https://www.codeonweb.com/entry/eda18bec-7c7d-426f-ab98-90e18db6fdba">For the better explanation</a></h3><h1 id="Layer"><a href="#Layer" class="headerlink" title="Layer"></a>Layer</h1><h2 id="Activation-Function"><a href="#Activation-Function" class="headerlink" title="Activation Function"></a>Activation Function</h2><hr><h3 id="1-ReLU-Rectified-Linear-Unit-activation-function"><a href="#1-ReLU-Rectified-Linear-Unit-activation-function" class="headerlink" title="1. ReLU(Rectified Linear Unit activation function)"></a>1. ReLU(Rectified Linear Unit activation function)</h3><p align ="center"><img src="https://mlnotebook.github.io/img/transferFunctions/relu.png"></p><ul><li><strong>Features</strong></li></ul><ol><li>It makes the vanishing gradient problem(tanh, sigmoid have) <strong>MUCH WORSE</strong>,since for all negative values the derivative is precisely zero.</li><li>Computational Cost is not significant.</li><li>In comparison to (sigmoid,tanh), convergence speed is much better.</li></ol><h3 id="2-softmax"><a href="#2-softmax" class="headerlink" title="2. softmax"></a>2. softmax</h3><ul><li><strong>Features</strong></li></ul><ol><li>A function that normalizes the output value of a neuron at the last stage for class classification.(normalize sigmoid function)</li><li>So, we can think that It converts the output into probability. (sum = 1.0)</li></ol><h2 id="๊ฒฐ๊ณผ์-๋ํ-๋ถ์"><a href="#๊ฒฐ๊ณผ์-๋ํ-๋ถ์" class="headerlink" title="๊ฒฐ๊ณผ์ ๋ํ ๋ถ์"></a>๊ฒฐ๊ณผ์ ๋ํ ๋ถ์</h2><p>์ฐ์ ์ผ๋ผ์ค์ <code>Sequential Model</code>, <code>compile</code>, <code>fit</code>๊ณผ <code>activation function</code>์ ๋ํด ๊ฐ๋ตํ ์ ์ด๋ณด์๋ค. ์ด์ ์ ์์ด๋ณด์ด๋ ค๊ณ ์์ด๋ก ์ ์ด๋ดค๋๋ฐ ์๊น์์ ๊ทธ๋ฅ ๋ถ์ฌ์ผ๋ค.</p><p>๊ฒฐ๊ณผ์ ๋ํด ๋ค๋ค๋ณด์๋ฉด, <code>epoch= 20</code>์ผ๋ก ์ํํ ๊ฒฐ๊ณผ ์ด๋์ ๋๊น์ง๋ accuracy๋ ๋์์ง๊ณ loss๋ ๋ฎ์์ง๋ ์ข์ ํ์์ด ์ผ์ด๋ฌ์ง๋ง ๊ทธ ์ดํ๋ก๋ ์ค์ด๋ค์๋ค ๋์ด๋ฌ๋ค๋ฅผ ๋ฐ๋ณตํ์ฌ ๊ฒฐ๋ก ์ ์ผ๋ก๋ ์ฑ๋ฅ์ด ๋ ๋ฎ์์ก๋ค. ๊ทธ ์ด์ ๋ ๋ฌด์์ผ๊น?</p><p>์ ๋ต์ ์ด๋ฏธ์ง๋ฅผ ๋ฒกํฐ๋ก ํํํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ ๋ฒ ์๊ฐ์๋ ๋งํ๋ฏ ์ด๋ฏธ์ง๋ฅผ ๋ฒกํฐํํ๋ค๋ฉด ์กฐ๊ธ๋ง translation๋์ด๋ ๋ค๋ฅธ ์ด๋ฏธ์ง๋ก ์ธ์ํ๋ฏ๋ก overfitting๋๋ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค. ๋ฐ๋ผ์ ์ด๋ฅผ ๋ฐฉ์งํ๊ณ ์ CNN์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.</p><p>Convolution์ ํ ๋ชจ๋ธ๋ก ์๋กญ๊ฒ ํด๋ณด์.</p><h2 id="New-Model-with-Convolution"><a href="#New-Model-with-Convolution" class="headerlink" title="New Model with Convolution"></a>New Model with Convolution</h2><p><strong>์๋ก ๋ค์ด๊ฐ๊ธฐ์ ์์ ์ด ์๋ฒ๋ ๋ค๋ฅธ๋ถ๋ค๋ ์ฌ์ฉํ์
์ ํญ์ ๋ฆฌ์์ค๋ฅผ ๋ฐํํด์ค์ผํ๋ค.<br>๋ฐ๋ผ์ ํ์ต์ด ๋๋ ํ ๋ฆฌ์์ค๋ฅผ ๋ฐํํด์ฃผ์.</strong></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></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> IPython</span><br><span class="line">app = IPython.Application.instance()</span><br><span class="line">app.kernel.do_shutdown(<span class="literal">True</span>)</span><br></pre></td></tr></table></figure><pre><code>{'status': 'ok', 'restart': True}</code></pre><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># using gpu:/1</span></span><br><span class="line"><span class="keyword">import</span> tensorflow <span class="keyword">as</span> tf</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line">os.environ[<span class="string">"CUDA_VISIBLE_DEVICES"</span>] = <span class="string">"1"</span></span><br><span class="line"></span><br><span class="line">gpus = tf.config.experimental.list_physical_devices(<span class="string">'GPU'</span>)</span><br><span class="line"><span class="keyword">if</span> gpus:</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> tf.config.experimental.set_memory_growth(gpus[<span class="number">0</span>], <span class="literal">True</span>)</span><br><span class="line"> <span class="keyword">except</span> RuntimeError <span class="keyword">as</span> e:</span><br><span class="line"> print(e)</span><br><span class="line"></span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># using gpu:/1</span></span><br><span class="line"><span class="keyword">import</span> tensorflow <span class="keyword">as</span> tf</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line">os.environ[<span class="string">"CUDA_VISIBLE_DEVICES"</span>] = <span class="string">"1"</span></span><br><span class="line"></span><br><span class="line">gpus = tf.config.experimental.list_physical_devices(<span class="string">'GPU'</span>)</span><br><span class="line"><span class="keyword">if</span> gpus:</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> tf.config.experimental.set_memory_growth(gpus[<span class="number">0</span>], <span class="literal">True</span>)</span><br><span class="line"> <span class="keyword">except</span> RuntimeError <span class="keyword">as</span> e:</span><br><span class="line"> print(e)</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> tensorflow.keras.datasets <span class="keyword">import</span> mnist</span><br><span class="line"><span class="keyword">from</span> tensorflow.keras.models <span class="keyword">import</span> Sequential</span><br><span class="line"><span class="keyword">from</span> tensorflow.keras.layers <span class="keyword">import</span> Dense, Conv2D, Flatten</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"></span><br><span class="line"><span class="comment"># the data, split between train and test sets</span></span><br><span class="line">(x_train, y_train), (x_test, y_test) = mnist.load_data()</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> tensorflow.keras <span class="keyword">as</span> keras</span><br><span class="line">num_categories = <span class="number">10</span></span><br><span class="line"></span><br><span class="line">y_train_onehot = keras.utils.to_categorical(y_train, num_categories)</span><br><span class="line">y_test_onehot = keras.utils.to_categorical(y_test, num_categories)</span><br></pre></td></tr></table></figure><p>์ฌ๊ธฐ๊น์ง์ ๋ด์ฉ์ ๋์ผํ๋ค.</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></pre></td><td class="code"><pre><span class="line">model = Sequential()</span><br><span class="line"></span><br><span class="line">model.add(Conv2D(<span class="number">64</span>, kernel_size=<span class="number">3</span>, activation=<span class="string">'relu'</span>, input_shape=(<span class="number">28</span>,<span class="number">28</span>,<span class="number">1</span>)))</span><br><span class="line">model.add(Conv2D(<span class="number">32</span>, kernel_size=<span class="number">3</span>, activation=<span class="string">'relu'</span>))</span><br><span class="line">model.add(Flatten())</span><br><span class="line">model.add(Dense(<span class="number">10</span>, activation=<span class="string">'softmax'</span>))</span><br><span class="line">model.summary()</span><br><span class="line"></span><br><span class="line">model.<span class="built_in">compile</span>(loss=<span class="string">'categorical_crossentropy'</span>, metrics=[<span class="string">'accuracy'</span>])</span><br><span class="line"></span><br><span class="line">x_train_forConv = x_train.reshape(<span class="number">60000</span>,<span class="number">28</span>,<span class="number">28</span>,<span class="number">1</span>)</span><br><span class="line">x_test_forConv = x_test.reshape(<span class="number">10000</span>,<span class="number">28</span>,<span class="number">28</span>,<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line">history = model.fit(x_train_forConv, y_train_onehot,</span><br><span class="line"> epochs=<span class="number">20</span>,</span><br><span class="line"> verbose=<span class="number">1</span>,</span><br><span class="line"> validation_data=(x_test_forConv, y_test_onehot))</span><br></pre></td></tr></table></figure><pre><code>Model: "sequential_1"_________________________________________________________________Layer (type) Output Shape Param #=================================================================conv2d_2 (Conv2D) (None, 26, 26, 64) 640_________________________________________________________________conv2d_3 (Conv2D) (None, 24, 24, 32) 18464_________________________________________________________________flatten_1 (Flatten) (None, 18432) 0_________________________________________________________________dense_1 (Dense) (None, 10) 184330=================================================================Total params: 203,434Trainable params: 203,434Non-trainable params: 0_________________________________________________________________Epoch 1/201875/1875 [==============================] - 7s 4ms/step - loss: 0.1776 - accuracy: 0.9570 - val_loss: 0.1147 - val_accuracy: 0.9729Epoch 2/201875/1875 [==============================] - 7s 4ms/step - loss: 0.0854 - accuracy: 0.9766 - val_loss: 0.0864 - val_accuracy: 0.9778Epoch 3/201875/1875 [==============================] - 8s 4ms/step - loss: 0.0745 - accuracy: 0.9797 - val_loss: 0.0905 - val_accuracy: 0.9735Epoch 4/201875/1875 [==============================] - 8s 4ms/step - loss: 0.0724 - accuracy: 0.9802 - val_loss: 0.0919 - val_accuracy: 0.9781Epoch 5/201875/1875 [==============================] - 8s 4ms/step - loss: 0.0700 - accuracy: 0.9812 - val_loss: 0.0837 - val_accuracy: 0.9746Epoch 6/201875/1875 [==============================] - 8s 4ms/step - loss: 0.0690 - accuracy: 0.9818 - val_loss: 0.1036 - val_accuracy: 0.9742Epoch 7/201875/1875 [==============================] - 8s 4ms/step - loss: 0.0690 - accuracy: 0.9818 - val_loss: 0.1009 - val_accuracy: 0.9750Epoch 8/201875/1875 [==============================] - 7s 4ms/step - loss: 0.0689 - accuracy: 0.9819 - val_loss: 0.1134 - val_accuracy: 0.9746Epoch 9/201875/1875 [==============================] - 8s 4ms/step - loss: 0.0700 - accuracy: 0.9819 - val_loss: 0.1004 - val_accuracy: 0.9760Epoch 10/201875/1875 [==============================] - 8s 4ms/step - loss: 0.0692 - accuracy: 0.9826 - val_loss: 0.1298 - val_accuracy: 0.9750Epoch 11/201875/1875 [==============================] - 8s 4ms/step - loss: 0.0681 - accuracy: 0.9827 - val_loss: 0.1055 - val_accuracy: 0.9732Epoch 12/201875/1875 [==============================] - 7s 4ms/step - loss: 0.0688 - accuracy: 0.9820 - val_loss: 0.1205 - val_accuracy: 0.9725Epoch 13/201875/1875 [==============================] - 7s 4ms/step - loss: 0.0682 - accuracy: 0.9830 - val_loss: 0.1140 - val_accuracy: 0.9751Epoch 14/201875/1875 [==============================] - 8s 4ms/step - loss: 0.0671 - accuracy: 0.9830 - val_loss: 0.1266 - val_accuracy: 0.9729Epoch 15/201875/1875 [==============================] - 8s 4ms/step - loss: 0.0664 - accuracy: 0.9831 - val_loss: 0.1417 - val_accuracy: 0.9723Epoch 16/201875/1875 [==============================] - 7s 4ms/step - loss: 0.0639 - accuracy: 0.9837 - val_loss: 0.1319 - val_accuracy: 0.9729Epoch 17/201875/1875 [==============================] - 8s 4ms/step - loss: 0.0670 - accuracy: 0.9837 - val_loss: 0.1290 - val_accuracy: 0.9723Epoch 18/201875/1875 [==============================] - 7s 4ms/step - loss: 0.0668 - accuracy: 0.9840 - val_loss: 0.1517 - val_accuracy: 0.9736Epoch 19/201875/1875 [==============================] - 7s 4ms/step - loss: 0.0625 - accuracy: 0.9849 - val_loss: 0.1545 - val_accuracy: 0.9699Epoch 20/201875/1875 [==============================] - 7s 4ms/step - loss: 0.0640 - accuracy: 0.9845 - val_loss: 0.1448 - val_accuracy: 0.9691</code></pre><p>epoch๋ฅผ 20์ผ๋ก ํ๋๋ train data๋ค์ ๋๋ถ๋ถ loss๋ ๊ฐ์ํ๊ณ accuracy๋ ์ฆ๊ฐํ์ง๋ง <br><br>test data๋ค์ loss๋ ๋ค์ญ๋ ์ญ์ accuracy๋ ๊ฐ์ํ๊ธฐ๊น์งํ๋ค.<br><br>์์ง <code>overfitting</code>์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ์ ๋ฟ๋ง์๋๋ผ <code>vanishing/exploding gradient</code>๋ํ ํด๊ฒฐํ์ง ๋ชปํ๋ค. <br><br>์ด๋ ๋ค์ ์ค์ต์์ <code>batchnormalization</code>๊ณผ <code>dropdout</code>์ ๋ํด ๊ณต๋ถํด๋ณด๊ณ ์ข ๋ ์ง์ผ๋ณด๋๋ก ํ๊ฒ ๋ค.</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></pre></td><td class="code"><pre><span class="line">n = <span class="number">90</span></span><br><span class="line">plt.imshow(x_test[n].reshape(<span class="number">28</span>, <span class="number">28</span>), cmap=<span class="string">'Greys'</span>, interpolation=<span class="string">'nearest'</span>)</span><br><span class="line">plt.show()</span><br><span class="line"></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">print(<span class="string">'์ ๋ต์ : '</span>, np.argmax(model.predict(x_test[n].reshape((<span class="number">1</span>,<span class="number">28</span>,<span class="number">28</span>,<span class="number">1</span>)))))</span><br></pre></td></tr></table></figure><p><img src="/image/output_25_0.png" alt="png"></p><center>์ ๋ต์ : 3</center><p>๋๋คํ๊ฒ ์ถ์ถํด์ ํ์ธํด๋ณด์.</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><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">np.random.seed(<span class="number">0</span>)</span><br><span class="line"></span><br><span class="line">use_samples = np.random.randint(<span class="number">5000</span>,size = <span class="number">16</span>)</span><br><span class="line">samples_to_predict = []</span><br><span class="line"></span><br><span class="line">count = <span class="number">0</span></span><br><span class="line">nrows = ncols = <span class="number">4</span></span><br><span class="line"></span><br><span class="line">plt.figure(figsize = (<span class="number">12</span>,<span class="number">8</span>))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> sample <span class="keyword">in</span> use_samples:</span><br><span class="line"> count+=<span class="number">1</span></span><br><span class="line"> plt.subplot(nrows,ncols,count)</span><br><span class="line"> reshaped_image = x_test[sample].reshape((<span class="number">28</span>, <span class="number">28</span>))</span><br><span class="line"> plt.imshow(reshaped_image,cmap=<span class="string">'Greys'</span>, interpolation=<span class="string">'nearest'</span>)</span><br><span class="line"> samples_to_predict.append(x_test[sample])</span><br><span class="line"> tmp = <span class="string">"Label:"</span> + <span class="built_in">str</span>(y_test[sample]) + <span class="string">", Prediction:"</span> + <span class="built_in">str</span>(np.argmax(model.predict(x_test[sample].reshape((<span class="number">1</span>,<span class="number">28</span>,<span class="number">28</span>,<span class="number">1</span>)))))</span><br><span class="line"> plt.title(tmp)</span><br><span class="line"></span><br><span class="line">plt.tight_layout()</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><p><img src="/image/output_27_0.png" alt="png"></p><p>์ฝ๊ฐ์ ์ค์ฐจ๊ฐ ์๋ ๋ฏํ๋ค. ์ด๋ ๋ค๋ฅธ <code>Layer</code>๋ค์ ๊ณต๋ถํ๋ฉด์ ์ค์ฌ๋ณด๋๋ก ํ๊ฒ ๋ค.</p><p>๊ทธ๋ฆฌ๊ณ ๋ฆฌ์์ค๋ฐํ๋ ํ์๋ค!</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> IPython</span><br><span class="line">app = IPython.Application.instance()</span><br><span class="line">app.kernel.do_shutdown(<span class="literal">True</span>)</span><br></pre></td></tr></table></figure><pre><code>{'status': 'ok', 'restart': True}</code></pre>]]></content>
<categories>
<category> AAIS </category>
</categories>
<tags>
<tag> AI </tag>
<tag> AAIS </tag>
<tag> tensorflow </tag>
<tag> jupyter-notebook </tag>
</tags>
</entry>
<entry>
<title>[Algorithm] ์คํ์ฑํ
๋ฐฉ</title>
<link href="2021/01/20/algorithm-02/"/>
<url>2021/01/20/algorithm-02/</url>
<content type="html"><![CDATA[<h1 id="์คํ์ฑํ
๋ฐฉ-2019-KAKAO-BLIND-RECRUITMENT"><a href="#์คํ์ฑํ
๋ฐฉ-2019-KAKAO-BLIND-RECRUITMENT" class="headerlink" title="์คํ์ฑํ
๋ฐฉ (2019 KAKAO BLIND RECRUITMENT)"></a>์คํ์ฑํ
๋ฐฉ (2019 KAKAO BLIND RECRUITMENT)</h1><hr><h2 id="๋ฌธ์ ์ค๋ช
"><a href="#๋ฌธ์ ์ค๋ช
" class="headerlink" title="๋ฌธ์ ์ค๋ช
"></a>๋ฌธ์ ์ค๋ช
</h2><p>์นด์นด์คํก ์คํ์ฑํ
๋ฐฉ์์๋ ์น๊ตฌ๊ฐ ์๋ ์ฌ๋๋ค๊ณผ ๋ํ๋ฅผ ํ ์ ์๋๋ฐ, ๋ณธ๋ ๋๋ค์์ด ์๋ ๊ฐ์์ ๋๋ค์์ ์ฌ์ฉํ์ฌ ์ฑํ
๋ฐฉ์ ๋ค์ด๊ฐ ์ ์๋ค.</p><p>์ ์
์ฌ์์ธ ๊นํฌ๋ฃจ๋ ์นด์นด์คํก ์คํ ์ฑํ
๋ฐฉ์ ๊ฐ์คํ ์ฌ๋์ ์ํด, ๋ค์ํ ์ฌ๋๋ค์ด ๋ค์ด์ค๊ณ , ๋๊ฐ๋ ๊ฒ์ ์ง์ผ๋ณผ ์ ์๋ ๊ด๋ฆฌ์์ฐฝ์ ๋ง๋ค๊ธฐ๋ก ํ๋ค. ์ฑํ
๋ฐฉ์ ๋๊ตฐ๊ฐ ๋ค์ด์ค๋ฉด ๋ค์ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ค.</p><p>[๋๋ค์]๋์ด ๋ค์ด์์ต๋๋ค.</p><p>์ฑํ
๋ฐฉ์์ ๋๊ตฐ๊ฐ ๋๊ฐ๋ฉด ๋ค์ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ค.</p><p>[๋๋ค์]๋์ด ๋๊ฐ์ต๋๋ค.</p><p>์ฑํ
๋ฐฉ์์ ๋๋ค์์ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ด ๋ ๊ฐ์ง์ด๋ค.</p><p>์ฑํ
๋ฐฉ์ ๋๊ฐ ํ, ์๋ก์ด ๋๋ค์์ผ๋ก ๋ค์ ๋ค์ด๊ฐ๋ค.<br>์ฑํ
๋ฐฉ์์ ๋๋ค์์ ๋ณ๊ฒฝํ๋ค.<br>๋๋ค์์ ๋ณ๊ฒฝํ ๋๋ ๊ธฐ์กด์ ์ฑํ
๋ฐฉ์ ์ถ๋ ฅ๋์ด ์๋ ๋ฉ์์ง์ ๋๋ค์๋ ์ ๋ถ ๋ณ๊ฒฝ๋๋ค.</p><p>์๋ฅผ ๋ค์ด, ์ฑํ
๋ฐฉ์ Muzi์ Prodo๋ผ๋ ๋๋ค์์ ์ฌ์ฉํ๋ ์ฌ๋์ด ์์๋๋ก ๋ค์ด์ค๋ฉด ์ฑํ
๋ฐฉ์๋ ๋ค์๊ณผ ๊ฐ์ด ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ค.</p><p>Muzi๋์ด ๋ค์ด์์ต๋๋ค.<br>Prodo๋์ด ๋ค์ด์์ต๋๋ค.</p><p>์ฑํ
๋ฐฉ์ ์๋ ์ฌ๋์ด ๋๊ฐ๋ฉด ์ฑํ
๋ฐฉ์๋ ๋ค์๊ณผ ๊ฐ์ด ๋ฉ์์ง๊ฐ ๋จ๋๋ค.</p><p>Muzi๋์ด ๋ค์ด์์ต๋๋ค.<br>Prodo๋์ด ๋ค์ด์์ต๋๋ค.<br>Muzi๋์ด ๋๊ฐ์ต๋๋ค.</p><p>Muzi๊ฐ ๋๊ฐํ ๋ค์ ๋ค์ด์ฌ ๋, Prodo ๋ผ๋ ๋๋ค์์ผ๋ก ๋ค์ด์ฌ ๊ฒฝ์ฐ ๊ธฐ์กด์ ์ฑํ
๋ฐฉ์ ๋จ์์๋ Muzi๋ Prodo๋ก ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ค.</p><p>Prodo๋์ด ๋ค์ด์์ต๋๋ค.<br>Prodo๋์ด ๋ค์ด์์ต๋๋ค.<br>Prodo๋์ด ๋๊ฐ์ต๋๋ค.<br>Prodo๋์ด ๋ค์ด์์ต๋๋ค.</p><p>์ฑํ
๋ฐฉ์ ์ค๋ณต ๋๋ค์์ ํ์ฉํ๊ธฐ ๋๋ฌธ์, ํ์ฌ ์ฑํ
๋ฐฉ์๋ Prodo๋ผ๋ ๋๋ค์์ ์ฌ์ฉํ๋ ์ฌ๋์ด ๋ ๋ช
์ด ์๋ค. ์ด์ , ์ฑํ
๋ฐฉ์ ๋ ๋ฒ์งธ๋ก ๋ค์ด์๋ Prodo๊ฐ Ryan์ผ๋ก ๋๋ค์์ ๋ณ๊ฒฝํ๋ฉด ์ฑํ
๋ฐฉ ๋ฉ์์ง๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ค.</p><p>Prodo๋์ด ๋ค์ด์์ต๋๋ค.<br>Ryan๋์ด ๋ค์ด์์ต๋๋ค.<br>Prodo๋์ด ๋๊ฐ์ต๋๋ค.<br>Prodo๋์ด ๋ค์ด์์ต๋๋ค.</p><p>์ฑํ
๋ฐฉ์ ๋ค์ด์ค๊ณ ๋๊ฐ๊ฑฐ๋, ๋๋ค์์ ๋ณ๊ฒฝํ ๊ธฐ๋ก์ด ๋ด๊ธด ๋ฌธ์์ด ๋ฐฐ์ด record๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ๋ชจ๋ ๊ธฐ๋ก์ด ์ฒ๋ฆฌ๋ ํ, ์ต์ข
์ ์ผ๋ก ๋ฐฉ์ ๊ฐ์คํ ์ฌ๋์ด ๋ณด๊ฒ ๋๋ ๋ฉ์์ง๋ฅผ ๋ฌธ์์ด ๋ฐฐ์ด ํํ๋ก return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํ๋ผ.</p><h2 id="์ ํ์ฌํญ"><a href="#์ ํ์ฌํญ" class="headerlink" title="์ ํ์ฌํญ"></a>์ ํ์ฌํญ</h2><hr><figure class="highlight plain"><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></pre></td><td class="code"><pre><span class="line">record๋ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์์ด์ด ๋ด๊ธด ๋ฐฐ์ด์ด๋ฉฐ, ๊ธธ์ด๋ 1 ์ด์ 100,000 ์ดํ์ด๋ค.</span><br><span class="line">๋ค์์ record์ ๋ด๊ธด ๋ฌธ์์ด์ ๋ํ ์ค๋ช
์ด๋ค.</span><br><span class="line"> - ๋ชจ๋ ์ ์ ๋ [์ ์ ์์ด๋]๋ก ๊ตฌ๋ถํ๋ค.</span><br><span class="line"> - [์ ์ ์์ด๋] ์ฌ์ฉ์๊ฐ [๋๋ค์]์ผ๋ก ์ฑํ
๋ฐฉ์ ์
์ฅ - Enter [์ ์ ์์ด๋] [๋๋ค์] (ex. Enter uid1234 Muzi)</span><br><span class="line"> - [์ ์ ์์ด๋] ์ฌ์ฉ์๊ฐ ์ฑํ
๋ฐฉ์์ ํด์ฅ - Leave [์ ์ ์์ด๋] (ex. Leave uid1234)</span><br><span class="line"> - [์ ์ ์์ด๋] ์ฌ์ฉ์๊ฐ ๋๋ค์์ [๋๋ค์]์ผ๋ก ๋ณ๊ฒฝ - Change [์ ์ ์์ด๋] [๋๋ค์] (ex. Change uid1234 Muzi)</span><br><span class="line"> - ์ฒซ ๋จ์ด๋ Enter, Leave, Change ์ค ํ๋์ด๋ค.</span><br><span class="line"> - ๊ฐ ๋จ์ด๋ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด ์์ผ๋ฉฐ, ์ํ๋ฒณ ๋๋ฌธ์, ์๋ฌธ์, ์ซ์๋ก๋ง ์ด๋ฃจ์ด์ ธ์๋ค.</span><br><span class="line"> - ์ ์ ์์ด๋์ ๋๋ค์์ ์ํ๋ฒณ ๋๋ฌธ์, ์๋ฌธ์๋ฅผ ๊ตฌ๋ณํ๋ค.</span><br><span class="line"> - ์ ์ ์์ด๋์ ๋๋ค์์ ๊ธธ์ด๋ 1 ์ด์ 10 ์ดํ์ด๋ค.</span><br><span class="line"> - ์ฑํ
๋ฐฉ์์ ๋๊ฐ ์ ์ ๊ฐ ๋๋ค์์ ๋ณ๊ฒฝํ๋ ๋ฑ ์๋ชป ๋ ์
๋ ฅ์ ์ฃผ์ด์ง์ง ์๋๋ค.</span><br></pre></td></tr></table></figure><table><thead><tr><th align="left"><center>record</center></th><th align="center"><center>result</center></th></tr></thead><tbody><tr><td align="left">[โEnter uid1234 Muziโ, โEnter uid4567 Prodoโ,โLeave uid1234โ,โEnter uid1234 Prodoโ,โChange uid4567 Ryanโ]</td><td align="center"><center>[โProdo๋์ด ๋ค์ด์์ต๋๋ค.โ, โRyan๋์ด ๋ค์ด์์ต๋๋ค.โ, โProdo๋์ด ๋๊ฐ์ต๋๋ค.โ, โProdo๋์ด ๋ค์ด์์ต๋๋ค.โ] </center></td></tr></tbody></table><h2 id="๋ฌธ์ ํ์ด"><a href="#๋ฌธ์ ํ์ด" class="headerlink" title="๋ฌธ์ ํ์ด"></a>๋ฌธ์ ํ์ด</h2><hr><p>๋ฌธ์ ํ์ด๊ฐ ๊ต์ฅํ ๊ฐ๋จํด๋ณด์๋ค. ๋๋ ํ๋์ฝ๋ฉ์ ํ์์ง๋ง ๊ทธ๋๋ ์ฝ๊ฒ ํ๋ฆด ๊ฒ์ด๋ผ ์๊ฐํ๋ค.<br>์ ํ์ฌํญ์ ์ฝ์ด๋ดค๋๋ Enter, Change, Leave๋ก ๋ถ๊ธฐ๋ง ํ๋ฉด๋ ๊ฒ์ด๋ผ ์๊ฐํ๋ค.</p><ol><li>Enter<ul><li>userId๋ฅผ ๊ฒ์ํ์ฌ ์ด๋ฏธ ์กด์ฌํ๋ id๋ผ๋ฉด ๋ชจ๋ ์ด๋ฆ์ ๋ฐ๊พผ ํ ์ถ๊ฐ</li><li>์กด์ฌํ์ง ์๋๋ค๋ฉด ์ถ๊ฐ</li></ul></li><li>Change<ul><li>userId๋ฅผ ๊ฒ์ํ์ฌ ์ด๋ฆ์ ๋ชจ๋ ๋ฐ๊ฟ</li></ul></li><li>Leave<ul><li>userId๋ฅผ ๊ฒ์ํ์ฌ ์ถ๊ฐ</li></ul></li></ol><p>์ฐ์ Leave๋ id๋ง ์กด์ฌํ๊ณ ๋๋ค์์ด ์กด์ฌํ์ง ์์ ๋ฒกํฐ์ ์ถ๊ฐํ์๋ค.<br>๊ทธ๋ฆฌ๊ณ ๋งจ๋ง์ง๋ง์ translation์ ํ๋ ๊ณผ์ ์ ์ถ๊ฐํ์๋ค.<br>๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ํ์ดํ์๋ค.</p><figure class="highlight plain"><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><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br></pre></td><td class="code"><pre><span class="line">#include <string></span><br><span class="line">#include <vector></span><br><span class="line"></span><br><span class="line">using namespace std;</span><br><span class="line"></span><br><span class="line">bool find(string s, string name ,vector<vector<string>> &before) {</span><br><span class="line"> bool answer = false;</span><br><span class="line"> for (int i = 0; i < before.size(); i++) {</span><br><span class="line"> if (before[i][1] == s) {</span><br><span class="line"> answer = true;</span><br><span class="line"> before[i][2] = name;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> return answer;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">string append(string s, vector<vector<string>>& before) {</span><br><span class="line"> for (int i = 0; i < before.size(); i++) {</span><br><span class="line"> if (before[i][1] == s)</span><br><span class="line"> return before[i][1];</span><br><span class="line"> }</span><br><span class="line"> return "์๋ชป๋ ์
๋ ฅ";</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">void change(string s, string name,vector<vector<string>>& before) {</span><br><span class="line"> for (int i = 0; i < before.size(); i++) {</span><br><span class="line"> if (before[i][1] == s)</span><br><span class="line"> before[i][2] = name;</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">vector<string> solution(vector<string> record) {</span><br><span class="line"> vector<string> answer;</span><br><span class="line"> vector<vector<string>> word;</span><br><span class="line"> vector<vector<string>> before;</span><br><span class="line"></span><br><span class="line"> for (int i = 0; i < record.size(); i++) {</span><br><span class="line"> vector<string> s;</span><br><span class="line"> int count = 0;</span><br><span class="line"> for (int j = 0; j < record[i].size()+1; j++) {</span><br><span class="line"> if (record[i][j] == ' ' || j==record[i].size()) {</span><br><span class="line"> s.emplace_back(record[i].substr(count, j-count));</span><br><span class="line"> count = j + 1;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> word.emplace_back(s);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> for (int i = 0; i < word.size(); i++) {</span><br><span class="line"> if (word[i][0] == "Enter") {</span><br><span class="line"> if (find(word[i][1],word[i][2], before)) {</span><br><span class="line"> before.emplace_back(word[i]);</span><br><span class="line"> continue;</span><br><span class="line"> }</span><br><span class="line"> else</span><br><span class="line"> before.emplace_back(word[i]);</span><br><span class="line"> }</span><br><span class="line"> else if (word[i][0] == "Leave") {</span><br><span class="line"> word[i].emplace_back(append(word[i][1], before));</span><br><span class="line"> before.emplace_back(word[i]);</span><br><span class="line"> }</span><br><span class="line"> else {</span><br><span class="line"> change(word[i][1],word[i][2], before);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> for (int i = 0; i < before.size(); i++) {</span><br><span class="line"> string s;</span><br><span class="line"> s.append(before[i][2]);</span><br><span class="line"> s.append("๋์ด ");</span><br><span class="line"> if (before[i][0] == "Enter") s.append("๋ค์ด์์ต๋๋ค.");</span><br><span class="line"> else s.append("๋๊ฐ์ต๋๋ค.");</span><br><span class="line"> answer.emplace_back(s);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> return answer;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>์ผ๋จ ๊ฒฐ๊ณผ๊ฐ ๋งค์ฐ ์์ข์๋ค. ์คํจํ๋ ๊ฒฝ์ฐ๋ ์์์ ๋ฟ๋ง ์๋๋ผ ์๊ฐ์ด๊ณผ๋ ๋ด๊ธฐ ๋๋ฌธ์ด๋ค.</p><p>๋ชจ๋ฅผ ๋ ๋นจ๋ฆฌ ๊ตฌ๊ธ๋ง์ด ๋ต์ด๋ค.</p><h3 id="BEST"><a href="#BEST" class="headerlink" title="BEST "></a><center><a href="https://life-with-coding.tistory.com/395">BEST</a> </center></h3><p>๋ด๊ฐ ์ฒ์๋ณด๋ STL์ด ์์๋ค.</p><hr><h3 id="StringStream"><a href="#StringStream" class="headerlink" title="StringStream"></a>StringStream</h3><p>ํด๋น ์๋ฃํ์ ๋ง๋ ํ์ํ ์ ๋ณด๋ฅผ ์ถ์ถํ๋ stream ํด๋์ค์ด๋ค.<br><sstream>ํค๋ํ์ผ์ด ํ์ํ๋ค.</p><p>stringstream ์ฐ์ฐ์/ํจ์</p><ul><li>โ>>โ : ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ ์ฐ์ฐ์</li><li>โ<<โ : ๋ฐ์ดํฐ๋ฅผ ์ฝ์
ํ๋ ์ฐ์ฐ์</li><li>โobj.str(target)โ : obj์ string์ ๋ณํํ์ฌ target์ ์ ์ฅ</li></ul><hr><h3 id="ํด๊ฒฐ์ฝ๋"><a href="#ํด๊ฒฐ์ฝ๋" class="headerlink" title="ํด๊ฒฐ์ฝ๋"></a>ํด๊ฒฐ์ฝ๋</h3><figure class="highlight plain"><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><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line">#include <string></span><br><span class="line">#include <sstream></span><br><span class="line">#include <vector></span><br><span class="line">#include <map></span><br><span class="line">using namespace std;</span><br><span class="line">map<string, string> m;</span><br><span class="line"></span><br><span class="line">vector<string> solution(vector<string> record)</span><br><span class="line">{</span><br><span class="line"> vector<string> answer;</span><br><span class="line"> string id, name, state;</span><br><span class="line"> stringstream ss;</span><br><span class="line"></span><br><span class="line"> for(int i=0;i<record.size();i++)</span><br><span class="line"> {</span><br><span class="line"> ss.str(record[i]);</span><br><span class="line"> ss >> state; ss >> id; ss >> name;</span><br><span class="line"> if(state == "Enter" || state == "Change"){</span><br><span class="line"> m[id] = name;</span><br><span class="line"> }</span><br><span class="line"> ss.clear();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> for(int i=0;i<record.size();i++)</span><br><span class="line"> {</span><br><span class="line"> ss.str(record[i]);</span><br><span class="line"> ss >> state; ss >> id;</span><br><span class="line"> name = m[id];</span><br><span class="line"> if(state == "Enter") {</span><br><span class="line"> answer.push_back(name + "๋์ด ๋ค์ด์์ต๋๋ค.");</span><br><span class="line"> }</span><br><span class="line"> if(state == "Leave"){</span><br><span class="line"> answer.push_back(name + "๋์ด ๋๊ฐ์ต๋๋ค.");</span><br><span class="line"> }</span><br><span class="line"> ss.clear();</span><br><span class="line"> }</span><br><span class="line"> return answer;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>์๋ก์ด STL์ ๋ฐ๊ฒฌํ์ฌ ๊ธฐ๋ถ์ ์ข์๋ค. ๋นจ๋ฆฌ ์ฝ๋ฉํ๋ ค๋ค๋ณด๋ ํด์๋ ๊น๋จน๊ณ ํ๋ค๋ฅ ์ฒ๋ฆฌํ๋ค๋ณด๋ ์ ๋ฐ ๋ง์์ด ๋์๋ค.<br>์์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์ฌ ๋ค๋ฅธ ๋ฌธ์ ๋ค์ ์ ์ฉ์์ผ๋ณด๋๋ก ํด์ผ๊ฒ ๋ค.</p>]]></content>
<categories>
<category> Algorithm </category>
</categories>
<tags>
<tag> Algorithm </tag>
<tag> Programmers </tag>
</tags>
</entry>
<entry>
<title>[Java]Day02 - ์๋ฐ ๋ฐ์ดํฐํ์
,๋ณ์ ๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ด</title>
<link href="2021/01/20/java-day2/"/>
<url>2021/01/20/java-day2/</url>
<content type="html"><![CDATA[<h2 id="Review-Day01"><a href="#Review-Day01" class="headerlink" title="Review Day01"></a>Review Day01</h2><p>์ค๋ ํฌ์คํธ์ ์์ ์ง๋ ์๊ฐ์ ๋ค๋ค๋ Compile์ ๋ํด์ ๋ค์ ํ ๋ฒ ๋ค๋ค๋ณด๊ฒ ๋ค.</p><blockquote><p>Q1. java14๋ก compileํ ํ์ผ์ java8๋ก ์คํํ๋ฉด ์ด๋ป๊ฒ ๋ ๊ฒ์ธ๊ฐ?<br>Q2. java8๋ก compileํ ํ์ผ์ java14๋ก ์คํํ๋ฉด ์ด๋ป๊ฒ ๋ ๊ฒ์ธ๊ฐ?</p></blockquote><p>Q1์ ์ ๋ต์ <code>Error</code>, Q2์ ์ ๋ต์ <code>Success</code>์ด๋ค. ์ฝ๊ฒ ์๊ฐํ๋ฉด ๋ฎ์ ๋ฒ์ ผ์ ์ปดํ์ผ๋ฌ๋ก ์ปดํ์ผ ์ ๋์ ๋ฒ์ ผ์ ์๋ฐ๋ก ์คํ์ ๊ฐ๋ฅํ์ง๋ง ๋์ ๋ฒ์ ผ์ ์ปดํ์ผ๋ฌ๋ก ์ปดํ์ผ ์ ๋ฎ์ ๋ฒ์ ผ์ ์๋ฐ๋ก ์คํ์ ๋ถ๊ฐ๋ฅํ๋ค.</p><blockquote><p>Q3. ๊ทธ๋ ๋ค๋ฉด java14๋ฒ์ ผ์ผ๋ก compile์์๋ java8๋ก๋ ์ ๋ ์คํ๋ถ๊ฐ๋ฅํ ๊ฒ์ธ๊ฐ?</p></blockquote><p>Q3์ ์ ๋ต์ <code>False</code>์ด๋ค. <code>javac -source 1.6 -target 1.6</code>์ต์
์ ์ค์ผ๋ก์จ ์ปดํ์ผ์ ์คํ๋ ๊ฐ๋ฅํด์ง๋ค. ๋์ ๋ฒ์ ผ์์๋ง ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ๋ ์ปดํ์ผ๋ฌ๊ฐ ๋ฎ์๋ฒ์ ผ์ ํธํ๋๋๋ก ์ปดํ์ผ์ ํ๊ธฐ ๋๋ฌธ์ ์คํ์ด ๊ฐ๋ฅํ์ง๋๊ฒ์ด๋ค. (๋ชจ๋ ๊ธฐ๋ฅ์ด ๊ฐ๋ฅํ ๊ฒ์ ์๋๋๊น ๊ตณ์ด ๊ทธ๋ฌ์ง๋ง์!)<br>๊ทธ๋ฌ๋ ์ ๋ง ์ํ๊น๊ฒ๋, ์ผ๋ถ Maven plugin์ด ๊ฐํน ํน์ ๋ฒ์ ผ์ผ๋ก ๋ง๋ค์ด์ง๊ณ ๋ฎ์๋ฒ์ ผ์ผ๋ก ํธํ์ด ์๋์ด ํ๋ก์ ํธ ์ ํ์ธ์ ํด์ผํ๋ค.</p><p>๋์ ๋ฒ์ ผ์ ์ปดํ์ผ์ ๋ฎ์ ๋ฒ์ ผ์ผ๋ก ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋ฌ๋ค.</p><figure class="highlight plain"><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">Error: A JNI error has occurred, please check your installation and try again</span><br><span class="line">Exception in thread "main" java.lang.InsupportedClassVersionError: ํ์ผ๋ช
has been compiled by a more recent version of the Java Runtime (class file version 58.0), this version of the Java Runtime only recognizes class file versions up to 52.0</span><br></pre></td></tr></table></figure><p>์ด๋ ์์ ์ค๋ช
ํ๋ ๊ทธ๋๋ก์ ๋ง์ ์๋ฏธํ๋ค.</p><blockquote><p>Q4. javac๋ ์ด๋์ ๋ค์ด์๋๊ฐ?</p></blockquote><p>Q4์ ์ ๋ต์ <code>JDK</code>์ด๋ค. <code>compile</code>์ ํ๋ ๊ฒ์ ๊ฐ๋ฐ์์ ๋ชซ์ด๊ธฐ ๋๋ฌธ์ JDK์๋ง ๋ค์ด๊ฐ์๋ค. JAVA9๋ถํฐ๋ JRE๋ ๋ฐ๋ก ๋ฐฐํฌ ์ํ๋ฏ๋ก ๋์ค์ ํ์ธํด๋ณด์.</p><blockquote><p>Q5. ๋ฐ์ดํธ์ฝ๋๋ ์ ๋ฐ์ดํธ์ฝ๋์์?</p></blockquote><p>Q5์ ์ ๋ต์ <code>opcode๊ฐ 1๋ฐ์ดํธ์ด๊ธฐ ๋๋ฌธ</code>์ด๋ค. ์์คํ
ํ๋ก๊ทธ๋๋ฐ ์์
์ ๋ค์๋ค๋ฉด ์๊ฒ ์ง๋ง ๊ธฐ๊ณ์ด๋ก ๋ฐ๊พธ๋ ๊ณผ์ ์ค์ ๋ฐ์ดํธ์ฝ๋๋ ์ด์
๋ธ๋ฆฌ์ด๊ฐ์ ๊ฒ๋ค์ opcode๋ผ๋ ๊ฒ์ด ์กด์ฌํ๋ค. ์ด๊ฒ์ด 1๋ฐ์ดํธ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํธ์ฝ๋๋ผ๊ณ ํ๋ค. ๋ํ, <strong>java๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ์ธ์ด</strong>๋ค๋ ์ ์ ํ ์ปดํ์ผ๋ฌ๋ก ํตํด ๋ฐ์ดํธ์ฝ๋๋ก ๋ณํ์ด ๋๋ค๋ฉด jvm์ ์ด๋ฅผ ์คํํ ์ ์๋ค.</p><hr><h2 id="Day02-์๋ฐ-๋ฐ์ดํฐ-ํ์
-๋ณ์-๊ทธ๋ฆฌ๊ณ -๋ฐฐ์ด"><a href="#Day02-์๋ฐ-๋ฐ์ดํฐ-ํ์
-๋ณ์-๊ทธ๋ฆฌ๊ณ -๋ฐฐ์ด" class="headerlink" title="Day02. ์๋ฐ ๋ฐ์ดํฐ ํ์
, ๋ณ์ ๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ด"></a>Day02. ์๋ฐ ๋ฐ์ดํฐ ํ์
, ๋ณ์ ๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ด</h2><hr><h3 id="ํ๋ฆฌ๋ฏธํฐ๋ธ-ํ์
-์ข
๋ฅ์-๊ฐ์-๋ฒ์-๊ทธ๋ฆฌ๊ณ -๊ธฐ๋ณธ-๊ฐ"><a href="#ํ๋ฆฌ๋ฏธํฐ๋ธ-ํ์
-์ข
๋ฅ์-๊ฐ์-๋ฒ์-๊ทธ๋ฆฌ๊ณ -๊ธฐ๋ณธ-๊ฐ" class="headerlink" title="ํ๋ฆฌ๋ฏธํฐ๋ธ ํ์
์ข
๋ฅ์ ๊ฐ์ ๋ฒ์ ๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ณธ ๊ฐ"></a>ํ๋ฆฌ๋ฏธํฐ๋ธ ํ์
์ข
๋ฅ์ ๊ฐ์ ๋ฒ์ ๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ณธ ๊ฐ</h3><p>๋ณ์์ ํ์
์๋ ํฌ๊ฒ ๋๊ฐ์ง๋ก ๋๋ ์ ์๋ค.</p><ol><li>Primitive Type</li><li>Reference Type</li></ol><p>์ด์ค Primitive Type์๋ ์ด 8๊ฐ์ ํ์
์ด ์์ผ๋ฉฐ, ํฌ๊ฒ ๋
ผ๋ฆฌํ, ๋ฌธ์ํ, ์ ์ํ, ์ค์ํ์ผ๋ก ๊ตฌ๋ถ๋๋ค.<br>๋ฌธ์ํ์ธ char๋ ๋ฌธ์๋ฅผ ๋ด๋ถ์ ์ผ๋ก ์ ์(์ ๋์ฝ๋)๋ก ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ์ ์ํ๊ณผ ๋ณ๋ฐ ๋ค๋ฅด์ง ์์ผ๋ฉฐ, <strong>์ ์ํ ๋๋ ์ค์ํ๊ณผ ์ฐ์ฐ๋ ๊ฐ๋ฅํ๋ค.</strong> ๋ฐ๋ฉด์ boolean์ ๋ค๋ฅธ ๊ธฐ๋ณธํ๊ณผ์ ์ฐ์ฐ์ด ๋ถ๊ฐ๋ฅํ๋ค. ์ฆ, boolean์ ์ ์ธํ ๋๋จธ์ง 7๊ฐ์ ๊ธฐ๋ณธํ์ ์๋ก ์ฐ์ฐ๊ณผ ๋ณํ์ด ๊ฐ๋ฅํ๋ค. ์ ์๋ ๊ฐ์ฅ ใ
๋ง์ด ์ฌ์ฉ๋๋ฏ๋ก ํ์
์ 4๊ฐ์ง๋ ์ ๊ณตํ๋ค. ๊ฐ ํ์
๋ง๋ค ์ ์ฅํ ์ ์๋ ๊ฐ์ ๋ฒ์๊ฐ ๋ค๋ฅด๋ฏ๋ก ์ ์ฅํ ๊ฐ์ ๋ฒ์์ ๋ง๋ ํ์
์ ์ ํํ๋ฉด ๋์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก int๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค. ์๋ํ๋ฉด, int๋ CPU๊ฐ ๊ฐ์ฅ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ํ์
์ด๊ธฐ ๋๋ฌธ์ด๋ค. ํจ์จ์ ์ธ ์คํ๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ๋ ค๋ฉด, byte๋ short๋ฅผ ์ ํํ์.</p><p>Reference Type์ ๋ค์๊ณผ ๊ฐ๋ค.</p><blockquote><p>โThe basic difference is that primitive variables store the actual values, whereas reference variables store the addresses of the objects they refer to.โ <a href="https://stackoverflow.com/a/32049775">์ถ์ฒ</a></p></blockquote><h3 id="์์์-๋ฆฌํฐ๋ด"><a href="#์์์-๋ฆฌํฐ๋ด" class="headerlink" title="์์์ ๋ฆฌํฐ๋ด"></a>์์์ ๋ฆฌํฐ๋ด</h3><p>โ์์(constant)โ๋ ๋ณ์์ ๋ง์ฐฌ๊ฐ์ง๋ก โ๊ฐ์ ์ ์ฅํ ์ ์๋ ๊ณต๊ฐโ์ด๋ค. ํ์ง๋ง ๋ง๊ทธ๋๋ก ๋ณ์๋ ๋ณํ ์ ์๋ ๊ณต๊ฐ์ด์ง๋ง ์์๋ ๋ณํ ์ ์๋ ๊ณต๊ฐ์ด๋ค. ์์์ ์ด๋ฆ์ ๋ชจ๋ <strong>๋๋ฌธ์</strong>๋ก ํ๋ ๊ฒ์ด ์๋ฌต์ ์ธ ๊ด๋ก์ด๋ฉฐ, ์ฌ๋ฌ ๋จ์ด๋ก ์ด๋ฃจ์ด์ ธ์๋๊ฒฝ์ฐ โ_โ๋ก ๊ตฌ๋ถํ๋ค. (ex. <code>final int MAX_SPEED</code>)<br>โ๋ฆฌํฐ๋ด(literal)โ์ ์์์ ๊ตฌ๋ถ์ง๊ธฐ ์ํด ๋ง๋ ๊ฒ์ผ๋ก ๊ทธ ์์ฒด๋ก ๊ฐ์ ์๋ฏธํ๋ค.</p><blockquote><p>โA literal is the source code representation of a fixed value; literals are represented directly in your code without requiring computation. As shown below, itโs possible to assign a literal to a variable of a primitive typeโ <a href="https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html">์ถ์ฒ</a></p></blockquote><h3 id="๋ณ์์-์ค์ฝํ์-๋ผ์ดํํ์"><a href="#๋ณ์์-์ค์ฝํ์-๋ผ์ดํํ์" class="headerlink" title="๋ณ์์ ์ค์ฝํ์ ๋ผ์ดํํ์"></a>๋ณ์์ ์ค์ฝํ์ ๋ผ์ดํํ์</h3><p>๋ณ์์ ์ค์ฝํ๋ ๋ง๊ทธ๋๋ก ์ค์ฝํ์ด๋ค. ์ฆ, ๋ณ์๊ฐ ์ด์์๋ ๋ฒ์์ ๋ํด ๋งํ๋ ๊ฒ์ด๋ค. ๋ผ์ดํํ์๊ณผ ์ค์ฝํ๋ ๋ถ์ด๋ค๋๋ ๋จ์ด๋ค์ด๋ค.<br>์ด์ ์ฐ๋ฆฌ๋ ๋ณ์๋ฅผ instance, static, local๋ก ๋๋ ์ ์๋๋ฐ ์ด๋ ๋ค์๊ณผ ๊ฐ์ด ์ธ ์ ์๋ค. <a href="https://www.tutorialspoint.com/scope-and-lifetime-of-variables-in-java">์ถ์ฒ</a></p><ol><li><p>Instance Variable<br>Scope : throughout the class except in static methods<br>Lifetime : until the object stays in memory.</p></li><li><p>Static(Class) Variable<br>Scope : throughout the class<br>Lifetime : until the end of the program or as long as the class is loaded in memory.</p></li><li><p>Local Variable<br>Scope : within the block in which it is declared<br>Lifetime : until the control leaves the block in which it is declared.</p></li></ol><h3 id="ํ์
-๋ณํ-์บ์คํ
-๊ทธ๋ฆฌ๊ณ -ํ์
-ํ๋ก๋ชจ์
"><a href="#ํ์
-๋ณํ-์บ์คํ
-๊ทธ๋ฆฌ๊ณ -ํ์
-ํ๋ก๋ชจ์
" class="headerlink" title="ํ์
๋ณํ, ์บ์คํ
๊ทธ๋ฆฌ๊ณ ํ์
ํ๋ก๋ชจ์
"></a>ํ์
๋ณํ, ์บ์คํ
๊ทธ๋ฆฌ๊ณ ํ์
ํ๋ก๋ชจ์
</h3><p>ํ์
๋ณํ์ด๋ ๋ง ๊ทธ๋๋ก ํ์
๋ณํ์ด๋ค.(Dejavu..) byte๋ก ์ ์ธํ๋ ๋ณ์๋ฅผ int ๋๋ ๊ธฐํ type์ผ๋ก ๋ณํ์ํค๋ ๊ฒ์ด๋ค. ํ์ง๋ง ์ด๋ ๊ต์ฅํ ์ค์ํ ๋ฌธ์ ์ด๋ค. C๋ฅผ ์ฒ์ ์ ํ์๋ค๋ฉด ์ฒ์์ ๋ถ๋ชํ๋ ๋๊ด์ด ์์๊ฒ์ด๋ค. 0.5๋ฅผ ํํํ๋ ๊ฒ์ด๋ค. intํ ๋ณ์ a,b๋ฅผ ๊ฐ๊ฐ 1, 2๋ก ํ๋ค๋ฉด ์ฐ๋ฆฌ๋ 0.5๋ ๋น์ฐํ a/b์ผ ๊ฒ์ด๋ผ ์๊ฐํ๊ฒ ์ง๋ง ์ ๋ 0.5๊ฐ ์ถ๋ ฅ๋์ง ์๋๋ค. ์ด๋ ๋ณ์์ ์๋ฃํ์ด int๋ก ๋ฐํ๋๊ธฐ ๋๋ฌธ์ ์ ๋ ์ํ๋ ๊ฐ์ธ 0.5๊ฐ ์๋ 0์ด ์ถ๋ ฅ์ด ๋์๋๊ฑธ ๊ฒฝํํ์ ๊ฒ์ด๋ค. ๊ทธ๋์ ํ์ํ ๊ฒ์ด ์ด๋ฐ ํ์
๋ณํ์ด๋ค.</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">double c = (double)(a/b);</span><br></pre></td></tr></table></figure><p>์ด๋ฐ์์ผ๋ก ํ๋ ๊ฒ์ด ์บ์คํ
์ด๋ค. ๊ต์ฅํ ๊ฐ๋จํ์ง ์์๊ฐ? ์ํ๋ ํ์
์ผ๋ก ์์ ๊ดํธ๋ฅผ ๋ถ์ฌ์ฐ๊ธฐ๋ง ํ๋ฉด๋๋ ๊ฒ์ด๋ค.<br>ํ์ง๋ง ์ธ์์ ๊ทธ๋ ๊ฒ ๋
น๋ก์น ์๋ค. boolean์ ์ ์ธํ Primitive Type๊ฐ์๋ ์์ ๋กญ๊ฒ ๋ณํ์ด ๊ฐ๋ฅํ์ง๋ง(๋ฌผ๋ก ๋ฐ์ดํฐ ์์ค์ ์์ ์ ์๋ค.) Primitive Type๊ฐ์๋ ํ๋ณํ์ ํ๋๊ฒ์ด ์์น์ด์ง๋ง, ๊ฐ์ ๋ฒ์๊ฐ ์์ ํ์
์์ ํฐ ํ์
์ผ๋ก์ ํ๋ณํ์ ์๋ต์ด ๊ฐ๋ฅํ๋ค. Reference Type๊ฐ์๋ implicit up-casting, explicit down-casting์ด ์ด๋ฃจ์ด์ง๋ค.</p><h3 id="1์ฐจ-๋ฐ-2์ฐจ-๋ฐฐ์ด-์ ์ธํ๊ธฐ"><a href="#1์ฐจ-๋ฐ-2์ฐจ-๋ฐฐ์ด-์ ์ธํ๊ธฐ" class="headerlink" title="1์ฐจ ๋ฐ 2์ฐจ ๋ฐฐ์ด ์ ์ธํ๊ธฐ"></a>1์ฐจ ๋ฐ 2์ฐจ ๋ฐฐ์ด ์ ์ธํ๊ธฐ</h3><figure class="highlight plain"><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">int[] a = {1,2,3};</span><br><span class="line">int[][] b = {{2,3,4},{5,6,7}};</span><br><span class="line">์ด๋ถ๋ถ์ ์ด์ ๋๋ก๋ง ํด๋๊ณ ๋ค์์๊ฐ์ Review๋ฅผ ํตํด ๋ ์์ธํ ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ๋ค.</span><br></pre></td></tr></table></figure><h3 id="ํ์
-์ถ๋ก -var"><a href="#ํ์
-์ถ๋ก -var" class="headerlink" title="ํ์
์ถ๋ก , var"></a>ํ์
์ถ๋ก , var</h3><p>์ฝํ๋ฆฐ์ ์จ๋ณด๋ฉฐ ์์ฃผ ์ฌ์ฉํ๋ <code>var</code>์ด๋ค. ๊ทธ๋๋ ๋ญ์ง๋ ๋ชจ๋ฅด๊ณ ๋ฌด์กฐ๊ฑด! <code>var</code>๋ก ์ ์ธํ์๋ค. ๋ฌผ๋ก ์ฐจ์ด๊ฐ ์๊ฒ ์ง๋ง ์ฐ์ ์๋ฐ๋ก ๋ฐฐ์๋ณด๋๋ก ํ๊ฒ ๋ค. ์ฐ์ <code>var</code>์ java10์์ ์๊ฒจ๋ ๊ฒ์ด๋ค. <code>var</code>๋ก ์ ์ธํ๋ค๋ฉด ๋ฐํ์์ ๋ณ์์ ์ข
๋ฅ๋ฅผ ํ์
ํด ์์์ ๋ณํ์์ผ์ค๋ค. ํ์
์ถ๋ก ์ด๋ ์๋ฐ์์ฒด์ ์ผ๋ก ์ด๋ค ํ์
์ธ์ง ์์ธกํ๊ณ , ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ ์๋ฏธํ๋ค.</p><p> <a href="https://johngrib.github.io/wiki/java10-var/">์ฌ๋ฐ๋ฅธ ์ฌ์ฉ๊ณผ ์๋ชป๋ ์ฌ์ฉ</a></p><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> a = <span class="number">1</span>; <span class="comment">// Legal</span></span><br><span class="line"><span class="keyword">var</span> b = <span class="number">2</span>, c = <span class="number">3.0</span>; <span class="comment">// Illegal: multiple declarators</span></span><br><span class="line"><span class="keyword">var</span> d[] = <span class="keyword">new</span> <span class="keyword">int</span>[<span class="number">4</span>]; <span class="comment">// Illegal: extra bracket pairs</span></span><br><span class="line"><span class="keyword">var</span> e; <span class="comment">// Illegal: no initializer</span></span><br><span class="line"><span class="keyword">var</span> f = { <span class="number">6</span> }; <span class="comment">// Illegal: array initializer</span></span><br><span class="line"><span class="keyword">var</span> g = (g = <span class="number">7</span>); <span class="comment">// Illegal: self reference in initializer</span></span><br></pre></td></tr></table></figure><p> <a href="https://johngrib.github.io/wiki/java10-var/">ํ์
</a></p><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> a = <span class="number">1</span>; <span class="comment">// a has type 'int'</span></span><br><span class="line"><span class="keyword">var</span> b = java.util.List.of(<span class="number">1</span>, <span class="number">2</span>); <span class="comment">// b has type 'List<Integer>'</span></span><br><span class="line"><span class="keyword">var</span> c = <span class="string">"x"</span>.getClass();</span><br><span class="line"> <span class="comment">// (see JLS 15.12.2.6)</span></span><br><span class="line"><span class="keyword">var</span> d = <span class="keyword">new</span> Object() {}; <span class="comment">// d has the type of the anonymous class</span></span><br><span class="line"><span class="keyword">var</span> e = (CharSequence & Comparable<String>) <span class="string">"x"</span>;</span><br><span class="line"> <span class="comment">// e has type CharSequence & Comparable<String></span></span><br><span class="line"><span class="keyword">var</span> f = () -> <span class="string">"hello"</span>; <span class="comment">// Illegal: lambda not in an assignment context</span></span><br><span class="line"><span class="keyword">var</span> g = <span class="keyword">null</span>; <span class="comment">// Illegal: null type</span></span><br></pre></td></tr></table></figure><p>์์ฒญ ํธํด๋ณด์ฌ์ ๋ชจ๋ ๋ณ์๋ฅผ var๋ก ์ ์ธํด๋ฒ๋ฆฌ๋ ๊ฒ์ด ์ด๋ป๊ฒ ๋๋ ์๊ฐ์ ํ ์ ์๊ฒ ์ง๋ง ์์ฝ๊ฒ๋ ๊ทธ๋ฌ๋ฉด ์๋๋ค. ์์์น๋ชปํ ์๋ฌ์ ๋์ฒํ ์ ์์ด์ง๋ค. ๊ทธ๋ ๋ค๋ฉด ์ธ์ ์ฌ์ฉํ๋ ๊ฒ์ด๋?์ ๋ํด์๋ <a href="https://velog.io/@composite/Java-10-%EC%97%90%EC%84%9C-var-%EC%9E%AC%EB%8C%80%EB%A1%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0">๋ค์์ ๊ธ</a>์ ์ดํด๋ณด๋ ๊ฒ์ด ์ข๊ฒ ๋ค. <code>์ ๋ค๋ฆญ</code>,<code>๋๋ค</code>,<code>foreach</code>๊ตฌ๋ฌธ ๋ฑ ์ฐ๋ ๋ถ๋ถ์ด ๊ต์ฅํ ๋ง๋ค. ์ด๋ ์ถํ์ ๋ ์์ธํ ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ๋ค.</p>]]></content>
<categories>
<category> Java </category>
</categories>
<tags>
<tag> java8 </tag>
<tag> java10 </tag>
</tags>
</entry>
<entry>
<title>[AAIS]Intro.</title>
<link href="2021/01/19/aais-00/"/>
<url>2021/01/19/aais-00/</url>
<content type="html"><![CDATA[<h1 id="In-AAIS-Advanced-Application-for-Intelligence-Systems-Lab-at-Hanyang-University"><a href="#In-AAIS-Advanced-Application-for-Intelligence-Systems-Lab-at-Hanyang-University" class="headerlink" title="In AAIS(Advanced Application for Intelligence Systems) Lab at Hanyang University"></a>In AAIS(Advanced Application for Intelligence Systems) Lab at Hanyang University</h1><h2 id="๋ค์ด๊ฐ๊ธฐ์-์์"><a href="#๋ค์ด๊ฐ๊ธฐ์-์์" class="headerlink" title="๋ค์ด๊ฐ๊ธฐ์ ์์"></a>๋ค์ด๊ฐ๊ธฐ์ ์์</h2><p>์ด๋ฒ ๊ฒจ์ธ๋ฐฉํ์ ๋ฌด์์ ํด์ผํ ์ง ๊ต์ฅํ ์๊ฐ์ด ๋ง์๋ค. ์๋ฐ๋ฐฑ์๋๊ฐ๋ฐ์๋ก์จ ์์์ ์ํด ์๋ฐ8,์คํ๋ง๋ถํธ๋ฅผ ์์ํ๊ณ ์ด์ ์ฝ๋ฉํ
์คํธ๋ ์ค๋นํด์ผํ๋ค ์๊ฐํด์ <code>Programmers</code>์ <code>Leetcode</code>์ ์ฝ๋ฉํ
์คํธ ์ฐ์ต๋ฌธ์ ๋ฅผ ํ๊ณ ์๋ค. ๋ํ, ๋์ปค๋ฅผ ๊ณต๋ถํ ๊ฒ์ด๋ค.<br>์์ง ๋๋์ง ์์๋ค. ๋ด์ฌํ๋๋ ํ์ง์์์ ๋ด์ฌํ๋(์จ๋ผ์ธ..)๋ ์ ์ฒญํ๊ณ ๊ณ์ ํ๊ธฐ๋ ์ ์ฒญํด์ ์ค๋์(210119)๋ก ๋ง๋ฌด๋ฆฌ ๋๋ค. (์ ํ๋์ ๋ง์ธ)<br>์ด๋ ๊ฒ ํ ๊ฒ ๋ง์ ์์ค์ ๋
ธ์๊ท ๊ต์๋๊ป์ AAIS LAB ์ธํด์ ๋ชจ์งํ์
์ ๋ฐ๋ก ์ ์ฒญ์ ํ๋ค.<br>๋น๋ก ๋ฆ๊ฒ ์ ์ฒญ์ ํ์ง๋ง ๊ต์๋๊ป์ ๋ฐ์์ฃผ์
์ ์ธํด์ผ๋ก์จ ํ๋์ ํ๊ฒ ๋์๋ค.</p><blockquote><p>์ด๋ฒ๋ฐฉํ ํ ๋ชฉ๋ก</p></blockquote><ol><li>AAIS LAB ์ธํด</li><li>JAVA8</li><li>์คํ๋ง๋ถํธ</li><li>๋์ปค</li><li>์ฝ๋ฉํ
์คํธ์ค๋น</li><li>๋ด์ฌํ๋</li><li><del>๊ณ์ ํ๊ธฐ</del></li></ol><p>์ผ๋จ ๋ชฉํ๋ ํฌ๊ฒ ์ก๊ณ ํ๋์ฉ ์ณ๋ผ(?) ๊ฒ์ด๋ค. ์์ง๊น์ง๋ ๋ง์กฑ์ค๋ฌ์ด ๋ฐฉํ์ํ์ด๋ค.</p><p>๊ทผํฉ์ ์ด์ฏค์์ ๋ง๋ฌด๋ฆฌํ๊ณ , ๋ฉ์ค์์ ํ ๋ด์ฉ์ ๋ํด ๊ฐ๋ตํ ์ ๋ฆฌํด๋ณด๊ฒ ๋ค.</p><h2 id="Intro"><a href="#Intro" class="headerlink" title="Intro"></a>Intro</h2><p>๋ด๊ฐ ๋ค๋ฃฐ ์ฃผ์ ๋ <a href="https://www.nature.com/articles/s41598-020-80182-8">Age-gruop determination of living individuals using first molar images based on artificial intelligence</a>์ด๋ค.<br>๊ต์๋๊ป์ ๊ฐ์ฅ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค๊ณ ๊ฐ์กฐํด์ฃผ์ ์๋ฃ์ด๋ค. ์์ง ํ
์ํ๋ก์ฐ๋ ์ปค๋
์ด๋ก ๋ ์ ๋ชจ๋ฅด๋ ์ํ๋ผ ๊ฐ์ฅ ๋๋ ธ๋ค. ์ด๊ฒ์ ๋๋ฒ์งธ ์ด์ ์ด๊ณ ์ฒซ๋ฒ์งธ๋ก๋ <strong>์ฌ๋ฏธ</strong>์์ด๋ณด์๋ค. ์ถ๋ฆฌ์ฅ๋ฅด๋ฅผ ์ข์ํ๋ ์ฌ๋์ผ๋ก์จ ์น์์ ๋์ด๋ฅผ ์ถ๋ก ํ๋ค๋ ๋ด์ฉ์ ๊ต์ฅํ ํฅ๋ฏธ๋ก์ ๊ธฐ ๋๋ฌธ์ด๋ค.</p><h2 id="Abstract"><a href="#Abstract" class="headerlink" title="Abstract"></a>Abstract</h2><blockquote><p>Dental age estimation of living individuals is difcult and challenging, and there is no consensus method in adults with permanent dentition. Thus, we aimed to provide an accurate and robust artifcial intelligence (AI)-based diagnostic system for age-group estimation by incorporating a convolutional neural network (CNN) using dental X-ray image patches of the frst molars extracted via panoramic radiography. The data set consisted of four frst molar images from the right and left sides of the maxilla and mandible of each of 1586 individuals across all age groups, which were extracted from their panoramic radiographs. The accuracy of the tooth-wise estimation was 89.05 to 90.27%. Performance accuracy was evaluated mainly using a majority voting system and area under curve (AUC) scores. The AUC scores ranged from 0.94 to 0.98 for all age groups, which indicates outstanding capacity. The learned features of CNNs were visualized as a heatmap, and revealed that CNNs focus on diferentiated anatomical parameters, including tooth pulp, alveolar bone level, or interdental space, depending on the age and location of the tooth. With this, we provided a deeper understanding of the most informative regions distinguished by age groups. The prediction accuracy and heat map analyses support that this AI-based age-group determination model is plausible and useful.</p></blockquote><p>๋ด๊ฐ ์ ๋ง ์ ๋ง ๊ฐ๋จํ๊ฒ ์์ฝํ์๋ฉด 1586๋ช
์ ์ฒซ๋ฒ์งธ ์ด๊ธ๋ 4๊ฐ๋ฅผ ๋ฐ์ดํฐ๋ฅผ ํตํด ๋์ด๊ตฌ๊ฐ์ ์ถ์ ํ๋ค๋ ๊ฒ์ด๋ค. ํน์ ํ ๋์ด๋ฅผ ๊ตฌํ๋ ๊ฒ์ด ์๋๋ผ ๋์ด๊ตฌ๊ฐ์ ๊ตฌํ๋ค. CNN์ ํตํด ํ์ต์ํค๋ฉฐ ์์(tooth pulp), ์ดํ๋ผ(alveolar bone level), ๋๋ ์ํน๋ถ(interdental space)๋ฅผ <strong>๋์ด์ ์น์์ ์์น</strong>์ ๋ฐ๋ผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋๋ค.<br>์ฌ๊ธฐ์ ์ค์ํ๊ฒ ๋ด์ผํ ๊ฒ์ convolutional neural network(CNN)๊ณผ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ค๋ฅด๊ฒ ๋ฐ๋๋ค๋ ์ ์ด๋ค. ๋ชจ๋ ์ด๋ฅผ ๊ฐ์ ํน์ง์ ํตํด ๊ตฌ๋ณํ๋ ๊ฒ์ด ์๋๋ผ ๋์ด๋, ์น์์ ์์น์ ๋ฐ๋ผ์ ๋ค๋ฅด๊ฒ ๊ตฌ๋ณํ๋ค๋ ๊ฒ์ด๋ค. ์ด๋ ๋์ค์ ๋ค๋ฃจ๊ณ (์ ๋ชจ๋ฅธ๋ค..) ์ด๋ฒ ํฌ์คํธ์์๋ CNN์ผ๋ก ๊ฐ๋จํ๊ฒ ์์ํด๋ณด๊ฒ ๋ค.</p><h2 id="CNN-Convolutional-Neural-Network"><a href="#CNN-Convolutional-Neural-Network" class="headerlink" title="CNN(Convolutional Neural Network)"></a>CNN(Convolutional Neural Network)</h2><p align="center"><img src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnIswa%2FbtqFrmYm9zI%2FcF0xZms06Zkdjy95Bt0K8k%2Fimg.gif"></p><p>์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ผ๋ฐ์ ์ผ๋ก CNN๋ชจ๋ธ์ 3 * 3 ํํฐ๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋ค. ์ ๊ทธ๋ฆผ์์๋ 3๊ฐ์ channel์์ 3๊ฐ์ convolutional filter๋ฅผ ์ฌ์ฉํ์ฌ ๊ณฑ์ํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ ํฉํ๋ ๊ฒ์ด๋ค.<br>์์์์ ๊ณฑ์ด๋ Convolution Product(ํฉ์ฑ๊ณฑ)์ ๋งํ๋ค. ๊ทธ ์ํ์ ๊ณต์์ ๋ค์๊ณผ ๊ฐ๋ค.</p><p align="center"><img src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd6EbAa%2FbtqFpBf5GwW%2Fb2ne6NbSP2mbQA9hT0NvpK%2Fimg.jpg"></p><br><p>์ํ์ ์ธ ์๊ธฐ๋ ์์ง ์ ๋ชจ๋ฅผ๋ฟ๋๋ฌ ๋๋ ์ด๋ก ์ ์ธ ์๊ธฐ๋ณด๋จ ์ฉ๋์ ๊ฒฐ๊ณผ์ ๋ํด์๋ง ์ฐ์ ! ๋ค๋ฃฐ ๊ฒ์ด๋ค.</p><p align="center"><img src="https://blogfiles.pstatic.net/20160105_9/laonple_14519535933045r2XJ_JPEG/%C0%CC%B9%CC%C1%F6_207.jpg?type=w2" height = "300px" width = "600px"></p><p align="center"><img src="https://blogfiles.pstatic.net/20160105_103/laonple_1451953593820FopUd_JPEG/%C0%CC%B9%CC%C1%F6_208.jpg?type=w2" height = "300px" width = "600px"></p><p>CNN์ ์ฌ์ฉํ๋ ์ด์ ๋ ์์ ๊ทธ๋ฆผ์์์ ์ด์ ๊ฐ ๊ฐ์ฅ ํฌ๋ค. ๊ฐ์ A๋ผ๋ ๋ฌธ์๋ฅผ ์
๋ ฅํ๋ค ํด๋ ํ ํฝ์
๋ง translation๋์ด๋ ๋ค๋ฅธ ์ด๋ฏธ์ง๋ก ์ธ์์ ํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋๋ค. data๊ฐ ๊ต์ฅํ ๋ง์ ๋ง์ ์์ ํ์ต์์ผฐ๋ค๊ณ ํ๋๋ผ๋ ์ฝ๊ฐ์ด๋ผ๋ translation๋๋ค๋ฉด ์ ํ ๋ชจ๋ฅด๋ ๋ฐ์ดํฐ๊ฐ ๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ์ด๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค.</p><p>์์ ์์งค(.gif)์ ๋ดค๋ฏ์ด ํํฐ๋ฅผ ์ด์ฉํ์ฌ ์ป์ output์ Maxpooling Layer์ ํต๊ณผ์์ผ ์ด๋ฏธ์ง์ ํน์ง์ ์ ์ก์ ์ ์๋ค๊ณ ํ๋ค.</p><p>์ฌ๊ธฐ์ Pooling Layer๋ ์ฐจ๋ก๋ก ์ฒ๋ฆฌ๋๋ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ๊ฒ์ ๋งํ๋ค. ์ด ๊ณผ์ ์ผ๋ก ๋ชจ๋ธ์ ์ ์ฒด ํ๋ผ๋ฏธํฐ์ ์๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์๋ค.<br>ํ๋ง์๋ MaxPooling๊ณผ AveragePooling์ด ์กด์ฌํ๋๋ฐ, MaxPooling์ ํด๋น ์์ญ์์ ์ต๋๊ฐ์ ์ฐพ๋ ๋ฐฉ๋ฒ์ด๊ณ , AveragePooling์ ํด๋น ์์ญ์ ํ๊ท ๊ฐ์ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ด๋ค.<br>์ด๋ฌํ ๊ณผ์ ์ ๊ฑฐ์น๋ ์ด์ ์ ๋ํด์ ์ ๊น ๋งํ์๋ฉด ๋ ๋์ ์ ํ๋๋ฅผ ์ํด์๋ ํํฐ๊ฐ ๋ง์์ผ ํ๋๋ฐ, ํํฐ๊ฐ ๋์ด๋ ์๋ก Feature Map์ด ๋์ด๋๋ค.์ด๋ ๋ฅ๋ฌ๋ ๋ชจ๋ธ์ Dimension์ด ๋์ด๋๋ค๋ ๊ฒ์ด๊ณ , High Dimension ๋ชจ๋ธ์ ๊ทธ๋งํผ ํ๋ผ๋ฏธํฐ์ ์ ๋ํ ๋์ด๋๋ ๊ฒ์ด๋ค.์ด๋ Over fitting์ ๋ฌธ์ ์ ๋ฟ๋ง์ด ์๋๋ผ, ๋ชจ๋ธ์ ์ฌ์ด์ฆ์ ๋ ์ดํด์์๋ ํฐ ์ํฅ์ ๋ผ์น๋ค. ๋ฐ๋ผ์ ์ฐจ์์ ๊ฐ์์ํฌ ํ์์ฑ์ด ์๋๋ฐ,์ด๊ฒ์ ํ๋ ๋ฐฉ๋ฒ์ด Pooling Layer๋ฅผ ํ์ฉํ๋ ๊ฒ์ด๋ค. ์ค๋ฒํผํ
์ ๋ํด์๋ ๋ค์์ ๋ batchnormalization์ ๋ค๋ฃจ๋ฉฐ ํ ๊ฒ์ด๋ค.</p><p>์ฐ์ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ ๋ด์ฉ์ ์์ ๊ฐ๋ค. ์์ง ๋ชจ๋ฅด๋ ๋ด์ฉ๋ ๋ง๊ณ ๊ฒํฅ๊ธฐ์ ๊ณต๋ถ๋ผ ๋ง์ด ๋ถ์กฑํ ๊ธ์ด๋ค. ๋์ค์ ์ด ๊ธ์ ๋ดค์ ๋ ์กฐ๊ธ์ด๋๋ง ๋
ธ๋ ฅํ๋ค๋ผ๋ ์๊ฐ์ด ๋ค์๋ค๋ฉด ์ค๋์ ๋๋ ๋ง์กฑํ ๊ฒ์ด๋ค.</p>]]></content>
<categories>
<category> AAIS </category>
</categories>
<tags>
<tag> AI </tag>
<tag> AAIS </tag>
<tag> tensorflow </tag>
</tags>
</entry>
<entry>
<title>[Java]Day01 - JVM์ด๋?</title>
<link href="2021/01/19/java-day1/"/>
<url>2021/01/19/java-day1/</url>
<content type="html"><![CDATA[<h2 id="1-JVM์ด๋"><a href="#1-JVM์ด๋" class="headerlink" title="1. JVM์ด๋?"></a>1. JVM์ด๋?</h2><h3 id="JVM์-์ฉ๋์-์ ์"><a href="#JVM์-์ฉ๋์-์ ์" class="headerlink" title="JVM์ ์ฉ๋์ ์ ์"></a>JVM์ ์ฉ๋์ ์ ์</h3><hr><p>JVM์๋ 2๊ฐ์ง ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ด ์๋ค.<br> ์ฒซ๋ฒ์งธ๋ก ์๋ฐ ํ๋ก๊ทธ๋จ์ด ์ด๋ ๊ธฐ๊ธฐ, ๋๋ ์ด๋ ์ด์์ฒด์ ์์์๋ ์คํ๋ ์ ์๊ฒ ํ๋ ๊ฒ๊ณผ ํ๋ก๊ทธ๋จ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ต์ ํํ๋ ๊ฒ์ด๋ค. ์ด์ ๋ํด์๋ JVM ๊ตฌ์ฑ์์์์ ์์ธํ ๋ค๋ค๋ณด๊ฒ ๋ค.<br> ๊ฐ์ฅ ์ ๋ช
ํ ์์น์ธ โํ ๋ฒ ์์ฑํด, ์ด๋์์๋ ์คํํ๋ค.(Write Once, Run Anywhere, WORA)โ๊ฐ ๋ฐ๋ก ์ด๊ฒ์ด๋ค. ์ฆ, ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์ JVM ์์์ ๋์ํ๊ธฐ ๋๋ฌธ์ JVM์ ์ข
์์ ์ด๋, OS์ ํ๋์จ์ด์๋ ๋
๋ฆฝ์ ์ด๋ผ ํ๋ก๊ทธ๋จ์ ๋ณ๊ฒฝ์์ด ์คํ์ด ๊ฐ๋ฅํ๋ค.<br>์๋ฐ๊ฐ ๋์จ ์์ ์๋ ๋ฉ๋ชจ๋ฆฌ๊ด๋ฆฌ์ OS์ ํ๋์จ์ด ์์กด์ฑ์ด ์์๊ธฐ ๋๋ฌธ์ ์ด๋ ํฐ ์ฅ์ ์ด๊ธฐ๋ ํ๋ค.</p><figure class="highlight plain"><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">- ๊ธฐ์ ์ ์ ์ : JVM์ ์ฝ๋๋ฅผ ์คํํ๊ณ ํด๋น ์ฝ๋์ ๋ํด ๋ฐํ์ ํ๊ฒฝ์ ์ ๊ณตํ๋ ์ํํธ์จ์ด ํ๋ก๊ทธ๋จ์ ๋ํ ์ฌ์(Specification)์ด๋ค.</span><br><span class="line">- ์ผ๋ฐ์ ์ ์ : JVM์ ์๋ฐ ํ๋ก๊ทธ๋จ์ ์คํํ๋ ๋ฐฉ๋ฒ์ด๋ค. JVM์ ์ค์ ์ ๊ตฌ์ฑํ ๋ค์ ์ค์ ์ฌํญ์ ๋ฐ๋ผ ์คํ ์ค์ ํ๋ก๊ทธ๋จ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๋ค.</span><br></pre></td></tr></table></figure><h3 id="Garbage-Collection"><a href="#Garbage-Collection" class="headerlink" title="Garbage Collection"></a><strong>Garbage Collection</strong></h3><p> ์๋ฐ ์ด์ ์๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ชจ๋ ํ๋ก๊ทธ๋จ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ์๋ค. ์๋ฐ์์๋ JVM์ด ํ๋ก๊ทธ๋จ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ค. JVM์ ๊ฐ๋น์ง ์ปฌ๋ ์
์ด๋ ํ๋ก์ธ์ค๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ์ด๋ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์์ ์ผ๋ก ์ฐพ์๋ด์ ์ ๊ฑฐํ๋ค. ์ฆ, ์คํ์ค์ธ JVM๋ด๋ถ์์ ์ผ์ด๋๋ค.<br> ๊ทธ๋ผ ์ ๋ง์ ๊ฐ๋ฐ์๋ค์ด C๋ C++๊ฐ์ด ๋ฉ๋ชจ๋ฆฌ๊ด๋ฆฌ๋ฅผ ์ง์ ํด์ผํ๋ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋๋ ์๊ฐ์ด ๋ค ์ ์๋ค. ํ์ง๋ง ํธ๋ฆฌํจ์๋ ๋๊ฐ๋ฅผ ์น๋ฃจ๋ ๋ฒ. ์์ ๋งํ๋ฏ JVM์ด ์ง์์ ์ผ๋ก ๊ฐ๋น์ง ์ปฌ๋ ์
์ ํ๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ๊ทธ๋งํผ ๋ง์ด ๋ค์ด๊ฐ๋ค. ํ์ง๋ง, ์ง์ ๊ด๋ฆฌ๋ฅผ ํ๋ค๋ฉด ๊ทธ ์๊ฐ์ ์ค์ผ ์ ์์ ๊ฒ์ด๋ค. ๊ทธ๋์ ์ด์ฐฝ๊ธฐ ์๋ฐ์ ๊ฐ๋น์ง์ปฌ๋ ์
์ ๋ํด ์๋์ธก๋ฉด์์ ๋ง์ด ๊น์๋ค. ํ์ง๋ง, ์ง๊ธ์ ๋ง์ ๊ฐ๋ฐ๊ณผ ์ต์ ํ๋ฅผ ํตํด ํฌ๊ฒ ๊ฐ์ ๋์ด ๋ฉํ์ ๊ฐ๊น์์ก๋ค.</p><hr><h3 id="์ปดํ์ผ-ํ๋-๋ฐฉ๋ฒ"><a href="#์ปดํ์ผ-ํ๋-๋ฐฉ๋ฒ" class="headerlink" title="์ปดํ์ผ ํ๋ ๋ฐฉ๋ฒ"></a>์ปดํ์ผ ํ๋ ๋ฐฉ๋ฒ</h3><p><a href="https://zerodark.tistory.com/14">์ปดํ์ผ ํ๋ ๊ณผ์ </a><br>์ ๋งํฌ์ ์ปดํ์ผ ํ๋ ๊ณผ์ ์ ์ ์์ฝํด์ฃผ์๋ค.</p><p>์ปดํ์ผ ํ๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.</p><figure class="highlight plain"><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">1. ์์ค์ฝ๋๋ฅผ ์์ฑํ๋ค.(.java)</span><br><span class="line">2. ์ปดํ์ผ๋ฌ๋ฅผ ํตํด ๋ฐ์ดํธ์ฝ๋๋ก ์ปดํ์ผํ๋ค. (.class)</span><br><span class="line">3. java๋ช
๋ น์ด๋ก ํ๋ก๊ทธ๋จ์ ์คํํ๋ค.</span><br></pre></td></tr></table></figure><p>๋๋ถ๋ถ์ ๋๊ฐ์ ์ฃผ๋์ด๊ฐ๋ฐ์๋ค์ intelliJ๋ ์ดํด๋ฆฝ์ค๊ฐ์ IDE๋ฅผ ํตํด ์ปดํ์ผ๋ถํฐ ์คํ๊น์ง ๋ชจ๋ ํ์ง๋ง ์์ ๊ณผ์ ๋ค์ ๋น์ฐํ ์์๋์ด์ผํ๋ค.</p><hr><h3 id="๋ฐ์ดํธ์ฝ๋๋"><a href="#๋ฐ์ดํธ์ฝ๋๋" class="headerlink" title="๋ฐ์ดํธ์ฝ๋๋?"></a>๋ฐ์ดํธ์ฝ๋๋?</h3><p>์์ ๊ณผ์ ์ค์ <code>๋ฐ์ดํธ์ฝ๋</code>๋ผ๋ ๊ฒ์ด๋์จ๋ค. ๋ณดํต C๋ C++์ ๋ฐฐ์ฐ๋ค๋ณด๋ฉด ์ด๋ฐ ๊ฒ์ ๋ค์ด๋ณธ ์ ์ด ์๋ค. ๋ฐ์ดํธ ์ฝ๋์ ์ ์๋ ๋ค์๊ณผ ๊ฐ๋ค.</p><blockquote><p>๋ฐ์ดํธ์ฝ๋(Bytecode, portable code, p-code)๋ ํน์ ํ๋์จ์ด๊ฐ ์๋ ๊ฐ์ ์ปดํจํฐ์์ ๋์๊ฐ๋ ์คํ ํ๋ก๊ทธ๋จ์ ์ํ ์ด์ง ํํ๋ฒ์ด๋ค. ํ๋์จ์ด๊ฐ ์๋ ์ํํธ์จ์ด์ ์ํด ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์, ๋ณดํต ๊ธฐ๊ณ์ด๋ณด๋ค ๋ ์ถ์์ ์ด๋ค.<br>๋ค์์ ์๋ฐ์ฝ๋๊ฐ ์๋ค๊ณ ํ์.</p></blockquote><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line">outer:</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">2</span>; i < <span class="number">1000</span>; i++) {</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">2</span>; j < i; j++) {</span><br><span class="line"> <span class="keyword">if</span> (i % j == <span class="number">0</span>)</span><br><span class="line"> <span class="keyword">continue</span> outer;</span><br><span class="line"> }</span><br><span class="line"> System.out.println (i);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>์ด๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐ์ดํธ์ฝ๋๋ก ๋ฒ์ญ๋๋ค.</p><figure class="highlight plain"><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></pre></td><td class="code"><pre><span class="line">0: iconst_2</span><br><span class="line">1: istore_1</span><br><span class="line">2: iload_1</span><br><span class="line">3: sipush 1000</span><br><span class="line">6: if_icmpge 44</span><br><span class="line">9: iconst_2</span><br><span class="line">10: istore_2</span><br><span class="line">11: iload_2</span><br><span class="line">12: iload_1</span><br><span class="line">13: if_icmpge 31</span><br><span class="line">16: iload_1</span><br><span class="line">17: iload_2</span><br><span class="line">18: irem</span><br><span class="line">19: ifne 25</span><br><span class="line">22: goto 38</span><br><span class="line">25: iinc 2, 1</span><br><span class="line">28: goto 11</span><br><span class="line">31: getstatic #84; // Field java/lang/System.out:Ljava/io/PrintStream;</span><br><span class="line">34: iload_1</span><br><span class="line">35: invokevirtual #85; // Method java/io/PrintStream.println:(I)V</span><br><span class="line">38: iinc 1, 1</span><br><span class="line">41: goto 2</span><br><span class="line">44: return</span><br></pre></td></tr></table></figure><p>๋ฐ์ดํธ์ฝ๋๋ ์ปดํ์ผ์ ๊ณผ์ ์ด๋ฏ๋ก ๋น์ฐํ ์ฌ๋์ด ์ฝ๊ธฐ ์ฝ๋๋ก ์ฐ์ธ ์์ค์ฝ๋๋ณด๋ค ๋ ์ถ์์ ์ด๋ฉฐ, ๋ ๊ฐ๊ฒฐํ๊ณ , ๋ ์ปดํจํฐ ์ค์ฌ์ ์ด๋ค.(์ด์
๋ธ๋ฆฌ์ด์ ๋น์ทํํํ๋ค.) ์ค์ ์๊น ๋ณด์ฌ์ค ์ปดํ์ผ ๊ณผ์ ์ค์ ํ๊ฐ์ง ๊ณผ์ ์ด ์๋ต๋์๋๋ฐ, ๋ฐ๋ก ์คํ์ ์ JIT์ปดํ์ผ๋ฌ๋ก ๊ธฐ๊ณ์ฝ๋๋ก ๋ฐ๊พธ๋ ๊ฒ์ด๋ค. ์ด์ ๋ํด์๋ ๋ค์ ๊ณผ์ ์์ ์ดํด๋ณด๊ฒ ๋ค.</p><hr><h3 id="JIT-์ปดํ์ผ๋ฌ๋"><a href="#JIT-์ปดํ์ผ๋ฌ๋" class="headerlink" title="JIT ์ปดํ์ผ๋ฌ๋?"></a>JIT ์ปดํ์ผ๋ฌ๋?</h3><p>์ ์๋ ๋ค์๊ณผ ๊ฐ๋ค.</p><blockquote><p>JIT ์ปดํ์ผ(just-in-time compilation) ๋๋ ๋์ ๋ฒ์ญ(dynamic translation)์ ํ๋ก๊ทธ๋จ์ ์ค์ ์คํํ๋ ์์ ์ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํ๋ ์ปดํ์ผ ๊ธฐ๋ฒ์ด๋ค.</p></blockquote><p>์ด๋ฐ ๊ธฐ๊ณ์ด ๋ณํ์ ์ฝ๋๊ฐ ์คํ๋๋ ๊ณผ์ ์ ์ค์๊ฐ์ผ๋ก ์ผ์ด๋๋ฉฐ(๊ทธ๋์ Just-In-Time์ด๋ค), ์ ์ฒด ์ฝ๋์ ํ์ํ ๋ถ๋ถ๋ง ๋ณํํ๋ค. ๊ธฐ๊ณ์ด๋ก ๋ณํ๋ ์ฝ๋๋ ์บ์์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ์ฌ์ฌ์ฉ์ ์ปดํ์ผ์ ๋ค์ ํ ํ์๊ฐ ์๋ค.</p><p>์ผ๋ฐ์ ์ธ <code>์ธํฐํ๋ฌํฐ ์ธ์ด(์์: cpython)</code>๋ ๋ฐ์ดํธ์ฝ๋๋ ์์ค์ฝ๋๋ฅผ ์ต์ ํ ๊ณผ์ ์ด ์๊ธฐ ๋ฒ์ญํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ด ๋ฎ๋ค. ๋ฐ๋ฉด <code>์ ์ ์ผ๋ก ์ปดํ์ผํ๋ ์ธ์ด(์์: c ์ธ์ด)</code>๋ ์คํ ์ ์ ๋ฌด์กฐ๊ฑด ์ปดํ์ผ์ ํด์ผํ๊ธฐ ๋๋ฌธ์ ๋ค์ํ ํ๋ซํผ์ ๋ง๊ฒ ์ปดํ์ผ์ ํ๋ ค๋ฉด ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค. <code>๋์ ์ปดํ์ผ ํ๊ฒฝ</code>์ ์คํ ๊ณผ์ ์์ ์ปดํ์ผ์ ํ ์ ์๊ธฐ ์ํด ๋ง๋ค์ด์ก๋ค. JIT๋ ์ ์ ์ปดํ์ผ๋ฌ ๋งํผ ๋น ๋ฅด๋ฉด์ ์ธํฐํ๋ฌํฐ ์ธ์ด์ ๋น ๋ฅธ ์๋ต์๋๋ฅผ ์ถ๊ตฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. ๋ฐ์ดํธ์ฝ๋ ์ปดํ์ผ๋ฌ๊ฐ ์๊ฐ์ด ๋ง์ด ์์๋๋ ์ต์ ํ๋ฅผ ๋ฏธ๋ฆฌ ํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํธ์ฝ๋์์ ๊ธฐ๊ณ์ด ๋ฒ์ญ์ ํจ์ฌ ๋น ๋ฅด๊ฒ ์งํ๋ ์ ์๋ค. ๋ํ ๋ฐ์ดํธ์ฝ๋๋ ์ด์์ฑ์ด ๋ฐ์ด๋ ๊ฐ์ ๋จธ์ ์ด ์ค์น๋์ด ์์ผ๋ฉด ๋น ๋ฅด๊ฒ ์คํํ ์ ์๋ค.</p><hr><h3 id="JVM-๊ตฌ์ฑ์์"><a href="#JVM-๊ตฌ์ฑ์์" class="headerlink" title="JVM ๊ตฌ์ฑ์์"></a>JVM ๊ตฌ์ฑ์์</h3><p align="center"><img src="https://d2.naver.com/content/images/2015/06/helloworld-1230-1.png"></p><p>JVM์๋ 3๊ฐ์ง ์ธก๋ฉด์ด ์๋ค๊ณ ํ ์ ์๋ค. ํ์ค(Specification), ๊ตฌํ(Implementation ) ๊ทธ๋ฆฌ๊ณ ์ธ์คํด์ค(Instance)์ธ๋ฐ, ๊ฐ๊ฐ์ ๋ํด ์ดํด๋ณด์.</p><h4 id="1-ํ์ค-Specification"><a href="#1-ํ์ค-Specification" class="headerlink" title="1. ํ์ค(Specification)"></a>1. ํ์ค(Specification)</h4><p>์ฒซ์งธ, JVM์ ์ํํธ์จ์ด ์ฌ์์ด๋ค. ๋ค์ ์ํ์ ์ธ ๋ฐฉ์์ผ๋ก, JVM ์ฌ์์ ๊ตฌํ์ ์์ด ์ต๋ํ์ ์ฐฝ์กฐ์ฑ์ ํ์ฉํ๊ธฐ ์ํด, JVM ๊ตฌํ ์ธ๋ถ์ฌํญ์ด ์ฌ์ ์์ ์ ์๋์ด ์์ง ์๋ค๊ณ ๊ฐ์กฐํ๊ณ ์๋ค.<br>๊ฒฐ๊ตญ, JVM์ด ํด์ผ๋ง ํ๋ ์ผ์ ์๋ฐ ํ๋ก๊ทธ๋จ์ ์ ํํ๊ฒ ์คํํ๋ ๊ฒ๋ฟ์ด๋ค. ๊ฐ๋จํด ๋ณด์ธ๋ค, ์ฌ์ง์ด ๊ฒ์ผ๋ก ๋ณด๊ธฐ์๋ ๋จ์ํด ๋ณด์ด๊ธฐ๋ ํ์ง๋ง, ์๋ฐ ์ธ์ด์ ๋ฅ๋ ฅ๊ณผ ์ ์ฐ์ฑ์ ๊ณ ๋ คํ ๋, ์ด๊ฒ์ ์์ฒญ๋๊ฒ ํ๋ ์ผ์ด๋ค.</p><h4 id="2-๊ตฌํ-Implementation"><a href="#2-๊ตฌํ-Implementation" class="headerlink" title="2. ๊ตฌํ(Implementation)"></a>2. ๊ตฌํ(Implementation)</h4><p>JVM ์ฌ์ ๊ตฌํ์ ์ค์ ์ํํธ์จ์ด ํ๋ก๊ทธ๋จ์ ๋์ถํ๋ฉฐ, ์ด๊ฒ์ด JVM ๊ตฌํ์ด๋ค. ์ค์ ๋ก, ์คํ์์ค์ ํน์ ์
์ฒด ๊ณ ์ ์ JVM ๊ตฌํ์ด ๋ค์ ์กด์ฌํ๋ค. ์คํJDK์ ํซ์คํ(HotSpot) JVM์ ์ฐธ์กฐ ๊ตฌํ์ด๋ฉฐ, ์ธ๊ณ์์ ๊ฐ์ฅ ์ฒ ์ ํ๊ฒ ์ฆ๋ช
๋ ์ฝ๋๊ธฐ๋ฐ ์ค ํ๋๋ก ๋จ์์๋ค. ํซ์คํ์ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ JVM์ด๊ธฐ๋ ํ๋ค.</p><p>์ค๋ผํด์ ๋ผ์ด์ ์ค๊ฐ ๋ถ์ฌ๋ JDK๋ฅผ ํฌํจํด, ๋ผ์ด์ ์ค๊ฐ ๋ถ์ฌ๋๋ ๊ฑฐ์ ๋ชจ๋ JVM์ ์คํJDK์ ํซ์คํ JVM์ ํฌํฌ(Fork)๋ก ์์ฑ๋ ๊ฒ์ด๋ค. ์คํJDK๋ก๋ถํฐ ํ๊ฐ๋ฐ์ ํฌํฌ๋ฅผ ์์ฑํ๋ ๊ฐ๋ฐ์๋ค์ ์ข
์ข
์ด์์ฒด์ ๊ณ ์ ์ ์ฑ๋ฅ ๊ฐ์ ์ฌํญ๋ค์ ์ถ๊ฐํ๋ ค๋ ์๊ตฌ์ ์ํด ๋๊ธฐ ๋ถ์ฌ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก, ๊ฐ๋ฐ์๋ JRE(Java Runtime Environment) ๋ฒ๋ค์ ํ ๋ถ๋ถ์ผ๋ก JVM์ ๋ค์ด๋ก๋ํด ์ค์นํ๋ค.</p><h4 id="3-์ธ์คํด์ค-Instance"><a href="#3-์ธ์คํด์ค-Instance" class="headerlink" title="3. ์ธ์คํด์ค(Instance)"></a>3. ์ธ์คํด์ค(Instance)</h4><p>JVM ์คํ์ด ๊ตฌํ๋ผ์ ์ํํธ์จ์ด ์ ํ์ผ๋ก ๋ฆด๋ฆฌ์ฆ๋๋ฉด, ๊ฐ๋ฐ์๋ ๊ทธ๊ฒ์ ํ๋์ ํ๋ก๊ทธ๋จ์ฒ๋ผ ๋ค์ด๋ก๋ํด ์คํํ ์ ์๋ค. ์ด๋ ๊ฒ ๋ค์ด๋ก๋ ๋ ํ๋ก๊ทธ๋จ์ด ํ๋์ JVM ์ธ์คํด์ค(๋๋ ์ธ์คํด์คํ๋ ๋ฒ์ )์ด๋ค.</p><p>๊ฐ๋ฐ์๋ค์ด โJVMโ์ ๋ํด ๋งํ๋ ๊ฒฝ์ฐ, ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์๋ ์ํํธ์จ์ด ๊ฐ๋ฐ ํ๊ฒฝ ๋๋ ์ ํํ ํ๊ฒฝ์์ ์คํ๋๋ ํ๋์ JVM ์ธ์คํด์ค๋ฅผ ์ง์นญํ๋ค. โ์๋๋, ๊ทธ ์๋ฒ์ ์๋ JVM์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ผ๋ง๋ ์ฌ์ฉํ๊ณ ์์ด?โ ๋๋ โ์ํ ํธ์ถ(Circular Call)์ ํ๋ ๋ฐ๋์ ์คํ ์ค๋ฒํ๋ก์ฐ ์๋ฌ๊ฐ ๋ด JVM์ ๋ง๊ฐ๋จ๋ ธ๋ค๋, ๋ฏฟ์ ์๊ฐ ์๊ตฐ. ์ด๋ฐ ์ด๋ณด์ ์ธ ์ค์๋ฅผ ํ๋ค๋!โ๋ผ๊ณ ๋งํ ์ง๋ ๋ชจ๋ฅธ๋ค.</p><hr><h3 id="JDK์-JRE์-์ฐจ์ด"><a href="#JDK์-JRE์-์ฐจ์ด" class="headerlink" title="JDK์ JRE์ ์ฐจ์ด"></a>JDK์ JRE์ ์ฐจ์ด</h3><p>๊ฐ๋จํ๊ฒ ์ค๋ช
ํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.</p><p><strong>JRE๋?</strong><br>๋จผ์ JRE๋ Java Runtime Environment์ ์ฝ์๋ก ์๋ฐ ํ๋ก๊ทธ๋จ์ ์คํ์์ผ์ฃผ๋ ํ๊ฒฝ์ ๊ตฌ์ฑํด์ฃผ๋ ๋๊ตฌ๋ค. ์ฆ JAVA๋ฅผ ๊ฐ๋ฐํ ํ์๋ ์๋๋ฐ, ์คํ์ ์์ผ์ค์ผ ํ๋ ๊ฒฝ์ฐ์๋ ๊ผญ JRE๊ฐ ์์ด์ผ ํ๋ค. ๋ฐ๋ฉด JAVA ๊ฐ๋ฐ์ ๊ผญ ํ์ํ ๊ฒ์ด ์๋๋ฐ ๊ทธ๊ฒ์ด ๋ฐ๋ก JDK๋ค.</p><p><strong>JDK๋?</strong><br>JDK๋ Java Development Kit์ ์ฝ์๋ก ๋ง๊ทธ๋๋ก ์๋ฐ ๊ฐ๋ฐ์ ํ์ํ ํดํท์ ์ ๊ณตํ๋ ๋๊ตฌ๋ชจ์์ด๋ค. ๊ฐ๋ฐํ๋ ค๋ฉด ๋น์ฐํ ์คํ๋ ์์ผ์ผ ํ๋ฏ๋ก JDK ์์๋ JRE๊ฐ ํฌํจ๋์ด ์๋ค. </p><p>์ฌ์ฉ์ ์
์ฅ์์ ์์ฝํ์๋ฉด<br>JAVA๋ก ๋ง๋ค์ด์ง ํ๋ก๊ทธ๋จ์ ์คํ๋ง ์ํฌ ๊ฒ์ด๋ผ๋ฉด JRE๋ง ์ค์นํ๋ฉด ๋๊ณ <br>JAVA ๊ฐ๋ฐ์๋ผ๋ฉด JDK๋ฅผ ์ค์นํ๋ฉด ๋๋ค.</p>]]></content>
<categories>
<category> Java </category>
</categories>
<tags>
<tag> java8 </tag>
</tags>
</entry>
<entry>
<title>[Algorithm] ๋ฉ์ฉกํ์ฌ๊ฐํ</title>
<link href="2021/01/10/algorithm_210119/"/>
<url>2021/01/10/algorithm_210119/</url>
<content type="html"><![CDATA[<h1 id="๋ฉ์ฉกํ-์ฌ๊ฐํ-Summer-Winter-Coding-2019"><a href="#๋ฉ์ฉกํ-์ฌ๊ฐํ-Summer-Winter-Coding-2019" class="headerlink" title="๋ฉ์ฉกํ ์ฌ๊ฐํ (Summer/Winter Coding(2019))"></a>๋ฉ์ฉกํ ์ฌ๊ฐํ (Summer/Winter Coding(2019))</h1><hr><h2 id="๋ฌธ์ ์ค๋ช
"><a href="#๋ฌธ์ ์ค๋ช
" class="headerlink" title="๋ฌธ์ ์ค๋ช
"></a>๋ฌธ์ ์ค๋ช
</h2><figure class="highlight plain"><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"> ๊ฐ๋ก ๊ธธ์ด๊ฐ Wcm, ์ธ๋ก ๊ธธ์ด๊ฐ Hcm์ธ ์ง์ฌ๊ฐํ ์ข
์ด๊ฐ ์์ต๋๋ค. ์ข
์ด์๋ ๊ฐ๋ก, ์ธ๋ก ๋ฐฉํฅ๊ณผ ํํํ๊ฒ ๊ฒฉ์ ํํ๋ก ์ ์ด ๊ทธ์ด์ ธ ์์ผ๋ฉฐ, ๋ชจ๋ ๊ฒฉ์์นธ์ 1cm x 1cm ํฌ๊ธฐ์
๋๋ค. ์ด ์ข
์ด๋ฅผ ๊ฒฉ์ ์ ์ ๋ฐ๋ผ 1cm ร 1cm์ ์ ์ฌ๊ฐํ์ผ๋ก ์๋ผ ์ฌ์ฉํ ์์ ์ด์๋๋ฐ, ๋๊ตฐ๊ฐ๊ฐ ์ด ์ข
์ด๋ฅผ ๋๊ฐ์ ๊ผญ์ง์ 2๊ฐ๋ฅผ ์๋ ๋ฐฉํฅ์ผ๋ก ์๋ผ ๋์์ต๋๋ค.</span><br><span class="line"> ๊ทธ๋ฌ๋ฏ๋ก ํ์ฌ ์ง์ฌ๊ฐํ ์ข
์ด๋ ํฌ๊ธฐ๊ฐ ๊ฐ์ ์ง๊ฐ์ผ๊ฐํ 2๊ฐ๋ก ๋๋์ด์ง ์ํ์
๋๋ค. ์๋ก์ด ์ข
์ด๋ฅผ ๊ตฌํ ์ ์๋ ์ํ์ด๊ธฐ ๋๋ฌธ์, ์ด ์ข
์ด์์ ์๋ ์ข
์ด์ ๊ฐ๋ก, ์ธ๋ก ๋ฐฉํฅ๊ณผ ํํํ๊ฒ 1cm ร 1cm๋ก ์๋ผ ์ฌ์ฉํ ์ ์๋ ๋งํผ๋ง ์ฌ์ฉํ๊ธฐ๋ก ํ์์ต๋๋ค.</span><br><span class="line">๊ฐ๋ก์ ๊ธธ์ด W์ ์ธ๋ก์ ๊ธธ์ด H๊ฐ ์ฃผ์ด์ง ๋, ์ฌ์ฉํ ์ ์๋ ์ ์ฌ๊ฐํ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ solution ํจ์๋ฅผ ์์ฑํด ์ฃผ์ธ์.</span><br></pre></td></tr></table></figure><hr><h2 id="์ ํ์ฌํญ"><a href="#์ ํ์ฌํญ" class="headerlink" title="์ ํ์ฌํญ"></a>์ ํ์ฌํญ</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">W, H : 1์ต ์ดํ์ ์์ฐ์</span><br></pre></td></tr></table></figure><h2 id="์
์ถ๋ ฅ-์"><a href="#์
์ถ๋ ฅ-์" class="headerlink" title="์
์ถ๋ ฅ ์"></a>์
์ถ๋ ฅ ์</h2><table><thead><tr><th>W</th><th align="center">H</th><th align="right">result</th></tr></thead><tbody><tr><td>8</td><td align="center">12</td><td align="right">80</td></tr></tbody></table><hr><h2 id="์
์ถ๋ ฅ-์-์ค๋ช
"><a href="#์
์ถ๋ ฅ-์-์ค๋ช
" class="headerlink" title="์
์ถ๋ ฅ ์ ์ค๋ช
"></a>์
์ถ๋ ฅ ์ ์ค๋ช
</h2><figure class="highlight plain"><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">์
์ถ๋ ฅ ์ #1</span><br><span class="line">๊ฐ๋ก๊ฐ 8, ์ธ๋ก๊ฐ 12์ธ ์ง์ฌ๊ฐํ์ ๋๊ฐ์ ๋ฐฉํฅ์ผ๋ก ์๋ฅด๋ฉด ์ด 16๊ฐ ์ ์ฌ๊ฐํ์ ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค. ์๋ ์ง์ฌ๊ฐํ์์๋ 96๊ฐ์ ์ ์ฌ๊ฐํ์ ๋ง๋ค ์ ์์์ผ๋ฏ๋ก, 96 - 16 = 80 ์ ๋ฐํํฉ๋๋ค.</span><br></pre></td></tr></table></figure><p><img src="https://grepp-programmers.s3.amazonaws.com/files/production/ee895b2cd9/567420db-20f4-4064-afc3-af54c4a46016.png" alt="example"></p><hr><h2 id="๋ฌธ์ ํ์ด"><a href="#๋ฌธ์ ํ์ด" class="headerlink" title="๋ฌธ์ ํ์ด"></a>๋ฌธ์ ํ์ด</h2><p>์ฒ์์ ๋ฌธ์ ๋ฅผ ๋ดค์ ๋ ๋ฐ๋ก ๋ ์ค๋ฅธ ์๊ฐ์ด ์ต๋๊ณต์ฝ์ ๊ฐ๋
์ด์๋ค.<br>์์ ์๋ ๊ทธ๋ฆผ์ ์คํฌ๋กค์ ๋ด๋ฆฌ์ง ๋ชปํด ๋ฏธ์ฒ ๋ฐ๊ฒฌํ์ง ๋ชปํ๊ณ ํผ์์ ์๊ฐํด๋ณด์๋ค.</p><p>5๋ถ ์ ๋ ํผ์ ๊ณ ๋ฏผ์ ํ ๋์ ์ต๋๊ณต์ฝ์๋ก๋ ํ๋จํ ์ ์๋ค๊ณ ์๊ฐ์ ํ๋ค.</p><p>๋ฐ๋ผ์, ๊ตฌ๊ธ๋ง์ ํตํด [๋๊ฐ์ ์ด ์ง๋๋ ์ ์ ๊ฐ์]๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ์ ์ฐพ์๋ค.<br>[๋๊ฐ์ ์ด ์ง๋๋ ์ ์ ๊ฐ์] : <a href="https://m.blog.naver.com/orbis1020/220664563768">https://m.blog.naver.com/orbis1020/220664563768</a><br><br><br><img src="https://mblogthumb-phinf.pstatic.net/20160324_159/orbis1020_1458747302465IxfMV_PNG/%B0%DD%C0%DA.png?type=w2" alt="example"></p><p>์ด๋ฑํ๊ต 5ํ๋
์ ์ํ๋ฌธ์ ๋ผ๋ ์ ์์ ์๊ดด๊ฐ์ด ๋ค์๋ค. ๋๋. 4ํ๋
์ด๋๊น ๊ด์ฐฎ๋ค! (..๋ํ๊ต)</p><p>๋ณธ๋ก ์ผ๋ก ๋ค์ ๋์ด์์ ์ ์ ๊ฐ์๋ ์์ ๊ทธ๋ฆผ์ฒ๋ผ ๊ฒฉ์์ ์ ์ ๋ฌด์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.</p><figure class="highlight plain"><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">(1) ๊ฒฉ์์ ์ด ์กด์ฌํ ๊ฒฝ์ฐ : ๊ฐ๋ก์ ์ธ๋ก์ ์ต๋๊ณต์ฝ์๊ฐ 2์ผ ๋</span><br><span class="line">(2) ๊ฒฉ์์ ์ด ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ : ๋ ์์ ์ต๋๊ณต์ฝ์๊ฐ 1์ผ ๋</span><br><span class="line"></span><br><span class="line">(1)์ ๊ฒฝ์ฐ์๋ '(๊ฐ๋ก)+(์ธ๋ก)-1'</span><br><span class="line">(2)์ ๊ฒฝ์ฐ์๋ '(๊ฐ๋ก)+(์ธ๋ก)-(๊ฐ๋ก์ ์ธ๋ก์ ์ต๋๊ณต์ฝ์)</span><br></pre></td></tr></table></figure><p>ํ์ง๋ง ๋ ๋ค ์ฝ๋์์ ๊ฐ์ ์ต๋๊ณต์ฝ์๋ฅผ ๋นผ๋ฏ๋ก ๊ฒฐ๋ก ์ ์ผ๋ก (๊ฐ๋ก) + (์ธ๋ก) - (์ต๋๊ณต์ฝ์)์์ ์ ์ ์๋ค.</p><p>์ต๋ ๊ณต์ฝ์๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์๊ฒ ์ง๋ง Level1์์ ๋ฐฐ์ ๋ ์ ํด๋ฆฌ๋ํธ์ ๋ฒ์ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ค. (Level1_C++_gcdlcm)</p><h2 id="Code"><a href="#Code" class="headerlink" title="Code"></a>Code</h2><figure class="highlight plain"><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></pre></td><td class="code"><pre><span class="line">#include <iostream></span><br><span class="line"></span><br><span class="line">using namespace std;</span><br><span class="line"></span><br><span class="line">long long gcd(long long a, long long b)</span><br><span class="line">{</span><br><span class="line"> long c;</span><br><span class="line"></span><br><span class="line"> while (b != 0)</span><br><span class="line"> {</span><br><span class="line"> c = a % b;</span><br><span class="line"> a = b;</span><br><span class="line"> b = c;</span><br><span class="line"> }</span><br><span class="line"> return a;</span><br><span class="line">}</span><br><span class="line">long long solution(int w, int h) {</span><br><span class="line"> long long W = w;</span><br><span class="line"> long long H = h;</span><br><span class="line"></span><br><span class="line"> return (W * H) - ((W + H) - gcd(W, H));</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> Algorithm </category>
</categories>
<tags>
<tag> Algorithm </tag>
<tag> Programmers </tag>
</tags>
</entry>
</search>