일전에 이미지 분류 모델을 학습하기 위해 파이토치에서 제공하는 MNIST
dataset torchvision.datasets.MNIST
와 CNN
모델 + CrossEntorpyLoss
로스 함수 + Adam
optimizer 를 사용하여 이미지 분류기를 만들어 본 적이 있다.
이제부터는 주어진 데이터셋을 사용하지 않고 직접 데이터셋을 구축하고 전이 학습을 통해 원하는 분류를 하는 이미지 분류 모델을 만들어볼 것이다.
크게 데이터셋 구축과 전이 학습 (Transfer Learning)으로 나눠서 포스팅하고자 한다.
이번 편은 데이터셋 구축절차를 담았다.
절차
1) 주제 선정
2) 데이터 수집
3) 데이터 가공 (데이터 완성)
4) 데이터로 dataset 만들기
특징이 뚜렷한 인물을 구분해보기 위해 마동석, 수지, 유재석
을 레이블로 선정하였다.
부스트캠퍼들과 협업을 통해 데이터를 수집하였고 나는 수지를 담당하였다.
이미지 데이터를 모으기 위해서는 인터넷에 존재하는 여러 플랫폼에서 이미지를 가져와야 한다. 이미지를 일일이 다운하는 것은 비효율적이므로 크롤링 & 자동 다운로드 툴을 사용하였다.
가장 정보가 많은 구글에서 이미지를 가져오기 위해 googleimagesdownload
라는 프로그램을 통해 이미지를 자동으로 다운하였다.
100장 이상 사진을 받기 위해서는 크롤링 도구가 필요하다. 따라서
chromedriver
를 설치하고googleimagesdownload
의--chromedriver
옵션에 설치한 크롬 드라이버 위치를 명시해야 한다.
'수지', '미쓰에이 수지', '배수지', '수지비주얼' 키워드로 각 키워드 당 350 여장의 사진을 다운로드하였다.
이미지하면 떠오르는 인스타그램에도 많은 사진이 있기 때문에 hashtag
로 검색한 첫 태그에서 사진을 가져오는 프로그램을 만들어 사용했다.
'배수지' 키워드로 350 여장의 사진을 다운로드하였다.
구글과 인스타그램을 통해 총 1700 여장의 사진을 수집하였다.
인터넷에서 수집한 사진들 중 학습에 적합한 사진을 골라내는 단계이다.
매뉴얼하게 아래의 룰을 기반으로 사진을 삭제하였다.
과정을 수행하여 1700 장의 사진에서 300 장의 사진만 추려내었다.
협업을 통해 '동석', '수지', '재석' 레이블 각각 300 장의 사진을 선정하였다.
이 데이터들을 학습에 사용할 수 있도록 Dataset 으로 만들 것이다.
구체적으로는 데이터를 통일되게 만들고, 전체 데이터를 일정 비율로 train 과 test 로 분리한다.
먼저 jpg, png 이미지 파일들이 섞여있기 때문에 파일들을 읽어 모두 png 파일로 바꿨다.
sklearn 의 train_test_split
함수를 통해 레이블마다 train 과 test 데이터 비율 (3 : 1) 을 일정하게 만들어준다.
분리된 데이터들은 dataset/train
과 dataset/test
에 위치한다.
from sklearn.model_selection import train_test_split
train_image, test_image, train_target, test_target = train_test_split(dataset[:,0], dataset[:,1], stratify=dataset[:,1],)
나만의 데이터셋을 수집하고 가공하여 모델 학습에 필요한 dataset 완성