Project

남녀 얼굴을 분류하는 딥러닝 모델 구현 - 1 (데이터 셋 만들기)

우준세 2021. 8. 20. 10:25
728x90
반응형

 

이때까지 딥러닝을 공부하면서 사용했던 데이터셋들은 Tensorflow에서 제공해주는 CIFAR10만 사용하였습니다.

이번에는 데이터 수집 - 전처리 - 모델링 과정으로 직접 구현해보겠습니다. 

 

GOAL

- 직접 데이터를 크롤링하여 데이터 셋을 만들고 전처리 과정 경험

- 직접 만든 데이터를 가지고 CNN 분류 모델 구현


DATASET

- 먼저 남자와 여자 얼굴 사진으로 데이터 셋을 만들기 위해 크롤링을 했습니다. 

- 먼저 구글로 크롤링을 하였고 하기 전에 구글 드라이브를 운영체제에 맞게 다운 받아줘야 합니다. 

https://chromedriver.chromium.org/downloads

 

- 코드는 조코딩님의 코드를 참고하여 필요한 부분을 바꿨습니다. 

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import urllib.request

driver = webdriver.Chrome()
driver.get("https://www.google.co.kr/imghp?hl=ko&tab=wi&authuser=0&ogbl")
elem = driver.find_element_by_name("q")
elem.send_keys("크롤링할 사진 키워드")
elem.send_keys(Keys.RETURN)

SCROLL_PAUSE_TIME = 1
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(SCROLL_PAUSE_TIME)
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        try:
            driver.find_element_by_css_selector(".mye4qd").click()
        except:
            break
    last_height = new_height

images = driver.find_elements_by_css_selector(".rg_i.Q4LuWd")
count = 1
for image in images:
    try:
        image.click()
        time.sleep(2)
        imgURL = driver.find_element_by_css_selector(".n3VNCb").get_attribute('src')
        opener=urllib.request.build_opener()
        opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36')]
        urllib.request.install_opener(opener)
        urllib.request.urlretrieve(imgURL, '크롤링 성공한 사진 저장 위치/image_{}.jpg'.format(str(count)))
        count = count + 1

        if count == 100: 
            break

    except:
        pass

driver.close()

 

- 결과)

 


- "한국 남자 연예인 얼굴 사진"을 키워드로 크롤링한 결과입니다. 

보시면 얼굴만 크롤링한 것이 아니라 여러 얼굴이 들어간 사진 어깨 아래로 들어간 사진 등 데이터로 쓰기에는 조금 무리가 있어 보입니다. 그래서 저는 얼굴만 크롭 해서 데이터 셋을 만들고자 했습니다.

 

autocrop의 발견 

- 검색 중 얼굴만 크롭 해주는 파이썬 라이브러리를 찾아 적용해 보았는데 나름 만족스러운 결과가 나와 데이터 셋에 사용하기로 하였습니다.

 

- autocrop -i 크롭 할 사진 폴더 -o 성공한 크롭 사진 폴더 -r 실패한 크롭 사진 폴더 -w 넓이 -H 높이 

위의 명령어로 cmd에서 사용하면 빠르고 나름 정확하게 크롭이 되는 것을 확인할 수 있었습니다.

 

 

- 하지만 autocrop을 써도 정확하게 분류가 되지 않거나 섞이므로 일일이 확인하여 만들어야 합니다.

이 과정이 생각보다 오래 걸렸습니다. 

 

그 결과 남자와 여자 연예인 얼굴 사진을 각각 1000장 정도로 구성했습니다. 

 

이제 이 사진들을 train과 test로 랜덤으로 구분하여 폴더를 나누는 작업을 해야 합니다.


 

- 맨날 공부할 때는 준비된 데이터 셋으로 구현하다가 직접 데이터 셋을 만들어 보니 구하기도 어렵고

생각보다 깔끔한 데이터 세트는 나오지 않은 것 같습니다.

 

- 이제 이 데이터 셋을 train과 test로 구분하고 VGGNet16으로 분류하는 작업을 계속해보겠습니다! 

728x90
반응형