|
@@ -10,16 +10,24 @@ import base64
|
|
|
import random
|
|
|
import numpy as np
|
|
|
from datetime import datetime
|
|
|
+import pickle
|
|
|
+import time
|
|
|
+
|
|
|
+# expe imports
|
|
|
+from .expes.quest_plus import QuestPlus
|
|
|
+from .expes.quest_plus import psychometric_fun
|
|
|
+
|
|
|
+from .expes.run import run_quest_one_image
|
|
|
|
|
|
# image processing imports
|
|
|
import io
|
|
|
from PIL import Image
|
|
|
|
|
|
-# api imports
|
|
|
+# module imports
|
|
|
from .utils import api
|
|
|
from .utils import functions
|
|
|
|
|
|
-from .quest.processing import crop_images
|
|
|
+from .utils.processing import crop_images
|
|
|
from . import config as cfg
|
|
|
|
|
|
|
|
@@ -33,6 +41,20 @@ def expe_list(request):
|
|
|
|
|
|
return render(request, 'expe/expe_list.html', {'scenes': scenes, 'expes': expes})
|
|
|
|
|
|
+def indications(request):
|
|
|
+
|
|
|
+ # get param
|
|
|
+ expe_name = request.GET.get('expe')
|
|
|
+
|
|
|
+ # expe parameters
|
|
|
+ data = {
|
|
|
+ 'expe_name': expe_name,
|
|
|
+ 'question': cfg.expes_configuration[expe_name]['text']['question'],
|
|
|
+ 'indication': cfg.expes_configuration[expe_name]['text']['indication']
|
|
|
+ }
|
|
|
+
|
|
|
+ return render(request, 'expe/expe_indications.html', data)
|
|
|
+
|
|
|
|
|
|
# Create your views here.
|
|
|
def expe(request):
|
|
@@ -40,86 +62,92 @@ def expe(request):
|
|
|
# get param
|
|
|
expe_name = request.GET.get('expe')
|
|
|
scene_name = request.GET.get('scene')
|
|
|
+
|
|
|
+ # default filepath name
|
|
|
+ filepath_img = ''
|
|
|
|
|
|
# unique user ID during session (user can launch multiple exeperiences)
|
|
|
if 'id' not in request.session:
|
|
|
request.session['id'] = functions.uniqueID()
|
|
|
|
|
|
# first time expe is launched add expe information
|
|
|
- if 'expe' not in request.session:
|
|
|
- request.session['expe'] = expe_name
|
|
|
- request.session['begin'] = True
|
|
|
- else:
|
|
|
- request.session['begin'] = False
|
|
|
-
|
|
|
- print(request.session.get('begin'))
|
|
|
-
|
|
|
- # update ref img at first time or expe changed
|
|
|
- if expe_name != request.session.get('expe'):
|
|
|
- #if 'ref_img' not in request.session or expe_name != request.session.get('expe'):
|
|
|
- request.session['begin'] = True
|
|
|
- request.session['qualities'] = api.get_scene_qualities(scene_name)
|
|
|
- # update unique timestamp each time new experience is launched
|
|
|
- request.session['timestamp'] = datetime.strftime(datetime.utcnow(), "%Y-%m-%d_%Hh%Mm%Ss")
|
|
|
-
|
|
|
- # TODO : add in cache ref_image
|
|
|
- # get reference image
|
|
|
- #ref_image = api.get_image(scene_name, 'max')
|
|
|
- # save ref image as list (can't save python object)
|
|
|
- #request.session['ref_img'] = np.array(ref_image).tolist()
|
|
|
+ if 'expe' not in request.session or expe_name != request.session.get('expe'):
|
|
|
+ refresh_data(request, expe_name, scene_name)
|
|
|
|
|
|
- # construct new image
|
|
|
- quality = random.choice(request.session.get('qualities'))
|
|
|
- noisy_image = api.get_image(scene_name, quality)
|
|
|
-
|
|
|
- # reconstruct reference image from list stored into session
|
|
|
- # ref_image = Image.fromarray(np.array(request.session.get('ref_img')))
|
|
|
- ref_image = api.get_image(scene_name, 'max')
|
|
|
- img_merge, per, orien, swap_img = crop_images(noisy_image, ref_image)
|
|
|
-
|
|
|
- # create output folder for tmp files if necessary
|
|
|
- tmp_folder = os.path.join(settings.MEDIA_ROOT, cfg.output_tmp_folder)
|
|
|
-
|
|
|
- if not os.path.exists(tmp_folder):
|
|
|
- os.makedirs(tmp_folder)
|
|
|
-
|
|
|
- # generate tmp merged image (pass as BytesIO was complicated..)
|
|
|
- # TODO : add crontab task to erase generated img
|
|
|
- filepath_img = os.path.join(tmp_folder, request.session.get('id') + '_' + scene_name + '' + expe_name + '.png')
|
|
|
- img_merge.save(filepath_img)
|
|
|
+ # refresh if scene_name changed
|
|
|
+ if 'scene' not in request.session or scene_name != request.session.get('scene'):
|
|
|
+ refresh_data(request, expe_name, scene_name)
|
|
|
|
|
|
# create output folder for expe_result
|
|
|
current_day = datetime.strftime(datetime.utcnow(), "%Y-%m-%d")
|
|
|
- results_folder = os.path.join(cfg.output_expe_folder.format(current_day))
|
|
|
+ results_folder = os.path.join(settings.MEDIA_ROOT, cfg.output_expe_folder.format(current_day))
|
|
|
|
|
|
if not os.path.exists(results_folder):
|
|
|
os.makedirs(results_folder)
|
|
|
|
|
|
- result_filename = expe_name + '_' + request.session.get('id') + '_' + request.session.get('timestamp') +".csv"
|
|
|
+ result_filename = expe_name + '_' + scene_name + '_' + request.session.get('id') + '_' + request.session.get('timestamp') +".csv"
|
|
|
results_filepath = os.path.join(results_folder, result_filename)
|
|
|
|
|
|
if not os.path.exists(results_filepath):
|
|
|
- f = open(results_filepath, 'w')
|
|
|
- functions.write_header_expe(f, expe_name)
|
|
|
+ output_file = open(results_filepath, 'w')
|
|
|
+ functions.write_header_expe(output_file, expe_name)
|
|
|
else:
|
|
|
- f = open(results_filepath, 'a')
|
|
|
+ output_file = open(results_filepath, 'a')
|
|
|
|
|
|
- #orientation : 0 = vertical, 1 = horizontal
|
|
|
- #image_ref_position : 0 = right/bottom, 1 = left/up
|
|
|
- #answer : left = 1, right = 0
|
|
|
+ # create `quest` object if not exists
|
|
|
+ models_folder = os.path.join(settings.MEDIA_ROOT, cfg.model_expe_folder.format(current_day))
|
|
|
+
|
|
|
+ if not os.path.exists(models_folder):
|
|
|
+ os.makedirs(models_folder)
|
|
|
+
|
|
|
+ model_filename = result_filename.replace('.csv', '.obj')
|
|
|
+ model_filepath = os.path.join(models_folder, model_filename)
|
|
|
+
|
|
|
+ # run `quest` expe
|
|
|
+ img_merge = run_quest_one_image(request, model_filepath, output_file)
|
|
|
+
|
|
|
+ if not request.session.get('expe_finished'):
|
|
|
+ # create output folder for tmp files if necessary
|
|
|
+ tmp_folder = os.path.join(settings.MEDIA_ROOT, cfg.output_tmp_folder)
|
|
|
+
|
|
|
+ if not os.path.exists(tmp_folder):
|
|
|
+ os.makedirs(tmp_folder)
|
|
|
+
|
|
|
+ # generate tmp merged image (pass as BytesIO was complicated..)
|
|
|
+ # TODO : add crontab task to erase generated img
|
|
|
+ filepath_img = os.path.join(tmp_folder, request.session.get('id') + '_' + scene_name + '' + expe_name + '.png')
|
|
|
+ img_merge.save(filepath_img)
|
|
|
+ else:
|
|
|
+ # reinit session as default value
|
|
|
+ del request.session['expe']
|
|
|
+ del request.session['scene']
|
|
|
+ del request.session['qualities']
|
|
|
+ del request.session['timestamp']
|
|
|
|
|
|
- print("here")
|
|
|
-
|
|
|
# expe parameters
|
|
|
data = {
|
|
|
'expe_name': expe_name,
|
|
|
'img_merged_path': filepath_img,
|
|
|
- 'question': cfg.expe_questions[expe_name]['question'],
|
|
|
- 'indication': cfg.expe_questions[expe_name]['indication']
|
|
|
+ 'end_text': cfg.expes_configuration[expe_name]['text']['end_text']
|
|
|
}
|
|
|
|
|
|
return render(request, 'expe/expe.html', data)
|
|
|
|
|
|
|
|
|
-def run_quest_one_image():
|
|
|
- pass
|
|
|
+def refresh_data(request, expe_name, scene_name):
|
|
|
+
|
|
|
+ request.session['expe'] = expe_name
|
|
|
+ request.session['scene'] = scene_name
|
|
|
+
|
|
|
+ request.session['expe_started'] = False
|
|
|
+ request.session['expe_finished'] = False
|
|
|
+
|
|
|
+ request.session['qualities'] = api.get_scene_qualities(scene_name)
|
|
|
+ # update unique timestamp each time new experience is launched
|
|
|
+ request.session['timestamp'] = datetime.strftime(datetime.utcnow(), "%Y-%m-%d_%Hh%Mm%Ss")
|
|
|
+
|
|
|
+ # TODO : add in cache ref_image
|
|
|
+ # get reference image
|
|
|
+ #ref_image = api.get_image(scene_name, 'max')
|
|
|
+ # save ref image as list (can't save python object)
|
|
|
+ #request.session['ref_img'] = np.array(ref_image).tolist()
|