predict_seuil_expe.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. from sklearn.externals import joblib
  2. import numpy as np
  3. from ipfml import processing, utils
  4. from PIL import Image
  5. import sys, os, getopt
  6. import subprocess
  7. import time
  8. from modules.utils import config as cfg
  9. config_filename = cfg.config_filename
  10. scenes_path = cfg.dataset_path
  11. min_max_filename = cfg.min_max_filename_extension
  12. threshold_expe_filename = cfg.seuil_expe_filename
  13. threshold_map_folder = cfg.threshold_map_folder
  14. threshold_map_file_prefix = cfg.threshold_map_folder + "_"
  15. zones = cfg.zones_indices
  16. tmp_filename = '/tmp/__model__img_to_predict.png'
  17. current_dirpath = os.getcwd()
  18. def main():
  19. p_custom = False
  20. # TODO : use of argparse
  21. if len(sys.argv) <= 1:
  22. print('Run with default parameters...')
  23. print('python predict_seuil_expe.py --interval "0,20" --model path/to/xxxx.joblib --mode svdn --metric lab --limit_detection xx --custom min_max_filename')
  24. sys.exit(2)
  25. try:
  26. opts, args = getopt.getopt(sys.argv[1:], "ht:m:o:l:c", ["help=", "interval=", "model=", "mode=", "metric=" "limit_detection=", "custom="])
  27. except getopt.GetoptError:
  28. # print help information and exit:
  29. print('python predict_seuil_expe.py --interval "xx,xx" --model path/to/xxxx.joblib --mode svdn --metric lab --limit_detection xx --custom min_max_filename')
  30. sys.exit(2)
  31. for o, a in opts:
  32. if o == "-h":
  33. print('python predict_seuil_expe.py --interval "xx,xx" --model path/to/xxxx.joblib --mode svdn --metric lab --limit_detection xx --custom min_max_filename')
  34. sys.exit()
  35. elif o in ("-t", "--interval"):
  36. p_interval = a
  37. elif o in ("-mo", "--model"):
  38. p_model_file = a
  39. elif o in ("-o", "--mode"):
  40. p_mode = a
  41. if p_mode != 'svdn' and p_mode != 'svdne' and p_mode != 'svd':
  42. assert False, "Mode not recognized"
  43. elif o in ("-me", "--metric"):
  44. p_metric = a
  45. elif o in ("-l", "--limit_detection"):
  46. p_limit = int(a)
  47. elif o in ("-c", "--custom"):
  48. p_custom = a
  49. else:
  50. assert False, "unhandled option"
  51. scenes = os.listdir(scenes_path)
  52. scenes = [s for s in scenes if not min_max_filename in s]
  53. # go ahead each scenes
  54. for id_scene, folder_scene in enumerate(scenes):
  55. print(folder_scene)
  56. scene_path = os.path.join(scenes_path, folder_scene)
  57. config_path = os.path.join(scene_path, config_filename)
  58. with open(config_path, "r") as config_file:
  59. last_image_name = config_file.readline().strip()
  60. prefix_image_name = config_file.readline().strip()
  61. start_index_image = config_file.readline().strip()
  62. end_index_image = config_file.readline().strip()
  63. step_counter = int(config_file.readline().strip())
  64. threshold_expes = []
  65. threshold_expes_detected = []
  66. threshold_expes_counter = []
  67. threshold_expes_found = []
  68. # get zones list info
  69. for index in zones:
  70. index_str = str(index)
  71. if len(index_str) < 2:
  72. index_str = "0" + index_str
  73. zone_folder = "zone"+index_str
  74. threshold_path_file = os.path.join(os.path.join(scene_path, zone_folder), threshold_expe_filename)
  75. with open(threshold_path_file) as f:
  76. threshold = int(f.readline())
  77. threshold_expes.append(threshold)
  78. # Initialize default data to get detected model threshold found
  79. threshold_expes_detected.append(False)
  80. threshold_expes_counter.append(0)
  81. threshold_expes_found.append(int(end_index_image)) # by default use max
  82. current_counter_index = int(start_index_image)
  83. end_counter_index = int(end_index_image)
  84. print(current_counter_index)
  85. check_all_done = False
  86. while(current_counter_index <= end_counter_index and not check_all_done):
  87. current_counter_index_str = str(current_counter_index)
  88. while len(start_index_image) > len(current_counter_index_str):
  89. current_counter_index_str = "0" + current_counter_index_str
  90. img_path = os.path.join(scene_path, prefix_image_name + current_counter_index_str + ".png")
  91. current_img = Image.open(img_path)
  92. img_blocks = processing.divide_in_blocks(current_img, (200, 200))
  93. check_all_done = all(d == True for d in threshold_expes_detected)
  94. for id_block, block in enumerate(img_blocks):
  95. # check only if necessary for this scene (not already detected)
  96. if not threshold_expes_detected[id_block]:
  97. tmp_file_path = tmp_filename.replace('__model__', p_model_file.split('/')[-1].replace('.joblib', '_'))
  98. block.save(tmp_file_path)
  99. python_cmd = "python predict_noisy_image_svd.py --image " + tmp_file_path + \
  100. " --interval '" + p_interval + \
  101. "' --model " + p_model_file + \
  102. " --mode " + p_mode + \
  103. " --metric " + p_metric
  104. # specify use of custom file for min max normalization
  105. if p_custom:
  106. python_cmd = python_cmd + ' --custom ' + p_custom
  107. ## call command ##
  108. p = subprocess.Popen(python_cmd, stdout=subprocess.PIPE, shell=True)
  109. (output, err) = p.communicate()
  110. ## Wait for result ##
  111. p_status = p.wait()
  112. prediction = int(output)
  113. if prediction == 0:
  114. threshold_expes_counter[id_block] = threshold_expes_counter[id_block] + 1
  115. else:
  116. threshold_expes_counter[id_block] = 0
  117. if threshold_expes_counter[id_block] == p_limit:
  118. threshold_expes_detected[id_block] = True
  119. threshold_expes_found[id_block] = current_counter_index
  120. print(str(id_block) + " : " + str(current_counter_index) + "/" + str(threshold_expes[id_block]) + " => " + str(prediction))
  121. current_counter_index += step_counter
  122. print("------------------------")
  123. print("Scene " + str(id_scene + 1) + "/" + str(len(scenes)))
  124. print("------------------------")
  125. # end of scene => display of results
  126. # construct path using model name for saving threshold map folder
  127. model_treshold_path = os.path.join(threshold_map_folder, p_model_file.split('/')[-1].replace('.joblib', ''))
  128. # create threshold model path if necessary
  129. if not os.path.exists(model_treshold_path):
  130. os.makedirs(model_treshold_path)
  131. abs_dist = []
  132. map_filename = os.path.join(model_treshold_path, threshold_map_file_prefix + folder_scene)
  133. f_map = open(map_filename, 'w')
  134. line_information = ""
  135. # default header
  136. f_map.write('| | | | |\n')
  137. f_map.write('---|----|----|---\n')
  138. for id, threshold in enumerate(threshold_expes_found):
  139. line_information += str(threshold) + " / " + str(threshold_expes[id]) + " | "
  140. abs_dist.append(abs(threshold - threshold_expes[id]))
  141. if (id + 1) % 4 == 0:
  142. f_map.write(line_information + '\n')
  143. line_information = ""
  144. f_map.write(line_information + '\n')
  145. min_abs_dist = min(abs_dist)
  146. max_abs_dist = max(abs_dist)
  147. avg_abs_dist = sum(abs_dist) / len(abs_dist)
  148. f_map.write('\nScene information : ')
  149. f_map.write('\n- BEGIN : ' + str(start_index_image))
  150. f_map.write('\n- END : ' + str(end_index_image))
  151. f_map.write('\n\nDistances information : ')
  152. f_map.write('\n- MIN : ' + str(min_abs_dist))
  153. f_map.write('\n- MAX : ' + str(max_abs_dist))
  154. f_map.write('\n- AVG : ' + str(avg_abs_dist))
  155. f_map.write('\n\nOther information : ')
  156. f_map.write('\n- Detection limit : ' + str(p_limit))
  157. # by default print last line
  158. f_map.close()
  159. print("Scene " + str(id_scene + 1) + "/" + str(len(scenes)) + " Done..")
  160. print("------------------------")
  161. time.sleep(10)
  162. if __name__== "__main__":
  163. main()