diff --git a/.vscode/settings.json b/.vscode/settings.json index 3bd5b499..f7c16d1d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,10 +2,11 @@ "python.testing.unittestEnabled": false, "python.testing.pytestEnabled": true, "python.testing.pytestArgs": [ - "-v", + "-vv", "--cov=sleap_io/", "--cov-report=xml", "--pdb", "tests/" - ] + ], + "python.formatting.provider": "black" } \ No newline at end of file diff --git a/setup.cfg b/setup.cfg index eae1f653..1d080d60 100644 --- a/setup.cfg +++ b/setup.cfg @@ -23,6 +23,8 @@ install_requires = pynwb ndx-pose pandas + tables + ruamel.yaml [options.extras_require] dev = diff --git a/sleap_io/io/dlc.py b/sleap_io/io/dlc.py new file mode 100644 index 00000000..c8fc16c6 --- /dev/null +++ b/sleap_io/io/dlc.py @@ -0,0 +1,328 @@ +import math +import os +from typing import Dict, List, Optional, Tuple, Union + +import numpy as np +import pandas as pd +from sleap_io import Instance, LabeledFrame, Labels, Node, Point, Skeleton, Video + + +def is_multianimal(dlc_config: dict) -> bool: + """Returns True if `dlc_config` is configured for a multi-animal project, otherwise False + + Parameters: + dlc_config (dict): DLC project configuration data + + Returns: + bool: True if the config is setup for multi-animal projects, otherwise false + """ + return "multianimalproject" in dlc_config and dlc_config["multianimalproject"] + + +def load_skeletons(dlc_config: dict) -> List[Skeleton]: + """Load skeletons from a DLC configuration + + Parameters: + dlc_config (dict): DLC project configuration data + + Returns: + List of Sekeletons found in the DLC configuration + """ + + out = [] + if is_multianimal(dlc_config): + ma_nodes = [Node(bp) for bp in dlc_config["multianimalbodyparts"]] + out.append(Skeleton(ma_nodes, name="multi")) + + uq_nodes = [Node(bp) for bp in dlc_config["uniquebodyparts"]] + out.append(Skeleton(uq_nodes, name="unique")) + + else: + nodes = [Node(bp) for bp in dlc_config["bodyparts"]] + out.append(Skeleton(nodes, name="single")) + + return out + + +def load_dlc(dlc_config: dict) -> Labels: + """Given a DLC configuration, load all labels from the training set. + + Parameters: + dlc_config: DLC project configuration data + + Returns: + Labels loaded from the DLC project + """ + + videos = dlc_config["video_sets"].keys() + video_basenames = [os.path.splitext(os.path.basename(v))[0] for v in videos] + + all_annots = [] + for vb in video_basenames: + annot_path = os.path.join( + dlc_config["project_path"], + "labeled-data", + vb, + f'CollectedData_{dlc_config["scorer"]}.h5', + ) + if not os.path.exists(annot_path): + raise FileExistsError( + f'Unable to locate annotations, was expecting to find it here: "{annot_path}' + ) + + annots = pd.read_hdf(annot_path) + all_annots.append(annots) + + return dlc_to_labels(pd.concat(all_annots), dlc_config) + + +def write_dlc(dlc_config: dict, labels: Labels): + """Write Labels to a DLC project on disk + writes both the csv format as well as the HDF5 format + + Parameters: + dlc_config: DLC project configuration data + labels: Labels to be written to the DLC project + """ + + split_labels = split_labels_by_directory(labels) + + grouped_dlc: Dict[str, pd.DataFrame] = {} + for group, glabels in split_labels.items(): + grouped_dlc[group] = labels_to_dlc(glabels, dlc_config) + + for group, group_df in grouped_dlc.items(): + dest = os.path.join( + dlc_config["project_path"], + "labeled-data", + group, + f"CollectedData_{dlc_config['scorer']}", + ) + + group_df.to_csv(f"{dest}.csv") + group_df.to_hdf(f"{dest}.h5", key="df_with_missing", mode="w") + + +def make_index_from_dlc_config(dlc_config: dict) -> pd.MultiIndex: + """Given a DLC configuration, prepare a pandas multi-index + + Parameters: + dlc_config: DLC project configuration data + + Returns: + multiindex for dataframe columns + """ + if is_multianimal(dlc_config): + cols = [] + for individual in dlc_config["individuals"]: + for mabp in dlc_config["multianimalbodyparts"]: + cols.append((dlc_config["scorer"], individual, mabp, "x")) + cols.append((dlc_config["scorer"], individual, mabp, "y")) + for unbp in dlc_config["uniquebodyparts"]: + cols.append((dlc_config["scorer"], "single", unbp, "x")) + cols.append((dlc_config["scorer"], "single", unbp, "y")) + + return pd.MultiIndex.from_tuples( + cols, names=("scorer", "individuals", "bodyparts", "coords") + ) + + else: + return pd.MultiIndex.from_product( + [[dlc_config["scorer"]], dlc_config["bodyparts"], ["x", "y"]], + names=["scorer", "bodyparts", "coords"], + ) + + +def split_labels_by_directory(labels: Labels) -> Dict[str, Labels]: + """Split annotations into groups according to their file name + + Parameters: + intermediate_annotations (List[dict]): "intermediate-style" annotations + + Returns: + list of labels grouped by underlying video source + """ + grouped: Dict[str, List[LabeledFrame]] = {} + labels + + for labeled_frame in labels.labeled_frames: + path, _ = os.path.split(labeled_frame.video.filename) + _, group = os.path.split(path) + if group not in grouped: + grouped[group] = [] + grouped[group].append(labeled_frame) + + return {group: Labels(frames) for group, frames in grouped.items()} + + +def dlc_to_labels(annots: pd.DataFrame, dlc_config: dict) -> Labels: + """Convert a dlc-style dataframe to a Labels object""" + skeletons = load_skeletons(dlc_config) + frames: List[LabeledFrame] = [] + if is_multianimal(dlc_config): + # Iterate over frames + for frame in annots.index.values: + ma_instances: List[Instance] = [] + + # Iterate over individuals + for indv in annots.columns.levels[1].values: + + # pick the correct skeleton to use + skel: Skeleton + if indv == "single": + # `single` is a sentinal for unique bodyparts + skel = next(filter(lambda s: s.name == "unique", skeletons)) + + else: + # otherwise we are in a multi-animal context + skel = next(filter(lambda s: s.name == "multi", skeletons)) + + points = {} + # Iterate over this individual's body parts + bodyparts = list( + set( + bp + for _, bp, _ in annots.columns.get_loc_level( + indv, level="individuals" + )[1].values + ) + ) + for node in bodyparts: + x_pos = ( + annots.loc[frame, (dlc_config["scorer"], indv, node, "x")] + or np.nan + ) + y_pos = ( + annots.loc[frame, (dlc_config["scorer"], indv, node, "y")] + or np.nan + ) + + # If the value is a NAN, the user did not mark this keypoint + if math.isnan(x_pos) or math.isnan(y_pos): + continue + + points[skel[node]] = Point(x_pos, y_pos) + + ma_instances.append(Instance(points, skel)) + + ma_video, ma_frame_idx = video_from_index(frame, dlc_config) + frames.append(LabeledFrame(ma_video, ma_frame_idx, ma_instances)) + + else: + # fetch the skeleton to use + skel = next(filter(lambda s: s.name == "single", skeletons)) + # Iterate over frames + for frame in annots.index.values: + uq_instances: List[Instance] = [] + points = {} + # Iterate over this individual's body parts + for node in annots.columns.levels[1].values: + x_pos = ( + annots.loc[frame, (dlc_config["scorer"], indv, node, "x")] or np.nan + ) + y_pos = ( + annots.loc[frame, (dlc_config["scorer"], indv, node, "y")] or np.nan + ) + + # If the value is a NAN, the user did not mark this keypoint + if math.isnan(x_pos) or math.isnan(y_pos): + continue + + points[skel[node]] = Point(x_pos, y_pos) + + uq_instances.append(Instance(points, skel)) + + uq_video, uq_frame_idx = video_from_index(frame, dlc_config) + frames.append(LabeledFrame(uq_video, uq_frame_idx, ma_instances)) + + return Labels(frames) + + +def video_from_index( + index: Union[str, Tuple[str]], dlc_config: dict +) -> Tuple[Video, int]: + """Given an index from DLC-style dataframe, construct a video instance and the frame number""" + vfname: str + if isinstance(index, tuple): + vfname = "/".join(index) + else: + vfname = str(index) + video = Video(vfname) # TODO: find a better way to represent the data + frame_idx = ( + 0 # TODO: Just putting zero for now. Maybe we can parse from the filename??? + ) + + return video, frame_idx + + +def labels_to_dlc(labels: Labels, dlc_config: dict) -> pd.DataFrame: + """Convert a `Labels` instance to a DLC-format `pandas.DataFrame`""" + + is_ma = is_multianimal(dlc_config) + col_idx = make_index_from_dlc_config(dlc_config) + row_idx = [] + dlc_data: Dict[Tuple, List[float]] = {idx_val: [] for idx_val in col_idx.values} + + errors_found = 0 + for labeled_frame in labels.labeled_frames: + row_idx.append( + tuple(labeled_frame.video.filename.replace(r"\\", "/").split("/")) + ) + # fill across the board with None + for value in dlc_data.values(): + value.append(np.nan) + + instance_names = list(dlc_config["individuals"]).copy() + + for instance in labeled_frame.instances: + + # determine individual type / identity + instance_name: Optional[str] = None + if is_ma: + if instance.skeleton.name == "unique": + instance_name = "single" + + elif instance.skeleton.name == "multi": + instance_name = instance_names.pop(0) + + else: + raise ValueError( + "Type of instance is ambiguous. Skeleton should be named `unique` for unique body parts, or `multi` for multi-animal body parts!" + ) + + for node, point in instance.points.items(): + key: Tuple + if is_ma: + key = ( + dlc_config["scorer"], + instance_name, + node.name, + ) # TODO - need to represent the unique bodyparts somehow!! + + else: + key = (dlc_config["scorer"], node.name) + + try: + dlc_data[(*key, "x")][-1] = point.x + dlc_data[(*key, "y")][-1] = point.y + except KeyError: + errors_found += 1 + # if annot['bodypart'] in dlc_config['multianimalbodyparts'] and annot['individual'] is None: + # rationale = 'bodypart is a multianimal bodypart, but no relationship to an individual was found!' + # elif annot['bodypart'] in dlc_config['uniquebodyparts'] and annot['individual'] is not None: + # rationale = 'bodypart is a unique bodypart and should not have a relationship with an individual, but one was found' + # else: + # rationale = 'Unknown' + + # message = 'ERROR! Data seems to violate the DLC annotation schema!\n' \ + # f' -> Task: {annot["task_id"]}\n' \ + # f' -> Image: "{annot["file_name"]}"\n' \ + # f' -> Bodypart: {annot["bodypart"]}\n' + # if is_ma: + # message += f' -> Individual: {annot.get("individual", None)}\n' + # message += f' -> Rationale: {rationale}\n' + # print(message) + row_index = pd.MultiIndex.from_tuples(row_idx) + dlc_df = pd.DataFrame(dlc_data, index=row_index, columns=col_idx) + + return dlc_df diff --git a/sleap_io/io/labelstudio.py b/sleap_io/io/labelstudio.py new file mode 100644 index 00000000..70da1022 --- /dev/null +++ b/sleap_io/io/labelstudio.py @@ -0,0 +1,287 @@ +"""This module handles direct I/O operations for working with .slp files. + +Some important nomenclature: + - `tasks`: typically maps to a single frame of data to be annotated, closest correspondance is to `LabeledFrame` + - `annotations`: collection of points, polygons, relations, etc. corresponds to `Instance`s and `Point`s, but a flattened hierarchy + +""" + + +import datetime +import json +import math +import uuid +from typing import Dict, Iterable, List, Tuple + +from sleap_io import Instance, LabeledFrame, Labels, Node, Point, Video, Skeleton + + +def read_labels(labels_path: str, skeleton: Skeleton) -> Labels: + """Read label-studio style annotations from a file and return a `Labels` object. + + Args: + labels_path: Path to the label-studio annotation file, in json format. + skeleton: Skeleton + + Returns: + Parsed labels as a `Labels` instance. + """ + with open(labels_path, "r") as task_file: + tasks = json.load(task_file) + + return parse_tasks(tasks, skeleton) + + +def parse_tasks(tasks: List[Dict], skeleton: Skeleton) -> Labels: + """Read label-studio style annotations from a file and return a `Labels` object + + Args: + tasks: collection of tasks to be concerted to `Labels` + skeleton: Skeleton + + Returns: + Parsed labels as a `Labels` instance. + """ + frames: List[LabeledFrame] = [] + for entry in tasks: + # depending version, we have seen keys `annotations` and `completions` + if "annotations" in entry: + key = "annotations" + elif "completions" in entry: + key = "completions" + else: + raise ValueError("Cannot find annotation data for entry!") + + frames.append(task_to_labeled_frame(entry, skeleton, key=key)) + + return Labels(frames) + + +def write_labels(labels: Labels) -> List[dict]: + """Convert a `Labels` object into label-studio annotations + + Args: + labels: Labels to be converted to label-studio task format + + Returns: + label-studio version of `Labels` + """ + + out = [] + for frame in labels.labeled_frames: + if frame.video.shape is not None: + height = frame.video.shape[1] + width = frame.video.shape[2] + else: + height = 100 + width = 100 + + frame_annots = [] + + for instance in frame.instances: + inst_id = uuid.uuid4() + frame_annots.append( + { + "original_width": width, + "original_height": height, + "image_rotation": 0, + "value": { + "x": 0, + "y": 0, + "width": width, + "height": height, + "rotation": 0, + "rectanglelabels": [ + "instance_class" + ], # TODO: need to handle instance classes / identity + }, + "id": inst_id, + "from_name": "individuals", + "to_name": "image", + "type": "rectanglelabels", + } + ) + + for node, point in instance.points.items(): + point_id = uuid.uuid4() + + # add this point + frame_annots.append( + { + "original_width": width, + "original_height": height, + "image_rotation": 0, + "value": { + "x": point.x / width * 100, + "y": point.y / height * 100, + "keypointlabels": [node.name], + }, + "from_name": "keypoint-label", + "to_name": "image", + "type": "keypointlabels", + "id": point_id, + } + ) + + # add relationship of point to individual + frame_annots.append( + { + "from_id": point_id, + "to_id": inst_id, + "type": "relation", + "direction": "right", + } + ) + + out.append( + { + "data": { + # 'image': f"/data/{up_deets['file']}" + }, + "meta": { + "video": { + "filename": frame.video.filename, + "frame_idx": frame.frame_idx, + "shape": frame.video.shape, + } + }, + "annotations": [ + { + "result": frame_annots, + "was_cancelled": False, + "ground_truth": False, + "created_at": datetime.datetime.utcnow().strftime( + "%Y-%m-%dT%H:%M:%S.%fZ" + ), + "updated_at": datetime.datetime.utcnow().strftime( + "%Y-%m-%dT%H:%M:%S.%fZ" + ), + "lead_time": 0, + "result_count": 1, + # "completed_by": user['id'] + } + ], + } + ) + + return out + + +def task_to_labeled_frame( + task: dict, skeleton: Skeleton, key: str = "annotations" +) -> LabeledFrame: + """Parse annotations from an entry""" + + if len(task[key]) > 1: + print( + "WARNING: Task {}: Multiple annotations found, only taking the first!".format( + task.get("id", "??") + ) + ) + + try: + # only parse the first entry result + to_parse = task[key][0]["result"] + + individuals = filter_and_index(to_parse, "rectanglelabels") + keypoints = filter_and_index(to_parse, "keypointlabels") + relations = build_relation_map(to_parse) + instances = [] + + if len(individuals) > 0: + # multi animal case: + for indv_id, indv in individuals.items(): + points = {} + for rel in relations[indv_id]: + kpt = keypoints.pop(rel) + node = Node(kpt["value"]["keypointlabels"][0]) + x_pos = (kpt["value"]["x"] * kpt["original_width"]) / 100 + y_pos = (kpt["value"]["y"] * kpt["original_height"]) / 100 + + # If the value is a NAN, the user did not mark this keypoint + if math.isnan(x_pos) or math.isnan(y_pos): + continue + + points[node] = Point(x_pos, y_pos) + + if len(points) > 0: + instances.append(Instance(points, skeleton)) + + # If this is multi-animal, any leftover keypoints should be unique bodyparts, and will be collected here + # if single-animal, we only have 'unique bodyparts' [in a way] and the process is identical + points = {} + for _, kpt in keypoints.items(): + node = Node(kpt["value"]["keypointlabels"][0]) + points[node] = Point( + (kpt["value"]["x"] * kpt["original_width"]) / 100, + (kpt["value"]["y"] * kpt["original_height"]) / 100, + visible=True, + ) + if len(points) > 0: + instances.append(Instance(points, skeleton)) + + video, frame_idx = video_from_task(task) + + return LabeledFrame(video, frame_idx, instances) + except Exception as excpt: + raise RuntimeError( + "While working on Task #{}, encountered the following error:".format( + task.get("id", "??") + ) + ) from excpt + + +def filter_and_index(annotations: Iterable[dict], annot_type: str) -> Dict[str, dict]: + """Filter annotations based on the type field and index them by ID + + Args: + annotation: annotations to filter and index + annot_type: annotation type to filter e.x. 'keypointlabels' or 'rectanglelabels' + + Returns: + Dict[str, dict] - indexed and filtered annotations. Only annotations of type `annot_type` + will survive, and annotations are indexed by ID + """ + filtered = list(filter(lambda d: d["type"] == annot_type, annotations)) + indexed = {item["id"]: item for item in filtered} + return indexed + + +def build_relation_map(annotations: Iterable[dict]) -> Dict[str, List[str]]: + """Build a two-way relationship map between annotations + + Args: + annotations: annotations, presumably, containing relation types + + Returns: + A two way map of relations indexed by `from_id` and `to_id` fields. + """ + relations = list(filter(lambda d: d["type"] == "relation", annotations)) + relmap: Dict[str, List[str]] = {} + for rel in relations: + if rel["from_id"] not in relmap: + relmap[rel["from_id"]] = [] + relmap[rel["from_id"]].append(rel["to_id"]) + + if rel["to_id"] not in relmap: + relmap[rel["to_id"]] = [] + relmap[rel["to_id"]].append(rel["from_id"]) + return relmap + + +def video_from_task(task: dict) -> Tuple[Video, int]: + """Given a label-studio task, retrieve video information + + Args: + task: label-studio task + + Returns: + Video and frame index for this task + """ + if "meta" in task and "video" in task["meta"]: + video = Video(task["meta"]["video"]["filename"], task["meta"]["video"]["shape"]) + frame_idx = task["meta"]["video"]["frame_idx"] + return video, frame_idx + + else: + raise KeyError("Unable to locate video information for task!", task) diff --git a/sleap_io/model/instance.py b/sleap_io/model/instance.py index a0e6f36c..4a1e3763 100644 --- a/sleap_io/model/instance.py +++ b/sleap_io/model/instance.py @@ -8,13 +8,17 @@ """ from __future__ import annotations -from attrs import define, validators, field +from attrs import define, validators, field, cmp_using from typing import Optional, Union from sleap_io import Skeleton, Node import numpy as np import math +def _point_comparison(a, b) -> bool: + return bool(np.isclose(a, b, equal_nan=True)) + + @define class Point: """A 2D spatial landmark and metadata associated with annotation. @@ -26,8 +30,8 @@ class Point: complete: Has the point been verified by the user labeler. """ - x: float - y: float + x: float = field(eq=cmp_using(eq=_point_comparison)) # type: ignore + y: float = field(eq=cmp_using(eq=_point_comparison)) # type: ignore visible: bool = True complete: bool = False @@ -82,7 +86,26 @@ class Track: name: str = "" -@define(auto_attribs=True, slots=True, eq=False) +def compare_points( + a: Union[dict[Node, Point], dict[Node, PredictedPoint]], + b: Union[dict[Node, Point], dict[Node, PredictedPoint]], +) -> bool: + """Compare this instances points to another set of points""" + # First check we are speaking the same languague of nodes + if not set(a.keys()) == set(b.keys()): + return False + + # check each point in self vs other + for node, point in a.items(): + if not point == b[node]: + print(node.name) + return False + + # otherwise, return True + return True + + +@define(auto_attribs=True, slots=True, eq=True) class Instance: """This class represents a ground truth instance such as an animal. @@ -143,7 +166,7 @@ def _convert_points(self, attr, points): return points points: Union[dict[Node, Point], dict[Node, PredictedPoint]] = field( - on_setattr=_convert_points + on_setattr=_convert_points, eq=cmp_using(eq=compare_points) # type: ignore ) skeleton: Skeleton track: Optional[Track] = None diff --git a/tests/conftest.py b/tests/conftest.py index 8a11f289..2184141a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2,3 +2,5 @@ from tests.fixtures.slp import * from tests.fixtures.labels import * +from tests.fixtures.labelstudio import * +from tests.fixtures.dlc import * diff --git a/tests/data/dlc/dlc_test_project/config.yaml b/tests/data/dlc/dlc_test_project/config.yaml new file mode 100644 index 00000000..c2f426a0 --- /dev/null +++ b/tests/data/dlc/dlc_test_project/config.yaml @@ -0,0 +1,65 @@ + # Project definitions (do not edit) +Task: dlc_test_project +scorer: JohnDoe +date: Feb13 +multianimalproject: true +identity: false + + # Project path (change when moving around) +project_path: /home/johndoe/workspace/dlc_test_project + + # Annotation data set configuration (and individual video cropping parameters) +video_sets: + /home/johndoe/workspace/dlc_test_project/videos/PrL-3_09072020.mp4: + crop: 0, 1280, 0, 720 + /home/johndoe/workspace/dlc_test_project/videos/PrL-19_11042020.mp4: + crop: 0, 1280, 0, 720 +individuals: +- pup1 +- pup2 +- pup3 +- pup4 +- pup5 +- pup6 +- pup7 +uniquebodyparts: [nest, moth_nose, moth_leftear, moth_rightear, moth_neck, moth_torso, moth_waist, moth_tailbase] +multianimalbodyparts: +- pup_snout +- pup_neck +- pup_body +- pup_tailbase +bodyparts: MULTI! +start: 0 +stop: 1 +numframes2pick: 38 + + # Plotting configuration +skeleton_color: black +pcutoff: 0.6 +dotsize: 12 +alphavalue: 0.7 +colormap: rainbow + + # Training,Evaluation and Analysis configuration +TrainingFraction: +- 0.95 +iteration: 0 +default_net_type: dlcrnet_ms5 +default_augmenter: multi-animal-imgaug +default_track_method: ellipse +snapshotindex: -1 +batch_size: 8 + + # Cropping Parameters (for analysis and outlier frame detection) +cropping: false + #if cropping is true for analysis, then set the values here: +x1: 0 +x2: 640 +y1: 277 +y2: 624 + + # Refinement configuration (parameters from annotation dataset configuration also relevant in this stage) +corner2move2: +- 50 +- 50 +move2corner: true diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/CollectedData_JohnDoe.csv b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/CollectedData_JohnDoe.csv new file mode 100644 index 00000000..3c114495 --- /dev/null +++ b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/CollectedData_JohnDoe.csv @@ -0,0 +1,42 @@ +scorer,,,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe +individuals,,,pup1,pup1,pup1,pup1,pup1,pup1,pup1,pup1,pup2,pup2,pup2,pup2,pup2,pup2,pup2,pup2,pup3,pup3,pup3,pup3,pup3,pup3,pup3,pup3,pup4,pup4,pup4,pup4,pup4,pup4,pup4,pup4,pup5,pup5,pup5,pup5,pup5,pup5,pup5,pup5,pup6,pup6,pup6,pup6,pup6,pup6,pup6,pup6,pup7,pup7,pup7,pup7,pup7,pup7,pup7,pup7,single,single,single,single,single,single,single,single,single,single,single,single,single,single,single,single +bodyparts,,,pup_snout,pup_snout,pup_neck,pup_neck,pup_body,pup_body,pup_tailbase,pup_tailbase,pup_snout,pup_snout,pup_neck,pup_neck,pup_body,pup_body,pup_tailbase,pup_tailbase,pup_snout,pup_snout,pup_neck,pup_neck,pup_body,pup_body,pup_tailbase,pup_tailbase,pup_snout,pup_snout,pup_neck,pup_neck,pup_body,pup_body,pup_tailbase,pup_tailbase,pup_snout,pup_snout,pup_neck,pup_neck,pup_body,pup_body,pup_tailbase,pup_tailbase,pup_snout,pup_snout,pup_neck,pup_neck,pup_body,pup_body,pup_tailbase,pup_tailbase,pup_snout,pup_snout,pup_neck,pup_neck,pup_body,pup_body,pup_tailbase,pup_tailbase,nest,nest,moth_nose,moth_nose,moth_leftear,moth_leftear,moth_rightear,moth_rightear,moth_neck,moth_neck,moth_torso,moth_torso,moth_waist,moth_waist,moth_tailbase,moth_tailbase +coords,,,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y +labeled-data,PrL-19_11042020,img00144.png,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,892.5866667,385.5924171,713.3866667,508.436019,750.9333333,571.563981,797.0133333,511.8483412,790.1866667,554.5023697,844.8,573.2701422,892.5866667,600.5687204,954.0266667,624.4549763 +labeled-data,PrL-19_11042020,img00838.png,148.48,155.2606635,174.08,167.2037915,197.9733333,191.0900474,179.2,220.0947867,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,834.56,327.5829384,694.6133333,139.9052133,757.76,162.0853081,769.7066667,112.6066351,754.3466667,138.1990521,795.3066667,148.436019,868.6933333,172.3222749,940.3733333,194.5023697 +labeled-data,PrL-19_11042020,img02172.png,240.1293172,149.0750865,221.4784965,168.8857137,199.3306468,195.688327,179.5141498,216.6642853,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,875.52,348.056872,,,293.5466667,211.563981,250.88,156.9668246,274.7733333,172.3222749,322.56,141.6113744,365.2266667,155.2606635,414.72,175.7345972 +labeled-data,PrL-19_11042020,img03680.png,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,875.52,377.0616114,259.1462181,230.9468133,278.1866667,139.9052133,252.5866667,172.3222749,242.3466667,148.436019,186.0266667,148.436019,151.8933333,191.0900474,151.8933333,250.8056872 +labeled-data,PrL-19_11042020,img06125.png,240.64,632.985782,264.5333333,600.5687204,286.72,569.8578199,319.1466667,557.9146919,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,844.8,336.1137441,964.2666667,274.6919431,996.6933333,187.6777251,936.96,196.2085308,969.3866667,201.3270142,947.2,155.2606635,,,, +labeled-data,PrL-19_11042020,img07061.png,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,870.4,354.8815166,279.8933333,530.6161137,283.3066667,602.2748815,337.92,557.9146919,312.32,581.8009479,366.9333333,592.0379147,414.72,600.5687204,464.2133333,624.4549763 +labeled-data,PrL-19_11042020,img08808.png,153.4016501,281.7092143,177.286828,262.8961636,205.5147655,247.7010072,242.4282222,264.3433214,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,856.7466667,313.9336493,994.9866667,271.2796209,1010.346667,192.7962085,959.1466667,216.6824645,979.6266667,192.7962085,954.0266667,145.0236967,913.0666667,145.0236967,878.9333333,162.0853081 +labeled-data,PrL-19_11042020,img09342.png,209.92,312.2274882,199.68,281.5165877,197.9733333,255.9241706,194.56,225.2132701,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,873.8133333,332.7014218,843.0933333,477.7251185,933.5466667,494.7867299,916.48,428.2464455,942.08,447.014218,960.8533333,404.3601896,977.92,371.943128,998.4,341.2322275 +labeled-data,PrL-19_11042020,img10539.png,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,872.1066667,371.943128,199.68,131.3744076,199.68,168.9099526,247.4666667,196.2085308,211.6266667,199.6208531,187.7333333,226.9194313,170.6666667,281.5165877,174.08,325.8767773 +labeled-data,PrL-19_11042020,img11688.png,249.1733333,291.7535545,250.88,262.7488152,256,232.0379147,267.9466667,196.2085308,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,913.0666667,305.4028436,825.6674493,268.0693039,822.6133333,329.2890995,880.64,307.1090047,853.3333333,317.3459716,878.9333333,365.1184834,899.4133333,407.7725118,931.84,467.4881517 +labeled-data,PrL-19_11042020,img12068.png,244.0533333,286.6350711,247.4666667,254.2180095,256,220.0947867,262.8266667,197.9146919,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,797.0133333,322.464455,,,868.6933333,300.2843602,814.08,295.1658768,843.0933333,296.8720379,851.6266667,255.9241706,875.52,211.563981,906.24,218.3886256 +labeled-data,PrL-19_11042020,img12940.png,273.0666667,158.6729858,235.52,167.2037915,203.0933333,167.2037915,175.7866667,180.8530806,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,803.84,319.0521327,810.6666667,167.2037915,844.8,228.6255924,,,878.9333333,221.8009479,885.76,252.5118483,885.76,284.92891,890.88,354.8815166 +labeled-data,PrL-19_11042020,img13408.png,228.6933333,281.5165877,215.04,237.1563981,203.0933333,204.7393365,189.44,180.8530806,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,805.5466667,293.4597156,853.3333333,363.4123223,909.6533333,284.92891,853.3333333,286.6350711,878.9333333,288.3412322,873.8133333,242.2748815,861.8666667,214.9763033,, +labeled-data,PrL-19_11042020,img14281.png,194.56,267.8672986,218.4533333,245.6872038,244.0533333,213.2701422,247.4666667,179.1469194,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,873.8133333,313.9336493,,,737.28,590.3317536,730.4533333,523.7914692,732.16,556.2085308,778.24,561.3270142,834.56,581.8009479,884.0533333,609.0995261 +labeled-data,PrL-19_11042020,img16259.png,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,863.5733333,308.8151659,223.5733333,266.1611374,262.8266667,184.2654028,208.2133333,220.0947867,230.4,209.8578199,204.8,170.6161137,174.08,129.6682464,, +labeled-data,PrL-19_11042020,img16808.png,266.24,247.3933649,240.64,216.6824645,211.6266667,201.3270142,199.68,218.3886256,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,885.76,342.9383886,745.4689837,522.251709,785.0666667,586.9194313,831.1466667,525.4976303,819.2,556.2085308,875.52,569.8578199,921.6,585.2132701,959.1466667,592.0379147 +labeled-data,PrL-19_11042020,img17507.png,233.8133333,532.3222749,238.9333333,556.2085308,252.5866667,593.7440758,269.6533333,627.8672986,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,844.8,348.056872,901.12,368.5308057,916.48,278.1042654,855.04,305.4028436,887.4666667,300.2843602,870.4,255.9241706,860.16,220.0947867,829.44,185.971564 +labeled-data,PrL-19_11042020,img17844.png,,,342.2849491,587.5760211,304.135543,582.279062,278.7026056,603.4668986,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,873.8133333,324.1706161,354.9866667,397.535545,358.4,479.4312796,419.84,447.014218,395.9466667,470.9004739,401.0666667,513.5545024,411.3066667,568.1516588,459.0933333,614.2180095 +labeled-data,PrL-19_11042020,img18212.png,220.16,592.0379147,250.88,597.1563981,291.84,593.7440758,308.9066667,568.1516588,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,878.9333333,315.6398104,150.1866667,206.4454976,208.2133333,204.7393365,175.7866667,150.1421801,186.0266667,177.4407583,220.16,167.2037915,279.8933333,168.9099526,344.7466667,184.2654028 +labeled-data,PrL-19_11042020,img19360.png,209.8217335,428.860469,225.7173194,453.2264811,235.2546709,481.8300605,229.9561423,515.7305991,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,872.1066667,315.6398104,515.4133333,503.3175355,493.2266667,527.2037915,546.1333333,563.0331754,517.12,557.9146919,481.28,583.507109,435.2,600.5687204,395.9466667,617.6303318 +labeled-data,PrL-19_11042020,img21452.png,214.349567,438.841516,230.1137844,444.9702291,257.2632699,476.4893249,261.6422192,517.6392555,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,890.88,344.6445498,,,180.9066667,501.6113744,244.0533333,525.4976303,213.3333333,513.5545024,187.7333333,551.0900474,168.96,595.450237,, +labeled-data,PrL-19_11042020,img23952.png,184.32,150.1421801,199.68,177.4407583,226.9866667,189.3838863,256,187.6777251,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,877.2266667,320.7582938,829.44,605.6872038,889.1733333,573.2701422,846.5066667,518.6729858,866.9866667,539.1469194,911.36,522.0853081,971.0933333,540.8530806,974.5066667,602.2748815 +labeled-data,PrL-19_11042020,img25327.png,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,882.3466667,327.5829384,242.3466667,119.4312796,203.0933333,191.0900474,285.0133333,184.2654028,247.4666667,196.2085308,223.5733333,218.3886256,179.2,226.9194313,157.0133333,259.3364929 +labeled-data,PrL-19_11042020,img26630.png,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,868.6933333,310.521327,839.68,341.2322275,909.6533333,382.1800948,925.0133333,308.8151659,931.84,349.7630332,976.2133333,378.7677725,983.04,429.9526066,986.4533333,470.9004739 +labeled-data,PrL-19_11042020,img28614.png,291.84,573.2701422,274.7733333,602.2748815,242.3466667,622.7488152,194.56,621.042654,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,863.5733333,322.464455,882.3466667,573.2701422,950.6133333,535.7345972,889.1733333,489.6682464,916.48,511.8483412,954.0266667,496.492891,,,, +labeled-data,PrL-19_11042020,img29764.png,237.2266667,580.0947867,249.1733333,540.8530806,264.5333333,510.1421801,285.0133333,476.0189573,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,875.52,324.1706161,232.0755537,139.6464992,189.44,177.4407583,252.5866667,199.6208531,215.04,194.5023697,197.9733333,233.7440758,182.6133333,283.2227488,192.8533333,337.8199052 +labeled-data,PrL-19_11042020,img31551.png,162.5684919,315.8233607,172.2021803,290.7831901,194.3596636,269.5953535,234.8211549,266.706103,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,877.2266667,337.8199052,827.7333333,544.2654028,875.52,607.3933649,880.64,549.3838863,889.1733333,576.6824645,935.2533333,574.9763033,974.5066667,574.9763033,1017.173333,571.563981 +labeled-data,PrL-19_11042020,img32037.png,143.36,223.507109,168.96,238.8625592,191.1466667,257.6303318,194.56,290.0473934,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,882.3466667,329.2890995,841.3866667,590.3317536,904.5333333,590.3317536,868.6933333,523.7914692,894.2933333,552.7962085,948.9066667,534.028436,986.4533333,527.2037915,1013.76,516.9668246 +labeled-data,PrL-19_11042020,img32312.png,199.68,197.9146919,194.56,228.6255924,191.1466667,257.6303318,203.0933333,284.92891,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,875.52,324.1706161,716.8,511.8483412,749.2266667,564.7393365,783.36,496.492891,795.3066667,534.028436,839.68,552.7962085,873.8133333,578.3886256,914.7733333,603.9810427 +labeled-data,PrL-19_11042020,img32749.png,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,856.7466667,305.4028436,240.64,124.549763,189.44,199.6208531,266.24,213.2701422,221.8666667,201.3270142,215.04,233.7440758,204.8,291.7535545,206.5066667,363.4123223 +labeled-data,PrL-19_11042020,img33841.png,155.3066667,243.9810427,163.84,267.8672986,182.6133333,298.5781991,204.8,344.6445498,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,861.8666667,296.8720379,324.2666667,525.4976303,250.88,547.6777251,300.3733333,602.2748815,273.0666667,573.2701422,238.9333333,586.9194313,189.44,607.3933649,, +labeled-data,PrL-19_11042020,img35166.png,281.3037015,597.8816202,248.5491609,591.1400358,210.0144073,601.7339541,192.6737681,626.7741247,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,870.4,300.2843602,,,930.1333333,353.1753555,,,955.7333333,360,959.1466667,406.0663507,952.32,458.957346,938.6666667,523.7914692 +labeled-data,PrL-19_11042020,img35887.png,148.48,511.8483412,179.2,537.4407583,186.0266667,578.3886256,192.8533333,603.9810427,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,844.8,264.4549763,,,,,901.12,399.2417062,914.7733333,421.4218009,947.2,370.2369668,935.2533333,315.6398104,, +labeled-data,PrL-19_11042020,img37006.png,216.7466667,499.9052133,256,508.436019,295.2533333,525.4976303,319.1466667,547.6777251,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,843.0933333,279.8104265,,,191.1466667,184.2654028,257.7066667,208.1516588,221.8666667,197.9146919,209.92,233.7440758,186.0266667,291.7535545,182.6133333,365.1184834 +labeled-data,PrL-19_11042020,img38538.png,278.596635,456.7224742,298.4131321,484.6904185,310.069895,513.8236938,327.5550395,552.2796173,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,831.1466667,322.464455,,,,,,,,,,,,,894.2933333,163.7914692 +labeled-data,PrL-19_11042020,img39038.png,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,855.04,300.2843602,,,,,,,,,793.6,216.6824645,,,, +labeled-data,PrL-19_11042020,img39580.png,194.7209269,630.6826747,218.0344529,608.4354463,240.2882731,607.3760545,256.1838589,620.0887564,,,,,770.5557453,327.3707316,758.8989823,340.1893728,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,904.5333333,330.9952607,,,,,,,,,807.6261783,281.9902379,,,, +labeled-data,PrL-19_11042020,img42889.png,336.2133333,586.9194313,305.4933333,590.3317536,278.1866667,593.7440758,247.4666667,603.9810427,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,878.9333333,266.1611374,,,779.9466667,254.2180095,769.7066667,301.9905213,774.8266667,276.3981043,730.4533333,274.6919431,677.5466667,255.9241706,641.7066667,240.5687204 diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/CollectedData_JohnDoe.h5 b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/CollectedData_JohnDoe.h5 new file mode 100644 index 00000000..1867b5d5 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/CollectedData_JohnDoe.h5 differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img00144.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img00144.png new file mode 100644 index 00000000..df208ad2 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img00144.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img00838.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img00838.png new file mode 100644 index 00000000..bf97b66e Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img00838.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img02172.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img02172.png new file mode 100644 index 00000000..ddff43db Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img02172.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img03680.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img03680.png new file mode 100644 index 00000000..8ba56a84 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img03680.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img06125.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img06125.png new file mode 100644 index 00000000..ddfe2962 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img06125.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img07061.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img07061.png new file mode 100644 index 00000000..e607200e Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img07061.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img08808.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img08808.png new file mode 100644 index 00000000..dbae4218 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img08808.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img09342.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img09342.png new file mode 100644 index 00000000..6f07a972 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img09342.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img10539.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img10539.png new file mode 100644 index 00000000..dae75faa Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img10539.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img11688.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img11688.png new file mode 100644 index 00000000..e4e7ef53 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img11688.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img12068.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img12068.png new file mode 100644 index 00000000..73d4a538 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img12068.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img12940.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img12940.png new file mode 100644 index 00000000..09f28d43 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img12940.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img13408.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img13408.png new file mode 100644 index 00000000..01113a0d Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img13408.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img14281.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img14281.png new file mode 100644 index 00000000..12346bd0 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img14281.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img16259.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img16259.png new file mode 100644 index 00000000..aeadfa8c Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img16259.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img16808.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img16808.png new file mode 100644 index 00000000..23ac36f5 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img16808.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img17507.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img17507.png new file mode 100644 index 00000000..5b699022 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img17507.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img17844.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img17844.png new file mode 100644 index 00000000..da7b789b Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img17844.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img18212.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img18212.png new file mode 100644 index 00000000..89bb62ae Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img18212.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img19360.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img19360.png new file mode 100644 index 00000000..6496d1ca Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img19360.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img21452.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img21452.png new file mode 100644 index 00000000..08d552d2 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img21452.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img23952.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img23952.png new file mode 100644 index 00000000..ff081611 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img23952.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img25327.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img25327.png new file mode 100644 index 00000000..5d48994a Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img25327.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img26630.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img26630.png new file mode 100644 index 00000000..1dc0a225 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img26630.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img28614.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img28614.png new file mode 100644 index 00000000..3ced25f7 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img28614.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img29764.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img29764.png new file mode 100644 index 00000000..1c3b5413 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img29764.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img31551.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img31551.png new file mode 100644 index 00000000..1e58b424 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img31551.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img32037.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img32037.png new file mode 100644 index 00000000..8fa291d7 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img32037.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img32312.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img32312.png new file mode 100644 index 00000000..ecdc2b99 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img32312.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img32749.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img32749.png new file mode 100644 index 00000000..000bda0b Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img32749.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img33841.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img33841.png new file mode 100644 index 00000000..60526208 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img33841.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img35166.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img35166.png new file mode 100644 index 00000000..c19ae02c Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img35166.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img35887.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img35887.png new file mode 100644 index 00000000..e48ebcc5 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img35887.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img37006.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img37006.png new file mode 100644 index 00000000..1adb5fe9 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img37006.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img38538.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img38538.png new file mode 100644 index 00000000..3eeacefe Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img38538.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img39038.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img39038.png new file mode 100644 index 00000000..3e5c5991 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img39038.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img39580.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img39580.png new file mode 100644 index 00000000..da9b9fe4 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img39580.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img42889.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img42889.png new file mode 100644 index 00000000..d1b2d8a0 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-19_11042020/img42889.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/CollectedData_JohnDoe.csv b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/CollectedData_JohnDoe.csv new file mode 100644 index 00000000..2125e648 --- /dev/null +++ b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/CollectedData_JohnDoe.csv @@ -0,0 +1,42 @@ +scorer,,,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe,JohnDoe +individuals,,,pup1,pup1,pup1,pup1,pup1,pup1,pup1,pup1,pup2,pup2,pup2,pup2,pup2,pup2,pup2,pup2,pup3,pup3,pup3,pup3,pup3,pup3,pup3,pup3,pup4,pup4,pup4,pup4,pup4,pup4,pup4,pup4,pup5,pup5,pup5,pup5,pup5,pup5,pup5,pup5,pup6,pup6,pup6,pup6,pup6,pup6,pup6,pup6,pup7,pup7,pup7,pup7,pup7,pup7,pup7,pup7,single,single,single,single,single,single,single,single,single,single,single,single,single,single,single,single +bodyparts,,,pup_snout,pup_snout,pup_neck,pup_neck,pup_body,pup_body,pup_tailbase,pup_tailbase,pup_snout,pup_snout,pup_neck,pup_neck,pup_body,pup_body,pup_tailbase,pup_tailbase,pup_snout,pup_snout,pup_neck,pup_neck,pup_body,pup_body,pup_tailbase,pup_tailbase,pup_snout,pup_snout,pup_neck,pup_neck,pup_body,pup_body,pup_tailbase,pup_tailbase,pup_snout,pup_snout,pup_neck,pup_neck,pup_body,pup_body,pup_tailbase,pup_tailbase,pup_snout,pup_snout,pup_neck,pup_neck,pup_body,pup_body,pup_tailbase,pup_tailbase,pup_snout,pup_snout,pup_neck,pup_neck,pup_body,pup_body,pup_tailbase,pup_tailbase,nest,nest,moth_nose,moth_nose,moth_leftear,moth_leftear,moth_rightear,moth_rightear,moth_neck,moth_neck,moth_torso,moth_torso,moth_waist,moth_waist,moth_tailbase,moth_tailbase +coords,,,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y,x,y +labeled-data,PrL-3_09072020,img00424.png,308.9066667,216.6824645,288.4266667,197.9146919,288.4266667,174.028436,308.9066667,151.8483412,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,851.6266667,214.9763033,1025.706667,377.0616114,959.1466667,399.2417062,988.16,455.5450237,974.5066667,416.3033175,955.7333333,441.8957346,925.0133333,487.9620853,889.1733333,542.5592417 +labeled-data,PrL-3_09072020,img01081.png,280.0213601,250.2519146,289.6550486,215.230697,295.7855775,185.4626621,302.7918964,158.3212185,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,906.7185515,189.4450837,827.8974646,66.87082232,819.139566,135.1621965,877.8174863,111.5228747,862.0532689,133.4111357,893.5817037,133.4111357,927.7375081,130.7845443,960.1417327,138.6643183 +labeled-data,PrL-3_09072020,img02209.png,316.3612482,82.45251169,309.1831332,109.3624699,294.2287268,129.6944382,267.9089716,132.6844336,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,911.3390273,185.1772849,864.2924648,65.78677056,846.1976331,135.9739214,916.4055801,111.3722397,880.93971,130.1852904,909.1676475,133.0796059,938.8431715,123.6730806,973.5852484,121.5023439 +labeled-data,PrL-3_09072020,img03547.png,671.8024156,403.3549055,642.1825809,407.5850571,616.7941512,417.4554108,591.4057214,437.1961182,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,918.6343716,169.2865181,855.1632972,332.8523792,826.9539308,376.5639455,879.1412586,400.5348045,848.1109556,394.8946024,828.3643991,420.2755119,808.6178426,459.7569266,802.9759694,502.0584424 +labeled-data,PrL-3_09072020,img04583.png,859.1099285,315.7004714,880.8237266,340.3021531,893.8520054,362.0095194,885.1664862,398.1884631,178.0204627,481.9035307,215.6577126,486.245004,235.9239242,474.667742,237.3715107,447.1717447,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,919.8933333,235.450237,793.6,293.4597156,856.7466667,259.3364929,819.2,228.6255924,846.5066667,233.7440758,865.28,196.2085308,909.6533333,160.3791469,957.44,126.2559242 +labeled-data,PrL-3_09072020,img05779.png,862.7691333,305.9284503,883.9632477,335.5914215,893.5005993,361.0168255,890.3214821,399.1549314,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,868.0676619,188.335957,862.7691333,98.28765143,885.0229535,154.4354185,926.3514767,116.2973125,,,928.4266667,155.2606635,950.6133333,194.5023697,957.44,235.450237 +labeled-data,PrL-3_09072020,img06263.png,860.16,298.5781991,880.64,325.8767773,890.88,348.056872,890.88,399.2417062,836.2666667,95.5450237,856.7466667,87.01421801,892.5866667,87.01421801,936.96,112.6066351,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,873.8133333,213.2701422,832.8533333,527.2037915,786.7733333,470.9004739,769.7066667,523.7914692,778.24,496.492891,718.5066667,484.549763,643.4133333,464.0758294,599.04,472.6066351 +labeled-data,PrL-3_09072020,img07926.png,851.9087603,265.004896,877.2971901,286.1556539,902.6856198,298.8461087,942.1787328,308.7164623,,,901.2751515,138.5523237,908.0187334,109.6598192,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,878.7076584,214.243077,198.8619284,184.632016,241.175978,219.8832792,249.6387879,163.4812581,255.2806612,191.6822686,291.9528375,197.3224707,344.1401653,225.5234813,399.1484298,249.4943402 +labeled-data,PrL-3_09072020,img08248.png,287.1802514,226.5166293,258.5681968,201.0912254,245.8517281,178.8439969,221.4784965,146.0028502,896,162.0853081,897.7066667,138.1990521,911.36,114.3127962,921.6,87.01421801,851.6266667,264.4549763,873.8133333,290.0473934,899.4133333,303.6966825,950.6133333,313.9336493,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,935.2533333,197.9146919,938.6666667,319.0521327,914.7733333,377.0616114,984.7466667,395.8293839,950.6133333,385.5924171,945.4933333,431.6587678,942.08,472.6066351,967.68,506.7298578 +labeled-data,PrL-3_09072020,img08468.png,325.4751445,150.0776843,295.8033842,151.1370762,269.3107411,136.3055905,245.9972151,117.2365376,855.3280068,265.5513939,880.7609442,292.0361896,904.0744702,305.8082834,945.4029934,322.7585527,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,894.733143,193.8832293,,,893.4508991,156.70917,848.2133333,138.1990521,868.6933333,138.1990521,880.64,104.0758294,925.0133333,83.60189573,965.9733333,98.95734597 +labeled-data,PrL-3_09072020,img09742.png,268.1055483,247.8976884,251.1502568,215.0565417,242.672611,184.3341786,236.3143766,149.3742481,,,899.6901603,137.720938,913.4663347,110.1767504,939.9589778,94.28587294,,,,,896.5110431,257.4322149,936.7798606,276.5012678,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,848.4985107,151.6668886,972.4840805,259.7248553,956.5884947,202.5176965,913.1405599,234.2994514,926.9167344,205.695872,893.0061512,184.5080354,840.0208649,177.0922925,, +labeled-data,PrL-3_09072020,img10534.png,855.04,199.6208531,855.04,228.6255924,868.6933333,250.8056872,885.76,281.5165877,215.04,90.42654028,232.1066667,116.0189573,237.2266667,136.492891,232.1066667,163.7914692,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,810.6666667,221.8009479,933.5466667,95.5450237,892.5866667,150.1421801,952.32,151.8483412,921.6,153.5545024,923.3066667,187.6777251,967.68,201.3270142,, +labeled-data,PrL-3_09072020,img12322.png,206.5066667,470.9004739,225.28,493.0805687,233.8133333,516.9668246,225.28,544.2654028,964.2666667,92.13270142,943.7866667,83.60189573,914.7733333,83.60189573,877.2266667,95.5450237,893.7636,122.6494381,921.6908728,114.8941602,943.4120849,116.4452158,971.3393576,122.6494381,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,870.4,223.507109,254.2933333,481.1374408,290.1333333,505.0236967,307.2,458.957346,314.0266667,486.2559242,351.5733333,493.0805687,409.6,498.1990521,482.9866667,503.3175355 +labeled-data,PrL-3_09072020,img12600.png,960.8533333,95.5450237,936.96,87.01421801,899.4133333,85.30805687,858.4533333,93.83886256,968.9629223,139.5347887,940.7349848,128.6811055,918.2973935,117.1038435,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,933.5466667,243.9810427,960.8533333,160.3791469,914.7733333,156.9668246,928.4266667,194.5023697,925.0133333,172.3222749,889.1733333,199.6208531,868.6933333,245.6872038,837.9733333,305.4028436 +labeled-data,PrL-3_09072020,img14223.png,916.48,98.95734597,904.5333333,124.549763,887.4666667,150.1421801,868.6933333,185.971564,967.68,95.5450237,940.3733333,87.01421801,901.12,88.72037915,860.16,95.5450237,,,,,957.44,127.9620853,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,878.9333333,243.9810427,151.8933333,3.412322275,145.0666667,90.42654028,221.8666667,51.18483412,182.6133333,68.2464455,206.5066667,107.4881517,232.1066667,138.1990521,250.88,174.028436 +labeled-data,PrL-3_09072020,img14760.png,,,929.0242411,89.90111345,896.7227233,83.32312367,866.8139106,86.31311903,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,837.589989,223.6839995,847.4598972,203.9500301,916.5492547,231.5775872,900.7574016,186.1894578,920.497218,200.0032363,936.947065,175.0068751,944.8429916,134.8811375,941.5530222,94.09760094 +labeled-data,PrL-3_09072020,img16406.png,272.8972045,188.0763114,275.0685843,160.5803142,276.5161709,132.3607381,283.0303103,96.18179431,,,955.9094916,102.5820094,923.2664152,93.82670498,888.234821,98.60232556,888.234821,129.6438593,921.67407,124.072302,955.113319,129.6438593,982.1831873,149.5422784,,,886.6424758,168.6447607,917.693207,154.3178989,,,,,,,,,,,,,,,,,,,,,,,,,,,868.76001,252.5300275,267.2710407,84.7223615,222.9753414,123.178285,261.4426592,137.1622571,235.7977807,138.3275881,227.6380466,186.1061597,235.7977807,250.1993655,247.4545436,324.7805504 +labeled-data,PrL-3_09072020,img16707.png,979.5543542,244.1427192,939.0219311,229.6711417,909.3464071,223.1589318,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,909.4332623,211.0028067,,,920.8185304,175.9815892,871.7742985,155.8443891,897.1722043,161.9731022,905.054313,124.3252933,923.4459,79.67324094,, +labeled-data,PrL-3_09072020,img17216.png,,,974.957772,112.9638265,938.3338326,94.65728093,891.3596494,100.2288383,884.1940961,128.086625,918.4295177,128.086625,950.2764215,133.6581823,975.7539446,155.1484749,,,,,949.33129,185.373672,977.1973308,182.1899249,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,858.3190262,172.3337375,842.2951948,374.6448314,893.5849518,326.8662598,844.6265474,305.8903016,874.9341311,298.8983155,886.5908941,254.615737,900.5790096,211.4984894,909.90442,166.0505799 +labeled-data,PrL-3_09072020,img18060.png,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,865.28,247.3933649,,,916.48,201.3270142,865.28,151.8483412,901.12,167.2037915,926.72,139.9052133,918.1866667,93.83886256,884.0533333,76.77725118 +labeled-data,PrL-3_09072020,img20046.png,235.6670883,439.6481291,223.7244994,468.3018526,222.9283268,496.1596392,242.036469,531.1808568,1001.903594,133.9561571,986.1393769,114.6944875,968.6235798,101.5615309,942.3498841,104.1881222,888.9267029,105.0636526,914.3246087,121.698731,941.4740942,132.2050962,,,1003.655174,145.3380528,980.0088479,165.4752529,944.1014638,172.4794964,906.4425,156.7199485,,,905.5667102,200.4964705,930.0888261,212.7538966,,,,,,,,,,,,,,,,,,,855.04,235.450237,,,728.7466667,547.6777251,747.4567038,497.6255927,745.8133333,518.6729858,790.1866667,525.4976303,856.7466667,525.4976303,918.1866667,530.6161137 +labeled-data,PrL-3_09072020,img21005.png,972.8,245.6872038,942.08,228.6255924,911.36,213.2701422,880.64,204.7393365,854.0862443,184.5897877,872.8719449,175.1997197,903.5222985,166.7980798,926.7572439,163.3385811,1013.238015,149.5955863,985.2127392,158.3508907,958.0632537,161.8530125,,,913.3979711,139.0892211,944.0506161,130.3339167,968.572732,111.9477775,,,,,,,902.8884929,103.1924731,932.6653479,107.5701253,,,,,,,,,,,,,,,,,858.4533333,243.9810427,658.7733333,513.5545024,708.2666667,498.1990521,679.2533333,453.8388626,704.8533333,470.9004739,740.6933333,445.3080569,790.1866667,406.0663507,841.3866667,375.3554502 +labeled-data,PrL-3_09072020,img22063.png,848.5569747,140.7448343,861.379414,167.6639807,862.6616579,193.301263,,,974.2168795,247.1395558,943.4430253,226.62973,915.2336589,211.2473606,884.4598047,199.7105836,1012.684197,129.2080572,980.6280992,149.7178831,948.572001,166.3821166,913.951415,159.972796,916.5159028,143.3085625,946.0075131,129.2080572,966.523416,116.3894161,985.7570749,95.87959023,884.4598047,97.16145435,916.5159028,104.852639,,,,,,,,,,,,,,,,,,,,,893.9266116,185.7459559,778.2682094,260.4786338,726.0808815,314.0605538,782.4996143,336.6213623,,,738.9866667,360,740.6933333,414.5971564,737.28,465.7819905 +labeled-data,PrL-3_09072020,img23453.png,1012.985502,93.79151492,997.2212849,129.6882629,984.084437,152.4520543,,,,,968.3202196,138.4435673,973.5749588,109.5510628,964.8170602,82.40961922,948.0917817,96.40084433,941.1707341,121.6057638,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,864.1012269,200.6062284,876.3622849,66.65007132,862.3496472,127.0616716,924.5307269,123.5595498,893.878082,131.4393238,902.6359805,161.2073587,912.2696689,198.8551676,907.8907196,246.1338113 +labeled-data,PrL-3_09072020,img25725.png,942.1915552,271.7551924,912.6999449,256.3728231,880.6438467,247.3997742,846.0232607,235.8629972,,,933.9737157,220.9326722,948.4495811,248.4286694,952.0685475,285.331192,922.3930234,194.8838327,919.4978504,162.3227833,897.060259,146.404048,872.4512879,149.2983635,868.1085283,102.0246214,899.9554321,102.0246214,921.6692302,108.5368312,,,,,944.1068215,133.8620919,958.5826869,115.0490411,973.0585523,83.21157062,1012.867182,94.06525374,991.153384,123.7319876,974.5061388,147.6100905,950.6209609,171.4881934,,,,,,,,,880.6438467,185.8702967,494.6884247,494.1650258,458.7855948,445.4541894,428.0117405,480.0645205,433.1407163,456.9909664,399.8023742,428.7899559,351.0771049,396.743353,312.6097871,368.5423425 +labeled-data,PrL-3_09072020,img27235.png,1007.612603,100.8808313,988.3789445,127.7999777,972.9920173,148.3098035,953.7583584,168.8196294,,,947.3471388,132.9274341,967.8630416,118.8269289,971.7097734,86.780326,945.0188515,200.9048432,938.8883225,220.1665128,954.6525399,242.9303042,978.298866,247.3079564,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,846.0498686,204.7118246,960.1695781,12.43220731,890.928406,64.98863604,943.500407,98.31710304,915.2910406,85.49846188,896.0573817,112.4176083,874.259235,153.43726,869.1302593,193.1750476 +labeled-data,PrL-3_09072020,img28067.png,854.9857219,251.9413552,858.164839,276.3073674,850.746899,301.7327713,823.1945501,325.0393916,,,896.3142451,97.27014795,919.6277711,104.6858908,,,892.0754222,123.7549437,927.0457112,134.348862,957.7771772,124.8143355,973.672763,94.09197246,1008.643052,90.91379696,995.9265833,129.0519029,975.7921745,148.1209558,,,919.6277711,153.417915,924.9262997,179.9027108,,,,,,,,,,,,,,,,,,,,,888.378109,162.8115423,,,891.8751379,293.3286159,944.3305712,315.4699052,915.1886638,308.4779191,902.3662245,342.2725185,883.7154038,397.0430761,887.2124327,457.6402889 +labeled-data,PrL-3_09072020,img29431.png,890.9740252,145.373574,911.3718355,135.5065893,944.2715295,123.6662077,990.9890951,107.8790323,,,,,919.7000536,93.41909781,,,971.9072725,144.715775,949.5354806,151.9515637,928.4796764,159.8451515,898.8699518,178.2635228,,,,,945.3879225,282.9533214,,,,,,,905.8898,320.5135772,,,1016.677217,101.8936267,1007.043528,124.0445468,990.666258,150.0478008,952.1315044,181.8295557,,,,,,,,,855.04,233.7440758,,,571.1191279,207.6407988,556.2832477,158.9087746,577.4773622,174.7996521,647.4179401,147.2554645,698.2838149,129.2458034,757.6273354,132.4239789 +labeled-data,PrL-3_09072020,img30524.png,928.3703732,237.8816202,918.7366848,257.1432898,909.1029964,283.1465439,908.1396275,321.6698832,,,,,874.7116812,272.4469561,855.1543413,298.5558796,1017.000307,103.0499326,1013.146831,124.2377692,1001.586405,139.647105,954.3813319,173.3550269,891.7623572,138.6840215,918.7366848,136.7578545,952.4545942,123.2746858,996.7695609,98.23451522,979.4289217,145.4256059,964.9783891,151.2041068,948.6011188,157.9456911,905.249521,164.6872755,893.6890949,114.6069344,910.0663652,89.56676388,936.0773239,92.45601433,968.8318645,98.23451522,,,,,,,,,923.3066667,184.2654028,414.72,255.9241706,428.3733333,312.2274882,438.6133333,257.6303318,443.7333333,288.3412322,503.4666667,279.8104265,568.32,279.8104265,614.4,267.8672986 +labeled-data,PrL-3_09072020,img30873.png,972.4700964,270.8086518,945.3206109,287.4437302,923.4258646,300.5766868,900.6553283,311.9585825,892.7732196,339.1000261,,,,,,,1013.63222,108.8355207,995.2406327,147.35886,,,,,,,,,,,974.2216762,105.3333989,,,,,,,,,,,,,,,,,,,,,,,,,875.2574225,184.1311384,,,947.9479805,242.7916778,902.406908,210.3970516,927.8048138,216.5257646,928.6806037,180.6290167,933.9353428,144.7322687,935.6869225,106.2089294 +labeled-data,PrL-3_09072020,img31904.png,,,,,,,829.4623841,291.1475094,,,897.7739927,250.8731093,915.2897899,277.1390224,,,,,946.8182246,261.3794745,963.4582319,280.6411442,,,1009.875094,108.2484772,1002.637162,139.3623688,983.0947433,166.8583661,949.8002529,182.7771013,,,970.7902577,138.63879,942.5623202,151.6632097,917.2295558,169.0291027,895.5157578,113.3135293,913.6105895,126.3379491,941.1147337,119.1021603,972.2378442,100.2891096,878.1447193,106.8013195,914.3343827,88.7118476,938.2195606,90.15900535,,,887.4666667,185.971564,,,260.0489689,306.197269,303.4005667,273.4524306,285.6072599,294.877518,304.8746367,316.0653546,342.4460215,347.8471096,380.9807751,399.8536176 +labeled-data,PrL-3_09072020,img33096.png,904.4885362,112.9434266,903.6127464,129.5785049,908.8674855,151.4667659,932.5138116,183.8613921,879.0906304,104.1881222,907.9916957,96.30834826,932.5138116,100.6860004,974.5517247,122.5742614,1021.844377,158.6279991,999.0738406,151.6237556,974.5517247,156.8769382,941.2717102,187.5205036,,,,,946.5264493,135.707218,,,,,,,880.8422102,235.517688,,,,,,,849.3137754,302.9335318,,,,,,,967.5454058,288.9250448,,,921.6,223.507109,352.2644628,107.16384,311.3608815,136.7749011,363.5482094,155.1055579,339.5702479,155.1055579,331.107438,208.687478,335.338843,283.4201559,356.4958678,329.9518233 +labeled-data,PrL-3_09072020,img34254.png,,,,,852.4574855,305.1559675,821.8048406,306.9070284,,,969.1203136,276.0518473,,,974.9005266,349.246192,897.8310194,105.5860709,925.7687157,93.06598561,955.6331498,97.88140303,971.0470513,125.810824,,,925.7687157,118.1061562,911.3181831,138.3309093,891.0874375,173.9649981,1017.288756,152.7771615,990.3144281,146.9986606,961.4133628,156.6294955,944.0727237,179.743499,,,,,943.1093549,133.5154919,,,,,,,,,,,885.76,191.0900474,255.8979117,463.6227555,274.2098814,515.358645,298.0950593,472.3780598,290.1333333,501.0317833,317.2032016,498.643973,364.9735573,494.6642892,421.5018116,483.5211745 +labeled-data,PrL-3_09072020,img35405.png,906.24,93.83886256,925.0133333,90.42654028,945.4933333,97.25118483,983.04,117.7251185,942.08,122.8436019,916.48,119.4312796,896,133.0805687,899.4133333,179.1469194,998.4,165.4976303,976.2133333,168.9099526,948.9066667,172.3222749,919.8933333,175.7345972,1003.52,134.7867299,983.04,141.6113744,955.7333333,141.6113744,916.48,150.1421801,,,,,846.5066667,283.2227488,822.6133333,291.7535545,,,836.2666667,319.0521327,,,,,,,,,,,,,873.8133333,223.507109,190.0606061,516.6566135,241.2606061,550.7798363,242.8121212,505.7992245,250.569697,527.5140026,314.1818182,510.4523912,356.0727273,467.022835,387.1030303,451.5122792 +labeled-data,PrL-3_09072020,img36807.png,904.5333333,107.4881517,934.1372103,91.94646185,965.1879416,89.55865156,986.6846016,114.2326912,965.1879416,121.3961221,936.5257281,125.3758059,907.0673421,133.3351735,884.7745094,151.641719,1012.162125,161.1929602,992.2578098,149.2539087,966.7802867,144.4782882,938.9142459,152.4376558,,,974.7420127,181.0913792,947.6721444,179.4995057,915.8252406,173.1320116,,,852.9400153,277.3157052,829.7786307,285.2750728,810.9600057,293.2344404,,,,,839.9117364,314.2182278,813.8551788,329.4133842,,,,,,,,,860.16,201.3270142,798.72,516.9668246,861.8666667,544.2654028,861.8666667,494.7867299,875.52,515.2606635,909.6533333,506.7298578,959.1466667,499.9052133,1018.88,494.7867299 +labeled-data,PrL-3_09072020,img37448.png,907.9466667,114.3127962,935.2533333,100.6635071,960.8533333,90.42654028,991.5733333,97.25118483,977.92,116.0189573,947.2,126.2559242,918.1866667,134.7867299,896,146.7298578,1010.346667,160.3791469,991.5733333,155.2606635,964.2666667,148.436019,942.08,153.5545024,,,976.2133333,184.2654028,947.2,179.1469194,918.1866667,170.6161137,,,,,842.6691639,278.0285553,824.5743322,288.8822384,,,,,832.5360581,315.6546568,816.6126062,329.4026554,,,,,,,,,890.88,218.3886256,233.8133333,69.95260664,274.7733333,136.492891,308.9066667,80.18957346,303.7866667,104.0758294,334.5066667,114.3127962,378.88,116.0189573,430.08,114.3127962 +labeled-data,PrL-3_09072020,img39228.png,901.12,116.0189573,925.0133333,100.6635071,952.32,92.13270142,984.7466667,93.83886256,972.8,116.0189573,948.9066667,124.549763,921.6,134.7867299,892.5866667,145.0236967,,,1000.106667,138.1990521,971.0933333,143.3175355,943.7866667,158.6729858,1010.346667,162.0853081,976.2133333,174.028436,947.2,179.1469194,,,,,,,858.3994319,275.0241838,828.5349978,265.393349,,,879.5935464,316.4367736,840.0954239,313.5475231,818.9013094,317.399857,,,,,,,,,890.88,194.5023697,370.3466667,499.9052133,443.7333333,496.492891,414.72,450.4265403,436.9066667,464.0758294,445.44,431.6587678,443.7333333,373.6492891,436.9066667,327.5829384 +labeled-data,PrL-3_09072020,img40112.png,901.12,122.8436019,930.1333333,100.6635071,957.44,95.5450237,991.5733333,95.5450237,1022.293333,156.9668246,1003.52,155.2606635,976.2133333,151.8483412,943.7866667,151.8483412,,,,,960.8533333,180.8530806,,,,,,,931.84,133.0805687,,,834.56,264.4549763,844.8,284.92891,872.1066667,300.2843602,,,,,,,870.3327319,240.9278603,,,,,,,,,,,931.84,214.9763033,336.2133333,32.41706161,266.24,80.18957346,,,300.3733333,98.95734597,283.3066667,133.0805687,308.9066667,163.7914692,290.1333333,213.2701422 diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/CollectedData_JohnDoe.h5 b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/CollectedData_JohnDoe.h5 new file mode 100644 index 00000000..a2f820c5 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/CollectedData_JohnDoe.h5 differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img00424.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img00424.png new file mode 100644 index 00000000..ff493920 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img00424.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img01081.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img01081.png new file mode 100644 index 00000000..48b50701 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img01081.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img02209.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img02209.png new file mode 100644 index 00000000..a2463302 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img02209.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img03547.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img03547.png new file mode 100644 index 00000000..86ef01ef Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img03547.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img04583.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img04583.png new file mode 100644 index 00000000..0be0d898 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img04583.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img05779.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img05779.png new file mode 100644 index 00000000..e7a40ce4 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img05779.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img06263.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img06263.png new file mode 100644 index 00000000..7300ab72 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img06263.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img07926.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img07926.png new file mode 100644 index 00000000..e48f0330 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img07926.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img08248.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img08248.png new file mode 100644 index 00000000..e6d0659c Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img08248.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img08468.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img08468.png new file mode 100644 index 00000000..2872b062 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img08468.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img09742.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img09742.png new file mode 100644 index 00000000..5d59d1c3 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img09742.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img10534.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img10534.png new file mode 100644 index 00000000..21d03b34 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img10534.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img12322.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img12322.png new file mode 100644 index 00000000..77e2bc00 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img12322.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img12600.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img12600.png new file mode 100644 index 00000000..436b5a7e Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img12600.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img14223.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img14223.png new file mode 100644 index 00000000..2cb470db Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img14223.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img14760.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img14760.png new file mode 100644 index 00000000..5e1614f3 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img14760.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img16406.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img16406.png new file mode 100644 index 00000000..295bd7a2 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img16406.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img16707.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img16707.png new file mode 100644 index 00000000..9401f9b5 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img16707.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img17216.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img17216.png new file mode 100644 index 00000000..4760b8c4 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img17216.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img18060.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img18060.png new file mode 100644 index 00000000..3b1dbc18 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img18060.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img20046.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img20046.png new file mode 100644 index 00000000..692226e5 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img20046.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img21005.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img21005.png new file mode 100644 index 00000000..014e0d30 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img21005.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img22063.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img22063.png new file mode 100644 index 00000000..27bf9a9e Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img22063.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img23453.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img23453.png new file mode 100644 index 00000000..590a3bdd Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img23453.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img25725.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img25725.png new file mode 100644 index 00000000..dd1c4a74 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img25725.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img27235.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img27235.png new file mode 100644 index 00000000..c660cdbb Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img27235.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img28067.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img28067.png new file mode 100644 index 00000000..bb1fbe0d Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img28067.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img29431.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img29431.png new file mode 100644 index 00000000..503a3d17 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img29431.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img30524.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img30524.png new file mode 100644 index 00000000..f075ef41 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img30524.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img30873.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img30873.png new file mode 100644 index 00000000..8688941c Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img30873.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img31904.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img31904.png new file mode 100644 index 00000000..53c5ca6e Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img31904.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img33096.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img33096.png new file mode 100644 index 00000000..8d7bac9d Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img33096.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img34254.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img34254.png new file mode 100644 index 00000000..aa7bf8d2 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img34254.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img35405.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img35405.png new file mode 100644 index 00000000..2e47fd74 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img35405.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img36807.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img36807.png new file mode 100644 index 00000000..a2f455ff Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img36807.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img37448.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img37448.png new file mode 100644 index 00000000..e8912a82 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img37448.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img39228.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img39228.png new file mode 100644 index 00000000..e249abe1 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img39228.png differ diff --git a/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img40112.png b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img40112.png new file mode 100644 index 00000000..9a84b6e1 Binary files /dev/null and b/tests/data/dlc/dlc_test_project/labeled-data/PrL-3_09072020/img40112.png differ diff --git a/tests/data/labelstudio/multi_animal_from_dlc.json b/tests/data/labelstudio/multi_animal_from_dlc.json new file mode 100644 index 00000000..a8865851 --- /dev/null +++ b/tests/data/labelstudio/multi_animal_from_dlc.json @@ -0,0 +1,745 @@ +[ + { + "id":10526, + "annotations":[ + { + "id":7255, + "completed_by":{ + "id":0, + "email":"example@example.edu", + "first_name":"", + "last_name":"" + }, + "result":[ + { + "original_width":1280, + "original_height":720, + "image_rotation":0, + "value":{ + "x":75.06666666666666, + "y":22.274881516587676, + "width":0.13333333333333333, + "keypointlabels":[ + "moth_nose" + ] + }, + "id":"qQugWvF7M6", + "from_name":"uniqbp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "original_width":1280, + "original_height":720, + "image_rotation":0, + "value":{ + "x":72.93333333333334, + "y":33.88625592417063, + "width":0.13333333333333333, + "keypointlabels":[ + "nest" + ] + }, + "id":"779rkX3Gg5", + "from_name":"uniqbp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "original_width":1280, + "original_height":720, + "image_rotation":0, + "value":{ + "x":71.46666666666667, + "y":21.80094786729858, + "width":0.13333333333333333, + "keypointlabels":[ + "moth_leftear" + ] + }, + "id":"M2TQbW0iAJ", + "from_name":"uniqbp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "original_width":1280, + "original_height":720, + "image_rotation":0, + "value":{ + "x":72.53333333333333, + "y":27.01421800947867, + "width":0.13333333333333333, + "keypointlabels":[ + "moth_rightear" + ] + }, + "id":"WXycZhS8BU", + "from_name":"uniqbp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "original_width":1280, + "original_height":720, + "image_rotation":0, + "value":{ + "x":72.26666666666667, + "y":23.933649289099527, + "width":0.13333333333333333, + "keypointlabels":[ + "moth_neck" + ] + }, + "id":"CcNH6-OeiM", + "from_name":"uniqbp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "original_width":1280, + "original_height":720, + "image_rotation":0, + "value":{ + "x":69.46666666666667, + "y":27.725118483412324, + "width":0.13333333333333333, + "keypointlabels":[ + "moth_torso" + ] + }, + "id":"94HxnzJtC_", + "from_name":"uniqbp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "original_width":1280, + "original_height":720, + "image_rotation":0, + "value":{ + "x":67.86666666666666, + "y":34.12322274881517, + "width":0.13333333333333333, + "keypointlabels":[ + "moth_waist" + ] + }, + "id":"RsZBA5jmQi", + "from_name":"uniqbp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "original_width":1280, + "original_height":720, + "image_rotation":0, + "value":{ + "x":65.46666666666667, + "y":42.41706161137441, + "width":0.13333333333333333, + "keypointlabels":[ + "moth_tailbase" + ] + }, + "id":"5aqdf8fLMJ", + "from_name":"uniqbp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "original_width":1280, + "original_height":720, + "image_rotation":0, + "value":{ + "x":67.73333333333333, + "y":10.663507109004739, + "width":8, + "height":5.924170616113744, + "rotation":0, + "rectanglelabels":[ + "pup1" + ] + }, + "id":"ev6yz1X3RZ", + "from_name":"individuals", + "to_name":"image", + "type":"rectanglelabels" + }, + { + "original_width":1280, + "original_height":720, + "image_rotation":0, + "value":{ + "x":75.06666666666666, + "y":13.270142180094787, + "width":0.13333333333333333, + "keypointlabels":[ + "pup_snout" + ] + }, + "id":"m9sSyh84t1", + "from_name":"mabp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "original_width":1280, + "original_height":720, + "image_rotation":0, + "value":{ + "x":73.2, + "y":12.085308056872037, + "width":0.13333333333333333, + "keypointlabels":[ + "pup_neck" + ] + }, + "id":"u53ig21o7N", + "from_name":"mabp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "original_width":1280, + "original_height":720, + "image_rotation":0, + "value":{ + "x":70.26666666666667, + "y":11.848341232227488, + "width":0.13333333333333333, + "keypointlabels":[ + "pup_body" + ] + }, + "id":"MevxE5HAXM", + "from_name":"mabp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "original_width":1280, + "original_height":720, + "image_rotation":0, + "value":{ + "x":67.06666666666666, + "y":13.033175355450236, + "width":0.13333333333333333, + "keypointlabels":[ + "pup_tailbase" + ] + }, + "id":"VMJam2x8pm", + "from_name":"mabp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "original_width":1280, + "original_height":720, + "image_rotation":0, + "value":{ + "x":69.02775911110724, + "y":11.340066480442642, + "width":9.556333000659984, + "height":14.572074564931343, + "rotation":0, + "rectanglelabels":[ + "pup2" + ] + }, + "id":"Rht5adycte", + "from_name":"individuals", + "to_name":"image", + "type":"rectanglelabels" + }, + { + "original_width":1280, + "original_height":720, + "image_rotation":0, + "value":{ + "x":73.49492069129741, + "y":17.87237576817049, + "width":0.13333333333333333, + "keypointlabels":[ + "pup_neck" + ] + }, + "id":"YKrxOrl5it", + "from_name":"mabp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "original_width":1280, + "original_height":720, + "image_rotation":0, + "value":{ + "x":71.74198386869114, + "y":16.264422712729786, + "width":0.13333333333333333, + "keypointlabels":[ + "pup_body" + ] + }, + "id":"Dx0t6ezFHp", + "from_name":"mabp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "original_width":1280, + "original_height":720, + "image_rotation":0, + "value":{ + "x":75.70022830683432, + "y":19.379831757646144, + "width":0.13333333333333333, + "keypointlabels":[ + "pup_snout" + ] + }, + "id":"ZkoTfFi6-Y", + "from_name":"mabp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "from_id":"m9sSyh84t1", + "to_id":"ev6yz1X3RZ", + "type":"relation", + "direction":"right" + }, + { + "from_id":"u53ig21o7N", + "to_id":"ev6yz1X3RZ", + "type":"relation", + "direction":"right" + }, + { + "from_id":"MevxE5HAXM", + "to_id":"ev6yz1X3RZ", + "type":"relation", + "direction":"right" + }, + { + "from_id":"VMJam2x8pm", + "to_id":"ev6yz1X3RZ", + "type":"relation", + "direction":"right" + }, + { + "from_id":"YKrxOrl5it", + "to_id":"Rht5adycte", + "type":"relation", + "direction":"right" + }, + { + "from_id":"Dx0t6ezFHp", + "to_id":"Rht5adycte", + "type":"relation", + "direction":"right" + }, + { + "from_id":"ZkoTfFi6-Y", + "to_id":"Rht5adycte", + "type":"relation", + "direction":"right" + } + ], + "was_cancelled":false, + "ground_truth":false, + "created_at":"2022-03-17T19:26:22.672670Z", + "updated_at":"2022-03-17T19:28:07.643868Z", + "lead_time":7.531, + "prediction":{ + + }, + "result_count":0, + "task":10526 + } + ], + "predictions":[ + + ], + "data":{ + "image":"/data/upload/img12600.png" + }, + "meta":{ + "video": { + "filename": "labeled-data/PrL-3_09072020/img12600.png", + "shape": [1, 720, 1280, 3], + "frame_idx": 12600 + } + }, + "created_at":"2022-02-18T18:35:17.596790Z", + "updated_at":"2022-03-17T19:28:07.620302Z", + "project":74 + }, + { + "id":10575, + "annotations":[ + { + "id":7206, + "completed_by":{ + "id":0, + "email":"example@example.edu", + "first_name":"", + "last_name":"" + }, + "result":[ + { + "original_width":1035, + "original_height":670, + "image_rotation":0, + "value":{ + "x":72.53333333333333, + "y":76.13168724279835, + "width":0.13333333333333333, + "keypointlabels":[ + "nest" + ] + }, + "id":"HrgLm4oXNy", + "from_name":"uniqbp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "original_width":1035, + "original_height":670, + "image_rotation":0, + "value":{ + "x":11.72051089406461, + "y":27.65116732058883, + "width":7.913849236163283, + "height":17.00506751011801, + "rotation":0, + "rectanglelabels":[ + "pup1" + ] + }, + "id":"MPH7oPT_JQ", + "from_name":"individuals", + "to_name":"image", + "type":"rectanglelabels" + }, + { + "original_width":1035, + "original_height":670, + "image_rotation":0, + "value":{ + "x":13.42349110944152, + "y":34.144011278997525, + "width":0.13333333333333333, + "keypointlabels":[ + "pup_neck" + ] + }, + "id":"_shXay4x1Y", + "from_name":"mabp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "original_width":1035, + "original_height":670, + "image_rotation":0, + "value":{ + "x":14.926120711244675, + "y":37.54502478102113, + "width":0.13333333333333333, + "keypointlabels":[ + "pup_body" + ] + }, + "id":"iLTFNYcSfy", + "from_name":"mabp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "original_width":1035, + "original_height":670, + "image_rotation":0, + "value":{ + "x":58.50237916353617, + "y":66.608231071041, + "width":0.13333333333333333, + "keypointlabels":[ + "pup_neck" + ] + }, + "id":"9U-vcIyzVA", + "from_name":"mabp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "original_width":1035, + "original_height":670, + "image_rotation":0, + "value":{ + "x":56.49887302779862, + "y":69.08169543614906, + "width":0.13333333333333333, + "keypointlabels":[ + "pup_body" + ] + }, + "id":"rSGM-kF3EZ", + "from_name":"mabp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "original_width":1035, + "original_height":670, + "image_rotation":0, + "value":{ + "x":54.29501627848733, + "y":72.32811741535342, + "width":0.13333333333333333, + "keypointlabels":[ + "pup_tailbase" + ] + }, + "id":"4FCpRIBWfV", + "from_name":"mabp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "original_width":1035, + "original_height":670, + "image_rotation":0, + "value":{ + "x":51.890808915602285, + "y":63.67099213747517, + "width":9.917355371900822, + "height":11.439772688624844, + "rotation":0, + "rectanglelabels":[ + "pup2" + ] + }, + "id":"Lelk1JlsYc", + "from_name":"individuals", + "to_name":"image", + "type":"rectanglelabels" + }, + { + "original_width":1035, + "original_height":670, + "image_rotation":0, + "value":{ + "x":13.122965189080887, + "y":31.82513843670871, + "width":0.13333333333333333, + "keypointlabels":[ + "pup_snout" + ] + }, + "id":"Jk0STRtWa3", + "from_name":"mabp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "original_width":1035, + "original_height":670, + "image_rotation":0, + "value":{ + "x":60.375515768810125, + "y":64.19006206952164, + "width":0.13333333333333333, + "keypointlabels":[ + "pup_snout" + ] + }, + "id":"3JN7Cy2uOI", + "from_name":"mabp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "original_width":1035, + "original_height":670, + "image_rotation":0, + "value":{ + "x":62.78596635020376, + "y":72.88498418809797, + "width":0.13333333333333333, + "keypointlabels":[ + "moth_rightear" + ] + }, + "id":"7H3519WB-p", + "from_name":"uniqbp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "original_width":1035, + "original_height":670, + "image_rotation":0, + "value":{ + "x":64.97160940737197, + "y":74.57143716430801, + "width":0.13333333333333333, + "keypointlabels":[ + "moth_neck" + ] + }, + "id":"07KruCDk3G", + "from_name":"uniqbp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "original_width":1035, + "original_height":670, + "image_rotation":0, + "value":{ + "x":66.7019101609635, + "y":70.9174557158529, + "width":0.13333333333333333, + "keypointlabels":[ + "moth_torso" + ] + }, + "id":"c-y4IK3Zn2", + "from_name":"uniqbp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "original_width":1035, + "original_height":670, + "image_rotation":0, + "value":{ + "x":68.79648475741638, + "y":66.70132327532777, + "width":0.13333333333333333, + "keypointlabels":[ + "moth_waist" + ] + }, + "id":"wG2pmVI68R", + "from_name":"uniqbp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "original_width":1035, + "original_height":670, + "image_rotation":0, + "value":{ + "x":69.61610090385446, + "y":62.06357759075015, + "width":0.13333333333333333, + "keypointlabels":[ + "moth_tailbase" + ] + }, + "id":"cUkaZyapyw", + "from_name":"uniqbp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "original_width":1035, + "original_height":670, + "image_rotation":0, + "value":{ + "x":16.111128264516097, + "y":41.57980856370843, + "width":0.13333333333333333, + "keypointlabels":[ + "pup_tailbase" + ] + }, + "id":"TAUzlCatfK", + "from_name":"mabp", + "to_name":"image", + "type":"keypointlabels" + }, + { + "from_id":"_shXay4x1Y", + "to_id":"MPH7oPT_JQ", + "type":"relation", + "direction":"right" + }, + { + "from_id":"iLTFNYcSfy", + "to_id":"MPH7oPT_JQ", + "type":"relation", + "direction":"right" + }, + { + "from_id":"9U-vcIyzVA", + "to_id":"Lelk1JlsYc", + "type":"relation", + "direction":"right" + }, + { + "from_id":"rSGM-kF3EZ", + "to_id":"Lelk1JlsYc", + "type":"relation", + "direction":"right" + }, + { + "from_id":"4FCpRIBWfV", + "to_id":"Lelk1JlsYc", + "type":"relation", + "direction":"right" + }, + { + "from_id":"Jk0STRtWa3", + "to_id":"MPH7oPT_JQ", + "type":"relation", + "direction":"right" + }, + { + "from_id":"3JN7Cy2uOI", + "to_id":"Lelk1JlsYc", + "type":"relation", + "direction":"right" + }, + { + "from_id":"TAUzlCatfK", + "to_id":"MPH7oPT_JQ", + "type":"relation", + "direction":"right" + } + ], + "was_cancelled":false, + "ground_truth":false, + "created_at":"2022-02-28T15:09:04.438516Z", + "updated_at":"2022-03-17T18:57:45.491259Z", + "lead_time":8096.165, + "prediction":{ + + }, + "result_count":0, + "task":10575 + } + ], + "predictions":[ + + ], + "data":{ + "image":"/data/upload/img47559.png" + }, + "meta":{ + "video": { + "filename": "labeled-data/compressed_6838b122-6cfa-487d-9f24-d7e2669c20e8_one_pup_PrL-GiC-2_ChR2_2021_10_28_10_14_02/img47559.png", + "shape": [1, 670, 1035, 3], + "frame_idx": 47559 + } + }, + "created_at":"2022-02-18T18:35:39.946640Z", + "updated_at":"2022-03-17T18:57:45.468939Z", + "project":74 + } +] \ No newline at end of file diff --git a/tests/fixtures/dlc.py b/tests/fixtures/dlc.py new file mode 100644 index 00000000..118438b3 --- /dev/null +++ b/tests/fixtures/dlc.py @@ -0,0 +1,30 @@ +"""Fixtures for dlc testing.""" +import pytest +from sleap_io import Skeleton, Node, Edge +import ruamel.yaml as yaml +import os + + +def read_yaml(yaml_file: str) -> dict: + """Read a yaml file into dict object + + Parameters: + yaml_file (str): path to yaml file + + Returns: + return_dict (dict): dict of yaml contents + """ + with open(yaml_file, "r") as yfile: + yml = yaml.YAML(typ="safe") + return yml.load(yfile) + + +@pytest.fixture +def dlc_project_config(): + """Typical label studio file from a multi-animal DLC project (mixes mutli-animal bodyparts and unique bodyparts""" + proj_rel_path = "tests/data/dlc/dlc_test_project" + config = read_yaml(os.path.join(proj_rel_path, "config.yaml")) + # fix the project path so it points to the correct location! + config["project_path"] = os.path.realpath(proj_rel_path) + + return config diff --git a/tests/fixtures/labelstudio.py b/tests/fixtures/labelstudio.py new file mode 100644 index 00000000..dd729d9c --- /dev/null +++ b/tests/fixtures/labelstudio.py @@ -0,0 +1,23 @@ +"""Fixtures that return paths to label-studio .json files.""" +import pytest +from sleap_io import Skeleton, Node, Edge + + +@pytest.fixture +def ls_multianimal(): + """Typical label studio file from a multi-animal DLC project (mixes mutli-animal bodyparts and unique bodyparts""" + nodes = [ + Node("pup_snout"), + Node("pup_neck"), + Node("pup_body"), + Node("pup_tailbase"), + ] + edges = [ + Edge(nodes[0], nodes[1]), + Edge(nodes[1], nodes[2]), + Edge(nodes[2], nodes[3]), + ] + return ( + "tests/data/labelstudio/multi_animal_from_dlc.json", + Skeleton(nodes, edges, name="pups"), + ) diff --git a/tests/io/test_dlc.py b/tests/io/test_dlc.py new file mode 100644 index 00000000..f5c5d6e6 --- /dev/null +++ b/tests/io/test_dlc.py @@ -0,0 +1,38 @@ +"""Tests for functions in the sleap_io.io.labelstudio file.""" +from sleap_io import Labels +from sleap_io.io.dlc import labels_to_dlc, dlc_to_labels, load_dlc +from sleap_io.io.slp import read_labels as slp_read_labels + + +def round_trip_labels(labels: Labels, dlc_config: dict) -> Labels: + ls_labels = dlc_to_labels(labels_to_dlc(labels, dlc_config), dlc_config) + return ls_labels + + +# def test_labels_round_trip(slp_typical, slp_simple_skel, slp_minimal): +# """Test `read_labels` can read different types of .slp files.""" + +# # first on `slp_typical` +# labels = slp_read_labels(slp_typical) +# assert type(labels) == Labels +# ls_labels = round_trip_labels(labels) +# assert type(ls_labels) == Labels + +# # now on `slp_simple_skel` +# labels = slp_read_labels(slp_simple_skel) +# assert type(labels) == Labels +# ls_labels = round_trip_labels(labels) +# assert type(ls_labels) == Labels + +# # now on `slp_minimal` +# labels = slp_read_labels(slp_minimal) +# assert type(labels) == Labels +# ls_labels = round_trip_labels(labels) +# assert type(ls_labels) == Labels + + +def test_read_labels(dlc_project_config): + + labels = load_dlc(dlc_project_config) + labels2 = round_trip_labels(labels, dlc_project_config) + assert labels == labels2 diff --git a/tests/io/test_labelstudio.py b/tests/io/test_labelstudio.py new file mode 100644 index 00000000..8bcc121b --- /dev/null +++ b/tests/io/test_labelstudio.py @@ -0,0 +1,39 @@ +"""Tests for functions in the sleap_io.io.labelstudio file.""" +from sleap_io import Labels +from sleap_io.io.labelstudio import parse_tasks, read_labels, write_labels +from sleap_io.io.slp import read_labels as slp_read_labels + + +def round_trip_labels(labels: Labels) -> Labels: + ls_labels = parse_tasks(write_labels(labels), labels.skeletons[0]) + return ls_labels + + +def test_labels_round_trip(slp_typical, slp_simple_skel, slp_minimal): + """Test `read_labels` can read different types of .slp files.""" + + # first on `slp_typical` + labels = slp_read_labels(slp_typical) + assert type(labels) == Labels + ls_labels = round_trip_labels(labels) + assert type(ls_labels) == Labels + + # now on `slp_simple_skel` + labels = slp_read_labels(slp_simple_skel) + assert type(labels) == Labels + ls_labels = round_trip_labels(labels) + assert type(ls_labels) == Labels + + # now on `slp_minimal` + labels = slp_read_labels(slp_minimal) + assert type(labels) == Labels + ls_labels = round_trip_labels(labels) + assert type(ls_labels) == Labels + + +def test_read_labels(ls_multianimal): + file_path, skeleton = ls_multianimal + + ls_labels = read_labels(file_path, skeleton) + rt_labels = round_trip_labels(ls_labels) + assert ls_labels == rt_labels diff --git a/tests/model/test_instance.py b/tests/model/test_instance.py index 0ca1eb11..72deebd1 100644 --- a/tests/model/test_instance.py +++ b/tests/model/test_instance.py @@ -18,10 +18,26 @@ def test_point(): pt = Point(x=1.2, y=3.4, visible=True, complete=True) assert_equal(pt.numpy(), np.array([1.2, 3.4])) + pt2 = Point(x=1.2, y=3.4, visible=True, complete=True) + assert pt == pt2 + pt.visible = False assert_equal(pt.numpy(), np.array([np.nan, np.nan])) +def test_close_points(): + """Test equality of two `Point` objects which have a floating point error.""" + pt1 = Point( + x=135.82268970698718, y=213.22842752594835, visible=True, complete=False + ) + pt2 = Point(x=135.82268970698718, y=213.2284275259484, visible=True, complete=False) + assert pt1 == pt2 + + pt1 = Point(x=np.nan, y=np.nan, visible=False, complete=False) + pt2 = Point(x=np.nan, y=np.nan, visible=False, complete=False) + assert pt1 == pt2 + + def test_predicted_point(): """Test `PredictedPoint` is initialized as expected.""" pt = PredictedPoint(x=1.2, y=3.4, visible=True, complete=False, score=0.9)