{
  "fetched_at": "2026-10-19T09:32:24Z",
  "source_url": "https://www.kaggle.com/competitions/2020mltermproject3dclassification/data",
  "pages": [
    {
      "name": "data-description",
      "content": "## Model10\n\n해당 데이터 셋은 다음과 같은 {0: 'monitor',\n 1: 'bathtub',\n 2: 'table',\n 3: 'bed',\n 4: 'chair',\n 5: 'toilet',\n 6: 'desk',\n 7: 'sofa',\n 8: 'night_stand',\n 9: 'dresser'} 10개의 클래스를 가지고 있으며, 각 클래스당 80~190개의 3D CAD Model(polygon mesh)를 가지고 있다.\n\n제공하는 데이터 셋은 3D CAD Model을 가공하여 X, Y, Z 축 정보를 가진 1024쌍의 Point Cloud로 샘플링하여 제공한다.",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "프로젝트 메뉴얼",
      "content": "세종대학교 2020학년도 기계학습 프로젝트 입니다.\n\n_____\n\n# 프로젝트 방향성 이해하기\n\n### 프로젝트의 목적\n\n- 본 프로젝트를 통해 3D 데이터(Point Cloud)를 Handcrafted Feature로 기술하는 법을 알 수 있다.\n- 본 프로젝트를 통해 Feature 성능이 좋아지면 분류 성능이 좋아짐을 알 수 있다.\n- 본 프로젝트를 통해 Feature Representation이 분류기 설계만큼 중요하다는 것을 알 수 있다.\n\n### 프로젝트 주의사항\n- 텀프로젝트 1 ,2와 달리 캐글 노트북을 사용하지 않고 코랩을 사용하여 프로젝트를 진행하길 바란다.\n- 성능향상을 위해 인공신경망 방법은 사용할 수 없다.\n\n### 프로젝트 시작하기\n\n1) 프로젝트 메뉴얼을 자세하게 읽는다\n2) [스켈레톤 코드](https://colab.research.google.com/drive/1m-s0sSvLdK_q79h_-FpntGrULcWODBdD?usp=sharing) 를 자신의 구글 드라이브에 복사한다.\n3) [스켈레톤 코드](https://colab.research.google.com/drive/1m-s0sSvLdK_q79h_-FpntGrULcWODBdD?usp=sharing) 내 [Empty Module] 을 구현한다.\n4) 결과 파일(csv)을 리더보드에 제출한다.\n5) 베이스라인을 넘지 못했다면, 프로젝트 메뉴얼과 스켈레톤 코드의 주석을 천천히 다시 읽어가면서 디버깅 한다.\n\n---------------------------------------------------------------------------------------------------\n\n## [3번째 프로젝트] 3D 데이터 다루기 - 10 가지 종류의 3차원 물체 분류하기\n\n### 개요\n\n이번 텀 프로젝트에서는 Point Cloud로 구성된 3D 물체 데이터로부터 피쳐(Feature)를 추출하고 이를 통해 물체를  분류하는 문제를 풀어보고자 한다. 프로젝트에 사용할 3D 물체 데이터는 그림0과 같으며, Point Cloud 간 연관성을 이용하여 특징을 추출할 예정이다.\n\n![그림0](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F651513%2F71dc6bd9ef46a3dcdc654c70656274ce%2F2020-11-25%20%201.06.58.png?generation=1606234049261695&alt=media)\n그림 0. 같은 종류 다른 형태의 3차원 물체 데이터의 예 (ModelNet dataset 중 의자 데이터)\n\n<br>\n아래의 실험 결과는 Feature의 선택이 분류 성능에 미치는 영향력을 보여주고 있으며, 본 프로젝트에서는 1번 실험을 직접 구현하고자 한다. *NN은 인공신경망 방법론을 의미함.\n\n### without curvature\n|      | Feature  | 성능(Accuracy) |\n|:----:|:--------:|:--------------:|\n| #1  | NormHist[1] + SVM | 0.73678        | \n| #2   | NN(PointNet[2]) + SVM | 0.80176      |\n| #3  | NN(PointNet++[3] + SVM | 0.90418|\n\n### with curvature\n|      | Feature  | 성능(Accuracy) |\n|:----:|:--------:|:--------------:|\n| #1  | NormHist[1](with curvature) + SVM | 0.85682| \n\n\n\n### 3D 센서와 Point Cloud\nPoint Cloud 란 라이다, 댑스 센서 등으로 수집되는 데이터를 말하며, 이러한 센서들은 그림1과 같이 물체에 빛/신호를 보내서 돌아오는 시간을 기록하여 각 빛/신호당 거리 정보를 계산하고 하나의 포인트를 생성한다.\n\n![그림 1](http://www.irobotnews.com/news/photo/201705/10629_24038_64.png)\n그림 1. 3D 센서의 동작 원리 (라이다, ToF 등)\n\nPoint Cloud는 3차원 공간상에 퍼져 있는 여러 포인트의 집합을 의미하며 라이다 센서로 수집된 Point Cloud 데이터와 댑스 센서로 수집된 Point Cloud 데이터는 그림2와 같다. \n\n![그림2](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F651513%2F1160e7d408f00d4d367b5ef93524b90d%2F2020-11-27%20%2011.10.21.png?generation=1606486242169508&alt=media)\n그림2. (좌) 라이다 센서로 수집된 데이터 (우) 댑스 센서로 수집된 데이터\n\n<br>\n3차원 데이터를 시각화를 위해서는 Point Cloud를 polygon mesh 혹은 voxel grid 등의 형태로 가공하여야 하며, 그림3은 그 예시에 해당된다.\n\n![그림3](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F651513%2F2ee5ea8e456c5768fc3a7bc324c66c78%2F2020-11-26%20%203.13.26.png?generation=1606371230845955&alt=media)\n그림 3. 3차원 토끼 모델을 표현하는 3가지 방법-(1) Point Cloud  (2) Mesh (3) Voxel grid \n\n\n### 프로젝트에서 사용되는 Raw 데이터 셋\n- [Princeton ModelNet10](https://modelnet.cs.princeton.edu/) 데이터 셋 \n  - 10 종류 3D 물체 데이터\n  - 원 데이터는 Polygon Mesh 로 제공됨\n  - 데이터는 표면 정보를 구성하는 꼭지점과 Mesh 정보가 들어있음\n\n### 프로젝트에서 제공되는 가공된 데이터 셋\n- 3D Model를 1024 개의 point cloud로 샘플링하여 제공\n- 학습 데이터는 3991 개, 평가 데이터는 908 개로 구성\n- 데이터는 json으로 제공되며, {'points' : [num of point cloud, (x,y,z)] ([1024, 3]), 'label' : label}로 가공되어 제공\n- data.json은 {'train' : train, 'test' : test, 'class map' : class_map}로 train.json과 test.json, class_map.json이 통합되어 담겨져 있음\n\n\n### 프로젝트에서 사용되는 라이브러리 \n- PCL(Point Cloud Library) 은 2D/3D image와 point cloud 를 다루기 위해 제작된 라이브러리이며, 현재는 Colab에서만 사용이 가능하고 Kaggle 에서 사용이 제한되어 있다.\n- 자세한 내용은 다음의 링크를 참고하기 바란다.\n  - https://pointclouds.org/\n\n\n\n## NormHist와 SVM을 이용한 3차원 분류 알고리즘 \n### 1. 데이터 셋 불러오기\n아래와 같이 호출하여 샘플링된 데이터 셋을 로드 할 수 있다. 가공된 데이터는 data 에 저장되어 있다. \n- train = Model10Dataset(data, mode='train')\n- test = Model10Dataset(data, mode='test')\n\n```python\nfrom torch.utils.data import Dataset\n\nclass Model10Dataset(Dataset):\n    def __init__(self, data, mode='train'):\n        self.data = data[mode]\n        self.class_map = data['class map']\n    def __len__(self):\n        return len(self.data)\n    def __getitem__(self, idx):\n        xyz = np.array(self.data[idx]['points'], dtype=np.float32)\n        return {'points':xyz, 'label':self.data[idx]['label']}\n```\n\n###  2. 특징 추출 (Normal Vector Histogram)\n\n이번 프로젝트에서 3D Point Cloud 의 특징을 추출하기 위해 Normal Vector Histogram [1] 를 사용한다. Normal vector histogram은 아래의 그림과 같이 3차원 물체 표면의 normal vector (x, y, z) histogram을 쌓아, 물체의 표면적 특징을 담은 feature에 해당한다.\n![surface_normal.png](https://i.imgur.com/i6n3yEa.png)\n\n### 2-1.Normal Vector 계산 방법 설명\n![normal_vector.png](https://user-images.githubusercontent.com/17797922/41693140-e87b4298-753e-11e8-8d66-0c1ca989e531.png)\n3D point cloud 간의 normal vector를 추정하는 방법은 아래와 같다.\n- (1) 먼저 k개의 point cloud p의 Nearst Neighbor p_k를 획득합니다. \n- (2) (p - p_k) (p - p_k).T로 covariance matrix C를 만듭니다. \n- (3) C로부터 eigenvalues와 eigenvectors를 추정하고 가장 작은 값을 가진 eigenvalues의 eigenvectors를 normal vector로 추정합니다.\n\n```python\n# -------------------------------------\n# [Empty Module #1] Normal Vector Estimation\n# -------------------------------------\ndef normal_estimation(point_array):\n    # ------------------------------------------------------------\n    # 구현 가이드라인 \n    # ------------------------------------------------------------\n    # [1] point cloud x,y,z에 대한 정규화\n    #     point_array의 차원 : (1024, 3)\n    #     정규화에 사용되는 함수 : numpy.linalg.norm, (L2 norm을 사용)\n    # [2] raw data -> pcl 변환. e.g. point = pcl.PointCloud(np.zeros((1024, 3)))\n    # ------------------------------------------------------------\n\n    # ---------------------------\n    # [1] 코드를 작성하세요\n    # ---------------------------\n    \n    # ---------------------------\n    # [2] 코드를 작성하세요\n    # ---------------------------\n\n\n\n\n    # Normals vector 추정 알고리즘\n    feature = point_cloud.make_NormalEstimation()\n\n    # Nearst Neighbor k=3 (Octree Search)\n    feature.set_KSearch(3)\n\n    # Compute\n    normals = feature.compute()\n\n    return normals.to_array().T\n```\n\n\n### 2-2. Normal Histogram 계산 방법 설명\nNormal Histogram 을 쌓는 방법은 BoW와 유사하며, geometric 한 feature를 기술하기 위해 3축 별로 히스토그램을 쌓아 계산합니다.\n\n```python\n# -------------------------------------\n# [Empty Module #2] Compute Normal Histogram\n# -------------------------------------\ndef compute_normal_histograms(normal_vector, nbins=32, nrange=(-1,1)):\n\n    # ------------------------------------------------------------\n    # 구현 가이드라인 \n    # ------------------------------------------------------------\n    # [1] normal_vector_{x, y, z} 축에 대한 histogram을 쌓습니다.\n    #     normal_vector 차원 : (4, 1024) -> (num of point_cloud, (x, y, z, c)) \n    #     사용되는 함수 : np.histogram(), <- nbins, nrange\n    # [2] normal_vector_{x, y, z} 축에 대한 histogram을 concat 합니다.\n    #     사용되는 함수 : np.concatenate()\n    # [3] 각 값들의 histogram을 concat한 hist_concat 정규화\n    #     정규화에 사용되는 함수 : numpy.linalg.norm, (L1 norm을 사용)\n    #     output : normed_features\n    # ------------------------------------------------------------\n\n\n    # ---------------------------\n    # [1] 코드를 작성하세요\n    # ---------------------------\n    \n    # ---------------------------\n    # [2] 코드를 작성하세요\n    # ---------------------------\n    \n    # ---------------------------\n    # [3] 코드를 작성하세요\n    # ---------------------------\n\n    return normed_features\n```\n\n\n\n\n### 3. SVM 분류기 학습하기\nFeature를 추출한 이후  SVC를 통한 분류를 수행합니다. SVC 분류는 수업시간에 다뤘으므로 추가적인 설명은 하지 않겠습니다.\n\n```python\nfrom sklearn.pipeline import make_pipeline\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.svm import SVC\n\nfrom sklearn.metrics import classification_report\nfrom tqdm.notebook import tqdm\n\nmodel10_dataset_tr = Model10Dataset(data, mode='train')\nmodel10_dataset_ts = Model10Dataset(data, mode='test')\n\nx_train, y_train = Normal_Histogram(model10_dataset_tr)\nx_test, y_test = Normal_Histogram(model10_dataset_ts)\n\n# -------------------------------------\n# [Empty Module #4] SVC를 이용한 분류\n# -------------------------------------\n\n# ------------------------------------------------------------\n# 구현 가이드라인 \n# ------------------------------------------------------------\n#  [1] 3D model 클래스간 표면의 normal vector 유사성을 이용한\n#      Normal Histogram을 SVC를 이용하여 분류\n#      y_pred <- SVC를 이용한 test set 예측값  \n# ------------------------------------------------------------\n\n    # ---------------------------\n    # [1] 코드를 작성하세요\n    # ---------------------------\n\n\n\n\n\n```\n\n## 참고 자료\n- [1]  3D object recognition from range images using local feature histograms, CVPR 2001.\n- [2] PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation, CVPR2017\n- [3] Pointnet++: Deep hierarchical feature learning on point sets in a metric space. NeurIPS2017\n\n----\n본 프로젝트는 세종대학교 김태주 조교에 의해 작성되었습니다. (tjkim@rcv.sejong.ac.kr)\n프로젝트와 관련된 문의는 슬랙을 이용해 주세요.\n",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "rules",
      "content": "This is a page where you can include rules that participants must accept before joining. You may wish to include rules like:\n\n - Don't cheat!\n - Apply yourself!\n - Have fun!",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    }
  ]
}