run.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. # main imports
  2. import os
  3. import time
  4. import numpy as np
  5. import pickle
  6. # module imports
  7. from ..utils import api
  8. from ..utils.processing import crop_images
  9. from .. import config as cfg
  10. # expe imports
  11. from .quest_plus import QuestPlus
  12. from .quest_plus import psychometric_fun
  13. def run_quest_one_image(request, model_filepath, output_file):
  14. # get parameters
  15. qualities = request.session.get('qualities')
  16. scene_name = request.session.get('scene')
  17. expe_name = request.session.get('expe')
  18. # by default
  19. iteration = 0
  20. # used to stop when necessary
  21. if 'iteration' in request.GET:
  22. iteration = int(request.GET.get('iteration'))
  23. else:
  24. request.session['expe_started'] = False
  25. # first time only init `quest`
  26. # if experience is started we can save data
  27. if request.session.get('expe_started'):
  28. # does not change expe parameters
  29. if request.session['expe_previous_iteration'] == iteration:
  30. return None
  31. else:
  32. answer = int(request.GET.get('answer'))
  33. answer_time = time.time() - request.session['answer_time']
  34. print("Answer time is ", answer_time)
  35. previous_percentage = request.session.get('expe_percentage')
  36. previous_orientation = request.session.get('expe_orientation')
  37. previous_position = request.session.get('expe_position')
  38. previous_stim = request.session.get('expe_stim')
  39. # default params
  40. thresholds = np.arange(50, 10000, 50)
  41. stim_space=np.asarray(qualities)
  42. slopes = np.arange(0.0001, 0.001, 0.00003)
  43. # check if necessary to construct `quest` object
  44. if not os.path.exists(model_filepath):
  45. qp = QuestPlus(stim_space, [thresholds, slopes], function=psychometric_fun)
  46. else:
  47. print('Load `qp` model')
  48. filehandler = open(model_filepath, 'rb')
  49. qp = pickle.load(filehandler)
  50. # if experience is already began
  51. if request.session.get('expe_started'):
  52. # TODO : check `i` variable
  53. # update of `quest`
  54. # qp.update(qualities[i], answer)
  55. qp.update(qualities[iteration], answer)
  56. entropy = qp.get_entropy()
  57. line = str(previous_stim)
  58. line += ";" + scene_name
  59. line += ";" + str(previous_percentage)
  60. line += ";" + str(previous_orientation)
  61. line += ";" + str(previous_position)
  62. line += ";" + str(answer)
  63. line += ";" + str(answer_time)
  64. line += ";" + str(entropy)
  65. line += '\n'
  66. output_file.write(line)
  67. output_file.flush()
  68. # save `quest` model
  69. file_pi = open(model_filepath, 'wb')
  70. pickle.dump(qp, file_pi)
  71. # construct image
  72. if iteration < cfg.expes_configuration[expe_name]['params']['iterations']:
  73. # process `quest`
  74. next_stim = qp.next_contrast()
  75. print("Next quality ", next_stim)
  76. # construct new image
  77. noisy_image = api.get_image(scene_name, next_stim)
  78. # reconstruct reference image from list stored into session
  79. ref_image = api.get_image(scene_name, 'max')
  80. img_merge, percentage, orientation, position = crop_images(noisy_image, ref_image)
  81. else:
  82. request.session['expe_finished'] = True
  83. return None
  84. # set current step data
  85. request.session['expe_percentage'] = percentage
  86. request.session['expe_orientation'] = orientation
  87. request.session['expe_position'] = position
  88. request.session['answer_time'] = time.time()
  89. request.session['expe_previous_iteration'] = iteration
  90. request.session['expe_stim'] = str(next_stim)
  91. # expe is now started
  92. request.session['expe_started'] = True
  93. return img_merge