2022.5.31 image

정성우·2022년 5월 31일
0

학습한 내용

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)

chrome_path = "./chromedriver.exe"
base_url = "https://www.google.co.kr/imghp"

# 구글 검색 옵션
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("lang=ko_KR")# 한국어
chrome_options.add_argument("window-size=1920x1080")

def selenium_scroll_option() :
    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)
        # 스크롤 다운 후 스크롤 높이 다시 가져옴
        new_height = driver.execute_script(
            "return document.body.scrollHeight")
        if new_height == last_height :
            break
        last_height = new_height

a ='망고','용과','리치','두리안'
image_name = "mango",'dragon','rich','durian'
for i in range(0,4):
    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[i])
    browser.send_keys(Keys.RETURN)

    selenium_scroll_option()# 스크롤 하여 이미지 확보

    # 이미지 저장 src 요소를 리스트업 해서 이미지 url 저장
    image = driver.find_elements_by_css_selector(".rg_i.Q4LuWd")
    # 클래스 네임에서 공백은 . 을 찍어줌

    image_url = []
    for j in image:
        if j.get_attribute("src") != None :
            image_url.append(j.get_attribute("src"))
        else :
            image_url.append(j.get_attribute("data-src"))
            #url이 들어가는 클래스는 src, data-src 두가지

    # 전체 이미지 개수
    print(f"전체 다운로드한 이미지 개수 : {len(image_url)}")
    image_url = pd.DataFrame(image_url)[0].unique()

    # 해당하는 파일에 이미지 다운로드
    os.makedirs("./dataset", exist_ok=True)
    
    for t, url in enumerate(image_url, 0) :
        urlretrieve(url,image_name[i] + "_" + str(t) + ".png")

driver.close()

print("완료")

실행결과

학습한 내용

import os
import torch
import glob
import torch.nn.functional as F
from torch.utils.data import DataLoader
from torch.utils.data import Dataset
import cv2
import numpy as np
from PIL import Image
import math
image_root=r"./dataset/"
file_paths=[]
labels=[]
names=[]    

for filename in os.listdir(image_root):
    file_paths.append(os.path.join(image_root,filename))
    labels.append(filename.split('_')[0])
    names.append(filename)

for path,name,label in zip(file_paths,names,labels) :
    img=cv2.imread(path)
    height,width=img.shape[0:2]
    margin=[np.abs(height-width)//2,np.abs(height-width)//2]

    if np.abs(height-width)%2 != 0:
        margin[0]+=1
    if height<width:
        margin_list=[margin,[0,0]]
    else:
        margin_list=[[0,0],margin]
    if len(img.shape)==3: 
        margin_list.append([0,0])
        margin_img=np.pad(img,margin_list,mode='constant')
        resize_img=cv2.resize(margin_img,(255,255))
        save_path=r"./resizeimg"
        os.makedirs(os.path.join(save_path,label),exist_ok=True)
        print(os.path.join(save_path,label,name))
        cv2.imwrite(os.path.join(save_path,label,name), resize_img)

실행결과

import os
import torch
import glob
import torch.nn.functional as F
from torch.utils.data import DataLoader
from torch.utils.data import Dataset

class MyCustomDatasetImage(Dataset):

    def __init__(self,path):
        #정의
        #glob는 하위폴더로 들어가서 찾을수있게 해준다.
        self.all_data=sorted(glob.glob(os.path.join(path,'*','*.png')))

    def __getitem__(self,index):
        #정의 작성된 내용을 구현
        data_path=self.all_data[index]
        data_split=data_path.split('\\')
        print(data_split)
        data_labels=data_split[1]
        
        labels=0
        if data_labels=='mango':
            labels=1
        elif data_labels=='rich':
            labels=2
        elif data_labels=='dragon':
            labels=3
        elif data_labels=='durian':
            labels=4


        # cv2 PIL 이용해서 이미지 변경 해주시면 됩니다.
        return data_path, labels
        # 정의 작성된 내용을 구현
    def __len__(self):
        # 전체길이를 반환
        return len(self.all_data)

dataset=MyCustomDatasetImage(path='./resizeimg/')
dataloader=DataLoader(dataset,batch_size=2,shuffle=False)
for path, label in dataloader :
    print(path,label)
    # label 은 tensor

학습한 내용 중 어려웠던 점 또는 해결못한 것들

해결방법 작성

학습 소감
간단한 과제였지만 생각보다 어려웠다

0개의 댓글