{
  "fetched_at": "2026-10-19T07:11:08Z",
  "source_url": "https://www.kaggle.com/competitions/2024-ml-project2/data",
  "pages": [
    {
      "name": "data-description",
      "content": "# Caltech Dataset\n- **Caltech101 데이터 셋**은 101개의 물체와 1개의 Background를 포함하여 총 102개의 class를 가진 데이터 셋이다.\n- train은 102 개의 class를 전부 가지고 있지만, test는 BACKGROUND_Google클래스를 제외한 101개의 class로 이뤄져있다.\n- 제공되는 영상의 csv 파일은 **기존 ([256,256,3] uint8)의 크기를 가지는 2D 이미지 데이터**를 ([196608, 1],uint64)의 csv 형태로 저장된 채 제공된다\n- Label2Names.csv 속에는 각 class에 해당하는 index 정보가 포함되어 있다.. 이를 활용해 Label의 인덱스를 맵핑하는데 사용바란다.\n# 제공되는 데이터 셋 구조\ntrain_csv_v2\n|- classes\n--|-image.csv\n\ntest_csv_v2\n|- image.csv\n\nLabel2Names.csv\nsubmission.csv",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "Description",
      "content": "# 과목 정보\n- 세종대학교 지능기전공학부 기계학습 (최유경 교수)\n* * *\n\n# 프로젝트 방향성 이해하기\n##프로젝트의 목적\n- 본 프로젝트를 통해 **2D 이미지 데이터를 Handcrafted Feature로 기술하는 법**을 알 수 있다.\n\n## 프로젝트 주의사항\n- 성능 향상을 위해 인공 신경망 방법은 사용할 수 없다.\n-  Handcrafted Feature 의 표현력 향상과 분류기의 튜닝을 통한 성능 향상만 인정한다.\n- 성능 향상을 위한 AutoML을 포함하여 수업에 배우지 않은 타 분류기 사용은 금한다. 또한 Skeleton Code에 적시한 분류기 이외의 분류기(본 문제의 경우 SVM) 사용을 금한다. \n  - (이는 Feature Extraction 방법의 다양성으로 성능 향상을 권장하기 위함이다.)\n\n## 프로젝트 시작하기\n- (1) 프로젝트 메뉴얼을 자세하게 읽는다\n- (2) [스켈레톤 코드](https://www.kaggle.com/code/juyeonkim/2024-ml-tp-2d-skeletoncode)를 복사&편집한다.\n- (3) 스켈레톤 코드 내 [Empty Module] 을 구현한다. \n- (4) 결과 파일(csv)을 리더보드에 제출한다.\n- (5) 베이스라인을 넘지 못했다면, 프로젝트 메뉴얼과 스켈레톤 코드의 주석을 천천히 다시 읽어가면서 디버깅 한다.\n\n* * *\n# [텀프로젝트-2] 2D 데이터 다루기 (2D 이미지 분류하기) \n## 데이터셋 설명 - Caltech101 데이터 셋 \n![](https://www.researchgate.net/publication/220744509/figure/fig3/AS:305407886151689@1449826322668/Example-images-from-the-Caltech-101-dataset-26.png)\n- 101종류 영상 데이터 + 백그라운드 영상 데이터 (102번째 종류로 간주) \n- 한 종류당 40장~800장까지 영상이 모아져 있음 - 데이터셋 공식 [링크](https://data.caltech.edu/records/mzrjq-6wc02) \n\n## 리더보드에서 제공되는 가공된 데이터 셋\n- 학습과 테스트 데이터로 제공되는 image_xxxx.csv 는 기존 2D 형태인 RGB영상([256,256,3] uint8)을\n([HxWxChannel,1] = [196608, 1],uint64)의 형태로 가공하여 제공한다.\n- 학습 데이터 : 102개 클래스 X 각 30장 이미지 = 총 **3060장**의 이미지\n- 테스트 데이터 : **1712장**의 이미지\n\n* * *\n\n## 딥러닝 이전 시대를 주름잡던 알고리즘 BoVW \n- 원래 Bag of Words(BoW)는 문서를 분류하기 위한 방법론으로 사용됐다. 즉, 문서 속 단어의 분포를 통해서 문서의 종류를 예측하는 방법론이다. \n- 이러한 방법론을 영상 분류에 적용하기 위해, 그림1 과 같이 \"문서 속 단어의 분포\"를 \"영상의 특징점 분포\"로 변경하여 적용한 방법론이 BoVW(Bag of Visual Words)에 해당 한다.\n- 기존 BoW가 문서 내 단어의 분포를 보고 문서의 라벨을 추측했다면, BoVW는 영상의 특징점(Local Feature) 분포를 보고 영상의 라벨을 추측한다. \n- 설명을 위해 그림 1, 3를 함께 보면, 영상 속에서 특징이라 할 수 있는 (눈,코,입, 턱 등)을 특징점(\"words\") 라고 지칭하고 이를 저장한다. \n- 사실 개념적인 이해를 돕기 위해 특징점을 (눈,코,입 등) 으로 표현했지만, 일반적으로 환경 변화에 강인한 코너, 에지 같은 요소들이 특징점으로 사용된다.\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F651513%2F9b9c39a152ff9656c7fbed85f10906fe%2Fimage3.png?generation=1605112602490005&alt=media) \n[그림 1] BoVW 개념 \n\n## BoVW 알고리즘 설명 ![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F3879542%2F309d819c6b29f7149c8a66e09e0f7da6%2FBow.png?generation=1604901070523914&alt=media) \n[그림 2] BoVW의 흐름도 \n\nBoVW 알고리즘 흐름을 이해를 위해 그림 2를 살펴 보면 아래와 같은 순서로 진행 된다. \n- (1) 각 클래스 사진들의 **특징점(SIFT)**을 검출한 후 모든 특징점을 모은다. \n- (2) 하나로 모은 모든 특징점을 **군집화(Kmeans)** 하여 대표 Visual Words (혹은 Codebook 이라 부름) 를 선정한다. \n- (3) 모든 학습 영상에 대해 Visual Words (Codebook)가 각 영상에 포함된 빈도 (histogram)를 구한다. 이 **Histogram** 이 2D 영상을 표현하는 1D vector 가 된다. \n- (4) 3번 과정을 통해 구한 1D vector (피쳐:Feature)를 SVM으로 학습한다.\n- (5) 앞서 구한 Visual Words 를 이용하여 테스트 영상에 대한 Histogram 을 구하고, 이미 학습된 SVM 을 통해 테스트 영상의 종류를 예측한다.\n\n### 1. 영상 특징 추출 (SIFT) \n#### ```[Empty Module #2] extract_descriptor``` **구현 시 참고**\n- 이미지에서 특징점(visual word)을 추출하는 방법은 여러가지가 있으나 그 중 가장 대표적인 SIFT 알고리즘을 소개한다.\n- Local descriptor 라고도 불리우는 특징점(visual word) 추출 알고리즘 SIFT는 이미지 내 물체의 크기와 회전에 강인하도록 설계되었으며, 이미지 내의 특징점(visual word)이 될 위치를 detect(탐지) 하고 이를 describe(기술) 한다.\n- 기술된 특징점(visual word)은 128차원의 벡터 형태로 구성되며 이를 특징점으로 사용한다.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F3879542%2F47ee45e50d86f04bf4df3fc250bf8cb0%2FBow_1.png?generation=1604903376894286&alt=media) \n[그림 3] BoVW 설명도: 영상 특징점 검출(words 검출) \n\n- 그림 4-1은 SIFT를 이용해 영상의 특징점을 추출한 예시이다. \n- 책을 촬영한 각도, 회전, 조명, 크기가 달라졌어도 책 내부의 비슷한 위치를 특징점으로 가리키는 것을 알 수 있다. \n- 이는 SIFT를 통해 특징점을 추출했을 경우 해당 변화 요소들에 불변한 것을 의미하며 주로 이렇게 환경 변화에 강인하게 추출된 특징점들을 군집화하여 대표 Visual Word를 얻는다. \n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F3879542%2F08d89223aa2fbe3c2677a1c05a33c4ec%2FSIFT.png?generation=1604904329992771&alt=media) \n\n[그림 4-1] SIFT 표현\n- SIFT는 영상 내에서 알고리즘을 통해 환경 변화에 강인한 부분을 찾아내고 이를 특징점으로 추출한다. \n- 그러나 단색의 벽이나 배경, 혹은 단순 에지의 경우 알고리즘에 의해 특징점으로 추출하지 못하게 되는 경우가 생긴다. \n- 이러한 것을 해결하고자, 영상 내의 부분적으로 영상 기술에 도움을 줄 수 있는 정보들을 최대한 활용하기 위해 DenseSIFT가 제안되었다. \n- DenseSIFT는 영상 내 일정 간격의 위치를 특징점으로 선정하고 이에 대해 기술한다. \n- 영상의 부분 정보를 최대한 활용하기에 SIFT를 사용한 BoVW보다 DenseSIFT를 사용한 BoVW가 더 좋은 성능을 보인다. \n- [그림 4-2]는 SIFT와 DenseSIFT의 시각적인 차이를 나타낸다. \n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F3879542%2Fe6decfdd3c78d611a87c8d5e6071ff85%2FSIFT.png?generation=1605022203856596&alt=media) \n[그림 4-2] SIFT와 DenseSIFT 추출 특징점 방식 비교 \n\n### 2. Codebook 생성 \n- 모든 이미지에서 특징점(visual word)을 추출한 뒤 이들 중 대표가 되는 특징점(codebook)을 선정해야한다.\n- 이를 위해 k-means 알고리즘을 사용하며 모든 128차원의 특징점(visual word)을 거리 기준 k개의 군집으로 나누는 방식이며 각 군집의 중심점을 대표 특징점(codebook)으로 사용하는 방식이다.\n- 주의할 점은 학습 데이터 셋에서 특징점(visual word)만을 활용해 대표 특징점(codebook)을 선정해야 한다.\n  - (테스트 데이터 셋에서 얻은 특징점은 codebook의 생성에 관여하면 안된다!!)\n#### (GPU를 사용해야 하기 때문에 꼭 **GPU 를 활성화 한 상태로 코드를 실행**해야 한다!)\n\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F3879542%2F4359c190255960253b37f96f69a0d922%2Fcodevook.png?generation=1604904714473588&alt=media) \n[그림 5] BoVW 설명도 \n\n![](https://user-images.githubusercontent.com/46413594/115646562-564b6600-a35d-11eb-9469-87cd7cf5264d.png) \n[그림 6] Kmeans clustering을 통한 Codebook 생성 \n\n### 3.a (BoVW 기법) Visual words를 이용한 Histogram 생성\n#### ```[Empty Module #3] BoVW``` **구현 시 참고**\n- 지금부터 이야기하는 Histogram은 영상을 대표하는 정보인 전역 특징량(global feature) 에 해당되며, 개념적으로는 그림 7과 같다. \n- 즉, 사람 얼굴 영상은 눈 2개, 코1개로, 자전거 영상은 안장 1개 바퀴 2개로 히스토그램이 구성된다는 것이다. \n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F3879542%2F77ec2160ce96fb8e6a888e02ec9960f3%2FBow_hist.png?generation=1604907320515797&alt=media) \n[그림 7] BoVW 설명도 \n- Histogram Visual words (혹은 Codebook)를 이용하여 영상을 대표하는 Histogram을 구하는 방법을 구체적으로 이야기 하면, 각 영상의 모든 특징점과 codebook을 비교하여, 그 특징점과 가장 유사한 Visual words 의 도수(히스토그램의 Y축)를 높히는 것이다. \n- 영상의 모든 특징점(SIFT descriptor)과 codebook을 비교(L2 distance를 구하여 가장 거리 값이 작은 것)하여 histogram을 생성하면 된다. \n\n\n### 3.b (VLAD 기법) VLAD(Vector of Locally Aggregated Descriptors) 피쳐 추출 방법\n#### ```[Empty Module #4] VLAD``` **구현 시 참고**\n\n![](https://user-images.githubusercontent.com/46413594/115651083-75e68c80-a365-11eb-9590-ddb8a5cfb9d9.png)\n[그림 8] VLAD 기술자 원리 \n\n- BoVW에서는 대표 특징점에 대한 분포를 각 이미지마다 계산해 히스토그램 형식의 feature를 사용한다면,\n- VLAD는 각 이미지 내의 특징점(visual word)들을 대표 특징점(codebook)에 거리 순으로 할당해 **둘 간의 벡터 차이를 계산**한 후 동일한 대표 특징점(codebook)에 할당된 특징점(visual word)의 **벡터 차이 값을 모두 더해주는 방식**으로 feature를 기술하는 방식이다. \n- 이로 인해 BoVW 에서 사용한 특징점(visual word) 추출, 대표 특징점(codebook) 선정까지의 방식은 동일하게 사용된다.\n  - 2번 과정까지는 동일하게 진행되고, 3번 과정에서 3.a와 3.b로 구분된다)\n\n### ++ <3.a (BoVW), 3.b (VLAD) 피쳐 추출 시 적용 가능한 Spatial Pyramid Matching 기법>\n#### ```[Empty Module #5] cut_image``` **구현 시 참고**\n\n![](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2407DA485302FE6009)\n[그림 9] Spatial Pyramid Matching 기법\n\n- 기존 BoVW와 VLAD 방법론은 기본적으로 [그림 9-level 0] 에서 보는 것과 같이 최종 기술자 추출을 위해 이미지 전체에 대해 한번만 계산을 수행한다.\n- 반면, 소개할 Spatial Pyramid Matching 방법은 이미지를 **여러 단계의 resolution으로 분할**한 후 각 단계의 분할 영역 모두를 고려하여 기술자를 추출하게 된다. \n- [그림 9]를 보게 되면 Spatial Pyramid Matching 방법에서는 level 0 뿐만 아니라 추가적으로 이미지를 점진적으로 세분(level 1에서는 2x2로 분할, level 2에서는 4x4로 분할, ...)해 가면서 각각의 분할 영역마다 기술자를 추출해서 합치게 된다.\n   - 3.a의 BoVW 방법론에 적용 시 level 0, 1, 2 각각에서 별도로 히스토그램을 구한 후 , 이들 히스토그램들을 전부 모아서 일종의 피라미드(pyramid)를 형성한다. \n  - 그리고 이렇게 형성된 히스토그램 피라미드들을 합쳐서 최종적으로 기술자를 추출하게 된다.\n  - 여러 resolution에서 구해진 각각의 히스토그램을 모두 합쳐서 한번에 사용한다고 생각하면 된다.\n\n#### Spatial Pyramid Matching 기법의 등장 배경???\n- 기존 Bag of Visual Words 방법은 기본적으로 feature들의 히스토그램(histogram)으로 이미지를 표현한다.\n- 그렇기 때문에 추출한 feature들 간의 기하학적인 위치 관계를 잃어버리는 문제점을 가지고 있다.\n  - 물론 동물 등과 같이 변형이 심한 물체를 인식하는데는 이 특성이 오히려 장점으로 작용한다.\n  - 하지만 자동차 등과 같이 형태가 고정된 물체의 경우에는 성능저하의 큰 요인 중 하나가 될 수 있다.\n- 이를 해결하기 위해 이미지를 점진적으로 분할해서 각 분할 영역마다 기술자를 추출해서 합치는 Spatial Pyramid Matching 기법이 등장했다.\n\n### 4. SVM 분류기 학습하기 \n#### ```[Empty Module #6] SVM``` **구현 시 참고**\n\n- BoVW, 혹은 VLAD를 통해 기술된 feature vector 를 이용해 분류 모델 학습을 진행할 때, 여러분들이 배운 다양한 분류 모델을 적용해 볼 수 있다. \n- 그러나 이번 프로젝트에서는 Bovw와 가장 잘 어울리기로 소문난 SVM 을 사용하기로 한다. \n- 여러분도 잘 알고 있다시피, SVM은 결정 경계(Decision Boundary) 즉 분류를 위한 기준 선을 정의하는 모델이며, 이 모델은 그림 8의 margin 즉 선과 데이터의 최단 거리가 최대로 하기 위한 결정 결계를 찾는 것을 목표로 한다.\n- SVM 을 통해 학습 데이터 간의 결정 경계를 찾고 이를 활용해 테스트 영상의 클래스를 분류한다.\n\n ![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F3879542%2F8c305606c612af03417ef3334e47e575%2FSVM.png?generation=1605013920265537&alt=media) \n\n[그림 10] SVM \n\n### 5. 학습 모델을 이용하여 평가 영상 맞추기 \n- 평가 영상의 라벨(클래스)을 추정하기까지의 과정을 요약하자면 아래와 같다.\n### [모델 학습] \n- 1. 학습 영상들의 특징점(SIFT or Dense SIFT) 검출 \n- 2. 추출된 학습 데이터의 특징점들을 군집화하여 대표되는 특징점을 모아 Codebook 생성 : K-means Clustering \n- 3. 생성된 Codebook과 각 학습 데이터마다의 특징점들을 비교해 Histogram 기술자 생성\n- 4. 학습 데이터의 Histogram 기술자로 SVM의 결정 경계 학습 : SVM \n### [모델 추론] \n- 5. 평가 데이터의 특징점(SIFT or Dense SIFT) 추출 \n- 6. 학습 데이터로 생성된 Codebook과 각 평가 영상 내 특징점들을 비교해 Histogram 생성 \n- 7. 학습 데이터로 기 학습된 SVM을 이용해 평가 데이터의 Histogram 기술자가 속하는 그룹을 선정하고 해당 그룹의 라벨을 할당 \n- 8. 평가 데이터의 라벨 CSV 파일로 기록 \n### [반드시 주의!!!] **6번의 경우 평가 데이터로 Codebook을 재 생성하는 것이 아닌 학습 데이터로 생성된 Codebook을 사용해야한다.** 대부분의 많은 사람들이 이 부분에서 실수를 하곤 함.\n\n* * *\n\n## <베이스라인 정보>\n- DenseX_BoVW_[0] : **0.23481**\n  - 일반 SIFT 사용(Dense X), BoVW 기술자 사용, level 0에서만 기술자 추출\n- Dense_BoVW_[0] : **0.34988**\n  - Dense SIFT 사용, BoVW 기술자 사용, level 0에서만 기술자 추출\n- Dense_BoVW_[0,1,2] : **0.40128**\n  - Dense SIFT 사용, BoVW 기술자 사용, level 0,1,2 모두에서 기술자 추출\n- Dense_VLAD_[0] : **0.49649**\n  - Dense SIFT 사용, VLAD 기술자 사용, level 0에서만 기술자 추출\n\n* * *\n\n## ++성능 향상을 위한 팁\n- SIFT 알고리즘으로 특징점 추출 시, 이미지 내의 픽셀 변화가 큰 부분을 특징점의 위치로 detect하고 이를 describe 하여 특징점을 128차원으로 기술하게 된다. 이러한 detect 과정에서 픽셀 변화가 큰 부분만 찾아내는 것이 아닌 일정 픽셀 간격으로 얻은 위치를 모두 사용해(dense하게 사용) 특징점을 기술하는 방식을 Dense SIFT라고하며 SIFT에 비해 메모리는 더 많이 차지하나 더 높은 성능을 보인다.\n- VLAD에서 얻은 이미지 feature는 총 k*128 (대표 특징점 수 * 기술된 특징점의 차원) 차원으로 구성되어 큰 메모리를 차지한다. PCA(Principal Components Analysis) 방식으로 해당 차원을 줄여 사용하면 분류기를 학습하는데 있어 보다 빠르게 학습할 수 있으며 feature의 노이즈를 줄여주는 효과도 볼 수 있다.\n- **(추가적인 성능 향상 팁은 스켈레톤 코드 최하단부에 적어 놓았으니 참고 바랍니다!)**\n\n* * * \n- 본 텀프로젝트 특성 상 타 문제 대비 **적지 않은 시간이 소요되는 점 참고 바랍니다.**\n\n* * *\n\n\n## 참고 자료 \n- [Spatial Pyramid Matching 논문] [Beyond bags of features spatial pyramid matching for recognizing natural scene categories](https://inc.ucsd.edu/~marni/Igert/Lazebnik_06.pdf) \n- [SIFT 특징량](https://bskyvision.com/21) \n- Scikit-learn에 구현된 kmeans는 CPU 모드만 지원하므로 매우 느림. 따라서 스켈레톤 코드에 제공된 KMeans-GPU 코드 사용할 것 \n\n##코멘트\n- 이 프로젝트는 세종대학교 김주연 조교에 의해 작성되었습니다. (jykim@rcv.sejong.ac.kr)",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "Evaluation",
      "content": "Accuracy",
      "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
    },
    {
      "name": "abstract",
      "content": " ",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    }
  ]
}