Как использовать spatial transformer для обрезки изображения в pytorch?

#deep-learning #pytorch #torch

#глубокое обучение #pytorch #факел

Вопрос:

в документе сети spatial transformer утверждается, что его можно использовать для обрезки изображения.

Учитывая область обрезки (top_left, bottom_right) = (x1,y1, x2, y2), как интерпретировать область как матрицу преобразования и обрезать изображение в pytorch?

Вот введение о сети spatial transformer в torch (http://torch.ch/blog/2015/09/07/spatial_transformers.html ) во введении визуализируется ограничивающая рамка, на которую смотрит трансформатор, Как мы можем определить ограничивающую рамку, учитывая матрицу преобразования?

[Править]

Я только что узнал ответ на первый вопрос [учитывая область обрезки, найдите матрицу преобразования]

введите описание изображения здесь

Комментарии:

1. Вы смотрели это руководство? pytorch.org/tutorials/intermediate /…

2. ага. Но я понятия не имею о взаимосвязи между crop и stn. Как сформулировать матрицу преобразования с учетом области обрезки?

3. кроме того, в официальном руководстве изображение после сети spatial transformer всегда содержит черную область. но в ссылке на учебник, которую я предоставляю, нет черной области

4. @alec.tu черная область означает, что ваше преобразование выходит за рамки заданного выходного размера. Убедитесь, что положение и масштаб, которые вы используете при преобразовании, находятся в правильных диапазонах (например, от -0,5 до 0,5 для перевода при уменьшении выходного размера вдвое)

Ответ №1:

Изображение в исходном сообщении уже дает хороший ответ, но может быть полезно предоставить некоторый код.

Важно, что этот метод должен корректно сохранять градиенты. В моем случае у меня есть набор значений y, x, которые представляют центр позиции обрезки (в диапазоне [-1,1]). Что касается значений a и b , которые являются значениями масштаба x и y для преобразования, в моем случае я использовал 0.5 для каждого из них в сочетании с меньшим размером выходных данных (вдвое меньше по ширине и высоте), чтобы сохранить исходный масштаб, то есть обрезать. Вы можете использовать 1 , чтобы не изменять масштаб, но тогда не было бы обрезки.

 import torch.nn.functional as F

def crop_to_affine_matrix(t):
    'Turns (N,2) translate values into (N,2,3) affine transformation matrix'
    t = t.reshape(-1,1,2,1).flip(2) # flip x,y order to y,x
    t = F.pad(t, (2,0,0,0)).squeeze(1)
    t[:,0,0] = a
    t[:,1,1] = b
    return t

t = torch.zeros(5,2) # center crop positions for batch size 5
F.affine_grid(crop_to_affine_matrix(t), outsize)