<a href="https://www.helmholtz.ai" target="_blank">
<img src="static/hai.png" alt="HelmholtzAI" align="right" height="60px" style="margin-top: 0; margin-right: 30px" />
</a>
<a href="https://www.ufz.de" target="_blank">
<img src="static/ufz.png" alt="UFZLogo" align="right" height="60px" style="margin-top: 0; margin-right: 10px" />
</a>
<br/>
<br/>
<div align="left" style="text-align:left">
<h1>DeepTrees 🌳</h1>
</div>
<div align="center" style="text-align:center">
<h3>Tree Crown Segmentation and Analysis in Remote Sensing Imagery with PyTorch</h3>
<div align="center">
<a href="https://badge.fury.io/py/deeptrees">
<img src="https://badge.fury.io/py/deeptrees.svg" alt="PyPI version">
</a>
<a href="http://dx.doi.org/10.13140/RG.2.2.32837.36329">
<img src="http://img.shields.io/badge/DOI-10.13140/RG.2.2.32837.36329-19C3AD.svg" alt="DOI">
</a>
<a href="https://opensource.org/licenses/MIT">
<img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License: MIT">
</a>
<a href="https://codebase.helmholtz.cloud/taimur.khan/DeepTrees/-/pipelines">
<img src="https://codebase.helmholtz.cloud/taimur.khan/DeepTrees/badges/main/pipeline.svg" alt="CI Build">
</a>
<br/>
</div>
<img src="./static/deeptrees.png" alt="DeepTrees" width=800"/>
<br/>
<br/>
</div>
DeepTrees is a end-to-end library for tree crown semantic and instance segmentation, as well as analysis in remote sensing imagery. It provides a modular and flexible framework based on PyTorch for training, active-learning and deploying deep learning models for tree crown semantic and instance segmentation. The library is designed to be easy to use and extendable, with a focus on reproducibility and scalability. It includes a variety of pre-trained models, datasets, and tree allometrical metrics to help you understand tree crown dynamics.
Read more about this work and find tutorials on: [https://deeptrees.de](https://deeptrees.de). The DeepTrees project is funded by the Helmholtz Centre for Environmental Research -- UFZ, in collaboration with Helmholtz AI.
## Installation
To install the package, clone the repository and install the dependencies.
```bash
git clone https://codebase.helmholtz.cloud/taimur.khan/DeepTrees.git
cd DeepTrees
pip install -r requirements.txt
```
or from Gitlab registry:
```bash
pip install deeptrees --index-url https://codebase.helmholtz.cloud/api/v4/projects/13888/packages/pypi/simple
```
or from PyPI.
```bash
pip install deeptrees
```
> Note: DeepTrees uses python libaries that depend on GDAL. Make sure to have GDAL>=3.9.2 installed on your system, e.g. via conda: `conda install -c conda-forge gdal==3.9.2`.
## API Documentation
You can view the documentation page on: [https://deeptrees.readthedocs.io/en/latest/](https://deeptrees.readthedocs.io/en/latest/)
This library is documented using Sphinx. To build the documentation, run the following command.
```bash
sphinx-apidoc -o docs/source deeptrees
cd docs
make html
```
This will create the documentation in the `docs/build` directory. Open the `index.html` file in your browser to view the documentation.
## Configuration
This software requires Hydra for configuration management. The configuration **yaml** files are stored in the `config` directory.
This software uses Hydra for configuration management. The configuration files are stored in the `config` directory.
The confirguration schema can be found in the `config/schema.yaml` file.
A list of Hydra configurations can be found in: [/docs/prediction_config.md](/docs/prediction_config.md)
## Pretrained Models
DeepTrees provides a set of pretrained models for tree crown segmentation. Currently the following models are available:
| Author | Description | Model Weights |
|--------|---------------|---------------|
| [Freudenberg et al., 2022](https://doi.org/10.1007/s00521-022-07640-4) | Tree Crown Delineation model based on U-Net with ResNet18 backbone. Trained on 89 images sampled randomly within Germany. Set of 5 model weights from 5-fold cross validation. | k=[0](https://syncandshare.desy.de/index.php/s/NcFgPM4gX2dtSQq/download/lUnet-resnet18_epochs=209_lr=0.0001_width=224_bs=32_divby=255_custom_color_augs_k=0_jitted.pt), [1](https://syncandshare.desy.de/index.php/s/NcFgPM4gX2dtSQq/download/lUnet-resnet18_epochs=209_lr=0.0001_width=224_bs=32_divby=255_custom_color_augs_k=1_jitted.pt), [2](https://syncandshare.desy.de/index.php/s/NcFgPM4gX2dtSQq/download/lUnet-resnet18_epochs=209_lr=0.0001_width=224_bs=32_divby=255_custom_color_augs_k=2_jitted.pt), [3 (default)](https://syncandshare.desy.de/index.php/s/NcFgPM4gX2dtSQq/download/lUnet-resnet18_epochs=209_lr=0.0001_width=224_bs=32_divby=255_custom_color_augs_k=3_jitted.pt), [4](https://syncandshare.desy.de/index.php/s/NcFgPM4gX2dtSQq/download/lUnet-resnet18_epochs=209_lr=0.0001_width=224_bs=32_divby=255_custom_color_augs_k=4_jitted.pt) |
| | |
> Note: We are in the process of adding more pretrained models.
> Note: Like all AI systems, these pretrained models can make mistakes. Validate predictions, especially in critical applications. Be aware that performance may degrade significantly on data that differs from the training set (e.g., different seasons, regions, or image qualities)
Download the pretrained models from the links:
```python
from deeptrees.pretrained import freudenberg2022
freudenberg2022(
filename="name_your_file", # name of the file to save the model
k=0, # number of k-fold cross validation
return_dict=True # returns the weight pytorch model weights dictionary
)
```
## Datasets
DeepTrees also provides a lablled DOP dataset with DOP20cm rasters and corresponding polygon labels as `.shp` files. The dataset is available for download:
```python
from deeptrees.datasets.halleDOP20 import load_tiles, load_labels
load_tiles(zip_filename="path/to/tiles.zip") #give the path to where you want to save the tiles
load_labels(zip_filename="path/to/labels.zip") #give the path to where you want to save the labels
```
> Note: We are in the process of adding more datasets and updating the current datasets.
## Predict on a list of images
Predict tree crown polygons for a list of images. The configuration file in `config_path` controls the pretrained model, output paths, and postprocessing options.
```bash
from deeptrees import predict
predict(image_path=["list of image_paths"], config_path = "config_path")
```
## Training
DeepTrees calculates pixel-wise entropy maps for each input image. The entropy maps can be used to select the most informative tiles for training. The entropy maps are stored in the `entropy` directory.
To train the model, you need to have the labeled tiles in the `tiles` and `labels` directories. The unlabeled tiles go into `pool_tiles`. Your polygon labels need to be in ESRI shapefile format.
Adapt your own config file based on the defaults in `train_halle.yaml` as needed. For inspiration for a derived config file for finetuning, check `finetune_halle.yaml`.
Run the script like this:
```bash
python scripts/train.py # this is the default config that trains from scratch
python scripts/train.py --config-name=finetune_halle # finetune with pretrained model
python scripts/train.py --config-name=yourconfig # with your own config
```
To re-generate the ground truth for training, make sure to pass the label directory in `data.ground_truth_labels`. To turn it off, pass `data.ground_truth_labels=null`.
You can overwrite individual parameters on the command line, e.g.
```bash
python scripts/train.py trainer.fast_dev_run=True
```
To resume training from a checkpoint, take care to pass the hydra arguments in quotes to avoid the shell intercepting the string (pretrained model contains `=`):
```bash
python scripts/train.py 'model.pretrained_model="Unet-resnet18_epochs=209_lr=0.0001_width=224_bs=32_divby=255_custom_color_augs_k=0_jitted.pt"'
```
#### Expected Directory structure
Before you embark onSync the folder `tiles` and `labels` with the labeled tiles. The unlabeled tiles go into `pool_tiles`.
```
|-- tiles
| |-- tile_0_0.tif
| |-- tile_0_1.tif
| |-- ...
|-- labels
| |-- label_tile_0_0.shp
| |-- label_tile_0_1.shp
| |-- ...
|-- pool_tiles
| |-- tile_4_7.tif
| |-- tile_4_8.tif
| |-- ...
```
Create the new empty directories
```
|-- masks
|-- outlines
|-- dist_trafo
```
### Training Classes
We use the following classes for training:
0 = tree
1 = cluster of trees
2 = unsure
3 = dead trees (haven’t added yet)
However, you can adjust classes as needed in your own training workflow.
### Training Logs
By default, [MLFlow](https://mlflow.org/) logs are created during training.
### Inference
Run the inference script with the corresponding config file. Adjust as needed.
```bash
python scripts/test.py --config-name=inference_halle
```
## Semantic Versioning
This repository has auto semantic versionining enabled. To create new releases, we need to merge into the default `main` branch.
Semantic Versionining, or SemVer, is a versioning standard for software ([SemVer website](https://semver.org/)). Given a version number MAJOR.MINOR.PATCH, increment the:
- MAJOR version when you make incompatible API changes
- MINOR version when you add functionality in a backward compatible manner
- PATCH version when you make backward compatible bug fixes
- Additional labels for pre-release and build metad
See the SemVer rules and all possible commit prefixes in the [.releaserc.json](.releaserc.json) file.
| Prefix | Explanation | Example |
| ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
| feat | A new feature was implemented as part of the commit, <br>so the [Minor](https://mobiuscode.dev/posts/Automatic-Semantic-Versioning-for-GitLab-Projects/#minor) part of the version will be increased once <br>this is merged to the main branch | feat: model training updated |
| fix | A bug was fixed, so the [Patch](https://mobiuscode.dev/posts/Automatic-Semantic-Versioning-for-GitLab-Projects/#patch) part of the version will be <br>increased once this is merged to the main branch | fix: fix a bug that causes the user to not <br>be properly informed when a job<br>finishes |
The implementation is based on. https://mobiuscode.dev/posts/Automatic-Semantic-Versioning-for-GitLab-Projects/
# License
This repository is licensed under the MIT License. For more information, see the [LICENSE.md](LICENSE.md) file.
# Cite as
```bib
@article{khan2025deeptrees,
author = {Taimur Khan and Caroline Arnold and Harsh Grover},
title = {DeepTrees: Tree Crown Segmentation and Analysis in Remote Sensing Imagery with PyTorch},
year = {2025},
journal = {ResearchGate},
archivePrefix = {ResearchGate},
eprint = {10.13140/RG.2.2.32837.36329},
doi = {http://dx.doi.org/10.13140/RG.2.2.32837.36329},
primaryClass = {cs.CV}
}
```
Raw data
{
"_id": null,
"home_page": "https://codebase.helmholtz.cloud/taimur.khan/DeepTrees",
"name": "deeptrees",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10.0",
"maintainer_email": null,
"keywords": "tree-crowns, pytorch, remote-sensing, deep-learning, semantic-segmentation, vegetation-ecology, instance-segmentation, active-learning",
"author": "Taimur Khan, Caroline Arnold, Harsh Grover",
"author_email": "taimur.khan@ufz.de",
"download_url": "https://files.pythonhosted.org/packages/c3/f2/b12818f2a2036b3b35e72a36866c6be4937ee6add1cc432c12f569f6bd78/deeptrees-1.8.2.tar.gz",
"platform": null,
"description": "\n\n<a href=\"https://www.helmholtz.ai\" target=\"_blank\">\n<img src=\"static/hai.png\" alt=\"HelmholtzAI\" align=\"right\" height=\"60px\" style=\"margin-top: 0; margin-right: 30px\" />\n</a>\n<a href=\"https://www.ufz.de\" target=\"_blank\">\n<img src=\"static/ufz.png\" alt=\"UFZLogo\" align=\"right\" height=\"60px\" style=\"margin-top: 0; margin-right: 10px\" />\n</a>\n<br/>\n<br/>\n\n<div align=\"left\" style=\"text-align:left\">\n<h1>DeepTrees \ud83c\udf33</h1>\n</div>\n<div align=\"center\" style=\"text-align:center\">\n <h3>Tree Crown Segmentation and Analysis in Remote Sensing Imagery with PyTorch</h3> \n <div align=\"center\">\n <a href=\"https://badge.fury.io/py/deeptrees\">\n <img src=\"https://badge.fury.io/py/deeptrees.svg\" alt=\"PyPI version\">\n </a>\n <a href=\"http://dx.doi.org/10.13140/RG.2.2.32837.36329\">\n <img src=\"http://img.shields.io/badge/DOI-10.13140/RG.2.2.32837.36329-19C3AD.svg\" alt=\"DOI\">\n </a>\n <a href=\"https://opensource.org/licenses/MIT\">\n <img src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" alt=\"License: MIT\">\n </a>\n <a href=\"https://codebase.helmholtz.cloud/taimur.khan/DeepTrees/-/pipelines\">\n <img src=\"https://codebase.helmholtz.cloud/taimur.khan/DeepTrees/badges/main/pipeline.svg\" alt=\"CI Build\">\n </a>\n <br/>\n</div> \n <img src=\"./static/deeptrees.png\" alt=\"DeepTrees\" width=800\"/>\n <br/>\n <br/>\n</div>\n\nDeepTrees is a end-to-end library for tree crown semantic and instance segmentation, as well as analysis in remote sensing imagery. It provides a modular and flexible framework based on PyTorch for training, active-learning and deploying deep learning models for tree crown semantic and instance segmentation. The library is designed to be easy to use and extendable, with a focus on reproducibility and scalability. It includes a variety of pre-trained models, datasets, and tree allometrical metrics to help you understand tree crown dynamics. \n\nRead more about this work and find tutorials on: [https://deeptrees.de](https://deeptrees.de). The DeepTrees project is funded by the Helmholtz Centre for Environmental Research -- UFZ, in collaboration with Helmholtz AI.\n\n## Installation\n\nTo install the package, clone the repository and install the dependencies.\n\n```bash\ngit clone https://codebase.helmholtz.cloud/taimur.khan/DeepTrees.git\ncd DeepTrees\n\npip install -r requirements.txt\n```\n\nor from Gitlab registry:\n\n```bash\npip install deeptrees --index-url https://codebase.helmholtz.cloud/api/v4/projects/13888/packages/pypi/simple\n```\n\n\nor from PyPI.\n\n```bash\npip install deeptrees\n```\n\n> Note: DeepTrees uses python libaries that depend on GDAL. Make sure to have GDAL>=3.9.2 installed on your system, e.g. via conda: `conda install -c conda-forge gdal==3.9.2`. \n\n## API Documentation\n\nYou can view the documentation page on: [https://deeptrees.readthedocs.io/en/latest/](https://deeptrees.readthedocs.io/en/latest/)\n\nThis library is documented using Sphinx. To build the documentation, run the following command.\n\n```bash\nsphinx-apidoc -o docs/source deeptrees \ncd docs\nmake html\n```\n\nThis will create the documentation in the `docs/build` directory. Open the `index.html` file in your browser to view the documentation.\n\n## Configuration\n\nThis software requires Hydra for configuration management. The configuration **yaml** files are stored in the `config` directory. \n\nThis software uses Hydra for configuration management. The configuration files are stored in the `config` directory. \n\nThe confirguration schema can be found in the `config/schema.yaml` file.\n\nA list of Hydra configurations can be found in: [/docs/prediction_config.md](/docs/prediction_config.md)\n\n## Pretrained Models\n\nDeepTrees provides a set of pretrained models for tree crown segmentation. Currently the following models are available:\n\n| Author | Description | Model Weights |\n|--------|---------------|---------------|\n| [Freudenberg et al., 2022](https://doi.org/10.1007/s00521-022-07640-4) | Tree Crown Delineation model based on U-Net with ResNet18 backbone. Trained on 89 images sampled randomly within Germany. Set of 5 model weights from 5-fold cross validation. | k=[0](https://syncandshare.desy.de/index.php/s/NcFgPM4gX2dtSQq/download/lUnet-resnet18_epochs=209_lr=0.0001_width=224_bs=32_divby=255_custom_color_augs_k=0_jitted.pt), [1](https://syncandshare.desy.de/index.php/s/NcFgPM4gX2dtSQq/download/lUnet-resnet18_epochs=209_lr=0.0001_width=224_bs=32_divby=255_custom_color_augs_k=1_jitted.pt), [2](https://syncandshare.desy.de/index.php/s/NcFgPM4gX2dtSQq/download/lUnet-resnet18_epochs=209_lr=0.0001_width=224_bs=32_divby=255_custom_color_augs_k=2_jitted.pt), [3 (default)](https://syncandshare.desy.de/index.php/s/NcFgPM4gX2dtSQq/download/lUnet-resnet18_epochs=209_lr=0.0001_width=224_bs=32_divby=255_custom_color_augs_k=3_jitted.pt), [4](https://syncandshare.desy.de/index.php/s/NcFgPM4gX2dtSQq/download/lUnet-resnet18_epochs=209_lr=0.0001_width=224_bs=32_divby=255_custom_color_augs_k=4_jitted.pt) |\n| | |\n\n> Note: We are in the process of adding more pretrained models.\n\n> Note: Like all AI systems, these pretrained models can make mistakes. Validate predictions, especially in critical applications. Be aware that performance may degrade significantly on data that differs from the training set (e.g., different seasons, regions, or image qualities)\n\nDownload the pretrained models from the links:\n\n```python\nfrom deeptrees.pretrained import freudenberg2022\n\nfreudenberg2022(\n filename=\"name_your_file\", # name of the file to save the model\n k=0, # number of k-fold cross validation\n return_dict=True # returns the weight pytorch model weights dictionary\n)\n```\n\n## Datasets\n\nDeepTrees also provides a lablled DOP dataset with DOP20cm rasters and corresponding polygon labels as `.shp` files. The dataset is available for download:\n\n```python\nfrom deeptrees.datasets.halleDOP20 import load_tiles, load_labels\n\nload_tiles(zip_filename=\"path/to/tiles.zip\") #give the path to where you want to save the tiles\nload_labels(zip_filename=\"path/to/labels.zip\") #give the path to where you want to save the labels\n```\n> Note: We are in the process of adding more datasets and updating the current datasets.\n\n## Predict on a list of images\n\nPredict tree crown polygons for a list of images. The configuration file in `config_path` controls the pretrained model, output paths, and postprocessing options.\n\n```bash\nfrom deeptrees import predict\n\npredict(image_path=[\"list of image_paths\"], config_path = \"config_path\")\n```\n\n## Training\n\nDeepTrees calculates pixel-wise entropy maps for each input image. The entropy maps can be used to select the most informative tiles for training. The entropy maps are stored in the `entropy` directory.\n\n\nTo train the model, you need to have the labeled tiles in the `tiles` and `labels` directories. The unlabeled tiles go into `pool_tiles`. Your polygon labels need to be in ESRI shapefile format.\n\nAdapt your own config file based on the defaults in `train_halle.yaml` as needed. For inspiration for a derived config file for finetuning, check `finetune_halle.yaml`.\n\nRun the script like this:\n\n```bash\npython scripts/train.py # this is the default config that trains from scratch\npython scripts/train.py --config-name=finetune_halle # finetune with pretrained model\npython scripts/train.py --config-name=yourconfig # with your own config\n```\n\nTo re-generate the ground truth for training, make sure to pass the label directory in `data.ground_truth_labels`. To turn it off, pass `data.ground_truth_labels=null`.\n\nYou can overwrite individual parameters on the command line, e.g.\n\n```bash\npython scripts/train.py trainer.fast_dev_run=True\n```\n\nTo resume training from a checkpoint, take care to pass the hydra arguments in quotes to avoid the shell intercepting the string (pretrained model contains `=`):\n\n```bash\npython scripts/train.py 'model.pretrained_model=\"Unet-resnet18_epochs=209_lr=0.0001_width=224_bs=32_divby=255_custom_color_augs_k=0_jitted.pt\"'\n```\n\n#### Expected Directory structure\n\nBefore you embark onSync the folder `tiles` and `labels` with the labeled tiles. The unlabeled tiles go into `pool_tiles`.\n\n```\n|-- tiles\n| |-- tile_0_0.tif\n| |-- tile_0_1.tif\n| |-- ...\n|-- labels\n| |-- label_tile_0_0.shp\n| |-- label_tile_0_1.shp\n| |-- ...\n|-- pool_tiles\n| |-- tile_4_7.tif\n| |-- tile_4_8.tif\n| |-- ...\n```\n\nCreate the new empty directories\n\n```\n|-- masks\n|-- outlines\n|-- dist_trafo\n```\n\n### Training Classes\n\nWe use the following classes for training:\n\n0 = tree\n1 = cluster of trees \n2 = unsure \n3 = dead trees (haven\u2019t added yet)\n\nHowever, you can adjust classes as needed in your own training workflow.\n\n\n\n### Training Logs\n\nBy default, [MLFlow](https://mlflow.org/) logs are created during training.\n\n### Inference\n\nRun the inference script with the corresponding config file. Adjust as needed.\n\n```bash\npython scripts/test.py --config-name=inference_halle\n```\n\n\n## Semantic Versioning\nThis repository has auto semantic versionining enabled. To create new releases, we need to merge into the default `main` branch. \n\nSemantic Versionining, or SemVer, is a versioning standard for software ([SemVer website](https://semver.org/)). Given a version number MAJOR.MINOR.PATCH, increment the:\n\n- MAJOR version when you make incompatible API changes\n- MINOR version when you add functionality in a backward compatible manner\n- PATCH version when you make backward compatible bug fixes\n- Additional labels for pre-release and build metad\n\nSee the SemVer rules and all possible commit prefixes in the [.releaserc.json](.releaserc.json) file. \n\n| Prefix | Explanation | Example |\n| ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |\n| feat | A new\u00a0feature was implemented as part of the commit,\u00a0<br>so the\u00a0[Minor](https://mobiuscode.dev/posts/Automatic-Semantic-Versioning-for-GitLab-Projects/#minor)\u00a0part of the version will be increased once\u00a0<br>this is merged to the main branch | feat: model training updated |\n| fix | A bug was\u00a0fixed, so the\u00a0[Patch](https://mobiuscode.dev/posts/Automatic-Semantic-Versioning-for-GitLab-Projects/#patch)\u00a0part of the version will be\u00a0<br>increased once this is merged to the main branch | fix: fix a bug that causes the user to not\u00a0<br>be properly informed when a job<br>finishes |\n\nThe implementation is based on. https://mobiuscode.dev/posts/Automatic-Semantic-Versioning-for-GitLab-Projects/\n\n\n# License\n\nThis repository is licensed under the MIT License. For more information, see the [LICENSE.md](LICENSE.md) file.\n\n# Cite as\n\n```bib\n@article{khan2025deeptrees,\n author = {Taimur Khan and Caroline Arnold and Harsh Grover},\n title = {DeepTrees: Tree Crown Segmentation and Analysis in Remote Sensing Imagery with PyTorch},\n year = {2025},\n journal = {ResearchGate},\n archivePrefix = {ResearchGate},\n eprint = {10.13140/RG.2.2.32837.36329},\n doi = {http://dx.doi.org/10.13140/RG.2.2.32837.36329}, \n primaryClass = {cs.CV} \n }\n```\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Tree crown segmentation and analysis in remote sensing imagery with PyTorch",
"version": "1.8.2",
"project_urls": {
"Homepage": "https://codebase.helmholtz.cloud/taimur.khan/DeepTrees"
},
"split_keywords": [
"tree-crowns",
" pytorch",
" remote-sensing",
" deep-learning",
" semantic-segmentation",
" vegetation-ecology",
" instance-segmentation",
" active-learning"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "b3ce04ca37b7416e4fb7382f49eb2bad8a9dc6103b4d19be52688a2f992a7653",
"md5": "a62ad845fac29bf95e776f0fe7941dfe",
"sha256": "8340c733b75f807f2775707d06ac70b7590cba828c90c89b01270e4878be13dc"
},
"downloads": -1,
"filename": "deeptrees-1.8.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "a62ad845fac29bf95e776f0fe7941dfe",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10.0",
"size": 58346,
"upload_time": "2025-07-11T11:22:22",
"upload_time_iso_8601": "2025-07-11T11:22:22.284185Z",
"url": "https://files.pythonhosted.org/packages/b3/ce/04ca37b7416e4fb7382f49eb2bad8a9dc6103b4d19be52688a2f992a7653/deeptrees-1.8.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c3f2b12818f2a2036b3b35e72a36866c6be4937ee6add1cc432c12f569f6bd78",
"md5": "cf8041efbcd4f3ccfd899a92e80ebd77",
"sha256": "9670ae3106d03799023daa01d77d8776c6ea3c52be66053690bdd9e0e7d08ae9"
},
"downloads": -1,
"filename": "deeptrees-1.8.2.tar.gz",
"has_sig": false,
"md5_digest": "cf8041efbcd4f3ccfd899a92e80ebd77",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10.0",
"size": 54863,
"upload_time": "2025-07-11T11:22:23",
"upload_time_iso_8601": "2025-07-11T11:22:23.890830Z",
"url": "https://files.pythonhosted.org/packages/c3/f2/b12818f2a2036b3b35e72a36866c6be4937ee6add1cc432c12f569f6bd78/deeptrees-1.8.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-11 11:22:23",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "deeptrees"
}