## Thursday, December 24, 2020

### Fix Tensorflow Object Detection Framework taking too much disk space while training

The model_lib_tf2.py file contains all the training and evaluation loops.

In the function:

def eager_train_step(detection_model,                     features,                     labels,                     unpad_groundtruth_tensors,                     optimizer,                     learning_rate,                     add_regularization_loss=True,                     clip_gradients_value=None,                     global_step=None,                     num_replicas=1.0):

We can see that every training iteration it saves a few training dataset images.

tf.compat.v2.summary.image(    name='train_input_images',    step=global_step,    data=features[fields.InputDataFields.image],    max_outputs=5)

There are three problems with this:

1. It takes A LOT of space

2. It actually slows up training

3. Images look saturated.

We can fix this easily by replacing the above snippet with this:

if global_step % 100 == 0:    # --- get images and normalize them    images_normalized = \        (features[fields.InputDataFields.image] + 128.0) / 255.0    tf.compat.v2.summary.image(        name='train_input_images',        step=global_step,        data=images_normalized,        max_outputs=5)

## Monday, October 12, 2020

### Gaussian Filter in Keras (code snippet)

Very often we need to perform basic vision operations on a computational graph like building a Laplacian pyramid or filter a tensor with a specific precalculated filter.

Below i present a code snippet for building a fixed non-trainable gaussian filter in keras.

import kerasimport numpy as npimport scipy.stats as stdef gaussian_filter_block(input_layer,                          kernel_size=3,                          strides=(1, 1),                          dilation_rate=(1, 1),                          padding="same",                          activation=None,                          trainable=False,                          use_bias=False):    """    Build a gaussian filter block    :return:    """    def _gaussian_kernel(kernlen=[21, 21], nsig=[3, 3]):        """        Returns a 2D Gaussian kernel array        """        assert len(nsig) == 2        assert len(kernlen) == 2        kern1d = []        for i in range(2):            interval = (2 * nsig[i] + 1.) / (kernlen[i])            x = np.linspace(-nsig[i] - interval / 2., nsig[i] + interval / 2.,                            kernlen[i] + 1)            kern1d.append(np.diff(st.norm.cdf(x)))        kernel_raw = np.sqrt(np.outer(kern1d[0], kern1d[1]))        # divide by sum so they all add up to 1        kernel = kernel_raw / kernel_raw.sum()        return kernel    # Initialise to set kernel to required value    def kernel_init(shape, dtype):        kernel = np.zeros(shape)        kernel[:, :, 0, 0] = _gaussian_kernel([shape[0], shape[1]])        return kernel    return keras.layers.DepthwiseConv2D(        kernel_size=kernel_size,        strides=strides,        padding=padding,        depth_multiplier=1,        dilation_rate=dilation_rate,        activation=activation,        use_bias=use_bias,        trainable=trainable,        depthwise_initializer=kernel_init,        kernel_initializer=kernel_init)(input_layer)

from my open source project https://github.com/NikolasMarkou/multiscale_variational_autoencoder

## Monday, August 24, 2020

### Tensorflow to Onnx (tf2onnx) testing with different opsets

To test tf2onnx changes with different operators set your external variable prior to calling pytest.

So for example in a windows setup this will run the tests

set TF2ONNX_TEST_OPSET=11

pytest

and in a standard linux setup

export TF2ONNX_TEST_OPSET=11

pytest

## Thursday, June 11, 2020

### Opencv 4.3.0 options

Building OpenCV 4.3.0 from source
cmake ../ -DHAVE_MKL=ON -DBUILD_opencv_python2=OFF -DBUILD_opencv_java=OFF -DMKL_WITH_TBB=ON -DWITH_OPENCL=ON -DWITH_CUDA=ON -DWITH_CUBLAS=ON -DENABLE_CXX11=ON -DOPENCV_EXTRA_MODULES_PATH=/home/arxwn/Repositories/opencv/opencv_contrib/modules -DCPU_BASELINE="SSE3"  -DCPU_DISPATCH="SSE4_1;SSE4_2;AVX;FP16;AVX2;AVX512_SKX" -DOPENCV_ENABLE_NONFREE=ON

## Tuesday, April 7, 2020

### Netron an awesome neural networks visualization tool

I've been working recently on optimizing models from tensorflow to onnx and finally to tensorrt and got introduced to Netron an excellent tool for all ml engineers / data scientists working with different flavors and formats of neural networks.

It is a huge improvement over the keras and tensorboard visualizer.

Check it out here

## Monday, March 23, 2020

### Compiling Tensorflow 1.15 from source

Following my previous post Compiling Tensorflow under Debian Linux with GPU support and CPU extensions I was trying to build version r1.15 when i stumbled to another peculiar bug. When reaching the end of the compilation you get a lovely error in the form of

from keras.preprocessing import image as image_utils
ImportError: No module named keras.preprocessing
 
To fix this you you just need to install the following packages prior to compiling

pip install keras_applications==1.0.4 --no-deps
pip install keras_preprocessing==1.0.2 --no-deps
pip install h5py==2.8.0
 
And that's it you can build again.

bazel build -c opt --config=v1 --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2 --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package

## Wednesday, February 5, 2020

### Software Commodification

Something that people outside the software industry don't fully grasp is the increasing pace of commodification

You had a Phd in CS 20 years ago ? congrats all your knowledge is a library.

You were an excellent physicist 10 years ago ? Congrats we can import and run everything you knew without even understanding half of it.

You studied Artificial Intelligence in depth 15 years ago ? A 17 year old with a weekend in keras can provide better solutions than you. Everything you know is getting obsolete in an increasing rate.

As software people we are are used to packaging up our knowledge and re-learning new skills (tools, theories, frameworks) every couple of years, because the old have been completely commoditized.

It is an exciting but tiresome journey that it shouldn't be required by all. However as everything is becoming software there may not be a choice by most people.

Personally the increasing pace of commodification allows me to cut through the noise and add depth to my knowledge. Knowing that the low hanging fruits have been picked will clear up the space of Artificial Intelligence and Machine Learning.

## Deceptive Easy

Modern Machine Learning (ML) and especially Deep Learning (DL) have become deceptively easy. It is almost trivial to have something up and running with presentable results as the the tools hide most of the complexity and hard decisions. Whereas that might be good enough for a Proof of Concept (POC) or a Minimum Viable Product (MVP), ensuring stability, high performance and scalability is a whole different ball game.

## High Sunk Cost

Many CXO’s and seniors managers find themselves trapped into subpar solutions that cannot be used effectively because they lack the technical know-how to productionalize them.

At Electi we have just release a new brochure listing the services we can offer to companies already implementing Deep Learning. Check it out here.