220523 데이터 증강 기법

이나겸·2022년 5월 23일
0
post-thumbnail

1. 학습내용

웹 크롤링을 사용하는 이유

딥러닝 학습을 할 때 이미지 데이터나 수치 데이터가 필요한 경우가 있다.
데이터를 사거나 자체적으로 촬영, 녹음을 통해 데이터를 수집할 수도 있지만
API 호출이 가능하면 API를 사용해서 수집할 수 있다.
웹 페이지에서 API 호출을 사용하지 못하는 경우나 제공하지 않는 경우에는
웹 크롤링으로 원하는 정보를 웹 페이지에서 가져오는 작업을 통해 데이터를 수집할 수 있다.
상업적으로 사용하게 되는 경우에는 데이터를 제공하는 측에 연락해서 허가를 받아야한다.

  1. 이미지 데이터에서는 데이터가 큰 것, 작은 것, 화소, 화질에 따라 다양하게 존재한다.
  2. 텍스트나 문자에서는 필요없는 것들을 제거하는 작업을 해야한다. (자동, 수동 가능)
    적은 데이터는 수동으로 가능하지만 가능하면 자동화 하는 것이 좋다.
  • 데이터 정제에 대해서는 알고리즘이 따로 정해져있거나 존재하지 않는다.
    들어오는 데이터에 따라 정제 방법이 다르기 때문에 이 부분은 고민해서 만들어야 한다.
  • 웹 크롤링으로 다운로드 받고 데이터를 정제하고 정제된 데이터를 증폭한다.
    데이터가 적을 경우 학습하기 부족하기 때문에 많은 량의 학습을 위해 증폭한다.

웹 크롤링 프로세스

크롤링 도구 가져오기 ▶ 웹 사이트 ▶ 필요한 정보가 있는 구역 선택 ▶ 데이터 저장

  • 크롤링 하는 도구는 다양하다.
    BeautifulSoup, Selenium, Scrapy, Requests 등
  • chromedriver를 다운로드 받는다.
    PC에 설치된 Chrome 버전을 확인하고 설치한다.

웹 크롤링 실습

  • 검색하고 싶은 키워드, 도구를 가져오고, 도구를 이용해서 공격이 아니라는 인식을 위해
    driver.implicitly_wait이나 time.sleep으로 타임을 주면서 들어간다.
  • 접속이 계속 이루어지면 안되니까 타임으로 delay를 줘서 사람이 검색하는 것처럼 만든다.
  • 어디에 많이 사용될까?
    가격 변동 추이 등에 csv로 저장해서 그래프로 그려서 보는 정도로 사용
  1. 크롤링 도구 코드에 띄우기
  2. 오픈 마켓접속 ▶ 예제 ▶ 옥션
  3. 상품검색
  4. 상품리스트 가져오기
  5. 상품리스트에서 필요한 상품명, 가격, 상품링크 출력

데이터 정제 작업

* 이미지 전처리

이미지라는 데이터는 단편적으로 보이지만 실제로는 매우 많은 데이터를 가진다.
한번 가공하는 과정을 거쳐야 컴퓨터가 좀 더 효율적으로 분석할 수 있다.

* 전처리 알고리즘

이미지 내에서 불필요한 데이터를 줄이고 유의미한 데이터를 정제하는 과정이 필요하다.
이러한 과정을 전처리 알고리즘이라고 한다.

* 작업 시 주의할 점

사람도 구분이 안되면 컴퓨터도 이미지를 잘 구분하지 못하므로 제거해줘야 한다.
실제 이미지만 사용해야 하고, 일러스트와 같은 이미지는 제거해야 한다.
필요한 이미지 사이즈로 변경, 회전, 반전 등등 다양한 기법을 통해 이미지를 정제할 수 있다.
이미지를 리사이즈 하면 이미지가 찌부될 수도 있다.
예를 들어 공을 리사이즈 하다보면 타원형이 되기도 한다.
이러한 상황을 막기위해 padding을 붙여서 원본과 비슷한 형태를 유지하면서 리사이즈 한다.
이미지를 조작하는 과정을 통해 딥러닝 모델의 정확도(=성능)를 높일 수 있다.

2. 중요내용

오후 실습 시간에 과제를 진행하면서 pandas 형태로 데이터를 정리해서 csv 파일로 저장했다.
이 때 keyword를 3개정도로 정해서 진행했었는데,
반복문과 f-string을 적절하게 사용하면 코드를 많이 고치지 않고도 과제 수행이 가능했다.
기본 문법을 어떻게 사용하냐에 따라 코드는 간결하게 많은 것을 수행할 수 있었다.

crawling_auction.py

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()

save_animal_pic.py

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("완료")

3. 학습소감

이미지를 크롤링해서 저장한 다음, 정제작업을 수동으로 했는데 너무 힘들었다.
일러스트 이미지와 너무 작은 이미지를 제거해야 했는데,
약 700장씩 되는 이미지를 하나하나 보다보니 일러스트가 눈에 익어서 분류가 되지 않았다.
일러스트를 다 지웠다고 생각했는데,
강사님이 일러스트와 꼬리사진 피드백을 주셔서 그제야 덜 지웠다는 것을 알았다.
정제할 수 있는 코드에 대해 고민해봐야겠다는 생각이 들었다.

0개의 댓글