diff --git a/.gitattributes b/.gitattributes index ac481c8eb05e4d2496fbe076a38a7b4835dd733d..9a731e2ca0bc06a9f28724482011d14fcb61bb90 100644 --- a/.gitattributes +++ b/.gitattributes @@ -25,3 +25,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text *.zip filter=lfs diff=lfs merge=lfs -text *.zstandard filter=lfs diff=lfs merge=lfs -text *tfevents* filter=lfs diff=lfs merge=lfs -text +*.mp4 filter=lfs diff=lfs merge=lfs -text diff --git a/README.md b/README.md index 7d98c7b3708ac17a1a9e2b2e6235966d579290a9..cbf38c756ffd7b443b0ba82a9194909d1c0881e8 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ --- -title: Bigdl Nano Demo -emoji: 💩 -colorFrom: blue -colorTo: pink +title: BigDL-Nano Demo +emoji: 🦄 +colorFrom: yellow +colorTo: green sdk: gradio -sdk_version: 3.0.20 +sdk_version: 3.0.13 app_file: app.py pinned: false --- diff --git a/app.py b/app.py new file mode 100644 index 0000000000000000000000000000000000000000..267b59880744e311a82eb4ec043cdd0139e3da8f --- /dev/null +++ b/app.py @@ -0,0 +1,199 @@ +# +# Copyright 2016 The BigDL Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Part of the code in this file is adapted from +# https://github.com/rnwzd/FSPBT-Image-Translation/blob/master/eval.py and +# https://github.com/rnwzd/FSPBT-Image-Translation/blob/master/train.py + +# MIT License + +# Copyright (c) 2022 Lorenzo Breschi + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import gradio as gr +import numpy as np +import time +from data import write_image_tensor, PatchDataModule, prepare_data, image2tensor, tensor2image +import torch +from tqdm import tqdm +from bigdl.nano.pytorch.trainer import Trainer +from torch.utils.data import DataLoader +from pathlib import Path +from torch.utils.data import Dataset +import datetime +import huggingface_hub + + +device = 'cpu' +dtype = torch.float32 +MODEL_REPO = 'CVPR/FSPBT' +ckpt_path = huggingface_hub.hf_hub_download( + MODEL_REPO, 'generator.pt') +generator = torch.load(ckpt_path) +generator.eval() +generator.to(device, dtype) +params = {'batch_size': 1, + 'num_workers': 0} + + +class ImageDataset(Dataset): + def __init__(self, img): + self.imgs = [image2tensor(img)] + def __getitem__(self, idx: int) -> dict: + return self.imgs[idx] + + def __len__(self) -> int: + return len(self.imgs) + + +data_path = Path('data/webcam') +train_image_dd = prepare_data(data_path) +dm = PatchDataModule(train_image_dd, patch_size=2**6, + batch_size=2**3, patch_num=2**6) + +# quantize model +train_loader = dm.train_dataloader() +train_loader_iter = iter(train_loader) +quantized_model = Trainer.quantize(generator, accelerator=None, + calib_dataloader=train_loader) + + +def original_transfer(input_img): + w, h, _ = input_img.shape + print(datetime.datetime.now()) + print("input size: ", w, h) + # resize too large image + if w > 3000 or h > 3000: + ratio = min(3000 / w, 3000 / h) + w = int(w * ratio) + h = int(h * ratio) + if w % 4 != 0 or h % 4 != 0: + NW = int((w // 4) * 4) + NH = int((h // 4) * 4) + input_img = np.resize(input_img,(NW,NH,3)) + st = time.perf_counter() + dataset = ImageDataset(input_img) + loader = DataLoader(dataset, **params) + with torch.no_grad(): + for inputs in tqdm(loader): + inputs = inputs.to(device, dtype) + st = time.perf_counter() + outputs = generator(inputs) + ori_time = time.perf_counter() - st + ori_time = "{:.3f}s".format(ori_time) + ori_image = np.array(tensor2image(outputs[0])) + del inputs + del outputs + return ori_image, ori_time + +def nano_transfer(input_img): + w, h, _ = input_img.shape + print(datetime.datetime.now()) + print("input size: ", w, h) + # resize too large image + if w > 3000 or h > 3000: + ratio = min(3000 / w, 3000 / h) + w = int(w * ratio) + h = int(h * ratio) + if w % 4 != 0 or h % 4 != 0: + NW = int((w // 4) * 4) + NH = int((h // 4) * 4) + input_img = np.resize(input_img,(NW,NH,3)) + st = time.perf_counter() + dataset = ImageDataset(input_img) + loader = DataLoader(dataset, **params) + with torch.no_grad(): + for inputs in tqdm(loader): + inputs = inputs.to(device, dtype) + st = time.perf_counter() + outputs = quantized_model(inputs) + nano_time = time.perf_counter() - st + nano_time = "{:.3f}s".format(nano_time) + nano_image = np.array(tensor2image(outputs[0])) + del inputs + del outputs + return nano_image, nano_time + + +def clear(): + return None, None, None, None + + +demo = gr.Blocks() + +with demo: + gr.Markdown("

BigDL-Nano inference demo

") + with gr.Row().style(equal_height=False): + with gr.Column(): + gr.Markdown(''' +

Overview

+ + BigDL-Nano is a library in [BigDL 2.0](https://github.com/intel-analytics/BigDL) that allows the users to transparently accelerate their deep learning pipelines (including data processing, training and inference) by automatically integrating optimized libraries, best-known configurations, and software optimizations.

+ The animation on the right shows how the user can easily enable training using BigDL-Nano with just one line of change. + ''') + with gr.Column(): + gr.Video(value="data/training_api.mp4") + gr.Markdown(''' + The below animation shows how the user can easily enable acceleration and quantization using BigDL-Nano with just a couple of lines of code; you may refer to our [CVPR 2022 demo paper](https://arxiv.org/abs/2204.01715) for more details. + ''') + with gr.Row().style(equal_height=True): + with gr.Column(): + gr.Video(value="data/openvino_api.mp4") + with gr.Column(): + gr.Video(value="data/quantize_ort_api.mp4") + gr.Markdown(''' +

Demo

+ + This section we show an inference demo by using an image stylization example to demostrate the speedup of the above code when using quantization in BigDL-Nano (about 2~3x inference time speedup). + This inference demo is adapted from the original [FSPBT-Image-Translation code](https://github.com/rnwzd/FSPBT-Image-Translation), + and the default image is from [the COCO dataset](https://cocodataset.org/#home). + ''') + with gr.Row().style(equal_height=False): + input_img = gr.Image(label="input image", value="data/COCO_image.jpg", source="upload") + with gr.Column(): + ori_but = gr.Button("Standard PyTorch Lightning") + nano_but = gr.Button("BigDL-Nano") + clear_but = gr.Button("Clear Output") + with gr.Row().style(equal_height=False): + with gr.Column(): + ori_time = gr.Text(label="Standard PyTorch Lightning latency") + ori_image = gr.Image(label="Standard PyTorch Lightning output image") + with gr.Column(): + nano_time = gr.Text(label="BigDL-Nano latency") + nano_image = gr.Image(label="BigDL-Nano output image") + + ori_but.click(original_transfer, inputs=input_img, outputs=[ori_image, ori_time]) + nano_but.click(nano_transfer, inputs=input_img, outputs=[nano_image, nano_time]) + clear_but.click(clear, inputs=None, outputs=[ori_image, ori_time, nano_image, nano_time]) + + +demo.launch(share=True, enable_queue=True) \ No newline at end of file diff --git a/data.py b/data.py new file mode 100644 index 0000000000000000000000000000000000000000..d301a5d3bbdda1ebc888bd5e823cb1ada41ae15c --- /dev/null +++ b/data.py @@ -0,0 +1,233 @@ +# This file is copied from https://github.com/rnwzd/FSPBT-Image-Translation/blob/master/data.py + +# MIT License + +# Copyright (c) 2022 Lorenzo Breschi + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from typing import Callable, Dict + +import torch + +from torch.utils.data import Dataset + +import torchvision.transforms.functional as F +from torchvision import transforms +import pytorch_lightning as pl + +from collections.abc import Iterable + + +# image reader writer +from pathlib import Path +from PIL import Image +from typing import Tuple + + +def read_image(filepath: Path, mode: str = None) -> Image: + with open(filepath, 'rb') as file: + image = Image.open(file) + return image.convert(mode) + + +image2tensor = transforms.ToTensor() +tensor2image = transforms.ToPILImage() + + +def write_image(image: Image, filepath: Path): + filepath.parent.mkdir(parents=True, exist_ok=True) + image.save(str(filepath)) + + +def read_image_tensor(filepath: Path, mode: str = 'RGB') -> torch.Tensor: + return image2tensor(read_image(filepath, mode)) + + +def write_image_tensor(input: torch.Tensor, filepath: Path): + write_image(tensor2image(input), filepath) + + +def get_valid_indices(H: int, W: int, patch_size: int, random_overlap: int = 0): + + vih = torch.arange(random_overlap, H-patch_size - + random_overlap+1, patch_size) + viw = torch.arange(random_overlap, W-patch_size - + random_overlap+1, patch_size) + if random_overlap > 0: + rih = torch.randint_like(vih, -random_overlap, random_overlap) + riw = torch.randint_like(viw, -random_overlap, random_overlap) + vih += rih + viw += riw + vi = torch.stack(torch.meshgrid(vih, viw)).view(2, -1).t() + return vi + + +def cut_patches(input: torch.Tensor, indices: Tuple[Tuple[int, int]], patch_size: int, padding: int = 0): + # TODO use slices to get all patches at the same time ? + + patches_l = [] + for n in range(len(indices)): + + patch = F.crop(input, *(indices[n]-padding), + *(patch_size+padding*2,)*2) + patches_l.append(patch) + patches = torch.cat(patches_l, dim=0) + + return patches + + +def prepare_data(data_path: Path, read_func: Callable = read_image_tensor) -> Dict: + """ + Takes a data_path of a folder which contains subfolders with input, target, etc. + lablelled by the same names. + :param data_path: Path of the folder containing data + :param read_func: function that reads data and returns a tensor + """ + data_dict = {} + + subdir_names = ["target", "input", "mask"] # ,"helper" + + # checks only files for which there is an target + # TODO check for images + name_ls = [file.name for file in ( + data_path / "target").iterdir() if file.is_file()] + + subdirs = [data_path / sdn for sdn in subdir_names] + for sd in subdirs: + if sd.is_dir(): + data_ls = [] + files = [sd / name for name in name_ls] + for file in files: + tensor = read_func(file) + H, W = tensor.shape[-2:] + data_ls.append(tensor) + # TODO check that all sizes match + data_dict[sd.name] = torch.stack(data_ls, dim=0) + + data_dict['name'] = name_ls + data_dict['len'] = len(data_dict['name']) + data_dict['H'] = H + data_dict['W'] = W + return data_dict + + +# TODO an image is loaded whenever a patch is needed, this may be a bottleneck +class DataDictLoader(): + def __init__(self, data_dict: Dict, + batch_size: int = 16, + max_length: int = 128, + shuffle: bool = False): + """ + """ + + self.batch_size = batch_size + self.shuffle = shuffle + + self.batch_size = batch_size + + self.data_dict = data_dict + self.dataset_len = data_dict['len'] + self.len = self.dataset_len if max_length is None else min( + self.dataset_len, max_length) + # Calculate # batches + num_batches, remainder = divmod(self.len, self.batch_size) + if remainder > 0: + num_batches += 1 + self.num_batches = num_batches + + def __iter__(self): + if self.shuffle: + r = torch.randperm(self.dataset_len) + self.data_dict = {k: v[r] if isinstance( + v, Iterable) else v for k, v in self.data_dict.items()} + self.i = 0 + return self + + def __next__(self): + if self.i >= self.len: + raise StopIteration + batch = {k: v[self.i:self.i+self.batch_size] + if isinstance(v, Iterable) else v for k, v in self.data_dict.items()} + + self.i += self.batch_size + return batch + + def __len__(self): + return self.num_batches + + +class PatchDataModule(pl.LightningDataModule): + + def __init__(self, data_dict, + patch_size: int = 2**5, + batch_size: int = 2**4, + patch_num: int = 2**6): + super().__init__() + self.data_dict = data_dict + self.H, self.W = data_dict['H'], data_dict['W'] + self.len = data_dict['len'] + + self.batch_size = batch_size + self.patch_size = patch_size + self.patch_num = patch_num + + def dataloader(self, data_dict, **kwargs): + return DataDictLoader(data_dict, **kwargs) + + def train_dataloader(self): + patches = self.cut_patches() + return self.dataloader(patches, batch_size=self.batch_size, shuffle=True, + max_length=self.patch_num) + + def val_dataloader(self): + return self.dataloader(self.data_dict, batch_size=1) + + def test_dataloader(self): + return self.dataloader(self.data_dict) # TODO batch size + + def cut_patches(self): + # TODO cycle once + patch_indices = get_valid_indices( + self.H, self.W, self.patch_size, self.patch_size//4) + dd = {k: cut_patches( + v, patch_indices, self.patch_size) for k, v in self.data_dict.items() + if isinstance(v, torch.Tensor) + } + threshold = 0.1 + mask_p = torch.mean( + dd.get('mask', torch.ones_like(dd['input'])), dim=(-1, -2, -3)) + masked_idx = (mask_p > threshold).nonzero(as_tuple=True)[0] + dd = {k: v[masked_idx] for k, v in dd.items()} + dd['len'] = len(masked_idx) + dd['H'], dd['W'] = (self.patch_size,)*2 + + return dd + + +class ImageDataset(Dataset): + def __init__(self, file_paths: Iterable, read_func: Callable = read_image_tensor): + self.file_paths = file_paths + + def __getitem__(self, idx: int) -> dict: + file = self.file_paths[idx] + return read_image_tensor(file), file.name + + def __len__(self) -> int: + return len(self.file_paths) \ No newline at end of file diff --git a/data/COCO_image.jpg b/data/COCO_image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..190b57f085ec829f46bfc552a3a22e9200dbb9e5 Binary files /dev/null and b/data/COCO_image.jpg differ diff --git a/data/openvino_api.mp4 b/data/openvino_api.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..0f4084af26f45de681f82c8f85eae96d25179362 --- /dev/null +++ b/data/openvino_api.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c56fec37521fb739fdffef383676ce27aa7687b0ea3c5322a4eac4e117f85823 +size 3296276 diff --git a/data/quantize_ort_api.mp4 b/data/quantize_ort_api.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..047a8d7c2d265aa1f45774c034c80ab471477481 --- /dev/null +++ b/data/quantize_ort_api.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:25c17439b411d912fd7d5ad998c4dab21e07d991c2340f6192bc63265142fac1 +size 2121679 diff --git a/data/training_api.mp4 b/data/training_api.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..7ab1f2e7618946180a24e21da89df64572532943 --- /dev/null +++ b/data/training_api.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1411796bffeeeffb54b4a6d4d816e25e3d50d92fc06c602d7819823d0cd79b23 +size 3614691 diff --git a/data/webcam/input/00000.png b/data/webcam/input/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..9689022a73e44443033a328e799873fc66141a48 Binary files /dev/null and b/data/webcam/input/00000.png differ diff --git a/data/webcam/input/00001.png b/data/webcam/input/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..ab005e518c1ba38ab0b6d8dc0704df52bfa7dd0c Binary files /dev/null and b/data/webcam/input/00001.png differ diff --git a/data/webcam/input/00002.png b/data/webcam/input/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..92e7b52145f4051ab357af342537aba84020b8ab Binary files /dev/null and b/data/webcam/input/00002.png differ diff --git a/data/webcam/input/00003.png b/data/webcam/input/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..fc905ea0fafe33a71b7ae2636cc92eea15e84d88 Binary files /dev/null and b/data/webcam/input/00003.png differ diff --git a/data/webcam/input/00004.png b/data/webcam/input/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..ac8589a9dc9faf6375c6cf56da78efad59945bbf Binary files /dev/null and b/data/webcam/input/00004.png differ diff --git a/data/webcam/input/00005.png b/data/webcam/input/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..6ba67ac1c5099a8208e5e0d81c7fa04b1a2d3835 Binary files /dev/null and b/data/webcam/input/00005.png differ diff --git a/data/webcam/input/00006.png b/data/webcam/input/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..d97ef820bb3248aecd039f0fdd89032ad237e45e Binary files /dev/null and b/data/webcam/input/00006.png differ diff --git a/data/webcam/input/00007.png b/data/webcam/input/00007.png new file mode 100644 index 0000000000000000000000000000000000000000..590b9adc1126d908bb406569d79d904b4627ea10 Binary files /dev/null and b/data/webcam/input/00007.png differ diff --git a/data/webcam/input/00008.png b/data/webcam/input/00008.png new file mode 100644 index 0000000000000000000000000000000000000000..62c276ca5bf9db0d6eac475e7ec87bc2a8c81baa Binary files /dev/null and b/data/webcam/input/00008.png differ diff --git a/data/webcam/input/00009.png b/data/webcam/input/00009.png new file mode 100644 index 0000000000000000000000000000000000000000..b8ffafeb4ed3d6e99cd67d4112549d32d8a5b336 Binary files /dev/null and b/data/webcam/input/00009.png differ diff --git a/data/webcam/input/00010.png b/data/webcam/input/00010.png new file mode 100644 index 0000000000000000000000000000000000000000..586ae5d81599050fad70f048ae9fc9c30daa5764 Binary files /dev/null and b/data/webcam/input/00010.png differ diff --git a/data/webcam/input/00011.png b/data/webcam/input/00011.png new file mode 100644 index 0000000000000000000000000000000000000000..7b2f009bc86dac744699c4079c09a12872c5a359 Binary files /dev/null and b/data/webcam/input/00011.png differ diff --git a/data/webcam/input/00012.png b/data/webcam/input/00012.png new file mode 100644 index 0000000000000000000000000000000000000000..2092b091a147d3976a59364c28df67ed06ebbed1 Binary files /dev/null and b/data/webcam/input/00012.png differ diff --git a/data/webcam/input/00013.png b/data/webcam/input/00013.png new file mode 100644 index 0000000000000000000000000000000000000000..fe194c55cc285176c168d18b529102b40bbcec90 Binary files /dev/null and b/data/webcam/input/00013.png differ diff --git a/data/webcam/input/00014.png b/data/webcam/input/00014.png new file mode 100644 index 0000000000000000000000000000000000000000..3926ebd99c80130c482e8bf1197ec85c125a9335 Binary files /dev/null and b/data/webcam/input/00014.png differ diff --git a/data/webcam/input/00015.png b/data/webcam/input/00015.png new file mode 100644 index 0000000000000000000000000000000000000000..3133ee34e2b0e2b407037f42953cb38507f0e3f6 Binary files /dev/null and b/data/webcam/input/00015.png differ diff --git a/data/webcam/input/00016.png b/data/webcam/input/00016.png new file mode 100644 index 0000000000000000000000000000000000000000..c04c545d0f31c634bce0fdbb9b128be76aedd58c Binary files /dev/null and b/data/webcam/input/00016.png differ diff --git a/data/webcam/input/00017.png b/data/webcam/input/00017.png new file mode 100644 index 0000000000000000000000000000000000000000..86e578329dabb2964646c963a6768a209be83b6a Binary files /dev/null and b/data/webcam/input/00017.png differ diff --git a/data/webcam/input/00018.png b/data/webcam/input/00018.png new file mode 100644 index 0000000000000000000000000000000000000000..707739bdf82bd80bda41c97cd63eb26e219ccdcb Binary files /dev/null and b/data/webcam/input/00018.png differ diff --git a/data/webcam/input/00019.png b/data/webcam/input/00019.png new file mode 100644 index 0000000000000000000000000000000000000000..10412c6a31442d836e22584e44b1a79a031c9fab Binary files /dev/null and b/data/webcam/input/00019.png differ diff --git a/data/webcam/input/00020.png b/data/webcam/input/00020.png new file mode 100644 index 0000000000000000000000000000000000000000..da5ff6ded1e24779c422f4d8ceba2ea9f3ed75d4 Binary files /dev/null and b/data/webcam/input/00020.png differ diff --git a/data/webcam/input/00021.png b/data/webcam/input/00021.png new file mode 100644 index 0000000000000000000000000000000000000000..6e515098f744f40541cd502a8b2b679c29aed104 Binary files /dev/null and b/data/webcam/input/00021.png differ diff --git a/data/webcam/input/00022.png b/data/webcam/input/00022.png new file mode 100644 index 0000000000000000000000000000000000000000..70cb7c9322593ceb2dc44905bb628ed8941f2de0 Binary files /dev/null and b/data/webcam/input/00022.png differ diff --git a/data/webcam/input/00023.png b/data/webcam/input/00023.png new file mode 100644 index 0000000000000000000000000000000000000000..fd16555bd7a03080cda844c1b3cbc30da53104c9 Binary files /dev/null and b/data/webcam/input/00023.png differ diff --git a/data/webcam/input/00024.png b/data/webcam/input/00024.png new file mode 100644 index 0000000000000000000000000000000000000000..cf166e009c4c7dd93dd1868ffa204ce3a93defa6 Binary files /dev/null and b/data/webcam/input/00024.png differ diff --git a/data/webcam/input/00025.png b/data/webcam/input/00025.png new file mode 100644 index 0000000000000000000000000000000000000000..652e4fff3f7fcea3a0a803f66de416082ebe26b0 Binary files /dev/null and b/data/webcam/input/00025.png differ diff --git a/data/webcam/input/00026.png b/data/webcam/input/00026.png new file mode 100644 index 0000000000000000000000000000000000000000..69a2ad7a4152f777c1dc00918cf43def35d4c2c1 Binary files /dev/null and b/data/webcam/input/00026.png differ diff --git a/data/webcam/input/00027.png b/data/webcam/input/00027.png new file mode 100644 index 0000000000000000000000000000000000000000..47eeb0b2869fdbcd6eaac62b6b30ac08506db0a5 Binary files /dev/null and b/data/webcam/input/00027.png differ diff --git a/data/webcam/input/00028.png b/data/webcam/input/00028.png new file mode 100644 index 0000000000000000000000000000000000000000..f0bd556548f1c9135d349943a864f51f7861cb17 Binary files /dev/null and b/data/webcam/input/00028.png differ diff --git a/data/webcam/input/00029.png b/data/webcam/input/00029.png new file mode 100644 index 0000000000000000000000000000000000000000..e08b61e46e759f539f11efedff7ea1c63d582dea Binary files /dev/null and b/data/webcam/input/00029.png differ diff --git a/data/webcam/input/00030.png b/data/webcam/input/00030.png new file mode 100644 index 0000000000000000000000000000000000000000..30095c0871961759e94ab4369c76174e11969301 Binary files /dev/null and b/data/webcam/input/00030.png differ diff --git a/data/webcam/input/00031.png b/data/webcam/input/00031.png new file mode 100644 index 0000000000000000000000000000000000000000..13b19600bf346cf5abfe6d82a85e0045bba5cef7 Binary files /dev/null and b/data/webcam/input/00031.png differ diff --git a/data/webcam/input/00032.png b/data/webcam/input/00032.png new file mode 100644 index 0000000000000000000000000000000000000000..2aa8ff8225893289f52752681adfb176c92f1c70 Binary files /dev/null and b/data/webcam/input/00032.png differ diff --git a/data/webcam/input/00033.png b/data/webcam/input/00033.png new file mode 100644 index 0000000000000000000000000000000000000000..75f8d6ca3b2caa78d023f2c8a4c5f45875e39137 Binary files /dev/null and b/data/webcam/input/00033.png differ diff --git a/data/webcam/input/00034.png b/data/webcam/input/00034.png new file mode 100644 index 0000000000000000000000000000000000000000..7e8fd08b786a11c941b9ed892a618308c49bdb83 Binary files /dev/null and b/data/webcam/input/00034.png differ diff --git a/data/webcam/input/00035.png b/data/webcam/input/00035.png new file mode 100644 index 0000000000000000000000000000000000000000..4412d4a3e2667e2bdf55a3cb4a98a20c52ed90a5 Binary files /dev/null and b/data/webcam/input/00035.png differ diff --git a/data/webcam/input/00036.png b/data/webcam/input/00036.png new file mode 100644 index 0000000000000000000000000000000000000000..38949a48583669149ae7baf9564ff14d4975fe38 Binary files /dev/null and b/data/webcam/input/00036.png differ diff --git a/data/webcam/input/00037.png b/data/webcam/input/00037.png new file mode 100644 index 0000000000000000000000000000000000000000..d94a122c32551c2048f2d2cd4b8f2712d2c542e9 Binary files /dev/null and b/data/webcam/input/00037.png differ diff --git a/data/webcam/input/00038.png b/data/webcam/input/00038.png new file mode 100644 index 0000000000000000000000000000000000000000..a9b089011ee54644280bc3d776dcbe77fc8ca8c8 Binary files /dev/null and b/data/webcam/input/00038.png differ diff --git a/data/webcam/input/00039.png b/data/webcam/input/00039.png new file mode 100644 index 0000000000000000000000000000000000000000..986ec1a1c666b6675568097db9ef33282e4f7e06 Binary files /dev/null and b/data/webcam/input/00039.png differ diff --git a/data/webcam/input/00040.png b/data/webcam/input/00040.png new file mode 100644 index 0000000000000000000000000000000000000000..981ae42ba65681a75c1ba5a735052b1b286e7d91 Binary files /dev/null and b/data/webcam/input/00040.png differ diff --git a/data/webcam/input/00041.png b/data/webcam/input/00041.png new file mode 100644 index 0000000000000000000000000000000000000000..ea4b57933572a84974a203297ade09b5e2f41b07 Binary files /dev/null and b/data/webcam/input/00041.png differ diff --git a/data/webcam/input/00042.png b/data/webcam/input/00042.png new file mode 100644 index 0000000000000000000000000000000000000000..bf431cda92e69028d14a9b248f72b46c0a1f2981 Binary files /dev/null and b/data/webcam/input/00042.png differ diff --git a/data/webcam/input/00043.png b/data/webcam/input/00043.png new file mode 100644 index 0000000000000000000000000000000000000000..d9e3fb7305f9ee315af73a7bc083da4e241a8fcd Binary files /dev/null and b/data/webcam/input/00043.png differ diff --git a/data/webcam/input/00044.png b/data/webcam/input/00044.png new file mode 100644 index 0000000000000000000000000000000000000000..d135478079ea8fb3843ff13973c5f03acacdb683 Binary files /dev/null and b/data/webcam/input/00044.png differ diff --git a/data/webcam/input/00045.png b/data/webcam/input/00045.png new file mode 100644 index 0000000000000000000000000000000000000000..3b7cc582da0ae9641d12fbe6dacdb73ad29f33e0 Binary files /dev/null and b/data/webcam/input/00045.png differ diff --git a/data/webcam/input/00046.png b/data/webcam/input/00046.png new file mode 100644 index 0000000000000000000000000000000000000000..aeca122041ea1d77b9e08b190ddc8a968fcaf4db Binary files /dev/null and b/data/webcam/input/00046.png differ diff --git a/data/webcam/input/00047.png b/data/webcam/input/00047.png new file mode 100644 index 0000000000000000000000000000000000000000..63d8097a4b1684fa7061560ae94c6f99a9213126 Binary files /dev/null and b/data/webcam/input/00047.png differ diff --git a/data/webcam/input/00048.png b/data/webcam/input/00048.png new file mode 100644 index 0000000000000000000000000000000000000000..9902bdb326afc41103ecdea6b1ad2c9996e9b808 Binary files /dev/null and b/data/webcam/input/00048.png differ diff --git a/data/webcam/input/00049.png b/data/webcam/input/00049.png new file mode 100644 index 0000000000000000000000000000000000000000..6d182966ecadf8f049472490f070d64d869067d9 Binary files /dev/null and b/data/webcam/input/00049.png differ diff --git a/data/webcam/input/00050.png b/data/webcam/input/00050.png new file mode 100644 index 0000000000000000000000000000000000000000..426565fdd23e93e94dd37ce9dead23994ab47439 Binary files /dev/null and b/data/webcam/input/00050.png differ diff --git a/data/webcam/input/00051.png b/data/webcam/input/00051.png new file mode 100644 index 0000000000000000000000000000000000000000..4b05f9287c57a1393a0cc1d6c1841a1c5e4df93b Binary files /dev/null and b/data/webcam/input/00051.png differ diff --git a/data/webcam/input/00052.png b/data/webcam/input/00052.png new file mode 100644 index 0000000000000000000000000000000000000000..72e97c9f4799eddbf85687dc32d6e9d2549c00f8 Binary files /dev/null and b/data/webcam/input/00052.png differ diff --git a/data/webcam/input/00053.png b/data/webcam/input/00053.png new file mode 100644 index 0000000000000000000000000000000000000000..1c69d7abe1d8f8500da87c2fa50e7d20f1eb54de Binary files /dev/null and b/data/webcam/input/00053.png differ diff --git a/data/webcam/input/00054.png b/data/webcam/input/00054.png new file mode 100644 index 0000000000000000000000000000000000000000..8476b37bf2268e94e221d0089eec350c8a7fc959 Binary files /dev/null and b/data/webcam/input/00054.png differ diff --git a/data/webcam/input/00055.png b/data/webcam/input/00055.png new file mode 100644 index 0000000000000000000000000000000000000000..5be4633945b6cc80848fa91bf5cf4a3dc3255849 Binary files /dev/null and b/data/webcam/input/00055.png differ diff --git a/data/webcam/input/00056.png b/data/webcam/input/00056.png new file mode 100644 index 0000000000000000000000000000000000000000..584d08fe9f3bfc4b8592c7e46578138b69b74d01 Binary files /dev/null and b/data/webcam/input/00056.png differ diff --git a/data/webcam/input/00057.png b/data/webcam/input/00057.png new file mode 100644 index 0000000000000000000000000000000000000000..0a1351e52286f2e1c0c65a9ccafef86389b3b3b7 Binary files /dev/null and b/data/webcam/input/00057.png differ diff --git a/data/webcam/input/00058.png b/data/webcam/input/00058.png new file mode 100644 index 0000000000000000000000000000000000000000..1e4330fbe50ee699164dd72e75e5d1e2f5cf30c2 Binary files /dev/null and b/data/webcam/input/00058.png differ diff --git a/data/webcam/input/00059.png b/data/webcam/input/00059.png new file mode 100644 index 0000000000000000000000000000000000000000..1c2f5dc9f07566a36e14ba0a2449c30b2ff13b47 Binary files /dev/null and b/data/webcam/input/00059.png differ diff --git a/data/webcam/input/00060.png b/data/webcam/input/00060.png new file mode 100644 index 0000000000000000000000000000000000000000..d8024f4fcba657042a1cf16b0f08b1085088dff2 Binary files /dev/null and b/data/webcam/input/00060.png differ diff --git a/data/webcam/input/00061.png b/data/webcam/input/00061.png new file mode 100644 index 0000000000000000000000000000000000000000..303be24c09d4814421eb42bb1e760d33fa0b00be Binary files /dev/null and b/data/webcam/input/00061.png differ diff --git a/data/webcam/input/00062.png b/data/webcam/input/00062.png new file mode 100644 index 0000000000000000000000000000000000000000..511a546be035375701a77be70c9158bdc6796979 Binary files /dev/null and b/data/webcam/input/00062.png differ diff --git a/data/webcam/input/00063.png b/data/webcam/input/00063.png new file mode 100644 index 0000000000000000000000000000000000000000..9166abb2af690ad42c39a72e35b55af39f6da0ea Binary files /dev/null and b/data/webcam/input/00063.png differ diff --git a/data/webcam/input/00064.png b/data/webcam/input/00064.png new file mode 100644 index 0000000000000000000000000000000000000000..18ad7eb844c6e18254886e761fb573ed8e886603 Binary files /dev/null and b/data/webcam/input/00064.png differ diff --git a/data/webcam/input/00065.png b/data/webcam/input/00065.png new file mode 100644 index 0000000000000000000000000000000000000000..33e6166aef7e4abf60183e1e69ced8e25ce6cf05 Binary files /dev/null and b/data/webcam/input/00065.png differ diff --git a/data/webcam/input/00066.png b/data/webcam/input/00066.png new file mode 100644 index 0000000000000000000000000000000000000000..316ac926dc1709cac20dfe51da981aaec63b2714 Binary files /dev/null and b/data/webcam/input/00066.png differ diff --git a/data/webcam/input/00067.png b/data/webcam/input/00067.png new file mode 100644 index 0000000000000000000000000000000000000000..14fde4683f1c360f29be36d53056cc98a850e44f Binary files /dev/null and b/data/webcam/input/00067.png differ diff --git a/data/webcam/input/00068.png b/data/webcam/input/00068.png new file mode 100644 index 0000000000000000000000000000000000000000..0a41927eade3cde9929bb9c9d087dce27f6ef2cf Binary files /dev/null and b/data/webcam/input/00068.png differ diff --git a/data/webcam/input/00069.png b/data/webcam/input/00069.png new file mode 100644 index 0000000000000000000000000000000000000000..cfacc312703a20ca82bf664ec70f84a4dfa63a18 Binary files /dev/null and b/data/webcam/input/00069.png differ diff --git a/data/webcam/input/00070.png b/data/webcam/input/00070.png new file mode 100644 index 0000000000000000000000000000000000000000..573af2d97da5e2311dfdf70dc1b38b08b9bf26d0 Binary files /dev/null and b/data/webcam/input/00070.png differ diff --git a/data/webcam/mask/00000.png b/data/webcam/mask/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00000.png differ diff --git a/data/webcam/mask/00001.png b/data/webcam/mask/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00001.png differ diff --git a/data/webcam/mask/00002.png b/data/webcam/mask/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00002.png differ diff --git a/data/webcam/mask/00003.png b/data/webcam/mask/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00003.png differ diff --git a/data/webcam/mask/00004.png b/data/webcam/mask/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00004.png differ diff --git a/data/webcam/mask/00005.png b/data/webcam/mask/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00005.png differ diff --git a/data/webcam/mask/00006.png b/data/webcam/mask/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00006.png differ diff --git a/data/webcam/mask/00007.png b/data/webcam/mask/00007.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00007.png differ diff --git a/data/webcam/mask/00008.png b/data/webcam/mask/00008.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00008.png differ diff --git a/data/webcam/mask/00009.png b/data/webcam/mask/00009.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00009.png differ diff --git a/data/webcam/mask/00010.png b/data/webcam/mask/00010.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00010.png differ diff --git a/data/webcam/mask/00011.png b/data/webcam/mask/00011.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00011.png differ diff --git a/data/webcam/mask/00012.png b/data/webcam/mask/00012.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00012.png differ diff --git a/data/webcam/mask/00013.png b/data/webcam/mask/00013.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00013.png differ diff --git a/data/webcam/mask/00014.png b/data/webcam/mask/00014.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00014.png differ diff --git a/data/webcam/mask/00015.png b/data/webcam/mask/00015.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00015.png differ diff --git a/data/webcam/mask/00016.png b/data/webcam/mask/00016.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00016.png differ diff --git a/data/webcam/mask/00017.png b/data/webcam/mask/00017.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00017.png differ diff --git a/data/webcam/mask/00018.png b/data/webcam/mask/00018.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00018.png differ diff --git a/data/webcam/mask/00019.png b/data/webcam/mask/00019.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00019.png differ diff --git a/data/webcam/mask/00020.png b/data/webcam/mask/00020.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00020.png differ diff --git a/data/webcam/mask/00021.png b/data/webcam/mask/00021.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00021.png differ diff --git a/data/webcam/mask/00022.png b/data/webcam/mask/00022.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00022.png differ diff --git a/data/webcam/mask/00023.png b/data/webcam/mask/00023.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00023.png differ diff --git a/data/webcam/mask/00024.png b/data/webcam/mask/00024.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00024.png differ diff --git a/data/webcam/mask/00025.png b/data/webcam/mask/00025.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00025.png differ diff --git a/data/webcam/mask/00026.png b/data/webcam/mask/00026.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00026.png differ diff --git a/data/webcam/mask/00027.png b/data/webcam/mask/00027.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00027.png differ diff --git a/data/webcam/mask/00028.png b/data/webcam/mask/00028.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00028.png differ diff --git a/data/webcam/mask/00029.png b/data/webcam/mask/00029.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00029.png differ diff --git a/data/webcam/mask/00030.png b/data/webcam/mask/00030.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00030.png differ diff --git a/data/webcam/mask/00031.png b/data/webcam/mask/00031.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00031.png differ diff --git a/data/webcam/mask/00032.png b/data/webcam/mask/00032.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00032.png differ diff --git a/data/webcam/mask/00033.png b/data/webcam/mask/00033.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00033.png differ diff --git a/data/webcam/mask/00034.png b/data/webcam/mask/00034.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00034.png differ diff --git a/data/webcam/mask/00035.png b/data/webcam/mask/00035.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00035.png differ diff --git a/data/webcam/mask/00036.png b/data/webcam/mask/00036.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00036.png differ diff --git a/data/webcam/mask/00037.png b/data/webcam/mask/00037.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00037.png differ diff --git a/data/webcam/mask/00038.png b/data/webcam/mask/00038.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00038.png differ diff --git a/data/webcam/mask/00039.png b/data/webcam/mask/00039.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00039.png differ diff --git a/data/webcam/mask/00040.png b/data/webcam/mask/00040.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00040.png differ diff --git a/data/webcam/mask/00041.png b/data/webcam/mask/00041.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00041.png differ diff --git a/data/webcam/mask/00042.png b/data/webcam/mask/00042.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00042.png differ diff --git a/data/webcam/mask/00043.png b/data/webcam/mask/00043.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00043.png differ diff --git a/data/webcam/mask/00044.png b/data/webcam/mask/00044.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00044.png differ diff --git a/data/webcam/mask/00045.png b/data/webcam/mask/00045.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00045.png differ diff --git a/data/webcam/mask/00046.png b/data/webcam/mask/00046.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00046.png differ diff --git a/data/webcam/mask/00047.png b/data/webcam/mask/00047.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00047.png differ diff --git a/data/webcam/mask/00048.png b/data/webcam/mask/00048.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00048.png differ diff --git a/data/webcam/mask/00049.png b/data/webcam/mask/00049.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00049.png differ diff --git a/data/webcam/mask/00050.png b/data/webcam/mask/00050.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00050.png differ diff --git a/data/webcam/mask/00051.png b/data/webcam/mask/00051.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00051.png differ diff --git a/data/webcam/mask/00052.png b/data/webcam/mask/00052.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00052.png differ diff --git a/data/webcam/mask/00053.png b/data/webcam/mask/00053.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00053.png differ diff --git a/data/webcam/mask/00054.png b/data/webcam/mask/00054.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00054.png differ diff --git a/data/webcam/mask/00055.png b/data/webcam/mask/00055.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00055.png differ diff --git a/data/webcam/mask/00056.png b/data/webcam/mask/00056.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00056.png differ diff --git a/data/webcam/mask/00057.png b/data/webcam/mask/00057.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00057.png differ diff --git a/data/webcam/mask/00058.png b/data/webcam/mask/00058.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00058.png differ diff --git a/data/webcam/mask/00059.png b/data/webcam/mask/00059.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00059.png differ diff --git a/data/webcam/mask/00060.png b/data/webcam/mask/00060.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00060.png differ diff --git a/data/webcam/mask/00061.png b/data/webcam/mask/00061.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00061.png differ diff --git a/data/webcam/mask/00062.png b/data/webcam/mask/00062.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00062.png differ diff --git a/data/webcam/mask/00063.png b/data/webcam/mask/00063.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00063.png differ diff --git a/data/webcam/mask/00064.png b/data/webcam/mask/00064.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00064.png differ diff --git a/data/webcam/mask/00065.png b/data/webcam/mask/00065.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00065.png differ diff --git a/data/webcam/mask/00066.png b/data/webcam/mask/00066.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00066.png differ diff --git a/data/webcam/mask/00067.png b/data/webcam/mask/00067.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00067.png differ diff --git a/data/webcam/mask/00068.png b/data/webcam/mask/00068.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00068.png differ diff --git a/data/webcam/mask/00069.png b/data/webcam/mask/00069.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00069.png differ diff --git a/data/webcam/mask/00070.png b/data/webcam/mask/00070.png new file mode 100644 index 0000000000000000000000000000000000000000..c56f7e7dfc6798bb73356395aceb887bbbdd7922 Binary files /dev/null and b/data/webcam/mask/00070.png differ diff --git a/data/webcam/mask/036.png b/data/webcam/mask/036.png new file mode 100644 index 0000000000000000000000000000000000000000..9a16ade0a9057dea87ec1817492e5ff2bd81ca2d Binary files /dev/null and b/data/webcam/mask/036.png differ diff --git a/data/webcam/output/00000.png b/data/webcam/output/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..65c1ae236472a3e677f303c894691cc9f84341c3 Binary files /dev/null and b/data/webcam/output/00000.png differ diff --git a/data/webcam/output/00001.png b/data/webcam/output/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..497b6fa67930121c650f85c7619727eb47a7f099 Binary files /dev/null and b/data/webcam/output/00001.png differ diff --git a/data/webcam/output/00002.png b/data/webcam/output/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..0021495fd8f4841011e0baec722a987a4cbbfd50 Binary files /dev/null and b/data/webcam/output/00002.png differ diff --git a/data/webcam/output/00003.png b/data/webcam/output/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..c44f21e4c5ebb6d99098314b0e9ce82baaf9b67f Binary files /dev/null and b/data/webcam/output/00003.png differ diff --git a/data/webcam/output/00004.png b/data/webcam/output/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..3f3d89df511a2a0c07e152a134a8db8a9a563bf0 Binary files /dev/null and b/data/webcam/output/00004.png differ diff --git a/data/webcam/output/00005.png b/data/webcam/output/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..5a0e11876928952d05ad818b6350f6253cc67d4c Binary files /dev/null and b/data/webcam/output/00005.png differ diff --git a/data/webcam/output/00006.png b/data/webcam/output/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..4d525273624c205e762076e2cf366fc7d928e05d Binary files /dev/null and b/data/webcam/output/00006.png differ diff --git a/data/webcam/output/00007.png b/data/webcam/output/00007.png new file mode 100644 index 0000000000000000000000000000000000000000..6c37e72cf294999dd4df9a36fd8258410c5491dd Binary files /dev/null and b/data/webcam/output/00007.png differ diff --git a/data/webcam/output/00008.png b/data/webcam/output/00008.png new file mode 100644 index 0000000000000000000000000000000000000000..9e3d3b2d13912dba78597a34e39913a63286f5fc Binary files /dev/null and b/data/webcam/output/00008.png differ diff --git a/data/webcam/output/00009.png b/data/webcam/output/00009.png new file mode 100644 index 0000000000000000000000000000000000000000..87d523d2addc14e3c92b5ae8674ee0243683518b Binary files /dev/null and b/data/webcam/output/00009.png differ diff --git a/data/webcam/output/00010.png b/data/webcam/output/00010.png new file mode 100644 index 0000000000000000000000000000000000000000..1801785e82eff5f4997ae79815163d2038172938 Binary files /dev/null and b/data/webcam/output/00010.png differ diff --git a/data/webcam/output/00011.png b/data/webcam/output/00011.png new file mode 100644 index 0000000000000000000000000000000000000000..e39aad2f52c6a37cea571bdcbe1552eaf8189d30 Binary files /dev/null and b/data/webcam/output/00011.png differ diff --git a/data/webcam/output/00012.png b/data/webcam/output/00012.png new file mode 100644 index 0000000000000000000000000000000000000000..b61edaf9925e9d6bfdb39c3bb9bb95175f080030 Binary files /dev/null and b/data/webcam/output/00012.png differ diff --git a/data/webcam/output/00013.png b/data/webcam/output/00013.png new file mode 100644 index 0000000000000000000000000000000000000000..fd3eaedee26b83b3469d7de60c48f2c492ba7a55 Binary files /dev/null and b/data/webcam/output/00013.png differ diff --git a/data/webcam/output/00014.png b/data/webcam/output/00014.png new file mode 100644 index 0000000000000000000000000000000000000000..1170640ff59718c2b60d2a28984196ce29650183 Binary files /dev/null and b/data/webcam/output/00014.png differ diff --git a/data/webcam/output/00015.png b/data/webcam/output/00015.png new file mode 100644 index 0000000000000000000000000000000000000000..175043110433b77baea6f46372492e4b3dbbd73b Binary files /dev/null and b/data/webcam/output/00015.png differ diff --git a/data/webcam/output/00016.png b/data/webcam/output/00016.png new file mode 100644 index 0000000000000000000000000000000000000000..df3a0dc592185836089a691e2cf5ebf8730fd0ca Binary files /dev/null and b/data/webcam/output/00016.png differ diff --git a/data/webcam/output/00017.png b/data/webcam/output/00017.png new file mode 100644 index 0000000000000000000000000000000000000000..2c2eab398a9f6c0f8fda98f75d0e0692f9c1520f Binary files /dev/null and b/data/webcam/output/00017.png differ diff --git a/data/webcam/output/00018.png b/data/webcam/output/00018.png new file mode 100644 index 0000000000000000000000000000000000000000..c27c17124288f6253903231094b22be1bcd9eb5a Binary files /dev/null and b/data/webcam/output/00018.png differ diff --git a/data/webcam/output/00019.png b/data/webcam/output/00019.png new file mode 100644 index 0000000000000000000000000000000000000000..783af6e34d1c92d780f5bc0d8f4419bd1e30b78c Binary files /dev/null and b/data/webcam/output/00019.png differ diff --git a/data/webcam/output/00020.png b/data/webcam/output/00020.png new file mode 100644 index 0000000000000000000000000000000000000000..7abaec17d060e0809fad4ad9c067d6088baa92d8 Binary files /dev/null and b/data/webcam/output/00020.png differ diff --git a/data/webcam/output/00021.png b/data/webcam/output/00021.png new file mode 100644 index 0000000000000000000000000000000000000000..870eab906071289f17bbe77dc927fedb264532c8 Binary files /dev/null and b/data/webcam/output/00021.png differ diff --git a/data/webcam/output/00022.png b/data/webcam/output/00022.png new file mode 100644 index 0000000000000000000000000000000000000000..7005b84b663501117cf35ed4f3c064360efbe88d Binary files /dev/null and b/data/webcam/output/00022.png differ diff --git a/data/webcam/output/00023.png b/data/webcam/output/00023.png new file mode 100644 index 0000000000000000000000000000000000000000..42b8206c4289e3786df646e25bb7e4e8c22800b3 Binary files /dev/null and b/data/webcam/output/00023.png differ diff --git a/data/webcam/output/00024.png b/data/webcam/output/00024.png new file mode 100644 index 0000000000000000000000000000000000000000..616fc663b0435dc00d9d7a3e1f7b4fff27bcf217 Binary files /dev/null and b/data/webcam/output/00024.png differ diff --git a/data/webcam/output/00025.png b/data/webcam/output/00025.png new file mode 100644 index 0000000000000000000000000000000000000000..5e16160117e7a513b4d588560a9630a3804f624a Binary files /dev/null and b/data/webcam/output/00025.png differ diff --git a/data/webcam/output/00026.png b/data/webcam/output/00026.png new file mode 100644 index 0000000000000000000000000000000000000000..05789b3b0cb5ddc04b127909aaf62ce1ada12f22 Binary files /dev/null and b/data/webcam/output/00026.png differ diff --git a/data/webcam/output/00027.png b/data/webcam/output/00027.png new file mode 100644 index 0000000000000000000000000000000000000000..86279a0222f0023f051f3f6f69673a9846abd23a Binary files /dev/null and b/data/webcam/output/00027.png differ diff --git a/data/webcam/output/00028.png b/data/webcam/output/00028.png new file mode 100644 index 0000000000000000000000000000000000000000..431a6e5192a5805158c1bb610220ae7fb3b0cee0 Binary files /dev/null and b/data/webcam/output/00028.png differ diff --git a/data/webcam/output/00029.png b/data/webcam/output/00029.png new file mode 100644 index 0000000000000000000000000000000000000000..1e4f056ce0eb9dab466dd3dab93a5dee864d675a Binary files /dev/null and b/data/webcam/output/00029.png differ diff --git a/data/webcam/output/00030.png b/data/webcam/output/00030.png new file mode 100644 index 0000000000000000000000000000000000000000..719cd32755601de2efc4721a313e3ae2898addc7 Binary files /dev/null and b/data/webcam/output/00030.png differ diff --git a/data/webcam/output/00031.png b/data/webcam/output/00031.png new file mode 100644 index 0000000000000000000000000000000000000000..50dbac35185c1135cefd44c30fd76591b56dffdb Binary files /dev/null and b/data/webcam/output/00031.png differ diff --git a/data/webcam/output/00032.png b/data/webcam/output/00032.png new file mode 100644 index 0000000000000000000000000000000000000000..1e0087aa8439cc6de5a2953466dc8a4d47403ad7 Binary files /dev/null and b/data/webcam/output/00032.png differ diff --git a/data/webcam/output/00033.png b/data/webcam/output/00033.png new file mode 100644 index 0000000000000000000000000000000000000000..b22d4c386d8bc338cce6d3c08dd24d332df2780a Binary files /dev/null and b/data/webcam/output/00033.png differ diff --git a/data/webcam/output/00034.png b/data/webcam/output/00034.png new file mode 100644 index 0000000000000000000000000000000000000000..290661085efb9d43923a915f2ae135e9a4c5aafd Binary files /dev/null and b/data/webcam/output/00034.png differ diff --git a/data/webcam/output/00035.png b/data/webcam/output/00035.png new file mode 100644 index 0000000000000000000000000000000000000000..3ec1eba6c7c3d960e9d1ccf262153cc122dbf414 Binary files /dev/null and b/data/webcam/output/00035.png differ diff --git a/data/webcam/output/00036.png b/data/webcam/output/00036.png new file mode 100644 index 0000000000000000000000000000000000000000..ac08e55265f7c9691edc504beec39dbd5f825a62 Binary files /dev/null and b/data/webcam/output/00036.png differ diff --git a/data/webcam/output/00037.png b/data/webcam/output/00037.png new file mode 100644 index 0000000000000000000000000000000000000000..66dac6c55a14a232ba2460df397e5193042c129d Binary files /dev/null and b/data/webcam/output/00037.png differ diff --git a/data/webcam/output/00038.png b/data/webcam/output/00038.png new file mode 100644 index 0000000000000000000000000000000000000000..47ad736ad8c6fd60f95147fa366e09f5ce8c53a8 Binary files /dev/null and b/data/webcam/output/00038.png differ diff --git a/data/webcam/output/00039.png b/data/webcam/output/00039.png new file mode 100644 index 0000000000000000000000000000000000000000..7bcb8d0b3feb7f616dd527d414f09e409148a200 Binary files /dev/null and b/data/webcam/output/00039.png differ diff --git a/data/webcam/output/00040.png b/data/webcam/output/00040.png new file mode 100644 index 0000000000000000000000000000000000000000..5176c3995fc24c56c4cd161cddd452bcc1361333 Binary files /dev/null and b/data/webcam/output/00040.png differ diff --git a/data/webcam/output/00041.png b/data/webcam/output/00041.png new file mode 100644 index 0000000000000000000000000000000000000000..234c36ba7608ad3e6dfeb7a5eba53805179de3d7 Binary files /dev/null and b/data/webcam/output/00041.png differ diff --git a/data/webcam/output/00042.png b/data/webcam/output/00042.png new file mode 100644 index 0000000000000000000000000000000000000000..21fa1bff4a990b4983de8f089c3b3367bbdbf1d7 Binary files /dev/null and b/data/webcam/output/00042.png differ diff --git a/data/webcam/output/00043.png b/data/webcam/output/00043.png new file mode 100644 index 0000000000000000000000000000000000000000..f837cc2140af2077803130d5e89a5318f9672670 Binary files /dev/null and b/data/webcam/output/00043.png differ diff --git a/data/webcam/output/00044.png b/data/webcam/output/00044.png new file mode 100644 index 0000000000000000000000000000000000000000..b036b2956f9bab6e664fc790e0aa8106a64f4831 Binary files /dev/null and b/data/webcam/output/00044.png differ diff --git a/data/webcam/output/00045.png b/data/webcam/output/00045.png new file mode 100644 index 0000000000000000000000000000000000000000..2c973835423ccc6617adffbad4c4cfe512f6298f Binary files /dev/null and b/data/webcam/output/00045.png differ diff --git a/data/webcam/output/00046.png b/data/webcam/output/00046.png new file mode 100644 index 0000000000000000000000000000000000000000..f4c5690ff14406bad7a92a48f293fe6f61ccd362 Binary files /dev/null and b/data/webcam/output/00046.png differ diff --git a/data/webcam/output/00047.png b/data/webcam/output/00047.png new file mode 100644 index 0000000000000000000000000000000000000000..25ae9f82cd2fd6f841a297eebb2dd10a9f7b0174 Binary files /dev/null and b/data/webcam/output/00047.png differ diff --git a/data/webcam/output/00048.png b/data/webcam/output/00048.png new file mode 100644 index 0000000000000000000000000000000000000000..fb36d32405da3b330278d8e51b6d411097375e34 Binary files /dev/null and b/data/webcam/output/00048.png differ diff --git a/data/webcam/output/00049.png b/data/webcam/output/00049.png new file mode 100644 index 0000000000000000000000000000000000000000..f9863b25095ca7545658284dc083e21678b8533f Binary files /dev/null and b/data/webcam/output/00049.png differ diff --git a/data/webcam/output/00050.png b/data/webcam/output/00050.png new file mode 100644 index 0000000000000000000000000000000000000000..bcfcb15727e0fe55b87aefc31ebdc34b7a9b3ad9 Binary files /dev/null and b/data/webcam/output/00050.png differ diff --git a/data/webcam/output/00051.png b/data/webcam/output/00051.png new file mode 100644 index 0000000000000000000000000000000000000000..a7e7e32fbba88ac94702dbac5ccbe85601baac47 Binary files /dev/null and b/data/webcam/output/00051.png differ diff --git a/data/webcam/output/00052.png b/data/webcam/output/00052.png new file mode 100644 index 0000000000000000000000000000000000000000..9e9a81f207d0763d26b79a07281678a27d62471e Binary files /dev/null and b/data/webcam/output/00052.png differ diff --git a/data/webcam/output/00053.png b/data/webcam/output/00053.png new file mode 100644 index 0000000000000000000000000000000000000000..ab83f4e401516dcb80c87f028590b10e74bf2074 Binary files /dev/null and b/data/webcam/output/00053.png differ diff --git a/data/webcam/output/00054.png b/data/webcam/output/00054.png new file mode 100644 index 0000000000000000000000000000000000000000..9c366bedc0ed38c9d5c3e9ac33a4b7b799985907 Binary files /dev/null and b/data/webcam/output/00054.png differ diff --git a/data/webcam/output/00055.png b/data/webcam/output/00055.png new file mode 100644 index 0000000000000000000000000000000000000000..51bbeef40c80625702b5feb35847ab76b3607c2d Binary files /dev/null and b/data/webcam/output/00055.png differ diff --git a/data/webcam/output/00056.png b/data/webcam/output/00056.png new file mode 100644 index 0000000000000000000000000000000000000000..fe97bfbd9687c12bdcb680acad9e7cc21b9567a4 Binary files /dev/null and b/data/webcam/output/00056.png differ diff --git a/data/webcam/output/00057.png b/data/webcam/output/00057.png new file mode 100644 index 0000000000000000000000000000000000000000..e60809de69efacd68ad72b6754d7e919ff9c78bf Binary files /dev/null and b/data/webcam/output/00057.png differ diff --git a/data/webcam/output/00058.png b/data/webcam/output/00058.png new file mode 100644 index 0000000000000000000000000000000000000000..bdc41858f11a02b9204aac43ea8f543bde91c1b2 Binary files /dev/null and b/data/webcam/output/00058.png differ diff --git a/data/webcam/output/00059.png b/data/webcam/output/00059.png new file mode 100644 index 0000000000000000000000000000000000000000..68d3c7c103f83e67bfe6da327471406e39389df2 Binary files /dev/null and b/data/webcam/output/00059.png differ diff --git a/data/webcam/output/00060.png b/data/webcam/output/00060.png new file mode 100644 index 0000000000000000000000000000000000000000..e643706c96507d9ac31e053a9469c08e5717bb52 Binary files /dev/null and b/data/webcam/output/00060.png differ diff --git a/data/webcam/output/00061.png b/data/webcam/output/00061.png new file mode 100644 index 0000000000000000000000000000000000000000..81fd41feb786895152ce18182245025b8aad7995 Binary files /dev/null and b/data/webcam/output/00061.png differ diff --git a/data/webcam/output/00062.png b/data/webcam/output/00062.png new file mode 100644 index 0000000000000000000000000000000000000000..cfac0c637dac500bd95d4e39d8de9ac0618d3ada Binary files /dev/null and b/data/webcam/output/00062.png differ diff --git a/data/webcam/output/00063.png b/data/webcam/output/00063.png new file mode 100644 index 0000000000000000000000000000000000000000..a51efa1b451ee96d6705646d81c3f01a6f6a038b Binary files /dev/null and b/data/webcam/output/00063.png differ diff --git a/data/webcam/output/00064.png b/data/webcam/output/00064.png new file mode 100644 index 0000000000000000000000000000000000000000..3fef7fca56779d8d5bdb1b24d32a77e835e091d1 Binary files /dev/null and b/data/webcam/output/00064.png differ diff --git a/data/webcam/output/00065.png b/data/webcam/output/00065.png new file mode 100644 index 0000000000000000000000000000000000000000..12fd81e441a79a823835c0f347ffe7263ab9e3f8 Binary files /dev/null and b/data/webcam/output/00065.png differ diff --git a/data/webcam/output/00066.png b/data/webcam/output/00066.png new file mode 100644 index 0000000000000000000000000000000000000000..dea5189c43ed1b34777d1e1b686d49120f0bcda8 Binary files /dev/null and b/data/webcam/output/00066.png differ diff --git a/data/webcam/output/00067.png b/data/webcam/output/00067.png new file mode 100644 index 0000000000000000000000000000000000000000..9f407108a63f45aff3595a7d7c2fb538173c9162 Binary files /dev/null and b/data/webcam/output/00067.png differ diff --git a/data/webcam/output/00068.png b/data/webcam/output/00068.png new file mode 100644 index 0000000000000000000000000000000000000000..9af039d232b9998f8b95fbb4cb00d42eda4047ff Binary files /dev/null and b/data/webcam/output/00068.png differ diff --git a/data/webcam/output/00069.png b/data/webcam/output/00069.png new file mode 100644 index 0000000000000000000000000000000000000000..f086c90fcf05a8bd8ad317d93a465a4e8d3279a6 Binary files /dev/null and b/data/webcam/output/00069.png differ diff --git a/data/webcam/output/00070.png b/data/webcam/output/00070.png new file mode 100644 index 0000000000000000000000000000000000000000..32ce8dd8cfa1fbbbd4fcebdd73dfbd2aa8c924ea Binary files /dev/null and b/data/webcam/output/00070.png differ diff --git a/data/webcam/target/00000.png b/data/webcam/target/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..4746c66f19afd668419530e3606b04513952c915 Binary files /dev/null and b/data/webcam/target/00000.png differ diff --git a/data/webcam/target/00036.png b/data/webcam/target/00036.png new file mode 100644 index 0000000000000000000000000000000000000000..6dfc74ec26afadfa85bc10221eff18ad928f71ba Binary files /dev/null and b/data/webcam/target/00036.png differ diff --git a/data/webcam/target/00070.png b/data/webcam/target/00070.png new file mode 100644 index 0000000000000000000000000000000000000000..2a8f72279189aa5f49f7659c1350c6cd69227e31 Binary files /dev/null and b/data/webcam/target/00070.png differ diff --git a/original_models.py b/original_models.py new file mode 100644 index 0000000000000000000000000000000000000000..a62c47e88891585683f3a13ce64f14f6b47a321e --- /dev/null +++ b/original_models.py @@ -0,0 +1,359 @@ +# This file is copied from https://github.com/rnwzd/FSPBT-Image-Translation/blob/master/original_models.py + +# MIT License + +# Copyright (c) 2022 Lorenzo Breschi + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +import torch +import torch.nn as nn +from torch.autograd import Variable +from torch.nn import functional as F + +import torchvision +from torchvision import models + +import pytorch_lightning as pl + +class LeakySoftplus(nn.Module): + def __init__(self,negative_slope: float = 0.01 ): + super().__init__() + self.negative_slope=negative_slope + + def forward(self,input): + return F.softplus(input)+F.logsigmoid(input)*self.negative_slope + + +grelu = nn.LeakyReLU(0.2) +#grelu = nn.Softplus() +#grelu = LeakySoftplus(0.2) +##### +# Currently default generator we use +# conv0 -> conv1 -> conv2 -> resnet_blocks -> upconv2 -> upconv1 -> conv_11 -> (conv_11_a)* -> conv_12 -> (Tanh)* +# there are 2 conv layers inside conv_11_a +# * means is optional, model uses skip-connections +class Generator(pl.LightningModule): + def __init__(self, norm_layer='batch_norm', use_bias=False, resnet_blocks=7, tanh=True, + filters=[32, 64, 128, 128, 128, 64], input_channels=3, output_channels=3, append_smoothers=False): + super().__init__() + assert norm_layer in [None, 'batch_norm', 'instance_norm'], \ + "norm_layer should be None, 'batch_norm' or 'instance_norm', not {}".format( + norm_layer) + self.norm_layer = None + if norm_layer == 'batch_norm': + self.norm_layer = nn.BatchNorm2d + elif norm_layer == 'instance_norm': + self.norm_layer = nn.InstanceNorm2d + + # filters = [f//3 for f in filters] + self.use_bias = use_bias + self.resnet_blocks = resnet_blocks + self.append_smoothers = append_smoothers + + stride1 = 2 + stride2 = 2 + self.conv0 = self.relu_layer(in_filters=input_channels, out_filters=filters[0], + kernel_size=7, stride=1, padding=3, + bias=self.use_bias, + norm_layer=self.norm_layer, + nonlinearity=grelu) + + self.conv1 = self.relu_layer(in_filters=filters[0], + out_filters=filters[1], + kernel_size=3, stride=stride1, padding=1, + bias=self.use_bias, + norm_layer=self.norm_layer, + nonlinearity=grelu) + + self.conv2 = self.relu_layer(in_filters=filters[1], + out_filters=filters[2], + kernel_size=3, stride=stride2, padding=1, + bias=self.use_bias, + norm_layer=self.norm_layer, + nonlinearity=grelu) + + self.resnets = nn.ModuleList() + for i in range(self.resnet_blocks): + self.resnets.append( + self.resnet_block(in_filters=filters[2], + out_filters=filters[2], + kernel_size=3, stride=1, padding=1, + bias=self.use_bias, + norm_layer=self.norm_layer, + nonlinearity=grelu)) + + self.upconv2 = self.upconv_layer_upsample_and_conv(in_filters=filters[3] + filters[2], + # in_filters=filters[3], # disable skip-connections + out_filters=filters[4], + scale_factor=stride2, + kernel_size=3, stride=1, padding=1, + bias=self.use_bias, + norm_layer=self.norm_layer, + nonlinearity=grelu) + + self.upconv1 = self.upconv_layer_upsample_and_conv(in_filters=filters[4] + filters[1], + # in_filters=filters[4], # disable skip-connections + out_filters=filters[4], + scale_factor=stride1, + kernel_size=3, stride=1, padding=1, + bias=self.use_bias, + norm_layer=self.norm_layer, + nonlinearity=grelu) + + self.conv_11 = nn.Sequential( + nn.Conv2d(in_channels=filters[0] + filters[4] + input_channels, + # in_channels=filters[4], # disable skip-connections + out_channels=filters[5], + kernel_size=7, stride=1, padding=3, bias=self.use_bias, padding_mode='zeros'), + grelu + ) + + if self.append_smoothers: + self.conv_11_a = nn.Sequential( + nn.Conv2d(filters[5], filters[5], kernel_size=3, + bias=self.use_bias, padding=1, padding_mode='zeros'), + grelu, + # replace with variable + nn.BatchNorm2d(num_features=filters[5]), + nn.Conv2d(filters[5], filters[5], kernel_size=3, + bias=self.use_bias, padding=1, padding_mode='zeros'), + grelu + ) + + if tanh: + self.conv_12 = nn.Sequential(nn.Conv2d(filters[5], output_channels, + kernel_size=1, stride=1, + padding=0, bias=True, padding_mode='zeros'), + #torchvision.transforms.Grayscale(num_output_channels=3), + nn.Sigmoid()) + else: + self.conv_12 = nn.Conv2d(filters[5], output_channels, kernel_size=1, stride=1, + padding=0, bias=True, padding_mode='zeros') + + def log_tensors(self, logger, tag, img_tensor): + logger.experiment.add_images(tag, img_tensor) + + def forward(self, input, logger=None, **kwargs): + # [1, 3, 534, 800] + output_d0 = self.conv0(input) + output_d1 = self.conv1(output_d0) + # comment to disable skip-connections + output_d2 = self.conv2(output_d1) + + output = output_d2 + for layer in self.resnets: + output = layer(output) + output + + output_u2 = self.upconv2(torch.cat((output, output_d2), dim=1)) + + output_u1 = self.upconv1(torch.cat((output_u2, output_d1), dim=1)) + output = torch.cat( + (output_u1, output_d0, input), dim=1) + + output_11 = self.conv_11(output) + + if self.append_smoothers: + output_11_a = self.conv_11_a(output_11) + else: + output_11_a = output_11 + output_12 = self.conv_12(output_11_a) + + output = output_12 + + return output + + def relu_layer(self, in_filters, out_filters, kernel_size, stride, padding, bias, + norm_layer, nonlinearity): + out = nn.Sequential() + out.add_module('conv', nn.Conv2d(in_channels=in_filters, + out_channels=out_filters, + kernel_size=kernel_size, stride=stride, + padding=padding, bias=bias, padding_mode='zeros')) + + if norm_layer: + out.add_module('normalization', + norm_layer(num_features=out_filters)) + if nonlinearity: + out.add_module('nonlinearity', nonlinearity) + # out.add_module('dropout', nn.Dropout2d(0.25)) + + return out + + def resnet_block(self, in_filters, out_filters, kernel_size, stride, padding, bias, + norm_layer, nonlinearity): + out = nn.Sequential() + if nonlinearity: + out.add_module('nonlinearity_0', nonlinearity) + out.add_module('conv_0', nn.Conv2d(in_channels=in_filters, + out_channels=out_filters, + kernel_size=kernel_size, stride=stride, + padding=padding, bias=bias, padding_mode='zeros')) + if norm_layer: + out.add_module('normalization', + norm_layer(num_features=out_filters)) + if nonlinearity: + out.add_module('nonlinearity_1', nonlinearity) + out.add_module('conv_1', nn.Conv2d(in_channels=in_filters, + out_channels=out_filters, + kernel_size=kernel_size, stride=stride, + padding=padding, bias=bias, padding_mode='zeros')) + return out + + def upconv_layer_upsample_and_conv(self, in_filters, out_filters, scale_factor, kernel_size, stride, padding, bias, + norm_layer, nonlinearity): + + parts = [nn.Upsample(scale_factor=scale_factor), + nn.Conv2d(in_filters, out_filters, kernel_size, + stride, padding=padding, bias=False, padding_mode='zeros') + ] + + if norm_layer: + parts.append(norm_layer(num_features=out_filters)) + + if nonlinearity: + parts.append(nonlinearity) + + return nn.Sequential(*parts) + + + + +relu = grelu + +##### +# Default discriminator +##### + +relu = nn.LeakyReLU(0.2) + +class Discriminator(nn.Module): + def __init__(self, num_filters=12, input_channels=3, n_layers=2, + norm_layer='instance_norm', use_bias=True): + super().__init__() + + self.num_filters = num_filters + + self.input_channels = input_channels + self.use_bias = use_bias + + if norm_layer == 'batch_norm': + self.norm_layer = nn.BatchNorm2d + else: + self.norm_layer = nn.InstanceNorm2d + self.net = self.make_net( + n_layers, self.input_channels, 1, 4, 2, self.use_bias) + + def make_net(self, n, flt_in, flt_out=1, k=4, stride=2, bias=True): + padding = 1 + model = nn.Sequential() + + model.add_module('conv0', self.make_block( + flt_in, self.num_filters, k, stride, padding, bias, None, relu)) + + flt_mult, flt_mult_prev = 1, 1 + # n - 1 blocks + for l in range(1, n): + flt_mult_prev = flt_mult + flt_mult = min(2**(l), 8) + model.add_module('conv_%d' % (l), self.make_block(self.num_filters * flt_mult_prev, self.num_filters * flt_mult, + k, stride, padding, bias, self.norm_layer, relu)) + + flt_mult_prev = flt_mult + flt_mult = min(2**n, 8) + model.add_module('conv_%d' % (n), self.make_block(self.num_filters * flt_mult_prev, self.num_filters * flt_mult, + k, 1, padding, bias, self.norm_layer, relu)) + model.add_module('conv_out', self.make_block( + self.num_filters * flt_mult, 1, k, 1, padding, bias, None, None)) + return model + + def make_block(self, flt_in, flt_out, k, stride, padding, bias, norm, relu): + m = nn.Sequential() + m.add_module('conv', nn.Conv2d(flt_in, flt_out, k, + stride=stride, padding=padding, bias=bias, padding_mode='zeros')) + if norm is not None: + m.add_module('norm', norm(flt_out)) + if relu is not None: + m.add_module('relu', relu) + return m + + def forward(self, x): + output = self.net(x) + # output = output.mean((2, 3), True) + # output = output.squeeze(-1).squeeze(-1) + # output = output.mean(dim=(-1,-2)) + return output + + +##### +# Perception VGG19 loss +##### +class PerceptualVGG19(nn.Module): + def __init__(self, feature_layers=[0, 3, 5], use_normalization=False): + super().__init__() + # model = models.vgg19(pretrained=True) + model = models.squeezenet1_1(pretrained=True) + model.float() + model.eval() + + self.model = model + self.feature_layers = feature_layers + + self.mean = torch.FloatTensor([0.485, 0.456, 0.406]) + self.mean_tensor = None + + self.std = torch.FloatTensor([0.229, 0.224, 0.225]) + self.std_tensor = None + + self.use_normalization = use_normalization + + for param in self.parameters(): + param.requires_grad = False + + def normalize(self, x): + if not self.use_normalization: + return x + + if self.mean_tensor is None: + self.mean_tensor = Variable( + self.mean.view(1, 3, 1, 1).expand(x.shape), + requires_grad=False) + self.std_tensor = Variable( + self.std.view(1, 3, 1, 1).expand(x.shape), requires_grad=False) + + x = (x + 1) / 2 + return (x - self.mean_tensor) / self.std_tensor + + def run(self, x): + features = [] + + h = x + + for f in range(max(self.feature_layers) + 1): + h = self.model.features[f](h) + if f in self.feature_layers: + not_normed_features = h.clone().view(h.size(0), -1) + features.append(not_normed_features) + + return torch.cat(features, dim=1) + + def forward(self, x): + h = self.normalize(x) + return self.run(h) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..01171fc5ccf2c3bd73f47923ca8fbda25aacc71c --- /dev/null +++ b/requirements.txt @@ -0,0 +1,12 @@ +# nano default +bigdl-nano[pytorch]==2.1.0b20220606 +setuptools==58.0.4 +protobuf==3.20.1 + +# inference +neural_compressor +onnx==1.9.0 +onnxruntime==1.10.0 +onnxruntime-extensions + +pathlib \ No newline at end of file