>  기사  >  기술 주변기기  >  생성적 적대 네트워크, AI가 사진을 만화 스타일로 변환합니다.

생성적 적대 네트워크, AI가 사진을 만화 스타일로 변환합니다.

WBOY
WBOY앞으로
2023-04-11 21:58:051624검색

안녕하세요 여러분.

모두가 최근 AI 그림을 가지고 놀고 있습니다. GitHub에서 공유할 오픈 소스 프로젝트를 찾았습니다.

생성적 적대 네트워크, AI가 사진을 만화 스타일로 변환합니다.

오늘 공유한 프로젝트는 GAN Generative Adversarial Network를 사용하여 구현되었습니다. GAN의 원리와 실제에 대해 이전에 많은 기사를 공유한 적이 있습니다. 더 알고 싶은 친구들은 역사적인 기사를 읽어보세요.

소스 코드와 데이터 세트는 기사 끝 부분에서 확인할 수 있습니다. 프로젝트를 훈련하고 실행하는 방법을 공유해 보겠습니다.

1. 환경을 준비하세요

tensorflow-gpu 1.15.0을 설치하고, GPU 그래픽카드는 2080Ti, cuda 버전 10.0을 사용하세요.

git에서 프로젝트 AnimeGANv2 소스 코드를 다운로드하세요.

환경을 설정한 후에도 데이터 세트와 vgg19를 준비해야 합니다.

생성적 적대 네트워크, AI가 사진을 만화 스타일로 변환합니다.

GAN 훈련을 위한 6k 실제 사진과 2k 만화 사진이 포함된 Dataset.zip 압축 파일을 다운로드하세요.

생성적 적대 네트워크, AI가 사진을 만화 스타일로 변환합니다.

vgg19는 손실을 계산하는 데 사용되며, 이에 대해서는 아래에서 자세히 소개하겠습니다.

2. 네트워크 모델

생성적 적대 네트워크는 두 가지 모델을 정의해야 합니다. 하나는 생성자이고 다른 하나는 판별자입니다.

생성기 네트워크는 다음과 같이 정의됩니다.

with tf.variable_scope('A'):
inputs = Conv2DNormLReLU(inputs, 32, 7)
inputs = Conv2DNormLReLU(inputs, 64, strides=2)
inputs = Conv2DNormLReLU(inputs, 64)

with tf.variable_scope('B'):
inputs = Conv2DNormLReLU(inputs, 128, strides=2)
inputs = Conv2DNormLReLU(inputs, 128)

with tf.variable_scope('C'):
inputs = Conv2DNormLReLU(inputs, 128)
inputs = self.InvertedRes_block(inputs, 2, 256, 1, 'r1')
inputs = self.InvertedRes_block(inputs, 2, 256, 1, 'r2')
inputs = self.InvertedRes_block(inputs, 2, 256, 1, 'r3')
inputs = self.InvertedRes_block(inputs, 2, 256, 1, 'r4')
inputs = Conv2DNormLReLU(inputs, 128)

with tf.variable_scope('D'):
inputs = Unsample(inputs, 128)
inputs = Conv2DNormLReLU(inputs, 128)

with tf.variable_scope('E'):
inputs = Unsample(inputs,64)
inputs = Conv2DNormLReLU(inputs, 64)
inputs = Conv2DNormLReLU(inputs, 32, 7)
with tf.variable_scope('out_layer'):
out = Conv2D(inputs, filters =3, kernel_size=1, strides=1)
self.fake = tf.tanh(out)

생성기의 메인 모듈은 역 잔차 블록입니다

생성적 적대 네트워크, AI가 사진을 만화 스타일로 변환합니다.

잔차 구조(a)와 역 잔차 블록(b)

판별기 네트워크 구조는 다음과 같습니다.

def D_net(x_init,ch, n_dis,sn, scope, reuse):
channel = ch // 2
with tf.variable_scope(scope, reuse=reuse):
x = conv(x_init, channel, kernel=3, stride=1, pad=1, use_bias=False, sn=sn, scope='conv_0')
x = lrelu(x, 0.2)

for i in range(1, n_dis):
x = conv(x, channel * 2, kernel=3, stride=2, pad=1, use_bias=False, sn=sn, scope='conv_s2_' + str(i))
x = lrelu(x, 0.2)

x = conv(x, channel * 4, kernel=3, stride=1, pad=1, use_bias=False, sn=sn, scope='conv_s1_' + str(i))
x = layer_norm(x, scope='1_norm_' + str(i))
x = lrelu(x, 0.2)

channel = channel * 2

x = conv(x, channel * 2, kernel=3, stride=1, pad=1, use_bias=False, sn=sn, scope='last_conv')
x = layer_norm(x, scope='2_ins_norm')
x = lrelu(x, 0.2)

x = conv(x, channels=1, kernel=3, stride=1, pad=1, use_bias=False, sn=sn, scope='D_logit')

return x

3.Loss

손실을 계산하기 전에 VGG19 네트워크를 사용하여 이미지를 벡터화합니다. 이 프로세스는 NLP의 Embedding 작업과 약간 비슷합니다.

Eembedding​은 단어를 벡터로 변환하는 것이고, VGG19는 그림을 벡터로 변환하는 것입니다.

생성적 적대 네트워크, AI가 사진을 만화 스타일로 변환합니다.

VGG19 정의

손실 부분 계산 논리는 다음과 같습니다.

def con_sty_loss(vgg, real, anime, fake):

# 真实생성적 적대 네트워크, AI가 사진을 만화 스타일로 변환합니다.向量化
vgg.build(real)
real_feature_map = vgg.conv4_4_no_activation

# 生成생성적 적대 네트워크, AI가 사진을 만화 스타일로 변환합니다.向量化
vgg.build(fake)
fake_feature_map = vgg.conv4_4_no_activation

# 漫画风格向量化
vgg.build(anime[:fake_feature_map.shape[0]])
anime_feature_map = vgg.conv4_4_no_activation

# 真实생성적 적대 네트워크, AI가 사진을 만화 스타일로 변환합니다.与生成생성적 적대 네트워크, AI가 사진을 만화 스타일로 변환합니다.的损失
c_loss = L1_loss(real_feature_map, fake_feature_map)
# 漫画风格与生成생성적 적대 네트워크, AI가 사진을 만화 스타일로 변환합니다.的损失
s_loss = style_loss(anime_feature_map, fake_feature_map)

return c_loss, s_loss

여기서 vgg19는 실제 이미지(매개변수 real)와 생성된 이미지(매개변수 fake)의 손실을 각각 계산하는 데 사용됩니다. 생성된 이미지(매개변수 가짜) 및 만화 스타일 손실(매개변수 애니메이션).

c_loss, s_loss = con_sty_loss(self.vgg, self.real, self.anime_gray, self.generated)
t_loss = self.con_weight * c_loss + self.sty_weight * s_loss + color_loss(self.real,self.generated) * self.color_weight + tv_loss

마지막으로 이 두 손실에 서로 다른 가중치를 부여하여 생성기에 의해 생성된 그림이 실제 그림의 모양을 유지할 뿐만 아니라 만화 스타일로 마이그레이션되도록 합니다

4. Training

에서 다음 명령을 실행합니다. 프로젝트 디렉토리 training

python train.py --dataset Hayao --epoch 101 --init_epoch 10

을 시작하고 성공적으로 실행하면 데이터를 볼 수 있습니다.

생성적 적대 네트워크, AI가 사진을 만화 스타일로 변환합니다.

동시에 손실도 줄어들고 있는 것을 확인할 수 있습니다.

소스 코드와 데이터 세트가 패키지되어 있습니다. 필요한 경우 댓글 영역에 메시지를 남겨주세요.

이 글이 도움이 되셨다면 클릭하셔서 읽어보시고 앞으로도 훌륭한 Python+AI 프로젝트를 계속 공유하도록 격려해 주세요.

위 내용은 생성적 적대 네트워크, AI가 사진을 만화 스타일로 변환합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제