[Object Detection] 자주 쓰이는 데이터셋, COCO란?

2022.02.03 23:33 25,232 조회

안녕하세요. jihyeheo입니다:)

오늘 게시글에서는 Object Detection 분야에서 자주 쓰이는 데이터셋을 소개해보려고 합니다.

틀린 부분이나 이상한 부분은 지적해주시면 감사합니다!!




* 본 포스팅은 데이콘 서포터즈 "데이크루 1기" 활동의 일환입니다.

------------------------------------------------------------------------------------------------------------------------------------

제 글의 주 컨텐츠는 Object Detection입니다. 모르시는 분이나 처음 보는 분들을 위해 다시 한 번 설명하고 갈게요!


[Object Detection]

Object Detection은 객체 검출, 감지로 하나의 이미지 안에서 찾는 물체의 개수에 따라 Single-Object Detection과 Multi-Object Detection이 있습니다. Object Detection에서 이미지를 입력했을때 Classification(분류)뿐 아니라 Localization(bounding box)까지 찾아줍니다.

Object Detection 분야의 주 응용분야로는 요즘 핫하게 떠오르는 자율주행이 있습니다. 자율주행 자동차의 핵심은 사람의 눈이라고 불리울 화면을 이야기 하는데요, 객체가 무엇인지 정확하게 판단하여야 주행을 상황에 맞게 할 수 있을 것입니다.

또, 군사목적으로도 사용한다고 해요. 공격용이 아니더라도 방어를 위한 시스템을 구축해야 하기 때문에 Object Detection 기술은 유용하게 쓰일 수 있습니다. 위 링크는 군사목적으로 사용하였을때의 Object Detection입니다. https://www.youtube.com/watch?v=Nrg5WcMN9lU

말고도 다양한 부분에 Object Detection은 사용이 되고 있습니다. 따라서 블루오션이 될 위 분야에 대하여 집중적으로 공부할 필요가 있습니다 :)


[Object Detection dataset - COCO]

사실 Object Detection 논문을 자주 보다보면 dataset을 이용한 검증을 많이 시도합니다.

최근에 제가 리뷰했던 YOLOv3(https://dacon.io/forum/405872)에서도 dataset을 이용한 비교 내용이 들어있습니다.

위 그래프를 보시면 COCO dataset을 기준으로 시간당 mAP를 측정한 모습을 볼 수 있습니다.

대표적인 dataset으로는 PASCAL VOC, MS COCO 등이 있습니다.

오늘 함께 살펴볼 데이터는 COCO dataset입니다! :)



학습을 위해 다양하고 많은 데이터들이 매년 쏟아져서 나오는데 COCO dataset은 Object Detection 뿐만 아니라 Segmentation, Keypoint Detection등을 위해 제공된 dataset입니다.

구글이 공개한 Tensorflow Object Detection API에도 COCO dataset으로 학습시킨 모형이 들어 있습니다.

또한 위 데이터를 이용하여 학습시킨 모형을 바탕으로 fine-tuning하여 조금 더 좋은 성능을 내는 모형으로 만들기도 합니다.

따라서 COCO dataset의 중요성을 인지하며 함께 공부하면 좋을 것 같아 게시글을 작성하게 되었습니다!


[COCO dataset 특징]

ImageNet dataset의 문제점을 해결하기 위해 2014년 제안되었습니다. COCO dataset은 다양한 특징은 다음과 같습니다.

  • 다양한 크기의 물체가 존재하며 높은 비율로 작은 물체들이 존재합니다.
  • 또한, 덜 iconic합니다. 즉, 이미지가 특정 카테고리에 명확하게 속해있지 않다는 의미입니다.
  • 80개의 classes가 있습니다.

" person bicycle car motorcycle airoplane bus train truck boat traffic light fire hydrant stop sign parking meter bench bird cat dog horse sheep cow elephant bear zebra giraffe backpack umbrella handbag tie suitcase frisbee skis snowboard sports ball kite baseball bat baseball glove skateboard surfboard tennis racket bottle wine glass cup fork knife spoon bowl banana apple sandwich orange broccoli carrot hot dog pizza donut cake chair sofa potted plant bed dining table toilet tv laptop mouse remote keyboard cell phone microwave oven toaster sink refrigerator book clock vase scissors teddy bear hair drier toothbrush "


[COCO dataset 다운로드]

다운로드 방법은 다양합니다. Open API가 많기 때문입니다. 오늘 COCO dataset의 shape를 살펴보고 두 가지 방법으로 다운로드를 받아보겠습니다.


1.홈페이지 이용(https://cocodataset.org/#home)

링크를 타고 들어가면 COCO dataset을 다운받을 수 있는 홈페이지에 들어갈 수 있습니다.

홈페이지에 들어가셔서 Dataset -> Download 페이지에 들어갑니다.



다음과 같이 2014년 이후로 년도별로 dataset이 정리가 되어있는 것을 확인할 수 있습니다.

Images 부분이 이미지가 있는 zip 파일이고 Annotations 부분이 정답 label외의 다양한 특징이 들어있는 zip 파일입니다.

저 부분을 다운받아주시면 됩니다.

먼저 val2017.json Annotation 파일을 다운받아 안에 내용을 살펴보겠습니다.

  • caption : 영상에 대한 설명
  • person_keypoints : 사람의 관절 좌표 데이터
  • instance : 영상에 포함된 사람 혹은 사물에 대한 카테고리와 Segmentation 정보


{ "info": { "description": "COCO 2017 Dataset", "url": "http://cocodataset.org", "version": "1.0", "year": 2017, "contributor": "COCO Consortium", "date_created": "2017/09/01" }, "licenses": [ { "url": "http://creativecommons.org/licenses/by-nc-sa/2.0", "id": 1, "name": "Attribution-NonCommercial-ShareAlike License" }, { "url": "http://creativecommons.org/licenses/by-nc/2.0", "id": 2, "name": "Attribution-NonCommercial License" }, ... ], "images": [ { "license": 4, "file_name": "000000397133.jpg", "coco_url": "http://images.cocodataset.org/val2017/000000397133.jpg", "height": 427, "width": 640, "date_captured": "2013-11-14 17:02:52", "flickr_url": "http://farm7.staticflickr.com/6116/6255196340_da26cf2c9e_z.jpg", "id": 397133 }, { "license": 1, "file_name": "000000037777.jpg", "coco_url": "http://images.cocodataset.org/val2017/000000037777.jpg", "height": 230, "width": 352, "date_captured": "2013-11-14 20:55:31", "flickr_url": "http://farm9.staticflickr.com/8429/7839199426_f6d48aa585_z.jpg", "id": 37777 }, { "license": 4, "file_name": "000000252219.jpg", "coco_url": "http://images.cocodataset.org/val2017/000000252219.jpg", "height": 428, "width": 640, "date_captured": "2013-11-14 22:32:02", "flickr_url": "http://farm4.staticflickr.com/3446/3232237447_13d84bd0a1_z.jpg", "id": 252219 }, ... { "segmentation": [ [ 83.22, 632.06, 1.51, 627.52, 1.51, 509.5, 0, 453.52, 102.88, 389.98, 140.71, 370.31, 164.92, 344.59, 178.53, 344.59, 190.64, 379.39, 204.26, 373.33, 208.79, 365.77, 223.92, 373.33, 240.57, 365.77, 211.82, 324.92, 217.87, 303.74, 264.78, 279.53, 338.91, 294.66, 369.17, 294.66, 437.26, 305.25, 447.85, 317.35, 447.85, 337.02, 480, 352.15, 478.11, 632.06, 266.29, 629.03, 51.44, 627.52 ] ], "area": 136955.75629999995, "iscrowd": 0, "image_id": 17899, "bbox": [ 0, 279.53, 480, 352.53 ], "category_id": 67, "id": 119334 }, ...


이런식으로 구성이 되어있습니다. json 파일에서 필요한 부분만 뽑아 다시 정의하는 방법으로 하여 label text를 구성할 수 있습니다.


2.리눅스 이용

두번째로는 이미 명령어가 들어있는 sh파일과 API를 이용하여 COCO dataset을 불러오는 방법이 있습니다.

1) https://github.com/pjreddie/darknet 깃허브에서 darknet/scripts/get_coco_datset.sh 파일을 다운받습니다.

다음과 같은 리눅스 명령어가 모인 sh 확장자를 가진  파일입니다. 따라서 윈도우 cmd에서는 실행하지 못하고 sh를 실행할 수 있는 리눅스에 들어가서 실행을 할 것입니다. 우선 요기 명령어를 해석을 하자면 다음과 같습니다.

# Clone COCO API

git clone https://github.com/pdollar/coco # 깃허브 내용 가져오기

cd coco

mkdir images # 폴더 만들기

cd images


# Download Images

wget -c https://pjreddie.com/media/files/train2014.zip # 웹서버로부터 콘텐츠를 가져오는 명령어 wget

wget -c https://pjreddie.com/media/files/val2014.zip


# Unzip

unzip -q train2014.zip

unzip -q val2014.zip


cd ..

# Download COCO Metadata

wget -c https://pjreddie.com/media/files/instances_train-val2014.zip

wget -c https://pjreddie.com/media/files/coco/5k.part

wget -c https://pjreddie.com/media/files/coco/trainvalno5k.part

wget -c https://pjreddie.com/media/files/coco/labels.tgz

tar xzf labels.tgz

unzip -q instances_train-val2014.zip


# Set Up Image Lists

# awk는 텍스트 처리를 위한 명령어입니다.

# 요 작업이 $PWD가 현재 디렉토리를 가져오고 5k.part 파일에서 '\t'를 기준으로 잘라서 출력한다는 의미입니다.

# 5k.part 파일은 이미지의 파일명이 적혀있습니다.

# 즉, 만들어진 5k.txt는 현재 디렉토리 주소 + 이미지의 파일명입니다.

# 밑에 trainvalno5k.txt도 마찬가지입니다.

paste <(awk "{print \"$PWD\"}" <5k.part) 5k.part | tr -d '\t' > 5k.txt

paste <(awk "{print \"$PWD\"}" <trainvalno5k.part) trainvalno5k.part | tr -d '\t' > trainvalno5k.txt


요런 sh파일을 다운받아서 이를 리눅스 환경에서 실행시키면 다운을 받을 수 있습니다.


내가 시도해보았을땐, 마지막 두 줄인

paste <(awk "{print \"$PWD\"}" <5k.part) 5k.part | tr -d '\t' > 5k.txt

paste <(awk "{print \"$PWD\"}" <trainvalno5k.part) trainvalno5k.part | tr -d '\t' > trainvalno5k.txt

이 부분에 '(' 괄호 에러가 떴었다. 해결책을 찾아봤지만 해결책을 찾기 힘들었고 노가다식으로 하면 될 것 같아서

5k.past 파일을 txt 파일로 만들어 이미지 파일명을 저장하고, 경로들을 다 만들어서 합치는 식으로 하고 있습니다.

해결이 되면 짧게 다음 게시글로 올리겠습니다 ㅠㅠ


2) 리눅스 환경의 Git Bash 다운로드(https://git-scm.com/)

다운로드 페이지에 가서 다운을 받으면 됩니다.

우선 Git Bash가 뭔지 간단하게 설명하면 다음과 같습니다.

사진처럼 왼쪽은 windows cmd이고 오른쪽이 Git Bash입니다. 외관으로 볼 때는 큰 차이가 없죠?!

사실 Git Bash를 깃허브 활동할 때 몇 번 사용하다가 에러가 너무 떠서 사용하지는 않는데 리눅스 환경이 필요해서 이번에 깔아보게 되었습니다.


Git Bash는 스티븐 본이라는 사람이 개발한 최초의 Unix 'Shell program'인 sh의 확장판이라는 의미를 담고 있습니다.

Shell이란 키보드로 입력한 명령어를 운영체제에 전달하여 명령어를 실행하게끔 하는 프로그램입니다.

Git Bash를 설치하는 이유중 하나는 Linux 환경때문인데 Linux가 Unix 계열의 운영체제를 본 떠 만들어졌기 때문입니다. 따라서 Git Bash를 설치하면 Windows에서도 리눅스 명령어를 사용할 수 있게 됩니다.

리눅스 환경이 구축되어 있지 않은 Windows는 Git Bash를 이용해 실행하면 좋다고 합니다.

따라서 설치를 합니다.


3) get_coco_dataset.sh 파일이 있는 폴더로 가서 Git Bash 실행

4) sh get_coco_dataset.sh 명령어 치고 실행

5) 그렇다면 sh파일 안에 명령어처럼 다운이 되고 있습니다.


[결론]

Object Detection에서 많이 쓰는 데이터셋 중 하나인 COCO dataset에 대하여 알아보았습니다.

다운이 다 된 후 관련 폴더에 맞게 데이터 로더를 만들어서 Pytorch에 적용하시면 됩니다 ~~

아직 공부중이라서 이번주에는 업로드가 힘들겠지만 위 과정을 거친 Pytorch를 적용한 YOLO를 가져오겠습니다.

감사합니다!!


[Reference]

[1] Object Detection 예시 : https://89douner.tistory.com/75

[2] COCO dataset 특징 : https://chacha95.github.io/2020-02-27-Object-Detection4/

[3] COCO DATASET https://eehoeskrap.tistory.com/367

[4] Git Bash 설명 : https://parkjh7764.tistory.com/39

로그인이 필요합니다
0 / 1000
sssssun
2022.02.06 03:33

본문에 적힌대로 모델 성능 개선에 유용한 데이터셋인 것 같아요..!  데이터셋을 불러 오는 것이 다소 ... 어려워 보이긴하지만 object detection 을 배우게 된다면 활용해보고 싶어요! 예정해주신 다음 게시글도 기다릴게요 데이터 궁금하네요...  포스팅 잘 읽었습니다:)

jihyeheo
2022.02.18 01:43

사실 저도 데이터셋 불러오는 과정에서 오류가 너무 많이 일어나서 당황했던 기억이 있습니다 ㅠㅠ 그래서 최대한 자세히 풀어본다고 했는데 조금 부족했던 것 같아용 ㅠㅠ 포스팅 잘 읽어주셔서 감사합니다!! :)