# -*- coding: utf-8 -*-
"""
Dependencies: flask, tornado
"""
from __future__ import absolute_import, division, print_function
from os.path import splitext, basename
import uuid
import six
from ibeis.control import controller_inject
import utool as ut
register_api = controller_inject.get_ibeis_flask_api(__name__)
@register_api('/api/image/json/', methods=['POST'])
[docs]def add_images_json(ibs, image_uri_list, image_uuid_list, image_width_list,
image_height_list, image_orig_name_list=None, image_ext_list=None,
image_time_posix_list=None, image_gps_lat_list=None,
image_gps_lon_list=None, image_orientation_list=None,
image_notes_list=None, **kwargs):
"""
REST:
Method: POST
URL: /api/image/json/
Ignore:
sudo pip install boto
Args:
image_uri_list (list) : list of string image uris, most likely HTTP(S) or S3
encoded URLs. Alternatively, this can be a list of dictionaries (JSON
objects) that specify AWS S3 stored assets. An example below:
image_uri_list = [
'http://domain.com/example/asset1.png',
'/home/example/Desktop/example/asset2.jpg',
's3://s3.amazon.com/example-bucket-2/asset1-in-bucket-2.tif',
{
'bucket' : 'example-bucket-1',
'key' : 'example/asset1.png',
'auth_domain' : None, # Uses localhost
'auth_access_id' : None, # Uses system default
'auth_secret_key' : None, # Uses system default
},
{
'bucket' : 'example-bucket-1',
'key' : 'example/asset2.jpg',
# if unspecified, auth uses localhost and system defaults
},
{
'bucket' : 'example-bucket-2',
'key' : 'example/asset1-in-bucket-2.tif',
'auth_domain' : 's3.amazon.com',
'auth_access_id' : '____________________',
'auth_secret_key' : '________________________________________',
},
]
Note that you cannot specify AWS authentication access ids or secret keys
using string uri's. For specific authentication methods, please use the
latter list of dictionaries.
image_uuid_list (list of str) : list of image UUIDs to be used in IBEIS IA
image_width_list (list of int) : list of image widths
image_height_list (list of int) : list of image heights
image_orig_name_list (list of str): list of original image names
image_ext_list (list of str): list of original image names
image_time_posix_list (list of int): list of image's POSIX timestamps
image_gps_lat_list (list of float): list of image's GPS latitude values
image_gps_lon_list (list of float): list of image's GPS longitude values
image_orientation_list (list of int): list of image's orientation flags
image_notes_list (list of str) : optional list of any related notes with
the images
**kwargs : key-value pairs passed to the ibs.add_images() function.
CommandLine:
python -m ibeis.web.app --test-add_images_json
Example:
>>> # WEB_DOCTEST
>>> from ibeis.control.IBEISControl import * # NOQA
>>> import ibeis
>>> web_instance = ibeis.opendb(db='testdb1')
>>> _payload = {
>>> 'image_uri_list': [
>>> 'https://upload.wikimedia.org/wikipedia/commons/4/49/Zebra_running_Ngorongoro.jpg',
>>> {
>>> 'bucket' : 'test-asset-store',
>>> 'key' : 'caribwhale/20130903-JAC-0002.JPG',
>>> },
>>> ],
>>> 'image_uuid_list': [
>>> uuid.UUID('7fea8101-7dec-44e3-bf5d-b8287fd231e2'),
>>> uuid.UUID('c081119a-e08e-4863-a710-3210171d27d6'),
>>> ],
>>> 'image_width_list': [
>>> 1992,
>>> 1194,
>>> ],
>>> 'image_height_list': [
>>> 1328,
>>> 401,
>>> ],
>>> }
>>> gid_list = ibeis.web.app.add_images_json(web_instance, **_payload)
>>> print(gid_list)
>>> print(web_instance.get_image_uuids(gid_list))
>>> print(web_instance.get_image_uris(gid_list))
>>> print(web_instance.get_image_paths(gid_list))
>>> print(web_instance.get_image_uris_original(gid_list))
"""
def _get_standard_ext(gpath):
ext = splitext(gpath)[1].lower()
return '.jpg' if ext == '.jpeg' else ext
def _parse_imageinfo(index):
def _resolve_uri():
list_ = image_uri_list
if list_ is None or index >= len(list_) or list_[index] is None:
raise ValueError('Must specify all required fields')
value = list_[index]
if isinstance(value, dict):
value = ut.s3_dict_encode_to_str(value)
return value
def _resolve(list_, default='', assert_=False):
if list_ is None or index >= len(list_) or list_[index] is None:
if assert_:
raise ValueError('Must specify all required fields')
return default
return list_[index]
uri = _resolve_uri()
orig_gname = basename(uri)
ext = _get_standard_ext(uri)
uuid_ = _resolve(image_uuid_list, assert_=True)
if isinstance(uuid_, six.string_types):
uuid_ = uuid.UUID(uuid_)
param_tup = (
uuid_,
uri,
uri,
_resolve(image_orig_name_list, default=orig_gname),
_resolve(image_ext_list, default=ext),
int(_resolve(image_width_list, assert_=True)),
int(_resolve(image_height_list, assert_=True)),
int(_resolve(image_time_posix_list, default=-1)),
float(_resolve(image_gps_lat_list, default=-1.0)),
float(_resolve(image_gps_lon_list, default=-1.0)),
int(_resolve(image_orientation_list, default=0)),
_resolve(image_notes_list),
)
return param_tup
# TODO: FIX ME SO THAT WE DON'T HAVE TO LOCALIZE EVERYTHING
kwargs['auto_localize'] = kwargs.get('auto_localize', True)
kwargs['sanitize'] = kwargs.get('sanitize', False)
index_list = range(len(image_uri_list))
params_gen = ut.generate(_parse_imageinfo, index_list, adjust=True,
force_serial=True, **kwargs)
params_gen = list(params_gen)
gpath_list = [ _[0] for _ in params_gen ]
gid_list = ibs.add_images(gpath_list, params_list=params_gen, **kwargs) # NOQA
# return gid_list
image_uuid_list = ibs.get_image_uuids(gid_list)
return image_uuid_list
@register_api('/api/annot/json/', methods=['POST'])
[docs]def add_annots_json(ibs, image_uuid_list, annot_uuid_list, annot_bbox_list,
annot_theta_list=None, annot_species_list=None,
annot_name_list=None, annot_notes_list=None, **kwargs):
"""
REST:
Method: POST
URL: /api/annot/json/
Ignore:
sudo pip install boto
Args:
image_uuid_list (list of str) : list of image UUIDs to be used in IBEIS IA
annot_uuid_list (list of str) : list of annotations UUIDs to be used in IBEIS IA
annot_bbox_list (list of 4-tuple) : list of bounding box coordinates encoded as
a 4-tuple of the values (xtl, ytl, width, height) where xtl is the
'top left corner, x value' and ytl is the 'top left corner, y value'.
annot_theta_list (list of float) : list of radian rotation around center.
Defaults to 0.0 (no rotation).
annot_species_list (list of str) : list of species for the annotation, if known.
If the list is partially known, use None (null in JSON) for unknown entries.
annot_name_list (list of str) : list of names for the annotation, if known.
If the list is partially known, use None (null in JSON) for unknown entries.
annot_notes_list (list of str) : list of notes to be added to the annotation.
**kwargs : key-value pairs passed to the ibs.add_annots() function.
CommandLine:
python -m ibeis.web.app --test-add_annots_json
Example:
>>> import ibeis
>>> from ibeis.control.IBEISControl import * # NOQA
>>> web_instance = ibeis.opendb(db='testdb1')
>>> _payload = {
>>> 'image_uuid_list': [
>>> uuid.UUID('7fea8101-7dec-44e3-bf5d-b8287fd231e2'),
>>> uuid.UUID('c081119a-e08e-4863-a710-3210171d27d6'),
>>> ],
>>> 'annot_uuid_list': [
>>> uuid.UUID('fe1547c5-1425-4757-9b8f-b2b4a47f552d'),
>>> uuid.UUID('86d3959f-7167-4822-b99f-42d453a50745'),
>>> ],
>>> 'annot_bbox_list': [
>>> [0, 0, 1992, 1328],
>>> [0, 0, 1194, 401],
>>> ],
>>> }
>>> aid_list = ibeis.web.app.add_annots_json(web_instance, **_payload)
>>> print(aid_list)
>>> print(web_instance.get_annot_image_uuids(aid_list))
>>> print(web_instance.get_annot_uuids(aid_list))
>>> print(web_instance.get_annot_bboxes(aid_list))
"""
image_uuid_list = [
uuid.UUID(uuid_) if isinstance(uuid_, six.string_types) else uuid_
for uuid_ in image_uuid_list
]
annot_uuid_list = [
uuid.UUID(uuid_) if isinstance(uuid_, six.string_types) else uuid_
for uuid_ in annot_uuid_list
]
gid_list = ibs.get_image_gids_from_uuid(image_uuid_list)
aid_list = ibs.add_annots(gid_list, annot_uuid_list=annot_uuid_list, # NOQA
bbox_list=annot_bbox_list, theta_list=annot_theta_list,
species_list=annot_species_list, name_list=annot_name_list,
notes_list=annot_notes_list, **kwargs)
# return aid_list
annot_uuid_list = ibs.get_annot_uuids(aid_list)
return annot_uuid_list
@register_api('/api/image/annot/uuids/json/', methods=['GET'])
[docs]def get_image_annot_uuids_json(ibs, image_uuid_list):
gid_list = ibs.get_image_gids_from_uuid(image_uuid_list)
aids_list = ibs.get_image_aids(gid_list)
annot_uuid_list = [
ibs.get_annot_uuids(aid_list)
for aid_list in aids_list
]
return annot_uuid_list
@register_api('/api/annot/exemplar/flags/json/', methods=['POST'])
[docs]def set_exemplars_from_quality_and_viewpoint_json(ibs, annot_uuid_list,
annot_name_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
if annot_name_list is not None:
# Set names for query annotations
nid_list = ibs.add_names(annot_name_list)
ibs.set_annot_name_rowids(aid_list, nid_list)
new_aid_list, new_flag_list = ibs.set_exemplars_from_quality_and_viewpoint(aid_list, **kwargs)
new_annot_uuid_list = ibs.get_annot_uuids(new_aid_list)
return new_annot_uuid_list, new_flag_list
@register_api('/api/image/uris_original/json/', methods=['GET'])
[docs]def get_image_uris_original_json(ibs, image_uuid_list):
gid_list = ibs.get_image_gids_from_uuid(image_uuid_list)
uri_list = ibs.get_image_uris_original(gid_list)
return uri_list
@register_api('/api/image/json/', methods=['GET'])
[docs]def get_valid_image_uuids_json(ibs, **kwargs):
gid_list = ibs.get_valid_gids(**kwargs)
return ibs.get_image_uuids(gid_list)
@register_api('/api/name/json/', methods=['GET'])
[docs]def get_valid_name_uuids_json(ibs, **kwargs):
nid_list = ibs.get_valid_nids(**kwargs)
return ibs.get_name_uuids(nid_list)
@register_api('/api/annot/json/', methods=['GET'])
[docs]def get_valid_annot_uuids_json(ibs, **kwargs):
aid_list = ibs.get_valid_aids(**kwargs)
return ibs.get_annot_uuids(aid_list)
@register_api('/api/imageset/json/', methods=['GET'])
[docs]def get_valid_imageset_uuids_json(ibs, **kwargs):
imgsetid_list = ibs.get_valid_imgsetids(**kwargs)
return ibs.get_imageset_uuid(imgsetid_list)
@register_api('/api/annot/bboxes/json/', methods=['GET'])
[docs]def get_annot_bboxes_json(ibs, annot_uuid_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
return ibs.get_annot_bboxes(aid_list, **kwargs)
@register_api('/api/annot/detect/confidence/json/', methods=['GET'])
[docs]def get_annot_detect_confidence_json(ibs, annot_uuid_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
return ibs.get_annot_detect_confidence(aid_list, **kwargs)
@register_api('/api/annot/exemplar/flags/json/', methods=['GET'])
[docs]def get_annot_exemplar_flags_json(ibs, annot_uuid_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
return ibs.get_annot_exemplar_flags(aid_list, **kwargs)
@register_api('/api/annot/thetas/json/', methods=['GET'])
[docs]def get_annot_thetas_json(ibs, annot_uuid_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
return ibs.get_annot_thetas(aid_list, **kwargs)
@register_api('/api/annot/verts/json/', methods=['GET'])
[docs]def get_annot_verts_json(ibs, annot_uuid_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
return ibs.get_annot_verts(aid_list, **kwargs)
@register_api('/api/annot/verts/rotated/json/', methods=['GET'])
[docs]def get_annot_rotated_verts_json(ibs, annot_uuid_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
return ibs.get_annot_rotated_verts(aid_list, **kwargs)
@register_api('/api/annot/yaws/json/', methods=['GET'])
[docs]def get_annot_yaws_json(ibs, annot_uuid_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
return ibs.get_annot_yaws(aid_list, **kwargs)
@register_api('/api/annot/notes/json/', methods=['GET'])
[docs]def get_annot_notes_json(ibs, annot_uuid_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
return ibs.get_annot_notes(aid_list, **kwargs)
@register_api('/api/annot/num_verts/json/', methods=['GET'])
[docs]def get_annot_num_verts_json(ibs, annot_uuid_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
return ibs.get_annot_num_verts(aid_list, **kwargs)
@register_api('/api/annot/name/uuids/json/', methods=['GET'])
[docs]def get_annot_name_rowids_json(ibs, annot_uuid_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
nid_list = ibs.get_annot_name_rowids(aid_list, **kwargs)
return ibs.get_name_uuids(nid_list)
@register_api('/api/annot/name/texts/json/', methods=['GET'])
[docs]def get_annot_name_texts_json(ibs, annot_uuid_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
return ibs.get_annot_name_texts(aid_list, **kwargs)
@register_api('/api/annot/species/json/', methods=['GET'])
[docs]def get_annot_species_json(ibs, annot_uuid_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
return ibs.get_annot_species(aid_list, **kwargs)
@register_api('/api/annot/species/texts/json/', methods=['GET'])
[docs]def get_annot_species_texts_json(ibs, annot_uuid_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
return ibs.get_annot_species_texts(aid_list, **kwargs)
@register_api('/api/annot/image/names/json/', methods=['GET'])
[docs]def get_annot_image_names_json(ibs, annot_uuid_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
return ibs.get_annot_image_names(aid_list, **kwargs)
@register_api('/api/annot/image/unixtimes/json/', methods=['GET'])
[docs]def get_annot_image_unixtimes_json(ibs, annot_uuid_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
return ibs.get_annot_image_unixtimes(aid_list, **kwargs)
@register_api('/api/annot/image/gps/json/', methods=['GET'])
[docs]def get_annot_image_gps_json(ibs, annot_uuid_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
return ibs.get_annot_image_gps(aid_list, **kwargs)
@register_api('/api/annot/image/paths/json/', methods=['GET'])
[docs]def get_annot_image_paths_json(ibs, annot_uuid_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
return ibs.get_annot_image_paths(aid_list, **kwargs)
@register_api('/api/annot/image/uuids/json/', methods=['GET'])
[docs]def get_annot_image_uuids_json(ibs, annot_uuid_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
image_uuid_list = [
None if aid is None else ibs.get_annot_image_uuids(aid, **kwargs)
for aid in aid_list
]
return image_uuid_list
@register_api('/api/imageset/annot/uuids/json/', methods=['GET'])
[docs]def get_imageset_annot_uuids_json(ibs, imageset_uuid_list):
imgsetid_list = ibs.get_imageset_imgsetids_from_uuid(imageset_uuid_list)
aids_list = ibs.get_imageset_aids(imgsetid_list)
annot_uuids_list = [
ibs.get_annot_uuids(aid_list)
for aid_list in aids_list
]
return annot_uuids_list
@register_api('/api/imageset/annot/aids/json/', methods=['GET'])
[docs]def get_imageset_annot_aids_json(ibs, imageset_uuid_list):
imgsetid_list = ibs.get_imageset_imgsetids_from_uuid(imageset_uuid_list)
aids_list = ibs.get_imageset_aids(imgsetid_list)
return aids_list
@register_api('/api/annot/qualities/json/', methods=['GET'])
[docs]def get_annot_qualities_json(ibs, annot_uuid_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
return ibs.get_annot_qualities(aid_list, **kwargs)
@register_api('/api/annot/quality/texts/json/', methods=['GET'])
[docs]def get_annot_quality_texts_json(ibs, annot_uuid_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
return ibs.get_annot_quality_texts(aid_list, **kwargs)
@register_api('/api/annot/yaw_texts/json/', methods=['GET'])
[docs]def get_annot_yaw_texts_json(ibs, annot_uuid_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
return ibs.get_annot_yaw_texts(aid_list, **kwargs)
@register_api('/api/annot/sex/json/', methods=['GET'])
[docs]def get_annot_sex_json(ibs, annot_uuid_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
return ibs.get_annot_sex(aid_list, **kwargs)
@register_api('/api/annot/sex/texts/json/', methods=['GET'])
[docs]def get_annot_sex_texts_json(ibs, annot_uuid_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
return ibs.get_annot_sex_texts(aid_list, **kwargs)
@register_api('/api/annot/age/min/json/', methods=['GET'])
[docs]def get_annot_age_months_est_min_json(ibs, annot_uuid_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
return ibs.get_annot_age_months_est_min(aid_list, **kwargs)
@register_api('/api/annot/age/max/json/', methods=['GET'])
[docs]def get_annot_age_months_est_max_json(ibs, annot_uuid_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
return ibs.get_annot_age_months_est_max(aid_list, **kwargs)
@register_api('/api/annot/age/min/texts/json/', methods=['GET'])
[docs]def get_annot_age_months_est_min_texts_json(ibs, annot_uuid_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
return ibs.get_annot_age_months_est_min_texts(aid_list, **kwargs)
@register_api('/api/annot/age/max/texts/json/', methods=['GET'])
[docs]def get_annot_age_months_est_max_texts_json(ibs, annot_uuid_list, **kwargs):
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
return ibs.get_annot_age_months_est_max_texts(aid_list, **kwargs)
@register_api('/api/image/json/', methods=['DELETE'])
[docs]def delete_images_json(ibs, image_uuid_list):
"""
REST:
Method: POST
URL: /api/image/json/
Args:
image_uuid_list (list of str) : list of image UUIDs to be delete from IBEIS
"""
gid_list = ibs.get_image_gids_from_uuid(image_uuid_list)
ibs.delete_images(gid_list)
return True
@register_api('/api/annot/json/', methods=['DELETE'])
[docs]def delete_annots_json(ibs, annot_uuid_list):
"""
REST:
Method: POST
URL: /api/annot/json/
Args:
annot_uuid_list (list of str) : list of annot UUIDs to be delete from IBEIS
"""
aid_list = ibs.get_annot_aids_from_uuid(annot_uuid_list)
ibs.delete_annots(aid_list)
return True
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()