From 89b3db84466f7740a48ce29b011bb85edea26217 Mon Sep 17 00:00:00 2001 From: Alberto Ursino Date: Thu, 26 Nov 2020 03:06:46 +0100 Subject: [PATCH] Started writing training code - The perfect image format seems to be a square and gray image - Added the photo which respect these constraints - Updated the classes which implement this photo (annotation_set, annotator) - Created the class "train" useful to train the network --- .idea/other.xml | 6 + alberto/annotation/annotation_set.py | 9 +- alberto/annotation/annotator.py | 6 +- alberto/annotation/train.py | 160 ++++++++++++++++++ .../datasets/dog/annotation_set.h5 | Bin 0 -> 800552 bytes .../datasets/dog/dog_samples/gray.png | Bin 0 -> 49589 bytes .../datasets/dog/skeleton.csv | 10 ++ 7 files changed, 182 insertions(+), 9 deletions(-) create mode 100644 .idea/other.xml create mode 100644 alberto/annotation/train.py create mode 100644 alberto/deepposekit-data/datasets/dog/annotation_set.h5 create mode 100644 alberto/deepposekit-data/datasets/dog/dog_samples/gray.png create mode 100644 alberto/deepposekit-data/datasets/dog/skeleton.csv diff --git a/.idea/other.xml b/.idea/other.xml new file mode 100644 index 0000000..a708ec7 --- /dev/null +++ b/.idea/other.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/alberto/annotation/annotation_set.py b/alberto/annotation/annotation_set.py index 61316b8..75f4471 100644 --- a/alberto/annotation/annotation_set.py +++ b/alberto/annotation/annotation_set.py @@ -5,10 +5,9 @@ from deepposekit.io import VideoReader, DataGenerator, initialize_dataset import tqdm import glob -import imageio HOME = 'C:/Users/Alberto Ursino/Desktop/IntellIj Local Files/DeepPoseKit/alberto' -IMAGE_SIZE = (1024, 768) +IMAGE_SIZE = (512, 512) IMG_CHANNEL = 3 @@ -41,7 +40,7 @@ def main(): sampled_frames = [] count = 0 for image_file in tqdm.tqdm(glob.glob( - 'C:/Users/Alberto Ursino/Desktop/IntellIj Local Files/DeepPoseKit/alberto/deepposekit-data/datasets/dog/dog_samples/*.png')): + 'C:/Users/Alberto Ursino/Desktop/IntellIj Local Files/DeepPoseKit/alberto/deepposekit-data/datasets/dog/dog_samples/gray.png')): count += 1 img = cv2.imread(image_file) resized_img = cv2.resize(img, IMAGE_SIZE) @@ -61,10 +60,10 @@ def main(): # print(var) initialize_dataset(images=sampled_frames, - datapath=HOME + '/deepposekit-data/datasets/dog/example_annotation_set.h5', + datapath=HOME + '/deepposekit-data/datasets/dog/annotation_set.h5', skeleton=HOME + '/deepposekit-data/datasets/dog/skeleton.csv') data_generator = DataGenerator( - HOME + '/deepposekit-data/datasets/dog/example_annotation_set.h5', + HOME + '/deepposekit-data/datasets/dog/annotation_set.h5', mode="full") image, keypoints = data_generator[0] diff --git a/alberto/annotation/annotator.py b/alberto/annotation/annotator.py index 7a071e0..2f434e7 100644 --- a/alberto/annotation/annotator.py +++ b/alberto/annotation/annotator.py @@ -1,14 +1,12 @@ from deepposekit import Annotator -from os.path import expanduser -import glob HOME = 'C:/Users/Alberto Ursino/Desktop/IntellIj Local Files/DeepPoseKit/alberto' app = Annotator( - datapath=HOME + '/deepposekit-data/datasets/dog/example_annotation_set.h5', + datapath=HOME + '/deepposekit-data/datasets/dog/annotation_set.h5', dataset='images', skeleton=HOME + '/deepposekit-data/datasets/dog/skeleton.csv', shuffle_colors=False, - text_scale=1) + text_scale=0.7) app.run() diff --git a/alberto/annotation/train.py b/alberto/annotation/train.py new file mode 100644 index 0000000..445d61e --- /dev/null +++ b/alberto/annotation/train.py @@ -0,0 +1,160 @@ +import tensorflow as tf + +import numpy as np +import matplotlib.pyplot as plt +import glob + +from deepposekit.io import TrainingGenerator, DataGenerator +from deepposekit.augment import FlipAxis +import imgaug.augmenters as iaa +import imgaug as ia + +from deepposekit.models import StackedHourglass +from deepposekit.models import load_model + +from tensorflow.keras.callbacks import ReduceLROnPlateau, EarlyStopping + +from deepposekit.callbacks import Logger, ModelCheckpoint + +import time +from os.path import expanduser + +HOME = 'C:/Users/Alberto Ursino/Desktop/IntellIj Local Files/DeepPoseKit/alberto' + +data_generator = DataGenerator(HOME + '/deepposekit-data/datasets/dog/annotation_set.h5') + +# image, keypoints = data_generator[0] +# +# plt.figure(figsize=(5, 5)) +# image = image[0] if image.shape[-1] is 3 else image[0, ..., 0] +# cmap = None if image.shape[-1] is 3 else 'gray' +# plt.imshow(image, cmap=cmap, interpolation='none') +# for idx, jdx in enumerate(data_generator.graph): +# if jdx > -1: +# plt.plot( +# [keypoints[0, idx, 0], keypoints[0, jdx, 0]], +# [keypoints[0, idx, 1], keypoints[0, jdx, 1]], +# 'r-' +# ) +# plt.scatter(keypoints[0, :, 0], keypoints[0, :, 1], c=np.arange(data_generator.keypoints_shape[0]), s=50, +# cmap=plt.cm.hsv, zorder=3) +# +# plt.show() + +# Augmentation + +augmenter = [] + +augmenter.append(FlipAxis(data_generator, axis=0)) # flip image up-down +augmenter.append(FlipAxis(data_generator, axis=1)) # flip image left-right + +sometimes = [] +sometimes.append(iaa.Affine(scale={"x": (0.95, 1.05), "y": (0.95, 1.05)}, + translate_percent={'x': (-0.05, 0.05), 'y': (-0.05, 0.05)}, + shear=(-8, 8), + order=ia.ALL, + cval=ia.ALL, + mode=ia.ALL) + ) +sometimes.append(iaa.Affine(scale=(0.8, 1.2), + mode=ia.ALL, + order=ia.ALL, + cval=ia.ALL) + ) +augmenter.append(iaa.Sometimes(0.75, sometimes)) +augmenter.append(iaa.Affine(rotate=(-180, 180), + mode=ia.ALL, + order=ia.ALL, + cval=ia.ALL) + ) +augmenter = iaa.Sequential(augmenter) + +# image, keypoints = data_generator[0] +# image, keypoints = augmenter(images=image, keypoints=keypoints) +# plt.figure(figsize=(5,5)) +# image = image[0] if image.shape[-1] is 3 else image[0, ..., 0] +# cmap = None if image.shape[-1] is 3 else 'gray' +# plt.imshow(image, cmap=cmap, interpolation='none') +# for idx, jdx in enumerate(data_generator.graph): +# if jdx > -1: +# plt.plot( +# [keypoints[0, idx, 0], keypoints[0, jdx, 0]], +# [keypoints[0, idx, 1], keypoints[0, jdx, 1]], +# 'r-' +# ) +# plt.scatter(keypoints[0, :, 0], keypoints[0, :, 1], c=np.arange(data_generator.keypoints_shape[0]), s=50, cmap=plt.cm.hsv, zorder=3) +# +# plt.show() + +train_generator = TrainingGenerator(generator=data_generator, + downsample_factor=3, + augmenter=augmenter, + sigma=5, + validation_split=0, + use_graph=True, + random_seed=1, + graph_scale=1) +train_generator.get_config() + +# n_keypoints = data_generator.keypoints_shape[0] +# batch = train_generator(batch_size=1, validation=False)[0] +# inputs = batch[0] +# outputs = batch[1] +# +# fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(10, 10)) +# ax1.set_title('image') +# ax1.imshow(inputs[0, ..., 0], cmap='gray', vmin=0, vmax=255) +# +# ax2.set_title('posture graph') +# ax2.imshow(outputs[0, ..., n_keypoints:-1].max(-1)) +# +# ax3.set_title('keypoints confidence') +# ax3.imshow(outputs[0, ..., :n_keypoints].max(-1)) +# +# ax4.set_title('posture graph and keypoints confidence') +# ax4.imshow(outputs[0, ..., -1], vmin=0) +# plt.show() +# +# train_generator.on_epoch_end() + +# Define a model + +model = StackedHourglass(train_generator) + +model.get_config() + +# data_size = (10,) + data_generator.image_shape +# x = np.random.randint(0, 255, data_size, dtype="uint8") +# y = model.predict(x[:100], batch_size=100) # make sure the model is in GPU memory +# t0 = time.time() +# y = model.predict(x, batch_size=100, verbose=1) +# t1 = time.time() +# print(x.shape[0] / (t1 - t0)) + +logger = Logger(validation_batch_size=10, + # filepath saves the logger data to a .h5 file + filepath=HOME + "/deepposekit-data/datasets/dog/log_densenet.h5" + ) + +# Remember, if you set validation_split=0 for your TrainingGenerator, +# which will just use the training set for model fitting, +# make sure to set monitor="loss" instead of monitor="val_loss". +reduce_lr = ReduceLROnPlateau(monitor="loss", factor=0.2, verbose=1, patience=20) + +model_checkpoint = ModelCheckpoint( + HOME + "/deepposekit-data/datasets/fly/best_model_densenet.h5", + monitor="val_loss", + # monitor="loss" # use if validation_split=0 + verbose=1, + save_best_only=True, +) + +early_stop = EarlyStopping( + monitor="val_loss", + # monitor="loss" # use if validation_split=0 + min_delta=0.001, + patience=100, + verbose=1 +) + +callbacks = [early_stop, reduce_lr, model_checkpoint, logger] diff --git a/alberto/deepposekit-data/datasets/dog/annotation_set.h5 b/alberto/deepposekit-data/datasets/dog/annotation_set.h5 new file mode 100644 index 0000000000000000000000000000000000000000..2982e5c954c648920e8329bc4879d740ea4b44fd GIT binary patch literal 800552 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 literal 0 HcmV?d00001 diff --git a/alberto/deepposekit-data/datasets/dog/dog_samples/gray.png b/alberto/deepposekit-data/datasets/dog/dog_samples/gray.png new file mode 100644 index 0000000000000000000000000000000000000000..95a1f8804ee69a01a16b8aacfcd357040a3f5736 GIT binary patch literal 49589 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