<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>sailorCat</title>
    <link>https://lsann38.tistory.com/</link>
    <description> </description>
    <language>ko</language>
    <pubDate>Mon, 13 Jul 2026 23:48:42 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>sailorCat</managingEditor>
    <image>
      <title>sailorCat</title>
      <url>https://tistory1.daumcdn.net/tistory/4287849/attach/7dcd35834cc249278d8b802af9fc28e2</url>
      <link>https://lsann38.tistory.com</link>
    </image>
    <item>
      <title>point cloud 포인트 클라우드 RGB-d 센서 자율주행</title>
      <link>https://lsann38.tistory.com/361</link>
      <description>&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIAxAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 600; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-subtree=&quot;aimfl&quot;&gt;RGB-D 센서는 기존의 컬러 이미지(RGB)에 각 픽셀의 깊이 정보(Depth, 디스턴스)를 함께 측정하는 카메라 센서&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIBBAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;일반 카메라는 3차원 세상을 2차원 평면 이미지로만 담아내지만, RGB-D 카메라는 픽셀마다 &lt;b&gt;카메라로부터 물체까지의 실제 거리(Z축)&lt;/b&gt;를 밀리미터(mm) 단위의 수치 데이터로 동시 수집&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAEIBRAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;이 센서의 출력 결과물을 결합하면 곧바로 3차원 포인트 클라우드 데이터를 생성할 수 있다&lt;/div&gt;
&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 32px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;||[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;927&quot; data-origin-height=&quot;645&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bniduD/dJMcacKjoVh/w39h2VBVKessLOeTvv9Jhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bniduD/dJMcacKjoVh/w39h2VBVKessLOeTvv9Jhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bniduD/dJMcacKjoVh/w39h2VBVKessLOeTvv9Jhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbniduD%2FdJMcacKjoVh%2Fw39h2VBVKessLOeTvv9Jhk%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;927&quot; height=&quot;645&quot; data-origin-width=&quot;927&quot; data-origin-height=&quot;645&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;1. RGB-D 데이터의 구조&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEICBAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;RGB-D 센서는 촬영 시 두 가지 종류의 이미지를 동시에 만든다&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEICRAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;RGB 이미지:&lt;/b&gt; 일반 카메라와 같은 컬러 사진 (가로 &amp;times; 세로 &amp;times; 3채널)&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEICRAB&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;Depth(디스턴스) 이미지:&lt;/b&gt; 각 픽셀의 거리를 명암(보통 가까우면 밝고, 멀면 어두움)이나 물리적 수치(m 또는 mm)로 표현한 흑백 이미지 (가로 &amp;times; 세로 &amp;times; 1채널)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAEIChAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;이 두 데이터를 합성하면 아래와 같은 &lt;b&gt;4차원 공간 벡터 \([X, Y, Z, R, G, B]\)&lt;/b&gt; 배열&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAEICxAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;\(\text{RGB-D\ Pixel\ Vector}=\left[\begin{matrix}U_{\text{pixel}}&amp;amp;V_{\text{pixel}}\end{matrix}\right]+\text{Depth}(Z)\longrightarrow \left[\begin{matrix}X&amp;amp;Y&amp;amp;Z&amp;amp;R&amp;amp;G&amp;amp;B\end{matrix}\right]\)&lt;/div&gt;
&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 32px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;||[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;2. 거리를 측정하는 2가지 핵심 기술&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIDxAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;RGB-D 카메라는 레이저를 사용하는 대형 LiDAR 센서와 달리, 주로 다음과 같은 소형 카메라 모듈 기술을 사용&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIERAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;ToF (Time of Flight, 비행시간측정):&lt;/b&gt; 카메라에서 눈에 보이지 않는 적외선을 발사한 뒤, 물체에 부딪혀 돌아오는 시간을 측정 거리가 정밀하며 스마트폰(&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;a href=&quot;https://www.apple.com/kr/iphone/&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 500; margin: 0px; text-decoration: underline 1px solid rgb(21, 88, 214); border-bottom: 0px none rgb(21, 88, 214);&quot; data-hveid=&quot;CAEIERAB&quot;&gt;Apple iPhone Pro 시리즈&lt;/a&gt;&lt;/span&gt;의 LiDAR 스캐너)이나 산업용 로봇에 쓰인다&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIERAE&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;Structured Light (구조광):&lt;/b&gt; 특정 패턴의 적외선 그리드를 물체에 투사한 뒤, 물체 표면의 굴곡에 따라 패턴이 일그러지는 형태를 카메라로 분석해 거리를 계산 단거리가 매우 정밀하여 얼굴 인식(&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;a href=&quot;https://support.apple.com/ko-kr/102381&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 500; margin: 0px; text-decoration: underline 1px solid rgb(21, 88, 214); border-bottom: 0px none rgb(21, 88, 214);&quot; data-hveid=&quot;CAEIERAF&quot;&gt;Apple FaceID&lt;/a&gt;&lt;/span&gt;)이나 실내 3D 스캔에 유리&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 32px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;||[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;3. 대표적인 RGB-D 센서 제품군&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAEIFBAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;시장이나 연구실에서 가장 흔하게 접할 수 있는 대표적인 장비&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIFhAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;Intel RealSense (인텔 리얼센스 시리즈):&lt;/b&gt; &lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;a href=&quot;https://www.intelrealsense.com/depth-camera-d435/&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 500; margin: 0px; text-decoration: underline 1px solid rgb(21, 88, 214); border-bottom: 0px none rgb(21, 88, 214);&quot; data-hveid=&quot;CAEIFhAB&quot;&gt;D435&lt;/a&gt;&lt;/span&gt;, D455 등 개발자 및 로봇 공학 연구에서 가장 표준적으로 쓰이는 RGB-D 카메라&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIFhAE&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 600; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 600; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 600; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot;&gt;&lt;a id=&quot;pvlink3pcxarOuKs_R2roPy6GD4AM_1&quot; href=&quot;https://www.google.com/search?ibp=oshop&amp;amp;prds=pvt:hg,pvo:29,imageDocid:12740787626397423465,gpcid:7112253630127038979,headlineOfferDocid:11519390560306175081,productDocid:11519390560306175081,rds:PC_7112253630127038979%7CPROD_PC_7112253630127038979&amp;amp;q=product&amp;amp;sa=X&amp;amp;ved=2ahUKEwizlefcs4yVAxXPqFYBHcvQADwQxa4PegYIAQgWEAY&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 600; margin: 0px; text-decoration: underline 10% dotted rgb(128, 133, 140); border-bottom: 0px none rgb(10, 10, 10);&quot; data-ved=&quot;2ahUKEwizlefcs4yVAxXPqFYBHcvQADwQxa4PegYIAQgWEAY&quot;&gt;Microsoft Azure Kinect&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;:&lt;/span&gt;&lt;/b&gt; 마이크로소프트의 고해상도 ToF 카메라로, AI 기반의 신체 추적(Body Tracking)과 공간 스캔에 뛰어난 성능&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIFhAJ&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 600; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 600; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 600; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot;&gt;&lt;a id=&quot;pvlink3pcxarOuKs_R2roPy6GD4AM_3&quot; href=&quot;https://www.google.com/search?ibp=oshop&amp;amp;prds=pvt:hg,pvo:29,imageDocid:18383926363399886975,gpcid:2793712410949320129,headlineOfferDocid:11701281327426900768,productDocid:11701281327426900768&amp;amp;q=product&amp;amp;sa=X&amp;amp;ved=2ahUKEwizlefcs4yVAxXPqFYBHcvQADwQxa4PegYIAQgWEAs&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 600; margin: 0px; text-decoration: underline 10% dotted rgb(128, 133, 140); border-bottom: 0px none rgb(10, 10, 10);&quot; data-ved=&quot;2ahUKEwizlefcs4yVAxXPqFYBHcvQADwQxa4PegYIAQgWEAs&quot;&gt;Stereolabs ZED 카메라&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;:&lt;/span&gt;&lt;/b&gt; 인간의 눈처럼 두 개의 렌즈(Stereo Vision)를 활용해 인공지능으로 깊이를 계산하는 RGB-D 센서로, 야외 장거리 측정에 강점&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 32px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;||[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;4. LiDAR 센서와의 차이점&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 4px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sfc-inited=&quot;2&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIGRAA&quot; data-ved=&quot;2ahUKEwizlefcs4yVAxXPqFYBHcvQADwQ-q4QegYIAQgZEAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;구분RGB-D 카메라LiDAR 센서
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-animation-nesting=&quot;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot;&gt;
&lt;tr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(220, 223, 229);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;측정 방식&lt;/b&gt;&lt;/td&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(220, 223, 229);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;카메라 이미지 센서 기반&lt;/td&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(220, 223, 229);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;레이저(펄스) 스캐닝 기반&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(220, 223, 229);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;시야각 (FoV)&lt;/b&gt;&lt;/td&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(220, 223, 229);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;카메라처럼 전방의 특정 각도만 촬영&lt;/td&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(220, 223, 229);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;회전형의 경우 360도 전 방위 측정 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(220, 223, 229);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;색상 정보&lt;/b&gt;&lt;/td&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(220, 223, 229);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;RGB 내장 (기본 포함)&lt;/td&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(220, 223, 229);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;기본적으로 색상 없음 (카메라 추가 결합 필요)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(220, 223, 229);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;외부 환경&lt;/b&gt;&lt;/td&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(220, 223, 229);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;햇빛이 강한 야외에서는 적외선 간섭으로 품질 저하&lt;/td&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(220, 223, 229);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;햇빛에 강하며 야외 및 장거리(100m~300m)에 특화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;가격 및 크기&lt;/b&gt;&lt;/td&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;상대적으로 저렴하고 소형화 용이&lt;/td&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;고가 장비가 많고 차량/드론 탑재용 크기&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 32px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;||[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;5. 주요 활용 분야&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIHBAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;로봇 자율 주행:&lt;/b&gt; 서빙 로봇이나 청소기가 전방의 장애물(의자 다리, 사람)의 형태와 거리를 입체적으로 인식&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIHBAD&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;메타버스 및 AR/VR:&lt;/b&gt; 현실 공간을 그대로 스캔하여 3D 가상 공간(디지털 트윈)을 구축하거나, 가상의 가구를 방에 배치해 보는 앱에 사용&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIHBAG&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;인체 모션 캡처:&lt;/b&gt; 사람의 관절 위치(X, Y, Z)를 실시간 3D 벡터로 추적하여 게임 캐릭터를 움직이거나 재활 치료용 자세 교정에 활용&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RGB-D 센서는 실시간 차량 제어용 자율주행 센서로는 치명적인 한계가 있어, 주로 사용자 화면(내비게이션 UI), 차량 내부 모니터링, 또는 증강현실(AR) 헤드업 디스플레이(HUD)&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;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;❌ 실제 자율주행 제어에 쓰이기 힘든 이유 (태생적 한계)&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIBRAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;햇빛에 쥐약 (야외 노이즈):&lt;/b&gt; 대다수 RGB-D 카메라는 적외선 패턴(Structured Light)이나 적외선 플래시(ToF) 사용 태양광은 엄청난 양의 자연 적외선을 포함하고 있어서, &lt;b&gt;낮에 야외로 나가는 순간 햇빛에 묻혀 거리 측정이 완전히 불가능&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIBRAD&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;짧은 측정 거리:&lt;/b&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt; LiDAR는 100m~300m 앞의 고속도로 장애물까지 잡아내지만, RGB-D 카메라는 성능이 좋아도 보통 &lt;b&gt;5m~10m 내외(길어야 20m)&lt;/b&gt;만 측정할 수 있어 고속 주행 시 급제동 거리를 확보할 수 없다&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 32px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;||[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;⭕ 사용자 내비게이션 및 인포테인먼트 화면에서의 대활용&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAICBAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;대신 컴퓨터 비전 기술과 결합하여 &lt;b&gt;운전자에게 시각적 정보를 직관적으로 보여주는 영역&lt;/b&gt;에서는 최고의 효율을 낸다&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAICRAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;AR(증강현실) 내비게이션 구현:&lt;/b&gt; 전방 카메라로 도로를 찍으면서, 깊이(Depth) 정보를 통해 앞차와의 거리나 도로 굴곡을 파악이를 통해 내비게이션 화면이나 HUD(전면 유리) 위에 &lt;b&gt;&quot;몇 미터 앞 차량 뒤를 따라가세요&quot;&lt;/b&gt; 같은 가상 가이드라인을 오차 없이 정확한 3D 위치에 입혀줌&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAICRAD&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;차량 내부 운전자 모니터링 (In-Cabin Sensing):&lt;/b&gt; 야외 태양광 영향을 받지 않는 &lt;b&gt;차량 내부&lt;/b&gt;에서는 RGB-D 센서가 강력한 위력을 발휘합니다. 운전자의 얼굴 윤곽(3D 형태)과 눈동자 움직임을 실시간으로 3D 벡터 추적하여, 졸음운전을 하거나 전방 주시를 태만히 할 때 화면에 경고를 띄움&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAICRAG&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;제스처 컨트롤 UI:&lt;/b&gt; 인포테인먼트 화면 앞에서 운전자가 허공에 손가락을 돌리면 볼륨이 조절되고, 손을 저으면 화면이 넘어가는 등의 3D 공간 모션 인식을 완벽하게 구현&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>호기심</category>
      <category>LIDAR</category>
      <category>Point Cloud</category>
      <category>RGB-D</category>
      <category>자율주행</category>
      <category>포인트 클라우드</category>
      <author>sailorCat</author>
      <guid isPermaLink="true">https://lsann38.tistory.com/361</guid>
      <comments>https://lsann38.tistory.com/361#entry361comment</comments>
      <pubDate>Wed, 17 Jun 2026 03:45:43 +0900</pubDate>
    </item>
    <item>
      <title>point cloud 포인트 클라우드 LiDAR 데이터 형식</title>
      <link>https://lsann38.tistory.com/360</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; 포인트 클라우드(Point Cloud)는 LiDAR 센서나 3D 스캐너로 수집한 &lt;b&gt;3차원 공간상의 점(Point)들의 집합&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;각 점은 X, Y, Z의 기하학적 좌표를 가지며, 필요에 따라 RGB 색상이나 반사 강도 같은 추가 속성도 포함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;공간 상의 이산적인 데이터 포인트 집합&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIAxAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;LiDAR 포인트 클라우드 데이터 형식은 주로 LAS, LAZ, PCD, PLY 형식을 사용&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAAIBBAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;LiDAR 센서는 단순히 위치(X, Y, Z) 정보뿐만 아니라 레이저의 반사 강도, 반사 횟수 등 센서 고유의 메타데이터를 함께 기록하기 때문에 일반 3D 모델링 파일과 다른 전용 포맷을 활용&lt;/span&gt;&lt;/div&gt;
&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 32px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;||[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1. 대표적인 LiDAR 데이터 파일 형식&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 4px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sfc-inited=&quot;2&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIBxAA&quot; data-ved=&quot;2ahUKEwiX_YPxsoyVAxV11TQHHYQeK4oQ-q4QegYIAAgHEAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;포맷 확장자 주요 특징 및 용도형태 종류&lt;/span&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-animation-nesting=&quot;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot;&gt;
&lt;tr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(220, 223, 229);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;.LAS&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(220, 223, 229);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;지형 정보(GIS) 표준 포맷&lt;/b&gt; (미국사진측량원격탐사학회 ASPRS 표준)&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(220, 223, 229);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이진(Binary)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(220, 223, 229);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;.LAZ&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(220, 223, 229);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;LAS 파일을 압축한 포맷&lt;/b&gt; (용량을 최대 90% 가까이 줄여줌)&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(220, 223, 229);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이진(Binary)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(220, 223, 229);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;.PCD&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(220, 223, 229);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Point Cloud Library (PCL) 전용 포맷&lt;/b&gt; (로봇 및 AI 연구용)&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(220, 223, 229);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;텍스트 / 이진&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(220, 223, 229);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;.PLY&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(220, 223, 229);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;다각형 메시 겸용 포맷&lt;/b&gt; (컬러 정보 및 속성 확장이 자유로움)&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(220, 223, 229);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;텍스트 / 이진&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;.TXT / .XYZ&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;가장 단순한 텍스트 포맷&lt;/b&gt; (호환성이 좋으나 대용량에 비효율적)&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;undefined&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;텍스트&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 32px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;||[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2. LiDAR 데이터 벡터 구조 (LAS 구조 기준)&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAAIChAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;LiDAR 데이터는 한 점당 다음과 같은 확장된 형태의 벡터 데이터로 저장&lt;/span&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAICxAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;\(\text{LiDAR\ Point\ Vector}=\left[\begin{matrix}X&amp;amp;Y&amp;amp;Z&amp;amp;I&amp;amp;R_{n}&amp;amp;N_{r}&amp;amp;C&amp;amp;\alpha &amp;amp;\dots \end{matrix}\right]\)&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIDBAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;X, Y, Z (위치)&lt;/b&gt;: 지구상의 절대 좌표(UTM 등) 또는 센서 기준의 상대 좌표 (단위: m)&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIDBAD&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;Intensity (강도)&lt;/b&gt;: 레이저가 물체에 부딪혀 돌아온 빛의 세기 (재질 식별용)&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIDBAG&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;Return Number (반사 순서)&lt;/b&gt;: 하나의 레이저 펄스가 여러 물체(예: 나뭇잎 &amp;rarr; 땅)에 부딪혀 돌아올 때 몇 번째 신호인지 기록 (\(R_{n}\))&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIDBAK&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;Number of Returns (총 반사 횟수)&lt;/b&gt;: 해당 레이저 펄스가 총 몇 번 분할되어 돌아왔는지 기록 (\(N_{r}\))&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIDBAO&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;Classification (분류)&lt;/b&gt;: 점이 속한 객체 종류 (0: 미분류, 1: 가공되지 않음, 2: 지면, 3: 낮은 식생, 5: 높은 식생, 6: 건물 등)&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIDBAR&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;Scan Angle (스캔 각도)&lt;/b&gt;: 레이저가 발사된 거울의 회전 각도 (&amp;alpha;)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 32px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;||[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3. 실제 데이터 저장 예시&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이진(Binary) 포맷 (LAS/LAZ/PCD Binary)&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAAIEBAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;컴퓨터가 빠르게 읽을 수 있도록 0과 1의 바이트 구조로 정렬되어 있어 사람이 직접 메모장으로 읽을 수 없습니다. 대용량 LiDAR 데이터를 실시간 처리할 때 필수&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;텍스트(ASCII) 포맷 (PCD ASCII / XYZ 예시)&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAAIEhAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;헤더 구조 뒤에 공백으로 구분된 벡터 데이터가 나열됩니다.&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 4px 0px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIExAA&quot; data-sfc-cb=&quot;&quot; data-wiz-uids=&quot;zUUTwb_4q,zUUTwb_4p&quot; data-sfc-root=&quot;c&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(240, 242, 245);&quot; data-sae=&quot;&quot; data-animation-atomic=&quot;&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 500; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;text&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot;&gt;
&lt;pre class=&quot;angelscript&quot; data-copy-service-computed-style=&quot;font-family: monospace; font-size: 14px; font-weight: 400; margin: 14px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot;&gt;&lt;code&gt;# .PCD 파일 포맷 예시
VERSION 0.7
FIELDS x y z intensity return_number classification
SIZE 4 4 4 4 1 1
TYPE F F F F U U
COUNT 1 1 1 1 1 1
WIDTH 3
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 3
DATA ascii
35.124 128.543 12.45 85 1 2
35.126 128.545 12.48 12 1 2
35.120 128.540 25.10 45 2 6
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 3px 0px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(240, 242, 245);&quot; data-sae=&quot;&quot; data-animation-atomic=&quot;&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 12px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-ved=&quot;2ahUKEwiX_YPxsoyVAxV11TQHHYQeK4oQh9gSegYIAAgTEAI&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 32px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;||[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;4. 자율주행 vs 지형 측량(GIS)의 포맷 차이&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIFhAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;지형 측량 / 드론 매핑&lt;/b&gt;: 드론이나 항공기 LiDAR로 수집한 광범위한 지역 데이터는 국토교통부나 내비게이션 지도 제작 시 &lt;b&gt;LAS/LAZ&lt;/b&gt; 포맷&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIFhAD&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;자율주행 연구 (원격 센싱)&lt;/b&gt;: ROS(로봇 운영체제) 환경이나 고정형 LiDAR 센서에서 실시간으로 들어오는 데이터 스트림은 주로 &lt;b&gt;PCD&lt;/b&gt; 포맷이나 매 프레임별 &lt;b&gt;Raw Binary Matrix&lt;/b&gt; 형태로 처리&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 32px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;||[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIAhAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;포인트 클라우드 데이터에서 &lt;b&gt;RGB 값은 각 점(Point)의 실제 색상 정보&lt;/b&gt;를 나타냅니다. 3D 스캐닝을 할 때 레이저로 위치를 측정하는 동시에, 내장된 컬러 카메라로 사진을 찍어 각 점의 좌표와 색상을 1:1로 매칭하여 저장&lt;/span&gt;&lt;/div&gt;
&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 32px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;||[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1. RGB 값의 표현 방식 (벡터 구조)&lt;/span&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIBRAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;데이터 파일 내에서 RGB 값은 주로 두 가지 형태 중 하나로 표현&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIBhAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;정수형 (0 ~ 255):&lt;/b&gt; 가장 직관적이고 흔한 형태 (예: [255, 0, 0]은 순수한 빨간색)&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIBhAB&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;정규화된 실수형 (0.0 ~ 1.0):&lt;/b&gt; 딥러닝 입력 데이터나 특정 3D 그래픽 엔진에서 처리하기 쉽도록 255로 나눈 값 (예: [1.0, 0.0, 0.0])&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;  데이터 배열 예시 (XYZ + RGB)&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 4px 0px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEICBAA&quot; data-sfc-cb=&quot;&quot; data-wiz-uids=&quot;HOnjwc_1k,HOnjwc_1j&quot; data-sfc-root=&quot;c&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(240, 242, 245);&quot; data-sae=&quot;&quot; data-animation-atomic=&quot;&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 500; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;python&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot;&gt;
&lt;pre class=&quot;json&quot; data-copy-service-computed-style=&quot;font-family: monospace; font-size: 14px; font-weight: 400; margin: 14px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot;&gt;&lt;code&gt;[
  #  [    X,     Y,     Z,    R,   G,   B ]
  [ 1.25, 3.42, 0.88, 255,   0,   0 ],  # 빨간색 점 (예: 소화전)
  [-0.45, 2.11, 1.50,   0, 255,   0 ],  # 초록색 점 (예: 나뭇잎)
  [ 0.12, 1.05, -0.2, 255, 255, 255 ]   # 흰색 점   (예: 차선 바닥)
]
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 32px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;||[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2. LiDAR와 RGB: 센서 종류에 따른 차이점&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEICxAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;모든 LiDAR가 RGB 값을 기본으로 수집하는 것은 아님&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIDBAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;일반 LiDAR (RGB 없음):&lt;/b&gt; 자율주행차 지붕에 달린 일반적인 LiDAR는 레이저만 쏘기 때문에 &lt;b&gt;위치(XYZ)와 반사 강도(Intensity)&lt;/b&gt;만 수집 색상 정보는 없다&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIDBAD&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;카메라 융합형 LiDAR (RGB 있음):&lt;/b&gt; 드론 매핑용 고가 LiDAR나 iPhone의 LiDAR 스캐너처럼 &lt;b&gt;카메라가 함께 장착된 장비&lt;/b&gt;는 레이저 좌표에 카메라의 픽셀 색상(RGB)을 실시간으로 입혀서 저장&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 32px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;||[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3. 파일 포맷별 RGB 저장 형태&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIDxAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;PLY / OBJ (3D 그래픽 포맷):&lt;/b&gt; 점 하나마다 X Y Z R G B 형태로 텍스트나 이진 데이터로 정직하게 기록&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIDxAD&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;PCD (Point Cloud Library 포맷):&lt;/b&gt; 메모리와 처리 속도를 아끼기 위해 R, G, B 3개 바이트(각 8비트)를 하나로 묶어 &lt;b&gt;32비트 부동소수점(Float) 하나로 압축&lt;/b&gt;하여 저장하기도 한다&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIDxAE&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;예시: RGB 값을 하나의 정수 4294967295 같은 형태로 묶어서 1개의 열로 표현&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIDxAH&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;LAS / LAZ (지형 측량 표준):&lt;/b&gt; 헤더 옵션에 따라 RGB 필드를 활성화할 수 있으며, 측량 장비에 따라 0~255가 아닌 &lt;b&gt;16비트(0 ~ 65535)&lt;/b&gt; 범위의 고해상도 RGB 값을 저장하기도 한다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 32px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;||[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;4. 포인트 클라우드에서 RGB가 중요한 이유&lt;/span&gt;&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIEhAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;시각적 직관성:&lt;/b&gt; 데이터 분석가나 작업자가 3D 모델을 볼 때, 흑백이나 단색보다 실제 색상이 보여야 물체를 훨씬 쉽게 식별합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIEhAD&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;AI 객체 인식(Semantic Segmentation):&lt;/b&gt; 자율주행이나 공간 인식 AI를 학습시킬 때, 형태(XYZ) 정보만 주는 것보다 색상(RGB) 정보를 함께 주면 &lt;b&gt;&quot;바닥에 그려진 흰색 차선&quot;&lt;/b&gt;이나 &lt;b&gt;&quot;빨간색 표지판&quot;&lt;/b&gt;을 훨씬 정확하게 구별&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>호기심</category>
      <category>LIDAR</category>
      <category>Point Cloud</category>
      <category>포인트 클라우드</category>
      <author>sailorCat</author>
      <guid isPermaLink="true">https://lsann38.tistory.com/360</guid>
      <comments>https://lsann38.tistory.com/360#entry360comment</comments>
      <pubDate>Wed, 17 Jun 2026 03:38:33 +0900</pubDate>
    </item>
    <item>
      <title>LiDAR, Light Detection and Ranging 라이다 자율주행 로봇 재난감지 지리정보 거리감지</title>
      <link>https://lsann38.tistory.com/359</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; 라이다(LiDAR, Light Detection and Ranging)는 레이저 펄스를 발사하여 대상체에 부딪혀 돌아오는 시간을 측정함으로써 정밀한 3차원 거리와 형상을 파악하는 원격 감지 기술 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;레이더(Radar)보다 파장이 짧은 빛을 사용하여 주변 환경을 고해상도의 3차원 포인트 클라우드(점군) 데이터로 시각화&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=xLtolcT-nRM&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=xLtolcT-nRM&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=xLtolcT-nRM&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bvVUOD/dJMb85vXX0g/kChz1vXveCE3AJ7NHVfEk0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/bdJdlJ/dJMb84qhxkK/0SdKtHS3hg3UfrdzPUgPH0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/7bXU3/dJMb87gfrqQ/Mtu30IKj2Lu960LQnrulw1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;CVAT Product Tour #7: 3D Point Cloud Annotation&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/xLtolcT-nRM&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 36px 0px 12px; text-decoration: none solid rgb(0, 29, 53); border-bottom: 0px none rgb(0, 29, 53);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;공식 가이드&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 36px 0px 12px; text-decoration: none solid rgb(0, 29, 53); border-bottom: 0px none rgb(0, 29, 53);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.cvat.ai/resources/blog/3d-point-cloud-annotation&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.cvat.ai/resources/blog/3d-point-cloud-annotation&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1781633835346&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Point Cloud Annotation: A Complete Guide to 3D Data Labeling | CVAT Blog&quot; data-og-description=&quot;3D point cloud annotation explained. Our in-depth article walks through applications in computer vision, and how to efficiently label 3D data. Published On: Mar 31, 2026&quot; data-og-host=&quot;www.cvat.ai&quot; data-og-source-url=&quot;https://www.cvat.ai/resources/blog/3d-point-cloud-annotation&quot; data-og-url=&quot;https://www.cvat.ai/resources/blog/3d-point-cloud-annotation&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cTplgZ/dJMb896cDnX/98Zg7M80uq3vlNuBhM0Wtk/img.jpg?width=1158&amp;amp;height=654&amp;amp;face=0_0_1158_654,https://scrap.kakaocdn.net/dn/tHZAp/dJMb81f1zKq/DC8N1KmFobT7zs0d7DfBr0/img.jpg?width=1158&amp;amp;height=654&amp;amp;face=0_0_1158_654,https://scrap.kakaocdn.net/dn/kMYmt/dJMb887hH89/MQXtWKiMvlFSHQxoR2IqT0/img.png?width=1355&amp;amp;height=897&amp;amp;face=0_0_1355_897&quot;&gt;&lt;a href=&quot;https://www.cvat.ai/resources/blog/3d-point-cloud-annotation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.cvat.ai/resources/blog/3d-point-cloud-annotation&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cTplgZ/dJMb896cDnX/98Zg7M80uq3vlNuBhM0Wtk/img.jpg?width=1158&amp;amp;height=654&amp;amp;face=0_0_1158_654,https://scrap.kakaocdn.net/dn/tHZAp/dJMb81f1zKq/DC8N1KmFobT7zs0d7DfBr0/img.jpg?width=1158&amp;amp;height=654&amp;amp;face=0_0_1158_654,https://scrap.kakaocdn.net/dn/kMYmt/dJMb887hH89/MQXtWKiMvlFSHQxoR2IqT0/img.png?width=1355&amp;amp;height=897&amp;amp;face=0_0_1355_897');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Point Cloud Annotation: A Complete Guide to 3D Data Labeling | CVAT Blog&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;3D point cloud annotation explained. Our in-depth article walks through applications in computer vision, and how to efficiently label 3D data. Published On: Mar 31, 2026&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.cvat.ai&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 36px 0px 12px; text-decoration: none solid rgb(0, 29, 53); border-bottom: 0px none rgb(0, 29, 53);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 36px 0px 12px; text-decoration: none solid rgb(0, 29, 53); border-bottom: 0px none rgb(0, 29, 53);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;  핵심 원리&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-ved=&quot;2ahUKEwiQx5P2q4yVAxV8bvUHHcO1N9QQi4wTegoIAggACAAIBxAK&quot; data-bfc=&quot;&quot;&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-hveid=&quot;CAIIAAgACAcQCw&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;발사 및 반사:&lt;/b&gt; 센서에서 발사된 레이저 빔이 주변의 물체에 부딪혀 반사되어 돌아옵니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-hveid=&quot;CAIIAAgACAcQDA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;시간 측정:&lt;/b&gt; 빛의 속도를 활용하여 레이저가 센서를 떠나 돌아오는 데 걸린 시간을 계산합니다. (거리 = 속도 &amp;times; 시간 &amp;divide; 2)&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-hveid=&quot;CAIIAAgACAcQDQ&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;3D 매핑:&lt;/b&gt; 수백만 개의 데이터를 실시간으로 조합하여 주변 환경의 정밀한 3D 지도를 생성합니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-ved=&quot;2ahUKEwiQx5P2q4yVAxV8bvUHHcO1N9QQi4wTegoIAggACAAIBxAS&quot; data-bfc=&quot;&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 36px 0px 12px; text-decoration: none solid rgb(0, 29, 53); border-bottom: 0px none rgb(0, 29, 53);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; ️ 주요 활용 분야&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-ved=&quot;2ahUKEwiQx5P2q4yVAxV8bvUHHcO1N9QQi4wTegoIAggACAAIBxAV&quot; data-bfc=&quot;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-hveid=&quot;CAIIAAgACAcQFg&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;자율주행 및 로봇 공학:&lt;/b&gt; 차량과 로봇의 '눈' 역할을 하며, 주변 보행자, 차량, 도로 시설물과의 거리를 입체적으로 인지합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-hveid=&quot;CAIIAAgACAcQFw&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;지리 정보 및 측량:&lt;/b&gt; 항공기나 드론에 장착하여 지형, 산림, 도시 인프라의 정밀한 3D 지도를 제작합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-hveid=&quot;CAIIAAgACAcQGA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;재난 감지 및 건설:&lt;/b&gt; 산사태 예측, 홍수 모델링, 교량 등 건축물의 구조적 변위 분석에 활용됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;자율주행 개발자 관점에서 라이다(LiDAR)는 단순히 &quot;거리를 재는 센서&quot;가 아니라, 3차원 공간의 기하학적 정보(Geometry)를 실시간으로 제공하는 가장 신뢰도 높은 소스(Ground Truth)입니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;개발자가 자율주행 소프트웨어 파이프라인(Perception-Localization-Planning)을 구축할 때 라이다 데이터(&lt;a href=&quot;https://23min.tistory.com/8&quot;&gt;Point Cloud&lt;/a&gt;)를 활용하는 핵심 분야와 구현 방식&lt;/span&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1. 3D 환경 인지 (Perception) 및 객체 검출&lt;/span&gt;&lt;/h2&gt;
&lt;div&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;카메라는 2D 이미지를 기반으로 거리를 '예측'해야 하지만, 라이다는 물체의 정확한 3D x, y, z 좌표를 즉시 반환합니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;3D Object Detection (3차원 객체 검출):&lt;/span&gt;
&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;구현: 포인트 클라우드를 입력받아 주변 차량, 보행자, 이륜차 등의 3D Bounding Box(위치, 크기, 헤딩 각도)를 추정합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;활용 모델: PointPillars, Second, PV-RCNN 같은 3D 딥러닝 백본 네트워크를 사용하여 텐서 변환 후 객체를 검출합니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;Semantic Segmentation (의미론적 분할):&lt;/span&gt;
&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;구현: 점 하나하나가 도로(Road), 인도(Sidewalk), 빌딩, 차량 중 어디에 속하는지 클래스를 분류합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;활용: 도로의 바닥면을 분할하여 차량이 주행 가능한 영역(Free Space)을 계산하는 데 필수적입니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;Unidentified Obstacle Detection (비정형 장애물 검출):&lt;/span&gt;
&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;AI가 학습하지 못한 물체(예: 도로 위의 박스, 타이어 파편)라도 라이다는 기하학적 형태를 그대로 잡기 때문에, 카메라 딥러닝의 엣지 케이스(Edge Case)를 보완하는 안전장치로 쓰입니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2. 고정밀 측위 및 맵핑 (Localization &amp;amp; Mapping)&lt;/span&gt;&lt;/h2&gt;
&lt;div&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;차량이 GPS 음영 지역(터널, 빌딩 숲)에서도 센티미터(cm) 단위로 자신의 위치를 찾아내도록 만듭니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;SLAM (Simultaneous Localization and Mapping):&lt;/span&gt;
&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;구현: 차량이 이동하면서 받아오는 실시간 포인트 클라우드 프레임을 연속적으로 매칭(Registration)하여 3차원 공간 지도를 동시에 그립니다. LeGO-LOAM, Fast-LIO 등의 알고리즘이 자주 쓰입니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;Point Cloud Registration (점군 정렬):&lt;/span&gt;
&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;구현: 현재 스캔한 데이터와 기구축된 고정밀 지도(HD Map)의 형태를 ICP(Iterative Closest Point)나 NDT(Normal Distributions Transform) 알고리즘으로 비교&amp;middot;정렬하여 차량의 정확한 6자유도(6-DoF) 위치를 추정합니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3. 센서 퓨전 (Sensor Fusion)&lt;/span&gt;&lt;/h2&gt;
&lt;div&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;라이다는 형태와 거리 인지에는 강하지만 색상, 질감, 텍스트(표지판, 신호등) 인지에는 취약합니다. 이를 카메라와 융합하는 파이프라인을 설계합니다.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;Early Fusion (초기 융합 / 데이터 레벨):&lt;/span&gt;
&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;카메라의 2D 픽셀과 라이다의 3D 포인트를 물리적 캘리브레이션(Calibration) 매트릭스를 통해 투영(Projection)시켜, 색상 정보(RGB)를 가진 3D 포인트 클라우드(RGB-D)를 만들어 입력 레이어로 사용합니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;Late Fusion (후기 융합 / 객체 레벨):&lt;/span&gt;
&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;카메라 딥러닝 모델이 뽑은 2D Bounding Box와 라이다 모델이 뽑은 3D Bounding Box를 헝가리안 알고리즘(Hungarian Algorithm)이나 칼만 필터(Kalman Filter)를 이용해 매칭하여 객체의 정확도를 최종 확정합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;4. 시뮬레이션 및 데이터 라벨링 자동화 (Simulation &amp;amp; MLOps)&lt;/span&gt;&lt;/h2&gt;
&lt;div&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;실제 도로 테스트 전에 소프트웨어를 검증하고 데이터셋을 구축할 때 대단히 유용합니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;Auto-Labeling (자동 라벨링 알고리즘):&lt;/span&gt;
&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;사람이 카메라 이미지에서 수천 장의 박스를 치는 것은 비효율적입니다. 라이다 SLAM으로 구축된 3D 포인트 클라우드 시퀀스를 앞뒤로 역추적(Backward/Forward Tracking)하여 3D 객체의 궤적을 만들면 수많은 카메라 이미지에 3D Bounding Box를 자동으로 투영시켜 라벨링 공수를 기하급수적으로 줄일 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;  개발자 입장에서 고려해야 하는 현실적인 이슈&lt;/span&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;데이터 스파시티 (Sparsity): 거리가 멀어질수록 레이저 점 사이의 간격이 넓어져 객체 형태를 알아보기 어렵기 때문에 다운샘플링(Voxel Grid Filter) 및 데이터 보간 처리가 중요합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;연산 복잡도 (Computation Cost): 초당 수십만~수백만 개의 점(Point)이 들어오기 때문에, 이를 실시간(최소 10~20Hz 이상)으로 처리하기 위해 C++ 기반의 &lt;a href=&quot;https://pointclouds.org/&quot;&gt;PCL(Point Cloud Library)&lt;/a&gt;나 GPU 가속(CUDA, TensorRT) 최적화가 필수적입니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;노이즈 필터링 (Noise Filtering): 눈, 비, 안개, 먼지 등이 레이저를 교란시켜 허위 포인트(Ghost Lines)를 만듭니다. 이를 걸러내는 주행 환경별 필터 아키텍처 설계가 필요합니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h2 data-sfc-root=&quot;ep&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;4. 시뮬레이션 및 검증 단계&lt;/span&gt;&lt;/h2&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIBhAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;자율주행 시뮬레이션 및 데이터 라벨링 자동화 파이프라인에서 오토 라벨링(Auto-labeling) 결과물의 정답(Ground Truth) 여부를 검증하는 단계를 &lt;b&gt;'QA(Quality Assurance) 및 검증(Validation) 단계'&lt;/b&gt;라고 합니다.&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAAICBAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 단계는 알고리즘이 자동으로 생성한 3D Bounding Box나 세그멘테이션 데이터의 오류를 찾아내고 수정하는 과정입니다. 개발자와 데이터 엔지니어는 라이다 어노테이션(LiDAR Annotation) 툴을 활용하여 다음과 같은 작업을 수행합니다.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 36px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;||[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 36px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1. 3D Bounding Box 정밀 정착 (Tightness &amp;amp; Orientation 튜닝)&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIDxAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;알고리즘이 물체 주변에 대략적으로 친 박스의 크기, 위치, 방향을 센티미터(cm) 단위로 미세 조정합니다.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIERAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;Tightness 검증:&lt;/b&gt; 3D 박스가 차량이나 보행자의 실제 라이다 점(Point)들에 딱 맞게 밀착되었는지 확인합니다. 박스가 너무 크면 가상의 공간을 물체로 인식하고, 너무 작으면 충돌 위험이 생깁니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIERAD&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Heading(방향) 수정:&lt;/b&gt; 차량이 진행하는 앞방향(Yaw 각도)이 맞는지 검증합니다. 라이다 데이터만으로는 차의 앞뒤 구분이 어려울 때가 많으므로, 동기화된 &lt;b&gt;카메라 이미지(Camera-LiDAR Fusion View)&lt;/b&gt;를 교차 확인하며 차량의 정확한 헤딩을 맞춥니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 36px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2. 시간 연속성 검증 (Temporal Consistency &amp;amp; Tracking Check)&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIExAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;시퀀스(동영상처럼 이어지는 프레임) 데이터에서 물체의 움직임이 자연스러운지 확인합니다.&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIFBAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;프레임 간 튀는 현상(Jittering) 제거:&lt;/b&gt; 1번 프레임과 2번 프레임 사이에서 차의 크기가 갑자기 바뀌거나, 위치가 순간 이동하듯 튀는 현상을 잡습니다. 보간(Interpolation) 알고리즘을 적용한 후, 사람이 수동으로 매끄럽게 다듬습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIFBAD&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;ID Switching 오류 수정:&lt;/b&gt; 추적 중이던 A 차량이 반대편 차량에 가려졌다가 다시 나타났을 때, 오토 라벨러가 이를 새로운 B 차량으로 인식하는 오류(ID 스위칭)를 잡아내어 하나의 고유 ID로 묶어줍니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 36px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3. 클래스 오분류 수정 (Classification QA)&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIFxAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;라이다 점군 데이터의 형태만 보고 알고리즘이 물체의 종류를 잘못 판단한 것을 바로잡습니다.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIGRAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;유사 형태 구분:&lt;/b&gt; 예를 들어 길가에 서 있는 '전신주'나 '가로수'를 '보행자'로 오인했거나, '대형 SUV'를 '트럭'으로 분류한 경우를 찾아내어 올바른 레이블(Label)로 수정합니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 36px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;4. 고스트 현상 및 노이즈 제거 (Noise &amp;amp; Ghost Points Filtering)&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIHhAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;환경 요인으로 인해 발생한 불필요한 라이다 점들을 정답 데이터에서 제외합니다.&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIIRAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;환경 노이즈 제거:&lt;/b&gt; 비, 눈, 안개, 또는 차량 배기가스로 인해 공중에 찍힌 가상의 점(Ghost points)들이 오토 라벨러에 의해 장애물로 오인되어 박스가 쳐진 경우, 이를 과감히 삭제합니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIIRAF&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;바닥면(Ground) 오인 수정:&lt;/b&gt; 도로의 연석(Curb)이나 과속방지턱, 경사로의 꺾이는 부분을 장애물 박스로 잘못 지정한 것을 해제합니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 36px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;5. 엣지 케이스 및 유실 데이터 수동 복구 (Edge Case &amp;amp; Missing Object Recovery)&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIJRAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;알고리즘이 완전히 놓친 물체를 사람이 직접 찾아내어 채워 넣습니다.&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIKBAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;원거리/희소 데이터(Sparse Points) 복구:&lt;/b&gt; 차량에서 50m~100m 이상 떨어진 물체는 라이다 점이 몇 개 찍히지 않아 오토 라벨러가 감지하지 못합니다. 검증 단계에서는 카메라 뷰와 대조하며 점이 2~3개뿐이더라도 명확한 장애물이라면 수동으로 3D Box를 생성해 줍니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sae=&quot;&quot; data-hveid=&quot;CAAIKBAF&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;비정형 객체 레이블링:&lt;/b&gt; 휠체어, 유모차, 킥보드를 탄 사람, 도로 위 낙하물 등 빈도가 낮은 엣지 케이스를 정확히 정의해 줍니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 36px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;||[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 36px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; ️ 검증 단계에서의 엔지니어링 워크플로우&lt;/span&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAAILhAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;보통 대량의 데이터는 CVAT, PCAT, Supervisely 같은 전문 3D 포인트 클라우드 어노테이션 툴을 사용하여 아래 이미지와 같은 멀티뷰 화면을 보며 검증합니다.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 24px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAILxAA&quot; data-sfc-cb=&quot;&quot; data-wiz-uids=&quot;YETrGf_5o,YETrGf_5n&quot; data-sfc-root=&quot;c&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 1px solid rgb(240, 242, 245);&quot; data-sae=&quot;&quot; data-animation-atomic=&quot;&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot;&gt;
&lt;pre class=&quot;vhdl&quot; data-copy-service-computed-style=&quot;font-family: monospace; font-size: 14px; font-weight: 400; margin: 14px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot;&gt;&lt;code&gt;┌────────────────────────────────────────────────────────┐
│ [Top-Down / Bird's Eye View]   [Front / Side 3D View]   │
│ ㆍ ㆍ ㆍ┌───────┐ㆍ ㆍ ㆍ       ㆍ ㆍ ㆍ ㆍ ㆍ ㆍ ㆍ ㆍ  │
│ ㆍ ㆍ ㆍ│     │ㆍ ㆍ ㆍ       ㆍ ㆍ  ◢███◣ ㆍ ㆍ ㆍ ㆍ  │
│ ㆍ ㆍ ㆍ└───────┘ㆍ ㆍ ㆍ       ㆍ ㆍ  ◥███◤ ㆍ ㆍ ㆍ ㆍ  │
├────────────────────────────────────────────────────────┤
│ [Synchronized Camera Image View]                       │
│ ┌──────────────────────────────────────────────────┐   │
│ │  [   Detected Car ]                             │   │
│ └──────────────────────────────────────────────────┘   │
└────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIMRAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;자동 검증 스크립트 실행:&lt;/b&gt; 3D Box 간의 충돌(갑자기 두 박스가 겹침), 물리적으로 불가능한 속도 변화 등을 파이썬 스크립트로 1차 필터링합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIMRAB&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;시각적 교차 검증 (Cross-Validation):&lt;/b&gt; 엔지니어가 &lt;b&gt;탑다운 뷰(Bird's Eye View)&lt;/b&gt;, &lt;b&gt;3D 측면 뷰&lt;/b&gt;, &lt;b&gt;카메라 투영 뷰&lt;/b&gt;를 동시에 보면서 오토 라벨링된 박스의 경계면을 마우스로 잡고 정밀하게 맞춥니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIMRAC&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;최종 메타데이터 검수:&lt;/b&gt; 수정을 마치면 객체의 가려짐 정도(Occlusion), 잘림 정도(Truncation) 같은 메타데이터 속성 값이 올바르게 산출되었는지 확인하고 데이터셋 빌드에 포함시킵니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&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-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 36px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-root=&quot;c&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; ️ 검증 엔지니어가 알아야 할 핵심 소프트웨어 조작법&lt;/span&gt;&lt;/h3&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAAIDRAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;영상을 보시면 소프트웨어 인터페이스가 크게 세 가지 화면(Multi-View)으로 쪼개져 유기적으로 움직이는 것을 볼 수 있습니다.&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1. 3D 단축키를 이용한 Bounding Box 6-DoF 미세 조정&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIDxAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;작업:&lt;/b&gt; AI가 생성한 박스를 클릭하면 X, Y, Z축 이동축과 회전축(Yaw 기즈모)이 활성화됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIDxAB&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;조작:&lt;/b&gt; 마우스 드래그나 키보드 방향키(W, A, S, D 등)를 이용해 박스의 크기를 물체 겉면에 딱 맞추고, 차량의 헤딩(방향) 화살표를 주행 방향으로 회전시킵니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2. 탑다운 뷰(BEV, Bird's Eye View) 중심의 검수&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIERAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;작업:&lt;/b&gt; 라이다 데이터는 평면에서 볼 때 물체의 경계면이 가장 명확합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIERAB&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;조작:&lt;/b&gt; 마우스 휠로 BEV 화면을 확대/축소하면서 차량의 정면 점군과 후면 점군이 3D 큐보이드(Cuboid) 벽면에 일치하는지 스캔합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3. 카메라 투영(Camera Projection)을 통한 시각적 교차 검증&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIExAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;작업:&lt;/b&gt; 라이다 점만으로는 이 물체가 세단인지, SUV인지, 혹은 표지판 기둥인지 구분이 안 될 때가 많습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIExAB&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;조작:&lt;/b&gt; 소프트웨어 한쪽에 연동된 카메라 이미지를 보며 마우스로 라이다 박스를 변경하면, 카메라 이미지 위 2D 박스도 실시간으로 연동되어 움직입니다. 이를 통해 물체의 클래스(Class)가 맞는지 텍스트나 형상을 보고 최종 확정합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;4. 시퀀스 트래킹 및 보간(Interpolation) 연산&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIFRAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;작업:&lt;/b&gt; 100프레임 동안 움직이는 차량을 프레임마다 일일이 검수하는 것은 불가능합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIFRAB&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;조작:&lt;/b&gt; 핵심 프레임(Keyframe)인 1번 프레임과 10번 프레임의 박스만 엔지니어가 검증해 주면, 소프트웨어가 그 사이(2~9번 프레임) 차량의 궤적을 선형 보간 알고리즘으로 자동 계산하여 채워 넣습니다. 검수자는 프레임을 Space 바로 재생하며 튀는 구간만 멈춰서 수정합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 36px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;||[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 36px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;  3D 라이다 어노테이션 툴 영상 주소&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1. CVAT (Computer Vision Annotation Tool) [&lt;a href=&quot;https://www.youtube.com/channel/UCV3qghS05GjAI714ID97IuA&quot;&gt;1&lt;/a&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAICRAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;인텔에서 개발한 전 세계에서 가장 유명한 오픈소스 이미지/3D 데이터 라벨링 툴입니다. 실제 프로그램 인터페이스(메인 3D 뷰, 탑/사이드/프론트 뷰, 카메라 연동 화면)를 다루는 정석적인 방법을 확인할 수 있습니다.&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIDBAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;실제 조작법 및 기능 소개 영상:&lt;/b&gt; &lt;a href=&quot;https://www.youtube.com/watch?v=xLtolcT-nRM&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 500; margin: 0px; text-decoration: underline 1px solid rgb(21, 88, 214); border-bottom: 0px none rgb(21, 88, 214);&quot; data-hveid=&quot;CAAIDBAB&quot;&gt;CVAT 공식 3D 포인트 클라우드 가이드 (YouTube)&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIDBAC&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;텍스트 매뉴얼 및 단축키 안내:&lt;/b&gt; &lt;a href=&quot;https://www.cvat.ai/resources/blog/3d-point-cloud-annotation&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 500; margin: 0px; text-decoration: underline 1px solid rgb(21, 88, 214); border-bottom: 0px none rgb(21, 88, 214);&quot; data-hveid=&quot;CAAIDBAD&quot;&gt;CVAT 공식 블로그 가이드&lt;/a&gt; [&lt;a href=&quot;https://www.youtube.com/watch?v=xLtolcT-nRM&quot;&gt;1&lt;/a&gt;, &lt;a href=&quot;https://www.cvat.ai/resources/blog/3d-point-cloud-annotation&quot;&gt;2&lt;/a&gt;, &lt;a href=&quot;https://www.youtube.com/playlist?list=PL0to7Ng4Puua37NJVMIShl_pzqJTigFzg&quot;&gt;3&lt;/a&gt;]&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2. BasicAI&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIEBAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;자율주행용 센서 퓨전(라이다 + 카메라) 및 AI 기반 오토 라벨링 기능이 잘 구현되어 있는 대표적인 클라우드 기반 플랫폼입니다. [&lt;a href=&quot;https://www.youtube.com/playlist?list=PL-XnYBjgrYPWJ1sWTmASoVycidf_RR8oK&quot;&gt;1&lt;/a&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIExAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;라이다-카메라 퓨전 데이터 어노테이션 영상:&lt;/b&gt; &lt;a href=&quot;https://www.youtube.com/watch?v=Wmo6JRw8Yfs&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 500; margin: 0px; text-decoration: underline 1px solid rgb(21, 88, 214); border-bottom: 0px none rgb(21, 88, 214);&quot; data-hveid=&quot;CAAIExAB&quot;&gt;BasicAI 공식 튜토리얼 (YouTube)&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIExAC&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;상세 인터페이스 및 데이터 업로드 문서:&lt;/b&gt; &lt;a href=&quot;https://docs.basic.ai/docs/lidar-fusion-tool&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 500; margin: 0px; text-decoration: underline 1px solid rgb(21, 88, 214); border-bottom: 0px none rgb(21, 88, 214);&quot; data-hveid=&quot;CAAIExAD&quot;&gt;BasicAI 기술 문서&lt;/a&gt; [&lt;a href=&quot;https://www.youtube.com/watch?v=Wmo6JRw8Yfs&quot;&gt;1&lt;/a&gt;, &lt;a href=&quot;https://docs.basic.ai/docs/lidar-fusion-tool&quot;&gt;2&lt;/a&gt;, &lt;a href=&quot;https://www.youtube.com/@basicai&quot;&gt;3&lt;/a&gt;]&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3. Encord (플랫폼 참고용)&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIFxAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;실무에서 대규모 3D 포인트 클라우드 시퀀스를 다룰 때 유용한 상용 플랫폼 튜토리얼입니다. &lt;a href=&quot;https://www.youtube.com/watch?v=JdyRYRx32Kw&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 500; margin: 0px; text-decoration: underline 1px solid rgb(21, 88, 214); border-bottom: 0px none rgb(21, 88, 214);&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAAIFxAB&quot;&gt;Fit cuboid to points&lt;/a&gt;(점군에 박스 밀착시키기)나 보간(Interpolation) 연산 조작법이 직관적으로 나와 있습니다.&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIGRAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;3D Precision 라이다 가이드 영상:&lt;/b&gt; Encord 라이다 어노테이션 튜토리얼 (YouTube) [&lt;a href=&quot;https://www.youtube.com/watch?v=JdyRYRx32Kw&quot;&gt;1&lt;/a&gt;]&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 36px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;||[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 36px 0px 12px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;  영상에서 눈여겨보셔야 할 핵심 인터페이스 특징&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIHBAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;영상을 재생해 보시면 소프트웨어 내부가 다음과 같이 구성되어 엔지니어가 조작하게 됩니다.&lt;/span&gt;&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIHRAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;3D 자유 시점(Free Camera) 화면:&lt;/b&gt; 마우스 좌클릭(앵글 회전), 우클릭(카메라 축 이동)을 이용해 전체적인 점군 상태를 파악합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIHRAD&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;3단 정사영 뷰(Top, Side, Front View):&lt;/b&gt; AI가 생성한 3D 박스를 위, 옆, 앞에서 직각으로 보며 물체 표면에 &lt;b&gt;박스를 cm 단위로 밀착(Tightness)&lt;/b&gt; 시킬 때 마우스 드래그로 조작합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 8px; text-decoration: none solid rgb(10, 10, 10); border-bottom: 0px none rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIHRAG&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;카메라 뷰 연동:&lt;/b&gt; 라이다 점 위를 클릭하면 오른쪽에 동기화된 카메라 이미지가 나타나, 해당 물체가 차량인지 오토바이인지 &lt;b&gt;시각적으로 교차 검증&lt;/b&gt;합니다. [&lt;a href=&quot;https://www.youtube.com/watch?v=RExcOUynXGA&quot;&gt;1&lt;/a&gt;]&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1319&quot; data-origin-height=&quot;661&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnpn0Z/dJMcaiXWo0x/TPVtbBxbO10NgN4wqqeM3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnpn0Z/dJMcaiXWo0x/TPVtbBxbO10NgN4wqqeM3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnpn0Z/dJMcaiXWo0x/TPVtbBxbO10NgN4wqqeM3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbnpn0Z%2FdJMcaiXWo0x%2FTPVtbBxbO10NgN4wqqeM3k%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;1319&quot; height=&quot;661&quot; data-origin-width=&quot;1319&quot; data-origin-height=&quot;661&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>호기심</category>
      <category>LIDAR</category>
      <category>로봇</category>
      <category>자율주행</category>
      <author>sailorCat</author>
      <guid isPermaLink="true">https://lsann38.tistory.com/359</guid>
      <comments>https://lsann38.tistory.com/359#entry359comment</comments>
      <pubDate>Wed, 17 Jun 2026 03:17:58 +0900</pubDate>
    </item>
    <item>
      <title>nelsknits 모헤어 보트 넥 탑 free pattern, 'mohair' boat neck top/off the shoulder top 무료도안 뜨개 몸에 맞게 뜨는 방법</title>
      <link>https://lsann38.tistory.com/358</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=BPxwZlQ-G2Y&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=BPxwZlQ-G2Y&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=BPxwZlQ-G2Y&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/TyQwq/dJMb9g5crxG/LqZA88yBkgLXHmaK62Tlik/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;KNITTING TUTORIAL | &quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/BPxwZlQ-G2Y&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://www.instagram.com/nelsknits/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.instagram.com/nelsknits/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;82-7.PNG&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3ZCfv/dJMcai3XR4D/KGhGqJJuEJP7r0DiSNkPSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3ZCfv/dJMcai3XR4D/KGhGqJJuEJP7r0DiSNkPSk/img.png&quot; data-alt=&quot;긴 팔&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3ZCfv/dJMcai3XR4D/KGhGqJJuEJP7r0DiSNkPSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3ZCfv%2FdJMcai3XR4D%2FKGhGqJJuEJP7r0DiSNkPSk%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;1000&quot; height=&quot;676&quot; data-filename=&quot;82-7.PNG&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;676&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;긴 팔&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;82-8.PNG&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;589&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/umfL7/dJMcaiQrU5H/dmpSNOJcnX2oRocXLbkDD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/umfL7/dJMcaiQrU5H/dmpSNOJcnX2oRocXLbkDD1/img.png&quot; data-alt=&quot;오프숄더&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/umfL7/dJMcaiQrU5H/dmpSNOJcnX2oRocXLbkDD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FumfL7%2FdJMcaiQrU5H%2FdmpSNOJcnX2oRocXLbkDD1%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;753&quot; height=&quot;589&quot; data-filename=&quot;82-8.PNG&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;589&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;오프숄더&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;nelsknits 뜨개 작가의 인스타그램과 무료 도안 튜토리얼 유튜브 영상&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;오프숄더로 입을 수도 있고, 마지막 부분에 소매를 추가하면 반팔이나 긴팔로도 입을 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;너무 귀여운 디자인이다&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;신축성이 있고 얇은 모헤어로 만들기 때문에 간절기에 아우터와 입어도 되고 여름에 에어컨을 튼 실내에서도 입을 수 있을 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;초보자 용으로 적합한 뜨개이지만 주의할 점이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;두 세 가지 정도 버전을 뜨면서 알게 된 팁&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;- 밝은 컬러의 모헤어를 사용할 때, 도안에서 늘림을 한 부분이 여기저기 흩어져 있어 완성하고 지저분해 보일 수 있기 때문에 양 끝에서만 늘림과 줄임을 하는 것을 추천&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;82.PNG&quot; data-origin-width=&quot;961&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x4DfS/dJMcaiCV7E6/8qpzLpK2pkYtBiH0jjHNXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x4DfS/dJMcaiCV7E6/8qpzLpK2pkYtBiH0jjHNXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x4DfS/dJMcaiCV7E6/8qpzLpK2pkYtBiH0jjHNXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx4DfS%2FdJMcaiCV7E6%2F8qpzLpK2pkYtBiH0jjHNXk%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;961&quot; height=&quot;672&quot; data-filename=&quot;82.PNG&quot; data-origin-width=&quot;961&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;kfb 부분이 늘림인데 어두운 실로 뜨개를 하면 상관없지만 밝은 색 실은 여기저기서 늘림한 부분이 보이기 때문에 &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그냥 양 끝에 마커를 달아두고 every round 4번의 늘림을 하면 균일하게 늘어난다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이런식으로 12*4 + 82 = 130&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;작가의 계산대로 하면 132가 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;자신의 사이즈보다 작다면 라운드를 추가해서 더 진행해도 될 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;343&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcbMes/dJMb9965mKi/WQdlS1fViUjFDSnkVdyGq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcbMes/dJMb9965mKi/WQdlS1fViUjFDSnkVdyGq1/img.png&quot; data-alt=&quot;어깨 부분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcbMes/dJMb9965mKi/WQdlS1fViUjFDSnkVdyGq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcbMes%2FdJMb9965mKi%2FWQdlS1fViUjFDSnkVdyGq1%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;759&quot; height=&quot;343&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;343&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;어깨 부분&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;탑다운이기 때문에 소매 분리부분이 나타난다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;좌우대칭이기 때문에 내 팔 사이즈와 몸통 사이즈를 재서 나눌 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;양 끝에 마크를 해놨다면 분리하기 더 쉬울 것 같다.&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;82-1.PNG&quot; data-origin-width=&quot;1318&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C44qT/dJMcadhk8z1/TUbmA3lKG8K8yn3uZY39Gk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C44qT/dJMcadhk8z1/TUbmA3lKG8K8yn3uZY39Gk/img.png&quot; data-alt=&quot;소매분리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C44qT/dJMcadhk8z1/TUbmA3lKG8K8yn3uZY39Gk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC44qT%2FdJMcadhk8z1%2FTUbmA3lKG8K8yn3uZY39Gk%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;1318&quot; height=&quot;720&quot; data-filename=&quot;82-1.PNG&quot; data-origin-width=&quot;1318&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;소매분리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이후 몸통부분을 가슴 가장 윗부분까지 진행한다.&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;82-2.PNG&quot; data-origin-width=&quot;1288&quot; data-origin-height=&quot;706&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQ3JDi/dJMcadavVIq/OC7mzsyROXdFRjhk3oI2c0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQ3JDi/dJMcadavVIq/OC7mzsyROXdFRjhk3oI2c0/img.png&quot; data-alt=&quot;몸통-가슴까지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQ3JDi/dJMcadavVIq/OC7mzsyROXdFRjhk3oI2c0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQ3JDi%2FdJMcadavVIq%2FOC7mzsyROXdFRjhk3oI2c0%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;1288&quot; height=&quot;706&quot; data-filename=&quot;82-2.PNG&quot; data-origin-width=&quot;1288&quot; data-origin-height=&quot;706&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;몸통-가슴까지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그 다음부터는 줄임이 시작된다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;두 개의 코를 잡고 한번에 뜨는 방식 k2tog로 19번의 줄임을 하는 것으로 되어 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;하지만 영상처럼 하면 밝은 실에서는 줄임을 한 부분이 여기저기 퍼져 있는게 보인다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;가슴부터 허리선이 밀착되는 핏이기 때문에 감소시켜야 하는데 이것도 양 끝에서만 진행하는 것을 추천한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; 총 27 라운드이기 때문에 3번째 라운드마다 양 끝에서 줄임을 하면 균일하게 18번의 줄임을 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;82-3.PNG&quot; data-origin-width=&quot;1288&quot; data-origin-height=&quot;704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rPen6/dJMcaaLHmUn/ykWZk4RcN6ogwgkXEzyzo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rPen6/dJMcaaLHmUn/ykWZk4RcN6ogwgkXEzyzo1/img.png&quot; data-alt=&quot;몸통-가슴 밑부분까지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rPen6/dJMcaaLHmUn/ykWZk4RcN6ogwgkXEzyzo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrPen6%2FdJMcaaLHmUn%2FykWZk4RcN6ogwgkXEzyzo1%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;1288&quot; height=&quot;704&quot; data-filename=&quot;82-3.PNG&quot; data-origin-width=&quot;1288&quot; data-origin-height=&quot;704&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;몸통-가슴 밑부분까지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBUtOd/dJMcabjyIwt/OMZXvF3xek2Ygx1oApUxSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBUtOd/dJMcabjyIwt/OMZXvF3xek2Ygx1oApUxSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBUtOd/dJMcabjyIwt/OMZXvF3xek2Ygx1oApUxSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBUtOd%2FdJMcabjyIwt%2FOMZXvF3xek2Ygx1oApUxSk%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;753&quot; height=&quot;346&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;346&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;가슴이 큰 편이라면 대각선으로 줄임이 생길 수 있으니 마커 위치를 등쪽으로 위치시키는 게 좋다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;마커를 위치하고, 등쪽이 아닌 가슴쪽으로 줄임을 진행하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;가슴 밑부분까지 줄임을 끝내면 5cm 허리 부분이 나올때까지 무한 겉뜨기 해주면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이후에 허리선 부분은 핏을 만들고 싶다면 아래의 추가 줄임을 진행하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;82-4.PNG&quot; data-origin-width=&quot;1263&quot; data-origin-height=&quot;678&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mkZcQ/dJMcahYlilH/67ovmGV3rkZ9Vc4lTw9nI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mkZcQ/dJMcahYlilH/67ovmGV3rkZ9Vc4lTw9nI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mkZcQ/dJMcahYlilH/67ovmGV3rkZ9Vc4lTw9nI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmkZcQ%2FdJMcahYlilH%2F67ovmGV3rkZ9Vc4lTw9nI1%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;1263&quot; height=&quot;678&quot; data-filename=&quot;82-4.PNG&quot; data-origin-width=&quot;1263&quot; data-origin-height=&quot;678&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;82-5.PNG&quot; data-origin-width=&quot;1149&quot; data-origin-height=&quot;647&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBKYYr/dJMcaiQrXXy/k5zbwFZ9GDzT52v1JUaX3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBKYYr/dJMcaiQrXXy/k5zbwFZ9GDzT52v1JUaX3k/img.png&quot; data-alt=&quot;허리선 추가 줄임&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBKYYr/dJMcaiQrXXy/k5zbwFZ9GDzT52v1JUaX3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBKYYr%2FdJMcaiQrXXy%2Fk5zbwFZ9GDzT52v1JUaX3k%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;1149&quot; height=&quot;647&quot; data-filename=&quot;82-5.PNG&quot; data-origin-width=&quot;1149&quot; data-origin-height=&quot;647&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;허리선 추가 줄임&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;82-6.PNG&quot; data-origin-width=&quot;1307&quot; data-origin-height=&quot;736&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lh9QC/dJMcaiQrXY0/yamx4Sko4JGTlkYPAOi4B1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lh9QC/dJMcaiQrXY0/yamx4Sko4JGTlkYPAOi4B1/img.png&quot; data-alt=&quot;cast off&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lh9QC/dJMcaiQrXY0/yamx4Sko4JGTlkYPAOi4B1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flh9QC%2FdJMcaiQrXY0%2Fyamx4Sko4JGTlkYPAOi4B1%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;1307&quot; height=&quot;736&quot; data-filename=&quot;82-6.PNG&quot; data-origin-width=&quot;1307&quot; data-origin-height=&quot;736&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;cast off&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;보통 스웨터 뜨기 할때는 작은 바늘로 바꿔서 진행하지만 이 니트탑은 매우 몸에 밀착되는 디자인이기 때문에 오히려 바늘을 더 큰 것으로 바꾸어 엘라스틱한 캐스트 오프 방법을 사용해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;영상을 보면서 함께 뜨니까 좋았다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;어두운 색 실을 쓰면 영상처럼만 하면 되니까 고민할 필요도 없었고 체형도 비슷해서 사이즈를 변형할 필요가 없었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Knitting</category>
      <category>knit</category>
      <category>knitting</category>
      <category>뜨개</category>
      <category>뜨개질</category>
      <category>무료도안</category>
      <category>취미</category>
      <author>sailorCat</author>
      <guid isPermaLink="true">https://lsann38.tistory.com/358</guid>
      <comments>https://lsann38.tistory.com/358#entry358comment</comments>
      <pubDate>Mon, 13 Apr 2026 17:53:08 +0900</pubDate>
    </item>
    <item>
      <title>Imperfect Beginnings</title>
      <link>https://lsann38.tistory.com/357</link>
      <description>&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;It wasn't polished.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The floors creaked like old memories,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;furniture leaned with stories,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;corners held stories in dust,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;and vacuum roared a trailing.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;But I felt it&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;like slipping into vintage clothes&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;someone else had worn,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;soft with memory, warm with time.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ashwood didin't welcome me with grandeur,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;but with softness,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;with chipped edges and quiet light.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;It was a beginning,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;not flawless,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;but mine.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다듬어지지 않은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바닥은 오랜 기억으로 삐걱이고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사연 있는 가구는 기운,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오래된 이야기를 담은 먼지 쌓인 코너들과,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;굉음을 내는 청소기가 있는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼에도&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;남이 입었던 옷 속으로&lt;/p&gt;
&lt;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;화려하게 반겨주지 않았다.&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;시작,&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;/div&gt;
&lt;/div&gt;</description>
      <category>문학</category>
      <author>sailorCat</author>
      <guid isPermaLink="true">https://lsann38.tistory.com/357</guid>
      <comments>https://lsann38.tistory.com/357#entry357comment</comments>
      <pubDate>Fri, 17 Oct 2025 05:14:29 +0900</pubDate>
    </item>
    <item>
      <title>From 888 to Ashwood</title>
      <link>https://lsann38.tistory.com/356</link>
      <description>&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;I stepped out of the loop of 888&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;and planted a forest on ashes.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ashwood,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a place where flow and roots exist.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;repetition has ceased,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a new world&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;begun within me.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 888의 고리를 벗어나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잿더미 위에 숲을 심었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애쉬우드,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흐름과 뿌리가 존재하는 곳&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복은 멈췄고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 세계는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내 안에서 시작되었다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>문학</category>
      <author>sailorCat</author>
      <guid isPermaLink="true">https://lsann38.tistory.com/356</guid>
      <comments>https://lsann38.tistory.com/356#entry356comment</comments>
      <pubDate>Fri, 17 Oct 2025 04:54:56 +0900</pubDate>
    </item>
    <item>
      <title>사용자 시나리오를 통한 워크플로우 파이프라인 User Scenario workflow</title>
      <link>https://lsann38.tistory.com/349</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;사용자 시나리오&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;치수를 알고 싶은 물체 사진을 업로드 하고 한쪽 면에 대해 사이즈를 입력하면 전체 비율을 계산해서 정확한 치수를 높이, 너비, 길이, 지름 등등을 알려준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 반드시 하나의 치수를 입력해야 하고, 어떤 곳의 치수를 입력할 지는 고를 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업로드한 사진의 물체를 분석해서 길이를 잴 수 있는 곳을 형광색 선으로 표시해서 선택할 수 있게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 그 중 하나를 클릭해서 치수를 입력하면 상대적 비율을 계산해서 전체 치수를 알려준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사진을 처음에 업로드 할 때 전체 치수의 상대비율을 알 수 없으면 다시 사진 업로드를 받는다.&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. Front-end Flow (User Scenario)&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Image Upload&lt;/b&gt; &amp;bull; User drops or selects a photo of the object.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Auto-segmentation &amp;amp; Edge Proposal&lt;/b&gt; &amp;bull; System segments out the object silhouette and runs line/edge detection (e.g. Canny + Hough) to find all candidate &amp;ldquo;measurable&amp;rdquo; segments. &amp;bull; Highlight each candidate in translucent neon (e.g. fluorescent green).&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;User Picks One Reference Edge&lt;/b&gt; &amp;bull; User clicks the edge they actually measured with a ruler/caliper. &amp;bull; An inline form pops up asking: &amp;ldquo;Enter the real-world length of this segment (e.g. 85 mm)&amp;rdquo;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Scale Calibration&lt;/b&gt; &amp;bull; Compute mm_per_pixel = user_length / pixel_length(ref_edge).&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Dimension Extraction&lt;/b&gt; &amp;bull; Compute 2D bounding‐box or &lt;b&gt;oriented&lt;/b&gt; bounding box on the mask &amp;rArr; gives you pixel extents along its two principal axes. &amp;bull; Multiply by mm_per_pixel &amp;rArr; returns two real‐world dims (e.g. width and height of that face). &amp;bull; &lt;b&gt;Shape‐specific extras&lt;/b&gt;: &amp;ndash; Rectangular box &amp;rArr; # of faces = 3; we only got 2 from this view &amp;rArr; need second view or second measurement to resolve depth. &amp;ndash; Cylinder &amp;rArr; silhouette minor axis = diameter (can compute directly).&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Check Completeness&lt;/b&gt; &amp;bull; If all requested dims (width, height, depth, diameter&amp;hellip;) are resolvable from this view + known shape &amp;rArr; display them. &amp;bull; Otherwise prompt: &amp;ldquo;We still need a measurement of the 3rd axis (depth/length). Please upload a second photo showing that axis, or pick a different reference edge from your current photo.&amp;rdquo;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Final Report&lt;/b&gt; &amp;bull; Show a table: {width: xx mm, height: yy mm, depth: zz mm, diameter: dd mm} &amp;bull; Overlay result on the image/mesh for visual confirmation.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Back-end Pipeline&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;text&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;┌──────────────────┐
│ 1. Pre-processing│
├──────────────────┤
│ &amp;bull; Resize / normalize image              │
│ &amp;bull; Mask R-CNN / U^2-Net &amp;rArr; object mask    │
│ &amp;bull; Perspective correction (vanishing-pt) │
│ &amp;bull; Canny &amp;rarr; HoughLines &amp;rarr; cluster by &amp;theta;     │
│   &amp;rarr; candidate edges                     │
└──────────────────┘
           &amp;darr;
┌──────────────────┐
│ 2. Edge Proposal │
├──────────────────┤
│ &amp;bull; Filter for longest / most &amp;ldquo;bold&amp;rdquo;      │
│ &amp;bull; Store: (p1,p2,pixel_length,&amp;theta;,face_id) │
│ &amp;bull; Return segments to front-end UI       │
└──────────────────┘
           &amp;darr;
┌──────────────────┐
│ 3. User Input    │
├──────────────────┤
│ &amp;bull; ref_edge_id,   │
│ &amp;bull; real_length_mm │
└──────────────────┘
           &amp;darr;
┌──────────────────┐
│ 4. Scale Calib   │
├──────────────────┤
│ mm_per_px = real_length_mm / pixel_length(ref_edge) │
└──────────────────┘
           &amp;darr;
┌──────────────────┐
│ 5. Dim. Extract  │
├──────────────────┤
│ &amp;bull; Oriented BBox on mask &amp;rArr; (w_px, h_px) │
│ &amp;bull; w_mm = w_px * mm_per_px             │
│ &amp;bull; h_mm = h_px * mm_per_px             │
│                                      │
│ &amp;bull; If shape==&quot;cylinder&quot;:               │
│     diameter_mm = minor_axis_px * mm_per_px   │
└──────────────────┘
           &amp;darr;
┌──────────────────┐
│ 6. Completeness  │
├──────────────────┤
│ &amp;bull; If shape==&quot;box&quot; and we need depth:  │
│     depth unresolved &amp;rArr; request 2nd view  │
│ &amp;bull; Else compile final dims             │
└──────────────────┘
           &amp;darr;
┌──────────────────┐
│ 7. Render &amp;amp; Resp │
├──────────────────┤
│ &amp;bull; Return JSON {w_mm, h_mm, d_mm?, dia_mm?} │
│ &amp;bull; Front-end overlays results on image     │
└──────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Key Components &amp;amp; Why You Might Need a 2nd Photo&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;A &lt;b&gt;single orthographic&lt;/b&gt; (fronto-parallel) shot of a &lt;b&gt;box&lt;/b&gt; only gives you its two visible faces&amp;mdash;third axis (depth) is foreshortened.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;A &lt;b&gt;cylinder&lt;/b&gt; you can get height + diameter from one view.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Perspective correction&lt;/b&gt; can help flatten but you still can&amp;rsquo;t conjure the hidden axis without another angle or a second measurement.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;When you flip that &amp;ldquo;depth&amp;rdquo; flag&lt;/b&gt;, your UI should automatically re-prompt: &amp;ldquo;Depth not measured yet&amp;mdash;please either measure a second edge on this photo OR upload a new image showing the object from the side.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Next Steps&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;Prototype the &lt;b&gt;edge-detection + UI overlay&lt;/b&gt; so users can click on any proposed line.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Wire up the &lt;b&gt;scale calibration&lt;/b&gt; and &lt;b&gt;oriented-bbox measurement&lt;/b&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Build the &amp;ldquo;need second view&amp;rdquo; logic&amp;mdash;simple flag in your dimension‐output step.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Polish UX:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;show dynamic &amp;ldquo;mm_per_px&amp;rdquo; as they type&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;allow switching reference edge if measure was imprecise&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;cache previous uploads so second‐view is seamless&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;여기서 이미 메타데이터에 존재하는 오브젝트는 치수를 재고 비율을 계산하는 걸 거칠 필요 없이 바로 치수를 알려줄 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;Object Recognition &amp;amp; Retrieval &amp;bull; 사용자 업로드 이미지를 CNN(또는 이미지 임베딩 + FAISS) 기반으로 인덱스된 데이터셋에 매칭 &amp;bull; 예: &amp;ldquo;mug_001&amp;rdquo; &amp;rarr; YCB 세트의 머그컵, &amp;ldquo;tube_30x50&amp;rdquo; &amp;rarr; 30&amp;times;50&amp;thinsp;mm 사각 튜브 등 &amp;bull; 매칭 신뢰도(confidence) 체크(예: &amp;gt; 0.9면 자동 처리)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Scale Check (선택) &amp;bull; 데이터셋 이미지는 보정된 픽셀&amp;rarr;mm 정보를 갖고 있으므로, 보통 생략 가능 &amp;bull; 다만 실제 촬영 환경마다 해상도가 달라지므로, 필요하면 사용자에게 한 축 길이(예: 머그 컵 높이)를 입력받아 배율을 재보정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Dimension Lookup &amp;bull; 매칭된 객체의 JSON/CSV 메타데이터에서 width/depth/height, 지름(diameter) 등 필요한 모든 치수 항목을 읽어옴 &amp;bull; 예: { width:85, depth:80, height:95 }&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;사용자 피드백 &amp;bull; &amp;ldquo;이 물체가 mug_001(머그컵)이 맞습니까? &amp;rarr; 예/아니오&amp;rdquo; &amp;bull; 아니오 선택 시, 일반 에지 기반 측정 플로우로 폴백(fallback)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;최종 결과 리턴 &amp;bull; 바로 { width: 85&amp;thinsp;mm, depth: 80&amp;thinsp;mm, height: 95&amp;thinsp;mm } 형태로 UI에 표시 &amp;bull; 이미지 위에 주요 축에 해당하는 치수를 오버레이&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;딥러닝 기반 Depth 보조&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;MiDaS, DPT 같은 단일 이미지 Depth 추정 네트워크를 얹고, 스케일 보정을 위해 사용자가 입력한 참조 길이(혹은 ArUco 마커)로 전체 깊이 맵을 Real-World 스케일로 변환&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;그렇게 얻은 3D 포인트클라우드를 통해 눈에 보이지 않는 면의 깊이도 어느 정도 예측 가능&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;물체 카테고리별 Shape Prior 활용&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;컵, 책상, 의자 등 범용 카테고리별로 &amp;ldquo;기본 형태(프리미티브, CAD 템플릿)&amp;rdquo;를 미리 정의&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;사진 위 실루엣이나 엣지에 프리미티브를 매칭(fitting)해서 스케일과 평행이동, 회전 파라미터를 최적화&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;이런 방식으로 보이지 않는 면까지 그 &amp;ldquo;템플릿&amp;rdquo;의 실제 치수를 불러올 수 있음&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Photometric Stereo / Shape-from-Shading&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;하나의 이미지라도 간단히 플래시 온&amp;middot;오프 두 장 정도만 찍으면, 조명 변화에 따른 밝기 차이로 물체 표면 노멀 벡터(곡률) 추정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;노멀 지도에서 기하학적 형태를 재구성해 엣지가 없는 곡면 물체(구, 실린더 등)의 치수를 예측&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;EXIF&amp;middot;메타데이터 활용&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;사진 EXIF에서 화각(FOV), 초점 거리, 센서 크기 정보를 꺼내면, 픽셀&amp;rarr;실제 거리 환산에 필요한 내부 파라미터 일부를 자동으로 유추 가능&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;사용자에게 &amp;ldquo;스마트폰 기종&amp;rdquo;이나 &amp;ldquo;초점 거리(mm)&amp;rdquo; 정도만 물어봐도 캘리브레이션 부담을 줄일 수 있음&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;사용자 인터랙션 강화&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&amp;ldquo;2점 클릭&amp;rdquo; 대신 &amp;ldquo;면 클릭 + 드래그&amp;rdquo; UI: 사용자가 대략적인 면(사각형/원)을 드래그하면, 그 영역 크기를 픽셀 단위로 알아서 측정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;측정 선분 후보를 자동으로 군집화(cluster) &amp;rarr; 대표성 높은 3~5개만 추려서 보여주기 &amp;rarr; 사용자가 선택&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;멀티 뷰 영상 보조&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;사진 한 장으론 충분치 않으니, 간단히 사용자에게 3초짜리 짧은 비디오(360&amp;deg; 회전) 촬영을 권유&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;SLAM(ORB-SLAM 등)으로 카메라 트랙 추정 &amp;rarr; 비디오 프레임에서 물체 지점들까지의 거리 정보로 정확한 3D 포인트 클라우드 재구성&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;문맥&amp;middot;사전 지식 연계&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;물체에 찍힌 브랜드 로고나 텍스트를 OCR로 읽고, 해당 모델명&amp;middot;스펙 정보를 크롤링해서 치수를 메타데이터로 바로 매핑&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;예: &amp;ldquo;IKEA&amp;rdquo; 로고 &amp;rarr; &amp;ldquo;IKEA PO&amp;Auml;NG&amp;rdquo; &amp;rarr; 웹에서 사이즈 스펙 자동 조회&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;품질 평가 &amp;amp; 재촬영 권유&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;자동으로 &amp;ldquo;측정 신뢰도&amp;rdquo;(photometric condition, 엣지 밀도, 원근 왜곡량 등)를 계산해, 특정 임계치 이하일 땐 &amp;ldquo;다시 찍어주세요&amp;rdquo; 안내&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;촬영 가이드 오버레이(화면 구석에 마커 붙이기, 일정 거리 유지하기) 제공&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;모바일 SDK/ARKit 연동&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;iOS ARKit, Android ARCore Measure API를 백엔드로 호출해서, 단순한 물체 치수 측정은 기기 내장 기능으로 처리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;앱 내에서 &amp;ldquo;더 정밀한 측정이 필요하면 서버 파이프라인&amp;rdquo;으로 폴백&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;최종 설정 자동화 파라미터&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;파이프라인마다 중요한 파라미터(e.g. Canny threshold, Hough minimum line length)들을 AutoML로 튜닝하거나, 사용자 기종&amp;middot;환경별 프리셋 제공&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 실현 속도가 빠른 건 EXIF 활용 + ArUco 마커 스케일, &amp;bull; 정확도를 더 끌어올리고 싶다면 Shape Prior + Depth Estimation, &amp;bull; 사용자 경험을 챙기려면 모바일 ARKit/ARCore 연동과 품질 피드백 기능&lt;/p&gt;</description>
      <category>포트폴리오 Portfolio/AI Project</category>
      <category>AI</category>
      <category>PROJECT</category>
      <author>sailorCat</author>
      <guid isPermaLink="true">https://lsann38.tistory.com/349</guid>
      <comments>https://lsann38.tistory.com/349#entry349comment</comments>
      <pubDate>Mon, 23 Jun 2025 21:35:58 +0900</pubDate>
    </item>
    <item>
      <title>사진</title>
      <link>https://lsann38.tistory.com/354</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKnSab/btsOKBLMsy5/cKItCsTVCoZ2KYLKbaZAM1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKnSab/btsOKBLMsy5/cKItCsTVCoZ2KYLKbaZAM1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKnSab/btsOKBLMsy5/cKItCsTVCoZ2KYLKbaZAM1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKnSab%2FbtsOKBLMsy5%2FcKItCsTVCoZ2KYLKbaZAM1%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ze9Y7/btsOL6Rdydr/alSniJam0OCWx8gehskaa0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ze9Y7/btsOL6Rdydr/alSniJam0OCWx8gehskaa0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ze9Y7/btsOL6Rdydr/alSniJam0OCWx8gehskaa0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZe9Y7%2FbtsOL6Rdydr%2FalSniJam0OCWx8gehskaa0%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqPN3T/btsOLv430h2/WyJKHL2mT0sWoRqp8I5Bp0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqPN3T/btsOLv430h2/WyJKHL2mT0sWoRqp8I5Bp0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqPN3T/btsOLv430h2/WyJKHL2mT0sWoRqp8I5Bp0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqPN3T%2FbtsOLv430h2%2FWyJKHL2mT0sWoRqp8I5Bp0%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kxnCb/btsOM5D2KWJ/AKGoSHUzUZOqSjCK9DdsJk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kxnCb/btsOM5D2KWJ/AKGoSHUzUZOqSjCK9DdsJk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kxnCb/btsOM5D2KWJ/AKGoSHUzUZOqSjCK9DdsJk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkxnCb%2FbtsOM5D2KWJ%2FAKGoSHUzUZOqSjCK9DdsJk%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HvN2F/btsONdovbmD/1agkakzkNUocmtQUBztvSk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HvN2F/btsONdovbmD/1agkakzkNUocmtQUBztvSk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HvN2F/btsONdovbmD/1agkakzkNUocmtQUBztvSk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHvN2F%2FbtsONdovbmD%2F1agkakzkNUocmtQUBztvSk%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bP6n6A/btsOLtGdDPg/jzM06oZMq6If5U8dG0V660/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bP6n6A/btsOLtGdDPg/jzM06oZMq6If5U8dG0V660/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bP6n6A/btsOLtGdDPg/jzM06oZMq6If5U8dG0V660/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbP6n6A%2FbtsOLtGdDPg%2FjzM06oZMq6If5U8dG0V660%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KLwo3/btsOMkuTQX1/d5EBNSks4JEslKRqy7XJ6k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KLwo3/btsOMkuTQX1/d5EBNSks4JEslKRqy7XJ6k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KLwo3/btsOMkuTQX1/d5EBNSks4JEslKRqy7XJ6k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKLwo3%2FbtsOMkuTQX1%2Fd5EBNSks4JEslKRqy7XJ6k%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSbBWP/btsOLnFW4FF/8bo5rK4FKa41xOiFNNQtik/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSbBWP/btsOLnFW4FF/8bo5rK4FKa41xOiFNNQtik/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSbBWP/btsOLnFW4FF/8bo5rK4FKa41xOiFNNQtik/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSbBWP%2FbtsOLnFW4FF%2F8bo5rK4FKa41xOiFNNQtik%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2871&quot; data-origin-height=&quot;3828&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blxDcn/btsOMkIsw99/UQah2XxCY5Al9p2HKQTKyK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blxDcn/btsOMkIsw99/UQah2XxCY5Al9p2HKQTKyK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blxDcn/btsOMkIsw99/UQah2XxCY5Al9p2HKQTKyK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblxDcn%2FbtsOMkIsw99%2FUQah2XxCY5Al9p2HKQTKyK%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;2871&quot; height=&quot;3828&quot; data-origin-width=&quot;2871&quot; data-origin-height=&quot;3828&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2831&quot; data-origin-height=&quot;3775&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0lPC7/btsOLnsoNxD/STjKkOO4OxBq8IqZ9RxMR0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0lPC7/btsOLnsoNxD/STjKkOO4OxBq8IqZ9RxMR0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0lPC7/btsOLnsoNxD/STjKkOO4OxBq8IqZ9RxMR0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0lPC7%2FbtsOLnsoNxD%2FSTjKkOO4OxBq8IqZ9RxMR0%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;2831&quot; height=&quot;3775&quot; data-origin-width=&quot;2831&quot; data-origin-height=&quot;3775&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>사진</category>
      <category>멜버른</category>
      <category>시드니</category>
      <author>sailorCat</author>
      <guid isPermaLink="true">https://lsann38.tistory.com/354</guid>
      <comments>https://lsann38.tistory.com/354#entry354comment</comments>
      <pubDate>Sat, 21 Jun 2025 22:06:23 +0900</pubDate>
    </item>
    <item>
      <title>FastAPI with ***** ?   Softwares and Servers use with FastAPI</title>
      <link>https://lsann38.tistory.com/353</link>
      <description>&lt;h1&gt;FastAPI with ***** ?&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;softwares that are usally use with FastAPI&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FastAPI is a versatile framework that can be integrated with various software and tools to enhance its functionality. Here are some popular ones:&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Databases&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;SQLAlchemy&lt;/b&gt;: An ORM (Object-Relational Mapper) for working with SQL databases.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Tortoise-ORM&lt;/b&gt;: Another ORM that supports asynchronous operations.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MongoDB&lt;/b&gt;: A NoSQL database that can be used with FastAPI through libraries like Motor.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Authentication&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;OAuth2&lt;/b&gt;: FastAPI has built-in support for OAuth2, which is commonly used for authentication.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;JWT (JSON Web Tokens)&lt;/b&gt;: Libraries like PyJWT can be used for token-based authentication.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Frontend Frameworks&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;React&lt;/b&gt;: A popular JavaScript library for building user interfaces.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Vue.js&lt;/b&gt;: Another JavaScript framework for building UIs.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Angular&lt;/b&gt;: A TypeScript-based framework for building web applications.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Deployment&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Docker&lt;/b&gt;: Containerization platform to package and deploy FastAPI applications.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Kubernetes&lt;/b&gt;: Orchestration tool for managing containerized applications.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Heroku&lt;/b&gt;: A cloud platform that supports FastAPI deployment.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Testing&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Pytest&lt;/b&gt;: A testing framework for writing and running tests.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HTTPX&lt;/b&gt;: An HTTP client for making requests during testing.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Documentation&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Swagger UI&lt;/b&gt;: Automatically generated interactive API documentation.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ReDoc&lt;/b&gt;: Another tool for generating API documentation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Other Tools&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Celery&lt;/b&gt;: A task queue for handling background tasks.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Redis&lt;/b&gt;: An in-memory data structure store, often used as a cache or message broker.&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;Servers that are using with FastAPI&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Common Server Environments for FastAPI&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Uvicorn&lt;/b&gt;: An ASGI server that is commonly used to run FastAPI applications. It's lightweight and efficient.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Daphne&lt;/b&gt;: Another ASGI server that can be used with FastAPI, often chosen for its support of WebSocket protocols.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Gunicorn&lt;/b&gt;: A WSGI server that can be used with FastAPI applications by running them through Uvicorn workers.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Nginx&lt;/b&gt;: Often used as a reverse proxy server to handle incoming HTTP requests and forward them to the FastAPI application running on an ASGI server like Uvicorn.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Docker&lt;/b&gt;: As mentioned earlier, Docker can be used to containerize FastAPI applications for easier deployment and scaling on various cloud platforms.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Deployment Platforms&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;AWS (Amazon Web Services)&lt;/b&gt;: FastAPI applications can be deployed using services like EC2 (Elastic Compute Cloud) or ECS (Elastic Container Service) with Docker.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Google Cloud Platform&lt;/b&gt;: You can use Google App Engine, Google Kubernetes Engine, or Compute Engine to deploy FastAPI applications.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Microsoft Azure&lt;/b&gt;: Azure App Service, Azure Kubernetes Service, and Azure Virtual Machines are common choices for deploying FastAPI applications.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Heroku&lt;/b&gt;: A user-friendly platform for deploying applications, including FastAPI, with minimal configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;826&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFqITD/btsOLCCW8jg/01BB7lckjahYhgcugeRLik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFqITD/btsOLCCW8jg/01BB7lckjahYhgcugeRLik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFqITD/btsOLCCW8jg/01BB7lckjahYhgcugeRLik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFqITD%2FbtsOLCCW8jg%2F01BB7lckjahYhgcugeRLik%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;713&quot; height=&quot;826&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;826&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;To adjust docker and Uvicorn to code&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app/main.py&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;from fastapi import FastAPI
from app.routes import predict, train, update, hyperparameter_tuning
from app.utils.error_handler import custom_error_handler
from fastapi.exceptions import RequestValidationError

app = FastAPI()

# Include the routers from different endpoints
app.include_router(predict.router)
app.include_router(train.router)
app.include_router(update.router)
app.include_router(hyperparameter_tuning.router)

# Add error handler
app.add_exception_handler(RequestValidationError, custom_error_handler)
app.add_exception_handler(Exception, custom_error_handler)

# The following lines are added to run the app with Uvicorn
if __name__ == &quot;__main__&quot;:
    import uvicorn
    uvicorn.run(app, host=&quot;0.0.0.0&quot;, port=8000)  
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Location of the Dockerfile&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;806&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lvgev/btsOKtUq81h/uKfBWb4GkP83qOekfmo0Dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lvgev/btsOKtUq81h/uKfBWb4GkP83qOekfmo0Dk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lvgev/btsOKtUq81h/uKfBWb4GkP83qOekfmo0Dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flvgev%2FbtsOKtUq81h%2FuKfBWb4GkP83qOekfmo0Dk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;722&quot; height=&quot;806&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;806&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mi0uo/btsOK9OEjY6/B0DXBRpuHIKOKYVXcwPiz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mi0uo/btsOK9OEjY6/B0DXBRpuHIKOKYVXcwPiz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mi0uo/btsOK9OEjY6/B0DXBRpuHIKOKYVXcwPiz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmi0uo%2FbtsOK9OEjY6%2FB0DXBRpuHIKOKYVXcwPiz1%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;719&quot; height=&quot;336&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;336&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Add Authentication&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;At first I tried the put OAuth2 function with 2FA(two step authentication). The container has not been changed.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app/main.py&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from fastapi import FastAPI, Depends, HTTPException, Request
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from jose import JWTError, jwt
from passlib.context import CryptContext
from pydantic import BaseModel
from datetime import datetime, timedelta
import random
import string

app = FastAPI()

# Secret key to encode the JWT
SECRET_KEY = &quot;your_secret_key&quot;
ALGORITHM = &quot;HS256&quot;
ACCESS_TOKEN_EXPIRE_MINUTES = 30

# Password hashing context
pwd_context = CryptContext(schemes=[&quot;bcrypt&quot;], deprecated=&quot;auto&quot;)

# OAuth2 scheme
oauth2_scheme = OAuth2PasswordBearer(tokenUrl=&quot;token&quot;)

# In-memory store for 2FA codes
two_factor_auth_codes = {}

# Fake user database
fake_users_db = {
    &quot;user@example.com&quot;: {
        &quot;username&quot;: &quot;user@example.com&quot;,
        &quot;hashed_password&quot;: pwd_context.hash(&quot;password&quot;),
    }
}

class Token(BaseModel):
    access_token: str
    token_type: str

class TokenData(BaseModel):
    username: str | None = None

class User(BaseModel):
    username: str

class UserInDB(User):
    hashed_password: str

class TwoFactorData(BaseModel):
    username: str
    code: str

def verify_password(plain_password, hashed_password):
    return pwd_context.verify(plain_password, hashed_password)

def get_user(db, username: str):
    if username in db:
        user_dict = db[username]
        return UserInDB(**user_dict)

def authenticate_user(fake_db, username: str, password: str):
    user = get_user(fake_db, username)
    if not user:
        return False
    if not verify_password(password, user.hashed_password):
        return False
    return user

def create_access_token(data: dict, expires_delta: timedelta | None = None):
    to_encode = data.copy()
    if expires_delta:
        expire = datetime.utcnow() + expires_delta
    else:
        expire = datetime.utcnow() + timedelta(minutes=15)
    to_encode.update({&quot;exp&quot;: expire})
    encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
    return encoded_jwt

def generate_2fa_code():
    return ''.join(random.choices(string.digits, k=6))

def send_2fa_code(username: str, code: str):
    # In a real application, send the code via SMS, email, or an authenticator app
    print(f&quot;2FA code for {username}: {code}&quot;)

@app.post(&quot;/token&quot;, response_model=Token)
async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends()):
    user = authenticate_user(fake_users_db, form_data.username, form_data.password)
    if not user:
        raise HTTPException(
            status_code=400,
            detail=&quot;Incorrect username or password&quot;,
            headers={&quot;WWW-Authenticate&quot;: &quot;Bearer&quot;},
        )
    code = generate_2fa_code()
    two_factor_auth_codes[form_data.username] = code
    send_2fa_code(form_data.username, code)
    return {&quot;access_token&quot;: &quot;2fa_required&quot;, &quot;token_type&quot;: &quot;bearer&quot;}

@app.post(&quot;/2fa&quot;, response_model=Token)
async def verify_2fa_code(data: TwoFactorData):
    if data.username in two_factor_auth_codes and two_factor_auth_codes[data.username] == data.code:
        access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
        access_token = create_access_token(
            data={&quot;sub&quot;: data.username}, expires_delta=access_token_expires
        )
        del two_factor_auth_codes[data.username]  # Remove used code
        return {&quot;access_token&quot;: access_token, &quot;token_type&quot;: &quot;bearer&quot;}
    else:
        raise HTTPException(
            status_code=400,
            detail=&quot;Invalid 2FA code&quot;,
            headers={&quot;WWW-Authenticate&quot;: &quot;Bearer&quot;},
        )

@app.get(&quot;/users/me&quot;, response_model=User)
async def read_users_me(current_user: User = Depends(get_current_user)):
    return current_user

async def get_current_user(token: str = Depends(oauth2_scheme)):
    credentials_exception = HTTPException(
        status_code=401,
        detail=&quot;Could not validate credentials&quot;,
        headers={&quot;WWW-Authenticate&quot;: &quot;Bearer&quot;},
    )
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
        username: str = payload.get(&quot;sub&quot;)
        if username is None:
            raise credentials_exception
        token_data = TokenData(username=username)
    except JWTError:
        raise credentials_exception
    user = get_user(fake_users_db, username=token_data.username)
    if user is None:
        raise credentials_exception
    return user

# Include the routers from different endpoints
from app.routes import predict, train, update, hyperparameter_tuning
app.include_router(predict.router)
app.include_router(train.router)
app.include_router(update.router)
app.include_router(hyperparameter_tuning.router)

# Add error handler
from app.utils.error_handler import custom_error_handler
from fastapi.exceptions import RequestValidationError
app.add_exception_handler(RequestValidationError, custom_error_handler)
app.add_exception_handler(Exception, custom_error_handler)

if __name__ == &quot;__main__&quot;:
    import uvicorn
    uvicorn.run(app, host=&quot;0.0.0.0&quot;, port=8000)  # This line is added

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app/utils/error_handler.py&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from fastapi.responses import JSONResponse
from fastapi import Request

async def custom_error_handler(request: Request, exc):
    return JSONResponse(
        status_code=400,
        content={&quot;message&quot;: f&quot;Oops! Something went wrong: {str(exc)}&quot;}
    )

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app/utils/transformers_utils.py&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;from transformers import ElectraTokenizer, ElectraForSequenceClassification, Trainer, TrainingArguments
import torch
from datasets import load_metric, Dataset
import optuna

class TransformersModel:
    def __init__(self, model_name: str):
        self.tokenizer = ElectraTokenizer.from_pretrained(model_name)
        self.model = ElectraForSequenceClassification.from_pretrained(model_name)
        self.metric = load_metric(&quot;accuracy&quot;)

    def predict(self, text: str):
        inputs = self.tokenizer(text, return_tensors='pt')
        outputs = self.model(**inputs)
        logits = outputs.logits
        probabilities = torch.nn.functional.softmax(logits, dim=-1)
        predicted_class = torch.argmax(probabilities, dim=1).item()
        return {&quot;class&quot;: predicted_class, &quot;probabilities&quot;: probabilities.tolist()}

    def train(self, train_dataset: Dataset, eval_dataset: Dataset, output_dir: str, training_args: dict):
        args = TrainingArguments(
            output_dir=output_dir,
            num_train_epochs=training_args[&quot;num_train_epochs&quot;],
            per_device_train_batch_size=training_args[&quot;per_device_train_batch_size&quot;],
            per_device_eval_batch_size=training_args[&quot;per_device_eval_batch_size&quot;],
            evaluation_strategy=&quot;steps&quot;,
            save_steps=10_000,
            eval_steps=500,
            logging_dir=f&quot;{output_dir}/logs&quot;,
            learning_rate=training_args[&quot;learning_rate&quot;],
            weight_decay=training_args[&quot;weight_decay&quot;],
        )
        trainer = Trainer(
            model=self.model,
            args=args,
            train_dataset=train_dataset,
            eval_dataset=eval_dataset,
            tokenizer=self.tokenizer,
            compute_metrics=self.compute_metrics,
        )
        trainer.train()
        trainer.save_model(output_dir)
        return {&quot;status&quot;: &quot;Training completed&quot;}

    def update(self, new_train_texts: list, new_train_labels: list, output_dir: str):
        new_train_dataset = Dataset.from_dict({&quot;text&quot;: new_train_texts, &quot;label&quot;: new_train_labels})
        return self.train(new_train_dataset, new_train_dataset, output_dir, self.default_training_args())
    
    def hyperparameter_tuning(self, train_dataset: Dataset, eval_dataset: Dataset, output_dir: str):
        def objective(trial):
            training_args = {
                &quot;num_train_epochs&quot;: trial.suggest_int(&quot;num_train_epochs&quot;, 1, 5),
                &quot;per_device_train_batch_size&quot;: trial.suggest_categorical(&quot;per_device_train_batch_size&quot;, [8, 16, 32]),
                &quot;per_device_eval_batch_size&quot;: trial.suggest_categorical(&quot;per_device_eval_batch_size&quot;, [8, 16, 32]),
                &quot;learning_rate&quot;: trial.suggest_loguniform(&quot;learning_rate&quot;, 1e-5, 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;How to measure the app?&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;When I use the computer or app. If It is slow I don&amp;rsquo;t use it. So I know how much important the app speed is.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Let&amp;rsquo;s check it with Copilot!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The speed of your application might be impacted by the added complexity and features, but there are several strategies you can use to maintain or even improve performance:&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Optimization Tips&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Asynchronous Operations&lt;/b&gt;: Ensure that you're making use of FastAPI's asynchronous capabilities (e.g., async/await) to handle I/O-bound tasks like database queries and external API calls efficiently.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Efficient Data Processing&lt;/b&gt;: Optimize your data processing pipelines to reduce bottlenecks. Use efficient data structures and algorithms, and consider batch processing if applicable.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Caching&lt;/b&gt;: Implement caching for frequently accessed data or computationally expensive operations. Tools like Redis can be used for caching.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Database Optimization&lt;/b&gt;: Ensure that your database queries are optimized. Use indexing, pagination, and avoid unnecessary queries.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Load Balancing&lt;/b&gt;: Distribute the load across multiple instances of your application using load balancers to improve scalability and performance.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Profiling and Monitoring&lt;/b&gt;: Use profiling tools to identify performance bottlenecks and optimize them. Tools like Prometheus and Grafana can help with monitoring performance metrics.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Hardware Resources&lt;/b&gt;: Ensure that the server or infrastructure you're using has sufficient hardware resources (CPU, memory, etc.) to handle the increased load.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Assessing Performance&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;To measure the performance impact of your changes, you can use benchmarking and monitoring tools:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Benchmarking Tools&lt;/b&gt;: Use tools like ab (Apache Bench), wrk, or locust to simulate load on your application and measure response times and throughput.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Profiling Tools&lt;/b&gt;: Use profiling tools like cProfile, py-spy, or perf to identify performance bottlenecks in your code.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Monitoring Tools&lt;/b&gt;: Use monitoring tools like Prometheus, Grafana, or New Relic to track performance metrics in real time.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Thank you for reading! xoxo&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 노션에 정리한 내용을 블로그로 다시 옮겨왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://snow-light-ac7.notion.site/FastAPI-1989a232cc3580fb9c25ee5693abf945#19d9a232cc3580d0a54cf27ff2ba7615&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://snow-light-ac7.notion.site/FastAPI-1989a232cc3580fb9c25ee5693abf945#19d9a232cc3580d0a54cf27ff2ba7615&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1750477488585&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;FastAPI | Notion&quot; data-og-description=&quot;This is summary of what I learned about FastAPI!&quot; data-og-host=&quot;snow-light-ac7.notion.site&quot; data-og-source-url=&quot;https://snow-light-ac7.notion.site/FastAPI-1989a232cc3580fb9c25ee5693abf945#19d9a232cc3580d0a54cf27ff2ba7615&quot; data-og-url=&quot;https://snow-light-ac7.notion.site/FastAPI-1989a232cc3580fb9c25ee5693abf945&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://snow-light-ac7.notion.site/FastAPI-1989a232cc3580fb9c25ee5693abf945#19d9a232cc3580d0a54cf27ff2ba7615&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://snow-light-ac7.notion.site/FastAPI-1989a232cc3580fb9c25ee5693abf945#19d9a232cc3580d0a54cf27ff2ba7615&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;FastAPI | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;This is summary of what I learned about FastAPI!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;snow-light-ac7.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>FastAPI</category>
      <category>db</category>
      <category>docker</category>
      <category>fastapi</category>
      <category>restapi</category>
      <category>Server</category>
      <author>sailorCat</author>
      <guid isPermaLink="true">https://lsann38.tistory.com/353</guid>
      <comments>https://lsann38.tistory.com/353#entry353comment</comments>
      <pubDate>Sat, 21 Jun 2025 12:46:04 +0900</pubDate>
    </item>
    <item>
      <title>Let's build a Rest API using FastAPI and Copliot!</title>
      <link>https://lsann38.tistory.com/352</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; Let's build a REST API using FastAPI, Copilot!&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/Hippy-Happy/DassuL&quot;&gt;https://github.com/Hippy-Happy/DassuL&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1750476455384&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - Hippy-Happy/DassuL&quot; data-og-description=&quot;Contribute to Hippy-Happy/DassuL development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/Hippy-Happy/DassuL&quot; data-og-url=&quot;https://github.com/Hippy-Happy/DassuL&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/m14Nw/hyY701AKiU/kiwkjjci2JcFqtKkeM7OOk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bOZeUi/hyZcpyv36e/pHMrk3Hkg258NOF1wWf8H0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/Hippy-Happy/DassuL&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/Hippy-Happy/DassuL&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/m14Nw/hyY701AKiU/kiwkjjci2JcFqtKkeM7OOk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bOZeUi/hyZcpyv36e/pHMrk3Hkg258NOF1wWf8H0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - Hippy-Happy/DassuL&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to Hippy-Happy/DassuL development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;I&amp;rsquo;m gonna use this code for bulid the api today.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;To simply explain this document, It was the NLP project from Korea which can detect hatespeech or discrimination word.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;I already made the code with Flask API. But today we&amp;rsquo;ll try another option FastAPI with Copilot!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;And one thing I wanna explain about this whole situation, using copilot instead of doing it myself, is that I was unable to install development software tools with Melbourne free Library computers at that moment..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Try 1&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;589&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KIwQ0/btsOLudSV3A/e8PvKTzou81G66qboKowdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KIwQ0/btsOLudSV3A/e8PvKTzou81G66qboKowdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KIwQ0/btsOLudSV3A/e8PvKTzou81G66qboKowdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKIwQ0%2FbtsOLudSV3A%2Fe8PvKTzou81G66qboKowdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;589&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;589&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;I applied this sentence to Copilot and then it works.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cljC1g/btsOLcdynau/SyPKHe8PRU92IRMa5KCEM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cljC1g/btsOLcdynau/SyPKHe8PRU92IRMa5KCEM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cljC1g/btsOLcdynau/SyPKHe8PRU92IRMa5KCEM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcljC1g%2FbtsOLcdynau%2FSyPKHe8PRU92IRMa5KCEM0%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;772&quot; height=&quot;546&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y3M7p/btsOLCCWUol/n7mnErsXwPMuit9XoAFktk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y3M7p/btsOLCCWUol/n7mnErsXwPMuit9XoAFktk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y3M7p/btsOLCCWUol/n7mnErsXwPMuit9XoAFktk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy3M7p%2FbtsOLCCWUol%2Fn7mnErsXwPMuit9XoAFktk%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;749&quot; height=&quot;350&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;727&quot; data-origin-height=&quot;527&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qIw1V/btsOLvw5HMj/DehwwhalK7HsPBLJYKdQBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qIw1V/btsOLvw5HMj/DehwwhalK7HsPBLJYKdQBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qIw1V/btsOLvw5HMj/DehwwhalK7HsPBLJYKdQBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqIw1V%2FbtsOLvw5HMj%2FDehwwhalK7HsPBLJYKdQBK%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;727&quot; height=&quot;527&quot; data-origin-width=&quot;727&quot; data-origin-height=&quot;527&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;and basic codes etc&amp;hellip; It&amp;rsquo;s not the code I wanted. so let&amp;rsquo;s try again.&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;Try 2&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5muAA/btsOLdXRqXv/tY8ryYnKyJyzNEz08ctaY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5muAA/btsOLdXRqXv/tY8ryYnKyJyzNEz08ctaY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5muAA/btsOLdXRqXv/tY8ryYnKyJyzNEz08ctaY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5muAA%2FbtsOLdXRqXv%2FtY8ryYnKyJyzNEz08ctaY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;604&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;604&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Downloaded the raw file of training sheets and then directly give it to Copilot.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;And then It was impossible for using downloaded files with Library computers&amp;hellip;. &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;Try 3&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzcP1X/btsOKSNfqpr/BfU1Tck2SuLmQcpeHSmD2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzcP1X/btsOKSNfqpr/BfU1Tck2SuLmQcpeHSmD2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzcP1X/btsOKSNfqpr/BfU1Tck2SuLmQcpeHSmD2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzcP1X%2FbtsOKSNfqpr%2FBfU1Tck2SuLmQcpeHSmD2K%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;716&quot; height=&quot;106&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;I gave the file name in the github to Copilot, and then it works.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;734&quot; data-origin-height=&quot;357&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQNUxU/btsOMVnW3eC/kjPKjk0HWoWatYLvRswEK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQNUxU/btsOMVnW3eC/kjPKjk0HWoWatYLvRswEK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQNUxU/btsOMVnW3eC/kjPKjk0HWoWatYLvRswEK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQNUxU%2FbtsOMVnW3eC%2FkjPKjk0HWoWatYLvRswEK1%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;734&quot; height=&quot;357&quot; data-origin-width=&quot;734&quot; data-origin-height=&quot;357&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;This is the code.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://main.py&quot;&gt;main.py&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from fastapi import FastAPI
from routers import transformers

app = FastAPI()

app.include_router(transformers.router)

@app.get(&quot;/&quot;)
def read_root():
    return {&quot;Hello&quot;: &quot;World&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;routers/transformers.py&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from typing import List

from models import transformers
from schemas import transformers as transformers_schema
from crud import transformers as transformers_crud
from database import get_db

router = APIRouter()

@router.get(&quot;/transformers&quot;, response_model=List[transformers_schema.Transformer])
def read_transformers(skip: int = 0, limit: int = 10, db: Session = Depends(get_db)):
    transformers = transformers_crud.get_transformers(db, skip=skip, limit=limit)
    return transformers

@router.post(&quot;/transformers&quot;, response_model=transformers_schema.Transformer)
def create_transformer(transformer: transformers_schema.TransformerCreate, db: Session = Depends(get_db)):
    return transformers_crud.create_transformer(db=db, transformer=transformer)

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;models/transformers.py&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from typing import List

from models import transformers
from schemas import transformers as transformers_schema
from crud import transformers as transformers_crud
from database import get_db

router = APIRouter()

@router.get(&quot;/transformers&quot;, response_model=List[transformers_schema.Transformer])
def read_transformers(skip: int = 0, limit: int = 10, db: Session = Depends(get_db)):
    transformers = transformers_crud.get_transformers(db, skip=skip, limit=limit)
    return transformers

@router.post(&quot;/transformers&quot;, response_model=transformers_schema.Transformer)
def create_transformer(transformer: transformers_schema.TransformerCreate, db: Session = Depends(get_db)):
    return transformers_crud.create_transformer(db=db, transformer=transformer)

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;schemas/transformers.py&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;from pydantic import BaseModel

class TransformerBase(BaseModel):
    name: str
    accuracy: float
    model_path: str

class TransformerCreate(TransformerBase):
    pass

class Transformer(TransformerBase):
    id: int

    class Config:
        orm_mode = True

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;crud/transformers.py&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;from pydantic import BaseModel

class TransformerBase(BaseModel):
    name: str
    accuracy: float
    model_path: str

class TransformerCreate(TransformerBase):
    pass

class Transformer(TransformerBase):
    id: int

    class Config:
        orm_mode = True

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;services/transformers.py&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;# Add any service logic or utility functions related to your transformers here

def train_transformer(model_path: str):
    # Your training logic from the notebook goes here
    pass

def evaluate_transformer(model_path: str):
    # Your evaluation logic from the notebook goes here
    pass

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;database.py&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

SQLALCHEMY_DATABASE_URL = &quot;sqlite:///./test.db&quot;

engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={&quot;check_same_thread&quot;: False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;169&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dTUMM8/btsOL3mMPdc/WhSgA4b0BxsCrqOlk9yQ3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dTUMM8/btsOL3mMPdc/WhSgA4b0BxsCrqOlk9yQ3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dTUMM8/btsOL3mMPdc/WhSgA4b0BxsCrqOlk9yQ3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdTUMM8%2FbtsOL3mMPdc%2FWhSgA4b0BxsCrqOlk9yQ3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;730&quot; height=&quot;169&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;169&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;And then Copilot suggested me these questions about the code.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HvlWD/btsOLcLoXiv/azZeMNhP7zr1TYbGKRvczk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HvlWD/btsOLcLoXiv/azZeMNhP7zr1TYbGKRvczk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HvlWD/btsOLcLoXiv/azZeMNhP7zr1TYbGKRvczk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHvlWD%2FbtsOLcLoXiv%2FazZeMNhP7zr1TYbGKRvczk%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;749&quot; height=&quot;214&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;214&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;basically what I needed in this code for using this API practically.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;first I questioned of dependencies.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;520&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pvbZN/btsOKztztkf/eEgkymK76988XEOShW2iE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pvbZN/btsOKztztkf/eEgkymK76988XEOShW2iE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pvbZN/btsOKztztkf/eEgkymK76988XEOShW2iE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpvbZN%2FbtsOKztztkf%2FeEgkymK76988XEOShW2iE0%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;724&quot; height=&quot;520&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;520&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Then I wanted to add the error function into the code.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QKqKY/btsOMqBKBSS/AIfoHxDbktVHOO6N08lfD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QKqKY/btsOMqBKBSS/AIfoHxDbktVHOO6N08lfD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QKqKY/btsOMqBKBSS/AIfoHxDbktVHOO6N08lfD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQKqKY%2FbtsOMqBKBSS%2FAIfoHxDbktVHOO6N08lfD0%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;729&quot; height=&quot;728&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;728&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;So many files pop up at this part, I questioned it again.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6CBEo/btsOLjp9erq/kRxqpCf673GaJrj1ko8Mn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6CBEo/btsOLjp9erq/kRxqpCf673GaJrj1ko8Mn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6CBEo/btsOLjp9erq/kRxqpCf673GaJrj1ko8Mn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6CBEo%2FbtsOLjp9erq%2FkRxqpCf673GaJrj1ko8Mn1%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;740&quot; height=&quot;208&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Added http_exception_handler and custom_exception_handler for handling exceptions.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://main.py&quot;&gt;main.py&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from fastapi import FastAPI, HTTPException, Request
from fastapi.responses import JSONResponse
from routers import transformers

app = FastAPI()

app.include_router(transformers.router)

@app.get(&quot;/&quot;)
def read_root():
    return {&quot;Hello&quot;: &quot;World&quot;}

@app.exception_handler(HTTPException)
async def http_exception_handler(request: Request, exc: HTTPException):
    return JSONResponse(
        status_code=exc.status_code,
        content={&quot;message&quot;: exc.detail},
    )

class CustomException(Exception):
    def __init__(self, name: str):
        self.name = name

@app.exception_handler(CustomException)
async def custom_exception_handler(request: Request, exc: CustomException):
    return JSONResponse(
        status_code=400,
        content={&quot;message&quot;: f&quot;Oops! Something went wrong with {exc.name}.&quot;},
    )

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Added conditions to raise CustomException and HTTPException.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;routers/transformers.py&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from typing import List

from models import transformers
from schemas import transformers as transformers_schema
from crud import transformers as transformers_crud
from database import get_db
+ from main import CustomException

router = APIRouter()

@router.get(&quot;/transformers&quot;, response_model=List[transformers_schema.Transformer])
def read_transformers(skip: int = 0, limit: int = 10, db: Session = Depends(get_db)):
+    if limit &amp;gt; 100:
+        raise CustomException(name=&quot;Transformer List Limit&quot;)
    transformers = transformers_crud.get_transformers(db, skip=skip, limit=limit)
+    if not transformers:
+        raise HTTPException(status_code=404, detail=&quot;Transformers not found&quot;)
    return transformers

@router.post(&quot;/transformers&quot;, response_model=transformers_schema.Transformer)
def create_transformer(transformer: transformers_schema.TransformerCreate, db: Session = Depends(get_db)):
+    if not transformer.name:
+        raise CustomException(name=&quot;Transformer Name&quot;)
    return transformers_crud.create_transformer(db=db, transformer=transformer)

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5zUTM/btsOKIKyamE/PYReyUAqVkKN798mRdnqjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5zUTM/btsOKIKyamE/PYReyUAqVkKN798mRdnqjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5zUTM/btsOKIKyamE/PYReyUAqVkKN798mRdnqjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5zUTM%2FbtsOKIKyamE%2FPYReyUAqVkKN798mRdnqjK%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;714&quot; height=&quot;139&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;139&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Try 4&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pSoD4/btsOLQAWiA4/K2Qb3VgDTtUgGn4LXi53k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pSoD4/btsOLQAWiA4/K2Qb3VgDTtUgGn4LXi53k1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pSoD4/btsOLQAWiA4/K2Qb3VgDTtUgGn4LXi53k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpSoD4%2FbtsOLQAWiA4%2FK2Qb3VgDTtUgGn4LXi53k1%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;751&quot; height=&quot;430&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app/main.py&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;from fastapi import FastAPI
from app.routes import predict, train, update, hyperparameter_tuning
from app.utils.error_handler import custom_error_handler
from fastapi.exceptions import RequestValidationError

app = FastAPI()

# Include the routers from different endpoints
app.include_router(predict.router)
app.include_router(train.router)
app.include_router(update.router)
app.include_router(hyperparameter_tuning.router)

# Add error handler
app.add_exception_handler(RequestValidationError, custom_error_handler)
app.add_exception_handler(Exception, custom_error_handler)

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app/utils/error_handler.py&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from fastapi.responses import JSONResponse
from fastapi import Request

async def custom_error_handler(request: Request, exc):
    return JSONResponse(
        status_code=400,
        content={&quot;message&quot;: f&quot;Oops! Something went wrong: {str(exc)}&quot;}
    )

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app/utils/transformers_utils.py&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;from transformers import ElectraTokenizer, ElectraForSequenceClassification, Trainer, TrainingArguments
import torch
from datasets import load_metric, Dataset
import optuna

class TransformersModel:
    def __init__(self, model_name: str):
        self.tokenizer = ElectraTokenizer.from_pretrained(model_name)
        self.model = ElectraForSequenceClassification.from_pretrained(model_name)
        self.metric = load_metric(&quot;accuracy&quot;)

    def predict(self, text: str):
        inputs = self.tokenizer(text, return_tensors='pt')
        outputs = self.model(**inputs)
        logits = outputs.logits
        probabilities = torch.nn.functional.softmax(logits, dim=-1)
        predicted_class = torch.argmax(probabilities, dim=1).item()
        return {&quot;class&quot;: predicted_class, &quot;probabilities&quot;: probabilities.tolist()}

    def train(self, train_dataset: Dataset, eval_dataset: Dataset, output_dir: str, training_args: dict):
        args = TrainingArguments(
            output_dir=output_dir,
            num_train_epochs=training_args[&quot;num_train_epochs&quot;],
            per_device_train_batch_size=training_args[&quot;per_device_train_batch_size&quot;],
            per_device_eval_batch_size=training_args[&quot;per_device_eval_batch_size&quot;],
            evaluation_strategy=&quot;steps&quot;,
            save_steps=10_000,
            eval_steps=500,
            logging_dir=f&quot;{output_dir}/logs&quot;,
            learning_rate=training_args[&quot;learning_rate&quot;],
            weight_decay=training_args[&quot;weight_decay&quot;],
        )
        trainer = Trainer(
            model=self.model,
            args=args,
            train_dataset=train_dataset,
            eval_dataset=eval_dataset,
            tokenizer=self.tokenizer,
            compute_metrics=self.compute_metrics,
        )
        trainer.train()
        trainer.save_model(output_dir)
        return {&quot;status&quot;: &quot;Training completed&quot;}

    def update(self, new_train_texts: list, new_train_labels: list, output_dir: str):
        new_train_dataset = Dataset.from_dict({&quot;text&quot;: new_train_texts, &quot;label&quot;: new_train_labels})
        return self.train(new_train_dataset, new_train_dataset, output_dir, self.default_training_args())
    
    def hyperparameter_tuning(self, train_dataset: Dataset, eval_dataset: Dataset, output_dir: str):
        def objective(trial):
            training_args = {
                &quot;num_train_epochs&quot;: trial.suggest_int(&quot;num_train_epochs&quot;, 1, 5),
                &quot;per_device_train_batch_size&quot;: trial.suggest_categorical(&quot;per_device_train_batch_size&quot;, [8, 16, 32]),
                &quot;per_device_eval_batch_size&quot;: trial.suggest_categorical(&quot;per_device_eval_batch_size&quot;, [8, 16, 32]),
                &quot;learning_rate&quot;: trial.suggest_loguniform(&quot;learning_rate&quot;, 1e-5, 1e-4),
                &quot;weight_decay&quot;: trial.suggest_loguniform(&quot;weight_decay&quot;, 1e-4, 1e-2),
            }
            result = self.train(train_dataset, eval_dataset, output_dir, training_args)
            accuracy = result[&quot;accuracy&quot;]
            return accuracy
        
        study = optuna.create_study(direction=&quot;maximize&quot;)
        study.optimize(objective, n_trials=20)
        return study.best_params
    
    def compute_metrics(self, p):
        preds = torch.argmax(p.predictions, dim=1)
        return self.metric.compute(predictions=preds, references=p.label_ids)

    def default_training_args(self):
        return {
            &quot;num_train_epochs&quot;: 3,
            &quot;per_device_train_batch_size&quot;: 8,
            &quot;per_device_eval_batch_size&quot;: 8,
            &quot;learning_rate&quot;: 2e-5,
            &quot;weight_decay&quot;: 0.01,
        }

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app/routes/predict.py&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
from app.utils.transformers_utils import TransformersModel

router = APIRouter()

# Initialize the transformers model with Electra
model = TransformersModel(model_name='monologg/koelectra-base-v3-discriminator')

class TextData(BaseModel):
    text: str

@router.post(&quot;/predict&quot;)
async def predict(text_data: TextData):
    try:
        prediction = model.predict(text_data.text)
        return prediction
    except Exception as e:
        raise HTTPException(status_code=400, detail=str(e))

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app/routes/train.py&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
from app.utils.transformers_utils import TransformersModel
from datasets import Dataset

router = APIRouter()

# Initialize the transformers model (replace 'model_name' with your model)
model = TransformersModel(model_name='monologg/koelectra-base-v3-discriminator')

class TrainData(BaseModel):
    train_texts: list
    train_labels: list
    eval_texts: list
    eval_labels: list
    output_dir: str

@router.post(&quot;/train&quot;)
async def train_model(train_data: TrainData):
    try:
        train_dataset = Dataset.from_dict({&quot;text&quot;: train_data.train_texts, &quot;label&quot;: train_data.train_labels})
        eval_dataset = Dataset.from_dict({&quot;text&quot;: train_data.eval_texts, &quot;label&quot;: train_data.eval_labels})
        
        result = model.train(train_dataset, eval_dataset, train_data.output_dir, model.default_training_args())
        return result
    except Exception as e:
        raise HTTPException(status_code=400, detail=str(e))

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app/routes/updates.py&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
from app.utils.transformers_utils import TransformersModel

router = APIRouter()

# Initialize the transformers model (replace 'model_name' with your model)
model = TransformersModel(model_name='monologg/koelectra-base-v3-discriminator')

class UpdateData(BaseModel):
    new_train_texts: list
    new_train_labels: list
    output_dir: str

@router.post(&quot;/update&quot;)
async def update_model(update_data: UpdateData):
    try:
        result = model.update(update_data.new_train_texts, update_data.new_train_labels, update_data.output_dir)
        return result
    except Exception as e:
        raise HTTPException(status_code=400, detail=str(e))

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app/routes/hyperparameter_tuning.py&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
from app.utils.transformers_utils import TransformersModel
from datasets import Dataset

router = APIRouter()

# Initialize the transformers model with Electra
model = TransformersModel(model_name='monologg/koelectra-base-v3-discriminator')

class HyperparameterData(BaseModel):
    train_texts: list
    train_labels: list
    eval_texts: list
    eval_labels: list
    output_dir: str

@router.post(&quot;/hyperparameter_tuning&quot;)
async def hyperparameter_tuning(hyperparameter_data: HyperparameterData):
    try:
        train_dataset = Dataset.from_dict({&quot;text&quot;: hyperparameter_data.train_texts, &quot;label&quot;: hyperparameter_data.train_labels})
        eval_dataset = Dataset.from_dict({&quot;text&quot;: hyperparameter_data.eval_texts, &quot;label&quot;: hyperparameter_data.eval_labels})
        
        best_params = model.hyperparameter_tuning(train_dataset, eval_dataset, hyperparameter_data.output_dir)
        return {&quot;best_params&quot;: best_params}
    except Exception as e:
        raise HTTPException(status_code=400, detail=str(e))

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;I asked Copilot about the latest paper to approve it.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RKNJy/btsOKRAKHvC/1Waojm4G5t13Gf72k6LVr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RKNJy/btsOKRAKHvC/1Waojm4G5t13Gf72k6LVr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RKNJy/btsOKRAKHvC/1Waojm4G5t13Gf72k6LVr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRKNJy%2FbtsOKRAKHvC%2F1Waojm4G5t13Gf72k6LVr0%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;720&quot; height=&quot;600&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;635&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5oZ69/btsOLRfzRH3/fnY8YWIEZI2Fw9vGnpQePK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5oZ69/btsOLRfzRH3/fnY8YWIEZI2Fw9vGnpQePK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5oZ69/btsOLRfzRH3/fnY8YWIEZI2Fw9vGnpQePK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5oZ69%2FbtsOLRfzRH3%2FfnY8YWIEZI2Fw9vGnpQePK%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;635&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;635&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;I asked the Copilot, With consideration of response speed of my api which paper is most suitable. And show me the result.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Considering the need to balance response speed with high performance in your FastAPI application, one of the most suitable advancements could be from the paper on &lt;b&gt;RAG Foundry: Enhancing LLMs for Retrieval Augmented Generation&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Why RAG Foundry is Suitable:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Efficient Retrieval-Augmented Generation&lt;/b&gt;: RAG Foundry integrates retrieval mechanisms to augment the generation process. This can help in providing faster, contextually accurate responses by retrieving relevant information efficiently.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Asynchronous Retrieval&lt;/b&gt;: The paper's methodologies can be adapted to use asynchronous processing, which FastAPI supports natively. This ensures non-blocking operations, leading to faster response times.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Reduced Computational Load&lt;/b&gt;: By leveraging pre-retrieved relevant information, the model can generate responses with less computational overhead compared to processing everything from scratch.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Optimized for Real-Time Applications&lt;/b&gt;: The techniques are designed to enhance real-time applications, making them ideal for APIs that require quick turnaround times.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Practical Integration&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Here's how you might apply the principles from RAG Foundry to your existing FastAPI application:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Implement a Retriever for Augmenting Responses&lt;/b&gt;: Use a retriever to gather relevant data quickly.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Asynchronous Endpoints&lt;/b&gt;: Ensure all endpoints are asynchronous to handle concurrent requests efficiently.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Optimize Model Inference&lt;/b&gt;: Use optimized inference libraries or frameworks (e.g., ONNX Runtime) to speed up model predictions.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app/utils/transformers_utils.py&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;from transformers import RagTokenizer, RagRetriever, RAGForSequenceClassification
import torch
from datasets import load_metric, Dataset
import optuna

class TransformersModel:
    def __init__(self, model_name: str):
        self.tokenizer = RagTokenizer.from_pretrained(model_name)
        self.retriever = RagRetriever.from_pretrained(model_name)
        self.model = RAGForSequenceClassification.from_pretrained(model_name)
        self.metric = load_metric(&quot;accuracy&quot;)

    async def predict(self, text: str):
        inputs = self.tokenizer(text, return_tensors='pt')
        retrieved_docs = await self.retriever(inputs.input_ids)
        inputs['retrieved_docs'] = retrieved_docs
        outputs = self.model(**inputs)
        logits = outputs.logits
        probabilities = torch.nn.functional.softmax(logits, dim=-1)
        predicted_class = torch.argmax(probabilities, dim=1).item()
        return {&quot;class&quot;: predicted_class, &quot;probabilities&quot;: probabilities.tolist()}

    async def train(self, train_dataset: Dataset, eval_dataset: Dataset, output_dir: str, training_args: dict):
        args = TrainingArguments(
            output_dir=output_dir,
            num_train_epochs=training_args[&quot;num_train_epochs&quot;],
            per_device_train_batch_size=training_args[&quot;per_device_train_batch_size&quot;],
            per_device_eval_batch_size=training_args[&quot;per_device_eval_batch_size&quot;],
            evaluation_strategy=&quot;steps&quot;,
            save_steps=10_000,
            eval_steps=500,
            logging_dir=f&quot;{output_dir}/logs&quot;,
            learning_rate=training_args[&quot;learning_rate&quot;],
            weight_decay=training_args[&quot;weight_decay&quot;],
        )
        trainer = Trainer(
            model=self.model,
            args=args,
            train_dataset=train_dataset,
            eval_dataset=eval_dataset,
            tokenizer=self.tokenizer,
            compute_metrics=self.compute_metrics,
        )
        await trainer.train()
        trainer.save_model(output_dir)
        return {&quot;status&quot;: &quot;Training completed&quot;

    def update(self, new_train_texts: list, new_train_labels: list, output_dir: str):
        new_train_dataset = Dataset.from_dict({&quot;text&quot;: new_train_texts, &quot;label&quot;: new_train_labels})
        return self.train(new_train_dataset, new_train_dataset, output_dir, self.default_training_args())

    def hyperparameter_tuning(self, train_dataset: Dataset, eval_dataset: Dataset, output_dir: str):
        def objective(trial):
            training_args = {
                &quot;num_train_epochs&quot;: trial.suggest_int(&quot;num_train_epochs&quot;, 1, 5),
                &quot;per_device_train_batch_size&quot;: trial.suggest_categorical(&quot;per_device_train_batch_size&quot;, [8, 16, 32]),
                &quot;per_device_eval_batch_size&quot;: trial.suggest_categorical(&quot;per_device_eval_batch_size&quot;, [8, 16, 32]),
                &quot;learning_rate&quot;: trial.suggest_loguniform(&quot;learning_rate&quot;, 1e-5, 1e-4),
                &quot;weight_decay&quot;: trial.suggest_loguniform(&quot;weight_decay&quot;, 1e-4, 1e-2),
            }
            result = self.train(train_dataset, eval_dataset, output_dir, training_args)
            accuracy = result[&quot;accuracy&quot;]
            return accuracy
        
        study = optuna.create_study(direction=&quot;maximize&quot;)
        study.optimize(objective, n_trials=20)
        return study.best_params

    def compute_metrics(self, p):
        preds = torch.argmax(p.predictions, dim=1)
        return self.metric.compute(predictions=preds, references=p.label_ids)

    def default_training_args(self):
        return {
            &quot;num_train_epochs&quot;: 3,
            &quot;per_device_train_batch_size&quot;: 8,
            &quot;per_device_eval_batch_size&quot;: 8,
            &quot;learning_rate&quot;: 2e-5,
            &quot;weight_decay&quot;: 0.01,
        }

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app/routes/predict.py&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
from app.utils.transformers_utils import TransformersModel

router = APIRouter()

# Initialize the transformers model with RAG
model = TransformersModel(model_name='facebook/rag-token-nq')

class TextData(BaseModel):
    text: str

@router.post(&quot;/predict&quot;)
async def predict(text_data: TextData):
    try:
        prediction = await model.predict(text_data.text)
        return prediction
    except Exception as e:
        raise HTTPException(status_code=400, detail=str(e))

&lt;/code&gt;&lt;/pre&gt;</description>
      <category>FastAPI</category>
      <category>AI</category>
      <category>CoPilot</category>
      <category>fastapi</category>
      <author>sailorCat</author>
      <guid isPermaLink="true">https://lsann38.tistory.com/352</guid>
      <comments>https://lsann38.tistory.com/352#entry352comment</comments>
      <pubDate>Sat, 21 Jun 2025 12:41:18 +0900</pubDate>
    </item>
  </channel>
</rss>