최근 GAN(Generative Adversarial Network)에 대해 공부를 하면서 MNIST 손글씨 이미지를 생성하는
기초적인 모델 학습을 해보았습니다.
예전에 인터넷을 보다가 사진을 입력하면 아래와 같이 입력한 사진을 명화 풍 으로 변경해주는 딥러닝 기술이
있다는 것을 알았는데 GAN 과 관련된 정보를 찾아보다가 'CycleGAN'을 이용하여
해당 기능을 수행할 수 있다는것같아서 직접 만들어보기로 했습니다.
CycleGAN 학습을 위한 데이터셋을 구축하려고 'WikiArt (https://www.wikiart.org/)' 에서
'Vincent van Gogh' 의 그림들을 크롤링하고있습니다.
'WikiArt'에는 빈센트 반 고흐의 그림은 총 1931개 입니다.
지난 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 정보를 눌러 버전을 확인
Python 코드를 작성하기에 앞서 'WikiArt' 페이지에서 이미지를 다운로드 하기위해 페이지의 소스를 확인하였습니다.
WikiArt 페이지에 올라와있는 반 고흐의 첫번째 그림을 클릭하여 나온 화면입니다.
관리자도구(F12)를 눌러 페이지 소스를 확인했을때 그림 파일의 src를 확인 할 수 있습니다.
그림의 설명 하단에는 max resolution이 1024x775 사이즈로 나와있지만
해당 src 이미지의 크기는 750x568 사이즈 이기 때문에 해당 src로 이미지를 저장하게 되면
750x568 사이즈의 파일을 저장하게 됩니다.
번거롭지만 얻을 수 있는 최대 해상도의 파일을 다운로드 받기위해 한가지 작업을 더 추가했습니다.
그림 하단부에 'VIEW ALL SIZES'를 클릭하면 해당 그림을 사이즈 별로 다운 받을 수 있게 링크가 걸려있습니다.
아직 Python에 익숙하지 않아(변명..) 무식한 방법으로 아래의 루틴을 반복하는 코드를 짰습니다.
제일 먼저 반 고흐의 그림 목록중 첫번째 그림 사이트에 접속
1. 'VIEW ALL SIZES'를 클릭하고 받을 수 있는 가장 큰 사이즈의 그림 파일 src를 획득, 로컬 디스크에 저장
2. Thumbnail sizes 창을 닫고 다음 그림 페이지로 이동
1 ~ 2 무한 반복
※ 페이지가 로드되었을 때 'VIEW ALL SIZES' 버튼 찾기
class="all-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 창 닫기
class="modal-header-close"
※ 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을 사용해서 크롤링 하게 되는 경우가 생기면 다시 포스팅 하도록 하겠습니다!
'python' 카테고리의 다른 글
(Pytorch) Pytorch를 이용하여 학습한 모델 저장/불러오는 방법 (0) | 2022.04.07 |
---|