Unverified Commit 9eadc4f1 authored by AUTOMATIC1111's avatar AUTOMATIC1111 Committed by GitHub
Browse files

Merge pull request #14121 from AUTOMATIC1111/fix-Auto-focal-point-crop-for-opencv-4.8.x

Fix auto focal point crop for opencv >= 4.8
parents 97c8e7e0 d608926f
Loading
Loading
Loading
Loading
+122 −117
Original line number Diff line number Diff line
@@ -3,6 +3,8 @@ import requests
import os
import numpy as np
from PIL import ImageDraw
from modules import paths_internal
from pkg_resources import parse_version

GREEN = "#0F0"
BLUE = "#00F"
@@ -25,7 +27,6 @@ def crop_image(im, settings):
        elif is_portrait(settings.crop_width, settings.crop_height):
            scale_by = settings.crop_height / im.height


    im = im.resize((int(im.width * scale_by), int(im.height * scale_by)))
    im_debug = im.copy()

@@ -69,6 +70,7 @@ def crop_image(im, settings):

    return results


def focal_point(im, settings):
    corner_points = image_corner_points(im, settings) if settings.corner_points_weight > 0 else []
    entropy_points = image_entropy_points(im, settings) if settings.entropy_points_weight > 0 else []
@@ -183,13 +185,15 @@ def image_face_points(im, settings):
            minsize = int(min(im.width, im.height) * t[1])  # at least N percent of the smallest side
            try:
                faces = classifier.detectMultiScale(gray, scaleFactor=1.1,
            minNeighbors=7, minSize=(minsize, minsize), flags=cv2.CASCADE_SCALE_IMAGE)
                                                    minNeighbors=7, minSize=(minsize, minsize),
                                                    flags=cv2.CASCADE_SCALE_IMAGE)
            except Exception:
                continue

            if faces:
                rects = [[f[0], f[1], f[0] + f[2], f[1] + f[3]] for f in faces]
          return [PointOfInterest((r[0] +r[2]) // 2, (r[1] + r[3]) // 2, size=abs(r[0]-r[2]), weight=1/len(rects)) for r in rects]
                return [PointOfInterest((r[0] + r[2]) // 2, (r[1] + r[3]) // 2, size=abs(r[0] - r[2]),
                                        weight=1 / len(rects)) for r in rects]
    return []


@@ -294,22 +298,23 @@ def is_square(w, h):
    return w == h


def download_and_cache_models(dirname):
    download_url = 'https://github.com/opencv/opencv_zoo/blob/91fb0290f50896f38a0ab1e558b74b16bc009428/models/face_detection_yunet/face_detection_yunet_2022mar.onnx?raw=true'
    model_file_name = 'face_detection_yunet.onnx'
model_dir_opencv = os.path.join(paths_internal.models_path, 'opencv')
if parse_version(cv2.__version__) >= parse_version('4.8'):
    model_file_path = os.path.join(model_dir_opencv, 'face_detection_yunet_2023mar.onnx')
    model_url = 'https://github.com/opencv/opencv_zoo/blob/b6e370b10f641879a87890d44e42173077154a05/models/face_detection_yunet/face_detection_yunet_2023mar.onnx?raw=true'
else:
    model_file_path = os.path.join(model_dir_opencv, 'face_detection_yunet.onnx')
    model_url = 'https://github.com/opencv/opencv_zoo/blob/91fb0290f50896f38a0ab1e558b74b16bc009428/models/face_detection_yunet/face_detection_yunet_2022mar.onnx?raw=true'

    os.makedirs(dirname, exist_ok=True)

    cache_file = os.path.join(dirname, model_file_name)
    if not os.path.exists(cache_file):
        print(f"downloading face detection model from '{download_url}' to '{cache_file}'")
        response = requests.get(download_url)
        with open(cache_file, "wb") as f:
def download_and_cache_models():
    if not os.path.exists(model_file_path):
        os.makedirs(model_dir_opencv, exist_ok=True)
        print(f"downloading face detection model from '{model_url}' to '{model_file_path}'")
        response = requests.get(model_url)
        with open(model_file_path, "wb") as f:
            f.write(response.content)

    if os.path.exists(cache_file):
        return cache_file
    return None
    return model_file_path


class PointOfInterest:
+2 −2
Original line number Diff line number Diff line
@@ -3,7 +3,7 @@ from PIL import Image, ImageOps
import math
import tqdm

from modules import paths, shared, images, deepbooru
from modules import shared, images, deepbooru
from modules.textual_inversion import autocrop


@@ -196,7 +196,7 @@ def preprocess_work(process_src, process_dst, process_width, process_height, pre

            dnn_model_path = None
            try:
                dnn_model_path = autocrop.download_and_cache_models(os.path.join(paths.models_path, "opencv"))
                dnn_model_path = autocrop.download_and_cache_models()
            except Exception as e:
                print("Unable to load face detection model for auto crop selection. Falling back to lower quality haar method.", e)