정말 간만에 글을 쓰게 되었다.
코딩을 딱히 하지 않고 싶었는데 막상 또 필요한 게 생기니 하고 싶어진다.

이번에 하고자 하는 프로젝트는 예술작품에 있는 나무나 사람, 별, 달 등을 구분해내도록 하는 것이다.
사진과 달리 미술작품은 작가마다 표현하는 스타일이 다르고, 사용하는 재료가 다르고, 정형화되지 않았기에(매우 불규칙하고) 딥러닝을 하는데에 적절하지 않다.
물론 시장성이 없기 때문에 잘 연구가 이루어지지 않는 것도 하나의 이유라고 볼 수 있다.
당장 Image Processing은 자율주행, 얼굴인식 잠금해제, 차량 번호판 인식 등 다양한 분야에서 활발하게 사용되고 있는 것만 보아도 알 수 있다.
데이터셋도 방대하고 성능도 매우 좋다. 나는 이런 주목 받지 않는 연구에도

시간을 할애할 여유;
논문을 발표하여 실적을 올릴 수 있는 동기;
시각장애인을 위한 연구라는 사명감;
국가에서 그런 연구를 하라고 주는 인건비, 장학금;

이 있어서 이같은 연구를 할 수 있게 되었으니 얼마나 행운인가!
아무튼 오늘 하루를 할애하여 공부한 것에 대해서 정리한다.

여러 방법들을 찾아보았지만 조코딩님이 정리한 내용이 가장 깔끔하고, 정확하고, 정보의 누락이 적어서(다른 데에서는 몇 가지 중요한 정보를 누락하고 뛰어넘어서 이해하기 어려운 부분이 많았다) 강의를 들으며 주석처리까지 해보았다.

총 세 가지의 코딩으로 나뉜다.

1. 구글 이미지에서 검색된 사진의 큰 이미지의 주소를 불러오는 것
2. 구글 이미지에서 검색된 최초 50개의 항목만을 다운로드
3. 구글 이미지에서 검색된 모든 내용을 다운로드

 

1. 구글 이미지에서 검색된 사진의 큰 이미지의 주소를 불러오는 것

 

기본적으로 이는 selenium을 사용한 것으로, 처음에 selenium을 깔아주어야 한다.
Jupyter를 사용했는데 jupyter notebook 내에서는 다운로드가 되지 않고 anaconda prompt에 들어가서 해주어야 한다.
(매우 기본적인 것일테지만 이것조차도 나는 시행착오를 겪었던 거라서 오랜 시간이 지나도 잊지 않기 위해...!)

pip install selenium

을 아래와 같이 입력해 넣으면 다운로드 및 설치가 진행된다.

 

이미 다운이 되어있으면 아래같이 뜬다.

크롤링이 그냥 자동화된 라이브러리를 사용해서 아주 간편하게 불러오는 것인줄 알았는데 생각보다 코딩스러운 작업들이 많이 이루어지는 것을 볼 수 있었다. 말 그대로 우리가 검색할 때 클릭하는 과정들을 쭉 코딩으로 정리한 것이었다.

크롬 브라우저를 켜는 것부터가 자동화의 단계에 속해 있다. 이를 위해서는 먼저 내가 사용하는 크롬의 버전을 알아야 한다.

크롬 브라우저 오른쪽 위 점 세 개를 눌러서 크롬 정보 확인
버전이 92인것을 확인

Chromedriver라고 검색하면 아래의 링크에 들어갈 수 있다.

https://chromedriver.chromium.org/downloads

 

ChromeDriver - WebDriver for Chrome - Downloads

Current Releases If you are using Chrome version 93, please download ChromeDriver 93.0.4577.15 If you are using Chrome version 92, please download ChromeDriver 92.0.4515.43 If you are using Chrome version 91, please download ChromeDriver 91.0.4472.101 For

chromedriver.chromium.org

 

92 버전은 이것을 다운받으라고 설명

다운받아서 아래와 같이 드라이버의 위치를 지정하고 자동화된 시스템이 이를 켜도록 한다.
##예시 라고 되어있는 부분은 Selenium에 쓰여있는 예제활용코드이다. 이것들을 가져다가 쓴 것이다.

HTML에 대해서 전혀 모르더라도 할 수 있다.
F12 키를 누르면 다음과 같이 엄청난 양의 코드가 있다. 

그중 저 화살표 키를 누르고 사진을 누르면 사진이 지정된 코드의 위치가 뜬다. 여기에 따라서 확인해보면 아래에 설명되어있는 태그들이 보인다.

자세한 설명은 주석 참고. 참고로 아래 코드는 큰 사진의 URL을 불러오는 것까지만의 과정이다. 다음 과정부터가 크롤링이다. 참고로 크롬 드라이버의 경로는 복잡하게 할 것 없이 해당 파일을 클릭하고 아래와 같이 윈도우즈 왼쪽 위에 있는 경로 복사 버튼을 누르면 간편하게 활용이 가능하다. 그대로 dir_driver = 다음에 넣으면 된다.

#조코딩 이미지 웹크롤링 앞부분까지만
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import urllib.request

dir_driver = "" # "" 안에 실제로 크롬 드라이버가 위치의 경로를 표현
driver = webdriver.Chrome(dir_driver)
driver.get("https://www.google.co.kr/imghp?hl=ko&authuser=0&ogbl")
elem = driver.find_element_by_name("q") # 검색창의 name 태그 이름이 q
elem.send_keys("car images") #키보드 입력값 보내기
elem.send_keys(Keys.RETURN) #엔터키 치도록 하는 것
driver.find_elements_by_css_selector(".rg_i.Q4LuWd")[0].click()
#find_ 이후에 element는 하나만, 여러 개는 elements 
#class는 css
#가장 첫 번째 요소를 가져와야 해서 [0]
#이렇게 되면 클릭이 되서 오른쪽에 큰 이미지 뜨게 됨
time.sleep(2) #이렇게 지연시켜주어야 너무 긴 URL이 뜨지 않는다.
driver.find_element_by_css_selector(".n3VNCb").get_attribute("src")
#src 가져오는 방법은 get_attribute
# urllib.request.urlretrieve(imgUrl, "test.jpg")
#다운받도록 하는 것


##예시
# assert "Python" in driver.title
# elem = driver.find_element_by_name("q")
# elem.clear()
# elem.send_keys("pycon")
# elem.send_keys(Keys.RETURN)
# assert "No results found." not in driver.page_source
# driver.close()

 

 

나는 당장은 많은 이미지를 활용할 계획이 없어서 아래의 내용까지만을 사용해 50개의 이미지를 다운받았다.
참고로 다운이 받아지는 경로는 주피터 노트북이 있는 그 파일 내에 있다.
나의 경우 User라는 폴더 안에 있는 내 계정 폴더에 들어가 있었다.

#조코딩 이미지 크롤링 by ChromeBrowser
#50개까지만 다운로드
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import urllib.request

dir_driver = "" # "" 안에 실제로 크롬 드라이버가 위치의 경로를 표현
driver = webdriver.Chrome(dir_driver)
driver.get("https://www.google.co.kr/imghp?hl=ko&authuser=0&ogbl")
elem = driver.find_element_by_name("q") # 검색창의 name 태그 이름이 q
elem.send_keys("tree photos") #키보드 입력값 보내기
elem.send_keys(Keys.RETURN) #엔터키 치도록 하는 것
images = driver.find_elements_by_css_selector(".rg_i.Q4LuWd")
count = 1
for image in images:
    image.click()
    #find_ 이후에 element는 하나만, 여러 개는 elements 
    #class는 css
    #가장 첫 번째 요소를 가져와야 해서 [0]
    #이렇게 되면 클릭이 되서 오른쪽에 큰 이미지 뜨게 됨
    time.sleep(2) #이렇게 지연시켜주어야 너무 긴 URL이 뜨지 않는다.
    imgUrl = driver.find_element_by_css_selector(".n3VNCb").get_attribute("src")
    #src 가져오는 방법은 get_attribute
    urllib.request.urlretrieve(imgUrl, "Tree" + str(count) + ".jpg")
    #다운받도록 하는 것
    count = count + 1


##예시
# assert "Python" in driver.title
# elem = driver.find_element_by_name("q")
# elem.clear()
# elem.send_keys("pycon")
# elem.send_keys(Keys.RETURN)
# assert "No results found." not in driver.page_source
# driver.close()

 

3. 구글 이미지에서 검색된 모든 내용을 다운로드

 

마지막 과정은 자동으로 스크롤해서 검색된 모든 이미지들을 뜨게 하고 그 내용들을 모두 저장한다.

#조코딩 이미지 크롤링 by ChromeBrowser
#50개까지만 다운로드
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import urllib.request

dir_driver = "" # "" 안에 실제로 크롬 드라이버가 위치의 경로를 표현
driver = webdriver.Chrome(dir_driver)
driver.get("https://www.google.co.kr/imghp?hl=ko&authuser=0&ogbl")
elem = driver.find_element_by_name("q") # 검색창의 name 태그 이름이 q
elem.send_keys("tree photos") #키보드 입력값 보내기
elem.send_keys(Keys.RETURN) #엔터키 치도록 하는 것

SCROLL_PAUSE_SEC = 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_SEC) #1초간 로딩까지 기다린다.

    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height: 
        #두개가 같다는 건 같아서 이제 스크롤을 더 내릴 필요 없다는 것
        #??결과더보기를 조금만 하려면 for문을 다시 돌리면 되겠지??
        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()
        #find_ 이후에 element는 하나만, 여러 개는 elements 
        #class는 css
        #가장 첫 번째 요소를 가져와야 해서 [0]
        #이렇게 되면 클릭이 되서 오른쪽에 큰 이미지 뜨게 됨
        time.sleep(2) #이렇게 지연시켜주어야 너무 긴 URL이 뜨지 않는다.
        imgUrl = driver.find_element_by_css_selector(".n3VNCb").get_attribute("src")
        #src 가져오는 방법은 get_attribute
        #class 이름인 ".n3VNCb" 로 할 경우 다른 데에 중복이 있어서 오류가 뜨기도 한다.
        #따라서 아랫줄과 같이 정확도를 위해서 copy full path를 사용하는 것도 방법이다.
        #/html/body/div[2]/c-wiz/div[3]/div[2]/div[3]/div/div/div[3]/div[2]/c-wiz/div/div[1]/div[1]/div[2]/div[1]/a/img
        #대신 그렇게 되면 아래와 같이 바꿔야 한다.
            #dir_xpath = "/html/body/div[2]/c-wiz/div[3]/div[2]/div[3]/div/div/div[3]/div[2]/c-wiz/div/div[1]/div[1]/div[2]/div[1]/a/img"
            #driver.find_element_by_xpath(dir_xpath).get_attribute("src")
        urllib.request.urlretrieve(imgUrl, "Tree" + str(count) + ".jpg")
        #다운받도록 하는 것
        count = count + 1
    except:
        pass # 여러번 돌리게 되면 오류가 발생하기도 한다. 그래서 오류나면 pass
driver.close() #모든 이미지를 다운받고나서는 창을 닫는다.


##예시
# assert "Python" in driver.title
# elem = driver.find_element_by_name("q")
# elem.clear()
# elem.send_keys("pycon")
# elem.send_keys(Keys.RETURN)
# assert "No results found." not in driver.page_source
# driver.close()

 

덕분에 딥러닝에 활용할 사진들을 대략 모았다.
Tree와 Car 사진을 학습한 인공지능이 새로 보여주는 사진을 얼마나 잘 맞출 것인지가 관건이다.

 

출처: https://www.youtube.com/watch?v=1b7pXC1-IbE 

 

+ Recent posts