From 04374810d4108d7425516c08177de2fda1f7f268 Mon Sep 17 00:00:00 2001 From: fcatus <56323389+fcatus@users.noreply.github.com> Date: Tue, 22 Sep 2020 21:26:20 -0500 Subject: [PATCH 1/5] Make all warnings suppressible --- time_in_each_roi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/time_in_each_roi.py b/time_in_each_roi.py index 464f7d3..b4b19e6 100644 --- a/time_in_each_roi.py +++ b/time_in_each_roi.py @@ -138,7 +138,7 @@ def sort_roi_points(roi): cleaned_rois.append(roi) return cleaned_rois else: - print("Warning: you've set check_inroi=False, so data reflect which ROI is closest even if tracked point is not in any given ROI.") + raise ValueError("Warning: you've set check_inroi=False, so data reflect which ROI is closest even if tracked point is not in any given ROI.") return roi_at_each_frame From 4bb188ddb4e3bc6a696270eb58969b1fa1fab28b Mon Sep 17 00:00:00 2001 From: fcatus <56323389+fcatus@users.noreply.github.com> Date: Wed, 23 Sep 2020 11:04:16 -0500 Subject: [PATCH 2/5] Update time_in_each_roi.py --- time_in_each_roi.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/time_in_each_roi.py b/time_in_each_roi.py index b4b19e6..04b6043 100644 --- a/time_in_each_roi.py +++ b/time_in_each_roi.py @@ -2,6 +2,7 @@ from collections import namedtuple from scipy.spatial import distance import pandas as pd +import warnings """ Functions to extract time spent by the mouse in each of a list of user defined ROIS @@ -138,7 +139,7 @@ def sort_roi_points(roi): cleaned_rois.append(roi) return cleaned_rois else: - raise ValueError("Warning: you've set check_inroi=False, so data reflect which ROI is closest even if tracked point is not in any given ROI.") + warnings.warn("Warning: you've set check_inroi=False, so data reflect which ROI is closest even if tracked point is not in any given ROI.") return roi_at_each_frame From 1978c8f38e2e6a6bcb91a85b0224450d533ce2f6 Mon Sep 17 00:00:00 2001 From: Alexander Mathis Date: Sun, 31 Jan 2021 23:09:52 +0100 Subject: [PATCH 3/5] VAME added --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 8ce4df0..91e75d2 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,12 @@ Contributed by [Harry Carey](https://github.com/PolarBean) # Clustering tools (using the output of DLC): +## Identifying Behavioral Structure from Deep Variational Embeddings of Animal Motion + +paper: https://www.biorxiv.org/content/10.1101/2020.05.14.095430 + +code: https://github.com/LINCellularNeuroscience/VAME + ## Behavior clustering with MotionMapper - (adpated from https://github.com/gordonberman/MotionMapper) From 3bd9a73ea6f4256380e6b217a9de2b215fe491fd Mon Sep 17 00:00:00 2001 From: jakeshirey <94328784+jakeshirey@users.noreply.github.com> Date: Sun, 21 May 2023 09:16:40 -0400 Subject: [PATCH 4/5] Added a Utility to the DLCutils readme page (#23) * Added a Utility to the DLCutils readme page * Update README.md - minor re shuffling --------- Co-authored-by: Mackenzie Mathis --- README.md | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 91e75d2..138c03b 100644 --- a/README.md +++ b/README.md @@ -10,29 +10,40 @@ This repository contains various scripts as well as links to other packages related to [DeepLabCut](https://github.com/AlexEMG/DeepLabCut). Feel free to contribute your own analysis methods, and perhaps some short notebook of how to use it. Thanks! -# Example scripts for scaling up your analysis & training: +# Example scripts for scaling up your DLC analysis & training: These two scripts illustrate how to train, test, and analyze videos for multiple projects automatically (scale_raining_and_evaluation.py) and how to analyze videos that are organized in subfolders automatically (scale_analysis_oversubfolders.py). Feel free to adjust them for your needs! -https://github.com/DeepLabCut/DLCutils/tree/master/SCALE_YOUR_ANALYSIS/scale_analysis_oversubfolders.py -https://github.com/DeepLabCut/DLCutils/blob/master/SCALE_YOUR_ANALYSIS/scale_training_and_evaluation.py +code: https://github.com/DeepLabCut/DLCutils/tree/master/SCALE_YOUR_ANALYSIS/scale_analysis_oversubfolders.py + +code: https://github.com/DeepLabCut/DLCutils/blob/master/SCALE_YOUR_ANALYSIS/scale_training_and_evaluation.py Contributed by [Alexander Mathis](https://github.com/AlexEMG) -# Using DLC outputs, loading, simple ROI analysis examples: + +# Using your DLC outputs, loading, simple ROI analysis, visualization examples: ## Time spent of a body part in a particular region of interest (ROI) You can compute time spent in particular ROIs in frames. This demo Jupyer Notebook shows you how to load the outputs of DLC and perform the analysis (plus other plotting functions): -https://github.com/DeepLabCut/DLCutils/blob/master/Demo_loadandanalyzeDLCdata.ipynb +code: https://github.com/DeepLabCut/DLCutils/blob/master/Demo_loadandanalyzeDLCdata.ipynb -https://github.com/DeepLabCut/DLCutils/blob/master/time_in_each_roi.py +code: https://github.com/DeepLabCut/DLCutils/blob/master/time_in_each_roi.py Contributed by [Federico Claudi](https://github.com/FedeClaudi) and Jupyter Notebok from [Alexander Mathis](https://github.com/AlexEMG) -## A GUI based ROI tool for time spent of a body part in a defined region of interest. -https://github.com/PolarBean/DLC_ROI_tool +## DeepLabCut-Display GUI + +Open and view data to understand pose estimation errors and trends. Filter data by likelihood threshold. + +code: https://github.com/jakeshirey/DeepLabCut-Display + +Contributed by [Jacob Shirey](https://github.com/jakeshirey) + +## A GUI based ROI tool for time spent of a body part in a defined region of interest + +code: https://github.com/PolarBean/DLC_ROI_tool Contributed by [Harry Carey](https://github.com/PolarBean) @@ -47,7 +58,7 @@ code: https://github.com/LINCellularNeuroscience/VAME ## Behavior clustering with MotionMapper - (adpated from https://github.com/gordonberman/MotionMapper) -https://github.com/DeepLabCut/DLCutils/tree/master/DLC_2_MotionMapper +code: https://github.com/DeepLabCut/DLCutils/tree/master/DLC_2_MotionMapper Contributed by [Mackenzie Mathis](https://github.com/MMathisLab) From 324d8438e67a8b12d2039a1525d2fe43721a61f2 Mon Sep 17 00:00:00 2001 From: Michael Schellenberger <97124047+MSchellenberger@users.noreply.github.com> Date: Tue, 1 Jul 2025 07:16:56 +0200 Subject: [PATCH 5/5] Added functionality: linear transformation and scaling of DLC data. Fixed outdated email in code of conduct (#24) --- CODE_OF_CONDUCT.md | 2 +- README.md | 10 + transform_and_scale/DLCTransformer.py | 208 ++++++++++++++++++ transform_and_scale/README.md | 28 +++ .../__pycache__/DLCTransformer.cpython-39.pyc | Bin 0 -> 6045 bytes .../__pycache__/read_config.cpython-39.pyc | Bin 0 -> 721 bytes transform_and_scale/config.yaml | 7 + transform_and_scale/read_config.py | 21 ++ ...DefenseCircuitsLab2023_Rotarod_testfile.h5 | Bin 0 -> 11929605 bytes .../transform_and_scale_tutorial.ipynb | 63 ++++++ 10 files changed, 338 insertions(+), 1 deletion(-) create mode 100644 transform_and_scale/DLCTransformer.py create mode 100644 transform_and_scale/README.md create mode 100644 transform_and_scale/__pycache__/DLCTransformer.cpython-39.pyc create mode 100644 transform_and_scale/__pycache__/read_config.cpython-39.pyc create mode 100644 transform_and_scale/config.yaml create mode 100644 transform_and_scale/read_config.py create mode 100644 transform_and_scale/test_data/DefenseCircuitsLab2023_Rotarod_testfile.h5 create mode 100644 transform_and_scale/transform_and_scale_tutorial.ipynb diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index f4396c3..339757e 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -55,7 +55,7 @@ further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at alexander.mathis@bethgelab.org. All +reported by contacting the project team at alexander.mathis@epfl.ch. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. diff --git a/README.md b/README.md index 138c03b..246783a 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,16 @@ code: https://github.com/PolarBean/DLC_ROI_tool Contributed by [Harry Carey](https://github.com/PolarBean) +## Linear Transformation and Scaling of DLC output data (transform_and_scale) + +This package is designed for anyone who wants to know where a tracked marker is within a reference frame (i.e. behavioral context). DeepLabCut outputs coordinates in relation to the field of view of the recorded video. With this tool, these coordinates can be linearly transformed and scaled to the reference frame of the behavioral context, meaning that the output coordinates are distances [cm] to a corner of the behavioral context, instead of distances [px] to a corner of the video field of view. + +code: https://github.com/DeepLabCut/DLCutils/tree/master/transform_and_scale/ + +tutorial: https://github.com/DeepLabCut/DLCutils/tree/master/transform_and_scale/transform_and_scale_tutorial.ipynb + +Contributed by [Michael Schellenberger](https://github.com/MSchellenberger) + # Clustering tools (using the output of DLC): ## Identifying Behavioral Structure from Deep Variational Embeddings of Animal Motion diff --git a/transform_and_scale/DLCTransformer.py b/transform_and_scale/DLCTransformer.py new file mode 100644 index 0000000..b53226a --- /dev/null +++ b/transform_and_scale/DLCTransformer.py @@ -0,0 +1,208 @@ +import pandas as pd +import numpy as np +from read_config import read_config +from typing import Optional + +class DLCTransformer: + def __init__(self, config_filepath: str, dlc_filepath: Optional[str] = None, dlc_df: Optional[pd.DataFrame] = None): + self.config = read_config(config_filepath) + self.dlc_filepath = dlc_filepath + if self.dlc_filepath is not None: + if self.dlc_filepath.endswith("h5"): + self.dlc_df = pd.read_hdf(dlc_filepath, header=[0, 1, 2], index_col=0) + elif self.dlc_filepath.endswith("csv"): + self.dlc_df = pd.read_csv(dlc_filepath, header=[0, 1, 2], index_col=0) + else: + raise ValueError("DeepLabCut file must be .h5 or .csv") + else: + if dlc_df is not None: + self.dlc_df = dlc_df + else: + raise ValueError("One of the arguments dlc_filepath or dlc_df must be specified") + + # read metadata + self.origin_marker = self.config["origin_marker"] + self.basis_vector_h_marker = self.config["basis_vector_h_marker"] + self.basis_vector_v_marker = self.config["basis_vector_v_marker"] + self.scale_factor_h = self.config["scale_factor_h"] + self.scale_factor_v = self.config["scale_factor_v"] + self.dlc_immobile_marker_threshold = self.config[ + "dlc_immobile_marker_threshold" + ] + self.show_angle = self.config["show_angle"] + self.scorer = self.dlc_df.columns.get_level_values(0).unique()[0] + + def run(self) -> pd.DataFrame: + """ + Translate and scale DLC data. + First get median coordinate of origin marker and basis vectors, then transform and scale the data. + + :return: pd.DataFrame with transformed and scaled DLC data + """ + # get basis vectors and origin + origin, basis_vector_h, basis_vector_v = self.get_basis_vectors( + df=self.dlc_df, + origin_marker=self.origin_marker, + basis_vector_h_marker=self.basis_vector_h_marker, + basis_vector_v_marker=self.basis_vector_v_marker, + dlc_immobile_marker_threshold=self.dlc_immobile_marker_threshold, + ) + + if self.show_angle: + print( + "Angle between basis vectors :", + self._calculate_angle(basis_vector_v, (0, 0), basis_vector_h), + ) + + # transform df + df_transformed = self.transform( + self.dlc_df, origin, basis_vector_h, basis_vector_v + ) + df_scaled = self.scale_df( + df_transformed, self.scale_factor_h, self.scale_factor_v + ) + return df_scaled + + def get_basis_vectors( + self, + df: pd.DataFrame, + origin_marker: str, + basis_vector_h_marker: str, + basis_vector_v_marker: str, + dlc_immobile_marker_threshold: float, + ) -> (tuple, tuple, tuple): + """ + Returns the origin and basis vectors of the coordinate system + + :param df: pd.DataFrame with tracking data + :param origin_marker: name of origin marker + :param basis_vector_h_marker: name of horizontal basis vector marker + :param basis_vector_v_marker: name of vertical basis vector marker + :param dlc_immobile_marker_threshold: minimum likelihood of a constant marker to be included into the median coordinate calculation + :return: coordinates of origin, basis_vector_h, basis_vector_v + """ + origin = self.get_median_coordinate( + df, origin_marker, dlc_immobile_marker_threshold + ) + + # bring coordinates into origin system + basis_vector_h_coord = self.get_median_coordinate( + df=df, + marker=basis_vector_h_marker, + dlc_immobile_marker_threshold=dlc_immobile_marker_threshold, + ) + basis_vector_v_coord = self.get_median_coordinate( + df=df, + marker=basis_vector_v_marker, + dlc_immobile_marker_threshold=dlc_immobile_marker_threshold, + ) + + # calculate basis vector transformation + basis_vector_h = ( + basis_vector_h_coord[0] - origin[0], + basis_vector_h_coord[1] - origin[1], + ) + basis_vector_v = ( + basis_vector_v_coord[0] - origin[0], + basis_vector_v_coord[1] - origin[1], + ) + + return origin, basis_vector_h, basis_vector_v + + def get_median_coordinate(self, df, marker, dlc_immobile_marker_threshold) -> tuple: + """ + Returns the most likely coordinate of a vector + + :param df: pd.DataFrame with tracking data + :param marker: name of marker of which the median coordinate should be calculated + :param dlc_immobile_marker_threshold: minimum likelihood of a constant marker to be included into the median coordinate calculation + :return: median coordinate of marker + """ + # filter df + df = df.droplevel(0, axis=1) + marker_df = df.loc[ + df[marker, "likelihood"] > dlc_immobile_marker_threshold, marker + ].copy() + x_coord = np.nanmedian(marker_df["x"]) + y_coord = np.nanmedian(marker_df["y"]) + coords = (x_coord, y_coord) + return coords + + def _calculate_angle(self, a, b, c) -> float: + """ + Calculates the angle between three points a-b-c + + :param a: tuple of coordinates + :param b: tuple of coordinates + :param c: tuple of coordinates + :return: angle between a-b-c in degrees + """ + + # Calculate the vectors AB and BC + vector_AB = (b[0] - a[0], b[1] - a[1]) + vector_BC = (c[0] - b[0], c[1] - b[1]) + + # Calculate the magnitudes of AB and BC + magnitude_AB = np.linalg.norm(vector_AB) + magnitude_BC = np.linalg.norm(vector_BC) + # + # Calculate the dot product of AB and BC + dot_product = np.dot(vector_AB, vector_BC) + + # Calculate the angle in radians using the dot product and magnitudes + angle_radians = np.arccos(dot_product / (magnitude_AB * magnitude_BC)) + + # Convert the angle to degrees + angle_degrees = np.degrees(angle_radians) + return angle_degrees + + def transform(self, df, origin, basis_vector_h, basis_vector_v) -> pd.DataFrame: + """ + Transform the coordinates of the df into the new coordinate system + + :param df: pd.DataFrame with tracking data + :param origin: coordinate of origin + :param basis_vector_h: coordinate of horizontal basis vector + :param basis_vector_v: coordinate of vertical basis vector + :return: transformed pd.DataFrame + """ + transformed_df = df.copy() + final_transformed_df = df.copy() + + # 2d rotation matrix + a = basis_vector_h[0] + b = basis_vector_h[1] + c = basis_vector_v[0] + d = basis_vector_v[1] + + for marker in df.columns.get_level_values(1).unique(): + + # shift coordinates into origin system + transformed_df.loc[:, (self.scorer, marker, "x")] -= origin[0] + transformed_df.loc[:, (self.scorer, marker, "y")] -= origin[1] + + # linear algebra 2D transformation + final_transformed_df.loc[:, (self.scorer, marker, "y")] = ( + (transformed_df.loc[:, (self.scorer, marker, "y")] / b) + - (transformed_df.loc[:, (self.scorer, marker, "x")] / a) + ) / ((-c / a) + (d / b)) + + final_transformed_df.loc[:, (self.scorer, marker, "x")] = ( + transformed_df.loc[:, (self.scorer, marker, "x")] + - c * final_transformed_df.loc[:, (self.scorer, marker, "y")] + ) / a + + return final_transformed_df + + def scale_df(self, df, scale_factor_h, scale_factor_v) -> pd.DataFrame: + """ + :param df: pd.DataFrame with tracking data + :param scale_factor_h: horizontal scale factor + :param scale_factor_v: vertical scale factor + :return: scaled pd.DataFrame + """ + scaled_df = df.copy() + for marker in df.columns.get_level_values(1).unique(): + scaled_df.loc[:, (self.scorer, marker, "x")] *= scale_factor_h + scaled_df.loc[:, (self.scorer, marker, "y")] *= scale_factor_v + return scaled_df diff --git a/transform_and_scale/README.md b/transform_and_scale/README.md new file mode 100644 index 0000000..fae5edc --- /dev/null +++ b/transform_and_scale/README.md @@ -0,0 +1,28 @@ +# Easy transformation and scaling of DeepLabCut Data + +#### Background +DeepLabCut is a widely used markerless pose estimation toolbox in behavioral science. The output of DeepLabCut is coordinates in pixels for each frame for each marker. However, in most cases the coordinates first need to be translated (i.e. adapted to the coordinate-space of the behavioral maze) and scaled (e.g. to cm) to enable meaningful behavioral quantification. + +#### Functionality +The Transform_DLC repository takes care of a specific task: It takes DeepLabCut dataframes as the input and outputs transformed and scaled DeepLabCut dataframes. Requirements for this transformation and scaling are that the behavioral maze or a reference has to be rectangular and its corners have to be tracked with DeepLabCut. + +#### Usage +For an example usecase check out the tutorial notebook! + +1) Set hyperparameter in config file: Specify the name of the horizontal and vertical basis vector markers (in a rectangular maze these are two opposing corners) and the origin (the corner that connects the two basis vector corners). Additionally, set the DeepLabCut-likelihood threshold for those markers, and the scale factors (optional, if you don“t need scaling set them to 1). For quality control set show_angle to True. + +2) Instantiate the DLCTransformer class with the filepath to your DeepLabCut tracked data and the config-filepath. + +3) Use .run on your instantiated class object and save the output in a variable of your choice. + + +#### Contribution +This is a [Defense Circuits Lab](https://www.defense-circuits-lab.com/) project written by [Michael Schellenberger](https://github.com/MSchellenberger) for [DLCutils](https://github.com/DeepLabCut/DLCutils). + + + +
+ + DefenseCircuitsLab + +
\ No newline at end of file diff --git a/transform_and_scale/__pycache__/DLCTransformer.cpython-39.pyc b/transform_and_scale/__pycache__/DLCTransformer.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f81d283dd76cb642cd68d26c43a3a03bb55af54 GIT binary patch literal 6045 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 literal 0 HcmV?d00001 diff --git a/transform_and_scale/__pycache__/read_config.cpython-39.pyc b/transform_and_scale/__pycache__/read_config.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f303f86670ab180c7133b660d63e16bb8b0ba42 GIT binary patch literal 721 zcmYjP&59F25U%d&{4hyCFYZO8@gj3s);&g9gsgj7gBWDlFc5mDJISmw-9vW|n2=mt zui^{%0>08*L_GNl9$afCK~h6~Lv{Uq)zxA!2m$5i_J@2%0e;oSp#*5WLUoT3BuJ9M z6ckZZ(r;7-l6_{=K#~bWt=|{{Yg?4je^BMA*xkO|tws^m@-JKp6tEzWkvwGc+5THXzpPZ6DrG(y7O8?UPZrcvf m6EWMtUlrhnDkjs!H^&X71L)T=-IuwMWv0&Rx8>@Iy1_r{iNS6F literal 0 HcmV?d00001 diff --git a/transform_and_scale/config.yaml b/transform_and_scale/config.yaml new file mode 100644 index 0000000..763d295 --- /dev/null +++ b/transform_and_scale/config.yaml @@ -0,0 +1,7 @@ +origin_marker: 'RodLowerLeft' +basis_vector_h_marker: 'RodLowerRight' +basis_vector_v_marker: 'RodUpperLeft' +scale_factor_h: 5.8 +scale_factor_v: 3 +dlc_immobile_marker_threshold: 0.9 +show_angle: True \ No newline at end of file diff --git a/transform_and_scale/read_config.py b/transform_and_scale/read_config.py new file mode 100644 index 0000000..94b43e6 --- /dev/null +++ b/transform_and_scale/read_config.py @@ -0,0 +1,21 @@ +import yaml + + +def read_config(config_path: str) -> dict: + """ + Reads structured config file defining a project. + + :param config_path: path to config file + """ + + try: + with open(config_path, "r") as ymlfile: + config_file = yaml.load(ymlfile, Loader=yaml.SafeLoader) + except FileNotFoundError: + raise ( + "Could not find the config file at " + + config_path + + " \n Please make sure the path is correct and the file exists" + ) + + return config_file diff --git a/transform_and_scale/test_data/DefenseCircuitsLab2023_Rotarod_testfile.h5 b/transform_and_scale/test_data/DefenseCircuitsLab2023_Rotarod_testfile.h5 new file mode 100644 index 0000000000000000000000000000000000000000..f4c61844aaf4a7937ecc5ace0a1a466fb83421f5 GIT binary patch literal 11929605 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

5_d4o4X@5H=tAl(?r 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