<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          用Python讓特朗普和蒙娜麗莎深情合唱《Unravel》

          共 7797字,需瀏覽 16分鐘

           ·

          2020-08-24 21:34

          (給機(jī)器學(xué)習(xí)算法與Python實(shí)戰(zhàn)加星標(biāo),提升AI技能)


          1


          前言

          讓一張圖片,動(dòng)起來,應(yīng)該怎么做?

          DeepFake 一階運(yùn)動(dòng)模型,讓萬物皆可動(dòng)。

          利用這項(xiàng)技術(shù),用特朗普和蒙娜麗莎的圖片,合唱一首《Unravel》,是什么效果?

          今天,它來了!


          今天,繼續(xù)手把手教學(xué)

          算法原理、環(huán)境搭建、效果實(shí)現(xiàn),一條龍服務(wù),盡在下文!

          2


          算法原理

          First Order Motion,也就是一階運(yùn)動(dòng)模型,來自 NeurIPS 2019 論文。

          「First Order Motion Model for Image Animation」

          論文最初的目的是讓「靜態(tài)圖片」動(dòng)起來。如下圖所示:“你動(dòng),它也動(dòng)”。


          這個(gè)模型可以輕易地讓「權(quán)利的游戲」中的人物模仿特朗普進(jìn)行講話,還可以讓靜態(tài)的馬跑起來等。



          一階運(yùn)動(dòng)模型的思想是用一組自學(xué)習(xí)的關(guān)鍵點(diǎn)和局部仿射變換來建立復(fù)雜運(yùn)動(dòng)模型。

          模型由運(yùn)動(dòng)估計(jì)模塊和圖像生成模塊兩個(gè)主要部分組成。


          首先進(jìn)行關(guān)鍵點(diǎn)檢測,然后根據(jù)關(guān)鍵點(diǎn),進(jìn)行運(yùn)動(dòng)估計(jì),最后使用圖像生成模塊,生成最終效果。

          在運(yùn)動(dòng)估計(jì)模塊中,該模型通過自監(jiān)督學(xué)習(xí)將目標(biāo)物體的外觀和運(yùn)動(dòng)信息進(jìn)行分離,并進(jìn)行特征表示。

          而在圖像生成模塊中,模型會(huì)對(duì)目標(biāo)運(yùn)動(dòng)期間出現(xiàn)的遮擋進(jìn)行建模,然后從給定的圖片中提取外觀信息,結(jié)合先前獲得的特征表示,生成圖片。

          作者使用該算法在四個(gè)數(shù)據(jù)集上進(jìn)行了訓(xùn)練和測試。

          VoxCeleb 數(shù)據(jù)集、UvA-Nemo 數(shù)據(jù)集、The BAIR robot pushing dataset、作者自己收集的數(shù)據(jù)集。

          其中,VoxCeleb 是一個(gè)大型人聲識(shí)別數(shù)據(jù)集。

          它包含來自 YouTube 視頻的 1251 位名人的約 10 萬段語音,同時(shí)數(shù)據(jù)基本上是性別平衡的(男性占 55%),這些名人有不同的口音、職業(yè)和年齡。


          First Order Motion 利用了這個(gè)數(shù)據(jù)集的視頻圖像,進(jìn)行了模型訓(xùn)練。

          我們就可以利用這個(gè)訓(xùn)練好的,人臉的運(yùn)動(dòng)估計(jì)模型,完成我們今天的任務(wù)。

          「特朗普和蒙娜麗莎的深情合唱」。

          除了需要用到這個(gè)一階運(yùn)動(dòng)模型,還需要使用 OpenCV 和 ffmpeg 做視頻、音頻和圖像的處理。

          具體的實(shí)現(xiàn),在下文的「效果實(shí)現(xiàn)」中說明。

          3


          環(huán)境搭建

          效果實(shí)現(xiàn)上,我們可以直接用已有的庫去實(shí)現(xiàn)我們想要的功能。

          「Real Time Image Animation」

          項(xiàng)目地址:
          https://github.com/anandpawara/Real_Time_Image_Animation

          Python 為什么這么受歡迎,就是因?yàn)檫@一點(diǎn)

          有很多開源項(xiàng)目,方便我們快速實(shí)現(xiàn)自己想要的功能,極大降低了開發(fā)成本。

          真是,誰用誰知道啊。

          環(huán)境搭建,還是建議使用 Anaconda,安裝一些必要的第三方庫,可以參考這篇開發(fā)環(huán)境搭建的內(nèi)容:

          《Pytorch深度學(xué)習(xí)實(shí)戰(zhàn)教程(一):語義分割基礎(chǔ)與環(huán)境搭建

          這個(gè)項(xiàng)目需要用到的第三方庫,也都寫的很全:
          https://github.com/anandpawara/Real_Time_Image_Animation/blob/master/requirements.txt

          直接使用 pip 安裝即可:

          python -m pip install -r requirements.txt

          此外,為了處理音頻和視頻,還需要配置 ffmpeg。

          安裝好 ffmpeg 并配置好環(huán)境變量即可。

          ffmpeg 下載地址:
          https://ffmpeg.zeranoe.com/builds/

          4


          效果實(shí)現(xiàn)

          實(shí)現(xiàn)也非常簡單。

          首先,整理一下思路:

          「Real Time Image Animation」使用一階運(yùn)動(dòng)模型,根據(jù)已有視頻,讓靜態(tài)圖動(dòng)起來。


          左圖為原始圖片,中間為生成結(jié)果,右側(cè)為原始視頻。

          但是,這個(gè)項(xiàng)目只能處理圖像不能保留音頻

          所以,我們需要先將音頻保存,再將處理好的視頻和音頻進(jìn)行合成。

          這個(gè)功能,就用我們下載好的 ffmpeg 實(shí)現(xiàn)。

          編寫如下代碼:

          import subprocessimport osfrom PIL import Image
          def video2mp3(file_name): """ 將視頻轉(zhuǎn)為音頻 :param file_name: 傳入視頻文件的路徑 :return: """ outfile_name = file_name.split('.')[0] + '.mp3' cmd = 'ffmpeg -i ' + file_name + ' -f mp3 ' + outfile_name subprocess.call(cmd, shell=True)
          def video_add_mp3(file_name, mp3_file): """ 視頻添加音頻 :param file_name: 傳入視頻文件的路徑 :param mp3_file: 傳入音頻文件的路徑 :return: """ outfile_name = file_name.split('.')[0] + '-f.mp4' subprocess.call('ffmpeg -i ' + file_name + ' -i ' + mp3_file + ' -strict -2 -f mp4 ' + outfile_name, shell=True)

          搞定,視頻轉(zhuǎn)音頻,以及音頻合成都搞定了。

          我們需要對(duì)「Real Time Image Animation」這個(gè)項(xiàng)目進(jìn)行修改,修改 image_animation.py 文件。

          import imageioimport torchfrom tqdm import tqdmfrom animate import normalize_kpfrom demo import load_checkpointsimport numpy as npimport matplotlib.pyplot as pltimport matplotlib.animation as animationfrom skimage import img_as_ubytefrom skimage.transform import resizeimport cv2import osimport argparse
          import subprocessimport osfrom PIL import Image
          def video2mp3(file_name): """ 將視頻轉(zhuǎn)為音頻 :param file_name: 傳入視頻文件的路徑 :return: """ outfile_name = file_name.split('.')[0] + '.mp3' cmd = 'ffmpeg -i ' + file_name + ' -f mp3 ' + outfile_name print(cmd) subprocess.call(cmd, shell=True)

          def video_add_mp3(file_name, mp3_file): """ 視頻添加音頻 :param file_name: 傳入視頻文件的路徑 :param mp3_file: 傳入音頻文件的路徑 :return: """ outfile_name = file_name.split('.')[0] + '-f.mp4' subprocess.call('ffmpeg -i ' + file_name + ' -i ' + mp3_file + ' -strict -2 -f mp4 ' + outfile_name, shell=True)
          ap = argparse.ArgumentParser()ap.add_argument("-i", "--input_image", required=True,help="Path to image to animate")ap.add_argument("-c", "--checkpoint", required=True,help="Path to checkpoint")ap.add_argument("-v","--input_video", required=False, help="Path to video input")
          args = vars(ap.parse_args())
          print("[INFO] loading source image and checkpoint...")source_path = args['input_image']checkpoint_path = args['checkpoint']if args['input_video']: video_path = args['input_video']else: video_path = Nonesource_image = imageio.imread(source_path)source_image = resize(source_image,(256,256))[..., :3]
          generator, kp_detector = load_checkpoints(config_path='config/vox-256.yaml', checkpoint_path=checkpoint_path)
          if not os.path.exists('output'): os.mkdir('output')

          relative=Trueadapt_movement_scale=Truecpu=False
          if video_path: cap = cv2.VideoCapture(video_path) print("[INFO] Loading video from the given path")else: cap = cv2.VideoCapture(0) print("[INFO] Initializing front camera...")
          fps = cap.get(cv2.CAP_PROP_FPS)size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))

          video2mp3(file_name = video_path)


          fourcc = cv2.VideoWriter_fourcc('M','P','E','G')#out1 = cv2.VideoWriter('output/test.avi', fourcc, fps, (256*3 , 256), True)out1 = cv2.VideoWriter('output/test.mp4', fourcc, fps, size, True)
          cv2_source = cv2.cvtColor(source_image.astype('float32'),cv2.COLOR_BGR2RGB)with torch.no_grad() : predictions = [] source = torch.tensor(source_image[np.newaxis].astype(np.float32)).permute(0, 3, 1, 2) if not cpu: source = source.cuda() kp_source = kp_detector(source) count = 0 while(True): ret, frame = cap.read() frame = cv2.flip(frame,1) if ret == True:
          if not video_path: x = 143 y = 87 w = 322 h = 322 frame = frame[y:y+h,x:x+w] frame1 = resize(frame,(256,256))[..., :3]
          if count == 0: source_image1 = frame1 source1 = torch.tensor(source_image1[np.newaxis].astype(np.float32)).permute(0, 3, 1, 2) kp_driving_initial = kp_detector(source1)
          frame_test = torch.tensor(frame1[np.newaxis].astype(np.float32)).permute(0, 3, 1, 2)
          driving_frame = frame_test if not cpu: driving_frame = driving_frame.cuda() kp_driving = kp_detector(driving_frame) kp_norm = normalize_kp(kp_source=kp_source, kp_driving=kp_driving, kp_driving_initial=kp_driving_initial, use_relative_movement=relative, use_relative_jacobian=relative, adapt_movement_scale=adapt_movement_scale) out = generator(source, kp_source=kp_source, kp_driving=kp_norm) predictions.append(np.transpose(out['prediction'].data.cpu().numpy(), [0, 2, 3, 1])[0]) im = np.transpose(out['prediction'].data.cpu().numpy(), [0, 2, 3, 1])[0] im = cv2.cvtColor(im,cv2.COLOR_RGB2BGR) #joinedFrame = np.concatenate((cv2_source,im,frame1),axis=1) #joinedFrame = np.concatenate((cv2_source,im,frame1),axis=1)
          #cv2.imshow('Test',joinedFrame) #out1.write(img_as_ubyte(joinedFrame)) out1.write(img_as_ubyte(im)) count += 1# if cv2.waitKey(20) & 0xFF == ord('q'):# break else: break
          cap.release() out1.release() cv2.destroyAllWindows()
          video_add_mp3(file_name='output/test.mp4', mp3_file=video_path.split('.')[0] + '.mp3')

          然后下載算法需要的權(quán)重文件視頻圖片素材



          修改好的代碼權(quán)重文件視頻圖片素材我都已經(jīng)打包好了拿來直接用也可以

          下載鏈接(密碼:amz5):
          https://pan.baidu.com/s/1TEd7SOaO5mzPaxpOh2pALQ?

          運(yùn)行命令:

          python image_animation.py -i path_to_input_file -c path_to_checkpoint -v path_to_video_file

          path_to_input_file 是輸入的模板圖片。

          path_to_checkpoint 是權(quán)重文件路徑。

          path_to_video_file 是輸入的視頻文件。

          如果使用我打包好的程序,可以使用如下指令直接運(yùn)行,獲得文章開頭的視頻:

          python image_animation.py -i Inputs/trump2.png -c checkpoints/vox-cpk.pth.tar -v 1.mp4

          最后生成的視頻存放在 output 文件夾下。

          大功告成!

          5


          最后

          算法處理視頻的速度很快,用 GPU 幾秒鐘就能搞定。

          我還生成了 PPD 演唱《Unravel》版,最后再回味一下。


          兄弟,我裂開了呀!

          END
          如果看到這里,說明你喜歡這篇文章,請轉(zhuǎn)發(fā)、點(diǎn)贊。微信搜索「hych666」,歡迎添加我的微信,更多精彩,盡在我的朋友圈
          掃描二維碼添加好友↓

          推薦閱讀

          (點(diǎn)擊標(biāo)題可跳轉(zhuǎn)閱讀)

          玩機(jī)器學(xué)習(xí),再也不缺數(shù)據(jù)集了

          揭秘!阿里巴巴電商算法首次對(duì)外公開

          在機(jī)器學(xué)習(xí)項(xiàng)目中該如何選擇優(yōu)化器

          機(jī)器學(xué)習(xí)基礎(chǔ):詳解 5 大常用特征選擇方法

          NumPy庫入門教程:基礎(chǔ)知識(shí)總結(jié)

          老鐵,三連支持一下,好嗎?↓↓↓

          瀏覽 79
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  在线观看黄色国产视频 | 免费的日逼视频 | 一级录像在线免费播放 | 亚洲色图欧美色图另类 | 三级片官网 |