def _resize_src(image, resize=False, **kwargs): # Load image if resize is None: image_src = appf.embed_image_html(image, target_width=None, target_height=None) elif resize: image = appf.resize_via_web_parameters(image) image_src = appf.embed_image_html(image, target_width=None, target_height=None) else: image_src = appf.embed_image_html(image) return image_src
def experiments_voting_center_src(ibs, aoi=False, **kwargs): aoi_dict = voting_data(**kwargs) ibs, team_list = experiments_voting_initialize() image = np.zeros((100, 100, 1), dtype=np.float32) for annot_uuid in aoi_dict: if aoi and not aoi_dict[annot_uuid]: continue aid = ibs.get_annot_aids_from_uuid(annot_uuid) gid = ibs.get_annot_gids(aid) width, height = ibs.get_image_sizes(gid) (x, y, w, h) = ibs.get_annot_bboxes(aid) cx = x + (w / 2.0) cy = y + (h / 2.0) cx /= width cy /= height cx = int(np.round(cx * 100.0)) cy = int(np.round(cy * 100.0)) if 0 <= cx and cx < 100 and 0 <= cy and cy < 100: image[cx, cy] += 1.0 maximum = np.max(image) image /= maximum image = _normalize_image(image) # Load image return maximum, appf.embed_image_html(image, target_width=None)
def part_src(part_rowid, **kwargs): ibs = current_app.ibs if 'dim_size' not in kwargs: kwargs['dim_size'] = max( int(appf.TARGET_WIDTH), int(appf.TARGET_HEIGHT), ) image = ibs.get_part_chips(part_rowid, config2_=kwargs) image_src = appf.embed_image_html(image, target_height=300) return image_src
def annotation_src(aid=None, ibs=None, **kwargs): if ibs is None: ibs = current_app.ibs if 'dim_size' not in kwargs: kwargs['dim_size'] = max( int(appf.TARGET_WIDTH), int(appf.TARGET_HEIGHT), ) image = ibs.get_annot_chips(aid, config2_=kwargs) # image_src = _resize_src(image, **kwargs) image_src = appf.embed_image_html(image, target_height=300) return image_src
def experiments_image_src(tag=None, **kwargs): tag = tag.strip().split('-') db = tag[0] gid = int(tag[1]) ibs = experiment_init_db(db) config = { 'thumbsize': 800, } gpath = ibs.get_image_thumbpath(gid, ensure_paths=True, **config) # Load image image = vt.imread(gpath, orient='auto') image = appf.resize_via_web_parameters(image) return appf.embed_image_html(image, target_width=None)
def turk_detection_dynamic(): ibs = current_app.ibs gid = request.args.get('gid', None) gpath = ibs.get_image_thumbpath(gid, ensure_paths=True, draw_annots=False) image = ibs.get_images(gid) image_src = appf.embed_image_html(image) # Get annotations width, height = ibs.get_image_sizes(gid) aid_list = ibs.get_image_aids(gid) annot_bbox_list = ibs.get_annot_bboxes(aid_list) annot_thetas_list = ibs.get_annot_thetas(aid_list) species_list = ibs.get_annot_species_texts(aid_list) # Get annotation bounding boxes annotation_list = [] for aid, annot_bbox, annot_theta, species in zip(aid_list, annot_bbox_list, annot_thetas_list, species_list): temp = {} temp['left'] = 100.0 * (annot_bbox[0] / width) temp['top'] = 100.0 * (annot_bbox[1] / height) temp['width'] = 100.0 * (annot_bbox[2] / width) temp['height'] = 100.0 * (annot_bbox[3] / height) temp['label'] = species temp['id'] = aid temp['theta'] = float(annot_theta) annotation_list.append(temp) if len(species_list) > 0: species = max(set(species_list), key=species_list.count) # Get most common species elif appf.default_species(ibs) is not None: species = appf.default_species(ibs) else: species = KEY_DEFAULTS[SPECIES_KEY] callback_url = '%s?imgsetid=%s' % (url_for('submit_detection'), gid, ) return appf.template('turk', 'detection_dynamic', gid=gid, refer_aid=None, species=species, image_path=gpath, image_src=image_src, annotation_list=annotation_list, callback_url=callback_url, callback_method='POST', EMBEDDED_CSS=None, EMBEDDED_JAVASCRIPT=None, __wrapper__=False)
def image_src(gid=None, thumbnail=False, fresh=False, **kwargs): thumbnail = thumbnail or 'thumbnail' in request.args or 'thumbnail' in request.form ibs = current_app.ibs gid = int(gid) if thumbnail: gpath = ibs.get_image_thumbpath(gid, ensure_paths=True) fresh = fresh or 'fresh' in request.args or 'fresh' in request.form if fresh: import os os.remove(gpath) gpath = ibs.get_image_thumbpath(gid, ensure_paths=True) else: gpath = ibs.get_image_paths(gid) # Load image image = vt.imread(gpath, orient='auto') image = appf.resize_via_web_parameters(image) return appf.embed_image_html(image, target_width=None)
def probchip_src(aid=None, ibs=None, **kwargs): import cv2 if ibs is None: ibs = current_app.ibs if 'dim_size' not in kwargs: kwargs['dim_size'] = max( int(appf.TARGET_WIDTH), int(appf.TARGET_HEIGHT), ) image_filepath = ibs.get_annot_probchip_fpath(aid, config2_=kwargs) image = cv2.imread(image_filepath) x, y, w, h = ibs.get_annot_bboxes(aid) image = cv2.resize(image, (w, h)) # image_src = _resize_src(image, **kwargs) image_src = appf.embed_image_html(image, target_height=300) return image_src
def experiments_voting_area_src(ibs, aoi=False, **kwargs): aoi_dict = voting_data(**kwargs) ibs, team_list = experiments_voting_initialize() image = np.zeros((100, 100, 1), dtype=np.float32) for annot_uuid in aoi_dict: if aoi and not aoi_dict[annot_uuid]: continue aid = ibs.get_annot_aids_from_uuid(annot_uuid) gid = ibs.get_annot_gids(aid) width, height = ibs.get_image_sizes(gid) (x, y, w, h) = ibs.get_annot_bboxes(aid) x0 = x y0 = y x1 = x + w y1 = y + h x0 /= width y0 /= height x1 /= width y1 /= height x0 = min(max(x0, 0.0), 1.0) y0 = min(max(y0, 0.0), 1.0) x1 = min(max(x1, 0.0), 1.0) y1 = min(max(y1, 0.0), 1.0) x0 = int(np.around(x0 * 100.0)) y0 = int(np.around(y0 * 100.0)) x1 = int(np.around(x1 * 100.0)) y1 = int(np.around(y1 * 100.0)) image[x0:x1, y0:y1] += 1.0 maximum = np.max(image) image /= maximum image = _normalize_image(image) # Load image return maximum, appf.embed_image_html(image, target_width=None)
def review_detection_html(ibs, image_uuid, result_list, callback_url, callback_method='POST', include_jquery=False, config=None): """ Return the detection review interface for a particular image UUID and a list of results for that image. Args: image_uuid (UUID): the UUID of the image you want to review detections for result_list (list of dict): list of detection results returned by the detector callback_url (str): URL that the review form will submit to (action) when the user is complete with their review callback_method (str): HTTP method the review form will submit to (method). Defaults to 'POST' Returns: template (html): json response with the detection web interface in html RESTful: Method: GET URL: /api/review/detect/cnn/yolo/ """ ibs.web_check_uuids(image_uuid_list=[image_uuid]) gid = ibs.get_image_gids_from_uuid(image_uuid) if gid is None: return 'INVALID IMAGE UUID' default_config = { 'autointerest' : False, 'interest_bypass' : False, 'metadata' : True, 'metadata_viewpoint' : False, 'metadata_quality' : False, 'metadata_flags' : True, 'metadata_flags_aoi' : True, 'metadata_flags_multiple' : False, 'metadata_species' : True, 'metadata_label' : True, 'metadata_quickhelp' : True, 'parts' : False, 'modes_rectangle' : True, 'modes_diagonal' : True, 'modes_diagonal2' : True, 'staged' : False, } if config is not None: default_config.update(config) gpath = ibs.get_image_thumbpath(gid, ensure_paths=True, draw_annots=False) image = ibs.get_images(gid) image_src = appf.embed_image_html(image) width, height = ibs.get_image_sizes(gid) if width <= 0 or width is None or height <= 0 or height is None: vals = (image_uuid, width, height, ) raise IOError('Image %r for review has either no width or no height (w = %s, h = %s)' % vals) annotation_list = [] for result in result_list: quality = result.get('quality', None) if quality in [-1, None]: quality = 0 elif quality <= 2: quality = 1 elif quality > 2: quality = 2 viewpoint1 = result.get('viewpoint1', None) viewpoint2 = result.get('viewpoint2', None) viewpoint3 = result.get('viewpoint3', None) if viewpoint1 is None and viewpoint2 is None and viewpoint3 is None: viewpoint = result.get('viewpoint', None) viewpoint1, viewpoint2, viewpoint3 = appf.convert_viewpoint_to_tuple(viewpoint) annotation_list.append({ 'id' : result.get('id', None), 'left' : 100.0 * (result.get('left', result['xtl']) / width), 'top' : 100.0 * (result.get('top', result['ytl']) / height), 'width' : 100.0 * (result['width'] / width), 'height' : 100.0 * (result['height'] / height), 'species' : result.get('species', result['class']), 'theta' : result.get('theta', 0.0), 'viewpoint1' : viewpoint1, 'viewpoint2' : viewpoint2, 'viewpoint3' : viewpoint3, 'quality' : quality, 'multiple' : 'true' if result.get('multiple', None) == 1 else 'false', 'interest' : 'true' if result.get('interest', None) == 1 else 'false', }) species = KEY_DEFAULTS[SPECIES_KEY] root_path = dirname(abspath(__file__)) css_file_list = [ ['include', 'jquery-ui', 'jquery-ui.min.css'], ['include', 'jquery.ui.rotatable', 'jquery.ui.rotatable.css'], ['css', 'style.css'], ] json_file_list = [ ['include', 'jquery-ui', 'jquery-ui.min.js'], ['include', 'jquery.ui.rotatable', 'jquery.ui.rotatable.min.js'], ['include', 'bbox_annotator_percent.js'], ['javascript', 'script.js'], ['javascript', 'turk-detection.js'], ] if include_jquery: json_file_list = [ ['javascript', 'jquery.min.js'], ] + json_file_list EMBEDDED_CSS = '' EMBEDDED_JAVASCRIPT = '' css_template_fmtstr = '<style type="text/css" ia-dependency="css">%s</style>\n' json_template_fmtstr = '<script type="text/javascript" ia-dependency="javascript">%s</script>\n' for css_file in css_file_list: css_filepath_list = [root_path, 'static'] + css_file with open(join(*css_filepath_list)) as css_file: EMBEDDED_CSS += css_template_fmtstr % (css_file.read(), ) for json_file in json_file_list: json_filepath_list = [root_path, 'static'] + json_file with open(join(*json_filepath_list)) as json_file: EMBEDDED_JAVASCRIPT += json_template_fmtstr % (json_file.read(), ) species_rowids = ibs._get_all_species_rowids() species_nice_list = ibs.get_species_nice(species_rowids) combined_list = sorted(zip(species_nice_list, species_rowids)) species_nice_list = [ combined[0] for combined in combined_list ] species_rowids = [ combined[1] for combined in combined_list ] species_text_list = ibs.get_species_texts(species_rowids) species_list = list(zip(species_nice_list, species_text_list)) species_list = [ ('Unspecified', const.UNKNOWN) ] + species_list # Collect mapping of species to parts aid_list = ibs.get_valid_aids() part_species_rowid_list = ibs.get_annot_species_rowids(aid_list) part_species_text_list = ibs.get_species_texts(part_species_rowid_list) part_rowids_list = ibs.get_annot_part_rowids(aid_list) part_types_list = map(ibs.get_part_types, part_rowids_list) zipped = list(zip(part_species_text_list, part_types_list)) species_part_dict = { const.UNKNOWN: set([]) } for part_species_text, part_type_list in zipped: if part_species_text not in species_part_dict: species_part_dict[part_species_text] = set([const.UNKNOWN]) for part_type in part_type_list: species_part_dict[part_species_text].add(part_type) species_part_dict[const.UNKNOWN].add(part_type) # Add any images that did not get added because they aren't assigned any annotations for species_text in species_text_list: if species_text not in species_part_dict: species_part_dict[species_text] = set([const.UNKNOWN]) for key in species_part_dict: species_part_dict[key] = sorted(list(species_part_dict[key])) species_part_dict_json = json.dumps(species_part_dict) orientation_flag = '0' if species is not None and 'zebra' in species: orientation_flag = '1' settings_key_list = [ ('ia-detection-setting-orientation', orientation_flag), ('ia-detection-setting-parts-assignments', '1'), ('ia-detection-setting-toggle-annotations', '1'), ('ia-detection-setting-toggle-parts', '0'), ('ia-detection-setting-parts-show', '0'), ('ia-detection-setting-parts-hide', '0'), ] settings = { settings_key: request.cookies.get(settings_key, settings_default) == '1' for (settings_key, settings_default) in settings_key_list } return appf.template('turk', 'detection_insert', gid=gid, refer_aid=None, species=species, image_path=gpath, image_src=image_src, config=default_config, settings=settings, annotation_list=annotation_list, species_list=species_list, species_part_dict_json=species_part_dict_json, callback_url=callback_url, callback_method=callback_method, EMBEDDED_CSS=EMBEDDED_CSS, EMBEDDED_JAVASCRIPT=EMBEDDED_JAVASCRIPT)
def turk_viewpoint(): """ CommandLine: python -m ibeis.web.app --exec-turk_viewpoint --db PZ_Master1 Example: >>> # SCRIPT >>> from ibeis.other.ibsfuncs import * # NOQA >>> import ibeis >>> ibs = ibeis.opendb(defaultdb='PZ_Master1') >>> aid_list_ = ibs.find_unlabeled_name_members(suspect_yaws=True) >>> aid_list = ibs.filter_aids_to_quality(aid_list_, 'good', unknown_ok=False) >>> ibs.start_web_annot_groupreview(aid_list) """ ibs = current_app.ibs tup = appf.get_turk_annot_args(appf.imageset_annot_viewpoint_processed) (aid_list, reviewed_list, imgsetid, src_ag, dst_ag, progress, aid, previous) = tup value = appf.convert_yaw_to_old_viewpoint(ibs.get_annot_yaws(aid)) review = 'review' in request.args.keys() finished = aid is None display_instructions = request.cookies.get('viewpoint_instructions_seen', 1) == 0 if not finished: gid = ibs.get_annot_gids(aid) gpath = ibs.get_annot_chip_fpath(aid) image = vt.imread(gpath) image_src = appf.embed_image_html(image) species = ibs.get_annot_species_texts(aid) else: gid = None gpath = None image_src = None species = None imagesettext = ibs.get_imageset_text(imgsetid) species_rowids = ibs._get_all_species_rowids() species_nice_list = ibs.get_species_nice(species_rowids) combined_list = sorted(zip(species_nice_list, species_rowids)) species_nice_list = [ combined[0] for combined in combined_list ] species_rowids = [ combined[1] for combined in combined_list ] species_text_list = ibs.get_species_texts(species_rowids) species_selected_list = [ species == species_ for species_ in species_text_list ] species_list = zip(species_nice_list, species_text_list, species_selected_list) species_list = [ ('Unspecified', const.UNKNOWN, True) ] + species_list return appf.template('turk', 'viewpoint', imgsetid=imgsetid, src_ag=src_ag, dst_ag=dst_ag, gid=gid, aid=aid, value=value, image_path=gpath, image_src=image_src, previous=previous, species_list=species_list, imagesettext=imagesettext, progress=progress, finished=finished, display_instructions=display_instructions, review=review)
def turk_quality(): """ PZ Needs Tags: 17242 14468 14427 15946 14771 14084 4102 6074 3409 GZ Needs Tags; 1302 CommandLine: python -m ibeis.web.app --exec-turk_quality --db PZ_Master1 python -m ibeis.web.app --exec-turk_quality --db GZ_Master1 python -m ibeis.web.app --exec-turk_quality --db GIRM_Master1 Example: >>> # SCRIPT >>> from ibeis.other.ibsfuncs import * # NOQA >>> import ibeis >>> ibs = ibeis.opendb(defaultdb='testdb1') >>> aid_list_ = ibs.find_unlabeled_name_members(qual=True) >>> valid_views = ['primary', 'primary1', 'primary-1'] >>> aid_list = ibs.filter_aids_to_viewpoint(aid_list_, valid_views, unknown_ok=False) >>> ibs.start_web_annot_groupreview(aid_list) """ ibs = current_app.ibs tup = appf.get_turk_annot_args(appf.imageset_annot_quality_processed) (aid_list, reviewed_list, imgsetid, src_ag, dst_ag, progress, aid, previous) = tup value = ibs.get_annot_qualities(aid) if value == -1: value = None if value == 0: value = 1 review = 'review' in request.args.keys() finished = aid is None display_instructions = request.cookies.get('quality_instructions_seen', 1) == 0 if not finished: gid = ibs.get_annot_gids(aid) gpath = ibs.get_annot_chip_fpath(aid) image = vt.imread(gpath) image_src = appf.embed_image_html(image) else: gid = None gpath = None image_src = None imagesettext = ibs.get_imageset_text(imgsetid) return appf.template('turk', 'quality', imgsetid=imgsetid, src_ag=src_ag, dst_ag=dst_ag, gid=gid, aid=aid, value=value, image_path=gpath, image_src=image_src, previous=previous, imagesettext=imagesettext, progress=progress, finished=finished, display_instructions=display_instructions, review=review)
def annotation_src(aid=None): ibs = current_app.ibs gpath = ibs.get_annot_chip_fpath(aid) image = vt.imread(gpath) image_src = appf.embed_image_html(image, target_width=200) return image_src
def review_graph_match_html(ibs, review_pair, cm_dict, query_config_dict, _internal_state, callback_url, callback_method='POST', view_orientation='vertical', include_jquery=False): r""" Args: ibs (ibeis.IBEISController): image analysis api review_pair (dict): pair of annot uuids cm_dict (dict): query_config_dict (dict): _internal_state (?): callback_url (?): callback_method (unicode): (default = u'POST') view_orientation (unicode): (default = u'vertical') include_jquery (bool): (default = False) CommandLine: python -m ibeis.web.apis_query review_graph_match_html --show ibeis --web python -m ibeis.web.apis_query review_graph_match_html --show --domain=localhost Example: >>> # WEB_DOCTEST >>> from ibeis.web.apis_query import * # NOQA >>> import ibeis >>> web_ibs = ibeis.opendb_bg_web('testdb1') # , domain='http://52.33.105.88') >>> aids = web_ibs.send_ibeis_request('/api/annot/', 'get')[0:2] >>> uuid_list = web_ibs.send_ibeis_request('/api/annot/uuids/', type_='get', aid_list=aids) >>> quuid_list = uuid_list[0:1] >>> duuid_list = uuid_list >>> query_config_dict = { >>> # 'pipeline_root' : 'BC_DTW' >>> } >>> data = dict( >>> query_annot_uuid_list=quuid_list, database_annot_uuid_list=duuid_list, >>> query_config_dict=query_config_dict, >>> ) >>> jobid = web_ibs.send_ibeis_request('/api/engine/query/graph/', **data) >>> print('jobid = %r' % (jobid,)) >>> status_response = web_ibs.wait_for_results(jobid) >>> result_response = web_ibs.read_engine_results(jobid) >>> inference_result = result_response['json_result'] >>> print('inference_result = %r' % (inference_result,)) >>> auuid2_cm = inference_result['cm_dict'] >>> quuid = quuid_list[0] >>> class_dict = auuid2_cm[str(quuid)] >>> # Get information in frontend >>> #ibs = ibeis.opendb('testdb1') >>> #cm = match_obj = ibeis.ChipMatch.from_dict(class_dict, ibs=ibs) >>> #match_obj.print_rawinfostr() >>> # Make the dictionary a bit more managable >>> #match_obj.compress_top_feature_matches(num=2) >>> #class_dict = match_obj.to_dict(ibs=ibs) >>> cm_dict = class_dict >>> # Package for review >>> review_pair = {'annot_uuid_1': quuid, 'annot_uuid_2': duuid_list[1]} >>> callback_method = u'POST' >>> view_orientation = u'vertical' >>> include_jquery = False >>> kw = dict( >>> review_pair=review_pair, >>> cm_dict=cm_dict, >>> query_config_dict=query_config_dict, >>> _internal_state=None, >>> callback_url = None, >>> ) >>> html_str = web_ibs.send_ibeis_request('/api/review/query/graph/', type_='get', **kw) >>> web_ibs.terminate2() >>> ut.quit_if_noshow() >>> import plottool as pt >>> ut.render_html(html_str) >>> ut.show_if_requested() Example2: >>> # DISABLE_DOCTEST >>> # This starts off using web to get information, but finishes the rest in python >>> from ibeis.web.apis_query import * # NOQA >>> import ibeis >>> ut.exec_funckw(review_graph_match_html, globals()) >>> web_ibs = ibeis.opendb_bg_web('testdb1') # , domain='http://52.33.105.88') >>> aids = web_ibs.send_ibeis_request('/api/annot/', 'get')[0:2] >>> uuid_list = web_ibs.send_ibeis_request('/api/annot/uuids/', type_='get', aid_list=aids) >>> quuid_list = uuid_list[0:1] >>> duuid_list = uuid_list >>> query_config_dict = { >>> # 'pipeline_root' : 'BC_DTW' >>> } >>> data = dict( >>> query_annot_uuid_list=quuid_list, database_annot_uuid_list=duuid_list, >>> query_config_dict=query_config_dict, >>> ) >>> jobid = web_ibs.send_ibeis_request('/api/engine/query/graph/', **data) >>> status_response = web_ibs.wait_for_results(jobid) >>> result_response = web_ibs.read_engine_results(jobid) >>> web_ibs.terminate2() >>> # NOW WORK IN THE FRONTEND >>> inference_result = result_response['json_result'] >>> auuid2_cm = inference_result['cm_dict'] >>> quuid = quuid_list[0] >>> class_dict = auuid2_cm[str(quuid)] >>> # Get information in frontend >>> ibs = ibeis.opendb('testdb1') >>> cm = ibeis.ChipMatch.from_dict(class_dict, ibs=ibs) >>> cm.print_rawinfostr() >>> # Make the dictionary a bit more managable >>> cm.compress_top_feature_matches(num=1) >>> cm.print_rawinfostr() >>> class_dict = cm.to_dict(ibs=ibs) >>> cm_dict = class_dict >>> # Package for review ( CANT CALL DIRECTLY BECAUSE OF OUT OF CONTEXT ) >>> review_pair = {'annot_uuid_1': quuid, 'annot_uuid_2': duuid_list[1]} >>> x = review_graph_match_html(ibs, review_pair, cm_dict, >>> query_config_dict, _internal_state=None, >>> callback_url=None) >>> ut.quit_if_noshow() >>> import plottool as pt >>> ut.render_html(html_str) >>> ut.show_if_requested() """ from ibeis.algo.hots import chip_match # from ibeis.algo.hots.query_request import QueryRequest proot = query_config_dict.get('pipeline_root', 'vsmany') proot = query_config_dict.get('proot', proot) if proot.upper() == 'BC_DTW': cls = chip_match.AnnotMatch # ibs.depc_annot.requestclass_dict['BC_DTW'] else: cls = chip_match.ChipMatch view_orientation = view_orientation.lower() if view_orientation not in ['vertical', 'horizontal']: view_orientation = 'horizontal' # unpack info try: annot_uuid_1 = review_pair['annot_uuid_1'] annot_uuid_2 = review_pair['annot_uuid_2'] except Exception: #??? HACK # FIXME: print('[!!!!] review_pair = %r' % (review_pair,)) review_pair = review_pair[0] annot_uuid_1 = review_pair['annot_uuid_1'] annot_uuid_2 = review_pair['annot_uuid_2'] aid_1 = ibs.get_annot_aids_from_uuid(annot_uuid_1) aid_2 = ibs.get_annot_aids_from_uuid(annot_uuid_2) cm = cls.from_dict(cm_dict, ibs=ibs) qreq_ = ibs.new_query_request([aid_1], [aid_2], cfgdict=query_config_dict) # Get score idx = cm.daid2_idx[aid_2] match_score = cm.name_score_list[idx] #match_score = cm.aid2_score[aid_2] image_matches = make_review_image(aid_2, cm, qreq_, view_orientation=view_orientation) image_matches_src = appf.embed_image_html(image_matches) image_clean = make_review_image(aid_2, cm, qreq_, view_orientation=view_orientation, draw_matches=False) image_clean_src = appf.embed_image_html(image_clean) if False: from ibeis.web import apis_query root_path = dirname(abspath(apis_query.__file__)) else: root_path = dirname(abspath(__file__)) css_file_list = [ ['css', 'style.css'], ['include', 'bootstrap', 'css', 'bootstrap.css'], ] json_file_list = [ ['javascript', 'script.js'], ['include', 'bootstrap', 'js', 'bootstrap.js'], ] if include_jquery: json_file_list = [ ['javascript', 'jquery.min.js'], ] + json_file_list EMBEDDED_CSS = '' EMBEDDED_JAVASCRIPT = '' css_template_fmtstr = '<style type="text/css" ia-dependency="css">%s</style>\n' json_template_fmtstr = '<script type="text/javascript" ia-dependency="javascript">%s</script>\n' for css_file in css_file_list: css_filepath_list = [root_path, 'static'] + css_file with open(join(*css_filepath_list)) as css_file: EMBEDDED_CSS += css_template_fmtstr % (css_file.read(), ) for json_file in json_file_list: json_filepath_list = [root_path, 'static'] + json_file with open(join(*json_filepath_list)) as json_file: EMBEDDED_JAVASCRIPT += json_template_fmtstr % (json_file.read(), ) return appf.template('turk', 'query_match_insert', match_score=match_score, image_clean_src=image_clean_src, image_matches_src=image_matches_src, annot_uuid_1=str(annot_uuid_1), annot_uuid_2=str(annot_uuid_2), view_orientation=view_orientation, callback_url=callback_url, callback_method=callback_method, EMBEDDED_CSS=EMBEDDED_CSS, EMBEDDED_JAVASCRIPT=EMBEDDED_JAVASCRIPT)
def turk_additional(): ibs = current_app.ibs imgsetid = request.args.get('imgsetid', '') imgsetid = None if imgsetid == 'None' or imgsetid == '' else int(imgsetid) gid_list = ibs.get_valid_gids(imgsetid=imgsetid) aid_list = ut.flatten(ibs.get_image_aids(gid_list)) nid_list = ibs.get_annot_nids(aid_list) reviewed_list = appf.imageset_annot_additional_processed(ibs, aid_list, nid_list) try: progress = '%0.2f' % (100.0 * reviewed_list.count(True) / len(aid_list), ) except ZeroDivisionError: progress = '0.00' imagesettext = None if imgsetid is None else ibs.get_imageset_text(imgsetid) aid = request.args.get('aid', '') if len(aid) > 0: aid = int(aid) else: aid_list_ = ut.filterfalse_items(aid_list, reviewed_list) if len(aid_list_) == 0: aid = None else: # aid = aid_list_[0] aid = random.choice(aid_list_) previous = request.args.get('previous', None) value_sex = ibs.get_annot_sex([aid])[0] if value_sex >= 0: value_sex += 2 else: value_sex = None value_age_min, value_age_max = ibs.get_annot_age_months_est([aid])[0] value_age = None if (value_age_min is -1 or value_age_min is None) and (value_age_max is -1 or value_age_max is None): value_age = 1 if (value_age_min is 0 or value_age_min is None) and value_age_max == 2: value_age = 2 elif value_age_min is 3 and value_age_max == 5: value_age = 3 elif value_age_min is 6 and value_age_max == 11: value_age = 4 elif value_age_min is 12 and value_age_max == 23: value_age = 5 elif value_age_min is 24 and value_age_max == 35: value_age = 6 elif value_age_min is 36 and (value_age_max > 36 or value_age_max is None): value_age = 7 review = 'review' in request.args.keys() finished = aid is None display_instructions = request.cookies.get('additional_instructions_seen', 1) == 0 if not finished: gid = ibs.get_annot_gids(aid) gpath = ibs.get_annot_chip_fpath(aid) image = vt.imread(gpath) image_src = appf.embed_image_html(image) else: gid = None gpath = None image_src = None name_aid_list = None nid = ibs.get_annot_name_rowids(aid) if nid is not None: name_aid_list = ibs.get_name_aids(nid) quality_list = ibs.get_annot_qualities(name_aid_list) quality_text_list = ibs.get_annot_quality_texts(name_aid_list) yaw_text_list = ibs.get_annot_yaw_texts(name_aid_list) name_aid_combined_list = list(zip( name_aid_list, quality_list, quality_text_list, yaw_text_list, )) name_aid_combined_list.sort(key=lambda t: t[1], reverse=True) else: name_aid_combined_list = [] return appf.template('turk', 'additional', imgsetid=imgsetid, gid=gid, aid=aid, value_sex=value_sex, value_age=value_age, image_path=gpath, name_aid_combined_list=name_aid_combined_list, image_src=image_src, previous=previous, imagesettext=imagesettext, progress=progress, finished=finished, display_instructions=display_instructions, review=review)
def review_detection_html(ibs, image_uuid, result_list, callback_url, callback_method='POST', include_jquery=False): """ Returns the detection review interface for a particular image UUID and a list of results for that image. Args: image_uuid (UUID): the UUID of the image you want to review detections for result_list (list of dict): list of detection results returned by the detector callback_url (str): URL that the review form will submit to (action) when the user is complete with their review callback_method (str): HTTP method the review form will submit to (method). Defaults to 'POST' Returns: template (html): json response with the detection web interface in html RESTful: Method: GET URL: /api/review/detect/cnn/yolo/ """ ibs.web_check_uuids(image_uuid_list=[image_uuid]) gid = ibs.get_image_gids_from_uuid(image_uuid) if gid is None: return 'INVALID IMAGE UUID' gpath = ibs.get_image_thumbpath(gid, ensure_paths=True, draw_annots=False) image = ibs.get_images(gid) image_src = appf.embed_image_html(image) width, height = ibs.get_image_sizes(gid) if width <= 0 or width is None or height <= 0 or height is None: vals = ( image_uuid, width, height, ) raise IOError( 'Image %r for review has either no width or no height (w = %s, h = %s)' % vals) annotation_list = [] for result in result_list: annotation_list.append({ 'left': 100.0 * (result['xtl'] / width), 'top': 100.0 * (result['ytl'] / height), 'width': 100.0 * (result['width'] / width), 'height': 100.0 * (result['height'] / height), 'label': result['class'], 'id': None, 'theta': result.get('theta', 0.0), }) species = KEY_DEFAULTS[SPECIES_KEY] root_path = dirname(abspath(__file__)) css_file_list = [ ['include', 'jquery-ui', 'jquery-ui.min.css'], ['include', 'jquery.ui.rotatable', 'jquery.ui.rotatable.css'], ['css', 'style.css'], ] json_file_list = [ ['include', 'jquery-ui', 'jquery-ui.min.js'], ['include', 'jquery.ui.rotatable', 'jquery.ui.rotatable.min.js'], ['include', 'bbox_annotator_percent.js'], ['javascript', 'script.js'], ['javascript', 'turk-detection.js'], ] if include_jquery: json_file_list = [ ['javascript', 'jquery.min.js'], ] + json_file_list EMBEDDED_CSS = '' EMBEDDED_JAVASCRIPT = '' css_template_fmtstr = '<style type="text/css" ia-dependency="css">%s</style>\n' json_template_fmtstr = '<script type="text/javascript" ia-dependency="javascript">%s</script>\n' for css_file in css_file_list: css_filepath_list = [root_path, 'static'] + css_file with open(join(*css_filepath_list)) as css_file: EMBEDDED_CSS += css_template_fmtstr % (css_file.read(), ) for json_file in json_file_list: json_filepath_list = [root_path, 'static'] + json_file with open(join(*json_filepath_list)) as json_file: EMBEDDED_JAVASCRIPT += json_template_fmtstr % (json_file.read(), ) return appf.template('turk', 'detection_insert', gid=gid, refer_aid=None, species=species, image_path=gpath, image_src=image_src, annotation_list=annotation_list, callback_url=callback_url, callback_method=callback_method, EMBEDDED_CSS=EMBEDDED_CSS, EMBEDDED_JAVASCRIPT=EMBEDDED_JAVASCRIPT)
def review_detection_html(ibs, image_uuid, result_list, callback_url, callback_method='POST', include_jquery=False): """ Returns the detection review interface for a particular image UUID and a list of results for that image. Args: image_uuid (UUID): the UUID of the image you want to review detections for result_list (list of dict): list of detection results returned by the detector callback_url (str): URL that the review form will submit to (action) when the user is complete with their review callback_method (str): HTTP method the review form will submit to (method). Defaults to 'POST' Returns: template (html): json response with the detection web interface in html RESTful: Method: GET URL: /api/review/detect/cnn/yolo/ """ ibs.web_check_uuids(image_uuid_list=[image_uuid]) gid = ibs.get_image_gids_from_uuid(image_uuid) if gid is None: return 'INVALID IMAGE UUID' gpath = ibs.get_image_thumbpath(gid, ensure_paths=True, draw_annots=False) image = ibs.get_images(gid) image_src = appf.embed_image_html(image) width, height = ibs.get_image_sizes(gid) if width <= 0 or width is None or height <= 0 or height is None: vals = (image_uuid, width, height, ) raise IOError('Image %r for review has either no width or no height (w = %s, h = %s)' % vals) annotation_list = [] for result in result_list: annotation_list.append({ 'left' : 100.0 * (result['xtl'] / width), 'top' : 100.0 * (result['ytl'] / height), 'width' : 100.0 * (result['width'] / width), 'height' : 100.0 * (result['height'] / height), 'label' : result['class'], 'id' : None, 'theta' : result.get('theta', 0.0), }) species = KEY_DEFAULTS[SPECIES_KEY] root_path = dirname(abspath(__file__)) css_file_list = [ ['include', 'jquery-ui', 'jquery-ui.min.css'], ['include', 'jquery.ui.rotatable', 'jquery.ui.rotatable.css'], ['css', 'style.css'], ] json_file_list = [ ['include', 'jquery-ui', 'jquery-ui.min.js'], ['include', 'jquery.ui.rotatable', 'jquery.ui.rotatable.min.js'], ['include', 'bbox_annotator_percent.js'], ['javascript', 'script.js'], ['javascript', 'turk-detection.js'], ] if include_jquery: json_file_list = [ ['javascript', 'jquery.min.js'], ] + json_file_list EMBEDDED_CSS = '' EMBEDDED_JAVASCRIPT = '' css_template_fmtstr = '<style type="text/css" ia-dependency="css">%s</style>\n' json_template_fmtstr = '<script type="text/javascript" ia-dependency="javascript">%s</script>\n' for css_file in css_file_list: css_filepath_list = [root_path, 'static'] + css_file with open(join(*css_filepath_list)) as css_file: EMBEDDED_CSS += css_template_fmtstr % (css_file.read(), ) for json_file in json_file_list: json_filepath_list = [root_path, 'static'] + json_file with open(join(*json_filepath_list)) as json_file: EMBEDDED_JAVASCRIPT += json_template_fmtstr % (json_file.read(), ) return appf.template('turk', 'detection_insert', gid=gid, refer_aid=None, species=species, image_path=gpath, image_src=image_src, annotation_list=annotation_list, callback_url=callback_url, callback_method=callback_method, EMBEDDED_CSS=EMBEDDED_CSS, EMBEDDED_JAVASCRIPT=EMBEDDED_JAVASCRIPT)
def review_graph_match_html(ibs, review_pair, cm_dict, query_config_dict, _internal_state, callback_url, callback_method='POST', view_orientation='vertical', include_jquery=False): r""" Args: ibs (ibeis.IBEISController): image analysis api review_pair (dict): pair of annot uuids cm_dict (dict): query_config_dict (dict): _internal_state (?): callback_url (?): callback_method (unicode): (default = u'POST') view_orientation (unicode): (default = u'vertical') include_jquery (bool): (default = False) CommandLine: python -m ibeis.web.apis_query review_graph_match_html --show ibeis --web python -m ibeis.web.apis_query review_graph_match_html --show --domain=localhost Example: >>> # WEB_DOCTEST >>> from ibeis.web.apis_query import * # NOQA >>> import ibeis >>> web_ibs = ibeis.opendb_bg_web('testdb1') # , domain='http://52.33.105.88') >>> aids = web_ibs.send_ibeis_request('/api/annot/', 'get')[0:2] >>> uuid_list = web_ibs.send_ibeis_request('/api/annot/uuids/', type_='get', aid_list=aids) >>> quuid_list = uuid_list[0:1] >>> duuid_list = uuid_list >>> query_config_dict = { >>> # 'pipeline_root' : 'BC_DTW' >>> } >>> data = dict( >>> query_annot_uuid_list=quuid_list, database_annot_uuid_list=duuid_list, >>> query_config_dict=query_config_dict, >>> ) >>> jobid = web_ibs.send_ibeis_request('/api/engine/query/graph/', **data) >>> print('jobid = %r' % (jobid,)) >>> status_response = web_ibs.wait_for_results(jobid) >>> result_response = web_ibs.read_engine_results(jobid) >>> inference_result = result_response['json_result'] >>> print('inference_result = %r' % (inference_result,)) >>> auuid2_cm = inference_result['cm_dict'] >>> quuid = quuid_list[0] >>> class_dict = auuid2_cm[str(quuid)] >>> # Get information in frontend >>> #ibs = ibeis.opendb('testdb1') >>> #cm = match_obj = ibeis.ChipMatch.from_dict(class_dict, ibs=ibs) >>> #match_obj.print_rawinfostr() >>> # Make the dictionary a bit more managable >>> #match_obj.compress_top_feature_matches(num=2) >>> #class_dict = match_obj.to_dict(ibs=ibs) >>> cm_dict = class_dict >>> # Package for review >>> review_pair = {'annot_uuid_1': quuid, 'annot_uuid_2': duuid_list[1]} >>> callback_method = u'POST' >>> view_orientation = u'vertical' >>> include_jquery = False >>> kw = dict( >>> review_pair=review_pair, >>> cm_dict=cm_dict, >>> query_config_dict=query_config_dict, >>> _internal_state=None, >>> callback_url = None, >>> ) >>> html_str = web_ibs.send_ibeis_request('/api/review/query/graph/', type_='get', **kw) >>> web_ibs.terminate2() >>> ut.quit_if_noshow() >>> import plottool as pt >>> ut.render_html(html_str) >>> ut.show_if_requested() Example2: >>> # DISABLE_DOCTEST >>> # This starts off using web to get information, but finishes the rest in python >>> from ibeis.web.apis_query import * # NOQA >>> import ibeis >>> ut.exec_funckw(review_graph_match_html, globals()) >>> web_ibs = ibeis.opendb_bg_web('testdb1') # , domain='http://52.33.105.88') >>> aids = web_ibs.send_ibeis_request('/api/annot/', 'get')[0:2] >>> uuid_list = web_ibs.send_ibeis_request('/api/annot/uuids/', type_='get', aid_list=aids) >>> quuid_list = uuid_list[0:1] >>> duuid_list = uuid_list >>> query_config_dict = { >>> # 'pipeline_root' : 'BC_DTW' >>> } >>> data = dict( >>> query_annot_uuid_list=quuid_list, database_annot_uuid_list=duuid_list, >>> query_config_dict=query_config_dict, >>> ) >>> jobid = web_ibs.send_ibeis_request('/api/engine/query/graph/', **data) >>> status_response = web_ibs.wait_for_results(jobid) >>> result_response = web_ibs.read_engine_results(jobid) >>> web_ibs.terminate2() >>> # NOW WORK IN THE FRONTEND >>> inference_result = result_response['json_result'] >>> auuid2_cm = inference_result['cm_dict'] >>> quuid = quuid_list[0] >>> class_dict = auuid2_cm[str(quuid)] >>> # Get information in frontend >>> ibs = ibeis.opendb('testdb1') >>> cm = ibeis.ChipMatch.from_dict(class_dict, ibs=ibs) >>> cm.print_rawinfostr() >>> # Make the dictionary a bit more managable >>> cm.compress_top_feature_matches(num=1) >>> cm.print_rawinfostr() >>> class_dict = cm.to_dict(ibs=ibs) >>> cm_dict = class_dict >>> # Package for review ( CANT CALL DIRECTLY BECAUSE OF OUT OF CONTEXT ) >>> review_pair = {'annot_uuid_1': quuid, 'annot_uuid_2': duuid_list[1]} >>> x = review_graph_match_html(ibs, review_pair, cm_dict, >>> query_config_dict, _internal_state=None, >>> callback_url=None) >>> ut.quit_if_noshow() >>> import plottool as pt >>> ut.render_html(html_str) >>> ut.show_if_requested() """ from ibeis.algo.hots import chip_match # from ibeis.algo.hots.query_request import QueryRequest proot = query_config_dict.get('pipeline_root', 'vsmany') proot = query_config_dict.get('proot', proot) if proot.upper() == 'BC_DTW': cls = chip_match.AnnotMatch # ibs.depc_annot.requestclass_dict['BC_DTW'] else: cls = chip_match.ChipMatch view_orientation = view_orientation.lower() if view_orientation not in ['vertical', 'horizontal']: view_orientation = 'horizontal' # unpack info try: annot_uuid_1 = review_pair['annot_uuid_1'] annot_uuid_2 = review_pair['annot_uuid_2'] except Exception: #??? HACK # FIXME: print('[!!!!] review_pair = %r' % (review_pair, )) review_pair = review_pair[0] annot_uuid_1 = review_pair['annot_uuid_1'] annot_uuid_2 = review_pair['annot_uuid_2'] aid_1 = ibs.get_annot_aids_from_uuid(annot_uuid_1) aid_2 = ibs.get_annot_aids_from_uuid(annot_uuid_2) cm = cls.from_dict(cm_dict, ibs=ibs) qreq_ = ibs.new_query_request([aid_1], [aid_2], cfgdict=query_config_dict) # Get score idx = cm.daid2_idx[aid_2] match_score = cm.name_score_list[idx] #match_score = cm.aid2_score[aid_2] image_matches = make_review_image(aid_2, cm, qreq_, view_orientation=view_orientation) image_matches_src = appf.embed_image_html(image_matches) image_clean = make_review_image(aid_2, cm, qreq_, view_orientation=view_orientation, draw_matches=False) image_clean_src = appf.embed_image_html(image_clean) if False: from ibeis.web import apis_query root_path = dirname(abspath(apis_query.__file__)) else: root_path = dirname(abspath(__file__)) css_file_list = [ ['css', 'style.css'], ['include', 'bootstrap', 'css', 'bootstrap.css'], ] json_file_list = [ ['javascript', 'script.js'], ['include', 'bootstrap', 'js', 'bootstrap.js'], ] if include_jquery: json_file_list = [ ['javascript', 'jquery.min.js'], ] + json_file_list EMBEDDED_CSS = '' EMBEDDED_JAVASCRIPT = '' css_template_fmtstr = '<style type="text/css" ia-dependency="css">%s</style>\n' json_template_fmtstr = '<script type="text/javascript" ia-dependency="javascript">%s</script>\n' for css_file in css_file_list: css_filepath_list = [root_path, 'static'] + css_file with open(join(*css_filepath_list)) as css_file: EMBEDDED_CSS += css_template_fmtstr % (css_file.read(), ) for json_file in json_file_list: json_filepath_list = [root_path, 'static'] + json_file with open(join(*json_filepath_list)) as json_file: EMBEDDED_JAVASCRIPT += json_template_fmtstr % (json_file.read(), ) return appf.template('turk', 'query_match_insert', match_score=match_score, image_clean_src=image_clean_src, image_matches_src=image_matches_src, annot_uuid_1=str(annot_uuid_1), annot_uuid_2=str(annot_uuid_2), view_orientation=view_orientation, callback_url=callback_url, callback_method=callback_method, EMBEDDED_CSS=EMBEDDED_CSS, EMBEDDED_JAVASCRIPT=EMBEDDED_JAVASCRIPT)
def turk_detection(): ibs = current_app.ibs refer_aid = request.args.get('refer_aid', None) imgsetid = request.args.get('imgsetid', '') imgsetid = None if imgsetid == 'None' or imgsetid == '' else int(imgsetid) gid_list = ibs.get_valid_gids(imgsetid=imgsetid) reviewed_list = appf.imageset_image_processed(ibs, gid_list) progress = '%0.2f' % (100.0 * reviewed_list.count(True) / len(gid_list), ) imagesettext = None if imgsetid is None else ibs.get_imageset_text(imgsetid) gid = request.args.get('gid', '') if len(gid) > 0: gid = int(gid) else: gid_list_ = ut.filterfalse_items(gid_list, reviewed_list) if len(gid_list_) == 0: gid = None else: # gid = gid_list_[0] gid = random.choice(gid_list_) previous = request.args.get('previous', None) finished = gid is None review = 'review' in request.args.keys() display_instructions = request.cookies.get('detection_instructions_seen', 1) == 0 display_species_examples = False # request.cookies.get('detection_example_species_seen', 0) == 0 if not finished: gpath = ibs.get_image_thumbpath(gid, ensure_paths=True, draw_annots=False) image = ibs.get_images(gid) image_src = appf.embed_image_html(image) # Get annotations width, height = ibs.get_image_sizes(gid) aid_list = ibs.get_image_aids(gid) annot_bbox_list = ibs.get_annot_bboxes(aid_list) annot_thetas_list = ibs.get_annot_thetas(aid_list) species_list = ibs.get_annot_species_texts(aid_list) # Get annotation bounding boxes annotation_list = [] for aid, annot_bbox, annot_theta, species in zip(aid_list, annot_bbox_list, annot_thetas_list, species_list): temp = {} temp['left'] = 100.0 * (annot_bbox[0] / width) temp['top'] = 100.0 * (annot_bbox[1] / height) temp['width'] = 100.0 * (annot_bbox[2] / width) temp['height'] = 100.0 * (annot_bbox[3] / height) temp['label'] = species temp['id'] = aid temp['theta'] = float(annot_theta) annotation_list.append(temp) if len(species_list) > 0: species = max(set(species_list), key=species_list.count) # Get most common species elif appf.default_species(ibs) is not None: species = appf.default_species(ibs) else: species = KEY_DEFAULTS[SPECIES_KEY] else: gpath = None species = None image_src = None annotation_list = [] callback_url = '%s?imgsetid=%s' % (url_for('submit_detection'), imgsetid, ) return appf.template('turk', 'detection', imgsetid=imgsetid, gid=gid, refer_aid=refer_aid, species=species, image_path=gpath, image_src=image_src, previous=previous, imagesettext=imagesettext, progress=progress, finished=finished, annotation_list=annotation_list, display_instructions=display_instructions, display_species_examples=display_species_examples, callback_url=callback_url, callback_method='POST', EMBEDDED_CSS=None, EMBEDDED_JAVASCRIPT=None, review=review)