python

CycleGAN 학습을 위해 python으로 이미지 크롤링하기(wikiart, Vincent van Gogh, selenium)

친환경입냄새 2022. 4. 8. 15:13

최근 GAN(Generative Adversarial Network)에 대해 공부를 하면서 MNIST 손글씨 이미지를 생성하는

기초적인 모델 학습을 해보았습니다.

 

GAN을 이용하여 생성한 MNIST 손글씨

 

예전에 인터넷을 보다가 사진을 입력하면 아래와 같이 입력한 사진을 명화 풍 으로 변경해주는 딥러닝 기술이

있다는 것을 알았는데 GAN 과 관련된 정보를 찾아보다가 'CycleGAN'을 이용하여

 

해당 기능을 수행할 수 있다는것같아서 직접 만들어보기로 했습니다.

 

이미지 출처(무이 메이커스) : https://honeycomb-makers.tistory.com/19

 

CycleGAN 학습을 위한 데이터셋을 구축하려고 'WikiArt (https://www.wikiart.org/)' 에서

 

'Vincent van Gogh' 의 그림들을 크롤링하고있습니다.

 

'WikiArt'에는 빈센트 반 고흐의 그림은 총 1931개 입니다.

출처 : WikiArt.org

지난 3년간 C++만 사용하다 Python을 사용한지 얼마 되지 않아 요리조리 찾아보다가 'Selenium' 모듈을 사용해서 

 

웹 이미지를 다운받는 방식을 적용했습니다.

 

 

우선 python 코드가 실행되는 폴더에 'Chrome Driver.exe' 파일을 다운받습니다.

(같은 폴더에 있어야 python코드에서 위치 지정이 쉬움!)

 

크롬 드라이버는 아래 사이트에서 다운로드 가능합니다.

 

https://chromedriver.chromium.org/downloads

 

ChromeDriver - WebDriver for Chrome - Downloads

Current Releases If you are using Chrome version 101, please download ChromeDriver 101.0.4951.15 If you are using Chrome version 100, please download ChromeDriver 100.0.4896.60 If you are using Chrome version 99, please download ChromeDriver 99.0.4844.51 F

chromedriver.chromium.org


※ 크롬 드라이버를 다운 받을 때 사용중인 크롬 브라우저의 버전과 같은 버전을 다운받아주세요

 

※ 크롬 브라우저 버전 확인하는 방법

1. 크롬 브라우저 설정 페이지 이동( chrome://settings/help )

2. 좌측 하단에 Chrome 정보를 눌러 버전을 확인

크롬 버전이 100.0.4896.75인 상태

 

크롬 브라우저와 같은 버전인 ChromeDriver 100.0.4896.60 다운로드


Python 코드를 작성하기에 앞서 'WikiArt' 페이지에서 이미지를 다운로드 하기위해 페이지의 소스를 확인하였습니다.

 

WikiArt에 올라와 있는 Vincent van Gogh의 그림 목록 중 첫번째 그림 (출처 : WikiArt.org)

WikiArt 페이지에 올라와있는 반 고흐의 첫번째 그림을 클릭하여 나온 화면입니다.

 

 

관리자도구(F12)를 눌러 페이지 소스를 확인했을때 그림 파일의 src를 확인 할 수 있습니다.

출처 : WikiArt.org

 

그림의 설명 하단에는 max resolution이 1024x775 사이즈로 나와있지만

 

해당 src 이미지의 크기는 750x568 사이즈 이기 때문에 해당 src로 이미지를 저장하게 되면

 

750x568 사이즈의 파일을 저장하게 됩니다.

 

번거롭지만 얻을 수 있는 최대 해상도의 파일을 다운로드 받기위해 한가지 작업을 더 추가했습니다.

 

출처 : WikiArt.org

그림 하단부에 'VIEW ALL SIZES'를 클릭하면 해당 그림을 사이즈 별로 다운 받을 수 있게 링크가 걸려있습니다.

출처 : WikiArt.org

 

아직 Python에 익숙하지 않아(변명..) 무식한 방법으로 아래의 루틴을 반복하는 코드를 짰습니다.

 

제일 먼저 반 고흐의 그림 목록중 첫번째 그림 사이트에 접속

 

1. 'VIEW ALL SIZES'를 클릭하고 받을 수 있는 가장 큰 사이즈의 그림 파일 src를 획득, 로컬 디스크에 저장

2. Thumbnail sizes 창을 닫고 다음 그림 페이지로 이동

 

1 ~ 2 무한 반복


※ 페이지가 로드되었을 때 'VIEW ALL SIZES' 버튼 찾기

페이지가 로드되었을 때 'VIEW ALL SIZES' 버튼 찾기

class="all-sizes"


※ Thumbnail sizes 창이 떴을때 '가장 큰 해상도 이미지' 링크 찾기

Thumbnail sizes 창이 떴을때 '가장 큰 해상도 이미지' 링크 찾기

class="thumbnail-item ng-scope"가 Size별 개수 만큼 존재

 

※ 가장 큰 이미지는 class="thumbnail-item ng-scope" 리스트 중 마지막

-> thumbnail[-1]

 

"thumbnail-item ng-scope" 하위 class="hidden-blank ng-binding"

 

class="hidden-blank ng-binding"에서 href 속성 => Image를 받을 수 있는 URL


※ 이미지 저장 후 Thumbnail sizes 창 닫기

이미지 저장 후 Thumbnail sizes 창 닫기

class="modal-header-close"


※ Thumbnail sizes 창을 닫고 나서 다음 그림 페이지로 이동하기

Thumbnail sizes 창을 닫고 나서 다음 그림 페이지로 이동하기

class="wiki-breadcrumbs-btns-next" 의 href 속성 => 다음 페이지 링크


위 작업을 반복하는 소스는 아래와 같습니다.

from selenium import webdriver
from selenium.webdriver.common.by import By

import time
import urllib.request

# Chrome Driver 실행
driver = webdriver.Chrome('chromedriver.exe')

count = 0
# 1번째 그림 주소
pageUrl = 'https://www.wikiart.org/en/vincent-van-gogh/the-goat-herd-1862'

while True:
	# pageUrl 로 페이지 이동
    driver.get(pageUrl)

	# 페이지가 로딩되는 동안 잠시 대기
    time.sleep(3)

	# 그림 페이지에서 'VIEW ALL SIZES' 버튼을 탐색
    allsizeBtn = driver.find_elements(by=By.CSS_SELECTOR, value='.all-sizes')
	
    # elements 로 탐색하여 리스트로 반환됨
    allsizeBtn[0].click()

	# thumbnail sizes 창이 로딩되는 동안 잠시 대기
    time.sleep(2)

	# thumbnail container 탐색
    thumbnail = driver.find_elements(by=By.CSS_SELECTOR, value='.thumbnail-item.ng-scope')

	# 마지막(해상도 가장 큰) 이미지 링크 가져오기
    imgURL = thumbnail[-1].find_element(by=By.CSS_SELECTOR, value='.hidden-blank.ng-binding').get_attribute('href')
    
    # 가져온 링크로 이미지 저장 
    # python 코드가 있는 폴더에 있는 'image_5' 폴더에 저장
    urllib.request.urlretrieve(imgURL, 'image_5/image_{}.jpg'.format(str(count)))
    count += 1

	# 이미지 저장 후 잠시 대기
    time.sleep(2)

	# thumbnail sizes창 닫기 버튼 탐색 후 클릭
    closeBtn = driver.find_element(by=By.CSS_SELECTOR, value='.modal-header-close')
    closeBtn.click()
	
    # 다음 페이지 이동하는 버튼 탐색
    nextBtn = driver.find_elements(by=By.CSS_SELECTOR, value='.wiki-breadcrumbs-btns-next')
	
    # 페이지 하단부에도 다음 페이지로 이동하는 버튼이 하나 더 있어서 2개가 탐색됨
    # 첫번째 버튼의 링크 가져오기
    pageUrl = nextBtn[0].get_attribute('href')

    time.sleep(3)

 

상당히 조잡한 코드입니다...

 

느릿느릿하지만 한장씩 다운을 잘 받아줍니다...

 

※ 빠르게 크롤링 하고싶으신 분들은 다른 방법을 찾아보시는게 나을것같습니다..

 

가끔 페이지 로딩이 늦어지거나 무슨 문제가 생기는지 중간에 한번씩 끊기긴 하지만 그래도 잘 받아오는 것 같습니다...

 

 

자동으로 페이지를 넘겨가며 이미지를 다운받는중...

 

실제 크롬 드라이버를 실행하지 않고 이미지만 슉슉 다운받을 수 있는 크롤링 방법도 있겠지만

 

크롤링 작업을 처음 해보면서 눈으로 보이는게 재밌어서 selenium을 사용해보았습니다.

 

나중에 beautifulsoup을 사용해서 크롤링 하게 되는 경우가 생기면 다시 포스팅 하도록 하겠습니다!