Repository files navigation

###############################################################################
# #
# This is the cv-tracer software package, designed for tracking and # # analyzing dynamics of fish swimming in groups. It can be downloaded at #
# #
# https://github.com/patchmemory/cvtracer #
# #
# Software designed and developed by Adam Patch and Yaouen Fily at Florida #
# Atlantic University. Began with github.com/vivekhsridhar/tracktor. #
# #
###############################################################################
In the cv-tracer package, one will find the modules TrAQ, Analysis, and GUI
These three modules provide necessary tools for different stages of tracking
birds-eye video of fish swimming in a tank, reviewing the results alongside
video to check for errors, and analyzing the results across trials. Scripts for executing all tasks for tracking can be found in scripts/track
subdirectory of each base module (e.g. TrAQ/scripts, Analysis/scripts). This document provides a basic overview of how to use this software and is
broken into three sections:
1. Tracing and processing tracks 2. Analyzing results across trials 3. Reviewing kinematics alongside video This software is designed in python with free libraries so that it may be
straightforwardly modified to incorporate more advanced methods of tracking
and analysis.
#############################
Tracing and processing tracks #############################
One can completely track and process a video trial, by executing the
following commands and providing relevant input parameters. > python prepare.py [input_video] -opts
> python trace.py [trial] -opts
> python process.py [trial] -opts
These each perform the following tasks:
prepare.py: Loads video for the first time and takes down information
about the run like the raw video file, the number of
individuals, the type of fish, the total length of the run,
and any other relevant input for characterizing the trial.
The script then generates a Trial object to store all of this
information. Once the trial object has been created, the script will
prompt the user to utilize a GUI to locate the tank edges and
store the result as a Tank object inside the trial object. A Group object (which contains Individual objects) within the
Trial object will also be generated to store and analyze data
at the time of tracing and processing. Finally, the script will generate a directory with a concise
name reflecting that of the original video file, moving that
file to this new directory as raw.mp4. The Trial object will
also be stored in this directory with the name trial.pik trace.py: Loads Trial object and utilizes Tracer and VideoCV objects to
track coordinates of fish throughout that trial. At each frame, Tracer will gather and sort the findings of
VideoCV in order to best trace the location of fish
throughout the run, ignoring fish misidentified outside of
the Tank, as identified in prepare.py. The resulting
coordinates are stored as Individuals in the Trial's Group. Trial object, now containing Tank, Group, and all relevant
trial-specific information, is again saved in the
trial-specific location, as found at the beginning of
tracing.
process.py: After the initial tracking has occurred, it is useful to now
better calculate kinematic quantities like velocity and
acceleration in both translational and rotational coordinates
(latter w.r.t. director angle). Using these quantities, it is then useful to provide some
initial statistical analysis without any cuts, for the sake
of quickly summarizing the behavior of fish in each run. With further development, this stage would also be the place
to fix errors in the initial tracks which may have issues
with occlusions and jumping points. At this point in time, it
only really makes sense to perhaps identify frames and points
of interest for the sake of troubleshooting in the future.
For our first paper, these issues are handled by simple
ad-hoc cuts which will be made to obviously erraneous data
during the next stage, Analysis, so that all Trials will be
treated uniformly.
###############################
Analyzing results across trials ###############################
Once the tracking of a set of trials is complete, one can run the following
command and relevant input parameters in order to analyze data given a set
of cuts. > python analyze.py [trial_list] -opts
While the analysis itself may be modified, this will perform a few basic
tasks regardless of the specific analysis.
analysis.py: First, all Trial objects will be loaded from their save
locations and stored in an Archive object. This object has
the ability to call functions on each trial (e.g. make a
consistent set of cuts) and to combine statistical results
across trials, storing results according to analysis-specific
cuts applied.
Once results have been computed and collected, they can be
combined and stored in the Archive object's result
dictionary. This allows easy access via the Archive object
later. Utilizing the Analysis.Plot module, one can efficiently plot
distributions and results for each trial and across trials.
Trial-specific results will be stored in the Trial's home
directory while the results across trials will be stored in
results/.
####################################
Reviewing kinematics alongside video ####################################
While one can, in principle, follow all of the above steps, it is always
useful to verify kinematic quantities being calculated correctly via some
kind of visual sanity check. The easiest way to do this is to utilize the
cvDataViewer, found in the GUI module. One can execute this GUI by simply > python GUI/cvDataViewer.py [trial_directory] -v cv.mp4
This will open a window containing a video of the tracked fish as well as a
side panel displaying time-dependent results of three quantities: distance
to the wall, speed, and angular speed. This tool facilitates checks on tracking throughout a run by allowing users
to see directly if quantities are being properly calculated across frames
of the video. A couple examples of how one might use this information...
One may find that the tracer is having trouble locating fish at every
frame, resulting in jumps from track-to-track. By viewing this in the
cvDataViewer, one may step back to the tracking stage and try using a
different set of contour-tracing parameters to better identify fish and
then go back to verify after a second round of tracking has completed.
Another may find that while the tracing has been done optimally, there
are still undesirable errors where fish appear to be jumping across the
tank or turning in an unphysical way. Despite the shortcomings of the
tracking software, this provides a basis for eliminating erroneous frames
by making cuts at the stage of Analysis, in order to consistently treat
systematic errors across runs. ############
Dependencies
############
The following python libraries are required for full functionality of
cv-tracer: - argparse
- copy
- matplotlib
- numpy
- opencv (cv2, which version?)
- pickle
- PyQt5
- pyqtgraph
- scikit-learn
- scipy

About

software for tracking and analyzing behavior of fish in groups

Topics

Resources

Stars

4 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

###############################################################################
# #
# This is the cv-tracer software package, designed for tracking and # # analyzing dynamics of fish swimming in groups. It can be downloaded at #
# #
# https://github.com/patchmemory/cvtracer #
# #
# Software designed and developed by Adam Patch and Yaouen Fily at Florida #
# Atlantic University. Began with github.com/vivekhsridhar/tracktor. #
# #
###############################################################################
In the cv-tracer package, one will find the modules TrAQ, Analysis, and GUI
These three modules provide necessary tools for different stages of tracking
birds-eye video of fish swimming in a tank, reviewing the results alongside
video to check for errors, and analyzing the results across trials. Scripts for executing all tasks for tracking can be found in scripts/track
subdirectory of each base module (e.g. TrAQ/scripts, Analysis/scripts). This document provides a basic overview of how to use this software and is
broken into three sections:
1. Tracing and processing tracks 2. Analyzing results across trials 3. Reviewing kinematics alongside video This software is designed in python with free libraries so that it may be
straightforwardly modified to incorporate more advanced methods of tracking
and analysis.
#############################
Tracing and processing tracks #############################
One can completely track and process a video trial, by executing the
following commands and providing relevant input parameters. > python prepare.py [input_video] -opts
> python trace.py [trial] -opts
> python process.py [trial] -opts
These each perform the following tasks:
prepare.py: Loads video for the first time and takes down information
about the run like the raw video file, the number of
individuals, the type of fish, the total length of the run,
and any other relevant input for characterizing the trial.
The script then generates a Trial object to store all of this
information. Once the trial object has been created, the script will
prompt the user to utilize a GUI to locate the tank edges and
store the result as a Tank object inside the trial object. A Group object (which contains Individual objects) within the
Trial object will also be generated to store and analyze data
at the time of tracing and processing. Finally, the script will generate a directory with a concise
name reflecting that of the original video file, moving that
file to this new directory as raw.mp4. The Trial object will
also be stored in this directory with the name trial.pik trace.py: Loads Trial object and utilizes Tracer and VideoCV objects to
track coordinates of fish throughout that trial. At each frame, Tracer will gather and sort the findings of
VideoCV in order to best trace the location of fish
throughout the run, ignoring fish misidentified outside of
the Tank, as identified in prepare.py. The resulting
coordinates are stored as Individuals in the Trial's Group. Trial object, now containing Tank, Group, and all relevant
trial-specific information, is again saved in the
trial-specific location, as found at the beginning of
tracing.
process.py: After the initial tracking has occurred, it is useful to now
better calculate kinematic quantities like velocity and
acceleration in both translational and rotational coordinates
(latter w.r.t. director angle). Using these quantities, it is then useful to provide some
initial statistical analysis without any cuts, for the sake
of quickly summarizing the behavior of fish in each run. With further development, this stage would also be the place
to fix errors in the initial tracks which may have issues
with occlusions and jumping points. At this point in time, it
only really makes sense to perhaps identify frames and points
of interest for the sake of troubleshooting in the future.
For our first paper, these issues are handled by simple
ad-hoc cuts which will be made to obviously erraneous data
during the next stage, Analysis, so that all Trials will be
treated uniformly.
###############################
Analyzing results across trials ###############################
Once the tracking of a set of trials is complete, one can run the following
command and relevant input parameters in order to analyze data given a set
of cuts. > python analyze.py [trial_list] -opts
While the analysis itself may be modified, this will perform a few basic
tasks regardless of the specific analysis.
analysis.py: First, all Trial objects will be loaded from their save
locations and stored in an Archive object. This object has
the ability to call functions on each trial (e.g. make a
consistent set of cuts) and to combine statistical results
across trials, storing results according to analysis-specific
cuts applied.
Once results have been computed and collected, they can be
combined and stored in the Archive object's result
dictionary. This allows easy access via the Archive object
later. Utilizing the Analysis.Plot module, one can efficiently plot
distributions and results for each trial and across trials.
Trial-specific results will be stored in the Trial's home
directory while the results across trials will be stored in
results/.
####################################
Reviewing kinematics alongside video ####################################
While one can, in principle, follow all of the above steps, it is always
useful to verify kinematic quantities being calculated correctly via some
kind of visual sanity check. The easiest way to do this is to utilize the
cvDataViewer, found in the GUI module. One can execute this GUI by simply > python GUI/cvDataViewer.py [trial_directory] -v cv.mp4
This will open a window containing a video of the tracked fish as well as a
side panel displaying time-dependent results of three quantities: distance
to the wall, speed, and angular speed. This tool facilitates checks on tracking throughout a run by allowing users
to see directly if quantities are being properly calculated across frames
of the video. A couple examples of how one might use this information...
One may find that the tracer is having trouble locating fish at every
frame, resulting in jumps from track-to-track. By viewing this in the
cvDataViewer, one may step back to the tracking stage and try using a
different set of contour-tracing parameters to better identify fish and
then go back to verify after a second round of tracking has completed.
Another may find that while the tracing has been done optimally, there
are still undesirable errors where fish appear to be jumping across the
tank or turning in an unphysical way. Despite the shortcomings of the
tracking software, this provides a basis for eliminating erroneous frames
by making cuts at the stage of Analysis, in order to consistently treat
systematic errors across runs. ############
Dependencies
############
The following python libraries are required for full functionality of
cv-tracer: - argparse
- copy
- matplotlib
- numpy
- opencv (cv2, which version?)
- pickle
- PyQt5
- pyqtgraph
- scikit-learn
- scipy

About

software for tracking and analyzing behavior of fish in groups

Topics

Resources

Stars

4 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

###############################################################################
# #
# This is the cv-tracer software package, designed for tracking and # # analyzing dynamics of fish swimming in groups. It can be downloaded at #
# #
# https://github.com/patchmemory/cvtracer #
# #
# Software designed and developed by Adam Patch and Yaouen Fily at Florida #
# Atlantic University. Began with github.com/vivekhsridhar/tracktor. #
# #
###############################################################################
In the cv-tracer package, one will find the modules TrAQ, Analysis, and GUI
These three modules provide necessary tools for different stages of tracking
birds-eye video of fish swimming in a tank, reviewing the results alongside
video to check for errors, and analyzing the results across trials. Scripts for executing all tasks for tracking can be found in scripts/track
subdirectory of each base module (e.g. TrAQ/scripts, Analysis/scripts). This document provides a basic overview of how to use this software and is
broken into three sections:
1. Tracing and processing tracks 2. Analyzing results across trials 3. Reviewing kinematics alongside video This software is designed in python with free libraries so that it may be
straightforwardly modified to incorporate more advanced methods of tracking
and analysis.
#############################
Tracing and processing tracks #############################
One can completely track and process a video trial, by executing the
following commands and providing relevant input parameters. > python prepare.py [input_video] -opts
> python trace.py [trial] -opts
> python process.py [trial] -opts
These each perform the following tasks:
prepare.py: Loads video for the first time and takes down information
about the run like the raw video file, the number of
individuals, the type of fish, the total length of the run,
and any other relevant input for characterizing the trial.
The script then generates a Trial object to store all of this
information. Once the trial object has been created, the script will
prompt the user to utilize a GUI to locate the tank edges and
store the result as a Tank object inside the trial object. A Group object (which contains Individual objects) within the
Trial object will also be generated to store and analyze data
at the time of tracing and processing. Finally, the script will generate a directory with a concise
name reflecting that of the original video file, moving that
file to this new directory as raw.mp4. The Trial object will
also be stored in this directory with the name trial.pik trace.py: Loads Trial object and utilizes Tracer and VideoCV objects to
track coordinates of fish throughout that trial. At each frame, Tracer will gather and sort the findings of
VideoCV in order to best trace the location of fish
throughout the run, ignoring fish misidentified outside of
the Tank, as identified in prepare.py. The resulting
coordinates are stored as Individuals in the Trial's Group. Trial object, now containing Tank, Group, and all relevant
trial-specific information, is again saved in the
trial-specific location, as found at the beginning of
tracing.
process.py: After the initial tracking has occurred, it is useful to now
better calculate kinematic quantities like velocity and
acceleration in both translational and rotational coordinates
(latter w.r.t. director angle). Using these quantities, it is then useful to provide some
initial statistical analysis without any cuts, for the sake
of quickly summarizing the behavior of fish in each run. With further development, this stage would also be the place
to fix errors in the initial tracks which may have issues
with occlusions and jumping points. At this point in time, it
only really makes sense to perhaps identify frames and points
of interest for the sake of troubleshooting in the future.
For our first paper, these issues are handled by simple
ad-hoc cuts which will be made to obviously erraneous data
during the next stage, Analysis, so that all Trials will be
treated uniformly.
###############################
Analyzing results across trials ###############################
Once the tracking of a set of trials is complete, one can run the following
command and relevant input parameters in order to analyze data given a set
of cuts. > python analyze.py [trial_list] -opts
While the analysis itself may be modified, this will perform a few basic
tasks regardless of the specific analysis.
analysis.py: First, all Trial objects will be loaded from their save
locations and stored in an Archive object. This object has
the ability to call functions on each trial (e.g. make a
consistent set of cuts) and to combine statistical results
across trials, storing results according to analysis-specific
cuts applied.
Once results have been computed and collected, they can be
combined and stored in the Archive object's result
dictionary. This allows easy access via the Archive object
later. Utilizing the Analysis.Plot module, one can efficiently plot
distributions and results for each trial and across trials.
Trial-specific results will be stored in the Trial's home
directory while the results across trials will be stored in
results/.
####################################
Reviewing kinematics alongside video ####################################
While one can, in principle, follow all of the above steps, it is always
useful to verify kinematic quantities being calculated correctly via some
kind of visual sanity check. The easiest way to do this is to utilize the
cvDataViewer, found in the GUI module. One can execute this GUI by simply > python GUI/cvDataViewer.py [trial_directory] -v cv.mp4
This will open a window containing a video of the tracked fish as well as a
side panel displaying time-dependent results of three quantities: distance
to the wall, speed, and angular speed. This tool facilitates checks on tracking throughout a run by allowing users
to see directly if quantities are being properly calculated across frames
of the video. A couple examples of how one might use this information...
One may find that the tracer is having trouble locating fish at every
frame, resulting in jumps from track-to-track. By viewing this in the
cvDataViewer, one may step back to the tracking stage and try using a
different set of contour-tracing parameters to better identify fish and
then go back to verify after a second round of tracking has completed.
Another may find that while the tracing has been done optimally, there
are still undesirable errors where fish appear to be jumping across the
tank or turning in an unphysical way. Despite the shortcomings of the
tracking software, this provides a basis for eliminating erroneous frames
by making cuts at the stage of Analysis, in order to consistently treat
systematic errors across runs. ############
Dependencies
############
The following python libraries are required for full functionality of
cv-tracer: - argparse
- copy
- matplotlib
- numpy
- opencv (cv2, which version?)
- pickle
- PyQt5
- pyqtgraph
- scikit-learn
- scipy

About

software for tracking and analyzing behavior of fish in groups

Topics

Resources

Stars

4 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

###############################################################################
# #
# This is the cv-tracer software package, designed for tracking and # # analyzing dynamics of fish swimming in groups. It can be downloaded at #
# #
# https://github.com/patchmemory/cvtracer #
# #
# Software designed and developed by Adam Patch and Yaouen Fily at Florida #
# Atlantic University. Began with github.com/vivekhsridhar/tracktor. #
# #
###############################################################################
In the cv-tracer package, one will find the modules TrAQ, Analysis, and GUI
These three modules provide necessary tools for different stages of tracking
birds-eye video of fish swimming in a tank, reviewing the results alongside
video to check for errors, and analyzing the results across trials. Scripts for executing all tasks for tracking can be found in scripts/track
subdirectory of each base module (e.g. TrAQ/scripts, Analysis/scripts). This document provides a basic overview of how to use this software and is
broken into three sections:
1. Tracing and processing tracks 2. Analyzing results across trials 3. Reviewing kinematics alongside video This software is designed in python with free libraries so that it may be
straightforwardly modified to incorporate more advanced methods of tracking
and analysis.
#############################
Tracing and processing tracks #############################
One can completely track and process a video trial, by executing the
following commands and providing relevant input parameters. > python prepare.py [input_video] -opts
> python trace.py [trial] -opts
> python process.py [trial] -opts
These each perform the following tasks:
prepare.py: Loads video for the first time and takes down information
about the run like the raw video file, the number of
individuals, the type of fish, the total length of the run,
and any other relevant input for characterizing the trial.
The script then generates a Trial object to store all of this
information. Once the trial object has been created, the script will
prompt the user to utilize a GUI to locate the tank edges and
store the result as a Tank object inside the trial object. A Group object (which contains Individual objects) within the
Trial object will also be generated to store and analyze data
at the time of tracing and processing. Finally, the script will generate a directory with a concise
name reflecting that of the original video file, moving that
file to this new directory as raw.mp4. The Trial object will
also be stored in this directory with the name trial.pik trace.py: Loads Trial object and utilizes Tracer and VideoCV objects to
track coordinates of fish throughout that trial. At each frame, Tracer will gather and sort the findings of
VideoCV in order to best trace the location of fish
throughout the run, ignoring fish misidentified outside of
the Tank, as identified in prepare.py. The resulting
coordinates are stored as Individuals in the Trial's Group. Trial object, now containing Tank, Group, and all relevant
trial-specific information, is again saved in the
trial-specific location, as found at the beginning of
tracing.
process.py: After the initial tracking has occurred, it is useful to now
better calculate kinematic quantities like velocity and
acceleration in both translational and rotational coordinates
(latter w.r.t. director angle). Using these quantities, it is then useful to provide some
initial statistical analysis without any cuts, for the sake
of quickly summarizing the behavior of fish in each run. With further development, this stage would also be the place
to fix errors in the initial tracks which may have issues
with occlusions and jumping points. At this point in time, it
only really makes sense to perhaps identify frames and points
of interest for the sake of troubleshooting in the future.
For our first paper, these issues are handled by simple
ad-hoc cuts which will be made to obviously erraneous data
during the next stage, Analysis, so that all Trials will be
treated uniformly.
###############################
Analyzing results across trials ###############################
Once the tracking of a set of trials is complete, one can run the following
command and relevant input parameters in order to analyze data given a set
of cuts. > python analyze.py [trial_list] -opts
While the analysis itself may be modified, this will perform a few basic
tasks regardless of the specific analysis.
analysis.py: First, all Trial objects will be loaded from their save
locations and stored in an Archive object. This object has
the ability to call functions on each trial (e.g. make a
consistent set of cuts) and to combine statistical results
across trials, storing results according to analysis-specific
cuts applied.
Once results have been computed and collected, they can be
combined and stored in the Archive object's result
dictionary. This allows easy access via the Archive object
later. Utilizing the Analysis.Plot module, one can efficiently plot
distributions and results for each trial and across trials.
Trial-specific results will be stored in the Trial's home
directory while the results across trials will be stored in
results/.
####################################
Reviewing kinematics alongside video ####################################
While one can, in principle, follow all of the above steps, it is always
useful to verify kinematic quantities being calculated correctly via some
kind of visual sanity check. The easiest way to do this is to utilize the
cvDataViewer, found in the GUI module. One can execute this GUI by simply > python GUI/cvDataViewer.py [trial_directory] -v cv.mp4
This will open a window containing a video of the tracked fish as well as a
side panel displaying time-dependent results of three quantities: distance
to the wall, speed, and angular speed. This tool facilitates checks on tracking throughout a run by allowing users
to see directly if quantities are being properly calculated across frames
of the video. A couple examples of how one might use this information...
One may find that the tracer is having trouble locating fish at every
frame, resulting in jumps from track-to-track. By viewing this in the
cvDataViewer, one may step back to the tracking stage and try using a
different set of contour-tracing parameters to better identify fish and
then go back to verify after a second round of tracking has completed.
Another may find that while the tracing has been done optimally, there
are still undesirable errors where fish appear to be jumping across the
tank or turning in an unphysical way. Despite the shortcomings of the
tracking software, this provides a basis for eliminating erroneous frames
by making cuts at the stage of Analysis, in order to consistently treat
systematic errors across runs. ############
Dependencies
############
The following python libraries are required for full functionality of
cv-tracer: - argparse
- copy
- matplotlib
- numpy
- opencv (cv2, which version?)
- pickle
- PyQt5
- pyqtgraph
- scikit-learn
- scipy

About

software for tracking and analyzing behavior of fish in groups

Topics

Resources

Stars

4 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

###############################################################################
# #
# This is the cv-tracer software package, designed for tracking and # # analyzing dynamics of fish swimming in groups. It can be downloaded at #
# #
# https://github.com/patchmemory/cvtracer #
# #
# Software designed and developed by Adam Patch and Yaouen Fily at Florida #
# Atlantic University. Began with github.com/vivekhsridhar/tracktor. #
# #
###############################################################################
In the cv-tracer package, one will find the modules TrAQ, Analysis, and GUI
These three modules provide necessary tools for different stages of tracking
birds-eye video of fish swimming in a tank, reviewing the results alongside
video to check for errors, and analyzing the results across trials. Scripts for executing all tasks for tracking can be found in scripts/track
subdirectory of each base module (e.g. TrAQ/scripts, Analysis/scripts). This document provides a basic overview of how to use this software and is
broken into three sections:
1. Tracing and processing tracks 2. Analyzing results across trials 3. Reviewing kinematics alongside video This software is designed in python with free libraries so that it may be
straightforwardly modified to incorporate more advanced methods of tracking
and analysis.
#############################
Tracing and processing tracks #############################
One can completely track and process a video trial, by executing the
following commands and providing relevant input parameters. > python prepare.py [input_video] -opts
> python trace.py [trial] -opts
> python process.py [trial] -opts
These each perform the following tasks:
prepare.py: Loads video for the first time and takes down information
about the run like the raw video file, the number of
individuals, the type of fish, the total length of the run,
and any other relevant input for characterizing the trial.
The script then generates a Trial object to store all of this
information. Once the trial object has been created, the script will
prompt the user to utilize a GUI to locate the tank edges and
store the result as a Tank object inside the trial object. A Group object (which contains Individual objects) within the
Trial object will also be generated to store and analyze data
at the time of tracing and processing. Finally, the script will generate a directory with a concise
name reflecting that of the original video file, moving that
file to this new directory as raw.mp4. The Trial object will
also be stored in this directory with the name trial.pik trace.py: Loads Trial object and utilizes Tracer and VideoCV objects to
track coordinates of fish throughout that trial. At each frame, Tracer will gather and sort the findings of
VideoCV in order to best trace the location of fish
throughout the run, ignoring fish misidentified outside of
the Tank, as identified in prepare.py. The resulting
coordinates are stored as Individuals in the Trial's Group. Trial object, now containing Tank, Group, and all relevant
trial-specific information, is again saved in the
trial-specific location, as found at the beginning of
tracing.
process.py: After the initial tracking has occurred, it is useful to now
better calculate kinematic quantities like velocity and
acceleration in both translational and rotational coordinates
(latter w.r.t. director angle). Using these quantities, it is then useful to provide some
initial statistical analysis without any cuts, for the sake
of quickly summarizing the behavior of fish in each run. With further development, this stage would also be the place
to fix errors in the initial tracks which may have issues
with occlusions and jumping points. At this point in time, it
only really makes sense to perhaps identify frames and points
of interest for the sake of troubleshooting in the future.
For our first paper, these issues are handled by simple
ad-hoc cuts which will be made to obviously erraneous data
during the next stage, Analysis, so that all Trials will be
treated uniformly.
###############################
Analyzing results across trials ###############################
Once the tracking of a set of trials is complete, one can run the following
command and relevant input parameters in order to analyze data given a set
of cuts. > python analyze.py [trial_list] -opts
While the analysis itself may be modified, this will perform a few basic
tasks regardless of the specific analysis.
analysis.py: First, all Trial objects will be loaded from their save
locations and stored in an Archive object. This object has
the ability to call functions on each trial (e.g. make a
consistent set of cuts) and to combine statistical results
across trials, storing results according to analysis-specific
cuts applied.
Once results have been computed and collected, they can be
combined and stored in the Archive object's result
dictionary. This allows easy access via the Archive object
later. Utilizing the Analysis.Plot module, one can efficiently plot
distributions and results for each trial and across trials.
Trial-specific results will be stored in the Trial's home
directory while the results across trials will be stored in
results/.
####################################
Reviewing kinematics alongside video ####################################
While one can, in principle, follow all of the above steps, it is always
useful to verify kinematic quantities being calculated correctly via some
kind of visual sanity check. The easiest way to do this is to utilize the
cvDataViewer, found in the GUI module. One can execute this GUI by simply > python GUI/cvDataViewer.py [trial_directory] -v cv.mp4
This will open a window containing a video of the tracked fish as well as a
side panel displaying time-dependent results of three quantities: distance
to the wall, speed, and angular speed. This tool facilitates checks on tracking throughout a run by allowing users
to see directly if quantities are being properly calculated across frames
of the video. A couple examples of how one might use this information...
One may find that the tracer is having trouble locating fish at every
frame, resulting in jumps from track-to-track. By viewing this in the
cvDataViewer, one may step back to the tracking stage and try using a
different set of contour-tracing parameters to better identify fish and
then go back to verify after a second round of tracking has completed.
Another may find that while the tracing has been done optimally, there
are still undesirable errors where fish appear to be jumping across the
tank or turning in an unphysical way. Despite the shortcomings of the
tracking software, this provides a basis for eliminating erroneous frames
by making cuts at the stage of Analysis, in order to consistently treat
systematic errors across runs. ############
Dependencies
############
The following python libraries are required for full functionality of
cv-tracer: - argparse
- copy
- matplotlib
- numpy
- opencv (cv2, which version?)
- pickle
- PyQt5
- pyqtgraph
- scikit-learn
- scipy

About

software for tracking and analyzing behavior of fish in groups

Topics

Resources

Stars

4 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

###############################################################################
# #
# This is the cv-tracer software package, designed for tracking and # # analyzing dynamics of fish swimming in groups. It can be downloaded at #
# #
# https://github.com/patchmemory/cvtracer #
# #
# Software designed and developed by Adam Patch and Yaouen Fily at Florida #
# Atlantic University. Began with github.com/vivekhsridhar/tracktor. #
# #
###############################################################################
In the cv-tracer package, one will find the modules TrAQ, Analysis, and GUI
These three modules provide necessary tools for different stages of tracking
birds-eye video of fish swimming in a tank, reviewing the results alongside
video to check for errors, and analyzing the results across trials. Scripts for executing all tasks for tracking can be found in scripts/track
subdirectory of each base module (e.g. TrAQ/scripts, Analysis/scripts). This document provides a basic overview of how to use this software and is
broken into three sections:
1. Tracing and processing tracks 2. Analyzing results across trials 3. Reviewing kinematics alongside video This software is designed in python with free libraries so that it may be
straightforwardly modified to incorporate more advanced methods of tracking
and analysis.
#############################
Tracing and processing tracks #############################
One can completely track and process a video trial, by executing the
following commands and providing relevant input parameters. > python prepare.py [input_video] -opts
> python trace.py [trial] -opts
> python process.py [trial] -opts
These each perform the following tasks:
prepare.py: Loads video for the first time and takes down information
about the run like the raw video file, the number of
individuals, the type of fish, the total length of the run,
and any other relevant input for characterizing the trial.
The script then generates a Trial object to store all of this
information. Once the trial object has been created, the script will
prompt the user to utilize a GUI to locate the tank edges and
store the result as a Tank object inside the trial object. A Group object (which contains Individual objects) within the
Trial object will also be generated to store and analyze data
at the time of tracing and processing. Finally, the script will generate a directory with a concise
name reflecting that of the original video file, moving that
file to this new directory as raw.mp4. The Trial object will
also be stored in this directory with the name trial.pik trace.py: Loads Trial object and utilizes Tracer and VideoCV objects to
track coordinates of fish throughout that trial. At each frame, Tracer will gather and sort the findings of
VideoCV in order to best trace the location of fish
throughout the run, ignoring fish misidentified outside of
the Tank, as identified in prepare.py. The resulting
coordinates are stored as Individuals in the Trial's Group. Trial object, now containing Tank, Group, and all relevant
trial-specific information, is again saved in the
trial-specific location, as found at the beginning of
tracing.
process.py: After the initial tracking has occurred, it is useful to now
better calculate kinematic quantities like velocity and
acceleration in both translational and rotational coordinates
(latter w.r.t. director angle). Using these quantities, it is then useful to provide some
initial statistical analysis without any cuts, for the sake
of quickly summarizing the behavior of fish in each run. With further development, this stage would also be the place
to fix errors in the initial tracks which may have issues
with occlusions and jumping points. At this point in time, it
only really makes sense to perhaps identify frames and points
of interest for the sake of troubleshooting in the future.
For our first paper, these issues are handled by simple
ad-hoc cuts which will be made to obviously erraneous data
during the next stage, Analysis, so that all Trials will be
treated uniformly.
###############################
Analyzing results across trials ###############################
Once the tracking of a set of trials is complete, one can run the following
command and relevant input parameters in order to analyze data given a set
of cuts. > python analyze.py [trial_list] -opts
While the analysis itself may be modified, this will perform a few basic
tasks regardless of the specific analysis.
analysis.py: First, all Trial objects will be loaded from their save
locations and stored in an Archive object. This object has
the ability to call functions on each trial (e.g. make a
consistent set of cuts) and to combine statistical results
across trials, storing results according to analysis-specific
cuts applied.
Once results have been computed and collected, they can be
combined and stored in the Archive object's result
dictionary. This allows easy access via the Archive object
later. Utilizing the Analysis.Plot module, one can efficiently plot
distributions and results for each trial and across trials.
Trial-specific results will be stored in the Trial's home
directory while the results across trials will be stored in
results/.
####################################
Reviewing kinematics alongside video ####################################
While one can, in principle, follow all of the above steps, it is always
useful to verify kinematic quantities being calculated correctly via some
kind of visual sanity check. The easiest way to do this is to utilize the
cvDataViewer, found in the GUI module. One can execute this GUI by simply > python GUI/cvDataViewer.py [trial_directory] -v cv.mp4
This will open a window containing a video of the tracked fish as well as a
side panel displaying time-dependent results of three quantities: distance
to the wall, speed, and angular speed. This tool facilitates checks on tracking throughout a run by allowing users
to see directly if quantities are being properly calculated across frames
of the video. A couple examples of how one might use this information...
One may find that the tracer is having trouble locating fish at every
frame, resulting in jumps from track-to-track. By viewing this in the
cvDataViewer, one may step back to the tracking stage and try using a
different set of contour-tracing parameters to better identify fish and
then go back to verify after a second round of tracking has completed.
Another may find that while the tracing has been done optimally, there
are still undesirable errors where fish appear to be jumping across the
tank or turning in an unphysical way. Despite the shortcomings of the
tracking software, this provides a basis for eliminating erroneous frames
by making cuts at the stage of Analysis, in order to consistently treat
systematic errors across runs. ############
Dependencies
############
The following python libraries are required for full functionality of
cv-tracer: - argparse
- copy
- matplotlib
- numpy
- opencv (cv2, which version?)
- pickle
- PyQt5
- pyqtgraph
- scikit-learn
- scipy

About

software for tracking and analyzing behavior of fish in groups

Topics

Resources

Stars

4 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

###############################################################################
# #
# This is the cv-tracer software package, designed for tracking and # # analyzing dynamics of fish swimming in groups. It can be downloaded at #
# #
# https://github.com/patchmemory/cvtracer #
# #
# Software designed and developed by Adam Patch and Yaouen Fily at Florida #
# Atlantic University. Began with github.com/vivekhsridhar/tracktor. #
# #
###############################################################################
In the cv-tracer package, one will find the modules TrAQ, Analysis, and GUI
These three modules provide necessary tools for different stages of tracking
birds-eye video of fish swimming in a tank, reviewing the results alongside
video to check for errors, and analyzing the results across trials. Scripts for executing all tasks for tracking can be found in scripts/track
subdirectory of each base module (e.g. TrAQ/scripts, Analysis/scripts). This document provides a basic overview of how to use this software and is
broken into three sections:
1. Tracing and processing tracks 2. Analyzing results across trials 3. Reviewing kinematics alongside video This software is designed in python with free libraries so that it may be
straightforwardly modified to incorporate more advanced methods of tracking
and analysis.
#############################
Tracing and processing tracks #############################
One can completely track and process a video trial, by executing the
following commands and providing relevant input parameters. > python prepare.py [input_video] -opts
> python trace.py [trial] -opts
> python process.py [trial] -opts
These each perform the following tasks:
prepare.py: Loads video for the first time and takes down information
about the run like the raw video file, the number of
individuals, the type of fish, the total length of the run,
and any other relevant input for characterizing the trial.
The script then generates a Trial object to store all of this
information. Once the trial object has been created, the script will
prompt the user to utilize a GUI to locate the tank edges and
store the result as a Tank object inside the trial object. A Group object (which contains Individual objects) within the
Trial object will also be generated to store and analyze data
at the time of tracing and processing. Finally, the script will generate a directory with a concise
name reflecting that of the original video file, moving that
file to this new directory as raw.mp4. The Trial object will
also be stored in this directory with the name trial.pik trace.py: Loads Trial object and utilizes Tracer and VideoCV objects to
track coordinates of fish throughout that trial. At each frame, Tracer will gather and sort the findings of
VideoCV in order to best trace the location of fish
throughout the run, ignoring fish misidentified outside of
the Tank, as identified in prepare.py. The resulting
coordinates are stored as Individuals in the Trial's Group. Trial object, now containing Tank, Group, and all relevant
trial-specific information, is again saved in the
trial-specific location, as found at the beginning of
tracing.
process.py: After the initial tracking has occurred, it is useful to now
better calculate kinematic quantities like velocity and
acceleration in both translational and rotational coordinates
(latter w.r.t. director angle). Using these quantities, it is then useful to provide some
initial statistical analysis without any cuts, for the sake
of quickly summarizing the behavior of fish in each run. With further development, this stage would also be the place
to fix errors in the initial tracks which may have issues
with occlusions and jumping points. At this point in time, it
only really makes sense to perhaps identify frames and points
of interest for the sake of troubleshooting in the future.
For our first paper, these issues are handled by simple
ad-hoc cuts which will be made to obviously erraneous data
during the next stage, Analysis, so that all Trials will be
treated uniformly.
###############################
Analyzing results across trials ###############################
Once the tracking of a set of trials is complete, one can run the following
command and relevant input parameters in order to analyze data given a set
of cuts. > python analyze.py [trial_list] -opts
While the analysis itself may be modified, this will perform a few basic
tasks regardless of the specific analysis.
analysis.py: First, all Trial objects will be loaded from their save
locations and stored in an Archive object. This object has
the ability to call functions on each trial (e.g. make a
consistent set of cuts) and to combine statistical results
across trials, storing results according to analysis-specific
cuts applied.
Once results have been computed and collected, they can be
combined and stored in the Archive object's result
dictionary. This allows easy access via the Archive object
later. Utilizing the Analysis.Plot module, one can efficiently plot
distributions and results for each trial and across trials.
Trial-specific results will be stored in the Trial's home
directory while the results across trials will be stored in
results/.
####################################
Reviewing kinematics alongside video ####################################
While one can, in principle, follow all of the above steps, it is always
useful to verify kinematic quantities being calculated correctly via some
kind of visual sanity check. The easiest way to do this is to utilize the
cvDataViewer, found in the GUI module. One can execute this GUI by simply > python GUI/cvDataViewer.py [trial_directory] -v cv.mp4
This will open a window containing a video of the tracked fish as well as a
side panel displaying time-dependent results of three quantities: distance
to the wall, speed, and angular speed. This tool facilitates checks on tracking throughout a run by allowing users
to see directly if quantities are being properly calculated across frames
of the video. A couple examples of how one might use this information...
One may find that the tracer is having trouble locating fish at every
frame, resulting in jumps from track-to-track. By viewing this in the
cvDataViewer, one may step back to the tracking stage and try using a
different set of contour-tracing parameters to better identify fish and
then go back to verify after a second round of tracking has completed.
Another may find that while the tracing has been done optimally, there
are still undesirable errors where fish appear to be jumping across the
tank or turning in an unphysical way. Despite the shortcomings of the
tracking software, this provides a basis for eliminating erroneous frames
by making cuts at the stage of Analysis, in order to consistently treat
systematic errors across runs. ############
Dependencies
############
The following python libraries are required for full functionality of
cv-tracer: - argparse
- copy
- matplotlib
- numpy
- opencv (cv2, which version?)
- pickle
- PyQt5
- pyqtgraph
- scikit-learn
- scipy

About

software for tracking and analyzing behavior of fish in groups

Topics

Resources

Stars

4 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

###############################################################################
# #
# This is the cv-tracer software package, designed for tracking and # # analyzing dynamics of fish swimming in groups. It can be downloaded at #
# #
# https://github.com/patchmemory/cvtracer #
# #
# Software designed and developed by Adam Patch and Yaouen Fily at Florida #
# Atlantic University. Began with github.com/vivekhsridhar/tracktor. #
# #
###############################################################################
In the cv-tracer package, one will find the modules TrAQ, Analysis, and GUI
These three modules provide necessary tools for different stages of tracking
birds-eye video of fish swimming in a tank, reviewing the results alongside
video to check for errors, and analyzing the results across trials. Scripts for executing all tasks for tracking can be found in scripts/track
subdirectory of each base module (e.g. TrAQ/scripts, Analysis/scripts). This document provides a basic overview of how to use this software and is
broken into three sections:
1. Tracing and processing tracks 2. Analyzing results across trials 3. Reviewing kinematics alongside video This software is designed in python with free libraries so that it may be
straightforwardly modified to incorporate more advanced methods of tracking
and analysis.
#############################
Tracing and processing tracks #############################
One can completely track and process a video trial, by executing the
following commands and providing relevant input parameters. > python prepare.py [input_video] -opts
> python trace.py [trial] -opts
> python process.py [trial] -opts
These each perform the following tasks:
prepare.py: Loads video for the first time and takes down information
about the run like the raw video file, the number of
individuals, the type of fish, the total length of the run,
and any other relevant input for characterizing the trial.
The script then generates a Trial object to store all of this
information. Once the trial object has been created, the script will
prompt the user to utilize a GUI to locate the tank edges and
store the result as a Tank object inside the trial object. A Group object (which contains Individual objects) within the
Trial object will also be generated to store and analyze data
at the time of tracing and processing. Finally, the script will generate a directory with a concise
name reflecting that of the original video file, moving that
file to this new directory as raw.mp4. The Trial object will
also be stored in this directory with the name trial.pik trace.py: Loads Trial object and utilizes Tracer and VideoCV objects to
track coordinates of fish throughout that trial. At each frame, Tracer will gather and sort the findings of
VideoCV in order to best trace the location of fish
throughout the run, ignoring fish misidentified outside of
the Tank, as identified in prepare.py. The resulting
coordinates are stored as Individuals in the Trial's Group. Trial object, now containing Tank, Group, and all relevant
trial-specific information, is again saved in the
trial-specific location, as found at the beginning of
tracing.
process.py: After the initial tracking has occurred, it is useful to now
better calculate kinematic quantities like velocity and
acceleration in both translational and rotational coordinates
(latter w.r.t. director angle). Using these quantities, it is then useful to provide some
initial statistical analysis without any cuts, for the sake
of quickly summarizing the behavior of fish in each run. With further development, this stage would also be the place
to fix errors in the initial tracks which may have issues
with occlusions and jumping points. At this point in time, it
only really makes sense to perhaps identify frames and points
of interest for the sake of troubleshooting in the future.
For our first paper, these issues are handled by simple
ad-hoc cuts which will be made to obviously erraneous data
during the next stage, Analysis, so that all Trials will be
treated uniformly.
###############################
Analyzing results across trials ###############################
Once the tracking of a set of trials is complete, one can run the following
command and relevant input parameters in order to analyze data given a set
of cuts. > python analyze.py [trial_list] -opts
While the analysis itself may be modified, this will perform a few basic
tasks regardless of the specific analysis.
analysis.py: First, all Trial objects will be loaded from their save
locations and stored in an Archive object. This object has
the ability to call functions on each trial (e.g. make a
consistent set of cuts) and to combine statistical results
across trials, storing results according to analysis-specific
cuts applied.
Once results have been computed and collected, they can be
combined and stored in the Archive object's result
dictionary. This allows easy access via the Archive object
later. Utilizing the Analysis.Plot module, one can efficiently plot
distributions and results for each trial and across trials.
Trial-specific results will be stored in the Trial's home
directory while the results across trials will be stored in
results/.
####################################
Reviewing kinematics alongside video ####################################
While one can, in principle, follow all of the above steps, it is always
useful to verify kinematic quantities being calculated correctly via some
kind of visual sanity check. The easiest way to do this is to utilize the
cvDataViewer, found in the GUI module. One can execute this GUI by simply > python GUI/cvDataViewer.py [trial_directory] -v cv.mp4
This will open a window containing a video of the tracked fish as well as a
side panel displaying time-dependent results of three quantities: distance
to the wall, speed, and angular speed. This tool facilitates checks on tracking throughout a run by allowing users
to see directly if quantities are being properly calculated across frames
of the video. A couple examples of how one might use this information...
One may find that the tracer is having trouble locating fish at every
frame, resulting in jumps from track-to-track. By viewing this in the
cvDataViewer, one may step back to the tracking stage and try using a
different set of contour-tracing parameters to better identify fish and
then go back to verify after a second round of tracking has completed.
Another may find that while the tracing has been done optimally, there
are still undesirable errors where fish appear to be jumping across the
tank or turning in an unphysical way. Despite the shortcomings of the
tracking software, this provides a basis for eliminating erroneous frames
by making cuts at the stage of Analysis, in order to consistently treat
systematic errors across runs. ############
Dependencies
############
The following python libraries are required for full functionality of
cv-tracer: - argparse
- copy
- matplotlib
- numpy
- opencv (cv2, which version?)
- pickle
- PyQt5
- pyqtgraph
- scikit-learn
- scipy

About

software for tracking and analyzing behavior of fish in groups

Topics

Resources

Stars

4 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages