{"id":318360,"name":"tree-detection-framework","description":"Provides a standardized interface for performing training, inference, and evaluation using existing tree detection models and algorithms.","url":"https://github.com/open-forest-observatory/tree-detection-framework","last_synced_at":"2026-05-28T03:30:35.405Z","repository":{"id":257858305,"uuid":"855828355","full_name":"open-forest-observatory/tree-detection-framework","owner":"open-forest-observatory","description":null,"archived":false,"fork":false,"pushed_at":"2026-04-10T15:38:05.000Z","size":115475,"stargazers_count":32,"open_issues_count":26,"forks_count":5,"subscribers_count":6,"default_branch":"main","last_synced_at":"2026-04-10T16:06:45.796Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/open-forest-observatory.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-09-11T14:20:58.000Z","updated_at":"2026-04-10T14:28:46.000Z","dependencies_parsed_at":"2024-10-28T14:55:05.344Z","dependency_job_id":"41cc33be-f4e1-4153-8e43-f09e24a5c0be","html_url":"https://github.com/open-forest-observatory/tree-detection-framework","commit_stats":null,"previous_names":["open-forest-observatory/tree-detection-framework"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/open-forest-observatory/tree-detection-framework","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-forest-observatory%2Ftree-detection-framework","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-forest-observatory%2Ftree-detection-framework/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-forest-observatory%2Ftree-detection-framework/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-forest-observatory%2Ftree-detection-framework/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/open-forest-observatory","download_url":"https://codeload.github.com/open-forest-observatory/tree-detection-framework/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-forest-observatory%2Ftree-detection-framework/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31669117,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-10T17:19:37.612Z","status":"online","status_checked_at":"2026-04-11T02:00:05.776Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"owner":{"login":"open-forest-observatory","name":"Open Forest Observatory","uuid":"98983419","kind":"organization","description":"OFO is developing easy-to-use software tools for drone-based forest mapping and a database of tree maps produced from drone imagery","email":"openforestobservatory@ucdavis.edu","website":"openforestobservatory.org","location":null,"twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/98983419?v=4","repositories_count":1,"last_synced_at":"2023-03-05T00:25:11.703Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/open-forest-observatory","funding_links":[],"total_stars":null,"followers":null,"following":null,"created_at":"2023-03-05T00:25:11.713Z","updated_at":"2023-03-05T00:25:11.713Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/open-forest-observatory","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/open-forest-observatory/repositories"},"packages":[],"commits":{"id":10310539,"full_name":"open-forest-observatory/tree-detection-framework","default_branch":"main","total_commits":726,"total_committers":5,"total_bot_commits":0,"total_bot_committers":0,"mean_commits":145.2,"dds":0.3608815426997245,"past_year_total_commits":328,"past_year_total_committers":4,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":82.0,"past_year_dds":0.4512195121951219,"last_synced_at":"2026-04-17T08:01:34.769Z","last_synced_commit":"342ef5c66dcf6bce8cb43391c23fc77c7688915e","created_at":"2025-06-11T00:13:03.346Z","updated_at":"2026-04-17T08:01:34.709Z","committers":[{"name":"Amritha","email":"amrithasp02@gmail.com","login":"amrithasp02","count":464},{"name":"David Russell","email":"djrussell@ucdavis.edu","login":"russelldj","count":201},{"name":"Eric Schneider","email":"franz.eric.schneider@gmail.com","login":"FranzEricSchneider","count":41},{"name":"mich889","email":"mich889","login":"mich889","count":12},{"name":"Derek Young","email":"22568494+youngdjn","login":"youngdjn","count":8}],"past_year_committers":[{"name":"Amritha","email":"amrithasp02@gmail.com","login":"amrithasp02","count":180},{"name":"David Russell","email":"djrussell@ucdavis.edu","login":"russelldj","count":101},{"name":"Eric Schneider","email":"franz.eric.schneider@gmail.com","login":"FranzEricSchneider","count":41},{"name":"Derek Young","email":"22568494+youngdjn","login":"youngdjn","count":6}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-forest-observatory%2Ftree-detection-framework/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-18T00:00:07.883Z","repositories_count":6214377,"commits_count":900083993,"contributors_count":34919784,"owners_count":1144069,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"open-forest-observatory/tree-detection-framework","html_url":"https://github.com/open-forest-observatory/tree-detection-framework","last_synced_at":"2026-04-11T05:01:27.496Z","status":"active","issues_count":73,"pull_requests_count":151,"avg_time_to_close_issue":1809500.1333333333,"avg_time_to_close_pull_request":144229.11627906977,"issues_closed_count":45,"pull_requests_closed_count":129,"pull_request_authors_count":5,"issue_authors_count":9,"avg_comments_per_issue":0.726027397260274,"avg_comments_per_pull_request":0.6887417218543046,"merged_pull_requests_count":129,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":31,"past_year_pull_requests_count":80,"past_year_avg_time_to_close_issue":2097806.0,"past_year_avg_time_to_close_pull_request":105897.38095238095,"past_year_issues_closed_count":16,"past_year_pull_requests_closed_count":63,"past_year_pull_request_authors_count":4,"past_year_issue_authors_count":9,"past_year_avg_comments_per_issue":0.967741935483871,"past_year_avg_comments_per_pull_request":0.6625,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":63,"created_at":"2025-06-11T00:13:09.734Z","updated_at":"2026-04-11T05:01:27.496Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-forest-observatory%2Ftree-detection-framework","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-forest-observatory%2Ftree-detection-framework/issues","issue_labels_count":{"enhancement":10,"bug":1},"pull_request_labels_count":{"enhancement":3},"issue_author_associations_count":{"CONTRIBUTOR":67,"NONE":6},"pull_request_author_associations_count":{"CONTRIBUTOR":147,"NONE":2,"COLLABORATOR":2},"issue_authors":{"russelldj":50,"amrithasp02":11,"youngdjn":6,"chugom77":1,"Udbhaw08":1,"obyror":1,"FranzEricSchneider":1,"bw4sz":1,"jeffgillan":1},"pull_request_authors":{"amrithasp02":70,"russelldj":68,"FranzEricSchneider":7,"youngdjn":4,"mich889":2},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-19T00:00:13.985Z","repositories_count":14321955,"issues_count":34511856,"pull_requests_count":112895548,"authors_count":11238401,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{"bug":1,"enhancement":1},"past_year_pull_request_labels_count":{"enhancement":1},"past_year_issue_author_associations_count":{"CONTRIBUTOR":24,"NONE":5},"past_year_pull_request_author_associations_count":{"CONTRIBUTOR":69,"NONE":1},"past_year_issue_authors":{"russelldj":15,"amrithasp02":6,"youngdjn":2,"bw4sz":1,"chugom77":1,"FranzEricSchneider":1,"jeffgillan":1,"obyror":1,"Udbhaw08":1},"past_year_pull_request_authors":{"russelldj":33,"amrithasp02":28,"FranzEricSchneider":7,"youngdjn":2},"maintainers":[{"login":"mich889","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/mich889"}],"active_maintainers":[]},"events":{"total":{"ReleaseEvent":1,"DeleteEvent":60,"MemberEvent":1,"PullRequestEvent":120,"ForkEvent":1,"IssuesEvent":87,"WatchEvent":23,"IssueCommentEvent":98,"PushEvent":442,"PullRequestReviewEvent":276,"PullRequestReviewCommentEvent":328,"CreateEvent":71},"last_year":{"DeleteEvent":32,"PullRequestEvent":60,"ForkEvent":1,"IssuesEvent":27,"WatchEvent":16,"IssueCommentEvent":49,"PushEvent":173,"PullRequestReviewCommentEvent":122,"PullRequestReviewEvent":121,"CreateEvent":36}},"keywords":[],"dependencies":[{"ecosystem":"actions","filepath":".github/workflows/black.yml","sha":null,"kind":"manifest","created_at":"2024-10-16T19:11:13.505Z","updated_at":"2024-10-16T19:11:13.505Z","repository_link":"https://github.com/open-forest-observatory/tree-detection-framework/blob/main/.github/workflows/black.yml","dependencies":[{"id":20213888598,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":20213888605,"package_name":"psf/black","ecosystem":"actions","requirements":"stable","direct":true,"kind":"composite","optional":false},{"id":20213888609,"package_name":"stefanzweifel/git-auto-commit-action","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/isort.yml","sha":null,"kind":"manifest","created_at":"2024-10-16T19:11:13.751Z","updated_at":"2024-10-16T19:11:13.751Z","repository_link":"https://github.com/open-forest-observatory/tree-detection-framework/blob/main/.github/workflows/isort.yml","dependencies":[{"id":20213889099,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":20213889100,"package_name":"actions/setup-python","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false},{"id":20213889101,"package_name":"stefanzweifel/git-auto-commit-action","ecosystem":"actions","requirements":"v5","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"pypi","filepath":"poetry.lock","sha":null,"kind":"lockfile","created_at":"2024-10-16T19:11:13.921Z","updated_at":"2024-10-16T19:11:13.921Z","repository_link":"https://github.com/open-forest-observatory/tree-detection-framework/blob/main/poetry.lock","dependencies":[{"id":20213889145,"package_name":"aenum","ecosystem":"pypi","requirements":"3.1.15","direct":false,"kind":"runtime","optional":false},{"id":20213889783,"package_name":"affine","ecosystem":"pypi","requirements":"2.4.0","direct":false,"kind":"runtime","optional":false},{"id":20213889784,"package_name":"aiohappyeyeballs","ecosystem":"pypi","requirements":"2.4.0","direct":false,"kind":"runtime","optional":false},{"id":20213889785,"package_name":"aiohttp","ecosystem":"pypi","requirements":"3.10.5","direct":false,"kind":"runtime","optional":false},{"id":20213889786,"package_name":"aiosignal","ecosystem":"pypi","requirements":"1.3.1","direct":false,"kind":"runtime","optional":false},{"id":20213889787,"package_name":"alabaster","ecosystem":"pypi","requirements":"1.0.0","direct":false,"kind":"runtime","optional":false},{"id":20213889788,"package_name":"albucore","ecosystem":"pypi","requirements":"0.0.15","direct":false,"kind":"runtime","optional":false},{"id":20213889789,"package_name":"albumentations","ecosystem":"pypi","requirements":"1.4.14","direct":false,"kind":"runtime","optional":false},{"id":20213889790,"package_name":"annotated-types","ecosystem":"pypi","requirements":"0.7.0","direct":false,"kind":"runtime","optional":false},{"id":20213889791,"package_name":"antlr4-python3-runtime","ecosystem":"pypi","requirements":"4.9.3","direct":false,"kind":"runtime","optional":false},{"id":20213889792,"package_name":"async-timeout","ecosystem":"pypi","requirements":"4.0.3","direct":false,"kind":"runtime","optional":false},{"id":20213889793,"package_name":"attrs","ecosystem":"pypi","requirements":"24.2.0","direct":false,"kind":"runtime","optional":false},{"id":20213889794,"package_name":"babel","ecosystem":"pypi","requirements":"2.16.0","direct":false,"kind":"runtime","optional":false},{"id":20213889795,"package_name":"bitsandbytes","ecosystem":"pypi","requirements":"0.43.3","direct":false,"kind":"runtime","optional":false},{"id":20213889796,"package_name":"certifi","ecosystem":"pypi","requirements":"2024.8.30","direct":false,"kind":"runtime","optional":false},{"id":20213889797,"package_name":"charset-normalizer","ecosystem":"pypi","requirements":"3.3.2","direct":false,"kind":"runtime","optional":false},{"id":20213889798,"package_name":"click","ecosystem":"pypi","requirements":"8.1.7","direct":false,"kind":"runtime","optional":false},{"id":20213889799,"package_name":"click-plugins","ecosystem":"pypi","requirements":"1.1.1","direct":false,"kind":"runtime","optional":false},{"id":20213889800,"package_name":"cligj","ecosystem":"pypi","requirements":"0.7.2","direct":false,"kind":"runtime","optional":false},{"id":20213889801,"package_name":"colorama","ecosystem":"pypi","requirements":"0.4.6","direct":false,"kind":"runtime","optional":false},{"id":20213889802,"package_name":"commonmark","ecosystem":"pypi","requirements":"0.9.1","direct":false,"kind":"runtime","optional":false},{"id":20213889803,"package_name":"contourpy","ecosystem":"pypi","requirements":"1.3.0","direct":false,"kind":"runtime","optional":false},{"id":20213889804,"package_name":"cycler","ecosystem":"pypi","requirements":"0.12.1","direct":false,"kind":"runtime","optional":false},{"id":20213889805,"package_name":"deepforest","ecosystem":"pypi","requirements":"1.3.3","direct":false,"kind":"runtime","optional":false},{"id":20213889806,"package_name":"docstring-parser","ecosystem":"pypi","requirements":"0.16","direct":false,"kind":"runtime","optional":false},{"id":20213889807,"package_name":"docutils","ecosystem":"pypi","requirements":"0.21.2","direct":false,"kind":"runtime","optional":false},{"id":20213889808,"package_name":"efficientnet-pytorch","ecosystem":"pypi","requirements":"0.7.1","direct":false,"kind":"runtime","optional":false},{"id":20213889814,"package_name":"einops","ecosystem":"pypi","requirements":"0.8.0","direct":false,"kind":"runtime","optional":false},{"id":20213889815,"package_name":"eval-type-backport","ecosystem":"pypi","requirements":"0.2.0","direct":false,"kind":"runtime","optional":false},{"id":20213889816,"package_name":"filelock","ecosystem":"pypi","requirements":"3.16.0","direct":false,"kind":"runtime","optional":false},{"id":20213889817,"package_name":"fiona","ecosystem":"pypi","requirements":"1.10.0","direct":false,"kind":"runtime","optional":false},{"id":20213889818,"package_name":"fonttools","ecosystem":"pypi","requirements":"4.53.1","direct":false,"kind":"runtime","optional":false},{"id":20213889819,"package_name":"frozenlist","ecosystem":"pypi","requirements":"1.4.1","direct":false,"kind":"runtime","optional":false},{"id":20213889820,"package_name":"fsspec","ecosystem":"pypi","requirements":"2024.9.0","direct":false,"kind":"runtime","optional":false},{"id":20213889821,"package_name":"geopandas","ecosystem":"pypi","requirements":"1.0.1","direct":false,"kind":"runtime","optional":false},{"id":20213889822,"package_name":"huggingface-hub","ecosystem":"pypi","requirements":"0.24.6","direct":false,"kind":"runtime","optional":false},{"id":20213889823,"package_name":"hydra-core","ecosystem":"pypi","requirements":"1.3.2","direct":false,"kind":"runtime","optional":false},{"id":20213889824,"package_name":"idna","ecosystem":"pypi","requirements":"3.8","direct":false,"kind":"runtime","optional":false},{"id":20213889825,"package_name":"imagecodecs","ecosystem":"pypi","requirements":"2024.6.1","direct":false,"kind":"runtime","optional":false},{"id":20213889826,"package_name":"imageio","ecosystem":"pypi","requirements":"2.35.1","direct":false,"kind":"runtime","optional":false},{"id":20213889827,"package_name":"imagesize","ecosystem":"pypi","requirements":"1.4.1","direct":false,"kind":"runtime","optional":false},{"id":20213889828,"package_name":"importlib-resources","ecosystem":"pypi","requirements":"6.4.5","direct":false,"kind":"runtime","optional":false},{"id":20213889829,"package_name":"jinja2","ecosystem":"pypi","requirements":"3.1.4","direct":false,"kind":"runtime","optional":false},{"id":20213889830,"package_name":"jsonargparse","ecosystem":"pypi","requirements":"4.32.1","direct":false,"kind":"runtime","optional":false},{"id":20213889831,"package_name":"kiwisolver","ecosystem":"pypi","requirements":"1.4.7","direct":false,"kind":"runtime","optional":false},{"id":20213889832,"package_name":"kornia","ecosystem":"pypi","requirements":"0.7.3","direct":false,"kind":"runtime","optional":false},{"id":20213889833,"package_name":"kornia-rs","ecosystem":"pypi","requirements":"0.1.5","direct":false,"kind":"runtime","optional":false},{"id":20213889834,"package_name":"lazy-loader","ecosystem":"pypi","requirements":"0.4","direct":false,"kind":"runtime","optional":false},{"id":20213889835,"package_name":"lightly","ecosystem":"pypi","requirements":"1.5.12","direct":false,"kind":"runtime","optional":false},{"id":20213889836,"package_name":"lightly-utils","ecosystem":"pypi","requirements":"0.0.2","direct":false,"kind":"runtime","optional":false},{"id":20213889844,"package_name":"lightning","ecosystem":"pypi","requirements":"2.4.0","direct":false,"kind":"runtime","optional":false},{"id":20213889845,"package_name":"lightning-utilities","ecosystem":"pypi","requirements":"0.11.7","direct":false,"kind":"runtime","optional":false},{"id":20213889846,"package_name":"llvmlite","ecosystem":"pypi","requirements":"0.40.1","direct":false,"kind":"runtime","optional":false},{"id":20213889847,"package_name":"lsnms","ecosystem":"pypi","requirements":"0.4.4","direct":false,"kind":"runtime","optional":false},{"id":20213889848,"package_name":"markdown-it-py","ecosystem":"pypi","requirements":"3.0.0","direct":false,"kind":"runtime","optional":false},{"id":20213889849,"package_name":"markupsafe","ecosystem":"pypi","requirements":"2.1.5","direct":false,"kind":"runtime","optional":false},{"id":20213889850,"package_name":"matplotlib","ecosystem":"pypi","requirements":"3.9.2","direct":false,"kind":"runtime","optional":false},{"id":20213889851,"package_name":"mdurl","ecosystem":"pypi","requirements":"0.1.2","direct":false,"kind":"runtime","optional":false},{"id":20213889852,"package_name":"mpmath","ecosystem":"pypi","requirements":"1.3.0","direct":false,"kind":"runtime","optional":false},{"id":20213889853,"package_name":"multidict","ecosystem":"pypi","requirements":"6.1.0","direct":false,"kind":"runtime","optional":false},{"id":20213889854,"package_name":"munch","ecosystem":"pypi","requirements":"4.0.0","direct":false,"kind":"runtime","optional":false},{"id":20213889855,"package_name":"networkx","ecosystem":"pypi","requirements":"3.3","direct":false,"kind":"runtime","optional":false},{"id":20213889856,"package_name":"numba","ecosystem":"pypi","requirements":"0.57.1","direct":false,"kind":"runtime","optional":false},{"id":20213889857,"package_name":"numpy","ecosystem":"pypi","requirements":"1.24.4","direct":false,"kind":"runtime","optional":false},{"id":20213889858,"package_name":"nvidia-cublas-cu12","ecosystem":"pypi","requirements":"12.1.3.1","direct":false,"kind":"runtime","optional":false},{"id":20213889859,"package_name":"nvidia-cuda-cupti-cu12","ecosystem":"pypi","requirements":"12.1.105","direct":false,"kind":"runtime","optional":false},{"id":20213889860,"package_name":"nvidia-cuda-nvrtc-cu12","ecosystem":"pypi","requirements":"12.1.105","direct":false,"kind":"runtime","optional":false},{"id":20213889861,"package_name":"nvidia-cuda-runtime-cu12","ecosystem":"pypi","requirements":"12.1.105","direct":false,"kind":"runtime","optional":false},{"id":20213889862,"package_name":"nvidia-cudnn-cu12","ecosystem":"pypi","requirements":"9.1.0.70","direct":false,"kind":"runtime","optional":false},{"id":20213889863,"package_name":"nvidia-cufft-cu12","ecosystem":"pypi","requirements":"11.0.2.54","direct":false,"kind":"runtime","optional":false},{"id":20213889864,"package_name":"nvidia-curand-cu12","ecosystem":"pypi","requirements":"10.3.2.106","direct":false,"kind":"runtime","optional":false},{"id":20213889865,"package_name":"nvidia-cusolver-cu12","ecosystem":"pypi","requirements":"11.4.5.107","direct":false,"kind":"runtime","optional":false},{"id":20213889866,"package_name":"nvidia-cusparse-cu12","ecosystem":"pypi","requirements":"12.1.0.106","direct":false,"kind":"runtime","optional":false},{"id":20213889867,"package_name":"nvidia-nccl-cu12","ecosystem":"pypi","requirements":"2.20.5","direct":false,"kind":"runtime","optional":false},{"id":20213889868,"package_name":"nvidia-nvjitlink-cu12","ecosystem":"pypi","requirements":"12.6.68","direct":false,"kind":"runtime","optional":false},{"id":20213889869,"package_name":"nvidia-nvtx-cu12","ecosystem":"pypi","requirements":"12.1.105","direct":false,"kind":"runtime","optional":false},{"id":20213889870,"package_name":"omegaconf","ecosystem":"pypi","requirements":"2.3.0","direct":false,"kind":"runtime","optional":false},{"id":20213889871,"package_name":"opencv-python","ecosystem":"pypi","requirements":"4.10.0.84","direct":false,"kind":"runtime","optional":false},{"id":20213889872,"package_name":"opencv-python-headless","ecosystem":"pypi","requirements":"4.10.0.84","direct":false,"kind":"runtime","optional":false},{"id":20213889873,"package_name":"packaging","ecosystem":"pypi","requirements":"24.1","direct":false,"kind":"runtime","optional":false},{"id":20213889874,"package_name":"pandas","ecosystem":"pypi","requirements":"2.2.2","direct":false,"kind":"runtime","optional":false},{"id":20213889875,"package_name":"pillow","ecosystem":"pypi","requirements":"10.4.0","direct":false,"kind":"runtime","optional":false},{"id":20213889876,"package_name":"pretrainedmodels","ecosystem":"pypi","requirements":"0.7.4","direct":false,"kind":"runtime","optional":false},{"id":20213889877,"package_name":"progressbar2","ecosystem":"pypi","requirements":"4.5.0","direct":false,"kind":"runtime","optional":false},{"id":20213889878,"package_name":"protobuf","ecosystem":"pypi","requirements":"5.28.0","direct":false,"kind":"runtime","optional":false},{"id":20213889879,"package_name":"psutil","ecosystem":"pypi","requirements":"6.0.0","direct":false,"kind":"runtime","optional":false},{"id":20213889880,"package_name":"pycocotools","ecosystem":"pypi","requirements":"2.0.8","direct":false,"kind":"runtime","optional":false},{"id":20213889881,"package_name":"pydantic","ecosystem":"pypi","requirements":"2.9.1","direct":false,"kind":"runtime","optional":false},{"id":20213889882,"package_name":"pydantic-core","ecosystem":"pypi","requirements":"2.23.3","direct":false,"kind":"runtime","optional":false},{"id":20213889883,"package_name":"pygments","ecosystem":"pypi","requirements":"2.18.0","direct":false,"kind":"runtime","optional":false},{"id":20213889884,"package_name":"pyogrio","ecosystem":"pypi","requirements":"0.9.0","direct":false,"kind":"runtime","optional":false},{"id":20213889885,"package_name":"pyparsing","ecosystem":"pypi","requirements":"3.1.4","direct":false,"kind":"runtime","optional":false},{"id":20213889886,"package_name":"pyproj","ecosystem":"pypi","requirements":"3.6.1","direct":false,"kind":"runtime","optional":false},{"id":20213889887,"package_name":"python-dateutil","ecosystem":"pypi","requirements":"2.9.0.post0","direct":false,"kind":"runtime","optional":false},{"id":20213889888,"package_name":"python-utils","ecosystem":"pypi","requirements":"3.8.2","direct":false,"kind":"runtime","optional":false},{"id":20213889889,"package_name":"pytorch-lightning","ecosystem":"pypi","requirements":"2.4.0","direct":false,"kind":"runtime","optional":false},{"id":20213889890,"package_name":"pytz","ecosystem":"pypi","requirements":"2024.2","direct":false,"kind":"runtime","optional":false},{"id":20213889891,"package_name":"pyyaml","ecosystem":"pypi","requirements":"6.0.2","direct":false,"kind":"runtime","optional":false},{"id":20213889892,"package_name":"rasterio","ecosystem":"pypi","requirements":"1.3.11","direct":false,"kind":"runtime","optional":false},{"id":20213889893,"package_name":"recommonmark","ecosystem":"pypi","requirements":"0.7.1","direct":false,"kind":"runtime","optional":false},{"id":20213889894,"package_name":"requests","ecosystem":"pypi","requirements":"2.32.3","direct":false,"kind":"runtime","optional":false},{"id":20213889895,"package_name":"rich","ecosystem":"pypi","requirements":"13.8.1","direct":false,"kind":"runtime","optional":false},{"id":20213889896,"package_name":"rtree","ecosystem":"pypi","requirements":"1.3.0","direct":false,"kind":"runtime","optional":false},{"id":20213889897,"package_name":"safetensors","ecosystem":"pypi","requirements":"0.4.5","direct":false,"kind":"runtime","optional":false},{"id":20213889898,"package_name":"scikit-image","ecosystem":"pypi","requirements":"0.24.0","direct":false,"kind":"runtime","optional":false},{"id":20213889899,"package_name":"scipy","ecosystem":"pypi","requirements":"1.14.1","direct":false,"kind":"runtime","optional":false},{"id":20213889900,"package_name":"segmentation-models-pytorch","ecosystem":"pypi","requirements":"0.3.4","direct":false,"kind":"runtime","optional":false},{"id":20213889901,"package_name":"setuptools","ecosystem":"pypi","requirements":"74.1.2","direct":false,"kind":"runtime","optional":false},{"id":20213889902,"package_name":"shapely","ecosystem":"pypi","requirements":"2.0.6","direct":false,"kind":"runtime","optional":false},{"id":20213889903,"package_name":"six","ecosystem":"pypi","requirements":"1.16.0","direct":false,"kind":"runtime","optional":false},{"id":20213889904,"package_name":"slidingwindow","ecosystem":"pypi","requirements":"0.0.14","direct":false,"kind":"runtime","optional":false},{"id":20213889905,"package_name":"snowballstemmer","ecosystem":"pypi","requirements":"2.2.0","direct":false,"kind":"runtime","optional":false},{"id":20213889906,"package_name":"snuggs","ecosystem":"pypi","requirements":"1.4.7","direct":false,"kind":"runtime","optional":false},{"id":20213889907,"package_name":"sphinx","ecosystem":"pypi","requirements":"8.0.2","direct":false,"kind":"runtime","optional":false},{"id":20213889908,"package_name":"sphinxcontrib-applehelp","ecosystem":"pypi","requirements":"2.0.0","direct":false,"kind":"runtime","optional":false},{"id":20213889909,"package_name":"sphinxcontrib-devhelp","ecosystem":"pypi","requirements":"2.0.0","direct":false,"kind":"runtime","optional":false},{"id":20213889910,"package_name":"sphinxcontrib-htmlhelp","ecosystem":"pypi","requirements":"2.1.0","direct":false,"kind":"runtime","optional":false},{"id":20213889911,"package_name":"sphinxcontrib-jsmath","ecosystem":"pypi","requirements":"1.0.1","direct":false,"kind":"runtime","optional":false},{"id":20213889912,"package_name":"sphinxcontrib-qthelp","ecosystem":"pypi","requirements":"2.0.0","direct":false,"kind":"runtime","optional":false},{"id":20213889913,"package_name":"sphinxcontrib-serializinghtml","ecosystem":"pypi","requirements":"2.0.0","direct":false,"kind":"runtime","optional":false},{"id":20213889914,"package_name":"sympy","ecosystem":"pypi","requirements":"1.13.2","direct":false,"kind":"runtime","optional":false},{"id":20213889915,"package_name":"tensorboardx","ecosystem":"pypi","requirements":"2.6.2.2","direct":false,"kind":"runtime","optional":false},{"id":20213889916,"package_name":"tifffile","ecosystem":"pypi","requirements":"2024.8.30","direct":false,"kind":"runtime","optional":false},{"id":20213889917,"package_name":"timm","ecosystem":"pypi","requirements":"0.9.7","direct":false,"kind":"runtime","optional":false},{"id":20213889918,"package_name":"tomli","ecosystem":"pypi","requirements":"2.0.1","direct":false,"kind":"runtime","optional":false},{"id":20213889919,"package_name":"torch","ecosystem":"pypi","requirements":"2.4.1","direct":false,"kind":"runtime","optional":false},{"id":20213889920,"package_name":"torchgeo","ecosystem":"pypi","requirements":"0.6.0","direct":false,"kind":"runtime","optional":false},{"id":20213889922,"package_name":"torchmetrics","ecosystem":"pypi","requirements":"1.4.1","direct":false,"kind":"runtime","optional":false},{"id":20213889923,"package_name":"torchvision","ecosystem":"pypi","requirements":"0.19.1","direct":false,"kind":"runtime","optional":false},{"id":20213889924,"package_name":"tqdm","ecosystem":"pypi","requirements":"4.66.5","direct":false,"kind":"runtime","optional":false},{"id":20213889925,"package_name":"triton","ecosystem":"pypi","requirements":"3.0.0","direct":false,"kind":"runtime","optional":false},{"id":20213889926,"package_name":"typeshed-client","ecosystem":"pypi","requirements":"2.7.0","direct":false,"kind":"runtime","optional":false},{"id":20213889927,"package_name":"typing-extensions","ecosystem":"pypi","requirements":"4.12.2","direct":false,"kind":"runtime","optional":false},{"id":20213889928,"package_name":"tzdata","ecosystem":"pypi","requirements":"2024.1","direct":false,"kind":"runtime","optional":false},{"id":20213889929,"package_name":"urllib3","ecosystem":"pypi","requirements":"2.2.2","direct":false,"kind":"runtime","optional":false},{"id":20213889930,"package_name":"xmltodict","ecosystem":"pypi","requirements":"0.13.0","direct":false,"kind":"runtime","optional":false},{"id":20213889931,"package_name":"yarl","ecosystem":"pypi","requirements":"1.11.1","direct":false,"kind":"runtime","optional":false}]},{"ecosystem":"pypi","filepath":"pyproject.toml","sha":null,"kind":"manifest","created_at":"2024-10-16T19:11:20.557Z","updated_at":"2024-10-16T19:11:20.557Z","repository_link":"https://github.com/open-forest-observatory/tree-detection-framework/blob/main/pyproject.toml","dependencies":[{"id":20213890364,"package_name":"python","ecosystem":"pypi","requirements":"\u003e=3.10,\u003c3.12","direct":true,"kind":"runtime","optional":false},{"id":20213890365,"package_name":"torchgeo","ecosystem":"pypi","requirements":"^0.6.0","direct":true,"kind":"runtime","optional":false},{"id":20213890366,"package_name":"deepforest","ecosystem":"pypi","requirements":"^1.3.3","direct":true,"kind":"runtime","optional":false},{"id":20213890367,"package_name":"lsnms","ecosystem":"pypi","requirements":"^0.4.4","direct":true,"kind":"runtime","optional":false}]}],"score":5.66988092298052,"created_at":"2025-06-11T00:12:57.982Z","updated_at":"2026-05-28T03:30:35.409Z","avatar_url":"https://github.com/open-forest-observatory.png","language":"Jupyter Notebook","category":"Biosphere","sub_category":"Forest Remote Sensing","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"# tree-detection-framework\nThis project has three main goals:\n* Enable tree detection on realistic-scale, geospatial raster data with minimal boilerplate, using existing (external) tree detection/segmentation models\n* Facilitate direct comparison of multiple algorithms\n* Rely on modern libraries and software best practice for a robust, performant, and modular tool\n\nThis project does not, itself, provide tree detection/segmentation algorithms (with the exception of a geometric algorithm). Instead, it provides a standardized interface for performing training, inference, and evaluation using existing tree detection models and algorithms. The project currently supports the external computer vision models DeepForest, Dectree2, and SAM2, as well as a geometric canopy height model segmentor implemented within TDF. Support for other external models can be added by implementing a new `Detector` class.\n\nWe use the `torchgeo` package to perform data loading and standardization using standard geospatial input formats. This library allows us to generate chips on the fly of a given size, stride, and spatial resolution. Training and inference is done with modular detectors that can be based on existing models and algorithms. We have preliminary support for using `PyTorch Lightning` to minimize boilerplate around model training and prediction. Region-level nonmax-suppression (NMS) is done using the `PolyGoneNMS` library which is efficient for large images. Visualization and saving of the predictions is done using `geopandas`, a common library for geospatial data.\n\nThis project is under active development by the [Open Forest Observatory](https://openforestobservatory.org/). We welcome contributions and suggestions for improvement.\n\n## Tree detection models supported\nTDF currently supports the following tree detection/segmentation algorithms.\n\n### DeepForest\n- [Github](https://github.com/weecology/DeepForest)\n- Uses RGB input data. Predicts tree crowns with rectangular bounding boxes.\n- Provides a RetinaNet model trained on a large number of semi-supervised tree crown annotations and a smaller set of manual annotations.\n- Trained using data from the US only but representing diverse regions. The model has been applied on data from outside the US successfully.\n\n### Detectree2\n- [Github](https://github.com/PatBall1/detectree2)\n- Uses RGB input data. Predicts tree crowns with polygon boundaries.\n- Provides a Mask R-CNN model trained on manually labeled tree crowns from four sites.\n- Trained using data from tropical forests.\n\n### Segment Anything Model 2 (SAM2)\n- [Github](https://github.com/facebookresearch/sam2)\n- Uses RGB input data. Predicts objects with polygon boundaries.\n- Utilizes the Segment Anything Model (SAM 2.1 Hiera Large) checkpoint with tuned parameters for mask generation optimized for tree crown delineation.\n- Does not rely on supervised training for tree-specific data but generalizes well due to SAM's zero-shot nature; however, non-tree objects are also detected and included in predictions.\n\n### Segment Anything Model 3 (SAM3)\n- [GitHub](https://github.com/facebookresearch/sam3)\n- Uses RGB input data. Predicts objects with polygon boundaries.\n- Utilizes the SAM3 checkpoint using text prompt \"tree\" for tree crown delineation.\n- Does not rely on supervised training for tree-specific data but generalizes well due to SAM's zero-shot nature. Unlike SAM2, non-tree objects are not usually detected or included in predictions.\n\n### Geometric Detector\n- Implementation of the variable window filter algorithm of [Popescu and Wynne\n  (2004)](https://www.ingentaconnect.com/content/asprs/pers/2004/00000070/00000005/art00003) for\n  tree top detection, combined with the algorithm of [Silva et al.\n  (2016)](https://www.tandfonline.com/doi/full/10.1080/07038992.2016.1196582#abstract) for crown\n  segmentation.\n- Uses canopy height model (CHM) input data. Predicts tree crowns with polygon boundaries.\n- This is a learning-free tree detection algorithm. It is the one algorithm that is implemented within TDF as opposed to relying on an existing external model/algorithm.\n\n## Software architecture\nThe `tree-detection-framework` is organized into modular components to facilitate extension including integration of additional detection models. The main components are:\n\n1. **`preprocessing.py`**\u003cbr\u003e\n   The `create_dataloader()` method accepts single/multiple orthomosaic inputs. Alternatively,\n   `create_image_datalaoder()` accepts a folder containing raw drone imagery. The methods tile the\n   input images based on user-specified parameters such as tile size, stride, and resolution and\n   return a PyTorch-compatible dataloader for inference.\n2. **`Detector` Base Class**\u003cbr\u003e\n   All detectors in the framework (e.g., DeepForestDetector, Detectree2Detector) inherit from the\n   `Detector` base class. The base class defines the core logic for generating predictions and\n   geospatially referencing image tiles, while model-specific detectors translate the inputs to the\n   format expected by the respective model. This design allows all detectors to plug into the same\n   pipeline with minimal code changes.\n3. **`RegionDetectionsSet` and `RegionDetections`**\u003cbr\u003e\n   These classes standardize model outputs. A `RegionDetectionsSet` is a collection of `RegionDetections`, where each `RegionDetections` object represents the detections in a single image tile. This abstraction allows postprocessing components to operate uniformly across different detectors. These outputs can be saved out as `.gpkg` or `.geojson` files.\n4. **`postprocessing.py`**\u003cbr\u003e\n   Impelments a set of postprocessing functions for cleaning the detections by Non-Maximum Suppression(NMS), polygon hole suppression, tile boundary suppression, and removing out of bounds detections. Most of these methods operate on standardized output types (`RegionDetections` / `RegionDetectionsSet`).\n\n## Install\nSome of the dependencies are managed by a tool called [Poetry](https://python-poetry.org/). I've found\neasiest to install this using the \"official installer\" option as follows. Note that this should be run\nin the base conda environment or with no environment active.\n```\ncurl -sSL https://install.python-poetry.org | python3 -\n```\nNow create and activate a conda environment for the dependencies of this project.\n```\nconda create -n tree-detection-framework python=3.10 -y\nconda activate tree-detection-framework\n```\n\nNow, from the root directory of the project, run the following command. Note that on Jetstream2, you\nmay need to run this in a graphical session and respond to a keyring popup menu.\n```\npoetry install\n```\nFinally, choose to either install the Detectron2 or SAM2 detection framework.\n\n**Detectron2:** \nThe Detectron2 library is not compatible with `poetry` so must be installed directly with pip\n```\n# https://detectron2.readthedocs.io/en/latest/tutorials/install.html#build-detectron2-from-source\npip install git+https://github.com/facebookresearch/detectron2.git\n```\nDownload the detectree2 checkpoint weights.\n```\ncd checkpoints\nmkdir detectree2\ncd detectree2\nwget https://zenodo.org/records/10522461/files/230103_randresize_full.pth\n```\n**SAM2:** \nClone the SAM2 repository and install the necessary config files\n```\ngit clone https://github.com/facebookresearch/sam2.git \u0026\u0026 cd sam2\n\npip install -e .\n```\nAnd download the associated checkpoints\n```\ncd checkpoints \u0026\u0026 \\\n./download_ckpts.sh \u0026\u0026 \\\ncd ..\n```\nAnd move into this repo\n```\nmv checkpoints ../tree-detection-framework \n```\n\n**SAM3:**\nClone the SAM3 repository and install the dependencies. This can be done from any directory.\n```\ngit clone https://github.com/facebookresearch/sam3.git \u0026\u0026 cd sam3\n\npip install -e .\n```\nNOTE: `numpy` may be downgraded during installation due to dependency constraints. This is expected and does not impact other functionality in TDF.\n\nNext, install the missing package 'decord'\n```\npip install decord\n```\nTo download the model checkpoint, you will need to login to HuggingFace and request model access from the [SAM3 repo](https://huggingface.co/facebook/sam3). Once the access has been granted to your account (usually within a couple minutes), follow these steps:\n- Go to: https://huggingface.co/settings/tokens\n- Select \"Create new token\"\n- Select Token type \"Read\"\n- Enter token name and create token. Copy and store the token somewhere (you won't see it again).\n\nFollow steps in `tree-detection-framework/examples/predict_detections_sam3.ipynb` to understand how to use SAM3. Replace `HUGGING_FACE_TOKEN` with your access token created from HuggingFace.\n\n\n## Docker\nAn alternative approach to a local installation is using the pre-built docker image. At this point, this image only supports the dependencies for the DeepForest and geometric detectors. The [packages](david-paired-photogrammetry/default-run) tab of the repository provides the command to pull the image.\n\n## Use\nThe module code is in the `tree_detection_framework` folder. Once installed using the `poetry`\ncommand above, this code can be imported into scripts or notebooks under the name\n `tree_detection_framework` the same as you would for any other library.\n\n## Examples\nTo begin with, you can access example geospatial data\n[here](https://ucdavis.box.com/v/tdf-example-data), which should be downloaded and placed in the `data` folder at the top level of this project. Our goal is to have high-quality,\nup-to-date examples in the `examples` folder. We also have work-in-progress or one-off code in\n`sandbox`, which still may provide some insight but is not guaranteed to be current or generalizable.\nFinally, the `tree_detection_framework/entrypoints` folder has command line scripts that can be run\nto complete tasks.\n\n## Evaluation and benchmark with NEON\nDownload the NEON dataset files and save the annotations and RGB folders under a new directory in the `data` folder.\n```\nwget -O annotations.zip \"https://zenodo.org/records/5914554/files/annotations.zip?download=1\"\nunzip annotations.zip\nwget -O evaluation.zip \"https://zenodo.org/records/5914554/files/evaluation.zip?download=1\"\nunzip -j evaluation.zip \"evaluation/RGB/*\" -d RGB\nrm annotations.zip\nrm evaluation.zip\n```\nFollow the steps in `tree-detection-framework/sandbox/evaluation/neon_benchmark.ipynb` for detectors `DeepForest` \u0026 `Detectree2`, and `tree-detection-framework/sandbox/evaluation/sam2_neon_benchmark.ipynb` to use `SAM2`.\n\n## Evaluation and benchmark with Detectree2 datasets\n1. Download the dataset. There are two ways to get the dataset:\n    Download the site-specific .tif (for orthomosaic) and .gpkg (for ground truth polygons) files from https://zenodo.org/records/8136161. Then, follow steps in https://github.com/PatBall1/detectree2/blob/master/notebooks/colab/tilingJB.ipynb to do the the tiling.\n    (OR)\n    Download our pre-tiled dataset from https://ucdavis.box.com/s/thjmaane9d38opw1bhnyxrsrtt90j37m \n3. Add the tiled dataset folder to the `data` folder in this repo.\n4. For benchmark and evaluation see steps in `tree-detection-framework/sandbox/evaluation/dtree2_benchmark.ipynb` and `tree-detection-framework/sandbox/evaluation/sam2_dtree2_benchmark.ipynb` \n","funding_links":[],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":[],"project_url":"https://ost.ecosyste.ms/api/v1/projects/318360","html_url":"https://ost.ecosyste.ms/projects/318360"}