class_KdJamet.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. import numpy as np
  4. import sys
  5. import os
  6. Sensor = {'idSEAWIFS' = 0, 'idMODIS' = 1, 'idMERIS' = 2}
  7. class Kd_Jamet:
  8. def __init__(self, idSensor):
  9. try:
  10. self.lutpath = os.getenv('KD_LUT_PATH')
  11. except:
  12. print "KD_LUT_PATH not set, add it to your environement variables"
  13. sys.exit()
  14. if Sensor.has_key(idSensor):
  15. self.init_variables(Sensor[idSensor])
  16. try:
  17. self.read_LUTs_Kd(Sensor[idSensor])
  18. except:
  19. print "Failed to read %s LUTs" % (idSensor)
  20. sys.exit()
  21. # -
  22. # Perceptron parameters setting and array initialization for each Sensor
  23. # -
  24. def init_variables(self, idSensor):
  25. # =======================================================================================================
  26. # MERIS / OLCI
  27. # =======================================================================================================
  28. if idSensor == Sensor['idMERIS']:
  29. # Variables definiton for network Rrs490/Rrs555 >= .85 -------------------------------------------------
  30. # hidden layer number
  31. self.rsup_NC 2
  32. # input data number
  33. self.rsup_NE 5
  34. # number of neuron in the first hidden layer
  35. self.rsup_NC1 7
  36. # number of neuron in the second hidden layer
  37. self.rsup_NC2 4
  38. # nb output
  39. self.rsup_NS 1
  40. # nb input + nb output*/
  41. self.rsup_NES 6
  42. # LUTs file names
  43. 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"
  44. 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"
  45. 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"
  46. # Variables definiton for network Variables definiton for network < .85 -----------------------------------
  47. # nombre de couches cachees - hidden layer number
  48. self.rinf_NC 2
  49. # input data number*/
  50. self.rinf_NE 6
  51. # number of neuron in the first hidden layer
  52. self.rinf_NC1 5
  53. # number of neuron in the second hidden layer
  54. self.rinf_NC2 5
  55. # nb output
  56. self.rinf_NS 1
  57. # nb input + nb output
  58. self.rinf_NES 7
  59. #LUTs file names
  60. 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"
  61. 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"
  62. 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"
  63. #LUTs arrays definition
  64. self.rsup_b1 = np.zeros((rsup_NC1), dtype=np.float32)
  65. self.rsup_b2 = np.zeros((rsup_NC2), dtype=np.float32)
  66. self.rsup_b3 = 0.
  67. self.rsup_w1 = np.zeros((rsup_NE,rsup_NC1), dtype=np.float32)
  68. self.rsup_w2 = np.zeros((rsup_NC1,rsup_NC2), dtype=np.float32)
  69. self.rsup_w3 = np.zeros((rsup_NC2), dtype=np.float32)
  70. self.rsup_moy = np.zeros((rsup_NES), dtype=np.float32)
  71. self.rsup_ecart = np.zeros((rsup_NES), dtype=np.float32)
  72. self.rinf_b1 = np.zeros((rinf_NC1), dtype=np.float32)
  73. self.rinf_b2 = np.zeros((rinf_NC2), dtype=np.float32)
  74. self.rinf_b3 = 0.
  75. self.rinf_w1 = np.zeros((rinf_NE,rinf_NC1), dtype=np.float32)
  76. self.rinf_w2 = np.zeros((rinf_NC1,rinf_NC2), dtype=np.float32)
  77. self.rinf_w3 = np.zeros((rinf_NC2), dtype=np.float32)
  78. self.rinf_moy = np.zeros((rinf_NES), dtype=np.float32)
  79. self.rinf_ecart = np.zeros((rinf_NES), dtype=np.float32)
  80. # -
  81. # perceptron weights LUT reading
  82. # -
  83. def read_LUTs_Kd(self):
  84. # ----------------------------------------------------------------------------------
  85. # < .85 weights settings
  86. weights = numpy.loadtxt( "%s/%s" % (self.lutpath, self.rinf_LUT_POIDS), skiprows=1)
  87. base = 0
  88. self.rinf_b1 = weights[base:base+self.rinf_NC1,2]
  89. base = base+self.rinf_NC1
  90. self.rsup_b2 = weights[base:base+self.rinf_NC2,2]
  91. base = base+self.rinf_NC2
  92. self.rsup_b3 = weights[base:base+self.rinf_NS,2]
  93. base = base+self.rinf_NS
  94. for i in range(self.rinf_NE):
  95. self.rinf_w1[i,:] = weights[base:base+self.rinf_NC1,2]
  96. base = base+self.rinf_NC1
  97. for i in range(self.rinf_NC1):
  98. self.rinf_w2[i,:] = weights[base:base+self.rinf_NC2,2]
  99. base = base+self.rinf_NC2
  100. self.rinf_w3 = weights[base:base+self.rinf_NC3,2]
  101. usedData = np.array([1,2,3,4,5,6,8])
  102. if idSensor == Sensor['idMODIS']:
  103. usedData = np.array([1,2,3,4,6,7,9])
  104. moy = numpy.loadtxt( "%s/%s" % (self.lutpath, self.rinf_LUT_MOY))
  105. self.rinf_moy = moy[usedData]
  106. ecart = numpy.loadtxt( "%s/%s" % (self.lutpath, self.rinf_LUT_ECART))
  107. self.rinf_ecart = ecart[usedData]
  108. # ----------------------------------------------------------------------------------
  109. # >= .85 weights settings
  110. weights = numpy.loadtxt( "%s/%s" % (self.lutpath, self.rsup_LUT_POIDS), skiprows=1)
  111. base = 0
  112. self.rsup_b1 = weights[base:base+self.rsup_NC1,2]
  113. base = base+self.rsup_NC1
  114. self.rsup_b2 = weights[base:base+self.rsup_NC2,2]
  115. base = base+self.rsup_NC2
  116. self.rsup_b3 = weights[base:base+self.rsup_NS,2]
  117. base = base+self.rsup_NS
  118. for i in range(self.rsup_NE):
  119. self.rsup_w1[i,:] = weights[base:base+self.rsup_NC1,2]
  120. base = base+self.rsup_NC1
  121. for i in range(self.rsup_NC1):
  122. self.rsup_w2[i,:] = weights[base:base+self.rsup_NC2,2]
  123. base = base+self.rsup_NC2
  124. self.rsup_w3 = weights[base:base+self.rsup_NC3,2]
  125. usedData = np.array([1,2,3,4,6,8])
  126. if idSensor == Sensor['idMODIS']:
  127. usedData = np.array([1,2,3,4,7,9])
  128. moy = numpy.loadtxt( "%s/%s" % (self.lutpath, self.rsup_LUT_MOY))
  129. self.rsup_moy = moy[usedData]
  130. ecart = numpy.loadtxt( "%s/%s" % (self.lutpath, self.rsup_LUT_ECART))
  131. self.rsup_ecart = ecart[usedData]
  132. # -
  133. # Kd computing < .85
  134. # input = nRrs + output Lambda
  135. # -
  136. def passe_avant_sup(self, indata):
  137. # Normalization
  138. x = ((2/3.) * indata[:] - self.rsup_moy[:]) / self.rsup_ecart[:]
  139. a = np.zeros(self.rsup_NC1,dtype=np.float32)
  140. for i in range(self.rsup_NC1):
  141. for j in range(self.rsup_NE):
  142. a[i] = a[i] + x[j] * self.rsup_w1[j][i]
  143. a[:] = 1.715905*np.tanh((2./3.)*(a[:] + self.rsupSW_b1[:]))
  144. b = np.zeros[self.rsup_NC2,dtype=np.float32]
  145. for i in range(self.rsup_NC2):
  146. for j in range(self.rsup_NC1):
  147. b[i] = b[i] + a[j] * self.rsup_w2[j][i]
  148. b[:] = 1.715905*np.tanh((2./3.)*(b[:] + self.rsupSW_b2[:]))
  149. y = np.sum(b[:] * self.rsupSW_w3[:])
  150. # Denormalisation
  151. y = 1.5*(y + self.rsupSW_b3)*self.rsupSW_ecart[self.rsupSW_NES-1] + self.rsupSW_moy[self.rsupSW_NES-1]
  152. y = 10.**y
  153. return(y)
  154. # -
  155. # Kd computing >= .85
  156. # input = nRrs + output Lambda
  157. # -
  158. def passe_avant_inf(self, indata):
  159. # Normalization
  160. x = ((2/3.) * indata[:] - self.rinf_moy[:]) / self.rinf_ecart[:]
  161. a = np.zeros(self.rinf_NC1,dtype=np.float32)
  162. for i in range(self.rinf_NC1):
  163. for j in range(self.rinf_NE):
  164. a[i] = a[i] + x[j] * self.rinf_w1[j][i]
  165. a[:] = 1.715905*np.tanh((2./3.)*(a[:] + self.rinfSW_b1[:]))
  166. b = np.zeros[self.rinf_NC2,dtype=np.float32]
  167. for i in range(self.rinf_NC2):
  168. for j in range(self.rinf_NC1):
  169. b[i] = b[i] + a[j] * self.rinf_w2[j][i]
  170. b[:] = 1.715905*np.tanh((2./3.)*(b[:] + self.rinfSW_b2[:]))
  171. y = np.sum(b[:] * self.rinfSW_w3[:])
  172. # Denormalisation
  173. y = 1.5*(y + self.rinfSW_b3)*self.rinfSW_ecart[self.rinfSW_NES-1] + self.rinfSW_moy[self.rinfSW_NES-1]
  174. y = 10.**y
  175. return(y)