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