학습한 내용
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
학습한 내용 중 어려웠던 점 또는 해결못한 것들
해결방법 작성
학습 소감
간단한 과제였지만 생각보다 어려웠다