# -*- coding: utf-8 -*-
"""
Dependencies: flask, tornado
"""
from __future__ import absolute_import, division, print_function
import simplejson as json
from flask import request, redirect, url_for, current_app
from ibeis.control import controller_inject
from ibeis.web import appfuncs as appf
from ibeis import constants as const
from ibeis.constants import PI, TAU
import utool as ut
register_route = controller_inject.get_ibeis_flask_route(__name__)
@register_route('/submit/detection/', methods=['POST'])
[docs]def submit_detection():
ibs = current_app.ibs
method = request.form.get('detection-submit', '')
imgsetid = request.args.get('imgsetid', '')
imgsetid = None if imgsetid == 'None' or imgsetid == '' else int(imgsetid)
gid = int(request.form['detection-gid'])
turk_id = request.cookies.get('turk_id', -1)
if method.lower() == 'delete':
# ibs.delete_images(gid)
# print('[web] (DELETED) turk_id: %s, gid: %d' % (turk_id, gid, ))
pass
elif method.lower() == 'clear':
aid_list = ibs.get_image_aids(gid)
ibs.delete_annots(aid_list)
print('[web] (CLEAERED) turk_id: %s, gid: %d' % (turk_id, gid, ))
redirection = request.referrer
if 'gid' not in redirection:
# Prevent multiple clears
if '?' in redirection:
redirection = '%s&gid=%d' % (redirection, gid, )
else:
redirection = '%s?gid=%d' % (redirection, gid, )
return redirect(redirection)
else:
current_aid_list = ibs.get_image_aids(gid)
# Make new annotations
width, height = ibs.get_image_sizes(gid)
# Get aids
annotation_list = json.loads(request.form['detection-annotations'])
bbox_list = [
(
int( width * (annot['left'] / 100.0) ),
int( height * (annot['top'] / 100.0) ),
int( width * (annot['width'] / 100.0) ),
int( height * (annot['height'] / 100.0) ),
)
for annot in annotation_list
]
theta_list = [
float(annot['theta'])
for annot in annotation_list
]
survived_aid_list = [
None if annot['id'] is None else int(annot['id'])
for annot in annotation_list
]
species_list = [
annot['label']
for annot in annotation_list
]
# Delete annotations that didn't survive
kill_aid_list = list(set(current_aid_list) - set(survived_aid_list))
ibs.delete_annots(kill_aid_list)
for aid, bbox, theta, species in zip(survived_aid_list, bbox_list, theta_list, species_list):
if aid is None:
ibs.add_annots([gid], [bbox], theta_list=[theta], species_list=[species])
else:
ibs.set_annot_bboxes([aid], [bbox])
ibs.set_annot_thetas([aid], [theta])
ibs.set_annot_species([aid], [species])
ibs.set_image_reviewed([gid], [1])
print('[web] turk_id: %s, gid: %d, bbox_list: %r, species_list: %r' % (turk_id, gid, annotation_list, species_list))
# Return HTML
refer = request.args.get('refer', '')
if len(refer) > 0:
return redirect(appf.decode_refer_url(refer))
else:
return redirect(url_for('turk_detection', imgsetid=imgsetid, previous=gid))
@register_route('/submit/viewpoint/', methods=['POST'])
[docs]def submit_viewpoint():
ibs = current_app.ibs
method = request.form.get('viewpoint-submit', '')
imgsetid = request.args.get('imgsetid', '')
imgsetid = None if imgsetid == 'None' or imgsetid == '' else int(imgsetid)
src_ag = request.args.get('src_ag', '')
src_ag = None if src_ag == 'None' or src_ag == '' else int(src_ag)
dst_ag = request.args.get('dst_ag', '')
dst_ag = None if dst_ag == 'None' or dst_ag == '' else int(dst_ag)
aid = int(request.form['viewpoint-aid'])
turk_id = request.cookies.get('turk_id', -1)
if method.lower() == 'delete':
ibs.delete_annots(aid)
print('[web] (DELETED) turk_id: %s, aid: %d' % (turk_id, aid, ))
aid = None # Reset AID to prevent previous
if method.lower() == 'make junk':
ibs.set_annot_quality_texts([aid], [const.QUAL_JUNK])
print('[web] (SET AS JUNK) turk_id: %s, aid: %d' % (turk_id, aid, ))
redirection = request.referrer
if 'aid' not in redirection:
# Prevent multiple clears
if '?' in redirection:
redirection = '%s&aid=%d' % (redirection, aid, )
else:
redirection = '%s?aid=%d' % (redirection, aid, )
return redirect(redirection)
if method.lower() == 'rotate left':
theta = ibs.get_annot_thetas(aid)
theta = (theta + PI / 2) % TAU
ibs.set_annot_thetas(aid, theta)
(xtl, ytl, w, h) = ibs.get_annot_bboxes(aid)
diffx = int(round((w / 2.0) - (h / 2.0)))
diffy = int(round((h / 2.0) - (w / 2.0)))
xtl, ytl, w, h = xtl + diffx, ytl + diffy, h, w
ibs.set_annot_bboxes([aid], [(xtl, ytl, w, h)])
print('[web] (ROTATED LEFT) turk_id: %s, aid: %d' % (turk_id, aid, ))
redirection = request.referrer
if 'aid' not in redirection:
# Prevent multiple clears
if '?' in redirection:
redirection = '%s&aid=%d' % (redirection, aid, )
else:
redirection = '%s?aid=%d' % (redirection, aid, )
return redirect(redirection)
if method.lower() == 'rotate right':
theta = ibs.get_annot_thetas(aid)
theta = (theta - PI / 2) % TAU
ibs.set_annot_thetas(aid, theta)
(xtl, ytl, w, h) = ibs.get_annot_bboxes(aid)
diffx = int(round((w / 2.0) - (h / 2.0)))
diffy = int(round((h / 2.0) - (w / 2.0)))
xtl, ytl, w, h = xtl + diffx, ytl + diffy, h, w
ibs.set_annot_bboxes([aid], [(xtl, ytl, w, h)])
print('[web] (ROTATED RIGHT) turk_id: %s, aid: %d' % (turk_id, aid, ))
redirection = request.referrer
if 'aid' not in redirection:
# Prevent multiple clears
if '?' in redirection:
redirection = '%s&aid=%d' % (redirection, aid, )
else:
redirection = '%s?aid=%d' % (redirection, aid, )
return redirect(redirection)
else:
if src_ag is not None and dst_ag is not None:
appf.movegroup_aid(ibs, aid, src_ag, dst_ag)
value = int(request.form['viewpoint-value'])
yaw = appf.convert_old_viewpoint_to_yaw(value)
species_text = request.form['viewpoint-species']
ibs.set_annot_yaws([aid], [yaw], input_is_degrees=False)
ibs.set_annot_species([aid], [species_text])
print('[web] turk_id: %s, aid: %d, yaw: %d' % (turk_id, aid, yaw))
# Return HTML
refer = request.args.get('refer', '')
if len(refer) > 0:
return redirect(appf.decode_refer_url(refer))
else:
return redirect(url_for('turk_viewpoint', imgsetid=imgsetid, src_ag=src_ag,
dst_ag=dst_ag, previous=aid))
@register_route('/submit/quality/', methods=['POST'])
[docs]def submit_quality():
ibs = current_app.ibs
method = request.form.get('quality-submit', '')
imgsetid = request.args.get('imgsetid', '')
imgsetid = None if imgsetid == 'None' or imgsetid == '' else int(imgsetid)
aid = int(request.form['quality-aid'])
turk_id = request.cookies.get('turk_id', -1)
src_ag = request.args.get('src_ag', '')
src_ag = None if src_ag == 'None' or src_ag == '' else int(src_ag)
dst_ag = request.args.get('dst_ag', '')
dst_ag = None if dst_ag == 'None' or dst_ag == '' else int(dst_ag)
if method.lower() == 'delete':
ibs.delete_annots(aid)
print('[web] (DELETED) turk_id: %s, aid: %d' % (turk_id, aid, ))
aid = None # Reset AID to prevent previous
else:
if src_ag is not None and dst_ag is not None:
appf.movegroup_aid(ibs, aid, src_ag, dst_ag)
quality = int(request.form['quality-value'])
ibs.set_annot_qualities([aid], [quality])
print('[web] turk_id: %s, aid: %d, quality: %d' % (turk_id, aid, quality))
# Return HTML
refer = request.args.get('refer', '')
if len(refer) > 0:
return redirect(appf.decode_refer_url(refer))
else:
return redirect(url_for('turk_quality', imgsetid=imgsetid, src_ag=src_ag,
dst_ag=dst_ag, previous=aid))
@register_route('/submit/additional/', methods=['POST'])
[docs]def submit_additional():
ibs = current_app.ibs
method = request.form.get('additional-submit', '')
imgsetid = request.args.get('imgsetid', '')
imgsetid = None if imgsetid == 'None' or imgsetid == '' else int(imgsetid)
aid = int(request.form['additional-aid'])
turk_id = request.cookies.get('turk_id', -1)
if method.lower() == 'delete':
ibs.delete_annots(aid)
print('[web] (DELETED) turk_id: %s, aid: %d' % (turk_id, aid, ))
aid = None # Reset AID to prevent previous
else:
sex = int(request.form['additional-sex-value'])
age = int(request.form['additional-age-value'])
age_min = None
age_max = None
# Sex
if sex >= 2:
sex -= 2
else:
sex = -1
if age == 1:
age_min = None
age_max = None
elif age == 2:
age_min = None
age_max = 2
elif age == 3:
age_min = 3
age_max = 5
elif age == 4:
age_min = 6
age_max = 11
elif age == 5:
age_min = 12
age_max = 23
elif age == 6:
age_min = 24
age_max = 35
elif age == 7:
age_min = 36
age_max = None
ibs.set_annot_sex([aid], [sex])
nid = ibs.get_annot_name_rowids(aid)
DAN_SPECIAL_WRITE_AGE_TO_ALL_ANOTATIONS = True
if nid is not None and DAN_SPECIAL_WRITE_AGE_TO_ALL_ANOTATIONS:
aid_list = ibs.get_name_aids(nid)
ibs.set_annot_age_months_est_min(aid_list, [age_min] * len(aid_list))
ibs.set_annot_age_months_est_max(aid_list, [age_max] * len(aid_list))
else:
ibs.set_annot_age_months_est_min([aid], [age_min])
ibs.set_annot_age_months_est_max([aid], [age_max])
print('[web] turk_id: %s, aid: %d, sex: %r, age: %r' % (turk_id, aid, sex, age))
# Return HTML
refer = request.args.get('refer', '')
if len(refer) > 0:
return redirect(appf.decode_refer_url(refer))
else:
return redirect(url_for('turk_additional', imgsetid=imgsetid, previous=aid))
@register_route('/submit/group_review/', methods=['POST'])
[docs]def group_review_submit():
"""
CommandLine:
python -m ibeis.web.app --exec-group_review_submit
Example:
>>> # UNSTABLE_DOCTEST
>>> from ibeis.web.app import * # NOQA
>>> import ibeis
>>> import ibeis.web
>>> ibs = ibeis.opendb('testdb1')
>>> aid_list = ibs.get_valid_aids()[::2]
>>> ibs.start_web_annot_groupreview(aid_list)
"""
ibs = current_app.ibs
method = request.form.get('group-review-submit', '')
if method.lower() == 'populate':
redirection = request.referrer
if 'prefill' not in redirection:
# Prevent multiple clears
if '?' in redirection:
redirection = '%s&prefill=true' % (redirection, )
else:
redirection = '%s?prefill=true' % (redirection, )
return redirect(redirection)
aid_list = request.form.get('aid_list', '')
if len(aid_list) > 0:
aid_list = aid_list.replace('[', '')
aid_list = aid_list.replace(']', '')
aid_list = aid_list.strip().split(',')
aid_list = [ int(aid_.strip()) for aid_ in aid_list ]
else:
aid_list = []
src_ag, dst_ag = ibs.prepare_annotgroup_review(aid_list)
valid_modes = ut.get_list_column(appf.VALID_TURK_MODES, 0)
mode = request.form.get('group-review-mode', None)
assert mode in valid_modes
return redirect(url_for(mode, src_ag=src_ag, dst_ag=dst_ag))
if __name__ == '__main__':
"""
CommandLine:
python -m ibeis.web.app
python -m ibeis.web.app --allexamples
python -m ibeis.web.app --allexamples --noface --nosrc
"""
import multiprocessing
multiprocessing.freeze_support() # for win32
import utool as ut # NOQA
ut.doctest_funcs()