<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>다크 프로그래머</title>
    <link>https://darkpgmr.tistory.com/</link>
    <description>영상처리 &amp;amp; 프로그래밍</description>
    <language>ko</language>
    <pubDate>Mon, 9 Mar 2026 01:57:03 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>다크pgmr</managingEditor>
    <image>
      <title>다크 프로그래머</title>
      <url>https://t1.daumcdn.net/cfile/tistory/2755A44A5712E5100C</url>
      <link>https://darkpgmr.tistory.com</link>
    </image>
    <item>
      <title>KITTI 데이터 사용하기 (LiDAR-카메라 변환)</title>
      <link>https://darkpgmr.tistory.com/190</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;최근에 LiDAR 데이터를 사용할 필요가 있어서, 테스트 목적으로 KITTI 데이터셋을 받아보았다. 최종 목적은 LiDAR 데이터를 카메라 이미지에 매핑해서 영상과 함께 거리값을 이용하는 것이다. 그런데, LiDAR를 처음 사용하다 보니 LiDAR 데이터 포맷도 모르겠고,&amp;nbsp; KITTI에서 제공하는 캘리브레이션 정보도 어떻게 해석해야 할지 모르겠다. 그래서, 여기 저기 검색해 보고 테스트해 보면서 나름 파악한 내용을 정리해 본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.&amp;nbsp; LiDAR 데이터 포맷&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;KITTI에서 제공하는 LiDAR 데이터는 64채널 Velodyne 센서(HDL-64E) 데이터로서 확장자가 *.bin이다. 처음에는 거리값들이 순서대로 저장되어 있나 했는데, 그건 아니고 ray의 끝 점 (x, y, z) 좌표와 반사도(reflectance) 값이 순서대로 저장되어 있다. 각각의 데이터 값은 float 타입으로 4 byte를 차지한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lidar_format.png&quot; data-origin-width=&quot;1385&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzFDhj/btsaje22ZkV/tDx1H1l4UuTBdN3z8dEMGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzFDhj/btsaje22ZkV/tDx1H1l4UuTBdN3z8dEMGK/img.png&quot; data-alt=&quot;그림1. LiDAR bin 파일 데이터 포맷&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzFDhj/btsaje22ZkV/tDx1H1l4UuTBdN3z8dEMGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzFDhj%2Fbtsaje22ZkV%2FtDx1H1l4UuTBdN3z8dEMGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1385&quot; height=&quot;116&quot; data-filename=&quot;lidar_format.png&quot; data-origin-width=&quot;1385&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1. LiDAR bin 파일 데이터 포맷&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LiDAR 좌표계 기준은 LiDAR 센서 중심이 원점 (0, 0, 0)이고 전방(front)이 x축, 왼쪽이 y축, 상단(하늘 방향)이 z축이다. 센서 장착 위치 및 좌표축 방향은 &lt;a href=&quot;https://www.cvlibs.net/datasets/kitti/setup.php&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;KITTI Sensor Setup&lt;/a&gt; 페이지에 그림으로 잘 설명되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 bin 파일을 실제 Matlab으로 불러서 가시화해 보자. Matlab 예제 코드 및 실행 결과는 다음과 같다. 샘플 데이터로는 KITTI 데이터셋 중에서 가장 용량이 적은 road dataset을 이용하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;fid&amp;nbsp;=&amp;nbsp;fopen('data_road/training/velodyne/uu_000024.bin',&amp;nbsp;'r'); &lt;br /&gt;data&amp;nbsp;=&amp;nbsp;fread(fid,'single'); &lt;br /&gt;fclose(fid); &lt;br /&gt;data&amp;nbsp;=&amp;nbsp;reshape(data,4,[])'&amp;nbsp;; &lt;br /&gt;pcshow(data(:,1:3));&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드에서 'single'은 단정밀도(single precision) 부동소수점으로 데이터를 읽는다는 의미이다. 실행하면 다음과 같이 멋진 lidar 데이터를 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lidar_visualize.png&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/barwdn/btsaEhpVqL9/Jvc8hUYIHtkQHNSAYD5j71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/barwdn/btsaEhpVqL9/Jvc8hUYIHtkQHNSAYD5j71/img.png&quot; data-alt=&quot;그림2. LiDAR 데이터 가시화&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/barwdn/btsaEhpVqL9/Jvc8hUYIHtkQHNSAYD5j71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbarwdn%2FbtsaEhpVqL9%2FJvc8hUYIHtkQHNSAYD5j71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;726&quot; height=&quot;384&quot; data-filename=&quot;lidar_visualize.png&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2. LiDAR 데이터 가시화&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;결과를 보면, 360도 전방향에 대해 데이터가 기록된 것임을 알 수 있다. 참고로, Velodyne HDL-64E의 수평시야각은 360도, 수직시야각은 26.8도이다. 개인적으로 내부 데이터를 분석해 보니 맨 위쪽 스캔라인(scane line) 정면방향부터 시작해서 반시계방향으로 회전하면서 맨 아래쪽 스캔라인까지 데이터가 순차적으로 기록되어 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그리고, 위 LiDAR 데이터에 대응되는 이미지와 비교해 보면 가시화가 제대로 되었다는 것을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;uu_000024.png&quot; data-origin-width=&quot;1242&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/94W4I/btsaiqJvcV2/Kou4nWPImLq549JjjxWbz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/94W4I/btsaiqJvcV2/Kou4nWPImLq549JjjxWbz1/img.png&quot; data-alt=&quot;그림3. data_road/training/image_2/uu_000024.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/94W4I/btsaiqJvcV2/Kou4nWPImLq549JjjxWbz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F94W4I%2FbtsaiqJvcV2%2FKou4nWPImLq549JjjxWbz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1242&quot; height=&quot;375&quot; data-filename=&quot;uu_000024.png&quot; data-origin-width=&quot;1242&quot; data-origin-height=&quot;375&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림3. data_road/training/image_2/uu_000024.png&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2.&amp;nbsp; LiDAR - 카메라 매핑&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LiDAR 데이터를 카메라 이미지에 매핑하기 위해서는 둘 사이의 캘리브레이션 관계를 이해해야 한다. KITTI 데이터셋에는 센서간 캘리브레이션 파일이 같이 제공되는데, 예를 들어, 'data_road/training/calib/uu_000024.txt' 파일의 내용은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;P0:&amp;nbsp;7.215377000000e+02&amp;nbsp;0.000000000000e+00&amp;nbsp;6.095593000000e+02&amp;nbsp;0.000000000000e+00&amp;nbsp;0.000000000000e+00&amp;nbsp;7.215377000000e+02&amp;nbsp;1.728540000000e+02&amp;nbsp;0.000000000000e+00&amp;nbsp;0.000000000000e+00&amp;nbsp;0.000000000000e+00&amp;nbsp;1.000000000000e+00&amp;nbsp;0.000000000000e+00&lt;br /&gt;P1:&amp;nbsp;7.215377000000e+02&amp;nbsp;0.000000000000e+00&amp;nbsp;6.095593000000e+02&amp;nbsp;-3.875744000000e+02&amp;nbsp;0.000000000000e+00&amp;nbsp;7.215377000000e+02&amp;nbsp;1.728540000000e+02&amp;nbsp;0.000000000000e+00&amp;nbsp;0.000000000000e+00&amp;nbsp;0.000000000000e+00&amp;nbsp;1.000000000000e+00&amp;nbsp;0.000000000000e+00&lt;br /&gt;P2:&amp;nbsp;7.215377000000e+02&amp;nbsp;0.000000000000e+00&amp;nbsp;6.095593000000e+02&amp;nbsp;4.485728000000e+01&amp;nbsp;0.000000000000e+00&amp;nbsp;7.215377000000e+02&amp;nbsp;1.728540000000e+02&amp;nbsp;2.163791000000e-01&amp;nbsp;0.000000000000e+00&amp;nbsp;0.000000000000e+00&amp;nbsp;1.000000000000e+00&amp;nbsp;2.745884000000e-03&lt;br /&gt;P3:&amp;nbsp;7.215377000000e+02&amp;nbsp;0.000000000000e+00&amp;nbsp;6.095593000000e+02&amp;nbsp;-3.395242000000e+02&amp;nbsp;0.000000000000e+00&amp;nbsp;7.215377000000e+02&amp;nbsp;1.728540000000e+02&amp;nbsp;2.199936000000e+00&amp;nbsp;0.000000000000e+00&amp;nbsp;0.000000000000e+00&amp;nbsp;1.000000000000e+00&amp;nbsp;2.729905000000e-03&lt;br /&gt;R0_rect:&amp;nbsp;9.999239000000e-01&amp;nbsp;9.837760000000e-03&amp;nbsp;-7.445048000000e-03&amp;nbsp;-9.869795000000e-03&amp;nbsp;9.999421000000e-01&amp;nbsp;-4.278459000000e-03&amp;nbsp;7.402527000000e-03&amp;nbsp;4.351614000000e-03&amp;nbsp;9.999631000000e-01&lt;br /&gt;Tr_velo_to_cam:&amp;nbsp;7.533745000000e-03&amp;nbsp;-9.999714000000e-01&amp;nbsp;-6.166020000000e-04&amp;nbsp;-4.069766000000e-03&amp;nbsp;1.480249000000e-02&amp;nbsp;7.280733000000e-04&amp;nbsp;-9.998902000000e-01&amp;nbsp;-7.631618000000e-02&amp;nbsp;9.998621000000e-01&amp;nbsp;7.523790000000e-03&amp;nbsp;1.480755000000e-02&amp;nbsp;-2.717806000000e-01&lt;br /&gt;Tr_imu_to_velo:&amp;nbsp;9.999976000000e-01&amp;nbsp;7.553071000000e-04&amp;nbsp;-2.035826000000e-03&amp;nbsp;-8.086759000000e-01&amp;nbsp;-7.854027000000e-04&amp;nbsp;9.998898000000e-01&amp;nbsp;-1.482298000000e-02&amp;nbsp;3.195559000000e-01&amp;nbsp;2.024406000000e-03&amp;nbsp;1.482454000000e-02&amp;nbsp;9.998881000000e-01&amp;nbsp;-7.997231000000e-01&lt;br /&gt;Tr_cam_to_road:&amp;nbsp;9.999069316651e-01&amp;nbsp;1.126439637474e-02&amp;nbsp;-7.700846908379e-03&amp;nbsp;-1.756802998348e-02&amp;nbsp;-1.132554323887e-02&amp;nbsp;9.999042860338e-01&amp;nbsp;-7.943238435040e-03&amp;nbsp;-1.626967196797e+00&amp;nbsp;7.610633921140e-03&amp;nbsp;8.029712858942e-03&amp;nbsp;9.999387540998e-01&amp;nbsp;2.839303758772e-01&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내용을 보면 4개의 projection 행렬(P0, P1, P2, P3)과 1개의 rectification 행렬(R0_rect), 그리고 3개의 Tr 행렬이 제공된다.&amp;nbsp; &lt;a href=&quot;https://www.cvlibs.net/datasets/kitti/setup.php&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;KITTI Sensor Setup&lt;/a&gt;에 보면 Cam0, Cam1, Cam2, Cam3 총 4대의 카메라가 일렬로 나란히 배치되어 있는데, 이들 카메라 의 projection 행렬이 각각 P0, P1, P2, P3이다. 이들 중 가장 기본이 되는 카메라는 Cam2이며, 샘플로 다운로드 받은 road dataset에서도 Cam2를 사용하기 때문에 여기서는 P2만 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;☞참고로, 카메라의 projection 행렬은 3D 월드좌표를 이미지 픽셀 좌표로 변환해주는 행렬을 의미한다. 3D 월드좌표 (X, Y, Z)가 있을 때, [R|t]를 곱해서 카메라좌표계로 변환한 후 이미지 평면에 투영하면 픽셀좌표 (x, y)가 얻어지는데, 이를 행렬 연산으로 표현하면 s[x y 1] = K[R|t][X Y Z 1]가 된다. 여기서, 3 x 4 행렬 P = K[R|t]를 카메라의 projection matrix라 부른다 (K는 3 x 3 camera matrix, R은 3 x 3 rotation matrix, t는 3 x 1 translation vector).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캘리브레이션 파일 내용에 보면 P2에 대해 &quot;P2: p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12&quot;와 같이 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;총 12개의 실수값이 저장되어 있는데,&lt;span&gt; P&lt;/span&gt;&lt;/span&gt;2 = [p1 p2 p3 p4; p5 p6 p7 p8; p9 p10 p11 p12]와 같은 식으로 3 x 4 projection 행렬을 만들면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LiDAR 데이터를 카메라 이미지에 매핑하기 위해서는 1) LiDAR 좌표를 기준 좌표계로 변환한 후, 2) rectification을 수행, 3) 카메라 projection 행렬(여기서는 P2)을 이용해서 이미지에 투영하는 과정을 거친다. LiDAR 좌표가 (X, Y, Z)라면 Cam2로의 매핑 변환식은 다음과 같다 (만일, Cam1으로의 매핑이라면 P2만 P1으로 바꾸면 된다).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;s(x, y, 1) = P2 * R0_rect * Tr_velo_to_cam * (X, Y, Z, 1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, Tr_velo_to_cam은 LiDAR 좌표를 기준 좌표계(reference coordinate)로 변환해주는 3 x 4 변환행렬로서, LiDAR 센서와 기준 좌표계 카메라와의 [R|t] 관계를 나타낸다. &lt;a href=&quot;https://www.cvlibs.net/datasets/kitti/setup.php&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;KITTI Sensor Setup&lt;/a&gt; 그림에 보면, Cam0가 기준 좌표계 카메라인 것으로 보인다. 다음으로, R0_rect를 곱해주는 rectification 과정이 조금 이해가 어려울 수 있다. R0_rect는 Cam0를 최종적인 월드평면으로 회전시켜주는 3 x 3 회전변환 행렬이다. KITTI Sensor Setup 그림에 보면 카메라 4대가 스테레오 카메라처럼 일렬로 나란히 배치된 것을 볼 수 있다. 스테레오 연산을 위해서는 이 4대의 카메라들이 모두 동일한 월드평면에 align이 되어야 하는데, Cam0를 이 월드평면에 align시켜주는 행렬이 R0_rect이다. R0_rect까지 곱해지고 나면 최종적인 월드좌표가 나오며 이 월드좌표를 각 카메라에 투영하면 카메라의 이미지 좌표가 얻어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;☞ 위 식에서 R0_rect * Tr_velo_to_cam * (X, Y, Z, 1)까지 계산하면 3 x 1 벡터(변환된 3차원 좌표)가 얻어진다. 여기에 3 x 4 행렬인 P2를 적용하기 위해서는 좌표의 끝에 1을 덧붙인 homogeneous 좌표로 변환한 후에 P2를 곱해야 한다. 또는 아래 Matlab 코드처럼 R0_rect를 4 x 4 행렬로 확장해도 동일한 효과를 얻는다 (확장된 원소값을 모두 0으로 설정하고, 마지막 4행 4열 원소만 1로 설정)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Matlab을 이용하여 KITTI 캘리브레이션 파일을 읽고, parsing하며, 이미지에 매핑하는 코드를 아래와 같이 작성해 보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;clear&amp;nbsp;all;&amp;nbsp;close&amp;nbsp;all; &lt;br /&gt;&lt;br /&gt;%&amp;nbsp;read&amp;nbsp;calibration&amp;nbsp;file&amp;nbsp;and&amp;nbsp;parse&amp;nbsp;the&amp;nbsp;matrices &lt;br /&gt;fid&amp;nbsp;=&amp;nbsp;fopen('data_road/training/calib/uu_000024.txt'); &lt;br /&gt;P0&amp;nbsp;=&amp;nbsp;sscanf(fgetl(fid),&amp;nbsp;'P0:&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f'); &lt;br /&gt;P1&amp;nbsp;=&amp;nbsp;sscanf(fgetl(fid),&amp;nbsp;'P1:&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f'); &lt;br /&gt;P2&amp;nbsp;=&amp;nbsp;sscanf(fgetl(fid),&amp;nbsp;'P2:&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f'); &lt;br /&gt;P3&amp;nbsp;=&amp;nbsp;sscanf(fgetl(fid),&amp;nbsp;'P3:&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f'); &lt;br /&gt;R0_rect&amp;nbsp;=&amp;nbsp;sscanf(fgetl(fid),&amp;nbsp;'R0_rect:&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f'); &lt;br /&gt;Tr_velo_to_cam&amp;nbsp;=&amp;nbsp;sscanf(fgetl(fid),&amp;nbsp;'Tr_velo_to_cam:&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f'); &lt;br /&gt;Tr_imu_to_velo&amp;nbsp;=&amp;nbsp;sscanf(fgetl(fid),&amp;nbsp;'Tr_imu_to_velo:&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f'); &lt;br /&gt;Tr_cam_to_road&amp;nbsp;=&amp;nbsp;sscanf(fgetl(fid),&amp;nbsp;'Tr_cam_to_road:&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f&amp;nbsp;%f'); &lt;br /&gt;fclose(fid); &lt;br /&gt;&lt;br /&gt;Tr&amp;nbsp;=&amp;nbsp;[reshape(Tr_velo_to_cam,&amp;nbsp;4,&amp;nbsp;[])';&amp;nbsp;0&amp;nbsp;0&amp;nbsp;0&amp;nbsp;1]; &lt;br /&gt;R0&amp;nbsp;=&amp;nbsp;eye(4); &lt;br /&gt;R0(1:3,1:3)&amp;nbsp;=&amp;nbsp;reshape(R0_rect,&amp;nbsp;3,&amp;nbsp;[])'; &lt;br /&gt;P&amp;nbsp;=&amp;nbsp;reshape(P2,&amp;nbsp;4,&amp;nbsp;[])'; &lt;br /&gt;&lt;br /&gt;%&amp;nbsp;read&amp;nbsp;image &lt;br /&gt;img&amp;nbsp;=&amp;nbsp;imread('data_road/training/image_2/uu_000024.png'); &lt;br /&gt;imshow(img); &lt;br /&gt;&lt;br /&gt;%&amp;nbsp;read&amp;nbsp;LiDAR&amp;nbsp;data &lt;br /&gt;fid&amp;nbsp;=&amp;nbsp;fopen('data_road/training/velodyne/uu_000024.bin',&amp;nbsp;'r'); &lt;br /&gt;data&amp;nbsp;=&amp;nbsp;fread(fid,'single'); &lt;br /&gt;fclose(fid); &lt;br /&gt;data&amp;nbsp;=&amp;nbsp;reshape(data,4,[])'; &lt;br /&gt;figure;pcshow(data(:,1:3)); &lt;br /&gt;&lt;br /&gt;%&amp;nbsp;mapping&amp;nbsp;to&amp;nbsp;image &lt;br /&gt;XYZ1 = [data(:,1:3)'; ones(1,size(data,1))]; &lt;br /&gt;xy1&amp;nbsp;=&amp;nbsp;P*R0*Tr*XYZ1; &lt;br /&gt;s = xy1(3,:); &lt;br /&gt;x = xy1(1,:)./s; &lt;br /&gt;y = xy1(2,:)./s; &lt;br /&gt;figure;&amp;nbsp;plot(x,y,'.'); &lt;br /&gt;ax&amp;nbsp;=&amp;nbsp;gca; &lt;br /&gt;ax.YDir&amp;nbsp;=&amp;nbsp;'reverse'; &lt;br /&gt;img_h = size(img, 1);&lt;br /&gt;img_w&amp;nbsp;=&amp;nbsp;size(img,&amp;nbsp;2);&lt;br /&gt;xlim([1&amp;nbsp;img_w]); &lt;br /&gt;ylim([1&amp;nbsp;img_h]);&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행해 보면 다음과 같이 LiDAR 데이터를 이미지 평면에 투영한 결과를 얻을 수 있는데, 뭔가 조금 이상하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lrf2img_bad.png&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ECZNd/btsamYdUg5B/aQSuvR3KMDTvLDIOBq91lK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ECZNd/btsamYdUg5B/aQSuvR3KMDTvLDIOBq91lK/img.png&quot; data-alt=&quot;그림4. LiDAR 데이터의 이미지 투영 1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ECZNd/btsamYdUg5B/aQSuvR3KMDTvLDIOBq91lK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FECZNd%2FbtsamYdUg5B%2FaQSuvR3KMDTvLDIOBq91lK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;950&quot; height=&quot;263&quot; data-filename=&quot;lrf2img_bad.png&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림4. LiDAR 데이터의 이미지 투영 1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원인이 무엇일까 생각해 보니, 후방에 있는 LiDAR 데이터가 이미지 평면 뒷편에서 투영되었기 때문이다. 이 경우는 depth 성분인 s가 음수인 경우이기 때문에, s &amp;gt; 0인 경우로 투영을 한정하면 문제를 해결할 수 있다. 수정된 코드 및 결과는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;%&amp;nbsp;mapping&amp;nbsp;to&amp;nbsp;image &lt;br /&gt;XYZ1 = [data(:,1:3)'; ones(1,size(data,1))]; &lt;br /&gt;xy1&amp;nbsp;=&amp;nbsp;P*R0*Tr*XYZ1; &lt;br /&gt;s&amp;nbsp;=&amp;nbsp;xy1(3,:); &lt;br /&gt;x&amp;nbsp;=&amp;nbsp;xy1(1,:)./s; &lt;br /&gt;y&amp;nbsp;=&amp;nbsp;xy1(2,:)./s; &lt;br /&gt;k&amp;nbsp;=&amp;nbsp;find(s&amp;gt;0); &lt;br /&gt;figure;&amp;nbsp;plot(x(k),y(k),'.'); &lt;br /&gt;ax&amp;nbsp;=&amp;nbsp;gca; &lt;br /&gt;ax.YDir&amp;nbsp;=&amp;nbsp;'reverse';&lt;br /&gt;img_h = size(img, 1);&lt;br /&gt;img_w = size(img, 2);&lt;br /&gt;xlim([1&amp;nbsp;img_w]); &lt;br /&gt;ylim([1&amp;nbsp;img_h]);&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lrf2img_good.png&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oMfky/btsaiaNieKy/tqtIK59jR5dunPmPVyr5vK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oMfky/btsaiaNieKy/tqtIK59jR5dunPmPVyr5vK/img.png&quot; data-alt=&quot;그림5. LiDAR 데이터의 이미지 투영 2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oMfky/btsaiaNieKy/tqtIK59jR5dunPmPVyr5vK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoMfky%2FbtsaiaNieKy%2FtqtIK59jR5dunPmPVyr5vK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;950&quot; height=&quot;263&quot; data-filename=&quot;lrf2img_good.png&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림5. LiDAR 데이터의 이미지 투영 2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 정상적으로 매핑된 것을 볼 수 있다. 마지막으로 실제 이미지에 LiDAR를 투영해 보면 아래 그림과 같은 결과를 얻을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;%&amp;nbsp;mapping&amp;nbsp;to&amp;nbsp;image &lt;br /&gt;img_mapped&amp;nbsp;=&amp;nbsp;img; &lt;br /&gt;img_h&amp;nbsp;=&amp;nbsp;size(img,&amp;nbsp;1); &lt;br /&gt;img_w&amp;nbsp;=&amp;nbsp;size(img,&amp;nbsp;2); &lt;br /&gt;XYZ1&amp;nbsp;=&amp;nbsp;[data(:,1:3)';&amp;nbsp;ones(1,size(data,1))]; &lt;br /&gt;xy1&amp;nbsp;=&amp;nbsp;P*R0*Tr*XYZ1; &lt;br /&gt;s = xy1(3,:); &lt;br /&gt;x = xy1(1,:)./s; &lt;br /&gt;y = xy1(2,:)./s; &lt;br /&gt;for i=1:length(s) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ix&amp;nbsp;=&amp;nbsp;int32(x(i)&amp;nbsp;+&amp;nbsp;0.5); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iy&amp;nbsp;=&amp;nbsp;int32(y(i)&amp;nbsp;+&amp;nbsp;0.5); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (s(i)&amp;lt;=0 || ix&amp;lt;=0 || ix&amp;gt;img_w || iy&amp;lt;=0 || iy&amp;gt;img_h) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;img_mapped(iy,&amp;nbsp;ix,&amp;nbsp;:)&amp;nbsp;=&amp;nbsp;[0&amp;nbsp;255&amp;nbsp;0]; &lt;br /&gt;end &lt;br /&gt;figure;&amp;nbsp;imshow(img_mapped);&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lrf2img_final.png&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ce6zM/btsaipw8RKC/hFgu9rpimglB84FbFdVLxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ce6zM/btsaipw8RKC/hFgu9rpimglB84FbFdVLxK/img.png&quot; data-alt=&quot;그림6. LiDAR 데이터의 이미지 투영 (최종 결과)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ce6zM/btsaipw8RKC/hFgu9rpimglB84FbFdVLxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCe6zM%2Fbtsaipw8RKC%2FhFgu9rpimglB84FbFdVLxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;950&quot; height=&quot;287&quot; data-filename=&quot;lrf2img_final.png&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림6. LiDAR 데이터의 이미지 투영 (최종 결과)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;☞ 처음에는 LiDAR - 카메라간 매핑 관계만 있으면, 이미지의 모든 픽셀에 대해 depth를 구할 수 있을 것이라 생각했다. 그러나, 그림 6에서 보는 것처럼 LiDAR 데이터는 sparse하기 때문에 LiDAR가 매핑되는 픽셀에 대해서만 depth를 구할 수 있다. 그외 픽셀에 대해서는 보간(interpolation) 등의 방법을 사용할 수 있을 것이다. 그러나, 이미지 윗부분처럼 매핑된 LiDAR 데이터가 아에 없는 영역에 대해서는 depth를 전혀 구할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;by 다크 프로그래머&lt;/p&gt;</description>
      <category>영상처리</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/190</guid>
      <comments>https://darkpgmr.tistory.com/190#entry190comment</comments>
      <pubDate>Sun, 16 Apr 2023 12:47:13 +0900</pubDate>
    </item>
    <item>
      <title>수학 과외</title>
      <link>https://darkpgmr.tistory.com/189</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;큰 아이의 수학 점수가 바닥을 긴다는 아내의 첩보를 접하고 심각한 고민에 빠졌다. 그 동안은 (가만 두면 지가 알아서 다 할거라는) 내 말만 믿고 학원도 보내지 않았는데, 이제 어떡하면 좋냐고 그런다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아내가 아이를 살살 꼬셔서 서점에서 수학 문제집 하나는 사다가 놓았지만, 몇 주째 책상 위에서 먼지만 날리고 있다. 그렇다고 애를 억지로 앉혀놓고 수학을 가르치는 것은 섶을 지고 불에 뛰어드는 격이라 해서는 안된다. 아내의 무언의 눈빛도 있고 왠지 모를 압박감에 며칠 동안 좌뇌와 우뇌를 굴린 결과 한 가지 방안을 생각해 내었다. 아이와 함께 아이의 친한 친구를 불러서 둘을 같이 가르치는 것이다. 아이에게 물어보니 그건 아이도 좋다고 한다. 아이 친구도 OK를 해서 그쪽 부모님께도 확인을 받은 후 수학과외를 시작하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;교재는 한달 전쯤 아내가 사다 놓았던 그 문제집이다. 당장 이번 주부터 수업이라 빼도 박도 못하고 문제집을 이리 뒤척 저리 뒤척이고 있는데, 갑자기 후회가 물밀듯이 몰려든다. 이제 물 마시러 가기도 귀찮은 나이인데 내가 이걸 왜 한다고 했을까 싶고 애들을 어떻게 지도해야 할지 난감하기만 하다. 옛날에 대학 다닐 때 학생들을 가르치긴 했었지만 수십년도 더 지난 일이다. 그래도 이왕 하기로 한 거 마음을 다잡고 계획표도 짜고 수업 전략도 짜 본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 수업계획표에서는 수업의 목표와 수업 중 같이 지켜야할 사항을 정해 보았다. (첫날 아이들에게 프린트로 나눠줌)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; XX 수학방&lt;br /&gt;&lt;br /&gt;- 목표: 수학이 재밌어지기&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- 방훈&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아는~척 않기&lt;/li&gt;
&lt;li&gt;모르는~척 않기&lt;/li&gt;
&lt;li&gt;공부하는~척 하기&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방훈은 매 수업 시작할 때 아이들에게 선창하게 한다. 그리고, 아이들에게 말하지 않은 나만의 방훈이 있는데, 그건 '평가하지 않기'이다. 참고로 아이들은 중학생이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수업 진행은 먼저 지난 시간에 배운 주요 개념을 확인(되새김)한 후 숙제 확인을 한다. 숙제 확인은 각자 숙제로 풀어온 문제들 중에서 틀렸거나 잘 모르겠다고 체크해 온 문제들을 서로 비교하는 것이다. 그래서, 차이가 나는 경우에는 잘 풀어온 친구보고 앞에 나가서 본인이 어떻게 풀었는지 설명해 달라고 한다. 앞에 미니칠판을 하나 놓고 수업을 하는데, 문제 풀이를 알려달라고 하면 자꾸 나에게 설명하려고 한다. 그러면, '아니야, 친구에서 설명해 주는거야.' 하고 정정해 준다. 그리고, 문제를 체크해 온 아이에게는 친구의 설명을 잘 들어보라고 한다. 둘다 모르겠다고 체크한 문제에 대해서는 내가 설명해 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숙제 맞춰보고 서로 설명해 주고, 또 오늘 배울 개념 설명하고 한 두 문제 풀어주다 보면 한 시간이 어떻게 가는지 모르게 금방 간다. 수업은 일주일에 딱 1시간만 하기로 해서 수업하다가 1시간이 되면 무조건 멈추고 나머지 문제들은 모두 숙제로 내준다 (ㅋㅋ). 사실 내가 혼자 열심히 설명하고 문제를 풀어준다고 해서 애들에게 얼마나 도움이 되겠는가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 수업을 시작한지는 한 달쯤 지났다. 한 달쯤 지켜보니 두 아이의 특성이 확연히 다름이 느껴진다. 한 아이는 학원을 많이 다녔고 지금도 다니고 있다. 그래서인지 대부분의 문제를 이미 알고 있고 문제 풀이도 제법 잘 해낸다. 하지만 개념을 설명해 보라든가 친구에게 문제풀이를 설명해 주라고 하면 당황해하고 어려워한다. 반면에 한 아이는 학원을 다닌 적이 없고 문제를 효과적으로 푸는 방법도 잘 모른다.&amp;nbsp; 하지만 개념을 설명하거나 본인이 이해한 문제에 대해서는 설명을 잘 해낸다. 두 아이 모두 내게는 숙제이다. 첫 번째 아이는 익숙함 속에서 의문을 갖도록 하는 게 숙제이다. 그리고 두 번째 아이에게는 개념만으로도 수학 문제 풀이가 가능하며 그 과정이 수학임을 느끼게 해 주고 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수업을 하면서 애들에게 해 준 말이 있다. '문제 많이 풀고 답 맞추는 것이 수학공부가 아니다. 문제를 풀기 위해서, 그리고 문제를 이해하기 위해서 생각하고 고민하는 시간이 진정한 수학 공부다'.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수업시간에 한 두 문제 더 푸는 것보다도 이런 것들을 애들에게 조금씩 느끼게 해 주고 싶다. 그러려면 나 자신부터 조급함을 버리고 여유를 가져야겠다는 생각을 해 본다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;다크 프로그래머&lt;/p&gt;</description>
      <category>수학 이야기</category>
      <category>수학</category>
      <category>수학공부</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/189</guid>
      <comments>https://darkpgmr.tistory.com/189#entry189comment</comments>
      <pubDate>Wed, 22 Jun 2022 17:51:51 +0900</pubDate>
    </item>
    <item>
      <title>내 어깨 위 고양이, 밥</title>
      <link>https://darkpgmr.tistory.com/188</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;아침에 일어나서 어제 보다 만 영화를 다시 봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'내 어깨 위 고양이, 밥'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영화를 보고 나서 문득 내가 본 영화들을 블로그에 정리해 놓으면 좋겠다는 생각이 든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저녁에 특별히 할일 없이 한 두편 영화를 본 게 거진 10년이 된 것 같다. SF, 폭력, 로맨스, 일상, 스포츠, 애니메이션, 코미디, 드라마 가리지 않고 다 본다. 그 중에 어떤 것은 보고 잊어버리고 또 어떤 것은 여운이 남아서 굳이 다른 사람들이 쓴 감상평들을 뒤적여 본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보다 보니 안목이 생겨서인지 아니면 마음에도 나이가 들어서인지 가슴에 와 닿는 영화들이 많지는 않다. 갈수록 그렇다. 그래도 가끔 기억에 남는 영화들을 여기에 적어본다. 보면서 나도 모르게 빨려들고 보고 나서도 여운이 남는 영화들. 그냥 스스로 기록하는 의미로도 좋고, 누군가가 보고 공감해도 좋겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그녀의 취미생활 (2023, 한국)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;독립영화. 제작사나 외부 투자 자금 등의 자본이나 지원을 받지 않고 만드는 영화, 즉 독립 자본으로 만들고 싶은 내용을 만든 영화를 말한다고 한다. 섬세한 연출과 깊이있는 내용. 재미있게 보았다. 영화를 보며 ..., 시골 마을에서 젊은 여인이 자신을 지키며 혼자 살아간다는 것은 불가능하지 않을까 하는 생각이 들었다. 집단 사회의 암묵적인 묵인 속에서 공동체의 일원으로 같이 일을 하고 밥을 먹고, 일상을 살고 살아가야 하는 모습이 대비를 일으킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;로기완 (2024, 한국)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;깊이가 있는 영화. 어머니의 죽음을 뒤로하고 벨기에에 난민신청을 한 탈북자 청년 기완. 말도 통하지 않는 낯선 땅 벨기에에서 겪고 살아내야 하는 과정이 그려진다. 영화의 마지막, 기완은 내가 원한 것은 이 땅에서 살 권리가 아니라 이 땅을 떠날 권리였다고 말한다. 영화속 내용과 연기가 영화로만은 느껴지지 않는 완성도가 높은 수작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;더 써클 (2017, 미국)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;두 번째로 본 영화. 인공지능이 일상화된 오늘날에 다시 보는 이 영화는 섬뜩함이 더해진다. 영화 외적으로 영화속 써클의 모든 기술발표 구성이 스티브 잡스의 발표에 견줄만큼 대단하다. 이 영화의 내용을 구성한 사람이 누군지 궁금해진다. 엄청난 천재가 작품을 만들다가 외부의 압력을 고려해 적당한 선에서 마무리한 느낌? 결말이 극적이진 않지만 영화에서 전달하고자 했던 것은 전달되었다고 생각된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;오토라는 남자 (2022, 미국)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;삶의 깊이가 있는 영화. 톰 행크스 주연. 그의 상황과 선택이 그대로 이해된다. 오랫동안 기억에 남을 영화&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사라진 그녀 (Lost in the Stars, 2022, 중국)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;결혼기념일 여행 중에 사라진 아내와 자신이 아내라며 나타난 낯선 여자. 영화의 첫 장면은 도시의 불빛을 배경으로 한 거미줄 위의 거미로 시작한다.&amp;nbsp; 영화의 첫 3 ~ 4초를 보면 영화의 깊이가 전달되고, 이 영화 괜찮겠네 하는 느낌이 온다. 역시나 기대를 저버리지 않은 영화. 마지막 자막과 음악까지 여운이 남아서 듣게 되었다. 실화를 바탕으로 한 영화..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이미테이션 게임 (2013, 미국)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;너무나 유명한 영화. 1938년 2차 세계 대전의 소용돌이 속에서 독일의 에니그마 암호시스템을 해독하기 위해 투입되었던 앨런 튜링과 몇몇 사람들의 실화를 바탕으로 한 영화. 그들의 암호 해독 성공으로 연합국 측 승리의 결정적 기여를 했지만, 그들 개인이 감당해야 했던 짐의 무게와 국가 시스템의 한 부품처럼 사용된 개인의 씁쓸함이 그려진다. 천재들은 단명한다는 것이 여기서도 적용된다. 7~8년 전쯤엔가 한번 보고 어제 다시 봤던 영화인데, 2번째 봤을 때는 완전히 새로운 영화로 느꼈졌다. 뭔가를 조금 알고 보는 것과 그렇지 않은 것은 정말 다르다. 스토리 뿐만 영화 자체로도 완성도가 높은 수작.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하이스코어 걸 (2019, 일본 애니)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;독특한 일본 애니. 처음부터 끝까지 일본의 격투 게임 얘기밖에 없고 쉴세 없이 떠들어 대는 대사에 귀가 아프지만 전체적으로 깔린 순수한 감성이 좋아서 끝까지 보고 말았다. 예전에 오락실에 자주 갔던 사람들에게는 추억의 드라마가 될 수도 있겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다음 소희 (2023, 한국)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2017년 있었던 콜센터 실습생 사건을 배경으로 한 영화. 우리에게 현재와 '다음'에 대해 생각하게 하는 영화.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사랑은 비가 갠 뒤처럼 (2018, 일본)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;간간히 웃으면서 재미있게 본 영화. 아킬레스건을 다쳐 달리기를 그만둔 기록 보유자 아르바이트생. 나름 꿈은 있었지만 스스로 별볼일 없다고 생각하는 중년의 레스토랑 점주. 그리고 주변 사람들의 이야기. 영화의 디테일이 잘 살아있고 표정이나 상황이 웃음을 터트리게 한다. 가볍게 볼 수 있는 좋은 영화.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;재키의 링 (2021, 미국)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;영화를 보고 나서 여운이 가시질 않지만 어떻게 설명해야 할진 모르겠다. 영화의 모든 장면이 인상적이고 깊이가 있다. 패배로 은퇴한 종합격투기 선수로 묻혀사는 그녀, 문득 삶에 들어온 어린 아들, 어머니, 트레이너, 영화에 나오는 인물 하나 하나가 살아있고 나름의 이야기를 갖는다. 마음을 움직이게 하는 영화. 종합격투기 경기가 이렇게 긴장되는지 몰랐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마더/안드로이드 (2021, 미국)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;S/F 스럴리 영화. 반란을 일으킨 안드로이드가 장악한 세상에서 안전한 곳을 찾아 떠나는 만삭의 젊은 커플의 상황을 그린 영화. 간만에 초집중하면서 영화를 봤다. 개인적으로는 긴장감과 몰입도 최고이다. 커플이 주고받는 대사들도 영화스럽지 않아서 더 좋았다. 영화에 대한 평점은 거의 최악이지만, 나에겐 잘 만들어진 영화이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;반쪽의 이야기 (The Half of It, 2020, 미국)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;청춘 영화, 성장 영화. 순수하고 보고 있으면 마음이 따뜻하진다. 가볍게 볼 수 있는 좋은 영화.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스위치 (2023, 한국)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;패밀리맨의 리메이크작. 모든 것을 이루었지만 행복하지는 않은 탑배우. 크리스마스 이브날 잠이 들었다가 과거의 자신으로 깨어나면서 자신이 놓쳐버린 선택과 삶을 1년 동안 살게 된다. 영화 패밀리맨도 봤지만 개인적으론 스위치가 더 재미있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;소공녀 (2018, 한국)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;독특한 영화. 위스키 한잔, 담배 한갑, 그리고 자신과 사람에 대한 한결같은 태도. 올라버린 물가앞에 잠잘 곳도 마땅찮은 그녀가 절대 포기하지 않는 것들이다. 나름 멋있다. 그나저나 물가가 너무 올랐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;죽지않는 인간들의 밤 (2020, 한국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신혼인 부부. 남편이 외계인이고, 서로가 서로를 없애기 위해 노력한다. 하지만 겉으로는 아무일 없는 척 이야기가 진행된다. B급 감성으로 가볍게 보기 좋다. 재미있다. ㅋㅋ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;브로커 (2022, 한국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;괜찮은 영화. 베이비박스. 인간에 대한 따뜻함이 묻어있는 영화가 좋다. 태어나줘서 고마워라는 말에 감정이 움직인다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;가버나움 (2018, 레바논)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘은 상업영화보다 이런 영화가 더 좋다. 내용에 깊이가 있으면서도 몰입감이 높은 수작이다. 찾아보니 '가버나움'은 신도 버린 마을, 사람이라는 뜻이라 한다. 하지만 영화는 어둡지 않고 따뜻함을 바닥에 깔고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;가재가 노래하는 곳 (2022, 미국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 아름다운 영화를 극장에서 보지 못한게 아쉽다. 요즘에도 이런 좋은 영화가 나오는구나 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;더 스위머스 (2022, 영국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시리아 난민, 수영, 실화 바탕. 가볍게 볼 수 있는 영화이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;랜드 (land, 2021, 미국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;막 재미있고 그런 영화는 아니다. 잔잔한데, 보다보면 괜찮다. 깊이가 있는 영화이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;코다 (2021, 미국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;청각 장애인 가족, 음악, 한 소녀, 통역, 가족과 자신 사이에서의 선택. 잠시 청각장애인 입장에서 보여준 세상. 음악 영화는 항상 볼만하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;내 어깨 위 고양이, 밥 (2016, 영국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;극적이지 않고 잔잔하지만 지루하지 않고 재미있다. 잘 만들어진 영화이다. 거리 공연, 처음 갖게 된 집, 옆집 아가씨, 고양이 밥을 훔쳐먹는 생쥐, 약물 중독과 치료사, 때로는 지나쳐 가고 때로는 도움을 주는 사람들. 마지막에 아버지를 만나 나누는 대화에서 나도 모르게 눈물이 난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;베이비 드라이버 (2017, 영국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강렬한 리듬, 음악과 영상이 어우러진 비트가 환상적이다. 내용도 재미있고 잘 만들어진 영화이다. 영국 영화.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;겨우, 서른 (2020, 중국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;총 43화로 이루어진 중국 드라마이다. 길지만 전혀 지루하지 않고 보고 나서도 여운이 길게 남는다. 절친 사이인 30대의 세 여인을 통해 도시에서의 생활과 그 의미, 결혼 생활과 개인의 꿈, 현재와 미래, 타인과 나에 대해 돌아보게 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 나라의 영화나 드라마를 보면서 그들의 문화, 생각을 보는 것도 나름의 재미 중 하나이다. 이 드라마를 보고 중국에 대한 이미지가 바뀌었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;증인 (2019, 한국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아내와 함께 감명깊게 본 영화이다. 극장에서 봤다. 완성도가 높고 잘 만들어진 영화이다. 이런 영화를 재미있다고 하긴 그렇지만 잘 만들어졌기에 재미있다. 세상의 시선을 받아내며 용기를 내 자신을 드러내는 한 소녀의 영혼이 빛난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;로건 (2017, 미국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마블 영화에서 드물게 진한 여운이 남는 영화. 구체적인 내용은 잘 기억나지 않지만 울버린의 마지막 힘을 다해가는 모습에 가슴이 먹먹했던 것 같다. 히어로물이라기 보다는 인간적인 영화. 재미있고 잘 만들어졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;나의 마더 (I am mother, 2019, 호주)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;약간은 소름이 돋는 SF 영화. AI와 소녀. AI는 정성을 다해 소녀를 가르치고 키운다. 결말이 섬뜩하며 AI와 사람, 기술에 대해 돌아보게 한다. 재미있고 잘 만들어진 영화이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;엑스 마키나 (2015, 영국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SF 영화의 수작 중 하나이다. AI가 감정을 가질 수 있는지, 그리고 그러한 AI 앞에서 사람이 느끼는 감정.. 극장에서 봤는데 오싹하면서 봤던 것 같다. 아직까지도 여자 안드로이드의 강렬한 이미지가 남아 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;옥탑방 고양이 (2003, 한국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16회의 미니 시리즈 드라마이다. 오래전 드라마이지만 최근에 다시 한번 보게 되었다. 너무 재미있다. 앉은 자리에서 킥킥거리며 끝까지 다 보고 말았다. 요즘 세대가 아닌 내가 젊었을 때의 감성과 잘 맞아서 더욱 재미있었는지도 모르겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;중경삼림 (1994, 홍콩)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;홍콩의 거리에서 살아가는 사람들의 이야기. 자극적인 재미는 없지만 여운이 계속 남는 영화이다. 오랫동안 마음에 두고 있던 남자와 정식으로 만나기로 한 날, 정작 여자는 나타나지 않는다. 1년 후 캘리포니아에서 자기를 찾아달라는 편지 한 장만을 남긴 채.. 그리고 후일 우연히 만나서 하는 말. '나에게 1년 정도 기회를 주고 싶었다'.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;남자사용설명서 (2013, 한국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B급 영화이지만 상당히 재미있고 잘 만들어진 영화이다. 사용법 설명서, 처음엔 유치한데 보다보면 설득당한다. 재미있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;내 사랑 (Maudie, 2016, 아일랜드/캐나다)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감명깊게 본 영화이다. 몸이 약하지만 그림에 재능이 있는 한 여인과 무뚝뚝한 시골 사내. 부족함을 떠나 가진 것 속에서 있는 그대로 삶과 행복을 살아간다. 어떻게 설명하기 어려운 아름다운 영화이다. 잘 만들어진 영화이며 당연히 재미있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;휴먼스 (humans, 2015, 영국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안드로이드를 소재로 한 8부작 드라마이다. 지금 우리가 만들고자 하는 인간과 유사한 능력을 가진 로봇이 실제로 구현되었을 때 얼마나 끔찍할지를 보여주는 영화(드라마)이다. 재미만 따지면 최근의 '그녀, 안드로이드'도 있겠지만 '휴먼스'는 로봇과 과학기술에 대해 많은 생각을 하게 하는 의미깊은 영화(드라마)이다. 물론 재미도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그녀 (her, 2013, 미국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인공지능에게 사랑을 느끼는 남자. 하지만 인공지능은 진화하여 닿을 수 없는 세계로 사라진다. 그녀(인공지능)와 대화를 주고받으며 외로움을 위로받는 남자. 그런 남자의 모습에 왠지모를 공감을 느끼며 영화 후에도 계속 여운이 남는다. 재미있고 완성도가 높은 잘 만들어진 영화이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;타워링 (1974, 미국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1974년도 영화라고는 믿기지 않을 정도로 잘 만들어진 영화이다. 고층건물에서 발생한 화재와 화재 속에서의 다양한 군상들의 모습이 그려진다. 지금 개봉해도 최고의 영화 중 하나이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시크릿 슈퍼스타 (2019, 인도)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인도 영화하면 대표적으로 '당갈'과 이 영화가 떠오른다. 가수가 꿈인 한 소녀가 자신의 꿈을 향해 나아가는 과정을 통해 인도에서의 여성의 삶과 현실의 어려움이 무겁지 않게 그려진다. 인도의 사회와 가정, 가정에서의 남자와 여자의 위치. 인도 영화를 보며 형태만 다를 뿐 우리나라와 정서와 문화가 정말 많이 닮았다는 것을 느낀다. 잘 만들어진 영화이며 재미있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;당갈 (2018, 인도)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이들과 함께 재미있게 본 인도 영화이다. 아버지에 의해 강제로 레슬러의 길을 걷는 두 소녀. 아버지가 말을 듣지 않는 두 딸의 머리를 삭발하는 장면, 인도에서의 마을 결혼식 풍경. 자기 의지와 관계없이 어린 나이에 결혼을 해야 하는 어린 신부의 눈물이 기억에 남는다. 내용도 재미있고 잘 만들어진 영화이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;대지진 (Aftershock, 2010, 중국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1976년 27만의 목숨을 앗아간 중국의 당산대지진을 소재로 한 영화이다. 죽은자와 살아남은 자. 그리고 두 아이 중에서 한 명만을 선택해야 했던 어머니. 그들의 한과 아픔을 느끼면서 몰입하며 봤던 영화이다. 지금 다시 한번 봐도 좋을 것 같다. 완성도가 높고 잘 만들어진 영화이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;분노 (Hai Phuong, 2019, 배트남)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 본 유일한 배트남 영화. 흔치 않은 기회이기에 얼른 봤지만 영화 자체로도 뛰어나다. 우리나라 영화 '아저씨'를 떠오르게 하지만 상황이나 액션이 훨씬 리얼하다. 배트남을 엿볼 수 있는 영화라서 좋고 뛰어난 영화라서 더 좋다. 재미있고 잘 만들어진 영화이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다만, 널 사랑하고 있어 (2007, 일본)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15년쯤 전에 봤던 영화. 개인적으로 가장 기억에 남는 일본 영화이다. 아직은(?) 젊었던 시절 풋풋하고 안타깝고 가슴이 설렜던 감정이 지금도 기억에 남아 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로메테우스 (2012, 미국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에일리언 시리즈 중에서 가장 긴장하면서 봤던 영화이다. 에일리언과 관련된 영화인줄 모르고 보다가 마지막에 깜짝 놀랐던 영화. 재미있고 잘 만들어진 영화이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;나의 아저씨 (2018, 한국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16회로 구성된 드라마. 아이유의 연기가 인상적인 잘 만들어진 드라마이다. 퇴근하면 어두운 방에서 믹스커피 2개로 끼니를 해결하는 모습, 가게가 끝나면 저녁마다 동네 한바퀴를 돌아서 다시 자기 가게로 퇴근하는 술집 여주인, 사채업자 청년이 방안에 주저앉아 있던 장면 등이 기억에 남는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;아바타 (2009, 미국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영상미와 그래픽에 경이로움을 느끼면서 봤던 영화. 당시 보면서 그래픽 영화는 아바타 이전과 이후로 구분된다고 생각했을 정도로 환상적인 영상에 감탄했던 기억이 난다. 당시 이 영화를 극장에서 본게 얼마나 다행인지 모른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;추격자 (2008, 한국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;너무나도 잔인한 영화. 이런 영화인지 모르고 아내와 함께 극장에서 봤다가 약간 정신적 충격을 먹었던 영화이다. 완성도가 높고 너무 잘 만들어졌기에 더욱 무서운 영화. 지금 다시 보라고 해도 이 영화는 두 번은 보기 힘들 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;블레이드 러너 2049 (2017, 미국/캐나다/영국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SF의 명작 중 하나. 전편 '블레이드 러너'(1982)를 보고 보면 더 좋을 영화. 개인적으로 전편보다는 이 영화를 더 인상깊게 보았다. 드물게 두 번을 본 영화이며 두 번째 봤을 때가 좀 더 내용을 곱씹으며 좋았던 영화이다. 전편이 거친 폭풍 같다면 '블레이드 러너 2049'는 만들어진 자들의 아픔이 잘 갈무리된, 장면 하나 하나가 아름다운 영화이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;82년생 김지영 (2019, 한국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;남자와 여자를 떠나서 한 인간으로서 그냥 공감이 되는 영화. 보는 내내 나도 모르게 눈물이 났다. 왠지 아내와 함께 보지 않은게 다행이었던 영화.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자토이치 (2003, 일본)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일본영화 하면 떠오르는 선명한 피, 날선 횟감같은 느낌이 잘 드러난 영화이다. 특이하게도 일본 영화에서 삶과 죽음, 생명은 큰 의미가 없다. 시퍼런 칼날에 피가 난무하지만 한편으로는 시 같기도 하다. 자기 민족(일본)의 삶과 애환을 칼잡이를 통해 그려내면서 또한 자국의 전통 문화를 강하게 드러내고 있다. 잘 만들어진 작품.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;레버넌트: 죽음에서 돌아온 자 (2016, 미국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대작 중의 하나. 네이티브 어메리칸(인디언)과 영.프 제국의 식민 개척에서 벌어졌던 비극을 한 남자의 생존과 복수의 과정을 통해 중립적인 관점에서 담아낸 영화. 대자연의 영상미와 날것의 영상들이 압권이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;모터싸이클 다이어리 (2004, 아르헨티나)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 영화다. 나를 돌아보게하고 내가 얽매인 것들을 돌아보게 한다. 명작이라고까지 하기는 어렵지만 나름 재미있고 잘 만들어진 영화이다. 체 게바라와 관계된 영화, 흔하지 않은 남미의 영화라는 점에서도 한 범쯤 볼 만하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;히든 피겨스 (Hidden Figures, 2016, 미국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미국의 뿌리깊은 인종차별과 흑백갈등을 엿볼 수 있는 영화. 재미있고 짜임새 있게 잘 만들어진 영화이다. NASA 책임자(백인 남성)가 유색을 구분하는 화장실 간판을 때려부수는 장면이 인상적이다. 흑인 인종차별을 그린 또 다른 영화들로 '헬프'(2011, 미국), '크래쉬'(2004, 미국) 등도 볼 만하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;나의 해방일지 (2022, 한국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;꽤나 독특한 드라마이다. 작가의 한풀이 드라마 같기도 한데, 평소에 어렴풋이 느끼지만 깊게 생각하지 않았거나 구체화되지 않았던 것들이 언어로 표현되어 나왔을 때, 그렇구나 하면서 저절로 고개가 끄덕여진다. '나는 아직 여기에 있는데, 아직 이것을 좀 더 해야겠는데, 사람들은 다음 단계로 나아간다'. 극중 해방클럽 멤버들이 정한 규칙: 조언하지 않기, 행복한척 하지 않기, 불행한척 하지 않기.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;불도저에 탄 소녀 (2021, 한국)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 영화 참 좋다. 신선하다. 한쪽 팔에 문신을 새긴 소녀가 있고 평소에는 소매로 문신을 가리고 다닌다. 입도 거칠고 거침이 없어 보이지만 정작 용기를 내야할 때에는 문신을 가린 소매를 걷어올린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;by 다크 프로그래머&lt;/p&gt;</description>
      <category>잡기장</category>
      <category>영화</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/188</guid>
      <comments>https://darkpgmr.tistory.com/188#entry188comment</comments>
      <pubDate>Thu, 5 May 2022 11:56:17 +0900</pubDate>
    </item>
    <item>
      <title>디지털 피아노 건반소음 없애기</title>
      <link>https://darkpgmr.tistory.com/187</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;내게 가장 큰 취미 중 하나는 집에 있는 물건들을 고치거나 개선하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;집에 중고로 구한 디지털 피아노가 한 대 있다. 아이가 심심할 때마다 한 번씩 치는데, 칠 때마다 건반에서 덜그덕 거리는 소리가 난다. 예전에는 안그랬던 것 같은데 요즘들어 소리가 갈수록 심해져서 피아노가 타악기가 된 것 같다 (원래 타악기인가?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떻게든 고쳐보려고 인터넷을 검색해봐도 디지털 피아노는 원래 건반에서 달그닥 거리는 소리가 난다고만 되어 있을 뿐, 딱히 해결 방법은 나와있지 않다. 바닥에 매트를 깔라는 등의 얘기는 있지만, 그건 층간소음 얘기이지 건반소음 자체가 줄어드는 것은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 코로나로 집에 있으면서 혹시라도 건반의 달그닥 소리를 줄일 수 있을까 싶어 피아노 내부를 뜯어보게 되었다. 피아노를 분해하는 것이 쉽지는 않았지만 몇 번의 시행착오를 거치면서 결국 소음의 원인을 찾았다. 그리고 지금은 문제가 해결되어 건반소음은 거의 들리지 않고 부드러운 피아노 음을 들을 수 있다. 성공이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 피아노 건반 소음을 줄이기 위해 나름 시도했던 방법을 소개하려 한다. 집에 있는 피아노는 CASIO(카시오) Privia PX-720 모델인데, 다른 디지털 피아노에도 적용될지는 모르겠다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;piano_front.jpg&quot; data-origin-width=&quot;1397&quot; data-origin-height=&quot;786&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KhPLL/btryZIkLaYR/Dklr2YoL8cdik3G6PVf8UK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KhPLL/btryZIkLaYR/Dklr2YoL8cdik3G6PVf8UK/img.jpg&quot; data-alt=&quot;그림1. Casio Privia PX-720&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KhPLL/btryZIkLaYR/Dklr2YoL8cdik3G6PVf8UK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKhPLL%2FbtryZIkLaYR%2FDklr2YoL8cdik3G6PVf8UK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1397&quot; height=&quot;786&quot; data-filename=&quot;piano_front.jpg&quot; data-origin-width=&quot;1397&quot; data-origin-height=&quot;786&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1. Casio Privia PX-720&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;피아노 분해/조립&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;건반 수리를 위해서는 먼저 피아노를 분해해야 한다. 그런데 내부 구조를 모르는 상태에서 제품을 분해하는 것이 쉬운 일은 아니다. 혹시나 잘못 뜯었다가 제품이 망가지지나 않을까 걱정도 되고.. 하지만, 원래 분해가 가능한 제품이니 찬찬히만 한다면 누구라도 분해할 수 있다. 나도 처음에는 막막했지만 여러 시행착오를 거치면서 4~5번 정도 뜯다 보니 지금은 눈 감고도 분해/조립이 가능할 정도로 구조가 익숙해졌다. 제품마다 차이가 있겠지만 참고로 집에 있는 피아노 분해 과정을 적어본다. 분해할 때는 항상 다시 조립이 가능하도록 분해과정을 기록(사진촬영 등)으로 남기고 나사 등을 잘 분리해서 보관해 놓는게 중요하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;piano_disassemble.png&quot; data-origin-width=&quot;1344&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bl8NQR/btry7MIgqu7/EHSI68z9hkKp3rop3OP3H0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bl8NQR/btry7MIgqu7/EHSI68z9hkKp3rop3OP3H0/img.png&quot; data-alt=&quot;그림2. 피아노 분해&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bl8NQR/btry7MIgqu7/EHSI68z9hkKp3rop3OP3H0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbl8NQR%2Fbtry7MIgqu7%2FEHSI68z9hkKp3rop3OP3H0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1344&quot; height=&quot;420&quot; data-filename=&quot;piano_disassemble.png&quot; data-origin-width=&quot;1344&quot; data-origin-height=&quot;420&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2. 피아노 분해&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 전원선 및 스피커 케이블, 패달 케이블 분리: 연결 위치를 잘 기억/기록해 둔다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 발판(패달) 부위와 중간의 스피커 부위를 다리에서 분리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 스피커 부위를 분리할 때는 피아노를 눕혀놓고 하거나 한쪽 밑을 괴고 분해한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 분해 나사는 옆면 기둥의 고무캡 안에 숨겨져 있음 (칼 등으로 고무캡 제거)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 본체 양쪽의 다리 분리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - (주의)다리를 분리할 때는 피아노를 눕혀놓고 하거나 밑면을 괴고 분해한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 피아노를 세워놓은 채로 옆면을 때어내면 건반 본체가 그대로 바닥으로 추락 (대형사고!!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 건반 뒷판 분리: 본체 뒷면에 있는 모든 나사를 푼 후(꽤 많다) 뒷면 판자를 때어낸다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 건반 상판 분리: 양쪽의 나사 몇개만 풀면 쉽게 분리된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 건반 덮개 분리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 건반에 먼지가 들어가지 않도록 손으로 당기고 밀어서 건반을 덮는 부분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 양쪽에 톱니가 밖으로 빠지지 않도록 방지하는 걸림쇠 부분만 제거하면 본체에서 완전 분리가 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 건반 덮개까지 분리하면 이제 건반들이 온연히 모습을 드러낸다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 건반 앞면 분리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 개별 건반들(흰색, 검은색 건반들)을 하나씩 분리하기 위해서는 건반 앞면 분리가 필수이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 앞면을 분리하기 위해서는 본체 밑면에 있는 나사들 중에서 가장 앞줄에 있는 나사들을 모두 제거하면 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. 개별 건반 분리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 건반 앞면까지 분리하면 이제 흰색, 검은색 건반들을 하나씩 빼거나 끼울 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 핀셋 등을 이용하면 건반을 보다 손쉽게 뺄 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;건반소음 없애기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디지털 피아노 건반 소음의 원인을 알기 위해서는 먼저 건반의 내부구조(mechanism)를 이해할 필요가 있다. 건반의 구조는 건반을 뜯어보면 쉽게 알수 있으며 그림으로 보면 아래와 같다(그림 3). 플라스틱 건반에는 쇠로 된 무게추가 연결되어 있으며 건반을 누르면 무게추가 올라가고, 건반을 놓으면 무게추가 내려가면서 건반이 들려지는 구조이다. 그리고 무게추 끝 부분의 바닥과 윗면에는 스폰지가 덧대여 있어서 무게추가 부딧힐 때의 충격과 소음을 흡수한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/raFOB/btry4TN1JTW/WCKeDOgYtnRgF3zoyyqbN1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/raFOB/btry4TN1JTW/WCKeDOgYtnRgF3zoyyqbN1/img.gif&quot; data-origin-width=&quot;358&quot; data-origin-height=&quot;198&quot; data-is-animation=&quot;true&quot; data-filename=&quot;piano_key_mechanism.gif&quot; data-widthpercent=&quot;50.75&quot; style=&quot;width: 50.1588%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/raFOB/btry4TN1JTW/WCKeDOgYtnRgF3zoyyqbN1/img.gif&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FraFOB%2Fbtry4TN1JTW%2FWCKeDOgYtnRgF3zoyyqbN1%2Fimg.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;358&quot; height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LAyDr/btry6Foox7F/SpdtpO2lxYDqOqmWmKePC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LAyDr/btry6Foox7F/SpdtpO2lxYDqOqmWmKePC0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;318&quot; data-filename=&quot;piano_noise_places.png&quot; style=&quot;width: 48.6784%;&quot; data-widthpercent=&quot;49.25&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LAyDr/btry6Foox7F/SpdtpO2lxYDqOqmWmKePC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLAyDr%2Fbtry6Foox7F%2FSpdtpO2lxYDqOqmWmKePC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;558&quot; height=&quot;318&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;그림3. 디지털 피아노 건반의 내부 구조 및 소음 부위&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 건반 소음의 원인이 무게추와 스폰지 사이에서 발생한 것으로 생각했다. 즉, 피아노가 오래되면서 스폰지가 경화되고 충격을 제대로 흡수하지 못하기 때문으로 말이다. 그런데, 여러 번의 시행착오와 테스트를 거치면서 건반 소음의 원인이 다른 데에 있음을 알게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파악한 건반 소음은 크게 2가지인데, 하나는 건반을 누를 때 '딱'하는 뭔가에 부딪히는 소리이고 다른 하나는 건반을 놓을 때 발생하는 '덜걱'하는 소음이다. 이 두 소음은 발생 원인도 다르고 해결 방법도 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;A. 건반을 누를 때 나는 소음 제거&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;건반을 누를 때 나는 소음은 플라스틱 건반과 건반 지지대가 부딪히면서 나는 소리이다. 건반 밑에는 건반을 누를 때 너무 들어가지 않도록 하는 지지대가 있는데(그림3. 참조), 이 지지대와 건반이 부딧히면서 '딱'하는 소리가 발생한다. 그래서, 건반 지지대 위에는 원래 완충제가 발라져 있는데, 시간이 지나면서 완충제가 없어지거나 굳어서 부딪히는 소리가 나는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결 방법은 지지대 위에 완충제를 다시 발라주는 것이다. 그런데 완충제가 뭔지 모르니, 내 경우는 동네 철물점에서 파는 구리스를 이용했다(요즘 나오는 뿌리는 구리스 말고 바르는 구리스를 사야 한다). 건반 지지대마다 구리스를 듬뿍 발라주니 건반을 누를 때 나는 소음이 부드러운 소리로 바뀌었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;B. 건반을 땔 때 나는 소음 제거&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;건반을 눌렀다가 손을 때면 건반이 올라오면서 '덜걱' 또는 '덜거덕' 하는 소리가 난다. 처음에는 올려진 무게추가 내려오면서 바닥(스폰지)에 부딪히는 소리인줄 알았다. 그런데, 자세히 들어보면 무게추가 아닌 건반 플라스틱 쪽에서 소리가 난다. 그리고 여러 테스트 끝에 이 소음이 건반과 무게추의 연결부위에서 발생하는 것임을 알게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;집에 있는 피아노의 건반은 무게추와 연결 부위에 홈(구멍)이 있고, 이 홈에 무게추 끝(검은색 부분)을 끼워서 건반을 누를 때 무게추를 들어올리는 구조이다. 그림 3에 보면, 건반키 중간의 튀어나온 연결부위에 무게추의 검은색 부분이 끼워져 있어서 건반을 누를 때마다 그 위치가 조금씩 들어갔다 나왔다 하는 것을 볼 수 있다. 그래서 건반키에 뚫린 홈(구멍)은 무게추가 충분히 움직일 수 있도록 어느 정도 유격(여유 공간)를 두고 크게 만들어져 있다. 그리고 이 유격으로 인해 홈(구멍)에서 건반과 무게추 검은색 부분이 부딪히는 덜걱거리는 소음이 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유격으로 인해 소음이 발생하는 이유는 다음과 같다. 먼저, 건반을 누르면 무게추가 올라간다. 그리고 건반을 놓으면 무게추가 내려가면서 건반이 들어 올려진다. 그러다가 무게추가 밑면의 스폰지에 부딪히면 스폰지의 탄성에 의해 무게추가 일시적으로 튀어올랐다가 내려온다. 이 때 건반은 관성에 의해 위로 올라가는 상황이기 때문에 무게추가 튀어오르면서 검은색 돌출부가 홈(구멍) 유격의 아랫쪽과 한번 부딪히고 튀었다 내려오면서 다시 홈 윗쪽과 부딪힌다. 그리고 이로 인해 순간적으로 덜거덕 하는 소음이 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원인은 알았지만 이 경우는 해결 방법이 만만치 않다. 무게추 검은색 부위에 구리스를 몽땅 발라 보았지만 큰 도움은 되지 않았다. 근본적인 해결은 연결부 홈의 유격을 줄여주는 것인데, 유격을 너무 줄이면 연결부가 빡빡해져서 건반을 누를 때 키감이 안좋아질(건반이 잘 안눌러지고 잘 안올라오는) 수 있기 때문에 적당히 줄이는 것이 중요하다. 종이를 끼울까 테이프를 붙일까 고민하다가 생각해 낸 방법은 그림 4처럼 홈의 아래쪽을 실로 감는 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;piano_key_string.png&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUAv50/btry8PxF1JI/SPayk1UH8zqNJIYTHrtSMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUAv50/btry8PxF1JI/SPayk1UH8zqNJIYTHrtSMK/img.png&quot; data-alt=&quot;그림4. 건반 실로 감기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUAv50/btry8PxF1JI/SPayk1UH8zqNJIYTHrtSMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUAv50%2Fbtry8PxF1JI%2FSPayk1UH8zqNJIYTHrtSMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;443&quot; height=&quot;196&quot; data-filename=&quot;piano_key_string.png&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림4. 건반 실로 감기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실의 두께만큼 아래쪽 유격이 매꿔지고, 또한 실의 완충 작용으로 인해 부딪히는 소음을 줄여줄 수 있다. 키감에 영향을 주지 않는 적당한 실의 두께와 감는 횟수에 대해서는 건반 1~2개를 가지고 충분히 테스트해 본 후에 적용하면 좋다. 개인적으로는 &lt;span&gt;약간 두꺼운 실(다이소에서 파는 포장용/장식용 실)을 사용해서 모든 건반의 아래쪽을 두~세번 정도 감아주었는데, 효과는 아주 탁월했고 이로 인해 건반의 덜걱거리는 소리가 완전히(?) 사라졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;피아노 모델마다 건반 구조가 조금씩 다르니 위 내용은 CASIO 피아노에만 해당될 수도 있겠다. 그리고 집에 있는 피아노는 워낙 오래된 모델이라 요즘 나오는 모델에는 이러한 문제가 개선되었는지도 모르겠다. 하지만, &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;피아노 모델이 다를지라도 중요한 것은 문제의 원인을 정확히 파악하는 것이다. (연구하는 것도 그렇지만) 문제의 원인만 정확히 알면 해결책은 어떻게든 찾을 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;부록1. 빠진 건반 수리하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;피아노를 오래 쓰다보면 건반 1~2개가 빠져서 눌러도 안 올라오는 경우가 발생한다. 사실 처음 피아노를 분해하게 된 이유도 검은색 건반 하나가 덜렁거려서이다. 건반이 빠진 이유는 건반과 연결된 무게추가 무게추 회전축에서 빠져서이다 (그림 3. 참조). 앞에서와 같이 피아노 분해에 성공하면 수리 방법은 매우 간단하다. 해당 건반을 빼낸 후 무게추를 회전축에 꼭 끼워주면 된다. 만일 검은색 건반이 고장난 경우에는 먼저 양 옆의 흰색 건반을 빼내야만 검은색 건반이 빠진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;span&gt;부록2. 구리스의 활용 (팁)&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;앞서 구리스를 이용해서 피아노를 수리하는 방법을 설명했지만, 그 외에도 다양한 활용이 가능하다. 윤활제를 이용해서 집 안에 있는 물건들을 조금만 손보면 훨씬 편리하게 사용할 수 있다. 물건이 뻑뻑하거나 마찰 소음을 줄일 때 내가 집에서 애용하는 윤활제 세트로는 양초, MD-50(방청윤활제), 뿌리는 구리스, 바르는 구리스가 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;vacum_waterpurify.png&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KRGBA/btrzbddAYUS/2FVdd29gP74ODjOkC7M3h1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KRGBA/btrzbddAYUS/2FVdd29gP74ODjOkC7M3h1/img.png&quot; data-alt=&quot;그림5. 진공청소기 바퀴와 정수기 버튼 수리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KRGBA/btrzbddAYUS/2FVdd29gP74ODjOkC7M3h1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKRGBA%2FbtrzbddAYUS%2F2FVdd29gP74ODjOkC7M3h1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;584&quot; height=&quot;239&quot; data-filename=&quot;vacum_waterpurify.png&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;369&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림5. 진공청소기 바퀴와 정수기 버튼 수리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;span&gt;A. 진공청소기 소음 없애기 (드르륵 소리)&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;집에서 진공청소기를 사용하다 보면 바닥에서 드르륵 거리는 소리로 꽤나 시끄럽다. 청소기 흡입구 바닥면에 달린 조그만 바퀴들(그림5)에서 나는 소리인데, 조금만 손보면 된다. 먼저, 바퀴에 달린 이물질들을 제거해 준 후 양초로 바퀴 면을 잘 초칠해 준다. 그리고 바퀴 회전축에는 구리스를 발라준다. 회전축에 구리스(바르는 구리스)를 바르면 청소할 때 바퀴의 드르륵거리는 소리가 대부분 사라진다. 그리고 바퀴면에 양초칠을 해주면 청소기를 옆으로 이동할 때 부드럽게 이동한다. 청소기 흡입구는 바퀴 방향인 앞뒤로는 잘 움직이지만 옆으로는 잘 안움직인다. 그런데, 바퀴에 초칠을 하고 윤을 내주면 바닥면과 마찰력을 줄어서 옆으로도 잘 움직인다. 청소할 때 은근히 옆으로 이동할 때가 많은데 손에 힘이 덜 들어서 청소가 한결 쉬워진다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;span&gt;B. 뻑뻑한 정수기 버튼 수리&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;집에서 사용하는 정수기가 어느 날부터 버튼이 뻑뻑하고 잘 안눌러진다. 그리고 눌러도 딸각 하고 눌렀다 나오는 느낌이 없다. 원인을 찾기 위해 전면 패널을 분해해 봤지만 딱히 문제를 찾기 어려웠다. 그러다가 전원을 끄고 버튼을 계속 힘껏 눌렀다 땟다 해보니 버튼이 좀더 잘 눌려지는 느낌이 났다. 그래서 버튼 사이에 구리스를 몇 방울 흘려주니 문제가 말끔히 해결되었다. 아마도 버튼 안에서 녹이 슨 것으로 생각된다. 버튼의 틈 사이로 구리스가 잘 스며들도록 이 경우에는 뿌리는 구리스를 사용했다. MD-50과 같은 방청윤활제를 사용해도 되겠지만 방청윤활제는 기름 냄새가 나기 때문에 냄새가 거의 없는 구리스가 적합하다. 그리고, 구리스를 정수기 버튼에 직접 뿌릴 수는 없으니 위생용 비닐장갑 안에 뿌린 후 비닐장갑에 작은 구멍을 내서 버튼에 액을 떨어뜨리는 방법을 사용했다. 액을 떨어뜨릴 때는 흘러내리지 않도록 패널을 (분해해서) 위로 들고 떨어뜨리면 좋다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;이 외에도 스탠드 접히는 부분이 뻑뻑할 때, 의자가 잘 안밀릴 때 다리에 초칠, 밥상을 틈새에 밀어 넣을 때 틈새 바닥에 초칠하기, 안경 다리가 뻑뻑할 때 구리스 바르기 등 그 활용도는 정말 많다. 참고로 구리스나 방청윤활제(MD-50) 등은 철물점이나 문방구 등에서 몇 천원 정도면 구매할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;ps. 난 아무래도 전파상을 했으면 적성에 잘 맞았을 것 같다...&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;다크 프로그래머&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>잡기장</category>
      <category>건반소음</category>
      <category>구리스</category>
      <category>디지털피아노</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/187</guid>
      <comments>https://darkpgmr.tistory.com/187#entry187comment</comments>
      <pubDate>Tue, 12 Apr 2022 14:46:23 +0900</pubDate>
    </item>
    <item>
      <title>딥러닝과 Loss 함수의 이해</title>
      <link>https://darkpgmr.tistory.com/186</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;딥러닝.. 내겐 여전히 블랙박스 같은 존재이다. 하지만 딥러닝도 크게 보면 기계학습 방법의 하나로서 딥네트워크를 이용한 모델링과 파라미터 추정 방법으로 볼 수 있다. 그래서 전통적으로 기계학습을 연구했던 사람들은 아마도 보다 넓은 시야를 가지고 딥러닝을 이해할 수 있을 것으로 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 딥러닝에 대한 나름의 이해를 정리한 글이다. Loss 함수, 파라미터 공간, 최적화 기법 등이 어떻게 딥러닝과 연결되는가 주 내용이다. 딥러닝의 세부적인 내용보다는 전체적인 틀을 바라보고 해석한 글로 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;딥러닝과 파라미터 추정&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딥러닝도 크게 보면 x에서 y로의 함수관계 f&lt;sub&gt;w&lt;/sub&gt;(&amp;middot;)를 찾는 문제로 볼 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;x &amp;rarr; f&lt;sub&gt;w&lt;/sub&gt;(&amp;middot;) &amp;rarr; y&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 &lt;span style=&quot;color: #ef5369;&quot;&gt;함수의 구조와 복잡도를 정하는 것이 모델링&lt;/span&gt; 과정인데, 딥러닝에서는 어떤 네트워크 아키텍쳐를 사용할 것인지, 몇 개의 층을 사용할 것인지, activation 함수로는 무엇을 사용할 것인지 등을 정하는 것이 모델링에 해당한다. 예를 들어 아키텍쳐로는 VGG, ResNet 등을 사용할 수 있고 activation 함수로는 ReLU나 sigmoid 등을 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델이 정해지면 모델의 파라미터가 정해지는데 딥네트워크에서는 입력층과 출력층 사이에 존재하는 모든 weight들이 모델 파라미터가 된다. 모델 파라미터는 모델에 종속되어 정해지는 것으로서 예를 들어 돌맹이의 궤적을 2차 다항식 f(t) = at&lt;sup&gt;2&lt;/sup&gt; + bt + c로 근사하기로 결정했다면 모델은 2차 다항식이고 모델 파라미터는 a, b, c가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델과 모델 파라미터가 정해지면 이제 남은 일은 모델 파라미터의 값을 정하는 것이다. 주어진 입력(x)에 대해 원하는 출력(y)이 나오도록 모델 파라미터 값을 조정하는 것이 목적이다. 수집된 관측값들이 (xi; yi), i = 1, 2, ..., n라면 각각의 i에 대해 최대한 yi = f&lt;sub&gt;w&lt;/sub&gt;(xi)가 되도록 파라미터 값을 찾게 되는데, 이 과정이 딥러닝의 학습과정 또는 파라미터 추정 과정에 해당한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데, 파라미터 추정을 위해서는 먼저 파라미터의 좋고 나쁨을 판단하는 기준이 있어야 한다. 그것이 바로 loss 함수를 정하는 일이다. 앞서 과정에서 모델과 모델 파라미터가 정해지면 일종의 파라미터 공간(parameter space)이 생성된다. 이 공간의 차원은 모델 파라미터의 개수와 동일하며 아직은 차원만 정해진 빈 공간이다. 그런데, loss 함수가 정해지면 이 공간에 산맥이 생기고 골짜기가 생긴다. 즉, Loss 함수에 따라서 각 파라미터 값에 대한 score(or 손실)가 매겨지기 때문에 이 score에 따라서 파라미터 공간에 높고 낮음이 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딥러닝 학습에 있어서 마지막 선택은 주어진 산맥과 골짜기의 파라미터 공간에서 어떻게 최적의 답을 찾아갈 것인가이다. 파라미터 공간이 정해지면 이미 최적의 답도 같이 정해진다. 하지만 무한한 파라미터 공간을 미리 다 evaluation 해볼 수는 없기 때문에 현실적으로는 시작 위치에서 조금씩 해를 찾아갈 수 밖에 없다. 즉, gradient descent 방법, Gauss-Newton 방법, LM 방법 등과 같은 최적화 기법(optimizer)이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 일반적으로는 Newton, LM 방법 등의 성능이 더 좋다. 하지만 딥러닝에서는 현실적인 이유(파라미터 공간이 너무 고차원)로 gradient descent, 특히 stochatic gradient descent 류의 방식이 주로 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상의 내용을 정리해 보면 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;학습데이터: problem의 domain을 정의&lt;/li&gt;
&lt;li&gt;네트워크 구조: 함수의 복잡도와 power를 정의, 모델 파라미터를 정의&lt;/li&gt;
&lt;li&gt;loss 함수: 파라미터에 대한 evaluation(cost)을 정의&lt;/li&gt;
&lt;li&gt;optimizer: 파라미터 공간에서의 탐색 방법을 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이중 어떤 요소가 더 중요할까? optimizer는 해 자체를 바꾸지는 못하지만 optimizer에 따라 해를 잘 찾을 수도 있고 못 찾을 수도 있다. 네트워크의 구조와 복잡도를 정하는 것은 비유컨데 닭 잡는데 소 잡는 칼을 쓸 것인지 아니면 소 잡는데 닭 잡는 칼을 쓸 것인지를 정하는 문제로 볼 수 있다. 물론 적당한 규격의 칼이 좋을 것이다. 학습데이터와 loss 함수는 선택된 칼의 규격 내에서 최적의 칼이 되기 위한 기준을 잡아준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Loss 함수의 역할&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Loss는 영어 단어로는 상실, 손실을 의미한다. 그리고 기계학습에서의 Loss는 어떤 학습된 모델을 실제 데이터에 적용했을 때 모델의 추정 오차로 인해 발생하는 손실을 의미한다. 학습된 모델을 f&lt;sub&gt;w&lt;/sub&gt;(&amp;middot;), 관측 데이터를 (xi; yi)라 하자. 이 때, 입력 xi에 대한 모델 추정값과 실제 관측값 사이의 오차를 residual이라 부르며 xi에 대한 residual은 ri = yi - f&lt;sub&gt;w&lt;/sub&gt;(xi)로 계산된다. Residual이 단순히 모델 추정값과 참값(관측값) 사이의 차이를 말하는 반면에, Loss는 이 차이로 인해 발생하는 실제 계산상의 손실을 의미한다. 사실 Loss는 우리가 마음데로 정할 수 있으며 예를 들어 residual의 절대값을 Loss로 정하거나(L(xi) = ‖yi - f&lt;sub&gt;w&lt;/sub&gt;(xi)‖), residual의 제곱을 Loss로 할 수도 있다(L(xi) = ‖yi - f&lt;sub&gt;w&lt;/sub&gt;(xi)‖&lt;sup&gt;2&lt;/sup&gt;). 이 외에도 문제나 응용에 따라서 focal loss, triplet loss 등 다양한 형태의 Loss 함수 정의가 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 Loss 함수는 파라미터에 대한 evaluation(cost)을 정의한다고 했다. 아래 두 파라미터 추정 문제의 예를 살펴보자. 식 (1)은 일반적인 L&lt;sub&gt;2&lt;/sub&gt;-norm을 Loss로 정의한 경우이고, 식 (2)는 L&lt;sub&gt;2&lt;/sub&gt;-norm에 파라미터 크기를 함께 고려하여 Loss로 정의한 경우이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\min_{w} \; {\left \|&amp;nbsp; y - f_w (x) \right \|^2}\tag{1}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\min_{w} \; {\left \|&amp;nbsp; y - f_w (x) \right \|^2 \!+\lambda \left \| w \right \|^2} \tag{2}$$&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;400&quot; data-filename=&quot;ridge_regression.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwSgpz/btre7KaNi8D/CEepWEkDLgUBwjaqAkYD7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwSgpz/btre7KaNi8D/CEepWEkDLgUBwjaqAkYD7K/img.png&quot; data-alt=&quot;그림1. Rideg Regression (그림출처: http://primo.ai/index.php?title=Ridge_Regression)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwSgpz/btre7KaNi8D/CEepWEkDLgUBwjaqAkYD7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwSgpz%2Fbtre7KaNi8D%2FCEepWEkDLgUBwjaqAkYD7K%2Fimg.png&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;400&quot; data-filename=&quot;ridge_regression.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1. Rideg Regression (그림출처: http://primo.ai/index.php?title=Ridge_Regression)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;식 (1)과 같이 Loss를 정의하면 정답(학습데이터)에만 초점을 맞추어 파라미터를 추정하게 된다. 그런데, 파라미터 공간은 워낙 고차원이기 때문에 그림1(좌) 경우처럼 식 (1)을 만족하는 해(w)가 너무 많아서 오히려 수렴이 어려울 수도 있다.&amp;nbsp; 또는 반대로 파라미터 공간이 너무 굴곡이 심해서 쉽게 발산할 수도 있다. 하지만, 식 (2)와 같이 Loss를 정의하면 가능한 해들 중에서 크기가 최소화되는 해를 찾기 때문에 그림1(우)처럼 파라미터 공간이 안정화되어 상대적으로 쉽게 해를 찾을 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 기계학습 분야에서는 식 (2)와 같은 regularization term을 추가한 파라미터 추정 기법을 ridge regression이라 부르는데, ridge를 추가하는 것이 아니라 제거하기 때문에 ridge regression이라 부른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 예는 기계학습 or 파라미터 추정에서 Loss 함수가 미치는 영향을 설명하기 위한 하나의 예시이며 이 외에도 다양한 형태의 Loss 함수 정의가 가능하다. Loss 함수를 어떻게 정의하느냐에 따라서 파라미터에 대한 evaluation 즉, 학습의 지향점이 달라지기 때문에 기계학습을 한다면 한 번쯤은 Loss 함수에 대해 고민해 볼 필요가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ Loss 함수가 중요하긴 하지만 그렇다고 파라미터 공간을 마음대로 바꾸는 것은 아니다. 잘 생각해보면 학습에 사용되는 관측 데이터 자체가 이미 답을 제시한다. 즉, xi에 대해서는 yi가 나오도록 하는 파라미터를 찾아라고 알려준다. 따라서, 보다 정확하게 말하면 학습 데이터는 기준점을 제시하고 Loss 함수는 기준점에서 벗어날을 때의 패널티와 부가적인 제약조건을 정의한다고 볼 수 있다. 그리고 부가적인 제약조건에 따라서 학습의 지향점이 조금씩 달라질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;딥러닝 Loss 함수&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 딥러닝에서 사용되는 Loss 함수들에 대해 간단히 살펴보려고 한다. 사실 Loss 함수도 워낙 종류가 많기 때문에 대표적인 몇 가지만 살펴보도록 하자. 먼저, yolo에서는 weighted least squares loss를 사용한다. 기본적으로는 L&lt;sub&gt;2&lt;/sub&gt;-norm인데 요소(추정된 box와 ground truth box와의 중심거리, 박스 크기, 박스 overlap 등)별로 다른 가중치를 적용한다. 그리고 classification 문제에서는 대부분 cross entropy loss라는 것을 사용한다. 멀티 클래스 classification 문제에서는 클래스 개수만큼의 출력층 노드가 존재하는데, 학습시 입력 데이터의 클래스에 대응되는 출력노드의 출력은 1, 그 외의 출력노드의 값은 0이 되도록 학습하는 것이 일반적이다. 만일 입력 학습데이터의 클래스가 Ci이고 Ci에 대응되는 출력노드의 출력값을 pi라고 하면 x&amp;isin;Ci에 대한 cross entropy loss는 L = -log(pi)로 계산된다 (일반적으로 딥러닝에서는 출력층 값에 softmax를 적용하기 때문에 pi는 항상 0 ~ 1 사이의 값을 갖는다). Cross entropy loss를 개선한 버전들도 존재하는데, balanced cross entropy loss는 클래스간 샘플 데이터의 불균형을 해결하기 위해 희소 클래스일수록 높은 가중치를 주도록 x&amp;isin;Ci에 대해 L = -1/&amp;alpha;&lt;sub&gt;i&lt;/sub&gt; * log(pi)로 Loss를 계산한다 (&amp;alpha;&lt;sub&gt;i&lt;/sub&gt;: 전체 학습 데이터들 중에서 클래스 Ci에 속하는 데이터들의 비율). 그리고 hard example에 대해 좀더 높은 가중치를 주는 focal loss도 발표된 바 있다 (&amp;ldquo;Focal Loss for Dense Object Detection.&amp;rdquo; ICCV 2017).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그외 얼굴인식이나 image retrieval 분야에서는 ranking loss라는 것을 사용하는데, 입력 query 영상에 대해 정답 영상들(positives)과는 거리가 가깝게 하고 정답이 아닌 영상들(negatives)과는 거리가 멀게 하도록 Loss 함수를 설계한다. 예를 들어, 얼굴인식 응용에서 철수 얼굴 영상들을 p1, p2, ..., pn, 다른 사람들의 얼굴들은 q1, ..., qm라고 했을 때, pi들끼리는 거리를 최소화하고 pi와 qj 사이의 거리는 크게 하도록 Loss 함수를 정의한다. 이러한 응용에서는 query영상과 가장 가까운 DB 영상을 정답으로 찾는 것이 목적이기 때문에 계산된 거리값(distance) 자체보다는 그 거리값들의 상대적인 순서를 맞추는 것이 중요하다(pi들끼리의 거리가 pi와 qj 사이의 거리보다 작기만 하면 된다). 그래서 ranking loss라고 부르며 그 대표적인 예로는 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;triplet loss나 pairwise loss 등이 있다 (ranking loss도 굉장히 많은 변형들이 있다).&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 글에서는 개별 Loss 함수들을 설명하는 것이 목적이 아니기 때문에 기존의 Loss 함수들에 대해서는 간단히만 설명하였다. 중요한 것은 Loss 함수의 의미를 이해하고 활용하는 것이라 생각한다. 그리고 나아가서 자신의 문제에 맞는 Loss 함수를 직접 만들 수 있다면 더 좋을 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;by 다크 프로그래머&lt;/span&gt;&lt;/p&gt;</description>
      <category>기계학습</category>
      <category>Deep Learning</category>
      <category>Loss</category>
      <category>parameter estimation</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/186</guid>
      <comments>https://darkpgmr.tistory.com/186#entry186comment</comments>
      <pubDate>Wed, 15 Sep 2021 23:04:02 +0900</pubDate>
    </item>
    <item>
      <title>상관계수와 cross correlation</title>
      <link>https://darkpgmr.tistory.com/185</link>
      <description>&lt;script type=&quot;text/x-mathjax-config&quot;&gt;
MathJax.Hub.Config({
  tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}
});
&lt;/script&gt;
&lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-MML-AM_CHTML&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상관계수(correlation coefficient)는 통계학 쪽에서 사용되는 용어이고, cross correlation은 신호처리 분야의 용어이다. 그리고 NCC(normalized cross correlation)도 신호처리 분야 용어이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수식적으로 보면 상관계수 계산식과 NCC 계산식은 매우 유사하다 ($\bar{x}$: X의 평균, $\sigma_x$: X의 표준편차, $n$: 데이터 개수, $x_i$: i번째 관측 데이터의 X 속성 값, $f(x), g(x)$: x에서의 두 신호 값).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$상관계수(X, Y) = \frac{1}{n} \sum_{i=1}^{n}{\frac{(x_i - \bar{x})(y_i - \bar{y})}{\sigma_x \sigma_y}}\tag{1}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$NCC(f, g) = \frac{1}{n} \sum_{i=1}^{n}{\frac{f(x_i) g(x_i)}{\sigma_f \sigma_g}} \text{ or } \frac{1}{n} \sum_{i=1}^{n}{\frac{(f(x_i)-\bar{f})(g(x_i)-\bar{g})}{\sigma_f \sigma_g}}&amp;nbsp;\tag{2}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데, 두 식이 사용되는 목적이나 응용은 조금 다르다. 상관계수(correlation coefficient)는 두 속성 or 변량의 상호 연관성을 -1 ~ +1 사이의 값으로 수치화한 것이다. 예를 들어, 키와 몸무게의 관계, 수업 참여도와 성적의 관계, 환율과 금리의 관계 등 두 변인의 연관관계를 분석하는 것이 목적이다. 반면에, cross correlation이나 normalized cross correlation은 두 신호(음성신호, 영상신호 등)의 형태적 유사성을 단지 수치적으로 계산한 것이다. 여기서 'cross'라는 용어는 이동, 교차의 의미로서 두 신호를 서로 겹쳐서 correlation을 계산하기에 붙여진 이름이다. 그리고 두 신호가 겹쳐지는 시점은 한 신호를 shift시킴으로써 다양하게 조정될 수 있다. cross correlation이 사용되는 대표적인 예로 템플릿 매칭을 생각할 수 있다. 식은 거의 같지만 적용에 있어서 어감이나 느낌은 상당히 다름을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 상관계수와 cross correlation에 대해 최근 깨달은 것들은 정리한 글이다. 또한, 공분산(covariance), 분산(variance), correlation과 covariance 차이, auto correlation 등 관련 용어들도 같이 정리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 이 글을 쓰게 된 계기는 아내 때문이다. 아내가 요즘 '연구방법론'(객관적 연구를 위한 과학적 방법론)을 공부하면서 t-검정, 상관분석 등을 공부하고 있다. 그러면서 책을 봐도 무슨 말인지 모르겠다고 어려워한다. 그래서 이래 저래 설명해 주게 되었는데, 사실은 설명을 하면서 스스로 배우고 깨달은 것들이 더 많다. 막연하게만 알고 있던 covariance(공분산)의 의미를 다시 깨닫게 되었고 correlation과 covariance의 차이도 보다 확실히 알게 되었다. 그리고 상관계수나 공분산(covariance)에서 두 변량의 값이 서로 페어링(pairing)된 값이라는 점도 새로운 깨달음이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;공분산(covariance)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 분포의 평균, 분산, 표준편차는 통계에서 가장 기초적인 개념이다. 이들 중 분산(variance)은 측정된 데이터들이 평균을 중심으로 얼마나 모이고 흩어져 있는지를 나타내는 지표로서 &quot;(편차)&lt;sup&gt;2&lt;/sup&gt;의 평균&quot;으로 계산된다 (편차 = 데이터값 - 평균). 그리고 분산에 제곱근을 취하면 표준편차가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$Var(X) = \frac{1}{n} \sum_{i=1}^{n}{(x_i - \bar{x})^2}\tag{3}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$Std(X) = \sqrt{Var(X)}\tag{4}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때, 한가지 주의해야 할 점은 &lt;span style=&quot;color: #ef5369;&quot;&gt;평균, 분산, 표준편차는 데이터 분포에 대한 특성값&lt;/span&gt;이고, &lt;span style=&quot;color: #ef5369;&quot;&gt;편차는 데이터 각각에 대한 특성값&lt;/span&gt;이라는 점이다. 예를 들어, 전국 학생들의 키를 분석한다고 했을 때 측정된 학생들의 키의 평균은 얼마, 분산은 얼마라고 말할 수 있겠지만 데이터 각각(철수의 키, 영희의 키, ...)에 대해 평균, 분산, 표준편차가 얼마다고 말하는 것은 이치에 맞지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분산이 데이터의 흩어진 정도를 나타내는 값이라면 공분산(covariance)는 어떤 의미일까? 일단, 분산이 하나의 변수(e.g. 키)에 대해 계산되는 반면에 공분산(covariance)은 두 변량(e.g. 키, 몸무게)에 대해 계산된다. 관측된 데이터가 n개일 때, 두 변수 X, Y 사이의 공분산 Cov(X, Y)는 아래와 같이 계산된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$Cov(X, Y) = \frac{1}{n} \sum_{i=1}^{n}{(x_i - \bar{x})(y_i - \bar{y})}\tag{5}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;식 (3)과 (5)를 자세히 살펴보자. X의 분산은 자신의 편차에 편차를 곱한 평균이다. 반면에 X와 Y의 공분산은 X의 편차에 Y의 편차를 곱한 평균이다. X의 편차에 Y의 편차를 곱한다는 말의 의미는 무엇일까? 편차는 +, - 부호를 가진 값이기 때문에 두 편차를 곱한 결과는 +일 수도 있고 -일 수도 있다. 분산(variance)는 항상 양수(0 이상)이지만 공분산(covariance) 값은 +일 수도 -일 수도 있음에 주의하자. X와 Y의 공분산은 데이터들의 X 편차와 Y 편차의 부호가 서로 같을수록 큰 +값을 갖고 부호가 서로 다를수록 -로 큰 값을 갖는다. 그리고 X의 자체 분산과 Y의 자체 분산이 클수록 X, Y의 공분산의 절대값도 증가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공분산을 이해하기 위해서는 계산에 사용되는 &lt;span style=&quot;color: #ef5369;&quot;&gt;두 변량의 값이 서로 페어링(pairing)된 값&lt;/span&gt;이라는 것을 인지하는 것이 중요하다. 식 (5)에서 보면 $x_i$에는 $y_i$가 곱해지지 $y_j$가 곱해지지 않는다. 이것이 앞서 중요하게 깨달았다고 했던 두 변량이 서로 페어링(pairing)된다는 것과 관련된다. 페어링 관점에서 보면 식 (5)에서 $x_i$는 i번째 데이터의 X 속성값, $y_i$는 동일한 데이터의 Y 속성값으로 이해할 수 있다. 예를 들어 모집단=전국학생, X=키, Y=몸무게로 생각해 보자. 그리고, 측정된 표본집단에서 키와 몸무게의 공분산을 구하는 문제를 생각해 보자. 이 때, 페어링 관점에서 철수의 키에 대해서는 철수의 몸무게와 비교하고 영희의 키는 영희의 몸무게를 비교해야지 철수의 키와 영희의 몸무게를 비교해서는 안된다. 그리고 이러한 페어링 관계는 공분산 뿐만 아니라 상관계수 계산에도 동일하게 적용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 신호처리 분야에서는 2차원 평면에 점들이 있을 때 이 점들의 X좌표와 Y좌표의 공분산을 구하는 문제를 생각할 수 있다. 이 때, 각각의 점들을 데이터로 볼 수 있고 이 점들의 X좌표와 Y좌표는 서로 페어링된 값으로 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;correlation과 covariance&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 변수의 correlation은 두 변량의 곱의 평균으로 정의된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$Corr(X, Y) = \frac{1}{n} \sum_{i=1}^{n}{x_i y_i}\tag{6}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;correlation이란 단어 뜻으로 보면 '상호연관'이 떠오른다. 그런데, 곱해서 합하면 왜 상호연관이 측정되는지는 언뜻 이해가 어렵다. 그런데, X의 값의 범위가 한정되어 있고 Y의 값도 범위가 한정되어 있는 경우를 생각해 보면, 곱의 합은 X의 분포와 Y의 분포가 서로 일치할수록 증가한다 (모든 i에 대해 xi = yi일 때 최대).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;correlation은 두 데이터 분포의 유사도를 측정하는 도구로서 두 분포가 일치할 때 가장 높은 값을 갖는다. 그런데, 두 분포가 서로 위치적으로 떨어져 있는 경우에는 분포의 형태가 유사하더라도 낮은 correlation 값을 갖게 된다. 따라서, 두 분포의 형태 or 경향성의 유사도를 측정할 때에는 각 데이터 분포에서 평균을 뺀 후에 correlation을 계산하는 것이 효과적이다 (zero-normalized correlation).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\text{zero-normalized }Corr(X, Y) = \frac{1}{n} \sum_{i=1}^{n}{(x_i - \bar{x})(y_i - \bar{y})}\tag{7}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데, zero-normalized correlation 식을 보면 식 (5)의 covariance 식과 동일함을 알 수 있다. 즉, 바꾸어 말하면 covariance는 zero-normalized correlation으로 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;362&quot; data-filename=&quot;corr_cov.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8P90p/btreB9hZbsl/n19NgroQLaJuTagaWNQn11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8P90p/btreB9hZbsl/n19NgroQLaJuTagaWNQn11/img.png&quot; data-alt=&quot;그림1. 두 분포의 correlation과 covariance&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8P90p/btreB9hZbsl/n19NgroQLaJuTagaWNQn11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8P90p%2FbtreB9hZbsl%2Fn19NgroQLaJuTagaWNQn11%2Fimg.png&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;362&quot; data-filename=&quot;corr_cov.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1. 두 분포의 correlation과 covariance&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 분야에 따라서는 correlation과 covariance의 용어가 혼용되는 경우가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;상관계수와 covariance&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상관계수(correlation coefficient)는 통계학 분야에서 나오는 용어이다. 흔히, 통계라고 하면 수학 쪽으로만 생각하기 쉬운데 통계를 '사례를 모으고 분석해서 현상을 이해하는 연구 방법론'으로 본다면 통계는 경제학, 심리학, 사회과학, 의학 등 전 분야에 걸친 방법론이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상관계수(correlation coefficient)는 두 변량 X, Y 사이의 correlation 정도를 -1 ~ +1 사이의 값으로 수치화한 척도이다 ($\bar{x}$: X의 평균, $\sigma_x$: X의 표준편차, $n$: 데이터 개수, $x_i$: i번째 데이터의 X 속성 값, $y_i$: i번째 데이터의 Y 속성 값)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$상관계수(X, Y) = \gamma =&amp;nbsp;\frac{1}{n} \sum_{i=1}^{n}{\frac{(x_i - \bar{x})(y_i - \bar{y})}{\sigma_x \sigma_y}}\tag{8}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 상관계수 식을 잘 보면 식 (7)의 공분산 식과 연관이 큼을 알 수 있다. 앞서, 공분산은 zero-normalized correlation으로 볼 수 있다고 했다. 그런데, zero-normalization을 했더라도 두 분포가 가지고 있는 값의 크기의 스케일(scale)에 따라서 correlation 값이 달라질 수 있다. 따라서 순수하게 상관도만 분석하기 위해서는 각 분포의 스케일을 1로 정규화한 후에 correlation을 계산할 필요가 있으며 이렇게 정규화된 두 분포의 상관도를 계산한 것이 상관계수(correlation coefficient)이다. 여기서 scale이란 값의 단위 또는 크기의 범위를 말한다. 예를 들어, 한국 중학생들의 키와 몸무게의 상관도를 분석하기 위해 키는 미터(meter) 단위로 몸무게는 킬로그램(kg) 단위로 측정했다고 하자. 그러면 평균을 보상한 키는 -0.3 ~ 0.3 m 사이의 값을, 몸무게는 -20 ~ 20 kg 사이의 값을 가질 것이다. 이렇게 값의 단위가 서로 다른 두 변량을 그대로 correlation을 취하면 그 결과는 예측이 힘들며 분석도 어렵게 된다. 하지만, 각 변량을 표준편차로 나누어 정규화한 후에 correlation을 계산하면 그 결과는 항상 -1 ~ +1 사이의 값을 갖게 된다 (Why? &lt;a href=&quot;https://en.wikipedia.org/wiki/Cauchy-Schwarz_inequality&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cauchy-Schwarz inequality&lt;/a&gt;).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 상관계수(correlation coefficient)는 평균과 스케일을 보상한(평균은 0으로, 표준편차는 1이 되도록 정규화한) 후 계산한 두 변량의 correlation이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상관계수 계산값 r은 항상 -1 ~ +1 사이의 값을 가지는데, r&amp;gt;0이면 양의 상관관계(X가 클수록 Y도 증가), r&amp;lt;0이면 음의 상관관계(X가 클수록 Y는 작은 값), r = 0이면 X, Y가 서로 아무 관계가 없다는 것을 의미한다. 그리고 상관계수를 계산할 때 두 변량이 항상 페어링(pairing)된다는 점도 잊어서는 안된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1367&quot; data-origin-height=&quot;357&quot; data-filename=&quot;correlation_coefficient.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baOeMk/btrduT8EmEi/W0908uTeUa0Gmf0AGLJmx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baOeMk/btrduT8EmEi/W0908uTeUa0Gmf0AGLJmx1/img.png&quot; data-alt=&quot;그림2. 상관계수의 해석&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baOeMk/btrduT8EmEi/W0908uTeUa0Gmf0AGLJmx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaOeMk%2FbtrduT8EmEi%2FW0908uTeUa0Gmf0AGLJmx1%2Fimg.png&quot; data-origin-width=&quot;1367&quot; data-origin-height=&quot;357&quot; data-filename=&quot;correlation_coefficient.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2. 상관계수의 해석&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ &lt;b&gt;상관계수의 해석&lt;/b&gt;: (댓글을 읽다보니 상관계수의 의미에 대해 오해가 있을 수 있겠다 싶어서 내용을 덧붙입니다) 상관계수가 높다는 것은 두 대상의 경향성이 유사하다는 것이지 값이 같다는 의미는 아니다. 예를 들어, 예측값과 관측값의 상관계수를 계산한다고 했을 때, 예측된 값이 40, 50, 60일 때 실제 관측된 값이 90, 100, 110이라고 해 보자. 이 경우 예측값과 실제값은 상당한 오차가 있다. 하지만 상관계수를 계산해 보면 매우 높은 값을 갖는다. 상관계수는 평균과 스케일(표준편차)을 정규화한 후에 계산하기 때문이다. 따라서, 응용에 따라 경향성 뿐만 아니라 값 자체도 유사해야 한다면 식 (6)처럼 평균, 표준편차 차이를 제거하지 말고 원본 값에 대해 correlation을 계산해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;cross correlation과 correlation&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 신호처리 분야로 돌아와 보자. 사회과학, 심리상담학, 경제학 등에서의 correlation 분석은 두 변인 사이의 상호 연관도를 분석하기 위한 것으로서 그 데이터 값들이 서로 페어링(pairing)된 것이 특징이다. 반면에, 신호처리 분야에서는 단지 두 신호가 얼마나 형태적으로 유사한지를 수치적으로 계산한 것이다. 그리고 두 신호를 서로 겹쳐서 계산하기 때문에 cross correlation이라 부르며 두 신호를 어떻게 겹치는지(displacement)에 따라서 pairing 관계가 달라진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연속된 두 신호 f(t), g(t)가 있을 때 cross correlation은 일반적으로 다음과 같이 정의된다 ($\tau$는 displacement 파라미터).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$f \star g(\tau) = \int_{-\infty }^{\infty } f(t) g(t+\tau) dt \tag{9}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이를 이미지 프로세싱에 적용하면 영상신호 f(x,y)와 템플릿 t(x,y)에 대해 cross correlation을 아래와 같이 계산할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\frac{1}{n} \sum_{x,y} f(x,y)t(x,y) \tag{10}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만일 영상 밝기 차이를 보상한 후에 correlation을 구하고 싶다면 아래와 같이 계산할 수 있다 (zero-normalized cross correlation).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\frac{1}{n} \sum_{x,y} (f(x,y) - \bar{f})(t(x,y) - \bar{t}) \tag{11}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 아래와 같이 각각의 신호를 표준편차로 나누어 스케일 차이를 보상한 normalized cross correlation을 구할 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$NCC = \frac{1}{n} \sum_{x, y} \frac{f(x, y)t(x, y)}{\sigma_f \sigma_t} \tag{12}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 평균과 스케일을 모두 보상한 normalized cross covariance를 구할 수도 있다 (계산 결과는 -1 ~ +1 사이의 값을 갖는다).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\frac{1}{n} \sum_{x, y} \frac{(f(x, y) - \bar{f})(t(x, y) - \bar{t})}{\sigma_f \sigma_t} \tag{13}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 가지 하고 싶은 말은 용어나 수식에 너무 집착하지 말자는 것이다. 정말 중요한 것은 그 '의미'이다. NCC 식은 식 (12)가 맞겠지만 식 (13)을 NCC로 사용해도 큰 문제는 없다. 의미만 알면 자신이 원하는 목적에 맞게 식을 골라 쓰거나 변형해서 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 신호처리 분야에 auto correlation이라는 게 있다. auto correlation은 서로 다른 두 신호가 아니라 자신과 자신을 correlation하는 것을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$f \star f(\tau) = \int_{-\infty }^{\infty } f(t) f(t+\tau) dt \tag{14}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;by 다크 프로그래머&lt;/p&gt;</description>
      <category>수학 이야기</category>
      <category>correlation</category>
      <category>covariance</category>
      <category>상관계수</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/185</guid>
      <comments>https://darkpgmr.tistory.com/185#entry185comment</comments>
      <pubDate>Sun, 12 Sep 2021 16:33:29 +0900</pubDate>
    </item>
    <item>
      <title>OpenCV + CUDA 직접 빌드하기 (Windows/Linux 종합)</title>
      <link>https://darkpgmr.tistory.com/184</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;최근에 opencv에 있는 dnn을 한번 써보려고 직접 소스를 받아서 빌드(build)해 보았다. 역시나 엄청난 삽질의 연속이고 할 때마다 이것 저것 해결책을 검색하느라 많은 시간을 소모한다 (삽질은 누구나 한다..).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그동안 opencv 빌드를 한두 번 해본 것이 아닌데도 매번 이렇다. 이게 다 앉았다 돌아서면 잊어버릴 나이인데도 기록을 잘 하지 않았기 때문이다. 이번 기회에 opencv 빌드에 필요한 내용들을 다시 한번 정리해 둔다. 먼저, windows 빌드부터 적고 linux 빌드는 끝에서 잠깐 설명한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Windows에서 OpenCV+CUDA 빌드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;준비사항 (Requirements)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;opencv: &lt;a href=&quot;https://github.com/opencv/opencv&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/opencv/opencv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;opencv contrib: &lt;a href=&quot;https://github.com/opencv/opencv_contrib&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/opencv/opencv_contrib&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CMake: &lt;a href=&quot;https://cmake.org/download/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://cmake.org/download/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GPU: &lt;a href=&quot;https://en.wikipedia.org/wiki/CUDA#GPUs_supported&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://en.wikipedia.org/wiki/CUDA#GPUs_supported&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CUDA: &lt;a href=&quot;https://developer.nvidia.com/cuda-toolkit-archive&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.nvidia.com/cuda-toolkit-archive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;cuDNN: &lt;a href=&quot;https://developer.nvidia.com/rdp/cudnn-archive&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.nvidia.com/rdp/cudnn-archive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;VTK: &lt;/span&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://vtk.org/download/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://vtk.org/download/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;opencv git에는 주요 핵심 모듈들만 들어있기 때문에 opencv의 모든 기능을 사용하기 위해서는 opencv contrib도 같이 다운로드 받는다. cmake는 가급적 가장 최신 버전을 사용하는게 좋고, CUDA는 자신의 그래픽카드(GPU)를 지원하는 버전으로 다운로드 한다(&lt;a href=&quot;https://en.wikipedia.org/wiki/CUDA#GPUs_supported&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://en.wikipedia.org/wiki/CUDA#GPUs_supported&lt;/a&gt;에서 확인). cuDNN은 사용할 CUDA 버전에 맞는 것을 다운로드한다. VTK는 opencv의 viz 기능을 이용할 경우에만 다운로드 받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;CUDA와 cuDNN 설치&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CUDA는 설치 파일만 실행하면 알아서 설치된다. 단, 중간에 설치 옵션을 물어보는데 나처럼 성질이 까칠한 사람은 빠른설치(권장) 옵션이 아닌 사용자 정의 옵션을 선택할 것이다. 이 때, 다른 것은 다 제외시키더라도 development, runtime, visual studio integration는 꼭 선택해 준다. 그리고 driver도 같이 선택해 주는게 좋겠다. (다른 것들은 설치 안해도 관계없다)&lt;/li&gt;
&lt;li&gt;cuDNN은 설치파일이 아니고 단순 압축파일이다. 압축을 풀어서 CUDA가 설치된 폴더에 파일들만 복사해 주면 된다. cuDNN 압축을 풀면 bin, include, lib\x64 3개의 폴더가 나온다. 만일 CUDA가 설치된 폴더 위치가 CUDA_ROOT = &quot;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.3&quot;라 하면 bin에 있는 파일들은 CUDA_ROOT\bin 폴더에, include에 있는 파일들은 CUDA_ROOT\include 폴더에, 그리고 lib\x64에 있는 파일들은 CUDA_ROOT\lib\x64 폴더에 복사해 준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;VTK 빌드&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;opencv를 빌드할 때 가장 피곤한 부분이 VTK를 빌드하는 것이다. VTK는 opencv의 viz를 사용할 때만 필요하기 때문에 viz를 사용하지 않는다면 바로 다음의 OpenCV 빌드로 넘어가면 된다. 개인적으로는 어쩔 수 없이 viz를 사용해야 하는데 opencv를 빌드할 때마다 VTK 쪽에서 문제를 일으킨다. 그리고 VTK는 빌드(컴파일+링크) 시간도 오래 걸린다. 빌드는 CMake(사용법은 &lt;a href=&quot;https://darkpgmr.tistory.com/102&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://darkpgmr.tistory.com/102&lt;/a&gt; 참조)로 하면 되는데, VTK 자체는 별 문제없이 빌드되지만 항상 opencv와 연결할 때 문제가 생긴다. CMake로 프로젝트를 생성할 때 BUILD_SHARED_LIBS를 제외하고 대부분 기본설정을 사용한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BUILD_SHARED_LIBS = OFF (체크 해제)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;opencv에 static으로 링크할 생각이므로 BUILD_SHARED_LIBS는 OFF(체크해제)로 설정한다. 만일, 이 옵션을 ON시키면 수많은(약 120개) dll 파일들이 생성되고, opencv를 사용할 때 이 dll 파일들을 항상 같이 가지고 다녀야 하는 불상사가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;OpenCV 빌드 (main + contrib을 하나의 world 파일로)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목표는 opencv의 모든 기능(contrib 포함)을 하나의 파일(opencv_worldxxx.dll, lib)로 빌드하는 것이다. 그 방법은 비교적 간단하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;opencv_contrib\modules\ 밑에 있는 모든 내용을 opencv\modules\로 이동시킨다. &lt;span style=&quot;color: #ee2323;&quot;&gt;--&amp;gt; 요즘은 이렇게 안해도 OPENCV_EXTRA_MODULES_PATH 만 설정하면 알아서 하나로 합쳐주는지는 잘 모르겠다..&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;opencv 빌드용 폴더(e.g. opencv_build)를 하나 만들고 cmake를 이용해서 필요한 설정을 한 후 프로젝트를 생성한다.&lt;/li&gt;
&lt;li&gt;opencv_build\OpenCV.sln을 열어서 ALL_BUILD 프로젝트를 빌드한다.&lt;/li&gt;
&lt;li&gt;마지막으로 INSTALL 프로젝트를 빌드한다 (ALL_BUILD로 생성된 include, lib, dll 파일들을 한 곳에 모아주는 역할). 이 때, build만 하고 절대로 rebuild를 하면 안된다. 자신도 모르게 전체 프로젝트를 rebuild하는 불상사가 발생할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cmake gui에서 빌드 설정은 개인 취향껏 하면 되지만, 중요한 것들을 정리해 보면 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BUILD_SHARED_LIBS = ON (static으로 빌드할 것이면 OFF)&lt;/li&gt;
&lt;li&gt;BUILD_WITH_STATIC_CRT = OFF&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;BUILD_opencv_world = ON&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;OPENCV_ENABLE_NONFREE = ON&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;OPENCV_EXTRA_MODULES_PATH = &lt;/span&gt;(contrib + main을 하나로 합쳤기 때문에 필요가 없음. 공백으로 그대로 둠)&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;CPU_BASELINE = AVX&lt;/span&gt; (&lt;a href=&quot;https://www.intel.co.kr/content/www/kr/ko/support/articles/000005779/processors.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.intel.co.kr/content/www/kr/ko/support/articles/000005779/processors.html&lt;/a&gt;&amp;nbsp;참조)&lt;/li&gt;
&lt;li&gt;CPU_DISPATCH =&amp;nbsp; (공백으로 둠)&lt;/li&gt;
&lt;li&gt;OPENCV_DNN_CUDA = ON&lt;/li&gt;
&lt;li&gt;WITH_CUDA = ON&lt;/li&gt;
&lt;li&gt;WITH_CUDNN = ON&lt;/li&gt;
&lt;li&gt;WITH_CUBLAS = ON&lt;/li&gt;
&lt;li&gt;WITH_CUFFT = ON&lt;/li&gt;
&lt;li&gt;CUDA_FAST_MATH = ON&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;CUDA_ARCH_BIN&lt;/span&gt; = 6.1;7.5;8.6 (&lt;a href=&quot;https://en.wikipedia.org/wiki/CUDA#GPUs_supported&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://en.wikipedia.org/wiki/CUDA#GPUs_supported&lt;/a&gt;에서 GPU별 compute capability 숫자 참조)&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기타 개인적으로 설정하는 옵션들 (나머지는 기본값 사용)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BUILD_PACKAGE = OFF&lt;/li&gt;
&lt;li&gt;BUILD_PERF_TESTS = OFF&lt;/li&gt;
&lt;li&gt;BUILD_TESTS = OFF&lt;/li&gt;
&lt;li&gt;BUILD_opencv_apps = OFF&lt;/li&gt;
&lt;li&gt;VTK_DIR = &quot;...&quot; (VTK의 빌드 폴더 root)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ CPU_BASELINE&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;opencv cmake 옵션들 중 CPU_BASELINE은 사용할 CPU 명령어 셋을 선택하는 것으로서 SSE1 &amp;lt; SSE2 &amp;lt; SSE3 &amp;lt; SSE4 &amp;lt; AVX &amp;lt; AVX2 &amp;lt; AVX-512 순으로 향상된(빠른) 명령어 셋을 의미한다. 명령어 셋은 컴퓨터(CPU)에서 지원을 해야만 사용 가능하기 때문에 빌드한 opencv를 여러 컴퓨터에서 사용하고자 한다면 낮은 버전(SSE4 등)을 CPU_BASELINE으로 설정하고, 자신만 사용할 것이라면 자신 컴퓨터에서 지원하는 최대 명령어 셋을 CPU_BASELINE으로 설정하면 된다. CPU 버전 별 지원 명령어 셋은 &lt;a href=&quot;https://en.wikipedia.org/wiki/Advanced_Vector_Extensions&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://en.wikipedia.org/wiki/Advanced_Vector_Extensions&lt;/a&gt;를 참조한다 (인텔의 경우 &lt;a href=&quot;https://www.intel.co.kr/content/www/kr/ko/support/articles/000005779/processors.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.intel.co.kr/content/www/kr/ko/support/articles/000005779/processors.html&lt;/a&gt;). 요즘 대부분의 PC는 AVX2까지는 지원하기 때문에 공용 빌드의 경우에는 AVX나 AVX2 정도로 설정하면 적당할 듯 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ CUDA_ARCH_BIN&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CUDA_ARCH_BIN에는 사용할 그래픽카드(GPU)의 compute capability 값을 적어준다. GPU별 compute capability 값은 &lt;a href=&quot;https://en.wikipedia.org/wiki/CUDA#GPUs_supported&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://en.wikipedia.org/wiki/CUDA#GPUs_supported&lt;/a&gt;를 참조한다 (예를 들어, RTX 2080은 7.5, RTX 3080은 8.6). &amp;nbsp;빌드한 opencv를 여러 컴퓨터나 GPU에서 사용할 예정이라면 지원할 GPU compute capability 값을 모두 적어주면 된다. 단, 여러 값을 적을수록 빌드 시간은 엄청나게 늘어나기 때문에 필요한 정도만 적는 것이 좋다 (지금 몇 시간째 빌드 중인데 끝날 기미가 안보인다..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 참고 사항 (빌드시간 단축)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WITH_CUDA, OPENCV_DNN_CUDA을 활성화시키면 opencv 빌드시간이 정말 오래 걸린다 (몇 시간씩). 따라서, CUDA 쪽을 사용할 것이 아니면 이 옵션은 OFF시키고 빌드하는 것이 좋다. 하지만, CUDA 쪽을 사용해야만 하는 경우 빌드시간을 조금이나마 줄이기 위해 참고할 만한 내용은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CUDA_ARCH_BIN 개수를 최소화&lt;/li&gt;
&lt;li&gt;visual studio에서 Tools/Options/Projects and Solutions/Build and Run/maximum number of parallel project builds 값을 자신 컴퓨터 CPU의 논리 프로세서 수로 설정 (작업관리자 - 성능 탭에서 확인 가능)&lt;/li&gt;
&lt;li&gt;visual studio에서 debug 버전과 release 버전을 하나씩 빌드 (Build/Batch Build... 기능을 이용해서 debug, release를 같이 빌드할 경우에는 빌드 시간이 증가하는 것으로 보임).&lt;/li&gt;
&lt;li&gt;디스크 입출력 속도가 중요하므로 SSD 등에서 빌드 (내 경우는 아예 전용 파티션을 하나 생성해서 사용함)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;OpenCV + VTK 문제 해결 (OpenCV 4.5.2 기준)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VTK 때문에 opencv와 vtk를 몇 번을 다시 빌드하고 지우고 했는지 모르겠다. 현재 VTK 홈페이지에서는 VTK 9.0.1, 8.2.0, 7.1.1의 3가지 버전을 다운로드 받을 수 있으며 각 버전별 문제 및 해결 방법은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;[VTK 9.0.1 + OpenCV]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;opencv 4.5.2의 경우 cmake 설정창에서 VTK_DIR을 VTK 빌드 폴더로 설정하고 configure를 실행하면 TARGET opencv_viz를 찾을 수 없다는 CMake Error가 발생한다(get_property could not find TARGET opencv_viz). 단, 이 에러는 BUILD_opencv_world = ON 설정시에만 나타나고, OFF시에는 발생하지 않는다. 즉, opencv_viz를 개별 dll로 빌드할 경우에는 문제가 발생하지 않는다. BUILD_opencv_world = ON을 유지하고 싶은 경우에 한 가지 해결책은 opencv_world에서 viz만 제외시키는 것이다 (viz를 제외한 다른 모든 모듈들은 opencv_world로 통합).&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;부분적 해결책: &lt;a href=&quot;https://github.com/opencv/opencv/blob/master/cmake/OpenCVModule.cmake#L848&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/opencv/opencv/blob/master/cmake/OpenCVModule.cmake#L848&lt;/a&gt;을 아래와 같이 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1625202374959&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(BUILD_opencv_world AND OPENCV_MODULE_${the_module}_IS_PART_OF_WORLD AND NOT &quot;${the_module}&quot; STREQUAL &quot;opencv_viz&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;참고: &lt;a href=&quot;https://github.com/opencv/opencv/issues/19386&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/opencv/opencv/issues/19386&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;[VTK 8.2.0 + OpenCV]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;opencv의 cmake 설정창에서 VTK_DIR을 VTK 빌드 폴더로 설정한 후 configure를 실행하면 &quot;VTK is not found. Please set -DVTK_DIR in CMake to VTK build directory, or to VTK install subdirectory with VTKConfig.cmake file&quot;라는 에러메시지와 함께 VTK 설정이 실패한다. 분명히 VTK 빌드 폴더를 제대로 지정해 주었음에도 이 에러는 계속 발생한다. cmake에서 VTK를 발견하지 못했다는 것인데, 인터넷 검색으로는 도무지 해결이 안되어서 결국 cmake 파일들의 내용을 모두 살펴보고 해결책을 찾았다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해결책: opencv 소스에서 opencv/cmake/OpenCVDetectVTK.cmake파일의 L1~L15를 아래와 같이 주석처리 (단, 9.x.x 대의 VTK 버전을 사용할 경우에는 주석 처리하면 안됨)&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;#&amp;nbsp;VTK&amp;nbsp;9.0&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;#if(NOT VTK_FOUND)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;#&amp;nbsp; find_package(VTK 9 QUIET NAMES vtk COMPONENTS&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;#&amp;nbsp; &amp;nbsp; FiltersExtraction&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;#&amp;nbsp; &amp;nbsp; FiltersSources&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;#&amp;nbsp; &amp;nbsp; FiltersTexture&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;#&amp;nbsp; &amp;nbsp; IOExport&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;#&amp;nbsp; &amp;nbsp; IOGeometry&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;#&amp;nbsp; &amp;nbsp; IOPLY&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;#&amp;nbsp; &amp;nbsp; InteractionStyle&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;#&amp;nbsp; &amp;nbsp; RenderingCore&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;#&amp;nbsp; &amp;nbsp; RenderingLOD&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;#&amp;nbsp; &amp;nbsp; RenderingOpenGL2&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;#&amp;nbsp; &amp;nbsp; NO_MODULE)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;#endif()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;# VTK 6.x components&lt;br /&gt;if(NOT&amp;nbsp;VTK_FOUND)&lt;br /&gt;&amp;nbsp;&amp;nbsp;find_package(VTK&amp;nbsp;QUIET&amp;nbsp;COMPONENTS&amp;nbsp;vtkInteractionStyle&amp;nbsp;vtkRenderingLOD&amp;nbsp;vtkIOPLY&amp;nbsp;vtkFiltersTexture&amp;nbsp;vtkRenderingFreeType&amp;nbsp;vtkIOExport&amp;nbsp;NO_MODULE)&lt;br /&gt;&amp;nbsp;&amp;nbsp;IF(VTK_FOUND)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IF(VTK_RENDERING_BACKEND)&amp;nbsp;#in&amp;nbsp;vtk&amp;nbsp;7,&amp;nbsp;the&amp;nbsp;rendering&amp;nbsp;backend&amp;nbsp;is&amp;nbsp;exported&amp;nbsp;as&amp;nbsp;a&amp;nbsp;var.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;find_package(VTK&amp;nbsp;QUIET&amp;nbsp;COMPONENTS&amp;nbsp;vtkRendering${VTK_RENDERING_BACKEND}&amp;nbsp;vtkInteractionStyle&amp;nbsp;vtkRenderingLOD&amp;nbsp;vtkIOPLY&amp;nbsp;vtkFiltersTexture&amp;nbsp;vtkRenderingFreeType&amp;nbsp;vtkIOExport&amp;nbsp;vtkIOGeometry&amp;nbsp;NO_MODULE)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ELSE(VTK_RENDERING_BACKEND)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;find_package(VTK&amp;nbsp;QUIET&amp;nbsp;COMPONENTS&amp;nbsp;vtkRenderingOpenGL&amp;nbsp;vtkInteractionStyle&amp;nbsp;vtkRenderingLOD&amp;nbsp;vtkIOPLY&amp;nbsp;vtkFiltersTexture&amp;nbsp;vtkRenderingFreeType&amp;nbsp;vtkIOExport&amp;nbsp;NO_MODULE)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ENDIF(VTK_RENDERING_BACKEND)&lt;br /&gt;&amp;nbsp;&amp;nbsp;ENDIF(VTK_FOUND)&lt;br /&gt;endif()&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원인: opencv/cmake/OpenCVDetectVTK.cmake의 내용은 먼저 VTK 9.x.x를 찾고 실패하면 하위 버전 순서로 VTK를 찾는 것인데, VTK 9.x.x에 실패하면 사용자가 설정한 VTK_DIR 환경변수가 초기화가 되어서 이후 하위 버전 탐색이 정상 실행되지 않는 것으로 추측됨&lt;/li&gt;
&lt;li&gt;VTK 7.1.1 버전에서도 동일한 문제가 발생하며 해결책도 동일함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Linux에서 OpenCV + CUDA 빌드 (한글 지원 포함)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 설명한 내용들은 윈도우즈 빌드를 대상으로 하지만, 일부 내용들(cmake 설정 등)은 linux 빌드에도 동일하게 적용된다. 리눅스에서의 빌드는 shell script 형태로 간단하게 설명한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;CUDA, cuDNN 설치&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 여러 버전의 CUDA 라이브러리를 시스템에 같이 설치하는 것을 예로 한다 (필요할 때마다 버전을 바꿔가면서 사용할 수 있도록)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 시스템 그래픽 드라이버 설치 (최신버전으로 설치됨)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$ sudo apt update&lt;/li&gt;
&lt;li&gt;$&amp;nbsp;sudo&amp;nbsp;apt&amp;nbsp;install&amp;nbsp;cuda-drivers&lt;/li&gt;
&lt;li&gt;설치후&amp;nbsp;반드시&amp;nbsp;시스템&amp;nbsp;재부팅&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. CUDA 라이브러리 설치 (e.g. 10.2, 11.3를 같이 설치하는 경우)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$ sudo apt update&lt;/li&gt;
&lt;li&gt;$ sudo apt install cuda-toolkit-10-2&lt;/li&gt;
&lt;li&gt;$ sudo apt install cuda-toolkit-11-3&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. cuDNN 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, CUDA 버전에 맞는 cuDNN 파일들을 다운로드한다 (&lt;a href=&quot;https://developer.nvidia.com/rdp/cudnn-archive&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.nvidia.com/rdp/cudnn-archive&lt;/a&gt;)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;cudnn-10.2-linux-x64-v8.2.0.53.tgz&lt;/li&gt;
&lt;li&gt;cudnn-11.3-linux-x64-v8.2.0.53.tgz&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 설치 script 파일을 생성한 후 실행 (e.g. cudnn_install.sh)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$ chmod a+x cudnn_install.sh&lt;/li&gt;
&lt;li&gt;$ ./cudnn_install.sh&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;#cudnn_install.sh&lt;br /&gt;tar -xzvf cudnn-10.2-linux-x64-v8.2.0.53.tgz&lt;br /&gt;sudo cp cuda/include/cudnn*.h /usr/local/cuda-10.2/include &lt;br /&gt;sudo cp -P cuda/lib64/libcudnn* /usr/local/cuda-10.2/lib64 &lt;br /&gt;sudo chmod a+r /usr/local/cuda-10.2/include/cudnn*.h /usr/local/cuda-10.2/lib64/libcudnn* &lt;br /&gt;rm&amp;nbsp;-rf&amp;nbsp;cuda&lt;br /&gt;&lt;br /&gt;tar -xzvf cudnn-11.3-linux-x64-v8.2.0.53.tgz&lt;br /&gt;sudo cp cuda/include/cudnn*.h /usr/local/cuda-11.3/include&lt;br /&gt;sudo cp -P cuda/lib64/libcudnn* /usr/local/cuda-11.3/lib64&lt;br /&gt;sudo chmod a+r /usr/local/cuda-11.3/include/cudnn*.h /usr/local/cuda-11.3/lib64/libcudnn*&lt;br /&gt;rm -rf cuda&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템의 default CUDA 설정 (10.2를 default로 설정할 경우)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$&amp;nbsp;cd&amp;nbsp;/usr/local&lt;/li&gt;
&lt;li&gt;$ sudo rm cuda&lt;/li&gt;
&lt;li&gt;$ sudo ln -s cuda-10.2 cuda&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 환경변수 등록 (CUDA 라이브러리 탐색 순서 설정)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$&amp;nbsp;sudo&amp;nbsp;vi&amp;nbsp;/etc/profile.d/cuda.sh&amp;nbsp;#&amp;nbsp;cuda.sh&amp;nbsp;파일&amp;nbsp;생성&lt;/li&gt;
&lt;li&gt;아래 내용으로 해당 파일 내용을 생성 후 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda-10.2/lib64:/usr/local/cuda-11.3/lib64&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;OpenCV + CUDA 빌드&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CUDA가 준비되면 이제 opencv를 빌드해 보자. Linux에서의 opencv 빌드는 shell script 파일 형식으로 설명한다. 일부 내용은 자신에 맞게 수정한다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;# 참고한 사이트&lt;br /&gt;#&amp;nbsp;1.&amp;nbsp;&lt;a href=&quot;https://linuxize.com/post/how-to-install-opencv-on-ubuntu-18-04/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://linuxize.com/post/how-to-install-opencv-on-ubuntu-18-04/&lt;/a&gt; &lt;br /&gt;#&amp;nbsp;2.&amp;nbsp;&lt;a href=&quot;https://webnautes.tistory.com/1030&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://webnautes.tistory.com/1030&lt;/a&gt; &lt;br /&gt;#&amp;nbsp;3.&amp;nbsp;&lt;a href=&quot;https://kkokkal.tistory.com/1325&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://kkokkal.tistory.com/1325&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;# 과거 설치된 opencv 버전이 있을 경우 제거&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;sudo&amp;nbsp;apt&amp;nbsp;purge&amp;nbsp;libopencv*&amp;nbsp;python-opencv&lt;/span&gt; &lt;br /&gt;sudo apt autoremove &lt;span style=&quot;color: #ee2323;&quot;&gt;# 위험할 수 있으니 내용을 잘 확인하고 실행 (opencv 관련만 삭제하는지..)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;update&amp;nbsp;ubuntu&amp;nbsp;system&amp;nbsp;to&amp;nbsp;latest &lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;sudo&amp;nbsp;apt&amp;nbsp;update&lt;/span&gt; &lt;br /&gt;#sudo apt upgrade # 시스템 전체를 업그레이드하는 것임 (&lt;span style=&quot;color: #ee2323;&quot;&gt;필요한 경우만 실행&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;# install relevant packages &lt;span style=&quot;color: #006dd7;&quot;&gt;(libfreetype, libharfbuzz는 opencv에서 한글지원 위해서 설치)&lt;/span&gt;&lt;br /&gt;sudo&amp;nbsp;apt&amp;nbsp;install&amp;nbsp;build-essential&amp;nbsp;cmake&amp;nbsp;git&amp;nbsp;pkg-config&amp;nbsp;libqt4-dev&amp;nbsp;\ &lt;br /&gt;libavcodec-dev&amp;nbsp;libavformat-dev&amp;nbsp;libswscale-dev&amp;nbsp;libv4l-dev&amp;nbsp;v4l-utils&amp;nbsp;\ &lt;br /&gt;libxvidcore-dev&amp;nbsp;libx264-dev&amp;nbsp;libxine2-dev&amp;nbsp;libjpeg-dev&amp;nbsp;libpng-dev&amp;nbsp;libtiff-dev&amp;nbsp;libjasper-dev&amp;nbsp;\ &lt;br /&gt;gfortran&amp;nbsp;openexr&amp;nbsp;libatlas-base-dev&amp;nbsp;python3-dev&amp;nbsp;python3-numpy&amp;nbsp;\ &lt;br /&gt;libgl1-mesa-dri&amp;nbsp;libqt4-opengl-dev&amp;nbsp;libeigen3-dev&amp;nbsp;\ &lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;libfreetype6-dev libharfbuzz-dev&amp;nbsp; &amp;nbsp; &amp;nbsp; # 한글 지원을 위해 필요&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;download&amp;nbsp;opencv &lt;br /&gt;git&amp;nbsp;clone&amp;nbsp;https://github.com/opencv/opencv.git &lt;br /&gt;git&amp;nbsp;clone&amp;nbsp;https://github.com/opencv/opencv_contrib.git&lt;br /&gt;&lt;br /&gt;# cmake setup (설정은 자신이 원하는대로 수정하거나 추가, 삭제)&lt;br /&gt;cd&amp;nbsp;./opencv &lt;br /&gt;mkdir&amp;nbsp;build&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;cd&amp;nbsp;build &lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;cmake&amp;nbsp;-D&amp;nbsp;CMAKE_BUILD_TYPE=RELEASE&amp;nbsp;\&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;-D&amp;nbsp;CMAKE_INSTALL_PREFIX=/usr/local&amp;nbsp;\&lt;/span&gt; &lt;br /&gt;-D&amp;nbsp;WITH_TBB=OFF&amp;nbsp;\ &lt;br /&gt;-D&amp;nbsp;WITH_IPP=OFF&amp;nbsp;\ &lt;br /&gt;-D&amp;nbsp;WITH_1394=OFF&amp;nbsp;\ &lt;br /&gt;-D&amp;nbsp;BUILD_WITH_DEBUG_INFO=OFF&amp;nbsp;\ &lt;br /&gt;-D&amp;nbsp;BUILD_DOCS=OFF&amp;nbsp;\ &lt;br /&gt;-D&amp;nbsp;BUILD_EXAMPLES=OFF&amp;nbsp;\ &lt;br /&gt;-D&amp;nbsp;BUILD_TESTS=OFF&amp;nbsp;\ &lt;br /&gt;-D&amp;nbsp;BUILD_PERF_TESTS=OFF&amp;nbsp;\&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;-D&amp;nbsp;WITH_CUDA=ON&amp;nbsp;\ &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;-D&amp;nbsp;WITH_CUDNN=ON&amp;nbsp;\ &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;-D&amp;nbsp;OPENCV_DNN_CUDA=ON&amp;nbsp;\ &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;-D CUDA_FAST_MATH=ON \ &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;-D CUDA_ARCH_BIN=7.5 \&amp;nbsp; &amp;nbsp; # 자신 GPU의 compute capability 값&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;-D WITH_CUBLAS=ON \&lt;br /&gt;-D WITH_CUFFT=ON \&lt;/span&gt;&lt;br /&gt;-D&amp;nbsp;WITH_QT=ON&amp;nbsp;\ &lt;br /&gt;-D&amp;nbsp;WITH_GTK=OFF&amp;nbsp;\ &lt;br /&gt;-D&amp;nbsp;WITH_OPENGL=ON&amp;nbsp;\ &lt;br /&gt;-D&amp;nbsp;WITH_V4L=ON&amp;nbsp;\ &lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;-D&amp;nbsp;WITH_FFMPEG=ON&amp;nbsp;\&lt;/span&gt; &lt;br /&gt;-D&amp;nbsp;WITH_XINE=ON&amp;nbsp;\ &lt;br /&gt;-D&amp;nbsp;BUILD_NEW_PYTHON_SUPPORT=ON&amp;nbsp;\ &lt;br /&gt;-D&amp;nbsp;INSTALL_C_EXAMPLES=OFF&amp;nbsp;\ &lt;br /&gt;-D&amp;nbsp;INSTALL_PYTHON_EXAMPLES=OFF&amp;nbsp;\ &lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;-D&amp;nbsp;OPENCV_GENERATE_PKGCONFIG=ON&amp;nbsp;\&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;-D&amp;nbsp;OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules&amp;nbsp;\ &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;-D&amp;nbsp;OPENCV_ENABLE_NONFREE=ON&amp;nbsp;\&lt;/span&gt; &lt;br /&gt;-D&amp;nbsp;BUILD_EXAMPLES=OFF&amp;nbsp;..&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;check&amp;nbsp;number&amp;nbsp;of&amp;nbsp;cores&amp;nbsp;of&amp;nbsp;your&amp;nbsp;system &lt;br /&gt;nproc&amp;nbsp;#&amp;nbsp;자신&amp;nbsp;시스템의&amp;nbsp;코어&amp;nbsp;수&amp;nbsp;확인&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;build&amp;nbsp;(modify&amp;nbsp;the&amp;nbsp;core&amp;nbsp;number&amp;nbsp;'12'&amp;nbsp;after&amp;nbsp;option&amp;nbsp;-j&amp;nbsp;accordingly) &lt;br /&gt;make&amp;nbsp;-j12&amp;nbsp;#&amp;nbsp;자신&amp;nbsp;시스템&amp;nbsp;코어&amp;nbsp;수에&amp;nbsp;맞게&amp;nbsp;-j&amp;nbsp;다음의&amp;nbsp;숫자를&amp;nbsp;변경&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;install &lt;br /&gt;sudo&amp;nbsp;make&amp;nbsp;install&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;check&amp;nbsp;if&amp;nbsp;it&amp;nbsp;is&amp;nbsp;installed&amp;nbsp;successfully &lt;br /&gt;pkg-config&amp;nbsp;--modversion&amp;nbsp;opencv4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정값 중에서, GPU별 compute capability 값은&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/CUDA#GPUs_supported&quot;&gt;https://en.wikipedia.org/wiki/CUDA#GPUs_supported&lt;/a&gt;를 참조한다 (예를 들어, RTX 2080은 7.5, RTX 3080은 8.6).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 내용을 shell script 파일로 만들어서 아래와 같이 실행하면 GPU 지원 opencv가 설치된다 (e.g. opencv_install.sh라는 이름으로 스크립트를 생성했을 경우).&amp;nbsp;만일 CUDA를 사용하지 않을 경우에는 설정에서 WITH_CUDA부터 WITH_CUFFT까지를 모두 삭제하거나 OFF로 바꾼다.&lt;/p&gt;
&lt;pre id=&quot;code_1625202102836&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ nproc					# 자신의 시스템 코어 수 확인
$ nvidia-smi				# 자신의 GPU 확인
$ vi opencv_install.sh			# opencv_install.sh 내용 편집
 --&amp;gt; make -j12에서 12를 자신의 시스템 코어 수로 변경
 --&amp;gt; CUDA_ARCH_BIN 값을 자신 GPU의 compute capability 값으로 변경
 --&amp;gt; 기타 필요한 설정 등을 변경
$ chmod a+x opencv_install.sh		# 실행 가능한 파일로 변경
$ ./opencv_install.sh			# 스크립트 실행
$ sudo vi /etc/ld.so.conf.d/opencv.conf	# opencv conf 파일 생성
 --&amp;gt; /usr/local/lib 라인 추가 (opencv 설치된 라이브러리 폴더를 알려주는 것)
$ sudo ldconfig -v			# 생성한 opencv conf 반영&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;OpenCV에서 이미지에 한글 출력하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;opencv에서는 기본적으로 cv::putText로 이미지에 한글을 출력하면 글자가 깨진다. 하지만, 위와 같이 libfreetype6-dev, libharfbuzz-dev를 먼저 설치한 후에 opencv를 빌드하면 한글 출력이 가능해진다. 단, linux 빌드의 경우만 해당되며 윈도우즈에서도 한글 출력되도록 빌드해 보고자 했지만 결국 실패하였다. 어쨌든, 한글 출력 사용법 예제는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, 한글 폰트를 다운로드해서 시스템에 저장한다. (e.g. test/font/)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한글폰트 다운로드: &lt;a href=&quot;https://drive.google.com/file/d/1gkkI-rdlZxYmEV-0HtmXYVjeTf1SopIF/view?usp=sharing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;font_korean.zip&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;test/font/gulim.ttf&lt;/li&gt;
&lt;li&gt;test/font/batang.ttf&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제 코드(참고사이트: &lt;a href=&quot;https://kkokkal.tistory.com/1325&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://kkokkal.tistory.com/1325&lt;/a&gt;):&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;#include&amp;nbsp;&quot;opencv2/freetype.hpp&quot; &lt;br /&gt;int&amp;nbsp;main(void) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp; &amp;nbsp; Mat src = imread(&quot;sample.bmp&quot;, IMREAD_COLOR);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;//&amp;nbsp;FreeType2&amp;nbsp;객체&amp;nbsp;생성 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;cv::Ptr&amp;lt;cv::freetype::FreeType2&amp;gt;&amp;nbsp;ft2&amp;nbsp;=&amp;nbsp;cv::freetype::createFreeType2();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;// 글꼴 불러오기 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;ft2-&amp;gt;loadFontData(&quot;test/font/gulim.ttf&quot;, 0);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;//&amp;nbsp;문자열&amp;nbsp;출력 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;ft2-&amp;gt;putText(src,&amp;nbsp;u8&quot;Hello?&quot;,&amp;nbsp;Point(50,&amp;nbsp;50),&amp;nbsp;50,&amp;nbsp;Scalar(255,&amp;nbsp;255,&amp;nbsp;255),&amp;nbsp;-1,&amp;nbsp;LINE_AA,&amp;nbsp;false); &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;ft2-&amp;gt;putText(src,&amp;nbsp;u8&quot;안녕하세요!&quot;,&amp;nbsp;Point(50,&amp;nbsp;120),&amp;nbsp;50,&amp;nbsp;Scalar(0,&amp;nbsp;255,&amp;nbsp;255),&amp;nbsp;-1,&amp;nbsp;LINE_AA,&amp;nbsp;false);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;imshow(&quot;src&quot;,&amp;nbsp;src); &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;waitKey(0);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;return&amp;nbsp;0; &lt;br /&gt;}&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;☞ 후기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 이런 괜한 삽질을 한 이유는 최근 &lt;a href=&quot;https://github.com/AlexeyAB/darknet&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;yolo 사이트&lt;/a&gt;를 둘러보다가 opencv dnn을 이용해서 yolo를 돌리면 속도가 크게 증가한다는 표를 봤기 때문이다(608x608 이미지의 경우 darknet은 53fps, opencv fp16은 115fps라고 나온다). 직접 빌드해서 돌려보니 내 경우는 opencv가 좀더 빠른 것은 맞지만 그 정도는 아니다 (opencv의 경우, image blob 생성 및 non-max-suppression 시간 등은 제외하고 순수 network forward 시간만 측정한 것 같다). 실제 돌려보면 이미지 입력부터 결과 출력까지 608x608 기준으로 darknet은 42 fps, opencv fp16은 54 fps 정도가 나온다. 416x416 기준으로는 darknet은 75 fps, opencv fp16도 75 fps로 동일하게 나온다. 고해상도로 갈수록 속도가 빨라지는 것 같다. 어쨌든 빨라졌으니 좋은 것이긴 한데, 문제는 opencv dnn 버전은 yolov3, yolov4로는 동작하지만 yolov4-csp 등에서는 동작하지 않는다는 점이다. 윈도우즈 버전으로 테스트한 것이기 때문에 linux에서는 결과가 다를지도 모르겠다. 참고로 fp16은 floating point 데이터 표현 및 연산을 16비트로 처리한다는 의미이다(기본은 32비트). opencv dnn을 이용한 yolo 사용은 &lt;a href=&quot;https://gist.github.com/YashasSamaga/077a1d69c48e4cdb9957d167b7000b98&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;YashasSamaga/main.cpp&lt;/a&gt;를 참고한다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;darknet yolo&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;opencv dnn fp16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;다양한 yolo 버전을 모두 지원(yolo, yolo-csp, yolo-mesh 등)&lt;br /&gt;별도로 darknet을 빌드해서 사용해야 함&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;yolov3, ylov4 등 기본 버전만 지원&lt;br /&gt;darknet 빌드 없이 opencv 자체에서 yolo 수행&lt;br /&gt;dnn빌드로 opencv dll 파일의 크기가 커짐 (428MB)&lt;br /&gt;속도가 조금 더 빠름 (정확도는 darknet yolo와 동일)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;by 다크 프로그래머&lt;/p&gt;</description>
      <category>프로그래밍</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/184</guid>
      <comments>https://darkpgmr.tistory.com/184#entry184comment</comments>
      <pubDate>Fri, 25 Jun 2021 15:38:42 +0900</pubDate>
    </item>
    <item>
      <title>DarkCompare - 동영상 비교/병합 프로그램</title>
      <link>https://darkpgmr.tistory.com/183</link>
      <description>&lt;p&gt;동영상 여러 개를 (원하는데로) 상하좌우로 붙여가면서 비교할 수 있는 간단한 프로그램입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;알고리즘별 결과를 프레임별로 비교하기 위해서 만든 툴인데, 필요한 분은 사용하시기 바랍니다. 동영상 비교 뿐만 아니라 동영상들을 하나로 합치는 용도로도 사용할 수 있습니다.&lt;/p&gt;
&lt;p&gt;- 화살표키/PgUp/PgDn/Home/End로 프레임 이동 (delay 없이 빠른 이동 가능)&lt;/p&gt;
&lt;p&gt;- 무설치 실행&lt;/p&gt;
&lt;p&gt;- 윈도우즈 전용&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다운로드(실행파일): &lt;a href=&quot;https://drive.google.com/file/d/1iD2byeVreibbM_Twwliw9fzpga_o6kTs/view?usp=sharing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;darkcompare1.0.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;darkcompare_gui.png&quot; data-origin-width=&quot;1625&quot; data-origin-height=&quot;1025&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SkZy6/btq0SlxifUg/1wEMmDYSyWUrboOD1vyEiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SkZy6/btq0SlxifUg/1wEMmDYSyWUrboOD1vyEiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SkZy6/btq0SlxifUg/1wEMmDYSyWUrboOD1vyEiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSkZy6%2Fbtq0SlxifUg%2F1wEMmDYSyWUrboOD1vyEiK%2Fimg.png&quot; data-filename=&quot;darkcompare_gui.png&quot; data-origin-width=&quot;1625&quot; data-origin-height=&quot;1025&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot;&gt;by 다크 프로그래머&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발한 것들</category>
      <category>video comparison</category>
      <category>video merging</category>
      <category>비디오 병합 툴</category>
      <category>비디오 비교 툴</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/183</guid>
      <comments>https://darkpgmr.tistory.com/183#entry183comment</comments>
      <pubDate>Thu, 18 Mar 2021 17:54:19 +0900</pubDate>
    </item>
    <item>
      <title>글쓰기에 대해</title>
      <link>https://darkpgmr.tistory.com/182</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 그 동안 글쓰기에 대해 생각한 것들, 도움이 될 만한 것들을 정리한 글입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자신의 글&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 기본적인 것이지만 자신이 소화한 내용, 자신의 생각과 이해를 바탕으로 해야 진정한 자신의 글이라 할 수 있다. 조금 부족하더라도 비록 남들처럼 멋지진 않더라도 자신의 내용으로 글을 쓰자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자신의 글이지만 남에게 보여주는 글&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글을 쓰는 사람은 자신이지만, 글을 읽을 사람은 타인임에 유의하자. 타인의 입장에서 모호함이 없게, 타인이 이해하기 쉽게 글을 써야 한다. 글은 나의 지식과 나의 이해를 바탕으로 한다. 그래서 보통 자신이 쓴 글을 자신이 읽을 때에는 글에 비약이나 모호한 표현, 부족한 부분이 있더라도 읽는데 큰 어려움이 없다. 그 이유는 글을 있는 그대로 읽지 않고 우리의 뇌가 일종의 착시현상처럼 글을 쓸 당시의 생각으로 메꿔서(바꿔서) 읽기 때문이다. 그런데, 타인은 나와 지식과 경험을 공유하지 않기에 자신처럼 글을 읽거나 이해할 수 없다. 자신이 쓴 글을 한달 쯤 지난 후에 다시 읽어보자. 만일 그 때도 술술 읽혀진다면 그 글은 타인의 입장에서도 잘 쓰여진 글이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자기소개서&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'자신의 글이지만 남에게 보여주는 글'의 결정체가 바로 자기소개서가 아닌가 싶다. 자기소개서는 자신의 얘기이다 보니 감정이 들어가고 다소 장황한 글이 되기 쉽다. 그런데, 읽는 사람 입장에서는 이러한 글이 부담스러울 수 있다. 자기소개서의 목적은 이 사람이 업무에 적합한 사람인가를 판단하기 위함이기에 목적에 맞게 글을 정리하면 좋겠다.&amp;nbsp;내용적으로는 자신에게 의미있는 것들 중에서 보여주고 싶은 것, 그리고 상대방이 관심있어 할 만한 것 위주로 구성하면 좋을 것 같다 ('내가 그 사람 입장이라면 무엇을 볼 것인가?'). 그리고 형식적으로는 길게 이어지는 서술형보다는 글을 단락으로 나누고 각 단락의 앞에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;짧은 소제목(굵은 폰트로 강조)&lt;/b&gt;을 붙이면 효과적이다. 바쁜 현대에서 소제목만 보고도 대략적인 내용을 알 수 있다면 보다 효과적으로 자신을 전달할 수 있다. 그리고 소제목이 인상적이라면 세부 내용도 관심을 가지고 읽어볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;발표자료&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발표자료를 준비하는 것도 일종의 글쓰기와 같다. 내 발표를 들을 사람과 내가 발표(전달)할 내용을 고려한 글쓰기이다. 개인적으로 싫어하는 발표자료는 페이지 안에 모든 내용이 빡빡하게 채워진 자료이다. 그런 자료는 발표자의 시각이 없는 자료로서 눈에 잘 들어오지도 않고 읽기도 어렵다. 발표자료는 모든 내용(지식)보다는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;자신이 발표하고 싶은 내용&lt;/b&gt;을 보여주는 것이 기본이다. 자료의 페이지 하나, 그림 하나에도 전달하고 싶은 메시지가 있어야 한다 (발표하지 않을 세부 내용들은 별첨 자료로 빼도 좋다). 그리고, 발표자료도 또한 남에게 보여주기 위한 것이니 보는 사람이 이해하기 쉽도록 작성하는 것이 중요하다. 자신이 전달하고 싶은 메시지가 무엇인지, 그리고 그것을 어떻게 효과적으로 전달할 것인지가 발표자료의 핵심이라 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;질문의 글&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;질문의 글을 남길 때에도 타인의 입장을 고려하면서 글을 남기면 좋겠다. 블로그 댓글에 답변을 달다 보면 나도 모르게 가슴이 답답해지는 경우가 종종 있다. &lt;span style=&quot;color: #333333;&quot;&gt;본인만이 알 수 있는 것을 질문하는 경우&lt;/span&gt;, 글만으로는 무엇이 궁금한지 판단이 힘든 경우, 어디까지 설명해야 하는지 판단이 어려운 경우 등 난감한 경우가 많다. 타인은 나와 지식과 경험이 다르다는 것을 항상 유념하면서 최대한 구체적으로 글을 남기면 좋겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로, 그동안 블로그에 답글을 달면서 느꼈던 답답함을 글쓰기 방법이라는 미명 하에 풀어 보았습니다 ^^. 아래 2개는 글쓰기에 있어서 기타 소소한 팁입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;팁1. 두괄식의 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;학술 논문이나 과학적 글을 쓸 때는 무조건 두괄식을 사용하는게 좋다. 두괄식은 &lt;/span&gt;각 단락의 첫 부분에 그 단락에서 하고자 하는 얘기를 한 문장으로 대표해서 적고, 이후 문장들에서 부연설명을 하는 방식이다. 예를 들어, 'A는 이렇다. B는 저렇다. 따라서, 제안 방법은 이러 저러하다' 방식 보다는 '제안 방법은 이렇다. 그 이유는 A는 이렇고 B는 저렇기 때문이다'와 같은 방식이 (독자 입장에서) 글의 흐름을 놓치지 않고 파악하는데 효과적이다. 이 역시 읽는 사람을 고려한 글쓰기이다. 단락 전체를 한 문장으로 정리하는게 쉽지는 않지만, 이런 연습을 통해 추상화 능력이 키워지고 자신이 무슨 얘기를 하고 싶어하는지 미리 생각을 정리하는 시간이 될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;팁2. 간결한 글&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;짧게만 쓴다고 간결한 글은 아니다. 중요한 개념이나 강조하고 싶은 부분은 충분히 지면을 할애하는 것이 좋다. 다만, 한 두 문장으로 전달이 가능한 내용을 열 문장으로 늘여 쓰지만 않으면 된다. 간결한 글은 주제와 부합되면서 문장 하나 하나가 중복되지 않는 의미를 가지고 있는 글이다. 그리고 흥미로운 지식일지라도 글의 흐름에 큰 도움이 되지 않는 내용(사족)들은 과감히 제거하면 보다 좋은 글이 될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;by 다크 프로그래머&lt;/p&gt;</description>
      <category>잡기장</category>
      <category>글쓰기</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/182</guid>
      <comments>https://darkpgmr.tistory.com/182#entry182comment</comments>
      <pubDate>Fri, 5 Feb 2021 17:19:37 +0900</pubDate>
    </item>
    <item>
      <title>테트리스 (Tetris)</title>
      <link>https://darkpgmr.tistory.com/181</link>
      <description>&lt;p&gt;아이들에게 주려고 만든 프로그램입니다. 아빠가 만들었다고 하면 조금 느낌이 다르지 않을까 해서.. ^^&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;색상이랑 화면 구성 등 아이들에게 의견을 물어가면서 재미있게 만들었습니다.&lt;/p&gt;
&lt;p&gt;세로줄을 넣는 것은 아내의 아이디어입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;윈도우(windows) 프로그램이고 실행파일 하나로 동작합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;WuKaTetris&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;실행파일 다운로드: &lt;a href=&quot;https://github.com/darkpgmr/Tetris/releases/download/tetris1.0-release/Tetris.zip&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Tetris.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;tetris_gui.png&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;707&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQUqSy/btqLsb3Rn7R/Ldo5E4fhf5RqOI5aEMEJG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQUqSy/btqLsb3Rn7R/Ldo5E4fhf5RqOI5aEMEJG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQUqSy/btqLsb3Rn7R/Ldo5E4fhf5RqOI5aEMEJG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQUqSy%2FbtqLsb3Rn7R%2FLdo5E4fhf5RqOI5aEMEJG0%2Fimg.png&quot; data-filename=&quot;tetris_gui.png&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;707&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;컨트롤&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; Left/Right/A/D: 좌우 이동&lt;/p&gt;
&lt;p&gt;&amp;nbsp; Up/W/X: 시계방향 회전 (CW)&lt;/p&gt;
&lt;p&gt;&amp;nbsp; Z/Ctrl: 반시계방향 회전 (CCW)&lt;/p&gt;
&lt;p&gt;&amp;nbsp; Space: 아래로 떨어뜨리기 (hard drop)&lt;/p&gt;
&lt;p&gt;&amp;nbsp; Down/S: 한칸 아래로 이동 (soft drop)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;'n': 새로운 게임(new game)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;'p': 게임 일시멈춤(pause)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;'m': 효과음 온/오프&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot;&gt;by 다크 프로그래머&lt;/p&gt;</description>
      <category>개발한 것들</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/181</guid>
      <comments>https://darkpgmr.tistory.com/181#entry181comment</comments>
      <pubDate>Sun, 18 Oct 2020 21:25:00 +0900</pubDate>
    </item>
    <item>
      <title>벡터 외적을 이용한 직선의 교점 구하기</title>
      <link>https://darkpgmr.tistory.com/180</link>
      <description>&lt;script type=&quot;text/x-mathjax-config&quot;&gt;
MathJax.Hub.Config({
  tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}
});
&lt;/script&gt;
&lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-MML-AM_CHTML&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 평면위의 네 점(픽셀) p1, p2, p3, p4가 주어졌을 때, 두 직선 p1p2, p3p4의 교점을 벡터의 외적(cross product)를 이용하여 구하는 방법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[두 직선의 교점 구하기]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, 네 점의 픽셀 좌표를 homogeneous 좌표로 변환하고 3D 벡터로 해석한다 (카메라 원점과 이미지 평면위의 점을 잊는 벡터).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;직선1: $p_1 = (x_1, y_1, 1)$, &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$p_2 = (x_2, y_2, 1)$&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;직선2: $p_3 = (x_3, y_3, 1)$, &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$p_4 = (x_4, y_4, 1)$&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벡터의 외적을 이용하여 $v$를 계산&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$v = (p_1 \times p_2) \times (p_3 \times p_4)$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계산된 결과가 $v = (x, y, w)$라면 두 직선의 교점의 좌표는 $(x/w, y/w)$로 주어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[원리]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네 점 p1, p2, p3, p4를 3D 좌표계(카메라 좌표계)에서 이미지 평면 위에 있는 점으로 생각하자. 그리고 이 점들은 3차원 공간에서 카메라 원점(C)으로부터의 3D 벡터들로 해석할 수 있다. 이 때, 카메라 원점 C와 점 p1, p2를 지나는 평면을 생각하면 두 벡터 $p_1$, $p_2$의 외적 $n_1 = p_1 \times p_2$는 이 평면의 normal 벡터이다. 마찬가지로, $n_2 = p_3 \times p_4$은 C와 p3, p4를 지나는 평면에 수직인 벡터이다. 이 때, 두 평면의 교선을 $v$라 하면 $v$는 카메라 원점 C를 지나면서 두 직선 p1p2, p3p4의 교점을 지난다. 교선 $v$는 두 평면 위에 있으므로 $n_1$과도 수직이고 $n_2$와도 수직이다 (평면 위에 모든 벡터는 그 평면의 normal 벡터와 수직이다). 즉, $v = n_1 \times n_2$ (homogeneous 좌표에서 scale은 무시).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[여러 직선의 교점 구하기]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 평면에 존재하는 여러 line segment들의 최소자승(least squares) 교점을 구하는 문제를 생각해 보자. Line segment l1, l2, ...로부터 구한 normal 벡터(line segment의 양 끝점과 카메라 원점을 지나는 평면의 normal 벡터)&lt;span&gt;들을 n1, n2, ...라 하자&lt;/span&gt;. 최소좌승 교점을 v라 하면, v는 모든 normal 벡터들과 수직인 벡터이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$v = \arg \min_v \sum_{i=1}^{n}{( n_i^T v)^2 }$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고, 이러한 v는 ni들을 행벡터로 갖는 행렬 A에 대해 Av = 0의 해를 구함으로써 구할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;☞ 관련 원리는 벡터의 외적 및 homogeneous 좌표에 대한 이해가 필요하며, &lt;a href=&quot;https://darkpgmr.tistory.com/78&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[영상처리] - [영상 Geometry #2] Homogeneous Coordinates&lt;/a&gt; 글 참조하기 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;by 다크 프로그래머&lt;/p&gt;</description>
      <category>수학 이야기</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/180</guid>
      <comments>https://darkpgmr.tistory.com/180#entry180comment</comments>
      <pubDate>Thu, 10 Sep 2020 09:31:33 +0900</pubDate>
    </item>
    <item>
      <title>YOLO와 성능지표(mAP, AP50)</title>
      <link>https://darkpgmr.tistory.com/179</link>
      <description>&lt;p&gt;최근에 YOLO 논문들을 보다 보니 저자가 2018년 YOLOv3를 마지막으로 YOLO 연구를 중단한 것을 알게 되었다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;☞ 그리고 올해 2020년 2월 자신의 twitter를 통해 컴퓨터비전 연구를 중단한다고 선언한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;YOLOv3 논문에 보면 자신도 Google이나 군에서 fund를 지원받아서 이런 연구를 하고 있는데.. 이게 어디에 쓰일지(프라이버시 정보 수집, 군사목적 등) 뻔하기 때문에 더 이상 그런 곳에 기여할 수는 없다는 게 이유이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그리고 논문 말미 Rebuttal을 통해 현재 비전계의 mAP 평가방식(MS COCO)에 대해 강도 높은 비판을 하면서 이 연구계를 떠난다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Detector의 성능을 COCO 데이터셋에 대해 평가했을 때,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MS COCO mAP 기준으로 YOLOv3는 33.0 ≪ RetinaNet은 40.8&lt;/li&gt;
&lt;li&gt;Pascal VOC mAP (AP50) 기준으로 YOLOv3는 57.0 ≒ RetinaNet 61.1 (속도는 YOLOv3가 4배 빠름)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;똑같은 mAP 인데 왜 이렇게 차이가 나는 걸까?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;☞&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;과거 Pascal VOC 기준으로는 YOLO가 단연 최고의 detector인데, 최근 논문들이 사용하는 COCO 챌린지 기준으로는 속도만 빠른 detector로 전락해 버린다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;도대체 뭐가 다른지.. 이번 기회에 mAP 계산 방식에 대해 살펴봤는데 이게 여간 복잡하지 않다.&lt;/p&gt;
&lt;p&gt;- &lt;a href=&quot;https://kharshit.github.io/blog/2019/09/20/evaluation-metrics-for-object-detection-and-segmentation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Evaluation metrics for object detection and segmentation: mAP&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Pretty soon you will be pulling your hair out and ask yourself what the **** is all this. &amp;ldquo;I have an algorithm, and I have my dataset. All I want to do is to evaluate it. Why is it so hard?&amp;rdquo; 라면서 욕을 바가지로 한 사람도 있다. (공감..)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Pascal VOC는 IoU(Intersection over Union) &amp;gt; 0.5 인 detection은 true, 그 이하는 false로 평가하는 방식이고 COCO는 IoU&amp;gt;0.5, IoU&amp;gt;0.55, IoU&amp;gt;0.6, &amp;hellip;, IoU&amp;gt;0.95 각각을 기준으로 AP를 계산한 후 이들의 평균을 취하는 방식이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;COCO 방식은 기존 Pascal VOC 방식이 정확도가 높은 (ground truth와 일치하는 box를 검출하는) detector들을 구분하지 못하는 단점을 보완하기 위해서 도입한 것이라고 한다. 나름 일리가 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그런데, yolo 저자는 이에 대해 다음과 같이 반박한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;ground truth는 사람이 만든 것으로서 오차가 있을 수 있으며 그러한 오차를 감안하여 Pascal VOC에서는 IoU 0.5라는 기준을 적용하였다. (사실, 무엇이 정답인지에 대한 기준 자체도 모호하다. 예를 들어 팔을 벌리고 있는 사람의 가장 이상적인 bounding box는 어디인가? 저자는 box를 사용하면서 정확도를 평가한다는 것 자체가 멍청한 짓이라고 말한다)&lt;/li&gt;
&lt;li&gt;IoU 기준을 높이다 보면 상대적으로 classification 정확도는 무시되게 된다. box의 위치 정확도가 물체의 클래스 인식율보다 중요한 것인가? (예를 들어 IoU&amp;gt;0.7 기준을 사용하면, 그 이하의 검출은 물체를 사람으로 인식했는지 자동차로 인식했는지 여부와 무관하게 모두 false로 간주된다)&lt;/li&gt;
&lt;li&gt;물체 class별로 각각 AP를 계산하는 방식도 문제이다. 사람 class의 경우, 현재의 평가방식은 detector의 출력들 중 사람에 대한 출력값만 가지고 precision, recall을 계산한다. 그래서, detector가 실제 사람을 치타라고 분류하거나 강아지라고 분류하더라도 이것들은 성능 평가에 아무런 영향을 미치지 않는다. 지금처럼 개별 class별로 AP를 계산한 후 평균하는 방식이 아니라 모든 class를 한꺼번에 놓고 평가하는 방식으로 바꿔야 한다. (이건 조금 이해하기 힘들 수 있는데, multi-class classification 문제에서는 class 개수만큼 ouput 노드를 만들고 그중 가장 출력이 큰 값을 해당 객체의 class로 분류한다. 그런데, 해당 classifier로 사람만 평가한다고 하면 사람 노드의 출력값만 이용해서 출력값&amp;gt;threshold인 경우에 대해 precision-recall 그래프를 그리게 되고, 다른 class 노드에서 사람 노드보다 더 높은 출력값이 나오더라도 이 값은 무시되게 된다)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;개인적으로는 yolo 저자의 주장에 대부분 공감이 간다. IoU&amp;gt;0.5라는 기준이 사실 그렇게 낮은 기준이 아니다. 크기가 동일한 box라 하더라도 ground truth와 66.7% 이상 overlap이 되어야 IoU = 0.5가 나오고 사람의 눈으로 봤을 땐 대부분 잘 찾았네 하고 느껴지는 수준이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;COCO 기준이 IoU&amp;gt;0.5 AP와 IoU&amp;gt;0.75 AP의 평균을 사용한다면 어느정도 수긍할 수 있다. 그런데, IoU&amp;gt;0.95까지 동일한 weight로 평균한 것은 수긍이 어렵다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;기준이 어찌되었든 모든 detector들에게 동일하게 적용되는 것이니 공평한 것 아니냐 할 수도 있다. 하지만, COCO 방식이 찾은 물체의 사람/자동차/물건 구분은 종종 틀리더라도 COCO가 정한 ground truth 박스와 최대한 일치하게 물체의 bounding box를 찾아주는 detector들에게 유리한 방식임은 틀림없다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그런데, Joseph Redmon이 yolo를 중단한 후, 그동안 yolo에 대한 다양한 플랫폼 빌드(&lt;a href=&quot;https://github.com/AlexeyAB/darknet&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;github.com/AlexeyAB/darknet&lt;/a&gt;)를 제공하던 Alexey Bochkovskiy이 대대적인 optimization을 통해 올해 2020년 4월에 YOLOv4를 release한다. 그리고 YOLOv4는 MS COCO 지표로 mAP 43.5% (Pascal VOC mAP로는 65.7%), &lt;span style=&quot;color: #333333;&quot;&gt;속도 65 fps를 발표한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot;&gt;by 다크 프로그래머&lt;/p&gt;</description>
      <category>기계학습</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/179</guid>
      <comments>https://darkpgmr.tistory.com/179#entry179comment</comments>
      <pubDate>Mon, 7 Sep 2020 12:23:31 +0900</pubDate>
    </item>
    <item>
      <title>아래한글(hwp) 멈춤 현상과 파워포인트(ppt)</title>
      <link>https://darkpgmr.tistory.com/178</link>
      <description>&lt;p&gt;아래한글로 작업을 하다가 그림을 복사한 후 무심코 파워포인트를 닫았다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아차 싶었지만 이미 엎질러진 물이었다..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;역시나 아래한글은 이미 먹통이 되었고 마우스, 키보드 등 아무것도 먹히지 않았다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;작업관리자를 띄워서 아래한글 프로그램을 강제로 종료시킨 후, 혹시나 하는 마음을 담아서 작업하던 문서를 조심스럽게 열었지만..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;무려 2시간 30분동안 작업했던 문서 내용이 모두 날아갔다..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;글을 새로 쓰는 것보다 훨씬 더더욱 어려운 것은 썼던 글을 모두 날려버리고 다시 그 글을 써내려 가는 것이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;한번 썼던 글을 다시 쓰는 것이니 좀더 쉬울 것 같지만 사실은 전혀 그렇지가 못하다. 키보드를 던져 버리고 싶은 마음을 꾹꾹 달래면서 지금 쓰는 글과 희미한 기억 사이를 비교하는 일은 꽤나 괴롭고 힘든&amp;nbsp;일이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그동안 아래한글로 작업하다가 프로그램이 먹통이 되어서 문서를 날려 먹은 일이 한두 번이 아니다. 그 전에는 원인조차 몰랐지만 최근에야 아래한글로 작업하다가 열려 있던 파워포인트 프로그램을 닫으면 그러한 현상이 발생한다고 어렴풋이 깨닫고 있었다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;망연 자실해 있다가 도대체 왜 그러는지 원인이라도 알아야겠다는 마음에 '아래한글 먹통 파워포인트'라고 인터넷 검색을 해 보니.. 왠걸, 해결책까지 떡 하니 나온다. 그 동안에는 그렇게 검색을 했어도 안나오더니..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그러한 현상은 아래한글과 파워포인트가 동시에 열려 있는 상태에서 그림 복사, 내용 복사 등의 작업을 하다가 파워포인트를 닫으면 파워포인트가 정상 종료되지 않고 메모리에 남아서 문제가 발생한다고 한다. &amp;nbsp;그리고 해결책은 작업관리자 창에서 아직 종료되지 않은 파워포인트 프로세스를 찾아서 강제로 종료시키면 아래한글이 다시 살아난다는 것이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;다시.. 살아난다고 한다.... OTL&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;하지만 내 경우는 이미 죽여버린 아래한글이라 다시 살아나지는 않는다.. 그래도 해결책을 알았으니 그나마 다행이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: right;&quot;&gt;다크 프로그래머&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>잡기장</category>
      <category>먹통</category>
      <category>멈춤</category>
      <category>아래한글</category>
      <category>파워포인트</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/178</guid>
      <comments>https://darkpgmr.tistory.com/178#entry178comment</comments>
      <pubDate>Sat, 22 Dec 2018 21:41:13 +0900</pubDate>
    </item>
    <item>
      <title>기술의 가치</title>
      <link>https://darkpgmr.tistory.com/177</link>
      <description>&lt;p&gt;기술의 가치에 대한 잡담입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;80% 성능을 가진 기술, 90%의 성능을 가진 기술, 95%, 98%, 99%, ...&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;60%의 성능을 가진 기술을 80%로 올리는 것은 비교적 쉽다. 하지만 95%를 96%로 또는 98%를 99%로 올리는 것은 훨씬 어렵다는 것은 누구나 알고 있는 사실이다. 98%의 기술을 99%로 올리기 위해서는 정말 엄청난 노력과 오랜 시간의 축적 또는 새로운 혁신이 필요하고 기술에 따라서는 아무리 시간을 투자해도 이루기 힘든 경우가 많다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;98%과 99%, 단지 1%의 차이지만 기술의 가치에는 숫자 이상의 큰 차이가 존재한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;65%의 기술과 66%의 기술은 사실 같은 기술이라고 봐도 무방하다. 하지만 98% 기술과 99% 기술은 최소 2배 이상의 차이가 존재한다 (100번 중 2번 실패하는 기술과 1번 실패하는 기술). 그리고 99% 기술과 100% 기술 사이에는 물론 하늘과 땅 만큼이나 큰 차이가 존재한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;기술의 성능이 임계점에 다다르면 1% 또는 0.1%의 작은 차이를 위해 엄청난 시간과 노력이 필요해진다.. 그래서 쉽게 할수 없는 일이고 기다림의 시간도 잘 주어지지 않는다. 하지만 정말 뛰어난 기술은 그 1%를 통해 얻어진다. 그리고 그 1%가 결과를 바꾼다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;개인적으로 이것 저것 조금씩 만져 본 기술들은 있지만 그들을 1%까지 추구했다고 말하기는 어렵다. 무언가 하나를 잡고 계속 본다는 것이 쉽지 않다..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: right;&quot;&gt;다크 프로그래머&lt;/p&gt;</description>
      <category>잡기장</category>
      <category>기술의 가치</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/177</guid>
      <comments>https://darkpgmr.tistory.com/177#entry177comment</comments>
      <pubDate>Fri, 12 Oct 2018 12:15:17 +0900</pubDate>
    </item>
    <item>
      <title>구구단 암산법</title>
      <link>https://darkpgmr.tistory.com/176</link>
      <description>&lt;p&gt;어제 간만에&amp;nbsp;TV를 봤다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;어쩌다 EBS를 한 번씩 보는데, 어제는 남북한 학생들을 모아놓고 뭔가를 하는 프로가 있어서 잠시 보았다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;내용 중에 수학 스타강사라는 사람이 나와서 학생들에게 구구단 암산법이란 것을 가르쳐 주었다. 인도에서는 학생들이 19단까지 암기를 하는데, 이 암산법을 이용하면 굳이 구구단을 외우지 않아도 1초면 계산이 가능하단다. 그러면서 'ㄱ'자 법이라는 계산 방법을 알려주었다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;첫 자리가 1로 시작하는 두 자릿수의 곱셈을 빨리 하는 방법인데, 예를 들어, 18 x 14와 같이 첫 자리가 모두 1인 두 수의 곱을 'ㄱ'자 위치인 18과 4만 이용해서 계산하는 것이다. 이 때, 그 곱은 (18, 4 두 수의 합) x 10 + (18, 4 두 수의 일의 자릿수의 곱)으로 계산된다고 한다. 즉, (18 + 4) x 10 + (8 x 4) = 220 + 32 = 252 (계산기로 두드려보니 정말 18 x 14 = 252가 나온다). 다른 예로, 17 x 12 = (17 + 2) x 10 + (7 x 2) = 190 + 14 = 204.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;☞ '구구단 암산법'이라고 검색해 보면 자세한 내용을 알 수 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;TV를 같이 보던 사모님이 '자기는 알겠어? 난 뭔 소린지 모르겠어' 한다. 사실 나도 처음 듣는 방법이라서 '뭐지?' 하면서 눈만 껌벅이다가 '별 쓸데없는 것을 다 가르치네'하고 말았다. 얘들은 자기들도 직접 해본다고 칠판에 쓰고.. 계산기 두드리고 난리다.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[잡생각]&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;신기하긴&amp;nbsp;한데, 큰 의미는 없는 것 같다.&amp;nbsp;계산기 두드려도 되고 아니면 그냥 곱셈을 해서 풀어도 된다. 원리는 모르고 대입만 해서 푸는 것이니 신기하긴 해도 큰 도움은 안된다. 원리대로 다음과 같이 푸는 게 좀더 낫겠다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;18 x 14 = 18 x (10 + 4) = 180 + 72 = 252&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;17 x 12 = 170 + 34 = 204&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;37 x 12 = 370 + 74 = 444&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이처럼 순리대로 풀어도 아무런 문제 없고 암산도 가능하다. 그리고 37 x 12처럼 첫 자리가 1이 아닌 경우도 풀 수 있다 (여기에 'ㄱ'자 공식을 적용하면 404라는 엉뚱한 답이 나온다). 그리고 순리대로 풀면 계산을 할 때마다 사고력이 향상된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;개인적인 생각으로 '암기'는 최소화하는 것이 좋다. 'ㄱ'자 법을 익히는 것도 새로운 암기거리이다. 그 계산방법 뿐만 아니라 첫 자리가 1인 경우에만 적용해야 한다는 예외규칙도 같이 암기해야 한다. 계산은 계산기에게 맡기고 우리는 문제의 본질에 집중하는 것이 좋겠다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: right;&quot;&gt;다크 프로그래머&lt;/p&gt;</description>
      <category>수학 이야기</category>
      <category>구구단</category>
      <category>수학</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/176</guid>
      <comments>https://darkpgmr.tistory.com/176#entry176comment</comments>
      <pubDate>Mon, 8 Oct 2018 10:52:52 +0900</pubDate>
    </item>
    <item>
      <title>논문제목(영어) 대소문자 표기</title>
      <link>https://darkpgmr.tistory.com/175</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;영어로 논문제목 쓸 때마다 단어의 대소문자를 정하는 것은 항상 헷갈리는 문제입니다. 그 동안은 막연한 직감에 의지해 오다가 이번에 조금 자료를 검색해 보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 조금만 시간을 내서 찾아보면 되는 일을.. 그동안 대충 때워왔나 싶습니다. 복잡한 규칙까지는 모르겠고 나름의 기준으로(중요도 순) 규칙을 정리해 봅니다. 개인적 참고용입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;R1. 기본적으로는 다음 단어를 제외한 모든 단어에 대문자 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; a, an, the, at, by, for, in, of, on, to, from, up, down, and, as, but, or, nor&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;R2. 제목의 첫단어, 마지막 단어는 항상 대문자 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;b&gt;How&lt;/b&gt; to Land Your Dream &lt;b&gt;Job&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;R3. 하이픈 사용시 첫 단어는 대문자, 이후 단어는 앞서 룰에 따름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; High-Quality Web Services&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Bed-and-Breakfast Options in Savannah&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Forty-Ninth Street Blues&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;R4. 하이픈 사용시 첫 단어가 접두사(prefix)일 경우 다음 단어는 반드시 소문자 사용 (접두사: 혼자서는 사용될 수 없는 단어)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Anti-inflammatory Dieting&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;R5. 종속접속사(subordinating conjnctions, 주절과 종속절 연결)는 대문자 사용 (특히, as는 등위접속사로 사용되면 소문자, 종속접속사로 사용되면 대문자)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; As, Because, That, Which, ...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;R6. 콜론(:) 다음에는 일반적으로 대문자 사용 (스타일에 따라 소문자 경우도 있다고 하나 복잡하므로 패스)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; On Money: The Myth of Job-Stealing Immigrants&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Feminine Poetry: Ten Women Writers from Around the World&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;R7. 전차사(preposition)가 제목에서 중요한 의미를 갖거나 의도적으로 강조할&amp;nbsp;때는 대문자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; How to Back Up a Computer&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Turn Down the Heat to Save Your Money&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;R8. 5~6글자 이상의 긴 단어는 종류에 관계없이 대문자 표기 (사실 R1에 충실하면 당연)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Between, Through, Around, ...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;R9. 결국 중요한 단어는 대문자, 중요하지 않은 것들은 소문자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고:&amp;nbsp;&lt;a class=&quot;tx-link&quot; href=&quot;http://grammar.yourdictionary.com/capitalization/rules-for-capitalization-in-titles.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://grammar.yourdictionary.com/capitalization/rules-for-capitalization-in-titles.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;by 다크 프로그래머&lt;/p&gt;</description>
      <category>알아두면 좋은 것들</category>
      <category>논문제목</category>
      <category>영어대소문자</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/175</guid>
      <comments>https://darkpgmr.tistory.com/175#entry175comment</comments>
      <pubDate>Mon, 30 Apr 2018 10:23:28 +0900</pubDate>
    </item>
    <item>
      <title>인상적인 동영상 링크들 (기술동향)</title>
      <link>https://darkpgmr.tistory.com/174</link>
      <description>&lt;p&gt;개인적 참고용입니다. 일종의 동영상 스크랩인데, 나이가 들수록 무언가 정리해 두지 않으면 안되는 것 같습니다. 개인적으로 인상깊었던 동영상들을 정리해 봅니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;☞ 유투브(Youtube) 동영상 로딩 시간을 줄이기 위해 동영상 임베딩을 썸네일(thumbnail) 방식으로 바꿨습니다. 썸네일 이미지를 클릭하면 유투브 동영상이 로드 및 실행됩니다.&amp;nbsp;&lt;span style=&quot;color: rgb(255, 0, 127);&quot;&gt;크롬(chrome)에서는 정상 동작&lt;/span&gt;합니다만 인터넷 익스플로러에서는 버전에 따라 썸네일이 정상 표시되지 않을 수 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;[2018.03] YOLO v3&lt;/b&gt;&lt;/p&gt;&lt;p&gt;최근 새로 나온 YOLO v3. 이전 버전에 비해 확실히 성능이 향상되었으며 속도는 비슷&lt;/p&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/MPU2HistivI&quot; width=&quot;560&quot; height=&quot;315&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;[2018.02] 평창동계올림픽 1,218 드론쇼&lt;/b&gt;&lt;/p&gt;&lt;p&gt;평창 동계올림픽 개막식에서 선보인 1,218대의 드론쇼. 어떻게 저런 정밀한 코디네이션이 가능한지 경이롭다. 이날 방송된 드론 쇼는 지난해 12월 사전 녹화된 것으로서 인텔(Intel)의 작품이라 한다.&lt;/p&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/fag8nirMXgE&quot; width=&quot;560&quot; height=&quot;315&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;[2018.02] Falcon Heavy Test Flight&lt;/b&gt;&lt;/p&gt;&lt;p&gt;지난 2월 6일 테슬라 회장 일론 머스크(Elon Must)의 Roadster를 태운 우주 비행선 Falcon Heavy가 무사히 우주 궤도에 진입하는 상징적인 이벤트를 성공시킴으로써 사람들의 가슴에 우주여행의 불을 지피고 있다. 이번 발사를 성공시킨 SpaceX는 로켓 발사체를 회수 재사용할 수 있는 독보적인 기술을 보유하고 있다.&lt;/p&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/wbSwFU6tY1c&quot; width=&quot;560&quot; height=&quot;315&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;[2017.11] 4K Mask RCNN COCO Object detection and segmentation #2&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Mask R-CNN: object detection 문제와 segmentation 문제를 하나의 딥 신경망으로 처리함으로써 instance segmentation이라는 새로운 장을 연 기술. ICCV'17 비전학회 best paper 수상&lt;/p&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/OOT3UIXZztE&quot; width=&quot;560&quot; height=&quot;315&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;[2017.11] What's new, Atlas?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;BostonDynamics 아틀라스 로봇의 무시무시한 덤블링 시연. 곧 터미네이터가 출현할 듯..&lt;/p&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/fRj34o4hN4I&quot; width=&quot;560&quot; height=&quot;315&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;[2017.10] FUTURE DATA APPLICATIONS - HUMAN-LEVEL INTELLIGENT ROBOTS&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Vicarious CEO의 인상적인 talk로서 최근 AI 연구의 한계와&amp;nbsp;방향을 잘 설명&lt;/p&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/5yQGjwDmsT4&quot; width=&quot;560&quot; height=&quot;315&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;[2017.09] AlphaGo Official Trailer&lt;/b&gt;&lt;/p&gt;&lt;p&gt;알파고. 2016년 3월 9일 ~ 15일 이세돌과의 5국으로 사람들에게 인공지능(AI)의 무서움을 각인시켰던 사건. 이 분야에 있지만 당시 물이라도 한바가지 떠서 컴퓨터에 붓고 싶었던.. 그리고 4국에서의 승리의 감흥이 아직도 생생하다. 이 이야기를 담은 다큐 영화가 나온다고 한다 (아래 동영상은 영화 공식 예고편)&lt;/p&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/8tq1C8spV_g&quot; width=&quot;560&quot; height=&quot;315&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;[2017.08] What is wrong with convolutional neural nets? Fields Institute, 2017&lt;/b&gt;&lt;/p&gt;&lt;p&gt;딥러닝 창시자로 불리는 제프리 Hinton 교수의 인상적인 강연. 현재 딥러닝 연구의 문제점을 지적 (2014년 12월에도 동일한 제목의 강연을 진행)&lt;/p&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/Mqt8fs6ZbHk&quot; width=&quot;560&quot; height=&quot;315&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;2014년 12월 강연&lt;/p&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/rTawFwUvnLE&quot; width=&quot;560&quot; height=&quot;315&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;[2017.08] 8 Incredible Lifelike HUMANOID ROBOTS&lt;/b&gt;&lt;/p&gt;&lt;p&gt;현재의 대표적인 안드로이드(android) 로봇들. Asuna, Han, Actroid, Sofia, Erica, Geminoid DK, Kodomoroid &amp;amp; Otondroid, Jia Jia&lt;/p&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/dIuL4D00uOY&quot; width=&quot;560&quot; height=&quot;315&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;[2017.04] 3 principles for creating safer AI&lt;/b&gt;&lt;/p&gt;&lt;p&gt;인공지능 분야의 대가 중 한명인 Stuart Russell의 TED 강연. AI 발전이 가져올 문제, 그리고 인간과 AI가 공존하기 위한 방안을 매우 재미있게 발표. 한국어 번역 제공.&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;iframe src=&quot;https://embed.ted.com/talks/lang/ko/stuart_russell_3_principles_for_creating_safer_ai&quot; width=&quot;550&quot; height=&quot;309&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;[2017.04] How computers learn to recognize objects instantly&lt;/b&gt;&lt;/p&gt;&lt;p&gt;YOLO 개발자 Joseph Redmon의 TED 강연&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;iframe src=&quot;https://embed.ted.com/talks/lang/en/joseph_redmon_how_a_computer_learns_to_recognize_objects_instantly&quot; width=&quot;550&quot; height=&quot;309&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;[2016.12] Top 5 Future Technology Inventions, 2019 to 2050 [CRAZY HD]&lt;/b&gt;&lt;/p&gt;&lt;p&gt;접촉식 충전단자, 스크린 침대, 백팩 보드 등 아이디어가 재미있음 ^^&lt;/p&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/2VHDv44Q&quot; width=&quot;560&quot; height=&quot;315&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;[2016.11] YOLO v2&lt;/b&gt;&lt;/p&gt;&lt;p&gt;YOLO v2 물체인식 데모. CVPR'17 학회 Best Paper Honorable Mention 상 수상.&lt;/p&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/VOC3huqHrss&quot; width=&quot;560&quot; height=&quot;315&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;[2016.11] Tesla Self-Driving Demonstration (Short)&lt;/b&gt;&lt;/p&gt;&lt;p&gt;테슬라 2016 자율주행 데모. 내 차는... 아직 사이드 미러도 손으로 접어야 함.&lt;/p&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/GHgo7_F06Xw&quot; width=&quot;560&quot; height=&quot;315&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;[2016.03] Holoportation: virtual 3D teleportation in real-time (Microsoft Research)&lt;/b&gt;&lt;/p&gt;&lt;p&gt;MS 홀로포테이션, 홀로렌즈가 현실과 가상의 만남을 상징한다면 홀로포테이션은 공간과 공간의 만남을 상징&lt;/p&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/7d59O6cfaM0&quot; width=&quot;560&quot; height=&quot;315&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;[2015.04] DynamicFusion&lt;/b&gt;&lt;/p&gt;&lt;p&gt;고정된 물체가 아닌 변형하는 물체를 실시간 모델링. CVPR'15 비전학회 best paper 수상.&lt;/p&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/i1eZekcc_lM&quot; width=&quot;560&quot; height=&quot;315&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;[2015.03] Google DeepMind's Deep Q-learning playing Atari Breakout&lt;/b&gt;&lt;/p&gt;&lt;p&gt;구글 딥마인드의 아타리(벽돌깨기) 게임. 심층강화학습을 통해 게임스킬을 스스로 학습, 인간 전문가 수준에 맞먹는 게임 플레이 도달 (하지만 AI가 물리법칙을 배운 것은 아니기 때문에 마지막 벽돌 한~두개가 남았을 때에는 이를 효과적으로 깨지 못하고 공만 맞추는 수준이라 함)&lt;/p&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/V1eYniJ0Rnk&quot; width=&quot;560&quot; height=&quot;315&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;[2015.03] New Air France safety demonstration video&lt;/b&gt;&lt;/p&gt;&lt;p&gt;에어프랑스의 기내방송. 기술분야는 아니지만 프랑스를 다시 보게 만든 인상적인 영상. 이 방송을 본 후 단숨에 에어프랑스 팬이 되어 버렸다.&lt;/p&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/OtaPrKpv2E0&quot; width=&quot;560&quot; height=&quot;315&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;[2015.02] Silicon Retinas&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Event camera라고 불리는 비동기식 이미징 기술, Dynamic Vision Sensor, Silicon Retina, Neuromorphic sensor 등 다양한 이름으로 불리는 차세대 이미지 센서 기술. Hanme Kim이 이 센서를 이용한 SLAM 기술로 ECCV'16 비전학회에서 best paper 수상&lt;/p&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/AaJNxRQmxLQ&quot; width=&quot;560&quot; height=&quot;315&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;[2015.01] Microsoft HoloLens - Official Announcement Trailer (HD)&lt;/b&gt;&lt;/p&gt;&lt;p&gt;MS 홀로렌즈, 가상과 현실 공간의 만남. 걸어다니며 볼 수 있는 3차원의 혼합현실&lt;/p&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/qyzzdMkU7Fw&quot; width=&quot;560&quot; height=&quot;315&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;[2013.07] Scalable KinectFusion&lt;/b&gt;&lt;/p&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/NsrmniEvO4s&quot; width=&quot;560&quot; height=&quot;315&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;[2011.08] KinectFusion&lt;/b&gt;&lt;/p&gt;&lt;p&gt;키넥트 depth 센서와 gpu의 만남&lt;/p&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/quGhaggn3cQ&quot; width=&quot;560&quot; height=&quot;315&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;[2011.08] DTAM: Dense Tracking and Mapping in Real-Time&lt;/b&gt;&lt;/p&gt;&lt;p&gt;일반 rgb 모노카메라를 이용한 3D 복원. gpu의 막강한 연산력을 바탕으로 기존의 특징점 기반 방식에서 벗어나 모든 픽셀에 대한 추적 및 매핑 수행&lt;/p&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/Df9WhgibCQA&quot; width=&quot;560&quot; height=&quot;315&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;[2007.11] Parallel Tracking and Mapping for Small AR Workspaces (PTAM) - extra&lt;/b&gt;&lt;/p&gt;&lt;p&gt;일반 rgb 모노카메라를 이용한 3D 복원. 추적과 매핑을 분리하여 병렬적으로 처리하는&amp;nbsp;새로운 SLAM 구조를 제안&lt;/p&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/Y9HMn6bd-v8&quot; width=&quot;560&quot; height=&quot;315&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: right;&quot;&gt;by 다크 프로그래머&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>알아두면 좋은 것들</category>
      <category>기술동향</category>
      <category>동영상</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/174</guid>
      <comments>https://darkpgmr.tistory.com/174#entry174comment</comments>
      <pubDate>Thu, 30 Nov 2017 11:41:00 +0900</pubDate>
    </item>
    <item>
      <title>Matlab 핸드북 (참고용)</title>
      <link>https://darkpgmr.tistory.com/173</link>
      <description>&lt;p&gt;Matlab을 사용하다보면 가끔 함수들이 생각나지 않아서 인터넷을 검색하는데 시간을 보냅니다. 그래서 자주 쓰는 함수 사용법 목록을 정리해 봅니다. 개인적 참고용입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;행렬형 데이터 파일 입출력&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;dlmwrite('fname.txt', data, ',');&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;data = dlmread('fname.txt', ',');&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그림의 제목 및 좌표축 이름 부여&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;title('title');&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;xlabel('xlabel');&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;ylabel('ylabel');&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그림의 위치 및 크기 변경&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;h = figure;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;h.Position = [left bottom width height];&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;h.Position = [400 400 560 420];&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그림의 폰트 변경&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;h = gca;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;h.FontSize = 20;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; % default: 10&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;h.FontWeight = 'bold';&amp;nbsp; % default: 'normal'&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;h.TitleFontSizeMultiplier = 2.0;&amp;nbsp; &amp;nbsp; % default: 1.1&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;h.LabelFontSizeMultiplier = 1.2;&amp;nbsp; % default: 1.1&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그림에 범례 추가&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;plot(x1, y1, 'r', x2, y2, 'b');&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;legend('data1', 'data2');&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;legend('data1', 'data2', 'location', 'southwest');&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;좌표축 범위 지정&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;xlim([0 10]);&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;ylim([-inf&amp;nbsp;5]);&amp;nbsp; &amp;nbsp; % 최대값만 제한&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;좌표축 눈금 및 눈금라벨 변경&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;xticks([-3*pi -2*pi -pi 0 pi 2*pi 3*pi]);&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;xticklabels({'-3\pi','-2\pi','-\pi','0','\pi','2\pi','3\pi'});&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;yticks([-1 -0.8 -0.2 0 0.2 0.8 1]);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;데이터 값을 히스토그램 형태로 그리기&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;histogram('BinEdges', edges, 'BinCounts', counts);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;3차원 그래프의 시점 변경&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;view([azimuth elevation]) %&amp;nbsp;&lt;span style=&quot;color: rgb(64, 64, 64); font-family: Arial, Gulim, sans-serif; font-size: 14px;&quot;&gt;방위각(Azimuth), 고도각(Elevation), degree&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;view([0 90]);&amp;nbsp; &amp;nbsp; % xy평면을 보여줌&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;좌표축 방향&amp;nbsp;변경&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;ax = gca;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;ax.XDir = 'reverse';&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;ax.YDir = 'reverse';&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;좌표축 원점을 그림 내부에 표시&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;ax = gca;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;ax.XAxisLocation = 'origin';&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;ax.YAxisLocation = 'origin';&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그림에 그리드(grid) 추가&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;grid on;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;기타&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;linspace(x1, x2, n); % x1, x2 사이의 균일간격 n개 데이터 생성 (x1, x2 포함 n개)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: right;&quot;&gt;by 다크 프로그래머&lt;/p&gt;</description>
      <category>프로그래밍</category>
      <category>matlab</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/173</guid>
      <comments>https://darkpgmr.tistory.com/173#entry173comment</comments>
      <pubDate>Tue, 21 Nov 2017 15:09:11 +0900</pubDate>
    </item>
    <item>
      <title>아이와 수학 공부하기</title>
      <link>https://darkpgmr.tistory.com/172</link>
      <description>&lt;p&gt;저희 아이는 저랑 수학 문제 푸는 것을 매우 좋아합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아직 초등학교 저학년이라서 40 더하기 53은? 이런거 묻고 푸는 정도입니다 ^^. 그래도 어쨌든 문제 푸는걸 좋아하니 나름 문제내는 재미가 있습니다. (답을 맞추면 엄청 좋아합니다)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;한번은 48 더하기 16이 얼마냐고 물으니 64라고 대답합니다. 그래서 왜 64냐 한번 설명을 해 봐라고 했더니 16에서 2를 빌려다가 48에 더하면 50이고 남은&amp;nbsp;14를 더하면 64가 나온다고 합니다. 제법 놀라운 설명이라 천재 아닌가? 하고 깜짝 놀랐었는데, 나중에 알고보니 '가르기'라고 요즘은 학교에서 그런 방식을 가르치는 것 같습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그리고 가끔은 곱셈 문제도 내는데, 5 곱하기 3이 뭐냐라고 물으면 15라고 대답합니다. 그럼 왜 15냐라고 물으면 5 곱하기 3은 5가 3개 있다는 것이니까, 5에 5를 더하면 10, 여기에 5를 더하면 15라고 대답합니다. 곱셈의 의미를 정확히 알고 있으니 제법 대견합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그런데, 7단, 8단, 9단은 어려워서 구구단을 햇갈려 합니다. 그래서 7 곱하기 3이 뭐냐라고 물으면 24? 20? 찍기 시작합니다. 곱셈의 의미를 알고 있다고 하더라도 막상 7단에는 적용할 생각을 못하니 그래도 아직 어린아이이고 평범해서 좋습니다. ^^&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그럼 이번에는 난이도를 높여서 10 곱하기 3이 뭐냐라고 물으니 30이라고 대답합니다. 그럼 3 곱하기 10은 뭐냐 하고 물으니 조금 생각하더니 30이라고 대답합니다. 그런데, 왜 3 곱하기 10이 30인지 설명해보라고 하니 10 곱하기 3은 30이고, 10 곱하기 3하고 3 곱하기 10이 같기 때문에 30이라고 답합니다. 곱셈의 순서를 바꾸어도 결과가 같다는 것을 알고 있는 것이지요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그런데, 왜 10 곱하기 3하고 3 곱하기 10이 같아? 왜 곱셈은 순서를 바꾸어도 같아? 하고 물으니 난관에 봉착합니다. 한참 생각하더니 칠판에 동그라미 10개를 3번 그리고 나서 갯수를 셉니다. 그리고 동그라미 3개를 10번 그리고 나서 또 개수를 셉니다. 그리고 나서는 '봐바요 둘다 30으로 같잖아요'라고 합니다. 역시 어린아이다운 설명이라 좋습니다 ^^. 그래 맞아. 그런데 왜 그게 같지? 왜 그런지 설명할 수 있겠어? 하고 다시 물으니 한참을 고민하더니 답을 못합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아직까지는 답을 듣지 못했습니다. 제가 설명해 줄 수도 있겠지만 그보다는 언젠가는 스스로 답을 찾게 될 날이 있겠지요.. ^^&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: right;&quot;&gt;by 다크 프로그래머&lt;/p&gt;</description>
      <category>수학 이야기</category>
      <category>수학</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/172</guid>
      <comments>https://darkpgmr.tistory.com/172#entry172comment</comments>
      <pubDate>Wed, 15 Nov 2017 17:53:43 +0900</pubDate>
    </item>
    <item>
      <title>Fourier Transform(푸리에 변환)의 이해와 활용</title>
      <link>https://darkpgmr.tistory.com/171</link>
      <description>&lt;p&gt;푸리에 변환(Fourier transform)에 대해서는 예전부터 한번 정리를 해야겠다고 생각만 했었는데 이번에 기회가 되어 글을 올립니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;푸리에 변환(Fourier transform)은 신호처리, 음성, 통신 분야에서 뿐만 아니라 영상처리에서도 매우 중요한 개념으로 다양한 응용을 가지고 있습니다. 영상을 주파수 성분으로 변환하여 다양한 분석 및 처리를 할 수 있고 임의의 필터링 연산을 fft(fast Fourier transform)를 이용하여 고속으로 구현할 수도 있습니다. 그리고 푸리에 변환과 같은&amp;nbsp;근원적인 이론들은 특정 응용에 국한되지 않기 때문에 한번 알아두면 분야를 떠나서 두고두고 도움이 됩니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이 글에서는 푸리에 변환(Fourier transform)이 무엇이고 어디에 쓸 수 있는지, 그리고 어떻게 쓸 수 있는지 직관적 이해와 유용한 성질들, 영상처리 응용, 그리고 푸리에 변환(Fourier transform)을 실제 활용하는데 있어서 필요한 사항들을 최대한 직관적으로&amp;nbsp;정리하고자 합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그동안 푸리에 변환(Fourier transform)에 대해 개인적으로 가지고 있었던 의문은 푸리에 변환을 통해 얻어지는 스펙트럼과 페이즈(phase) 중 페이즈(phase)가 무엇인가? 그리고 푸리에 주파수 공간의 좌표값을 어떻게 해석할까입니다. 아마도 비슷한 의문을 가진 분들도&amp;nbsp;꽤 있을 것으로 생각됩니다. 이 글을 통해서 그러한 의문에 대한 답도 같이 다루게 됩니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;1. 푸리에 변환(Fourier transform) - 직관적 이해&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;모든 공부의 시작은 핵심 개념을 정확히 이해하는데 있다. 그리고 그 이해는 가급적 직관적일수록 좋다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;푸리에 변환(Fourier transform)을 직관적으로 설명하면 푸리에 변환은 &lt;span style=&quot;color: rgb(255, 0, 127);&quot;&gt;임의의 입력 신호를 다양한 주파수를 갖는 주기함수들의 합으로 분해하여 표현&lt;/span&gt;하는 것이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;좀더 들어가면, 푸리에 변환에서 사용하는 주기함수는 sin, cos 삼각함수이며 푸리에 변환은 고주파부터 저주파까지 다양한 주파수 대역의 sin, cos 함수들로 원본 신호를 분해하는 것이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래 그림(그림 1)의 예를 보자. 맨 앞의 붉은 색 신호는 입력 신호이고 뒤의 파란색 신호들은 푸리에 변환(Fourier transform)을 통해 얻어진 (원본 신호를 구성하는) 주기함수 성분들이다. 각각의 주기함수 성분들은 고유의 주파수(frequency)와 강도(amplitude)를 가지고 있으며&amp;nbsp;&lt;b&gt;이들을 모두 합치면 원본 붉은색 신호&lt;/b&gt;가 된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 470px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9967FA3359B63D8122&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9967FA3359B63D8122&quot; width=&quot;470&quot; height=&quot;216&quot; filename=&quot;fft_concept.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;그림 1. 푸리에 변환 (그림출처: &lt;a href=&quot;https://en.wikipedia.org/wiki/Fourier_transform&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;위키피디아&lt;/a&gt;)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;여기서 입력 신호는 전파, 음성 신호 등과 같이 시간축(time)에 대해 정의된 신호일 수도 있고 이미지(image) 등과 같이 공간축에 대해 정의된 신호일 수도 있다. 통신 분야에서는 푸리에 변환(Fourier transform)을 time domain에서 frequency domain으로의 변환이라고 하고, 컴퓨터 비전(computer vision), 영상처리 쪽에서는 spatial domain에서 frequency domain으로의 변환이라고 부른다. 명칭이야 어쨌든 그 핵심은 입력 신호를 sin, cos의 주기성분으로 분해하는 것이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;푸리에 변환(Fourier transform)의 대단한 점은 입력 신호가 어떤 신호이든지 관계없이 임의의 입력 신호를 sin, cos 주기함수들의 합으로 항상 분해할 수 있다는 것이다. 그리고 그 과정을 수식으로 표현한 것이 푸리에 변환식이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;2. 푸리에 변환(Fourier transform) - 수식적 이해&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;어떤 개념을 직관적으로 이해했다면 그 개념에 대한 수식적 이해는 그 개념을 한층 풍성하고 깊이있게 이해하게 해 준다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;푸리에 변환(Fourier transform)은 프랑스의 수학자 Joseph Fourier (1768 ~ 1830)가 제안한 방법으로서 수학사(해석학)의 역사가 새로 씌여질 정도로 대단한 발견이었다고 한다. 그 유명한 푸리에 변환의 수식은 다음과 같다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;txc-formula&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/998C563359B7421922&quot; historydata=&quot;%3Cflashrichtext%20version%3D%221%22%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28f%28x%29%3D%5Cint%20_%7B%20-%5Cinfty%20%20%7D%5E%7B%20%5Cinfty%20%20%7D%7B%20F%28u%29e%5E%7B%20j2%5Cpi%20ux%20%7Ddu%20%7D%20%29%3C/textformat%3E%0A%3C/flashrichtext%3E%2C%0A12%2C%0Atransparent&quot; width=&quot;171&quot; height=&quot;37&quot;&gt;, --- (1)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;txc-formula&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/99C8D63359B7422022&quot; historydata=&quot;%3Cflashrichtext%20version%3D%221%22%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28F%28u%29%3D%5Cint%20_%7B%20-%5Cinfty%20%20%7D%5E%7B%20%5Cinfty%20%20%7D%7B%20f%28x%29e%5E%7B%20-j2%5Cpi%20ux%20%7Ddx%20%7D%20%29%3C/textformat%3E%0A%3C/flashrichtext%3E%2C%0A12%2C%0Atransparent&quot; width=&quot;175&quot; height=&quot;37&quot;&gt;. --- (2)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;여기서 &lt;i&gt;j&lt;/i&gt;는 허수단위 &lt;img class=&quot;txc-formula&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/99179B3359B7435709&quot; historydata=&quot;%3Cflashrichtext%20version%3D%221%22%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28j%3D%5Csqrt%20%7B%20-1%20%7D%20%29%3C/textformat%3E%0A%3C/flashrichtext%3E%2C%0A10%2C%0Atransparent&quot; width=&quot;59&quot; height=&quot;19&quot;&gt;,&amp;nbsp;f(x)는 원본 입력 신호, e&lt;sup&gt;j2πux&lt;/sup&gt;는 주파수 u인 주기함수 성분, F(u)는 해당 주기함수 성분의 계수(coefficient)를 나타낸다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;일단 식을 있는 그대로 해석하면 식 (1)은 &lt;span style=&quot;color: rgb(255, 0, 127);&quot;&gt;입력신호 f(x)가 e&lt;sup&gt;j2πux&lt;/sup&gt;들의 합으로 표현(분해)된다&lt;/span&gt;는 의미이다 (&lt;a href=&quot;http://darkpgmr.tistory.com/45&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;적분은 합한다는 의미를 갖는다&lt;/a&gt;). 그리고 식 (2)는 f(x)를 주기함수 성분으로 분해했을 때의 계수(coefficient) F(u)가 식 (2)로 주어진다는 의미이다. 앞서 그림 1과 연관해 보면 e&lt;sup&gt;j2πux&lt;/sup&gt;는 f(x)를 구성하는 (파란색의 주파수 u인) 주기함수 성분들이고 F(u)는 해당 주기함수 성분의 강도(amplitude)를 나타낸다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;☞ 푸리에 변환에 대한 일반적인 설명 방식은 두번째 식 (2)를 푸리에 변환이라고 정의하고 첫번째 식 (1)을 푸리에 역변환(inverse Fourier transform)이라고 정의하는 것이다. 그리고 푸리에&amp;nbsp;역변환을 하면 다시 원래의 함수로 돌아온다고 한다. 하지만 이러한 &lt;span style=&quot;color: rgb(255, 0, 127);&quot;&gt;기계적인 이해&lt;/span&gt;(푸리에 변환을 어디 하늘에서 뚝 떨어진 정의로만 받아들이는 것)는&amp;nbsp;푸리에 변환의 본질을 이해하는데 별 도움이 되지 않는다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이제 식으로 좀더 들어가 보자. 일단, 식 자체는 푸리에 변환의 대단함에 비추어 매우 단순하다 (Simple is the best!!). 다만 한 가지 e&lt;sup&gt;j2πux&lt;/sup&gt;의 의미만 이해하면 된다. 그리고 이를 위해서는 오일러 공식(Euler's formula)이 필요하다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;오일러 공식(Euler's formula)은 복소지수함수를 삼각함수로 변환할 수 있도록 하는 유명한 식이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;txc-formula&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/991BF33359B784D305&quot; historydata=&quot;%3Cflashrichtext%20version%3D%221%22%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28e%5E%7B%20j%5Ctheta%20%20%7D%3D%5Ccos%20%20%5Ctheta%20+j%5Csin%20%20%5Ctheta%20%29%3C/textformat%3E%0A%3C/flashrichtext%3E%2C%0A12%2C%0Atransparent&quot; width=&quot;139&quot; height=&quot;23&quot;&gt;&amp;nbsp;--- (3)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;식 (3)은 증명 가능한 식이며 그 증명은 &lt;a href=&quot;https://ko.wikipedia.org/wiki/오일러의_공식&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;인터넷에서 어렵지 않게 찾을 수 있다&lt;/a&gt;. 어쨌든&amp;nbsp;오일러 공식을 이용하면 식 (1)의 e&lt;sup&gt;j2πux&lt;/sup&gt;는 실수부가 cos(2πux), 허수부가 sin(2πux)인 주기함수임을 알 수 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;txc-formula&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/99FE033359B796DA40&quot; historydata=&quot;%3Cflashrichtext%20version%3D%221%22%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28e%5E%7B%20j2%5Cpi%20ux%20%7D%3D%5Ccos%20%202%5Cpi%20ux+j%5Csin%20%202%5Cpi%20ux%29%3C/textformat%3E%0A%3C/flashrichtext%3E%2C%0A12%2C%0Atransparent&quot; width=&quot;217&quot; height=&quot;23&quot;&gt;&amp;nbsp;--- (4)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;여기서 cos(2πux), sin(2πux) 모두 주기(period)가 1/u, 주파수(frequency) u인 주기함수이므로 결국 &lt;span style=&quot;color: rgb(255, 0, 127);&quot;&gt;e&lt;/span&gt;&lt;sup&gt;&lt;span style=&quot;color: rgb(255, 0, 127);&quot;&gt;j2πux&lt;/span&gt;&lt;/sup&gt;&lt;span style=&quot;color: rgb(255, 0, 127);&quot;&gt;는 주파수 u인 정현파(sinusoidal wave)의 복소지수함수 표현&lt;/span&gt;임을 알 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: square;&quot;&gt;&lt;ul style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;주기: 파동이 한번 진동하는데 걸리는 시간, 또는 그 길이. sin(wx)의 주기는 2π/w 임.&lt;/li&gt;&lt;li&gt;주파수: 1초 동안의 진동 횟수. 주파수와 주기는 서로 역수 관계 (주파수 = 1/주기)&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;☞ 정현파(sinusoidal wave)는 파형이 sin 또는 cos&amp;nbsp;함수인 파동(wave)을 말한다. 그런데, 여기서 왜 갑자기 복소수가 나오고 또 주기함수를 저렇게 표현하느냐고 따질 수 있다. 하지만 여기서는 그냥 복수지수함수는 정현파(sinusoidal wave)를 표현하는 방법 중 하나라는 정도로만 알아두자. 정현파 및 복수지수함수 표현에 대한 보다 자세한 내용은 AngeloYeo님의 &lt;a href=&quot;https://wikidocs.net/4175&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;페이저(phasor)에 대한 설명글&lt;/a&gt;을 참고하기 바란다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이제 다시 원래의 식 (1), (2)로 돌아가 보자. &lt;span style=&quot;color: rgb(255, 0, 127);&quot;&gt;식 (1)은 함수 f(x)를 모든 가능한 주파수(u)의 주기함수들(e&lt;/span&gt;&lt;sup&gt;&lt;span style=&quot;color: rgb(255, 0, 127);&quot;&gt;j2πux&lt;/span&gt;&lt;/sup&gt;&lt;span style=&quot;color: rgb(255, 0, 127);&quot;&gt;)의 일차결합으로 표현한 것이다. 그리고 그 일차결합 계수 F(u)는 식 (2)로 항상 주어질 수 있다&lt;/span&gt;는 것이 요지이다. 이와 같이 푸리에 변환식을 볼 수 있다면 푸리에 변환의 핵심을 이해한 것이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;☞ 식 (1), (2)의 푸리에 변환(Fourier transform)식은 언뜻 보면 정의(definition)로 보이지만 사실은 증명해야 할&amp;nbsp;정리(theorem)이다. 즉, 식 (2)의 F(u)를 식 (1)에 대입하면 항상 f(x)가 나옴을 증명해야 한다. 이것이 증명되면 모든 임의의 신호함수는 항상 주기함수들의 일차결합으로 분해될 수 있음이 증명되는 것이다 (&lt;a href=&quot;https://ghebook.blogspot.kr/2012/07/fourier-series.html&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;증명은 이곳 참조&lt;/a&gt;).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;마지막으로, (증명은 아니지만) 왜 일차결합의 계수 F(u)가 식 (2)로 주어지는지를 선형대수학과 연관지어 직관적으로 이해해 보자. 식 (1)에서 e&lt;sup&gt;j2πux&lt;/sup&gt;, u = 0, ±1, ±2, ...은 모든 신호를 생성할 수 있는 직교(orthogonal) 기저(basis) 함수들로 볼 수 있다 (편의상&amp;nbsp;u를 정수 범위로 표기했으나 u는 실수 전체 범위임). 그러면&amp;nbsp;입력 신호 f(x)를 이들 기저함수들로 분해했을 때의 계수 F(u)는 f(x)와 기저함수의 내적(dot product)으로 계산될 수 있다 (아래의 ☞선형대수학 관련 설명 참조). 식 (2)는 f(x)와 e&lt;sup&gt;j2πux&lt;/sup&gt;의 함수 내적이기 때문에 그 결과는 f(x)를 e&lt;sup&gt;j2πux&lt;/sup&gt;들로 분해했을 때의 계수가 된다. 따라서, F(u)가 식 (2)로 주어지는 이유가 설명이 되었다. 참고로, 식 (2)에서 j 앞에 -가 붙은 이유는 복소수에서의 내적은 어느 한쪽에 켤레(conjugate) 복소수를 취한 후 계산되기 때문이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;☞ 선형대수학(linear algebra)에서는 어떤 벡터 공간을 생성할 수 있는 일차독립인 벡터들의 집합을 기저(basis)라고 한다. 만일 기저(basis) 벡터들이 v1, v2, ..., vn라 하면 이 벡터공간에 속하는 임의의 벡터 v는 v = a1v1 + a2v2 + ... + anvn (ai는 상수)와 같이 기저 벡터들의 일차결합으로 표현될 수 있다 (왜냐하면 vi들이 이 벡터공간의 모든 벡터들을 생성할 수 있으니까). 그런데 만일 기저벡터들이 서로 수직(vi·vj = 0)인 단위벡터라면 일차결합 계수 ai는 내적을 이용하여 ai = v·vi로 손쉽게 계산할 수 있다 (∵ v·vi = (a1v1 + ... + anvn)·vi = ai*(vi·vi) = ai). 어떤 벡터와 기저(basis) 벡터를 내적하면 이 벡터에 포함된 기저 성분의 계수가 얻어진다는 것은 선형대수학에서 매우 유용한 성질이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;☞ F(u)가 식 (2)로 주어지는 이유에 대한&amp;nbsp;선형대수학적 설명은 개인적 이해 방식이라서 증명이 있거나 근거 문헌이 있는 내용은 아닙니다. 그냥 그런 식으로 이해할 수도 있구나 하고 참고만 하기 바랍니다. 정말 그런지 수학적으로 증명해 봐라 하면 골치아픕니다..&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;3. 이미지(영상신호)에서의 푸리에 변환(Fourier transform)&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;푸리에 변환(Fourier transform)을 영상처리에 적용하기 위해서는 이미지(영상신호)가 가지고 있는 몇 가지 차이점을 인지해야 한다. 먼저, 이미지는 2차원의(x축 방향의 변화와 y축 방향의 변화가 동시에 포함된) 신호이기 때문에 2차원에서 정의되는 푸리에 변환이 필요하다. 2차원 신호에 대한 푸리에 변환(Fourier transform)은 다음과 같이 정의된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;txc-formula&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/993B073359B875CE36&quot; historydata=&quot;%3Cflashrichtext%20version%3D%221%22%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28f%28x%2Cy%29%3D%5Cint%20_%7B%20-%5Cinfty%20%20%7D%5E%7B%20%5Cinfty%20%20%7D%20%5Cint%20_%7B%20-%5Cinfty%20%20%7D%5E%7B%20%5Cinfty%20%20%7D%7B%20F%28u%2Cv%29e%5E%7B%20j2%5Cpi%20%28ux+vy%29%20%7Ddudv%20%7D%20%29%3C/textformat%3E%0A%3C/flashrichtext%3E%2C%0A12%2C%0Atransparent&quot; width=&quot;270&quot; height=&quot;37&quot;&gt;,&amp;nbsp;--- (5)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;txc-formula&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/998C953359B876000F&quot; historydata=&quot;%3Cflashrichtext%20version%3D%221%22%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28F%28u%2Cv%29%3D%5Cint%20_%7B%20-%5Cinfty%20%20%7D%5E%7B%20%5Cinfty%20%20%7D%20%5Cint%20_%7B%20-%5Cinfty%20%20%7D%5E%7B%20%5Cinfty%20%20%7D%7B%20f%28x%2Cy%29e%5E%7B%20-j2%5Cpi%20%28ux+vy%29%20%7Ddxdy%20%7D%20%29%3C/textformat%3E%0A%3C/flashrichtext%3E%2C%0A12%2C%0Atransparent&quot; width=&quot;274&quot; height=&quot;37&quot;&gt;. --- (6)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;단, 여기서 F(u, v)는 x축 방향으로 주파수(frequency) u, y축 방향으로 v인 주기함수 성분의 계수이다. 그리고 그 값은 식 (6)에 의해 계산된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그런데 이미지는 연속(continuous)이 아닌 이산(discrete) 신호이다. 그리고 한정된 유한(finite) 구간에서 정의되는 신호이다. 따라서, 이산 데이터에서 정의되는 푸리에 변환이 필요하다. W x H 크기의 이미지 f(x, y)에 대한 이산 푸리에 변환(discrete Fourier transform)은 다음과 같이 정의된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;txc-formula&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/99FE293359BF6B7B28&quot; historydata=&quot;%3Cflashrichtext%20version%3D%221%22%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28f%28x%2Cy%29%3D%5Csum%20_%7B%20u%3D0%20%7D%5E%7B%20W-1%20%7D%20%5Csum%20_%7B%20v%3D0%20%7D%5E%7B%20H-1%20%7D%7B%20F%28u%2Cv%29e%5E%7B%20j2%5Cpi%20%28ux/W+vy/H%29%20%7D%20%7D%20%29%3C/textformat%3E%0A%3C/flashrichtext%3E%2C%0A12%2C%0Atransparent&quot; width=&quot;256&quot; height=&quot;56&quot;&gt;,&amp;nbsp;---(7)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;txc-formula&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/99B2BF3359BF6B610F&quot; historydata=&quot;%3Cflashrichtext%20version%3D%221%22%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28F%28u%2Cv%29%3D%5Cfrac%20%7B%201%20%7D%7B%20WH%20%7D%20%5Csum%20_%7B%20x%3D0%20%7D%5E%7B%20W-1%20%7D%20%5Csum%20_%7B%20y%3D0%20%7D%5E%7B%20H-1%20%7D%7B%20f%28x%2Cy%29e%5E%7B%20-j2%5Cpi%20%28ux/W+vy/H%29%20%7D%20%7D%20%29%3C/textformat%3E%0A%3C/flashrichtext%3E%2C%0A12%2C%0Atransparent&quot; width=&quot;307&quot; height=&quot;56&quot;&gt;.&amp;nbsp;---(8)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;단, x = 0, 1, ..., W-1, y = 0, 1, ..., H-1이고 u = 0, 1, ..., W-1, v = 0, 1, ..., H-1.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;식 (7)에서 e&lt;sup&gt;j2π(ux/W+vy/H)&lt;/sup&gt;는 &lt;span style=&quot;color: rgb(255, 0, 127);&quot;&gt;x축 방향으로 주파수가 u/W, y축 방향으로 주파수가 v/H&lt;/span&gt;인 sinusoidal 주기함수이다 (by 오일러 공식). 일반적인 푸리에 변환식과는 달리 &lt;span style=&quot;color: rgb(255, 0, 127);&quot;&gt;W와 H로의 나누기&lt;/span&gt;가 들어있음에 유의해야 하며 이는 데이터가 정의된 구간을 하나의 단위 주기(unit period)로 만드는 효과가 있다. 일종의 정규화 팩터(normalization factor)라고 생각하면 된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;여기서 2D 이미지를 어떻게 신호로 해석할 수 있는지, 그리고 2D 정현파(sinusoidal wave) e&lt;sup&gt;j2π(ux/W+vy/H)&lt;/sup&gt;가 도대체 어떤 모습일지 아마도 의아해할 수 있다. 첫째, 이미지를 신호로 해석하는 문제는 x 또는 y축을 시간축으로 놓고 좌표의 변화에 따라 변하는 이미지 픽셀의 밝기 변화를 신호로 생각하면 쉽게 이해할 수 있다. 다음으로, 2D에서 정의되는 정현파(sinusoidal wave)의 모습은 아래 그림과 같이 모든 방향으로의 단면이 sinusoidal이 되는 물결 형태의 파동을 생각하면 된다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 550px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9906EE3359BF835C18&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9906EE3359BF835C18&quot; width=&quot;550&quot; height=&quot;328&quot; filename=&quot;sinusoidal_2d.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;그림 2. 2D에서의 sinusoidal wave&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;앞서 그림 1의 1D 푸리에 변환의 경우와 유사하게 생각해 보면, 이미지에 대한 푸리에 변환(Fourier transform)은 그림 2와 같은 형태의 다양한&amp;nbsp;2D 정현파들의 합으로 이미지를 분해하여 표현하는 것으로 이해할 수 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이미지에 대한 푸리에 변환(Fourier transform)에서 한 가지 주의해야 할 것은 푸리에 변환의 계수 F(u, v)가 e&lt;sup&gt;j2π(ux+vy)&lt;/sup&gt;의 계수가 아니라 e&lt;sup&gt;j2π(ux/W+vy/H)&lt;/sup&gt;의 계수라는 점이다. 즉, &lt;span style=&quot;color: rgb(255, 0, 127);&quot;&gt;이산 푸리에 변환에서 F(u, v)는 주파수 u, v 성분이 아니라 주파수 u/W, v/H 성분에 대한 계수&lt;/span&gt;를 나타낸다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;W × H 이미지에 대한 이산 푸리에 변환에서 F(u, v)는&lt;/p&gt;&lt;p&gt;- x축 주파수 u/W, y축 주파수 v/H인 주기함수 성분에 대응&lt;/p&gt;&lt;p&gt;- 주기로는 x축 방향 W/u 픽셀, y축 방향 H/v 픽셀인 주기성분을 나타냄 (주기 = 1/주파수)&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;☞ 바로 이 부분이 개인적으로 푸리에 변환에 대해서 혼동스러웠던 부분 중 하나이다. W x H 이미지의 푸리에 변환에서 F(u, v)는 주파수 u, v의 성분이 아니라 주파수 u/W, v/H 성분이다. 따라서, 주파수 공간에서 특정 F(u, v) 값이 높게 나타났다면 원래의 이미지 공간에서는 x축 방향으로 주기가 W/u 픽셀, y축 방향 주기가 H/v 픽셀인 주기성 성분이 존재한다는 의미가 된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;참고로, 1차원에서의 함수 f(x), x = 0, 1, 2, ..., W-1에 대한 이산 푸리에 변환(discrete Fourier transform)은 다음과 같이 정의된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;txc-formula&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/99C04C3359B87BDE17&quot; historydata=&quot;%3Cflashrichtext%20version%3D%221%22%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28f%28x%29%3D%5Csum%20_%7B%20u%3D0%20%7D%5E%7B%20W-1%20%7D%7B%20F%28u%29e%5E%7B%20j2%5Cpi%20ux/W%20%7D%20%7D%20%2C%5Cquad%20x%3D0%2C1%2C...%2CW-1%29%3C/textformat%3E%0A%3C/flashrichtext%3E%2C%0A12%2C%0Atransparent&quot; width=&quot;281&quot; height=&quot;56&quot;&gt;&amp;nbsp;--- (9)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;txc-formula&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/99BDEE3359B87C061C&quot; historydata=&quot;%3Cflashrichtext%20version%3D%221%22%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28F%28u%29%3D%5Cfrac%20%7B%201%20%7D%7B%20W%20%7D%20%5Csum%20_%7B%20x%3D0%20%7D%5E%7B%20W-1%20%7D%7B%20f%28x%29e%5E%7B%20-j2%5Cpi%20ux/W%20%7D%20%7D%20%2C%5Cquad%20u%3D0%2C1%2C...%2CW-1%29%3C/textformat%3E%0A%3C/flashrichtext%3E%2C%0A12%2C%0Atransparent&quot; width=&quot;323&quot; height=&quot;56&quot;&gt;&amp;nbsp;--- (10)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;☞ 1차원 이산 푸리에 변환(discrete Fourier transform)식은 실제 푸리에 변환을 컴퓨터로 구현하는데 있어서 가장 기본이 되는 식이다. 왜냐하면 파동과 같은 연속 신호라 할지라도 실제 분석에 있어서는 샘플링된 이산 데이터를 이용해야 하고 2차원 푸리에 변환에 대한 구현도 내부적으로는 1차원 푸리에 변환을 이용하여 구현되기 때문이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;4. 푸리에 스펙트럼(spectrum)과 페이즈(phase)&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이제 실제로 푸리에 변환(Fourier transform)을 통해 얻어지는 F(u, v) 값들이 어떤 의미를 가지며 어떤 형태(visualization)를 갖는지 살펴보자.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;푸리에 변환을 통해 얻어지는 F(u, v)는 복소수(complex number)이며 실수부(Real)와 허수부(Imaginary)로 구성된다 (1차원 푸리에 변환의 경우도 마찬가지이다).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;txc-formula&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/9942343359C0D24E30&quot; historydata=&quot;%3Cflashrichtext%20version%3D%221%22%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28F%28u%2Cv%29%3DR%28u%2Cv%29+jI%28u%2Cv%29%29%3C/textformat%3E%0A%3C/flashrichtext%3E%2C%0A12%2C%0Atransparent&quot; width=&quot;168&quot; height=&quot;21&quot;&gt;&amp;nbsp;--- (11)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이 때, 복소수 F(u, v)의 크기 |F(u, v)|를 푸리에 변환의 spectrum(스펙트럼) 또는 magnitude라고 부르고, F(u, v)의 각도 Φ를 phase(페이즈) angle 또는 phase spectrum이라고 부른다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;txc-formula&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/99A76F3359C0D4870A&quot; historydata=&quot;%3Cflashrichtext%20version%3D%221%22%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28%5Cleft%7C%20F%28u%2Cv%29%20%5Cright%7C%20%3D%5Cleft%5B%20R%5E%7B%202%20%7D%28u%2Cv%29+I%5E%7B%202%20%7D%28u%2Cv%29%20%5Cright%5D%20%5E%7B%201/2%20%7D%29%3C/textformat%3E%0A%3C/flashrichtext%3E%2C%0A12%2C%0Atransparent&quot; width=&quot;228&quot; height=&quot;25&quot;&gt;&amp;nbsp;--- (12)&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;txc-formula&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/997C8E3359C0D4E932&quot; historydata=&quot;%3Cflashrichtext%20version%3D%221%22%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28%5Cphi%20%28u%2Cv%29%3D%5Ctan%20%5E%7B%20-1%20%7D%20%5Cleft%5B%20%5Cfrac%20%7B%20I%28u%2Cv%29%20%7D%7B%20R%28u%2Cv%29%20%7D%20%20%5Cright%5D%20%29%3C/textformat%3E%0A%3C/flashrichtext%3E%2C%0A12%2C%0Atransparent&quot; width=&quot;195&quot; height=&quot;50&quot;&gt;&amp;nbsp;--- (13)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;A. 푸리에 스펙트럼(Fourier spectrum)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;먼저, 푸리에 스펙트럼(Fourier spectrum)에 대해 살펴보자. 푸리에 스펙트럼은 해당 주파수 성분이 원 신호(이미지)에 얼마나 강하게 포함되어 있는지를 나타낸다. W x H 이미지를 푸리에 변환(Fourier transform)하면 식 (7), (8)에 의해&amp;nbsp;W x H의 F(u, v), u = 0, ..., W-1, v = 0, ..., H-1 가 얻어진다. 따라서, |F(u, v)|를 픽셀값으로 잡으면 아래 예와 같이 푸리에 스펙트럼을 원본 이미지와 동일한 크기의 이미지로 시각화할 수 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 550px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/993C0C3359C8493E0D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F993C0C3359C8493E0D&quot; width=&quot;550&quot; height=&quot;214&quot; filename=&quot;fft_sample.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;그림 3. 푸리에 스펙트럼(spectrum)과 좌표계&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;(a) 입력 이미지, (b) 푸리에 스펙트럼, (c) shifted 스펙트럼&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;푸리에 스펙트럼(Fourier spectrum)을 이미지로 시각화하는 데에는 2가지 문제점이 있다. 먼저, 푸리에 스펙트럼은 저주파 영역은 매우 큰 값을 갖는 반면에 대부분의 다른 영역은 0에 가까운 값을 갖는다. 따라서 푸리에 스펙트럼을 그대로 이미지로 시각화하면 검은 바탕 위에 흰점 하나만 존재하는 형태가 된다. 이러한 문제를 해결하기 위해서 스펙트럼을 이미지로 표현할 때에는 그림 3(b)처럼 스펙트럼에 log를 취하는 것이 일반적이다. 다음으로, 원래의 스펙트럼 이미지는 그림 3(b)처럼 모서리로 갈수록 값이 높아지기 때문에 스펙트럼의 형태를 파악하기 힘들다. 따라서 이러한 문제를 해결하기 위해 그림 3(c)처럼 원점이 중심(center)에 오도록 스펙트럼의 위치를 이동시킨(shift) 형태의&amp;nbsp;이미지를 사용하는 것이 일반적이다 (아래 ☞설명 참조). 앞으로 푸리에 스펙트럼 이미지라 하면 그림 3(c)와 같은 shifted 스펙트럼 이미지를 생각하면 된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;☞ 그림 3(c)와 같은 shift가 가능한 이유는 푸리에 스펙트럼이 원점대칭인 주기함수이기 때문이다. 사실 식 (9), (10)로 주어지는 &lt;span style=&quot;color: rgb(255, 0, 127);&quot;&gt;이산 푸리에 변환(discrete Fourier transform)식은 f(x)가 주기함수일 때에만 성립&lt;/span&gt;하는 식이다. 원래의 입력신호 f(x)는 x = 0, 1, ..., W-1의 유한 구간에서 정의된 함수이다. 우리가 관심있는 부분은 0 ~ W-1 구간에서의 특성이므로 그 외의 구간에 대해서는 함수를 어떻게 정의해도 무방하다. 따라서, 푸리에 변환 적용을 위해 이 함수를 확장하여 f(x + W) = f(x)인 주기함수(0 ~ W-1에서의 함수값이 다른 구간에서도 계속 반복)로 가정하고 식을 세운 것이 식 (9), (10)이다. 이 때, F(u) 또한 f(x)와 동일한 주기(W)의 주기함수가 된다. 즉. F(u) = F(u + W). 또한 식 (10)에서 |F(u)| = |F(-u)|임도 쉽게 알 수 있다. 즉, 이산 푸리에 스펙트럼은 원점대칭이면서 W를 주기로 하는 주기함수 형태임을 알 수 있다. 2차원의 경우도 마찬가지이며 F(u, v) = F(u + W, v) = F(u, v+ H) = F(u + W, v + h), |F(u, v)| = |F(-u, -v)|인 주기함수가 된다. 그리고 이러한 원점 대칭성과 주기성으로 인해 스펙트럼 이미지를 그림 3(c)와 같이 shift하여 표현하는 것이 가능해진다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;shifted 스펙트럼을 이해하기 위해 한 예로 아래 그림 4의 왼쪽과 같은 형태의 스펙트럼 신호를 생각해 보자. 그런데 만일 스펙트럼이 원점대칭이고 W를 주기로 반복된다면 푸리에 스펙트럼은 오른쪽과 같은 형태가 될 수밖에 없음을 알 수 있다. 원래의 푸리에 스펙트럼의 형태는&amp;nbsp;구간 0 ~ W의 형태(그림 3b)이지만 (어차피 정보가 반복되기 때문에) 이를 구간 -W/2 ~ W/2 형태(그림 3c)로 shift하여 표현한 것이 shifted 스펙트럼이다.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 550px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9930183359C85EB809&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9930183359C85EB809&quot; width=&quot;550&quot; height=&quot;95&quot; filename=&quot;shifted_spectrum.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;그림 4. 푸리에 스펙트럼의 주기 특징&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;B. 푸리에 스펙트럼의 해석&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;앞서 푸리에 스펙트럼(Fourier spectrum)은 해당되는 주파수 성분의 강도를 나타난다고 했는데, 정말 그런지 그리고 이 값이 이미지 도메인에서 어떻게 해석될 수 있는지 실제&amp;nbsp;예를 통해서 살펴보자.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래 예는 이미지에 인위적으로 주기성분을 추가하였을 때 주파수 공간에서의 푸리에 스펙트럼이 어떻게 변하는지를 보여준다. 원본 이미지의 해상도는 205&amp;nbsp;× 205 픽셀이며(W = 205, H = 205) 따라서 스펙트럼 이미지도 205 x 205 해상도를 갖는다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 550px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99F19E3359C8A2EB0D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99F19E3359C8A2EB0D&quot; width=&quot;550&quot; height=&quot;388&quot; filename=&quot;fft_spectrum_examples.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;그림 5. 주기성분 추가에 따른 푸리에 스펙트럼의 변화&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;먼저, 그림 5(a)는 원본 이미지 및 대응되는 푸리에 스펙트럼 이미지를 보여준다. 그림의 예와 같이 일반적인 푸리에 스펙트럼 이미지는 원점 F(0, 0) 주변의 저주파 영역에서 강한 피크(peak)가 나타나고 원점에서 멀어질수록 즉, 고주파 영역으로 갈수록 값이 급격히 작아지는 형태를 갖는다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그림 5(b)는 (a)의 이미지에 5 픽셀(pixel)&amp;nbsp;간격의 수평선을 인위적으로 추가한 경우이다. 그러면 주파수 공간에서는 그림과 같이 F(0, 41), F(0,82)에 강한 피크(peak)가 나타난다. 앞서 이산 푸리에 변환에서 F(u, v)는 x축 주기&amp;nbsp;W/u 픽셀, y축 주기&amp;nbsp;H/v 픽셀인 주기성분의 계수라 했다. 그러면, F(0, 41)은 주기가 x축 방향 205/0 =&amp;nbsp;∞, y축 방향 205/41 = 5 픽셀인 주기성분에 대응된다. 그리고 이것은 그림 5(b)를 만들 때 사용한 수평선의 주기(세로방향 5픽셀)와 정확히 일치한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;☞ F(0, 82)에도 피크(peak)가 나타나는 것은 y축 방향으로 205/82 = 2.5 픽셀 간격의 주기 성분이 입력 이미지에 있다는 의미이다. 이는 이미지에 추가한 수평선이 정현파(sinusoidal wave)가 아니라 계단 형태이기 때문에 5 픽셀 주기의 정현파와 2.5 픽셀 주기의 정현파를 합쳐서 그러한 계단 형태를 근사했기 때문이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;다음으로, 이번에는 그림 5(c)와 같이 대각선 방향의 정현파를 (a)의 이미지에 추가해 보자. 추가한 정현파는 x축 방향 주기 20 pixel, y축 방향 주기 10 픽셀인 2D sin 함수를 이용했다. 이 때, 푸리에 스펙트럼에는 F(10, 20.5)에 강한 피크(peak)가 생성됨을 확인할 수 있다. 즉, x축 방향으로는 W/u = 205/10 = 20.5 픽셀, y축 방향으로는 H/v = 205/20.5 = 10 픽셀의 주기 성분이 입력 이미지에 있음을 의미한다. 그리고 이는 실제 입력 이미지에 추가된 주기 성분과 정확히 일치한다 (소수점 오차는 u, v좌표를 정수로 표현함에 의한 것이다).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이상으로 주파수 공간에서의 F(u, v)가 입력 이미지 공간에서 어떻게 연관되어 해석될 수 있는지를 실제 예를 통해서 살펴보았다. 마지막으로 앞서 그림 5(b), (c)에서 스펙트럼의 피크(peak) 영역을 지운 후 푸리에 역변환(inverse Fourier transform)하면 아래와 같은 재미있는 결과를 얻을 수 있다 (지운다는 의미는 해당되는 F(u, v) 값들을 0으로 만든다는 의미이다).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 550px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/991D913359C89CBB1C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F991D913359C89CBB1C&quot; width=&quot;550&quot; height=&quot;393&quot; filename=&quot;fft_period_removal.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;그림 6. 푸리에 변환을 이용한 주기 성분 제거&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;☞ &lt;a href=&quot;http://darkpgmr.tistory.com/14&quot; target=&quot;_blank&quot;&gt;[개발한 것들] - FFT와 모아레 제거 프로그램&lt;/a&gt;을 이용하면 이미지의 푸리에 변환, 특정 스펙트럼 삭제 및 역변환을 직접 테스트해 볼 수 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;C. 푸리에 변환의 &lt;b&gt;페이즈(phase)&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;푸리에 변환(Fourier transform)에서 스펙트럼(spectrum)은 잘 알려진 반면 페이즈(phase)는 상대적으로 잘 알려져 있지 않다. 하지만 페이즈(phase)에도 스펙트럼(spectrum) 못지 않은 중요한 정보가 담겨 있다고 한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;페이즈(phase)를 우리말로 번역하면 '단계'가 되고 전문용어로는 '위상'이 된다. 위키피디아에는페이즈(phase, 위상)를 '반복되는 파형의 한 주기에서 첫 시작점의 각도 혹은 어느 한 순간의 위치'라고 정의한다. 즉, 파형(wave)의 시점이 어디인지가 페이즈(phase)이다. 예를 들어, sin 파와 cos 파는&amp;nbsp;90도의 페이즈(phase, 위상) 차이가 존재하는 동일한 파형으로 볼 수 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;푸리에 변환의 관점에서 보면 &lt;span style=&quot;color: rgb(255, 0, 127);&quot;&gt;페이즈(phase)는 원본 신호를 주기 신호로 분해했을 때 각 주기성분의 시점이 어딘인지(즉, 각 주기성분들이 &lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 127);&quot;&gt;어떻게 줄을 맞춰서 원본 신호를 생성했는지)&lt;/span&gt;를 나타내는 요소가 된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래 그림은 페이즈(phase)의 영향을 보여주는 예로서 파란색 주기성분 신호들을 합쳐서 빨간색 신호가 생성되는 예를 보여준다. 왼쪽, 오른쪽 경우 모두 동일한 주파수의 주기성분들을 합쳤지만 각 성분의 페이즈(phase) 차이로 인하여 전혀 다른 신호가 생성됨을 확인할 수 있다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 550px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99987F3359C8B75D15&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99987F3359C8B75D15&quot; width=&quot;550&quot; height=&quot;220&quot; filename=&quot;phase_difference.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;그림 7. 페이즈(phase) 차이에 따른 신호 생성의 차이&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;다음으로 푸리에 변환의 페이즈(phase)가 어떻게 수식으로 표현되는지 살펴보자. (1차원) 푸리에 변환의 계수 F(u)는 식 (12), (13) 및 오일러 공식에 의해 다음과 같이 극좌표(polar coordinate) 형태로 표현될 수 있다 (설명의 편의상 1차원의 경우를 예로 든다).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;txc-formula&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/992DA83359C992C005&quot; historydata=&quot;%3Cflashrichtext%20version%3D%221%22%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28F%28u%29%3DR%28u%29+jI%28u%29%3D%5Cleft%7C%20F%28u%29%20%5Cright%7C%20e%5E%7B%20j%5Cphi%20%28u%29%20%7D%29%3C/textformat%3E%0A%3C/flashrichtext%3E%2C%0A12%2C%0Atransparent&quot; width=&quot;220&quot; height=&quot;23&quot;&gt;&amp;nbsp;--- (14)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;☞ 실수축이 x축, 허수축이 y축인 복소평면에서 F(u)는 x축과 이루는 각이 Φ인 막대기의 끝점 (R, I)에 대응된다. 이 때, R = |F|cosΦ, I = |F|sinΦ이므로 F = |F|cosΦ + j|F|sinΦ = |F|e&lt;sup&gt;jΦ&lt;/sup&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이제 식 (14)를 식 (1)에 대입하면,&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;txc-formula&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/99E97E3359C998A815&quot; historydata=&quot;%3Cflashrichtext%20version%3D%221%22%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28f%28x%29%3D%5Cint%20_%7B%20-%5Cinfty%20%20%7D%5E%7B%20%5Cinfty%20%20%7D%7B%20F%28u%29e%5E%7B%20j2%5Cpi%20ux%20%7Ddu%20%7D%20%5C%5C%20%3D%5Cint%20_%7B%20-%5Cinfty%20%20%7D%5E%7B%20%5Cinfty%20%20%7D%7B%20%5Cleft%7C%20F%28u%29%20%5Cright%7C%20e%5E%7B%20j%5Cphi%20%28u%29%20%7De%5E%7B%20j2%5Cpi%20ux%20%7Ddu%20%7D%20%5C%5C%20%3D%5Cint%20_%7B%20-%5Cinfty%20%20%7D%5E%7B%20%5Cinfty%20%20%7D%7B%20%5Cleft%7C%20F%28u%29%20%5Cright%7C%20e%5E%7B%20j%282%5Cpi%20ux+%5Cphi%20%28u%29%29%20%7Ddu%20%7D%20%29%3C/textformat%3E%0A%3C/flashrichtext%3E%2C%0A12%2C%0Atransparent&quot; width=&quot;188&quot; height=&quot;117&quot;&gt;. --- (15)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;와 같이 페이즈(phase) 텀이 주기함수 성분의 시점을 조절하는 텀이 된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;즉, 푸리에 계수 F(u)에는 대응되는 주기함수 성분의 강도(amplitude)를 나타내는&amp;nbsp;스펙트럼 정보&amp;nbsp;|F(u)|와 시점을 조절하는 페이즈(phase) 정보&amp;nbsp;Φ(u)가 함께 포함되어 있음을 알 수 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;참고로, 푸리에 스펙트럼(spectrum)과 페이즈(phase)에 관한 재미있는 비교 결과를 하나 소개한다. 아래 그림 8에서 (a)는 원본 이미지, (b)는 푸리에 스펙트럼을 보존하고 페이즈(phase)를 랜덤(random)하게 했을 때의 역변환 결과, (c)는 페이즈(phase)를 보존하고 스펙트럼을 랜덤하게 했을 때의 역변환 결과이다. 결과를 보면 이미지의 푸리에 변환에서 스펙트럼(spectrum)보다 페이즈(phase)에 보다 더 중요한 정보가 포함되어 있음을 확인할 수 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 550px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99B75F3359CB147629&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99B75F3359CB147629&quot; width=&quot;550&quot; height=&quot;211&quot; filename=&quot;phase_spectrum_importance.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;그림 8. 푸리에 스펙트럼과 페이즈의 중요도 비교&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;5. 푸리에 변환의 유용한 성질들&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;마지막으로 푸리에 변환(Fourier transform)에 대한 몇 가지 유용한 성질들을 정리하면 다음과 같다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- 주파수 공간의 원점 F(0, 0)의 값은 이미지의 평균값과 일치&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;txc-formula&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/996B493359CB18022D&quot; historydata=&quot;%3Cflashrichtext%20version%3D%221%22%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28F%280%2C0%29%3D%5Cfrac%20%7B%201%20%7D%7B%20WH%20%7D%20%5Csum%20_%7B%20x%3D0%20%7D%5E%7B%20W-1%20%7D%20%5Csum%20_%7B%20y%3D0%20%7D%5E%7B%20H-1%20%7D%7B%20f%28x%2Cy%29%20%7D%20%29%3C/textformat%3E%0A%3C/flashrichtext%3E%2C%0A12%2C%0Atransparent&quot; width=&quot;214&quot; height=&quot;56&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- Impulse 함수(&lt;a href=&quot;https://en.wikipedia.org/wiki/Dirac_delta_function&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;Dirac delta 함수&lt;/a&gt;)에 대한 푸리에 변환/역변환은 유니폼(uniform) 함수 (아래 식에서 푸리에 변환/역변환 관계를&amp;nbsp;⇔ 로 표기).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;txc-formula&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/99C11D3359CB196237&quot; historydata=&quot;%3Cflashrichtext%20version%3D%221%22%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28%5Cdelta%20%28x%2Cy%29%3D1%5Cquad%20%5CLeftrightarrow%20%5Cquad%201%29%3C/textformat%3E%0A%3C/flashrichtext%3E%2C%0A12%2C%0Atransparent&quot; width=&quot;131&quot; height=&quot;27&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- 가우시언(Gaussian) 함수의 푸리에 변환/역변환은 가우시언 함수가 됨&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;txc-formula&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/99C4923359CB1ACE0E&quot; historydata=&quot;%3Cflashrichtext%20version%3D%221%22%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28A%5Csqrt%20%7B%202%5Cpi%20%20%7D%20%5Csigma%20e%5E%7B%20-2%5Cpi%20%5E%7B%202%20%7D%5Csigma%20%5E%7B%202%20%7D%28x%5E%7B%202%20%7D+y%5E%7B%202%20%7D%29%20%7D%5CLeftrightarrow%20Ae%5E%7B%20-%28u%5E%7B%202%20%7D+v%5E%7B%202%20%7D%29/2%5Csigma%20%5E%7B%202%20%7D%20%7D%29%3C/textformat%3E%0A%3C/flashrichtext%3E%2C%0A12%2C%0Atransparent&quot; width=&quot;258&quot; height=&quot;27&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;6. 맺음말&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이상으로 푸리에 변환(Fourier transform)에 대한 정리를 마칩니다. 원래는 이렇게까지 길게 쓸 생각은 아니없는데 쓰다 보니 글이 길어졌네요.. ^^&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;참고자료 및 유용한 관련 글 링크&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.incodom.kr/%ED%91%B8%EB%A6%AC%EC%97%90_%EB%B3%80%ED%99%98&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;푸리에 변환&lt;/a&gt; by jipark&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://ghebook.blogspot.kr/2012/07/fourier-series.html&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;푸리에 급수의 시작&lt;/a&gt; by 전파거북이&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://ghebook.blogspot.kr/2012/08/fourier-transform.html&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;푸리에 변환&lt;/a&gt; by 전파거북이&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://wikidocs.net/4175&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;페이저(phasor)&lt;/a&gt; by AngeloYeo&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://wikidocs.net/4030&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;허수의 존재 의미에 대하여&lt;/a&gt; by AngeloYeo&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.comm.utoronto.ca/~dkundur/course_info/signals/notes/Kundur_FourierMagPhase.pdf&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;Magnitude and Phase&lt;/a&gt; by Deepa Kundur (토론토 대학)&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.researchgate.net/post/What_information_is_contained_in_the_phase_spectrum_of_a_signal2&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;What information is contained in the phase spectrum of a signal?&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: right;&quot;&gt;by 다크 프로그래머&lt;/p&gt;</description>
      <category>영상처리</category>
      <category>Fourier transform</category>
      <category>푸리에 변환</category>
      <category>푸리에 스펙트럼</category>
      <category>푸리에 페이즈</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/171</guid>
      <comments>https://darkpgmr.tistory.com/171#entry171comment</comments>
      <pubDate>Wed, 27 Sep 2017 12:39:22 +0900</pubDate>
    </item>
    <item>
      <title>YOLO 윈도우즈(windows) 버전</title>
      <link>https://darkpgmr.tistory.com/170</link>
      <description>&lt;p&gt;얼마 전 YOLO를&amp;nbsp;다운받아서 돌려보았다. 그동안 말로만 들어왔던 딥러닝 기술을 실제로 돌려본 건 처음이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;YOLO를 돌려본 느낌은 멋지다이다. 그리고 yolo와 darknet을 만든 Joseph Redmon이란 사람도&amp;nbsp;멋있다는 생각이 든다. 사실 이 분야에 있다보니 그동안 딥러닝에 대한 것은 많이 보고 들어 왔다.&amp;nbsp;하지만, 그것을 자신이 직접 돌려 본 느낌은 또 다른 것 같다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이 분야에 있는 사람들은 YOLO가 무엇인지는 대부분 다 알 것이다. 이 글에서는 YOLO와 딥러닝에 대한 이런 저런 생각, 그리고 YOLO를 윈도우(window)에서 빌드하고 실행시키는 방법을 소개한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1. YOLO (you only look once)&lt;/p&gt;&lt;p&gt;2. YOLO 윈도우즈(windows) 빌드&lt;/p&gt;&lt;p&gt;3. YOLO의 실행&lt;/p&gt;&lt;p&gt;4. 딥러닝에 대한 잡담&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;1. YOLO (you only look once)&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;YOLO의 원래&amp;nbsp;의미는 you only live once이다. 한번뿐인 인생 마음 가는데로 살자는 말이다. 하지만 여기서 말하는 YOLO(욜로)는 &lt;span style=&quot;color: rgb(255, 0, 127);&quot;&gt;you only look once&lt;/span&gt;이다. 한 번만 본다... YOLO가 무엇인지 그리고 무슨 의미인지는 YOLO의 개발자 Joseph Redmon이 최근(2017년 4월)&amp;nbsp;TED에서 발표한 내용에 잘 나타나 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;iframe src=&quot;https://embed.ted.com/talks/lang/en/joseph_redmon_how_a_computer_learns_to_recognize_objects_instantly&quot; width=&quot;550&quot; height=&quot;309&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;YOLO는 무공으로 치면 사파에 해당된다. 즉, 남들이 일반적으로 따르는 정통 주류의 방법론을 따르지 않고 자신의 독자적인 무공 체계를 세워 왔다. 그리고 최근 주류의 정점에 있는 CVPR 2017에서 Best Paper Honorable Mention 상을 수상하였다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;YOLO를 실행시키기 위해서는 Darknet이 필요하다. Darknet은 Joseph Redmon이 독자적으로 개발한 신경망 프레임워크(neural network framework)로서 dnn(deep neural network)들을 학습시키고 실행시킬 수 있는 틀(framework)이다. 그리고 yolo는 학습된 신경망(결과물) 중 하나이다. Darknet을 이용하면 yolo 뿐만 아니라 AlexNet, VGG-16, Resnet, Densenet 등 기존의 정통 주류의 dnn(deep neural network)들도 돌려 볼 수 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;일단, 나는 '다크넷'이란 용어가 맘에 든다. 내 블로그 필명과도 유사하고 정파가 아닌 사파라는 점도 마음에 든다. Darknet은 부정적인 의미(법망에서 벗어난 어둠의 인터넷 환경)도 있지만 &lt;span style=&quot;color: rgb(255, 0, 127);&quot;&gt;구속되지 않음으로 인해 자유로움이 가능한 공간&lt;/span&gt;으로 해석될 수도 있다. 일반적으로&amp;nbsp;보기 힘든 Joseph Redmon의 독특한 이력서(resume)도 매우 인상적이다 (관심있는 분은&amp;nbsp;&lt;a href=&quot;https://pjreddie.com/resume/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;이력서 링크&lt;/a&gt;를 한번 클릭해 보시길.. ^^).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Darknet과 yolo는 그 코드가 모두 공개되어 있으며 누구라도 사용할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;
Darknet &amp;amp; YOLO 사이트:&amp;nbsp;&lt;a href=&quot;https://pjreddie.com/darknet//&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://pjreddie.com/darknet/&lt;/a&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;2. YOLO 윈도우즈(windows) 빌드&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;나는 리눅스(Linux) 환경과는 별로 친하지 않다. 그래서 번거롭지만 윈도우즈(windows)에서 돌릴 수 있는 버전을 찾아서 작업을 하였다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;YOLO 윈도우즈 버전은 구글에서 검색해 보면 어렵지 않게 찾을 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: square;&quot;&gt;
&lt;li&gt;YOLO 윈도우 버전:&amp;nbsp;&lt;a href=&quot;https://github.com/AlexeyAB/darknet/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://github.com/AlexeyAB/darknet/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;YOLO 원본 사이트:&amp;nbsp;&lt;a href=&quot;https://pjreddie.com/darknet/yolo/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://pjreddie.com/darknet/yolo/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;첫 번째 사이트(AlexeyAB)에 가면 YOLO 윈도우 버전을 다운받을 수 있다. 또한 설치, 컴파일, 실행 방법까지 상세하게 설명되어 있다. 따라서 설명만 따르면 어렵지 않게 빌드 및 테스트가 가능하다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;사이트에 잘 설명되어 있긴 하지만 그래도 간단히 그 과정을 적어보면 다음과 같다.&lt;/p&gt;&lt;ol style=&quot;list-style-type: decimal;&quot;&gt;&lt;li&gt;사이트에서 &lt;b&gt;소스코드를 다운&lt;/b&gt;받는다 (git clone 또는 zip 다운로드)&lt;/li&gt;&lt;li&gt;NVIDIA 계열의 &lt;b&gt;그래픽카드(GPU)&lt;/b&gt;가 컴퓨터에 있어야 한다 (그래픽 메모리 4GB 이상 권장). NVIDIA 그래픽카드가 없어도 CPU 버전으로 빌드 및 실행은 가능하다. 하지만 매우 매우 느리다.&lt;/li&gt;&lt;li&gt;&lt;b&gt;CUDA 8.0 설치&lt;/b&gt;: &lt;a href=&quot;https://developer.nvidia.com/cuda-downloads&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://developer.nvidia.com/cuda-downloads&lt;/a&gt; (그래픽카드가 없는 경우에는 설치할 필요가 없다)&lt;/li&gt;&lt;li&gt;다운받은 소스에서 &lt;b&gt;visual studio 프로젝트&lt;/b&gt; 파일(*.sIn)을 찾아서 실행시킨다. 끝.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;다운받은 소스에 보면 여러 가지 설정의 Visual Studio (VS)&amp;nbsp;프로젝트 파일들이 제공된다. 나는 이 중에서 yolo_cpp_dll 버전으로 빌드 및&amp;nbsp;테스트를 했다. yolo를 dll 라이브러리로 만들어 놓으면 다른 윈도우즈 프로그램에서도 자유롭게 사용할 수 있기 때문이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;다만, 한 가지 문제는&amp;nbsp;&lt;span style=&quot;color: rgb(255, 0, 127);&quot;&gt;사이트에서 제공하는 프로젝트 파일은 Visual Studio 2015 용이기 때문에 그 이전버전의 Visual Studio(VS 2013 등)에서는 사용이 안된다&lt;/span&gt;는 점이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;한 가지 해결법&lt;/b&gt;은 다음과 같다. (1) 먼저, *.sIn 파일을 삭제한다. (2) 이후 *.vcxproj 파일을 메모장으로 열어서 프로젝트의 버전을 자신의 VS에 맞게 수정해 준다. (3) 이후 수정된 *.vcxproj를 클릭하여 프로젝트를 연다 (프로젝트를 저장하면 *.sIn 파일이 자신의 버전에 맞게 자동 생성된다).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;예를 들어, 자신이 사용하는 버전이 Visual Studio 2013라면 14.0은 12.0으로 v140은 v120으로 변경해 주면 된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;- ToolsVersion=&quot;14.0&quot; 을 찾아서 14.0을 자신의 Visual Studio 버전으로 변경&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- v140을 찾아서 (총 4곳) 자신의 Visual Studio 버전으로 변경&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;3. YOLO의 실행&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;yolo를 실행시키기 위해서는 darknet에서 yolo의 cfg 파일과 weights 파일을 불러와야 한다. cfg 파일은 신경망의 구조(layer 개수, 입력 데이터의 차원 등)를 명시한 파일이고 weights 파일은 실제로 학습된 신경망의 weight 값들을 저장한 것이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://pjreddie.com/darknet/yolo/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;yolo 사이트&lt;/a&gt;에서는 아래와 같이 다양한 버전의 미리 학습된 yolo 신경망(cfg &amp;amp; weights 파일)들을 제공한다. 이들 중 원하는 버전을 다운받은 후 darknet에 넣고 실행하면 된다. 자세한 실행법은 yolo 사이트의 설명문서 참조.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 550px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9987FE3359A663652D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9987FE3359A663652D&quot; width=&quot;550&quot; height=&quot;234&quot; filename=&quot;yolo.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;참고로, VOC 2007+2012 데이터에 대해 학습시킨 yolo는 20개의 물체 클래스에 대해 학습시킨&amp;nbsp;버전이고 COCO 데이터로 학습한 것은 80개의 물체 클래스에 대해 학습한 것이다. 따라서, 일반적인 목적으로는 위 그림에서 표기한 YOLOv2 608x608 버전을 다운받는 것이 무난하다. Tiny 버전은 용량도&amp;nbsp;작고 속도도 빠르지만 성능은 그다지 좋지 않다. 또한 최근에 공개된 yolo9000 모델(&lt;a href=&quot;http://pjreddie.com/media/files/yolo9000.weights&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://pjreddie.com/media/files/yolo9000.weights&lt;/a&gt;)도 한번 테스트해 봄직하다 (9000개의 물체 클래스에 대해 학습된 버전이며 cfg 파일은 git에서 다운받을 수 있다: &lt;a href=&quot;https://github.com/pjreddie/darknet/blob/master/cfg/yolo9000.cfg&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://github.com/pjreddie/darknet/blob/master/cfg/yolo9000.cfg&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;YOLOv2 608x608의 실행 속도는 데스크탑에서 직접 돌려보니 GPU(GTX 1080)를 사용했을 때에는 35 fps, GPU 없이 CPU(i7-6700k)만으로 돌렸을 때에는 0.3 fps가 나왔다. 새삼 GPU의 위력을 실감할 수 있다..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;4. 딥러닝에 대한 잡담&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;요즘 어딜 가나 딥러닝이다. 딥러닝이 나온 게 불과 몇년 전인데, 그동안 딥러닝으로 인한 변화는 엄청나다. 우리는 그 변화의 한가운데에 서 있으며 그 변화의 끝이 어디일지 두렵기까지 하다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;나는 사실 딥러닝에 대해서는 잘 모른다. 옛날 학생 때 인공신경망(artificial neural network)을 몇 번 학습시켜 본 것이 다이다. 그래도 몇 년 동안 이래 저래 줏어듣다 보니 몇 가지 기본적인 개념 정도는 이해하고 있는 수준이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;요즘 사람들을 보면 모든 관심이 딥러닝에 모여지는 것 같다. 지식의 블랙홀 같기도 하고.. 그러한 변화를 따라가고 있는 사람들을 보면 대단하다는 생각도 들고 또 한편으로 우려도 된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;딥러닝은 학생들이나 입문자들에게는 좋은 기회이다. 딥러닝의 뛰어난 성능은 수십년 동안 쌓아온 전통적인 지식 체계를 무색하게 하고 그들과 동일 선상에 설 수 있는 기회를 준다. 딥러닝은 그 사용법만 잘 알아도 창의성과 아이디어만 있다면 좋은 결과를 낼 수 있는 것으로 보인다. 그러다 보니 수십년 동안 전통적인 지식 체계를 쌓아 온 사람과 입문자가 같은 선 상에 설 수 있는 기회를 준다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;하지만 딥러닝은 지식의 추구 관점에서는 걸림돌이 될 수도 있다. 기본을 몰라도 결과를 낼 수 있으니 굳이 힘들게 체계적인 공부를 할 필요가 없기 때문이다. 딥러닝의 사용자 입장으로만 남을 것이면 사실 큰 문제가 없다. 하지만 소위 말하는 black-box implementer로만 남지 않으려면 그 시스템 안으로 조금은 들어가 볼 필요가 있다. 그리고 시스템에 들어가기 위해서, 나아가 시스템을 바꾸기 위해서는 항상 기본이 필요하다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;나는 그동안 딥러닝에 있어서는 아웃사이더(outsider)로만 있어 왔다. 인공신경망(artificial neural network) 자체도 별로 좋아하지 않고 (입력주고 원하는 출력을 주면 지가 알아서 뭔가를 만들어 내는데, 내가 할 수 있는 일이라곤 별로 없다. 열심히 학습 버튼 눌러주고.. 컴퓨터 좀 바꿔주고.. 나의 직관력이나 이해가 끼어들 여지가 별로 없다) 또 뭔가 새로운 것을 배워야 한다는 것도 귀찮기 때문이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;하지만 어.. 하는 사이에 세상은 너무 빠르게 변해가고 이젠 어쩔 수 없이 딥러닝을 배워야 하는 것 같다. 개인적으로는 그것들을 잘 사용해서 데이터를 모으고 실제 문제를 푸는 것이 목적은 아니다. 그냥 그 안으로 들어가서 그 원리를 조금씩 보고자 한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: right;&quot;&gt;by 다크 프로그래머&lt;/p&gt;</description>
      <category>기계학습</category>
      <category>YOLO</category>
      <category>딥러닝</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/170</guid>
      <comments>https://darkpgmr.tistory.com/170#entry170comment</comments>
      <pubDate>Fri, 1 Sep 2017 10:15:59 +0900</pubDate>
    </item>
    <item>
      <title>역수와 역행렬</title>
      <link>https://darkpgmr.tistory.com/169</link>
      <description>&lt;p&gt;3의 역수는? 1/3&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그럼 '역수'란? ...&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;역수를 구하는 방법은 알아도 역수가 무엇인지는 모르는 경우가 많다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;마찬가지로 역행렬이 무엇인지 물어보면,&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;학생 1) 1/(ad-bc) * [d -b; -c a]
&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;학생 2) 곱해서 항등행렬(I)이 나오는 행렬&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;물론 두번째 대답이 정확한 대답이다. 만일, 이와 같이 바로 답할 수 있다면 이 학생의 수학실력이나 앞으로의 공부에 대해서는 걱정할 필요가 없을 듯 하다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그런데, 학생 2와 같이 대답한 경우에도 사실은 한번 더 확인할 필요가 있다. 그걸 그냥 지식처럼 알고 있는 것인지, 아니면 정말 이해한 것인지&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;만일 대학생에게 두 행렬의 곱 AB의 역행렬이 무엇이냐고 물어보면 아마도 대부분 B&lt;sup&gt;-1&lt;/sup&gt;A&lt;sup&gt;-1&lt;/sup&gt;라고 자신있게 대답할 것이다 (물론, A&lt;sup&gt;-1&lt;/sup&gt;B&lt;sup&gt;-1&lt;/sup&gt;인가? 하는 학생도 분명 있다). 하지만, B&lt;sup&gt;-1&lt;/sup&gt;A&lt;sup&gt;-1&lt;/sup&gt;가 역행렬인 이유를 증명해봐라 하면 대부분 당황해 한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;'증명'이라는 말만 들어도 사고기능이 정지하는 경우도 있고 역행렬의 의미를 제대로&amp;nbsp;이해하고 못한 경우도 있을 것이다. 하지만 그 증명은 정말 간단하다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;증명: AB에 B&lt;/span&gt;&lt;sup&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;-1&lt;/span&gt;&lt;/sup&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;A&lt;/span&gt;&lt;sup&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;-1&lt;/span&gt;&lt;/sup&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;를 곱하면 AB * B&lt;/span&gt;&lt;sup&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;-1&lt;/span&gt;&lt;/sup&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;A&lt;/span&gt;&lt;sup&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;-1&lt;/span&gt;&lt;/sup&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt; = I이다. 따라서, AB의 역행렬은 B&lt;/span&gt;&lt;sup&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;-1&lt;/span&gt;&lt;/sup&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;A&lt;/span&gt;&lt;sup&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;-1&lt;/span&gt;&lt;/sup&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;이다. 끝.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;역행렬의 정의를 정확히 이해하고 있다면 당연히 풀수 있는 문제이다. 또한 역행렬의 정의를 안다면 AB의 역행렬이 A&lt;sup&gt;-1&lt;/sup&gt;B&lt;sup&gt;-1&lt;/sup&gt;인지 B&lt;sup&gt;-1&lt;/sup&gt;A&lt;sup&gt;-1&lt;/sup&gt;인지 혼동할 이유도 암기할 이유도 없다. 그리고, 정의로부터 kA의 역행렬은 1/kA&lt;sup&gt;-1&lt;/sup&gt;, ABC의 역행렬은 C&lt;sup&gt;-1&lt;/sup&gt;B&lt;sup&gt;-1&lt;/sup&gt;A&lt;sup&gt;-1&lt;/sup&gt;, PAP&lt;sup&gt;-1&lt;/sup&gt;의 역행렬은 PA&lt;sup&gt;-1&lt;/sup&gt;P&lt;sup&gt;-1&lt;/sup&gt;, 대각행렬 diag{c1, c2, ..., cn}의 역행렬은 diag{1/c1, ..., 1/cn}임도 손쉽게 알 수 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;☞ 어떤 수의 역수는 자신과 곱해서 (곱셈에 대한 항등원인) 1이 나오는 수입니다.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;☞ 2018.8.14일자 댓글을 참고로 적습니다: 두 행렬의 곱 P = AB가 full-rank square matrix 일 때 inv(P)가 존재하고, 또한 A와 B 각각은 full-rank square matrix가 아닐수도 있으므로 inv(A)나 inv(B)는 존재하지 않을 수도 있습니다. 따라서 만약 AB의 역행렬이 존재한다면 그것의 정확한 표기는 inv(B)*inv(A)가 아니라 inv(AB) 라고 해야합니다.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: right;&quot;&gt;by 다크 프로그래머&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>수학 이야기</category>
      <category>수학</category>
      <category>역행렬</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/169</guid>
      <comments>https://darkpgmr.tistory.com/169#entry169comment</comments>
      <pubDate>Sat, 12 Aug 2017 15:48:47 +0900</pubDate>
    </item>
    <item>
      <title>DarkLabel - 비디오/이미지 객체 레이블링 툴 (Video/Image Labeling and Annotation Tool)</title>
      <link>https://darkpgmr.tistory.com/16</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;동영상 또는 이미지에 ID를 가진 물체 경계사각형(bounding box)를 labeling할 수 있는 유틸러티 프로그램입니다. 인터페이스 등 사용성은 어느 프로그램보다 뛰어나다고 생각합니다. 학습 데이터 생성 외에도 비디오 편집이나 이미지들을 동영상으로 합치거나 분리할 때,&amp;nbsp;개인정보 보호를 위해 사람 얼굴 등을 모자이크하는 용도로도 활용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;※&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 프로그램은 코드서명을 하지 않았기 때문에 Windows 및 웹브라우져에 의해 다운로드 및 실행이 차단될 수 있습니다 (&lt;a class=&quot;tx-link&quot; href=&quot;https://blog.dramancompany.com/2015/12/%ec%b2%98%ec%9d%8c-windows-%ec%84%a4%ec%b9%98-%ed%8c%8c%ec%9d%bc%ec%9d%84-%eb%b0%b0%ed%8f%ac%ed%95%98%eb%8a%94-%ea%b0%9c%eb%b0%9c%ec%9e%90%eb%93%a4%ec%9d%84-%ec%9c%84%ed%95%98%ec%97%ac/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;참고링크&lt;/a&gt;). &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;100% 안전한 프로그램이긴 합니다만 필요한 분들만 사용하시기 바랍니다..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;This is a utility program that can label object bounding boxes with ID&amp;nbsp;in videos and images. Anyone can use it for non-commercial purposes. If you have any inquiry or suggestion, you can&amp;nbsp;leave message below or email to darkpgmr.lee at gmail dot com.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ Since this program is &lt;u&gt;not code-signed&lt;/u&gt;, download and execution may be blocked by Windows and web browsers. This is a personally created program and a 100% safe program, but only for those who need it.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DarkLabel (Ver.2.4, 2021.09.04)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;latest executable: &lt;a class=&quot;tx-link&quot; href=&quot;https://github.com/darkpgmr/DarkLabel/releases/download/darklabel-release/DarkLabel2.4.zip&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DarkLabel2.4.zip&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;github:&amp;nbsp;&lt;a class=&quot;tx-link&quot; href=&quot;https://github.com/darkpgmr/DarkLabel&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/darkpgmr/DarkLabel&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;previous versions: check Version History below&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/lok30aIZgUw&quot; width=&quot;560&quot; height=&quot;386&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;DarkLabel2.0 Tutorial Video (&lt;a class=&quot;tx-link&quot; href=&quot;https://www.youtube.com/watch?v=lok30aIZgUw&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/watch?v=lok30aIZgUw&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;old demo1(gt_extractor):&amp;nbsp;&lt;a class=&quot;tx-link&quot; href=&quot;https://www.youtube.com/watch?v=zFpX2bORz5E&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/watch?v=zFpX2bORz5E&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;old demo2(darklabel1.2):&amp;nbsp;&lt;a class=&quot;tx-link&quot; href=&quot;https://www.youtube.com/watch?v=vbydG78Al8s&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/watch?v=vbydG78Al8s&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Main Features (주요 기능 및 특징)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Video/image object labeling &amp;amp; annotation tool (bounding box with ID and label)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;- automatic object labeling by visual tracking (multi-target)&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;- semi-automatic labeling by linear interpolation&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;- user-configurable hotkeys and zoom in / zoom out support&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;- user-configurable data formats (pascal voc, darket yolo, xml/txt, any other user-defined formats)&lt;/p&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Video splitting (into images) &amp;amp; image merging (into a video file) tool&lt;/li&gt;
&lt;li&gt;Video cropping tool (cut and save only the selected section in the video)&lt;/li&gt;
&lt;li&gt;Video/image privacy masking tool (mosaic the box area in the image)&lt;/li&gt;
&lt;li&gt;Windows only (32/64 bits)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Program Configuration (프로그램 설정)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The program can be configured by modifying &lt;a class=&quot;tx-link&quot; href=&quot;https://github.com/darkpgmr/DarkLabel/blob/master/darklabel.yml&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;darklabel.yml&lt;/a&gt; attached in the zipped archive.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;define and modify data formats&lt;/li&gt;
&lt;li&gt;change hotkeys (frame navigation, action keys)&lt;/li&gt;
&lt;li&gt;change video/image export setting (video codec, frame rate, image format)&lt;/li&gt;
&lt;li&gt;set default save/load directory&lt;/li&gt;
&lt;li&gt;define class labels&lt;/li&gt;
&lt;li&gt;adjust GUI drawing (box width, box color, ...)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Basic Instruction&amp;nbsp;(프로그램 사용법)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;Arow/PgUp/PgDn/Home/End: navigate image frames&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;Mouse: Left(create box), Right(cancel the most recently created box)&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;Shift+Mouse: Left(modify box), Right(delete selected box/trajectory or all boxes)&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;Shift+DoubleClick: modify box properties (label, ID, difficulty)&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;DoubleClick: select/deselect box trajectory&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;*box trajectory: boxes connected across frames with the same ID and label&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;Ctrl+'+'/'-': zoom in/out&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;Ctrl+Arrow: scroll zoomed window&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;Ctrl+MouseWheel: zoom in/out&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;Ctrl+MouseDrag: scroll zoomed window&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;Enter or Spacebar: apply tracking (selected trajectories or newly created boxes only)&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;Ctrl+'s': save gt&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;F1: show this help&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Advanced Instruction (고급 사용법)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Labeling by object tracking&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;- By pressing 'Return' key, newly created bounding boxes in the current frame are tracked in the next frame and labeled automatically. (newly created boxes: the boxes that are created after entering the frame)&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;- If there are selected trajectories in the frame (object trajectory can be selected by double clicking a box), only the trajectory boxes are tracked (newly created boxes are not tracked).&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;- If tracking is applied to trajectories, it first deletes their tail parts (connected trajectory boxes after the current frame) and then continue the tracking, keeping their IDs and labels. This functionality can be used to correct previous wrong tracking.&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;- Two trackers are embeded. (developed by darkpgmr) &lt;br /&gt;&amp;nbsp; . tracker1 (robust): good for deformable objects (e.g., human, ..) &lt;br /&gt;&amp;nbsp; . tracker2 (accurate): good for rigid/static object (e.g., vehicle, wall, house, ...)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Data Sampling/gathering&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;If you want to sample images in a video and save them (e.g. gathering training samples), draw dummy boxes on the images and then export the annotation results as images with the &quot;no box drawing&quot; option selected and the &quot;labeled frames only&quot; checked.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Privacy Masking&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;draw boxes on the privacy area (e.g. human faces) and then export the annotation results with the &quot;mosaic the box area&quot; option selected.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Full screen mode&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;do annotation in full screen mode in case the image is too large to show in your monitor (double click the title bar of image window). You also can utilize zoom in functionality.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Don't forget to save your annotation results as often as possible. You can just press Ctrl+S.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Remark (2020.7.9)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그동안 프로그램이 이유없이 죽는다는 댓글들이 종종 있었는데, 원인을 모르다가 최근에야 UI delay를 없애기 위해 도입했던 thread 처리에 문제가 있었음을 알게 되었습니다.&amp;nbsp;이번 DarkLabel 2.0에서는 대부분&amp;nbsp; 문제를 제거했지만 혹시 남은 문제가 발견되면 피드백 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Version History&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*&amp;nbsp;&lt;a href=&quot;https://github.com/darkpgmr/DarkLabel/releases/download/darklabel-release/DarkLabel2.4.zip&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DarkLabel 2.4&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(2021.09.04)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- support to save/load data in .csv file &lt;br /&gt;- support MOT data format &lt;br /&gt;- add a new format specifier (&quot;c=n&quot;): it can be used to save/load dummy values (see darklabel.yml for it's usage) &lt;br /&gt;- enhance error handling (make it more robust to various external and internal errors)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*&amp;nbsp;&lt;a href=&quot;https://github.com/darkpgmr/DarkLabel/releases/download/darklabel2.3-update2/DarkLabel2.3-update2.zip&quot;&gt;DarkLabel 2.3-update2&lt;/a&gt; (2021.07.03)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- fix possible mismatch between labels and saved images in case of video input&lt;br /&gt;- support to delete labels in intervals&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- add two new adjustable parameters in darklabel.yml&lt;br /&gt;&amp;nbsp; . min_object_size: minimum allowed box size&lt;br /&gt;&amp;nbsp; . hotkey_return: secondary hotkey for return/enter key (for tracking) &lt;br /&gt;- adjust GUI layout (make it more slim)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*&amp;nbsp;&lt;a class=&quot;tx-link&quot; href=&quot;https://github.com/darkpgmr/DarkLabel/releases/download/darklabel2.3-update1/DarkLabel2.3-update1.zip&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DarkLabel 2.3-update1&lt;/a&gt; (2021.03.23)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- fix the program to sort image list naturally by their file name&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;. before: 0.jpg, 1.jpg, 10.jpg, 100.jpg, 101.jpg, ...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;. after: 0.jpg, 1.jpg, 2.jpg, 3.jpg, ...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*&amp;nbsp;&lt;a class=&quot;tx-link&quot; href=&quot;https://github.com/darkpgmr/DarkLabel/releases/download/darklabel2.3-release/DarkLabel2.3.zip&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DarkLabel 2.3&lt;/a&gt;&amp;nbsp;(2020.10.25)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- enable selection of multiple object trajectories at the same time&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- tracking is applied for object trajectories.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- minor bug fixes..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*&amp;nbsp;&lt;a class=&quot;tx-link&quot; href=&quot;https://drive.google.com/file/d/1wqp_zPd4bZkz1KutLRTPBMg6MuaL6v6N/view?usp=sharing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DarkLabel 2.2&lt;/a&gt;&amp;nbsp;(2020.10.20)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- support media cropping (the selected section in the video / image list)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- it's able to change export settings on the GUI.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*&amp;nbsp;&lt;a class=&quot;tx-link&quot; href=&quot;https://drive.google.com/file/d/1PM-XxAT4sUV93Az5D3CueUcHglBObUOj/view?usp=sharing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DarkLabel 2.1&lt;/a&gt;&amp;nbsp;(2020.09.10)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- add two new parameters to support easy data gathering/sampling&amp;nbsp;in darklabel.yml&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; . export_labeled_frame_only&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; . export_without_box_drawing&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- doesn't popup message box now after video/image save is done.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*&amp;nbsp;&lt;a class=&quot;tx-link&quot; href=&quot;https://drive.google.com/file/d/1iPRjN1lkEETKGZpJBnb-rHsjs5PkW9gS/view?usp=sharing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DarkLabel 2.0&lt;/a&gt;&amp;nbsp;(2020.06.29)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- support machine learning formats: xml(pascalvoc/imagenet), txt(darknet yolo)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- support user-defined data formats (data formats can be defined in 'darklabel.yml')&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- correct&amp;nbsp;program stability problem (bug-fix related to unexpected program exit)&lt;/p&gt;
&lt;div&gt;- support zoom in / zoom out of working image&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- add user-configurable hotkeys (it can be modified in 'darklabel.yml')&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- labeling by tracking is now applied only to newly created boxes (keep the old boxes)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- lots of minor revision&amp;nbsp;to enhance user convenience and program stability&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;a class=&quot;tx-link&quot; href=&quot;https://drive.google.com/uc?export=download&amp;amp;id=1ruD7cockmjtnVMkywsBgpHH78tRVcac2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DarkLabel 1.3&lt;/a&gt; (2018.03.31)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 프로그램의 완성도를 높임 (ui, 반응속도, 안정성, 에러체크, 미세한 기능들, ...)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- trajectory 단위로 박스 선택/삭제/label수정 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- label(class)과 id를 분리해서 저장/로드할 수 있는 데이터 포맷 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;a class=&quot;tx-link&quot; href=&quot;https://drive.google.com/uc?export=download&amp;amp;id=1ku63YcQjU5Bagf7BFOP6jRb5la_4gwQ9&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DarkLabel 1.2&lt;/a&gt; (2018.02.19)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 심각한 버그 수정: 숫자를 label로 사용할 경우 gt 데이터 로드시 오류 현상 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- interpolation을 이용한 labeling 기능 추가 (본문의 프로그램 사용법 참조)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 개체 ID 자동부여 및 auto labeling 기능 추가 (본문의 프로그램 사용법 참조)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 비디오내 프레임 이동시(navigation) GUI 반응성 개선&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;a class=&quot;tx-link&quot; href=&quot;https://drive.google.com/uc?export=download&amp;amp;id=1uhuDUdGdtJEVoQa0WSVQ9DWSr94n1TUO&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DarkLabel 1.1&lt;/a&gt; (2017.09.06)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 작업결과를 동영상/이미지로 저장할 수 있는 기능 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;a class=&quot;tx-link&quot; href=&quot;https://drive.google.com/uc?export=download&amp;amp;id=1_3gHxNKqYkH9sXAQlv3pqfo7ewiZeOB6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DarkLabel 1.0&lt;/a&gt; (2017.07.18)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- labeling 기능 추가, tracker의 성능 및 UI 반응성 개선, 최신 비디오코덱 지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 프로그램 이름을 GT_Extractor에서 DarkLabel로 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;a class=&quot;tx-link&quot; href=&quot;https://drive.google.com/uc?export=download&amp;amp;id=1uwVBRQwnE484HVpfMQYjnhPCltDOFQb5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;GT_Extractor 2.3&lt;/a&gt; (2016.09.29)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 버그 수정 (이미지 리스트에서 GT 파일 저장/불러올 때 오류 현상)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;a class=&quot;tx-link&quot; href=&quot;https://drive.google.com/uc?export=download&amp;amp;id=1hnHJ1LXly0hBvsVHLLS2UZRDeYFt3O4C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;GT_Extractor&amp;nbsp;2.2&lt;/a&gt; (2016.08.26)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 지원 비디오 포맷 추가 (avi, mpg, mp4, wmv, ...)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;a class=&quot;tx-link&quot; href=&quot;https://drive.google.com/uc?export=download&amp;amp;id=1oUALBk7EHzvAnXlo1IQeOIdjhe2EptLy&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;GT_Extractor&amp;nbsp;2.1&lt;/a&gt; (2013.08.12)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 비디오 뿐만 아니라 이미지 목록에 대해서도 편집 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;a class=&quot;tx-link&quot; href=&quot;https://drive.google.com/uc?export=download&amp;amp;id=1_VooNaegdWO8OGldPUQXtLtY27eVVb9l&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;GT_Extractor 2.0&lt;/a&gt; (2013.01.15)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 복수개의 대상 설정 및 추적 기능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;a class=&quot;tx-link&quot; href=&quot;https://drive.google.com/uc?export=download&amp;amp;id=1MYGdTkZGt3zswY_utyBqB6aQHlf-GgUw&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;GT_Extractor 1.0&lt;/a&gt; (2013.01.08)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이미지 당 하나의 대상만 설정할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;by 다크 프로그래머&lt;/p&gt;</description>
      <category>개발한 것들</category>
      <category>ground truth</category>
      <category>물체검출</category>
      <category>물체인식</category>
      <category>영상처리</category>
      <category>영상추적</category>
      <category>프로그램</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/16</guid>
      <comments>https://darkpgmr.tistory.com/16#entry16comment</comments>
      <pubDate>Tue, 18 Jul 2017 11:21:23 +0900</pubDate>
    </item>
    <item>
      <title>인터뷰</title>
      <link>https://darkpgmr.tistory.com/168</link>
      <description>&lt;p&gt;얼마 전 한 친구와 인텨뷰를 가졌다. 이력서와 자기소개서는 훌륭했다. 하지만 이력서와 자기소개서는 참고일 뿐 그것만으로는 판단이 힘들다. 그래서 자신이 그동안 한 것에 대해서 발표를 부탁했다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;발표는 나쁘지 않았고 딥러닝을 이용해서 실제 문제에 적용한 결과도 나쁘지 않았다. 그리고 사용한 알고리즘이나 발표하면서 사용한 기술적인 용어들로 봤을 때 이 정도면 컴퓨터 비전에 필요한 기본적인 소양은 갖추었다고 판단됐다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;하지만 그것은 성급한 판단이었다. 발표만으로는 확실한 판단이 어렵기 때문에 발표 후 간단한 구술 테스트를 진행했다. 이른바 인터뷰이다. 그런데 인터뷰에서는 전혀 다른 결과가 나왔다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;테스트는 수학, 기계학습, 프로그래밍, 영상처리에 대한 질의응답 형식으로 진행했다. 예를 들어, 그 친구가 발표 도중에 SVM을 사용했다는 내용이 나왔으면 SVM이 무엇인지 간략하게 설명할 수 있느냐? 학습에서 Stochastic gradient 방법을 썼다고 했는데 그게 무슨 방법이냐? gradient가 무엇이냐? 등등 본인이 발표한 내용 중에서 관련된 개념 등을 물어보는 것이다. 그리고 프로그래밍 관련해서는 C에서 포인터가 무엇이냐? C++을 사용할 수 있다고 했는데 virtual 함수가 무엇이냐? 등 기초적이지만 수준을 체크할 수 있는 질문들이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그런데, 이 친구가 거의 답변을 못한다.. 막연한 지식 또는 주변적인 답변만 할 뿐 정작 질문 자체에 대해서는 답변을 하지 못한다. 그냥 가져다 쎴다. 잘 모르겠다... 어느 것 하나도 깔끔한 답변이 없다. 딱 자신이 발표한 내용, 말한 내용까지만 알고 있는 것이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;물론 그럴 수 있다. 바쁜 세상에 모든 것을 다 알 수는 없다. 그게 뭔지는 잘 몰라도 결과가 좋다면 가져다 쓰는 것이 현실이다. 요즘 DNN을 사용하는 것이 그렇다. 그냥 가져다 쓰면 잘 된다. 이른 바 black-box implementer가 되는 것이다. 하지만, 아무리 그래도 최소한 자신이 사용하는 것에 대해서는 기본적인 개념 정도는 알고 있어야 한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그 친구는 조금 안타깝다.. 태도나 성실성, 경험 측면에서는 모두 통과다. 하지만 자신이 하고 있는 것에 대해서 의문을 갖지 않는 것은 받아들이기 어렵다. 그것은 잠재력과 같은 것이다..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: right;&quot;&gt;by 다크 프로그래머&lt;/p&gt;</description>
      <category>잡기장</category>
      <category>인터뷰</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/168</guid>
      <comments>https://darkpgmr.tistory.com/168#entry168comment</comments>
      <pubDate>Thu, 13 Jul 2017 17:11:06 +0900</pubDate>
    </item>
    <item>
      <title>파워포인트(ppt) 동영상 재생하는 다양한 방법</title>
      <link>https://darkpgmr.tistory.com/167</link>
      <description>&lt;p&gt;파워포인트(ppt)에서 동영상을 재생하기 위해 발표 도중에 마우스로 동영상을 클릭하는 것은 매우 불편한 일이다. 그렇다고 '자동 실행'으로 재생 옵션을 설정하면 ppt 페이지가 바뀌자마자 (마음의 준비를 하기도 전에) 동영상이 재생되어서 발표의 호흡이 흐트러지는 경우가 있다. 그리고 컴퓨터 사양이 낮은 경우에는 간혹 동영상 로딩을 위해 딜레이나 버벅거림이 발생할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;이러한 문제점을 해결하는 한 방법은 &lt;span style=&quot;color: rgb(255, 0, 127);&quot;&gt;처음 페이지에 진입했을 때에는 동영상이 정지되어 있다가 스페이스를 한번 눌렀을 때 재생이 시작&lt;/span&gt;되도록 만드는 것이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;언뜻 그게 왜 좋지? 하는 생각이 들 수도 있다. 하지만 이러한 방식에 익숙해지면 이게 유용한 방식임을 수긍하게 될 것이다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;그렇게 하면 (정지된) 화면을 보면서 미리 호흡을 가다듬을 수도 있고 또 상황에 따라서는 필요한 설명을 먼저 진행한 후에 동영상을 재생할&amp;nbsp;수도 있다. &lt;span style=&quot;color: rgb(255, 0, 127);&quot;&gt;중요한 점은 자신이 원하는 시점에 (그리고 자연스럽게) 동영상을 재생시킬 수 있다&lt;/span&gt;는 점이다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;스페이스바(spacebar)로 동영상 재생하기&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;먼저 ppt에서 동영상을 선택한후 아래 그림과 같이 비디오도구 - 재생 - 시작옵션이 '클릭할 때'로 선택되어 있는지 확인한다 (기본적으로 설정되어 있는 값)&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 550px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2633A14F5943653706&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2633A14F5943653706&quot; width=&quot;550&quot; height=&quot;154&quot; filename=&quot;동영상재생옵션.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;다음으로 현재 동영상이 선택되어 있는 상태에서 애니메이션 탭을 선택한 후 아래 그림과 같이 '실행' 버튼을 선택한다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 550px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/25069B4A5943654322&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F25069B4A5943654322&quot; width=&quot;550&quot; height=&quot;104&quot; filename=&quot;에니메이션_단일.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;이것으로 설정 완료!! (원하는데로 기능이 동작하는지 슬라이드쇼로 확인하자)&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;☞ 슬라이드 쇼에서 해당 페이지로 들어오면 동영상이 정지된 상태로 페이지가 나타난다. 여기서 스페이스 바를 한번 눌러주면 동영상 재생이 자동 시작된다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;스페이스바(spacebar)로 여러 동영상 동시에 재생하기&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;만일 한 페이지에서 재생할 동영상이 여러 개이고 앞서와 마찬가지로 스페이스바를 누를 때 재생을 시작하고 싶다면 아래 그림과 같이 재생할 동영상을 모두 선택한 후 애니메니션 '실행'을 선택해준다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 550px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/24769E345943675A04&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F24769E345943675A04&quot; width=&quot;550&quot; height=&quot;365&quot; filename=&quot;에니메이션_동시.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그러면 설정 끝!!&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;☞ 위 그림과 같이 동영상 왼쪽 모서리에 같은 숫자(위 예에서는 '1')가 표시되면 성공적으로 설정이 완료된 것이다.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;스페이스바로 여러 동영상 하나씩&amp;nbsp;재생하기&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;만일, 여러 개의 동영상을 스페이스를 누를 때마다 하나씩 차례대로 시작하고 싶다면 아래 과정을 따라한다.&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;가장 먼저 재생하고 싶은 동영상을 마우스로 선택한다.&lt;/li&gt;&lt;li&gt;애니메이션 '실행'을 선택한다.&lt;/li&gt;&lt;li&gt;그 다음으로 실행하고 싶은 동영상을 선택한 후, 애니메이션 '실행'을 선택해 준다.&lt;/li&gt;&lt;li&gt;이 과정을 반복한다.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 550px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/263A79465943699905&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F263A79465943699905&quot; width=&quot;550&quot; height=&quot;365&quot; filename=&quot;에니메이션_순차.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;☞ 성공적으로 설정이 되면 위 그림처럼 재생 순서에 따라 동영상 좌상단에 숫자로 번호가 매겨진다. 슬라이드쇼로 이 페이지에 들어오면 처음에는 모든 동영상이 정지된 상태로 보여진다. 이후 스페이스 바를 한번 누르면 첫번째 동영상이 재생된다. 스페이스 바를 다시 한번 더 누르면 두 번째 동영상도 재생을 시작한다.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;참고 1) 여러 동영상 동시에 자동 재생하기&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;참고로 페이지에 진입하자마자 (스페이스바를 누르지 않아도) 여러 동영상이 자동으로 재생되도록 하기 위해서는 먼저 아래 그림처럼 동시에 재생하고자 하는 동영상들을 한꺼번에 선택한 후 비디오도구 - 재생 - 시작옵션을 '자동 실행'으로 선택한다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 550px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/23780D4659436BAF10&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F23780D4659436BAF10&quot; width=&quot;550&quot; height=&quot;365&quot; filename=&quot;에니메이션_동시자동.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;이후 애니메이션 탭에서 시작옵션을 '이전 효과와 함께'로 선택해 준다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 550px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2160264059436BE82D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2160264059436BE82D&quot; width=&quot;550&quot; height=&quot;365&quot; filename=&quot;에니메이션_동시자동2.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;이렇게 하면 설정 끝!&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;참고 2) 발표 도중에 특정 페이지로 바로 이동하기&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;동영상 재생과는 관계 없지만 유용한 팁으로 발표(슬라이드 쇼) 도중에 특정 ppt 페이지로 바로 이동하는 방법이 있다. 그건, 키보드에서 페이지 번호를 친 후 엔터(enter)키를 누르는 것이다. 발표를 하다보면 특정 페이지에 대해서 질문을 받는 경우가 있는데 이럴 때 사용하면 꽤 유용하다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;☞ 예전에 한번 알았던 것인데, 이제 돌아서면 잊어버리는 나이라.. 방법이 기억나지 않아서 한참 헤맸습니다. 인터넷에는 잘 검색도 되지 않고.. 그래서 개인적으로도 참고할 겸 정리해 놓습니다.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot;&gt;by 다크 프로그래머&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>알아두면 좋은 것들</category>
      <category>ppt</category>
      <category>동영상</category>
      <category>자동재생</category>
      <category>파워포인트</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/167</guid>
      <comments>https://darkpgmr.tistory.com/167#entry167comment</comments>
      <pubDate>Fri, 16 Jun 2017 14:50:16 +0900</pubDate>
    </item>
    <item>
      <title>책읽기</title>
      <link>https://darkpgmr.tistory.com/166</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;얼마전 간만에 웹검색을 하다가 '글에 자신만의 개성을 입히는 법'(&lt;a class=&quot;tx-link&quot; href=&quot;http://ppss.kr/archives/19882&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://ppss.kr/archives/19882&lt;/a&gt;)이란 글을 읽게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인상적인 문구로 '책은 이 세상 무엇과도 비교할 수 없는 남는 장사'라는 말을 보고 문득 책을 읽어야겠다는 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책 한권에는 작가의 수년에 걸친 혹은 평생에 걸친 깨달음과 지식, 경험이 녹아들어 있으니 그것을 단 몇시간에 걸쳐서 얻는 것은 시간이라는 측면에서 봤을 때 엄청나게 이익이라는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 나도 책이라면 많이 읽었다. 하지만 그것이 대부분 무협지, 판타지였다는 것이 문제이다. 역사, 인문학 등 좋은 책도 많은데..., 내 머리속에는 내공, 경신술, 현경, 신검합일 뭐 그런 것들만 가득하다. 학창시절 그 좋았던 시절에 뭐 했나 싶지만 뭐 어쩌겠냐. 지금부터라도 책을 가까이해야겠다고 나름 마음을 먹어본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 처음 잡은 책이 '문재인의 운명'이란 책이다. 집에서 몇 년 전부터 굴러다니던 책이기도 했고 (아내가 사서 아내만 읽었다) 최근 대통령 취임 후 관심이 가서이기도 하다. 특히 사인 종이를 찾는 한 초등학생 앞에 쭈그러 앉아 기다리는 모습이 계속 기억에 남는다.. 보여주기라고 할 수도 있겠지만 사람 사는 모습이 그런 것이 아니겠는가.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 문재인 대통령도 책을 참 많이 읽은 분이라&amp;nbsp;나온다. 책에 의하면 문재인 대통령은 초등학교 때에는 아버지가 가끔 사다주시는 문고 등으로 책에 대한 갈증을 채웠다. 그러다 나중에 중&amp;middot;고등학생이 되어서는&amp;nbsp;매일 도서관에 출근하다시피 했고 닥치는 대로 책을 읽었다고 한다. 그리고 그러한 독서가 본인의 사고의 폭과 의식을 형성하는데 많은 영향을 미쳤다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;당신에게 가장 필요한 책은 당신으로 하여금 가장 많이 생각하게 하는 책이다.&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;마크 트웨인(Mark Twain)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;The man who does not read has no advantage over the man who cannot read.&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;마크 트웨인(Mark Twain)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;by 다크 프로그래머&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-----&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후로 읽은 책들에 대한 개인적 기록 (일자는 책을 읽은 날짜)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빛의 과거 - 은희경, 2023.03&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;이 책은 읽다가 말다가 끝까지 본 책이다. 70년대 여대생의 소소한 얘기가 계속 이어진다. 주변에서 일어나는 에피소드들, 주인공이 느끼는 감정, 당시의 시대상 등등. 딱히 끌리는 것은 없지만 이왕 본것 끝까지 보긴 했다. 그런데, 다 보고나니 이상하게 여운이 남는다. 클라이막스도 없고 사건, 반전도 없다. 그냥 소소한 얘기하다가 소소하게 끝난다. 그런데, 마지막 장을 덮었을 때 정체를 알 수 없는 여운이 남는다. 이 여운의 정체가 뭘까?&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동의보감 - 이은성, 2023.02&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;얘들에게 보여주려고 빌려왔다가 내가 읽은 책이다. 예전에 너무 재미있게 읽은 기억에 빌려왔는데 얘들이 보지를 않는다. 그래 다시 보게 되었는데, 기억이란게 얼마나 왜곡되기 쉬운지.. 지금보니 그 때의 재미는 하나도 없다. 시대가 변한걸까 시야가 변한걸까. 그리고 얘들에게 굳이 권장할 만한 책도 아닌 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무소유 - 법정,&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;오늘 아침 길을 나서면서 무슨 책을 읽어볼까 하다가 책장에서 꺼내 든 책이다. 아직 책을 읽기도 전에, 첫 장을 읽어보고 기록을 먼저 시작한 것은 처음이다.. 정말 오래된 책이고 낡은 책표지는 세월의 흔적을 고스란이 담고 있다. 아마도 이 책은 한장 한장을 곱씹으면 읽어볼 것 같다.. (읽다가 그만둔 것 같다.. 언제 그만두었는지는 모르겠다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수학이 필요한 순간 - 김민형, 2019.xx&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;문제를 만났을 때 사람들은 어떻게든 답을 구하려고 노력한다. 그런데, 답을 구하기 이전에 먼저 해야 할 일이 있다. 그건, 문제에 답이 있는가에 대한 물음이다. 답이 있다면 답을 구할 수 있는가? 답을 구할 수 있다면 얼마나 효율적으로 구할 수 있는가? 의 순서가 되어야 할 것이다. 답을 구할 수 없는 경우 중에는 답이 너무나 많아서인 경우도 있다. 그런 경우에는 제약조건을 가하면 답을 유일하게 결정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아날로그의 반격 - 데이비드 색스(박상현, 이승연 옮김), 2019.04&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;바쁘다는 핑계로 최근에야 끝 장을 넘긴 책이다. 기술을 다루는 사람들, 특히 소프트웨어같은 것을 개발하는 사람은 한 번쯤 읽어보면 좋을 듯하다. 책을 읽으면서.. 보고 만질 수 있는 기술, 땀 냄새 나는 기술, 그 안에 사람이 있고 실체가 있는 기술을 만들어야겠다는 생각을 해 본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심리학이 서른 살에게 답하다 - 김혜남, 2018.12&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;'서른 살이 심리학에게 묻다'에 대한 일종의 후속편이다. 짧은 에세이 형식이라 시간 날때마다 조금씩 읽었다. 읽다보면 의미깊은 내용도 많고 가볍게 읽기 좋다. 읽고 나서 뭔가 강렬히 머리에 남는다기 보다는 읽으면서 자신을 뒤돌아보고 그러면서 조금씩 자신의 삶에 긍정적인 영향을 미치는 것 같아서 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해리 - 공지영, 2018.08&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;벌써 공지영 작가님 책만 3번째이다. '아주 가벼운 깃털 하나' 이후로 팬이 되어 버린 것 같다. 소설인지 기록물인지 분간은 안가지만 읽기가 쉽지는 않았다. 책을 읽는 중간 중간 정신적 휴식이 필요하다. 아내는 밑줄을 그어가면서 열심히 읽었다지만 난 딱 한군데만 밑줄을 그었다:&amp;nbsp;&lt;u&gt;단테가 말하고 마르크스가 인용한 대로, &quot;그들로 하여금 떠들게 하고 나는 나의 길을 갈 뿐.&quot; 이 세상 사람 모두가 자기가 살아온 발자국으로 평가되는 것이다. 하루 이틀이 아니라 삶 전체의 궤적으로 말이다.&lt;/u&gt;&amp;nbsp;그래.. 이것 저것 복잡할 때는 자신의 길에 충실하자.&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;침묵의 봄(Silent Sprint) - 레이첼 카슨 (김은령 옮김), 2018.07&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;인간에 의한 살충제, 환경파괴가 얼마나 심각하고 무서운지를 다룬 내용이다. 하지만 지루해도 너무나 지루한 책이다. 비슷한 이야기의 계속된 반복.. 절반쯤 읽다가 그냥 던져버릴까 했지만 정말 도를 닦는 마음으로 끝까지 다 읽었다. 어쨌거나 다 읽고 나니 왠지 모를 뿌듯함과 여운이 남는다. ㅋㅋ. 어쨌든 고전(명작)의 반열에 올라선 책이고 느끼는 것이 많은 책이다. 지루해도 읽을 가치는 충분하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아주 가벼운 깃털 하나 - 공지영, 2018.06&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;책 제목처럼 가벼운 에세이이다. 그냥 어린시절 왕눈깔사탕 하나를 입에 물고 이리 저리 돌려가며 먹듯이 맛있는 책이다. 혼자 킥킥대며 읽다가 언제 책을 덮어도 아쉬움이 남지 않는다. 어쨌거나 오늘 다 읽어 버렸다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서른 살이 심리학에게 묻다 - 김혜남, 2018.04&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;사람들과의 관계에서 중요한 것은 두려워하지 않는 것이다. 나를 드러냄으로써 나를 싫어하지 않을까, 나를 깊이 알면 알수록 실망하지 않을까, 이러한 지레짐작과 거절당함에 대한 걱정이 사람들에 대한 벽을 만들고 거리를 만든다. 누구나 거절당할 수 있고 완벽하지 않다. 있는 그대로의 모습을 인정하고 사랑할 때 누군가는 그 모습을 사랑하고 받아들이는 사람이 있고 또 누군가는 떠나는 사람이 있다. 그리고 그 관계에서 친구도 생기고 동료도 생긴다. 관계를 두려워하지 말라. 자신을 드러내는 것을 두려워하지 말라. 누구나 완벽한 사람은 없다. 온연한 나로써 살아갈 때 삶은 가장 아름답다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;82년생 김지영 - 조남주, 2018.03&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;아내는 너무나 평범한(?) 이야기라서 2시간도 안 걸려서&amp;nbsp;읽었다고 한다. 하지만 난 그러지 못했다..&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관점을 디자인하라 - 박용후, 2018.02&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;저자의 강연을 듣고 읽어보게 된 책이다. 한번 읽고 지나쳐버리기엔 아까운 책이고 기회가 된다면 한번 더 읽어보고 싶다. 그러면서 글의 내용을 한 번씩 내 삶에 반추해 보고 싶다. 3~4 페이지 분량의 짧은 글들이 계속 이어지는 형식이지만 하나 하나가 완성된 글이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아름다운 삶, 사랑 그리고 마무리 - 헬렌 니어링 (이석태 옮김), 2017.12&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;월든(Walden)처럼 소유하지 않고 자연과 함께하는, 자유로운 삶을 살다 간 한 부부의 이야기이다.&amp;nbsp;만 100세가 된 생일을 맞아 일부러 음식을 끊음으로써 위엄을 잃지 않은 채 삶을 마쳤다는 대목이&amp;nbsp;인상적이다. 문명으로 인해 그리고 소유로 인해 우리가 잃어버린 행복에 대해 다시 한번 생각하게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역사의 증인 재일조선인 - 서경식 (형진의 옮김), 2017.10&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;단지 재일동포라고만 알고 있었던 사람들에 대해 내가 너무 모르고 있음을 깨닫게 해준 책이다. 내가 얼마나 자기 입장에서만 생각하고 이해하는지를 세삼 깨닫는다. 일본에 살다가 해방후 그대로 일본에 남겨졌을 뿐, 남한도 북한도 아니고 그렇다고 일본인도 아닌 어느 곳에도 속하지 못한 재일조선인. 피상적으로만 알아왔던 재일조선인의 어려움과 본질, 그리고 나라가 무엇이고 민족이 무엇인지에 대해 되돌아보게 하는 책이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;총,균,쇠(guns, germs, and steel) - 재레드 다이아몬드 (김진준 옮김), 2017.10&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;지인께 세계사에 대한 책을 하나 추천해 달라고 했더니 읽어보라며 빌려 준 책이다. 700페이지가 넘는 두께지만 결국 다 읽었다.. 제목에서 풍기듯이 일반적으로 흔히 기대하는 세계사 책은 아니다. 오히려 그 기원을 다룬 책이다. 왜 현재의 세계가 현재의 세계가 되었는지, 모든 기술에서 앞섰던 중국이 왜 유럽에게 뒤처졌는지,&amp;nbsp;아프리카는 왜 지금의 모습인지, 신대륙에서 있었던 인종교체와 문명의 우열, 힘의 역사를 인과의 원리로 규명하고자 한 책이다. 세계사에 대한 지식이 아니라 세계사를 나름의 기준을 가지고 해석하고 바라볼 수 있는 하나의 눈을 얻을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;높고 푸른 사다리 - 공지영, 2017.09&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;아내가 인상깊게 읽었다고 하기에 궁금하여 읽어본 책이다. 요즘 어려운 책만 읽어서 소설로 가볍게 읽자는 마음도 있었다. 책은 어렵지 않게 잘 읽힌다. 소설이긴 하지만 과하지 않았고 현실에서 충분히 겪을 수 있는 일들로 생각된다. 다만 종교적 물음을 담고 있어서 공감에 거리가 있다. 그냥 누구에서 물어볼 것 없이 삶이 원래 그런것 아닌가 싶다. &quot;삶은 낯선 여인숙에서의 하룻밤과 같다.&quot;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 학교에는 이상한 선생이 많은가? - 김현희, 2017.08&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;책을 읽는 도중 간간히 폭소를 터트렸다. 그러면서도 안타까운 현실에 가슴 한곳이 시큼해진다.&amp;nbsp;웃기면서도 슬픈 책이다. 또한 하나씩 변화를 행하는 모습에 나를 돌아보게 만든다. 즐겁다고 하긴 그렇지만 나와 생각이 같음에 공감의 즐거움을 느낀다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;걸리버여행기 - 조너선 스위프트 (신현철 옮김), 2017.08&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;18세기 영국의 정치와 귀족문화, 식민 제국주의를 비판하고 인간에 대한 혐오를 풍자한 책이다. 이 책도 월든 못지않게 지루하고 읽기 힘든 면이 있다. 책을 다 읽는데 한참이 걸렸다. 그렇다고 이 책의 수준이 떨어지거나 읽는 재미가 없다는 것은 아니다. 다만 내게는 그냥 읽기는 읽되 그 문장들이 머리에서만 해석되고 가슴으로는 들어오지 못했다. 그러다보니 책에 푹 빠져들지는 못했다. 인간과 시스템의 본성에 대한 얘기라고는 하지만 어쨌거나 내게는 딴 나라 얘기이다. 아마도 책을 좀더 깊게 이해하기 위해서는 문화적 공감대와 경험의 공유가 필요할 것 같다. 어쨌거나 다 읽었다는데 의의를 두고 싶다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;용선생의 시끌벅적 한국사 - 2017.07&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;'아빠, 미국이 우리 나라를 구해줬다면서요?', '무슨 택도없는 소리! 그건 두 나라끼리 싸우다가 일본이 전쟁에서 졌기 때문이지 미국이 우리나라를 구해주려고 그런 것은 아니다' 발끈 했지만 막상 아이에게 우리나라 역사를 설명해 주고 싶어도 뭘 제대로 아는 것이 없다. 예전부터 우리나라 근현대사 부분은 한번 공부를 해야겠다는 생각도 있었고 겸사 겸사해서 집에서 굴러다니던 시리즈 책의 근현대사 부분(8, 9, 10권)만 읽었다. 학교 다니면서는 제대로 배우지 못했던 내용들.. 조선 말 개화의 소용돌이부터 청일전쟁, 러일전쟁, 세계 열강들의 전쟁터가 되어야 했던 식민조선, 한일병합, 세계 1~2차 대전과 해방, 그리고 신탁통치와 남북분단까지 아픈 역사가 잘 그려져 있다.&amp;nbsp;형식은 아이들을 위한 책이지만 내용은 어른도 충분히 읽어볼 만하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;월든(Walden) - 헨리 데이빗 소로우 (강승영 옮김), 2017.07&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;문명을 버리고 2년동안 호숫가에 통나무집을 짓고 생활한 사람의 삶의 성찰을 그린 책이다. '&lt;i&gt;시 한 줄을 장식하기 위하여 꿈을 꾼 것이 아니다.&lt;/i&gt;'란 첫 구절부터 강렬하게 마음을 사로잡더니 한 구절 한 구절이 마음을 파고든다. 특히 우리가 물려받은 것, 가진 것이 우리가 가진 짐이다라는 말이 가슴에 남는다. 하지만 책의 중후반은 다소 지루한 면이 있으며 쉽게 읽을 수 없는 책이다. 맺음말을 보기 위해서는 인내심이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그들이 말하지 않는 23가지 - 장하준, 2017.06&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;부족한 경제 지식을 채울 수 있지 않을까 하는 기대로 읽었다. 하지만 어떤 내용을 설명하기보다는 본인의 견해와 입장을 설득시키는 것이 주인 책이다. 내가 뭘 알아야 동의를 하든가&amp;nbsp;할텐데.. 중간쯤 읽다가 던졌다.&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문재인의 운명, 2017.05&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;가볍게 읽기 좋았다. 문재인이란 한 사람의 삶을 보는 것도 재미있었지만 이를 통해 우리나라의 70, 80년대 근현대사를 돌아볼 수 있었던 점이 더 좋았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>잡기장</category>
      <category>시간</category>
      <category>책읽기</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/166</guid>
      <comments>https://darkpgmr.tistory.com/166#entry166comment</comments>
      <pubDate>Wed, 24 May 2017 17:08:31 +0900</pubDate>
    </item>
    <item>
      <title>Gram&amp;ndash;Schmidt(그람-슈미트) 직교화</title>
      <link>https://darkpgmr.tistory.com/165</link>
      <description>&lt;p&gt;Gram-Schmidt(그람-슈미트) 직교화..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;오늘 최적화 관련 글을 읽다가 Gram-Schmidt에 대한 내용이 나왔다. 옛날 학생 때 배웠던 것 같긴 한데 기억이 가물가물하다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;주어진 벡터들로부터 수직인 벡터들을 새로 만들어내는 방법이란 정도는 알고 있지만 명확하지 않다. '떡 본 김에 제사 지낸다'고 Gram-Schmidt 직교화에 대해 간단히 정리해 본다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;그람-슈미트(Gram-Schmidt) 직교화란?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;주어진 벡터들을 이용해서 서로 수직인 벡터들을 만드는&amp;nbsp;방법이다. 좀더 고상한 말로 표현하면 주어진 벡터들에 대한 직교기저(orthogonal basis) 또는 정규직교기저(orthonormal basis)를 구하는 과정이다.&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;b&gt;그람-슈미트 직교화(Gram-Schmidt orthogonalization)&lt;/b&gt;: 주어진 벡터 v1, v2, ... 로부터 이 벡터들을 생성할 수 있는 직교기저(orthogonal basis)를 구하는 과정&lt;/li&gt;&lt;li&gt;&lt;b&gt;그람-슈미트 정규직교화(Gram-Schmidt orthonormalization)&lt;/b&gt;: 주어진 벡터 v1, v2, ... 로부터 이 벡터들을 생성할 수 있는 정규직교기저(orthonormal basis)를 구하는 과정&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;☞ 기저, 직교기저, 정규직교기저 등의 용어는 &lt;a href=&quot;http://darkpgmr.tistory.com/105&quot; target=&quot;_blank&quot;&gt;[선형대수학 #3] 고유값과 고유벡터&lt;/a&gt; 글 참조&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;그람-슈미트(Gram-Schmidt) 직교화 수식&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;주어진 벡터 v1, v2, ..., vk 에 대해, 이 벡터들을 생성할 수 있는 직교 벡터 u1, u2, ... 들은 다음과 같이 얻어진다 (단, proj&lt;sub&gt;u&lt;/sub&gt;(v)는 벡터 v를 벡터 u에 수직으로 투영한 벡터).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;txc-formula&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/23260C39591AB3B402&quot; historydata=&quot;%3Cflashrichtext%20version%3D%221%22%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22true%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22false%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28u%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28_%7B%201%20%7D%5Cquad%20%3D%5Cquad%20%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22true%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22false%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28v%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28_%7B%201%20%7D%2C%5C%5C%20%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22true%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22false%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28u%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28_%7B%202%20%7D%5Cquad%20%3D%5Cquad%20%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22true%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22false%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28v%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28_%7B%202%20%7D%5Cquad%20-%5Cquad%20%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22false%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28proj%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28_%7B%20u_%7B%201%20%7D%20%7D%28%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22true%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22false%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28v%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28_%7B%202%20%7D%29%2C%5C%5C%20%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22true%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22false%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28u%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28_%7B%203%20%7D%5Cquad%20%3D%5Cquad%20%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22true%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22false%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28v%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28_%7B%203%20%7D%5Cquad%20-%5Cquad%20%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22false%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28proj%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28_%7B%20u_%7B%201%20%7D%20%7D%28%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22true%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22false%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28v%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28_%7B%203%20%7D%29%5Cquad%20-%5Cquad%20%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22false%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28proj%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28_%7B%20u_%7B%202%20%7D%20%7D%28%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22true%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22false%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28v%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28_%7B%203%20%7D%29%2C%5C%5C%20%5Cquad%20%5Cquad%20%5Cquad%20%5Cvdots%20%5C%5C%20%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22true%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22false%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28u%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28_%7B%20k%20%7D%5Cquad%20%3D%5Cquad%20%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22true%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22false%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28v%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28_%7B%20k%20%7D%5Cquad%20-%5Cquad%20%5Csum%20_%7B%20i%3D1%20%7D%5E%7B%20k-1%20%7D%7B%20%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22false%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28proj%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28_%7B%20u_%7B%20i%20%7D%20%7D%28%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22true%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22false%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28v%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28_%7B%20k%20%7D%29%20%7D%20%29%3C/textformat%3E%0A%3C/flashrichtext%3E%2C%0A12%2C%0Atransparent&quot; width=&quot;285&quot; height=&quot;164&quot;&gt;&amp;nbsp;--- (1)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이렇게 얻어진 u1, u2, ..., uk는 서로 수직(orthogonal)이고 벡터공간 V = {v1, v2, ..., vk}에 대한 직교기저가 된다. 그리고 이러한 과정을 그람-슈미트 직교화(orthogonalization)라 부른다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;여기서 더 나아가 ui들을 단위벡터(길이가 1인 벡터)로 만들면 e1, e2, ..., ek는 벡터공간 V의 정규직교기저(orthonormal basis)가 된다. 그리고 이러한 과정을 그람-슈미트 정규직교화(orthonormalization)라 부른다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;txc-formula&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/264C4D38591ABAE530&quot; historydata=&quot;%3Cflashrichtext%20version%3D%221%22%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22true%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22false%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28e%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28_%7B%201%20%7D%5Cquad%20%3D%5Cquad%20%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22true%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22false%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28u%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28_%7B%201%20%7D/%5Cleft%5C%7C%20%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22true%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22false%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28u%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28_%7B%201%20%7D%20%5Cright%5C%7C%20%2C%5C%5C%20%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22true%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22false%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28e%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28_%7B%202%20%7D%5Cquad%20%3D%5Cquad%20%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22true%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22false%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28u%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28_%7B%202%20%7D/%5Cleft%5C%7C%20%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22true%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22false%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28u%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28_%7B%202%20%7D%20%5Cright%5C%7C%20%2C%5C%5C%20%5Cquad%20%5Cquad%20%5Cquad%20%5Cvdots%20%5C%5C%20%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22true%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22false%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28e%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28_%7B%20k%20%7D%5Cquad%20%3D%5Cquad%20%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22true%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22false%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28u%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28_%7B%20k%20%7D/%5Cleft%5C%7C%20%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22true%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22false%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28u%29%3C/textformat%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28_%7B%20k%20%7D%20%5Cright%5C%7C%20%29%3C/textformat%3E%0A%3C/flashrichtext%3E%2C%0A12%2C%0Atransparent&quot; width=&quot;132&quot; height=&quot;103&quot;&gt;&amp;nbsp;--- (2)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;그람-슈미트(Gram-Schmidt) 직교화 원리&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그람-슈미트 직교화 원리는 2단계로 설명할 수 있다. 먼저, 벡터 v를 이용해서 u1, u2, ..., ui 모두와 수직인 벡터를 만드는 방법은 v를 벡터공간 {u1, u2, ..., ui}에 투영시킨 후 v에서 빼는 것이다. 즉, v' = v - proj&lt;sub&gt;{u1, ..., ui}&lt;/sub&gt;(v)는 u1, u2, ..., ui 모두와 수직인 벡터가 된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 550px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/253B584B591BED9B37&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F253B584B591BED9B37&quot; width=&quot;550&quot; height=&quot;150&quot; filename=&quot;gram-schmidt원리1.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;그림 1. Gram-Schmidt 직교화 원리1&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;벡터공간 {u1, ..., ui}는 수학적으로는 u1, ..., ui의 일차결합으로 생성할 수 있는 모든 가능한 벡터들의 집합으로 정의된다. 또는 간단하게&amp;nbsp;이 벡터들을 모두 포함하는 부분공간(subspace) 또는 평면으로 생각하면 된다. &lt;span style=&quot;color: rgb(255, 0, 127);&quot;&gt;v를 이 공간에 투영한 후 v에서 빼면 이 공간의 모든 벡터와 수직인 벡터가 얻어진다&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;다음으로 벡터 v를 공간 {u1, ..., ui}에 투영시킨 벡터는 아래 그림과 같이 v를 u1, u2, ..., ui 각각에 투영시킨 벡터의 합으로 구해진다 (단, ui가 서로 수직인 경우).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 550px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2334554B591BF2B720&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2334554B591BF2B720&quot; width=&quot;550&quot; height=&quot;209&quot; filename=&quot;gram-schmidt원리2.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;그림 2. Gram-Schmidt 직교화 원리2&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이제 원래의 식 (1)으로 돌아가 보자. 지금까지 내용을 잘 이해했다면 Gram-Schmidt 직교화 과정이 손쉽게 이해되리라 생각한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Gram-Schmidt 제대로 이해하기 (Q &amp;amp; A)&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Q1&lt;/b&gt;. 직교화 도중에 {u1, u2, ..., ui}에 수직인 벡터를 새로 생성할 때 v를 사용하지 않고 아무 벡터나 잡아서 투영시켜도&amp;nbsp;되지 않을까? 왜 굳이 원래의 vi 들을 이용해야 하는지?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;A. 안된다. v를 사용해야 한다. Gram-Schmidt 직교화가 무조건 수직인 벡터들만 만들어 내는 방법이라고 생각한다면 그건 오해이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;입력 v1, v2, ..., vk에 대해 Gram-Schmidt를 적용하여 얻어진 u1, u2, ... 들은&amp;nbsp;v1, v2, ...., vk를 생성할 수 있는 직교기저(orthogonal basis)가 된다. 즉, u1, u2, .. 들은 벡터 v1, v2, ..., vk와 동일한 공간에 포함되면서 이 공간을 생성할 수 있는&amp;nbsp;벡터들이다.&amp;nbsp;그림 1을 보자. 왼쪽 예에서 3차원 공간을 가정하면 u와 수직인 벡터는 무한이 많이 존재한다. 그 중 v - proju(v)는 u와 v에 의해 결정되는 공간(평면)에 속한 벡터임을 확인할 수 있다. 즉, &lt;span style=&quot;color: rgb(255, 0, 127);&quot;&gt;u, v에 대해 직교화로 얻은 벡터는 u, v에 의해 결정되는 부분공간(subspace)에 포함되면서 서로 수직인 벡터들이다&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Q2&lt;/b&gt;. 직교화는 입력 벡터의 수만 많으면 무한히 적용할 수 있는가? 즉, 무한히 많은 수의 서로 수직인 벡터들을 만들어 낼 수 있는가?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;A. 그렇지 않다. 상식적으로 생각해도 n차원 공간에서 n개보다 많은 서로 수직인 벡터들이 존재할 순 없다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;입력 v1, v2, ... 벡터들이 모두 일차독립인 경우에만 Gram-Schmidt로&amp;nbsp;입력 벡터의 수와 동일한 개수의 수직 벡터들이&amp;nbsp;만들어 진다. &lt;span style=&quot;color: rgb(255, 0, 127);&quot;&gt;만일 직교화 과정 도중에 일차독립이 아닌 벡터가 입력으로 들어오면 여기서 생성된 u는 0벡터가 된다&lt;/span&gt;. 입력 v1, v2, ..., vk까지는 일차독립이라 하자. 그런데, 새로 들어온 벡터 v&lt;sub&gt;k+1&lt;/sub&gt;이 기존의 v1, ..., vk와 일차독립이 아니라고 하자. 즉, v&lt;sub&gt;k+1&lt;/sub&gt;이 v1, ..., vk로 이루어진 공간에 포함된 벡터라고 가정하자. 그러면 v&lt;sub&gt;k+1&lt;/sub&gt;에서 {v1, ..., vk}에 내린 투영벡터는 자기 자신이 된다. 따라서 u = v&lt;sub&gt;k+1&lt;/sub&gt; - proj&lt;sub&gt;{v1,...,vk}&lt;/sub&gt;(v&lt;sub&gt;k+1&lt;/sub&gt;) = 0이 된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Gram-Schmidt 과정 도중에 영벡터가 나온다면 이를 무시하고 다음 입력 벡터로 넘어가거나 또는 차원의 개수만큼 수직 벡터가 얻어졌으면 직교화 과정을 종료한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: right;&quot;&gt;by 다크 프로그래머&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>수학 이야기</category>
      <category>Gram-Schmidt</category>
      <category>그람-슈미트</category>
      <category>정규직교화</category>
      <category>직교화</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/165</guid>
      <comments>https://darkpgmr.tistory.com/165#entry165comment</comments>
      <pubDate>Wed, 17 May 2017 17:08:58 +0900</pubDate>
    </item>
    <item>
      <title>곱셈과 덧셈</title>
      <link>https://darkpgmr.tistory.com/164</link>
      <description>&lt;p&gt;초등학교 다니는 아이가 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아빠, 수학 문제 하나 내주세요&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그래.. 7 곱하기 8이 뭐지?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;음... 몰라요&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그럼, 5 곱하기 3은?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;15?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그래, 왜 그렇지?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;보세요, 5가 3개 있으니까 5 + 5 + 5 해서 15 잖아요&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;오 대단한데. 곱셈은 이제 완벽하게 이해했구나? ^^&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;☞ 수학은 (모든 공부도 마찬가지) 원리와 이해가 중요하다고 알지만 막상 실천은 어렵습니다. 어른들은 유치원 정도 어린아이가 구구단을 줄줄 외면 기특하다며 놀라워합니다. 하지만 구구단을 줄줄 외는 것보다는 곱셈이 무엇인지 이해하는게 백만배 더 대단합니다. 많은 초등학생들이 학습지를 합니다. 좋은 학습지도 있겠지만 대다수의 학습지는 반복연습을 통한 문제풀이의 숙달입니다. 아이가 풀고 있는 학습지를 본인도 직접 풀어봤는지 궁금합니다. 숙달도 중요하지만 그만큼 무언가를 차분히 생각할 시간은 줄어듭니다. 저는 아이가 방바닥에 드러누워 손가락만 빠는 시간도 무척 좋은 시간이라고 생각합니다. 이리 뒹글 저리 뒹글하면서 뭔가는 생각하고 있겠지요.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: right;&quot;&gt;by 다크 프로그래머&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>수학 이야기</category>
      <category>곱셈</category>
      <category>공부</category>
      <category>수학</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/164</guid>
      <comments>https://darkpgmr.tistory.com/164#entry164comment</comments>
      <pubDate>Wed, 26 Apr 2017 13:43:46 +0900</pubDate>
    </item>
    <item>
      <title>색의 항상성(Color Constancy)의 이해</title>
      <link>https://darkpgmr.tistory.com/163</link>
      <description>&lt;p&gt;개인적으로 색의 항상성(color constancy)에 관심을 갖게 된 이유는 영상 추적(tracking)과 관련이 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;영상에서 물체를 추적하는 가장 기본적인 방법은 물체의 색상(color)을 추적하는 것이다. 즉, 빨간색 옷을 입은 사람을 추적하기 위해서 영상에서 빨간색 영역을 찾아서 추적하는 방식이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그런데 막상 영상 추적 기술을 컴퓨터로 구현하면 잘 하지 못하는 경우가 많다. 중간에 추적하던 물체를 잃어버리고 엉뚱한 물체를 추적하는 경우가 종종 발생한다. 반면에 인간은 주변 환경에 바뀌더라도 (그래서 실제 물체의 색이 바뀌더라도) 물체 본연의 색을 잘 구분하고 인지해 낸다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이러한 차이는 어디서 오는 걸까?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그건 컴퓨터는 색을 곧이 곧대로 입력된 정보로만 해석하는 반면 인간은 입력된 색을 넘어 물체 본연의 색을 복원하여 인지하기 때문이다. 영상에서 물체의 색은 주변 환경(햇빛, 그늘, 조명 등)에 따라 시시각각 변한다. 따라서 유사한 색상만 추적하도록 프로그래밍된 컴퓨터로서는 그 변화를 따라가기가 쉽지 않다. 하지만 인간은 인간의 대표적 착시현상인 &quot;색의 항상성(color constancy)&quot; 기저로 인해 이러한 변화를 상쇄시키는 능력을 가지고 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;인간의 색 항상성(color constancy) 기저가 무엇인지에 대해서는 잘 알려져 있다. 하지만 이 글에서는 이 기저를 좀더 기계적(수학적, 수치적?)으로 분석해 보고자 한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;색(color)의 형성&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;물체는 물체마다 고유의 색(color)이 있다. 잘 익은 사과는 붉은색이고 나뭇잎은 초록색이다. 그리고 사과의 과육은 흰색이며 씨앗은 짙은 갈색이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 350px; width: 350px; height: 264px;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/267A114658F98C0930&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F267A114658F98C0930&quot; width=&quot;350&quot; height=&quot;264&quot; filename=&quot;사과.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;width: 350px; height: 264px;&quot; original=&quot;yes&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;그림 1. 사과&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그런데 이 색은 어떻게 결정되는 것일까? 일반적으로 물체의 색이 형성되는 것은 흔히 광원(햇빛, 조명 등), 물체의 재질, 그리고 인간의 시각인지 3가지 요소의 상호작용의 결과라고 알려져 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;우리가 흔히 보는 햇빛은 색이 없는 것처럼 보이지만 햇빛에는 적외선, 자외선, 가시광선, X선, 감마선, 등등 모든 파장대의 빛이 포함되어 있다. 햇빛을 프리즘을 통해서 보면 무지개빛이 나타나는게 그 한 예이다. 이 태양빛이 물체에 도달하면 물체의 재질에 따라서 어떤 파장대의 빛은 흡수되고 어떤 파장대의 빛은 반사된다. 즉, 물체 고유의 반사 스펙트럼(spectrum)이 형성된다. 그리고 광원의 빛 중 물체에 흡수되지 못하고 반사되는 빛이 우리 눈에 도달하면 물체 고유의 색(color)으로 인지된다. 결국 사과가 붉게 보이는 이유는 사과가 햇빛의 가시광 성분중 붉은색 성분을 가장 잘 반사시킨다는 의미가 된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그렇다면 만일 광원(조명)이 오직 한 가지 파장대의 빛으로만 구성되어 있다면 어떻게 될까?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;덴마크 출신의 아티스트 올라퍼 엘리아슨(Olafur Eliasson, 1967)의 작품 &quot;Room for one colour&quot;이 좋은 예이며 이 작품에서는 모든 빛을 차단한 채 입장객으로 하여금 오직 노란색 빛만이 존재하는 공간을 체험하게 한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 550px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2505934858F99DA328&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2505934858F99DA328&quot; width=&quot;550&quot; height=&quot;365&quot; filename=&quot;room for one colour.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;그림 2. Room for one colour, Olafur Eliasson&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;색(color)의 생성 원리를 이해한다면 이 공간에서는 모든 사물들이 노란색으로만 보이게 되리라는 것을 손쉽게 예측할 수 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;☞ 실제로 윈도우즈의 그림판 프로그램으로 위 이미지의 픽셀값들을 찍어보면 모두&amp;nbsp;노란색 성분으로 이루어져 있음을 확인할 수 있다 (밝기차만 존재). 만일 노란색 이외의 색상이 존재하는 것처럼 느껴진다면 그건 인간의 착시 현상이 발현된 것으로 볼 수 있다.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;색 항상성(color constancy)&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;앞서 물체의 색이 어떻게 형성되고 결정되는지 살펴보았다. 색이란 결국 빛의 스펙트럼이며 우리 눈에 들어오는 빛(색)은 광원의 빛 중 물체에 흡수되지 못하고 반사된 빛이다. 그런데 우리 인간은 이 빛을 있는 그대로 인지하지 않고 특수한 변환과정을 거쳐서 인지한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;색 항상성(color constancy)은 주변 환경(조명)의 변화로 인해 물체의 색(color)이 변하더라도 이러한 변화를 무시하고 물체를 원래의 (고유의)&amp;nbsp;색으로 인지하는 인간의 착시 현상을 일컫는다. 예를 들어 붉은 조명이 있는 카페에 처음 들어섰을 때는 모든 것이 붉게 보이지만 조금만 시간이 지나면&amp;nbsp;붉은색을 느끼지 못하는 것과 관련된다 (실제 눈에 도달하는 빛은 붉은색이지만 인간의 뇌에서는 붉은색이 없는 것으로 인지).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래 그림은 색 항상성(color constancy)의 대표적 예로 사용되는 Edward H. Adelson의 &quot;Checker Shadow Illusion&quot;이다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 550px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/211E094258FED59D36&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F211E094258FED59D36&quot; width=&quot;550&quot; height=&quot;425&quot; filename=&quot;764px-Grey_square_optical_illusion.svg.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;그림 3. Checker shadow illusion, Edward H. Adelson&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;잘 믿기지는 않지만 위 그림에서 A, B 위치의 보드는 서로 동일한 색이다. 인간의 눈으로 보기에는 A가 더 어두운 색으로 보이지만 위 그림을 이미지로 저장한 후 그림판 등으로 색을 확인해 보면 A, B 두 부분이 완전히 동일한 색(밝기)임을 확인할 수 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;☞ A, B가 정말 같은 색인지 실제로 확인해보길 추천한다. 한 쪽을 오려서 다른 쪽에 가져다 대면 같은 색임을 확인할 수 있다.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래 그림은 인간의 착시현상을 보여주는 또 다른 예이다 (R. Beau Lotto의 &quot;Cross-Piece Illusion&quot;).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 550px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/24020A3C58FEDBD524&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F24020A3C58FEDBD524&quot; width=&quot;550&quot; height=&quot;380&quot; filename=&quot;Cross-Piece Illusion.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;그림 4. Cross-Piece Illusion, R. Beau Lotto&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;위 그림에서 두 막대가 교차하는 지점의 색상은 왼쪽은 자주색(혹은 남색), 오른쪽은 노란색으로 보인다. 하지만 역시 두 지점의 색은 실제로는 완전히 동일한 색이다.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;☞ 마찬가지로 두 지점이 동일한 색임을 직접 확인해 보도록 하자.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;앞서 예로 든 착시 현상들은 모두 인간이 입력된 색상을 그대로 보지 않고 배경의 영향을 제거한 물체 본연의 색으로 복원하여 인지하기 때문이다. 그리고 이러한 인간 고유의 시각 메커니즘을 우리는 &quot;색 항상성(color constancy)&quot;이라 부른다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;색 항상성(color constancy)의 원리&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;인간의 색 항상성(color constancy) 메카니즘을 이해하기 위해 위 예시 그림들을 분석해 보자.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;먼저, 두 번째 그림 cross-piece illusion 그림에 있는 중앙 교차부분 색상값을&amp;nbsp;그림판을 이용하여 확인해 보자. 그러면 원래 색은 아래와 같이 아무런 색상도 없는 무채색(회색)임을 확인할 수 있다. 단지 주위 배경의 영향으로 인해 동일한 색이 왼쪽에서는 자주색, 오른쪽에서는 노란색으로 보일 뿐이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 550px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2561F83E58FEEEA61C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2561F83E58FEEEA61C&quot; width=&quot;550&quot; height=&quot;349&quot; filename=&quot;Cross-Piece Illusion_원본색상.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;그림 5. 교차지점의 실제 픽셀 값&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;앞서 색 항상성(color constancy)은 배경의 영향을 제거하고 본래의 색을 복원하여 인지하는 능력이라고 했다. 이를 확인하기 위해 실제 색에서 인위적으로 배경색을 제거해 보자. 먼저 cross-piece illusion 그림의 왼쪽 부분을 살펴보면 전반적으로 노란색 배경이 존재한다. 따라서 교차 부분의 실제 색에서 노란색(빨강+녹색) 성분을 일정하게 감소시켜 보면 아래 그림과 같이 우리가 착시로 인지한 색상인 자주색이 나옴을 확인할 수 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 550px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/21134F4858FEF06414&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F21134F4858FEF06414&quot; width=&quot;550&quot; height=&quot;349&quot; filename=&quot;Cross-Piece Illusion_노랑보상.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;그림 6. 노란색 배경 보상&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이번엔 그림에서 오른편의 파란색 배경이 있는 부분을 살펴보자. 역시 마찬가지로 중앙 교차 부분의 실제 색은 그림 5와 동일한&amp;nbsp;무채색(회색)이다. 이 색에서 배경색인 파란색 성분을 제거해 보자. 아마도 이쯤되면 눈치빠른 분들은 그 결과를 예상할 수 있을 것이다. 그러면 예상했던대로 그 결과는 아래 그림과 같이 우리가 착시로 인지한 노란색 색상이 된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 550px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2230175058FEF0E304&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2230175058FEF0E304&quot; width=&quot;550&quot; height=&quot;349&quot; filename=&quot;Cross-Piece Illusion_파랑보상.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;그림 7. 파란색 배경 보상&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이상의 실험 결과에서 우리는 우리 인간이 인지하는 색상은 눈에 도달한 실제 색상이 아닌 주변 배경을 보상한 색으로 인지함을 확인할 수 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;첫 번째 예인 checker shadow illusion도 유사한 방식으로 설명될 수 있다. 그림에서 B 영역의 주변은 원기둥의 그늘로 인해 전반적으로 어두운 배경을 갖는다. 따라서 이러한 배경의 어두움을 보상하기 위한 인간 시각 메커니즘으로 인해 B 영역은 원래의 색상보다 좀더 밝은 색으로 인지된다 (그림에서 숫자는 그림판으로 확인한 실제 픽셀 밝기값).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 550px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/26157B4658FF01A72F&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F26157B4658FF01A72F&quot; width=&quot;550&quot; height=&quot;425&quot; filename=&quot;764px-Grey_square_optical_illusion.svg_2.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;그림 8. checker shadow illusion의 원리&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;색 항상성과 착시&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;앞서 색 항상성은 인간의 대표적 착시 현상 중 하나라고 했다. 그런데 이게 정말 착시일까?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;색 항상성 기저가 우리 눈에 들어온 빛을 그대로 보지 않고 왜곡해서 본다는 점에서는 착시로 볼 수 있다. 사물을 절대적으로 인지하지 않고 항상 상대적으로 인지하기 때문에 인간이 인지한 내용을 100% 신뢰하긴 힘들다. 그리고 항상 인지 오류의 가능성을 가지고 있다. 그러한 관점에서 인간의 눈은 믿을 수 없다라고 결론을 내릴 수도 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;하지만 조금만 관점을 바꾸어 보면 색 항상성은 사물의 본질을 꿰뚫어 본다는 점에서 인간의 대단한 능력 중 하나라고 볼 수 있다. 그림 4 cross-piece illusion 예에서 오른편 교차 지점은 인간에게 노란색 물체로 인지된다. 만일 그림 4가 인위적으로 만들어진 이미지가 아니라 우리가 현실 세계에서 실제로 인지한 내용이었다면 교차 지점은 실제 노란색이었을까 아니면 무채색(회색)이었을까? 당연히 노란색 물체였을 것이다. 그렇다면 노란색 물체를 노란색으로 인지한 것이 착시일까 아닐까?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;인간과 컴퓨터&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;인간은 그림 4 cross-piece illusion 예에서 오른편 교차 지점을 노란색으로 인지한다. 하지만 컴퓨터는 입력&amp;nbsp;그대로 무채색(회색)으로 인지한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: right;&quot;&gt;by 다크 프로그래머&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>영상처리</category>
      <category>색 항상성</category>
      <category>착시</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/163</guid>
      <comments>https://darkpgmr.tistory.com/163#entry163comment</comments>
      <pubDate>Wed, 26 Apr 2017 10:08:00 +0900</pubDate>
    </item>
    <item>
      <title>precision, recall의 이해</title>
      <link>https://darkpgmr.tistory.com/162</link>
      <description>&lt;p&gt;자신이 어떤 기술을 개발하였다. 예를 들어 이미지에서 사람을 자동으로 찾아주는 영상 인식 기술이라고 하자. 이 때, 사람들에게 &quot;이 기술의 검출율은 99.99%입니다&quot;라고 말하면 사람들은 &quot;오우...!!!&quot; 하면서 감탄할 것이다. 반면에 &quot;이 기술의 검출율은 50%입니다&quot;라고 말하면 사람들은 별 관심을 보이지 않거나 &quot;그것도 기술이라고...&quot; 생각할 것이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이것은 전형적인 일반인의 반응이다. 이러한 반응이 크게 잘못된 것은 아니지만 이러한 반응에는 명시되지 않은 한 가지 전제가 깔려있다. 그것은 '이 기술은 절대로 오검출을 하지 않는다' 이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;문제를 조금 바꿔보자. A와 B라는 기술이 있다. A라는 기술은 이미지에 있는 사람을 99.99% 잡아내지만 이미지 1장 당 평균 10건 정도의 오검출이 발생한다. 즉, 사람이 아닌 부분도 사람이라도 검출하는 경우가 빈번히 발생한다. 반면에 B라는 기술은 이미지에 있는 사람들 중 50%밖에 못 잡아내지만 오검출은 거의 발생하지 않는다. 그렇다면 A라는 기술과 B라는 기술 중 어느 기술이 뛰어난 기술인가? 그것은 응용에 따라 달라질 수 있지만 중요한 것은 검출율 만으로 기술을 평가하는 것은 적합하지 않다는 것이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;☞ 검출율 100%의 물체인식 기술은 누구라도 손쉽게 만들 수 있다. 그것은 모든 입력에 대해 항상 물체가 검출된 것으로 반환하도록 알고리즘을 구현하면 되기 때문이다.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(255, 0, 127);&quot;&gt;인식/탐지 기술의 성능을 평가하기 위해서는 검출율과 정확도를 동시에 고려해야 한다.&lt;/span&gt; 검출율은 직관적으로는 detection rate이지만 학문적으로는 &lt;b&gt;recall&lt;/b&gt;이란 용어를 사용한다. 그리고 정확도에는 &lt;b&gt;precision&lt;/b&gt;이란 용어를 사용한다. recall은 대상 물체들을 빠뜨리지 않고 얼마나 잘 잡아내는지를 나타내고 precision은 검출된 결과가 얼마나 정확한지 즉, 검출 결과들 중 실제 물체가 얼마나 포함되어 있는지를 나타낸다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그렇게 어려운 개념이 아님에도 불구하고 의외로 precision과 recall의 개념을 정확히 이해하지 못하고 혼동스러워하는 경우가 종종 있다. 그 이유는&amp;nbsp;detect라는 말에 대해서 혼동을 가지는 경우가 많기 때문이다. detect라는 단어는 단지 알고리즘이 무언가를 검출했다는 것을 의미할 뿐이다. 우리가 개발한 알고리즘은 완벽하지 않기 때문에 알고리즘이 검출한 결과에는 실제 물체를 물체라고 검출한 것도 있지만 물체가 아닌 것을 물체라고 검출한 수도 있다. 하지만 사람들은 흔히 detect라는 말을 실제 물체를 검출한 경우로만 한정하여 생각하기 쉽다. 이 경우 precision, recall의 개념을 정확하게 이해하지 못하고 혼동스러워하는 원인이 된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;어떤 인식 알고리즘의 precision과 recall을 정의해 보면 다음과 같다. detection이란 말이 단지 알고리즘의 출력(결과)임을 상기하면 두 용어의 개념이 보다 명확해진다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;txc-formula&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/257A0E345869D60F13&quot; historydata=&quot;%3Cflashrichtext%20version%3D%221%22%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28recall%3D%5Cfrac%20%7B%20detected%5Cquad%20TRUE%20%7D%7B%20total%5Cquad%20number%5Cquad%20of%5Cquad%20existing%5Cquad%20TRUE%20%7D%20%29%3C/textformat%3E%0A%3C/flashrichtext%3E%2C%0A12%2C%0Atransparent&quot; width=&quot;352&quot; height=&quot;52&quot;&gt;&amp;nbsp;---(1)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;txc-formula&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/257E32345869D7FC19&quot; historydata=&quot;%3Cflashrichtext%20version%3D%221%22%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28precision%3D%5Cfrac%20%7B%20TRUE%5Cquad%20detections%20%7D%7B%20whole%5Cquad%20detections%5Cquad%20of%5Cquad%20an%5Cquad%20algorithm%20%7D%20%29%3C/textformat%3E%0A%3C/flashrichtext%3E%2C%0A12%2C%0Atransparent&quot; width=&quot;402&quot; height=&quot;52&quot;&gt;&amp;nbsp;--- (2)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;인식 알고리즘의 성능과 관련해서 마지막 오해는 어느 한 고정된 값으로 알고리즘의 성능을 평가하는 것이다. 예를 들어, '어느 알고리즘의 성능은 검출율(recall) 0.9, 정확도(precision) 0.7이다'라고 표현하는 식이다. 하지만 알고리즘의 성능을 어느 한 값으로만 표현하고 평가하는 것은 올바른 방법이 아니다. 왜냐하면 알고리즘의 recall과 precision은 알고리즘의 파라미터 조절에 따라 유동적으로 변하는 값이기 때문에 어느 한 값으로는 알고리즘 전체의 성능을 제대로 표현할 수 없기 때문이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;☞ 일반적으로 알고리즘의 검출율(recall)과 정확도(precision)는 서로 반비례 관계를 가진다.&amp;nbsp;알고리즘의 파라미터를 조절해 검출율을 높이면 오검출(false alarms)이 증가하고&amp;nbsp;반대로 오검출을 줄이기 위해 조건을 강화하면 검출율(recall)이 떨어진다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;따라서 인식 알고리즘들의 성능을 제대로 비교하고 평가하기 위해서는 precision과 recall의 성능변화&amp;nbsp;전체를 살펴봐야 한다. 그리고 그러한 대표적인 방법은 precision-recall 그래프를 이용하는 것이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Precision-recall 그래프&lt;/b&gt;&lt;/p&gt;&lt;p&gt;알고리즘의 파라미터(threshold 등) 조절에 따른 precision과 recall의 값의 변화를 그래프로 표현한 것. 일례로 아래 그림은 'Object Detection with Discriminatively Trained Part Based Models', TPAMI 2010 논문에서 DPM 모델의 여러 변형에 따른 성능변화를 그래프로 표현한 것이다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 507px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/214932335869F08E38&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F214932335869F08E38&quot; width=&quot;507&quot; height=&quot;407&quot; filename=&quot;precision-recall1.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;그림 1. precision-recall 그래프의 예&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;precision-recall 그래프는 다양한 형태로 변형되어 표현될 수 있는데 recall 대신에 miss rate (miss rate = 1 - recall), precision 대신에는 false alarm rate (false alarm rate = 1 - precision) 등이 사용될 수 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Average Precision (AP)&lt;/b&gt;&lt;/p&gt;&lt;p&gt;precision-recall 그래프는 어떤 알고리즘의 성능을 전반적으로 파악하기에는 좋으나 서로 다른 두 알고리즘의 성능을 정량적으로(quantitatively) 비교하기에는 불편한 점이 있다. 그래서 나온 개념이 average precision이다. Average precision은 인식 알고리즘의 성능을 하나의 값으로 표현한 것으로서 precision-recall 그래프에서 그래프 선 아래쪽의 면적으로 계산된다 (그림 2). 위 그림 1의 예에서 괄호 안의 숫자가 해당 알고리즘의 average precision 값이다. 그리고 average precision이 높으면 높을수록 그 알고리즘의 성능이 전체적으로 우수하다는 의미이다. 컴퓨터 비전 분야에서 물체인식 알고리즘의 성능은 대부분 average precision으로 평가한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 332px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/220E10365869F5CA34&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F220E10365869F5CA34&quot; width=&quot;332&quot; height=&quot;257&quot; filename=&quot;average_precision.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;그림 2. average precision&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;F-measure&lt;/b&gt;&lt;/p&gt;&lt;p&gt;알고리즘의 precision-recall 성능을 하나로 숫자로 표현하는 또 다른 방법이다. F-measure는 precision과 recall의 조화평균으로 계산된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;txc-formula&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/2444564F5869F97922&quot; historydata=&quot;%3Cflashrichtext%20version%3D%221%22%3E%0A%20%20%3Ctextformat%20font%3D%22Dotum%22%20size%3D%2216%22%20color%3D%222236962%22%20bold%3D%22false%22%20italic%3D%22false%22%20underline%3D%22false%22%20url%3D%22%22%20target%3D%22transparent%22%20align%3D%22left%22%20leftMargin%3D%2225%22%20rightMargin%3D%2225%22%20indent%3D%220%22%20leading%3D%220%22%20blockIndent%3D%220%22%20kerning%3D%22true%22%20letterSpacing%3D%220%22%20display%3D%22block%22%3E%28F-measure%3D2%5Cfrac%20%7B%20precision%5Ccdot%20recall%20%7D%7B%20precision+recall%20%7D%20%29%3C/textformat%3E%0A%3C/flashrichtext%3E%2C%0A12%2C%0Atransparent&quot; width=&quot;264&quot; height=&quot;49&quot;&gt;&amp;nbsp;--- (3)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;※ 참고사항: Precision과 Accuracy&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;혼동의 여지가 있어서 의도적으로 언급하지 않은 내용이 있는데 그것은 accuracy와 precision의 구분이다 (원래는 언급하지 않으려고 했는데.. 아래 댓글에 답변을 달다보니 필요해서 추가한 내용입니다). 먼저, 유의해야 할 사항이 하나 있는데 그것은 동일한 단어라 할지라도 그것이 사용된 context에 따라서 의미가 달라질 수 있다는 점이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;먼저, 단어 자체의 의미로 보면 accuracy는 정확도, precision은 정밀도로 번역되며 어떤 시스템(system)의 특징 또는 성능을 평가하는 척도로서 사용된다. 이 때, accuracy는 시스템의 결과(출력)가 참값(true)에 얼마나 가까운지를 나타나고 precision은 시스템이 얼마나 일관된 값을 출력하는지를 나타낸다. 즉, accuracy는 시스템의 bias를, precision은 반복 정밀도를 나타낸다. 예를 들어, 몸무게를 재는 저울이 있는데 50kg인 사람을 여러 번 측정했을 때 60, 60.12, 59.99, ... 와 같이 60 근방의 값으로 측정했다면 이 저울의 accuracy는 매우 낮지만(에러가 10kg이나 발생함) precision은 매우 높다고 말할 수 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;다음으로, 기계학습의 이진 분류(binary classification) 문제에 있어서는 precision이 조금&amp;nbsp;다른 의미로 사용된다(accuracy는 유사한 의미). Accuracy는 시스템이 올바르게(true를 true로 판단하고 false를 false로 판단) 판단하는 정도를 나타내며 Accuracy = (올바른 판단 횟수) / (판단 총 횟수) = (TP + TN) / (TP + TN + FP + FN)로 계산된다. 반면, precision은 &amp;nbsp;시스템이 true로 판단한 경우에 한해서의 정확도로서 precision = (실제 true 횟수) / (true로 판단한 횟수) = TP / (TP + FP)로 계산된다. 그리고 컴퓨터 비전 분야에서 사용하는 precision은 이 두번째 의미로서의 precision이다. 즉, 검출 시스템이 검출한(true라고 판단한) 결과에 대해서만 정확도를 측정한 것이 precision이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;컴퓨터 비전 분야의 검출 시스템(detection system)에서는 accuracy는 거의 사용하지 않고 precision만을 사용하기 때문에 precision을 '정확도'라고 번역해도 accuracy와 혼동의 여지가 적다. &lt;strike&gt;그리고 precision의 의미가 반복 정밀도(repeatability)가 아니기 때문에 이 글에서는 의미상 '정밀도'라고 번역하지 않고 '정확도'라고 표현하였다.&lt;/strike&gt;(삭제 이유는 아래 내용 참조)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;☞ (추가내용2) 나중에 다시 곰곰히 생각해 보니 이진 classification 문제나 비전에서 사용하는 precision도 '반복 정밀도'의 의미로도 해석이 가능함을 깨닫게 되었습니다. 즉, 실제 true인 것들에 대해 시스템을 테스트했을 때 그 답변이 항상 일정하면 precision이 높은 것이고 들쭉 날쭉하면 즉, 어느 때는 true라고 답변했다가 다른 때는 false라고 답변했다가 하면 precision이 낮은 것이라고 해석하면 그 뜻이 잘 일치됩니다. 그런 관점에서 보면 precision을 원래 단어 뜻 그대로 '정밀도'로 번역하는 것이 보다 정확할지도 모르겠습니다.. 하지만, 글을 다시 고치기는 귀찮고 또 '정확도'라고 표현하는 것이 직관적으로 이해하기 쉬운 면이 있어서 그냥 그대로 두렵니다.. @@;;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;☞ 그리고 recall도 정확히 번역하면 '재현율'이라고 하는 게 맞고, 또 기술적(학문적) 용어로도 재현율이 맞겠습니다. 하지만 일반인의 용어로서 그리고 보다 직관적이다고 생각되어 '검출율'이라고 표현했습니다.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: right;&quot;&gt;by 다크 프로그래머&lt;/p&gt;</description>
      <category>영상처리</category>
      <category>average precision</category>
      <category>precision</category>
      <category>Recall</category>
      <author>다크pgmr</author>
      <guid isPermaLink="true">https://darkpgmr.tistory.com/162</guid>
      <comments>https://darkpgmr.tistory.com/162#entry162comment</comments>
      <pubDate>Mon, 2 Jan 2017 16:21:03 +0900</pubDate>
    </item>
  </channel>
</rss>