딥러닝 학습을 할 때 이미지 데이터나 수치 데이터가 필요한 경우가 있다.
데이터를 사거나 자체적으로 촬영, 녹음을 통해 데이터를 수집할 수도 있지만
API 호출이 가능하면 API를 사용해서 수집할 수 있다.
웹 페이지에서 API 호출을 사용하지 못하는 경우나 제공하지 않는 경우에는
웹 크롤링으로 원하는 정보를 웹 페이지에서 가져오는 작업을 통해 데이터를 수집할 수 있다.
상업적으로 사용하게 되는 경우에는 데이터를 제공하는 측에 연락해서 허가를 받아야한다.
크롤링 도구 가져오기 ▶ 웹 사이트 ▶ 필요한 정보가 있는 구역 선택 ▶ 데이터 저장
- 크롤링 도구 코드에 띄우기
- 오픈 마켓접속 ▶ 예제 ▶ 옥션
- 상품검색
- 상품리스트 가져오기
- 상품리스트에서 필요한 상품명, 가격, 상품링크 출력
이미지라는 데이터는 단편적으로 보이지만 실제로는 매우 많은 데이터를 가진다.
한번 가공하는 과정을 거쳐야 컴퓨터가 좀 더 효율적으로 분석할 수 있다.
이미지 내에서 불필요한 데이터를 줄이고 유의미한 데이터를 정제하는 과정이 필요하다.
이러한 과정을 전처리 알고리즘이라고 한다.
사람도 구분이 안되면 컴퓨터도 이미지를 잘 구분하지 못하므로 제거해줘야 한다.
실제 이미지만 사용해야 하고, 일러스트와 같은 이미지는 제거해야 한다.
필요한 이미지 사이즈로 변경, 회전, 반전 등등 다양한 기법을 통해 이미지를 정제할 수 있다.
이미지를 리사이즈 하면 이미지가 찌부될 수도 있다.
예를 들어 공을 리사이즈 하다보면 타원형이 되기도 한다.
이러한 상황을 막기위해 padding을 붙여서 원본과 비슷한 형태를 유지하면서 리사이즈 한다.
이미지를 조작하는 과정을 통해 딥러닝 모델의 정확도(=성능)를 높일 수 있다.
오후 실습 시간에 과제를 진행하면서 pandas 형태로 데이터를 정리해서 csv 파일로 저장했다.
이 때 keyword를 3개정도로 정해서 진행했었는데,
반복문과 f-string을 적절하게 사용하면 코드를 많이 고치지 않고도 과제 수행이 가능했다.
기본 문법을 어떻게 사용하냐에 따라 코드는 간결하게 많은 것을 수행할 수 있었다.
from selenium import webdriver
from bs4 import BeautifulSoup as bs
import time
# BeautifulSoup : 웹페이지의 정보를 쉽게 스크랩 할 수 있도록 기능을 제공하는 라이브러리
# 키워드 input
search_keyword = "감자칩"
# 크롤링 도구 사용
driver = webdriver.Chrome("./chromedriver.exe")
driver.implicitly_wait(3)
time.sleep(5)
# 오픈마켓 접속
driver.get("http://www.auction.co.kr/")
time.sleep(5)
# 상품검색 : 개발자도구 - copy : xpath, xpath가 무엇인지 찾아보기!
# //*[@id="txtKeyword"]
driver.find_element_by_xpath('//*[@id="txtKeyword"]').send_keys(search_keyword)
time.sleep(2)
# 검색버튼 누르기
# //*[@id="core_header"]/div/div[1]/form/div[1]/input[2]
driver.find_element_by_xpath('//*[@id="core_header"]/div/div[1]/form/div[1]/input[2]').click()
# 상품 리스트 정보 가져오기
html = driver.page_source
soup = bs(html, 'html.parser')
itemlist = soup.findAll('div', {"class" : "section--itemcard"})
time.sleep(5)
# 가져온 상품리스트에서 필요한 상품명, 가격, 상품링크 출력
for item in itemlist:
title = item.find("span", {"class": "text--title"}).text
price = item.find("strong", {"class": "text--price_seller"}).text
link = item.find("span", {"class": "text--itemcard_title ellipsis"}).a['href']
print("상품이름 :", title)
print("상품가격 :", price)
print("상품링크 :", link)
time.sleep(3)
driver.close()
from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys
import pandas as pd
import os
from urllib.request import (urlopen, urlparse, urlretrieve)
# 구글 이미지 URL
chrome_path = "./chromedriver.exe"
# 구글 이미지 검색
base_url = "https://www.google.co.kr/imghp"
# 구글 검색 option
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("lang=ko_kr") # 한국어
chrome_options.add_argument("window-size=1920x1080") # 윈도우 사이즈 조절 = 크롤링 뜨는 창의 크기
# 드라이버 연결
# driver = webdriver.Chrome(chrome_path, chrome_options=chrome_options)
# driver.get(base_url)
# driver.implicitly_wait(3) # elemnet 로드될 때 까지 지정한 시간만큼 대기할 수 있도록 하는 옵션
# driver.get_screenshot_as_file("google_screent.png")
# driver.close()
# 스크롤 기능 - 함수
def selenium_scroll_option():
SCROLL_PAUSE_SEC = 3
# 스크롤 높이 가져옴
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)
# 스크롤 다운 후 스크롤 높이 다시 가져오기
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
a = "상어"
image_name = "shark"
driver = webdriver.Chrome(chrome_path)
driver.get("http://www.google.co.kr/imghp?hl=ko")
browser = driver.find_element_by_name('q')
browser.send_keys(a)
browser.send_keys(Keys.RETURN)
# 오후 수업
# 결과 더 보기 버튼 Xpath 복사
# //*[@id="islmp"]/div/div/div/div[1]/div[2]/div[2]/input
selenium_scroll_option() # 스크롤하여 이미지를 확보
driver.find_element_by_xpath('//*[@id="islmp"]/div/div/div/div[1]/div[2]/div[2]/input').click()
selenium_scroll_option()
# 이미지 저장 src 요소를 리스트업 해서 이미지 URL 저장
image = driver.find_elements_by_css_selector(".rg_i.Q4LuWd")
# 클래스 네임에서 공백은 .을 찍어주기
image_url = []
for i in image:
if i.get_attribute("src") != None:
image_url.append(i.get_attribute("src"))
else:
image_url.append(i.get_attribute("data-src"))
# 전체 이미지 개수
print(f"전체 다운로드한 이미지 개수 : {len(image_url)}")
image_url = pd.DataFrame(image_url)[0].unique()
os.makedirs("./shark", exist_ok=True)
shark = "./shark"
if image_name == 'shark':
for t, url in enumerate(image_url, 0):
print(url)
urlretrieve(url, shark + "\\" + image_name + "_" + str(t) + ".png")
driver.close()
print("완료")
이미지를 크롤링해서 저장한 다음, 정제작업을 수동으로 했는데 너무 힘들었다.
일러스트 이미지와 너무 작은 이미지를 제거해야 했는데,
약 700장씩 되는 이미지를 하나하나 보다보니 일러스트가 눈에 익어서 분류가 되지 않았다.
일러스트를 다 지웠다고 생각했는데,
강사님이 일러스트와 꼬리사진 피드백을 주셔서 그제야 덜 지웠다는 것을 알았다.
정제할 수 있는 코드에 대해 고민해봐야겠다는 생각이 들었다.