日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > ChatGpt >内容正文

ChatGpt

用让新海诚本人惊讶的 AI 模型制作属于你的动漫视频

發布時間:2023/12/8 ChatGpt 85 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用让新海诚本人惊讶的 AI 模型制作属于你的动漫视频 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文將介紹如何使用 GAN 模型來生成屬于你自己的動漫風格的視頻,為自己、喜歡的菇涼或者調皮可愛孩子生成一個別具一格的動漫風格的視頻。

本文操作難度較低,適合想要試玩了解 GAN 模型的同學。可以同時使用 CPU / GPU (包括 ARM M1)來完成。

寫在前面

這陣子在翻閱和學習一些模型相關的內容,當我看到大名鼎鼎的《你的名字》、《秒速五厘米》、《天氣之子》等經典作品的導演新海誠,因為一組對比圖發出了下面的感嘆的時候,我的好奇心一下子就上來了。

圖片中新海誠的感嘆內容翻譯過來的大概意思是:“很有趣,我感覺到了各種可能性。如果這是由美術工作人員提出的,電影將會重拍。笑”

在我看來,能夠得到如新海誠這樣的大佬翻牌子,或許這類模型值得一玩。于是,我試著用這類模型將我的結婚紀念視頻進行了風格轉換,發現效果還行啊。

接著,我又針對一些以往的照片試了試這個“濾鏡”,發現針對部分照片來說,效果真的很不錯。

獨樂樂不如眾樂樂,如果你也有計劃為喜歡的人、或者孩子,甚至是自己做一些卡通風格化的視頻/照片留念的話,那么跟著我一起來折騰下本篇內容吧。

本篇將依次介紹兩種模型的使用,關于這兩個模型的簡單介紹,在本文結尾有提到,如果你感興趣的話,可以跳轉閱讀。

好了,我們先來進行一些準備工作吧。

準備工作

在開始為我們的視頻或者照片“加濾鏡”之前,我們需要先進行環境準備。

本篇文章為了更簡單一些,就不再在文章中展開如何進行模型的 Docker 鏡像封裝了,感興趣的同學可以自行翻閱上篇《使用 Docker 來運行 HuggingFace 海量模型》文章內容,來學習相關內容。

使用 Conda 簡化 Python 程序環境準備工作

和上篇文章一樣,我推薦使用 Conda 完成基礎的程序運行環境的安裝。

你可以從Conda 官方網站下載合適的安裝程序(安裝包比較大,大概 500M左右,需要一些耐心)。

  • 如果你是 Mac x86 用戶,可以下載 Anaconda3-2022.05-MacOSX-x86_64.sh
  • 如果你是 Mac M1 用戶,可以下載 Anaconda3-2022.05-MacOSX-arm64.sh
  • 如果你是 Linux 用戶,可以下載 Anaconda3-2022.05-Linux-x86_64.sh
  • 如果你是 Windows 用戶,可以下載 Anaconda3-2022.05-Windows-x86_64.exe

接下來,我們先以 Mac 和 Ubuntu 為例,來演示如何完成環境的準備。

從上面的地址下載好 Conda 安裝文件之后,一行命令完成程序安裝即可。

# 先進行 conda 的安裝 bash Anaconda3-2022.05.(你的安裝文件名稱).sh

如果你在使用 Ubuntu,和我一樣,需要經常測試不同的模型和項目,可以在安裝完畢之后,執行下面的命令,讓 conda shell 環境常駐。

# 在完成安裝之后,可以考慮hi eval "$(~/anaconda3/bin/conda shell.bash hook)"

至于 Mac,我更推薦什么時候使用,什么時候手動激活 conda shell。比如在安裝完畢 conda,并初始化好了某一個程序的專用環境之后,我們可以通過執行 conda activate [環境名稱] 命令來激活這個環境所需要的 shell。(關于如何初始化環境,請耐心往下看)

國內用戶,推薦在使用 Conda 時,先進行軟件源配置操作。這樣可以減少在下載軟件包過程中造成的不必要時間浪費。

編輯 vi ~/.condarc 文件,在其中加入下面的內容(以“清華源”為例):

channels:- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/- defaults show_channel_urls: true

當我們完成了 ~/.condarc 的內容修改之后,先重啟 Shell,接著使用 conda info 就可以檢查軟件源是否配置成功了:

(base) soulteary@ubuntu:~# conda infoactive environment : base ...channel URLs : https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/linux-64https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/noarchhttps://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/linux-64https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/noarchhttps://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/linux-64https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/noarchhttps://repo.anaconda.com/pkgs/main/linux-64https://repo.anaconda.com/pkgs/main/noarchhttps://repo.anaconda.com/pkgs/r/linux-64https://repo.anaconda.com/pkgs/r/noarch ...

可以看到,日志輸出中包含了我們剛剛填寫的“清華源”。

接下來,我們來通過 conda 命令,來快速創建我們所需要的模型應用程序所需要的運行環境:

conda create -n my-anime-video python=3.10

上面的命令執行完畢之后,將會創建一個名為 my-anime-video 的基于 Python 3.10 的基礎運行環境;如果你需要其他版本的 Python 來運行自己的模型,可以調整命令中的版本號。

當環境創建完畢之后,我們需要先執行命令,將環境激活(用過 GVM、NVM 的同學應該會很熟悉)。

conda activate my-anime-video

當環境激活之后,我們的 shell 命令行提示的開始處將會出現這個環境名稱提示,告訴我們現在正位于這個環境之下:

(my-anime-video) # your shell command here...

當完成環境激活之后,我們同樣先來完成軟件源的切換(上篇文章有詳細介紹,感興趣可以自行閱讀):

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

接著來完成 PyTorch 常用依賴的安裝:

pip install torch torchvision torchaudio

最后安裝一個用來“偷懶”的工具 Towhee:

pip install towhee

至于這個工具能省多大事,我先賣個關子不提,看到后面你就知道了。

安裝 ffmpeg 來處理多媒體素材

如果你只是希望處理圖片,那么這部分可以跳過,如果你希望處理的內容包含視頻,我們需要借助 ffmpeg 這個工具的力量。

在 macOS 中,我們可以通過 brew 來進行安裝:

brew install ffmpeg

在 Linux 環境中,比如 Ubuntu,我們可以通過 apt 來進行安裝:

apt install ffmpeg -y

在 ffmpeg 安裝就緒之后,我們來針對視頻進行處理,將視頻轉換為待處理的圖片。

比如,我們要將當前目錄的視頻 wedding-video.mp4 按照每秒 25 幀拆解為圖片,并將圖片保存在當前目錄的 images 目錄下,可以執行下面的命令:

ffmpeg -i ./wedding-video.mp4 -vf fps=25 images/video%d.png

當命令執行完畢之后,我們將得到滿滿一個文件夾的圖片,它們都將以命令中的 video 為前綴,數字為結尾。我選擇的視頻文件接近 15 分鐘,當轉換完畢之后,得到了兩萬多張圖片。

ls images/| wc -l 21628

當上面的準備工作都就緒之后,我們來看看如何使用兩種模型來生成屬于我們自己的卡通/動漫風格的視頻。

先來看看第一個模型:CartoonGAN。

CartoonGAN

關于這個模型,我找到了一個 HuggingFace 上的在線試玩地址:https://huggingface.co/spaces/akiyamasho/AnimeBackgroundGAN。

這個在線工具來自一位日本開發者,在它的另外一個項目 AnimeBackgroundGAN-Shinkai (新海誠風格)中,我們能夠找到一個預訓練模型(關聯項目中還有宮崎駿、細田守、今敏的風格),而在 GitHub 中,我們能夠找到這個項目對應的代碼倉庫 venture-anime/anime-background-gan-hf-space。

在進行上文提到的視頻素材(大量圖片)處理之前,我們先來試著在本地運行起來一個同款的 Web 工具,來驗證模型代碼是否能夠正確運行。

驗證項目模型效果

這個項目可以使用 CPU 或 GPU 運行,如果你手頭有 macOS、Ubuntu 的話,可以直接運行。

不過原始項目對于最新版本的 PyTorch 支持有一些問題,使用 GPU 運行會報錯,并且不支持指定顯卡運行,以及項目依賴有一些問題,所以我做了一個 fork 版本:https://github.com/soulteary/anime-background-gan-hf-space。

我們使用 Git 下載項目,然后切換到項目目錄中:

git clone https://github.com/soulteary/anime-background-gan-hf-space.git cd anime-background-gan-hf-space

在進一步進行之前,我們需要確認已經用 conda 將之前準備的 Python 環境激活,如果你不確定或者還沒有進行切換,可以再次執行下面的命令(重復執行沒有副作用):

conda activate my-anime-video

在切換到 my-anime-video 這個環境之后,我們使用 Python 啟動項目:

python app.py

在命令執行之后(可能需要稍等片刻),我們將得到類似下面的日志:

/Users/soulteary/anaconda3/envs/my-anime-video/lib/python3.10/site-packages/gradio/deprecation.py:40: UserWarning: `optional` parameter is deprecated, and it has no effectwarnings.warn(value) Running on local URL: http://127.0.0.1:7860/To create a public link, set `share=True` in `launch()`.

然后打開瀏覽器,輸入上面日志中提示的地址 http://127.0.0.1:7860/,就能夠看到一個在線的 Web 工具界面啦。

要進行模型和應用代碼驗證也很簡單,點擊左邊的圖片上傳區域,上傳一個你想要測試的圖片,然后點擊“提交”即可。

可以看到,一張頗有卡通感的圖片出現在了右側。這里如果使用 CPU 運行,一般需要 3~10s 來處理一張圖,如果使用 GPU,則一般需要 1s 左右。

在完成了程序和模型的驗證之后,我們來編寫批量處理圖片的程序。

編寫模型調用程序進行批量圖片處理

完整程序,我已經上傳到了 GitHub https://github.com/soulteary/have-fun-with-AnimeGAN/blob/main/CartoonGAN/app.py 方便大家自取。

原始的項目中,并不支持批量讀取圖片,并且默認會加載四個模型,比較浪費資源,所以我這里進行了一些功能完善。

import argparse import glob, os import time from pathlib import Path from PIL import Imageimport torch import numpy as np import torchvision.transforms as transforms from torch.autograd import Variable from network.Transformer import Transformer from huggingface_hub import hf_hub_downloadimport logginglogging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__)def parse_args():desc = "CartoonGAN CLI by soulteary"parser = argparse.ArgumentParser(description=desc)parser.add_argument('--model', type=str, default='Shinkai', help='Shinkai / Hosoda / Miyazaki / Kon')parser.add_argument('--input', type=str, default='./images', help='images directory')parser.add_argument('--output', type=str, default='./result/', help='output path')parser.add_argument('--resize', type=int, default=0,help='Do you need a program to adjust the image size?')parser.add_argument('--maxsize', type=int, default=0,help='your desired image output size')"""If you want to resize, you need to specify both --resize and --maxsize"""return parser.parse_args()def prepare_dirs(path):Path(path).mkdir(parents=True, exist_ok=True)arg = parse_args()enable_gpu = torch.cuda.is_available()if enable_gpu:# If you have multiple cards,# you can assign to a specific card, eg: "cuda:0"("cuda") or "cuda:1"# Use the first card by default: "cuda"device = torch.device("cuda") else:device = "cpu"def get_model(style):# Makoto Shinkaiif style == "Shinkai":MODEL_REPO_SHINKAI = "akiyamasho/AnimeBackgroundGAN-Shinkai"MODEL_FILE_SHINKAI = "shinkai_makoto.pth"model_hfhub = hf_hub_download(repo_id=MODEL_REPO_SHINKAI, filename=MODEL_FILE_SHINKAI)# Mamoru Hosodaelif style == "Hosoda":MODEL_REPO_HOSODA = "akiyamasho/AnimeBackgroundGAN-Hosoda"MODEL_FILE_HOSODA = "hosoda_mamoru.pth"model_hfhub = hf_hub_download(repo_id=MODEL_REPO_HOSODA, filename=MODEL_FILE_HOSODA)# Hayao Miyazakielif style == "Miyazaki":MODEL_REPO_MIYAZAKI = "akiyamasho/AnimeBackgroundGAN-Miyazaki"MODEL_FILE_MIYAZAKI = "miyazaki_hayao.pth"model_hfhub = hf_hub_download(repo_id=MODEL_REPO_MIYAZAKI, filename=MODEL_FILE_MIYAZAKI)# Satoshi Konelif style == "Kon":MODEL_REPO_KON = "akiyamasho/AnimeBackgroundGAN-Kon"MODEL_FILE_KON = "kon_satoshi.pth"model_hfhub = hf_hub_download(repo_id=MODEL_REPO_KON, filename=MODEL_FILE_KON)model = Transformer()model.load_state_dict(torch.load(model_hfhub, device))if enable_gpu:model = model.to(device)model.eval()return modeldef inference(img, model):# load imageinput_image = img.convert("RGB")input_image = np.asarray(input_image)# RGB -> BGRinput_image = input_image[:, :, [2, 1, 0]]input_image = transforms.ToTensor()(input_image).unsqueeze(0)# preprocess, (-1, 1)input_image = -1 + 2 * input_imageif enable_gpu:logger.info(f"CUDA found. Using GPU.")# Allows to specify a card for calculationinput_image = Variable(input_image).to(device)else:logger.info(f"CUDA not found. Using CPU.")input_image = Variable(input_image).float()# forwardoutput_image = model(input_image)output_image = output_image[0]# BGR -> RGBoutput_image = output_image[[2, 1, 0], :, :]output_image = output_image.data.cpu().float() * 0.5 + 0.5return transforms.ToPILImage()(output_image)prepare_dirs(arg.output)model = get_model(arg.model)enable_resize = False max_dimensions = -1 if arg.maxsize > 0:max_dimensions = arg.maxsizeif arg.resize :enable_resize = TrueglobPattern = arg.input + "/*.png"for filePath in glob.glob(globPattern):basename = os.path.basename(filePath)with Image.open(filePath) as img:if(enable_resize):img.thumbnail((max_dimensions, max_dimensions), Image.Resampling.LANCZOS)start_time = time.time()inference(img, model).save(arg.output + "/" + basename, "PNG")print("--- %s seconds ---" % (time.time() - start_time))

上面這段一百來行的程序大概做了這么幾件事,會根據傳遞參數來動態的載入必要的模型,而不是所有的模型。默認情況下,它會讀取當前目錄 images 子目錄的所有圖片,并依次調用 CPU / GPU 來進行圖片處理,并將處理結果保存在 result 子目錄中。如果你希望對輸出圖片進行尺寸調整,可以傳遞參數來做限制。

我們來試著運行下這個程序:

python app.py --model=Shinkai

當命令開始執行后,我們就能夠批量處理視頻圖片啦,如果不出意外,你將會看到類似下面的日志:

... --- 1.5597078800201416 seconds --- INFO:__main__:Image Height: 1080, Image Width: 1920 --- 0.44031572341918945 seconds --- INFO:__main__:Image Height: 1080, Image Width: 1920 --- 1.5004260540008545 seconds --- INFO:__main__:Image Height: 1080, Image Width: 1920 --- 1.510758876800537 seconds --- INFO:__main__:Image Height: 1080, Image Width: 1920 --- 1.362170696258545 seconds --- INFO:__main__:Image Height: 1080, Image Width: 1920 ...

這里需要處理的時間可能會比較久,如果我們有 GPU 會極大的提升速度,或者適當調整輸出圖片的大小,也能夠在使用 CPU 進行渲染的情況下,得到比較快的處理速度。

當程序運行結束之后,我們在 result 目錄中,就能夠得到經過 AI 模型處理的圖片內容了,這時我們只要再次使用 ffmpeg 將圖片轉換為視頻就好啦:

ffmpeg -f image2 -r 25 -i result/video%d.jpg -vcodec libx264 -crf 18 -pix_fmt yuv420p result.mp4

接下來,我們先來聊聊如何使用 GPU 進行提速,然后再來看看有沒有更通用的、低成本的提速方案。

使用 GPU 進行模型執行提速

如果你沒有 GPU,想用最小成本來玩,那么可以直接閱讀下一小節內容。

言歸正傳,假設我們要處理上萬甚至十萬張圖片,最好的方式便是使用 GPU 進行數據處理。考慮到當前一塊能高效跑 AI 模型的具備大顯存的顯卡至少一萬起步,我更推薦使用按量付費的云主機,大概每小時 10~20 塊錢,跑個個把小時,就能拿到你想要的結果啦。我個人測試下來,幾個云廠商帶有顯卡的主機都差不多,大家根據自己情況和喜歡的方式選擇就行,如果是學生身份,或許有些平臺還能有教育折扣。

為了能夠相對快速的得到結果,我選擇了一臺雙卡云主機,在不做程序的深度優化前,能夠直接讓數據處理時間減半。

想要讓兩張顯卡各處理一半的數據,我們可以選擇修改上面的程序,也可以用 Linux Shell 把數據直接分為兩堆兒。作為一個懶人,我們選擇后者。(如果你只有一張卡,可以跳過這個步驟)

先來確認當前待處理的數據總量,有兩萬多張圖片。

ls images/| wc -l 21628

接著使用組合命令,將一半的圖片挪到新創建的文件夾中:

mkdir images2 ls | sort | head -10814 | xargs -I {} mv {} images2/

在準備完數據之后,我們同樣需要對程序做一點小的調整,讓程序分別使用兩張不同的顯卡設備,我們可以選擇像程序讀取輸入輸出文件夾使用參數相同的方式,來讓用戶指定顯卡設備;也可以選擇更簡單的方式,將上面的程序復制一份,調整原來的程序和新程序中要調用的顯卡設備名稱,比如,將 device = torch.device("cuda") 調整為 device = torch.device("cuda:0") 和 device = torch.device("cuda:1")。

當完成上述調整和準備之后,分別使用 python 執行兩個程序即可:python app1.py、python app2.py。如果你不能保證你通過 SSH 連接到服務器的會話穩定,那么可以試試使用 screen、tmux 這類工具。

程序開始運行之后,接下來就是漫長的等待,在處理過程中,我們可以使用 nvidia-smi 查看顯卡狀態,可以看到如果這臺“電腦”擱家里,應該是蠻費電的,而且大概率會很吵。

nvidia-smi +-----------------------------------------------------------------------------+ | NVIDIA-SMI 450.102.04 Driver Version: 450.102.04 CUDA Version: 11.0 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Tesla V100-SXM2... On | 00000000:00:08.0 Off | 0 | | N/A 54C P0 263W / 300W | 25365MiB / 32510MiB | 100% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ | 1 Tesla V100-SXM2... On | 00000000:00:09.0 Off | 0 | | N/A 55C P0 265W / 300W | 25365MiB / 32510MiB | 100% Default | | | | N/A | +-------------------------------+----------------------+----------------------++-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | 0 N/A N/A 61933 C python 25363MiB | | 1 N/A N/A 62081 C python 25363MiB | +-----------------------------------------------------------------------------+

當程序處理完所有圖片之后,會自動退出。這個時候,我們可以再次使用 ffmpeg 將圖片還原為視頻:

time ffmpeg -f image2 -r 25 -i result/video%d.png -vcodec libx264 -crf 18 -pix_fmt yuv420p result.mp4

當程序運行完畢,我們將看到類似下面的日志:

Output #0, mp4, to 'result.mp4':Metadata:encoder : Lavf58.29.100Stream #0:0: Video: h264 (libx264) (avc1 / 0x31637661), yuv420p, 1920x1080, q=-1--1, 25 fps, 12800 tbn, 25 tbcMetadata:encoder : Lavc58.54.100 libx264Side data:cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1 frame=21628 fps= 75 q=-1.0 Lsize= 1135449kB time=00:14:25.00 bitrate=10753.3kbits/s speed=2.99x video:1135185kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.023257% [libx264 @ 0x55779059b380] frame I:253 Avg QP:15.48 size:194386 [libx264 @ 0x55779059b380] frame P:6147 Avg QP:17.74 size: 95962 [libx264 @ 0x55779059b380] frame B:15228 Avg QP:20.43 size: 34369 [libx264 @ 0x55779059b380] consecutive B-frames: 4.7% 2.9% 4.0% 88.4% [libx264 @ 0x55779059b380] mb I I16..4: 16.0% 47.1% 36.9% [libx264 @ 0x55779059b380] mb P I16..4: 7.9% 13.9% 6.1% P16..4: 31.2% 18.5% 9.3% 0.0% 0.0% skip:13.0% [libx264 @ 0x55779059b380] mb B I16..4: 1.6% 1.6% 0.5% B16..8: 34.3% 9.6% 2.7% direct:11.8% skip:37.9% L0:42.2% L1:42.3% BI:15.5% [libx264 @ 0x55779059b380] 8x8 transform intra:48.1% inter:59.5% [libx264 @ 0x55779059b380] coded y,uvDC,uvAC intra: 47.2% 66.3% 35.9% inter: 30.7% 35.6% 1.6% [libx264 @ 0x55779059b380] i16 v,h,dc,p: 39% 32% 6% 23% [libx264 @ 0x55779059b380] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 27% 20% 26% 4% 5% 4% 5% 4% 5% [libx264 @ 0x55779059b380] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 33% 20% 16% 5% 6% 6% 5% 5% 4% [libx264 @ 0x55779059b380] i8c dc,h,v,p: 50% 21% 21% 8% [libx264 @ 0x55779059b380] Weighted P-Frames: Y:24.2% UV:17.1% [libx264 @ 0x55779059b380] ref P L0: 49.1% 14.5% 22.1% 12.4% 1.9% [libx264 @ 0x55779059b380] ref B L0: 81.3% 14.0% 4.7% [libx264 @ 0x55779059b380] ref B L1: 93.6% 6.4% [libx264 @ 0x55779059b380] kb/s:10749.30real 4m49.667s user 78m36.497s sys 0m44.806s

當我打開處理完畢的視頻,就個人觀感而言,光線充足的場景下,模型的發揮還是比較好的。這里由于上傳圖片壓縮,效果沒有本地看到的驚艷,感興趣的同學不妨試試。

或許你想知道,有沒有什么不用 GPU 也能進行一些加速效果的方案呢?答案是有的。

使用并行計算和流式處理來加速圖片處理

Python 3 支持 concurrent API,來做并行計算。不過處理并發計算,一般還需要折騰隊列,涉及到多線程調度,涉及到流式 IO 等等一坨麻煩事。而且并發代碼調試也比較惡心,尤其是在 Python 中…(個人觀點)

還記得我在上文中曾經 pip install 的 towhee 么,這個軟件包里包含了一些快捷的工具方法,能夠簡化上面一系列麻煩事情,讓我們處理相同的事情,花更少的代價,因為很多時候,一些基本的帶有復雜度的麻煩事,應該交給基礎工具來解決,而不是都由開發者吭哧吭哧的填。

我們以上文中一百多行的模型應用代碼舉例,如果換用 Towhee 做一個“平替”程序,那么可以這樣來實現:

import towheetowhee.glob('./*.png') \.image_decode() \.img2img_translation.cartoongan(model_name = 'Shikai') \.save_image(dir='./result').to_list()

幾行代碼,就完成了核心邏輯:批量讀取圖片、將圖片進行 RGB 編碼轉換,然后將圖片數據傳遞給模型進行處理,最后進行模型計算結果保存到某個文件夾里。

接下來,我們再對上面的代碼進行一些調整,來完成上面提到的麻煩事,并行計算。其實需要的改動很少,只需要我們在“處理圖片編碼轉換”之前,加上一行 .set_parallel(5) 來告訴程序,我們要使用多個線程來搞事情就行啦。

當程序運行起來的時候,就會默認調用 5 個并發來執行計算,所以即使沒有 GPU,只使用 CPU 的情況下,我們也能夠獲取更高的執行效率。

import towheetowhee.glob('./*.png') \.set_parallel(5) \.image_decode() \.img2img_translation.cartoongan(model_name = 'Shikai') \.save_image(dir='./result').to_list()

在玩 Towhee 的過程中,我也遇到了一些小問題。比如 Towhee 這個工具的設計初衷是為了科學計算,所以像是保存圖片、折騰視頻文件都不是它的主業,默認情況下,它會以 UUID 的形式來保存處理后的圖片。

為了能夠讓圖片結果為我們所用,輸出的圖片能夠按照原始文件名稱進行存儲,讓模型處理完的結果能夠“還原成視頻”。我特別向它的開源倉庫提交了一個 PR (#1293)來解決這個問題。

當然,我們也需要對上面的幾行代碼做一些額外的調整,添加一些參數:

import towheetowhee.glob['path']("./*.png") \.set_parallel(5) \.image_decode['path','img']() \.img2img_translation.cartoongan['img', 'img_new'](model_name = "Shikai") \.save_image[('img_new','path'), 'new_path'](dir="./result") \.to_list()

不過,截止本文發布的時候,包含我的 PR 的主干版本,還沒有被正式發布,所以暫時還需要安裝 Python PyPI 每日構建的開發版的軟件包來使用這個功能。

pip install -i https://test.pypi.org/simple/ towhee==0.6.2.dev48

如果大家覺得這個偷懶的玩法還不錯,可以代我去官方開源倉庫去提 Issue,催催維護團隊更新版本。

那么,為啥作為 Towhee 用戶的我不去催呢?其實是因為不好意思。為啥不好意思呢?你接著看下去就知道啦。

AnimeGAN

在聊完 CartoonGAN 之后,我們來試試另外一個模型:AnimeGAN。目前模型有三個版本,除了第三個版本外,都是免費使用的開源項目。

為了方便演示以及一些特別的原因(文末詳述),我這里選擇開源且較為穩定的第二個版本。

在開始折騰之前,同樣也可以先試試它的在線試玩的 Demo:https://huggingface.co/spaces/akhaliq/AnimeGANv2。

還是先來進行本地項目驗證,來驗證模型代碼是否能夠正確運行。

驗證項目模型效果

考慮到文章篇幅和工程師“美德”(偷懶),我們就不再折騰冗長的模型調用程序代碼了,我選擇繼續用 Python 版 “jQuery” 來 “Write Less, Do More”:

import towheearg = parse_args() towhee.glob['path']("./*.png") \.set_parallel(5) \.image_decode['path', 'img']() \.img2img_translation.animegan['img', 'new_img'](model_name ="Shinkai") \.save_image[('new_img', 'path'), 'new_path'](dir="./result", format="png") \.to_list()

邏輯和上文中調用 CartoonGAN 一樣,唯一的差別是使用了 animegan 的模型。

我們將上面的代碼保存為 lazy.py,然后從網上隨便找些圖片放在程序所在的目錄,執行 python lazy.py,稍等片刻就能夠在程序同級目錄發現一個新的名為 result 的文件夾,里面放著的就是我們用模型處理過的圖片啦。

相關代碼,我已經上傳到了 https://github.com/soulteary/have-fun-with-AnimeGAN/blob/main/AnimeGAN/lazy.py 感興趣的同學可以自取。

在驗證完畢模型效果之后,我們同樣可以使用這個模型來生成一段卡通風格的視頻。

雖然上文中使用 ffmpeg 拼合視頻的效率非常高,但是畢竟要執行額外的兩條命令,有沒有什么辦法可以進一步偷懶呢?答案顯然是有的。

編寫模型調用程序進行視頻處理

不知道是否還有同學記得,在上篇文章中我提到的 Towhee 核心開發者之一的 @候杰 同學。在我死纏爛打之下,他幫我這個 Python 菜鳥,搞了一個 read_video 方法。

所以,上文中需要先用 ffmpeg 把視頻轉換為圖片,然后在模型處理之后,再把圖片拼合成視頻的繁瑣操作,就可以被幾行代碼替代掉啦!相比較之前的玩法,新的代碼行數瞬間縮短到了五行左右(算空行也就六行),節約了原本需要寫的 80% 的代碼行數。

import towheetowhee.read_video("./video.mp4") \.set_parallel(5) \.img2img_translation.animegan['img', 'new_img'](model_name = 'Skinkai') \.to_video('./result.mp4', 'x264', 15)

上面這幾行代碼執行下來,分別會自動套用模型處理視頻的每一幀內容,然后將模型處理結果重新編碼為每秒 15 幀的視頻文件。實際使用的時候,你可以根據自己的需求進行碼率調整。

為了方便你的使用,我也將代碼上傳到了 GitHub,需要的同學可以自取。

針對視頻文件進行快速預覽

相比較圖片內容處理,相同分辨率的視頻的數據量其實會大不少。

所以如果我們想對視頻進行一個快速效果預覽,可以考慮在代碼中添加一個尺寸調整的功能,將每一幀需要處理的圖片尺寸進行縮放,減少計算量。

一如上文中的偷懶原則,想要搞定這個“需求”的方法也很簡單,只需要加一行 image_resize 在合適的位置:

import towheetowhee.read_video("./video.mp4") \.set_parallel(5) \.image_resize(fx=0.2, fy=0.2) \.img2img_translation.animegan['img', 'new_img'](model_name = 'Skinkai') \.to_video('./result.mp4', 'x264', 15)

這部分的代碼,我依舊上傳到了 GitHub,希望對你有幫助。

其他

好啦!到這里為止,我已經講完了:

  • 如何準備一個快速上手的 Python 環境
  • 如何快速上手使用 CartoonGAN、AnimeGAN 兩個模型;
  • 如何用這兩個模型處理圖片或者視頻;
  • 如何使用 Python 模型里的 “jQuery”:Towhee 來偷懶,少寫代碼多搞事情。
  • 如何進行 GitHub 上“野生”模型項目的基本調優和封裝

接下來,我們來簡單聊聊文章開頭提到的模型。

關于 AnimeGAN 和 CartoonGAN

關于使用 GAN(生成對抗網絡) 模型來對圖片做動漫卡通風格化處理,就國內而言,目前有兩個知名度較高的國產項目。

一個是來自清華大學團隊在 2018 年公開的 CartoonGAN,該模型的論文中選 CVPR 2018,在 GitHub 上有 700 余顆星星。另外一個是來自湖北科技大學,在 2019 年公開的 AnimeGAN,該模型至今已迭代了三個版本(前兩個版本開源),并在 GitHub 上累計收獲了近 8 千顆星星。

關于兩個模型和論文,媒體都曾進行過報道宣傳:《實景照片秒變新海誠風格漫畫:清華大學提出CartoonGAN》、《強烈安利試試這個!效果爆炸的漫畫變身AI,火到服務器幾度擠爆》,其中 AnimeGAN 處理的圖片結果,甚至得到了新海誠的感嘆。

我個人使用下來,CartoonGAN 和 AnimeGAN 各有優勢和不足,至于模型效果,以及各自適合哪些場景。相信聰明的讀者們,可以通過本文提到的方式,和自己的實踐來找到答案。

這兩個項目的開源倉庫地址:

  • https://github.com/mnicnc404/CartoonGan-tensorflow / 模型下載:http://cg.cs.tsinghua.edu.cn/people/~Yongjin/CartoonGAN-Models.rar
  • https://github.com/TachibanaYoshino/AnimeGAN
  • https://github.com/TachibanaYoshino/AnimeGANv2

目前,因為 AnimeGAN v3 正在進行商業化嘗試,并且是閉源發布,為了不對作者造成影響,這里就先不做相關模型封裝和嘗試啦。

開源不易,模型項目開源尤為不易,能夠做商業化轉型更是不易,需要社區、需要國人同胞的支持和鼓勵。只有不斷支持和反饋開源生態,國內的開源生態才有可能向好的方向變化,而當生態變好之時,我們這些從業者定然能夠從中獲得更多的益處。

最后

在一周前,我在朋友圈曬過使用模型來處理之前結婚的紀念視頻,有不少朋友點贊和表示好奇如何“折騰自己的照片或視頻”,當時承諾大家會出一篇教程,趁著端午節,趕出了這篇內容,希望大家玩的愉快。

最后,再次感謝被我死纏爛打之下添加了新功能的 @侯杰 同學,同樣感謝為我的 PR 提供了大量建議,幫助我把模型傳遞到 Towhee Hub,解決國內下載模型緩慢問題的、來自彩云之南的程序媛 @室余 妹紙。

–EOF


本文使用「署名 4.0 國際 (CC BY 4.0)」許可協議,歡迎轉載、或重新修改使用,但需要注明來源。 署名 4.0 國際 (CC BY 4.0)

本文作者: 蘇洋

創建時間: 2022年06月04日
統計字數: 20370字
閱讀時間: 41分鐘閱讀
本文鏈接: https://soulteary.io/2022/06/04/create-your-own-anime-video-with-an-ai-model-that-surprised-makoto-shinkai.html

總結

以上是生活随笔為你收集整理的用让新海诚本人惊讶的 AI 模型制作属于你的动漫视频的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。