日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

tensor flow lstm 图像 一条直线_【开源计划】图像配准中变形操作(Warp)的pytorch实现...

發(fā)布時間:2023/12/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tensor flow lstm 图像 一条直线_【开源计划】图像配准中变形操作(Warp)的pytorch实现... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

按照開源計劃的預告,這次我來分享圖像配準流程中的變形操作的代碼實現(xiàn)。首先我們先來回顧一下配準的流程,我們以這篇Unsupervised End-to-end Learning for Deformable Medical Image Registration論文中的流程圖為例,進行說明。該論文提出的配準框架是基于無監(jiān)督學習的端到端的非剛性圖像配準,配準網(wǎng)絡(registration network)根據(jù)輸入的浮動圖像(moving image)與固定圖像(fixed image)預測出變形場(deformation field),然后采樣網(wǎng)格生成器(sampling grid generator)生成規(guī)則網(wǎng)格(regular grid),并與變形場結(jié)合得到采樣網(wǎng)格(sampling grid),再經(jīng)過采樣器(sampler)對浮動圖像進行重采樣即得到變形后的圖像(warped image)。其中,從規(guī)則網(wǎng)格生成到得到變形后的圖像的過程一般稱為變形(warp,可能翻譯的不夠準確與專業(yè))。另外,這個過程也正是論文Spatial Transformer Networks的思想,只不過最初該論文的應用是在自然圖像的檢測與分類任務上的,后來才被引入到醫(yī)學圖像配準上。正是它的引入,使得這種基于無監(jiān)督學習的圖像配準變得可行。

基于無監(jiān)督學習的配準模型示意圖

?
該流程圖的原始說明引用如下:

Fig. 2: Illustration of the unsupervised training strategy of our fully convolutional image-to-image registration network. The registration network takes two images and outputs a deformation field, which is used to produce the sampling grid. The moving image is then warped by the sampling grid via bilinear interpolation. The loss function is defined as the photometric difference between the warped image and the fixed image. The registration error can be efficiently back propagated to update the learnable parameters of the registration network for end-to-end training.

值得注意的是,如果要使用基于無監(jiān)督學習的配準框架,對網(wǎng)絡進行端到端地訓練,就需要依靠論文Spatial Transformer Networks的思想,實現(xiàn)一個可反向梯度計算的重采樣函數(shù),將這個變形操作納入到配準模型框架之中。這個操作的實現(xiàn)對于一般的研究生來說無疑難度是巨大的,很慶幸,pytorch框架提供了一個這樣的函數(shù),稱為grid_sample函數(shù),為研究者們構建Spatial Transformer Networks提供了方便。具體介紹請點擊鏈接,參看pytorch的官方文檔說明。下面我將使用該函數(shù),編寫變形(warp)的函數(shù)。

準備

首先,導入依賴包

import torch import torch.nn as nn import torch.nn.functional as F from torch.autograd import Variable

?二維圖像變形(Warp)

變形(Warp)的操作內(nèi)容就是,在初始化的過程中先生成一個與圖像大小相同的網(wǎng)格,即規(guī)則網(wǎng)格,如果使用規(guī)則網(wǎng)格對圖像變形,則可以得到一個與原始圖像相同的圖像,圖像不發(fā)生形變,這個過程的可視化可以參考我的另一篇博客。在調(diào)用變形函數(shù)時,需要提供兩個參數(shù),一個是原始圖像,一個是變形場(flow-field),將變形場與規(guī)則網(wǎng)格相加,然后對原始圖像進行重采樣。代碼的實現(xiàn),我參考一篇稱為PWC-Net的論文的開源代碼(這里是鏈接)其中的warp函數(shù)進行了修改,具體如下:

class Warper2d(nn.Module):def __init__(self, img_size):super(Warper2d, self).__init__()"""warp an image/tensor (im2) back to im1, according to the optical flow # img_src: [B, 1, H1, W1] (source image used for prediction, size 32)img_smp: [B, 1, H2, W2] (image for sampling, size 44)flow: [B, 2, H1, W1] flow predicted from source image pair"""self.img_size = img_sizeH, W = img_size, img_size# mesh grid xx = torch.arange(0, W).view(1,-1).repeat(H,1)yy = torch.arange(0, H).view(-1,1).repeat(1,W)xx = xx.view(1,H,W)yy = yy.view(1,H,W)self.grid = torch.cat((xx,yy),0).float() # [2, H, W]def forward(self, flow, img):grid = self.grid.repeat(flow.shape[0],1,1,1)#[bs, 2, H, W]if img.is_cuda:grid = grid.cuda() # if flow.shape[2:]!=img.shape[2:]: # pad = int((img.shape[2] - flow.shape[2]) / 2) # flow = F.pad(flow, [pad]*4, 'replicate')#max_disp=6, 32->44vgrid = Variable(grid, requires_grad = False) + flow# scale grid to [-1,1] # vgrid[:,0,:,:] = 2.0*vgrid[:,0,:,:]/(W-1)-1.0 #max(W-1,1) # vgrid[:,1,:,:] = 2.0*vgrid[:,1,:,:]/(H-1)-1.0 #max(H-1,1)vgrid = 2.0*vgrid/(self.img_size-1)-1.0 #max(W-1,1)vgrid = vgrid.permute(0,2,3,1) output = F.grid_sample(img, vgrid) # mask = Variable(torch.ones(img.size())).cuda() # mask = F.grid_sample(mask, vgrid) # # mask[mask<0.9999] = 0 # mask[mask>0] = 1return output#*mask

三維圖像變形(Warp)

根據(jù)二維圖像變形操作的思路,我將其拓展到了三維圖像配準上,以下是實現(xiàn)代碼:

class Warper3d(nn.Module):def __init__(self, img_size):super(Warper3d, self).__init__()"""warp an image, according to the optical flowimage: [B, 1, D, H, W] image for samplingflow: [B, 3, D, H, W] flow predicted from source image pair"""self.img_size = img_sizeD, H, W = img_size# mesh grid xx = torch.arange(0, W).view(1,1,-1).repeat(D,H,1).view(1,D,H,W)yy = torch.arange(0, H).view(1,-1,1).repeat(D,1,W).view(1,D,H,W)zz = torch.arange(0, D).view(-1,1,1).repeat(1,H,W).view(1,D,H,W)self.grid = torch.cat((xx,yy,zz),0).float() # [3, D, H, W]def forward(self, img, flow):grid = self.grid.repeat(flow.shape[0],1,1,1,1)#[bs, 3, D, H, W] # mask = torch.ones(img.size())if img.is_cuda:grid = grid.cuda() # mask = mask.cuda()vgrid = grid + flow# scale grid to [-1,1]D, H, W = self.img_sizevgrid[:,0] = 2.0*vgrid[:,0]/(W-1)-1.0 #max(W-1,1)vgrid[:,1] = 2.0*vgrid[:,1]/(H-1)-1.0 #max(H-1,1)vgrid[:,2] = 2.0*vgrid[:,2]/(D-1)-1.0 #max(H-1,1)vgrid = vgrid.permute(0,2,3,4,1)#[bs, D, H, W, 3] output = F.grid_sample(img, vgrid, padding_mode='border')#, mode='nearest' # mask = F.grid_sample(mask, vgrid)#, mode='nearest' # mask[mask<0.9999] = 0 # mask[mask>0] = 1return output#*mask

另外,voxelmorph開源代碼提供了TensorFlow實現(xiàn)的Spatial Transformer Networks,有興趣的可以查看其代碼。

結(jié)束語

最后,以上僅供參考,歡迎各位網(wǎng)友批評指正與留言交流。如果對你有幫助,請點贊告訴我呀,我會更有動力寫相關的文章。

想看配準介紹的視頻的同學,請移步我的B站賬號:

Bilibili 萌新up主:愛分享的毛毛Timmy的主頁?space.bilibili.com

里面有我的項目介紹視頻,后期也會更新更多內(nèi)容,請關注我不迷路哦,如果對你有億點點幫助,就多一鍵三連與我互動吧,謝謝~

版權聲明

本文為CSDN博主「愛分享的毛毛Timmy」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。

原文鏈接:【開源計劃】圖像配準中變形操作(Warp)的pytorch實現(xiàn)_Timmymm的博客-CSDN博客_pytorch deformation

總結(jié)

以上是生活随笔為你收集整理的tensor flow lstm 图像 一条直线_【开源计划】图像配准中变形操作(Warp)的pytorch实现...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。