-
Notifications
You must be signed in to change notification settings - Fork 10
Annotation
An annotation stores a user's clinical interpretation of a single image, within the context of a given study.
Each annotation has the following properties:
-
_id
: A unique identifier -
image
: An image for which this was created -
user
: An annotator who created this -
study
: A study under which this was created -
startTime
: A UTC time when the annotator started this -
stopTime
: A UTC time when the annotator completed this -
responses
: A mapping of response items, created during this -
markups
: A mapping of markup boolean summary items, created during this
A response is an annotator's subjective answer to a single question, within the context of a given annotation. Since questions concern attributes of the entire image, a response is non-localized (global; lesion-level), and is typically textual.
Depending on the properties of the corresponding question, a response may be entered as free-text or as an enumerated text value. At present, a response will always be encoded as a text string, but this may be generalized in the future.
A markup is an annotator's subjective evaluation of a single feature's presence or absence, within the context of a given annotation. Since features occur within particular areas of an image, a markup is localized (local; regional).
A markup is expressed in the most detail as an overlay mask, with the same dimensions as the annotation's image. The values (pixels) of the mask express the user's confidence that the feature is expressed at each location throughout the image; typical confidence values are 0% (absent), 50% (possible), and 100% (present).
Note, it is possible for a markup to contain an entirely 'empty' mask (all 0% values); this indicates that a user has evaluated the image for the presence of the feature, and affirmatively decided that it was absent everywhere. This is distinct from the mere omission of a markup for a given feature, which indicates that a user did not evaluate the image for the presence of that feature during the annotation.
Often, it is useful enough to know merely whether a feature was found anywhere within a given annotation's image. In these cases, a markup can be summarized by a simple boolean (true
/ false
) value:
-
true
indicating that the markup contained some non-absent regions (i.e. some 50% or 100% values) -
false
indicating that the markup was entirely 'empty' (i.e. all 0% values) - an absent markup indicating that a user did not evaluate the image for the presence of that feature.
A typical annotation object is JSON-encoded, and may look like:
{
"_id": "5a8e42c0120cd619c5c1eb81",
"image": {
"_id": "5a8e42bf5db34f881b9a9435",
"name": "ISIC_0004321"
},
"user": {
"_id": "5a8e42bedf9113f4204fe515",
"name": "User A1B2"
},
"study": {
"_id": "5a8e42c0b12c4db6763689ec",
"name": "Trainee Diagnosis Study"
},
"startTime": "2018-01-24T22:43:12+00:00",
"stopTime": "2018-01-24T22:49:37+00:00",
"responses": {
"Classify this lesion as benign or malignant": "Benign",
"Enter any other clinical observations": "atypical nevus"
},
"markups": {
"Dots : Regular": true,
"Structureless : Homogeneous pattern : NOS": false
}
}
Note that the annotation object only includes a summary of markup states. A full markup overlay mask is an 8-bit image, with pixel values of 0
(0%), 128
(50%), or 255
(100%). It is typically encoded as a greyscale PNG.
This is a WIP...
-
GET /annotation/{annotationId}
to get an annotation object -
GET /annotation/{annotationId}/markup/{featureName}
] to get a markup's full mask