Kucing atau Anjing?

Kucing atau Anjing?#

terinspirasi dari: https://www.kaggle.com/code/jhoward/is-it-a-bird-creating-a-model-from-your-own-data

from icrawler.builtin import GoogleImageCrawler, BingImageCrawler
from fastcore.all import *
import logging
import time
from fastai.vision.all import *

membuat fungsi untuk mendownload gambar melalui Google

def search_images(keyword, image_dir, size="medium", max_images=200):
    google_crawler = GoogleImageCrawler(storage={'root_dir': image_dir})
    logging.disable(logging.CRITICAL)
    flts = dict(size=size)
    google_crawler.crawl(keyword=keyword, filters=flts, max_num=max_images)
    return sorted(list(image_dir.glob("*")))

diuji coba, ternyata muncul gambar kucing.

pth_cat = Path("cat")
cat_locs = search_images("cat", pth_cat, max_images=1); cat_locs
[Path('cat/000001.jpg')]
im = Image.open(cat_locs[0])
im.to_thumb(256, 256)
../../_images/dd322545ecd3074c05fd589c5040480f8ecc3890047a348a7c604ed7df295117.png

lakukan hal yang sama tetapi untuk anjing

pth_dog = Path("dog")
dog_locs = search_images("dog", pth_dog, max_images=1)

im = Image.open(dog_locs[0])
im.to_thumb(256, 256)
../../_images/abf5f4b765c5959d44a038782d98c8b6e030b1cebf5bd49082d6919eb9b32f5d.png

oke, selanjutnya membuat folder untuk mengumpulkan gambar dan anjing. Gambar-gambar ini akan digunakan untuk training dan validasi

def search_images_parallel(keyword, image_dir, size="medium", max_images=200):
    google_crawler = BingImageCrawler(
        feeder_threads=1,
        parser_threads=2,
        downloader_threads=4,
        storage={'root_dir': image_dir})
    logging.disable(logging.CRITICAL)
    flts = dict(size=size, type="photo")
    google_crawler.crawl(keyword=keyword, filters=flts, max_num=max_images)
    return sorted(list(image_dir.glob("*")))
searches = 'cat','dog'
path = Path('cat_or_not')

for o in searches:
    dest = (path/o)
    search_images_parallel(f"{o} photos", dest)
    time.sleep(5)
    resize_images(dest, max_size=400, dest=dest)

kita gunakan fastai untuk cek data, training, dan prediksi

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=6)
../../_images/9e89ab1fa9b0640f0670a1bf20877197db7ea5e99766e780b2ef8f203e22d1ce.png
learn = vision_learner(dls, resnet18, metrics=error_rate)
learn.fine_tune(3)
Downloading: "https://download.pytorch.org/models/resnet18-f37072fd.pth" to /Users/yudhastyawan/.cache/torch/hub/checkpoints/resnet18-f37072fd.pth
100%|██████████| 44.7M/44.7M [00:38<00:00, 1.22MB/s]
epoch train_loss valid_loss error_rate time
0 1.077830 0.469250 0.160000 00:17
epoch train_loss valid_loss error_rate time
0 0.358905 0.189952 0.060000 00:06
1 0.251838 0.248030 0.100000 00:04
2 0.213601 0.298915 0.120000 00:04
is_cat,_,probs = learn.predict(cat_locs[0])
print(f"This is a: {is_cat}.")
print(f"Probability it's a cat: {probs[0]:.4f}")
This is a: cat.
Probability it's a cat: 0.9998
is_cat,_,probs = learn.predict(dog_locs[0])
print(f"This is a: {is_cat}.")
print(f"Probability it's a cat: {probs[0]:.4f}")
This is a: dog.
Probability it's a cat: 0.0000

berhasil mendeteksi kucing dan anjing!