From c6116f950efe4982a4cc7cb5decb46fbba6ef76e Mon Sep 17 00:00:00 2001 From: sronilsson Date: Fri, 6 Sep 2024 13:14:14 -0400 Subject: [PATCH] cuda docs --- docs/_static/img/slice_imgs_gpu.webm | Bin 0 -> 509958 bytes docs/tables/slice_imgs.csv | 9 + setup.py | 2 +- simba/data_processors/cuda/angle_3pt.py | 64 -- .../cuda/circular_statistics.py | 680 ------------------ simba/data_processors/cuda/convex_hull.py | 111 --- .../data_processors/cuda/convex_hull_area.py | 42 -- .../cuda/count_values_in_range.py | 53 -- .../cuda/create_average_cupy.py | 108 --- .../cuda/create_average_frame_cuda.py | 152 ---- simba/data_processors/cuda/create_shap_log.py | 154 ---- .../data_processors/cuda/direction_two_bps.py | 45 -- .../cuda/euclidan_distance_cuda.py | 52 -- .../cuda/euclidean_distances_cuda.py | 38 - simba/data_processors/cuda/image.py | 177 ++++- .../cuda/img_stack_brightness.py | 95 --- simba/data_processors/cuda/img_stack_mse.py | 106 --- .../cuda/imgs_to_grayscale_cupy.py | 44 -- .../cuda/imgs_to_greyscale_cuda.py | 53 -- .../data_processors/cuda/is_inside_circle.py | 39 - .../data_processors/cuda/is_inside_polygon.py | 65 -- .../cuda/is_inside_rectangle.py | 45 -- .../cuda/sliding_circular_hotspots.py | 55 -- .../cuda/sliding_circular_mean.py | 61 -- .../cuda/sliding_circular_range.py | 60 -- .../cuda/sliding_circular_std.py | 60 -- simba/data_processors/cuda/sliding_mean.py | 54 -- simba/data_processors/cuda/sliding_min.py | 52 -- .../cuda/sliding_rayleigh_z.py | 76 -- .../cuda/sliding_resultant_vector_length.py | 63 -- .../cuda/sliding_spearmans_rank.py | 67 -- simba/data_processors/cuda/sliding_std.py | 58 -- simba/data_processors/cuda/sliding_sum.py | 47 -- simba/mixins/geometry_mixin.py | 34 +- simba/mixins/image_mixin.py | 19 + simba/roi_tools/ROI_define.py | 23 +- simba/roi_tools/ROI_image.py | 87 +-- simba/roi_tools/ROI_size_calculations.py | 25 +- simba/utils/read_write.py | 69 +- 39 files changed, 324 insertions(+), 2720 deletions(-) create mode 100644 docs/_static/img/slice_imgs_gpu.webm create mode 100644 docs/tables/slice_imgs.csv delete mode 100644 simba/data_processors/cuda/angle_3pt.py delete mode 100644 simba/data_processors/cuda/circular_statistics.py delete mode 100644 simba/data_processors/cuda/convex_hull.py delete mode 100644 simba/data_processors/cuda/convex_hull_area.py delete mode 100644 simba/data_processors/cuda/count_values_in_range.py delete mode 100644 simba/data_processors/cuda/create_average_cupy.py delete mode 100644 simba/data_processors/cuda/create_average_frame_cuda.py delete mode 100644 simba/data_processors/cuda/create_shap_log.py delete mode 100644 simba/data_processors/cuda/direction_two_bps.py delete mode 100644 simba/data_processors/cuda/euclidan_distance_cuda.py delete mode 100644 simba/data_processors/cuda/euclidean_distances_cuda.py delete mode 100644 simba/data_processors/cuda/img_stack_brightness.py delete mode 100644 simba/data_processors/cuda/img_stack_mse.py delete mode 100644 simba/data_processors/cuda/imgs_to_grayscale_cupy.py delete mode 100644 simba/data_processors/cuda/imgs_to_greyscale_cuda.py delete mode 100644 simba/data_processors/cuda/is_inside_circle.py delete mode 100644 simba/data_processors/cuda/is_inside_polygon.py delete mode 100644 simba/data_processors/cuda/is_inside_rectangle.py delete mode 100644 simba/data_processors/cuda/sliding_circular_hotspots.py delete mode 100644 simba/data_processors/cuda/sliding_circular_mean.py delete mode 100644 simba/data_processors/cuda/sliding_circular_range.py delete mode 100644 simba/data_processors/cuda/sliding_circular_std.py delete mode 100644 simba/data_processors/cuda/sliding_mean.py delete mode 100644 simba/data_processors/cuda/sliding_min.py delete mode 100644 simba/data_processors/cuda/sliding_rayleigh_z.py delete mode 100644 simba/data_processors/cuda/sliding_resultant_vector_length.py delete mode 100644 simba/data_processors/cuda/sliding_spearmans_rank.py delete mode 100644 simba/data_processors/cuda/sliding_std.py delete mode 100644 simba/data_processors/cuda/sliding_sum.py diff --git a/docs/_static/img/slice_imgs_gpu.webm b/docs/_static/img/slice_imgs_gpu.webm new file mode 100644 index 0000000000000000000000000000000000000000..fa21da86645df5aa5187544f558892f4a5390544 GIT binary patch literal 509958 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

@F&{rIT&tM^~UD=CNKf7uTs2hYhg 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 z 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 x_dev.shape[0]: - return - if i < x_dev.shape[0]: - x_x, x_y = x_dev[i][0], x_dev[i][1] - y_x, y_y = y_dev[i][0], y_dev[i][1] - z_x, z_y = z_dev[i][0], z_dev[i][1] - D = math.degrees(math.atan2(z_y - y_y, z_x - y_x) - math.atan2(x_y - y_y, x_x - y_x)) - if D < 0: - D += 360 - results[i] = D - -def get_3pt_angle(x: np.ndarray, y: np.ndarray, z: np.ndarray) -> np.ndarray: - """ - Computes the angle formed by three points in 2D space for each corresponding row in the input arrays using - GPU. The points x, y, and z represent the coordinates of three points in space, and the angle is calculated - at point `y` between the line segments `xy` and `yz`. - - .. image:: _static/img/get_3pt_angle_cuda.png - :width: 500 - :align: center - - :param x: A numpy array of shape (n, 2) representing the first point (e.g., nose) coordinates. - :param y: A numpy array of shape (n, 2) representing the second point (e.g., center) coordinates, where the angle is computed. - :param z: A numpy array of shape (n, 2) representing the second point (e.g., center) coordinates, where the angle is computed. - :return: A numpy array of shape (n, 1) containing the calculated angles (in degrees) for each row. - - :example: - >>> video_path = r"/mnt/c/troubleshooting/mitra/project_folder/videos/501_MA142_Gi_CNO_0514.mp4" - >>> data_path = r"/mnt/c/troubleshooting/mitra/project_folder/csv/outlier_corrected_movement_location/501_MA142_Gi_CNO_0514 - test.csv" - >>> df = read_df(file_path=data_path, file_type='csv') - >>> y = df[['Center_x', 'Center_y']].values - >>> x = df[['Nose_x', 'Nose_y']].values - >>> z = df[['Tail_base_x', 'Tail_base_y']].values - >>> angle_x = get_3pt_angle(x=x, y=y, z=z) - """ - - - x = np.ascontiguousarray(x).astype(np.float32) - y = np.ascontiguousarray(y).astype(np.float32) - n, m = x.shape - x_dev = cuda.to_device(x) - y_dev = cuda.to_device(y) - z_dev = cuda.to_device(z) - results = cuda.device_array((n, m), dtype=np.int32) - bpg = (n + (THREADS_PER_BLOCK - 1)) // THREADS_PER_BLOCK - _get_3pt_angle_kernel[bpg, THREADS_PER_BLOCK](x_dev, y_dev, z_dev, results) - results = results.copy_to_host() - cuda.current_context().memory_manager.deallocations.clear() - return results diff --git a/simba/data_processors/cuda/circular_statistics.py b/simba/data_processors/cuda/circular_statistics.py deleted file mode 100644 index fccd5fe8d..000000000 --- a/simba/data_processors/cuda/circular_statistics.py +++ /dev/null @@ -1,680 +0,0 @@ -__author__ = "Simon Nilsson" -__email__ = "sronilsson@gmail.com" - -import math -from typing import Optional, Tuple - -try: - from typing import Literal -except: - from typing_extensions import Literal - -import numpy as np -from numba import cuda, int32 - -try: - import cupy as cp -except: - import numpy as cp - -from simba.utils.checks import check_float, check_int, check_valid_array -from simba.utils.enums import Formats - -THREADS_PER_BLOCK = 1024 - -@cuda.jit() -def _cuda_direction_from_two_bps(x, y, results): - i = cuda.grid(1) - if i > x.shape[0]: - return - else: - a = math.atan2(x[i][0] - y[i][0], y[i][1] - x[i][1]) * (180 / math.pi) - a = int32(a + 360 if a < 0 else a) - results[i] = a - - -def direction_from_two_bps(x: np.ndarray, y: np.ndarray) -> np.ndarray: - """ - Compute the directionality in degrees from two body-parts. E.g., ``nape`` and ``nose``, - or ``swim_bladder`` and ``tail`` with GPU acceleration. - - .. csv-table:: - :header: EXPECTED RUNTIMES - :file: ../../../docs/tables/direction_two_bps.csv - :widths: 10, 90 - :align: center - :header-rows: 1 - - .. seealso:: - For CPU function see :func:`~simba.mixins.circular_statistics.CircularStatisticsMixin.direction_two_bps`. - - :parameter np.ndarray x: Size len(frames) x 2 representing x and y coordinates for first body-part. - :parameter np.ndarray y: Size len(frames) x 2 representing x and y coordinates for second body-part. - :return: Frame-wise directionality in degrees. - :rtype: np.ndarray. - - """ - x = np.ascontiguousarray(x).astype(np.int32) - y = np.ascontiguousarray(y).astype(np.int32) - x_dev = cuda.to_device(x) - y_dev = cuda.to_device(y) - results = cuda.device_array((x.shape[0]), dtype=np.int32) - bpg = (x.shape[0] + (THREADS_PER_BLOCK - 1)) // THREADS_PER_BLOCK - _cuda_direction_from_two_bps[bpg, THREADS_PER_BLOCK](x_dev, y_dev, results) - results = results.copy_to_host() - return results - - -def sliding_circular_hotspots(x: np.ndarray, - time_window: float, - sample_rate: float, - bins: np.ndarray, - batch_size: Optional[int] = int(3.5e+7)) -> np.ndarray: - """ - Calculate the proportion of data points falling within specified circular bins over a sliding time window using GPU - - This function processes time series data representing angles (in degrees) and calculates the proportion of data - points within specified angular bins over a sliding window. The calculations are performed in batches to - accommodate large datasets efficiently. - - .. csv-table:: - :header: EXPECTED RUNTIMES - :file: ../../../docs/tables/sliding_circular_hotspots.csv - :widths: 10, 45, 45 - :align: center - :header-rows: 1 - - .. seealso:: - For CPU function see :func:`~simba.mixins.circular_statistics.CircularStatisticsMixin.sliding_circular_hotspots`. - - - :param np.ndarray x: The input time series data in degrees. Should be a 1D numpy array. - :param float time_window: The size of the sliding window in seconds. - :param float sample_rate: The sample rate of the time series data (i.e., hz, fps). - :param ndarray bins: 2D array of shape representing circular bins defining [start_degree, end_degree] inclusive. - :param Optional[int] batch_size: The size of each batch for processing the data. Default is 5e+7 (50m). - :return: A 2D numpy array where each row corresponds to a time point in `data`, and each column represents a circular bin. The values in the array represent the proportion of data points within each bin at each time point. The first column represents the first bin. - :rtype: np.ndarray - """ - - n = x.shape[0] - x = cp.asarray(x, dtype=cp.float16) - results = cp.full((x.shape[0], bins.shape[0]), dtype=cp.float16, fill_value=-1) - window_size = int(cp.ceil(time_window * sample_rate)) - for cnt, left in enumerate(range(0, n, batch_size)): - right = int(min(left + batch_size, n)) - if cnt > 0: - left = left - window_size + 1 - x_batch = x[left:right] - x_batch = cp.lib.stride_tricks.sliding_window_view(x_batch, window_size).astype(cp.float16) - batch_results = cp.full((x_batch.shape[0], bins.shape[0]), dtype=cp.float16, fill_value=-1) - for bin_cnt in range(bins.shape[0]): - if bins[bin_cnt][0] > bins[bin_cnt][1]: - mask = ((x_batch >= bins[bin_cnt][0]) & (x_batch <= 360)) | ((x_batch >= 0) & (x_batch <= bins[bin_cnt][1])) - else: - mask = (x_batch >= bins[bin_cnt][0]) & (x_batch <= bins[bin_cnt][1]) - count_per_row = cp.array(mask.sum(axis=1) / window_size).reshape(-1, ) - batch_results[:, bin_cnt] = count_per_row - results[left + window_size - 1:right, ] = batch_results - return results.get() - - - - -def sliding_circular_mean(x: np.ndarray, - time_window: float, - sample_rate: int, - batch_size: Optional[int] = 3e+7) -> np.ndarray: - - """ - Calculate the sliding circular mean over a time window for a series of angles. - - This function computes the circular mean of angles in the input array `x` over a specified sliding window. - The circular mean is a measure of the average direction for angles, which is especially useful for angular data - where traditional averaging would not be meaningful due to the circular nature of angles (e.g., 359° and 1° should average to 0°). - - The calculation is performed using a sliding window approach, where the circular mean is computed for each window - of angles. The function leverages GPU acceleration via CuPy for efficiency when processing large datasets. - - The circular mean :math:`\\mu` for a set of angles is calculated using the following formula: - - .. math:: - - \\mu = \\text{atan2}\\left(\\frac{1}{N} \\sum_{i=1}^{N} \\sin(\\theta_i), \\frac{1}{N} \\sum_{i=1}^{N} \\cos(\\theta_i)\\right) - - - :math:`\\theta_i` are the angles in radians within the sliding window - - :math:`N` is the number of samples in the window - - - .. csv-table:: - :header: EXPECTED RUNTIMES - :file: ../../../docs/tables/sliding_circular_mean.csv - :widths: 10, 45, 45 - :align: center - :header-rows: 1 - - .. seealso:: - For CPU function see :func:`~simba.mixins.circular_statistics.CircularStatisticsMixin.sliding_circular_mean`. - - :param np.ndarray x: Input array containing angle values in degrees. The array should be 1-dimensional. - :param float time_window: Time duration for the sliding window, in seconds. This determines the number of samples in each window based on the `sample_rate`. - :param int sample_rate: The number of samples per second (i.e., FPS). This is used to calculate the window size in terms of array indices. - :param Optional[int] batch_size: The maximum number of elements to process in each batch. This is used to handle large arrays by processing them in chunks to avoid memory overflow. Defaults to 3e+7 (30 million elements). - :return np.ndarray: A 1D numpy array of the same length as `x`, containing the circular mean for each sliding window. Values before the window is fully populated will be set to -1. - - :example: - >>> x = np.random.randint(0, 361, (i, )).astype(np.int32) - >>> results = sliding_circular_mean(x, 1, 10) - """ - - - window_size = np.ceil(time_window * sample_rate).astype(np.int64) - n = x.shape[0] - results = cp.full(x.shape[0], -1, dtype=np.int32) - for cnt, left in enumerate(range(0, int(n), int(batch_size))): - right = np.int32(min(left + batch_size, n)) - if cnt > 0: - left = left - window_size+1 - x_batch = cp.asarray(x[left:right]) - x_batch = cp.lib.stride_tricks.sliding_window_view(x_batch, window_size) - x_batch = np.deg2rad(x_batch) - cos, sin = cp.cos(x_batch).astype(np.float32), cp.sin(x_batch).astype(np.float32) - r = cp.rad2deg(cp.arctan2(cp.mean(sin, axis=1), cp.mean(cos, axis=1))) - r = cp.where(r < 0, r + 360, r) - results[left + window_size - 1:right] = r - return results.get() - - - -def sliding_circular_range(x: np.ndarray, - time_window: float, - sample_rate: float, - batch_size: Optional[int] = int(5e+7)) -> np.ndarray: - """ - Computes the sliding circular range of a time series data array using GPU. - - This function calculates the circular range of a time series data array using a sliding window approach. - The input data is assumed to be in degrees, and the function handles the circular nature of the data - by considering the circular distance between angles. - - .. math:: - - R = \\min \\left( \\text{max}(\\Delta \\theta) - \\text{min}(\\Delta \\theta), \\, 360 - \\text{max}(\\Delta \\theta) + \\text{min}(\\Delta \\theta) \\right) - - where: - - - :math:`\\Delta \\theta` is the difference between angles within the window, - - :math:`360` accounts for the circular nature of the data (i.e., wrap-around at 360 degrees). - - .. csv-table:: - :header: EXPECTED RUNTIMES - :file: ../../../docs/tables/sliding_circular_range.csv - :widths: 10, 45, 45 - :align: center - :header-rows: 1 - - .. seealso:: - For CPU function see :func:`~simba.mixins.circular_statistics.CircularStatisticsMixin.sliding_circular_range`. - - :param np.ndarray x: The input time series data in degrees. Should be a 1D numpy array. - :param float time_window: The size of the sliding window in seconds. - :param float sample_rate: The sample rate of the time series data (i.e., hz, fps). - :param Optional[int] batch_size: The size of each batch for processing the data. Default is 5e+7 (50m). - :return: A numpy array containing the sliding circular range values. - :rtype: np.ndarray - - :example: - >>> x = np.random.randint(0, 361, (19, )).astype(np.int32) - >>> p = sliding_circular_range(x, 1, 10) - """ - - n = x.shape[0] - x = cp.asarray(x, dtype=cp.float16) - results = cp.zeros_like(x, dtype=cp.int16) - x = cp.deg2rad(x).astype(cp.float16) - window_size = int(cp.ceil(time_window * sample_rate)) - for cnt, left in enumerate(range(0, n, batch_size)): - right = int(min(left + batch_size, n)) - if cnt > 0: - left = left - window_size + 1 - x_batch = x[left:right] - x_batch = cp.lib.stride_tricks.sliding_window_view(x_batch, window_size).astype(cp.float16) - x_batch = cp.sort(x_batch) - results[left + window_size - 1:right] = cp.abs(cp.rint(cp.rad2deg(cp.amin(cp.vstack([x_batch[:, -1] - x_batch[:, 0], 2 * cp.pi - cp.max(cp.diff(x_batch), axis=1)]).T, axis=1)))) - return results.get() - - - - -def sliding_circular_std(x: np.ndarray, - time_window: float, - sample_rate: float, - batch_size: Optional[int] = int(5e+7)) -> np.ndarray: - - """ - Calculate the sliding circular standard deviation of a time series data on GPU. - - This function computes the circular standard deviation over a sliding window for a given time series array. - The time series data is assumed to be in degrees, and the function converts it to radians for computation. - The sliding window approach is used to handle large datasets efficiently, processing the data in batches. - - The circular standard deviation (σ) is computed using the formula: - - .. math:: - - \sigma = \sqrt{-2 \cdot \log \left|\text{mean}\left(\exp(i \cdot x_{\text{batch}})\right)\right|} - - where :math:`x_{\text{batch}}` is the data within the current sliding window, and :math:`\text{mean}` and - :math:`\log` are computed in the circular (complex plane) domain. - - .. csv-table:: - :header: EXPECTED RUNTIMES - :file: ../../../docs/tables/sliding_circular_std.csv - :widths: 10, 45, 45 - :align: center - :header-rows: 1 - - .. seealso:: - For CPU function see :func:`~simba.mixins.circular_statistics.CircularStatisticsMixin.sliding_circular_std`. - - :param np.ndarray x: The input time series data in degrees. Should be a 1D numpy array. - :param float time_window: The size of the sliding window in seconds. - :param float sample_rate: The sample rate of the time series data (i.e., hz, fps). - :param Optional[int] batch_size: The size of each batch for processing the data. Default is 5e+7 (50m). - - :return: A numpy array containing the sliding circular standard deviation values. - :rtype: np.ndarray - """ - - - n = x.shape[0] - x = cp.asarray(x, dtype=cp.float16) - results = cp.zeros_like(x, dtype=cp.float16) - x = np.deg2rad(x).astype(cp.float16) - window_size = int(np.ceil(time_window * sample_rate)) - for cnt, left in enumerate(range(0, n, batch_size)): - right = int(min(left + batch_size, n)) - if cnt > 0: - left = left - window_size + 1 - x_batch = x[left:right] - x_batch = cp.lib.stride_tricks.sliding_window_view(x_batch, window_size).astype(cp.float16) - m = cp.log(cp.abs(cp.mean(cp.exp(1j * x_batch), axis=1))) - stdev = cp.rad2deg(cp.sqrt(-2 * m)) - results[left + window_size - 1:right] = stdev - - return results.get() - - -def sliding_rayleigh_z(x: np.ndarray, - time_window: float, - sample_rate: float, - batch_size: Optional[int] = int(5e+7)) -> Tuple[np.ndarray, np.ndarray]: - - """ - Computes the Rayleigh Z-statistic over a sliding window for a given time series of angles - - This function calculates the Rayleigh Z-statistic, which tests the null hypothesis that the population of angles - is uniformly distributed around the circle. The calculation is performed over a sliding window across the input - time series, and results are computed in batches for memory efficiency. - - Data is processed using GPU acceleration via CuPy, which allows for faster computation compared to a CPU-based approach. - - .. note:: - Adapted from ``pingouin.circular.circ_rayleigh`` and ``pycircstat.tests.rayleigh``. - - - **Rayleigh Z-statistic:** - - The Rayleigh Z-statistic is given by: - - .. math:: - - R = \frac{1}{n} \sqrt{\left(\sum_{i=1}^{n} \cos(\theta_i)\right)^2 + \left(\sum_{i=1}^{n} \sin(\theta_i)\right)^2} - - where: - - :math:`\theta_i` are the angles in the window. - - :math:`n` is the number of angles in the window. - - - .. csv-table:: - :header: EXPECTED RUNTIMES - :file: ../../../docs/tables/sliding_rayleigh_z.csv - :widths: 10, 45, 45 - :align: center - :header-rows: 1 - - .. seealso:: - For CPU function see :func:`~simba.mixins.circular_statistics.CircularStatisticsMixin.sliding_rayleigh_z`. - - - :param np.ndarray x: Input array of angles in degrees. Should be a 1D numpy array. - :param float time_window: The size of the sliding window in time units (e.g., seconds). - :param float sample_rate: The sampling rate of the input time series in samples per time unit (e.g., Hz, fps). - :param Optional[int] batch_size: The number of samples to process in each batch. Default is 5e7 (50m). Reducing this value may save memory at the cost of longer computation time. - :return: - A tuple containing two numpy arrays: - - **z_results**: Rayleigh Z-statistics for each position in the input array where the window was fully applied. - - **p_results**: Corresponding p-values for the Rayleigh Z-statistics. - :rtype: Tuple[np.ndarray, np.ndarray] - """ - - n = x.shape[0] - x = cp.asarray(x, dtype=cp.float16) - z_results = cp.zeros_like(x, dtype=cp.float16) - p_results = cp.zeros_like(x, dtype=cp.float16) - x = np.deg2rad(x).astype(cp.float16) - window_size = int(np.ceil(time_window * sample_rate)) - for cnt, left in enumerate(range(0, n, batch_size)): - right = int(min(left + batch_size, n)) - if cnt > 0: - left = left - window_size + 1 - x_batch = x[left:right] - x_batch = cp.lib.stride_tricks.sliding_window_view(x_batch, window_size).astype(cp.float16) - cos_sums = cp.nansum(cp.cos(x_batch), axis=1) ** 2 - sin_sums = cp.nansum(cp.sin(x_batch), axis=1) ** 2 - R = cp.sqrt(cos_sums + sin_sums) / window_size - Z = window_size * (R**2) - P = cp.exp(np.sqrt(1 + 4 * window_size + 4 * (window_size ** 2 - R ** 2)) - (1 + 2 * window_size)) - z_results[left + window_size - 1:right] = Z - p_results[left + window_size - 1:right] = P - - return z_results.get(), p_results.get() - - -def sliding_resultant_vector_length(x: np.ndarray, - time_window: float, - sample_rate: int, - batch_size: Optional[int] = 3e+7) -> np.ndarray: - - """ - Calculate the sliding resultant vector length over a time window for a series of angles. - - This function computes the resultant vector length (R) for each window of angles in the input array `x`. - The resultant vector length is a measure of the concentration of angles, and it ranges from 0 to 1, where 1 - indicates all angles point in the same direction, and 0 indicates uniform distribution of angles. - - For a given sliding window of angles, the resultant vector length :math:`R` is calculated using the following formula: - - .. math:: - - R = \\frac{1}{N} \\sqrt{\\left(\\sum_{i=1}^{N} \\cos(\\theta_i)\\right)^2 + \\left(\\sum_{i=1}^{N} \\sin(\\theta_i)\\right)^2} - - where: - - - :math:`\\theta_i` are the angles in radians within the sliding window - - :math:`N` is the number of samples in the window - - The computation is performed in a sliding window manner over the entire array, utilizing GPU acceleration - with CuPy for efficiency, especially on large datasets. - - - .. csv-table:: - :header: EXPECTED RUNTIMES - :file: ../../../docs/tables/sliding_resultant_vector_length.csv - :widths: 10, 10, 80 - :align: center - :header-rows: 1 - - .. seealso:: - For CPU function see :func:`~simba.mixins.circular_statistics.CircularStatisticsMixin.sliding_resultant_vector_length`. - - :param np.ndarray x: Input array containing angle values in degrees. The array should be 1-dimensional. - :param float time_window: Time duration for the sliding window, in seconds. This determines the number of samples in each window based on the `sample_rate`. - :param int sample_rate: The number of samples per second (i.e., FPS). This is used to calculate the window size in terms of array indices. - :param Optional[int] batch_size: The maximum number of elements to process in each batch. This is used to handle large arrays by processing them in chunks to avoid memory overflow. Defaults to 3e+7 (30 million elements). - :return np.ndarray: A 1D numpy array of the same length as `x`, containing the resultant vector length for each sliding window. Values before the window is fully populated will be set to -1. - - :example: - >>> x = np.random.randint(0, 361, (5000, )).astype(np.int32) - >>> results = sliding_resultant_vector_length(x, 1, 10) - """ - - window_size = np.ceil(time_window * sample_rate).astype(np.int64) - n = x.shape[0] - results = cp.full(x.shape[0], -1, dtype=np.float32) - for cnt, left in enumerate(range(0, int(n), int(batch_size))): - right = np.int32(min(left + batch_size, n)) - if cnt > 0: - left = left - window_size+1 - x_batch = cp.asarray(x[left:right]) - x_batch = cp.lib.stride_tricks.sliding_window_view(x_batch, window_size) - x_batch = np.deg2rad(x_batch) - cos, sin = cp.cos(x_batch).astype(np.float32), cp.sin(x_batch).astype(np.float32) - cos_sum, sin_sum = cp.sum(cos, axis=1), cp.sum(sin, axis=1) - r = np.sqrt(cos_sum ** 2 + sin_sum ** 2) / window_size - results[left+window_size-1:right] = r - return results.get() - - -def direction_from_three_bps(x: np.ndarray, - y: np.ndarray, - z: np.ndarray, - batch_size: Optional[int] = int(1.5e+7)) -> np.ndarray: - - """ - Calculate the direction angle based on the coordinates of three body points using GPU acceleration. - - This function computes the mean direction angle (in degrees) for a batch of coordinates - provided in the form of NumPy arrays. The calculation is based on the arctangent of the - difference in x and y coordinates between pairs of points. The result is a value in - the range [0, 360) degrees. - - .. seealso:: - :func:`simba.mixins.circular_statistics.CircularStatisticsMixin.direction_three_bps` - - :param np.ndarray x: A 2D array of shape (N, 2) containing the x-coordinates of the first body part (nose) - :param np.ndarray y: A 2D array of shape (N, 2) containing the coordinates of the second body part (left ear). - :param np.ndarray z: A 2D array of shape (N, 2) containing the coordinates of the second body part (right ear). - :param Optional[int] batch_size: The size of the batch to be processed in each iteration. Default is 15 million. - :return: An array of shape (N,) containing the computed direction angles in degrees. - :rtype np.ndarray: - """ - - check_valid_array(data=x, source=direction_from_three_bps.__name__, accepted_ndims=(2,), accepted_dtypes=Formats.NUMERIC_DTYPES.value) - check_valid_array(data=y, source=direction_from_three_bps.__name__, accepted_shapes=(x.shape,), accepted_dtypes=Formats.NUMERIC_DTYPES.value) - check_valid_array(data=z, source=direction_from_three_bps.__name__, accepted_shapes=(x.shape,), accepted_dtypes=Formats.NUMERIC_DTYPES.value) - check_int(value=batch_size, name=direction_from_three_bps.__name__, min_value=1) - results = cp.full((x.shape[0]), fill_value=-1, dtype=np.int16) - - for l in range(0, x.shape[0], batch_size): - r = l + batch_size - x_batch = cp.array(x[l:r]) - y_batch = cp.array(y[l:r]) - z_batch = cp.array(z[l:r]) - left_ear_to_nose = cp.arctan2(x_batch[:, 0] - y_batch[:, 0], y_batch[:, 1] - x_batch[:,1]) - right_ear_nose = cp.arctan2(x_batch[:, 0] - z_batch[:, 0], z_batch[:, 1] - x_batch[:, 1]) - mean_angle_rad = cp.arctan2(cp.sin(left_ear_to_nose) + cp.sin(right_ear_nose), cp.cos(left_ear_to_nose) + cp.cos(right_ear_nose)) - results[l:r] = (cp.degrees(mean_angle_rad) + 360) % 360 - - return results.get() - - -@cuda.jit() -def _instantaneous_angular_velocity(x, stride, results): - r = cuda.grid(1) - l = np.int32(r - (stride[0])) - if (r > results.shape[0]) or (l < 0): - results[r] = -1 - else: - d = math.pi - (abs(math.pi - abs(x[l] - x[r]))) - results[r] = d * (180 / math.pi) - - -def instantaneous_angular_velocity(x: np.ndarray, stride: Optional[int] = 1) -> np.ndarray: - """ - Calculate the instantaneous angular velocity between angles in a given array. - - This function uses CUDA to perform parallel computations on the GPU. - - The angular velocity is computed using the difference in angles between - the current and previous values (with a specified stride) in the array. - The result is returned in degrees per unit time. - - .. csv-table:: - :header: EXPECTED RUNTIMES - :file: ../../../docs/tables/instantaneous_angular_velocity.csv - :widths: 10, 90 - :align: center - :header-rows: 1 - - .. math:: - \omega = \frac{{\Delta \theta}}{{\Delta t}} = \frac{{180}}{{\pi}} \times \left( \pi - \left| \pi - \left| \theta_r - \theta_l \right| \right| \right) - - where: - - \( \theta_r \) is the current angle. - - \( \theta_l \) is the angle at the specified stride before the current angle. - - \( \Delta t \) is the time difference between the two angles. - - - .. seealso:: - :func:`simba.mixins.circular_statistics.CircularStatisticsMixin.instantaneous_angular_velocity` - - :param np.ndarray x: Array of angles in degrees, for which the instantaneous angular velocity will be calculated. - :param Optional[int] stride: The stride or lag (in frames) to use when calculating the difference in angles. Defaults to 1. - :return: Array of instantaneous angular velocities corresponding to the input angles. Velocities are in degrees per unit time. - :rtype: np.ndarray - """ - - x = np.deg2rad(x).astype(np.int16) - stride = np.array([stride]).astype(np.int64) - bpg = (x.shape[0] + (THREADS_PER_BLOCK - 1)) // THREADS_PER_BLOCK - x_dev = cuda.to_device(x) - stride_dev = cuda.to_device(stride) - results = cuda.device_array(x.shape[0], dtype=np.float32) - _instantaneous_angular_velocity[bpg, THREADS_PER_BLOCK](x_dev, stride_dev, results) - return results.copy_to_host() - - -@cuda.jit(device=True) -def _rad2deg(x): - return x * (180/math.pi) - - -@cuda.jit() -def _sliding_bearing(x, stride, results): - r = cuda.grid(1) - l = np.int32(r - (stride[0])) - if (r > results.shape[0]-1) or (l < 0): - results[r] = -1 - else: - x1, y1 = x[l, 0], x[l, 1] - x2, y2 = x[r, 0], x[r, 1] - bearing = _rad2deg(math.atan2(x2 - x1, y2 - y1)) - results[r] = (bearing + 360) % 360 - - -def sliding_bearing(x: np.ndarray, - stride: Optional[float] = 1, - sample_rate: Optional[float] = 1) -> np.ndarray: - """ - Compute the bearing between consecutive points in a 2D coordinate array using a sliding window approach using GPU acceleration. - - This function calculates the angle (bearing) in degrees between each point and a point a certain number of - steps ahead (defined by `stride`) in the 2D coordinate array `x`. The bearing is calculated using the - arctangent of the difference in coordinates, converted from radians to degrees. - - .. csv-table:: - :header: EXPECTED RUNTIMES - :file: ../../../docs/tables/sliding_bearing.csv - :widths: 10, 90 - :align: center - :header-rows: 1 - - .. seealso:: - :func:`simba.mixins.circular_statistics.CircularStatisticsMixin.sliding_bearing` - - :param np.ndarray x: A 2D array of shape `(n, 2)` where each row represents a point with `x` and `y` coordinates. The array must be numeric. - :param Optional[float] stride: The time (multiplied by `sample_rate`) to look ahead when computing the bearing in seconds. Defaults to 1. - :param Optional[float] sample_rate: A multiplier applied to the `stride` value to determine the actual step size for calculating the bearing. E.g., frames per second. Defaults to 1. If the resulting stride is less than 1, it is automatically set to 1. - :return:A 1D array of shape `(n,)` containing the calculated bearings in degrees. Values outside the valid range (i.e., where the stride exceeds array bounds) are set to -1. - :rtype: np.ndarray - """ - - check_valid_array(data=x, source=f'{sliding_bearing.__name__} x', accepted_ndims=(2,), accepted_axis_1_shape=(2,), accepted_dtypes=Formats.NUMERIC_DTYPES.value) - check_float(name=f'{sliding_bearing.__name__} stride', value=stride, min_value=10e-6, max_value=x.shape[0]-1) - check_float(name=f'{sliding_bearing.__name__} sample_rate', value=sample_rate, min_value=10e-6, max_value=x.shape[0]-1) - stride = int(stride * sample_rate) - if stride < 1: - stride = 1 - stride = np.array([stride]).astype(np.int64) - bpg = (x.shape[0] + (THREADS_PER_BLOCK - 1)) // THREADS_PER_BLOCK - x_dev = cuda.to_device(x) - stride_dev = cuda.to_device(stride) - results = cuda.device_array(x.shape[0], dtype=np.float32) - _sliding_bearing[bpg, THREADS_PER_BLOCK](x_dev, stride_dev, results) - return results.copy_to_host() - - -@cuda.jit(device=True) -def _rad2deg(x): - return x * (180 / math.pi) - - -@cuda.jit() -def _sliding_angular_diff(data, strides, results): - x, y = cuda.grid(2) - if (x > data.shape[0] - 1) or (y > strides.shape[0] - 1): - return - else: - stride = int(strides[y]) - if x - stride < 0: - return - a_2 = data[x] - a_1 = data[x - stride] - distance = math.pi - abs(math.pi - abs(a_1 - a_2)) - distance = abs(int(_rad2deg(distance)) + 1) - results[x][y] = distance - - -def sliding_angular_diff(x: np.ndarray, - time_windows: np.ndarray, - fps: float) -> np.ndarray: - """ - Calculate the sliding angular differences for a given time window using GPU acceleration. - - - This function computes the angular differences between each angle in `x` - and the corresponding angle located at a distance determined by the time window - and frame rate (fps). The results are returned as a 2D array where each row corresponds - to a position in `x`, and each column corresponds to a different time window. - - .. csv-table:: - :header: EXPECTED RUNTIMES - :file: ../../../docs/tables/sliding_angular_diff.csv - :widths: 10, 90 - :align: center - :header-rows: 1 - - - .. seealso:: - :func:`simba.mixins.circular_statistics.CircularStatisticsMixin.sliding_angular_diff` - - .. math:: - \text{difference} = \pi - |\pi - |a_1 - a_2|| - - Where: - - \( a_1 \) is the angle at position `x`. - - \( a_2 \) is the angle at position `x - \text{stride}`. - - :param np.ndarray x: 1D array of angles in degrees. - :param np.ndarray time_windows: 1D array of time windows in seconds to determine the stride (distance in frames) between angles. - :param float fps: Frame rate (frames per second) used to convert time windows to strides. - :return: 2D array of angular differences. Each row corresponds to an angle in `x`, and each column corresponds to a time window. - :rtype: np.ndarray - """ - - x = np.deg2rad(x) - strides = np.zeros(time_windows.shape[0]) - for i in range(time_windows.shape[0]): - strides[i] = np.ceil(time_windows[i] * fps).astype(np.int32) - x_dev = cuda.to_device(x) - stride_dev = cuda.to_device(strides) - results = cuda.device_array((x.shape[0], time_windows.shape[0])) - grid_x = (x.shape[0] + THREADS_PER_BLOCK - 1) // THREADS_PER_BLOCK - grid_y = (strides.shape[0] + THREADS_PER_BLOCK - 1) - blocks_per_grid = (grid_x, grid_y) - _sliding_angular_diff[blocks_per_grid, THREADS_PER_BLOCK](x_dev, stride_dev, results) - results = results.copy_to_host().astype(np.int32) - return results - - diff --git a/simba/data_processors/cuda/convex_hull.py b/simba/data_processors/cuda/convex_hull.py deleted file mode 100644 index ba56f8f89..000000000 --- a/simba/data_processors/cuda/convex_hull.py +++ /dev/null @@ -1,111 +0,0 @@ -__author__ = "Simon Nilsson" -__email__ = "sronilsson@gmail.com" - -import numpy as np -from numba import cuda, njit - -THREADS_PER_BLOCK = 128 - -@cuda.jit(device=True) -def _cross_test(x, y, x1, y1, x2, y2): - """Cross product test for determining whether left of line.""" - cross = (x - x1) * (y2 - y1) - (y - y1) * (x2 - x1) - return cross < 0 - -@cuda.jit -def _convex_hull_kernel(pts: np.ndarray, results: np.ndarray) -> np.ndarray: - """ - CUDA kernel for the Jarvis March algorithm. - - .. note:: - `Modified from Jacob Hultman `_ - - :param pts: M x N x 2 array where M is the number of frames, N is the number of body-parts, and 2 representing the x and y coordinates of the body-parts. - :param results: M x N array where M is the number of frames, and N is the indexes of the body-parts belonging to the hull. If -1, the body-part does not belong to the hull. - """ - row = cuda.grid(1) - if row >= pts.shape[0]: - return - - point_on_hull = 0 - min_x = pts[row, 0, 0] - for j in range(pts.shape[1]): - x = pts[row, j, 0] - if x < min_x: - min_x = x - point_on_hull = j - startpoint = point_on_hull - count = 0 - while True: - results[row, count] = point_on_hull - count += 1 - endpoint = 0 - for j in range(pts.shape[1]): - if endpoint == point_on_hull: - endpoint = j - elif _cross_test( - pts[row, j, 0], - pts[row, j, 1], - pts[row, point_on_hull, 0], - pts[row, point_on_hull, 1], - pts[row, endpoint, 0], - pts[row, endpoint, 1], - ): - endpoint = j - point_on_hull = endpoint - if endpoint == startpoint: - break - for j in range(count, pts.shape[1], 1): - results[row, j] = -1 - - -#@jit(nopython=True) -@njit("(int32[:, :, :], int32[:, :])") -def _slice_hull_idx(points: np.ndarray, point_idx: np.ndarray): - results = np.zeros_like(points) - for i in range(point_idx.shape[0]): - results[i] = points[i][point_idx[i]] - return results - - -def get_convex_hull(pts: np.ndarray) -> np.ndarray: - """ - Compute the convex hull for each set of 2D points in parallel using CUDA and the Jarvis March algorithm. - - This function processes a batch of 2D point sets (frames) and computes the convex hull for each set. The convex hull of a set of points is the smallest convex polygon that contains all the points. - - The function uses a variant of the Gift Wrapping algorithm (Jarvis March) to compute the convex hull. It finds the leftmost point, then iteratively determines the next point on the hull by checking the orientation of the remaining points. The results are stored in the `results` array, where each row corresponds to a frame and contains the indices of the points forming the convex hull. Points not on the hull are marked with `-1`. - - - .. image:: _static/img/get_convex_hull_cuda.png - :width: 300 - :align: center - - .. note:: - `Modified from Jacob Hultman `_ - - :param pts: A 3D numpy array of shape (M, N, 2) where: - - M is the number of frames. - - N is the number of points (body-parts) in each frame. - - The last dimension (2) represents the x and y coordinates of each point. - - :return: An upated 3D numpy array of shape (M, N, 2) consisting of the points in the hull. - - - :example: - >>> video_path = r"/mnt/c/troubleshooting/mitra/project_folder/videos/501_MA142_Gi_CNO_0514.mp4" - >>> data_path = r"/mnt/c/troubleshooting/mitra/project_folder/csv/outlier_corrected_movement_location/501_MA142_Gi_CNO_0514 - test.csv" - >>> df = read_df(file_path=data_path, file_type='csv') - >>> frame_data = df.values.reshape(len(df), -1, 2) - >>> x = get_convex_hull(frame_data) - """ - - pts = np.ascontiguousarray(pts).astype(np.int32) - n, m, _ = pts.shape - bpg = (n + (THREADS_PER_BLOCK - 1)) // THREADS_PER_BLOCK - pts_dev = cuda.to_device(pts) - results = cuda.device_array((n, m), dtype=np.int32) - _convex_hull_kernel[bpg, THREADS_PER_BLOCK](pts_dev, results) - hull = results.copy_to_host().astype(np.int32) - hull = _slice_hull_idx(pts, hull) - return hull diff --git a/simba/data_processors/cuda/convex_hull_area.py b/simba/data_processors/cuda/convex_hull_area.py deleted file mode 100644 index 44fd775f2..000000000 --- a/simba/data_processors/cuda/convex_hull_area.py +++ /dev/null @@ -1,42 +0,0 @@ -from typing import Optional - -import cupy as cp -import numpy as np - -from simba.utils.checks import check_float, check_valid_array -from simba.utils.enums import Formats - - -def poly_area(data: np.ndarray, - pixels_per_mm: Optional[float] = 1.0, - batch_size: Optional[int] = int(0.5e+7)) -> np.ndarray: - - """ - Compute the area of a polygon using GPU acceleration. - - This function calculates the area of polygons defined by sets of points in a 3D array. - Each 2D slice along the first dimension represents a polygon, with each row corresponding - to a point in the polygon and each column representing the x and y coordinates. - - The computation is done in batches to handle large datasets efficiently. - - :param data: A 3D numpy array of shape (N, M, 2), where N is the number of polygons, M is the number of points per polygon, and 2 represents the x and y coordinates. - :param pixels_per_mm: Optional scaling factor to convert the area from pixels squared to square millimeters. Default is 1.0. - :param batch_size: Optional batch size for processing the data in chunks to fit in memory. Default is 0.5e+7. - :return: A 1D numpy array of shape (N,) containing the computed area of each polygon in square millimeters. - """ - - check_valid_array(data=data, source=f'{poly_area} data', accepted_ndims=(3,), accepted_dtypes=Formats.NUMERIC_DTYPES.value) - check_float(name=f'{poly_area} pixels_per_mm', min_value=10e-16, value=pixels_per_mm) - results = cp.full((data.shape[0]), fill_value=cp.nan, dtype=cp.int32) - for l in range(0, data.shape[0], batch_size): - r = l + batch_size - x = cp.asarray(data[l:r, :, 0]) - y = cp.asarray(data[l:r, :, 1]) - x_r = cp.roll(x, shift=1, axis=1) - y_r = cp.roll(y, shift=1, axis=1) - dot_xy_roll_y = cp.sum(x * y_r, axis=1) - dot_y_roll_x = cp.sum(y * x_r, axis=1) - results[l:r] = (0.5 * cp.abs(dot_xy_roll_y - dot_y_roll_x)) / pixels_per_mm - - return results.get() diff --git a/simba/data_processors/cuda/count_values_in_range.py b/simba/data_processors/cuda/count_values_in_range.py deleted file mode 100644 index c17c7e2f5..000000000 --- a/simba/data_processors/cuda/count_values_in_range.py +++ /dev/null @@ -1,53 +0,0 @@ -__author__ = "Simon Nilsson" -__email__ = "sronilsson@gmail.com" - - -import numpy as np -from numba import cuda - -THREADS_PER_BLOCK = 256 - -@cuda.jit -def _get_values_in_range_kernel(values, ranges, results): - i = cuda.grid(1) - if i >= values.shape[0]: - return - v = values[i] - for j in range(ranges.shape[0]): - l, u = ranges[j][0], ranges[j][1] - cnt = 0 - for k in v: - if k <= u and k >= l: - cnt += 1 - results[i, j] = cnt - - -def count_values_in_ranges(x: np.ndarray, r: np.ndarray) -> np.ndarray: - """ - Counts the number of values in each feature within specified ranges for each row in a 2D array using CUDA. - - .. image:: _static/img/get_euclidean_distance_cuda.png - :width: 500 - :align: center - - :param np.ndarray x: 2d array with feature values. - :param np.ndarray r: 2d array with lower and upper boundaries. - :return np.ndarray: 2d array of size len(x) x len(r) with the counts of values in each feature range (inclusive). - - :example: - >>> x = np.random.randint(1, 11, (10, 10)).astype(np.int8) - >>> r = np.array([[1, 6], [6, 11]]) - >>> r_x = count_values_in_ranges(x=x, r=r) - """ - - x = np.ascontiguousarray(x).astype(np.float32) - r = np.ascontiguousarray(r).astype(np.float32) - n, m = x.shape[0], r.shape[0] - values_dev = cuda.to_device(x) - ranges_dev = cuda.to_device(r) - results = cuda.device_array((n, m), dtype=np.int32) - bpg = (n + (THREADS_PER_BLOCK - 1)) // THREADS_PER_BLOCK - _get_values_in_range_kernel[bpg, THREADS_PER_BLOCK](values_dev, ranges_dev, results) - results = results.copy_to_host() - cuda.current_context().memory_manager.deallocations.clear() - return results \ No newline at end of file diff --git a/simba/data_processors/cuda/create_average_cupy.py b/simba/data_processors/cuda/create_average_cupy.py deleted file mode 100644 index 409473653..000000000 --- a/simba/data_processors/cuda/create_average_cupy.py +++ /dev/null @@ -1,108 +0,0 @@ -__author__ = "Simon Nilsson" -__email__ = "sronilsson@gmail.com" - - -import os -from typing import Optional, Union - -import cupy as cp -import cv2 -import numpy as np - -from simba.utils.checks import (check_file_exist_and_readable, - check_if_dir_exists, - check_if_string_value_is_valid_video_timestamp, - check_int, check_nvidea_gpu_available, - check_that_hhmmss_start_is_before_end) -from simba.utils.data import find_frame_numbers_from_time_stamp -from simba.utils.errors import FFMPEGCodecGPUError, InvalidInputError -from simba.utils.printing import stdout_success -from simba.utils.read_write import ( - check_if_hhmmss_timestamp_is_valid_part_of_video, get_fn_ext, - get_video_meta_data, read_img_batch_from_video_gpu) - - -def create_average_frm(video_path: Union[str, os.PathLike], - start_frm: Optional[int] = None, - end_frm: Optional[int] = None, - start_time: Optional[str] = None, - end_time: Optional[str] = None, - save_path: Optional[Union[str, os.PathLike]] = None, - batch_size: Optional[int] = 3000, - verbose: Optional[bool] = False) -> Union[None, np.ndarray]: - - """ - Computes the average frame using GPU acceleration from a specified range of frames or time interval in a video file. - This average frame typically used for background substraction. - - The function reads frames from the video, calculates their average, and optionally saves the result - to a specified file. If `save_path` is provided, the average frame is saved as an image file; - otherwise, the average frame is returned as a NumPy array. - - - :param Union[str, os.PathLike] video_path: The path to the video file from which to extract frames. - :param Optional[int] start_frm: The starting frame number (inclusive). Either `start_frm`/`end_frm` or `start_time`/`end_time` must be provided, but not both. - :param Optional[int] end_frm: The ending frame number (exclusive). - :param Optional[str] start_time: The start time in the format 'HH:MM:SS' from which to begin extracting frames. - :param Optional[str] end_time: The end time in the format 'HH:MM:SS' up to which frames should be extracted. - :param Optional[Union[str, os.PathLike]] save_path: The path where the average frame image will be saved. If `None`, the average frame is returned as a NumPy array. - :param Optional[int] batch_size: The number of frames to process in each batch. Default is 3000. Increase if your RAM allows it. - :param Optional[bool] verbose: If `True`, prints progress and informational messages during execution. - :return: Returns `None` if the result is saved to `save_path`. Otherwise, returns the average frame as a NumPy array. - - :example: - >>> create_average_frm(video_path=r"C:\troubleshooting\RAT_NOR\project_folder\videos\2022-06-20_NOB_DOT_4_downsampled.mp4", verbose=True, start_frm=0, end_frm=9000) - """ - - def average_3d_stack(image_stack: np.ndarray) -> np.ndarray: - num_frames, height, width, _ = image_stack.shape - image_stack = cp.array(image_stack).astype(cp.float32) - img = cp.clip(cp.sum(image_stack, axis=0) / num_frames, 0, 255).astype(cp.uint8) - return img.get() - - if not check_nvidea_gpu_available(): - raise FFMPEGCodecGPUError(msg="No GPU found (as evaluated by nvidea-smi returning None)", source=create_average_frm.__name__) - - - if ((start_frm is not None) or (end_frm is not None)) and ((start_time is not None) or (end_time is not None)): - raise InvalidInputError(msg=f'Pass start_frm and end_frm OR start_time and end_time', source=create_average_frm.__name__) - elif type(start_frm) != type(end_frm): - raise InvalidInputError(msg=f'Pass start frame and end frame', source=create_average_frm.__name__) - elif type(start_time) != type(end_time): - raise InvalidInputError(msg=f'Pass start time and end time', source=create_average_frm.__name__) - if save_path is not None: - check_if_dir_exists(in_dir=os.path.dirname(save_path), source=create_average_frm.__name_) - check_file_exist_and_readable(file_path=video_path) - video_meta_data = get_video_meta_data(video_path=video_path) - video_name = get_fn_ext(filepath=video_path)[1] - if verbose: - print(f'Getting average frame from {video_name}...') - if (start_frm is not None) and (end_frm is not None): - check_int(name='start_frm', value=start_frm, min_value=0, max_value=video_meta_data['frame_count']) - check_int(name='end_frm', value=end_frm, min_value=0, max_value=video_meta_data['frame_count']) - if start_frm > end_frm: - raise InvalidInputError(msg=f'Start frame ({start_frm}) has to be before end frame ({end_frm}).', source=create_average_frm.__name__) - frame_ids = list(range(start_frm, end_frm)) - elif (start_time is not None) and (end_time is not None): - check_if_string_value_is_valid_video_timestamp(value=start_time, name=create_average_frm.__name__) - check_if_string_value_is_valid_video_timestamp(value=end_time, name=create_average_frm.__name__) - check_that_hhmmss_start_is_before_end(start_time=start_time, end_time=end_time, name=create_average_frm.__name__) - check_if_hhmmss_timestamp_is_valid_part_of_video(timestamp=start_time, video_path=video_path) - frame_ids = find_frame_numbers_from_time_stamp(start_time=start_time, end_time=end_time, fps=video_meta_data['fps']) - else: - frame_ids = list(range(0, video_meta_data['frame_count'])) - frame_ids = [frame_ids[i:i+batch_size] for i in range(0,len(frame_ids),batch_size)] - avg_imgs = [] - for batch_cnt in range(len(frame_ids)): - start_idx, end_idx = frame_ids[batch_cnt][0], frame_ids[batch_cnt][-1] - if start_idx == end_idx: - continue - imgs = read_img_batch_from_video_gpu(video_path=video_path, start_frm=start_idx, end_frm=end_idx, verbose=verbose) - avg_imgs.append(average_3d_stack(image_stack=imgs)) - avg_img = average_3d_stack(image_stack=np.stack(avg_imgs, axis=0)) - if save_path is not None: - cv2.imwrite(save_path, avg_img) - if verbose: - stdout_success(msg=f'Saved average frame at {save_path}', source=create_average_frm.__name__) - else: - return avg_img \ No newline at end of file diff --git a/simba/data_processors/cuda/create_average_frame_cuda.py b/simba/data_processors/cuda/create_average_frame_cuda.py deleted file mode 100644 index 6820841bf..000000000 --- a/simba/data_processors/cuda/create_average_frame_cuda.py +++ /dev/null @@ -1,152 +0,0 @@ -__author__ = "Simon Nilsson" -__email__ = "sronilsson@gmail.com" - -import os -from typing import Optional, Union - -try: - from typing import Literal -except: - from typing_extensions import Literal - -from copy import deepcopy - -import cupy as cp -import cv2 -import numpy as np -from numba import cuda - -from simba.utils.checks import (check_file_exist_and_readable, - check_if_dir_exists, - check_if_string_value_is_valid_video_timestamp, - check_if_valid_img, check_instance, check_int, - check_nvidea_gpu_available, - check_that_hhmmss_start_is_before_end) -from simba.utils.data import find_frame_numbers_from_time_stamp -from simba.utils.errors import FFMPEGCodecGPUError, InvalidInputError -from simba.utils.printing import stdout_success -from simba.utils.read_write import ( - check_if_hhmmss_timestamp_is_valid_part_of_video, get_fn_ext, - get_video_meta_data, read_img_batch_from_video_gpu) - - -def average_3d_stack_cupy(image_stack: np.ndarray) -> np.ndarray: - num_frames, height, width, _ = image_stack.shape - image_stack = cp.array(image_stack).astype(cp.float32) - img = cp.clip(cp.sum(image_stack, axis=0) / num_frames, 0, 255).astype(cp.uint8) - return img.get() - -@cuda.jit() -def _average_3d_stack_cuda(data, results): - y, x, i = cuda.grid(3) - if i < 0 or x < 0 or y < 0: - return - if i > data.shape[0] - 1 or x > data.shape[1] - 1 or y > data.shape[2] - 1: - return - else: - sum_value = 0.0 - for n in range(data.shape[0]): - sum_value += data[n, y, x, i] - results[y, x, i] = sum_value / data.shape[0] - -def _average_3d_stack_cuda(image_stack: np.ndarray) -> np.ndarray: - check_instance(source=_average_3d_stack_cuda.__name__, instance=image_stack, accepted_types=(np.ndarray,)) - check_if_valid_img(data=image_stack[0], source=_average_3d_stack_cuda.__name__) - if image_stack.ndim != 4: - return image_stack - x = np.ascontiguousarray(image_stack) - x_dev = cuda.to_device(x) - results = cuda.device_array((x.shape[1], x.shape[2], x.shape[3]), dtype=np.float32) - grid_x = (x.shape[1] + 16 - 1) // 16 - grid_y = (x.shape[2] + 16 - 1) // 16 - grid_z = 3 - threads_per_block = (16, 16, 1) - blocks_per_grid = (grid_y, grid_x, grid_z) - _average_3d_stack_cuda[blocks_per_grid, threads_per_block](x_dev, results) - results = results.copy_to_host() - return results - - - -def create_average_frm_cuda(video_path: Union[str, os.PathLike], - start_frm: Optional[int] = None, - end_frm: Optional[int] = None, - start_time: Optional[str] = None, - end_time: Optional[str] = None, - save_path: Optional[Union[str, os.PathLike]] = None, - batch_size: Optional[int] = 6000, - verbose: Optional[bool] = False) -> Union[None, np.ndarray]: - """ - Computes the average frame using GPU acceleration from a specified range of frames or time interval in a video file. - This average frame typically used for background substraction. - - - The function reads frames from the video, calculates their average, and optionally saves the result - to a specified file. If `save_path` is provided, the average frame is saved as an image file; - otherwise, the average frame is returned as a NumPy array. - - - :param Union[str, os.PathLike] video_path: The path to the video file from which to extract frames. - :param Optional[int] start_frm: The starting frame number (inclusive). Either `start_frm`/`end_frm` or `start_time`/`end_time` must be provided, but not both. - :param Optional[int] end_frm: The ending frame number (exclusive). - :param Optional[str] start_time: The start time in the format 'HH:MM:SS' from which to begin extracting frames. - :param Optional[str] end_time: The end time in the format 'HH:MM:SS' up to which frames should be extracted. - :param Optional[Union[str, os.PathLike]] save_path: The path where the average frame image will be saved. If `None`, the average frame is returned as a NumPy array. - :param Optional[int] batch_size: The number of frames to process in each batch. Default is 3000. Increase if your RAM allows it. - :param Optional[bool] verbose: If `True`, prints progress and informational messages during execution. - :return: Returns `None` if the result is saved to `save_path`. Otherwise, returns the average frame as a NumPy array. - - :example: - >>> create_average_frm(video_path=r"C:\troubleshooting\RAT_NOR\project_folder\videos\2022-06-20_NOB_DOT_4_downsampled.mp4", verbose=True, start_frm=0, end_frm=9000) - """ - - if not check_nvidea_gpu_available(): - raise FFMPEGCodecGPUError(msg="No GPU found (as evaluated by nvidea-smi returning None)", - source=create_average_frm_cuda.__name__) - - if ((start_frm is not None) or (end_frm is not None)) and ((start_time is not None) or (end_time is not None)): - raise InvalidInputError(msg=f'Pass start_frm and end_frm OR start_time and end_time', - source=create_average_frm_cuda.__name__) - elif type(start_frm) != type(end_frm): - raise InvalidInputError(msg=f'Pass start frame and end frame', source=create_average_frm_cuda.__name__) - elif type(start_time) != type(end_time): - raise InvalidInputError(msg=f'Pass start time and end time', source=create_average_frm_cuda.__name__) - if save_path is not None: - check_if_dir_exists(in_dir=os.path.dirname(save_path), source=create_average_frm_cuda.__name_) - check_file_exist_and_readable(file_path=video_path) - video_meta_data = get_video_meta_data(video_path=video_path) - video_name = get_fn_ext(filepath=video_path)[1] - if verbose: - print(f'Getting average frame from {video_name}...') - if (start_frm is not None) and (end_frm is not None): - check_int(name='start_frm', value=start_frm, min_value=0, max_value=video_meta_data['frame_count']) - check_int(name='end_frm', value=end_frm, min_value=0, max_value=video_meta_data['frame_count']) - if start_frm > end_frm: - raise InvalidInputError(msg=f'Start frame ({start_frm}) has to be before end frame ({end_frm}).', - source=create_average_frm_cuda.__name__) - frame_ids = list(range(start_frm, end_frm)) - elif (start_time is not None) and (end_time is not None): - check_if_string_value_is_valid_video_timestamp(value=start_time, name=create_average_frm_cuda.__name__) - check_if_string_value_is_valid_video_timestamp(value=end_time, name=create_average_frm_cuda.__name__) - check_that_hhmmss_start_is_before_end(start_time=start_time, end_time=end_time, - name=create_average_frm_cuda.__name__) - check_if_hhmmss_timestamp_is_valid_part_of_video(timestamp=start_time, video_path=video_path) - frame_ids = find_frame_numbers_from_time_stamp(start_time=start_time, end_time=end_time, - fps=video_meta_data['fps']) - else: - frame_ids = list(range(0, video_meta_data['frame_count'])) - frame_ids = [frame_ids[i:i + batch_size] for i in range(0, len(frame_ids), batch_size)] - avg_imgs = [] - for batch_cnt in range(len(frame_ids)): - start_idx, end_idx = frame_ids[batch_cnt][0], frame_ids[batch_cnt][-1] - if start_idx == end_idx: - continue - imgs = read_img_batch_from_video_gpu(video_path=video_path, start_frm=start_idx, end_frm=end_idx, verbose=verbose) - avg_imgs.append(_average_3d_stack_cuda(image_stack=np.stack(list(imgs.values()), axis=0))) - avg_img = _average_3d_stack_cuda(image_stack=np.stack(avg_imgs, axis=0)) - if save_path is not None: - cv2.imwrite(save_path, avg_img) - if verbose: - stdout_success(msg=f'Saved average frame at {save_path}', source=create_average_frm.__name__) - else: - return avg_img \ No newline at end of file diff --git a/simba/data_processors/cuda/create_shap_log.py b/simba/data_processors/cuda/create_shap_log.py deleted file mode 100644 index f58177a53..000000000 --- a/simba/data_processors/cuda/create_shap_log.py +++ /dev/null @@ -1,154 +0,0 @@ -__author__ = "Simon Nilsson" -__email__ = "sronilsson@gmail.com" - -import os -from typing import List, Optional, Tuple, Union - -import numpy as np -import pandas as pd -import shap -from sklearn.ensemble import RandomForestClassifier - -from simba.mixins.train_model_mixin import TrainModelMixin -from simba.utils.checks import (check_if_dir_exists, check_instance, check_int, - check_nvidea_gpu_available, check_str, - check_valid_array, check_valid_dataframe, - check_valid_lst) -from simba.utils.enums import Formats -from simba.utils.errors import FFMPEGCodecGPUError -from simba.utils.printing import SimbaTimer, stdout_success -from simba.utils.read_write import read_df, write_df -from simba.utils.warnings import NotEnoughDataWarning - - -def create_shap_log(rf_clf: Union[str, os.PathLike, RandomForestClassifier], - x: Union[pd.DataFrame, np.ndarray], - y: Union[pd.DataFrame, pd.Series, np.ndarray], - cnt_present: int, - cnt_absent: int, - x_names: Optional[List[str]] = None, - clf_name: Optional[str] = None, - save_dir: Optional[Union[str, os.PathLike]] = None, - verbose: Optional[bool] = True) -> Union[None, Tuple[pd.DataFrame, pd.DataFrame, int]]: - """ - Computes SHAP (SHapley Additive exPlanations) values using a GPU for a RandomForestClassifier, - based on specified counts of positive and negative samples, and optionally saves the results. - - .. image:: _static/img/create_shap_log_cuda.png - :width: 500 - :align: center - - :param Union[str, os.PathLike, RandomForestClassifier] rf_clf: Trained RandomForestClassifier model or path to the saved model. Can be a string, os.PathLike object, or an instance of RandomForestClassifier. - :param Union[pd.DataFrame, np.ndarray] x: Input features used for SHAP value computation. Can be a pandas DataFrame or numpy ndarray. - :param Union[pd.DataFrame, pd.Series, np.ndarray] y: Target labels corresponding to the input features. Can be a pandas DataFrame, pandas Series, or numpy ndarray with 0 and 1 values. - :param int cnt_present: Number of positive samples (label=1) to include in the SHAP value computation. - :param int cnt_absent: Number of negative samples (label=0) to include in the SHAP value computation. - :param Optional[List[str]] x_names: Optional list of feature names corresponding to the columns in `x`. If `x` is a DataFrame, this is extracted automatically. - :param Optional[str] clf_name: Optional name for the classifier, used in naming output files. If not provided, it is extracted from the `y` labels if possible. - :param Optional[Union[str, os.PathLike]] save_dir: Optional directory path where the SHAP values and corresponding raw features are saved as CSV files. - :param Optional[bool] verbose: Optional boolean flag indicating whether to print progress messages. Defaults to True. - :return Union[None, Tuple[pd.DataFrame, pd.DataFrame, int]]: If `save_dir` is None, returns a tuple containing: - - V: DataFrame with SHAP values, expected value, sum of SHAP values, prediction probability, and target labels. - - R: DataFrame containing the raw feature values for the selected samples. - - expected_value: The expected value from the SHAP explainer. - If `save_dir` is provided, the function returns None and saves the output to CSV files in the specified directory. - - :example: - >>> x = np.random.random((1000, 501)).astype(np.float32) - >>> y = np.random.randint(0, 2, size=(len(x), 1)).astype(np.int32) - >>> clf_names = [str(x) for x in range(501)] - >>> results = create_shap_log(rf_clf=MODEL_PATH, x=x, y=y, cnt_present=int(i/2), cnt_absent=int(i/2), clf_name='TEST', x_names=clf_names, verbose=False) - """ - - timer = SimbaTimer(start=True) - if verbose: - print('Computing SHAP values (GPU)...') - if not check_nvidea_gpu_available(): - raise FFMPEGCodecGPUError(msg="No GPU found (as evaluated by nvidea-smi returning None)", - source=create_shap_log.__name__) - check_instance(source=f'{create_shap_log.__name__} rf_clf', instance=rf_clf, - accepted_types=(str, RandomForestClassifier)) - if isinstance(rf_clf, (str, os.PathLike)): - rf_clf = TrainModelMixin().read_pickle(file_path=rf_clf) - check_instance(source=f'{create_shap_log.__name__} x', instance=x, accepted_types=(pd.DataFrame, np.ndarray)) - if isinstance(x, np.ndarray): - check_valid_lst(data=x_names, source=f'{create_shap_log.__name__} x_names', valid_dtypes=(str,), - exact_len=x.shape[1]) - check_valid_array(data=x, source=f'{create_shap_log.__name__} x', accepted_ndims=[2, ], - accepted_dtypes=Formats.NUMERIC_DTYPES.value) - else: - check_valid_dataframe(df=x, source=f'{create_shap_log.__name__} x', - valid_dtypes=Formats.NUMERIC_DTYPES.value) - x_names = list(x.columns) - x = x.values - check_instance(source=f'{create_shap_log.__name__} y', instance=y, - accepted_types=(pd.DataFrame, np.ndarray, pd.Series)) - if isinstance(y, np.ndarray): - check_str(name=f'{create_shap_log.__name__} clf_name', value=clf_name) - y = y.flatten() - elif isinstance(y, pd.Series): - clf_name = y.name - y = y.values.flatten() - else: - check_valid_dataframe(df=y, source=f'{create_shap_log.__name__} y', - valid_dtypes=Formats.NUMERIC_DTYPES.value, max_axis_1=1) - clf_name = list(y.columns)[0] - y = y.values.flatten() - save_shap_path, save_raw_path = None, None - if save_dir is not None: - check_if_dir_exists(in_dir=save_dir) - save_shap_path = os.path.join(save_dir, f"SHAP_values_{clf_name}.csv") - save_raw_path = os.path.join(save_dir, f"RAW_SHAP_feature_values_{clf_name}.csv") - check_valid_array(data=y, source=f'{create_shap_log.__name__} y', accepted_values=[0, 1]) - check_int(name=f'{create_shap_log.__name__} cnt_present', value=cnt_present, min_value=1) - check_int(name=f'{create_shap_log.__name__} cnt_absent', value=cnt_absent, min_value=1) - target_cnt = np.sum(y) - absent_cnt = y.shape[0] - target_cnt - - if cnt_present > target_cnt: - NotEnoughDataWarning( - msg=f"Data contains {target_cnt} behavior-present annotations. This is less the number of frames you specified to calculate shap values for ({cnt_present}). SimBA will calculate shap scores for the {target_cnt} behavior-present frames available", - source=create_shap_log.__name__) - cnt_present = target_cnt - if absent_cnt < cnt_absent: - NotEnoughDataWarning( - msg=f"Data contains {absent_cnt} behavior-absent annotations. This is less the number of frames you specified to calculate shap values for ({cnt_absent}). SimBA will calculate shap scores for the {absent_cnt} behavior-absent frames available", - source=create_shap_log.__name__) - cnt_absent = absent_cnt - - target_idx = np.argwhere(y == 1).flatten() - absent_idx = np.argwhere(y == 0).flatten() - target_idx = np.sort(np.random.choice(target_idx, cnt_present)) - absent_idx = np.sort(np.random.choice(absent_idx, cnt_absent)) - target_x = x[target_idx] - absent_x = x[absent_idx] - X = np.vstack([target_x, absent_x]).astype(np.float32) - Y = np.hstack([np.ones(target_x.shape[0]), np.zeros(absent_x.shape[0])]).astype(np.int32) - explainer = shap.explainers.GPUTree(model=rf_clf, data=None, model_output='raw', - feature_names='tree_path_dependent') - shap_values = explainer.shap_values(X, check_additivity=True) - V = pd.DataFrame(shap_values[1], columns=x_names).astype(np.float32) - sum = V.sum(axis=1) - expected_value = explainer.expected_value[1] - p = TrainModelMixin().clf_predict_proba(clf=rf_clf, x_df=X) - - V['EXPECTED_VALUE'] = expected_value.round(4) - V['SUM'] = sum + V['EXPECTED_VALUE'] - V['PREDICTION_PROBABILITY'] = p.round(4) - V['SUM'] = V['SUM'].round(4) - V[clf_name] = Y - x_idx = np.hstack([target_idx, absent_idx]) - R = pd.DataFrame(x[x_idx, :], columns=x_names) - timer.stop_timer() - if save_dir is None: - if verbose: - stdout_success(msg=f'Shap values compute complete (GPU) for {len(V)} observations.', elapsed_time=timer.elapsed_time_str) - return (V, R, expected_value) - else: - write_df(df=V, file_type='csv', save_path=save_shap_path) - write_df(df=R, file_type='csv', save_path=save_raw_path) - if verbose: - stdout_success(msg=f'Shap values compute complete (GPU) for {len(V)} observations, and saved in {save_dir}', elapsed_time=timer.elapsed_time_str) - - - diff --git a/simba/data_processors/cuda/direction_two_bps.py b/simba/data_processors/cuda/direction_two_bps.py deleted file mode 100644 index 4dee71a60..000000000 --- a/simba/data_processors/cuda/direction_two_bps.py +++ /dev/null @@ -1,45 +0,0 @@ -__author__ = "Simon Nilsson" -__email__ = "sronilsson@gmail.com" - -import math - -import numpy as np -from numba import cuda, int32 - -THREADS_PER_BLOCK = 1024 - -@cuda.jit() -def _cuda_direction_from_two_bps(x, y, results): - i = cuda.grid(1) - if i > x.shape[0]: - return - else: - a = math.atan2(x[i][0] - y[i][0], y[i][1] - x[i][1]) * (180 / math.pi) - a = int32(a + 360 if a < 0 else a) - results[i] = a - - -def direction_from_two_bps(x: np.ndarray, y: np.ndarray) -> np.ndarray: - """ - Compute the directionality in degrees from two body-parts. E.g., ``nape`` and ``nose``, - or ``swim_bladder`` and ``tail`` with GPU acceleration. - - .. image:: _static/img/direction_from_two_bps_cuda.png - :width: 1200 - :align: center - - - :parameter np.ndarray x: Size len(frames) x 2 representing x and y coordinates for first body-part. - :parameter np.ndarray y: Size len(frames) x 2 representing x and y coordinates for second body-part. - :return np.ndarray: Frame-wise directionality in degrees. - - """ - x = np.ascontiguousarray(x).astype(np.int32) - y = np.ascontiguousarray(y).astype(np.int32) - x_dev = cuda.to_device(x) - y_dev = cuda.to_device(y) - results = cuda.device_array((x.shape[0]), dtype=np.int32) - bpg = (x.shape[0] + (THREADS_PER_BLOCK - 1)) // THREADS_PER_BLOCK - _cuda_direction_from_two_bps[bpg, THREADS_PER_BLOCK](x_dev, y_dev, results) - results = results.copy_to_host() - return results diff --git a/simba/data_processors/cuda/euclidan_distance_cuda.py b/simba/data_processors/cuda/euclidan_distance_cuda.py deleted file mode 100644 index dae3f2880..000000000 --- a/simba/data_processors/cuda/euclidan_distance_cuda.py +++ /dev/null @@ -1,52 +0,0 @@ -__author__ = "Simon Nilsson" -__email__ = "sronilsson@gmail.com" - -import math - -import numpy as np -from numba import cuda - -from simba.mixins.feature_extraction_mixin import FeatureExtractionMixin -from simba.utils.read_write import read_df - -THREADS_PER_BLOCK = 128 - -@cuda.jit -def _euclidean_distance_kernel(x_dev, y_dev, results): - i = cuda.grid(1) - if i < x_dev.shape[0]: - p = (math.sqrt((x_dev[i][0] - y_dev[i][0]) ** 2 + (x_dev[i][1] - y_dev[i][1]) ** 2)) - results[i] = p - -def get_euclidean_distance_cuda(x: np.ndarray, y: np.ndarray) -> np.ndarray: - """ - Computes the Euclidean distance between two sets of points using CUDA for GPU acceleration. - - .. image:: _static/img/get_euclidean_distance_cuda.png - :width: 500 - :align: center - - :param np.ndarray x: A 2D array of shape (n, m) representing n points in m-dimensional space. Each row corresponds to a point. - :param np.ndarray y: A 2D array of shape (n, m) representing n points in m-dimensional space. Each row corresponds to a point. - :return np.ndarray: A 1D array of shape (n,) where each element represents the Euclidean distance between the corresponding points in `x` and `y`. - - :example: - >>> video_path = r"/mnt/c/troubleshooting/mitra/project_folder/videos/501_MA142_Gi_CNO_0514.mp4" - >>> data_path = r"/mnt/c/troubleshooting/mitra/project_folder/csv/outlier_corrected_movement_location/501_MA142_Gi_CNO_0514 - test.csv" - >>> df = read_df(file_path=data_path, file_type='csv')[['Center_x', 'Center_y']] - >>> shifted_df = FeatureExtractionMixin.create_shifted_df(df=df, periods=1) - >>> x = shifted_df[['Center_x', 'Center_y']].values - >>> y = shifted_df[['Center_x_shifted', 'Center_y_shifted']].values - >>> get_euclidean_distance_cuda(x=x, y=y) - """ - - x = np.ascontiguousarray(x).astype(np.int32) - y = np.ascontiguousarray(y).astype(np.int32) - n, m = x.shape - x_dev = cuda.to_device(x) - y_dev = cuda.to_device(y) - results = cuda.device_array((n, m), dtype=np.int32) - bpg = (n + (THREADS_PER_BLOCK - 1)) // THREADS_PER_BLOCK - _euclidean_distance_kernel[bpg, THREADS_PER_BLOCK](x_dev, y_dev, results) - results = results.copy_to_host().astype(np.int32) - return results diff --git a/simba/data_processors/cuda/euclidean_distances_cuda.py b/simba/data_processors/cuda/euclidean_distances_cuda.py deleted file mode 100644 index b4bc909d4..000000000 --- a/simba/data_processors/cuda/euclidean_distances_cuda.py +++ /dev/null @@ -1,38 +0,0 @@ -from typing import Optional - -import cupy as cp -import numpy as np - -from simba.utils.checks import check_int, check_valid_array -from simba.utils.enums import Formats - - -def get_euclidean_distance_cupy(x: np.ndarray, - y: np.ndarray, - batch_size: Optional[int] = int(3.5e10+7)) -> np.ndarray: - """ - Computes the Euclidean distance between corresponding pairs of points in two 2D arrays - using CuPy for GPU acceleration. The computation is performed in batches to handle large - datasets efficiently. - - :param np.ndarray x: A 2D NumPy array with shape (n, 2), where each row represents a point in a 2D space. - :param np.ndarray y: A 2D NumPy array with shape (n, 2), where each row represents a point in a 2D space. The shape of `y` must match the shape of `x`. - :param Optional[int] batch_size: The number of points to process in a single batch. This parameter controls memory usage and can be adjusted based on available GPU memory. The default value is large (`3.5e10 + 7`) to maximize GPU utilization, but it can be lowered if memory issues arise. - :return: A 1D NumPy array of shape (n,) containing the Euclidean distances between corresponding points in `x` and `y`. - :return: A 1D NumPy array of shape (n,) containing the Euclidean distances between corresponding points in `x` and `y`. - :rtype: np.ndarray - - :example: - >>> x = np.array([[1, 2], [3, 4], [5, 6]]) - >>> y = np.array([[7, 8], [9, 10], [11, 12]]) - >>> distances = get_euclidean_distance_cupy(x, y) - """ - check_valid_array(data=x, source=check_valid_array.__name__, accepted_ndims=[2,], accepted_dtypes=Formats.NUMERIC_DTYPES.value) - check_valid_array(data=y, source=check_valid_array.__name__, accepted_ndims=[2, ], accepted_dtypes=Formats.NUMERIC_DTYPES.value, accepted_shapes=(x.shape,)) - check_int(name='batch_size', value=batch_size, min_value=1) - results = cp.full((x.shape[0]), fill_value=cp.nan, dtype=cp.float32) - for l in range(0, x.shape[0], batch_size): - r = l + batch_size - batch_x, batch_y = cp.array(x[l:r]), cp.array(y[l:r]) - results[l:r] = (cp.sqrt((batch_x[:, 0] - batch_y[:, 0]) ** 2 + (batch_x[:, 1] - batch_y[:, 1]) ** 2)) - return results.get() \ No newline at end of file diff --git a/simba/data_processors/cuda/image.py b/simba/data_processors/cuda/image.py index af1916896..39cbc1e9d 100644 --- a/simba/data_processors/cuda/image.py +++ b/simba/data_processors/cuda/image.py @@ -4,7 +4,7 @@ import os from typing import Optional, Union - +import math try: from typing import Literal except: @@ -30,10 +30,9 @@ from simba.utils.data import find_frame_numbers_from_time_stamp from simba.utils.enums import Formats from simba.utils.errors import FFMPEGCodecGPUError, InvalidInputError -from simba.utils.printing import stdout_success -from simba.utils.read_write import ( - check_if_hhmmss_timestamp_is_valid_part_of_video, get_fn_ext, - get_video_meta_data, read_img_batch_from_video_gpu) +from simba.utils.printing import stdout_success, SimbaTimer +from simba.utils.read_write import (check_if_hhmmss_timestamp_is_valid_part_of_video, get_fn_ext, get_video_meta_data, read_img_batch_from_video_gpu) +from simba.mixins.image_mixin import ImageMixin PHOTOMETRIC = 'photometric' DIGITAL = 'digital' @@ -670,4 +669,170 @@ def segment_img_stack_horizontal(imgs: np.ndarray, else: imgs = imgs[:, int(px_crop/2):int((imgs.shape[0] - px_crop) / 2), :] - return imgs.get() \ No newline at end of file + return imgs.get() + + + +@cuda.jit(device=True) +def _cuda_is_inside_polygon(x, y, polygon_vertices): + """ + Checks if the pixel location is inside the polygon. + + :param int x: Pixel x location. + :param int y: Pixel y location. + :param np.ndarray polygon_vertices: 2-dimentional array representing the x and y coordinates of the polygon vertices. + :return: Boolean representing if the x and y are located in the polygon. + """ + + n = len(polygon_vertices) + p2x, p2y, xints, inside = 0.0, 0.0, 0.0, False + p1x, p1y = polygon_vertices[0] + for j in range(n + 1): + p2x, p2y = polygon_vertices[j % n] + if ( + (y > min(p1y, p2y)) + and (y <= max(p1y, p2y)) + and (x <= max(p1x, p2x)) + ): + if p1y != p2y: + xints = (y - p1y) * (p2x - p1x) / (p2y - p1y) + p1x + if p1x == p2x or x <= xints: + inside = not inside + p1x, p1y = p2x, p2y + return inside + + + +@cuda.jit(device=True) +def _cuda_is_inside_circle(x, y, circle_x, circle_y, circle_r): + """ + Device func to check if the pixel location is inside a circle. + + :param int x: Pixel x location. + :param int y: Pixel y location. + :param int circle_x: Center of circle x coordinate. + :param int circle_y: Center of circle y coordinate. + :param int y: Circle radius. + :return: Boolean representing if the x and y are located in the circle. + """ + + p = (math.sqrt((x - circle_x) ** 2 + (y - circle_y) ** 2)) + if p <= circle_r: + return True + else: + return False + +@cuda.jit() +def _cuda_create_rectangle_masks(shapes, imgs): + x, y, n = cuda.grid(3) + if n < 0 or n > (imgs.shape[0] -1): + return + if y < 0 or y > (imgs.shape[1] -1): + return + if x < 0 or x > (imgs.shape[2] -1): + return + else: + polygon = shapes[n] + inside = _cuda_is_inside_polygon(x, y, polygon) + if not inside: + imgs[n, y, x] = 0 + +@cuda.jit() +def _cuda_create_circle_masks(shapes, imgs): + x, y, n = cuda.grid(3) + if n < 0 or n > (imgs.shape[0] -1): + return + if y < 0 or y > (imgs.shape[1] -1): + return + if x < 0 or x > (imgs.shape[2] -1): + return + else: + circle_x, circle_y, circle_r = shapes[n][0], shapes[n][1], shapes[n][2] + inside = _cuda_is_inside_circle(x, y, circle_x, circle_y, circle_r) + if not inside: + imgs[n, y, x] = 0 + +def slice_imgs(video_path: Union[str, os.PathLike], + shapes: np.ndarray, + batch_size: Optional[int] = 1000, + verbose: Optional[bool] = True): + + """ + Slice frames from a video based on given shape coordinates (rectangles or circles) and return the cropped regions using GPU acceleration. + + + .. video:: _static/img/slice_imgs_gpu.webm + :width: 800 + :autoplay: + :loop: + + .. csv-table:: + :header: EXPECTED RUNTIMES + :file: ../../../docs/tables/slice_imgs.csv + :widths: 10, 90 + :align: center + :class: simba-table + :header-rows: 1 + + :param Union[str, os.PathLike] video_path: Path to the video file. + :param np.ndarray shapes: A NumPy array of shape `(n, m, 2)` where `n` is the number of frames. Each frame contains 4 (x, y) or one points representing the bounding shapes (e.g., rectangles edges) or centroid and radius (if circles) to slice from each frame. + :param Optional[int] batch_size: Optional; default is 500. The number of frames to process in each batch for memory efficiency. Larger batches are faster but use more memory. + :param Optional[bool] verbose: If True, prints progress during the slicing process. + :return: A NumPy array of sliced images with shape `(n, h, w, 3)` if the video is in color, or `(n, h, w)` if the video is grayscale. Here, `n` is the number of frames, and `h`, `w` are the height and width of the frames, respectively. + :rtype: np.ndarray + + :example I rectangles: + >>> data_path = r"/mnt/c/troubleshooting/mitra/project_folder/csv/outlier_corrected_movement_location/FRR_gq_Saline_0624.csv" # PATH TO A DATA FILE + >>> video_path = r'/mnt/c/troubleshooting/mitra/project_folder/videos/FRR_gq_Saline_0624.mp4' # PATH TO AN ASSOCIATED VIDEO FILE + >>> nose_arr = read_df(file_path=data_path, file_type='csv', usecols=['Nose_x', 'Nose_y', 'Tail_base_x', 'Tail_base_y', 'Left_side_x', 'Left_side_y', 'Right_side_x', 'Right_side_y']).values.reshape(-1, 4, 2)[0:1000] ## READ THE BODY-PART THAT DEFINES THE HULL AND CONVERT TO ARRAY + >>> polygons = GeometryMixin().multiframe_bodyparts_to_polygon(data=nose_arr, parallel_offset=60) ## CONVERT THE BODY-PART TO POLYGONS WITH A LITTLE BUFFER + >>> polygons = GeometryMixin().multiframe_minimum_rotated_rectangle(shapes=polygons) # CONVERT THE POLYGONS TO RECTANGLES (I.E., WITH 4 UNIQUE POINTS). + >>> polygon_lst = [] # GET THE POINTS OF THE RECTANGLES + >>> for i in polygons: polygon_lst.append(np.array(i.exterior.coords)) + >>> polygons = np.stack(polygon_lst, axis=0) + >>> sliced_imgs = slice_imgs(video_path=video_path, shapes=polygons) #SLICE THE RECTANGLES IN THE VIDEO. + + + :example II circles: + >>> data_path = r"/mnt/c/troubleshooting/mitra/project_folder/csv/outlier_corrected_movement_location/FRR_gq_Saline_0624.csv" # PATH TO A DATA FILE + >>> video_path = r'/mnt/c/troubleshooting/mitra/project_folder/videos/FRR_gq_Saline_0624.mp4' # PATH TO AN ASSOCIATED VIDEO FILE + >>> nose_arr = read_df(file_path=data_path, file_type='csv', usecols=['Nose_x', 'Nose_y']).values[0:6000] ## READ THE BODY-PART THAT DEFINES THE CENTER OF CIRCLE + >>> nose_arr = np.hstack((nose_arr, np.full((nose_arr.shape[0], 1), fill_value=50))).astype(np.int32) ## APPEND THE RADIUS OF THE CIRCLE TO THE DATA + >>> sliced_imgs = slice_imgs(video_path=video_path, shapes=nose_arr) #SLICE THE CIRCLE IN THE VIDEO. + """ + THREADS_PER_BLOCK = (32, 32, 1) + + video_meta_data = get_video_meta_data(video_path=video_path) + video_meta_data['frame_count'] = shapes.shape[0] + n, w, h = video_meta_data['frame_count'], video_meta_data['width'], video_meta_data['height'] + is_color = ImageMixin.is_video_color(video=video_path) + timer = SimbaTimer(start=True) + if is_color: + results = np.zeros((n, h, w, 3), dtype=np.uint8) + else: + results = np.zeros((n, h, w), dtype=np.uint8) + for start_img_idx in range(0, n, batch_size): + end_img_idx = start_img_idx + batch_size + if end_img_idx > video_meta_data['frame_count']: + end_img_idx = video_meta_data['frame_count'] + if verbose: + print(f'Processing images {start_img_idx} to {end_img_idx} (of {n})...') + batch_n = end_img_idx - start_img_idx + batch_imgs = read_img_batch_from_video_gpu(video_path=video_path, start_frm=start_img_idx, end_frm=end_img_idx) + batch_imgs = np.stack(list(batch_imgs.values()), axis=0) + batch_shapes = shapes[start_img_idx:end_img_idx].astype(np.int32) + x_dev = cuda.to_device(batch_shapes) + batch_img_dev = cuda.to_device(batch_imgs) + grid_x = math.ceil(w / THREADS_PER_BLOCK[0]) + grid_y = math.ceil(h / THREADS_PER_BLOCK[1]) + grid_z = math.ceil(batch_n / THREADS_PER_BLOCK[2]) + bpg = (grid_x, grid_y, grid_z) + if batch_shapes.shape[1] == 3: + _cuda_create_circle_masks[bpg, THREADS_PER_BLOCK](x_dev, batch_img_dev) + else: + _cuda_create_rectangle_masks[bpg, THREADS_PER_BLOCK](x_dev, batch_img_dev) + results[start_img_idx: end_img_idx] = batch_img_dev.copy_to_host() + timer.stop_timer() + if verbose: + stdout_success(msg='Shapes sliced in video.', elapsed_time=timer.elapsed_time_str) + return results diff --git a/simba/data_processors/cuda/img_stack_brightness.py b/simba/data_processors/cuda/img_stack_brightness.py deleted file mode 100644 index 8922d8863..000000000 --- a/simba/data_processors/cuda/img_stack_brightness.py +++ /dev/null @@ -1,95 +0,0 @@ -import time -from copy import deepcopy -from typing import Optional, Union - -import numpy as np - -try: - from typing import Literal -except: - from typing_extensions import Literal - -from numba import cuda - -from simba.utils.checks import check_if_valid_img, check_instance -from simba.utils.read_write import read_img_batch_from_video_gpu - -PHOTOMETRIC = 'photometric' -DIGITAL = 'digital' - -@cuda.jit() -def _photometric(data, results): - y, x, i = cuda.grid(3) - if i < 0 or x < 0 or y < 0: - return - if i > results.shape[0] - 1 or x > results.shape[1] - 1 or y > results.shape[2] - 1: - return - else: - r, g, b = data[i][x][y][0], data[i][x][y][1], data[i][x][y][2] - results[i][x][y] = (0.2126 * r) + (0.7152 * g) + (0.0722 * b) - -@cuda.jit() -def _digital(data, results): - y, x, i = cuda.grid(3) - if i < 0 or x < 0 or y < 0: - return - if i > results.shape[0] - 1 or x > results.shape[1] - 1 or y > results.shape[2] - 1: - return - else: - r, g, b = data[i][x][y][0], data[i][x][y][1], data[i][x][y][2] - results[i][x][y] = (0.299 * r) + (0.587 * g) + (0.114 * b) - -def img_stack_brightness(x: np.ndarray, - method: Optional[Literal['photometric', 'digital']] = 'digital', - ignore_black: Optional[bool] = True) -> np.ndarray: - """ - Calculate the average brightness of a stack of images using a specified method. - - - - **Photometric Method**: The brightness is calculated using the formula: - - .. math:: - \text{brightness} = 0.2126 \cdot R + 0.7152 \cdot G + 0.0722 \cdot B - - - **Digital Method**: The brightness is calculated using the formula: - - .. math:: - \text{brightness} = 0.299 \cdot R + 0.587 \cdot G + 0.114 \cdot B - - - :param np.ndarray x: A 4D array of images with dimensions (N, H, W, C), where N is the number of images, H and W are the height and width, and C is the number of channels (RGB). - :param Optional[Literal['photometric', 'digital']] method: The method to use for calculating brightness. It can be 'photometric' for the standard luminance calculation or 'digital' for an alternative set of coefficients. Default is 'digital'. - :param Optional[bool] ignore_black: If True, black pixels (i.e., pixels with brightness value 0) will be ignored in the calculation of the average brightness. Default is True. - :return np.ndarray: A 1D array of average brightness values for each image in the stack. If `ignore_black` is True, black pixels are ignored in the averaging process. - - - :example: - >>> imgs = read_img_batch_from_video_gpu(video_path=r"/mnt/c/troubleshooting/RAT_NOR/project_folder/videos/2022-06-20_NOB_DOT_4_downsampled.mp4", start_frm=0, end_frm=5000) - >>> imgs = np.stack(list(imgs.values()), axis=0) - >>> x = img_stack_brightness(x=imgs) - """ - - check_instance(source=img_stack_brightness.__name__, instance=x, accepted_types=(np.ndarray,)) - check_if_valid_img(data=x[0], source=img_stack_brightness.__name__) - x = np.ascontiguousarray(x).astype(np.uint8) - if x.ndim == 4: - grid_x = (x.shape[1] + 16 - 1) // 16 - grid_y = (x.shape[2] + 16 - 1) // 16 - grid_z = x.shape[0] - threads_per_block = (16, 16, 1) - blocks_per_grid = (grid_y, grid_x, grid_z) - x_dev = cuda.to_device(x) - results = cuda.device_array((x.shape[0], x.shape[1], x.shape[2]), dtype=np.uint8) - if method == PHOTOMETRIC: - _photometric[blocks_per_grid, threads_per_block](x_dev, results) - else: - _digital[blocks_per_grid, threads_per_block](x_dev, results) - results = results.copy_to_host() - if ignore_black: - masked_array = np.ma.masked_equal(results, 0) - results = np.mean(masked_array, axis=(1, 2)).filled(0) - else: - results = deepcopy(x) - results = np.mean(results, axis=(1, 2)) - - return results \ No newline at end of file diff --git a/simba/data_processors/cuda/img_stack_mse.py b/simba/data_processors/cuda/img_stack_mse.py deleted file mode 100644 index 78b18b56d..000000000 --- a/simba/data_processors/cuda/img_stack_mse.py +++ /dev/null @@ -1,106 +0,0 @@ -from typing import Optional - -import numpy as np -from numba import cuda - -from simba.utils.checks import (check_if_valid_img, check_instance, - check_valid_array) - - -@cuda.jit() -def _grey_mse(data, ref_img, stride, batch_cnt, mse_arr): - y, x, i = cuda.grid(3) - stride = stride[0] - batch_cnt = batch_cnt[0] - if batch_cnt == 0: - if (i - stride) < 0 or x < 0 or y < 0: - return - else: - if i < 0 or x < 0 or y < 0: - return - if i > mse_arr.shape[0] - 1 or x > mse_arr.shape[1] - 1 or y > mse_arr.shape[2] - 1: - return - else: - img_val = data[i][x][y] - if i == 0: - prev_val = ref_img[x][y] - else: - img_val = data[i][x][y] - prev_val = data[i - stride][x][y] - mse_arr[i][x][y] = (img_val - prev_val) ** 2 - - -@cuda.jit() -def _rgb_mse(data, ref_img, stride, batch_cnt, mse_arr): - y, x, i = cuda.grid(3) - stride = stride[0] - batch_cnt = batch_cnt[0] - if batch_cnt == 0: - if (i - stride) < 0 or x < 0 or y < 0: - return - else: - if i < 0 or x < 0 or y < 0: - return - if i > mse_arr.shape[0] - 1 or x > mse_arr.shape[1] - 1 or y > mse_arr.shape[2] - 1: - return - else: - img_val = data[i][x][y] - if i != 0: - prev_val = data[i - stride][x][y] - else: - prev_val = ref_img[x][y] - r_diff = (img_val[0] - prev_val[0]) ** 2 - g_diff = (img_val[1] - prev_val[1]) ** 2 - b_diff = (img_val[2] - prev_val[2]) ** 2 - mse_arr[i][x][y] = r_diff + g_diff + b_diff - -def stack_sliding_mse(x: np.ndarray, - stride: Optional[int] = 1, - batch_size: Optional[int] = 1000) -> np.ndarray: - """ - Computes the Mean Squared Error (MSE) between each image in a stack and a reference image, - where the reference image is determined by a sliding window approach with a specified stride. - The function is optimized for large image stacks by processing them in batches. - - :param np.ndarray x: Input array of images, where the first dimension corresponds to the stack of images. The array should be either 3D (height, width, channels) or 4D (batch, height, width, channels). - :param Optional[int] stride: The stride or step size for the sliding window that determines the reference image. Defaults to 1, meaning the previous image in the stack is used as the reference. - :param Optional[int] batch_size: The number of images to process in a single batch. Larger batch sizes may improve performance but require more GPU memory. Defaults to 1000. - :return: A 1D NumPy array containing the MSE for each image in the stack compared to its corresponding reference image. The length of the array is equal to the number of images in the input stack. - :rtype: np.ndarray - - """ - - check_instance(source=stack_sliding_mse.__name__, instance=x, accepted_types=(np.ndarray,)) - check_if_valid_img(data=x[0], source=stack_sliding_mse.__name__) - check_valid_array(data=x, source=stack_sliding_mse.__name__, accepted_ndims=[3, 4]) - stride = np.array([stride], dtype=np.int32) - stride_dev = cuda.to_device(stride) - out = np.full((x.shape[0]), fill_value=0.0, dtype=np.float32) - for batch_cnt, l in enumerate(range(0, x.shape[0], batch_size)): - r = l + batch_size - batch_x = x[l:r] - if batch_cnt != 0: - if x.ndim == 3: - ref_img = x[l-stride].astype(np.uint8).reshape(x.shape[1], x.shape[2]) - else: - ref_img = x[l-stride].astype(np.uint8).reshape(x.shape[1], x.shape[2], 3) - else: - ref_img = np.full_like(x[l], dtype=np.uint8, fill_value=0) - ref_img = ref_img.astype(np.uint8) - grid_x = (batch_x.shape[1] + 16 - 1) // 16 - grid_y = (batch_x.shape[2] + 16 - 1) // 16 - grid_z = batch_x.shape[0] - threads_per_block = (16, 16, 1) - blocks_per_grid = (grid_y, grid_x, grid_z) - ref_img_dev = cuda.to_device(ref_img) - x_dev = cuda.to_device(batch_x) - results = cuda.device_array((batch_x.shape[0], batch_x.shape[1], batch_x.shape[2]), dtype=np.uint8) - batch_cnt_dev = np.array([batch_cnt], dtype=np.int32) - if x.ndim == 3: - _grey_mse[blocks_per_grid, threads_per_block](x_dev, ref_img_dev, stride_dev, batch_cnt_dev, results) - else: - _rgb_mse[blocks_per_grid, threads_per_block](x_dev, ref_img_dev, stride_dev, batch_cnt_dev, results) - results = results.copy_to_host() - results = np.mean(results, axis=(1, 2)) - out[l:r] = results - return out \ No newline at end of file diff --git a/simba/data_processors/cuda/imgs_to_grayscale_cupy.py b/simba/data_processors/cuda/imgs_to_grayscale_cupy.py deleted file mode 100644 index 5815174b6..000000000 --- a/simba/data_processors/cuda/imgs_to_grayscale_cupy.py +++ /dev/null @@ -1,44 +0,0 @@ -__author__ = "Simon Nilsson" -__email__ = "sronilsson@gmail.com" - -from typing import Optional - -import cupy as cp -import numpy as np - -from simba.utils.checks import check_if_valid_img, check_instance -from simba.utils.read_write import read_img_batch_from_video_gpu - - -def img_stack_to_grayscale_cupy(imgs: np.ndarray, - batch_size: Optional[int] = 250) -> np.ndarray: - """ - Converts a stack of color images to grayscale using GPU acceleration with CuPy. - - :param np.ndarray imgs: A 4D NumPy array representing a stack of images with shape (num_images, height, width, channels). The images are expected to have 3 channels (RGB). - :param Optional[int] batch_size: The number of images to process in each batch. Defaults to 250. Adjust this parameter to fit your GPU's memory capacity. - :return np.ndarray: m A 3D NumPy array of shape (num_images, height, width) containing the grayscale images. If the input array is not 4D, the function returns the input as is. - - :example: - >>> imgs = read_img_batch_from_video_gpu(video_path=r"/mnt/c/troubleshooting/RAT_NOR/project_folder/videos/2022-06-20_NOB_IOT_1_cropped.mp4", verbose=False, start_frm=0, end_frm=i) - >>> imgs = np.stack(list(imgs.values()), axis=0).astype(np.uint8) - >>> gray_imgs = img_stack_to_grayscale_cupy(imgs=imgs) - """ - - - check_instance(source=img_stack_to_grayscale_cupy.__name__, instance=imgs, accepted_types=(np.ndarray,)) - check_if_valid_img(data=imgs[0], source=img_stack_to_grayscale_cupy.__name__) - if imgs.ndim != 4: - return imgs - results = cp.zeros((imgs.shape[0], imgs.shape[1], imgs.shape[2]), dtype=np.uint8) - n = int(np.ceil((imgs.shape[0] / batch_size))) - imgs = np.array_split(imgs, n) - start = 0 - for i in range(len(imgs)): - img_batch = cp.array(imgs[i]) - batch_cnt = img_batch.shape[0] - end = start + batch_cnt - vals = (0.07 * img_batch[:, :, :, 2] + 0.72 * img_batch[:, :, :, 1] + 0.21 * img_batch[:, :, :, 0]) - results[start:end] = vals.astype(cp.uint8) - start = end - return results.get() \ No newline at end of file diff --git a/simba/data_processors/cuda/imgs_to_greyscale_cuda.py b/simba/data_processors/cuda/imgs_to_greyscale_cuda.py deleted file mode 100644 index fea95a7bd..000000000 --- a/simba/data_processors/cuda/imgs_to_greyscale_cuda.py +++ /dev/null @@ -1,53 +0,0 @@ -__author__ = "Simon Nilsson" -__email__ = "sronilsson@gmail.com" - -import numpy as np -from numba import cuda - -from simba.utils.checks import check_if_valid_img, check_instance -from simba.utils.read_write import read_img_batch_from_video_gpu - - -@cuda.jit() -def _img_stack_to_grayscale(data, results): - y, x, i = cuda.grid(3) - if i < 0 or x < 0 or y < 0: - return - if i > results.shape[0] - 1 or x > results.shape[1] - 1 or y > results.shape[2] - 1: - return - else: - b = 0.07 * data[i][x][y][2] - g = 0.72 * data[i][x][y][1] - r = 0.21 * data[i][x][y][0] - val = b + g + r - results[i][x][y] = val - -def img_stack_to_grayscale_cuda(x: np.ndarray) -> np.ndarray: - """ - Convert image stack to grayscale using CUDA. - - :param np.ndarray x: 4d array of color images in numpy format. - :return np.ndarray: 3D array of greyscaled images. - - :example: - >>> imgs = read_img_batch_from_video_gpu(video_path=r"/mnt/c/troubleshooting/mitra/project_folder/videos/temp_2/592_MA147_Gq_Saline_0516_downsampled.mp4", verbose=False, start_frm=0, end_frm=i) - >>> imgs = np.stack(list(imgs.values()), axis=0).astype(np.uint8) - >>> grey_images = img_stack_to_grayscale_cuda(x=imgs) - """ - check_instance(source=img_stack_to_grayscale_cuda.__name__, instance=imgs, accepted_types=(np.ndarray,)) - check_if_valid_img(data=x[0], source=img_stack_to_grayscale_cuda.__name__) - if x.ndim != 4: - return x - x = np.ascontiguousarray(x).astype(np.uint8) - x_dev = cuda.to_device(x) - results = cuda.device_array((x.shape[0], x.shape[1], x.shape[2]), dtype=np.uint8) - grid_x = (x.shape[1] + 16 - 1) // 16 - grid_y = (x.shape[2] + 16 - 1) // 16 - grid_z = x.shape[0] - threads_per_block = (16, 16, 1) - blocks_per_grid = (grid_y, grid_x, grid_z) - _img_stack_to_grayscale[blocks_per_grid, threads_per_block](x_dev, results) - results = results.copy_to_host() - return results - - diff --git a/simba/data_processors/cuda/is_inside_circle.py b/simba/data_processors/cuda/is_inside_circle.py deleted file mode 100644 index 6d18445c1..000000000 --- a/simba/data_processors/cuda/is_inside_circle.py +++ /dev/null @@ -1,39 +0,0 @@ -__author__ = "Simon Nilsson" -__email__ = "sronilsson@gmail.com" - -import math - -import numpy as np -from numba import cuda - -THREADS_PER_BLOCK = 1024 -@cuda.jit -def _cuda_is_inside_circle(x, y, r, results): - i = cuda.grid(1) - if i > results.shape[0]: - return - else: - p = (math.sqrt((x[i][0] - y[0][0]) ** 2 + (x[i][1] - y[0][1]) ** 2)) - if p <= r[0]: - results[i] = 1 -def is_inside_circle(x: np.ndarray, y: np.ndarray, r: float) -> np.ndarray: - """ - Determines whether points in array `x` are inside the rectangle defined by the top left and bottom right vertices in array `y`. - - :param np.ndarray x: 2d numeric np.ndarray size (N, 2). - :param np.ndarray y: 2d numeric np.ndarray size (2, 2) (top left[x, y], bottom right[x, y]) - :return np.ndarray: 2d numeric boolean (N, 1) with 1s representing the point being inside the rectangle and 0 if the point is outside the rectangle. - """ - - x = np.ascontiguousarray(x).astype(np.int32) - y = np.ascontiguousarray(y).astype(np.int32) - x_dev = cuda.to_device(x) - y_dev = cuda.to_device(y) - r = np.array([r]).astype(np.float32) - r_dev = cuda.to_device(r) - results = cuda.device_array((x.shape[0]), dtype=np.int8) - bpg = (x.shape[0] + (THREADS_PER_BLOCK - 1)) // THREADS_PER_BLOCK - del x, y - _cuda_is_inside_circle[bpg, THREADS_PER_BLOCK](x_dev, y_dev, r_dev, results) - results = results.copy_to_host() - return results diff --git a/simba/data_processors/cuda/is_inside_polygon.py b/simba/data_processors/cuda/is_inside_polygon.py deleted file mode 100644 index b106a05fa..000000000 --- a/simba/data_processors/cuda/is_inside_polygon.py +++ /dev/null @@ -1,65 +0,0 @@ -__author__ = "Simon Nilsson" -__email__ = "sronilsson@gmail.com" - -import numpy as np -from numba import cuda - -THREADS_PER_BLOCK = 1024 - -@cuda.jit -def _cuda_is_inside_polygon(x, p, r): - i = cuda.grid(1) - if i > r.shape[0]: - return - else: - x, y, n = x[i][0], x[i][1], len(p) - p2x, p2y, xints, inside = 0.0, 0.0, 0.0, False - p1x, p1y = p[0] - for j in range(n + 1): - p2x, p2y = p[j % n] - if ( - (y > min(p1y, p2y)) - and (y <= max(p1y, p2y)) - and (x <= max(p1x, p2x)) - ): - if p1y != p2y: - xints = (y - p1y) * (p2x - p1x) / (p2y - p1y) + p1x - if p1x == p2x or x <= xints: - inside = not inside - p1x, p1y = p2x, p2y - if inside: - r[i] = 1 - - -def is_inside_polygon(x: np.ndarray, y: np.ndarray) -> np.ndarray: - """ - Determines whether points in array `x` are inside the polygon defined by the vertices in array `y`. - - This function uses GPU acceleration to perform the point-in-polygon test. The points in `x` are tested against - the polygon defined by the vertices in `y`. The result is an array where each element indicates whether - the corresponding point is inside the polygon. - - .. image:: _static/img/is_inside_polygon_cuda.webp - :width: 500 - :align: center - - :param np.ndarray x: An array of shape (N, 2) where each row represents a point in 2D space. The points are checked against the polygon. - :param np.ndarray y: An array of shape (M, 2) where each row represents a vertex of the polygon in 2D space. - :return np.ndarray: An array of shape (N,) where each element is 1 if the corresponding point in `x` is inside the polygon defined by `y`, and 0 otherwise. - - :example: - >>> x = np.random.randint(0, 200, (i, 2)).astype(np.int8) - >>> y = np.random.randint(0, 200, (4, 2)).astype(np.int8) - >>> results = is_inside_polygon(x=x, y=y) - >>> print(results) - >>> [1 0 1 0 1 1 0 0 1 0] - """ - x = np.ascontiguousarray(x).astype(np.int32) - y = np.ascontiguousarray(y).astype(np.int32) - x_dev = cuda.to_device(x) - y_dev = cuda.to_device(y) - results = cuda.device_array((x.shape[0]), dtype=np.int8) - bpg = (x.shape[0] + (THREADS_PER_BLOCK - 1)) // THREADS_PER_BLOCK - _cuda_is_inside_polygon[bpg, THREADS_PER_BLOCK](x_dev, y_dev, results) - results = results.copy_to_host() - return results \ No newline at end of file diff --git a/simba/data_processors/cuda/is_inside_rectangle.py b/simba/data_processors/cuda/is_inside_rectangle.py deleted file mode 100644 index 3920380a8..000000000 --- a/simba/data_processors/cuda/is_inside_rectangle.py +++ /dev/null @@ -1,45 +0,0 @@ -__author__ = "Simon Nilsson" -__email__ = "sronilsson@gmail.com" - -import numpy as np -from numba import cuda - -THREADS_PER_BLOCK = 1024 -@cuda.jit -def _cuda_is_inside_rectangle(x, y, r): - i = cuda.grid(1) - if i > r.shape[0]: - return - else: - if (x[i][0] >= y[0][0]) and (x[i][0] <= y[1][0]): - if (x[i][1] >= y[0][1]) and (x[i][1] <= y[1][1]): - r[i] = 1 - -def is_inside_rectangle(x: np.ndarray, y: np.ndarray) -> np.ndarray: - """ - Determines whether points in array `x` are inside the rectangle defined by the top left and bottom right vertices in array `y`. - - .. csv-table:: - :header: EXPECTED RUNTIMES - :file: ../../../docs/tables/is_inside_rectangle.csv - :widths: 10, 45, 45 - :align: center - :class: simba-table - :header-rows: 1 - - :param np.ndarray x: 2d numeric np.ndarray size (N, 2). - :param np.ndarray y: 2d numeric np.ndarray size (2, 2) (top left[x, y], bottom right[x, y]) - :return np.ndarray: 2d numeric boolean (N, 1) with 1s representing the point being inside the rectangle and 0 if the point is outside the rectangle. - - """ - - - x = np.ascontiguousarray(x).astype(np.int32) - y = np.ascontiguousarray(y).astype(np.int32) - x_dev = cuda.to_device(x) - y_dev = cuda.to_device(y) - results = cuda.device_array((x.shape[0]), dtype=np.int8) - bpg = (x.shape[0] + (THREADS_PER_BLOCK - 1)) // THREADS_PER_BLOCK - _cuda_is_inside_rectangle[bpg, THREADS_PER_BLOCK](x_dev, y_dev, results) - results = results.copy_to_host() - return results \ No newline at end of file diff --git a/simba/data_processors/cuda/sliding_circular_hotspots.py b/simba/data_processors/cuda/sliding_circular_hotspots.py deleted file mode 100644 index fafebc3ae..000000000 --- a/simba/data_processors/cuda/sliding_circular_hotspots.py +++ /dev/null @@ -1,55 +0,0 @@ -__author__ = "Simon Nilsson" -__email__ = "sronilsson@gmail.com" - -from typing import Optional - -try: - from typing import Literal -except: - from typing_extensions import Literal - -import cupy as cp -import numpy as np - - -def sliding_circular_hotspots(x: np.ndarray, - time_window: float, - sample_rate: float, - bins: np.ndarray, - batch_size: Optional[int] = int(3.5e+7)) -> np.ndarray: - """ - Calculate the proportion of data points falling within specified circular bins over a sliding time window using GPU - - This function processes time series data representing angles (in degrees) and calculates the proportion of data - points within specified angular bins over a sliding window. The calculations are performed in batches to - accommodate large datasets efficiently. - - :param np.ndarray x: The input time series data in degrees. Should be a 1D numpy array. - :param float time_window: The size of the sliding window in seconds. - :param float sample_rate: The sample rate of the time series data (i.e., hz, fps). - :param ndarray bins: 2D array of shape representing circular bins defining [start_degree, end_degree] inclusive. - :param Optional[int] batch_size: The size of each batch for processing the data. Default is 5e+7 (50m). - :return: A 2D numpy array where each row corresponds to a time point in `data`, and each column represents a circular bin. The values in the array represent the proportion of data points within each bin at each time point. The first column represents the first bin. - :rtype: np.ndarray - """ - - n = x.shape[0] - x = cp.asarray(x, dtype=cp.float16) - results = cp.full((x.shape[0], bins.shape[0]), dtype=cp.float16, fill_value=-1) - window_size = int(cp.ceil(time_window * sample_rate)) - for cnt, left in enumerate(range(0, n, batch_size)): - right = int(min(left + batch_size, n)) - if cnt > 0: - left = left - window_size + 1 - x_batch = x[left:right] - x_batch = cp.lib.stride_tricks.sliding_window_view(x_batch, window_size).astype(cp.float16) - batch_results = cp.full((x_batch.shape[0], bins.shape[0]), dtype=cp.float16, fill_value=-1) - for bin_cnt in range(bins.shape[0]): - if bins[bin_cnt][0] > bins[bin_cnt][1]: - mask = ((x_batch >= bins[bin_cnt][0]) & (x_batch <= 360)) | ((x_batch >= 0) & (x_batch <= bins[bin_cnt][1])) - else: - mask = (x_batch >= bins[bin_cnt][0]) & (x_batch <= bins[bin_cnt][1]) - count_per_row = cp.array(mask.sum(axis=1) / window_size).reshape(-1, ) - batch_results[:, bin_cnt] = count_per_row - results[left + window_size - 1:right, ] = batch_results - return results.get() \ No newline at end of file diff --git a/simba/data_processors/cuda/sliding_circular_mean.py b/simba/data_processors/cuda/sliding_circular_mean.py deleted file mode 100644 index 0d670ae8a..000000000 --- a/simba/data_processors/cuda/sliding_circular_mean.py +++ /dev/null @@ -1,61 +0,0 @@ -__author__ = "Simon Nilsson" -__email__ = "sronilsson@gmail.com" - -from typing import Optional - -import cupy -import numpy as np - - -def sliding_circular_mean(x: np.ndarray, - time_window: float, - sample_rate: int, - batch_size: Optional[int] = 3e+7) -> np.ndarray: - - """ - Calculate the sliding circular mean over a time window for a series of angles. - - This function computes the circular mean of angles in the input array `x` over a specified sliding window. - The circular mean is a measure of the average direction for angles, which is especially useful for angular data - where traditional averaging would not be meaningful due to the circular nature of angles (e.g., 359° and 1° should average to 0°). - - The calculation is performed using a sliding window approach, where the circular mean is computed for each window - of angles. The function leverages GPU acceleration via CuPy for efficiency when processing large datasets. - - The circular mean :math:`\\mu` for a set of angles is calculated using the following formula: - - .. math:: - - \\mu = \\text{atan2}\\left(\\frac{1}{N} \\sum_{i=1}^{N} \\sin(\\theta_i), \\frac{1}{N} \\sum_{i=1}^{N} \\cos(\\theta_i)\\right) - - - :math:`\\theta_i` are the angles in radians within the sliding window - - :math:`N` is the number of samples in the window - - - :param np.ndarray x: Input array containing angle values in degrees. The array should be 1-dimensional. - :param float time_window: Time duration for the sliding window, in seconds. This determines the number of samples in each window based on the `sample_rate`. - :param int sample_rate: The number of samples per second (i.e., FPS). This is used to calculate the window size in terms of array indices. - :param Optional[int] batch_size: The maximum number of elements to process in each batch. This is used to handle large arrays by processing them in chunks to avoid memory overflow. Defaults to 3e+7 (30 million elements). - :return np.ndarray: A 1D numpy array of the same length as `x`, containing the circular mean for each sliding window. Values before the window is fully populated will be set to -1. - - :example: - >>> x = np.random.randint(0, 361, (i, )).astype(np.int32) - >>> results = sliding_circular_mean(x, 1, 10) - """ - - - window_size = np.ceil(time_window * sample_rate).astype(np.int64) - n = x.shape[0] - results = cupy.full(x.shape[0], -1, dtype=np.int32) - for cnt, left in enumerate(range(0, int(n), int(batch_size))): - right = np.int32(min(left + batch_size, n)) - if cnt > 0: - left = left - window_size+1 - x_batch = cupy.asarray(x[left:right]) - x_batch = cupy.lib.stride_tricks.sliding_window_view(x_batch, window_size) - x_batch = np.deg2rad(x_batch) - cos, sin = cupy.cos(x_batch).astype(np.float32), cupy.sin(x_batch).astype(np.float32) - r = cupy.rad2deg(cupy.arctan2(cupy.mean(sin, axis=1), cupy.mean(cos, axis=1))) - r = cupy.where(r < 0, r + 360, r) - results[left + window_size - 1:right] = r - return results.get() diff --git a/simba/data_processors/cuda/sliding_circular_range.py b/simba/data_processors/cuda/sliding_circular_range.py deleted file mode 100644 index ecdd4aba7..000000000 --- a/simba/data_processors/cuda/sliding_circular_range.py +++ /dev/null @@ -1,60 +0,0 @@ -__author__ = "Simon Nilsson" -__email__ = "sronilsson@gmail.com" - -from typing import Optional - -try: - from typing import Literal -except: - from typing_extensions import Literal - -import cupy as cp -import numpy as np - - -def sliding_circular_range(x: np.ndarray, - time_window: float, - sample_rate: float, - batch_size: Optional[int] = int(5e+7)) -> np.ndarray: - """ - Computes the sliding circular range of a time series data array using GPU. - - This function calculates the circular range of a time series data array using a sliding window approach. - The input data is assumed to be in degrees, and the function handles the circular nature of the data - by considering the circular distance between angles. - - .. math:: - - R = \\min \\left( \\text{max}(\\Delta \\theta) - \\text{min}(\\Delta \\theta), \\, 360 - \\text{max}(\\Delta \\theta) + \\text{min}(\\Delta \\theta) \\right) - - where: - - - :math:`\\Delta \\theta` is the difference between angles within the window, - - :math:`360` accounts for the circular nature of the data (i.e., wrap-around at 360 degrees). - - :param np.ndarray x: The input time series data in degrees. Should be a 1D numpy array. - :param float time_window: The size of the sliding window in seconds. - :param float sample_rate: The sample rate of the time series data (i.e., hz, fps). - :param Optional[int] batch_size: The size of each batch for processing the data. Default is 5e+7 (50m). - :return: A numpy array containing the sliding circular range values. - :rtype: np.ndarray - - :example: - >>> x = np.random.randint(0, 361, (19, )).astype(np.int32) - >>> p = sliding_circular_range(x, 1, 10) - """ - - n = x.shape[0] - x = cp.asarray(x, dtype=cp.float16) - results = cp.zeros_like(x, dtype=cp.int16) - x = cp.deg2rad(x).astype(cp.float16) - window_size = int(cp.ceil(time_window * sample_rate)) - for cnt, left in enumerate(range(0, n, batch_size)): - right = int(min(left + batch_size, n)) - if cnt > 0: - left = left - window_size + 1 - x_batch = x[left:right] - x_batch = cp.lib.stride_tricks.sliding_window_view(x_batch, window_size).astype(cp.float16) - x_batch = cp.sort(x_batch) - results[left + window_size - 1:right] = cp.abs(cp.rint(cp.rad2deg(cp.amin(cp.vstack([x_batch[:, -1] - x_batch[:, 0], 2 * cp.pi - cp.max(cp.diff(x_batch), axis=1)]).T, axis=1)))) - return results.get() \ No newline at end of file diff --git a/simba/data_processors/cuda/sliding_circular_std.py b/simba/data_processors/cuda/sliding_circular_std.py deleted file mode 100644 index e32cb1fe3..000000000 --- a/simba/data_processors/cuda/sliding_circular_std.py +++ /dev/null @@ -1,60 +0,0 @@ -__author__ = "Simon Nilsson" -__email__ = "sronilsson@gmail.com" - -from typing import Optional - -try: - from typing import Literal -except: - from typing_extensions import Literal - -import cupy as cp -import numpy as np - - -def sliding_circular_std(x: np.ndarray, - time_window: float, - sample_rate: float, - batch_size: Optional[int] = int(5e+7)) -> np.ndarray: - """ - Calculate the sliding circular standard deviation of a time series data on GPU. - - This function computes the circular standard deviation over a sliding window for a given time series array. - The time series data is assumed to be in degrees, and the function converts it to radians for computation. - The sliding window approach is used to handle large datasets efficiently, processing the data in batches. - - The circular standard deviation (σ) is computed using the formula: - - .. math:: - - \sigma = \sqrt{-2 \cdot \log \left|\text{mean}\left(\exp(i \cdot x_{\text{batch}})\right)\right|} - - where :math:`x_{\text{batch}}` is the data within the current sliding window, and :math:`\text{mean}` and - :math:`\log` are computed in the circular (complex plane) domain. - - :param np.ndarray x: The input time series data in degrees. Should be a 1D numpy array. - :param float time_window: The size of the sliding window in seconds. - :param float sample_rate: The sample rate of the time series data (i.e., hz, fps). - :param Optional[int] batch_size: The size of each batch for processing the data. Default is 5e+7 (50m). - - :return: A numpy array containing the sliding circular standard deviation values. - :rtype: np.ndarray - """ - - - n = x.shape[0] - x = cp.asarray(x, dtype=cp.float16) - results = cp.zeros_like(x, dtype=cp.float16) - x = np.deg2rad(x).astype(cp.float16) - window_size = int(np.ceil(time_window * sample_rate)) - for cnt, left in enumerate(range(0, n, batch_size)): - right = int(min(left + batch_size, n)) - if cnt > 0: - left = left - window_size + 1 - x_batch = x[left:right] - x_batch = cp.lib.stride_tricks.sliding_window_view(x_batch, window_size).astype(cp.float16) - m = cp.log(cp.abs(cp.mean(cp.exp(1j * x_batch), axis=1))) - stdev = cp.rad2deg(cp.sqrt(-2 * m)) - results[left + window_size - 1:right] = stdev - - return results.get() diff --git a/simba/data_processors/cuda/sliding_mean.py b/simba/data_processors/cuda/sliding_mean.py deleted file mode 100644 index ff00fcd5e..000000000 --- a/simba/data_processors/cuda/sliding_mean.py +++ /dev/null @@ -1,54 +0,0 @@ -__author__ = "Simon Nilsson" -__email__ = "sronilsson@gmail.com" - -import numpy as np -from numba import cuda - -THREADS_PER_BLOCK = 1024 - -@cuda.jit(device=True) -def _cuda_sum(x: np.ndarray): - s = 0 - for i in range(x.shape[0]): - s += x[i] - return s - -@cuda.jit -def _cuda_sliding_mean(x: np.ndarray, d: np.ndarray, results: np.ndarray): - r = cuda.grid(1) - l = np.int32(r - (d[0] - 1)) - if (r >= results.shape[0]) or (l < 0): - results[r] = -1 - else: - x_i = x[l:r+1] - s = _cuda_sum(x_i) - results[r] = s / x_i.shape[0] - -def sliding_mean(x: np.ndarray, time_window: float, sample_rate: int) -> np.ndarray: - """ - Computes the mean of values within a sliding window over a 1D numpy array `x` using CUDA for acceleration. - - .. image:: _static/img/sliding_mean_cuda.png - :width: 500 - :align: center - - :param np.ndarray x: The input 1D numpy array of floats. The array over which the sliding window sum is computed. - :param float time_window:The size of the sliding window in seconds. This window slides over the array `x` to compute the sum. - :param int sample_rate: The number of samples per second in the array `x`. This is used to convert the time-based window size into the number of samples. - :return np.ndarray: A numpy array containing the sum of values within each position of the sliding window. - - :example: - >>> x = np.random.randint(1, 11, (100, )).astype(np.float32) - >>> time_window = 1 - >>> sample_rate = 10 - >>> r_x = sliding_mean(x=x, time_window=time_window, sample_rate=10) - """ - x = np.ascontiguousarray(x).astype(np.int32) - window_size = np.array([np.ceil(time_window * sample_rate)]) - x_dev = cuda.to_device(x) - delta_dev = cuda.to_device(window_size) - results = cuda.device_array(x.shape, dtype=np.float32) - bpg = (x.shape[0] + (THREADS_PER_BLOCK - 1)) // THREADS_PER_BLOCK - _cuda_sliding_mean[bpg, THREADS_PER_BLOCK](x_dev, delta_dev, results) - results = results.copy_to_host() - return results \ No newline at end of file diff --git a/simba/data_processors/cuda/sliding_min.py b/simba/data_processors/cuda/sliding_min.py deleted file mode 100644 index a3db6769d..000000000 --- a/simba/data_processors/cuda/sliding_min.py +++ /dev/null @@ -1,52 +0,0 @@ -__author__ = "Simon Nilsson" -__email__ = "sronilsson@gmail.com" - -import numpy as np -from numba import cuda - -THREADS_PER_BLOCK = 1024 - -@cuda.jit -def _cuda_sliding_min(x: np.ndarray, d: np.ndarray, results: np.ndarray): - def _cuda_min(a, b): - return a if a < b else b - r = cuda.grid(1) - l = np.int32(r - (d[0]-1)) - if (r > results.shape[0]) or (l < 0): - results[r] = -1 - else: - x_i = x[l:r-1] - local_min = x_i[0] - for k in range(x_i.shape[0]): - local_min = _cuda_min(local_min, x_i[k]) - results[r] = local_min - -def sliding_min(x: np.ndarray, time_window: float, sample_rate: int) -> np.ndarray: - """ - Computes the minimum value within a sliding window over a 1D numpy array `x` using CUDA for acceleration. - - .. image:: _static/img/sliding_min_cuda.png - :width: 500 - :align: center - - :param np.ndarray x: Input 1D numpy array of floats. The array over which the sliding window minimum is computed. - :param float time_window: The size of the sliding window in seconds. - :param intsample_rate: The sampling rate of the data, which determines the number of samples per second. - :return: A numpy array containing the minimum value for each position of the sliding window. - - :example: - >>> x = np.arange(0, 10000000) - >>> time_window = 1 - >>> sample_rate = 10 - >>> sliding_min(x=x, time_window=time_window, sample_rate=sample_rate) - """ - - x = np.ascontiguousarray(x).astype(np.float32) - window_size = np.array([np.ceil(time_window * sample_rate)]) - x_dev = cuda.to_device(x) - delta_dev = cuda.to_device(window_size) - results = cuda.device_array(x.shape, dtype=np.float32) - bpg = (x.shape[0] + (THREADS_PER_BLOCK - 1)) // THREADS_PER_BLOCK - _cuda_sliding_min[bpg, THREADS_PER_BLOCK](x_dev, delta_dev, results) - results = results.copy_to_host() - return results diff --git a/simba/data_processors/cuda/sliding_rayleigh_z.py b/simba/data_processors/cuda/sliding_rayleigh_z.py deleted file mode 100644 index ff0a65fc0..000000000 --- a/simba/data_processors/cuda/sliding_rayleigh_z.py +++ /dev/null @@ -1,76 +0,0 @@ -__author__ = "Simon Nilsson" -__email__ = "sronilsson@gmail.com" - -from typing import Optional, Tuple - -try: - from typing import Literal -except: - from typing_extensions import Literal - -import cupy as cp -import numpy as np - - -def sliding_rayleigh_z(x: np.ndarray, - time_window: float, - sample_rate: float, - batch_size: Optional[int] = int(5e+7)) -> Tuple[np.ndarray, np.ndarray]: - - """ - Computes the Rayleigh Z-statistic over a sliding window for a given time series of angles - - This function calculates the Rayleigh Z-statistic, which tests the null hypothesis that the population of angles - is uniformly distributed around the circle. The calculation is performed over a sliding window across the input - time series, and results are computed in batches for memory efficiency. - - Data is processed using GPU acceleration via CuPy, which allows for faster computation compared to a CPU-based approach. - - .. note:: - Adapted from ``pingouin.circular.circ_rayleigh`` and ``pycircstat.tests.rayleigh``. - - - **Rayleigh Z-statistic:** - - The Rayleigh Z-statistic is given by: - - .. math:: - - R = \frac{1}{n} \sqrt{\left(\sum_{i=1}^{n} \cos(\theta_i)\right)^2 + \left(\sum_{i=1}^{n} \sin(\theta_i)\right)^2} - - where: - - :math:`\theta_i` are the angles in the window. - - :math:`n` is the number of angles in the window. - - :param np.ndarray x: Input array of angles in degrees. Should be a 1D numpy array. - :param float time_window: The size of the sliding window in time units (e.g., seconds). - :param float sample_rate: The sampling rate of the input time series in samples per time unit (e.g., Hz, fps). - :param Optional[int] batch_size: The number of samples to process in each batch. Default is 5e7 (50m). Reducing this value may save memory at the cost of longer computation time. - :return: - A tuple containing two numpy arrays: - - **z_results**: Rayleigh Z-statistics for each position in the input array where the window was fully applied. - - **p_results**: Corresponding p-values for the Rayleigh Z-statistics. - :rtype: Tuple[np.ndarray, np.ndarray] - """ - - n = x.shape[0] - x = cp.asarray(x, dtype=cp.float16) - z_results = cp.zeros_like(x, dtype=cp.float16) - p_results = cp.zeros_like(x, dtype=cp.float16) - x = np.deg2rad(x).astype(cp.float16) - window_size = int(np.ceil(time_window * sample_rate)) - for cnt, left in enumerate(range(0, n, batch_size)): - right = int(min(left + batch_size, n)) - if cnt > 0: - left = left - window_size + 1 - x_batch = x[left:right] - x_batch = cp.lib.stride_tricks.sliding_window_view(x_batch, window_size).astype(cp.float16) - cos_sums = cp.nansum(cp.cos(x_batch), axis=1) ** 2 - sin_sums = cp.nansum(cp.sin(x_batch), axis=1) ** 2 - R = cp.sqrt(cos_sums + sin_sums) / window_size - Z = window_size * (R**2) - P = cp.exp(np.sqrt(1 + 4 * window_size + 4 * (window_size ** 2 - R ** 2)) - (1 + 2 * window_size)) - z_results[left + window_size - 1:right] = Z - p_results[left + window_size - 1:right] = P - - return z_results.get(), p_results.get() \ No newline at end of file diff --git a/simba/data_processors/cuda/sliding_resultant_vector_length.py b/simba/data_processors/cuda/sliding_resultant_vector_length.py deleted file mode 100644 index 4d85e21cf..000000000 --- a/simba/data_processors/cuda/sliding_resultant_vector_length.py +++ /dev/null @@ -1,63 +0,0 @@ -__author__ = "Simon Nilsson" -__email__ = "sronilsson@gmail.com" - -from typing import Optional - -import cupy -import numpy as np - - -def sliding_resultant_vector_length(x: np.ndarray, - time_window: float, - sample_rate: int, - batch_size: Optional[int] = 3e+7) -> np.ndarray: - - """ - Calculate the sliding resultant vector length over a time window for a series of angles. - - This function computes the resultant vector length (R) for each window of angles in the input array `x`. - The resultant vector length is a measure of the concentration of angles, and it ranges from 0 to 1, where 1 - indicates all angles point in the same direction, and 0 indicates uniform distribution of angles. - - For a given sliding window of angles, the resultant vector length :math:`R` is calculated using the following formula: - - .. math:: - - R = \\frac{1}{N} \\sqrt{\\left(\\sum_{i=1}^{N} \\cos(\\theta_i)\\right)^2 + \\left(\\sum_{i=1}^{N} \\sin(\\theta_i)\\right)^2} - - where: - - - :math:`\\theta_i` are the angles in radians within the sliding window - - :math:`N` is the number of samples in the window - - The computation is performed in a sliding window manner over the entire array, utilizing GPU acceleration - with CuPy for efficiency, especially on large datasets. - - - :param np.ndarray x: Input array containing angle values in degrees. The array should be 1-dimensional. - :param float time_window: Time duration for the sliding window, in seconds. This determines the number of samples in each window based on the `sample_rate`. - :param int sample_rate: The number of samples per second (i.e., FPS). This is used to calculate the window size in terms of array indices. - :param Optional[int] batch_size: The maximum number of elements to process in each batch. This is used to handle large arrays by processing them in chunks to avoid memory overflow. Defaults to 3e+7 (30 million elements). - :return np.ndarray: A 1D numpy array of the same length as `x`, containing the resultant vector length for each sliding window. Values before the window is fully populated will be set to -1. - - - :example: - >>> x = np.random.randint(0, 361, (5000, )).astype(np.int32) - >>> results = sliding_resultant_vector_length(x, 1, 10) - """ - - window_size = np.ceil(time_window * sample_rate).astype(np.int64) - n = x.shape[0] - results = cupy.full(x.shape[0], -1, dtype=np.float32) - for cnt, left in enumerate(range(0, int(n), int(batch_size))): - right = np.int32(min(left + batch_size, n)) - if cnt > 0: - left = left - window_size+1 - x_batch = cupy.asarray(x[left:right]) - x_batch = cupy.lib.stride_tricks.sliding_window_view(x_batch, window_size) - x_batch = np.deg2rad(x_batch) - cos, sin = cupy.cos(x_batch).astype(np.float32), cupy.sin(x_batch).astype(np.float32) - cos_sum, sin_sum = cupy.sum(cos, axis=1), cupy.sum(sin, axis=1) - r = np.sqrt(cos_sum ** 2 + sin_sum ** 2) / window_size - results[left+window_size-1:right] = r - return results.get() \ No newline at end of file diff --git a/simba/data_processors/cuda/sliding_spearmans_rank.py b/simba/data_processors/cuda/sliding_spearmans_rank.py deleted file mode 100644 index 85dae6af6..000000000 --- a/simba/data_processors/cuda/sliding_spearmans_rank.py +++ /dev/null @@ -1,67 +0,0 @@ -__author__ = "Simon Nilsson" -__email__ = "sronilsson@gmail.com" - -from typing import Optional - -import cupy as cp -import numpy as np - - -def sliding_spearmans_rank(x: np.ndarray, - y: np.ndarray, - time_window: float, - sample_rate: int, - batch_size: Optional[int] = int(1.6e+7)) -> np.ndarray: - """ - Computes the Spearman's rank correlation coefficient between two 1D arrays `x` and `y` - over sliding windows of size `time_window * sample_rate`. The computation is performed - in batches to optimize memory usage, leveraging GPU acceleration with CuPy. - - .. math:: - \rho = 1 - \frac{6 \sum d_i^2}{n_w(n_w^2 - 1)} - - .. math:: - The function uses CuPy to perform GPU-accelerated calculations. Ensure that your environment - supports GPU computation with CuPy installed. - - Where: - - \( \rho \) is the Spearman's rank correlation coefficient. - - \( d_i \) is the difference between the ranks of corresponding elements in the sliding window. - - \( n_w \) is the size of the sliding window. - - :param np.ndarray x: The first 1D array containing the values for Feature 1. - :param np.ndarray y: The second 1D array containing the values for Feature 2. - :param float time_window: The size of the sliding window in seconds. - :param int sample_rate: The sampling rate (samples per second) of the data. - :param Optional[int] batch_size: The size of each batch to process at a time for memory efficiency. Defaults to 1.6e7. - :return: A 1D numpy array containing the Spearman's rank correlation coefficient for each sliding window. - :rtype: np.ndarray - - :example: - >>> x = np.array([9, 10, 13, 22, 15, 18, 15, 19, 32, 11]) - >>> y = np.array([11, 12, 15, 19, 21, 26, 19, 20, 22, 19]) - >>> sliding_spearmans_rank(x, y, time_window=0.5, sample_rate=2) - """ - - - window_size = int(np.ceil(time_window * sample_rate)) - n = x.shape[0] - results = cp.full(n, -1, dtype=cp.float32) - - for cnt, left in enumerate(range(0, n, batch_size)): - right = int(min(left + batch_size, n)) - if cnt > 0: - left = left - window_size + 1 - x_batch = cp.asarray(x[left:right]) - y_batch = cp.asarray(y[left:right]) - x_batch = cp.lib.stride_tricks.sliding_window_view(x_batch, window_size) - y_batch = cp.lib.stride_tricks.sliding_window_view(y_batch, window_size) - rank_x = cp.argsort(cp.argsort(x_batch, axis=1), axis=1) - rank_y = cp.argsort(cp.argsort(y_batch, axis=1), axis=1) - d_squared = cp.sum((rank_x - rank_y) ** 2, axis=1) - n_w = window_size - s = 1 - (6 * d_squared) / (n_w * (n_w ** 2 - 1)) - - results[left + window_size - 1:right] = s - - return cp.asnumpy(results) \ No newline at end of file diff --git a/simba/data_processors/cuda/sliding_std.py b/simba/data_processors/cuda/sliding_std.py deleted file mode 100644 index d33ccb451..000000000 --- a/simba/data_processors/cuda/sliding_std.py +++ /dev/null @@ -1,58 +0,0 @@ -__author__ = "Simon Nilsson" -__email__ = "sronilsson@gmail.com" - -import numpy as np -from numba import cuda - -THREADS_PER_BLOCK = 1024 - -@cuda.jit(device=True) -def _cuda_sum(x: np.ndarray): - s = 0 - for i in range(x.shape[0]): - s += x[i] - return s - -@cuda.jit(device=True) -def _cuda_std(x: np.ndarray, x_hat: float): - std = 0 - for i in range(x.shape[0]): - std += (x[0] - x_hat) ** 2 - return std - -@cuda.jit(device=False) -def _cuda_sliding_std(x: np.ndarray, d: np.ndarray, results: np.ndarray): - r = cuda.grid(1) - l = np.int32(r - (d[0] - 1)) - if (r >= results.shape[0]) or (l < 0): - results[r] = -1 - else: - x_i = x[l:r + 1] - s = _cuda_sum(x_i) - m = s / x_i.shape[0] - std = _cuda_std(x_i, m) - results[r] = std - -def sliding_std(x: np.ndarray, time_window: float, sample_rate: int) -> np.ndarray: - """ - - :param np.ndarray x: The input 1D numpy array of floats. The array over which the sliding window sum is computed. - :param float time_window:The size of the sliding window in seconds. This window slides over the array `x` to compute the sum. - :param int sample_rate: The number of samples per second in the array `x`. This is used to convert the time-based window size into the number of samples. - :return np.ndarray: A numpy array containing the sum of values within each position of the sliding window. - - :example: - >>> x = np.random.randint(1, 11, (100, )).astype(np.float32) - >>> time_window = 1 - >>> sample_rate = 10 - >>> r_x = sliding_sum(x=x, time_window=time_window, sample_rate=10) - """ - x = np.ascontiguousarray(x).astype(np.int32) - window_size = np.array([np.ceil(time_window * sample_rate)]) - x_dev = cuda.to_device(x) - delta_dev = cuda.to_device(window_size) - results = cuda.device_array(x.shape, dtype=np.float32) - bpg = (x.shape[0] + (THREADS_PER_BLOCK - 1)) // THREADS_PER_BLOCK - _cuda_sliding_std[bpg, THREADS_PER_BLOCK](x_dev, delta_dev, results) - results = results.copy_to_host() - return results \ No newline at end of file diff --git a/simba/data_processors/cuda/sliding_sum.py b/simba/data_processors/cuda/sliding_sum.py deleted file mode 100644 index 89f15045e..000000000 --- a/simba/data_processors/cuda/sliding_sum.py +++ /dev/null @@ -1,47 +0,0 @@ -__author__ = "Simon Nilsson" -__email__ = "sronilsson@gmail.com" - -import numpy as np -from numba import cuda - -THREADS_PER_BLOCK = 1024 - -@cuda.jit -def _cuda_sliding_sum(x: np.ndarray, d: np.ndarray, results: np.ndarray): - r = cuda.grid(1) - l = np.int32(r - (d[0]-1)) - if (r > results.shape[0]) or (l < 0): - results[r] = -1 - else: - x_i = x[l:r] - local_sum = 0 - for k in range(x_i.shape[0]): - local_sum += x_i[k] - results[r-1] = local_sum - -def sliding_sum(x: np.ndarray, time_window: float, sample_rate: int) -> np.ndarray: - """ - Computes the sum of values within a sliding window over a 1D numpy array `x` using CUDA for acceleration. - - :param np.ndarray x: The input 1D numpy array of floats. The array over which the sliding window sum is computed. - :param float time_window:The size of the sliding window in seconds. This window slides over the array `x` to compute the sum. - :param int sample_rate: The number of samples per second in the array `x`. This is used to convert the time-based window size into the number of samples. - :return np.ndarray: A numpy array containing the sum of values within each position of the sliding window. - - :example: - >>> x = np.random.randint(1, 11, (100, )).astype(np.float32) - >>> time_window = 1 - >>> sample_rate = 10 - >>> r_x = sliding_sum(x=x, time_window=time_window, sample_rate=10) - """ - x = np.ascontiguousarray(x).astype(np.float32) - window_size = np.array([np.ceil(time_window * sample_rate)]) - x_dev = cuda.to_device(x) - delta_dev = cuda.to_device(window_size) - results = cuda.device_array(x.shape, dtype=np.float32) - bpg = (x.shape[0] + (THREADS_PER_BLOCK - 1)) // THREADS_PER_BLOCK - _cuda_sliding_sum[bpg, THREADS_PER_BLOCK](x_dev, delta_dev, results) - results = results.copy_to_host() - return results - - diff --git a/simba/mixins/geometry_mixin.py b/simba/mixins/geometry_mixin.py index 6056d9355..11994b233 100644 --- a/simba/mixins/geometry_mixin.py +++ b/simba/mixins/geometry_mixin.py @@ -3548,12 +3548,34 @@ def filter_low_p_bps_for_shapes(x: np.ndarray, p: np.ndarray, threshold: float): results[i][j] = new_val return results - - - - - - + @staticmethod + def get_shape_lengths_widths(shapes: Union[List[Polygon], Polygon]) -> Dict[str, Any]: + """ + Calculate the lengths and widths of the minimum bounding rectangles of polygons. + + :param Union[List[Polygon], Polygon] shapes: A single Polygon or a list of Polygons for which the MBR dimensions are calculated. Each polygon is assumed to be a valid shapely Polygon object. If a single Polygon is provided, it is internally converted to a list + :return: A dictionary containing: + - 'lengths': A list of the lengths of the MBR for each polygon. + - 'widths': A list of the widths of the MBR for each polygon. + - 'max_length': The maximum length found among all polygons. + - 'min_length': The minimum length found among all polygons. + - 'max_width': The maximum width found among all polygons. + - 'min_width': The minimum width found among all polygons. + :rtype: Dict[str, Any] + """ + widths, lengths, max_length, max_width, min_length, min_width = [], [], -np.inf, -np.inf, np.inf, np.inf + if isinstance(shapes, Polygon): + shapes = [shapes] + for shape in shapes: + shape_cords = list(zip(*shape.exterior.coords.xy)) + mbr_lengths = [LineString((shape_cords[i], shape_cords[i + 1])).length for i in range(len(shape_cords) - 1)] + width, length = min(mbr_lengths), max(mbr_lengths) + min_length, max_length = min(min_length, length), max(max_length, length) + min_width, max_width = min(min_width, width), max(max_width, width) + lengths.append(length); + widths.append(width) + return {'lengths': lengths, 'widths': widths, 'max_length': max_length, 'min_length': min_length, + 'min_width': min_width, 'max_width': max_width} # data = np.array([[[364, 308], [383, 323], [403, 335], [423, 351]], # [[356, 307], [376, 319], [396, 331], [419, 347]], diff --git a/simba/mixins/image_mixin.py b/simba/mixins/image_mixin.py index 3cbd9755b..295f3a42e 100644 --- a/simba/mixins/image_mixin.py +++ b/simba/mixins/image_mixin.py @@ -1689,6 +1689,25 @@ def get_blob_locations(video_path: Union[str, os.PathLike], stdout_success(f'Video {video_meta["video_name"]} blob detection complete', elapsed_time=timer.elapsed_time_str) return results.astype(np.int32) + @staticmethod + def is_video_color(video: Union[str, os.PathLike, cv2.VideoCapture]): + """ + Determines whether a video is in color or greyscale. + + :param Union[str, os.PathLike, cv2.VideoCapture] video: The video source, either a cv2.VideoCapture object or a path to a file on disk. + :return: Returns `True` if the video is in color (has more than one channel), and `False` if the video is greyscale (single channel). + :rtype: bool + """ + + frm = ImageMixin.find_first_non_uniform_clr_frm(video_path=video) + if frm.ndim > 2: + if frm.shape[2] != 1: + return True + else: + return False + else: + return False + #x = ImageMixin.get_blob_locations(video_path=r"C:\troubleshooting\RAT_NOR\project_folder\videos\2022-06-20_NOB_DOT_4_downsampled_bg_subtracted.mp4", gpu=True) # imgs = ImageMixin().read_all_img_in_dir(dir='/Users/simon/Desktop/envs/simba/troubleshooting/RAT_NOR/project_folder/videos/examples') diff --git a/simba/roi_tools/ROI_define.py b/simba/roi_tools/ROI_define.py index 18468f0f8..886021b96 100644 --- a/simba/roi_tools/ROI_define.py +++ b/simba/roi_tools/ROI_define.py @@ -11,9 +11,8 @@ from simba.roi_tools.ROI_image import ROI_image_class from simba.roi_tools.ROI_move_shape import move_edge, update_all_tags from simba.roi_tools.ROI_multiply import create_emty_df -from simba.roi_tools.ROI_size_calculations import (circle_size_calc, - polygon_size_calc, - rectangle_size_calc) +from simba.roi_tools.ROI_size_calculations import (circle_size_calc, polygon_size_calc, rectangle_size_calc) +from simba.mixins.plotting_mixin import PlottingMixin from simba.ui.tkinter_functions import SimbaButton, hxtScrollbar from simba.utils.checks import check_file_exist_and_readable from simba.utils.enums import Formats, TagNames @@ -83,8 +82,8 @@ def __init__(self, config_path: str, video_path: str): self.img_no = 1 self.duplicate_jump_size = 20 self.click_sens = 10 - self.text_size = 5 - self.text_thickness = 3 + self.text_size, _, _ = PlottingMixin().get_optimal_font_scales(text='TEN DIGITS', accepted_px_width=int(self.video_info['Resolution_width']/10), accepted_px_height=int(self.video_info['Resolution_height']/10), text_thickness=2, font=cv2.FONT_HERSHEY_SIMPLEX) + self.text_thickness = 2 self.line_type = -1 self.named_shape_colors = get_color_dict() self.window_menus() @@ -318,7 +317,7 @@ def interact_menus(self): self.zoom_pct.insert(0, 10) self.pan = Button(self.interact_frame, text="Pan", fg=self.non_select_color, state=DISABLED, command=lambda: self.set_interact_state("pan")) - self.shape_info_btn = SimbaButton(parent=self.interact_frame, txt="SHOW SHAPE INFO", img='info', txt_clr=self.non_select_color, enabled=False, cmd=self.show_shape_information) + self.shape_info_btn = SimbaButton(parent=self.interact_frame, txt="SHOW SHAPE INFO", img='info', txt_clr=self.non_select_color, enabled=True, cmd=self.show_shape_information) self.interact_frame.grid(row=6, sticky=W) @@ -377,27 +376,21 @@ def show_shape_information(self): self.rectangle_size_dict = {} self.rectangle_size_dict["Rectangles"] = {} for rectangle in self.image_data.out_rectangles: - self.rectangle_size_dict["Rectangles"][rectangle["Name"]] = ( - rectangle_size_calc(rectangle, self.curr_px_mm) - ) + self.rectangle_size_dict["Rectangles"][rectangle["Name"]] = (rectangle_size_calc(rectangle, self.curr_px_mm)) self.image_data.rectangle_size_dict = self.rectangle_size_dict if len(self.image_data.out_circles) > 0: self.circle_size_dict = {} self.circle_size_dict["Circles"] = {} for circle in self.image_data.out_circles: - self.circle_size_dict["Circles"][circle["Name"]] = circle_size_calc( - circle, self.curr_px_mm - ) + self.circle_size_dict["Circles"][circle["Name"]] = circle_size_calc(circle, self.curr_px_mm) self.image_data.circle_size_dict = self.circle_size_dict if len(self.image_data.out_polygon) > 0: self.polygon_size_dict = {} self.polygon_size_dict["Polygons"] = {} for polygon in self.image_data.out_polygon: - self.polygon_size_dict["Polygons"][polygon["Name"]] = ( - polygon_size_calc(polygon, self.curr_px_mm) - ) + self.polygon_size_dict["Polygons"][polygon["Name"]] = (polygon_size_calc(polygon, self.curr_px_mm)) self.image_data.polygon_size_dict = self.polygon_size_dict self.image_data.insert_all_ROIs_into_image(show_size_info=True) diff --git a/simba/roi_tools/ROI_image.py b/simba/roi_tools/ROI_image.py index 3a17c0a38..9cbe3ea2f 100644 --- a/simba/roi_tools/ROI_image.py +++ b/simba/roi_tools/ROI_image.py @@ -1,7 +1,6 @@ import itertools import os import re -import threading from copy import deepcopy import cv2 @@ -14,6 +13,7 @@ from simba.utils.enums import ConfigKey, Keys, Paths from simba.utils.errors import InvalidInputError from simba.utils.read_write import get_fn_ext, read_config_file +from simba.mixins.plotting_mixin import PlottingMixin class ROI_image_class: @@ -601,78 +601,20 @@ def insert_all_ROIs_into_image( if show_size_info is True: area_cm = self.rectangle_size_dict["Rectangles"][e["Name"]]["area_cm"] width_cm = self.rectangle_size_dict["Rectangles"][e["Name"]]["width_cm"] - height_cm = self.rectangle_size_dict["Rectangles"][e["Name"]][ - "height_cm" - ] - cv2.putText( - self.working_frame, - str(height_cm), - ( - int(e["Tags"]["Left tag"][0] + e["Thickness"]), - e["Tags"]["Left tag"][1], - ), - cv2.FONT_HERSHEY_SIMPLEX, - self.text_size / 10, - self.colors[e["Color name"]], - self.text_thickness, - lineType=self.line_type, - ) - cv2.putText( - self.working_frame, - str(width_cm), - ( - e["Tags"]["Bottom tag"][0], - int(e["Tags"]["Bottom tag"][1] - e["Thickness"]), - ), - cv2.FONT_HERSHEY_SIMPLEX, - self.text_size / 10, - self.colors[e["Color name"]], - self.text_thickness, - lineType=self.line_type, - ) - cv2.putText( - self.working_frame, - str(area_cm), - (e["Tags"]["Center tag"][0], e["Tags"]["Center tag"][1]), - cv2.FONT_HERSHEY_SIMPLEX, - self.text_size / 10, - self.colors[e["Color name"]], - self.text_thickness, - lineType=self.line_type, - ) + height_cm = self.rectangle_size_dict["Rectangles"][e["Name"]]["height_cm"] + self.working_frame = PlottingMixin().put_text(img=self.working_frame, text=f'AREA: {str(area_cm)}, HEIGHT: {str(height_cm)}, WIDTH: {str(width_cm)}', pos=(int(e["Tags"]["Left tag"][0] + e["Thickness"]), e["Tags"]["Left tag"][1]), font_size=self.text_size, font_thickness=self.text_thickness, font=cv2.FONT_HERSHEY_SIMPLEX, text_color=self.colors[e["Color name"]]) + print(f'{e["Name"]} area: {area_cm}') for c in self.out_circles: self.no_shapes += 1 - cv2.circle( - self.working_frame, - (c["centerX"], c["centerY"]), - c["radius"], - c["Color BGR"], - int(c["Thickness"]), - lineType=self.line_type, - ) + cv2.circle( self.working_frame, (c["centerX"], c["centerY"]), c["radius"], c["Color BGR"], int(c["Thickness"]), lineType=self.line_type) if ROI_ear_tags is True: for t in c["Tags"]: - cv2.circle( - self.working_frame, - c["Tags"][t], - c["Ear_tag_size"], - self.colors[c["Color name"]], - -1, - ) + cv2.circle( self.working_frame, c["Tags"][t], c["Ear_tag_size"], self.colors[c["Color name"]], -1) if show_size_info is True: area_cm = self.circle_size_dict["Circles"][c["Name"]]["area_cm"] - cv2.putText( - self.working_frame, - str(area_cm), - (c["Tags"]["Center tag"][0], c["Tags"]["Center tag"][1]), - cv2.FONT_HERSHEY_SIMPLEX, - self.text_size / 10, - self.colors[c["Color name"]], - self.text_thickness, - lineType=self.line_type, - ) - + self.working_frame = PlottingMixin().put_text(img=self.working_frame, text=f'AREA: {str(area_cm)}', pos=(c["Tags"]["Center tag"][0], c["Tags"]["Center tag"][1]), font_size=self.text_size, font_thickness=self.text_thickness, font=cv2.FONT_HERSHEY_SIMPLEX, text_color=self.colors[c["Color name"]]) + print(f'{c["Name"]} area: {area_cm}') for pg in self.out_polygon: self.no_shapes += 1 pts = np.array(pg["vertices"]).reshape((-1, 1, 2)) @@ -715,17 +657,8 @@ def insert_all_ROIs_into_image( ) if show_size_info is True: area_cm = self.polygon_size_dict["Polygons"][pg["Name"]]["area_cm"] - cv2.putText( - self.working_frame, - str(area_cm), - (pg["Center_X"], pg["Center_Y"]), - cv2.FONT_HERSHEY_SIMPLEX, - self.text_size / 10, - self.colors[pg["Color name"]], - self.text_thickness, - lineType=self.line_type, - ) - + self.working_frame = PlottingMixin().put_text(img=self.working_frame, text=f'AREA: {str(area_cm)}', pos=(pg["Center_X"], pg["Center_Y"]), font_size=self.text_size, font_thickness=self.text_thickness, font=cv2.FONT_HERSHEY_SIMPLEX, text_color=self.colors[pg["Color name"]]) + print(f'{pg["Name"]} area: {area_cm}') cv2.namedWindow("Define shape", cv2.WINDOW_NORMAL) cv2.imshow("Define shape", self.working_frame) cv2.waitKey(100) diff --git a/simba/roi_tools/ROI_size_calculations.py b/simba/roi_tools/ROI_size_calculations.py index 4993f5ace..e4f98447b 100644 --- a/simba/roi_tools/ROI_size_calculations.py +++ b/simba/roi_tools/ROI_size_calculations.py @@ -1,6 +1,7 @@ import math - import numpy as np +from shapely.geometry import Polygon +from scipy.spatial import ConvexHull def rectangle_size_calc(rectangle_dict: dict, px_mm: float) -> dict: @@ -18,9 +19,7 @@ def rectangle_size_calc(rectangle_dict: dict, px_mm: float) -> dict: rectangle_dict["height_cm"] = round((rectangle_dict["height"] / px_mm) / 10, 2) rectangle_dict["width_cm"] = round((rectangle_dict["width"] / px_mm) / 10, 2) - rectangle_dict["area_cm"] = round( - rectangle_dict["width_cm"] * rectangle_dict["height_cm"], 2 - ) + rectangle_dict["area_cm"] = round(rectangle_dict["width_cm"] * rectangle_dict["height_cm"], 2) return rectangle_dict @@ -53,18 +52,14 @@ def polygon_size_calc(polygon_dict, px_mm) -> dict: >>> polygon_size_calc(polygon_dict={'vertices': np.array([[0, 2], [200, 98], [100, 876], [10, 702]])}, px_mm=5) >>> {'vertices': [[ 0, 2], [200, 98], [100, 876], [ 10, 702]], 'area_cm': 45.29} """ - - y_vals = polygon_dict["vertices"][:, 0] - x_vals = polygon_dict["vertices"][:, 1] - poly_area_px = 0.5 * np.abs( - np.dot(x_vals, np.roll(y_vals, 1)) - np.dot(y_vals, np.roll(x_vals, 1)) - ) - polygon_dict["area_cm"] = round((poly_area_px / px_mm) / 500, 2) + polygon = polygon_dict["vertices"] + area = round((ConvexHull(polygon).area / px_mm) / 10, 2) + polygon_dict["area_cm"] = area return polygon_dict -polygon_size_calc( - polygon_dict={"vertices": np.array([[0, 2], [200, 98], [100, 876], [10, 702]])}, - px_mm=5, -) +# polygon_size_calc( +# polygon_dict={"vertices": np.array([[0, 2], [200, 98], [100, 876], [10, 702]])}, +# px_mm=5, +# ) diff --git a/simba/utils/read_write.py b/simba/utils/read_write.py index 317912b11..045e6cd33 100644 --- a/simba/utils/read_write.py +++ b/simba/utils/read_write.py @@ -39,7 +39,8 @@ check_if_string_value_is_valid_video_timestamp, check_instance, check_int, check_nvidea_gpu_available, check_str, - check_valid_dataframe, check_valid_lst) + check_valid_dataframe, check_valid_lst, + check_valid_array, check_valid_boolean) from simba.utils.enums import ConfigKey, Dtypes, Formats, Keys, Options from simba.utils.errors import (DataHeaderError, DuplicationError, FFMPEGCodecGPUError, FileExistError, @@ -2336,3 +2337,69 @@ def read_boris_file(file_path: Union[str, os.PathLike], return results else: write_pickle(data=results, save_path=save_path) + + +def img_stack_to_video(x: np.ndarray, + save_path: Union[str, os.PathLike], + fps: float, + gpu: Optional[bool] = False, + bitrate: Optional[int] = 5000) -> None: + + """ + Converts a NumPy image stack to a video file, with optional GPU acceleration and configurable bitrate. + + :param np.ndarray x: A NumPy array representing the image stack. The array should have shape (N, H, W) for greyscale or (N, H, W, 3) for RGB images, where N is the number of frames, H is the height, and W is the width. + :param Union[str, os.PathLike] save_path: Path to the output video file where the video will be saved. + :param float fps: Frames per second for the output video. Should be a positive floating-point number. + :param Optional[bool] gpu: Whether to use GPU acceleration for encoding. If True, the video encoding will use NVIDIA's NVENC encoder. Defaults to False. + :param Optional[int] bitrate: Bitrate for the video encoding in kilobits per second (kbps). Should be an integer between 1000 and 35000. Defaults to 5000. + :return: None + """ + + check_if_dir_exists(in_dir=os.path.dirname(save_path), source=img_stack_to_video.__name__) + check_valid_array(data=x, source=img_stack_to_video.__name__, accepted_ndims=(3, 4)) + check_float(name=f'{img_stack_to_video.__name__} fps', value=fps, min_value=10e-6) + check_valid_boolean(value=gpu, source=img_stack_to_video.__name__) + check_int(name=f'{img_stack_to_video.__name__} bitrate', value=bitrate, min_value=1000, max_value=35000) + if gpu and not check_nvidea_gpu_available(): + raise FFMPEGCodecGPUError('No GPU found but GPU flag is True') + is_color = (x.ndim == 4 and x.shape[3] == 3) + N, H, W = x.shape[:3] + pix_fmt = 'gray' if not is_color else 'rgb24' + timer = SimbaTimer(start=True) + vcodec = 'mpeg4' + if gpu: + vcodec = 'h264_nvenc' + + cmd = [ + 'ffmpeg', + '-loglevel', 'error', + '-stats', + '-hide_banner', + '-y', + '-f', 'rawvideo', + '-vcodec', 'rawvideo', + '-s', f'{W}x{H}', + '-pix_fmt', pix_fmt, + '-r', str(fps), + '-i', '-', + '-an', + '-vcodec', f'{vcodec}', + '-b:v', f'{bitrate}k', + save_path + ] + + process = subprocess.Popen(cmd, stdin=subprocess.PIPE) + for frame in x: + if frame.dtype != np.uint8: + frame = (255 * np.clip(frame, 0, 1)).astype(np.uint8) + process.stdin.write(frame.tobytes()) + + process.stdin.close() + process.wait() + timer.stop_timer() + stdout_success(msg=f'Video complete. Saved at {save_path}', elapsed_time=timer.elapsed_time_str) + + + +