کد موجود در این آموزش شما را شروع می کند
نویسندگان: ازکیل لانزا، روونان وانگ
این آموزش به شما نشان می دهد که چگونه ویدیوی خود را به یک اثر هنری تبدیل کنید. این بر اساس اجرای BigDL-Nano برای مثال سبک سازی ویدیو در پست قبلی ما است.
BigDL-Nano در هسته خود دو ویژگی اصلی را ارائه می دهد:
- به طور شفاف برنامه های PyTorch* و TensorFlow* را روی سخت افزار اینتل تسریع می کند.
- یک API یکپارچه و با کاربری آسان برای تکنیک ها و ابزارهای بهینه سازی ارائه می دهد، به طوری که با چند خط کد، PyTorch یا TensorFlow سریعتر اجرا می شود.
ما یک ویدیو با پیکاسو، به نام هنرمند اسپانیایی، سبک می کنیم. این پیاده سازی (Texler et al., 2020) در Pytorch است. این مدل با استفاده از شتاب ارائه شده توسط BigDL-Nano آموزش دیده و استنباط شده است.
قبل از تمرین محیط خود را آماده کنید. توصیه می کنیم با پیروی از این دستورالعمل ها از یک محیط تمیز استفاده کنید.
اولین قدم برای آموزش یک مدل تحت نظارت، جمع آوری نمونه هایی از آنچه می خواهید مدل انجام دهد، است. در اینجا، تصاویری استایل دار و غیر استایلی ارائه می کنیم تا مدل بتواند سبک را یاد بگیرد. با استفاده از این پیادهسازی منبع باز انتقال سبک دلخواه، میتوانید سبک خود را با سبکی که انتخاب میکنید دریافت کنید.
برای آسانتر کردن کارها، تصاویر ورودی (غیر سبک) و هدف (سبکدار) (data.zip) را ارائه کردهایم:
!unzip data.zip
توجه داشته باشید: “!” به Jupyter* اجازه می دهد تا دستورات ترمینال را اجرا کند.
تصاویر ورودی
اینها از جریان فیلم آموزشی شما (عملکرد video_to_imgs) که از 0 تا 76 (77 فریم) فهرست شده است، به فریم تبدیل می شوند. پس از خارج کردن از حالت فشرده، آنها را در پوشه data/input پیدا خواهید کرد.
تصاویر را هدف قرار دهید
در این آموزش اینها با پیکاسو سبک شده اند. شما نیازی به ارائه تمام 76 تصویر هدف ندارید. فقط چند تصویر برای درک و آموزش مدل کافی است. در اینجا، تصاویری با شماره های 0، 35 و 70 ارائه کرده ایم که پس از بازکردن در زیر پوشه data/target قرار دارند.
اکنون زمان آموزش مدل با یک اسکریپت تسریع شده توسط BigDL-Nano است (nano_train.py).
!python nano_train.py
توجه: میتوانید با استفاده از مربی معمولی PyTorch-Lightning Trainer (train.py) زمان لازم را برای تمرین توسط خودتان مقایسه کنید.
این شبکه را که قبلاً بر روی پیادهسازی پایه توضیح داده شده در (Nguyen-Phuoc et al., 2022) با استفاده از مربی BigDL-Nano آموزش میدهد تا فرآیند را تسریع کند. متوجه خواهید شد که نیازی به تغییر چیزی در کد شما نیست، فقط مربی PyTorch-Lightning معمولی را با BigDL-Nano Trainer جایگزین کنید.
from bigdl.nano.pytorch import Trainer
مربی PyTorch-Lightning
trainer = pl.Trainer( gpus=0,
max_epochs=100,
log_every_n_steps=8,
limit_train_batches=1.0,
limit_val_batches=1.0,
limit_test_batches=1.0,
check_val_every_n_epoch=20,
reload_dataloaders_every_n_epochs=1,
profiler=profiler,
logger=logger,
callbacks=callbacks,
# fast_dev_run=True,
)
BigDL-Nano Trainer
from bigdl.nano.pytorch import Trainer trainer = Trainer(
gpus=0,
max_epochs=100,
log_every_n_steps=8,
limit_train_batches=1.0,
limit_val_batches=1.0,
limit_test_batches=1.0,
check_val_every_n_epoch=20,
reload_dataloaders_every_n_epochs=1,
profiler=profiler,
logger=logger,
callbacks=callbacks,
# fast_dev_run=True,
)
پس از چند دقیقه، پیامی دریافت خواهید کرد که نشان می دهد اسکریپت چقدر طول کشیده تا مدل را آموزش دهد. مدل آموزش دیده خود را در زیر پیدا خواهید کرد: ./data/models/
توجه داشته باشید: این تنها فایل مدلی نیست که در آن دایرکتوری ذخیره شده است. سه فایل “generator.pt”، “discriminator.pt” و “latest.ckpt” را مشاهده خواهید کرد. برای استنباط، شما فقط به “generator.pt” نیاز دارید تا تصاویر سبک جدید تولید کنید.
اکنون زمان آموزش مدل با یک اسکریپت تسریع شده توسط BigDL-Nano است (nano_train.py).
!python nano_train.py
توجه داشته باشید: با استفاده از PyTorch-Lightning Trainer معمولی (train.py) می توانید مقایسه کنید که بدون شتاب BigDL چقدر طول می کشد.
این شبکه را که قبلاً بر روی پیادهسازی پایه توضیح داده شده در (Nguyen-Phuoc et al., 2022) با استفاده از مربی BigDL-Nano آموزش میدهد تا فرآیند را تسریع کند. متوجه خواهید شد که نیازی به تغییر چیزی در کد شما نیست، فقط مربی PyTorch-Lightning معمولی را با BigDL-Nano Trainer جایگزین کنید.
from bigdl.nano.pytorch import Trainer
مربی PyTorch-Lightning
trainer = pl.Trainer( gpus=0,
max_epochs=100,
log_every_n_steps=8,
limit_train_batches=1.0,
limit_val_batches=1.0,
limit_test_batches=1.0,
check_val_every_n_epoch=20,
reload_dataloaders_every_n_epochs=1,
profiler=profiler,
logger=logger,
callbacks=callbacks,
# fast_dev_run=True,
)
BigDL-Nano Trainer
from bigdl.nano.pytorch import Trainer trainer = Trainer(
gpus=0,
max_epochs=100,
log_every_n_steps=8,
limit_train_batches=1.0,
limit_val_batches=1.0,
limit_test_batches=1.0,
check_val_every_n_epoch=20,
reload_dataloaders_every_n_epochs=1,
profiler=profiler,
logger=logger,
callbacks=callbacks,
# fast_dev_run=True,
)
پس از چند دقیقه، پیامی دریافت خواهید کرد که نشان می دهد اسکریپت چقدر طول کشیده تا مدل را آموزش دهد. مدل آموزش دیده خود را در زیر پیدا خواهید کرد: ./data/models/
توجه داشته باشید: این تنها فایل مدلی نیست که در آن دایرکتوری ذخیره شده است. سه مورد از آنها را خواهید دید: “generator.pt”، “discriminator.pt” و “latest.ckpt”. برای استنباط، شما فقط به “generator.pt” نیاز دارید تا تصاویر سبک جدید تولید کنید.
توابع راهنما
این توابع کمکی، استخراج شده از چندین مخزن منبع باز، به آماده سازی داده ها کمک می کند.
- نمایش ویدئو: ویدئو را نشان می دهد.
- imgs_to_video: چندین فریم را در یک ویدیو تبدیل می کند. از آنجایی که مدل استنباط را روی فریم ها انجام می دهد، باید آن را به ویدیو تبدیل کنید.
- Video_to_img: ویدیوی ورودی را به دنباله ای از فریم ها تبدیل می کند. از آنجایی که شما یک ویدیو برای اجرای استنتاج ارائه میدهید، توجه داشته باشید که مدل بر روی فریمها اجرا میشود، لازم است که مدل را با تصاویر (قابها) تغذیه کنید.
import os from IPython.display import HTML
from base64 import b64encode
from PIL import Image as PILImage
import cv2
from cv2 import VideoCapture, imwrite
import numpy as np
def display_video(file_path, width=512):
# Source: https://colab.research.google.com/drive/1_kbRZPTjnFgViPrmGcUsaszEdYa8XTpq#scrollTo=DxlIqGfATvvj&line=1&uniqifier=1
compressed_video_path = 'comp_' + file_path
if os.path.exists(compressed_video_path):
os.remove(compressed_video_path)
os.system(f'ffmpeg -i {file_path} -vcodec libx264 -loglevel quiet {compressed_video_path}')
mp4 = open(compressed_video_path, 'rb').read()
data_url = 'data:simul2/mp4;base64,' + b64encode(mp4).decode()
return HTML("""
<video width={} controls>
<source src="{}" type="video/mp4">
</video>
""".format(width, data_url))
def imgs_to_video(output_dir, video_name='demo_output.mp4', fps=24):
# Refer to: https://stackoverflow.com/questions/52414148/turn-pil-images-into-video-on-linux
imgs = []
for image_name in os.listdir(output_dir):
if image_name.endswith('.jpg'):
imgs.append(output_dir + image_name)
imgs.sort(key=lambda img : int(img.split('/')[-1].split('.')[0]))
pil_imgs = []
for file in imgs:
pil_imgs.append(PILImage.open(file))
video_dims = (pil_imgs[0].width, pil_imgs[0].height)
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
video = cv2.VideoWriter(video_name, fourcc, fps, video_dims)
for img in pil_imgs:
tmp_img = img.copy()
video.write(cv2.cvtColor(np.array(tmp_img), cv2.COLOR_RGB2BGR))
def video_to_imgs(video_name='demo_output.mp4', image_dir="./images/"):
video_capture = VideoCapture(video_name)
number = 0
while True:
flag, frame = video_capture.read()
if flag is False:
break
w, h = frame.shape[0], frame.shape[1]
if w % 4 != 0 or h % 4 != 0:
NW = int((w // 4) * 4)
NH = int((h // 4) * 4)
frame = cv2.resize(frame, (NW, NH))
imwrite(image_dir + str(0000+number)+'.jpg', frame)
number += 1
اکنون که مدل آموزش داده شده است، می تواند سبک را به هر ویدیوی ورودی (فریم) منتقل کند. همچنین یک نسخه تسریع شده BigDL به نام InferenceOptimizer برای این مرحله وجود دارد.
قبل از اجرای استنتاج، این مراحل را انجام دهید:
- دستگاهی را انتخاب کنید که در آن اجرا شود
- مدل را در حافظه بارگذاری کنید
- بارگذاری داده ها در قالب قابل درک Pytorch (Dataloader)
اگر نمیدانید شتاب چگونه کار میکند، با ادغام زمانهای اجرا اضافی بهعنوان موتورهای استنتاج یا با استفاده از روشهای کوانتیزاسیون تقویت میشود. کوانتیزاسیون مدل ها را با دقت کمتری فشرده می کند، اما این مدل های سبک تر سعی می کنند دقت را قربانی نکنند. اگر می خواهید آنها را امتحان کنید، در اینجا چند بهینه سازی اضافی وجود دارد.
در این آموزش، شما از ابتدایی ترین مورد، یعنی دقت INT8، بدون فضای تنظیم جستجو برای کنترل افت دقت استفاده خواهید کرد.
from torch.utils.data import DataLoader import torch
from tqdm import tqdm
import torchvision.transforms as transforms
from pathlib import Path
from data import read_image_tensor, write_image_tensor, ImageDataset
from train import data_path, model_save_path
# load model
device = 'cpu'
dtype = torch.float32
generator = torch.load(model_save_path/"generator.pt")
generator.eval()
generator.to(device, dtype)
# prepare calib dataloader
input_dir = data_path/'input'
file_paths = [file for file in input_dir.iterdir()]
params = {'batch_size': 1,
'num_workers': 8,
'pin_memory': True}
dataset = ImageDataset(file_paths, transform=None)
loader = DataLoader(dataset, **params)
from bigdl.nano.pytorch import InferenceOptimizer
model = InferenceOptimizer.quantize(accelerator=None,
model=generator,
calib_dataloader=loader)
بیایید استنتاج را اجرا کنیم. شما باید فایل input_video و num_processes را که می خواهید استفاده کنید ارائه دهید (برای جزئیات به پست قبلی مراجعه کنید.)
علاوه بر سرعت بخشیدن به مدل، BigDL-Nano شتاب استنتاج چند فرآیندی را برای بهبود نرخ استفاده از هسته های فیزیکی و افزایش توان عملیاتی استنتاج ارائه می دهد.
برای استفاده از این تابع، کافی است API زیر را فراخوانی کنید و تعداد پردازش های مربوطه را ارسال کنید (>1):
multi_instance_model = InferenceOptimizer.to_multi_instance(model, num_processes=num_processes)
جزئیات بیشتر را در مستندات BigDL خواهید یافت.
from pathlib import Path import time
from bigdl.nano.pytorch import InferenceOptimizer
if __name__ == "__main__":
input_video = "demo.mp4"
num_processes = 4 # specify number of processes
image_dir = "./video2pic/"
output_dir = "./video-output/"
os.makedirs(image_dir, exist_ok=True)
os.makedirs(output_dir, exist_ok=True)
video_to_imgs(input_video, image_dir)
img_list = [Path(image_dir, image_name) for image_name in os.listdir(image_dir)]
params = {'batch_size': 1,
}
dataset = ImageDataset(img_list, transform=None)
loader = DataLoader(dataset, **params)
if num_processes > 1:
print("{} processes is used.".format(num_processes))
st = time.perf_counter()
with torch.no_grad():
# call `InferenceOptimizer.to_multi_instance` to get a multi-instance inference model
multi_instance_model = InferenceOptimizer.to_multi_instance(model, num_processes=num_processes)
# collect a input list
inputs_list, names_list = [], []
for inputs, names in loader:
inputs = inputs.to(device, dtype)
inputs_list.append(inputs)
names_list.append(names)
# inference the input list
outputs_list = multi_instance_model(inputs_list)
# handle the output list
for outputs, names in zip(outputs_list, names_list):
for k in range(len(outputs)):
write_image_tensor(outputs[k], Path(output_dir, names[k]))
del outputs
end = time.perf_counter()
print("Generation costs {}s".format(end - st))
else:
st = time.perf_counter()
with torch.no_grad():
for inputs, names in tqdm(loader):
inputs = inputs.to(device, dtype)
# original model
# outputs = generator(inputs)
# accelerated model
outputs = model(inputs)
for k in range(len(outputs)):
write_image_tensor(outputs[k], Path(output_dir, names[k]))
del outputs
end = time.perf_counter()
print("Generation costs {}s".format(end - st))
imgs_to_video(output_dir, "demo_output.mp4", fps=25)
اکنون ویدیوی سبک خود را دریافت خواهید کرد.
display_video("demo_output.mp4")
ویدیوی مورد استفاده در این آموزش از این مقاله در مورد مجموعه داده های فیلم های منبع باز درک ویدیوی سطح بالا (HLVU) آمده است.
Texler، O.، Futschik، D.، Kučera، M.، Jamriška، O.، Sochorová، Š.، Chai، M.، Tulyakov، S.، و Sýkora، D. (2020). سبک سازی تعاملی ویدئو با استفاده از آموزش مبتنی بر پچ چند شات (arXiv:2004.14489). arXiv. http://arxiv.org/abs/2004.14489
ازکیل لانزا یک مبشر متن باز در تیم اکوسیستم باز اینتل است که مشتاق کمک به مردم برای کشف دنیای هیجان انگیز هوش مصنوعی است. او همچنین یک مجری مکرر کنفرانس هوش مصنوعی و خالق موارد استفاده، آموزش و راهنماهایی است که به توسعه دهندگان کمک می کند تا ابزارهای AI منبع باز مانند TensorFlow* و Hugging Face* را بکار گیرند. او را در توییتر در @ پیدا کنیدeze_lanza
Ruonan Wang یک مهندس چارچوب هوش مصنوعی در Intel AIA است که در حال حاضر بر روی توسعه BigDL-Nano، یک بسته Python* برای تسریع شفاف برنامههای PyTorch* و TensorFlow* روی سختافزار اینتل تمرکز دارد.
برای محتوای متن باز بیشتر از اینتل، بررسی کنید open.intel