Made it possible to save images without preventing training
Signed-off-by: Jim Martens <github@2martens.de>
This commit is contained in:
@ -205,7 +205,8 @@ def _ssd_train(args: argparse.Namespace) -> None:
|
||||
top_k,
|
||||
pre_trained_weights_file)
|
||||
|
||||
train_generator, train_length, val_generator, val_length = _ssd_train_get_generators(
|
||||
train_generator, train_length, train_debug_generator, \
|
||||
val_generator, val_length, val_debug_generator = _ssd_train_get_generators(args,
|
||||
data.load_scenenet_data,
|
||||
file_names_train,
|
||||
instances_train,
|
||||
@ -215,14 +216,12 @@ def _ssd_train(args: argparse.Namespace) -> None:
|
||||
batch_size,
|
||||
image_size,
|
||||
nr_trajectories,
|
||||
predictor_sizes
|
||||
)
|
||||
predictor_sizes)
|
||||
|
||||
train_length = _ssd_debug_save_images(args, save_train_images,
|
||||
_ssd_debug_save_images(args, save_train_images,
|
||||
debug.save_ssd_train_images, coco_utils.get_coco_category_maps,
|
||||
summary_path, coco_path,
|
||||
batch_size, image_size,
|
||||
train_generator, train_length)
|
||||
image_size, train_debug_generator)
|
||||
|
||||
nr_batches_train = _get_nr_batches(train_length, batch_size)
|
||||
tensorboard_callback = _ssd_get_tensorboard_callback(args, save_summaries, summary_path)
|
||||
@ -331,7 +330,8 @@ def _ssd_train_load_gt(train_gt_path: str, val_gt_path: str
|
||||
return file_names_train, instances_train, file_names_val, instances_val
|
||||
|
||||
|
||||
def _ssd_train_get_generators(load_data: callable,
|
||||
def _ssd_train_get_generators(args: argparse.Namespace,
|
||||
load_data: callable,
|
||||
file_names_train: Sequence[Sequence[str]],
|
||||
instances_train: Sequence[Sequence[Sequence[dict]]],
|
||||
file_names_val: Sequence[Sequence[str]],
|
||||
@ -340,38 +340,43 @@ def _ssd_train_get_generators(load_data: callable,
|
||||
batch_size: int,
|
||||
image_size: int,
|
||||
nr_trajectories: int,
|
||||
predictor_sizes: Sequence[Sequence[int]]) -> Tuple[Generator, int, Generator, int]:
|
||||
predictor_sizes: Sequence[Sequence[int]]) -> Tuple[Generator, int, Generator, Generator, int, Generator]:
|
||||
|
||||
if nr_trajectories == -1:
|
||||
nr_trajectories = None
|
||||
train_generator, train_length = \
|
||||
|
||||
train_generator, train_length, train_debug_generator = \
|
||||
load_data(file_names_train, instances_train, coco_path,
|
||||
predictor_sizes=predictor_sizes,
|
||||
batch_size=batch_size,
|
||||
image_size=image_size,
|
||||
training=True, evaluation=True, augment=False,
|
||||
training=True, evaluation=False, augment=False,
|
||||
debug=args.debug,
|
||||
nr_trajectories=nr_trajectories)
|
||||
|
||||
val_generator, val_length = \
|
||||
val_generator, val_length, val_debug_generator = \
|
||||
load_data(file_names_val, instances_val, coco_path,
|
||||
predictor_sizes=predictor_sizes,
|
||||
batch_size=batch_size,
|
||||
image_size=image_size,
|
||||
training=False, evaluation=False, augment=False,
|
||||
debug=args.debug,
|
||||
nr_trajectories=nr_trajectories)
|
||||
|
||||
return train_generator, train_length, val_generator, val_length
|
||||
return (
|
||||
train_generator, train_length, train_debug_generator,
|
||||
val_generator, val_length, val_debug_generator
|
||||
)
|
||||
|
||||
|
||||
def _ssd_debug_save_images(args: argparse.Namespace, save_images_on_debug: bool,
|
||||
save_images: callable, get_coco_cat_maps_func: callable,
|
||||
summary_path: str, coco_path: str,
|
||||
batch_size: int, image_size: int,
|
||||
train_generator: Generator, train_length: int) -> int:
|
||||
image_size: int,
|
||||
train_generator: Generator) -> None:
|
||||
|
||||
if args.debug and save_images_on_debug:
|
||||
train_data = next(train_generator)
|
||||
train_length -= batch_size
|
||||
train_images = train_data[0]
|
||||
train_labels = train_data[1]
|
||||
train_labels_not_encoded = train_data[2]
|
||||
@ -384,8 +389,6 @@ def _ssd_debug_save_images(args: argparse.Namespace, save_images_on_debug: bool,
|
||||
summary_path, coco_path, image_size,
|
||||
get_coco_cat_maps_func, "after-encoding")
|
||||
|
||||
return train_length
|
||||
|
||||
|
||||
def _ssd_get_tensorboard_callback(args: argparse.Namespace, save_summaries_on_debug: bool,
|
||||
summary_path: str) -> Union[None, tf.keras.callbacks.TensorBoard]:
|
||||
|
||||
@ -23,7 +23,7 @@ Functions:
|
||||
load_scenenet_data(...): loads the SceneNet RGB-D data into a Tensorflow data set
|
||||
prepare_scenenet_data(...): prepares the SceneNet RGB-D data and returns it in Python format
|
||||
"""
|
||||
from typing import Callable, List, Mapping, Tuple, Optional
|
||||
from typing import Callable, List, Mapping, Tuple, Optional, Generator
|
||||
from typing import Sequence
|
||||
|
||||
import numpy as np
|
||||
@ -240,8 +240,9 @@ def load_scenenet_data(photo_paths: Sequence[Sequence[str]],
|
||||
training: bool,
|
||||
evaluation: bool,
|
||||
augment: bool,
|
||||
debug: bool,
|
||||
predictor_sizes: Optional[np.ndarray],
|
||||
nr_trajectories: Optional[int] = None) -> Tuple[callable, int]:
|
||||
nr_trajectories: Optional[int] = None) -> Tuple[Generator, int, Optional[Generator]]:
|
||||
"""
|
||||
Loads the SceneNet RGB-D data and returns a data set.
|
||||
|
||||
@ -254,12 +255,14 @@ def load_scenenet_data(photo_paths: Sequence[Sequence[str]],
|
||||
training: True if training data is desired
|
||||
evaluation: True if evaluation-ready data is desired
|
||||
augment: True if training data should be augmented
|
||||
debug: True if a more extensive generator should be added to output
|
||||
predictor_sizes: sizes of the predictor layers, can be None for evaluation
|
||||
nr_trajectories: number of trajectories to consider
|
||||
|
||||
Returns:
|
||||
scenenet data set generator
|
||||
length of dataset
|
||||
generator which offers processed_labels as well (only if debug is True)
|
||||
"""
|
||||
trajectories = zip(photo_paths, instances)
|
||||
final_image_paths = []
|
||||
@ -320,8 +323,7 @@ def load_scenenet_data(photo_paths: Sequence[Sequence[str]],
|
||||
]
|
||||
|
||||
returns = {'processed_images', 'encoded_labels'}
|
||||
if training and evaluation:
|
||||
returns = {'processed_images', 'encoded_labels', 'processed_labels'}
|
||||
returns_debug = {'processed_images', 'encoded_labels', 'processed_labels'}
|
||||
|
||||
if not training and evaluation:
|
||||
returns = {
|
||||
@ -356,9 +358,21 @@ def load_scenenet_data(photo_paths: Sequence[Sequence[str]],
|
||||
keep_images_without_gt=False
|
||||
)
|
||||
|
||||
if debug:
|
||||
debug_generator = data_generator.generate(
|
||||
batch_size=batch_size,
|
||||
shuffle=shuffle,
|
||||
transformations=transformations,
|
||||
label_encoder=label_encoder,
|
||||
returns=returns_debug,
|
||||
keep_images_without_gt=False
|
||||
)
|
||||
else:
|
||||
debug_generator = None
|
||||
|
||||
length_dataset = data_generator.dataset_size
|
||||
|
||||
return generator, length_dataset
|
||||
return generator, length_dataset, debug_generator
|
||||
|
||||
|
||||
def _load_images_ssd_callback(resized_shape: Sequence[int]) \
|
||||
|
||||
Reference in New Issue
Block a user