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 Original line Diff line number Diff line
@@ -3,6 +3,8 @@ import requests
import os
import os
import numpy as np
import numpy as np
from PIL import ImageDraw
from PIL import ImageDraw
from modules import paths_internal
from pkg_resources import parse_version


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



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


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


    return results
    return results



def focal_point(im, settings):
def focal_point(im, settings):
    corner_points = image_corner_points(im, settings) if settings.corner_points_weight > 0 else []
    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 []
    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
            minsize = int(min(im.width, im.height) * t[1])  # at least N percent of the smallest side
            try:
            try:
                faces = classifier.detectMultiScale(gray, scaleFactor=1.1,
                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:
            except Exception:
                continue
                continue


            if faces:
            if faces:
                rects = [[f[0], f[1], f[0] + f[2], f[1] + f[3]] for f in 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 []
    return []




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




def download_and_cache_models(dirname):
model_dir_opencv = os.path.join(paths_internal.models_path, 'opencv')
    download_url = 'https://github.com/opencv/opencv_zoo/blob/91fb0290f50896f38a0ab1e558b74b16bc009428/models/face_detection_yunet/face_detection_yunet_2022mar.onnx?raw=true'
if parse_version(cv2.__version__) >= parse_version('4.8'):
    model_file_name = 'face_detection_yunet.onnx'
    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)
def download_and_cache_models():
    if not os.path.exists(cache_file):
    if not os.path.exists(model_file_path):
        print(f"downloading face detection model from '{download_url}' to '{cache_file}'")
        os.makedirs(model_dir_opencv, exist_ok=True)
        response = requests.get(download_url)
        print(f"downloading face detection model from '{model_url}' to '{model_file_path}'")
        with open(cache_file, "wb") as f:
        response = requests.get(model_url)
        with open(model_file_path, "wb") as f:
            f.write(response.content)
            f.write(response.content)

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




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


from modules import paths, shared, images, deepbooru
from modules import shared, images, deepbooru
from modules.textual_inversion import autocrop
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
            dnn_model_path = None
            try:
            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:
            except Exception as e:
                print("Unable to load face detection model for auto crop selection. Falling back to lower quality haar method.", e)
                print("Unable to load face detection model for auto crop selection. Falling back to lower quality haar method.", e)