|
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() |