Source code for imgutils.metrics.aesthetic

"""
Overview:
    A tool for measuring the aesthetic level of anime images, with the model
    obtained from `skytnt/anime-aesthetic <https://huggingface.co/skytnt/anime-aesthetic>`_.

    .. image:: aesthetic_full.plot.py.svg
        :align: center

    This is an overall benchmark of all the operations in aesthetic models:

    .. image:: aesthetic_benchmark.plot.py.svg
        :align: center

    .. warning::
        These model is deprecated due to the poor effectiveness.
        Please use `imgutils.metrics.aesthetic.anime_dbaesthetic` for better evaluation.
"""
from functools import lru_cache

import cv2
import numpy as np
from PIL import Image
from deprecation import deprecated
from huggingface_hub import hf_hub_download

from ..config.meta import __VERSION__
from ..data import ImageTyping, load_image
from ..utils import open_onnx_model

__all__ = [
    'get_aesthetic_score',
]


@lru_cache()
def _open_aesthetic_model():
    return open_onnx_model(hf_hub_download(
        repo_id="skytnt/anime-aesthetic",
        filename="model.onnx"
    ))


def _preprocess(image: Image.Image):
    assert image.mode == 'RGB'
    img = np.array(image).astype(np.float32) / 255
    s = 768
    h, w = img.shape[:-1]
    h, w = (s, int(s * w / h)) if h > w else (int(s * h / w), s)
    ph, pw = s - h, s - w
    img_input = np.zeros([s, s, 3], dtype=np.float32)
    img_input[ph // 2:ph // 2 + h, pw // 2:pw // 2 + w] = cv2.resize(img, (w, h))
    img_input = np.transpose(img_input, (2, 0, 1))
    return img_input[np.newaxis, :]


[docs]@deprecated(deprecated_in='0.4.2', removed_in='1.0.0', current_version=__VERSION__, details='Deprecated due to the low effectiveness.') def get_aesthetic_score(image: ImageTyping): """ Overview: Get aesthetic score for image. :param image: Original image. :return: Score of aesthetic. Examples:: >>> from imgutils.metrics import get_aesthetic_score >>> >>> get_aesthetic_score('2053756.jpg') 0.09986039996147156 >>> get_aesthetic_score('1663584.jpg') 0.24299287796020508 >>> get_aesthetic_score('4886411.jpg') 0.38091593980789185 >>> get_aesthetic_score('2066024.jpg') 0.5131649971008301 >>> get_aesthetic_score('3670169.jpg') 0.6011670827865601 >>> get_aesthetic_score('5930006.jpg') 0.7067991495132446 >>> get_aesthetic_score('3821265.jpg') 0.8237218260765076 >>> get_aesthetic_score('5512471.jpg') 0.9187621474266052 """ image = load_image(image, mode='RGB') retval, *_ = _open_aesthetic_model().run(None, {'img': _preprocess(image)}) return float(retval.item())