빅데이터 분석 (2주차) 9월9일
Path, 이미지 크롤링과 CNN모델
from fastai.data.all import *
from fastai.vision.all import *
path=Path() # 현재 위치 저장 현재폴더=. 상위폴더=..
path
path.ls()
(path/'폴더 이름 넣어~').ls()
path=Path()
(path/'asdf').mkdir()
(path/'asdf').ls()
(path/'asdf').mkdir() # 이미 있는 폴더면 오류 발생
(path/'asdf').mkdir(exist_ok=True) # 이미 존재하면 무시~
(path/'asdf').rmdir() # 생성한 폴더 삭제
-
이미지 크롤링
-
- 검색 2. 이미지 주소를 찾음 3. 해당 주소로 이동하여 저장하는 과정 반복
-
다른방법: 덕덕고를 이용한 이미지 크롤링
def search_images_ddg(key,max_n=200):
"""Search for 'key' with DuckDuckGo and return a unique urls of 'max_n' images
(Adopted from https://github.com/deepanprabhu/duckduckgo-images-api)
"""
url = 'https://duckduckgo.com/'
params = {'q':key}
res = requests.post(url,data=params)
searchObj = re.search(r'vqd=([\d-]+)\&',res.text)
if not searchObj: print('Token Parsing Failed !'); return
requestUrl = url + 'i.js'
headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:71.0) Gecko/20100101 Firefox/71.0'}
params = (('l','us-en'),('o','json'),('q',key),('vqd',searchObj.group(1)),('f',',,,'),('p','1'),('v7exp','a'))
urls = []
while True:
try:
res = requests.get(requestUrl,headers=headers,params=params)
data = json.loads(res.text)
for obj in data['results']:
urls.append(obj['image'])
max_n = max_n - 1
if max_n < 1: return L(set(urls)) # dedupe
if 'next' not in data: return L(set(urls))
requestUrl = url + data['next']
except:
pass
search_images_ddg(검색어)
를 이용하여 검색어에 해당하는 url 얻기m
search_images_ddg('Holybang',max_n=5)
path=Path()
path.ls()
download_images(path,urls=search_images_ddg('Holybang',max_n=5))
- 현재 working directory에 5개의 이미지가 저장된 모습!
keywords='sunmi', 'Hyuna' # 단어 한 개 쓰면 키워드로 입력되어서 알파벳 수대로 폴더 만들어짐..
path=Path('Singer')
if not path.exists(): # 현재폴더에 Singer 폴더가 있는지 체크
path.mkdir() # 현재폴더에 Singer 폴더가 만들어짐
for keyword in keywords: # keyword='sunmi', keyword='Hyuna' 일때 아래내용을 반복
lastpath=path/keyword # ./Singer/sunmi or ./Singer/Hyuna
lastpath.mkdir(exist_ok=True) # make ./Singer/sunmi or ./Singer/Hyuna
urls=search_images_ddg(keyword) # 'sunmi' 검색어로 url들의 리스트를 얻음
download_images(lastpath,urls=urls) # 그 url에 해당하는 이미지들을 ./Singer/sunmi or ./Singer/Hyuna 에 저장
PILImage.create('./singer/iu/00000015.jpg:large')
verify_images(get_image_files(path))
- 위에 해당하는 이미지를 수동으로 지워줌
- 나중에 지우는 함수 배움(조금 까다로움)
-
fastai 가 지원하는 함수로 분석하기 좋게 dls 만들기
dls=ImageDataLoaders.from_folder(
path,
train='singer',
valid_pct=0.2,
item_tfms=Resize(224))
ImageDataLoaders.from_folder(path, train='train', valid='valid', valid_pct=None, seed=None, vocab=None, item_tfms=None, batch_tfms=None, bs=64, val_bs=None, shuffle=True, device=None)
dls.show_batch(max_n=16)
learn=cnn_learner(dls,resnet34,metrics=error_rate)
learn.fine_tune(7)
learn.show_results(max_n=16)
interp=Interpretation.from_learner(learn)
interp.plot_top_losses(16)
- 수동으로 특정 observation에 대한 예측결과를 확인
dls.train_ds
- training test
dls.train_ds[0] # 첫 번째 observation, 즉, (x1,y1)
- $x_1=$PILImage mode=RGB size=960x960
- $y_1=$TensorCategory(1)
dls.train_ds[100][0]
- $x_{100}$=위의 이미지
dls.train_ds[100][1]
- $y_{100}=$TensorCategory(1)
x100=dls.train_ds[100][0]
learn.predict(x100)
path=Path()
if not (path/'test').exists():
(path/'test').mkdir()
urls=search_images_ddg('sunmi 선미',max_n=20)
download_images(path/'test',urls=urls)
testset=get_image_files(path/'test')
testset
for i in range(len(testset)):
print(learn.predict(PILImage.create(testset[i])))
- 결과를 보니까 sunmi이 많음 → 어느정도 맞추는것 같긴하다
PILImage.create(testset[1])
- 실제로 선미인데 현아로 예측한 사진
path=Path()
if not (path/'test2').exists():
(path/'test2').mkdir()
urls=search_images_ddg('hyuna 현아',max_n=20)
download_images(path/'test2',urls=urls)
testset=get_image_files(path/'test2')
testset
for i in range(len(testset)):
print(learn.predict(PILImage.create(testset[i])))
- 결과를 보니 Hyuna 역시 잘 맞추는 듯 보인다.
-
정확률이 아쉽긴 하지만 어느정도 유의미한 결과를 얻었다.
PILImage.create(testset[1]) # 현아인데 선미로 예측한 사진