2026/4/12 2:52:47
网站建设
项目流程
小型企业网站建设模板,高中数学 wordpress,贵阳高端网站设计公司,wordpress ip黑名单文章目录 0 简介1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示最后 0 简介
今天学长向大家分享一个毕业设计项目
毕业设计 深度学习图像风格迁移系统(源码分享)
项目运行效果#xff1a; 毕业设计 深度学习图像风格迁移系统#x1f9ff; …文章目录0 简介1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示最后0 简介今天学长向大家分享一个毕业设计项目毕业设计 深度学习图像风格迁移系统(源码分享)项目运行效果毕业设计 深度学习图像风格迁移系统 项目分享:见文末!图片风格迁移指的是将一个图片的风格转换到另一个图片中如图所示原图片经过一系列的特征变换具有了新的纹理特征这就叫做风格迁移。1 VGG网络在实现风格迁移之前需要先简单了解一下VGG网络由于VGG网络不断使用卷积提取特征的网络结构和准确的图像识别效率在这里我们使用VGG网络来进行图像的风格迁移。如上图所示从A-E的每一列都表示了VGG网络的结构原理其分别为VGG-11VGG-13VGG-16VGG-19如下图一副图片经过VGG-19网络结构可以最后得到一个分类结构。2 风格迁移对一副图像进行风格迁移需要清楚的有两点。生成的图像需要具有原图片的内容特征生成的图像需要具有风格图片的纹理特征根据这两点可以确定要想实现风格迁移需要有两个loss值一个是生成图片的内容特征与原图的内容特征的loss另一个是生成图片的纹理特征与风格图片的纹理特征的loss。而对一张图片进行不同的特征内容特征和纹理特征提取只需要使用不同的卷积结构进行训练即可以得到。这时我们需要用到两个神经网络。再回到VGG网络上VGG网络不断使用卷积层来提取特征利用特征将物品进行分类所以该网络中提取内容和纹理特征的参数都可以进行迁移使用。故需要将生成的图片经过VGG网络的特征提取再分别针对内容和纹理进行特征的loss计算。如图假设初始化图像xInput image是一张随机图片我们经过fwimage Transform Net网络进行生成生成图片y。此时y需要和风格图片ys进行特征的计算得到一个loss_style与内容图片yc进行特征的计算得到一个loss_content假设lossloss_styleloss_content便可以对fw的网络参数进行训练。现在就可以看网上很常见的一张图片了相较于我画的第一张图这即对VGG内的loss求值过程进行了细化。细化的结果可以分为两个方面1内容损失2风格损失3 内容损失由于上图中使用的模型是VGG-16那么即相当于在VGG-16的relu3-3处对两张图片求得的特征进行计算求损失计算的函数如下简言之假设yc求得的特征矩阵是φ(y)生成图片求得的特征矩阵为φ(y^)且cφ.channelwφ.weighthφ.height则有代码实现defcontent_loss(content_img,rand_img):content_layers[(relu3_3,1.0)]content_loss0.0# 逐个取出衡量内容损失的vgg层名称及对应权重forlayer_name,weightincontent_layers:# 计算特征矩阵pget_vgg(content_img,layer_name)xget_vgg(rand_img,layer_name)# 长x宽xchannelMp.shape[1]*p.shape[2]*p.shape[3]# 根据公式计算损失并进行累加content_loss(1.0/M)*tf.reduce_sum(tf.pow(p-x,2))*weight# 将损失对层数取平均content_loss/len(content_layers)returncontent_loss4 风格损失风格损失由多个特征一同计算首先需要计算Gram MatrixGram Matrix实际上可看做是feature之间的偏心协方差矩阵即没有减去均值的协方差矩阵在feature map中每一个数字都来自于一个特定滤波器在特定位置的卷积因此每个数字就代表一个特征的强度而Gram计算的实际上是两两特征之间的相关性哪两个特征是同时出现的哪两个是此消彼长的等等同时Gram的对角线元素还体现了每个特征在图像中出现的量因此Gram有助于把握整个图像的大体风格。有了表示风格的Gram Matrix要度量两个图像风格的差异只需比较他们Gram Matrix的差异即可。 故在计算损失的时候函数如下在实际使用时该loss的层级一般选择由低到高的多个层比如VGG16中的第2、4、7、10个卷积层然后将每一层的style loss相加。第三个部分不是必须的被称为Total Variation Loss。实际上是一个平滑项一个正则化项目的是使生成的图像在局部上尽可能平滑而它的定义和马尔科夫随机场MRF中使用的平滑项非常相似。 其中yn1是yn的相邻像素。代码实现以上函数# 求gamm矩阵defgram(x,size,deep):xtf.reshape(x,(size,deep))gtf.matmul(tf.transpose(x),x)returngdefstyle_loss(style_img,rand_img):style_layers[(relu1_2,0.25),(relu2_2,0.25),(relu3_3,0.25),(reluv4_3,0.25)]style_loss0.0# 逐个取出衡量风格损失的vgg层名称及对应权重forlayer_name,weightinstyle_layers:# 计算特征矩阵aget_vgg(style_img,layer_name)xget_vgg(rand_img,layer_name)# 长x宽Ma.shape[1]*a.shape[2]Na.shape[3]# 计算gram矩阵Agram(a,M,N)Ggram(x,M,N)# 根据公式计算损失并进行累加style_loss(1.0/(4*M*M*N*N))*tf.reduce_sum(tf.pow(G-A,2))*weight# 将损失对层数取平均style_loss/len(style_layers)returnstyle_loss5 主代码实现代码实现主要分为4步1、随机生成图片2、读取内容和风格图片3、计算总的loss4、训练修改生成图片的参数使得loss最小defmain():# 生成图片rand_imgtf.Variable(random_img(WIGHT,HEIGHT),dtypetf.float32withtf.Session()assess:content_imgcv2.imread(content.jpg)style_imgcv2.imread(style.jpg)# 计算loss值costALPHA*content_loss(content_img,rand_img)BETA*style_loss(style_img,rand_img)optimizertf.train.AdamOptimizer(LEARNING_RATE).minimize(cost)sess.run(tf.global_variables_initializer())forstepinrange(TRAIN_STEPS):# 训练sess.run([optimizer,rand_img])ifstep%500:imgsess.run(rand_img)imgnp.clip(img,0,255).astype(np.uint8)nameOUTPUT_IMAGE//str(step).jpgcv2.imwrite(name,img)6 迁移模型实现由于在进行loss值求解时需要在多个网络层求得特征值并根据特征值进行带权求和所以需要根据已有的VGG网络取其参数重新建立VGG网络。注意在这里使用到的是VGG-19网络在重建的之前首先应该下载Google已经训练好的VGG-19网络以便提取出已经训练好的参数在重建的VGG-19网络中重新利用。下载得到.mat文件以后便可以进行网络重建了。已知VGG-19网络的网络结构如上述图1中的E网络则可以根据E网络的结构对网络重建VGG-19网络进行重建即根据VGG-19模型的结构重新创建一个结构相同的神经网络提取出已经训练好的参数作为新的网络的参数设置为不可改变的常量即可。defvgg19():layers(conv1_1,relu1_1,conv1_2,relu1_2,pool1,conv2_1,relu2_1,conv2_2,relu2_2,pool2,conv3_1,relu3_1,conv3_2,relu3_2,conv3_3,relu3_3,conv3_4,relu3_4,pool3,conv4_1,relu4_1,conv4_2,relu4_2,conv4_3,relu4_3,conv4_4,relu4_4,pool4,conv5_1,relu5_1,conv5_2,relu5_2,conv5_3,relu5_3,conv5_4,relu5_4,pool5)vggscipy.io.loadmat(D://python//imagenet-vgg-verydeep-19.mat)weightsvgg[layers][0]network{}nettf.Variable(np.zeros([1,300,450,3]),dtypetf.float32)network[input]netfori,nameinenumerate(layers):layer_typename[:4]iflayer_typeconv:kernelsweights[i][0][0][0][0][0]biasweights[i][0][0][0][0][1]convtf.nn.conv2d(net,tf.constant(kernels),strides(1,1,1,1),paddingSAME,namename)nettf.nn.relu(convbias)eliflayer_typepool:nettf.nn.max_pool(net,ksize(1,2,2,1),strides(1,2,2,1),paddingSAME)network[name]netreturnnetwork由于计算风格特征和内容特征时数据都不会改变所以为了节省训练时间在训练之前先计算出特征结果(该函数封装在以下代码get_neck()函数中)。总的代码如下importtensorflowastfimportnumpyasnpimportscipy.ioimportcv2importscipy.misc HEIGHT300WIGHT450LEARNING_RATE1.0NOISE0.5ALPHA1BETA500TRAIN_STEPS200OUTPUT_IMAGED://python//imgSTYLE_LAUERS[(conv1_1,0.2),(conv2_1,0.2),(conv3_1,0.2),(conv4_1,0.2),(conv5_1,0.2)]CONTENT_LAYERS[(conv4_2,0.5),(conv5_2,0.5)]defvgg19():layers(conv1_1,relu1_1,conv1_2,relu1_2,pool1,conv2_1,relu2_1,conv2_2,relu2_2,pool2,conv3_1,relu3_1,conv3_2,relu3_2,conv3_3,relu3_3,conv3_4,relu3_4,pool3,conv4_1,relu4_1,conv4_2,relu4_2,conv4_3,relu4_3,conv4_4,relu4_4,pool4,conv5_1,relu5_1,conv5_2,relu5_2,conv5_3,relu5_3,conv5_4,relu5_4,pool5)vggscipy.io.loadmat(D://python//imagenet-vgg-verydeep-19.mat)weightsvgg[layers][0]network{}nettf.Variable(np.zeros([1,300,450,3]),dtypetf.float32)network[input]netfori,nameinenumerate(layers):layer_typename[:4]iflayer_typeconv:kernelsweights[i][0][0][0][0][0]biasweights[i][0][0][0][0][1]convtf.nn.conv2d(net,tf.constant(kernels),strides(1,1,1,1),paddingSAME,namename)nettf.nn.relu(convbias)eliflayer_typepool:nettf.nn.max_pool(net,ksize(1,2,2,1),strides(1,2,2,1),paddingSAME)network[name]netreturnnetwork# 求gamm矩阵defgram(x,size,deep):xtf.reshape(x,(size,deep))gtf.matmul(tf.transpose(x),x)returngdefstyle_loss(sess,style_neck,model):style_loss0.0forlayer_name,weightinSTYLE_LAUERS:# 计算特征矩阵astyle_neck[layer_name]xmodel[layer_name]# 长x宽Ma.shape[1]*a.shape[2]Na.shape[3]# 计算gram矩阵Agram(a,M,N)Ggram(x,M,N)# 根据公式计算损失并进行累加style_loss(1.0/(4*M*M*N*N))*tf.reduce_sum(tf.pow(G-A,2))*weight# 将损失对层数取平均style_loss/len(STYLE_LAUERS)returnstyle_lossdefcontent_loss(sess,content_neck,model):content_loss0.0# 逐个取出衡量内容损失的vgg层名称及对应权重forlayer_name,weightinCONTENT_LAYERS:# 计算特征矩阵pcontent_neck[layer_name]xmodel[layer_name]# 长x宽xchannelMp.shape[1]*p.shape[2]Np.shape[3]lss1.0/(M*N)content_losslss*tf.reduce_sum(tf.pow(p-x,2))*weight# 根据公式计算损失并进行累加# 将损失对层数取平均content_loss/len(CONTENT_LAYERS)returncontent_lossdefrandom_img(height,weight,content_img):noise_imagenp.random.uniform(-20,20,[1,height,weight,3])random_imgnoise_image*NOISEcontent_img*(1-NOISE)returnrandom_imgdefget_neck(sess,model,content_img,style_img):sess.run(tf.assign(model[input],content_img))content_neck{}forlayer_name,weightinCONTENT_LAYERS:# 计算特征矩阵psess.run(model[layer_name])content_neck[layer_name]p sess.run(tf.assign(model[input],style_img))style_content{}forlayer_name,weightinSTYLE_LAUERS:# 计算特征矩阵asess.run(model[layer_name])style_content[layer_name]areturncontent_neck,style_contentdefmain():modelvgg19()content_imgcv2.imread(D://a//content1.jpg)content_imgcv2.resize(content_img,(450,300))content_imgnp.reshape(content_img,(1,300,450,3))-[128.0,128.2,128.0]style_imgcv2.imread(D://a//style1.jpg)style_imgcv2.resize(style_img,(450,300))style_imgnp.reshape(style_img,(1,300,450,3))-[128.0,128.2,128.0]# 生成图片rand_imgrandom_img(HEIGHT,WIGHT,content_img)withtf.Session()assess:# 计算loss值content_neck,style_neckget_neck(sess,model,content_img,style_img)costALPHA*content_loss(sess,content_neck,model)BETA*style_loss(sess,style_neck,model)optimizertf.train.AdamOptimizer(LEARNING_RATE).minimize(cost)sess.run(tf.global_variables_initializer())sess.run(tf.assign(model[input],rand_img))forstepinrange(TRAIN_STEPS):print(step)# 训练sess.run(optimizer)ifstep%100:imgsess.run(model[input])img[128,128,128]imgnp.clip(img,0,255).astype(np.uint8)nameOUTPUT_IMAGE//str(step).jpgimgimg[0]cv2.imwrite(name,img)imgsess.run(model[input])img[128,128,128]imgnp.clip(img,0,255).astype(np.uint8)cv2.imwrite(D://end.jpg,img[0])main()7 效果展示项目运行效果毕业设计 深度学习图像风格迁移系统最后 项目分享:见文末!