diff --git a/setup.cfg b/setup.cfg index 30e851f2..cc7134f1 100644 --- a/setup.cfg +++ b/setup.cfg @@ -23,6 +23,9 @@ install_requires = pynwb ndx-pose pandas + typing_extensions + tables + ruamel.yaml simplejson [options.extras_require] diff --git a/sleap_io/io/dlc.py b/sleap_io/io/dlc.py new file mode 100644 index 00000000..0a9316b1 --- /dev/null +++ b/sleap_io/io/dlc.py @@ -0,0 +1,359 @@ +import math +import os +from typing import Dict, List, Optional, Tuple, Union, cast +from typing_extensions import Literal + +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 + + +DlcSkeletonType = Literal["single", "multi", "unique"] + + +def get_skeleton_type(skeleton: Skeleton, dlc_config: dict) -> DlcSkeletonType: + """Infer the type of skeleton, given a dlc configuration + + Parameters: + skeleton: skeleton for which to infer type + dlc_config (dict): DLC project configuration data + + Returns: + one of 'single', 'multi', 'unique' + """ + + for ref_skel in load_skeletons(dlc_config): + if set(ref_skel.node_names) == set(skeleton.node_names): + # sanity check: ensure name is not None (appease mypy) + if ref_skel.name is None: + raise ValueError("Unexpected reference skeleton without a name!") + + # sanity check: ensure name is one of the set in the annotated return type (appease mypy) + if ref_skel.name not in ("single", "multi", "unique"): + raise ValueError("Unexpected reference skeleton name!") + + return cast(DlcSkeletonType, ref_skel.name) + + raise ValueError("Unable to infer skeleton type!") + + +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]] = {} + + 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() + + # TODO: I think we can only support user-labeled frames! + for instance in labeled_frame.user_instances: + + # determine individual type / identity + instance_name: Optional[str] = None + if is_ma: + skel_type = get_skeleton_type(instance.skeleton, dlc_config) + if skel_type == "unique": + instance_name = "single" + + elif skel_type == "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/tests/conftest.py b/tests/conftest.py index 64782c4b..cc3fbfe8 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2,4 +2,5 @@ from tests.fixtures.slp import * from tests.fixtures.labels import * +from tests.fixtures.dlc import * from tests.fixtures.labelstudio 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/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/io/test_dlc.py b/tests/io/test_dlc.py new file mode 100644 index 00000000..69ac27c1 --- /dev/null +++ b/tests/io/test_dlc.py @@ -0,0 +1,84 @@ +"""Tests for functions in the sleap_io.io.labelstudio file.""" +from typing import Optional + +from sleap_io import Labels +from sleap_io.io.dlc import ( + get_skeleton_type, + labels_to_dlc, + dlc_to_labels, + load_dlc, + load_skeletons, +) +from sleap_io.io.slp import read_labels as slp_read_labels + + +def round_trip_labels(labels: Labels, dlc_config: Optional[dict] = None) -> Labels: + if dlc_config is None: + dlc_config = dlc_config_from_labels(labels) + ls_labels = dlc_to_labels(labels_to_dlc(labels, dlc_config), dlc_config) + return ls_labels + + +def dlc_config_from_labels(labels: Labels) -> dict: + """Attempt to create a minimal functioning DLC config given a `Labels` instance. + Intended only as a shim for testing purposes + """ + dlc_config = { + "project_path": "", + "scorer": "johndoe", + "multianimalproject": True, + "individuals": [], + "multianimalbodyparts": [], + "uniquebodyparts": [], + "bodyparts": "MULTI!", + "video_sets": {}, + } + + max_instances = max( + [ + max(len(lf.user_instances), len(lf.predicted_instances)) + for lf in labels.labeled_frames + ] + ) + dlc_config["individuals"] = [f"animal{i}" for i in range(max_instances)] + + dlc_config["multianimalbodyparts"] = [ + node for node in labels.skeletons[0].node_names + ] + + return dlc_config + + +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): + """Test round trip load and write from a DLC project""" + labels = load_dlc(dlc_project_config) + labels2 = round_trip_labels(labels, dlc_project_config) + assert labels == labels2 + + +def test_get_skeleton_type(dlc_project_config): + skeletons = load_skeletons(dlc_project_config) + for sk in skeletons: + assert sk.name == get_skeleton_type(sk, dlc_project_config)