또자의 코딩교실

[2차 프로젝트] 데이터 수집 및 전처리 본문

코딩공부/프로젝트 진행

[2차 프로젝트] 데이터 수집 및 전처리

또자자 2022. 1. 17. 12:18

 Source of data collection

기존 데이터 수집 단계

[현재 확정된 할일]
~ 21/12/21 강아지 데이터 수집(웹 크롤링) 및 데이터 전처리(확실히 전처리) : 실사와 그림데이터 수집. 추후 자세한 사항 안내 예정.
~ 21/12/21 github, google에서 오픈소스 참고자료 찾기

 

[GAN 모델링 2021/12/18]
- 기획발표 시안 : pix2pix 딥러닝 모델 사용
(pix2pix : 전&후 사진을 모두 넣어서 학습)
(StyleGAN : 후 사진을 넣어서 학습)
(CariGeoGAN >> CariGeoGAN(pix2pix의 특성을 가짐)와 CariStyleGAN(StyleGAN의 특성을 가짐))

각자 되는만큼 [강아지] 데이터를 pix2pix에 사용하기에 알맞은 전/후 데이터를 수집이 목표

 

[데이터 수집 권장사항 - 2021/12/22자]
1. 실사사진과 캐릭터사진이 거의 안바뀐 데이터가 가장좋다
2. 측면/ 얼굴만 있는거 상관없이 데이터는 있을수록 학습에 도움된다
3. 현재는 강아지 사진만 모으면 된다

 

[2022/01/17자]

1. CartoonGAN - diyaCartoonGAN을 사용함. 

필요한 데이터

- 이미지 

- 이미지 블러처리

- 실사 강아지

(모든 데이터들은 사이즈가 같아야한다.)

 

이미지 

- 강아지 emoji

- 영화 ( 마이펫의 이중생활)

- 애니메이션( 지브리 - 하울의 움직이는성, 센과 치히로의 행방불명, 이웃집 토토로) 각 3000장 씩

 

 

실사 강아지 

- DogFaceNet

- Stanford Dog Dataset

 

 사용도구

  • 이미지 수집 - Python Web Crwaling - Beautiful soup, Selenium
  • 이미지 전처리(resize) - OpenCV
  • 이미지 블러(가우시안 블러) - OpenCV

 

 

이미지 수집 코드 - 1 

Beautiful Soup 사용해서 Dog emoji 크롤링하기

!pip install requests
!pip install bs4
!pip install tqdm
import requests as req
from bs4 import BeautifulSoup as bs

#ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

#URL 지정

url = "https://emojipedia.org/dog-face/"
res = req.get(url)
res

# 이미지 태그 파싱

doggy_DOM = bs(res.text, 'html.parser')
doggy_img_list = doggy_DOM.select('div.vendor-image img')

doggy_img_list

#ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

# src 태그만 tag list에 append

doggy_new_list=[]

for img_tag in doggy_img_list :
    doggy_new_list.append(img_tag.get('src'))
    print(img_tag.get('src'))
doggy_new_list

#ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

# 쓸모없는 데이터 지우기

# 기본 리스트 
print('삭제 전 개수 : {}'.format(len(doggy_new_list)))

# 삭제할 원소 집합 생성 
rm_set = {'/static/img/lazy.svg'} 

# 리스트 컴프리헨션 활용: 삭제할 원소 집합 데이터와 일일이 비교 
dog_src_list = [i for i in doggy_new_list if i not in rm_set] 
print('삭제 후 개수 : {}'.format(len(dog_src_list)))

#ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

# 이미지 확인
from tqdm import tqdm 
import time 
for img_tag in dog_src_list :
    print(img_tag)
    
#ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

#이미지 저장
#숫자 17까지 들어가있는 사진 이름 리스트를 만듦
#img src만 있는 리스트와 함께 딕셔너리 형태로 만듦
#딕셔너리의 key value값에 따라 저장
    
from urllib.request import urlretrieve  
name_list = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]

for n in name_list:
    print(n)

    
file_list = []    
for img_tag in dog_src_list :
    file_list.append(img_tag)    
        
dic = {}
for i in range(len(name_list)):
    dic[name_list[i]] = file_list[i]
    
for i, j in dic.items():
    save_path = "./images/{}.png".format(i)   
    urlretrieve(j, save_path) #다운받을 url, 저장할 폴더 경로 및 파일이름등을 가져오게 됨

 이미지 수집 코드 - 2

Selenium 사용해서 Dog emoji 크롤링하기

!pip install selenium
from selenium import webdriver as wb # 드라이버를 제어하기위한 모듈
from selenium.webdriver.common.keys import Keys # 키보드 제어
import time # 시간제어
import os
import re
from time import sleep
import urllib.request
import time
from bs4 import BeautifulSoup as bs
from selenium import webdriver
from selenium.common.exceptions import ElementNotInteractableException
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
import requests

driverPath = "C:\chromedriver\chromedriver.exe"
driver = webdriver.Chrome(driverPath)

#ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

url = "https://www.iconfinder.com/search?q=dog+face"
driver.get(url)
res = req.get(url)
res

#ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

doggy_DOM = bs(res.text, 'html.parser')
doggy_img_list = doggy_DOM.select('div.icon-preview-img img')
print(len(doggy_img_list))

import pandas as pd
from pandas import DataFrame

df = DataFrame(doggy_img_list)
df.isnull().sum(axis=1)

doggy_new_list=[]

for img_tag in doggy_img_list :
    doggy_new_list.append(img_tag.get('src'))
    print(img_tag.get('src'))

doggy_new_list

#ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

from urllib.request import urlretrieve  
name_list = []

for i in range(18, (96+17)):
    name_list.append(i)
    
file2_list = []    
for img_tag in doggy_new_list :
    file2_list.append(img_tag)    
        
dic = {}
print(len(name_list))
print(len(file2_list))
    
for i in range(len(name_list)):
    dic[name_list[i]] = file2_list[i]
    
dic

#ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

for i, j in dic.items():
    save_path = "./images/{}.png".format(i)   
    urlretrieve(j, save_path) #다운받을 url, 저장할 폴더 경로 및 파일이름등을 가져오게 됨

 이미지 수집 코드 - 3

OpenCV 사용해서 다운받은 영화 스크린샷 저장하기

  • 저장할 영화
    • 마이펫의 이중생활(2016)
!pip3 install thread6

import cv2
import time
import threading

try:
    print("camera run")
    cap = cv2.VideoCapture("./data/images/The.Secret.Life.of.Pets.2016.mkv") #캡쳐할 영화가 있는 경로를 지정
except:
    print("run error")
    
cap.set(3, 1080) #3: 가로
cap.set(4, 1920) #4: 세로

cnt = 0

while True:
    #카메라로부터 비디오 파일을 읽고 프레임(frame)과 읽기여부(ret)를 반환
    ret, frame = cap.read()
    
    if not ret:
        print("video read error! 구동창을 닫습니다.")
        cap.release() #close()메소드 #구동한 cap객체를 해제 카메라 닫는 역할
        cv2.destroyAllWindows()
        break 
        
    #성공했을 경우 비디오 재생 #frame
    #색깔을 입혀서 보여주기 위해 color 변수 설정
    color = cv2.cvtColor(frame, cv2.COLOR_RGB2BGRA)
    cv2.imshow('video', frame)
    
    k = cv2.waitKey(30) #30 = 키 입력을 대기하는 함수. 0.03초 동안 키 입력을 대기
    
    if k == 50: #아스키 코드. 키보드 2를 누르면 캡쳐됩니다.
        cnt = cnt+1
        print("test{}.png".format(cnt))
        cv2.imwrite("test{}.png".format(cnt), frame, params = [cv2.IMWRITE_PNG_COMPRESSION, 0])
        
    
    if k == 49: #k==49 : 49는 숫자 1을 의미(아스키 코드)
        cap.release() #구동한 cap 객체를 해제
        cv2.destroyAllWindows()
        break

 

 

 이미지 전처리 코드 - 가우시안 블러

!pip install opencv-python
import os
import glob
import numpy as np
import pandas as pd
import cv2
from PIL import Image

#ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

path = 'images/'

im_size = 256 

images = []

for file in os.listdir(path):
        img = cv2.imread(path + '/' + file)  # reading that image as array
        img = cv2.resize(img, (im_size, im_size)) #이미지 사이즈 조절
        
        dst = cv2.GaussianBlur(img, (0, 0), 1.5) #1.5는 블러 강도
        print(img.shape)
                
        images.append(img)
        # Save the image in Output Folder
        cv2.imwrite(str(file) + '_resized.png', img)
        cv2.imwrite(str(file) + '_blur.png', dst)

>> 블러 처리 결과

(좌) - resized 원본 // (우) - 가우시안 블러 적용

 

 

이미지를 누르면 스마트인재개발원 페이지로 이동합니다.

 

Comments