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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

如何利用CycleGAN实现男女性别转换

發布時間:2025/4/16 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何利用CycleGAN实现男女性别转换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

介紹

CycleGAN網絡具有很強大的風格遷移功能。能夠實現非常深層次的風格轉換。比如男性圖片女性化或者女性圖片男性化。

先上效果圖:

下面簡單談一談實現原理。

網絡結構


網絡結構如圖所示,通過兩個循環使用的生成器來進行風格遷移。由此實現了非常神奇的效果。

下面結合代碼來詳細解釋一下網絡結構。訓練生成對抗網絡的深度學習框架為Pytorch

1. 殘差模塊定義

class ResidualBlock(nn.Module):def __init__(self, in_features):super(ResidualBlock, self).__init__()# 殘差模塊不改變shapeconv_block = [ nn.ReflectionPad2d(1), # 構建殘差模塊的時候使用映射填充的形式nn.Conv2d(in_features, in_features, 3),nn.InstanceNorm2d(in_features), # 不使用BatchNorm而是使用InstanceNormnn.ReLU(inplace=True),nn.ReflectionPad2d(1),nn.Conv2d(in_features, in_features, 3),nn.InstanceNorm2d(in_features) ]self.conv_block = nn.Sequential(*conv_block)def forward(self, x):return x + self.conv_block(x)

殘差模塊的定義沒有太多需要說明的地方,就是有一點需要注意的是。我們在風格遷移中,不再使用BatchNorm而是使用InstanceNorm。

BN是將每一個batch的每一個通道的每一組圖片求mean和var, IN是將單獨一個圖片的一個通道的數據求mean和var。 區別就是一個是對batch求,一個是對一個圖片求。風格遷移中,為了保證風格,通常都對每一個圖片單獨處理。 CycleGAN網絡中,每一個batch只有一張 圖片,所以使用InstanceNorm。

2. 定義生成器

class Generator(nn.Module):def __init__(self, input_nc, output_nc, n_residual_blocks=9):"""定義生成網絡參數:input_nc --輸入通道數output_nc --輸出通道數n_residual_blocks --殘差模塊數量"""super(Generator, self).__init__()# 初始化卷積模塊# 因為使用ReflectionPad擴充# 所以輸入是3*256*256# 輸出是64*256*256model = [ nn.ReflectionPad2d(3),nn.Conv2d(input_nc, 64, 7),nn.InstanceNorm2d(64),nn.ReLU(inplace=True) ]# 進行下采樣# 第一個range:輸入是64*256*256,輸出是128*128*128# 第二個range:輸入是128*128*128,輸出是256*64*64in_features = 64out_features = in_features*2for _ in range(2):model += [ nn.Conv2d(in_features, out_features, 3, stride=2, padding=1),nn.InstanceNorm2d(out_features),nn.ReLU(inplace=True) ]in_features = out_featuresout_features = in_features*2# 使用殘差模塊# 輸入輸出都是256*64*64for _ in range(n_residual_blocks): # 默認添加9個殘差模塊model += [ResidualBlock(in_features)]# 進行上采樣# 第一個range:輸入是256*64*64,輸出是128*128*128# 第二個range:輸入是128*128*128,輸出是64*256*256 out_features = in_features//2for _ in range(2):model += [ nn.ConvTranspose2d(in_features, out_features, 3, stride=2, padding=1, output_padding=1),nn.InstanceNorm2d(out_features),nn.ReLU(inplace=True) ]in_features = out_featuresout_features = in_features//2# 最后輸出層# 輸入是64*256*256# 輸出是3*256*256model += [ nn.ReflectionPad2d(3),nn.Conv2d(64, output_nc, 7),nn.Tanh() ]self.model = nn.Sequential(*model)def forward(self, x):return self.model(x)

生成器的結構就是最初那幅圖中的右側的樣子。進行下采樣之后接一個殘差模塊,再之后進行上采樣。生成器期望可以學到比較復雜的特征構造方法,所以網絡結構更深,更復雜。判別器結構相對來說要簡單很多。

3. 判別器

class Discriminator(nn.Module):def __init__(self, input_nc):super(Discriminator, self).__init__()# 構建卷積分類器# 輸入為3*256*256# 輸出為64*128*128model = [ nn.Conv2d(input_nc, 64, 4, stride=2, padding=1),nn.LeakyReLU(0.2, inplace=True) ]# 輸入為64*128*128# 輸出為128*64*64model += [ nn.Conv2d(64, 128, 4, stride=2, padding=1),nn.InstanceNorm2d(128), nn.LeakyReLU(0.2, inplace=True) ]# 輸入為128*64*64# 輸出為256*32*32model += [ nn.Conv2d(128, 256, 4, stride=2, padding=1),nn.InstanceNorm2d(256), nn.LeakyReLU(0.2, inplace=True) ]# 輸入為256*32*32# 輸出為512*31*31model += [ nn.Conv2d(256, 512, 4, padding=1),nn.InstanceNorm2d(512), nn.LeakyReLU(0.2, inplace=True) ]# 全卷積分類層# 輸入為輸出為512*31*31# 輸出為1*30*30model += [nn.Conv2d(512, 1, 4, padding=1)]self.model = nn.Sequential(*model)def forward(self, x):x = self.model(x)# 使用平均池化的辦法輸出預測值# avg_pool2d(input,kernel_size),這里kernel_size為30return F.avg_pool2d(x, x.size()[2:]).view(x.size()[0], -1)

就是一個比較普通的分類網絡。通過步長為2來逐步縮小尺寸。可能值得注意的是,相比于傳統的分類神經網絡。我們這里使用全局平均池化的方式進行最終輸出預測。沒有使用全連接層,減小了網絡尺寸。

此外,我還做了一個exe交互程序。可以直接運行,實現圖片中頭像識別和對應性別轉換。可以體驗一下生成對抗網絡的趣味。

對網絡感興趣,以及想要詳細了解原理是具體如何用代碼實現,或者想用有趣數據集做出創意應用的功能的話,可以參考這個視頻課程:點擊鏈接

總結

以上是生活随笔為你收集整理的如何利用CycleGAN实现男女性别转换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。