Commit 6c88d9e2 authored by Andrey Filippov's avatar Andrey Filippov
Browse files

8-image reports

parent 4b02b283
Loading
Loading
Loading
Loading

nn_eval_lwir-02.py

0 → 100644
+382 −0
Original line number Original line Diff line number Diff line
#!/usr/bin/env python3

__copyright__ = "Copyright 2018, Elphel, Inc."
__license__   = "GPL-3.0+"
__email__     = "andrey@elphel.com"


#from PIL import Image

import os
import sys
#import glob

#import numpy as np

import imagej_tiffwriter

import time
import imagej_tiff as ijt
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages
import qcstereo_functions as qsf
import numpy as np

#import xml.etree.ElementTree as ET

qsf.TIME_START = time.time()
qsf.TIME_LAST  = qsf.TIME_START

#IMG_WIDTH =        20 # 324 # tiles per image row Defined in config
#IMG_HEIGHT =       15 # 324 # tiles per image row Defined in config

DEBUG_LEVEL= 1

try:
    conf_file =  sys.argv[1]
except IndexError:
    print("Configuration path is required as a first argument. Optional second argument specifies root directory for data files")
    exit(1)
try:
    root_dir =  sys.argv[2]
except IndexError:
    root_dir =  os.path.dirname(conf_file)

try:
    modes  =  [sys.argv[3]] # train, infer
except IndexError:
    modes = ['train']

    
print ("Configuration file: " + conf_file)
parameters, dirs, files, dbg_parameters = qsf.parseXmlConfig(conf_file, root_dir)
"""
Temporarily for backward compatibility
"""
if not "SLOSS_CLIP" in parameters:
    parameters['SLOSS_CLIP'] = 0.5
    print ("Old config, setting SLOSS_CLIP=", parameters['SLOSS_CLIP'])
    
"""
Defined in config file
"""
IMG_WIDTH =        None # 20 # 324 # tiles per image row Defined in config
IMG_HEIGHT =       None # 15 # 324 # tiles per image row Defined in config
TILE_SIDE, TILE_LAYERS, TWO_TRAINS, NET_ARCH1, NET_ARCH2 = [None]*5
ABSOLUTE_DISPARITY,SYM8_SUB, WLOSS_LAMBDA,  SLOSS_LAMBDA, SLOSS_CLIP  = [None]*5
SPREAD_CONVERGENCE, INTER_CONVERGENCE, HOR_FLIP, DISP_DIFF_CAP, DISP_DIFF_SLOPE  = [None]*5
CLUSTER_RADIUS,ABSOLUTE_DISPARITY = [None]*2
FGBG_MODE = 1 # 0 - do not filter by single-plane, 1 - remove split plabnes tiles, 2 - remove split planes and neighbors
FIGS_EXTENSIONS = ['png','pdf','svg']
#FIGS_ESXTENSIONS = ['png','pdf','svg']
EVAL_MODES = ["train","infer"]
FIGS_SAVESHOW = ['save','show']

    
globals().update(parameters)
try:
    FIGS_EXTENSIONS = globals()['FIGS_ESXTENSIONS'] # fixing typo in configs
except:
    pass


#exit(0)


TILE_SIZE =         TILE_SIDE* TILE_SIDE # == 81
FEATURES_PER_TILE =  TILE_LAYERS * TILE_SIZE# == 324
BATCH_SIZE =       ([1,2][TWO_TRAINS])*2*1000//25 # == 80 Each batch of tiles has balanced D/S tiles, shuffled batches but not inside batches

SUFFIX=(str(NET_ARCH1)+'-'+str(NET_ARCH2)+
       (["R","A"][ABSOLUTE_DISPARITY]) +
       (["NS","S8"][SYM8_SUB])+
       "WLAM"+str(WLOSS_LAMBDA)+
       "SLAM"+str(SLOSS_LAMBDA)+
       "SCLP"+str(SLOSS_CLIP)+
       (['_nG','_G'][SPREAD_CONVERGENCE])+
       (['_nI','_I'][INTER_CONVERGENCE]) +
       (['_nHF',"_HF"][HOR_FLIP]) +
       ('_CP'+str(DISP_DIFF_CAP)) +
       ('_S'+str(DISP_DIFF_SLOPE))
       )

##############################################################################
cluster_size = (2 * CLUSTER_RADIUS + 1) * (2 * CLUSTER_RADIUS + 1)
center_tile_index = 2 * CLUSTER_RADIUS * (CLUSTER_RADIUS + 1)
qsf.prepareFiles(dirs, files, suffix = SUFFIX)

#import tensorflow.contrib.slim as slim
#NN_DISP =   0
#HEUR_DISP = 1
#GT_DISP =   2
#GT_CONF =   3
#NN_NAN =    4
#HEUR_NAN =  5
#NN_DIFF =   6
#HEUR_DIFF = 7
# Now - more layers




CONF_MAX = 0.7
ERR_AMPL = 0.4 # 0.3
TIGHT_TOP = 0.95
TIGHT_HPAD = 1.0
TIGHT_WPAD = 1.0
FIGSIZE = [8.5,11.0]
WOI_COLOR = "red"
X_COLOR =   "grey"
X_NEIBS = False
TRANSPARENT = True # for export




#dbg_parameters
def get_fig_params(disparity_ranges):
    fig_params = []
    for dr in disparity_ranges:
        if dr[-1][0]=='-':
            fig_params.append(None)
        else:
            subs = []
            for s in dr[:-1]:
                mm = s[:2]
                try:
                    lims = s[2]
                except IndexError:
                    lims = None
                subs.append({'lim_val':mm, 'lim_xy':lims})        
            fig_params.append({'name':dr[-1],'ranges':subs}) 
    return fig_params

#try:
#fig_params = get_fig_params(dbg_parameters['disparity_ranges'])
extra_path =   os.path.join(root_dir, dbg_parameters['extra'])
eo_width =     dbg_parameters['eo_params']['width']
eo_height =    dbg_parameters['eo_params']['height']
eo_woi =       dbg_parameters['eo_params']['woi'] # (x,y,width, height)
eo_disparity_scale = 1.0/dbg_parameters['eo_params']['disparity_scale'] # 14.2
image_sets =   dbg_parameters['extra_paths'] # list of dictionaries


pass

#temporary:
TIFF_ONLY = False # True
#max_bad =        2.5 # excludes only direct bad
max_bad =        2.5 #2.5 # 1.5 # excludes only direct bad
max_diff =       1.5 # 2.0 # 5.0 # maximal max-min difference
max_target_err = 1.0 # 0.5 # maximal max-min difference
max_disp =       5.0

min_strength =   0.18 #ignore tiles below
min_neibs =      1
max_log_to_mm =  0.5 # difference between center average and center should be under this fraction of max-min (0 - disables feature) 


#num_bins = 256 # number of histogram bins
num_bins =        15 # 50 # number of histogram bins
use_gt_weights = True # False # True
index_gt =         2
index_gt_weight =  3
index_heur_err =   7
index_nn_err =     6
index_fgbg_sngl = 10
index_fgbg_neib = 11

index_mm =        23 #  8 # max-min
index_log =       24 #  9
index_bad =       25 # 10
index_num_neibs = 26 # 11

index_fgbg = [index_fgbg_sngl,index_fgbg_neib][X_NEIBS]
"""
Debugging high 9-tile variations, removing error for all tiles with lower difference between max and min
"""
#min_diff =       0.25 # remove all flat tiles with spread less than this (do not show on heuristic/network disparity errors subplots 
min_diff =       0 # remove all flat tiles with spread less than this 




max_target_err2 = max_target_err * max_target_err
if not 'show' in FIGS_SAVESHOW:
    plt.ioff()

#for mode in ['train','infer']:
#for mode in ['infer']:
def cross_out(
        plt,
        cross_out_mask):
    height = cross_out_mask.shape[0]
    width =  cross_out_mask.shape[1]
    for row in range (height):
        for col in range(width):
            if cross_out_mask[row,col]:
                xdata = [col-0.3, col+0.3]
                ydata = [row-0.3, row+0.3]
                plt.plot(xdata,ydata,color=X_COLOR)
                ydata = [row+0.3, row-0.3]
                plt.plot(xdata,ydata,color=X_COLOR)

for mode in modes: #  ['train']:
    figs = []
    ffiles = [] # no ext
    def setlimsxy(lim_xy):
        if not lim_xy is None:
            plt.xlim(min(lim_xy[:2]),max(lim_xy[:2]))            
            plt.ylim(max(lim_xy[2:]),min(lim_xy[2:]))
    cumul_weights = None                   
    cmap_disp=plt.get_cmap('viridis') # ('cividis')    
    cmap_diff=plt.get_cmap('coolwarm') #('seismic') # ('viridis')    
    for nfile, img_pars in enumerate(image_sets):
        if not img_pars is None:
            img_file = files['result'][nfile]
            if mode == 'infer':
                img_file = img_file.replace('.npy','-infer.npy')
            print ("Processing image set: "+img_file)    

            data,labels = qsf.result_npy_prepare(img_file, ABSOLUTE_DISPARITY, fix_nan=True, insert_deltas=3)
            cross_out_mask = data[...,index_fgbg] < 0.5 #data.shape = (15,20,27)
#            for subindex, rng in enumerate(fpars['ranges']):
                
            lim_val = img_pars['range'] # rng['lim_val']
            lim_val[0] -= ERR_AMPL
            lim_xy =  [-0.5, IMG_WIDTH - 0.5, -0.5, IMG_HEIGHT - 0.5] # rng['lim_xy']
            
            #start new image page
            fig = plt.figure(figsize=FIGSIZE)
            fig.canvas.set_window_title(img_pars['title'])
            fig.suptitle(img_pars['title'])
            
            # Create EO DSI image
            # load tiff image
             
            img_ds_main = ijt.imagej_tiff(os.path.join(extra_path,img_pars['dsi_path'] ))
            ds_main = img_ds_main.image[...,img_pars['dsi_slice']] * eo_disparity_scale
            ds_main = np.maximum(ds_main, lim_val[0])
            ds_main = np.minimum(ds_main, lim_val[1])
            ax_conf=plt.subplot(322)
            ax_conf.set_title("Hi-res camera disparity map")
            plt.imshow(ds_main, vmin=lim_val[0], vmax=lim_val[1], cmap=cmap_disp)
            setlimsxy([-0.5, eo_width-0.5, -0.5, eo_height - 0.5])
            if not eo_woi is None:
                pass # show frame
                xdata=[eo_woi['x'], eo_woi['x'] + eo_woi['width'], eo_woi['x'] + eo_woi['width'],  eo_woi['x'],                    eo_woi['x']]
                ydata=[eo_woi['y'], eo_woi['y'],                   eo_woi['y'] + eo_woi['height'], eo_woi['y'] + eo_woi['height'], eo_woi['y']]
                plt.plot(xdata,ydata,color=WOI_COLOR)
            
            plt.colorbar(orientation='vertical') # location='bottom')
            '''
            # Ground truth confidence - to be replaced
            ax_conf=plt.subplot(322)
            ax_conf.set_title("Ground truth confidence")
            plt.imshow(data[...,qsf.GT_CONF], vmin=0, vmax=CONF_MAX, cmap='gray')
            if not lim_xy is None:
                pass # show frame
                xdata=[min(lim_xy[:2]),max(lim_xy[:2]),max(lim_xy[:2]),min(lim_xy[:2]),min(lim_xy[:2])]
                ydata=[min(lim_xy[2:]),min(lim_xy[2:]),max(lim_xy[2:]),max(lim_xy[2:]),min(lim_xy[2:])]
                plt.plot(xdata,ydata,color=WOI_COLOR)
            plt.colorbar(orientation='vertical') # location='bottom')
            '''
            
            ax_gtd=plt.subplot(321)
            ax_gtd.set_title("Ground truth disparity map")
            plt.imshow(data[...,qsf.GT_DISP], vmin=lim_val[0], vmax=lim_val[1], cmap=cmap_disp)
            setlimsxy(lim_xy)
            cross_out(plt, cross_out_mask)            
            plt.colorbar(orientation='vertical') # location='bottom')
            
            ax_hed=plt.subplot(323)
            ax_hed.set_title("Heuristic disparity map")
            plt.imshow(data[...,qsf.HEUR_NAN], vmin=lim_val[0], vmax=lim_val[1], cmap=cmap_disp)            
            setlimsxy(lim_xy)                        
            cross_out(plt, cross_out_mask)            
            plt.colorbar(orientation='vertical') # location='bottom')
        
            ax_nnd=plt.subplot(325)
            ax_nnd.set_title("Network disparity output")
            plt.imshow(data[...,qsf.NN_NAN], vmin=lim_val[0], vmax=lim_val[1], cmap=cmap_disp)
            setlimsxy(lim_xy)                        
            cross_out(plt, cross_out_mask)            
            plt.colorbar(orientation='vertical') # location='bottom')

            ax_hee=plt.subplot(324)
            ax_hee.set_title("Heuristic disparity error")
            cross_out(plt, cross_out_mask)            
            plt.imshow(data[...,qsf.HEUR_DIFF], vmin=-ERR_AMPL, vmax=ERR_AMPL, cmap=cmap_diff)            
            setlimsxy(lim_xy)                        
            cross_out(plt, cross_out_mask)            
            plt.colorbar(orientation='vertical') # location='bottom')

            ax_nne=plt.subplot(326)
            ax_nne.set_title("Network disparity error")
            plt.imshow(data[...,qsf.NN_DIFF], vmin=-ERR_AMPL, vmax=ERR_AMPL, cmap=cmap_diff)            
            setlimsxy(lim_xy)                        
            cross_out(plt, cross_out_mask)            
            plt.colorbar(orientation='vertical') # location='bottom')
        
            plt.tight_layout(rect =[0,0,1,TIGHT_TOP], h_pad = TIGHT_HPAD, w_pad = TIGHT_WPAD)
            
            figs.append(fig)
            fb_noext = os.path.splitext(os.path.basename(img_file))[0]#
#            if subindex > 0:
#                if subindex < 10:
#                    fb_noext+="abcdefghi"[subindex-1]
#                else:
#                    fb_noext+="-"+str(subindex)
            ffiles.append(fb_noext)
            pass

#    
    #how to allow adjustment before applying tight_layout?
    pass
    for fig in figs:
        fig.tight_layout(rect =[0,0,1,TIGHT_TOP], h_pad = TIGHT_HPAD, w_pad = TIGHT_WPAD)
    
    if FIGS_EXTENSIONS and figs and 'save' in FIGS_SAVESHOW:
        try:
            print ("Creating output directory for figures: ",dirs['figures'])
            os.makedirs(dirs['figures'])
        except:
            pass
        pp=None
        if 'pdf' in FIGS_EXTENSIONS:
            if mode == 'infer':
                pdf_path = os.path.join(dirs['figures'],"figures-infer%s.pdf"%str(min_diff))
            else:
                pdf_path = os.path.join(dirs['figures'],"figures-train%s.pdf"%str(min_diff))
            pp= PdfPages(pdf_path)
        
        for fb_noext, fig in zip(ffiles,figs):
            for ext in FIGS_EXTENSIONS:
                if ext == 'pdf':
                    pass
                    fig.savefig(pp,format='pdf')
                else:
                    if mode == 'infer':
                        noext = fb_noext+'-infer'
                    else:
                        noext = fb_noext+'-train'
                    
                    fig.savefig(
                        fname = os.path.join(dirs['figures'],noext+"."+ext),
                        transparent = TRANSPARENT,
                        )
                pass
        if pp:
            pp.close()
            
            
if 'show' in FIGS_SAVESHOW:    
    plt.show()

#FIGS_ESXTENSIONS

#qsf.evaluateAllResults(result_files = files['result'],
#                       absolute_disparity = ABSOLUTE_DISPARITY,
#                       cluster_radius = CLUSTER_RADIUS)
print("All done")
exit (0)
+36 −8
Original line number Original line Diff line number Diff line
@@ -18,6 +18,7 @@ import imagej_tiffwriter
import time
import time
import imagej_tiff as ijt
import imagej_tiff as ijt
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from matplotlib.backends.backend_pdf import PdfPages
from matplotlib.backends.backend_pdf import PdfPages
import qcstereo_functions as qsf
import qcstereo_functions as qsf
import numpy as np
import numpy as np
@@ -156,11 +157,16 @@ def get_fig_params(disparity_ranges):
extra_path =   os.path.join(root_dir, dbg_parameters['extra'])
extra_path =   os.path.join(root_dir, dbg_parameters['extra'])
eo_width =     dbg_parameters['eo_params']['width']
eo_width =     dbg_parameters['eo_params']['width']
eo_height =    dbg_parameters['eo_params']['height']
eo_height =    dbg_parameters['eo_params']['height']
eo_woi =       dbg_parameters['eo_params']['woi'] # (x,y,width, height)
eo_woi_rel =   dbg_parameters['eo_params']['woi'] # (x,y,width, height)
eo_woi={
    "x":eo_width * eo_woi_rel['x'],
    "y":eo_height * eo_woi_rel['y'],
    "width":eo_width * eo_woi_rel['width'],
    "height":eo_height * eo_woi_rel['height'],
        }
eo_disparity_scale = 1.0/dbg_parameters['eo_params']['disparity_scale'] # 14.2
eo_disparity_scale = 1.0/dbg_parameters['eo_params']['disparity_scale'] # 14.2
image_sets =   dbg_parameters['extra_paths'] # list of dictionaries
image_sets =   dbg_parameters['extra_paths'] # list of dictionaries



pass
pass


#temporary:
#temporary:
@@ -251,6 +257,28 @@ for mode in modes: # ['train']:
            fig.canvas.set_window_title(img_pars['title'])
            fig.canvas.set_window_title(img_pars['title'])
            fig.suptitle(img_pars['title'])
            fig.suptitle(img_pars['title'])
            
            
            #insert LWIR JPEG image
            lwir_rgb = mpimg.imread(os.path.join(extra_path,img_pars['lwir_path']))
            ax_lwir = plt.subplot(421)
            ax_lwir.set_title("LWIR image (1 of 4)")
            plt.imshow(lwir_rgb)

            #insert EO JPEG image
            eo_rgb = mpimg.imread(os.path.join(extra_path,img_pars['eo_path']))
            ax_eo = plt.subplot(422)
            ax_eo.set_title("Visible range image (1 of 4)")
            plt.imshow(eo_rgb)
            if not eo_woi is None:
                eo_woi_jpeg={
                    "x":eo_rgb.shape[1] * eo_woi_rel['x'],
                    "y":eo_rgb.shape[0] * eo_woi_rel['y'],
                    "width":eo_rgb.shape[1] * eo_woi_rel['width'],
                    "height":eo_rgb.shape[0] * eo_woi_rel['height'],
                        }
                xdata=[eo_woi_jpeg['x'], eo_woi_jpeg['x'] + eo_woi_jpeg['width'], eo_woi_jpeg['x'] + eo_woi_jpeg['width'],  eo_woi_jpeg['x'],  eo_woi_jpeg['x']]
                ydata=[eo_woi_jpeg['y'], eo_woi_jpeg['y'], eo_woi_jpeg['y'] + eo_woi_jpeg['height'], eo_woi_jpeg['y'] + eo_woi_jpeg['height'], eo_woi_jpeg['y']]
                plt.plot(xdata,ydata,color=WOI_COLOR)
            
            # Create EO DSI image
            # Create EO DSI image
            # load tiff image
            # load tiff image
             
             
@@ -258,7 +286,7 @@ for mode in modes: # ['train']:
            ds_main = img_ds_main.image[...,img_pars['dsi_slice']] * eo_disparity_scale
            ds_main = img_ds_main.image[...,img_pars['dsi_slice']] * eo_disparity_scale
            ds_main = np.maximum(ds_main, lim_val[0])
            ds_main = np.maximum(ds_main, lim_val[0])
            ds_main = np.minimum(ds_main, lim_val[1])
            ds_main = np.minimum(ds_main, lim_val[1])
            ax_conf=plt.subplot(322)
            ax_conf=plt.subplot(424)
            ax_conf.set_title("Hi-res camera disparity map")
            ax_conf.set_title("Hi-res camera disparity map")
            plt.imshow(ds_main, vmin=lim_val[0], vmax=lim_val[1], cmap=cmap_disp)
            plt.imshow(ds_main, vmin=lim_val[0], vmax=lim_val[1], cmap=cmap_disp)
            setlimsxy([-0.5, eo_width-0.5, -0.5, eo_height - 0.5])
            setlimsxy([-0.5, eo_width-0.5, -0.5, eo_height - 0.5])
@@ -282,28 +310,28 @@ for mode in modes: # ['train']:
            plt.colorbar(orientation='vertical') # location='bottom')
            plt.colorbar(orientation='vertical') # location='bottom')
            '''
            '''
            
            
            ax_gtd=plt.subplot(321)
            ax_gtd=plt.subplot(423)
            ax_gtd.set_title("Ground truth disparity map")
            ax_gtd.set_title("Ground truth disparity map")
            plt.imshow(data[...,qsf.GT_DISP], vmin=lim_val[0], vmax=lim_val[1], cmap=cmap_disp)
            plt.imshow(data[...,qsf.GT_DISP], vmin=lim_val[0], vmax=lim_val[1], cmap=cmap_disp)
            setlimsxy(lim_xy)
            setlimsxy(lim_xy)
            cross_out(plt, cross_out_mask)            
            cross_out(plt, cross_out_mask)            
            plt.colorbar(orientation='vertical') # location='bottom')
            plt.colorbar(orientation='vertical') # location='bottom')
            
            
            ax_hed=plt.subplot(323)
            ax_hed=plt.subplot(425)
            ax_hed.set_title("Heuristic disparity map")
            ax_hed.set_title("Heuristic disparity map")
            plt.imshow(data[...,qsf.HEUR_NAN], vmin=lim_val[0], vmax=lim_val[1], cmap=cmap_disp)            
            plt.imshow(data[...,qsf.HEUR_NAN], vmin=lim_val[0], vmax=lim_val[1], cmap=cmap_disp)            
            setlimsxy(lim_xy)                        
            setlimsxy(lim_xy)                        
            cross_out(plt, cross_out_mask)            
            cross_out(plt, cross_out_mask)            
            plt.colorbar(orientation='vertical') # location='bottom')
            plt.colorbar(orientation='vertical') # location='bottom')
        
        
            ax_nnd=plt.subplot(325)
            ax_nnd=plt.subplot(427)
            ax_nnd.set_title("Network disparity output")
            ax_nnd.set_title("Network disparity output")
            plt.imshow(data[...,qsf.NN_NAN], vmin=lim_val[0], vmax=lim_val[1], cmap=cmap_disp)
            plt.imshow(data[...,qsf.NN_NAN], vmin=lim_val[0], vmax=lim_val[1], cmap=cmap_disp)
            setlimsxy(lim_xy)                        
            setlimsxy(lim_xy)                        
            cross_out(plt, cross_out_mask)            
            cross_out(plt, cross_out_mask)            
            plt.colorbar(orientation='vertical') # location='bottom')
            plt.colorbar(orientation='vertical') # location='bottom')


            ax_hee=plt.subplot(324)
            ax_hee=plt.subplot(426)
            ax_hee.set_title("Heuristic disparity error")
            ax_hee.set_title("Heuristic disparity error")
            cross_out(plt, cross_out_mask)            
            cross_out(plt, cross_out_mask)            
            plt.imshow(data[...,qsf.HEUR_DIFF], vmin=-ERR_AMPL, vmax=ERR_AMPL, cmap=cmap_diff)            
            plt.imshow(data[...,qsf.HEUR_DIFF], vmin=-ERR_AMPL, vmax=ERR_AMPL, cmap=cmap_diff)            
@@ -311,7 +339,7 @@ for mode in modes: # ['train']:
            cross_out(plt, cross_out_mask)            
            cross_out(plt, cross_out_mask)            
            plt.colorbar(orientation='vertical') # location='bottom')
            plt.colorbar(orientation='vertical') # location='bottom')


            ax_nne=plt.subplot(326)
            ax_nne=plt.subplot(428)
            ax_nne.set_title("Network disparity error")
            ax_nne.set_title("Network disparity error")
            plt.imshow(data[...,qsf.NN_DIFF], vmin=-ERR_AMPL, vmax=ERR_AMPL, cmap=cmap_diff)            
            plt.imshow(data[...,qsf.NN_DIFF], vmin=-ERR_AMPL, vmax=ERR_AMPL, cmap=cmap_diff)            
            setlimsxy(lim_xy)                        
            setlimsxy(lim_xy)