ball_type / hw1.py
alpdeniz's picture
init
70da235
from fastai.vision import *
from duckduckgo_search import ddg_images
from fastcore.all import *
from fastbook import *
from fastdownload import download_url
from PIL import Image
import os
def search_images(term, max_images=60):
print(f"Searching for '{term}'")
return L(ddg_images(term, max_results=max_images)).itemgot('image')
def download_images(dest, urls):
print(f"Downloading {len(urls)} images")
for url in urls:
if not Path(dest/url).exists():
try:
download_url(url, dest, show_progress=False)
except Exception as e:
print(f"Error while downloading photo: {e}")
def resize_image(fpath, max_size):
ext = Path(fpath).suffix
new_fpath = fpath.split(".")
if len(new_fpath) > 1:
ext = new_fpath[-1]
new_fpath = ".".join(new_fpath[:-1])
new_fpath = f"{new_fpath}_{max_size}.{ext}"
else:
new_fpath = fpath
print(new_fpath)
if not Path(new_fpath).exists():
try:
img = Image.open(fpath)
img = img.resize((max_size, max_size))
img.save(f"{new_fpath}")
except:
pass
os.remove(fpath)
def resize_images(path, max_size):
print(f"resizing images")
for fpath in os.listdir(path=path):
fpath = f"{path}/{fpath}"
if "_400" in fpath:
continue
resize_image(fpath, max_size)
searches = 'football ball', 'basketball ball', 'tennis ball'
path = Path('.')
for o in searches:
dest = (path/o)
if not dest.exists():
dest.mkdir(exist_ok=True, parents=True)
download_images(dest, urls=search_images(f'{o} photo'))
resize_images(dest, max_size=400)
dls = DataBlock(
blocks=(ImageBlock, CategoryBlock),
get_items=get_image_files,
splitter=RandomSplitter(valid_pct=0.2, seed=42),
get_y=parent_label,
item_tfms=[Resize(192, method='squish')]
).dataloaders(path, bs=32)
dls.show_batch(max_n=20)
learn = vision_learner(dls, resnet18, metrics=error_rate)
learn.fine_tune(6)
learn.export()