123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- #!/usr/bin/python
- # -*- coding: utf-8 -*-
- import numpy as np
- import sys
- import os
- Sensor = {'idSEAWIFS' = 0, 'idMODIS' = 1, 'idMERIS' = 2}
- class Kd_Jamet:
- def __init__(self, idSensor):
- try:
- self.lutpath = os.getenv('KD_LUT_PATH')
- except:
- print "KD_LUT_PATH not set, add it to your environement variables"
- sys.exit()
-
- if Sensor.has_key(idSensor):
- self.init_variables(Sensor[idSensor])
- try:
- self.read_LUTs_Kd(Sensor[idSensor])
- except:
- print "Failed to read %s LUTs" % (idSensor)
- sys.exit()
-
- # -
- # Perceptron parameters setting and array initialization for each Sensor
- # -
- def init_variables(self, idSensor):
- # =======================================================================================================
- # MERIS / OLCI
- # =======================================================================================================
- if idSensor == Sensor['idMERIS']:
- # Variables definiton for network Rrs490/Rrs555 >= .85 -------------------------------------------------
- # hidden layer number
- self.rsup_NC 2
- # input data number
- self.rsup_NE 5
- # number of neuron in the first hidden layer
- self.rsup_NC1 7
- # number of neuron in the second hidden layer
- self.rsup_NC2 4
- # nb output
- self.rsup_NS 1
- # nb input + nb output*/
- self.rsup_NES 6
- # LUTs file names
- self.rsup_LUT_POIDS "KdOLCI_poids_IOCCG_NOMAD_BOUM_ss_12_COASTCOLOUR_443_to_555_log_Kd_lambda_merge_seuil_15_angle_ascii_6x1_hh_7_4_switch_110416.sn"
- self.rsupLUT_MOY "Moy_KdOLCI_IOCCG_NOMAD_BOUM_ss_12_COASTCOLOUR_412_to_670_log_Kd_lambda_merge_seuil_15_angle_publi_ss_620.dat"
- self.rsup_LUT_ECART "Ecart_KdOLCI_IOCCG_NOMAD_BOUM_ss_12_COASTCOLOUR_412_to_670_log_Kd_lambda_merge_seuil_15_angle_publi_ss_620.dat"
- # Variables definiton for network Variables definiton for network < .85 -----------------------------------
- # nombre de couches cachees - hidden layer number
- self.rinf_NC 2
- # input data number*/
- self.rinf_NE 6
- # number of neuron in the first hidden layer
- self.rinf_NC1 5
- # number of neuron in the second hidden layer
- self.rinf_NC2 5
- # nb output
- self.rinf_NS 1
- # nb input + nb output
- self.rinf_NES 7
- #LUTs file names
- self.rinf_LUT_POIDS "KdOLCI_poids_IOCCG_NOMAD_BOUM_ss_12_COASTCOLOUR_443_to_670_log_Kd_lambda_merge_seuil_15_angle_ascii_6x1_hh_5_5_switch_110416.sn"
- self.rinf_LUT_MOY "Moy_KdOLCI_IOCCG_NOMAD_BOUM_ss_12_COASTCOLOUR_412_to_670_log_Kd_lambda_merge_seuil_15_angle_publi_ss_620.dat"
- self.rinf_LUT_ECART "Ecart_KdOLCI_IOCCG_NOMAD_BOUM_ss_12_COASTCOLOUR_412_to_670_log_Kd_lambda_merge_seuil_15_angle_publi_ss_620.dat"
- #LUTs arrays definition
- self.rsup_b1 = np.zeros((rsup_NC1), dtype=np.float32)
- self.rsup_b2 = np.zeros((rsup_NC2), dtype=np.float32)
- self.rsup_b3 = 0.
- self.rsup_w1 = np.zeros((rsup_NE,rsup_NC1), dtype=np.float32)
- self.rsup_w2 = np.zeros((rsup_NC1,rsup_NC2), dtype=np.float32)
- self.rsup_w3 = np.zeros((rsup_NC2), dtype=np.float32)
- self.rsup_moy = np.zeros((rsup_NES), dtype=np.float32)
- self.rsup_ecart = np.zeros((rsup_NES), dtype=np.float32)
- self.rinf_b1 = np.zeros((rinf_NC1), dtype=np.float32)
- self.rinf_b2 = np.zeros((rinf_NC2), dtype=np.float32)
- self.rinf_b3 = 0.
- self.rinf_w1 = np.zeros((rinf_NE,rinf_NC1), dtype=np.float32)
- self.rinf_w2 = np.zeros((rinf_NC1,rinf_NC2), dtype=np.float32)
- self.rinf_w3 = np.zeros((rinf_NC2), dtype=np.float32)
- self.rinf_moy = np.zeros((rinf_NES), dtype=np.float32)
- self.rinf_ecart = np.zeros((rinf_NES), dtype=np.float32)
-
- # -
- # perceptron weights LUT reading
- # -
- def read_LUTs_Kd(self):
- # ----------------------------------------------------------------------------------
- # < .85 weights settings
- weights = numpy.loadtxt( "%s/%s" % (self.lutpath, self.rinf_LUT_POIDS), skiprows=1)
- base = 0
- self.rinf_b1 = weights[base:base+self.rinf_NC1,2]
- base = base+self.rinf_NC1
- self.rsup_b2 = weights[base:base+self.rinf_NC2,2]
- base = base+self.rinf_NC2
- self.rsup_b3 = weights[base:base+self.rinf_NS,2]
- base = base+self.rinf_NS
- for i in range(self.rinf_NE):
- self.rinf_w1[i,:] = weights[base:base+self.rinf_NC1,2]
- base = base+self.rinf_NC1
- for i in range(self.rinf_NC1):
- self.rinf_w2[i,:] = weights[base:base+self.rinf_NC2,2]
- base = base+self.rinf_NC2
- self.rinf_w3 = weights[base:base+self.rinf_NC3,2]
-
- usedData = np.array([1,2,3,4,5,6,8])
- if idSensor == Sensor['idMODIS']:
- usedData = np.array([1,2,3,4,6,7,9])
- moy = numpy.loadtxt( "%s/%s" % (self.lutpath, self.rinf_LUT_MOY))
- self.rinf_moy = moy[usedData]
- ecart = numpy.loadtxt( "%s/%s" % (self.lutpath, self.rinf_LUT_ECART))
- self.rinf_ecart = ecart[usedData]
-
- # ----------------------------------------------------------------------------------
- # >= .85 weights settings
- weights = numpy.loadtxt( "%s/%s" % (self.lutpath, self.rsup_LUT_POIDS), skiprows=1)
- base = 0
- self.rsup_b1 = weights[base:base+self.rsup_NC1,2]
- base = base+self.rsup_NC1
- self.rsup_b2 = weights[base:base+self.rsup_NC2,2]
- base = base+self.rsup_NC2
- self.rsup_b3 = weights[base:base+self.rsup_NS,2]
- base = base+self.rsup_NS
- for i in range(self.rsup_NE):
- self.rsup_w1[i,:] = weights[base:base+self.rsup_NC1,2]
- base = base+self.rsup_NC1
- for i in range(self.rsup_NC1):
- self.rsup_w2[i,:] = weights[base:base+self.rsup_NC2,2]
- base = base+self.rsup_NC2
- self.rsup_w3 = weights[base:base+self.rsup_NC3,2]
-
- usedData = np.array([1,2,3,4,6,8])
- if idSensor == Sensor['idMODIS']:
- usedData = np.array([1,2,3,4,7,9])
- moy = numpy.loadtxt( "%s/%s" % (self.lutpath, self.rsup_LUT_MOY))
- self.rsup_moy = moy[usedData]
- ecart = numpy.loadtxt( "%s/%s" % (self.lutpath, self.rsup_LUT_ECART))
- self.rsup_ecart = ecart[usedData]
-
- # -
- # Kd computing < .85
- # input = nRrs + output Lambda
- # -
- def passe_avant_sup(self, indata):
- # Normalization
- x = ((2/3.) * indata[:] - self.rsup_moy[:]) / self.rsup_ecart[:]
-
- a = np.zeros(self.rsup_NC1,dtype=np.float32)
- for i in range(self.rsup_NC1):
- for j in range(self.rsup_NE):
- a[i] = a[i] + x[j] * self.rsup_w1[j][i]
- a[:] = 1.715905*np.tanh((2./3.)*(a[:] + self.rsupSW_b1[:]))
- b = np.zeros[self.rsup_NC2,dtype=np.float32]
- for i in range(self.rsup_NC2):
- for j in range(self.rsup_NC1):
- b[i] = b[i] + a[j] * self.rsup_w2[j][i]
- b[:] = 1.715905*np.tanh((2./3.)*(b[:] + self.rsupSW_b2[:]))
-
- y = np.sum(b[:] * self.rsupSW_w3[:])
- # Denormalisation
- y = 1.5*(y + self.rsupSW_b3)*self.rsupSW_ecart[self.rsupSW_NES-1] + self.rsupSW_moy[self.rsupSW_NES-1]
- y = 10.**y
- return(y)
-
- # -
- # Kd computing >= .85
- # input = nRrs + output Lambda
- # -
- def passe_avant_inf(self, indata):
- # Normalization
- x = ((2/3.) * indata[:] - self.rinf_moy[:]) / self.rinf_ecart[:]
-
- a = np.zeros(self.rinf_NC1,dtype=np.float32)
- for i in range(self.rinf_NC1):
- for j in range(self.rinf_NE):
- a[i] = a[i] + x[j] * self.rinf_w1[j][i]
- a[:] = 1.715905*np.tanh((2./3.)*(a[:] + self.rinfSW_b1[:]))
- b = np.zeros[self.rinf_NC2,dtype=np.float32]
- for i in range(self.rinf_NC2):
- for j in range(self.rinf_NC1):
- b[i] = b[i] + a[j] * self.rinf_w2[j][i]
- b[:] = 1.715905*np.tanh((2./3.)*(b[:] + self.rinfSW_b2[:]))
-
- y = np.sum(b[:] * self.rinfSW_w3[:])
- # Denormalisation
- y = 1.5*(y + self.rinfSW_b3)*self.rinfSW_ecart[self.rinfSW_NES-1] + self.rinfSW_moy[self.rinfSW_NES-1]
- y = 10.**y
- return(y)
|