안경잡이개발자

728x90
반응형

  아래 코드는 PyTorch에서 ImageFolder와 유사한 기능을 직접 구현해야 할 때 사용할 수 있는 코드다. ImageFolder는 기본적으로 (이미지, 레이블) 형태로 특정한 이미지 데이터를 가져올 수 있다. 이때 이미지 대신에 numpy 형태로 가져오거나 원하는 형식의 확장자를 사용하도록 하려면, 이러한 클래스를 직접 작성해 사용할 수 있을 것이다.

 

import torch.utils.data as data

from PIL import Image
import os
import os.path

IMG_EXTENSIONS = [
    '.jpg', '.JPG', '.jpeg', '.JPEG',
    '.png', '.PNG', '.ppm', '.PPM', '.bmp', '.BMP',
]


def is_image_file(filename):
    return any(filename.endswith(extension) for extension in IMG_EXTENSIONS)


def find_classes(dir):
    classes = [d for d in os.listdir(dir) if os.path.isdir(os.path.join(dir, d))]
    classes.sort()
    class_to_idx = {classes[i]: i for i in range(len(classes))}
    return classes, class_to_idx


def make_dataset(dir, class_to_idx):
    images = []
    dir = os.path.expanduser(dir)
    for target in sorted(os.listdir(dir)):
        d = os.path.join(dir, target)
        if not os.path.isdir(d):
            continue

        for root, _, fnames in sorted(os.walk(d)):
            for fname in sorted(fnames):
                if is_image_file(fname):
                    path = os.path.join(root, fname)
                    item = (path, class_to_idx[target])
                    images.append(item)

    return images


def pil_loader(path):
    # open path as file to avoid ResourceWarning (https://github.com/python-pillow/Pillow/issues/835)
    with open(path, 'rb') as f:
        with Image.open(f) as img:
            return img.convert('RGB')


def accimage_loader(path):
    import accimage
    try:
        return accimage.Image(path)
    except IOError:
        # Potentially a decoding problem, fall back to PIL.Image
        return pil_loader(path)


def default_loader(path):
    from torchvision import get_image_backend
    if get_image_backend() == 'accimage':
        return accimage_loader(path)
    else:
        return pil_loader(path)


class ImageFolder(data.Dataset):
    """A generic data loader where the images are arranged in this way: ::

        root/dog/xxx.png
        root/dog/xxy.png
        root/dog/xxz.png

        root/cat/123.png
        root/cat/nsdf3.png
        root/cat/asd932_.png

    Args:
        root (string): Root directory path.
        transform (callable, optional): A function/transform that  takes in an PIL image
            and returns a transformed version. E.g, ``transforms.RandomCrop``
        target_transform (callable, optional): A function/transform that takes in the
            target and transforms it.
        loader (callable, optional): A function to load an image given its path.

     Attributes:
        classes (list): List of the class names.
        class_to_idx (dict): Dict with items (class_name, class_index).
        imgs (list): List of (image path, class_index) tuples
    """

    def __init__(self, root, transform=None, target_transform=None,
                 loader=default_loader):
        classes, class_to_idx = find_classes(root)
        imgs = make_dataset(root, class_to_idx)
        if len(imgs) == 0:
            raise(RuntimeError("Found 0 images in subfolders of: " + root + "\n"
                               "Supported image extensions are: " + ",".join(IMG_EXTENSIONS)))

        self.root = root
        self.imgs = imgs
        self.classes = classes
        self.class_to_idx = class_to_idx
        self.transform = transform
        self.target_transform = target_transform
        self.loader = loader

    def __getitem__(self, index):
        """
        Args:
            index (int): Index

        Returns:
            tuple: (image, target) where target is class_index of the target class.
        """
        path, target = self.imgs[index]
        img = self.loader(path)
        if self.transform is not None:
            img = self.transform(img)
        if self.target_transform is not None:
            target = self.target_transform(target)

        return img, target


    def __len__(self):
        return len(self.imgs)

 

  ▶ 출처: chsasank.github.io/vision/_modules/torchvision/datasets/folder.html

 

728x90
반응형

Comment +0

728x90
반응형

  Clarifai는 이미지 인식 서비스를 제공하는 대표적인 회사입니다. 무료로도 꽤 많은 API를 사용해 볼 수 있습니다. 홈페이지에 방문한 뒤에 바로 모델을 사용해 볼 수 있는데요. 예를 들어 유명인(celebrity) 얼굴 인식 서비스는 다음의 경로에 방문하여 사용해 볼 수 있습니다.

 

  ▶ Clarifai 유명인 얼굴 인식 서비스www.clarifai.com/models/celebrity-image-recognition

 

Analyze Images Using Celebrity Face Recognition | Clarifai

To analyze images and return probability scores, Clarifai Celebrity Face Recognition Model contains 10,000+ famous faces. Who do you look like? Try it out!

www.clarifai.com

 

  이 서비스에 접속해서 다음과 같이 이미지를 업로드하면 인식 결과 레이블(label)이 나옵니다. 저는 한 번 버락 오바마 대통령 사진을 업로드 해보았습니다. 그랬더니 다음과 같은 결과가 나오는 것을 알 수 있었습니다.

 

 

  참고로 유명인(celebrity)이 아닌 일반적인 사람의 얼굴을 넣는 경우, 임의의 유명인으로 레이블링을 진행하되 낮은 확률(probability)로 분류하는 것을 알 수 있습니다.

 

 

  특히 다음과 같이 확률(probability) 자체가 매우 낮은 경우에는 다음과 같이 "No celebrity detected"라는 메시지가 출력되는 것을 알 수 있습니다.

 

 

  ▶ Clarifai 서비스 회원가입(Sign Up)portal.clarifai.com/signup

 

  Clarifai 서비스를 편리하게 사용하기 위해서는 회원가입을 진행하면 됩니다. 일단 저는 무료로 가입하고 무료 서비스를 사용해 보았습니다. Clarifai 서비스 회원가입 방법은 간단합니다. 이메일 인증이 필요하기 때문에 이메일 주소를 정확히 입력할 필요가 있습니다. 예를 들어 저는 다음과 같이 회원가입을 진행했습니다.

 

 

 

  회원가입 이후에는 바로 애플리케이션(application)을 생성하여 사용해 볼 수 있습니다. 이때 API 키를 발급해 주기 때문에 발급받은 API 키를 이용해 다양한 프로그래밍 언어에서 Clarifai 서비스를 사용해 볼 수 있습니다.

 

 

※ Clarifai API 사용 방법 ※

 

  뿐만 아니라 Clarifai는 각종 API를 지원하고 있습니다. 예를 들어 파이썬(Python)을 이용해 얼굴 인식(face recognition) 기능을 사용해 볼 수 있습니다. 자세한 내용은 다음의 깃허브 저장소에 방문하시면 확인 가능합니다.

 

  ▶ 파이썬 clarifai 라이브러리: github.com/Clarifai/clarifai-python

 

Clarifai/clarifai-python

DEPRECATED Clarifai API Python Client, use clarifai-python-grpc instead - Clarifai/clarifai-python

github.com

 

  특정 URL로부터 사진 파일을 받아와 간단한 사용 방법 예시는 다음과 같습니다.

 

from clarifai.rest import ClarifaiApp
from IPython.display import Image, display

image_url = 'https://samples.clarifai.com/celebrity.jpg'
display(Image(image_url))

app = ClarifaiApp(api_key=API_KEY)
model = app.public_models.celebrity_model
response = model.predict_by_url(url=image_url)

regions = response['outputs'][0]['data']['regions']
concepts = regions[0]['data']['concepts']
for concept in concepts:
    print(f'Label: {concept["name"]} (Probability: {concept["value"]})')

 

  위 코드를 실행하면 다음과 같이 사진에서 유명인 얼굴을 추출한 결과가 나오게 됩니다.

 

 

  또한 다음과 같이 파일 경로(file path)로부터 이미지를 읽어와 화면에 출력할 수도 있습니다.

 

from clarifai.rest import ClarifaiApp
from IPython.display import Image, display

image_path = 'aligned_images/barack_obama_01.png'
display(Image(image_path))

app = ClarifaiApp(api_key=API_KEY)
model = app.public_models.celebrity_model
response = model.predict_by_filename(filename=image_path)

regions = response['outputs'][0]['data']['regions']
concepts = regions[0]['data']['concepts']
for concept in concepts:
    print(f'Label: {concept["name"]} (Probability: {concept["value"]})')

 

  실행 결과 예시는 다음과 같습니다.

 

 

  참고로 API를 통해 얻은 결과는 공식 웹 사이트에 넣어서 얻은 결과와 동일한 확률 값을 내보내는 것을 알 수 있습니다.

 

 

  ▶ 참고 소스코드: github.com/ndb796/Clarifai-Python-Celebrity-Recognition

 

ndb796/Clarifai-Python-Celebrity-Recognition

Clarifai Python API: Celebrity Recognition Examples - ndb796/Clarifai-Python-Celebrity-Recognition

github.com

728x90
반응형

Comment +1