Коротко: для вашей задачи (белый фон, нужно лишь слегка «подвернуть/вывернуть» товар так, чтобы он совпал по углу с образцом) достаточно простого CV‑пайплайна — без тяжёлой генеративной доработки. У вас 3000 изображений — это удобно и быстро обрабатывается локально (Python+OpenCV) либо через готовые B2B‑сервисы для e‑commerce (если хотите полностью «выдать на аутсорс»).
Варианты и рекомендации
1) Самый простой и надёжный — скрипт на OpenCV (рекомендую)
- На белом фоне выделить объект (простая бинаризация по яркости или порогу HSV).
- Найти контур/маску, вычислить главную ось (minAreaRect() или PCA/центроид) → получить угол ориентации.
- Для эталонного изображения тоже вычислить угол.
- Применить поворот/аффинное выравнивание на всю папку изображений: rotate = (угол_эталон − угол_текущего).
- При необходимости дополнительно центрировать/масштабировать, сохранить.
Преимущества: быстро, точно для белого фона, контроль, можно прогнать в пакетном режиме на локальной машине или сервере. Примерный код (упрощённо):
import cv2
import numpy as np
import os
from math import atan2, degrees
def get_angle_from_mask(mask):
# mask: бинарное изображение (0/255)
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
if not contours:
return 0.0
c = max(contours, key=cv2.contourArea)
rect = cv2.minAreaRect(c) # ((cx,cy),(w,h),angle)
angle = rect[2]
# minAreaRect angle convention: for w<h angle in [-90,0)
if rect[1][0] < rect[1][1]:
angle = angle + 90
return angle
def align_and_save(img_path, target_angle, out_path):
img = cv2.imread(img_path, cv2.IMREAD_UNCHANGED)
# simple threshold for white bg
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, mask = cv2.threshold(gray, 250, 255, cv2.THRESH_BINARY_INV) # инвертированная маска объекта
angle = get_angle_from_mask(mask)
delta = target_angle - angle
(h,w) = img.shape[:2]
M = cv2.getRotationMatrix2D((w/2,h/2), delta, 1.0)
rotated = cv2.warpAffine(img, M, (w,h), borderValue=(255,255,255))
cv2.imwrite(out_path, rotated)
# вычислить угол эталона
target_mask = cv2.threshold(cv2.cvtColor(cv2.imread('template.jpg'), cv2.COLOR_BGR2GRAY), 250, 255, cv2.THRESH_BINARY_INV)[1]
target_angle = get_angle_from_mask(target_mask)
# пакетная обработка
os.makedirs('out', exist_ok=True)
for f in os.listdir('in'):
if f.lower().endswith(('.jpg','.png','.jpeg')):
align_and_save(os.path.join('in',f), target_angle, os.path.join('out',f))
(Надо подстроить пороги, учитывать тени, прозрачность; при большом разнообразии форм заменить порог на более стабильноe выделение — например, адаптивный или сегментация.)
2) Более продвинуто — ключевые точки / feature matching (ORB/SIFT) или регрессия положения
- Если объекты сложной формы или угол нужно восстановить относительно конкретных элементов образца, можно найти ключевые точки (SIFT/ORB) между эталоном и каждым изображением, оценить аффинную матрицу и выровнять по ней.
- Это устойчивее к частичным совпадениям, если ориентация зависит от отдельных деталей.
3) Сегментация нейросетью + SAM
- Если пороги/освещение проблемные, сперва получить маску продуктa с помощью Segment Anything (SAM) или лёгкой модели сегментации (U‑2‑Net, DeepLab), потом измерять угол по маске (как выше).
- SAM можно автоматизировать: использовать предсказание по всему изображению и затем выбрать самый крупный объект.
4) Готовые SaaS / решения для e‑commerce (если хотите отдать на аутсорс или получить GUI/garantee)
- Pixelz — автоматизированная ретушь товаров, выравнивают/кадрируют/исправляют тон и т.д. (B2B).
- PhotoRoom / Remove.bg / Slazzer / PicWish — имеют API для пакетной обработки: удаление фона, центрирование, шаблоны, иногда автоматическое выравнивание. PhotoRoom API умеет применять шаблон и позиционировать предмет.
- Pixelz и подобные предлагают опцию «auto align to template» для каталога — стоит запросить демо/цену.
5) Photoshop / Lightroom (без кода)
- Photoshop: Actions + Scripts можно запустить на папке. Но вычислить угол автоматически там сложнее без скрипта; можно написать JS-скрипт, который загружает маску и поворачивает.
- Lightroom поддерживает массовое применение трансформаций, но автоматическое кадрирование/поворот под эталон требует дополнительной автоматизации.
Что выбрать для ваших 3000 изображений
- Если все фото действительно на равномерном белом фоне и отличаются только углом — делайте скрипт на OpenCV (локально или на сервере). Быстро, бесплатно, легко отлаживается.
- Если не хотите разворачивать разработку — закажите у Pixelz/PhotoRoom пакетную автоматическую ретушь (они предоставляют API/пакеты и SLA).
- Если фон/тени/освещение неровные — добавьте шаг сегментации (SAM/U2Net) перед вычислением угла.
Дополнительно
- Если кроме поворота нужно скорректировать перспективу (товар снят с разного ракурса), используйте аффинную/гомографическую трансформацию по ключевым точкам.
- Резервные проверки: визуальный контроль случайных 5–10% после автотрета; или генерировать «diff» со шаблоном для обнаружения неудачных кадров.
Могу:
- прислать рабочий скрипт, адаптированный под ваши примеры (покажите 5–10 файлов: эталон + несколько типичных),
- или помочь выбрать и связаться с подрядчиком/SaaS для пакетной обработки.
Хотите, я подготовлю под вашу задачу готовый Python‑скрипт и инструкции по запуску?