-
Notifications
You must be signed in to change notification settings - Fork 0
/
robot_evidence_out.py
150 lines (126 loc) · 5.35 KB
/
robot_evidence_out.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#!/usr/bin/env python
# encoding: utf-8
#
# The MIT License (MIT)
#
# Copyright (c) 2015 CNRS
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
# AUTHORS
# Hervé BREDIN -- http://herve.niderb.fr/
"""
MediaEval evidence out robot
Usage:
robot_evidence_out [options]
Options:
-h --help Show this screen.
--version Show version.
--debug Show debug information.
--url=URL Submission server URL
[default: http://api.mediaeval.niderb.fr]
--password=P45sw0Rd Password
--period=N Query evidence queue every N sec [default: 600].
--log=DIR Path to log directory.
"""
from common import RobotCamomile, create_logger
from docopt import docopt
arguments = docopt(__doc__, version='0.1')
url = arguments['--url']
password = arguments['--password']
period = int(arguments['--period'])
debug = arguments['--debug']
log = arguments['--log']
logger = create_logger('robot_evidence_out', path=log, debug=debug)
robot = RobotCamomile(
url, 'robot_evidence', password=password,
period=period, logger=logger)
# filled by evidence annotation front-end
evidenceOutQueue = robot.getQueueByName(
'mediaeval.evidence.out')
# unique layer containing manual annotations
test = robot.getCorpusByName('mediaeval.test')
evidenceGroundtruthLayer = robot.getLayerByName(
test, 'mediaeval.groundtruth.evidence.all')
# keep track of (already done) manual annotations
# {id_shot, person_name, source: corrected_person_name}
# {id_shot, person_name, source: False} (if not an evidence)
mapping = {}
for _, evidences in robot.getAnnotations_iter(evidenceGroundtruthLayer):
for evidence in evidences:
id_shot = evidence.fragment
person_name = evidence.data.person_name
source = evidence.data.source
to = (evidence.data.corrected_person_name
if evidence.data.is_evidence
else False)
mapping[id_shot, person_name, source] = to
# forever loop on evidence front-end output
for item in robot.dequeue_loop(evidenceOutQueue):
# front-end input
id_shot = item.input.id_shot
id_medium = item.input.id_medium
person_name = item.input.person_name
source = item.input.source
# id_submission might be missing in case evidences
# were added manually to the queue independently of
# any submissions
id_submission = item.input.get('id_submission', None)
# front-end output
is_evidence = item.output.is_evidence
if is_evidence:
corrected_person_name = item.output.person_name
seconds = item.output.time
bounding_box = item.output.bounding_box
# if this hypothesized evidence has not been checked yet
# store it to the manual annotation layer
if (id_shot, person_name, source) not in mapping:
data = {}
data['person_name'] = person_name
data['is_evidence'] = is_evidence
data['source'] = source
data['log'] = item.get('log', {})
if is_evidence:
data['corrected_person_name'] = corrected_person_name
data['mugshot'] = {}
data['mugshot']['time'] = seconds
data['mugshot']['bounding_box'] = bounding_box
robot.createAnnotation(evidenceGroundtruthLayer,
medium=id_medium,
fragment=id_shot,
data=data)
# remember we have just added this new annotation
mapping[id_shot, person_name, source] = (corrected_person_name
if is_evidence
else False)
logger.info(
"new evidence - {name:s} - {source:s}".format(
name=person_name, source=source))
try:
# propagate this evidence to the corresponding submission mapping
description = robot.getLayer(id_submission).description
# (initialize empty mapping if needed)
_ = description.setdefault('mapping', {})
description.mapping[person_name] = mapping[id_shot,
person_name,
source]
robot.updateLayer(id_submission, description=description)
except Exception:
logger.debug(
"layer {layer} no longer exists".format(layer=id_submission))