update training code

This commit is contained in:
zhangmozhe
2020-12-21 23:17:29 +08:00
parent a93d050dd1
commit 875e222242
56 changed files with 6891 additions and 215 deletions
+114
View File
@@ -0,0 +1,114 @@
# The default ``config.py``
# flake8: noqa
def set_prefs(prefs):
"""This function is called before opening the project"""
# Specify which files and folders to ignore in the project.
# Changes to ignored resources are not added to the history and
# VCSs. Also they are not returned in `Project.get_files()`.
# Note that ``?`` and ``*`` match all characters but slashes.
# '*.pyc': matches 'test.pyc' and 'pkg/test.pyc'
# 'mod*.pyc': matches 'test/mod1.pyc' but not 'mod/1.pyc'
# '.svn': matches 'pkg/.svn' and all of its children
# 'build/*.o': matches 'build/lib.o' but not 'build/sub/lib.o'
# 'build//*.o': matches 'build/lib.o' and 'build/sub/lib.o'
prefs['ignored_resources'] = ['*.pyc', '*~', '.ropeproject',
'.hg', '.svn', '_svn', '.git', '.tox']
# Specifies which files should be considered python files. It is
# useful when you have scripts inside your project. Only files
# ending with ``.py`` are considered to be python files by
# default.
# prefs['python_files'] = ['*.py']
# Custom source folders: By default rope searches the project
# for finding source folders (folders that should be searched
# for finding modules). You can add paths to that list. Note
# that rope guesses project source folders correctly most of the
# time; use this if you have any problems.
# The folders should be relative to project root and use '/' for
# separating folders regardless of the platform rope is running on.
# 'src/my_source_folder' for instance.
# prefs.add('source_folders', 'src')
# You can extend python path for looking up modules
# prefs.add('python_path', '~/python/')
# Should rope save object information or not.
prefs['save_objectdb'] = True
prefs['compress_objectdb'] = False
# If `True`, rope analyzes each module when it is being saved.
prefs['automatic_soa'] = True
# The depth of calls to follow in static object analysis
prefs['soa_followed_calls'] = 0
# If `False` when running modules or unit tests "dynamic object
# analysis" is turned off. This makes them much faster.
prefs['perform_doa'] = True
# Rope can check the validity of its object DB when running.
prefs['validate_objectdb'] = True
# How many undos to hold?
prefs['max_history_items'] = 32
# Shows whether to save history across sessions.
prefs['save_history'] = True
prefs['compress_history'] = False
# Set the number spaces used for indenting. According to
# :PEP:`8`, it is best to use 4 spaces. Since most of rope's
# unit-tests use 4 spaces it is more reliable, too.
prefs['indent_size'] = 4
# Builtin and c-extension modules that are allowed to be imported
# and inspected by rope.
prefs['extension_modules'] = []
# Add all standard c-extensions to extension_modules list.
prefs['import_dynload_stdmods'] = True
# If `True` modules with syntax errors are considered to be empty.
# The default value is `False`; When `False` syntax errors raise
# `rope.base.exceptions.ModuleSyntaxError` exception.
prefs['ignore_syntax_errors'] = False
# If `True`, rope ignores unresolvable imports. Otherwise, they
# appear in the importing namespace.
prefs['ignore_bad_imports'] = False
# If `True`, rope will insert new module imports as
# `from <package> import <module>` by default.
prefs['prefer_module_from_imports'] = False
# If `True`, rope will transform a comma list of imports into
# multiple separate import statements when organizing
# imports.
prefs['split_imports'] = False
# If `True`, rope will remove all top-level import statements and
# reinsert them at the top of the module when making changes.
prefs['pull_imports_to_top'] = True
# If `True`, rope will sort imports alphabetically by module name instead
# of alphabetically by import statement, with from imports after normal
# imports.
prefs['sort_imports_alphabetically'] = False
# Location of implementation of
# rope.base.oi.type_hinting.interfaces.ITypeHintingFactory In general
# case, you don't have to change this value, unless you're an rope expert.
# Change this value to inject you own implementations of interfaces
# listed in module rope.base.oi.type_hinting.providers.interfaces
# For example, you can add you own providers for Django Models, or disable
# the search type-hinting in a class hierarchy, etc.
prefs['type_hinting_factory'] = (
'rope.base.oi.type_hinting.factory.default_type_hinting_factory')
def project_opened(project):
"""This function is called after opening the project"""
# Do whatever you like here!
BIN
View File
Binary file not shown.
+15
View File
@@ -0,0 +1,15 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal"
}
]
}
+13
View File
@@ -66,6 +66,18 @@ python test.py --clip_path ./sample_videos/clips/v32 \
Note that we use 216\*384 images for training, which has aspect ratio of 1:2. During inference, we scale the input to this size and then rescale the output back to the original size.
## Train
We also provide training code for reference. The training can be started by running:
```bash
python --data_root [root of video samples] \
--data_root_imagenet [root of image samples] \
--gpu_ids [gpu ids] \
```
We do not provide the full video dataset due to the copyright issue. For image samples, we retrieve semantically similar images from ImageNet using [this repository](https://github.com/hmmlillian/Gray-Image-Retrieval). Still, one can refer to our code to understand the detailed procedure of augmenting the image dataset to mimic the video frames.
## Comparison with State-of-the-Arts
<figure>
@@ -73,6 +85,7 @@ Note that we use 216\*384 images for training, which has aspect ratio of 1:2. Du
</figure>
## More results
<figure>
<img src='assets/sample2.png' />
</figure>
+30
View File
@@ -0,0 +1,30 @@
python test.py --clip_path ../test_videos/frames/0 --ref_path ../test_videos/refs/0 --output_path ../test_videos/output
python test.py --clip_path ../test_videos/frames/1 --ref_path ../test_videos/refs/1 --output_path ../test_videos/output
python test.py --clip_path ../test_videos/frames/2 --ref_path ../test_videos/refs/2 --output_path ../test_videos/output
python test.py --clip_path ../test_videos/frames/3 --ref_path ../test_videos/refs/3 --output_path ../test_videos/output
python test.py --clip_path ../test_videos/frames/4 --ref_path ../test_videos/refs/4 --output_path ../test_videos/output
python test.py --clip_path ../test_videos/frames/5 --ref_path ../test_videos/refs/5 --output_path ../test_videos/output
python test.py --clip_path ../test_videos/frames/6 --ref_path ../test_videos/refs/6 --output_path ../test_videos/output
python test.py --clip_path ../test_videos/frames/7 --ref_path ../test_videos/refs/7 --output_path ../test_videos/output
python test.py --clip_path ../test_videos/frames/8 --ref_path ../test_videos/refs/8 --output_path ../test_videos/output
python test.py --clip_path ../test_videos/frames/9 --ref_path ../test_videos/refs/9 --output_path ../test_videos/output
python test.py --clip_path ../test_videos/frames/10 --ref_path ../test_videos/refs/10 --output_path ../test_videos/output
python test.py --clip_path ../test_videos/frames/11 --ref_path ../test_videos/refs/11 --output_path ../test_videos/output
python test.py --clip_path ../test_videos/frames/12 --ref_path ../test_videos/refs/12 --output_path ../test_videos/output
python test.py --clip_path ../test_videos/frames/13 --ref_path ../test_videos/refs/13 --output_path ../test_videos/output
python test.py --clip_path ../test_videos/frames/14 --ref_path ../test_videos/refs/14 --output_path ../test_videos/output
+348
View File
@@ -0,0 +1,348 @@
from __future__ import division
import collections
import numbers
import random
import torch
from PIL import Image
from skimage import color
import lib.functional as F
__all__ = [
"Compose",
"Concatenate",
"ToTensor",
"Normalize",
"Resize",
"Scale",
"CenterCrop",
"Pad",
"RandomCrop",
"RandomHorizontalFlip",
"RandomVerticalFlip",
"RandomResizedCrop",
"RandomSizedCrop",
"FiveCrop",
"TenCrop",
"RGB2Lab",
]
def CustomFunc(inputs, func, *args, **kwargs):
im_l = func(inputs[0], *args, **kwargs)
im_ab = func(inputs[1], *args, **kwargs)
warp_ba = func(inputs[2], *args, **kwargs)
warp_aba = func(inputs[3], *args, **kwargs)
im_gbl_ab = func(inputs[4], *args, **kwargs)
bgr_mc_im = func(inputs[5], *args, **kwargs)
layer_data = [im_l, im_ab, warp_ba, warp_aba, im_gbl_ab, bgr_mc_im]
for l in range(5):
layer = inputs[6 + l]
err_ba = func(layer[0], *args, **kwargs)
err_ab = func(layer[1], *args, **kwargs)
layer_data.append([err_ba, err_ab])
return layer_data
class Compose(object):
"""Composes several transforms together.
Args:
transforms (list of ``Transform`` objects): list of transforms to compose.
Example:
>>> transforms.Compose([
>>> transforms.CenterCrop(10),
>>> transforms.ToTensor(),
>>> ])
"""
def __init__(self, transforms):
self.transforms = transforms
def __call__(self, inputs):
for t in self.transforms:
inputs = t(inputs)
return inputs
class Concatenate(object):
"""
Input: [im_l, im_ab, inputs]
inputs = [warp_ba_l, warp_ba_ab, warp_aba, err_pm, err_aba]
Output:[im_l, err_pm, warp_ba, warp_aba, im_ab, err_aba]
"""
def __call__(self, inputs):
im_l = inputs[0]
im_ab = inputs[1]
warp_ba = inputs[2]
warp_aba = inputs[3]
im_glb_ab = inputs[4]
bgr_mc_im = inputs[5]
bgr_mc_im = bgr_mc_im[[2, 1, 0], ...]
err_ba = []
err_ab = []
for l in range(5):
layer = inputs[6 + l]
err_ba.append(layer[0])
err_ab.append(layer[1])
cerr_ba = torch.cat(err_ba, 0)
cerr_ab = torch.cat(err_ab, 0)
return (im_l, cerr_ba, warp_ba, warp_aba, im_glb_ab, bgr_mc_im, im_ab, cerr_ab)
class ToTensor(object):
"""Convert a ``PIL Image`` or ``numpy.ndarray`` to tensor.
Converts a PIL Image or numpy.ndarray (H x W x C) in the range
[0, 255] to a torch.FloatTensor of shape (C x H x W) in the range [0.0, 1.0].
"""
def __call__(self, inputs):
"""
Args:
pic (PIL Image or numpy.ndarray): Image to be converted to tensor.
Returns:
Tensor: Converted image.
"""
return CustomFunc(inputs, F.to_mytensor)
class Normalize(object):
"""Normalize an tensor image with mean and standard deviation.
Given mean: ``(M1,...,Mn)`` and std: ``(S1,..,Sn)`` for ``n`` channels, this transform
will normalize each channel of the input ``torch.*Tensor`` i.e.
``input[channel] = (input[channel] - mean[channel]) / std[channel]``
Args:
mean (sequence): Sequence of means for each channel.
std (sequence): Sequence of standard deviations for each channel.
"""
def __call__(self, inputs):
"""
Args:
tensor (Tensor): Tensor image of size (C, H, W) to be normalized.
Returns:
Tensor: Normalized Tensor image.
"""
im_l = F.normalize(inputs[0], 50, 1) # [0, 100]
im_ab = F.normalize(inputs[1], (0, 0), (1, 1)) # [-100, 100]
inputs[2][0:1, :, :] = F.normalize(inputs[2][0:1, :, :], 50, 1)
inputs[2][1:3, :, :] = F.normalize(inputs[2][1:3, :, :], (0, 0), (1, 1))
warp_ba = inputs[2]
inputs[3][0:1, :, :] = F.normalize(inputs[3][0:1, :, :], 50, 1)
inputs[3][1:3, :, :] = F.normalize(inputs[3][1:3, :, :], (0, 0), (1, 1))
warp_aba = inputs[3]
im_gbl_ab = F.normalize(inputs[4], (0, 0), (1, 1)) # [-100, 100]
bgr_mc_im = F.normalize(inputs[5], (123.68, 116.78, 103.938), (1, 1, 1))
layer_data = [im_l, im_ab, warp_ba, warp_aba, im_gbl_ab, bgr_mc_im]
for l in range(5):
layer = inputs[6 + l]
err_ba = F.normalize(layer[0], 127, 2) # [0, 255]
err_ab = F.normalize(layer[1], 127, 2) # [0, 255]
layer_data.append([err_ba, err_ab])
return layer_data
class Resize(object):
"""Resize the input PIL Image to the given size.
Args:
size (sequence or int): Desired output size. If size is a sequence like
(h, w), output size will be matched to this. If size is an int,
smaller edge of the image will be matched to this number.
i.e, if height > width, then image will be rescaled to
(size * height / width, size)
interpolation (int, optional): Desired interpolation. Default is
``PIL.Image.BILINEAR``
"""
def __init__(self, size, interpolation=Image.BILINEAR):
assert isinstance(size, int) or (isinstance(size, collections.Iterable) and len(size) == 2)
self.size = size
self.interpolation = interpolation
def __call__(self, inputs):
"""
Args:
img (PIL Image): Image to be scaled.
Returns:
PIL Image: Rescaled image.
"""
return CustomFunc(inputs, F.resize, self.size, self.interpolation)
class RandomCrop(object):
"""Crop the given PIL Image at a random location.
Args:
size (sequence or int): Desired output size of the crop. If size is an
int instead of sequence like (h, w), a square crop (size, size) is
made.
padding (int or sequence, optional): Optional padding on each border
of the image. Default is 0, i.e no padding. If a sequence of length
4 is provided, it is used to pad left, top, right, bottom borders
respectively.
"""
def __init__(self, size, padding=0):
if isinstance(size, numbers.Number):
self.size = (int(size), int(size))
else:
self.size = size
self.padding = padding
@staticmethod
def get_params(img, output_size):
"""Get parameters for ``crop`` for a random crop.
Args:
img (PIL Image): Image to be cropped.
output_size (tuple): Expected output size of the crop.
Returns:
tuple: params (i, j, h, w) to be passed to ``crop`` for random crop.
"""
w, h = img.size
th, tw = output_size
if w == tw and h == th:
return 0, 0, h, w
i = random.randint(0, h - th)
j = random.randint(0, w - tw)
return i, j, th, tw
def __call__(self, inputs):
"""
Args:
img (PIL Image): Image to be cropped.
Returns:
PIL Image: Cropped image.
"""
if self.padding > 0:
inputs = CustomFunc(inputs, F.pad, self.padding)
i, j, h, w = self.get_params(inputs[0], self.size)
return CustomFunc(inputs, F.crop, i, j, h, w)
class CenterCrop(object):
"""Crop the given PIL Image at a random location.
Args:
size (sequence or int): Desired output size of the crop. If size is an
int instead of sequence like (h, w), a square crop (size, size) is
made.
padding (int or sequence, optional): Optional padding on each border
of the image. Default is 0, i.e no padding. If a sequence of length
4 is provided, it is used to pad left, top, right, bottom borders
respectively.
"""
def __init__(self, size, padding=0):
if isinstance(size, numbers.Number):
self.size = (int(size), int(size))
else:
self.size = size
self.padding = padding
@staticmethod
def get_params(img, output_size):
"""Get parameters for ``crop`` for a random crop.
Args:
img (PIL Image): Image to be cropped.
output_size (tuple): Expected output size of the crop.
Returns:
tuple: params (i, j, h, w) to be passed to ``crop`` for random crop.
"""
w, h = img.size
th, tw = output_size
if w == tw and h == th:
return 0, 0, h, w
i = (h - th) // 2
j = (w - tw) // 2
return i, j, th, tw
def __call__(self, inputs):
"""
Args:
img (PIL Image): Image to be cropped.
Returns:
PIL Image: Cropped image.
"""
if self.padding > 0:
inputs = CustomFunc(inputs, F.pad, self.padding)
i, j, h, w = self.get_params(inputs[0], self.size)
return CustomFunc(inputs, F.crop, i, j, h, w)
class RandomHorizontalFlip(object):
"""Horizontally flip the given PIL Image randomly with a probability of 0.5."""
def __call__(self, inputs):
"""
Args:
img (PIL Image): Image to be flipped.
Returns:
PIL Image: Randomly flipped image.
"""
if random.random() < 0.5:
return CustomFunc(inputs, F.hflip)
return inputs
class RGB2Lab(object):
def __call__(self, inputs):
"""
Args:
img (PIL Image): Image to be flipped.
Returns:
PIL Image: Randomly flipped image.
"""
def __call__(self, inputs):
image_lab = color.rgb2lab(inputs[0])
warp_ba_lab = color.rgb2lab(inputs[2])
warp_aba_lab = color.rgb2lab(inputs[3])
im_gbl_lab = color.rgb2lab(inputs[4])
inputs[0] = image_lab[:, :, :1] # l channel
inputs[1] = image_lab[:, :, 1:] # ab channel
inputs[2] = warp_ba_lab # lab channel
inputs[3] = warp_aba_lab # lab channel
inputs[4] = im_gbl_lab[:, :, 1:] # ab channel
return inputs
+301
View File
@@ -0,0 +1,301 @@
import sys
sys.path.insert(0, "..")
import os
import random
import cv2
import numpy as np
import torch
import torchvision.utils as vutils
from PIL import Image
from skimage import color
from torch.autograd import Variable
from utils.flowlib import read_flow
from utils.util_distortion import CenterPad
import lib.functional as F
cv2.setNumThreads(0)
class RGB2Lab(object):
def __init__(self):
pass
def __call__(self, inputs):
return color.rgb2lab(inputs)
class Normalize(object):
def __init__(self):
pass
def __call__(self, inputs):
inputs[0:1, :, :] = F.normalize(inputs[0:1, :, :], 50, 1)
inputs[1:3, :, :] = F.normalize(inputs[1:3, :, :], (0, 0), (1, 1))
return inputs
class ToTensor(object):
def __init__(self):
pass
def __call__(self, inputs):
outputs = F.to_mytensor(inputs) # permute channel and transform to tensor
return outputs
class RandomErasing(object):
def __init__(self, probability=0.6, sl=0.05, sh=0.6):
self.probability = probability
self.sl = sl
self.sh = sh
def __call__(self, img):
img = np.array(img)
if random.uniform(0, 1) > self.probability:
return Image.fromarray(img)
area = img.shape[0] * img.shape[1]
h0 = img.shape[0]
w0 = img.shape[1]
channel = img.shape[2]
h = int(round(random.uniform(self.sl, self.sh) * h0))
w = int(round(random.uniform(self.sl, self.sh) * w0))
if w < img.shape[1] and h < img.shape[0]:
x1 = random.randint(0, img.shape[0] - h)
y1 = random.randint(0, img.shape[1] - w)
img[x1 : x1 + h, y1 : y1 + w, :] = np.random.rand(h, w, channel) * 255
return Image.fromarray(img)
return Image.fromarray(img)
class CenterCrop(object):
"""
center crop the numpy array
"""
def __init__(self, image_size):
self.h0, self.w0 = image_size
def __call__(self, input_numpy):
if input_numpy.ndim == 3:
h, w, channel = input_numpy.shape
output_numpy = np.zeros((self.h0, self.w0, channel))
output_numpy = input_numpy[
(h - self.h0) // 2 : (h - self.h0) // 2 + self.h0, (w - self.w0) // 2 : (w - self.w0) // 2 + self.w0, :
]
else:
h, w = input_numpy.shape
output_numpy = np.zeros((self.h0, self.w0))
output_numpy = input_numpy[
(h - self.h0) // 2 : (h - self.h0) // 2 + self.h0, (w - self.w0) // 2 : (w - self.w0) // 2 + self.w0
]
return output_numpy
def parse_images(data_root):
image_pairs = []
subdirs = sorted(os.listdir(data_root))
for subdir in subdirs:
path = os.path.join(data_root, subdir)
if not os.path.isdir(path):
continue
parse_file = os.path.join(path, "pairs_output_new.txt")
if os.path.exists(parse_file):
with open(parse_file, "r") as f:
lines = f.readlines()
for line in lines:
line = line.replace("\n", "")
(
image1_name,
image2_name,
reference_video_name,
reference_video_name1,
reference_name1,
reference_name2,
reference_name3,
reference_name4,
reference_name5,
reference_gt1,
reference_gt2,
reference_gt3,
) = line.split()
image1_name = image1_name.split(".")[0]
image2_name = image2_name.split(".")[0]
reference_video_name = reference_video_name.split(".")[0]
reference_video_name1 = reference_video_name1.split(".")[0]
reference_name1 = reference_name1.split(".")[0]
reference_name2 = reference_name2.split(".")[0]
reference_name3 = reference_name3.split(".")[0]
reference_name4 = reference_name4.split(".")[0]
reference_name5 = reference_name5.split(".")[0]
reference_gt1 = reference_gt1.split(".")[0]
reference_gt2 = reference_gt2.split(".")[0]
reference_gt3 = reference_gt3.split(".")[0]
flow_forward_name = image1_name + "_forward"
flow_backward_name = image1_name + "_backward"
mask_name = image1_name + "_mask"
item = (
image1_name + ".jpg",
image2_name + ".jpg",
reference_video_name + ".jpg",
reference_name1 + ".JPEG",
reference_name2 + ".JPEG",
reference_name3 + ".JPEG",
reference_name4 + ".JPEG",
reference_name5 + ".JPEG",
flow_forward_name + ".flo",
flow_backward_name + ".flo",
mask_name + ".pgm",
reference_gt1 + ".jpg",
reference_gt2 + ".jpg",
reference_gt3 + ".jpg",
path,
)
image_pairs.append(item)
else:
raise (RuntimeError("Error when parsing pair_output_count.txt in subfolders of: " + path + "\n"))
return image_pairs
class VideosDataset(torch.utils.data.Dataset):
def __init__(
self,
data_root,
epoch,
image_size,
image_transform=None,
use_google_reference=False,
real_reference_probability=1,
nonzero_placeholder_probability=0.5,
):
self.data_root = data_root
self.image_transform = image_transform
self.CenterPad = CenterPad(image_size)
self.ToTensor = ToTensor()
self.CenterCrop = CenterCrop(image_size)
assert len(self.data_root) > 0, "find no dataroot"
self.epoch = epoch
self.image_pairs = parse_images(self.data_root)
self.real_len = len(self.image_pairs)
print("##### parsing image pairs in %s: %d pairs #####" % (data_root, self.real_len))
self.image_pairs *= epoch
self.use_google_reference = use_google_reference
self.real_reference_probability = real_reference_probability
self.nonzero_placeholder_probability = nonzero_placeholder_probability
def __getitem__(self, index):
(
image1_name,
image2_name,
reference_video_name,
reference_name1,
reference_name2,
reference_name3,
reference_name4,
reference_name5,
flow_forward_name,
flow_backward_name,
mask_name,
reference_gt1,
reference_gt2,
reference_gt3,
path,
) = self.image_pairs[index]
try:
I1 = Image.open(os.path.join(path, "input_pad", image1_name))
I2 = Image.open(os.path.join(path, "input_pad", image2_name))
I_reference_video = Image.open(
os.path.join(path, "reference_gt", random.choice([reference_gt1, reference_gt2, reference_gt3]))
)
I_reference_video_real = Image.open(
os.path.join(
path,
"reference",
random.choice(
[reference_name1, reference_name2, reference_name3, reference_name4, reference_name5]
),
)
)
flow_forward = read_flow(os.path.join(path, "flow", flow_forward_name)) # numpy
flow_backward = read_flow(os.path.join(path, "flow", flow_backward_name)) # numpy
mask = Image.open(os.path.join(path, "mask", mask_name))
# binary mask
mask = np.array(mask)
mask[mask < 240] = 0
mask[mask >= 240] = 1
# transform
I1 = self.image_transform(I1)
I2 = self.image_transform(I2)
I_reference_video = self.image_transform(self.CenterPad(I_reference_video))
I_reference_video_real = self.image_transform(self.CenterPad(I_reference_video_real))
flow_forward = self.ToTensor(self.CenterCrop(flow_forward))
flow_backward = self.ToTensor(self.CenterCrop(flow_backward))
mask = self.ToTensor(self.CenterCrop(mask))
if np.random.random() < self.real_reference_probability:
I_reference_output = I_reference_video_real
placeholder = torch.zeros_like(I1)
self_ref_flag = torch.zeros_like(I1)
else:
I_reference_output = I_reference_video
placeholder = I2 if np.random.random() < self.nonzero_placeholder_probability else torch.zeros_like(I1)
self_ref_flag = torch.ones_like(I1)
outputs = [
I1,
I2,
I_reference_output,
flow_forward,
flow_backward,
mask,
placeholder,
self_ref_flag,
]
except Exception as e:
print("problem in, ", path)
print(e)
return self.__getitem__(np.random.randint(0, len(self.image_pairs)))
return outputs
def __len__(self):
return len(self.image_pairs)
def batch_lab2rgb_transpose_mc(img_l_mc, img_ab_mc, nrow=8):
if isinstance(img_l_mc, Variable):
img_l_mc = img_l_mc.data.cpu()
if isinstance(img_ab_mc, Variable):
img_ab_mc = img_ab_mc.data.cpu()
if img_l_mc.is_cuda:
img_l_mc = img_l_mc.cpu()
if img_ab_mc.is_cuda:
img_ab_mc = img_ab_mc.cpu()
assert img_l_mc.dim() == 4 and img_ab_mc.dim() == 4, "only for batch input"
l_norm, ab_norm = 1.0, 1.0
l_mean, ab_mean = 50.0, 0
img_l = img_l_mc * l_norm + l_mean
img_ab = img_ab_mc * ab_norm + ab_mean
pred_lab = torch.cat((img_l, img_ab), dim=1)
grid_lab = vutils.make_grid(pred_lab, nrow=nrow).numpy().astype("float64")
return (np.clip(color.lab2rgb(grid_lab.transpose((1, 2, 0))), 0, 1) * 255).astype("uint8")
+290
View File
@@ -0,0 +1,290 @@
import os
import os.path as osp
import struct
import cv2
import numpy as np
import torch
import torch.utils.data as data
import torchvision.transforms as transforms
from PIL import Image
from scipy.ndimage import map_coordinates
from scipy.ndimage.filters import gaussian_filter
from utils.util_distortion import CenterPadCrop_numpy, Distortion_with_flow, Normalize, RGB2Lab, ToTensor
cv2.setNumThreads(0)
def parse_images(dir, with_bad, with_mid):
print("dir is: ", dir)
dir = osp.expanduser(dir)
image_pairs = []
no_mid_cnt, no_bad_cnt = 0, 0
for target in sorted(os.listdir(dir)):
d = osp.join(dir, target)
if not osp.isdir(d):
continue
pair_file = osp.join(d, "pairs.txt")
if osp.exists(pair_file):
with open(pair_file, "r") as f:
lines = f.readlines()
for line in lines:
pair = line.strip().split(" ")
name0, postfix = pair[0].split(".")
name1, postfix = pair[1].split(".")
if float(pair[2]) > 0:
item0 = (dir, target, name0, name1, 2)
item1 = (dir, target, name1, name0, 2)
image_pairs.append(item0)
image_pairs.append(item1)
else:
raise (RuntimeError("Found no pair.txt in subfolders of: " + d + "\n"))
if with_mid:
pair_file = osp.join(d, "pairs_mid.txt")
if osp.exists(pair_file):
with open(pair_file, "r") as f:
for line in f:
pair = line.strip().split(" ")
name0, postfix = pair[0].split(".")
name1, postfix = pair[1].split(".")
item0 = (dir, target, name0, name1, 0)
item1 = (dir, target, name1, name0, 0)
image_pairs.append(item0)
image_pairs.append(item1)
else:
no_mid_cnt += 1
if with_bad:
pair_file = osp.join(d, "pairs_bad.txt")
if osp.exists(pair_file):
with open(pair_file, "r") as f:
for line in f:
pair = line.strip().split(" ")
name0, postfix = pair[0].split(".")
name1, postfix = pair[1].split(".")
item0 = (dir, target, name0, name1, -1)
item1 = (dir, target, name1, name0, -1)
image_pairs.append(item0)
image_pairs.append(item1)
else:
no_bad_cnt += 1
if no_bad_cnt > 0:
print("find no pairs_bad.txt in %d folders for dir: %s" % (no_bad_cnt, dir))
if no_mid_cnt > 0:
print("find no pairs_mid.txt in %d folders for dir: %s" % (no_mid_cnt, dir))
return image_pairs
def pil_loader(path):
with open(path, "rb") as f:
with Image.open(f) as img:
return img.convert("RGB")
def image_loader(path):
return pil_loader(path)
def combo5_loader(path, real_w, real_h):
with open(path, "rb") as f:
d = f.read(4)
im_sz = struct.unpack("i", d)
h = im_sz[0]
d = f.read(4)
im_sz = struct.unpack("i", d)
w = im_sz[0]
d = f.read(4)
im_sz = struct.unpack("i", d)
d = f.read(im_sz[0])
file_bytes = np.asarray(bytearray(d), dtype=np.uint8)
img_data_ndarray = cv2.imdecode(file_bytes, cv2.IMREAD_COLOR)
img_data_ndarray = cv2.cvtColor(img_data_ndarray, cv2.COLOR_BGR2RGB)
warp_ba = Image.fromarray(img_data_ndarray)
img_data_ndarray = img_data_ndarray * 0
warp_aba = Image.fromarray(img_data_ndarray)
errs = []
empty_array = np.zeros([np.array(warp_ba).shape[0], np.array(warp_ba).shape[1]])
for _ in range(5):
err_ba = Image.fromarray(empty_array)
err_ab = Image.fromarray(empty_array)
errs.append([err_ba, err_ab])
return errs, warp_ba, warp_aba
class VideosDataset_ImageNet(data.Dataset):
def __init__(
self,
data_root,
epoch,
image_size,
with_bad=False,
with_mid=False,
transforms_imagenet=None,
distortion_level=3,
brightnessjitter=0,
nonzero_placeholder_probability=0.5,
extra_reference_transform=None,
real_reference_probability=1,
):
image_pairs = []
curr_image_pairs = parse_images(data_root, with_bad, with_mid)
image_pairs += curr_image_pairs
print("##### parsing image_a pairs in %s: %d pairs #####" % (data_root, len(curr_image_pairs)))
if not image_pairs:
raise RuntimeError("Found 0 image_a pairs in all the data_roots")
self.image_pairs = image_pairs
self.transforms_imagenet_raw = transforms_imagenet
self.extra_reference_transform = transforms.Compose(extra_reference_transform)
self.real_reference_probability = real_reference_probability
self.transforms_imagenet = transforms.Compose(transforms_imagenet)
self.epoch = epoch
self.image_size = image_size
self.real_len = len(self.image_pairs)
self.image_pairs *= epoch
self.distortion_level = distortion_level
self.distortion_transform = Distortion_with_flow()
self.brightnessjitter = brightnessjitter
self.flow_transform = transforms.Compose([CenterPadCrop_numpy(self.image_size), ToTensor()])
self.nonzero_placeholder_probability = nonzero_placeholder_probability
self.ToTensor = ToTensor()
self.Normalize = Normalize()
def __getitem__(self, index):
try:
image_id = 0
pair_id = index
combo_path = None
image_a_path = None
image_b_path = None
image_names = ["", ""]
dir_root, cls_dir, image_names[0], image_names[1], is_good = self.image_pairs[pair_id]
sub_dir = osp.join(dir_root, cls_dir)
if is_good >= 1:
image_a_path = osp.join(sub_dir, "input", "%s.JPEG" % image_names[image_id])
image_b_path = osp.join(sub_dir, "input", "%s.JPEG" % image_names[1 - image_id])
elif is_good == 0:
image_a_path = osp.join(sub_dir, "input_mid", "%s.JPEG" % image_names[image_id])
image_b_path = osp.join(sub_dir, "input_mid", "%s.JPEG" % image_names[1 - image_id])
else:
image_a_path = osp.join(sub_dir, "input_bad", "%s.JPEG" % image_names[image_id])
image_b_path = osp.join(sub_dir, "input_bad", "%s.JPEG" % image_names[1 - image_id])
if np.random.random() > 0.5:
image_a_path, image_b_path = image_b_path, image_a_path
I1 = image_loader(image_a_path)
I2 = I1
I_reference_video = I1
I_reference_video_real = image_loader(image_b_path)
## generate the flow
height, width = np.array(I2).shape[0], np.array(I2).shape[1]
alpha = np.random.rand() * self.distortion_level
distortion_range = 50
random_state = np.random.RandomState(None)
shape = self.image_size[0], self.image_size[1]
# dx: flow on the vertical direction; dy: flow on the horizontal direction
forward_dx = (
gaussian_filter((random_state.rand(*shape) * 2 - 1), distortion_range, mode="constant", cval=0)
* alpha
* 1000
)
forward_dy = (
gaussian_filter((random_state.rand(*shape) * 2 - 1), distortion_range, mode="constant", cval=0)
* alpha
* 1000
)
for transform in self.transforms_imagenet_raw:
if type(transform) is RGB2Lab:
I1_raw = I1
I1 = transform(I1)
for transform in self.transforms_imagenet_raw:
if type(transform) is RGB2Lab:
I2 = self.distortion_transform(I2, forward_dx, forward_dy)
I2_raw = I2
I2 = transform(I2)
I2[0:1, :, :] = I2[0:1, :, :] + torch.randn(1) * self.brightnessjitter
I_reference_video = self.extra_reference_transform(I_reference_video)
for transform in self.transforms_imagenet_raw:
I_reference_video = transform(I_reference_video)
I_reference_video_real = self.transforms_imagenet(I_reference_video_real)
flow_forward_raw = np.stack((forward_dy, forward_dx), axis=-1)
flow_backward_raw = np.zeros_like(flow_forward_raw)
flow_forward = self.flow_transform(flow_forward_raw)
flow_backward = self.flow_transform(flow_backward_raw)
# update the mask for the pixels on the border
grid_x, grid_y = np.meshgrid(np.arange(self.image_size[0]), np.arange(self.image_size[1]), indexing="ij")
grid = np.stack((grid_y, grid_x), axis=-1)
grid_warp = grid + flow_forward_raw
location_y = grid_warp[:, :, 0].flatten()
location_x = grid_warp[:, :, 1].flatten()
I2_raw = np.array(I2_raw).astype(float)
I21_r = map_coordinates(I2_raw[:, :, 0], np.stack((location_x, location_y)), cval=-1).reshape(
(self.image_size[0], self.image_size[1])
)
I21_g = map_coordinates(I2_raw[:, :, 1], np.stack((location_x, location_y)), cval=-1).reshape(
(self.image_size[0], self.image_size[1])
)
I21_b = map_coordinates(I2_raw[:, :, 2], np.stack((location_x, location_y)), cval=-1).reshape(
(self.image_size[0], self.image_size[1])
)
I21_raw = np.stack((I21_r, I21_g, I21_b), axis=2)
mask = np.ones((self.image_size[0], self.image_size[1]))
mask[(I21_raw[:, :, 0] == -1) & (I21_raw[:, :, 1] == -1) & (I21_raw[:, :, 2] == -1)] = 0
mask[abs(I21_raw - I1_raw).sum(axis=-1) > 50] = 0
mask = self.ToTensor(mask)
if np.random.random() < self.real_reference_probability:
I_reference_output = I_reference_video_real
placeholder = torch.zeros_like(I1)
self_ref_flag = torch.zeros_like(I1)
else:
I_reference_output = I_reference_video
placeholder = I2 if np.random.random() < self.nonzero_placeholder_probability else torch.zeros_like(I1)
self_ref_flag = torch.ones_like(I1)
outputs = [
I1,
I2,
I_reference_output,
flow_forward,
flow_backward,
mask,
placeholder,
self_ref_flag,
]
except Exception as e:
if combo_path is not None:
print("problem in ", combo_path)
print("problem in, ", image_a_path)
print(e)
return self.__getitem__(np.random.randint(0, len(self.image_pairs)))
return outputs
def __len__(self):
return len(self.image_pairs)
+303
View File
@@ -0,0 +1,303 @@
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
import torchvision
from utils.util import feature_normalize
postpa = torchvision.transforms.Compose(
[
torchvision.transforms.Lambda(lambda x: x.mul_(1.0 / 255)),
torchvision.transforms.Normalize(
mean=[-0.40760392, -0.45795686, -0.48501961], std=[1, 1, 1] # add imagenet mean
),
torchvision.transforms.Lambda(lambda x: x[torch.LongTensor([2, 1, 0])]), # turn to RGB
]
)
postpb = torchvision.transforms.Compose([torchvision.transforms.ToPILImage()])
def post_processing(tensor):
t = postpa(tensor) # denormalize the image since the optimized tensor is the normalized one
t[t > 1] = 1
t[t < 0] = 0
img = postpb(t)
img = np.array(img)
return img
class ContextualLoss(nn.Module):
"""
input is Al, Bl, channel = 1, range ~ [0, 255]
"""
def __init__(self):
super(ContextualLoss, self).__init__()
return None
def forward(self, X_features, Y_features, h=0.1, feature_centering=True):
"""
X_features&Y_features are are feature vectors or feature 2d array
h: bandwidth
return the per-sample loss
"""
batch_size = X_features.shape[0]
feature_depth = X_features.shape[1]
feature_size = X_features.shape[2]
# to normalized feature vectors
if feature_centering:
X_features = X_features - Y_features.view(batch_size, feature_depth, -1).mean(dim=-1).unsqueeze(
dim=-1
).unsqueeze(dim=-1)
Y_features = Y_features - Y_features.view(batch_size, feature_depth, -1).mean(dim=-1).unsqueeze(
dim=-1
).unsqueeze(dim=-1)
X_features = feature_normalize(X_features).view(
batch_size, feature_depth, -1
) # batch_size * feature_depth * feature_size^2
Y_features = feature_normalize(Y_features).view(
batch_size, feature_depth, -1
) # batch_size * feature_depth * feature_size^2
# conine distance = 1 - similarity
X_features_permute = X_features.permute(0, 2, 1) # batch_size * feature_size^2 * feature_depth
d = 1 - torch.matmul(X_features_permute, Y_features) # batch_size * feature_size^2 * feature_size^2
# normalized distance: dij_bar
d_norm = d / (torch.min(d, dim=-1, keepdim=True)[0] + 1e-5) # batch_size * feature_size^2 * feature_size^2
# pairwise affinity
w = torch.exp((1 - d_norm) / h)
A_ij = w / torch.sum(w, dim=-1, keepdim=True)
# contextual loss per sample
CX = torch.mean(torch.max(A_ij, dim=1)[0], dim=-1)
return -torch.log(CX)
class ContextualLoss_forward(nn.Module):
"""
input is Al, Bl, channel = 1, range ~ [0, 255]
"""
def __init__(self):
super(ContextualLoss_forward, self).__init__()
return None
def forward(self, X_features, Y_features, h=0.1, feature_centering=True):
"""
X_features&Y_features are are feature vectors or feature 2d array
h: bandwidth
return the per-sample loss
"""
batch_size = X_features.shape[0]
feature_depth = X_features.shape[1]
feature_size = X_features.shape[2]
# to normalized feature vectors
if feature_centering:
X_features = X_features - Y_features.view(batch_size, feature_depth, -1).mean(dim=-1).unsqueeze(
dim=-1
).unsqueeze(dim=-1)
Y_features = Y_features - Y_features.view(batch_size, feature_depth, -1).mean(dim=-1).unsqueeze(
dim=-1
).unsqueeze(dim=-1)
X_features = feature_normalize(X_features).view(
batch_size, feature_depth, -1
) # batch_size * feature_depth * feature_size^2
Y_features = feature_normalize(Y_features).view(
batch_size, feature_depth, -1
) # batch_size * feature_depth * feature_size^2
# conine distance = 1 - similarity
X_features_permute = X_features.permute(0, 2, 1) # batch_size * feature_size^2 * feature_depth
d = 1 - torch.matmul(X_features_permute, Y_features) # batch_size * feature_size^2 * feature_size^2
# normalized distance: dij_bar
d_norm = d / (torch.min(d, dim=-1, keepdim=True)[0] + 1e-5) # batch_size * feature_size^2 * feature_size^2
# pairwise affinity
w = torch.exp((1 - d_norm) / h)
A_ij = w / torch.sum(w, dim=-1, keepdim=True)
# contextual loss per sample
CX = torch.mean(torch.max(A_ij, dim=-1)[0], dim=1)
return -torch.log(CX)
class ContextualLoss_complex(nn.Module):
"""
input is Al, Bl, channel = 1, range ~ [0, 255]
"""
def __init__(self):
super(ContextualLoss_complex, self).__init__()
return None
def forward(self, X_features, Y_features, h=0.1, patch_size=1, direction="forward"):
"""
X_features&Y_features are are feature vectors or feature 2d array
h: bandwidth
return the per-sample loss
"""
batch_size = X_features.shape[0]
feature_depth = X_features.shape[1]
feature_size = X_features.shape[2]
# to normalized feature vectors
X_features = X_features - Y_features.view(batch_size, feature_depth, -1).mean(dim=-1).unsqueeze(
dim=-1
).unsqueeze(dim=-1)
Y_features = Y_features - Y_features.view(batch_size, feature_depth, -1).mean(dim=-1).unsqueeze(
dim=-1
).unsqueeze(dim=-1)
X_features = feature_normalize(X_features) # batch_size * feature_depth * feature_size^2
Y_features = feature_normalize(Y_features) # batch_size * feature_depth * feature_size^2
# to normalized feature vectors
X_features = F.unfold(
X_features, kernel_size=(patch_size, patch_size), stride=(1, 1), padding=(patch_size // 2, patch_size // 2)
) # batch_size * feature_depth_new * feature_size^2
Y_features = F.unfold(
Y_features, kernel_size=(patch_size, patch_size), stride=(1, 1), padding=(patch_size // 2, patch_size // 2)
) # batch_size * feature_depth_new * feature_size^2
# conine distance = 1 - similarity
X_features_permute = X_features.permute(0, 2, 1) # batch_size * feature_size^2 * feature_depth
d = 1 - torch.matmul(X_features_permute, Y_features) # batch_size * feature_size^2 * feature_size^2
# normalized distance: dij_bar
d_norm = d / (torch.min(d, dim=-1, keepdim=True)[0] + 1e-5) # batch_size * feature_size^2 * feature_size^2
# pairwise affinity
w = torch.exp((1 - d_norm) / h)
A_ij = w / torch.sum(w, dim=-1, keepdim=True)
# contextual loss per sample
if direction == "forward":
CX = torch.mean(torch.max(A_ij, dim=-1)[0], dim=1)
else:
CX = torch.mean(torch.max(A_ij, dim=1)[0], dim=-1)
return -torch.log(CX)
class ChamferDistance_patch_loss(nn.Module):
"""
input is Al, Bl, channel = 1, range ~ [0, 255]
"""
def __init__(self):
super(ChamferDistance_patch_loss, self).__init__()
return None
def forward(self, X_features, Y_features, patch_size=3, image_x=None, image_y=None, h=0.1, Y_features_in=None):
"""
X_features&Y_features are are feature vectors or feature 2d array
h: bandwidth
return the per-sample loss
"""
batch_size = X_features.shape[0]
feature_depth = X_features.shape[1]
feature_size = X_features.shape[2]
# to normalized feature vectors
X_features = F.unfold(
X_features, kernel_size=(patch_size, patch_size), stride=(1, 1), padding=(patch_size // 2, patch_size // 2)
) # batch_size, feature_depth_new * feature_size^2
Y_features = F.unfold(
Y_features, kernel_size=(patch_size, patch_size), stride=(1, 1), padding=(patch_size // 2, patch_size // 2)
) # batch_size, feature_depth_new * feature_size^2
if image_x is not None and image_y is not None:
image_x = torch.nn.functional.interpolate(image_x, size=(feature_size, feature_size), mode="bilinear").view(
batch_size, 3, -1
)
image_y = torch.nn.functional.interpolate(image_y, size=(feature_size, feature_size), mode="bilinear").view(
batch_size, 3, -1
)
X_features_permute = X_features.permute(0, 2, 1) # batch_size * feature_size^2 * feature_depth
similarity_matrix = torch.matmul(X_features_permute, Y_features) # batch_size * feature_size^2 * feature_size^2
NN_index = similarity_matrix.max(dim=-1, keepdim=True)[1].squeeze()
if Y_features_in is not None:
loss = torch.mean((X_features - Y_features_in.detach()) ** 2)
Y_features_in = Y_features_in.detach()
else:
loss = torch.mean((X_features - Y_features[:, :, NN_index].detach()) ** 2)
Y_features_in = Y_features[:, :, NN_index].detach()
# re-arrange image
if image_x is not None and image_y is not None:
image_y_rearrange = image_y[:, :, NN_index]
image_y_rearrange = image_y_rearrange.view(batch_size, 3, feature_size, feature_size)
image_x = image_x.view(batch_size, 3, feature_size, feature_size)
image_y = image_y.view(batch_size, 3, feature_size, feature_size)
return loss
class ChamferDistance_loss(nn.Module):
"""
input is Al, Bl, channel = 1, range ~ [0, 255]
"""
def __init__(self):
super(ChamferDistance_loss, self).__init__()
return None
def forward(self, X_features, Y_features, image_x, image_y, h=0.1, Y_features_in=None):
"""
X_features&Y_features are are feature vectors or feature 2d array
h: bandwidth
return the per-sample loss
"""
batch_size = X_features.shape[0]
feature_depth = X_features.shape[1]
feature_size = X_features.shape[2]
# to normalized feature vectors
X_features = feature_normalize(X_features).view(
batch_size, feature_depth, -1
) # batch_size * feature_depth * feature_size^2
Y_features = feature_normalize(Y_features).view(
batch_size, feature_depth, -1
) # batch_size * feature_depth * feature_size^2
image_x = torch.nn.functional.interpolate(image_x, size=(feature_size, feature_size), mode="bilinear").view(
batch_size, 3, -1
)
image_y = torch.nn.functional.interpolate(image_y, size=(feature_size, feature_size), mode="bilinear").view(
batch_size, 3, -1
)
X_features_permute = X_features.permute(0, 2, 1) # batch_size * feature_size^2 * feature_depth
similarity_matrix = torch.matmul(X_features_permute, Y_features) # batch_size * feature_size^2 * feature_size^2
NN_index = similarity_matrix.max(dim=-1, keepdim=True)[1].squeeze()
if Y_features_in is not None:
loss = torch.mean((X_features - Y_features_in.detach()) ** 2)
Y_features_in = Y_features_in.detach()
else:
loss = torch.mean((X_features - Y_features[:, :, NN_index].detach()) ** 2)
Y_features_in = Y_features[:, :, NN_index].detach()
# re-arrange image
image_y_rearrange = image_y[:, :, NN_index]
image_y_rearrange = image_y_rearrange.view(batch_size, 3, feature_size, feature_size)
image_x = image_x.view(batch_size, 3, feature_size, feature_size)
image_y = image_y.view(batch_size, 3, feature_size, feature_size)
return loss, Y_features_in, X_features
if __name__ == "__main__":
contextual_loss = ContextualLoss()
batch_size = 32
feature_depth = 8
feature_size = 16
X_features = torch.zeros(batch_size, feature_depth, feature_size, feature_size)
Y_features = torch.zeros(batch_size, feature_depth, feature_size, feature_size)
cx_loss = contextual_loss(X_features, Y_features, 1)
print(cx_loss)
+207 -207
View File
@@ -101,61 +101,13 @@ class Self_Attention(nn.Module):
return out
class Discriminator_WITHOUT_FC_x64_video(nn.Module):
class Discriminator_x64(nn.Module):
"""
Discriminative Network
"""
def __init__(self, in_size=6, ndf=64):
super(Discriminator_WITHOUT_FC_x64_video, self).__init__()
self.in_size = in_size
self.ndf = ndf
self.layer1 = nn.Sequential(
# input size is in_size x 64 x 64
SpectralNorm(nn.Conv2d(self.in_size, self.ndf, 4, 2, 1)),
nn.LeakyReLU(0.2, inplace=True),
)
self.layer2 = nn.Sequential(
# state size: ndf x 32 x 32
SpectralNorm(nn.Conv2d(self.ndf, self.ndf * 2, 4, 2, 1)),
nn.InstanceNorm2d(self.ndf * 2),
nn.LeakyReLU(0.2, inplace=True),
)
self.layer3 = nn.Sequential(
# state size: (ndf * 2) x 16 x 16
SpectralNorm(nn.Conv2d(self.ndf * 2, self.ndf * 4, 4, 2, 1)),
nn.InstanceNorm2d(self.ndf * 4),
nn.LeakyReLU(0.2, inplace=True),
)
self.layer4 = nn.Sequential(
# state size: (ndf * 4) x 8 x 8
# Self_Attention(self.ndf * 4, 'relu'),
SpectralNorm(nn.Conv2d(self.ndf * 4, self.ndf * 8, 4, 2, 1)),
nn.InstanceNorm2d(self.ndf * 8),
nn.LeakyReLU(0.2, inplace=True),
)
self.last = SpectralNorm(nn.Conv2d(self.ndf * 8, 1, [3, 6], 1, 0))
def forward(self, input):
feature1 = self.layer1(input)
feature2 = self.layer2(feature1)
feature3 = self.layer3(feature2)
feature4 = self.layer4(feature3)
output = self.last(feature4)
output = F.avg_pool2d(output, output.size()[2:]).view(output.size()[0], -1)
return output, feature4
class Discriminator_WITHOUT_FC_x64_video_BIG(nn.Module):
"""
Discriminative Network
"""
def __init__(self, in_size=6, ndf=64):
super(Discriminator_WITHOUT_FC_x64_video_BIG, self).__init__()
super(Discriminator_x64, self).__init__()
self.in_size = in_size
self.ndf = ndf
@@ -205,189 +157,237 @@ class Discriminator_WITHOUT_FC_x64_video_BIG(nn.Module):
return output, feature4
class Discriminator_WITHOUT_FC_x64(nn.Module):
"""
Discriminative Network
"""
# class Discriminator_WITHOUT_FC_x64_video(nn.Module):
# """
# Discriminative Network
# """
def __init__(self, in_size=3, ndf=64):
super(Discriminator_WITHOUT_FC_x64, self).__init__()
self.in_size = in_size
self.ndf = ndf
# def __init__(self, in_size=6, ndf=64):
# super(Discriminator_WITHOUT_FC_x64_video, self).__init__()
# self.in_size = in_size
# self.ndf = ndf
self.main = nn.Sequential(
# input size is in_size x 64 x 64
SpectralNorm(nn.Conv2d(self.in_size, self.ndf, 4, 2, 1)),
nn.LeakyReLU(0.2, inplace=True),
# state size: ndf x 32 x 32
Self_Attention(self.ndf),
SpectralNorm(nn.Conv2d(self.ndf, self.ndf * 2, 4, 2, 1)),
nn.InstanceNorm2d(self.ndf * 2),
nn.LeakyReLU(0.2, inplace=True),
# state size: (ndf * 2) x 16 x 16
SpectralNorm(nn.Conv2d(self.ndf * 2, self.ndf * 4, 4, 2, 1)),
nn.InstanceNorm2d(self.ndf * 4),
nn.LeakyReLU(0.2, inplace=True),
# state size: (ndf * 4) x 8 x 8
SpectralNorm(nn.Conv2d(self.ndf * 4, self.ndf * 8, 4, 2, 1)),
nn.InstanceNorm2d(self.ndf * 8),
nn.LeakyReLU(0.2, inplace=True),
# sate size: (ndf * 8) x 4 x 4
)
# self.layer1 = nn.Sequential(
# # input size is in_size x 64 x 64
# SpectralNorm(nn.Conv2d(self.in_size, self.ndf, 4, 2, 1)),
# nn.LeakyReLU(0.2, inplace=True),
# )
# self.layer2 = nn.Sequential(
# # state size: ndf x 32 x 32
# SpectralNorm(nn.Conv2d(self.ndf, self.ndf * 2, 4, 2, 1)),
# nn.InstanceNorm2d(self.ndf * 2),
# nn.LeakyReLU(0.2, inplace=True),
# )
# self.layer3 = nn.Sequential(
# # state size: (ndf * 2) x 16 x 16
# SpectralNorm(nn.Conv2d(self.ndf * 2, self.ndf * 4, 4, 2, 1)),
# nn.InstanceNorm2d(self.ndf * 4),
# nn.LeakyReLU(0.2, inplace=True),
# )
# self.layer4 = nn.Sequential(
# # state size: (ndf * 4) x 8 x 8
# # Self_Attention(self.ndf * 4, 'relu'),
# SpectralNorm(nn.Conv2d(self.ndf * 4, self.ndf * 8, 4, 2, 1)),
# nn.InstanceNorm2d(self.ndf * 8),
# nn.LeakyReLU(0.2, inplace=True),
# )
self.last = SpectralNorm(nn.Conv2d(self.ndf * 8, 1, 4, 1, 0))
# self.last = SpectralNorm(nn.Conv2d(self.ndf * 8, 1, [3, 6], 1, 0))
def forward(self, input):
# def forward(self, input):
# feature1 = self.layer1(input)
# feature2 = self.layer2(feature1)
# feature3 = self.layer3(feature2)
# feature4 = self.layer4(feature3)
# output = self.last(feature4)
# output = F.avg_pool2d(output, output.size()[2:]).view(output.size()[0], -1)
feature = self.main(input)
output = self.last(feature)
output = F.avg_pool2d(output, output.size()[2:]).view(output.size()[0], -1)
return output, feature
# return output, feature4
class Discriminator_WITHOUT_FC_x64_BIG(nn.Module):
"""
Discriminative Network
"""
# class Discriminator_WITHOUT_FC_x64(nn.Module):
# """
# Discriminative Network
# """
def __init__(self, in_size=3, ndf=64):
super(Discriminator_WITHOUT_FC_x64_BIG, self).__init__()
self.in_size = in_size
self.ndf = ndf
# def __init__(self, in_size=3, ndf=64):
# super(Discriminator_WITHOUT_FC_x64, self).__init__()
# self.in_size = in_size
# self.ndf = ndf
self.main = nn.Sequential(
# 256 X 256
SpectralNorm(nn.Conv2d(self.in_size, self.ndf, 4, 2, 1)),
nn.LeakyReLU(0.2, inplace=True),
# 128 X 128
SpectralNorm(nn.Conv2d(self.ndf, self.ndf, 4, 2, 1)),
nn.InstanceNorm2d(self.ndf),
nn.LeakyReLU(0.2, inplace=True),
# 64 X 64
Self_Attention(self.ndf),
SpectralNorm(nn.Conv2d(self.ndf, self.ndf * 2, 4, 2, 1)),
nn.InstanceNorm2d(self.ndf * 2),
nn.LeakyReLU(0.2, inplace=True),
# 32 X 32
SpectralNorm(nn.Conv2d(self.ndf * 2, self.ndf * 4, 4, 2, 1)),
nn.InstanceNorm2d(self.ndf * 4),
nn.LeakyReLU(0.2, inplace=True),
# 16 X 16
SpectralNorm(nn.Conv2d(self.ndf * 4, self.ndf * 8, 4, 2, 1)),
nn.InstanceNorm2d(self.ndf * 8),
nn.LeakyReLU(0.2, inplace=True),
# 8 X 8
SpectralNorm(nn.Conv2d(self.ndf * 8, self.ndf * 16, 4, 2, 1)),
nn.InstanceNorm2d(self.ndf * 16),
nn.LeakyReLU(0.2, inplace=True),
)
# 4 X 4
self.last = SpectralNorm(nn.Conv2d(self.ndf * 16, 1, 4, 1, 0))
# self.main = nn.Sequential(
# # input size is in_size x 64 x 64
# SpectralNorm(nn.Conv2d(self.in_size, self.ndf, 4, 2, 1)),
# nn.LeakyReLU(0.2, inplace=True),
# # state size: ndf x 32 x 32
# Self_Attention(self.ndf),
# SpectralNorm(nn.Conv2d(self.ndf, self.ndf * 2, 4, 2, 1)),
# nn.InstanceNorm2d(self.ndf * 2),
# nn.LeakyReLU(0.2, inplace=True),
# # state size: (ndf * 2) x 16 x 16
# SpectralNorm(nn.Conv2d(self.ndf * 2, self.ndf * 4, 4, 2, 1)),
# nn.InstanceNorm2d(self.ndf * 4),
# nn.LeakyReLU(0.2, inplace=True),
# # state size: (ndf * 4) x 8 x 8
# SpectralNorm(nn.Conv2d(self.ndf * 4, self.ndf * 8, 4, 2, 1)),
# nn.InstanceNorm2d(self.ndf * 8),
# nn.LeakyReLU(0.2, inplace=True),
# # sate size: (ndf * 8) x 4 x 4
# )
def forward(self, input):
# self.last = SpectralNorm(nn.Conv2d(self.ndf * 8, 1, 4, 1, 0))
feature = self.main(input)
output = self.last(feature)
output = F.avg_pool2d(output, output.size()[2:]).view(output.size()[0], -1)
# def forward(self, input):
return output, feature
# feature = self.main(input)
# output = self.last(feature)
# output = F.avg_pool2d(output, output.size()[2:]).view(output.size()[0], -1)
# return output, feature
class Discriminator_WITHOUT_FC_x128(nn.Module):
"""
Discriminative Network
"""
# class Discriminator_WITHOUT_FC_x64_BIG(nn.Module):
# """
# Discriminative Network
# """
def __init__(self, in_size=3, ndf=64):
super(Discriminator_WITHOUT_FC_x128, self).__init__()
self.in_size = in_size
self.ndf = ndf
# def __init__(self, in_size=3, ndf=64):
# super(Discriminator_WITHOUT_FC_x64_BIG, self).__init__()
# self.in_size = in_size
# self.ndf = ndf
self.main = nn.Sequential(
# input size is in_size x 128 x 128
SpectralNorm(nn.Conv2d(self.in_size, self.ndf, 4, 2, 1)),
nn.LeakyReLU(0.2, inplace=True),
# state size: ndf x 64 x 64
SpectralNorm(nn.Conv2d(self.ndf, self.ndf, 4, 2, 1)),
nn.InstanceNorm2d(self.ndf),
nn.LeakyReLU(0.2, inplace=True),
# state size: ndf x 32 x 32
SpectralNorm(nn.Conv2d(self.ndf, self.ndf * 2, 4, 2, 1)),
nn.InstanceNorm2d(self.ndf * 2),
nn.LeakyReLU(0.2, inplace=True),
# state size: (ndf * 24) x 16 x 16
SpectralNorm(nn.Conv2d(self.ndf * 2, self.ndf * 4, 4, 2, 1)),
nn.InstanceNorm2d(self.ndf * 4),
nn.LeakyReLU(0.2, inplace=True),
# sate size: (ndf * 4) x 8 x 8
SpectralNorm(nn.Conv2d(self.ndf * 4, self.ndf * 8, 4, 2, 1)),
nn.InstanceNorm2d(self.ndf * 8),
nn.LeakyReLU(0.2, inplace=True),
# sate size: (ndf * 8) x 4 x 4
)
# self.main = nn.Sequential(
# # 256 X 256
# SpectralNorm(nn.Conv2d(self.in_size, self.ndf, 4, 2, 1)),
# nn.LeakyReLU(0.2, inplace=True),
# # 128 X 128
# SpectralNorm(nn.Conv2d(self.ndf, self.ndf, 4, 2, 1)),
# nn.InstanceNorm2d(self.ndf),
# nn.LeakyReLU(0.2, inplace=True),
# # 64 X 64
# Self_Attention(self.ndf),
# SpectralNorm(nn.Conv2d(self.ndf, self.ndf * 2, 4, 2, 1)),
# nn.InstanceNorm2d(self.ndf * 2),
# nn.LeakyReLU(0.2, inplace=True),
# # 32 X 32
# SpectralNorm(nn.Conv2d(self.ndf * 2, self.ndf * 4, 4, 2, 1)),
# nn.InstanceNorm2d(self.ndf * 4),
# nn.LeakyReLU(0.2, inplace=True),
# # 16 X 16
# SpectralNorm(nn.Conv2d(self.ndf * 4, self.ndf * 8, 4, 2, 1)),
# nn.InstanceNorm2d(self.ndf * 8),
# nn.LeakyReLU(0.2, inplace=True),
# # 8 X 8
# SpectralNorm(nn.Conv2d(self.ndf * 8, self.ndf * 16, 4, 2, 1)),
# nn.InstanceNorm2d(self.ndf * 16),
# nn.LeakyReLU(0.2, inplace=True),
# )
# # 4 X 4
# self.last = SpectralNorm(nn.Conv2d(self.ndf * 16, 1, 4, 1, 0))
self.last = SpectralNorm(nn.Conv2d(self.ndf * 8, 1, 4, 1, 0))
# def forward(self, input):
def forward(self, input):
# feature = self.main(input)
# output = self.last(feature)
# output = F.avg_pool2d(output, output.size()[2:]).view(output.size()[0], -1)
feature = self.main(input)
output = self.last(feature)
return output, feature
# return output, feature
class Discriminator_WITHOUT_FC_x256(nn.Module):
"""
Discriminative Network
"""
# class Discriminator_WITHOUT_FC_x128(nn.Module):
# """
# Discriminative Network
# """
def __init__(self, in_size=3, ndf=64):
super(Discriminator_WITHOUT_FC_x256, self).__init__()
self.in_size = in_size
self.ndf = ndf
# def __init__(self, in_size=3, ndf=64):
# super(Discriminator_WITHOUT_FC_x128, self).__init__()
# self.in_size = in_size
# self.ndf = ndf
self.main = nn.Sequential(
# input size is in_size x 256 x 256
SpectralNorm(nn.Conv2d(self.in_size, self.ndf, 4, 2, 1)),
nn.LeakyReLU(0.2, inplace=True),
# state size: ndf x 128 x 128
SpectralNorm(nn.Conv2d(self.ndf, self.ndf, 4, 2, 1)),
nn.InstanceNorm2d(self.ndf),
nn.LeakyReLU(0.2, inplace=True),
# state size: ndf x 64 x 64
SpectralNorm(nn.Conv2d(self.ndf, self.ndf, 4, 2, 1)),
nn.InstanceNorm2d(self.ndf),
nn.LeakyReLU(0.2, inplace=True),
# state size: (ndf * 1) x 32 x 32
SpectralNorm(nn.Conv2d(self.ndf, self.ndf * 2, 4, 2, 1)),
nn.InstanceNorm2d(self.ndf * 2),
nn.LeakyReLU(0.2, inplace=True),
# state size: (ndf * 2) x 16 x 16
SpectralNorm(nn.Conv2d(self.ndf * 2, self.ndf * 4, 4, 2, 1)),
nn.InstanceNorm2d(self.ndf * 4),
nn.LeakyReLU(0.2, inplace=True),
# sate size: (ndf * 4) x 8 x 8
SpectralNorm(nn.Conv2d(self.ndf * 4, self.ndf * 8, 4, 2, 1)),
nn.InstanceNorm2d(self.ndf * 8),
nn.LeakyReLU(0.2, inplace=True),
# sate size: (ndf * 8) x 4 x 4
)
# self.main = nn.Sequential(
# # input size is in_size x 128 x 128
# SpectralNorm(nn.Conv2d(self.in_size, self.ndf, 4, 2, 1)),
# nn.LeakyReLU(0.2, inplace=True),
# # state size: ndf x 64 x 64
# SpectralNorm(nn.Conv2d(self.ndf, self.ndf, 4, 2, 1)),
# nn.InstanceNorm2d(self.ndf),
# nn.LeakyReLU(0.2, inplace=True),
# # state size: ndf x 32 x 32
# SpectralNorm(nn.Conv2d(self.ndf, self.ndf * 2, 4, 2, 1)),
# nn.InstanceNorm2d(self.ndf * 2),
# nn.LeakyReLU(0.2, inplace=True),
# # state size: (ndf * 24) x 16 x 16
# SpectralNorm(nn.Conv2d(self.ndf * 2, self.ndf * 4, 4, 2, 1)),
# nn.InstanceNorm2d(self.ndf * 4),
# nn.LeakyReLU(0.2, inplace=True),
# # sate size: (ndf * 4) x 8 x 8
# SpectralNorm(nn.Conv2d(self.ndf * 4, self.ndf * 8, 4, 2, 1)),
# nn.InstanceNorm2d(self.ndf * 8),
# nn.LeakyReLU(0.2, inplace=True),
# # sate size: (ndf * 8) x 4 x 4
# )
self.last = SpectralNorm(nn.Conv2d(self.ndf * 8, 1, 4, 1, 0))
# self.last = SpectralNorm(nn.Conv2d(self.ndf * 8, 1, 4, 1, 0))
def forward(self, input):
# def forward(self, input):
feature = self.main(input)
output = self.last(feature)
# feature = self.main(input)
# output = self.last(feature)
return output, feature
# return output, feature
if __name__ == "__main__":
discriminator1 = Discriminator_WITHOUT_FC_x64()
discriminator2 = Discriminator_WITHOUT_FC_x128()
discriminator3 = Discriminator_WITHOUT_FC_x256()
print(discriminator1)
print(discriminator2)
print(discriminator3)
# class Discriminator_WITHOUT_FC_x256(nn.Module):
# """
# Discriminative Network
# """
# def __init__(self, in_size=3, ndf=64):
# super(Discriminator_WITHOUT_FC_x256, self).__init__()
# self.in_size = in_size
# self.ndf = ndf
# self.main = nn.Sequential(
# # input size is in_size x 256 x 256
# SpectralNorm(nn.Conv2d(self.in_size, self.ndf, 4, 2, 1)),
# nn.LeakyReLU(0.2, inplace=True),
# # state size: ndf x 128 x 128
# SpectralNorm(nn.Conv2d(self.ndf, self.ndf, 4, 2, 1)),
# nn.InstanceNorm2d(self.ndf),
# nn.LeakyReLU(0.2, inplace=True),
# # state size: ndf x 64 x 64
# SpectralNorm(nn.Conv2d(self.ndf, self.ndf, 4, 2, 1)),
# nn.InstanceNorm2d(self.ndf),
# nn.LeakyReLU(0.2, inplace=True),
# # state size: (ndf * 1) x 32 x 32
# SpectralNorm(nn.Conv2d(self.ndf, self.ndf * 2, 4, 2, 1)),
# nn.InstanceNorm2d(self.ndf * 2),
# nn.LeakyReLU(0.2, inplace=True),
# # state size: (ndf * 2) x 16 x 16
# SpectralNorm(nn.Conv2d(self.ndf * 2, self.ndf * 4, 4, 2, 1)),
# nn.InstanceNorm2d(self.ndf * 4),
# nn.LeakyReLU(0.2, inplace=True),
# # sate size: (ndf * 4) x 8 x 8
# SpectralNorm(nn.Conv2d(self.ndf * 4, self.ndf * 8, 4, 2, 1)),
# nn.InstanceNorm2d(self.ndf * 8),
# nn.LeakyReLU(0.2, inplace=True),
# # sate size: (ndf * 8) x 4 x 4
# )
# self.last = SpectralNorm(nn.Conv2d(self.ndf * 8, 1, 4, 1, 0))
# def forward(self, input):
# feature = self.main(input)
# output = self.last(feature)
# return output, feature
# if __name__ == "__main__":
# discriminator1 = Discriminator_WITHOUT_FC_x64()
# discriminator2 = Discriminator_WITHOUT_FC_x128()
# discriminator3 = Discriminator_WITHOUT_FC_x256()
# print(discriminator1)
# print(discriminator2)
# print(discriminator3)
+2 -2
View File
@@ -189,13 +189,13 @@ class Self_Attn(nn.Module):
return out
class VGG19_feature_color_torchversion(nn.Module):
class VGG19_pytorch(nn.Module):
"""
NOTE: no need to pre-process the input; input tensor should range in [0,1]
"""
def __init__(self, pool="max"):
super(VGG19_feature_color_torchversion, self).__init__()
super(VGG19_pytorch, self).__init__()
self.conv1_1 = nn.Conv2d(3, 64, kernel_size=3, padding=1)
self.conv1_2 = nn.Conv2d(64, 64, kernel_size=3, padding=1)
self.conv2_1 = nn.Conv2d(64, 128, kernel_size=3, padding=1)
+37
View File
@@ -0,0 +1,37 @@
train.py 2020-12-21 15:03:17
------------ Options -------------
batch_size: 16
beta1: 0.5
checkpoint_dir: checkpoints/default
contextual_loss_direction: forward
data_root: /home/zhanbo/remote/video/video_pair3/
data_root_imagenet: /home/zhanbo/remote/imagenet_ref_pair/
domain_invariant: False
epoch: 40
gpu_ids: 0,1,2,3
ic: 7
image_size: [216, 384]
load_pretrained_model: True
lr: 1e-05
lr_gamma: 0.1
lr_step: 100
luminance_noise: 2.0
nonzero_placeholder_probability: 0.0
permute_data: True
print_step: 2
real_reference_probability: 0.7
resume: False
resume_epoch: 0
tb_log_step: 50
weight_consistent: 0.02
weight_contextual: 0.2
weight_gan: 0.2
weight_nonlocal_consistent: 0.0
weight_nonlocal_smoothness: 0.0
weight_perceptual: 0.001
weight_smoothness: 5.0
weigth_l1: 2.0
with_bad: True
with_mid: True
workers: 8
-------------- End ----------------
+2 -1
View File
@@ -14,4 +14,5 @@ prefetch_generator
PyYAML
tensorboard
future
numba
numba
pypng
Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

+5
View File
@@ -0,0 +1,5 @@
"""A module for visualization with tensorboard
"""
from .writer import FileWriter, SummaryWriter
from .record_writer import RecordWriter
+123
View File
@@ -0,0 +1,123 @@
import array
CRC_TABLE = (
0x00000000, 0xf26b8303, 0xe13b70f7, 0x1350f3f4,
0xc79a971f, 0x35f1141c, 0x26a1e7e8, 0xd4ca64eb,
0x8ad958cf, 0x78b2dbcc, 0x6be22838, 0x9989ab3b,
0x4d43cfd0, 0xbf284cd3, 0xac78bf27, 0x5e133c24,
0x105ec76f, 0xe235446c, 0xf165b798, 0x030e349b,
0xd7c45070, 0x25afd373, 0x36ff2087, 0xc494a384,
0x9a879fa0, 0x68ec1ca3, 0x7bbcef57, 0x89d76c54,
0x5d1d08bf, 0xaf768bbc, 0xbc267848, 0x4e4dfb4b,
0x20bd8ede, 0xd2d60ddd, 0xc186fe29, 0x33ed7d2a,
0xe72719c1, 0x154c9ac2, 0x061c6936, 0xf477ea35,
0xaa64d611, 0x580f5512, 0x4b5fa6e6, 0xb93425e5,
0x6dfe410e, 0x9f95c20d, 0x8cc531f9, 0x7eaeb2fa,
0x30e349b1, 0xc288cab2, 0xd1d83946, 0x23b3ba45,
0xf779deae, 0x05125dad, 0x1642ae59, 0xe4292d5a,
0xba3a117e, 0x4851927d, 0x5b016189, 0xa96ae28a,
0x7da08661, 0x8fcb0562, 0x9c9bf696, 0x6ef07595,
0x417b1dbc, 0xb3109ebf, 0xa0406d4b, 0x522bee48,
0x86e18aa3, 0x748a09a0, 0x67dafa54, 0x95b17957,
0xcba24573, 0x39c9c670, 0x2a993584, 0xd8f2b687,
0x0c38d26c, 0xfe53516f, 0xed03a29b, 0x1f682198,
0x5125dad3, 0xa34e59d0, 0xb01eaa24, 0x42752927,
0x96bf4dcc, 0x64d4cecf, 0x77843d3b, 0x85efbe38,
0xdbfc821c, 0x2997011f, 0x3ac7f2eb, 0xc8ac71e8,
0x1c661503, 0xee0d9600, 0xfd5d65f4, 0x0f36e6f7,
0x61c69362, 0x93ad1061, 0x80fde395, 0x72966096,
0xa65c047d, 0x5437877e, 0x4767748a, 0xb50cf789,
0xeb1fcbad, 0x197448ae, 0x0a24bb5a, 0xf84f3859,
0x2c855cb2, 0xdeeedfb1, 0xcdbe2c45, 0x3fd5af46,
0x7198540d, 0x83f3d70e, 0x90a324fa, 0x62c8a7f9,
0xb602c312, 0x44694011, 0x5739b3e5, 0xa55230e6,
0xfb410cc2, 0x092a8fc1, 0x1a7a7c35, 0xe811ff36,
0x3cdb9bdd, 0xceb018de, 0xdde0eb2a, 0x2f8b6829,
0x82f63b78, 0x709db87b, 0x63cd4b8f, 0x91a6c88c,
0x456cac67, 0xb7072f64, 0xa457dc90, 0x563c5f93,
0x082f63b7, 0xfa44e0b4, 0xe9141340, 0x1b7f9043,
0xcfb5f4a8, 0x3dde77ab, 0x2e8e845f, 0xdce5075c,
0x92a8fc17, 0x60c37f14, 0x73938ce0, 0x81f80fe3,
0x55326b08, 0xa759e80b, 0xb4091bff, 0x466298fc,
0x1871a4d8, 0xea1a27db, 0xf94ad42f, 0x0b21572c,
0xdfeb33c7, 0x2d80b0c4, 0x3ed04330, 0xccbbc033,
0xa24bb5a6, 0x502036a5, 0x4370c551, 0xb11b4652,
0x65d122b9, 0x97baa1ba, 0x84ea524e, 0x7681d14d,
0x2892ed69, 0xdaf96e6a, 0xc9a99d9e, 0x3bc21e9d,
0xef087a76, 0x1d63f975, 0x0e330a81, 0xfc588982,
0xb21572c9, 0x407ef1ca, 0x532e023e, 0xa145813d,
0x758fe5d6, 0x87e466d5, 0x94b49521, 0x66df1622,
0x38cc2a06, 0xcaa7a905, 0xd9f75af1, 0x2b9cd9f2,
0xff56bd19, 0x0d3d3e1a, 0x1e6dcdee, 0xec064eed,
0xc38d26c4, 0x31e6a5c7, 0x22b65633, 0xd0ddd530,
0x0417b1db, 0xf67c32d8, 0xe52cc12c, 0x1747422f,
0x49547e0b, 0xbb3ffd08, 0xa86f0efc, 0x5a048dff,
0x8ecee914, 0x7ca56a17, 0x6ff599e3, 0x9d9e1ae0,
0xd3d3e1ab, 0x21b862a8, 0x32e8915c, 0xc083125f,
0x144976b4, 0xe622f5b7, 0xf5720643, 0x07198540,
0x590ab964, 0xab613a67, 0xb831c993, 0x4a5a4a90,
0x9e902e7b, 0x6cfbad78, 0x7fab5e8c, 0x8dc0dd8f,
0xe330a81a, 0x115b2b19, 0x020bd8ed, 0xf0605bee,
0x24aa3f05, 0xd6c1bc06, 0xc5914ff2, 0x37faccf1,
0x69e9f0d5, 0x9b8273d6, 0x88d28022, 0x7ab90321,
0xae7367ca, 0x5c18e4c9, 0x4f48173d, 0xbd23943e,
0xf36e6f75, 0x0105ec76, 0x12551f82, 0xe03e9c81,
0x34f4f86a, 0xc69f7b69, 0xd5cf889d, 0x27a40b9e,
0x79b737ba, 0x8bdcb4b9, 0x988c474d, 0x6ae7c44e,
0xbe2da0a5, 0x4c4623a6, 0x5f16d052, 0xad7d5351,
)
CRC_INIT = 0
_MASK = 0xFFFFFFFF
def crc_update(crc, data):
"""Update CRC-32C checksum with data.
Args:
crc: 32-bit checksum to update as long.
data: byte array, string or iterable over bytes.
Returns:
32-bit updated CRC-32C as long.
"""
if type(data) != array.array or data.itemsize != 1:
buf = array.array("B", data)
else:
buf = data
crc ^= _MASK
for b in buf:
table_index = (crc ^ b) & 0xff
crc = (CRC_TABLE[table_index] ^ (crc >> 8)) & _MASK
return crc ^ _MASK
def crc_finalize(crc):
"""Finalize CRC-32C checksum.
This function should be called as last step of crc calculation.
Args:
crc: 32-bit checksum as long.
Returns:
finalized 32-bit checksum as long
"""
return crc & _MASK
def crc32c(data):
"""Compute CRC-32C checksum of the data.
Args:
data: byte array, string or iterable over bytes.
Returns:
32-bit CRC-32C checksum of data as long.
"""
return crc_finalize(crc_update(CRC_INIT, data))
+49
View File
@@ -0,0 +1,49 @@
import os
def make_tsv(metadata, save_path):
metadata = [str(x) for x in metadata]
with open(os.path.join(save_path, 'metadata.tsv'), 'w') as f:
for x in metadata:
f.write(x + '\n')
# https://github.com/tensorflow/tensorboard/issues/44 image label will be squared
def make_sprite(label_img, save_path):
import math
import torch
import torchvision
from .x2num import makenp
# this ensures the sprite image has correct dimension as described in
# https://www.tensorflow.org/get_started/embedding_viz
nrow = int(math.ceil((label_img.size(0)) ** 0.5))
label_img = torch.from_numpy(makenp(label_img)) # for other framework
# augment images so that #images equals nrow*nrow
label_img = torch.cat((label_img, torch.randn(nrow ** 2 - label_img.size(0), *label_img.size()[1:]) * 255), 0)
torchvision.utils.save_image(label_img, os.path.join(save_path, 'sprite.png'), nrow=nrow, padding=0)
def append_pbtxt(metadata, label_img, save_path, global_step, tag):
with open(os.path.join(save_path, 'projector_config.pbtxt'), 'a') as f:
# step = os.path.split(save_path)[-1]
f.write('embeddings {\n')
f.write('tensor_name: "{}:{}"\n'.format(tag, global_step))
f.write('tensor_path: "{}"\n'.format(os.path.join(global_step, 'tensors.tsv')))
if metadata is not None:
f.write('metadata_path: "{}"\n'.format(os.path.join(global_step, 'metadata.tsv')))
if label_img is not None:
f.write('sprite {\n')
f.write('image_path: "{}"\n'.format(os.path.join(global_step, 'sprite.png')))
f.write('single_image_dim: {}\n'.format(label_img.size(3)))
f.write('single_image_dim: {}\n'.format(label_img.size(2)))
f.write('}\n')
f.write('}\n')
def make_mat(matlist, save_path):
with open(os.path.join(save_path, 'tensors.tsv'), 'w') as f:
for x in matlist:
x = [str(i) for i in x]
f.write('\t'.join(x) + '\n')
+196
View File
@@ -0,0 +1,196 @@
# Copyright 2015 The TensorFlow Authors. All Rights Reserved.
#
# 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.
# ==============================================================================
"""Writes events to disk in a logdir."""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import logging
import os.path
import socket
import threading
import time
import six
from .src import event_pb2
from .record_writer import RecordWriter
def directory_check(path):
'''Initialize the directory for log files.'''
# If the direcotry does not exist, create it!
if not os.path.exists(path):
os.makedirs(path)
class EventsWriter(object):
'''Writes `Event` protocol buffers to an event file.'''
def __init__(self, file_prefix):
'''
Events files have a name of the form
'/some/file/path/events.out.tfevents.[timestamp].[hostname]'
'''
self._file_prefix = file_prefix + ".out.tfevents." + str(time.time())[:10] + "." + socket.gethostname()
# Open(Create) the log file with the particular form of name.
logging.basicConfig(filename=self._file_prefix)
self._num_outstanding_events = 0
self._py_recordio_writer = RecordWriter(self._file_prefix)
# Initialize an event instance.
self._event = event_pb2.Event()
self._event.wall_time = time.time()
self.write_event(self._event)
def write_event(self, event):
'''Append "event" to the file.'''
# Check if event is of type event_pb2.Event proto.
if not isinstance(event, event_pb2.Event):
raise TypeError("Expected an event_pb2.Event proto, "
" but got %s" % type(event))
return self._write_serialized_event(event.SerializeToString())
def _write_serialized_event(self, event_str):
self._num_outstanding_events += 1
self._py_recordio_writer.write(event_str)
def flush(self):
'''Flushes the event file to disk.'''
self._num_outstanding_events = 0
return True
def close(self):
'''Call self.flush().'''
return_value = self.flush()
return return_value
class EventFileWriter(object):
"""Writes `Event` protocol buffers to an event file.
The `EventFileWriter` class creates an event file in the specified directory,
and asynchronously writes Event protocol buffers to the file. The Event file
is encoded using the tfrecord format, which is similar to RecordIO.
@@__init__
@@add_event
@@flush
@@close
"""
def __init__(self, logdir, max_queue=10, flush_secs=120):
"""Creates a `EventFileWriter` and an event file to write to.
On construction the summary writer creates a new event file in `logdir`.
This event file will contain `Event` protocol buffers, which are written to
disk via the add_event method.
The other arguments to the constructor control the asynchronous writes to
the event file:
* `flush_secs`: How often, in seconds, to flush the added summaries
and events to disk.
* `max_queue`: Maximum number of summaries or events pending to be
written to disk before one of the 'add' calls block.
Args:
logdir: A string. Directory where event file will be written.
max_queue: Integer. Size of the queue for pending events and summaries.
flush_secs: Number. How often, in seconds, to flush the
pending events and summaries to disk.
"""
self._logdir = logdir
directory_check(self._logdir)
self._event_queue = six.moves.queue.Queue(max_queue)
self._ev_writer = EventsWriter(os.path.join(self._logdir, "events"))
self._closed = False
self._worker = _EventLoggerThread(self._event_queue, self._ev_writer,
flush_secs)
self._worker.start()
def get_logdir(self):
"""Returns the directory where event file will be written."""
return self._logdir
def reopen(self):
"""Reopens the EventFileWriter.
Can be called after `close()` to add more events in the same directory.
The events will go into a new events file.
Does nothing if the EventFileWriter was not closed.
"""
if self._closed:
self._closed = False
def add_event(self, event):
"""Adds an event to the event file.
Args:
event: An `Event` protocol buffer.
"""
if not self._closed:
self._event_queue.put(event)
def flush(self):
"""Flushes the event file to disk.
Call this method to make sure that all pending events have been written to
disk.
"""
self._event_queue.join()
self._ev_writer.flush()
def close(self):
"""Flushes the event file to disk and close the file.
Call this method when you do not need the summary writer anymore.
"""
self.flush()
self._ev_writer.close()
self._closed = True
class _EventLoggerThread(threading.Thread):
"""Thread that logs events."""
def __init__(self, queue, ev_writer, flush_secs):
"""Creates an _EventLoggerThread.
Args:
queue: A Queue from which to dequeue events.
ev_writer: An event writer. Used to log brain events for
the visualizer.
flush_secs: How often, in seconds, to flush the
pending file to disk.
"""
threading.Thread.__init__(self)
self.daemon = True
self._queue = queue
self._ev_writer = ev_writer
self._flush_secs = flush_secs
# The first event will be flushed immediately.
self._next_event_flush_time = 0
def run(self):
while True:
event = self._queue.get()
try:
self._ev_writer.write_event(event)
# Flush the event writer every so often.
now = time.time()
if now > self._next_event_flush_time:
self._ev_writer.flush()
# Do it again in two minutes.
self._next_event_flush_time = now + self._flush_secs
finally:
self._queue.task_done()
+66
View File
@@ -0,0 +1,66 @@
from .src.graph_pb2 import GraphDef
from .src.node_def_pb2 import NodeDef
from .src.versions_pb2 import VersionDef
from .src.attr_value_pb2 import AttrValue
from .src.tensor_shape_pb2 import TensorShapeProto
from distutils.version import LooseVersion
def replace(name, scope):
return '/'.join([scope[name], name])
def parse(graph):
import torch
scope = {}
for n in graph.nodes():
inputs = [i.uniqueName() for i in n.inputs()]
for i in range(1, len(inputs)):
scope[inputs[i]] = n.scopeName()
uname = next(iter(n.outputs())).uniqueName()
assert n.scopeName() != '', '{} has empty scope name'.format(n)
scope[uname] = n.scopeName()
if LooseVersion(torch.__version__) >= LooseVersion("0.4"):
scope['0'] = 'input'
else:
scope['1'] = 'input'
nodes = []
for n in graph.nodes():
attrs = {k: n[k] for k in n.attributeNames()}
attrs = str(attrs).replace("'", ' ') # singlequote will be escaped by tensorboard
if any(i.uniqueName() not in scope.keys() for i in n.inputs()): # 0.3.1 workaround
continue
inputs = [replace(i.uniqueName(), scope) for i in n.inputs()]
uname = next(iter(n.outputs())).uniqueName() # FIXME: only first output is considered
nodes.append({'name': replace(uname, scope), 'op': n.kind(), 'inputs': inputs, 'attr': attrs})
for n in graph.inputs():
uname = n.uniqueName()
if uname not in scope.keys():
scope[uname] = 'unused'
nodes.append({'name': replace(uname, scope), 'op': 'Parameter', 'inputs': [], 'attr': str(n.type())})
return nodes
def graph(model, args, verbose=False):
import torch
with torch.onnx.set_training(model, False):
trace, _ = torch.jit.trace(model, args)
if LooseVersion(torch.__version__) >= LooseVersion("0.4"):
torch.onnx._optimize_trace(trace, False)
else:
torch.onnx._optimize_trace(trace)
graph = trace.graph()
if verbose:
print(graph)
list_of_nodes = parse(graph)
nodes = []
for node in list_of_nodes:
nodes.append(
NodeDef(name=node['name'], op=node['op'], input=node['inputs'],
attr={'lanpa': AttrValue(s=node['attr'].encode(encoding='utf_8'))}))
return GraphDef(node=nodes, versions=VersionDef(producer=22))
+158
View File
@@ -0,0 +1,158 @@
from .src.graph_pb2 import GraphDef
from .src.node_def_pb2 import NodeDef
from .src.versions_pb2 import VersionDef
from .src.attr_value_pb2 import AttrValue
from .src.tensor_shape_pb2 import TensorShapeProto
# from .src.onnx_pb2 import ModelProto
def gg(fname):
import onnx # 0.2.1
m = onnx.load(fname)
nodes_proto = []
nodes = []
g = m.graph
import itertools
for node in itertools.chain(g.input, g.output):
nodes_proto.append(node)
for node in nodes_proto:
shapeproto = TensorShapeProto(
dim=[TensorShapeProto.Dim(size=d.dim_value) for d in node.type.tensor_type.shape.dim])
nodes.append(NodeDef(
name=node.name,
op='Variable',
input=[],
attr={
'dtype': AttrValue(type=node.type.tensor_type.elem_type),
'shape': AttrValue(shape=shapeproto),
})
)
for node in g.node:
attr = []
for s in node.attribute:
attr.append(' = '.join([str(f[1]) for f in s.ListFields()]))
attr = ', '.join(attr).encode(encoding='utf_8')
nodes.append(NodeDef(
name=node.output[0],
op=node.op_type,
input=node.input,
attr={'parameters': AttrValue(s=attr)},
))
# two pass token replacement, appends opname to object id
mapping = {}
for node in nodes:
mapping[node.name] = node.op + '_' + node.name
nodes, mapping = updatenodes(nodes, mapping)
mapping = smartGrouping(nodes, mapping)
nodes, mapping = updatenodes(nodes, mapping)
return GraphDef(node=nodes, versions=VersionDef(producer=22))
def updatenodes(nodes, mapping):
for node in nodes:
newname = mapping[node.name]
node.name = newname
newinput = []
for inputnode in list(node.input):
newinput.append(mapping[inputnode])
node.input.remove(inputnode)
node.input.extend(newinput)
newmap = {}
for k, v in mapping.items():
newmap[v] = v
return nodes, newmap
def findnode(nodes, name):
""" input: node name
returns: node object
"""
for n in nodes:
if n.name == name:
return n
def parser(s, nodes, node):
print(s)
if len(s) == 0:
return
if len(s) > 0:
if s[0] == node.op:
print(s[0], node.name, s[1], node.input)
for n in node.input:
print(n, s[1])
parser(s[1], nodes, findnode(nodes, n))
else:
return False
# TODO: use recursive parse
def smartGrouping(nodes, mapping):
# a Fully Conv is: (TODO: check var1.size(0)==var2.size(0))
# GEMM <-- Variable (c1)
# ^-- Transpose (c2) <-- Variable (c3)
# a Conv with bias is: (TODO: check var1.size(0)==var2.size(0))
# Add <-- Conv (c2) <-- Variable (c3)
# ^-- Variable (c1)
#
# gemm = ('Gemm', ('Variable', ('Transpose', ('Variable'))))
FCcounter = 1
Convcounter = 1
for node in nodes:
if node.op == 'Gemm':
c1 = c2 = c3 = False
for name_in in node.input:
n = findnode(nodes, name_in)
if n.op == 'Variable':
c1 = True
c1name = n.name
if n.op == 'Transpose':
c2 = True
c2name = n.name
if len(n.input) == 1:
nn = findnode(nodes, n.input[0])
if nn.op == 'Variable':
c3 = True
c3name = nn.name
# print(n.op, n.name, c1, c2, c3)
if c1 and c2 and c3:
# print(c1name, c2name, c3name)
mapping[c1name] = 'FC{}/{}'.format(FCcounter, c1name)
mapping[c2name] = 'FC{}/{}'.format(FCcounter, c2name)
mapping[c3name] = 'FC{}/{}'.format(FCcounter, c3name)
mapping[node.name] = 'FC{}/{}'.format(FCcounter, node.name)
FCcounter += 1
continue
if node.op == 'Add':
c1 = c2 = c3 = False
for name_in in node.input:
n = findnode(nodes, name_in)
if n.op == 'Variable':
c1 = True
c1name = n.name
if n.op == 'Conv':
c2 = True
c2name = n.name
if len(n.input) >= 1:
for nn_name in n.input:
nn = findnode(nodes, nn_name)
if nn.op == 'Variable':
c3 = True
c3name = nn.name
if c1 and c2 and c3:
# print(c1name, c2name, c3name)
mapping[c1name] = 'Conv{}/{}'.format(Convcounter, c1name)
mapping[c2name] = 'Conv{}/{}'.format(Convcounter, c2name)
mapping[c3name] = 'Conv{}/{}'.format(Convcounter, c3name)
mapping[node.name] = 'Conv{}/{}'.format(Convcounter, node.name)
Convcounter += 1
return mapping
+47
View File
@@ -0,0 +1,47 @@
"""
To write tf_record into file. Here we use it for tensorboard's event writting.
The code was borrow from https://github.com/TeamHG-Memex/tensorboard_logger
"""
import re
import struct
from .crc32c import crc32c
_VALID_OP_NAME_START = re.compile('^[A-Za-z0-9.]')
_VALID_OP_NAME_PART = re.compile('[A-Za-z0-9_.\\-/]+')
class RecordWriter(object):
def __init__(self, path, flush_secs=2):
self._name_to_tf_name = {}
self._tf_names = set()
self.path = path
self.flush_secs = flush_secs # TODO. flush every flush_secs, not every time.
self._writer = None
self._writer = open(path, 'wb')
def write(self, event_str):
w = self._writer.write
header = struct.pack('Q', len(event_str))
w(header)
w(struct.pack('I', masked_crc32c(header)))
w(event_str)
w(struct.pack('I', masked_crc32c(event_str)))
self._writer.flush()
def masked_crc32c(data):
x = u32(crc32c(data))
return u32(((x >> 15) | u32(x << 17)) + 0xa282ead8)
def u32(x):
return x & 0xffffffff
def make_valid_tf_name(name):
if not _VALID_OP_NAME_START.match(name):
# Must make it valid somehow, but don't want to remove stuff
name = '.' + name
return '_'.join(_VALID_OP_NAME_PART.findall(name))
View File
+372
View File
@@ -0,0 +1,372 @@
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: tensorboardX/src/attr_value.proto
import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
from google.protobuf import descriptor_pb2
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
from tensorboardX.src import tensor_pb2 as tensorboardX_dot_src_dot_tensor__pb2
from tensorboardX.src import tensor_shape_pb2 as tensorboardX_dot_src_dot_tensor__shape__pb2
from tensorboardX.src import types_pb2 as tensorboardX_dot_src_dot_types__pb2
DESCRIPTOR = _descriptor.FileDescriptor(
name='tensorboardX/src/attr_value.proto',
package='tensorboard',
syntax='proto3',
serialized_pb=_b('\n!tensorboardX/src/attr_value.proto\x12\x0btensorboard\x1a\x1dtensorboardX/src/tensor.proto\x1a#tensorboardX/src/tensor_shape.proto\x1a\x1ctensorboardX/src/types.proto\"\xaf\x04\n\tAttrValue\x12\x0b\n\x01s\x18\x02 \x01(\x0cH\x00\x12\x0b\n\x01i\x18\x03 \x01(\x03H\x00\x12\x0b\n\x01\x66\x18\x04 \x01(\x02H\x00\x12\x0b\n\x01\x62\x18\x05 \x01(\x08H\x00\x12%\n\x04type\x18\x06 \x01(\x0e\x32\x15.tensorboard.DataTypeH\x00\x12.\n\x05shape\x18\x07 \x01(\x0b\x32\x1d.tensorboard.TensorShapeProtoH\x00\x12*\n\x06tensor\x18\x08 \x01(\x0b\x32\x18.tensorboard.TensorProtoH\x00\x12\x30\n\x04list\x18\x01 \x01(\x0b\x32 .tensorboard.AttrValue.ListValueH\x00\x12)\n\x04\x66unc\x18\n \x01(\x0b\x32\x19.tensorboard.NameAttrListH\x00\x12\x15\n\x0bplaceholder\x18\t \x01(\tH\x00\x1a\xed\x01\n\tListValue\x12\t\n\x01s\x18\x02 \x03(\x0c\x12\r\n\x01i\x18\x03 \x03(\x03\x42\x02\x10\x01\x12\r\n\x01\x66\x18\x04 \x03(\x02\x42\x02\x10\x01\x12\r\n\x01\x62\x18\x05 \x03(\x08\x42\x02\x10\x01\x12\'\n\x04type\x18\x06 \x03(\x0e\x32\x15.tensorboard.DataTypeB\x02\x10\x01\x12,\n\x05shape\x18\x07 \x03(\x0b\x32\x1d.tensorboard.TensorShapeProto\x12(\n\x06tensor\x18\x08 \x03(\x0b\x32\x18.tensorboard.TensorProto\x12\'\n\x04\x66unc\x18\t \x03(\x0b\x32\x19.tensorboard.NameAttrListB\x07\n\x05value\"\x94\x01\n\x0cNameAttrList\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x31\n\x04\x61ttr\x18\x02 \x03(\x0b\x32#.tensorboard.NameAttrList.AttrEntry\x1a\x43\n\tAttrEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12%\n\x05value\x18\x02 \x01(\x0b\x32\x16.tensorboard.AttrValue:\x02\x38\x01\x42\x30\n\x18org.tensorflow.frameworkB\x0f\x41ttrValueProtosP\x01\xf8\x01\x01\x62\x06proto3')
,
dependencies=[tensorboardX_dot_src_dot_tensor__pb2.DESCRIPTOR,tensorboardX_dot_src_dot_tensor__shape__pb2.DESCRIPTOR,tensorboardX_dot_src_dot_types__pb2.DESCRIPTOR,])
_ATTRVALUE_LISTVALUE = _descriptor.Descriptor(
name='ListValue',
full_name='tensorboard.AttrValue.ListValue',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='s', full_name='tensorboard.AttrValue.ListValue.s', index=0,
number=2, type=12, cpp_type=9, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='i', full_name='tensorboard.AttrValue.ListValue.i', index=1,
number=3, type=3, cpp_type=2, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))),
_descriptor.FieldDescriptor(
name='f', full_name='tensorboard.AttrValue.ListValue.f', index=2,
number=4, type=2, cpp_type=6, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))),
_descriptor.FieldDescriptor(
name='b', full_name='tensorboard.AttrValue.ListValue.b', index=3,
number=5, type=8, cpp_type=7, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))),
_descriptor.FieldDescriptor(
name='type', full_name='tensorboard.AttrValue.ListValue.type', index=4,
number=6, type=14, cpp_type=8, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))),
_descriptor.FieldDescriptor(
name='shape', full_name='tensorboard.AttrValue.ListValue.shape', index=5,
number=7, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='tensor', full_name='tensorboard.AttrValue.ListValue.tensor', index=6,
number=8, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='func', full_name='tensorboard.AttrValue.ListValue.func', index=7,
number=9, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=462,
serialized_end=699,
)
_ATTRVALUE = _descriptor.Descriptor(
name='AttrValue',
full_name='tensorboard.AttrValue',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='s', full_name='tensorboard.AttrValue.s', index=0,
number=2, type=12, cpp_type=9, label=1,
has_default_value=False, default_value=_b(""),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='i', full_name='tensorboard.AttrValue.i', index=1,
number=3, type=3, cpp_type=2, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='f', full_name='tensorboard.AttrValue.f', index=2,
number=4, type=2, cpp_type=6, label=1,
has_default_value=False, default_value=float(0),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='b', full_name='tensorboard.AttrValue.b', index=3,
number=5, type=8, cpp_type=7, label=1,
has_default_value=False, default_value=False,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='type', full_name='tensorboard.AttrValue.type', index=4,
number=6, type=14, cpp_type=8, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='shape', full_name='tensorboard.AttrValue.shape', index=5,
number=7, type=11, cpp_type=10, label=1,
has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='tensor', full_name='tensorboard.AttrValue.tensor', index=6,
number=8, type=11, cpp_type=10, label=1,
has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='list', full_name='tensorboard.AttrValue.list', index=7,
number=1, type=11, cpp_type=10, label=1,
has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='func', full_name='tensorboard.AttrValue.func', index=8,
number=10, type=11, cpp_type=10, label=1,
has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='placeholder', full_name='tensorboard.AttrValue.placeholder', index=9,
number=9, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[_ATTRVALUE_LISTVALUE, ],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
_descriptor.OneofDescriptor(
name='value', full_name='tensorboard.AttrValue.value',
index=0, containing_type=None, fields=[]),
],
serialized_start=149,
serialized_end=708,
)
_NAMEATTRLIST_ATTRENTRY = _descriptor.Descriptor(
name='AttrEntry',
full_name='tensorboard.NameAttrList.AttrEntry',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='key', full_name='tensorboard.NameAttrList.AttrEntry.key', index=0,
number=1, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='value', full_name='tensorboard.NameAttrList.AttrEntry.value', index=1,
number=2, type=11, cpp_type=10, label=1,
has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')),
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=792,
serialized_end=859,
)
_NAMEATTRLIST = _descriptor.Descriptor(
name='NameAttrList',
full_name='tensorboard.NameAttrList',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='name', full_name='tensorboard.NameAttrList.name', index=0,
number=1, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='attr', full_name='tensorboard.NameAttrList.attr', index=1,
number=2, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[_NAMEATTRLIST_ATTRENTRY, ],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=711,
serialized_end=859,
)
_ATTRVALUE_LISTVALUE.fields_by_name['type'].enum_type = tensorboardX_dot_src_dot_types__pb2._DATATYPE
_ATTRVALUE_LISTVALUE.fields_by_name['shape'].message_type = tensorboardX_dot_src_dot_tensor__shape__pb2._TENSORSHAPEPROTO
_ATTRVALUE_LISTVALUE.fields_by_name['tensor'].message_type = tensorboardX_dot_src_dot_tensor__pb2._TENSORPROTO
_ATTRVALUE_LISTVALUE.fields_by_name['func'].message_type = _NAMEATTRLIST
_ATTRVALUE_LISTVALUE.containing_type = _ATTRVALUE
_ATTRVALUE.fields_by_name['type'].enum_type = tensorboardX_dot_src_dot_types__pb2._DATATYPE
_ATTRVALUE.fields_by_name['shape'].message_type = tensorboardX_dot_src_dot_tensor__shape__pb2._TENSORSHAPEPROTO
_ATTRVALUE.fields_by_name['tensor'].message_type = tensorboardX_dot_src_dot_tensor__pb2._TENSORPROTO
_ATTRVALUE.fields_by_name['list'].message_type = _ATTRVALUE_LISTVALUE
_ATTRVALUE.fields_by_name['func'].message_type = _NAMEATTRLIST
_ATTRVALUE.oneofs_by_name['value'].fields.append(
_ATTRVALUE.fields_by_name['s'])
_ATTRVALUE.fields_by_name['s'].containing_oneof = _ATTRVALUE.oneofs_by_name['value']
_ATTRVALUE.oneofs_by_name['value'].fields.append(
_ATTRVALUE.fields_by_name['i'])
_ATTRVALUE.fields_by_name['i'].containing_oneof = _ATTRVALUE.oneofs_by_name['value']
_ATTRVALUE.oneofs_by_name['value'].fields.append(
_ATTRVALUE.fields_by_name['f'])
_ATTRVALUE.fields_by_name['f'].containing_oneof = _ATTRVALUE.oneofs_by_name['value']
_ATTRVALUE.oneofs_by_name['value'].fields.append(
_ATTRVALUE.fields_by_name['b'])
_ATTRVALUE.fields_by_name['b'].containing_oneof = _ATTRVALUE.oneofs_by_name['value']
_ATTRVALUE.oneofs_by_name['value'].fields.append(
_ATTRVALUE.fields_by_name['type'])
_ATTRVALUE.fields_by_name['type'].containing_oneof = _ATTRVALUE.oneofs_by_name['value']
_ATTRVALUE.oneofs_by_name['value'].fields.append(
_ATTRVALUE.fields_by_name['shape'])
_ATTRVALUE.fields_by_name['shape'].containing_oneof = _ATTRVALUE.oneofs_by_name['value']
_ATTRVALUE.oneofs_by_name['value'].fields.append(
_ATTRVALUE.fields_by_name['tensor'])
_ATTRVALUE.fields_by_name['tensor'].containing_oneof = _ATTRVALUE.oneofs_by_name['value']
_ATTRVALUE.oneofs_by_name['value'].fields.append(
_ATTRVALUE.fields_by_name['list'])
_ATTRVALUE.fields_by_name['list'].containing_oneof = _ATTRVALUE.oneofs_by_name['value']
_ATTRVALUE.oneofs_by_name['value'].fields.append(
_ATTRVALUE.fields_by_name['func'])
_ATTRVALUE.fields_by_name['func'].containing_oneof = _ATTRVALUE.oneofs_by_name['value']
_ATTRVALUE.oneofs_by_name['value'].fields.append(
_ATTRVALUE.fields_by_name['placeholder'])
_ATTRVALUE.fields_by_name['placeholder'].containing_oneof = _ATTRVALUE.oneofs_by_name['value']
_NAMEATTRLIST_ATTRENTRY.fields_by_name['value'].message_type = _ATTRVALUE
_NAMEATTRLIST_ATTRENTRY.containing_type = _NAMEATTRLIST
_NAMEATTRLIST.fields_by_name['attr'].message_type = _NAMEATTRLIST_ATTRENTRY
DESCRIPTOR.message_types_by_name['AttrValue'] = _ATTRVALUE
DESCRIPTOR.message_types_by_name['NameAttrList'] = _NAMEATTRLIST
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
AttrValue = _reflection.GeneratedProtocolMessageType('AttrValue', (_message.Message,), dict(
ListValue = _reflection.GeneratedProtocolMessageType('ListValue', (_message.Message,), dict(
DESCRIPTOR = _ATTRVALUE_LISTVALUE,
__module__ = 'tensorboardX.src.attr_value_pb2'
# @@protoc_insertion_point(class_scope:tensorboard.AttrValue.ListValue)
))
,
DESCRIPTOR = _ATTRVALUE,
__module__ = 'tensorboardX.src.attr_value_pb2'
# @@protoc_insertion_point(class_scope:tensorboard.AttrValue)
))
_sym_db.RegisterMessage(AttrValue)
_sym_db.RegisterMessage(AttrValue.ListValue)
NameAttrList = _reflection.GeneratedProtocolMessageType('NameAttrList', (_message.Message,), dict(
AttrEntry = _reflection.GeneratedProtocolMessageType('AttrEntry', (_message.Message,), dict(
DESCRIPTOR = _NAMEATTRLIST_ATTRENTRY,
__module__ = 'tensorboardX.src.attr_value_pb2'
# @@protoc_insertion_point(class_scope:tensorboard.NameAttrList.AttrEntry)
))
,
DESCRIPTOR = _NAMEATTRLIST,
__module__ = 'tensorboardX.src.attr_value_pb2'
# @@protoc_insertion_point(class_scope:tensorboard.NameAttrList)
))
_sym_db.RegisterMessage(NameAttrList)
_sym_db.RegisterMessage(NameAttrList.AttrEntry)
DESCRIPTOR.has_options = True
DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\030org.tensorflow.frameworkB\017AttrValueProtosP\001\370\001\001'))
_ATTRVALUE_LISTVALUE.fields_by_name['i'].has_options = True
_ATTRVALUE_LISTVALUE.fields_by_name['i']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))
_ATTRVALUE_LISTVALUE.fields_by_name['f'].has_options = True
_ATTRVALUE_LISTVALUE.fields_by_name['f']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))
_ATTRVALUE_LISTVALUE.fields_by_name['b'].has_options = True
_ATTRVALUE_LISTVALUE.fields_by_name['b']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))
_ATTRVALUE_LISTVALUE.fields_by_name['type'].has_options = True
_ATTRVALUE_LISTVALUE.fields_by_name['type']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))
_NAMEATTRLIST_ATTRENTRY.has_options = True
_NAMEATTRLIST_ATTRENTRY._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001'))
# @@protoc_insertion_point(module_scope)
+376
View File
@@ -0,0 +1,376 @@
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: tensorboardX/src/event.proto
import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
from google.protobuf import descriptor_pb2
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
from tensorboardX.src import summary_pb2 as tensorboardX_dot_src_dot_summary__pb2
DESCRIPTOR = _descriptor.FileDescriptor(
name='tensorboardX/src/event.proto',
package='tensorboard',
syntax='proto3',
serialized_pb=_b('\n\x1ctensorboardX/src/event.proto\x12\x0btensorboard\x1a\x1etensorboardX/src/summary.proto\"\xbf\x02\n\x05\x45vent\x12\x11\n\twall_time\x18\x01 \x01(\x01\x12\x0c\n\x04step\x18\x02 \x01(\x03\x12\x16\n\x0c\x66ile_version\x18\x03 \x01(\tH\x00\x12\x13\n\tgraph_def\x18\x04 \x01(\x0cH\x00\x12\'\n\x07summary\x18\x05 \x01(\x0b\x32\x14.tensorboard.SummaryH\x00\x12.\n\x0blog_message\x18\x06 \x01(\x0b\x32\x17.tensorboard.LogMessageH\x00\x12.\n\x0bsession_log\x18\x07 \x01(\x0b\x32\x17.tensorboard.SessionLogH\x00\x12=\n\x13tagged_run_metadata\x18\x08 \x01(\x0b\x32\x1e.tensorboard.TaggedRunMetadataH\x00\x12\x18\n\x0emeta_graph_def\x18\t \x01(\x0cH\x00\x42\x06\n\x04what\"\x96\x01\n\nLogMessage\x12,\n\x05level\x18\x01 \x01(\x0e\x32\x1d.tensorboard.LogMessage.Level\x12\x0f\n\x07message\x18\x02 \x01(\t\"I\n\x05Level\x12\x0b\n\x07UNKNOWN\x10\x00\x12\t\n\x05\x44\x45\x42UG\x10\n\x12\x08\n\x04INFO\x10\x14\x12\x08\n\x04WARN\x10\x1e\x12\t\n\x05\x45RROR\x10(\x12\t\n\x05\x46\x41TAL\x10\x32\"\xb7\x01\n\nSessionLog\x12\x35\n\x06status\x18\x01 \x01(\x0e\x32%.tensorboard.SessionLog.SessionStatus\x12\x17\n\x0f\x63heckpoint_path\x18\x02 \x01(\t\x12\x0b\n\x03msg\x18\x03 \x01(\t\"L\n\rSessionStatus\x12\x16\n\x12STATUS_UNSPECIFIED\x10\x00\x12\t\n\x05START\x10\x01\x12\x08\n\x04STOP\x10\x02\x12\x0e\n\nCHECKPOINT\x10\x03\"6\n\x11TaggedRunMetadata\x12\x0b\n\x03tag\x18\x01 \x01(\t\x12\x14\n\x0crun_metadata\x18\x02 \x01(\x0c\x42\'\n\x13org.tensorflow.utilB\x0b\x45ventProtosP\x01\xf8\x01\x01\x62\x06proto3')
,
dependencies=[tensorboardX_dot_src_dot_summary__pb2.DESCRIPTOR,])
_LOGMESSAGE_LEVEL = _descriptor.EnumDescriptor(
name='Level',
full_name='tensorboard.LogMessage.Level',
filename=None,
file=DESCRIPTOR,
values=[
_descriptor.EnumValueDescriptor(
name='UNKNOWN', index=0, number=0,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DEBUG', index=1, number=10,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='INFO', index=2, number=20,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='WARN', index=3, number=30,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='ERROR', index=4, number=40,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='FATAL', index=5, number=50,
options=None,
type=None),
],
containing_type=None,
options=None,
serialized_start=477,
serialized_end=550,
)
_sym_db.RegisterEnumDescriptor(_LOGMESSAGE_LEVEL)
_SESSIONLOG_SESSIONSTATUS = _descriptor.EnumDescriptor(
name='SessionStatus',
full_name='tensorboard.SessionLog.SessionStatus',
filename=None,
file=DESCRIPTOR,
values=[
_descriptor.EnumValueDescriptor(
name='STATUS_UNSPECIFIED', index=0, number=0,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='START', index=1, number=1,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='STOP', index=2, number=2,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='CHECKPOINT', index=3, number=3,
options=None,
type=None),
],
containing_type=None,
options=None,
serialized_start=660,
serialized_end=736,
)
_sym_db.RegisterEnumDescriptor(_SESSIONLOG_SESSIONSTATUS)
_EVENT = _descriptor.Descriptor(
name='Event',
full_name='tensorboard.Event',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='wall_time', full_name='tensorboard.Event.wall_time', index=0,
number=1, type=1, cpp_type=5, label=1,
has_default_value=False, default_value=float(0),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='step', full_name='tensorboard.Event.step', index=1,
number=2, type=3, cpp_type=2, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='file_version', full_name='tensorboard.Event.file_version', index=2,
number=3, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='graph_def', full_name='tensorboard.Event.graph_def', index=3,
number=4, type=12, cpp_type=9, label=1,
has_default_value=False, default_value=_b(""),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='summary', full_name='tensorboard.Event.summary', index=4,
number=5, type=11, cpp_type=10, label=1,
has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='log_message', full_name='tensorboard.Event.log_message', index=5,
number=6, type=11, cpp_type=10, label=1,
has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='session_log', full_name='tensorboard.Event.session_log', index=6,
number=7, type=11, cpp_type=10, label=1,
has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='tagged_run_metadata', full_name='tensorboard.Event.tagged_run_metadata', index=7,
number=8, type=11, cpp_type=10, label=1,
has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='meta_graph_def', full_name='tensorboard.Event.meta_graph_def', index=8,
number=9, type=12, cpp_type=9, label=1,
has_default_value=False, default_value=_b(""),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
_descriptor.OneofDescriptor(
name='what', full_name='tensorboard.Event.what',
index=0, containing_type=None, fields=[]),
],
serialized_start=78,
serialized_end=397,
)
_LOGMESSAGE = _descriptor.Descriptor(
name='LogMessage',
full_name='tensorboard.LogMessage',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='level', full_name='tensorboard.LogMessage.level', index=0,
number=1, type=14, cpp_type=8, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='message', full_name='tensorboard.LogMessage.message', index=1,
number=2, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
_LOGMESSAGE_LEVEL,
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=400,
serialized_end=550,
)
_SESSIONLOG = _descriptor.Descriptor(
name='SessionLog',
full_name='tensorboard.SessionLog',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='status', full_name='tensorboard.SessionLog.status', index=0,
number=1, type=14, cpp_type=8, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='checkpoint_path', full_name='tensorboard.SessionLog.checkpoint_path', index=1,
number=2, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='msg', full_name='tensorboard.SessionLog.msg', index=2,
number=3, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
_SESSIONLOG_SESSIONSTATUS,
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=553,
serialized_end=736,
)
_TAGGEDRUNMETADATA = _descriptor.Descriptor(
name='TaggedRunMetadata',
full_name='tensorboard.TaggedRunMetadata',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='tag', full_name='tensorboard.TaggedRunMetadata.tag', index=0,
number=1, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='run_metadata', full_name='tensorboard.TaggedRunMetadata.run_metadata', index=1,
number=2, type=12, cpp_type=9, label=1,
has_default_value=False, default_value=_b(""),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=738,
serialized_end=792,
)
_EVENT.fields_by_name['summary'].message_type = tensorboardX_dot_src_dot_summary__pb2._SUMMARY
_EVENT.fields_by_name['log_message'].message_type = _LOGMESSAGE
_EVENT.fields_by_name['session_log'].message_type = _SESSIONLOG
_EVENT.fields_by_name['tagged_run_metadata'].message_type = _TAGGEDRUNMETADATA
_EVENT.oneofs_by_name['what'].fields.append(
_EVENT.fields_by_name['file_version'])
_EVENT.fields_by_name['file_version'].containing_oneof = _EVENT.oneofs_by_name['what']
_EVENT.oneofs_by_name['what'].fields.append(
_EVENT.fields_by_name['graph_def'])
_EVENT.fields_by_name['graph_def'].containing_oneof = _EVENT.oneofs_by_name['what']
_EVENT.oneofs_by_name['what'].fields.append(
_EVENT.fields_by_name['summary'])
_EVENT.fields_by_name['summary'].containing_oneof = _EVENT.oneofs_by_name['what']
_EVENT.oneofs_by_name['what'].fields.append(
_EVENT.fields_by_name['log_message'])
_EVENT.fields_by_name['log_message'].containing_oneof = _EVENT.oneofs_by_name['what']
_EVENT.oneofs_by_name['what'].fields.append(
_EVENT.fields_by_name['session_log'])
_EVENT.fields_by_name['session_log'].containing_oneof = _EVENT.oneofs_by_name['what']
_EVENT.oneofs_by_name['what'].fields.append(
_EVENT.fields_by_name['tagged_run_metadata'])
_EVENT.fields_by_name['tagged_run_metadata'].containing_oneof = _EVENT.oneofs_by_name['what']
_EVENT.oneofs_by_name['what'].fields.append(
_EVENT.fields_by_name['meta_graph_def'])
_EVENT.fields_by_name['meta_graph_def'].containing_oneof = _EVENT.oneofs_by_name['what']
_LOGMESSAGE.fields_by_name['level'].enum_type = _LOGMESSAGE_LEVEL
_LOGMESSAGE_LEVEL.containing_type = _LOGMESSAGE
_SESSIONLOG.fields_by_name['status'].enum_type = _SESSIONLOG_SESSIONSTATUS
_SESSIONLOG_SESSIONSTATUS.containing_type = _SESSIONLOG
DESCRIPTOR.message_types_by_name['Event'] = _EVENT
DESCRIPTOR.message_types_by_name['LogMessage'] = _LOGMESSAGE
DESCRIPTOR.message_types_by_name['SessionLog'] = _SESSIONLOG
DESCRIPTOR.message_types_by_name['TaggedRunMetadata'] = _TAGGEDRUNMETADATA
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
Event = _reflection.GeneratedProtocolMessageType('Event', (_message.Message,), dict(
DESCRIPTOR = _EVENT,
__module__ = 'tensorboardX.src.event_pb2'
# @@protoc_insertion_point(class_scope:tensorboard.Event)
))
_sym_db.RegisterMessage(Event)
LogMessage = _reflection.GeneratedProtocolMessageType('LogMessage', (_message.Message,), dict(
DESCRIPTOR = _LOGMESSAGE,
__module__ = 'tensorboardX.src.event_pb2'
# @@protoc_insertion_point(class_scope:tensorboard.LogMessage)
))
_sym_db.RegisterMessage(LogMessage)
SessionLog = _reflection.GeneratedProtocolMessageType('SessionLog', (_message.Message,), dict(
DESCRIPTOR = _SESSIONLOG,
__module__ = 'tensorboardX.src.event_pb2'
# @@protoc_insertion_point(class_scope:tensorboard.SessionLog)
))
_sym_db.RegisterMessage(SessionLog)
TaggedRunMetadata = _reflection.GeneratedProtocolMessageType('TaggedRunMetadata', (_message.Message,), dict(
DESCRIPTOR = _TAGGEDRUNMETADATA,
__module__ = 'tensorboardX.src.event_pb2'
# @@protoc_insertion_point(class_scope:tensorboard.TaggedRunMetadata)
))
_sym_db.RegisterMessage(TaggedRunMetadata)
DESCRIPTOR.has_options = True
DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\023org.tensorflow.utilB\013EventProtosP\001\370\001\001'))
# @@protoc_insertion_point(module_scope)
+92
View File
@@ -0,0 +1,92 @@
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: tensorboardX/src/graph.proto
import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
from google.protobuf import descriptor_pb2
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
from tensorboardX.src import node_def_pb2 as tensorboardX_dot_src_dot_node__def__pb2
from tensorboardX.src import versions_pb2 as tensorboardX_dot_src_dot_versions__pb2
DESCRIPTOR = _descriptor.FileDescriptor(
name='tensorboardX/src/graph.proto',
package='tensorboard',
syntax='proto3',
serialized_pb=_b('\n\x1ctensorboardX/src/graph.proto\x12\x0btensorboard\x1a\x1ftensorboardX/src/node_def.proto\x1a\x1ftensorboardX/src/versions.proto\"n\n\x08GraphDef\x12\"\n\x04node\x18\x01 \x03(\x0b\x32\x14.tensorboard.NodeDef\x12)\n\x08versions\x18\x04 \x01(\x0b\x32\x17.tensorboard.VersionDef\x12\x13\n\x07version\x18\x03 \x01(\x05\x42\x02\x18\x01\x42,\n\x18org.tensorflow.frameworkB\x0bGraphProtosP\x01\xf8\x01\x01\x62\x06proto3')
,
dependencies=[tensorboardX_dot_src_dot_node__def__pb2.DESCRIPTOR,tensorboardX_dot_src_dot_versions__pb2.DESCRIPTOR,])
_GRAPHDEF = _descriptor.Descriptor(
name='GraphDef',
full_name='tensorboard.GraphDef',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='node', full_name='tensorboard.GraphDef.node', index=0,
number=1, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='versions', full_name='tensorboard.GraphDef.versions', index=1,
number=4, type=11, cpp_type=10, label=1,
has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='version', full_name='tensorboard.GraphDef.version', index=2,
number=3, type=5, cpp_type=1, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=111,
serialized_end=221,
)
_GRAPHDEF.fields_by_name['node'].message_type = tensorboardX_dot_src_dot_node__def__pb2._NODEDEF
_GRAPHDEF.fields_by_name['versions'].message_type = tensorboardX_dot_src_dot_versions__pb2._VERSIONDEF
DESCRIPTOR.message_types_by_name['GraphDef'] = _GRAPHDEF
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
GraphDef = _reflection.GeneratedProtocolMessageType('GraphDef', (_message.Message,), dict(
DESCRIPTOR = _GRAPHDEF,
__module__ = 'tensorboardX.src.graph_pb2'
# @@protoc_insertion_point(class_scope:tensorboard.GraphDef)
))
_sym_db.RegisterMessage(GraphDef)
DESCRIPTOR.has_options = True
DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\030org.tensorflow.frameworkB\013GraphProtosP\001\370\001\001'))
_GRAPHDEF.fields_by_name['version'].has_options = True
_GRAPHDEF.fields_by_name['version']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))
# @@protoc_insertion_point(module_scope)
+151
View File
@@ -0,0 +1,151 @@
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: tensorboardX/src/node_def.proto
import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
from google.protobuf import descriptor_pb2
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
from tensorboardX.src import attr_value_pb2 as tensorboardX_dot_src_dot_attr__value__pb2
DESCRIPTOR = _descriptor.FileDescriptor(
name='tensorboardX/src/node_def.proto',
package='tensorboard',
syntax='proto3',
serialized_pb=_b('\n\x1ftensorboardX/src/node_def.proto\x12\x0btensorboard\x1a!tensorboardX/src/attr_value.proto\"\xb5\x01\n\x07NodeDef\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\n\n\x02op\x18\x02 \x01(\t\x12\r\n\x05input\x18\x03 \x03(\t\x12\x0e\n\x06\x64\x65vice\x18\x04 \x01(\t\x12,\n\x04\x61ttr\x18\x05 \x03(\x0b\x32\x1e.tensorboard.NodeDef.AttrEntry\x1a\x43\n\tAttrEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12%\n\x05value\x18\x02 \x01(\x0b\x32\x16.tensorboard.AttrValue:\x02\x38\x01\x42*\n\x18org.tensorflow.frameworkB\tNodeProtoP\x01\xf8\x01\x01\x62\x06proto3')
,
dependencies=[tensorboardX_dot_src_dot_attr__value__pb2.DESCRIPTOR,])
_NODEDEF_ATTRENTRY = _descriptor.Descriptor(
name='AttrEntry',
full_name='tensorboard.NodeDef.AttrEntry',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='key', full_name='tensorboard.NodeDef.AttrEntry.key', index=0,
number=1, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='value', full_name='tensorboard.NodeDef.AttrEntry.value', index=1,
number=2, type=11, cpp_type=10, label=1,
has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')),
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=198,
serialized_end=265,
)
_NODEDEF = _descriptor.Descriptor(
name='NodeDef',
full_name='tensorboard.NodeDef',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='name', full_name='tensorboard.NodeDef.name', index=0,
number=1, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='op', full_name='tensorboard.NodeDef.op', index=1,
number=2, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='input', full_name='tensorboard.NodeDef.input', index=2,
number=3, type=9, cpp_type=9, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='device', full_name='tensorboard.NodeDef.device', index=3,
number=4, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='attr', full_name='tensorboard.NodeDef.attr', index=4,
number=5, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[_NODEDEF_ATTRENTRY, ],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=84,
serialized_end=265,
)
_NODEDEF_ATTRENTRY.fields_by_name['value'].message_type = tensorboardX_dot_src_dot_attr__value__pb2._ATTRVALUE
_NODEDEF_ATTRENTRY.containing_type = _NODEDEF
_NODEDEF.fields_by_name['attr'].message_type = _NODEDEF_ATTRENTRY
DESCRIPTOR.message_types_by_name['NodeDef'] = _NODEDEF
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
NodeDef = _reflection.GeneratedProtocolMessageType('NodeDef', (_message.Message,), dict(
AttrEntry = _reflection.GeneratedProtocolMessageType('AttrEntry', (_message.Message,), dict(
DESCRIPTOR = _NODEDEF_ATTRENTRY,
__module__ = 'tensorboardX.src.node_def_pb2'
# @@protoc_insertion_point(class_scope:tensorboard.NodeDef.AttrEntry)
))
,
DESCRIPTOR = _NODEDEF,
__module__ = 'tensorboardX.src.node_def_pb2'
# @@protoc_insertion_point(class_scope:tensorboard.NodeDef)
))
_sym_db.RegisterMessage(NodeDef)
_sym_db.RegisterMessage(NodeDef.AttrEntry)
DESCRIPTOR.has_options = True
DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\030org.tensorflow.frameworkB\tNodeProtoP\001\370\001\001'))
_NODEDEF_ATTRENTRY.has_options = True
_NODEDEF_ATTRENTRY._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001'))
# @@protoc_insertion_point(module_scope)
+76
View File
@@ -0,0 +1,76 @@
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: tensorboardX/src/plugin_pr_curve.proto
import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
from google.protobuf import descriptor_pb2
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor.FileDescriptor(
name='tensorboardX/src/plugin_pr_curve.proto',
package='tensorboard',
syntax='proto3',
serialized_pb=_b('\n&tensorboardX/src/plugin_pr_curve.proto\x12\x0btensorboard\"<\n\x11PrCurvePluginData\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12\x16\n\x0enum_thresholds\x18\x02 \x01(\rb\x06proto3')
)
_PRCURVEPLUGINDATA = _descriptor.Descriptor(
name='PrCurvePluginData',
full_name='tensorboard.PrCurvePluginData',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='version', full_name='tensorboard.PrCurvePluginData.version', index=0,
number=1, type=5, cpp_type=1, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='num_thresholds', full_name='tensorboard.PrCurvePluginData.num_thresholds', index=1,
number=2, type=13, cpp_type=3, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=55,
serialized_end=115,
)
DESCRIPTOR.message_types_by_name['PrCurvePluginData'] = _PRCURVEPLUGINDATA
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
PrCurvePluginData = _reflection.GeneratedProtocolMessageType('PrCurvePluginData', (_message.Message,), dict(
DESCRIPTOR = _PRCURVEPLUGINDATA,
__module__ = 'tensorboardX.src.plugin_pr_curve_pb2'
# @@protoc_insertion_point(class_scope:tensorboard.PrCurvePluginData)
))
_sym_db.RegisterMessage(PrCurvePluginData)
# @@protoc_insertion_point(module_scope)
+99
View File
@@ -0,0 +1,99 @@
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: tensorboardX/src/resource_handle.proto
import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
from google.protobuf import descriptor_pb2
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor.FileDescriptor(
name='tensorboardX/src/resource_handle.proto',
package='tensorboard',
syntax='proto3',
serialized_pb=_b('\n&tensorboardX/src/resource_handle.proto\x12\x0btensorboard\"r\n\x13ResourceHandleProto\x12\x0e\n\x06\x64\x65vice\x18\x01 \x01(\t\x12\x11\n\tcontainer\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x11\n\thash_code\x18\x04 \x01(\x04\x12\x17\n\x0fmaybe_type_name\x18\x05 \x01(\tB/\n\x18org.tensorflow.frameworkB\x0eResourceHandleP\x01\xf8\x01\x01\x62\x06proto3')
)
_RESOURCEHANDLEPROTO = _descriptor.Descriptor(
name='ResourceHandleProto',
full_name='tensorboard.ResourceHandleProto',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='device', full_name='tensorboard.ResourceHandleProto.device', index=0,
number=1, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='container', full_name='tensorboard.ResourceHandleProto.container', index=1,
number=2, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='name', full_name='tensorboard.ResourceHandleProto.name', index=2,
number=3, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='hash_code', full_name='tensorboard.ResourceHandleProto.hash_code', index=3,
number=4, type=4, cpp_type=4, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='maybe_type_name', full_name='tensorboard.ResourceHandleProto.maybe_type_name', index=4,
number=5, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=55,
serialized_end=169,
)
DESCRIPTOR.message_types_by_name['ResourceHandleProto'] = _RESOURCEHANDLEPROTO
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
ResourceHandleProto = _reflection.GeneratedProtocolMessageType('ResourceHandleProto', (_message.Message,), dict(
DESCRIPTOR = _RESOURCEHANDLEPROTO,
__module__ = 'tensorboardX.src.resource_handle_pb2'
# @@protoc_insertion_point(class_scope:tensorboard.ResourceHandleProto)
))
_sym_db.RegisterMessage(ResourceHandleProto)
DESCRIPTOR.has_options = True
DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\030org.tensorflow.frameworkB\016ResourceHandleP\001\370\001\001'))
# @@protoc_insertion_point(module_scope)
+532
View File
@@ -0,0 +1,532 @@
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: tensorboardX/src/summary.proto
import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
from google.protobuf import descriptor_pb2
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
from tensorboardX.src import tensor_pb2 as tensorboardX_dot_src_dot_tensor__pb2
DESCRIPTOR = _descriptor.FileDescriptor(
name='tensorboardX/src/summary.proto',
package='tensorboard',
syntax='proto3',
serialized_pb=_b('\n\x1etensorboardX/src/summary.proto\x12\x0btensorboard\x1a\x1dtensorboardX/src/tensor.proto\"\'\n\x12SummaryDescription\x12\x11\n\ttype_hint\x18\x01 \x01(\t\"\x87\x01\n\x0eHistogramProto\x12\x0b\n\x03min\x18\x01 \x01(\x01\x12\x0b\n\x03max\x18\x02 \x01(\x01\x12\x0b\n\x03num\x18\x03 \x01(\x01\x12\x0b\n\x03sum\x18\x04 \x01(\x01\x12\x13\n\x0bsum_squares\x18\x05 \x01(\x01\x12\x18\n\x0c\x62ucket_limit\x18\x06 \x03(\x01\x42\x02\x10\x01\x12\x12\n\x06\x62ucket\x18\x07 \x03(\x01\x42\x02\x10\x01\"\x83\x01\n\x0fSummaryMetadata\x12<\n\x0bplugin_data\x18\x01 \x03(\x0b\x32\'.tensorboard.SummaryMetadata.PluginData\x1a\x32\n\nPluginData\x12\x13\n\x0bplugin_name\x18\x01 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\t\"\xe4\x04\n\x07Summary\x12)\n\x05value\x18\x01 \x03(\x0b\x32\x1a.tensorboard.Summary.Value\x1aX\n\x05Image\x12\x0e\n\x06height\x18\x01 \x01(\x05\x12\r\n\x05width\x18\x02 \x01(\x05\x12\x12\n\ncolorspace\x18\x03 \x01(\x05\x12\x1c\n\x14\x65ncoded_image_string\x18\x04 \x01(\x0c\x1a}\n\x05\x41udio\x12\x13\n\x0bsample_rate\x18\x01 \x01(\x02\x12\x14\n\x0cnum_channels\x18\x02 \x01(\x03\x12\x15\n\rlength_frames\x18\x03 \x01(\x03\x12\x1c\n\x14\x65ncoded_audio_string\x18\x04 \x01(\x0c\x12\x14\n\x0c\x63ontent_type\x18\x05 \x01(\t\x1a\xd4\x02\n\x05Value\x12\x11\n\tnode_name\x18\x07 \x01(\t\x12\x0b\n\x03tag\x18\x01 \x01(\t\x12.\n\x08metadata\x18\t \x01(\x0b\x32\x1c.tensorboard.SummaryMetadata\x12\x16\n\x0csimple_value\x18\x02 \x01(\x02H\x00\x12&\n\x1cobsolete_old_style_histogram\x18\x03 \x01(\x0cH\x00\x12+\n\x05image\x18\x04 \x01(\x0b\x32\x1a.tensorboard.Summary.ImageH\x00\x12,\n\x05histo\x18\x05 \x01(\x0b\x32\x1b.tensorboard.HistogramProtoH\x00\x12+\n\x05\x61udio\x18\x06 \x01(\x0b\x32\x1a.tensorboard.Summary.AudioH\x00\x12*\n\x06tensor\x18\x08 \x01(\x0b\x32\x18.tensorboard.TensorProtoH\x00\x42\x07\n\x05valueB.\n\x18org.tensorflow.frameworkB\rSummaryProtosP\x01\xf8\x01\x01\x62\x06proto3')
,
dependencies=[tensorboardX_dot_src_dot_tensor__pb2.DESCRIPTOR,])
_SUMMARYDESCRIPTION = _descriptor.Descriptor(
name='SummaryDescription',
full_name='tensorboard.SummaryDescription',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='type_hint', full_name='tensorboard.SummaryDescription.type_hint', index=0,
number=1, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=78,
serialized_end=117,
)
_HISTOGRAMPROTO = _descriptor.Descriptor(
name='HistogramProto',
full_name='tensorboard.HistogramProto',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='min', full_name='tensorboard.HistogramProto.min', index=0,
number=1, type=1, cpp_type=5, label=1,
has_default_value=False, default_value=float(0),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='max', full_name='tensorboard.HistogramProto.max', index=1,
number=2, type=1, cpp_type=5, label=1,
has_default_value=False, default_value=float(0),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='num', full_name='tensorboard.HistogramProto.num', index=2,
number=3, type=1, cpp_type=5, label=1,
has_default_value=False, default_value=float(0),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='sum', full_name='tensorboard.HistogramProto.sum', index=3,
number=4, type=1, cpp_type=5, label=1,
has_default_value=False, default_value=float(0),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='sum_squares', full_name='tensorboard.HistogramProto.sum_squares', index=4,
number=5, type=1, cpp_type=5, label=1,
has_default_value=False, default_value=float(0),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='bucket_limit', full_name='tensorboard.HistogramProto.bucket_limit', index=5,
number=6, type=1, cpp_type=5, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))),
_descriptor.FieldDescriptor(
name='bucket', full_name='tensorboard.HistogramProto.bucket', index=6,
number=7, type=1, cpp_type=5, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=120,
serialized_end=255,
)
_SUMMARYMETADATA_PLUGINDATA = _descriptor.Descriptor(
name='PluginData',
full_name='tensorboard.SummaryMetadata.PluginData',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='plugin_name', full_name='tensorboard.SummaryMetadata.PluginData.plugin_name', index=0,
number=1, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='content', full_name='tensorboard.SummaryMetadata.PluginData.content', index=1,
number=2, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=339,
serialized_end=389,
)
_SUMMARYMETADATA = _descriptor.Descriptor(
name='SummaryMetadata',
full_name='tensorboard.SummaryMetadata',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='plugin_data', full_name='tensorboard.SummaryMetadata.plugin_data', index=0,
number=1, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[_SUMMARYMETADATA_PLUGINDATA, ],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=258,
serialized_end=389,
)
_SUMMARY_IMAGE = _descriptor.Descriptor(
name='Image',
full_name='tensorboard.Summary.Image',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='height', full_name='tensorboard.Summary.Image.height', index=0,
number=1, type=5, cpp_type=1, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='width', full_name='tensorboard.Summary.Image.width', index=1,
number=2, type=5, cpp_type=1, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='colorspace', full_name='tensorboard.Summary.Image.colorspace', index=2,
number=3, type=5, cpp_type=1, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='encoded_image_string', full_name='tensorboard.Summary.Image.encoded_image_string', index=3,
number=4, type=12, cpp_type=9, label=1,
has_default_value=False, default_value=_b(""),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=446,
serialized_end=534,
)
_SUMMARY_AUDIO = _descriptor.Descriptor(
name='Audio',
full_name='tensorboard.Summary.Audio',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='sample_rate', full_name='tensorboard.Summary.Audio.sample_rate', index=0,
number=1, type=2, cpp_type=6, label=1,
has_default_value=False, default_value=float(0),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='num_channels', full_name='tensorboard.Summary.Audio.num_channels', index=1,
number=2, type=3, cpp_type=2, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='length_frames', full_name='tensorboard.Summary.Audio.length_frames', index=2,
number=3, type=3, cpp_type=2, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='encoded_audio_string', full_name='tensorboard.Summary.Audio.encoded_audio_string', index=3,
number=4, type=12, cpp_type=9, label=1,
has_default_value=False, default_value=_b(""),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='content_type', full_name='tensorboard.Summary.Audio.content_type', index=4,
number=5, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=536,
serialized_end=661,
)
_SUMMARY_VALUE = _descriptor.Descriptor(
name='Value',
full_name='tensorboard.Summary.Value',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='node_name', full_name='tensorboard.Summary.Value.node_name', index=0,
number=7, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='tag', full_name='tensorboard.Summary.Value.tag', index=1,
number=1, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='metadata', full_name='tensorboard.Summary.Value.metadata', index=2,
number=9, type=11, cpp_type=10, label=1,
has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='simple_value', full_name='tensorboard.Summary.Value.simple_value', index=3,
number=2, type=2, cpp_type=6, label=1,
has_default_value=False, default_value=float(0),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='obsolete_old_style_histogram', full_name='tensorboard.Summary.Value.obsolete_old_style_histogram', index=4,
number=3, type=12, cpp_type=9, label=1,
has_default_value=False, default_value=_b(""),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='image', full_name='tensorboard.Summary.Value.image', index=5,
number=4, type=11, cpp_type=10, label=1,
has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='histo', full_name='tensorboard.Summary.Value.histo', index=6,
number=5, type=11, cpp_type=10, label=1,
has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='audio', full_name='tensorboard.Summary.Value.audio', index=7,
number=6, type=11, cpp_type=10, label=1,
has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='tensor', full_name='tensorboard.Summary.Value.tensor', index=8,
number=8, type=11, cpp_type=10, label=1,
has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
_descriptor.OneofDescriptor(
name='value', full_name='tensorboard.Summary.Value.value',
index=0, containing_type=None, fields=[]),
],
serialized_start=664,
serialized_end=1004,
)
_SUMMARY = _descriptor.Descriptor(
name='Summary',
full_name='tensorboard.Summary',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='value', full_name='tensorboard.Summary.value', index=0,
number=1, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[_SUMMARY_IMAGE, _SUMMARY_AUDIO, _SUMMARY_VALUE, ],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=392,
serialized_end=1004,
)
_SUMMARYMETADATA_PLUGINDATA.containing_type = _SUMMARYMETADATA
_SUMMARYMETADATA.fields_by_name['plugin_data'].message_type = _SUMMARYMETADATA_PLUGINDATA
_SUMMARY_IMAGE.containing_type = _SUMMARY
_SUMMARY_AUDIO.containing_type = _SUMMARY
_SUMMARY_VALUE.fields_by_name['metadata'].message_type = _SUMMARYMETADATA
_SUMMARY_VALUE.fields_by_name['image'].message_type = _SUMMARY_IMAGE
_SUMMARY_VALUE.fields_by_name['histo'].message_type = _HISTOGRAMPROTO
_SUMMARY_VALUE.fields_by_name['audio'].message_type = _SUMMARY_AUDIO
_SUMMARY_VALUE.fields_by_name['tensor'].message_type = tensorboardX_dot_src_dot_tensor__pb2._TENSORPROTO
_SUMMARY_VALUE.containing_type = _SUMMARY
_SUMMARY_VALUE.oneofs_by_name['value'].fields.append(
_SUMMARY_VALUE.fields_by_name['simple_value'])
_SUMMARY_VALUE.fields_by_name['simple_value'].containing_oneof = _SUMMARY_VALUE.oneofs_by_name['value']
_SUMMARY_VALUE.oneofs_by_name['value'].fields.append(
_SUMMARY_VALUE.fields_by_name['obsolete_old_style_histogram'])
_SUMMARY_VALUE.fields_by_name['obsolete_old_style_histogram'].containing_oneof = _SUMMARY_VALUE.oneofs_by_name['value']
_SUMMARY_VALUE.oneofs_by_name['value'].fields.append(
_SUMMARY_VALUE.fields_by_name['image'])
_SUMMARY_VALUE.fields_by_name['image'].containing_oneof = _SUMMARY_VALUE.oneofs_by_name['value']
_SUMMARY_VALUE.oneofs_by_name['value'].fields.append(
_SUMMARY_VALUE.fields_by_name['histo'])
_SUMMARY_VALUE.fields_by_name['histo'].containing_oneof = _SUMMARY_VALUE.oneofs_by_name['value']
_SUMMARY_VALUE.oneofs_by_name['value'].fields.append(
_SUMMARY_VALUE.fields_by_name['audio'])
_SUMMARY_VALUE.fields_by_name['audio'].containing_oneof = _SUMMARY_VALUE.oneofs_by_name['value']
_SUMMARY_VALUE.oneofs_by_name['value'].fields.append(
_SUMMARY_VALUE.fields_by_name['tensor'])
_SUMMARY_VALUE.fields_by_name['tensor'].containing_oneof = _SUMMARY_VALUE.oneofs_by_name['value']
_SUMMARY.fields_by_name['value'].message_type = _SUMMARY_VALUE
DESCRIPTOR.message_types_by_name['SummaryDescription'] = _SUMMARYDESCRIPTION
DESCRIPTOR.message_types_by_name['HistogramProto'] = _HISTOGRAMPROTO
DESCRIPTOR.message_types_by_name['SummaryMetadata'] = _SUMMARYMETADATA
DESCRIPTOR.message_types_by_name['Summary'] = _SUMMARY
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
SummaryDescription = _reflection.GeneratedProtocolMessageType('SummaryDescription', (_message.Message,), dict(
DESCRIPTOR = _SUMMARYDESCRIPTION,
__module__ = 'tensorboardX.src.summary_pb2'
# @@protoc_insertion_point(class_scope:tensorboard.SummaryDescription)
))
_sym_db.RegisterMessage(SummaryDescription)
HistogramProto = _reflection.GeneratedProtocolMessageType('HistogramProto', (_message.Message,), dict(
DESCRIPTOR = _HISTOGRAMPROTO,
__module__ = 'tensorboardX.src.summary_pb2'
# @@protoc_insertion_point(class_scope:tensorboard.HistogramProto)
))
_sym_db.RegisterMessage(HistogramProto)
SummaryMetadata = _reflection.GeneratedProtocolMessageType('SummaryMetadata', (_message.Message,), dict(
PluginData = _reflection.GeneratedProtocolMessageType('PluginData', (_message.Message,), dict(
DESCRIPTOR = _SUMMARYMETADATA_PLUGINDATA,
__module__ = 'tensorboardX.src.summary_pb2'
# @@protoc_insertion_point(class_scope:tensorboard.SummaryMetadata.PluginData)
))
,
DESCRIPTOR = _SUMMARYMETADATA,
__module__ = 'tensorboardX.src.summary_pb2'
# @@protoc_insertion_point(class_scope:tensorboard.SummaryMetadata)
))
_sym_db.RegisterMessage(SummaryMetadata)
_sym_db.RegisterMessage(SummaryMetadata.PluginData)
Summary = _reflection.GeneratedProtocolMessageType('Summary', (_message.Message,), dict(
Image = _reflection.GeneratedProtocolMessageType('Image', (_message.Message,), dict(
DESCRIPTOR = _SUMMARY_IMAGE,
__module__ = 'tensorboardX.src.summary_pb2'
# @@protoc_insertion_point(class_scope:tensorboard.Summary.Image)
))
,
Audio = _reflection.GeneratedProtocolMessageType('Audio', (_message.Message,), dict(
DESCRIPTOR = _SUMMARY_AUDIO,
__module__ = 'tensorboardX.src.summary_pb2'
# @@protoc_insertion_point(class_scope:tensorboard.Summary.Audio)
))
,
Value = _reflection.GeneratedProtocolMessageType('Value', (_message.Message,), dict(
DESCRIPTOR = _SUMMARY_VALUE,
__module__ = 'tensorboardX.src.summary_pb2'
# @@protoc_insertion_point(class_scope:tensorboard.Summary.Value)
))
,
DESCRIPTOR = _SUMMARY,
__module__ = 'tensorboardX.src.summary_pb2'
# @@protoc_insertion_point(class_scope:tensorboard.Summary)
))
_sym_db.RegisterMessage(Summary)
_sym_db.RegisterMessage(Summary.Image)
_sym_db.RegisterMessage(Summary.Audio)
_sym_db.RegisterMessage(Summary.Value)
DESCRIPTOR.has_options = True
DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\030org.tensorflow.frameworkB\rSummaryProtosP\001\370\001\001'))
_HISTOGRAMPROTO.fields_by_name['bucket_limit'].has_options = True
_HISTOGRAMPROTO.fields_by_name['bucket_limit']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))
_HISTOGRAMPROTO.fields_by_name['bucket'].has_options = True
_HISTOGRAMPROTO.fields_by_name['bucket']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))
# @@protoc_insertion_point(module_scope)
+185
View File
@@ -0,0 +1,185 @@
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: tensorboardX/src/tensor.proto
import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
from google.protobuf import descriptor_pb2
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
from tensorboardX.src import resource_handle_pb2 as tensorboardX_dot_src_dot_resource__handle__pb2
from tensorboardX.src import tensor_shape_pb2 as tensorboardX_dot_src_dot_tensor__shape__pb2
from tensorboardX.src import types_pb2 as tensorboardX_dot_src_dot_types__pb2
DESCRIPTOR = _descriptor.FileDescriptor(
name='tensorboardX/src/tensor.proto',
package='tensorboard',
syntax='proto3',
serialized_pb=_b('\n\x1dtensorboardX/src/tensor.proto\x12\x0btensorboard\x1a&tensorboardX/src/resource_handle.proto\x1a#tensorboardX/src/tensor_shape.proto\x1a\x1ctensorboardX/src/types.proto\"\xa6\x03\n\x0bTensorProto\x12$\n\x05\x64type\x18\x01 \x01(\x0e\x32\x15.tensorboard.DataType\x12\x33\n\x0ctensor_shape\x18\x02 \x01(\x0b\x32\x1d.tensorboard.TensorShapeProto\x12\x16\n\x0eversion_number\x18\x03 \x01(\x05\x12\x16\n\x0etensor_content\x18\x04 \x01(\x0c\x12\x14\n\x08half_val\x18\r \x03(\x05\x42\x02\x10\x01\x12\x15\n\tfloat_val\x18\x05 \x03(\x02\x42\x02\x10\x01\x12\x16\n\ndouble_val\x18\x06 \x03(\x01\x42\x02\x10\x01\x12\x13\n\x07int_val\x18\x07 \x03(\x05\x42\x02\x10\x01\x12\x12\n\nstring_val\x18\x08 \x03(\x0c\x12\x18\n\x0cscomplex_val\x18\t \x03(\x02\x42\x02\x10\x01\x12\x15\n\tint64_val\x18\n \x03(\x03\x42\x02\x10\x01\x12\x14\n\x08\x62ool_val\x18\x0b \x03(\x08\x42\x02\x10\x01\x12\x18\n\x0c\x64\x63omplex_val\x18\x0c \x03(\x01\x42\x02\x10\x01\x12=\n\x13resource_handle_val\x18\x0e \x03(\x0b\x32 .tensorboard.ResourceHandleProtoB-\n\x18org.tensorflow.frameworkB\x0cTensorProtosP\x01\xf8\x01\x01\x62\x06proto3')
,
dependencies=[tensorboardX_dot_src_dot_resource__handle__pb2.DESCRIPTOR,tensorboardX_dot_src_dot_tensor__shape__pb2.DESCRIPTOR,tensorboardX_dot_src_dot_types__pb2.DESCRIPTOR,])
_TENSORPROTO = _descriptor.Descriptor(
name='TensorProto',
full_name='tensorboard.TensorProto',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='dtype', full_name='tensorboard.TensorProto.dtype', index=0,
number=1, type=14, cpp_type=8, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='tensor_shape', full_name='tensorboard.TensorProto.tensor_shape', index=1,
number=2, type=11, cpp_type=10, label=1,
has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='version_number', full_name='tensorboard.TensorProto.version_number', index=2,
number=3, type=5, cpp_type=1, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='tensor_content', full_name='tensorboard.TensorProto.tensor_content', index=3,
number=4, type=12, cpp_type=9, label=1,
has_default_value=False, default_value=_b(""),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='half_val', full_name='tensorboard.TensorProto.half_val', index=4,
number=13, type=5, cpp_type=1, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))),
_descriptor.FieldDescriptor(
name='float_val', full_name='tensorboard.TensorProto.float_val', index=5,
number=5, type=2, cpp_type=6, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))),
_descriptor.FieldDescriptor(
name='double_val', full_name='tensorboard.TensorProto.double_val', index=6,
number=6, type=1, cpp_type=5, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))),
_descriptor.FieldDescriptor(
name='int_val', full_name='tensorboard.TensorProto.int_val', index=7,
number=7, type=5, cpp_type=1, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))),
_descriptor.FieldDescriptor(
name='string_val', full_name='tensorboard.TensorProto.string_val', index=8,
number=8, type=12, cpp_type=9, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='scomplex_val', full_name='tensorboard.TensorProto.scomplex_val', index=9,
number=9, type=2, cpp_type=6, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))),
_descriptor.FieldDescriptor(
name='int64_val', full_name='tensorboard.TensorProto.int64_val', index=10,
number=10, type=3, cpp_type=2, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))),
_descriptor.FieldDescriptor(
name='bool_val', full_name='tensorboard.TensorProto.bool_val', index=11,
number=11, type=8, cpp_type=7, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))),
_descriptor.FieldDescriptor(
name='dcomplex_val', full_name='tensorboard.TensorProto.dcomplex_val', index=12,
number=12, type=1, cpp_type=5, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))),
_descriptor.FieldDescriptor(
name='resource_handle_val', full_name='tensorboard.TensorProto.resource_handle_val', index=13,
number=14, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=154,
serialized_end=576,
)
_TENSORPROTO.fields_by_name['dtype'].enum_type = tensorboardX_dot_src_dot_types__pb2._DATATYPE
_TENSORPROTO.fields_by_name['tensor_shape'].message_type = tensorboardX_dot_src_dot_tensor__shape__pb2._TENSORSHAPEPROTO
_TENSORPROTO.fields_by_name['resource_handle_val'].message_type = tensorboardX_dot_src_dot_resource__handle__pb2._RESOURCEHANDLEPROTO
DESCRIPTOR.message_types_by_name['TensorProto'] = _TENSORPROTO
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
TensorProto = _reflection.GeneratedProtocolMessageType('TensorProto', (_message.Message,), dict(
DESCRIPTOR = _TENSORPROTO,
__module__ = 'tensorboardX.src.tensor_pb2'
# @@protoc_insertion_point(class_scope:tensorboard.TensorProto)
))
_sym_db.RegisterMessage(TensorProto)
DESCRIPTOR.has_options = True
DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\030org.tensorflow.frameworkB\014TensorProtosP\001\370\001\001'))
_TENSORPROTO.fields_by_name['half_val'].has_options = True
_TENSORPROTO.fields_by_name['half_val']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))
_TENSORPROTO.fields_by_name['float_val'].has_options = True
_TENSORPROTO.fields_by_name['float_val']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))
_TENSORPROTO.fields_by_name['double_val'].has_options = True
_TENSORPROTO.fields_by_name['double_val']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))
_TENSORPROTO.fields_by_name['int_val'].has_options = True
_TENSORPROTO.fields_by_name['int_val']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))
_TENSORPROTO.fields_by_name['scomplex_val'].has_options = True
_TENSORPROTO.fields_by_name['scomplex_val']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))
_TENSORPROTO.fields_by_name['int64_val'].has_options = True
_TENSORPROTO.fields_by_name['int64_val']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))
_TENSORPROTO.fields_by_name['bool_val'].has_options = True
_TENSORPROTO.fields_by_name['bool_val']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))
_TENSORPROTO.fields_by_name['dcomplex_val'].has_options = True
_TENSORPROTO.fields_by_name['dcomplex_val']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\020\001'))
# @@protoc_insertion_point(module_scope)
+125
View File
@@ -0,0 +1,125 @@
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: tensorboardX/src/tensor_shape.proto
import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
from google.protobuf import descriptor_pb2
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor.FileDescriptor(
name='tensorboardX/src/tensor_shape.proto',
package='tensorboard',
syntax='proto3',
serialized_pb=_b('\n#tensorboardX/src/tensor_shape.proto\x12\x0btensorboard\"{\n\x10TensorShapeProto\x12.\n\x03\x64im\x18\x02 \x03(\x0b\x32!.tensorboard.TensorShapeProto.Dim\x12\x14\n\x0cunknown_rank\x18\x03 \x01(\x08\x1a!\n\x03\x44im\x12\x0c\n\x04size\x18\x01 \x01(\x03\x12\x0c\n\x04name\x18\x02 \x01(\tB2\n\x18org.tensorflow.frameworkB\x11TensorShapeProtosP\x01\xf8\x01\x01\x62\x06proto3')
)
_TENSORSHAPEPROTO_DIM = _descriptor.Descriptor(
name='Dim',
full_name='tensorboard.TensorShapeProto.Dim',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='size', full_name='tensorboard.TensorShapeProto.Dim.size', index=0,
number=1, type=3, cpp_type=2, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='name', full_name='tensorboard.TensorShapeProto.Dim.name', index=1,
number=2, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=142,
serialized_end=175,
)
_TENSORSHAPEPROTO = _descriptor.Descriptor(
name='TensorShapeProto',
full_name='tensorboard.TensorShapeProto',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='dim', full_name='tensorboard.TensorShapeProto.dim', index=0,
number=2, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='unknown_rank', full_name='tensorboard.TensorShapeProto.unknown_rank', index=1,
number=3, type=8, cpp_type=7, label=1,
has_default_value=False, default_value=False,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[_TENSORSHAPEPROTO_DIM, ],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=52,
serialized_end=175,
)
_TENSORSHAPEPROTO_DIM.containing_type = _TENSORSHAPEPROTO
_TENSORSHAPEPROTO.fields_by_name['dim'].message_type = _TENSORSHAPEPROTO_DIM
DESCRIPTOR.message_types_by_name['TensorShapeProto'] = _TENSORSHAPEPROTO
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
TensorShapeProto = _reflection.GeneratedProtocolMessageType('TensorShapeProto', (_message.Message,), dict(
Dim = _reflection.GeneratedProtocolMessageType('Dim', (_message.Message,), dict(
DESCRIPTOR = _TENSORSHAPEPROTO_DIM,
__module__ = 'tensorboardX.src.tensor_shape_pb2'
# @@protoc_insertion_point(class_scope:tensorboard.TensorShapeProto.Dim)
))
,
DESCRIPTOR = _TENSORSHAPEPROTO,
__module__ = 'tensorboardX.src.tensor_shape_pb2'
# @@protoc_insertion_point(class_scope:tensorboard.TensorShapeProto)
))
_sym_db.RegisterMessage(TensorShapeProto)
_sym_db.RegisterMessage(TensorShapeProto.Dim)
DESCRIPTOR.has_options = True
DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\030org.tensorflow.frameworkB\021TensorShapeProtosP\001\370\001\001'))
# @@protoc_insertion_point(module_scope)
+254
View File
@@ -0,0 +1,254 @@
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: tensorboardX/src/types.proto
import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf.internal import enum_type_wrapper
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
from google.protobuf import descriptor_pb2
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor.FileDescriptor(
name='tensorboardX/src/types.proto',
package='tensorboard',
syntax='proto3',
serialized_pb=_b('\n\x1ctensorboardX/src/types.proto\x12\x0btensorboard*\xc2\x05\n\x08\x44\x61taType\x12\x0e\n\nDT_INVALID\x10\x00\x12\x0c\n\x08\x44T_FLOAT\x10\x01\x12\r\n\tDT_DOUBLE\x10\x02\x12\x0c\n\x08\x44T_INT32\x10\x03\x12\x0c\n\x08\x44T_UINT8\x10\x04\x12\x0c\n\x08\x44T_INT16\x10\x05\x12\x0b\n\x07\x44T_INT8\x10\x06\x12\r\n\tDT_STRING\x10\x07\x12\x10\n\x0c\x44T_COMPLEX64\x10\x08\x12\x0c\n\x08\x44T_INT64\x10\t\x12\x0b\n\x07\x44T_BOOL\x10\n\x12\x0c\n\x08\x44T_QINT8\x10\x0b\x12\r\n\tDT_QUINT8\x10\x0c\x12\r\n\tDT_QINT32\x10\r\x12\x0f\n\x0b\x44T_BFLOAT16\x10\x0e\x12\r\n\tDT_QINT16\x10\x0f\x12\x0e\n\nDT_QUINT16\x10\x10\x12\r\n\tDT_UINT16\x10\x11\x12\x11\n\rDT_COMPLEX128\x10\x12\x12\x0b\n\x07\x44T_HALF\x10\x13\x12\x0f\n\x0b\x44T_RESOURCE\x10\x14\x12\x10\n\x0c\x44T_FLOAT_REF\x10\x65\x12\x11\n\rDT_DOUBLE_REF\x10\x66\x12\x10\n\x0c\x44T_INT32_REF\x10g\x12\x10\n\x0c\x44T_UINT8_REF\x10h\x12\x10\n\x0c\x44T_INT16_REF\x10i\x12\x0f\n\x0b\x44T_INT8_REF\x10j\x12\x11\n\rDT_STRING_REF\x10k\x12\x14\n\x10\x44T_COMPLEX64_REF\x10l\x12\x10\n\x0c\x44T_INT64_REF\x10m\x12\x0f\n\x0b\x44T_BOOL_REF\x10n\x12\x10\n\x0c\x44T_QINT8_REF\x10o\x12\x11\n\rDT_QUINT8_REF\x10p\x12\x11\n\rDT_QINT32_REF\x10q\x12\x13\n\x0f\x44T_BFLOAT16_REF\x10r\x12\x11\n\rDT_QINT16_REF\x10s\x12\x12\n\x0e\x44T_QUINT16_REF\x10t\x12\x11\n\rDT_UINT16_REF\x10u\x12\x15\n\x11\x44T_COMPLEX128_REF\x10v\x12\x0f\n\x0b\x44T_HALF_REF\x10w\x12\x13\n\x0f\x44T_RESOURCE_REF\x10xB,\n\x18org.tensorflow.frameworkB\x0bTypesProtosP\x01\xf8\x01\x01\x62\x06proto3')
)
_DATATYPE = _descriptor.EnumDescriptor(
name='DataType',
full_name='tensorboard.DataType',
filename=None,
file=DESCRIPTOR,
values=[
_descriptor.EnumValueDescriptor(
name='DT_INVALID', index=0, number=0,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_FLOAT', index=1, number=1,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_DOUBLE', index=2, number=2,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_INT32', index=3, number=3,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_UINT8', index=4, number=4,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_INT16', index=5, number=5,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_INT8', index=6, number=6,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_STRING', index=7, number=7,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_COMPLEX64', index=8, number=8,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_INT64', index=9, number=9,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_BOOL', index=10, number=10,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_QINT8', index=11, number=11,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_QUINT8', index=12, number=12,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_QINT32', index=13, number=13,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_BFLOAT16', index=14, number=14,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_QINT16', index=15, number=15,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_QUINT16', index=16, number=16,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_UINT16', index=17, number=17,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_COMPLEX128', index=18, number=18,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_HALF', index=19, number=19,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_RESOURCE', index=20, number=20,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_FLOAT_REF', index=21, number=101,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_DOUBLE_REF', index=22, number=102,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_INT32_REF', index=23, number=103,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_UINT8_REF', index=24, number=104,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_INT16_REF', index=25, number=105,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_INT8_REF', index=26, number=106,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_STRING_REF', index=27, number=107,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_COMPLEX64_REF', index=28, number=108,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_INT64_REF', index=29, number=109,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_BOOL_REF', index=30, number=110,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_QINT8_REF', index=31, number=111,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_QUINT8_REF', index=32, number=112,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_QINT32_REF', index=33, number=113,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_BFLOAT16_REF', index=34, number=114,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_QINT16_REF', index=35, number=115,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_QUINT16_REF', index=36, number=116,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_UINT16_REF', index=37, number=117,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_COMPLEX128_REF', index=38, number=118,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_HALF_REF', index=39, number=119,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DT_RESOURCE_REF', index=40, number=120,
options=None,
type=None),
],
containing_type=None,
options=None,
serialized_start=46,
serialized_end=752,
)
_sym_db.RegisterEnumDescriptor(_DATATYPE)
DataType = enum_type_wrapper.EnumTypeWrapper(_DATATYPE)
DT_INVALID = 0
DT_FLOAT = 1
DT_DOUBLE = 2
DT_INT32 = 3
DT_UINT8 = 4
DT_INT16 = 5
DT_INT8 = 6
DT_STRING = 7
DT_COMPLEX64 = 8
DT_INT64 = 9
DT_BOOL = 10
DT_QINT8 = 11
DT_QUINT8 = 12
DT_QINT32 = 13
DT_BFLOAT16 = 14
DT_QINT16 = 15
DT_QUINT16 = 16
DT_UINT16 = 17
DT_COMPLEX128 = 18
DT_HALF = 19
DT_RESOURCE = 20
DT_FLOAT_REF = 101
DT_DOUBLE_REF = 102
DT_INT32_REF = 103
DT_UINT8_REF = 104
DT_INT16_REF = 105
DT_INT8_REF = 106
DT_STRING_REF = 107
DT_COMPLEX64_REF = 108
DT_INT64_REF = 109
DT_BOOL_REF = 110
DT_QINT8_REF = 111
DT_QUINT8_REF = 112
DT_QINT32_REF = 113
DT_BFLOAT16_REF = 114
DT_QINT16_REF = 115
DT_QUINT16_REF = 116
DT_UINT16_REF = 117
DT_COMPLEX128_REF = 118
DT_HALF_REF = 119
DT_RESOURCE_REF = 120
DESCRIPTOR.enum_types_by_name['DataType'] = _DATATYPE
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
DESCRIPTOR.has_options = True
DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\030org.tensorflow.frameworkB\013TypesProtosP\001\370\001\001'))
# @@protoc_insertion_point(module_scope)
+85
View File
@@ -0,0 +1,85 @@
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: tensorboardX/src/versions.proto
import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
from google.protobuf import descriptor_pb2
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor.FileDescriptor(
name='tensorboardX/src/versions.proto',
package='tensorboard',
syntax='proto3',
serialized_pb=_b('\n\x1ftensorboardX/src/versions.proto\x12\x0btensorboard\"K\n\nVersionDef\x12\x10\n\x08producer\x18\x01 \x01(\x05\x12\x14\n\x0cmin_consumer\x18\x02 \x01(\x05\x12\x15\n\rbad_consumers\x18\x03 \x03(\x05\x42/\n\x18org.tensorflow.frameworkB\x0eVersionsProtosP\x01\xf8\x01\x01\x62\x06proto3')
)
_VERSIONDEF = _descriptor.Descriptor(
name='VersionDef',
full_name='tensorboard.VersionDef',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='producer', full_name='tensorboard.VersionDef.producer', index=0,
number=1, type=5, cpp_type=1, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='min_consumer', full_name='tensorboard.VersionDef.min_consumer', index=1,
number=2, type=5, cpp_type=1, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='bad_consumers', full_name='tensorboard.VersionDef.bad_consumers', index=2,
number=3, type=5, cpp_type=1, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=48,
serialized_end=123,
)
DESCRIPTOR.message_types_by_name['VersionDef'] = _VERSIONDEF
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
VersionDef = _reflection.GeneratedProtocolMessageType('VersionDef', (_message.Message,), dict(
DESCRIPTOR = _VERSIONDEF,
__module__ = 'tensorboardX.src.versions_pb2'
# @@protoc_insertion_point(class_scope:tensorboard.VersionDef)
))
_sym_db.RegisterMessage(VersionDef)
DESCRIPTOR.has_options = True
DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\030org.tensorflow.frameworkB\016VersionsProtosP\001\370\001\001'))
# @@protoc_insertion_point(module_scope)
+264
View File
@@ -0,0 +1,264 @@
# Copyright 2016 The TensorFlow Authors. All Rights Reserved.
#
# 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.
# ==============================================================================
"""## Generation of summaries.
### Class for writing Summaries
@@FileWriter
@@FileWriterCache
### Summary Ops
@@tensor_summary
@@scalar
@@histogram
@@audio
@@image
@@merge
@@merge_all
## Utilities
@@get_summary_description
"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import logging
import re as _re
import bisect
from six import StringIO
from six.moves import range
import numpy as np
# pylint: disable=unused-import
from .src.summary_pb2 import Summary
from .src.summary_pb2 import HistogramProto
from .src.summary_pb2 import SummaryMetadata
from .src.tensor_pb2 import TensorProto
from .src.tensor_shape_pb2 import TensorShapeProto
from .src.plugin_pr_curve_pb2 import PrCurvePluginData
from .x2num import makenp
_INVALID_TAG_CHARACTERS = _re.compile(r'[^-/\w\.]')
def _clean_tag(name):
# In the past, the first argument to summary ops was a tag, which allowed
# arbitrary characters. Now we are changing the first argument to be the node
# name. This has a number of advantages (users of summary ops now can
# take advantage of the tf name scope system) but risks breaking existing
# usage, because a much smaller set of characters are allowed in node names.
# This function replaces all illegal characters with _s, and logs a warning.
# It also strips leading slashes from the name.
if name is not None:
new_name = _INVALID_TAG_CHARACTERS.sub('_', name)
new_name = new_name.lstrip('/') # Remove leading slashes
if new_name != name:
logging.info('Summary name %s is illegal; using %s instead.' % (name, new_name))
name = new_name
return name
def scalar(name, scalar, collections=None):
"""Outputs a `Summary` protocol buffer containing a single scalar value.
The generated Summary has a Tensor.proto containing the input Tensor.
Args:
name: A name for the generated node. Will also serve as the series name in
TensorBoard.
tensor: A real numeric Tensor containing a single value.
collections: Optional list of graph collections keys. The new summary op is
added to these collections. Defaults to `[GraphKeys.SUMMARIES]`.
Returns:
A scalar `Tensor` of type `string`. Which contains a `Summary` protobuf.
Raises:
ValueError: If tensor has the wrong shape or type.
"""
name = _clean_tag(name)
scalar = makenp(scalar)
assert(scalar.squeeze().ndim == 0), 'scalar should be 0D'
scalar = float(scalar)
return Summary(value=[Summary.Value(tag=name, simple_value=scalar)])
def histogram(name, values, bins, collections=None):
# pylint: disable=line-too-long
"""Outputs a `Summary` protocol buffer with a histogram.
The generated
[`Summary`](https://www.tensorflow.org/code/tensorflow/core/framework/summary.proto)
has one summary value containing a histogram for `values`.
This op reports an `InvalidArgument` error if any value is not finite.
Args:
name: A name for the generated node. Will also serve as a series name in
TensorBoard.
values: A real numeric `Tensor`. Any shape. Values to use to
build the histogram.
collections: Optional list of graph collections keys. The new summary op is
added to these collections. Defaults to `[GraphKeys.SUMMARIES]`.
Returns:
A scalar `Tensor` of type `string`. The serialized `Summary` protocol
buffer.
"""
name = _clean_tag(name)
values = makenp(values)
hist = make_histogram(values.astype(float), bins)
return Summary(value=[Summary.Value(tag=name, histo=hist)])
def make_histogram(values, bins):
"""Convert values into a histogram proto using logic from histogram.cc."""
values = values.reshape(-1)
counts, limits = np.histogram(values, bins=bins)
limits = limits[1:]
sum_sq = values.dot(values)
return HistogramProto(min=values.min(),
max=values.max(),
num=len(values),
sum=values.sum(),
sum_squares=sum_sq,
bucket_limit=limits,
bucket=counts)
def image(tag, tensor):
"""Outputs a `Summary` protocol buffer with images.
The summary has up to `max_images` summary values containing images. The
images are built from `tensor` which must be 3-D with shape `[height, width,
channels]` and where `channels` can be:
* 1: `tensor` is interpreted as Grayscale.
* 3: `tensor` is interpreted as RGB.
* 4: `tensor` is interpreted as RGBA.
The `name` in the outputted Summary.Value protobufs is generated based on the
name, with a suffix depending on the max_outputs setting:
* If `max_outputs` is 1, the summary value tag is '*name*/image'.
* If `max_outputs` is greater than 1, the summary value tags are
generated sequentially as '*name*/image/0', '*name*/image/1', etc.
Args:
tag: A name for the generated node. Will also serve as a series name in
TensorBoard.
tensor: A 3-D `uint8` or `float32` `Tensor` of shape `[height, width,
channels]` where `channels` is 1, 3, or 4.
Returns:
A scalar `Tensor` of type `string`. The serialized `Summary` protocol
buffer.
"""
tag = _clean_tag(tag)
tensor = makenp(tensor, 'IMG')
tensor = tensor.astype(np.float32)
tensor = (tensor * 255).astype(np.uint8)
image = make_image(tensor)
return Summary(value=[Summary.Value(tag=tag, image=image)])
def make_image(tensor):
"""Convert an numpy representation image to Image protobuf"""
from PIL import Image
height, width, channel = tensor.shape
image = Image.fromarray(tensor)
import io
output = io.BytesIO()
image.save(output, format='PNG')
image_string = output.getvalue()
output.close()
return Summary.Image(height=height,
width=width,
colorspace=channel,
encoded_image_string=image_string)
def audio(tag, tensor, sample_rate=44100):
tensor = makenp(tensor)
tensor = tensor.squeeze()
if abs(tensor).max() > 1:
print('warning: audio amplitude out of range, auto clipped.')
tensor = tensor.clip(-1, 1)
assert(tensor.ndim == 1), 'input tensor should be 1 dimensional.'
tensor_list = [int(32767.0 * x) for x in tensor]
import io
import wave
import struct
fio = io.BytesIO()
Wave_write = wave.open(fio, 'wb')
Wave_write.setnchannels(1)
Wave_write.setsampwidth(2)
Wave_write.setframerate(sample_rate)
tensor_enc = b''
for v in tensor_list:
tensor_enc += struct.pack('<h', v)
Wave_write.writeframes(tensor_enc)
Wave_write.close()
audio_string = fio.getvalue()
fio.close()
audio = Summary.Audio(sample_rate=sample_rate,
num_channels=1,
length_frames=len(tensor_list),
encoded_audio_string=audio_string,
content_type='audio/wav')
return Summary(value=[Summary.Value(tag=tag, audio=audio)])
def text(tag, text):
import json
PluginData = [SummaryMetadata.PluginData(plugin_name='text')]
smd = SummaryMetadata(plugin_data=PluginData)
tensor = TensorProto(dtype='DT_STRING',
string_val=[text.encode(encoding='utf_8')],
tensor_shape=TensorShapeProto(dim=[TensorShapeProto.Dim(size=1)]))
return Summary(value=[Summary.Value(node_name=tag, metadata=smd, tensor=tensor)])
def pr_curve(tag, labels, predictions, num_thresholds=127, weights=None):
if num_thresholds > 127: # wierd, value > 127 breaks protobuf
num_thresholds = 127
data = compute_curve(labels, predictions, num_thresholds=num_thresholds, weights=weights)
pr_curve_plugin_data = PrCurvePluginData(version=0, num_thresholds=num_thresholds).SerializeToString()
PluginData = [SummaryMetadata.PluginData(plugin_name='pr_curves', content=pr_curve_plugin_data)]
smd = SummaryMetadata(plugin_data=PluginData)
tensor = TensorProto(dtype='DT_FLOAT',
float_val=data.reshape(-1).tolist(),
tensor_shape=TensorShapeProto(
dim=[TensorShapeProto.Dim(size=data.shape[0]), TensorShapeProto.Dim(size=data.shape[1])]))
return Summary(value=[Summary.Value(tag=tag, metadata=smd, tensor=tensor)])
# https://github.com/tensorflow/tensorboard/blob/master/tensorboard/plugins/pr_curve/summary.py
def compute_curve(labels, predictions, num_thresholds=None, weights=None):
_MINIMUM_COUNT = 1e-7
if weights is None:
weights = 1.0
# Compute bins of true positives and false positives.
bucket_indices = np.int32(np.floor(predictions * (num_thresholds - 1)))
float_labels = labels.astype(np.float)
histogram_range = (0, num_thresholds - 1)
tp_buckets, _ = np.histogram(
bucket_indices,
bins=num_thresholds,
range=histogram_range,
weights=float_labels * weights)
fp_buckets, _ = np.histogram(
bucket_indices,
bins=num_thresholds,
range=histogram_range,
weights=(1.0 - float_labels) * weights)
# Obtain the reverse cumulative sum.
tp = np.cumsum(tp_buckets[::-1])[::-1]
fp = np.cumsum(fp_buckets[::-1])[::-1]
tn = fp[0] - fp
fn = tp[0] - tp
precision = tp / np.maximum(_MINIMUM_COUNT, tp + fp)
recall = tp / np.maximum(_MINIMUM_COUNT, tp + fn)
return np.stack((tp, fp, tn, fn, precision, recall))
+485
View File
@@ -0,0 +1,485 @@
# Copyright 2016 The TensorFlow Authors. All Rights Reserved.
#
# 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.
# ==============================================================================
"""Provides an API for generating Event protocol buffers."""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import time
import json
import os
from .src import event_pb2
from .src import summary_pb2
from .src import graph_pb2
from .event_file_writer import EventFileWriter
from .summary import scalar, histogram, image, audio, text, pr_curve
from .graph import graph
from .graph_onnx import gg
from .embedding import make_mat, make_sprite, make_tsv, append_pbtxt
class SummaryToEventTransformer(object):
"""Abstractly implements the SummaryWriter API.
This API basically implements a number of endpoints (add_summary,
add_session_log, etc). The endpoints all generate an event protobuf, which is
passed to the contained event_writer.
@@__init__
@@add_summary
@@add_session_log
@@add_graph
@@add_meta_graph
@@add_run_metadata
"""
def __init__(self, event_writer, graph=None, graph_def=None):
"""Creates a `SummaryWriter` and an event file.
On construction the summary writer creates a new event file in `logdir`.
This event file will contain `Event` protocol buffers constructed when you
call one of the following functions: `add_summary()`, `add_session_log()`,
`add_event()`, or `add_graph()`.
If you pass a `Graph` to the constructor it is added to
the event file. (This is equivalent to calling `add_graph()` later).
TensorBoard will pick the graph from the file and display it graphically so
you can interactively explore the graph you built. You will usually pass
the graph from the session in which you launched it:
```python
...create a graph...
# Launch the graph in a session.
sess = tf.Session()
# Create a summary writer, add the 'graph' to the event file.
writer = tf.summary.FileWriter(<some-directory>, sess.graph)
```
Args:
event_writer: An EventWriter. Implements add_event method.
graph: A `Graph` object, such as `sess.graph`.
graph_def: DEPRECATED: Use the `graph` argument instead.
"""
self.event_writer = event_writer
# For storing used tags for session.run() outputs.
self._session_run_tags = {}
# TODO(zihaolucky). pass this an empty graph to check whether it's necessary.
# currently we don't support graph in MXNet using tensorboard.
def add_summary(self, summary, global_step=None):
"""Adds a `Summary` protocol buffer to the event file.
This method wraps the provided summary in an `Event` protocol buffer
and adds it to the event file.
You can pass the result of evaluating any summary op, using
[`Session.run()`](client.md#Session.run) or
[`Tensor.eval()`](framework.md#Tensor.eval), to this
function. Alternatively, you can pass a `tf.Summary` protocol
buffer that you populate with your own data. The latter is
commonly done to report evaluation results in event files.
Args:
summary: A `Summary` protocol buffer, optionally serialized as a string.
global_step: Number. Optional global step value to record with the
summary.
"""
if isinstance(summary, bytes):
summ = summary_pb2.Summary()
summ.ParseFromString(summary)
summary = summ
event = event_pb2.Event(summary=summary)
self._add_event(event, global_step)
def add_graph_onnx(self, graph):
"""Adds a `Graph` protocol buffer to the event file.
"""
event = event_pb2.Event(graph_def=graph.SerializeToString())
self._add_event(event, None)
def add_graph(self, graph):
"""Adds a `Graph` protocol buffer to the event file.
"""
event = event_pb2.Event(graph_def=graph.SerializeToString())
self._add_event(event, None)
def add_session_log(self, session_log, global_step=None):
"""Adds a `SessionLog` protocol buffer to the event file.
This method wraps the provided session in an `Event` protocol buffer
and adds it to the event file.
Args:
session_log: A `SessionLog` protocol buffer.
global_step: Number. Optional global step value to record with the
summary.
"""
event = event_pb2.Event(session_log=session_log)
self._add_event(event, global_step)
def _add_event(self, event, step):
event.wall_time = time.time()
if step is not None:
event.step = int(step)
self.event_writer.add_event(event)
class FileWriter(SummaryToEventTransformer):
"""Writes `Summary` protocol buffers to event files.
The `FileWriter` class provides a mechanism to create an event file in a
given directory and add summaries and events to it. The class updates the
file contents asynchronously. This allows a training program to call methods
to add data to the file directly from the training loop, without slowing down
training.
@@__init__
@@add_summary
@@add_session_log
@@add_event
@@add_graph
@@add_run_metadata
@@get_logdir
@@flush
@@close
"""
def __init__(self,
logdir,
graph=None,
max_queue=10,
flush_secs=120,
graph_def=None):
"""Creates a `FileWriter` and an event file.
On construction the summary writer creates a new event file in `logdir`.
This event file will contain `Event` protocol buffers constructed when you
call one of the following functions: `add_summary()`, `add_session_log()`,
`add_event()`, or `add_graph()`.
If you pass a `Graph` to the constructor it is added to
the event file. (This is equivalent to calling `add_graph()` later).
TensorBoard will pick the graph from the file and display it graphically so
you can interactively explore the graph you built. You will usually pass
the graph from the session in which you launched it:
```python
...create a graph...
# Launch the graph in a session.
sess = tf.Session()
# Create a summary writer, add the 'graph' to the event file.
writer = tf.summary.FileWriter(<some-directory>, sess.graph)
```
The other arguments to the constructor control the asynchronous writes to
the event file:
* `flush_secs`: How often, in seconds, to flush the added summaries
and events to disk.
* `max_queue`: Maximum number of summaries or events pending to be
written to disk before one of the 'add' calls block.
Args:
logdir: A string. Directory where event file will be written.
graph: A `Graph` object, such as `sess.graph`.
max_queue: Integer. Size of the queue for pending events and summaries.
flush_secs: Number. How often, in seconds, to flush the
pending events and summaries to disk.
graph_def: DEPRECATED: Use the `graph` argument instead.
"""
event_writer = EventFileWriter(logdir, max_queue, flush_secs)
super(FileWriter, self).__init__(event_writer, graph, graph_def)
def get_logdir(self):
"""Returns the directory where event file will be written."""
return self.event_writer.get_logdir()
def add_event(self, event):
"""Adds an event to the event file.
Args:
event: An `Event` protocol buffer.
"""
self.event_writer.add_event(event)
def flush(self):
"""Flushes the event file to disk.
Call this method to make sure that all pending events have been written to
disk.
"""
self.event_writer.flush()
def close(self):
"""Flushes the event file to disk and close the file.
Call this method when you do not need the summary writer anymore.
"""
self.event_writer.close()
def reopen(self):
"""Reopens the EventFileWriter.
Can be called after `close()` to add more events in the same directory.
The events will go into a new events file.
Does nothing if the EventFileWriter was not closed.
"""
self.event_writer.reopen()
class SummaryWriter(object):
"""Writes `Summary` directly to event files.
The `SummaryWriter` class provides a high-level api to create an event file in a
given directory and add summaries and events to it. The class updates the
file contents asynchronously. This allows a training program to call methods
to add data to the file directly from the training loop, without slowing down
training.
"""
def __init__(self, log_dir=None, comment=''):
"""
Args:
log_dir (string): save location, default is: runs/**CURRENT_DATETIME_HOSTNAME**, which changes after each
run. Use hierarchical folder structure to compare between runs easily. e.g. 'runs/exp1', 'runs/exp2'
comment (string): comment that appends to the default log_dir
"""
if not log_dir:
import socket
from datetime import datetime
current_time = datetime.now().strftime('%b%d_%H-%M-%S')
log_dir = os.path.join('runs', current_time + '_' + socket.gethostname() + comment)
self.file_writer = FileWriter(logdir=log_dir)
v = 1E-12
buckets = []
neg_buckets = []
while v < 1E20:
buckets.append(v)
neg_buckets.append(-v)
v *= 1.1
self.default_bins = neg_buckets[::-1] + [0] + buckets
self.text_tags = []
#
self.all_writers = {self.file_writer.get_logdir(): self.file_writer}
self.scalar_dict = {} # {writer_id : [[timestamp, step, value],...],...}
def __append_to_scalar_dict(self, tag, scalar_value, global_step,
timestamp):
"""This adds an entry to the self.scalar_dict datastructure with format
{writer_id : [[timestamp, step, value], ...], ...}.
"""
from .x2num import makenp
if tag not in self.scalar_dict.keys():
self.scalar_dict[tag] = []
self.scalar_dict[tag].append([timestamp, global_step, float(makenp(scalar_value))])
def add_scalar(self, tag, scalar_value, global_step=None):
"""Add scalar data to summary.
Args:
tag (string): Data identifier
scalar_value (float): Value to save
global_step (int): Global step value to record
"""
self.file_writer.add_summary(scalar(tag, scalar_value), global_step)
self.__append_to_scalar_dict(tag, scalar_value, global_step, time.time())
def add_scalars(self, main_tag, tag_scalar_dict, global_step=None):
"""Adds many scalar data to summary.
Args:
tag (string): Data identifier
main_tag (string): The parent name for the tags
tag_scalar_dict (dict): Key-value pair storing the tag and corresponding values
global_step (int): Global step value to record
Examples::
writer.add_scalars('run_14h',{'xsinx':i*np.sin(i/r),
'xcosx':i*np.cos(i/r),
'arctanx': numsteps*np.arctan(i/r)}, i)
# This function adds three values to the same scalar plot with the tag
# 'run_14h' in TensorBoard's scalar section.
"""
timestamp = time.time()
fw_logdir = self.file_writer.get_logdir()
for tag, scalar_value in tag_scalar_dict.items():
fw_tag = fw_logdir + "/" + main_tag + "/" + tag
if fw_tag in self.all_writers.keys():
fw = self.all_writers[fw_tag]
else:
fw = FileWriter(logdir=fw_tag)
self.all_writers[fw_tag] = fw
fw.add_summary(scalar(main_tag, scalar_value), global_step)
self.__append_to_scalar_dict(fw_tag, scalar_value, global_step, timestamp)
def export_scalars_to_json(self, path):
"""Exports to the given path an ASCII file containing all the scalars written
so far by this instance, with the following format:
{writer_id : [[timestamp, step, value], ...], ...}
"""
with open(path, "w") as f:
json.dump(self.scalar_dict, f)
def add_histogram(self, tag, values, global_step=None, bins='tensorflow'):
"""Add histogram to summary.
Args:
tag (string): Data identifier
values (numpy.array): Values to build histogram
global_step (int): Global step value to record
bins (string): one of {'tensorflow','auto', 'fd', ...}, this determines how the bins are made. You can find
other options in: https://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html
"""
if bins == 'tensorflow':
bins = self.default_bins
self.file_writer.add_summary(histogram(tag, values, bins), global_step)
def add_image(self, tag, img_tensor, global_step=None):
"""Add image data to summary.
Note that this requires the ``pillow`` package.
Args:
tag (string): Data identifier
img_tensor (torch.Tensor): Image data
global_step (int): Global step value to record
Shape:
img_tensor: :math:`(3, H, W)`. Use ``torchvision.utils.make_grid()`` to prepare it is a good idea.
"""
self.file_writer.add_summary(image(tag, img_tensor), global_step)
def add_audio(self, tag, snd_tensor, global_step=None, sample_rate=44100):
"""Add audio data to summary.
Args:
tag (string): Data identifier
snd_tensor (torch.Tensor): Sound data
global_step (int): Global step value to record
sample_rate (int): sample rate in Hz
Shape:
snd_tensor: :math:`(1, L)`. The values should lie between [-1, 1].
"""
self.file_writer.add_summary(audio(tag, snd_tensor, sample_rate=sample_rate), global_step)
def add_text(self, tag, text_string, global_step=None):
"""Add text data to summary.
Args:
tag (string): Data identifier
text_string (string): String to save
global_step (int): Global step value to record
Examples::
writer.add_text('lstm', 'This is an lstm', 0)
writer.add_text('rnn', 'This is an rnn', 10)
"""
self.file_writer.add_summary(text(tag, text_string), global_step)
if tag not in self.text_tags:
self.text_tags.append(tag)
extension_dir = self.file_writer.get_logdir() + '/plugins/tensorboard_text/'
if not os.path.exists(extension_dir):
os.makedirs(extension_dir)
with open(extension_dir + 'tensors.json', 'w') as fp:
json.dump(self.text_tags, fp)
def add_graph_onnx(self, prototxt):
self.file_writer.add_graph_onnx(gg(prototxt))
def add_graph(self, model, input_to_model, verbose=False):
# prohibit second call?
# no, let tensorboard handles it and show its warning message.
"""Add graph data to summary.
Args:
model (torch.nn.Module): model to draw.
input_to_model (torch.autograd.Variable): a variable or a tuple of variables to be fed.
"""
import torch
from distutils.version import LooseVersion
if LooseVersion(torch.__version__) >= LooseVersion("0.3.1"):
pass
else:
if LooseVersion(torch.__version__) >= LooseVersion("0.3.0"):
print('You are using PyTorch==0.3.0, use add_graph_onnx()')
return
if not hasattr(torch.autograd.Variable, 'grad_fn'):
print('add_graph() only supports PyTorch v0.2.')
return
self.file_writer.add_graph(graph(model, input_to_model, verbose))
def add_embedding(self, mat, metadata=None, label_img=None, global_step=None, tag='default'):
"""Add embedding projector data to summary.
Args:
mat (torch.Tensor): A matrix which each row is the feature vector of the data point
metadata (list): A list of labels, each element will be convert to string
label_img (torch.Tensor): Images correspond to each data point
global_step (int): Global step value to record
tag (string): Name for the embedding
Shape:
mat: :math:`(N, D)`, where N is number of data and D is feature dimension
label_img: :math:`(N, C, H, W)`
Examples::
import keyword
import torch
meta = []
while len(meta)<100:
meta = meta+keyword.kwlist # get some strings
meta = meta[:100]
for i, v in enumerate(meta):
meta[i] = v+str(i)
label_img = torch.rand(100, 3, 10, 32)
for i in range(100):
label_img[i]*=i/100.0
writer.add_embedding(torch.randn(100, 5), metadata=meta, label_img=label_img)
writer.add_embedding(torch.randn(100, 5), label_img=label_img)
writer.add_embedding(torch.randn(100, 5), metadata=meta)
"""
if global_step is None:
global_step = 0
# clear pbtxt?
save_path = os.path.join(self.file_writer.get_logdir(), str(global_step).zfill(5))
try:
os.makedirs(save_path)
except OSError:
print('warning: Embedding dir exists, did you set global_step for add_embedding()?')
if metadata is not None:
assert mat.size(0) == len(metadata), '#labels should equal with #data points'
make_tsv(metadata, save_path)
if label_img is not None:
assert mat.size(0) == label_img.size(0), '#images should equal with #data points'
make_sprite(label_img, save_path)
assert mat.dim() == 2, 'mat should be 2D, where mat.size(0) is the number of data points'
make_mat(mat.tolist(), save_path)
# new funcion to append to the config file a new embedding
append_pbtxt(metadata, label_img, self.file_writer.get_logdir(), str(global_step).zfill(5), tag)
def add_pr_curve(self, tag, labels, predictions, global_step=None, num_thresholds=127, weights=None):
"""Adds precision recall curve.
Args:
tag (string): Data identifier
labels (torch.Tensor): Ground truth data. Binary label for each element.
predictions (torch.Tensor): The probability that an element be classified as true. Value should in [0, 1]
global_step (int): Global step value to record
num_thresholds (int): Number of thresholds used to draw the curve.
"""
from .x2num import makenp
labels = makenp(labels)
predictions = makenp(predictions)
self.file_writer.add_summary(pr_curve(tag, labels, predictions, num_thresholds, weights), global_step)
def close(self):
if self.file_writer is None:
return # ignore double close
self.file_writer.flush()
self.file_writer.close()
for path, writer in self.all_writers.items():
writer.flush()
writer.close()
self.file_writer = self.all_writers = None
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.close()
+90
View File
@@ -0,0 +1,90 @@
# DO NOT alter/distruct/free input object !
import numpy as np
def makenp(x, modality=None):
# if already numpy, return
if isinstance(x, np.ndarray):
if modality == 'IMG' and x.dtype == np.uint8:
return x.astype(np.float32) / 255.0
return x
if np.isscalar(x):
return np.array([x])
if 'torch' in str(type(x)):
return pytorch_np(x, modality)
if 'chainer' in str(type(x)):
return chainer_np(x, modality)
if 'mxnet' in str(type(x)):
return mxnet_np(x, modality)
def pytorch_np(x, modality):
import torch
if isinstance(x, torch.autograd.Variable):
x = x.data
x = x.cpu().numpy()
if modality == 'IMG':
x = _prepare_image(x)
return x
def theano_np(x):
import theano
pass
def caffe2_np(x):
pass
def mxnet_np(x, modality):
x = x.asnumpy()
if modality == 'IMG':
x = _prepare_image(x)
return x
def chainer_np(x, modality):
import chainer
x = chainer.cuda.to_cpu(x.data)
if modality == 'IMG':
x = _prepare_image(x)
return x
def make_grid(I, ncols=8):
assert isinstance(I, np.ndarray), 'plugin error, should pass numpy array here'
assert I.ndim == 4 and I.shape[1] == 3
nimg = I.shape[0]
H = I.shape[2]
W = I.shape[3]
ncols = min(nimg, ncols)
nrows = int(np.ceil(float(nimg) / ncols))
canvas = np.zeros((3, H * nrows, W * ncols))
i = 0
for y in range(nrows):
for x in range(ncols):
if i >= nimg:
break
canvas[:, y * H:(y + 1) * H, x * W:(x + 1) * W] = I[i]
i = i + 1
return canvas
def _prepare_image(I):
assert isinstance(I, np.ndarray), 'plugin error, should pass numpy array here'
assert I.ndim == 2 or I.ndim == 3 or I.ndim == 4
if I.ndim == 4: # NCHW
if I.shape[1] == 1: # N1HW
I = np.concatenate((I, I, I), 1) # N3HW
assert I.shape[1] == 3
I = make_grid(I) # 3xHxW
if I.ndim == 3 and I.shape[0] == 1: # 1xHxW
I = np.concatenate((I, I, I), 0) # 3xHxW
if I.ndim == 2: # HxW
I = np.expand_dims(I, 0) # 1xHxW
I = np.concatenate((I, I, I), 0) # 3xHxW
I = I.transpose(1, 2, 0)
return I
+7 -5
View File
@@ -15,8 +15,9 @@ from PIL import Image
import lib.TestTransforms as transforms
from models.ColorVidNet import ColorVidNet
from models.FrameColor import frame_colorization
from models.NonlocalNet import VGG19_feature_color_torchversion, WarpNet
from utils.util import batch_lab2rgb_transpose_mc, folder2vid, mkdir_if_not, save_frames, tensor_lab2rgb, uncenter_l
from models.NonlocalNet import VGG19_pytorch, WarpNet
from utils.util import (batch_lab2rgb_transpose_mc, folder2vid, mkdir_if_not,
save_frames, tensor_lab2rgb, uncenter_l)
from utils.util_distortion import CenterPad, Normalize, RGB2Lab, ToTensor
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
@@ -36,7 +37,7 @@ def colorize_video(opt, input_path, reference_file, output_path, nonlocal_net, c
print("processing the folder:", input_path)
path, dirs, filenames = os.walk(input_path).__next__()
file_count = len(filenames)
filenames.sort()
filenames.sort(key=lambda f: int("".join(filter(str.isdigit, f) or -1)))
# NOTE: resize frames to 216*384
transform = transforms.Compose(
@@ -129,6 +130,7 @@ def colorize_video(opt, input_path, reference_file, output_path, nonlocal_net, c
# save the frames
save_frames(IA_predict_rgb, output_path, index)
# output video
video_name = "video.avi"
folder2vid(image_folder=output_path, output_dir=output_path, filename=video_name)
@@ -145,7 +147,7 @@ if __name__ == "__main__":
parser.add_argument("--clip_path", type=str, default="./sample_videos/clips/v32", help="path of input clips")
parser.add_argument("--ref_path", type=str, default="./sample_videos/ref/v32", help="path of refernce images")
parser.add_argument("--output_path", type=str, default="./sample_videos/output", help="path of output clips")
opt = parser.parse_args(args=[])
opt = parser.parse_args()
opt.gpu_ids = [int(x) for x in opt.gpu_ids.split(",")]
cudnn.benchmark = True
print("running on GPU", opt.gpu_ids)
@@ -156,7 +158,7 @@ if __name__ == "__main__":
nonlocal_net = WarpNet(1)
colornet = ColorVidNet(7)
vggnet = VGG19_feature_color_torchversion()
vggnet = VGG19_pytorch()
vggnet.load_state_dict(torch.load("data/vgg19_conv.pth"))
for param in vggnet.parameters():
param.requires_grad = False
+738
View File
@@ -0,0 +1,738 @@
from __future__ import print_function
import argparse
import math
import os
import queue
import time
import cv2
import torch
import torch.backends.cudnn as cudnn
import torch.nn as nn
import torch.optim as optim
import torchvision.transforms as transform_lib
from torch.utils.data import ConcatDataset, DataLoader, WeightedRandomSampler
from torchvision.transforms import CenterCrop
import lib.TrainTransforms as transforms
from lib.videoloader import VideosDataset
from lib.videoloader_imagenet import VideosDataset_ImageNet
from models.ColorVidNet import ColorVidNet
from models.ContextualLoss import ContextualLoss, ContextualLoss_forward
from models.FrameColor import frame_colorization
from models.GAN_models import Discriminator_x64
from models.NonlocalNet import (NonlocalWeightedAverage, VGG19_pytorch,
WarpNet, WeightedAverage,
WeightedAverage_color)
from tensorboardX import SummaryWriter
from utils.util import (batch_lab2rgb_transpose_mc, feature_normalize, l1_loss,
mkdir_if_not, mse_loss, parse, tensor_lab2rgb,
uncenter_l, weighted_l1_loss, weighted_mse_loss)
from utils.util_distortion import (CenterPad_threshold, Normalize, RGB2Lab,
ToTensor)
from utils.util_tensorboard import TBImageRecorder, value_logger
from utils.warping import WarpingLayer
cv2.setNumThreads(0)
parser = argparse.ArgumentParser()
parser.add_argument("--data_root", default="/home/zhanbo/remote/video/video_pair3/", type=str)
parser.add_argument("--data_root_imagenet", default="/home/zhanbo/remote/imagenet_ref_pair/", type=str)
parser.add_argument("--gpu_ids", type=str, default="0,1,2,3", help="separate by comma")
parser.add_argument("--workers", type=int, default=8)
parser.add_argument("--batch_size", type=int, default=16)
parser.add_argument("--image_size", type=int, default=[216, 384])
parser.add_argument("--ic", type=int, default=7)
parser.add_argument("--epoch", type=int, default=40)
parser.add_argument("--resume_epoch", type=int, default=0)
parser.add_argument("--resume", type=bool, default=False)
parser.add_argument("--load_pretrained_model", type=bool, default=True)
parser.add_argument("--lr", type=float, default=0.00001)
parser.add_argument("--beta1", type=float, default=0.5)
parser.add_argument("--lr_step", type=int, default=100)
parser.add_argument("--lr_gamma", type=float, default=0.1)
parser.add_argument("--checkpoint_dir", type=str, default="checkpoints/default")
parser.add_argument("--tb_log_step", type=int, default=50)
parser.add_argument("--print_step", type=int, default=2)
parser.add_argument("--real_reference_probability", type=float, default=0.7)
parser.add_argument("--nonzero_placeholder_probability", type=float, default=0.0)
parser.add_argument("--with_bad", type=bool, default=True)
parser.add_argument("--with_mid", type=bool, default=True)
parser.add_argument("--domain_invariant", type=bool, default=False)
parser.add_argument("--weigth_l1", type=float, default=2.0)
parser.add_argument("--weight_contextual", type=float, default="0.2")
parser.add_argument("--weight_perceptual", type=float, default="0.001")
parser.add_argument("--weight_smoothness", type=float, default="5.0")
parser.add_argument("--weight_gan", type=float, default="0.2")
parser.add_argument("--weight_nonlocal_smoothness", type=float, default="0.0")
parser.add_argument("--weight_nonlocal_consistent", type=float, default="0.0")
parser.add_argument("--weight_consistent", type=float, default="0.02")
parser.add_argument("--luminance_noise", type=float, default="2.0")
parser.add_argument("--permute_data", type=bool, default=True)
parser.add_argument("--contextual_loss_direction", type=str, default="forward", help="forward or backward matching")
def image_logger_fn(
I_last_lab,
I_current_lab,
I_reference_lab,
I_last_lab_predict,
I_current_lab_predict,
I_last_nonlocal_lab,
I_current_nonlocal_lab,
):
I_last_image = batch_lab2rgb_transpose_mc(I_last_lab[0:32, 0:1, :, :], I_last_lab[0:32, 1:3, :, :])
I_current_image = batch_lab2rgb_transpose_mc(I_current_lab[0:32, 0:1, :, :], I_current_lab[0:32, 1:3, :, :])
I_reference_image = batch_lab2rgb_transpose_mc(I_reference_lab[0:32, 0:1, :, :], I_reference_lab[0:32, 1:3, :, :])
I_last_image_predict = batch_lab2rgb_transpose_mc(
I_last_lab_predict[0:32, 0:1, :, :], I_last_lab_predict[0:32, 1:3, :, :]
)
I_current_image_predict = batch_lab2rgb_transpose_mc(
I_current_lab_predict[0:32, 0:1, :, :], I_current_lab_predict[0:32, 1:3, :, :]
)
I_last_nonlocal_image = batch_lab2rgb_transpose_mc(
I_last_nonlocal_lab[0:32, 0:1, :, :], I_last_nonlocal_lab[0:32, 1:3, :, :]
)
I_current_nonlocal_image = batch_lab2rgb_transpose_mc(
I_current_nonlocal_lab[0:32, 0:1, :, :], I_current_nonlocal_lab[0:32, 1:3, :, :]
)
img_info = {}
img_info["1_I_last"] = I_last_image
img_info["2_I_current"] = I_current_image
img_info["3_I_reference"] = I_reference_image
img_info["4_I_last_predict"] = I_last_image_predict
img_info["5_I_curren_predict"] = I_current_image_predict
img_info["6_I_last_nonlocal"] = I_last_nonlocal_image
img_info["7_I_current_nonlocal"] = I_current_nonlocal_image
return img_info
def training_logger():
try:
if total_iter % opt.print_step == 0:
print("processing time:", elapsed)
print(
"Epoch %d, Step[%d/%d], lr: %f, total_loss: %.2f"
% (
epoch,
((iter + 1) % iter_num_per_epoch),
iter_num_per_epoch,
step_optim_scheduler_g.get_last_lr()[0],
total_loss.item(),
)
)
value_logger(
tb_writer,
total_iter,
loss_info={
"l1_loss": l1_loss.item(),
"feat_loss": feat_loss.item(),
"contextual_loss_total": contextual_loss_total.item(),
"smoothness_loss": smoothness_loss.item(),
"nonlocal_smoothness_loss": nonlocal_smoothness_loss.item(),
"nonlocal_consistent_loss": nonlocal_consistent_loss.item(),
"consistent_loss": consistent_loss.item(),
"generator_loss": generator_loss.item(),
"discriminator_loss": discriminator_loss.item(),
"total_loss": total_loss.item(),
},
)
if total_iter % opt.tb_log_step == 0:
I_last_nonlocal_lab = torch.cat(
(I_last_lab[:, 0:1, :, :], I_last_nonlocal_lab_predict[:, 1:3, :, :]), dim=1
)
I_current_nonlocal_lab = torch.cat(
(I_current_lab[:, 0:1, :, :], I_current_nonlocal_lab_predict[:, 1:3, :, :]), dim=1
)
I_last_lab_predict = torch.cat((I_last_l, I_last_ab_predict), dim=1)
data_queue.put(
(
(
I_last_lab.cpu(),
I_current_lab.cpu(),
I_reference_lab.cpu(),
I_last_lab_predict.cpu(),
I_current_lab_predict.cpu(),
I_last_nonlocal_lab.cpu(),
I_current_nonlocal_lab,
),
total_iter,
)
)
if total_iter % 2000 == 0:
if len(opt.gpu_ids) > 1:
torch.save(
nonlocal_net.module.state_dict(),
os.path.join(opt.checkpoint_dir, "nonlocal_net_iter_%d.pth") % total_iter,
)
torch.save(
colornet.module.state_dict(),
os.path.join(opt.checkpoint_dir, "colornet_iter_%d.pth") % total_iter,
)
torch.save(
discriminator.module.state_dict(),
os.path.join(opt.checkpoint_dir, "discriminator_iter_%d.pth") % total_iter,
)
else:
torch.save(
nonlocal_net.state_dict(),
os.path.join(opt.checkpoint_dir, "nonlocal_net_iter_%d.pth") % total_iter,
)
torch.save(colornet.state_dict(), os.path.join(opt.checkpoint_dir, "colornet_iter_%d.pth") % total_iter)
torch.save(
discriminator.state_dict(),
os.path.join(opt.checkpoint_dir, "discriminator_iter_%d.pth") % total_iter,
)
# save the state for resume
if total_iter % 2000 == 0:
print("saving the checkpoint")
if len(opt.gpu_ids) > 1:
state = {
"total_iter": total_iter + 1,
"epoch": epoch,
"colornet_state": colornet.module.state_dict(),
"nonlocal_net_state": nonlocal_net.module.state_dict(),
"discriminator_state": discriminator.module.state_dict(),
"optimizer_g": optimizer_g.state_dict(),
"optimizer_d": optimizer_d.state_dict(),
"optimizer_schedule_g": step_optim_scheduler_g.state_dict(),
"optimizer_schedule_d": step_optim_scheduler_g.state_dict(),
}
else:
state = {
"total_iter": total_iter + 1,
"epoch": epoch,
"colornet_state": colornet.state_dict(),
"nonlocal_net_state": nonlocal_net.state_dict(),
"discriminator_state": discriminator.state_dict(),
"optimizer_g": optimizer_g.state_dict(),
"optimizer_d": optimizer_d.state_dict(),
"optimizer_schedule_g": step_optim_scheduler_g.state_dict(),
"optimizer_schedule_d": step_optim_scheduler_d.state_dict(),
}
torch.save(state, os.path.join(opt.checkpoint_dir, "learning_checkpoint.pth"))
except Exception as e:
print("Exception during output")
print(e)
def gpu_setup():
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
cudnn.benchmark = True
opt.gpu_ids = [int(x) for x in opt.gpu_ids.split(",")]
torch.cuda.set_device(opt.gpu_ids[0])
device = torch.device("cuda")
print("running on GPU", opt.gpu_ids)
return device
def load_data():
print("initializing dataloader")
transforms_video = [
CenterCrop(opt.image_size),
RGB2Lab(),
ToTensor(),
Normalize(),
]
transforms_imagenet = [CenterPad_threshold(opt.image_size), RGB2Lab(), ToTensor(), Normalize()]
extra_reference_transform = [
transform_lib.RandomHorizontalFlip(0.5),
transform_lib.RandomResizedCrop(480, (0.98, 1.0), ratio=(0.8, 1.2)),
]
train_dataset_video = VideosDataset(
data_root=opt.data_root,
epoch=opt.epoch,
image_size=opt.image_size,
image_transform=transforms.Compose(transforms_video),
real_reference_probability=opt.real_reference_probability,
nonzero_placeholder_probability=opt.nonzero_placeholder_probability,
)
train_dataset_imagenet = VideosDataset_ImageNet(
data_root=opt.data_root_imagenet,
image_size=opt.image_size,
epoch=opt.epoch,
with_bad=opt.with_bad,
with_mid=opt.with_mid,
transforms_imagenet=transforms_imagenet,
distortion_level=4,
brightnessjitter=5,
nonzero_placeholder_probability=opt.nonzero_placeholder_probability,
extra_reference_transform=extra_reference_transform,
real_reference_probability=opt.real_reference_probability,
)
video_training_length = len(train_dataset_video)
imagenet_training_length = len(train_dataset_imagenet)
dataset_training_length = train_dataset_video.real_len + train_dataset_imagenet.real_len
dataset_combined = ConcatDataset([train_dataset_video, train_dataset_imagenet])
sampler = WeightedRandomSampler(
[1] * video_training_length + [1] * imagenet_training_length, dataset_training_length * opt.epoch
)
data_loader = DataLoader(
dataset_combined,
batch_size=opt.batch_size,
shuffle=False,
num_workers=opt.workers,
pin_memory=True,
drop_last=True,
sampler=sampler,
)
return dataset_training_length, train_dataset_video, train_dataset_imagenet, data_loader
def define_loss():
print("defining loss")
ab_criterion = nn.SmoothL1Loss().to(device)
nonlocal_criterion = nn.SmoothL1Loss().to(device)
feat_l2_criterion = nn.MSELoss().to(device)
feat_l1_criterion = nn.SmoothL1Loss().to(device)
contextual_loss = ContextualLoss().to(device)
contextual_forward_loss = ContextualLoss_forward().to(device)
BCE_stable = nn.BCEWithLogitsLoss().to(device)
return contextual_loss, contextual_forward_loss
def define_optimizer():
print("defining optimizer")
optimizer_g = optim.Adam(
[{"params": nonlocal_net.parameters(), "lr": 1e-5}, {"params": colornet.parameters(), "lr": 2e-4}],
betas=(0.5, 0.999),
eps=1e-5,
amsgrad=True,
)
optimizer_d = optim.Adam(
filter(lambda p: p.requires_grad, discriminator.parameters()), lr=2 * 1e-4, betas=(0.5, 0.999)
)
return optimizer_g, optimizer_d
def resume_model():
print("resuming the learning")
checkpoint = torch.load(os.path.join(opt.checkpoint_dir, "learning_checkpoint.pth"))
total_iter = checkpoint["total_iter"]
epoch = checkpoint["epoch"]
colornet.load_state_dict(checkpoint["colornet_state"])
nonlocal_net.load_state_dict(checkpoint["nonlocal_net_state"])
discriminator.load_state_dict(checkpoint["discriminator_state"])
optimizer_g.load_state_dict(checkpoint["optimizer_g"])
optimizer_d.load_state_dict(checkpoint["optimizer_d"])
step_optim_scheduler_g.load_state_dict(checkpoint["optimizer_schedule_g"])
step_optim_scheduler_d.load_state_dict(checkpoint["optimizer_schedule_d"])
def to_device(
colornet,
nonlocal_net,
discriminator,
vggnet,
contextual_loss,
contextual_forward_loss,
weighted_layer_color,
nonlocal_weighted_layer,
warping_layer,
instancenorm,
):
print("moving models to device")
colornet = torch.nn.DataParallel(colornet.to(device), device_ids=opt.gpu_ids)
nonlocal_net = torch.nn.DataParallel(nonlocal_net.to(device), device_ids=opt.gpu_ids)
discriminator = torch.nn.DataParallel(discriminator.to(device), device_ids=opt.gpu_ids)
vggnet = torch.nn.DataParallel(vggnet.to(device), device_ids=opt.gpu_ids)
contextual_loss = torch.nn.DataParallel(contextual_loss.to(device), device_ids=opt.gpu_ids)
contextual_forward_loss = torch.nn.DataParallel(contextual_forward_loss.to(device), device_ids=opt.gpu_ids)
weighted_layer_color = torch.nn.DataParallel(weighted_layer_color.to(device), device_ids=opt.gpu_ids)
nonlocal_weighted_layer = torch.nn.DataParallel(nonlocal_weighted_layer.to(device), device_ids=opt.gpu_ids)
warping_layer = torch.nn.DataParallel(warping_layer.to(device), device_ids=opt.gpu_ids)
instancenorm = torch.nn.DataParallel(instancenorm.to(device), device_ids=opt.gpu_ids)
return (
vggnet,
nonlocal_net,
colornet,
discriminator,
instancenorm,
contextual_loss,
contextual_forward_loss,
weighted_layer_color,
nonlocal_weighted_layer,
warping_layer,
)
def loss_init():
print("initializing losses")
zero_loss = torch.Tensor([0]).to(device)
(
feat_loss,
contextual_loss_total,
smoothness_loss,
nonlocal_smoothness_loss,
consistent_loss,
nonlocal_consistent_loss,
generator_loss,
discriminator_loss,
) = (zero_loss, zero_loss, zero_loss, zero_loss, zero_loss, zero_loss, zero_loss, zero_loss)
return (
feat_loss,
contextual_loss_total,
smoothness_loss,
nonlocal_smoothness_loss,
consistent_loss,
nonlocal_consistent_loss,
generator_loss,
discriminator_loss,
)
def video_colorization():
# colorization for the last frame
I_last_ab_predict, I_last_nonlocal_lab_predict, features_last_gray = frame_colorization(
I_last_lab,
I_reference_lab,
placeholder_lab,
features_B,
vggnet,
nonlocal_net,
colornet,
feature_noise=0,
luminance_noise=opt.luminance_noise,
)
I_last_lab_predict = torch.cat((I_last_l, I_last_ab_predict), dim=1)
# colorization for the current frame
I_current_ab_predict, I_current_nonlocal_lab_predict, features_current_gray = frame_colorization(
I_current_lab,
I_reference_lab,
I_last_lab_predict,
features_B,
vggnet,
nonlocal_net,
colornet,
feature_noise=0,
luminance_noise=opt.luminance_noise,
)
I_current_lab_predict = torch.cat((I_last_l, I_current_ab_predict), dim=1)
return I_current_ab_predict, I_last_ab_predict, I_current_nonlocal_lab_predict, I_last_nonlocal_lab_predict
if __name__ == "__main__":
torch.multiprocessing.set_start_method("spawn", force=True)
opt = parse(parser)
opt.data_root = opt.data_root.split(",")[0]
opt.data_root_imagenet = opt.data_root_imagenet.split(",")[0]
mkdir_if_not(opt.checkpoint_dir)
mkdir_if_not("./runs/")
device = gpu_setup()
dataset_training_length, train_dataset_video, train_dataset_imagenet, data_loader = load_data()
tb_writer = SummaryWriter()
data_queue = queue.Queue()
tb_image_reorder = TBImageRecorder(tb_writer, image_logger_fn, data_queue)
tb_image_reorder.start()
# define network
nonlocal_net = WarpNet(opt.batch_size)
colornet = ColorVidNet(opt.ic)
discriminator = Discriminator_x64(ndf=64)
colornet.to(device)
nonlocal_net.to(device)
discriminator.to(device)
weighted_layer = WeightedAverage()
weighted_layer_color = WeightedAverage_color()
nonlocal_weighted_layer = NonlocalWeightedAverage()
instancenorm = nn.InstanceNorm2d(512, affine=False)
warping_layer = WarpingLayer("gpu")
vggnet = VGG19_pytorch()
vggnet.load_state_dict(torch.load("data/vgg19_conv.pth"))
vggnet.eval()
for param in vggnet.parameters():
param.requires_grad = False
# load pre-trained model
if opt.load_pretrained_model:
nonlocal_pretain_path = os.path.join("checkpoints/video_moredata_l1/", "nonlocal_net_iter_76000.pth")
nonlocal_net.load_state_dict(torch.load(nonlocal_pretain_path))
color_test_path = "checkpoints/video_moredata_l1/" + "colornet_iter_76000.pth"
colornet.load_state_dict(torch.load(color_test_path))
# define loss function
contextual_loss, contextual_forward_loss = define_loss()
# define optimizer
optimizer_g, optimizer_d = define_optimizer()
step_optim_scheduler_g = optim.lr_scheduler.StepLR(optimizer_g, step_size=opt.lr_step, gamma=opt.lr_gamma)
step_optim_scheduler_d = optim.lr_scheduler.StepLR(optimizer_d, step_size=opt.lr_step, gamma=opt.lr_gamma)
# define others
downsampling_by2 = nn.AvgPool2d(kernel_size=2).to(device)
downsampling_by4 = nn.AvgPool2d(kernel_size=4).to(device)
# dataset info
iter_num_per_epoch = dataset_training_length // opt.batch_size
total_iter = opt.resume_epoch * iter_num_per_epoch
print(
"train_dataset info, real_len: %d, epoch_len: %d, iter_num_per_epoch: %d"
% (dataset_training_length, len(train_dataset_video) + len(train_dataset_imagenet), iter_num_per_epoch)
)
if opt.resume:
resume_model()
# move to GPU processing
device = opt.gpu_ids[0]
(
vggnet,
nonlocal_net,
colornet,
discriminator,
instancenorm,
contextual_loss,
contextual_forward_loss,
weighted_layer_color,
nonlocal_weighted_layer,
warping_layer,
) = to_device(
colornet,
nonlocal_net,
discriminator,
vggnet,
contextual_loss,
contextual_forward_loss,
weighted_layer_color,
nonlocal_weighted_layer,
warping_layer,
instancenorm,
)
(
feat_loss,
contextual_loss_total,
smoothness_loss,
nonlocal_smoothness_loss,
consistent_loss,
nonlocal_consistent_loss,
generator_loss,
discriminator_loss,
) = loss_init()
# %% Training
print("start training")
for iter, data in enumerate(data_loader):
start_time = time.time()
total_iter += 1
epoch = math.ceil(total_iter / iter_num_per_epoch)
###### LOADING DATA SAMPLE ######
(
I_last_lab,
I_current_lab,
I_reference_lab,
flow_forward,
flow_backward,
mask,
placeholder_lab,
self_ref_flag,
) = data
I_last_lab = I_last_lab.to(device)
I_current_lab = I_current_lab.to(device)
I_reference_lab = I_reference_lab.to(device)
flow_forward = flow_forward.to(device)
flow_backward = flow_backward.to(device)
mask = mask.to(device)
placeholder_lab = placeholder_lab.to(device)
self_ref_flag = self_ref_flag.to(device)
I_last_l = I_last_lab[:, 0:1, :, :]
I_last_ab = I_last_lab[:, 1:3, :, :]
I_current_l = I_current_lab[:, 0:1, :, :]
I_current_ab = I_current_lab[:, 1:3, :, :]
I_reference_l = I_reference_lab[:, 0:1, :, :]
I_reference_ab = I_reference_lab[:, 1:3, :, :]
I_reference_rgb = tensor_lab2rgb(torch.cat((uncenter_l(I_reference_l), I_reference_ab), dim=1))
features_B = vggnet(I_reference_rgb, ["r12", "r22", "r32", "r42", "r52"], preprocess=True)
###### COLORIZATION ######
(
I_current_ab_predict,
I_last_ab_predict,
I_current_nonlocal_lab_predict,
I_last_nonlocal_lab_predict,
) = video_colorization()
###### UPDATE DISCRIMINATOR ######
if opt.weight_gan > 0:
optimizer_g.zero_grad()
optimizer_d.zero_grad()
fake_data_lab = torch.cat(
(uncenter_l(I_current_l), I_current_ab_predict, uncenter_l(I_last_l), I_last_ab_predict), dim=1
)
real_data_lab = torch.cat((uncenter_l(I_current_l), I_current_ab, uncenter_l(I_last_l), I_last_ab), dim=1)
if opt.permute_data:
batch_index = torch.arange(-1, opt.batch_size - 1, dtype=torch.long)
real_data_lab = real_data_lab[batch_index, ...]
y_pred_fake, feature_pred_fake = discriminator(fake_data_lab.detach())
y_pred_real, feature_pred_real = discriminator(real_data_lab.detach())
y = torch.ones_like(y_pred_real)
y2 = torch.zeros_like(y_pred_real)
discriminator_loss = (
torch.mean((y_pred_real - torch.mean(y_pred_fake) - y) ** 2)
+ torch.mean((y_pred_fake - torch.mean(y_pred_real) + y) ** 2)
) / 2
discriminator_loss.backward()
optimizer_d.step()
###### UPDATE GENERATOR ######
optimizer_g.zero_grad()
optimizer_d.zero_grad()
# extract vgg features for both output and original image
I_predict_rgb = tensor_lab2rgb(torch.cat((uncenter_l(I_current_l), I_current_ab_predict), dim=1))
predict_relu1_1, predict_relu2_1, predict_relu3_1, predict_relu4_1, predict_relu5_1 = vggnet(
I_predict_rgb, ["r12", "r22", "r32", "r42", "r52"], preprocess=True
)
I_current_rgb = tensor_lab2rgb(torch.cat((uncenter_l(I_current_l), I_current_ab), dim=1))
A_relu1_1, A_relu2_1, A_relu3_1, A_relu4_1, A_relu5_1 = vggnet(
I_current_rgb, ["r12", "r22", "r32", "r42", "r52"], preprocess=True
)
B_relu1_1, B_relu2_1, B_relu3_1, B_relu4_1, B_relu5_1 = features_B
###### LOSS COMPUTE ######
# l1 loss
if opt.weigth_l1 > 0:
sample_weights = (self_ref_flag[:, 1:3, :, :]) / (sum(self_ref_flag[:, 0, 0, 0]) + 1e-5)
l1_loss = weighted_l1_loss(I_current_ab_predict, I_current_ab, sample_weights) * opt.weigth_l1
# generator loss
if opt.weight_gan > 0:
y_pred_fake, feature_pred_fake = discriminator(fake_data_lab)
y_pred_real, feature_pred_real = discriminator(real_data_lab)
generator_loss = (
(
torch.mean((y_pred_real - torch.mean(y_pred_fake) + y) ** 2)
+ torch.mean((y_pred_fake - torch.mean(y_pred_real) - y) ** 2)
)
/ 2
* opt.weight_gan
)
# feature loss
if opt.domain_invariant:
feat_loss = (
mse_loss(instancenorm(predict_relu5_1), instancenorm(A_relu5_1.detach()))
* opt.weight_perceptual
* 1e5
* 0.2
)
else:
feat_loss = mse_loss(predict_relu5_1, A_relu5_1.detach()) * opt.weight_perceptual
# contextual loss
if opt.contextual_loss_direction == "backward":
contextual_style5_1 = torch.mean(contextual_loss(predict_relu5_1, B_relu5_1.detach())) * 8
contextual_style4_1 = torch.mean(contextual_loss(predict_relu4_1, B_relu4_1.detach())) * 4
contextual_style3_1 = (
torch.mean(contextual_loss(downsampling_by2(predict_relu3_1), downsampling_by2(B_relu3_1.detach()))) * 2
)
else:
contextual_style5_1 = torch.mean(contextual_forward_loss(predict_relu5_1, B_relu5_1.detach())) * 8
contextual_style4_1 = torch.mean(contextual_forward_loss(predict_relu4_1, B_relu4_1.detach())) * 4
contextual_style3_1 = (
torch.mean(
contextual_forward_loss(downsampling_by2(predict_relu3_1), downsampling_by2(B_relu3_1.detach()))
)
* 2
)
if opt.weight_contextual > 0:
contextual_loss_total = (
contextual_style5_1 + contextual_style4_1 + contextual_style3_1
) * opt.weight_contextual
# smoothness loss
if opt.weight_smoothness > 0:
scale_factor = 1
I_current_lab_predict = torch.cat((I_current_l, I_current_ab_predict), dim=1)
IA_ab_weighed = weighted_layer_color(
I_current_lab, I_current_lab_predict, patch_size=3, alpha=10, scale_factor=scale_factor
)
smoothness_loss = (
mse_loss(nn.functional.interpolate(I_current_ab_predict, scale_factor=scale_factor), IA_ab_weighed)
* opt.weight_smoothness
)
if opt.weight_nonlocal_smoothness > 0:
scale_factor = 0.25
alpha_nonlocal_smoothness = 0.5
nonlocal_smooth_feature = feature_normalize(A_relu2_1)
I_current_lab_predict = torch.cat((I_current_l, I_current_ab_predict), dim=1)
I_current_ab_weighted_nonlocal = nonlocal_weighted_layer(
I_current_lab_predict,
nonlocal_smooth_feature.detach(),
patch_size=3,
alpha=alpha_nonlocal_smoothness,
scale_factor=scale_factor,
)
nonlocal_smoothness_loss = (
mse_loss(
nn.functional.interpolate(I_current_ab_predict, scale_factor=scale_factor),
I_current_ab_weighted_nonlocal,
)
* opt.weight_nonlocal_smoothness
)
if opt.weight_consistent:
I_current_lab_predict_warp = warping_layer(I_current_lab_predict, flow_forward)
I_current_ab_predict_warp = I_current_lab_predict_warp[:, 1:3, :, :]
consistent_loss = (
weighted_mse_loss(I_current_ab_predict_warp, I_last_ab_predict, mask) * opt.weight_consistent
)
if opt.weight_nonlocal_consistent:
I_current_nonlocal_lab_predict_warp = warping_layer(I_current_nonlocal_lab_predict, flow_forward)
nonlocal_consistent_loss = (
weighted_mse_loss(
I_current_nonlocal_lab_predict_warp[:, 1:3, :, :], I_last_nonlocal_lab_predict[:, 1:3, :, :], mask
)
* opt.weight_nonlocal_consistent
)
# total loss
total_loss = (
l1_loss
+ feat_loss
+ contextual_loss_total
+ smoothness_loss
+ nonlocal_smoothness_loss
+ consistent_loss
+ nonlocal_consistent_loss
+ generator_loss
)
total_loss.backward()
optimizer_g.step()
end_time = time.time()
elapsed = end_time - start_time
training_logger()
step_optim_scheduler_g.step()
step_optim_scheduler_d.step()
data_queue.put((None, None))
+523
View File
@@ -0,0 +1,523 @@
#!/usr/bin/python
"""
# ==============================
# flowlib.py
# library for optical flow processing
# Author: Ruoteng Li
# Date: 6th Aug 2016
# ==============================
"""
import matplotlib.colors as cl
import matplotlib.pyplot as plt
import numpy as np
import png
from PIL import Image
UNKNOWN_FLOW_THRESH = 1e7
SMALLFLOW = 0.0
LARGEFLOW = 1e8
"""
=============
Flow Section
=============
"""
def show_flow(filename):
"""
visualize optical flow map using matplotlib
:param filename: optical flow file
:return: None
"""
flow = read_flow(filename)
img = flow_to_image(flow)
plt.imshow(img)
plt.show()
def visualize_flow(flow, mode="Y"):
"""
this function visualize the input flow
:param flow: input flow in array
:param mode: choose which color mode to visualize the flow (Y: Ccbcr, RGB: RGB color)
:return: None
"""
if mode == "Y":
# Ccbcr color wheel
img = flow_to_image(flow)
plt.imshow(img)
plt.show()
elif mode == "RGB":
(h, w) = flow.shape[0:2]
du = flow[:, :, 0]
dv = flow[:, :, 1]
valid = flow[:, :, 2]
max_flow = max(np.max(du), np.max(dv))
img = np.zeros((h, w, 3), dtype=np.float64)
# angle layer
img[:, :, 0] = np.arctan2(dv, du) / (2 * np.pi)
# magnitude layer, normalized to 1
img[:, :, 1] = np.sqrt(du * du + dv * dv) * 8 / max_flow
# phase layer
img[:, :, 2] = 8 - img[:, :, 1]
# clip to [0,1]
small_idx = img[:, :, 0:3] < 0
large_idx = img[:, :, 0:3] > 1
img[small_idx] = 0
img[large_idx] = 1
# convert to rgb
img = cl.hsv_to_rgb(img)
# remove invalid point
img[:, :, 0] = img[:, :, 0] * valid
img[:, :, 1] = img[:, :, 1] * valid
img[:, :, 2] = img[:, :, 2] * valid
# show
plt.imshow(img)
plt.show()
return None
def read_flow(filename):
"""
read optical flow from Middlebury .flo file
:param filename: name of the flow file
:return: optical flow data in matrix
"""
f = open(filename, "rb")
try:
magic = np.fromfile(f, np.float32, count=1)[0] # For Python3.x
except:
magic = np.fromfile(f, np.float32, count=1) # For Python2.x
data2d = None
if 202021.25 != magic:
print("Magic number incorrect. Invalid .flo file")
else:
w = np.fromfile(f, np.int32, count=1)[0]
h = np.fromfile(f, np.int32, count=1)[0]
# print("Reading %d x %d flo file" % (h, w))
data2d = np.fromfile(f, np.float32, count=2 * w * h)
# reshape data into 3D array (columns, rows, channels)
data2d = np.resize(data2d, (h, w, 2))
f.close()
return data2d
def read_flow_png(flow_file):
"""
Read optical flow from KITTI .png file
:param flow_file: name of the flow file
:return: optical flow data in matrix
"""
flow_object = png.Reader(filename=flow_file)
flow_direct = flow_object.asDirect()
flow_data = list(flow_direct[2])
(w, h) = flow_direct[3]["size"]
flow = np.zeros((h, w, 3), dtype=np.float64)
for i in range(len(flow_data)):
flow[i, :, 0] = flow_data[i][0::3]
flow[i, :, 1] = flow_data[i][1::3]
flow[i, :, 2] = flow_data[i][2::3]
invalid_idx = flow[:, :, 2] == 0
flow[:, :, 0:2] = (flow[:, :, 0:2] - 2 ** 15) / 64.0
flow[invalid_idx, 0] = 0
flow[invalid_idx, 1] = 0
return flow
def write_flow(flow, filename):
"""
write optical flow in Middlebury .flo format
:param flow: optical flow map
:param filename: optical flow file path to be saved
:return: None
"""
with open(filename, "wb") as f:
magic = np.array([202021.25], dtype=np.float32)
(height, width) = flow.shape[0:2]
w = np.array([width], dtype=np.int32)
h = np.array([height], dtype=np.int32)
magic.tofile(f)
w.tofile(f)
h.tofile(f)
flow.tofile(f)
def segment_flow(flow):
h = flow.shape[0]
w = flow.shape[1]
u = flow[:, :, 0]
v = flow[:, :, 1]
idx = (abs(u) > LARGEFLOW) | (abs(v) > LARGEFLOW)
idx2 = abs(u) == SMALLFLOW
class0 = (v == 0) & (u == 0)
u[idx2] = 0.00001
tan_value = v / u
class1 = (tan_value < 1) & (tan_value >= 0) & (u > 0) & (v >= 0)
class2 = (tan_value >= 1) & (u >= 0) & (v >= 0)
class3 = (tan_value < -1) & (u <= 0) & (v >= 0)
class4 = (tan_value < 0) & (tan_value >= -1) & (u < 0) & (v >= 0)
class8 = (tan_value >= -1) & (tan_value < 0) & (u > 0) & (v <= 0)
class7 = (tan_value < -1) & (u >= 0) & (v <= 0)
class6 = (tan_value >= 1) & (u <= 0) & (v <= 0)
class5 = (tan_value >= 0) & (tan_value < 1) & (u < 0) & (v <= 0)
seg = np.zeros((h, w))
seg[class1] = 1
seg[class2] = 2
seg[class3] = 3
seg[class4] = 4
seg[class5] = 5
seg[class6] = 6
seg[class7] = 7
seg[class8] = 8
seg[class0] = 0
seg[idx] = 0
return seg
def flow_error(tu, tv, u, v):
"""
Calculate average end point error
:param tu: ground-truth horizontal flow map
:param tv: ground-truth vertical flow map
:param u: estimated horizontal flow map
:param v: estimated vertical flow map
:return: End point error of the estimated flow
"""
smallflow = 0.0
"""
stu = tu[bord+1:end-bord,bord+1:end-bord]
stv = tv[bord+1:end-bord,bord+1:end-bord]
su = u[bord+1:end-bord,bord+1:end-bord]
sv = v[bord+1:end-bord,bord+1:end-bord]
"""
stu = tu[:]
stv = tv[:]
su = u[:]
sv = v[:]
idxUnknow = (abs(stu) > UNKNOWN_FLOW_THRESH) | (abs(stv) > UNKNOWN_FLOW_THRESH)
stu[idxUnknow] = 0
stv[idxUnknow] = 0
su[idxUnknow] = 0
sv[idxUnknow] = 0
ind2 = [(np.absolute(stu) > smallflow) | (np.absolute(stv) > smallflow)]
index_su = su[ind2]
index_sv = sv[ind2]
an = 1.0 / np.sqrt(index_su ** 2 + index_sv ** 2 + 1)
un = index_su * an
vn = index_sv * an
index_stu = stu[ind2]
index_stv = stv[ind2]
tn = 1.0 / np.sqrt(index_stu ** 2 + index_stv ** 2 + 1)
tun = index_stu * tn
tvn = index_stv * tn
"""
angle = un * tun + vn * tvn + (an * tn)
index = [angle == 1.0]
angle[index] = 0.999
ang = np.arccos(angle)
mang = np.mean(ang)
mang = mang * 180 / np.pi
"""
epe = np.sqrt((stu - su) ** 2 + (stv - sv) ** 2)
epe = epe[ind2]
return np.mean(epe)
def flow_to_image(flow, display=False):
"""
Convert flow into middlebury color code image
:param flow: optical flow map
:return: optical flow image in middlebury color
"""
u = flow[:, :, 0]
v = flow[:, :, 1]
maxu = -999.0
maxv = -999.0
minu = 999.0
minv = 999.0
idxUnknow = (abs(u) > UNKNOWN_FLOW_THRESH) | (abs(v) > UNKNOWN_FLOW_THRESH)
u[idxUnknow] = 0
v[idxUnknow] = 0
maxu = max(maxu, np.max(u))
minu = min(minu, np.min(u))
maxv = max(maxv, np.max(v))
minv = min(minv, np.min(v))
rad = np.sqrt(u ** 2 + v ** 2)
maxrad = max(-1, np.max(rad))
if display:
print("max flow: %.4f\nflow range:\nu = %.3f .. %.3f\nv = %.3f .. %.3f" % (maxrad, minu, maxu, minv, maxv))
u = u / (maxrad + np.finfo(float).eps)
v = v / (maxrad + np.finfo(float).eps)
img = compute_color(u, v)
idx = np.repeat(idxUnknow[:, :, np.newaxis], 3, axis=2)
img[idx] = 0
return np.uint8(img)
def evaluate_flow_file(gt, pred):
"""
evaluate the estimated optical flow end point error according to ground truth provided
:param gt: ground truth file path
:param pred: estimated optical flow file path
:return: end point error, float32
"""
# Read flow files and calculate the errors
gt_flow = read_flow(gt) # ground truth flow
eva_flow = read_flow(pred) # predicted flow
# Calculate errors
average_pe = flow_error(gt_flow[:, :, 0], gt_flow[:, :, 1], eva_flow[:, :, 0], eva_flow[:, :, 1])
return average_pe
def evaluate_flow(gt_flow, pred_flow):
"""
gt: ground-truth flow
pred: estimated flow
"""
return flow_error(
gt_flow[:, :, 0],
gt_flow[:, :, 1],
pred_flow[:, :, 0],
pred_flow[:, :, 1],
)
"""
==============
Disparity Section
==============
"""
def read_disp_png(file_name):
"""
Read optical flow from KITTI .png file
:param file_name: name of the flow file
:return: optical flow data in matrix
"""
image_object = png.Reader(filename=file_name)
image_direct = image_object.asDirect()
image_data = list(image_direct[2])
(w, h) = image_direct[3]["size"]
channel = len(image_data[0]) / w
flow = np.zeros((h, w, channel), dtype=np.uint16)
for i in range(len(image_data)):
for j in range(channel):
flow[i, :, j] = image_data[i][j::channel]
return flow[:, :, 0] / 256
def disp_to_flowfile(disp, filename):
"""
Read KITTI disparity file in png format
:param disp: disparity matrix
:param filename: the flow file name to save
:return: None
"""
f = open(filename, "wb")
magic = np.array([202021.25], dtype=np.float32)
(height, width) = disp.shape[0:2]
w = np.array([width], dtype=np.int32)
h = np.array([height], dtype=np.int32)
empty_map = np.zeros((height, width), dtype=np.float32)
data = np.dstack((disp, empty_map))
magic.tofile(f)
w.tofile(f)
h.tofile(f)
data.tofile(f)
f.close()
"""
==============
Image Section
==============
"""
def read_image(filename):
"""
Read normal image of any format
:param filename: name of the image file
:return: image data in matrix uint8 type
"""
img = Image.open(filename)
return np.array(img)
def warp_image(im, flow):
"""
Use optical flow to warp image to the next
:param im: image to warp
:param flow: optical flow
:return: warped image
"""
from scipy import interpolate
image_height = im.shape[0]
image_width = im.shape[1]
flow_height = flow.shape[0]
flow_width = flow.shape[1]
n = image_height * image_width
(iy, ix) = np.float32(np.mgrid[0:image_height, 0:image_width])
(fy, fx) = np.float32(np.mgrid[0:flow_height, 0:flow_width])
fx += flow[:, :, 0].astype(np.float)
fy += flow[:, :, 1]
mask = np.logical_or(fx < 0, fx > flow_width)
mask = np.logical_or(mask, fy < 0)
mask = np.logical_or(mask, fy > flow_height)
fx = np.minimum(np.maximum(fx, 0), flow_width)
fy = np.minimum(np.maximum(fy, 0), flow_height)
points = np.concatenate((ix.reshape(n, 1), iy.reshape(n, 1)), axis=1)
xi = np.concatenate((fx.reshape(n, 1), fy.reshape(n, 1)), axis=1)
warp = np.zeros((image_height, image_width, im.shape[2]))
for i in range(im.shape[2]):
channel = im[:, :, i]
# plt.imshow(channel, cmap='gray')
values = channel.reshape(n, 1)
new_channel = interpolate.griddata(points, values, xi, method="cubic")
new_channel = np.reshape(new_channel, [flow_height, flow_width])
new_channel[mask] = 1
warp[:, :, i] = new_channel.astype(np.uint8)
return warp.astype(np.uint8)
"""
==============
Others
==============
"""
def scale_image(image, new_range):
"""
Linearly scale the image into desired range
:param image: input image
:param new_range: the new range to be aligned
:return: image normalized in new range
"""
min_val = np.min(image).astype(np.float32)
max_val = np.max(image).astype(np.float32)
min_val_new = np.array(min(new_range), dtype=np.float32)
max_val_new = np.array(max(new_range), dtype=np.float32)
scaled_image = (image - min_val) / (max_val - min_val) * (max_val_new - min_val_new) + min_val_new
return scaled_image.astype(np.uint8)
def compute_color(u, v):
"""
compute optical flow color map
:param u: optical flow horizontal map
:param v: optical flow vertical map
:return: optical flow in color code
"""
[h, w] = u.shape
img = np.zeros([h, w, 3])
nanIdx = np.isnan(u) | np.isnan(v)
u[nanIdx] = 0
v[nanIdx] = 0
colorwheel = make_color_wheel()
ncols = np.size(colorwheel, 0)
rad = np.sqrt(u ** 2 + v ** 2)
a = np.arctan2(-v, -u) / np.pi
fk = (a + 1) / 2 * (ncols - 1) + 1
k0 = np.floor(fk).astype(int)
k1 = k0 + 1
k1[k1 == ncols + 1] = 1
f = fk - k0
for i in range(np.size(colorwheel, 1)):
tmp = colorwheel[:, i]
col0 = tmp[k0 - 1] / 255
col1 = tmp[k1 - 1] / 255
col = (1 - f) * col0 + f * col1
idx = rad <= 1
col[idx] = 1 - rad[idx] * (1 - col[idx])
notidx = np.logical_not(idx)
col[notidx] *= 0.75
img[:, :, i] = np.uint8(np.floor(255 * col * (1 - nanIdx)))
return img
def make_color_wheel():
"""
Generate color wheel according Middlebury color code
:return: Color wheel
"""
RY = 15
YG = 6
GC = 4
CB = 11
BM = 13
MR = 6
ncols = RY + YG + GC + CB + BM + MR
colorwheel = np.zeros([ncols, 3])
col = 0
# RY
colorwheel[0:RY, 0] = 255
colorwheel[0:RY, 1] = np.transpose(np.floor(255 * np.arange(0, RY) / RY))
col += RY
# YG
colorwheel[col : col + YG, 0] = 255 - np.transpose(np.floor(255 * np.arange(0, YG) / YG))
colorwheel[col : col + YG, 1] = 255
col += YG
# GC
colorwheel[col : col + GC, 1] = 255
colorwheel[col : col + GC, 2] = np.transpose(np.floor(255 * np.arange(0, GC) / GC))
col += GC
# CB
colorwheel[col : col + CB, 1] = 255 - np.transpose(np.floor(255 * np.arange(0, CB) / CB))
colorwheel[col : col + CB, 2] = 255
col += CB
# BM
colorwheel[col : col + BM, 2] = 255
colorwheel[col : col + BM, 0] = np.transpose(np.floor(255 * np.arange(0, BM) / BM))
col += +BM
# MR
colorwheel[col : col + MR, 2] = 255 - np.transpose(np.floor(255 * np.arange(0, MR) / MR))
colorwheel[col : col + MR, 0] = 255
return colorwheel
+28
View File
@@ -0,0 +1,28 @@
import threading
import numpy as np
class TBImageRecorder(threading.Thread):
"""
TBImageRecorder
"""
def __init__(self, tb_writer, func, queue):
super(TBImageRecorder, self).__init__()
self._tb_writer = tb_writer
self._func = func
self._queue = queue
def run(self):
while True:
msgs, iter_index = self._queue.get()
if msgs:
img_info = self._func(*msgs)
print("logging the images")
for tag, images in img_info.items():
if images is not None:
self._tb_writer.add_image(tag, np.clip(images, 0, 255).astype(np.uint8), iter_index)
else:
break
+43
View File
@@ -0,0 +1,43 @@
import threading
import numpy as np
from utils.util import to_np
def histogram_logger(tb_writer, iter_index, net=None):
if net is not None:
for tag, value in net.named_parameters():
tag = tag.replace('.', '/')
tb_writer.add_histogram(tag, to_np(value), iter_index)
tb_writer.add_histogram(tag + '/grad', to_np(value.grad), iter_index)
def value_logger(tb_writer, iter_index, loss_info):
for tag, value in loss_info.items():
tb_writer.add_scalar(tag, value, iter_index)
class TBImageRecorder(threading.Thread):
"""
TBImageRecorder
"""
def __init__(self, tb_writer, func, queue):
super(TBImageRecorder, self).__init__()
self._tb_writer = tb_writer
self._func = func
self._queue = queue
def run(self):
while True:
msgs, iter_index = self._queue.get()
if msgs:
img_info = self._func(*msgs)
print("logging the images")
for tag, images in img_info.items():
if images is not None:
self._tb_writer.add_image(tag, np.clip(images, 0, 255).astype(np.uint8), iter_index)
else:
break
+30
View File
@@ -0,0 +1,30 @@
import torch
import torch.nn as nn
import torch.nn.functional as F
def get_grid(x):
torchHorizontal = (
torch.linspace(-1.0, 1.0, x.size(3)).view(1, 1, 1, x.size(3)).expand(x.size(0), 1, x.size(2), x.size(3))
)
torchVertical = (
torch.linspace(-1.0, 1.0, x.size(2)).view(1, 1, x.size(2), 1).expand(x.size(0), 1, x.size(2), x.size(3))
)
return torch.cat([torchHorizontal, torchVertical], 1).cuda()
class WarpingLayer(nn.Module):
def __init__(self, device):
super(WarpingLayer, self).__init__()
self.device = device
def forward(self, x, flow):
# WarpingLayer uses F.grid_sample, which expects normalized grid
# we still output unnormalized flow for the convenience of comparing EPEs with FlowNet2 and original code
# so here we need to denormalize the flow
flow_for_grip = torch.zeros_like(flow).cuda()
flow_for_grip[:, 0, :, :] = flow[:, 0, :, :] / ((flow.size(3) - 1.0) / 2.0)
flow_for_grip[:, 1, :, :] = flow[:, 1, :, :] / ((flow.size(2) - 1.0) / 2.0)
grid = (get_grid(x) + flow_for_grip).permute(0, 2, 3, 1)
return F.grid_sample(x, grid, align_corners=True)
+30
View File
@@ -0,0 +1,30 @@
import torch
import torch.nn as nn
import torch.nn.functional as F
def get_grid(x):
torchHorizontal = (
torch.linspace(-1.0, 1.0, x.size(3)).view(1, 1, 1, x.size(3)).expand(x.size(0), 1, x.size(2), x.size(3))
)
torchVertical = (
torch.linspace(-1.0, 1.0, x.size(2)).view(1, 1, x.size(2), 1).expand(x.size(0), 1, x.size(2), x.size(3))
)
return torch.cat([torchHorizontal, torchVertical], 1).cuda()
class WarpingLayer(nn.Module):
def __init__(self, device):
super(WarpingLayer, self).__init__()
self.device = device
def forward(self, x, flow):
# WarpingLayer uses F.VGG19_pytorch, which expects normalized grid
# we still output unnormalized flow for the convenience of comparing EPEs with FlowNet2 and original code
# so here we need to denormalize the flow
flow_for_grip = torch.zeros_like(flow).cuda()
flow_for_grip[:, 0, :, :] = flow[:, 0, :, :] / ((flow.size(3) - 1.0) / 2.0)
flow_for_grip[:, 1, :, :] = flow[:, 1, :, :] / ((flow.size(2) - 1.0) / 2.0)
grid = (get_grid(x) + flow_for_grip).permute(0, 2, 3, 1)
return F.VGG19_pytorch(x, grid, align_corners=True)