zip直鏈生成網站_手把手教你如何用飛槳自動生成二次元人物頭像

8bec7f8d-3118-eb11-8da9-e4434bdf6706.gif

【飛槳開發者說】李思佑,昆明理工大學信息與計算科學大四本科生;2018年和2019年兩次獲得全國大學生數學建模比賽國家二等獎;2020年美國數學建模比賽獲M獎。指導老師:昆明理工大學理學院朱志寧8dec7f8d-3118-eb11-8da9-e4434bdf6706.png想畫出獨一無二的動漫頭像嗎?不會畫也沒關系,深度學習的生成對抗網絡(GAN)可以幫你搞定!只需要輸入一些隨機數,就可以讓卷積神經網絡為你畫出精致并且獨一無二的動漫頭像!本文將通過趣味解讀的方式,基于飛槳深度學習框架以DCGAN為例深入淺出地帶您了解GAN的魔法世界!

效果展示

整體效果

下圖完全是由機器創造出來的二次元人物頭像,細看有些圖片足以以假亂真。92ec7f8d-3118-eb11-8da9-e4434bdf6706.png

橫向對比

每次生成一組shape為[1,72]的隨機數,更改其中某個數值,依次生成20組隨機數,作為生成網絡的輸入,得到橫向對比圖片,觀察GAN帶來的神奇效果,如下所示。改變發色深淺98ec7f8d-3118-eb11-8da9-e4434bdf6706.png改變頭發顏色9cec7f8d-3118-eb11-8da9-e4434bdf6706.png

知識補充

GAN原理簡介

論文地址:https://arxiv.org/abs/1406.2661生成對抗網絡(Generative Adversarial Network ,簡稱GAN)是由一個生成網絡與一個判別網絡組成。生成網絡從潛在空間(latent space)中隨機采樣作為輸入,其輸出結果需要盡量模仿訓練集中的真實樣本。判別網絡的輸入為真實樣本或生成網絡的輸出,其目的是將生成網絡的輸出從真實樣本中盡可能分辨出來,而生成網絡則要盡可能地欺騙判別網絡。兩個網絡相互對抗、不斷調整參數,其目的是讓判別網絡無法判斷輸入是真實樣本還是生成網絡的輸出內容。生成對抗網絡常用于生成以假亂真的圖片 。此外,該方法還被用于生成視頻、三維物體模型等。以下簡單展示了GAN的訓練過程:9fec7f8d-3118-eb11-8da9-e4434bdf6706.png

DCGAN介紹

論文地址:https://arxiv.org/abs/1511.06434DCGAN是深層卷積網絡與 GAN 的結合,其基本原理與 GAN 相同,只是將生成網絡和判別網絡用卷積網絡(CNN)替代。為了提高生成樣本的質量和網絡的收斂速度,論文中的 DCGAN 在網絡結構上進行了一些改進:取消pooling 層、加入batch normalization、使用全卷積網絡、去掉了FC層。激活函數:在生成網絡(G)最后一層使用Tanh函數,其余層采用 ReLu 函數 ; 判別網絡(D)中都采用LeakyReLu。a2ec7f8d-3118-eb11-8da9-e4434bdf6706.png但是在實際過程中,很難得到這個完美的平衡點,關于GAN的收斂理論還在持續不斷的研究中。

實現過程

本項目由Chainer項目Chainerで顔イラストの自動生成改寫為PaddlePaddle項目。

本項目對原項目進行了如下幾個方面的改進:
  1. 將Adam優化器beta1參數設置為0.8,具體請參考Adam: A Method for Stochastic Optimization,以進一步緩解梯度消失/爆炸問題。
  2. 將BatchNorm批歸一化中momentum參數設置為0.5,調參后網絡訓練過程加快。
  3. 將判別網絡(D)的激活函數由elu改為leakyrelu,并將alpha參數設置為0.2。elu與leakyrelu相比效果并不明顯,這里改用計算復雜度更低的leakyrelu
  4. 在判別網絡(D)中增加Dropout層,并將dropout_prob設置為0.4,避免過擬合和梯度消失/爆炸問題
  5. 將生成網絡(G)中的第一層全連接層改為基本殘差模塊,加快收斂速度并使網絡學習到更豐富的特征。
改進后,網絡收斂速度明顯加快,原項目訓練時間需要300個epoch,訓練超過10小時,改進后僅需要90個epoch,訓練時間3個小時左右,同時生成的動漫頭像在細節上層次更加豐富,生成的動漫頭像風格更加多樣。

開發環境

PaddlePaddle1.7.1、Python3.7、Scikit-image等以及線上平臺AI Studio

數據集

數據集通過參考網絡上的爬蟲代碼結合openCV工具進行頭像截取,爬取著名的動漫圖庫網站的http://safebooru.donmai.us/和http://konachan.net/約6萬張圖片。項目所需數據集[二次元人物頭像]已經上傳并公開到AI Studio。

損失函數:

a3ec7f8d-3118-eb11-8da9-e4434bdf6706.png

實現過程:(AI Studio用Jupyter實現)

1. 安裝缺失庫、解壓數據集定義數據預處理

!pip?install?scikit-image
!unzip?data/data17962/二次元人物頭像.zip?-d?data/
!mkdir?./work/Output
!mkdir?./work/Generate?
2. 定義數據預處理-DataReader
import?osimport?cv2import?numpy?as?npimport?paddle.dataset?as?datasetfrom?skimage?import?io,color,transformimport?matplotlib.pyplot?as?pltimport?mathimport?timeimport?paddleimport?paddle.fluid?as?fluidimport?six
img_dim?=?96'''準備數據,定義Reader()'''
PATH?=?'data/faces/'
TEST?=?'data/faces/'class?DataGenerater:def?__init__(self):'''初始化'''
????????self.datalist?=?os.listdir(PATH)
????????self.testlist?=?os.listdir(TEST)def?load(self,?image):'''讀取圖片'''
????????img?=?io.imread(image)
????????img?=?transform.resize(img,(img_dim,img_dim))
????????img?=?img.transpose()
????????img?=?img.astype('float32')return?imgdef?create_train_reader(self):'''給dataset定義reader'''def?reader():for?img?in?self.datalist:#print(img)try:
????????????????????i?=?self.load(PATH?+?img)yield?i.astype('float32')except?Exception?as?e:
????????????????????print(e)return?readerdef?create_test_reader(self,):'''給test定義reader'''def?reader():for?img?in?self.datalist:#print(img)try:
????????????????????i?=?self.load(PATH?+?img)yield?i.astype('float32')except?Exception?as?e:
????????????????????print(e)return?readerdef?train(batch_sizes?=?32):
????reader?=?DataGenerater().create_train_reader()return?readerdef?test():
????reader?=?DataGenerater().create_test_reader()return?reader
3. 定義網絡功能模塊包括卷積池化組、BatchNorm層、全連接層、反卷積層、BatchNorm卷積層。
use_cudnn?=?True
use_gpu?=?True
n?=?0def?bn(x,?name=None,?act=None,momentum=0.5):return?fluid.layers.batch_norm(
????????x,
????????param_attr=name?+?'1',#?指定權重參數屬性的對象
????????bias_attr=name?+?'2',#?指定偏置的屬性的對象
????????moving_mean_name=name?+?'3',#?moving_mean的名稱
????????moving_variance_name=name?+?'4',#?moving_variance的名稱
????????name=name,
????????act=act,
????????momentum=momentum,
????)###卷積池化組def?conv(x,?num_filters,name=None,?act=None):return?fluid.nets.simple_img_conv_pool(
????????input=x,
????????filter_size=5,
????????num_filters=num_filters,
????????pool_size=2,#?池化窗口大小
????????pool_stride=2,#?池化滑動步長
????????param_attr=name?+?'w',
????????bias_attr=name?+?'b',
????????use_cudnn=use_cudnn,
????????act=act
????)###全連接層def?fc(x,?num_filters,?name=None,?act=None):return?fluid.layers.fc(
????????input=x,
????????size=num_filters,
????????act=act,
????????param_attr=name?+?'w',
????????bias_attr=name?+?'b'
????)###反卷積層def?deconv(x,?num_filters,?name=None,?filter_size=5,?stride=2,?dilation=1,?padding=2,?output_size=None,?act=None):return?fluid.layers.conv2d_transpose(
????????input=x,
????????param_attr=name?+?'w',
????????bias_attr=name?+?'b',
????????num_filters=num_filters,#?濾波器數量
????????output_size=output_size,#?輸出圖片大小
????????filter_size=filter_size,#?濾波器大小
????????stride=stride,#?步長
????????dilation=dilation,#?膨脹比例大小
????????padding=padding,
????????use_cudnn=use_cudnn,#?是否使用cudnn內核
????????act=act#?激活函數
????)###BatchNorm卷積層def?conv_bn_layer(input,
??????????????????ch_out,
??????????????????filter_size,
??????????????????stride,
??????????????????padding,
??????????????????act=None,
??????????????????groups=64,
??????????????????name=None):
????tmp?=?fluid.layers.conv2d(
????????input=input,
????????filter_size=filter_size,
????????num_filters=ch_out,
????????stride=stride,
????????padding=padding,
????????act=None,
????????bias_attr=name?+?'_conv_b',
????????param_attr=name?+?'_conv_w',
????)return?fluid.layers.batch_norm(
????????input=tmp,
????????act=act,
????????param_attr=name?+?'_bn_1',#?指定權重參數屬性的對象
????????bias_attr=name?+?'_bn_2',#?指定偏置的屬性的對象
????????moving_mean_name=name?+?'_bn_3',#?moving_mean的名稱
????????moving_variance_name=name?+?'_bn_4',#?moving_variance的名稱
????????name=name?+?'_bn_',
????????momentum=0.5,
????)
4. 定義基本殘差模塊a4ec7f8d-3118-eb11-8da9-e4434bdf6706.jpeg本文采用的殘差單元如上圖所示,由兩個輸出通道數相同的3x3卷積組成。
def?shortcut(input,?ch_in,?ch_out,?stride,name):if?ch_in?!=?ch_out:return?conv_bn_layer(input,?ch_out,?1,?stride,?0,?None,name=name)else:return?inputdef?basicblock(input,?ch_in,?ch_out,?stride,name,act):
????tmp?=?conv_bn_layer(input,?ch_out,?3,?stride,?1,?name=name?+?'_1_',act=act)
????tmp?=?conv_bn_layer(tmp,?ch_out,?3,?1,?1,?act=None,?name=name?+?'_2_')
????short?=?shortcut(input,?ch_in,?ch_out,?stride,name=name)return?fluid.layers.elementwise_add(x=tmp,?y=short,?act='relu')def?layer_warp(block_func,?input,?ch_in,?ch_out,?count,?stride,name,act='relu'):
????tmp?=?block_func(input,?ch_in,?ch_out,?stride,name=name?+?'1',act=act)for?i?in?range(1,?count):
????????tmp?=?block_func(tmp,?ch_out,?ch_out,?1,name=name?+?str(i?+?1),act=act)return?tmp
5. 判別網絡
  • 將BatchNorm批歸一化中momentum參數設置為0.5
  • 將判別網絡(D)激活函數由elu改為leaky_relu,并將alpha參數設置為0.2
  • 在判別器(D)中增加Dropout層,并將dropout_prob設置為0.4
輸入為大小96x96的RGB三通道圖片。輸出結果經過一層全連接層最后輸出shape為[batch_size,2]的Tensor。
###判別器def?D(x):#?(96?+?2?*?1?-?4)?/?2?+?1?=?48
????x?=?conv_bn_layer(x,?64,?4,?2,?1,?act=None,?name='conv_bn_1')
????x?=?fluid.layers.leaky_relu(x,alpha=0.2,name='leaky_relu_1')
????x?=?fluid.layers.dropout(x,0.4,name='dropout1')#?(48?+?2?*?1?-?4)?/?2?+?1?=?24
????x?=?conv_bn_layer(x,?128,?4,?2,?1,?act=None,?name='conv_bn_2')
????x?=?fluid.layers.leaky_relu(x,alpha=0.2,name='leaky_relu_2')
????x?=?fluid.layers.dropout(x,0.4,name='dropout2')#?(24?+?2?*?1?-?4)?/?2?+?1?=?12
????x?=?conv_bn_layer(x,?256,?4,?2,?1,?act=None,?name='conv_bn_3')
????x?=?fluid.layers.leaky_relu(x,alpha=0.2,name='leaky_relu_3')
????x?=?fluid.layers.dropout(x,0.4,name='dropout3')#?(12?+?2?*?1?-?4)?/?2?+?1?=?6
????x?=?conv_bn_layer(x,?512,?4,?2,?1,?act=None,?name='conv_bn_4')
????x?=?fluid.layers.leaky_relu(x,alpha=0.2,name='leaky_relu_4')
????x?=?fluid.layers.dropout(x,0.4,name='dropout4')
????x?=?fluid.layers.reshape(x,shape=[-1,?512?*?6?*?6])
????x?=?fc(x,?2,?name='fc1')return?x
6. 生成網絡將BatchNorm批歸一化中momentum參數設置為0.5。將生成器(G)中的第一層全連接層改為基本殘差模塊。輸入Tensor的Shape為[batch_size,72],其中每個數值大小都是0~1之間的float32隨機數。輸出為大小96x96RGB三通道圖片。
###生成器
def?G(x):
????#x?=?fc(x,6?*?6?*?2,name='g_fc1',act='relu')
????#x?=?bn(x,?name='g_bn_1',?act='relu',momentum=0.5)
????x?=?fluid.layers.reshape(x,?shape=[-1,?2,?6,?6])
????x?=?layer_warp(basicblock,?x,?2,?256,?1,?1,?name='g_res1',?act='relu')
????#?2?*?(6?-?1)?-?2?*?1??+?4?=?12
????x?=?deconv(x,?num_filters=256,?filter_size=4,?stride=2,?padding=1,?name='g_deconv_1')
????x?=?bn(x,?name='g_bn_2',?act='relu',momentum=0.5)
????#?2?*?(12?-?1)?-?2?*?1??+?4?=?24
????x?=?deconv(x,?num_filters=128,?filter_size=4,?stride=2,?padding=1,?name='g_deconv_2')
????x?=?bn(x,?name='g_bn_3',?act='relu',momentum=0.5)
????#?2?*?(24?-?1)?-?2?*?1??+?4?=?48
????x?=?deconv(x,?num_filters=64,?filter_size=4,?stride=2,?padding=1,?name='g_deconv_3')
????x?=?bn(x,?name='g_bn_4',?act='relu',momentum=0.5)
????#?2?*?(48?-?1)?-?2?*?1??+?4?=?96
????x?=?deconv(x,?num_filters=3,?filter_size=4,?stride=2,?padding=1,?name='g_deconv_4',act='relu')
????return?x
損失函數選用softmax_with_cross_entropy,公式如下:7. 訓練網絡設置的超參數為:
  • 學習率:2e-4
  • Epoch: 90
  • Mini-Batch:100
  • 單個隨機張量大小:72
import?IPython.display?as?displayimport?warnings
warnings.filterwarnings('ignore')
img_dim?=?96
LEARENING_RATE?=?2e-4
SHOWNUM?=?12
epoch?=?90
output?=?"work/Output/"
batch_size?=?100
G_DIMENSION?=?72
d_program?=?fluid.Program()
dg_program?=?fluid.Program()###定義判別網絡program#?program_guard()接口配合with語句將with?block中的算子和變量添加指定的全局主程序(main_program)和啟動程序(start_progrom)with?fluid.program_guard(d_program):#?輸入圖片大小為28*28
????img?=?fluid.layers.data(name='img',?shape=[None,3,img_dim,img_dim],?dtype='float32')#?標簽shape=1
????label?=?fluid.layers.data(name='label',?shape=[None,1],?dtype='int64')
????d_logit?=?D(img)
????d_loss?=?loss(x=d_logit,?label=label)###定義生成網絡programwith?fluid.program_guard(dg_program):
????noise?=?fluid.layers.data(name='noise',?shape=[None,G_DIMENSION],?dtype='float32')#label?=?np.ones(shape=[batch_size,?G_DIMENSION],?dtype='int64')#?噪聲數據作為輸入得到生成照片
????g_img?=?G(x=noise)
????g_program?=?dg_program.clone()
????g_program_test?=?dg_program.clone(for_test=True)#?判斷生成圖片為真實樣本的概率
????dg_logit?=?D(g_img)#?計算生成圖片被判別為真實樣本的loss
????dg_loss?=?loss(
????????x=dg_logit,
????????label=fluid.layers.fill_constant_batch_size_like(input=noise,?dtype='int64',?shape=[-1,1],?value=1)
????)###優化函數
opt?=?fluid.optimizer.Adam(learning_rate=LEARENING_RATE,beta1=0.5)
opt.minimize(loss=d_loss)
parameters?=?[p.name?for?p?in?g_program.global_block().all_parameters()]
opt.minimize(loss=dg_loss,?parameter_list=parameters)
train_reader?=?paddle.batch(
????paddle.reader.shuffle(
????????reader=train(),?buf_size=50000
????),
????batch_size=batch_size
)
test_reader?=?paddle.batch(
????paddle.reader.shuffle(
????????reader=test(),?buf_size=10000
????),
????batch_size=10
)###執行器if?use_gpu:
????exe?=?fluid.Executor(fluid.CUDAPlace(0))else:
????exe?=?fluid.Executor(fluid.CPUPlace())
start_program?=?fluid.default_startup_program()
exe.run(start_program)#加載模型#fluid.io.load_persistables(exe,'work/Model/D/',d_program)#fluid.io.load_persistables(exe,'work/Model/G/',dg_program)###訓練過程
t_time?=?0
losses?=?[[],?[]]#?判別器迭代次數
NUM_TRAIN_TIME_OF_DG?=?2#?最終生成的噪聲數據
const_n?=?np.random.uniform(
????low=0.0,?high=1.0,
????size=[batch_size,?G_DIMENSION]).astype('float32')
test_const_n?=?np.random.uniform(
????low=0.0,?high=1.0,
????size=[100,?G_DIMENSION]).astype('float32')#plt.ion()
now?=?0for?pass_id?in?range(epoch):
????fluid.io.save_persistables(exe,?'work/Model/G',?dg_program)
????fluid.io.save_persistables(exe,?'work/Model/D',?d_program)for?batch_id,?data?in?enumerate(train_reader()):??#?enumerate()函數將一個可遍歷的數據對象組合成一個序列列表if?len(data)?!=?batch_size:continue#?生成訓練過程的噪聲數據
????????noise_data?=?np.random.uniform(
????????????low=0.0,?high=1.0,
????????????size=[batch_size,?G_DIMENSION]).astype('float32')#?真實圖片
????????real_image?=?np.array(data)#?真實標簽
????????real_labels?=?np.ones(shape=[batch_size,1],?dtype='int64')#?real_labels?=?real_labels?*?10#?虛假標簽
????????fake_labels?=?np.zeros(shape=[batch_size,1],?dtype='int64')
????????s_time?=?time.time()#print(np.max(noise_data))#?虛假圖片
????????generated_image?=?exe.run(g_program,
??????????????????????????????????feed={'noise':?noise_data},
??????????????????????????????????fetch_list=[g_img])[0]###訓練判別器#?D函數判斷虛假圖片為假的loss
????????d_loss_1?=?exe.run(d_program,
???????????????????????????feed={'img':?generated_image,'label':?fake_labels,
???????????????????????????},
???????????????????????????fetch_list=[d_loss])[0][0]#?D函數判斷真實圖片為真的loss
????????d_loss_2?=?exe.run(d_program,
???????????????????????????feed={'img':?real_image,'label':?real_labels,
???????????????????????????},
???????????????????????????fetch_list=[d_loss])[0][0]
????????d_loss_n?=?d_loss_1?+?d_loss_2
????????losses[0].append(d_loss_n)###訓練生成器for?_?in?six.moves.xrange(NUM_TRAIN_TIME_OF_DG):
????????????noise_data?=?np.random.uniform(??#?uniform()方法從一個均勻分布[low,high)中隨機采樣
????????????????low=0.0,?high=1.0,
????????????????size=[batch_size,?G_DIMENSION]).astype('float32')
????????????dg_loss_n?=?exe.run(dg_program,
????????????????????????????????feed={'noise':?noise_data},
????????????????????????????????fetch_list=[dg_loss])[0][0]
????????losses[1].append(dg_loss_n)
????????t_time?+=?(time.time()?-?s_time)if?batch_id?%?500?==?0:if?not?os.path.exists(output):
????????????????os.makedirs(output)#?每輪的生成結果
????????????generated_image?=?exe.run(g_program_test,?feed={'noise':?test_const_n},?fetch_list=[g_img])[0]#print(generated_image[1])
????????????imgs?=?[]
????????????plt.figure(figsize=(15,15))try:for?i?in?range(100):
????????????????????image?=?generated_image[i].transpose()
????????????????????plt.subplot(10,?10,?i?+?1)
????????????????????plt.imshow(image)
????????????????????plt.axis('off')
????????????????????plt.xticks([])
????????????????????plt.yticks([])
????????????????????plt.subplots_adjust(wspace=0.1,?hspace=0.1)#?plt.subplots_adjust(wspace=0.1,hspace=0.1)
????????????????msg?=?'Epoch?ID={0}?Batch?ID={1}?\n?D-Loss={2}?G-Loss={3}'.format(pass_id?+?92,?batch_id,?d_loss_n,?dg_loss_n)#print(msg)
????????????????plt.suptitle(msg,fontsize=20)
????????????????plt.draw()#if?batch_id?%?10000?==?0:
????????????????plt.savefig('{}/{:04d}_{:04d}.png'.format(output,?pass_id?+?92,?batch_id),bbox_inches='tight')
????????????????plt.pause(0.01)
????????????????display.clear_output(wait=True)#plt.pause(0.01)except?IOError:
????????????????print(IOError)#plt.ioff()
plt.close()
plt.figure(figsize=(15,?6))
x?=?np.arange(len(losses[0]))
plt.title('Loss')
plt.xlabel('Number?of?Batch')
plt.plot(x,np.array(losses[0]),'r-',label='D?Loss')
plt.plot(x,np.array(losses[1]),'b-',label='G?Loss')
plt.legend()
plt.savefig('work/Train?Process')
plt.show()
得到的損失變化曲線為:a8ec7f8d-3118-eb11-8da9-e4434bdf6706.png

項目總結

簡單介紹了一下DCGAN的原理,通過對原項目的改進和優化,一步一步依次對生成網絡和判別網絡以及訓練過程進行介紹。通過橫向對比某個輸入元素對生成圖片的影響。平均更改其中某個數值,依次生成20組隨機數,輸入生成器,得到橫向對比圖片,得到GAN神奇的過渡。DCGAN生成的二次元頭像仔細看有些圖片確實是足以以假亂真的,通過DCGAN了解到GAN的強大“魔力”。不足之處是生成的圖片分辨率比較低(96X96),在以后的項目我會通過改進網絡使得生成的二次元頭像有更高的分辨率和更豐富的細節。個人AI Studio主頁:https://aistudio.baidu.com/aistudio/personalcenter/thirdview/56447如在使用過程中有問題,可加入飛槳官方QQ群進行交流:703252161。如果您想詳細了解更多飛槳的相關內容,請參閱以下文檔。飛槳生成對抗網絡項目地址:GitHub:?https://github.com/PaddlePaddle/models/tree/release/1.8/PaddleCV/ganGitee:https://gitee.com/paddlepaddle/models/tree/develop/PaddleCV/gan官網地址:https://www.paddlepaddle.org.cn飛槳開源框架項目地址:GitHub:https://github.com/PaddlePaddle/PaddleGitee:?https://gitee.com/paddlepaddle/Paddle

END

abec7f8d-3118-eb11-8da9-e4434bdf6706.jpeg

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/395102.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395102.shtml
英文地址,請注明出處:http://en.pswp.cn/news/395102.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Gradle入門到實戰(一) — 全面了解Gradle

聲明:本文來自汪磊的博客,轉載請注明出處 可關注個人公眾號,那里更新更及時,閱讀體驗更好: 友情提示由于文章是從個人公眾號拷貝過來整理的,發現圖片沒有正常顯示,沒關注公眾號的同學可通過如下…

java 0-9所有排列_java實現:鍵盤輸入從0~9中任意5個數,排列組合出所有不重復的組合,打印出來...

必有追加大分!!!比如1.2.3.4.5共有120個組合12345,12354,12435,12453,12534,12543;13245,13254,13425,13452,13524&#x…

智能家居物聯網化將成為AWE大會最大看點

AWE大會已經在今日9點半開幕,AWE在今年將擴張至8個展館,其整體展示規模達到11萬平米,這是以往都無法匹敵的。海爾、美的、格力、海信、創維、TCL、康佳、格蘭仕、澳柯瑪、新飛、美菱、奧馬、方太、老板、萬和、萬家樂、華帝、帥康、櫻花、格美…

PHP 命名空間(namespace)

PHP 命名空間(namespace) PHP 命名空間(namespace)是在PHP 5.3中加入的,如果你學過C#和Java,那命名空間就不算什么新事物。 不過在PHP當中還是有著相當重要的意義。 PHP 命名空間可以解決以下兩類問題: 用戶編寫的代碼與PHP內部的類/函數/常量…

給matrix重新列名_如何認真升級Mac終端(甚至給它一個Matrix主題)

給matrix重新列名by Marcus Gardiner通過馬庫斯加德納(Marcus Gardiner) 如何認真升級Mac終端(甚至給它一個Matrix主題) (How to seriously upgrade your Mac terminal (and even give it a Matrix theme)) 藍色藥丸,紅色藥丸和通往極樂世界的3個步驟 (A Blue Pill…

javaweb 圖書管理系統完整代碼_看一名Java開發人員以紅隊思維五分鐘審計一套代碼(續)...

前言上篇文章的發布引起了很多讀者的瀏覽,有很多讀者也催更希望讀到續集,作者也收獲到讀者的鼓勵,說明這條路線對大家有幫助,是有意義的。所以,今天作者將繼續闡述在審計Java代碼時的思路。概述上篇文章所講的SQL注入和…

愛立信數據分析解決方案抓住物聯網發展機遇

愛立信在2016年1月6日至9日于美國拉斯維加斯舉辦的國際消費電子展(CES)上推出“用戶和物聯網數據分析”解決方案。該解決方案將能幫助運營商提高對用戶和物聯網終端的內部管理效率,同時探索跨越多個垂直領域的新型物聯網應用。 用戶和物聯網數…

Lua初學習 9-12 基礎

1:string 轉 number :tonumber(string) 2: number 轉 string :tostring(number) 3:string API: Lua中的字符串是不可變值,a "cocotang" string.gsub(a,"c","z") print(a) ----> cocotang 1獲得字符串長度:string.le…

iview下拉選

問題描述:創建場景,連續創建場景時,第一個場景創建成功后,第二次進入創建窗口,點擊測試任務下拉編輯只有上次創建成功的那一個任務候選,選中該任務中,關聯腳本也只有上次成功創建的唯一個候選下…

JAVA實現在面板中添加圖表_Java 創建PowerPoint圖表并為其添加趨勢線

圖表,是指將既得數據用圖形的方式表示出來。在前文中我們介紹過如何使用Java程序來為Excel文檔創建圖表的方法。本文將通過使用Java程序來演示如何創建PowerPoint圖表及為圖表添加趨勢線。趨勢線的運用能夠顯示數據的變化趨勢,同時能夠幫助預測數據的未來…

code warri_我參加了有史以來的第一屆Warri Tech宣傳活動。 這是我學到的。

code warriIn the city of Warri, Delta state of Nigeria, there is a saying that goes “Warri nor dey carry last, if e hard well well na draw”. This translates to “Warri is never behind in the scheme of things (events)”.在尼日利亞三角洲州的沃里市&#xff…

Socket編程小結

目錄: 什么是 socket?... 1 Internet 套接字的兩種類型... 1 網絡理論... 2 結構體... 2 本機轉換... 3 IP 地址和如何處理它們... 4 socket()函數... 4 bind()函數... 4 connect()程序... 5 listen()函數... 6 accept()函數... 6 send() and recv() 7 …

idea設置中文界面_《英雄聯盟手游》設置界面中文翻譯圖分享 外服漢化界面一覽...

導讀 英雄聯盟手游目前以及正式上線了,不過現在的話是沒有中文版的,只有外服,所有很多地方是看不懂的,也不明白的,這樣的話就需要翻譯了,具體要怎么設置會比較,相關的步驟是什么呢?下…

windows 2008 r2 系統默認80端口被系統占用的處理

--windows 2008 r2 系統默認80端口被系統占用的處理 --使用netstat 命令查看指定端口netstat -ano | findstr :80----如下所示:本地的80端口被進程為4的占用 TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4 TCP 192.168.1.207:60652 …

java實現封裝的三部_Java 封裝

Java 封裝在面向對象程式設計方法中,封裝(英語:Encapsulation)是指,一種將抽象性函式接口的實作細節部份包裝、隱藏起來的方法。封裝可以被認為是一個保護屏障,防止該類的代碼和數據被外部類定義的代碼隨機訪問。要訪問該類的代碼…

小豬短租超棒新房_freeCodeCamp講座簡介:您可以免費觀看的超棒技術講座

小豬短租超棒新房by Quincy Larson昆西拉爾森(Quincy Larson) freeCodeCamp講座簡介:您可以免費觀看的超棒技術講座 (Introducing freeCodeCamp Talks: awesome tech talks you can watch for free) Developers give thousands of tech talks every year at confer…

安卓10不支持qmc解碼_官宣:安卓10已發布!21款手機已適配,小米華為率先支持...

隨著今天凌晨谷歌 I/O 大會的召開,Android Q 也就是安卓10正式官宣,新版的安卓10加入了諸多新手勢,從 Home 鍵設計上看,安卓10 的新版手勢很大程度上有疑似借鑒 iOS 的手勢,底部一個長條,作為 Home 用來返回…

linux系統編程之進程(七):system()函數使用【轉】

本文轉載自:http://www.cnblogs.com/mickole/p/3187974.html 一,system()理解 功能:system()函數調用“/bin/sh -c command”執行特定的命令,阻塞當前進程直到command命令執行完畢 原型: int system(const char *comma…

安裝了最新版本的java 用友nc打不開_NC無法安裝客戶端插件,不能進入用友NC系統登陸界面...

NC無法安裝客戶端插件,不能進入用友NC系統登陸界面問題現象現象1:可以打開web界面,但無法進入登陸界面,一直停留在右圖所示界面。現象2:系統提示安全警告問題原因在使用IE首次登錄NC系統時,系統會自動下載N…

漢王云名片識別(SM)組件開發詳解

大家好,最近在DeviceOne平臺上做了一個漢王云名片識別的功能組件。下面把我開發過程給大家做一個分享,希望可以幫助到大家。 下面我把我的思路給大家講解一下。1.找到我要集成的sdk,也就是漢王云名片的sdk下載(android和ios&#…