用Python 可以實現側臉轉正臉?我也要試一下

2021-01-11 AI科技大本營

作者 | 李秋鍵

責編 | Carol

封圖 | CSDN 下載自視覺中國

近幾年來GAN圖像生成應用越來越廣泛,其中主要得益於GAN 在博弈下不斷提高建模能力,最終實現以假亂真的圖像生成。GAN 由兩個神經網絡組成,一個生成器和一個判別器組成,其中生成器試圖產生欺騙判別器的真實樣本,而判別器試圖區分真實樣本和生成樣本。這種對抗博弈下使得生成器和判別器不斷提高性能,在達到納什平衡後生成器可以實現以假亂真的輸出。

其中GAN 在圖像生成應用最為突出,當然在計算機視覺中還有許多其他應用,如圖像繪畫,圖像標註,物體檢測和語義分割。在自然語言處理中應用 GAN 的研究也是一種增長趨勢,如文本建模,對話生成,問答和機器翻譯。然而,在 NLP 任務中訓練 GAN 更加困難並且需要更多技術,這也使其成為具有挑戰性但有趣的研究領域。

而今天我們就將利用CC-GAN訓練將側臉生成正臉的模型,其中迭代20次結果如下:

實驗前的準備

首先我們使用的python版本是3.6.5所用到的模塊如下:tensorflow用來模型訓練和網絡層建立;numpy模塊用來處理矩陣運算;OpenCV用來讀取圖片和圖像處理;os模塊用來讀取數據集等本地文件操作。

素材準備

其中準備訓練的不同角度人臉圖片放入以下文件夾作為訓練集,如下圖可見:

測試集圖片如下可見:

模型搭建

原始GAN(GAN 簡介與代碼實戰)在理論上可以完全逼近真實數據,但它的可控性不強(生成小圖片還行,生成的大圖片可能是不合邏輯的),因此需要對gan加一些約束,能生成我們想要的圖片,這個時候,CGAN就橫空出世了。其中CCGAN整體模型結構如下:

1、網絡結構參數的搭建:

首先是定義標準化、激活函數和池化層等函數:Batch_Norm是對其進行規整,是為了防止同一個batch間的梯度相互抵消。其將不同batch規整到同一個均值0和方差1。InstanceNorm是將輸入在深度方向上減去均值除以標準差,可以加快網絡的訓練速度。

def instance_norm(x, scope='instance_norm'):return tf_contrib.layers.instance_norm(x, epsilon=1e-05, center=True, scale=True, scope=scope)def batch_norm(x, scope='batch_norm'):return tf_contrib.layers.batch_norm(x, decay=0.9, epsilon=1e-05, center=True, scale=True, scope=scope)def flatten(x) :return tf.layers.flatten(x)def lrelu(x, alpha=0.2):return tf.nn.leaky_relu(x, alpha)def relu(x):return tf.nn.relu(x)def global_avg_pooling(x):gap = tf.reduce_mean(x, axis=[1, 2], keepdims=True)return gapdef resblock(x_init, c, scope='resblock'):with tf.variable_scope(scope):with tf.variable_scope('res1'):x = slim.conv2d(x_init, c, kernel_size=[3,3], stride=1, activation_fn = None)x = batch_norm(x)x = relu(x)with tf.variable_scope('res2'):x = slim.conv2d(x, c, kernel_size=[3,3], stride=1, activation_fn = None)x = batch_norm(x)return x + x_init然後是卷積層的定義:

def conv(x, c):x1 = slim.conv2d(x, c, kernel_size=[5,5], stride=2, padding = 'SAME', activation_fn=relu)# print(x1.shape)x2 = slim.conv2d(x, c, kernel_size=[3,3], stride=2, padding = 'SAME', activation_fn=relu)# print(x2.shape)x3 = slim.conv2d(x, c, kernel_size=[1,1], stride=2, padding = 'SAME', activation_fn=relu)# print(x3.shape)out = tf.concat([x1, x2, x3],axis = 3)out = slim.conv2d(out, c, kernel_size=[1,1], stride=1, padding = 'SAME', activation_fn=None)# print(out.shape)return out生成器函數定義:

def mixgenerator(x_init, c, org_pose, trg_pose): reuse = len([t for t in tf.global_variables() if t.name.startswith('generator')]) > 0with tf.variable_scope('generator', reuse = reuse):org_pose = tf.cast(tf.reshape(org_pose, shape=[-1, 1, 1, org_pose.shape[-1]]), tf.float32)print(org_pose.shape)org_pose = tf.tile(org_pose, [1, x_init.shape[1], x_init.shape[2], 1])print(org_pose.shape)x = tf.concat([x_init, org_pose], axis=-1)print(x.shape)x = conv(x, c)x = batch_norm(x, scope='bat_norm_1')x = relu(x)#64print('-')print(x.shape)x = conv(x, c*2)x = batch_norm(x, scope='bat_norm_2')x = relu(x)#32print(x.shape)x = conv(x, c*4)x = batch_norm(x, scope='bat_norm_3')x = relu(x)#16print(x.shape)f_org = xx = conv(x, c*8)x = batch_norm(x, scope='bat_norm_4')x = relu(x)#8print(x.shape)x = conv(x, c*8)x = batch_norm(x, scope='bat_norm_5')x = relu(x)#4print(x.shape)for i in range(6):x = resblock(x, c*8, scope = str(i)+"_resblock")trg_pose = tf.cast(tf.reshape(trg_pose, shape=[-1, 1, 1, trg_pose.shape[-1]]), tf.float32)print(trg_pose.shape)trg_pose = tf.tile(trg_pose, [1, x.shape[1], x.shape[2], 1])print(trg_pose.shape)x = tf.concat([x, trg_pose], axis=-1)print(x.shape)x = slim.conv2d_transpose(x, c*8, kernel_size=[3, 3], stride=2, activation_fn=None)x = batch_norm(x, scope='bat_norm_8')x = relu(x)#8print(x.shape)x = slim.conv2d_transpose(x, c*4, kernel_size=[3, 3], stride=2, activation_fn=None)x = batch_norm(x, scope='bat_norm_9')x = relu(x)#16print(x.shape)f_trg =xx = slim.conv2d_transpose(x, c*2, kernel_size=[3, 3], stride=2, activation_fn=None)x = batch_norm(x, scope='bat_norm_10')x = relu(x)#32print(x.shape)x = slim.conv2d_transpose(x, c, kernel_size=[3, 3], stride=2, activation_fn=None)x = batch_norm(x, scope='bat_norm_11')x = relu(x)#64print(x.shape)z = slim.conv2d_transpose(x, 3 , kernel_size=[3,3], stride=2, activation_fn = tf.nn.tanh)f = tf.concat([f_org, f_trg], axis=-1)print(f.shape)return z, f下面還有判別器等函數定義,不加贅述。

2、VGG程序設立:

VGG模型網絡層的搭建:

def build(self, rgb, include_fc=False):"""load variable from npy to build the VGGinput format: bgr image with shape [batch_size, h, w, 3]scale: (-1, 1)"""start_time = time.timergb_scaled = (rgb + 1) / 2 # [-1, 1] ~ [0, 1]# blue, green, red = tf.split(axis=3, num_or_size_splits=3, value=rgb_scaled)# bgr = tf.concat(axis=3, values=[blue - VGG_MEAN[0],# green - VGG_MEAN[1],# red - VGG_MEAN[2]])self.conv1_1 = self.conv_layer(rgb_scaled, "conv1_1")self.conv1_2 = self.conv_layer(self.conv1_1, "conv1_2")self.pool1 = self.max_pool(self.conv1_2, 'pool1')self.conv2_1 = self.conv_layer(self.pool1, "conv2_1")self.conv2_2 = self.conv_layer(self.conv2_1, "conv2_2")self.pool2 = self.max_pool(self.conv2_2, 'pool2')self.conv3_1 = self.conv_layer(self.pool2, "conv3_1")self.conv3_2_no_activation = self.no_activation_conv_layer(self.conv3_1, "conv3_2")self.conv3_2 = self.conv_layer(self.conv3_1, "conv3_2")self.conv3_3 = self.conv_layer(self.conv3_2, "conv3_3")self.conv3_4 = self.conv_layer(self.conv3_3, "conv3_4")self.pool3 = self.max_pool(self.conv3_4, 'pool3')self.conv4_1 = self.conv_layer(self.pool3, "conv4_1")self.conv4_2 = self.conv_layer(self.conv4_1, "conv4_2")self.conv4_3 = self.conv_layer(self.conv4_2, "conv4_3")self.conv4_4_no_activation = self.no_activation_conv_layer(self.conv4_3, "conv4_4")self.conv4_4 = self.conv_layer(self.conv4_3, "conv4_4")self.pool4 = self.max_pool(self.conv4_4, 'pool4')self.conv5_1 = self.conv_layer(self.pool4, "conv5_1")self.conv5_2 = self.conv_layer(self.conv5_1, "conv5_2")self.conv5_3 = self.conv_layer(self.conv5_2, "conv5_3")self.conv5_4_no_activation = self.no_activation_conv_layer(self.conv5_3, "conv5_4")self.conv5_4 = self.conv_layer(self.conv5_3, "conv5_4")self.pool5 = self.max_pool(self.conv5_4, 'pool5')if include_fc:self.fc6 = self.fc_layer(self.pool5, "fc6")assert self.fc6.get_shape.as_list[1:] == [4096]self.relu6 = tf.nn.relu(self.fc6)self.fc7 = self.fc_layer(self.relu6, "fc7")self.relu7 = tf.nn.relu(self.fc7)self.fc8 = self.fc_layer(self.relu7, "fc8")self.prob = tf.nn.softmax(self.fc8, name="prob")self.data_dict = Noneprint(("Finished building vgg19: %ds" % (time.time - start_time)))池化層、卷積層函數的定義:

def avg_pool(self, bottom, name):return tf.nn.avg_pool(bottom, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME', name=name)defmax_pool(self, bottom, name):return tf.nn.max_pool(bottom, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME', name=name)defconv_layer(self, bottom, name):with tf.variable_scope(name):filt = self.get_conv_filter(name)conv = tf.nn.conv2d(bottom, filt, [1, 1, 1, 1], padding='SAME')conv_biases = self.get_bias(name)bias = tf.nn.bias_add(conv, conv_biases)relu = tf.nn.relu(bias)return reludefno_activation_conv_layer(self, bottom, name):with tf.variable_scope(name):filt = self.get_conv_filter(name)conv = tf.nn.conv2d(bottom, filt, [1, 1, 1, 1], padding='SAME')conv_biases = self.get_bias(name)x = tf.nn.bias_add(conv, conv_biases)return xdeffc_layer(self, bottom, name):with tf.variable_scope(name):shape = bottom.get_shape.as_listdim = 1for d in shape[1:]:dim *= dx = tf.reshape(bottom, [-1, dim])weights = self.get_fc_weight(name)biases = self.get_bias(name)# Fully connected layer. Note that the '+' operation automatically# broadcasts the biases.fc = tf.nn.bias_add(tf.matmul(x, weights), biases)return fcdefget_conv_filter(self, name):return tf.constant(self.data_dict[name][0], name="filter")defget_bias(self, name):return tf.constant(self.data_dict[name][1], name="biases")defget_fc_weight(self, name):return tf.constant(self.data_dict[name][0], name="weights")

模型的訓練

設置GPU加速訓練,需要配置好CUDA環境,並按照tensorflow-gpu版本。

os.environ["CUDA_VISIBLE_DEVICES"] = "0"config = tf.ConfigProtoconfig.gpu_options.allow_growth = Truetf.reset_default_graphmodel = Sequential #創建一個神經網絡對象#添加一個卷積層,傳入固定寬高三通道的數據集讀取和訓練批次的劃分:imagedir = './data/'img_label_org, label_trg, img = reader.images_list(imagedir)epoch = 800batch_size = 10total_sample_num = len(img_label_org)if total_sample_num % batch_size == 0:n_batch = int(total_sample_num / batch_size)else:n_batch = int(total_sample_num / batch_size) + 1輸入輸出神經元和判別器等初始化:

org_image = tf.placeholder(tf.float32,[None,128,128,3], name='org_image')trg_image = tf.placeholder(tf.float32,[None,128,128,3], name='trg_image')org_pose = tf.placeholder(tf.float32,[None,9], name='org_pose')trg_pose = tf.placeholder(tf.float32,[None,9], name='trg_pose')gen_trg, feat = model.mixgenerator(org_image, 32, org_pose, trg_pose)out_trg = model.generator(feat, 32, trg_pose)#D_abD_r, real_logit, real_pose = model.snpixdiscriminator(trg_image)D_f, fake_logit, fake_pose = model.snpixdiscriminator(gen_trg)D_f_, fake_logit_, fake_pose_ = model.snpixdiscriminator(out_trg)# fake or real D_LOSSloss_pred_r = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=real_logit, labels=tf.ones_like(D_r)))loss_pred_f = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=fake_logit_, labels=tf.zeros_like(D_f_)))loss_d_pred = loss_pred_r + loss_pred_f#pose lossloss_d_pose = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=real_pose, labels=trg_pose))loss_g_pose_ = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=fake_pose_, labels=trg_pose))loss_g_pose = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=fake_pose, labels=trg_pose))#G_LOSSloss_g_pred = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=fake_logit_, labels=tf.ones_like(D_f_)))out_pix_loss = ops.L2_loss(out_trg, trg_image)out_pre_loss, out_feat_texture = ops.vgg_loss(out_trg, trg_image)out_loss_texture = ops.texture_loss(out_feat_texture)out_loss_tv = 0.0002 * tf.reduce_mean(ops.tv_loss(out_trg))gen_pix_loss = ops.L2_loss(gen_trg, trg_image)out_g_loss = 100*gen_pix_loss + 100*out_pix_loss + loss_g_pred + out_pre_loss + out_loss_texture + out_loss_tv + loss_g_pose_gen_g_loss = 100 * gen_pix_loss + loss_g_pose# d_lossdisc_loss = loss_d_pred + loss_d_poseout_global_step = tf.Variable(0, trainable=False)gen_global_step = tf.Variable(0, trainable=False)disc_global_step = tf.Variable(0, trainable=False)start_decay_step = 500000start_learning_rate = 0.0001decay_steps = 500000end_learning_rate = 0.0out_lr = (tf.where(tf.greater_equal(out_global_step, start_decay_step), tf.train.polynomial_decay(start_learning_rate, out_global_step-start_decay_step, decay_steps, end_learning_rate, power=1.0),start_learning_rate))gen_lr = (tf.where(tf.greater_equal(gen_global_step, start_decay_step), tf.train.polynomial_decay(start_learning_rate, gen_global_step-start_decay_step, decay_steps, end_learning_rate, power=1.0),start_learning_rate))disc_lr = (tf.where(tf.greater_equal(disc_global_step, start_decay_step), tf.train.polynomial_decay(start_learning_rate, disc_global_step-start_decay_step, decay_steps, end_learning_rate, power=1.0),start_learning_rate))t_vars = tf.trainable_variablesg_gen_vars = [var for var in t_vars if 'generator' in var.name]g_out_vars = [var for var in t_vars if 'generator_1' in var.name]d_vars = [var for var in t_vars if 'discriminator' in var.name]train_gen = tf.train.AdamOptimizer(gen_lr, beta1=0.5, beta2=0.999).minimize(gen_g_loss, var_list = g_gen_vars, global_step = gen_global_step)train_out = tf.train.AdamOptimizer(out_lr, beta1=0.5, beta2=0.999).minimize(out_g_loss, var_list = g_out_vars, global_step = out_global_step)train_disc = tf.train.AdamOptimizer(disc_lr, beta1=0.5, beta2=0.999).minimize(disc_loss, var_list = d_vars, global_step = disc_global_step)saver = tf.train.Saver(tf.global_variables)模型訓練、圖片生成和模型的保存:

with tf.Session(config=config) as sess:for d in ['/gpu:0']:with tf.device(d):ckpt = tf.train.get_checkpoint_state('./models/')if ckpt and tf.train.checkpoint_exists(ckpt.model_checkpoint_path):saver.restore(sess, ckpt.model_checkpoint_path)print('Import models successful!')else:sess.run(tf.global_variables_initializer)print('Initialize successful!')for i in range(epoch):random.shuffle(img_label_org)random.shuffle(label_trg)for j in range(n_batch):if j == n_batch - 1:n = total_sample_numelse:n = j * batch_size + batch_sizeimg_org_output, img_trg_output, label_org_output, label_trg_output, image_name_output = reader.images_read(img_label_org[j*batch_size:n], label_trg[j*batch_size:n], img, imagedir)feeds = {org_image:img_org_output, trg_image:img_trg_output, org_pose:label_org_output,trg_pose:label_trg_output}if i < 400:sess.run(train_disc, feed_dict=feeds)sess.run(train_gen, feed_dict=feeds)sess.run(train_out, feed_dict=feeds)else:sess.run(train_gen, feed_dict=feeds)sess.run(train_out, feed_dict=feeds)if j%10==0:sess.run(train_disc, feed_dict=feeds)if j%2==0:gen_g_loss_,out_g_loss_, disc_loss_, org_image_, gen_trg_, out_trg_, trg_image_ = sess.run([gen_g_loss, out_g_loss, disc_loss, org_image, gen_trg, out_trg, trg_image],feeds)print("epoch:", i, "iter:", j, "gen_g_loss_:", gen_g_loss_, "out_g_loss_:", out_g_loss_, "loss_disc:", disc_loss_)for n in range(batch_size):org_image_output = (org_image_[n] + 1)*127.5gen_trg_output = (gen_trg_[n] + 1)*127.5out_trg_output = (out_trg_[n] + 1)*127.5trg_image_output = (trg_image_[n] + 1)*127.5temp = np.concatenate([org_image_output, gen_trg_output, out_trg_output, trg_image_output], 1)cv.imwrite("./record/%d_%d_%d_image.jpg" %(i, j, n), temp)if i%10==0 or i==epoch-1:saver.save(sess, './models/wssGAN.ckpt', global_step=gen_global_step)print("Finish!")最終運行程序結果如下:

初始訓練一次結果:

訓練20次結果:

經過對比,可以發現有明顯的提升!

源碼地址:

提取碼:kdxe

作者介紹:

李秋鍵,CSDN 博客專家,CSDN達人課作者。碩士在讀於中國礦業大學,開發有taptap安卓武俠遊戲一部,vip視頻解析,文意轉換工具,寫作機器人等項目,發表論文若干,多次高數競賽獲獎等等。

相關焦點

  • 用 Python 可以實現側臉轉正臉?我也要試一下!
    這種對抗博弈下使得生成器和判別器不斷提高性能,在達到納什平衡後生成器可以實現以假亂真的輸出。其中GAN 在圖像生成應用最為突出,當然在計算機視覺中還有許多其他應用,如圖像繪畫,圖像標註,物體檢測和語義分割。在自然語言處理中應用 GAN 的研究也是一種增長趨勢,如文本建模,對話生成,問答和機器翻譯。
  • 人生苦短,我用Python,那麼問題來了,普通人要學python嗎?
    最近在教育店集中地兒瞎晃悠,震驚的發現這年頭六歲娃兒都要學編程了,當時我的表情是這樣的。回到家抱著冷嘲熱諷的心,我特意百度搜索了下新聞,結果我的表情是這樣的:1、Python將納入浙江省高考!從 2018 年起浙江省信息技術教材程式語言將會更換為 Python。
  • 用Python實現職工信息管理系統
    想要實現一個職工管理系統首先我們看一下想要實現什麼功能最基礎的增刪改查肯定要實現的然後增加一下數據顯示、數據排序、數據統計功能下面直接上代碼1.刪除職工數據```pythonid = input('請輸入你要修改的職工編號')ids = [i[0] for i in data]if id not in ids:print('您查詢的職工不存在')returnelse:del data[ids.index(id)]print
  • 用R也可以跑Python了
    通過安裝包,你現在可以在R上運行Python的安裝包和函數了~今天文摘菌就來教教你咋用這個reticulate包。FALSE的話就得先去裝一下Python了。通過使用repl_python()函數,可以使Python和R交互。
  • 用Python畫朵玫瑰,只要五分鐘
    最近一個項目在用python,想著這次不用java了,用python給媽媽個禮物吧。Turtle庫是Python語言中一個非常強大的繪製圖像的函數庫,她提供了很多強大的方法,可以方便快速的繪圖,今天我們就來試一下,畫朵玫瑰送給媽媽。
  • 魅力python——添加新元素、刪除元素、替換元素
    我們需要使用到append()這一個函數,把Alice添加到list中,列印一下,我們看見Alice被添加到了list中。用append()添加的元素永遠是直接被添加到最後的。我們在list中用insert()試一試列印,驗證一下我們看見,Alice被添加到了第二個位置上。刪除元素比如Bob要轉班了,怎麼把Bob的名字刪除呢?
  • 如何在 i5 上實現 20 倍的 Python 運行速度?
    安裝: % bash Anaconda2-4.3.0-Linux-x86_64.sh安裝英特爾加速器,作為一個單獨的、可開啟關閉的「環境」:% conda config --add channels intel % conda create --name intelpy intelpython2_full python=2運行示例程序,看到在我的 openSUSE
  • 如何在Core i5 上實現 20 倍的 Python 運行速度?
    這在 Windows, Linux 或 OS X 都能實現。英特爾並沒有把 openSUSE 加入經他們測試過的 Linux 配置列表中(SUSE Enterprise 在表中),但我在運行中並沒有遇到任何問題。
  • Python 拓展之詳解深拷貝和淺拷貝
    正式開始首先我在這介紹兩個新的小知識,要在下面用到。一個是函數 id() ,另一個是運算符 is。id() 函數就是返回對象的內存地址;is 是比較兩個變量的對象引用是否指向同一個對象,在這裡請不要和 == 混了,== 是比較兩個變量的值是否相等。
  • Python學習第128課——在Python中實現醉漢隨機遊走
    【每天幾分鐘,從零入門python編程的世界!】這節我們在2D平面內實現隨機遊走。我們先把原理搞清楚,用代碼實現這個原理。他每走一步之前,都需要先做一次選擇,選擇往東南西北哪一個方向去走,這個選擇我們需要先引入一個random庫,這是一個可以用來實現隨機數、隨機選擇的庫,用這個庫來實現隨機方向的選擇。東西南北我們分別用E、W、S、N這四個字母表示。選擇的結果我們用step這個變量保存。
  • Python實現視頻裁剪添加水印功能
    今天來實現一個利用Python的moviepy類庫裁剪視頻的功能。寫這個功能的初衷是想批量的裁剪一下視頻,下面一起來看一下代碼吧!python目前我們實現的是將單獨一個視頻進行裁剪。本次我們將目前視頻截取一小段內容,並為其添加一個水印圖片。
  • 如何在Python中實現交互兩個數
    如何在Python中實現交互兩個數【原理】生活中我們要交互兩個杯中的水,小朋友們都知道我們需要再拿一個空杯子來倒換水,今天我們來探索一下python中如何實現交互兩個數【編程】首先我們需要輸入兩個數x=int(input("x="))
  • 用Python 實現手機自動答題,這下百萬答題遊戲誰也玩不過我!
    但是有時候就會想,能不能實現手機自動答題呢,畢竟網絡上是充斥著很多問題的答案,自己手動搜題速度顯然來不及。答案是當然可以,今天我們就來用手機連接電腦,讓電腦自動搜索答案,省時省力省心。基於一些基礎認識,下面我們先來思考下,實現這一項目的整體思路:做這一項目首先會存在以下疑問:1、 我們要讓手機連接電腦,但是怎麼讓電腦自動控制手機呢2、 手機上是顯示文字的,但是怎麼讓電腦看懂你手機上的文字呢3、 電腦知道了問題後如何藉助網絡搜答案呢?
  • 學習Python對辦公真的有用嗎?用經驗告訴你答案
    他們會在廣告文章或者視頻中突出這麼一點:同事下班比我早,就是因為用了python辦公;面對海量數據和文檔要整理,我卻無能為力,但是用了python便可以快速搞定;學習一種程式語言,可以讓自己的職業發展更加有力。不得不說,現在的廣告很能抓住人的心理,學習python可以讓職業發展更加順暢這一點確實擊中我了。
  • 用Python實現簡易超市售貨系統
    今天來實現一個簡單的超市售貨系統數據存儲形式為json的數據首先是讀取數據,這裡用到的Python的json庫,用於處理json類型的數據```pythondef load(): # 數據讀取j = open('goods.txt', 'r', encoding='utf-8')# 逐行讀取文件中的數據
  • 用Python 實現手機自動答題,這下百萬答題遊戲誰也玩不過我
    但是有時候就會想,能不能實現手機自動答題呢,畢竟網絡上是充斥著很多問題的答案,自己手動搜題速度顯然來不及。答案是當然可以,今天我們就來用手機連接電腦,讓電腦自動搜索答案,省時省力省心。基於一些基礎認識,下面我們先來思考下,實現這一項目的整體思路:做這一項目首先會存在以下疑問:1、 我們要讓手機連接電腦,但是怎麼讓電腦自動控制手機呢2、 手機上是顯示文字的,但是怎麼讓電腦看懂你手機上的文字呢
  • 如何用python在工作中「偷懶」?
    作者 | A字頭 來源 | 數據札記倌 有些朋友在工作中會有這樣的困惑:明明我從早忙到晚,為什麼得到的評價還不高?要知道,企業對一個員工的評價是出於「產出」而非「付出」。所以,如果把大量時間花在機械重複的工作上,不但工作效率不高,對個人發展來說也無甚幫助。而這些工作,如果對於會點編程的人來說,往往通過幾行代碼就可以快速搞定了。
  • 使用Scrapy網絡爬蟲框架小試牛刀
    對於框架的學習,重點是要學習其框架的特性、各個功能的用法即可。說人話就是只要是搞爬蟲的,用這個就van事了,因為裡面集成了一些很棒的工具,並且爬取性能很高,預留有很多鉤子方便擴展,實在是居家爬蟲的不二之選。
  • 用Python做特效,分分鐘碾壓五毛黨
    pip install -i https://mirror.baidu.com/pypi/simple paddlehub有了這些準備工作就可以開始我們功能的實現了。只是簡簡單單換個背景算什麼,下面來實現一個稍微複雜的特效——「影分身」。有請我們本場的主演,坤製作人為我們表演他拿手的雞你太美。實現原理和上一個操作沒有本質區別,同樣是逐幀處理,但是這裡還是詳細說一下。
  • 目標檢測必須要OpenCV?10行Python代碼也能實現,親測好用!
    大數據文摘出品編譯:朱一輝、雪清、小魚短短10行代碼就可以實現目標檢測?!本文作者和他的團隊構建了一個名為ImageAI 的Python庫,集成了現今流行的深度學習框架和計算機視覺庫。本文將手把手教你構建自己的第一個目標檢測應用,而且文摘菌已經幫你踩過坑了,親測有效!