#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)