{"id":658,"name":"Planet Snowcover","description":"A project that pairs airborne lidar and Planet Labs satellite imagery with cutting-edge computer vision techniques to identify snow-covered area at unprecedented spatial and temporal resolutions.","url":"https://github.com/acannistra/planet-snowcover","last_synced_at":"2026-04-30T12:01:57.931Z","repository":{"id":53909394,"uuid":"118838597","full_name":"acannistra/planet-snowcover","owner":"acannistra","description":"Can we use Planet high-resolution imagery and machine learning to assess snow cover?","archived":false,"fork":false,"pushed_at":"2021-12-03T20:33:39.000Z","size":281110,"stargazers_count":21,"open_issues_count":7,"forks_count":7,"subscribers_count":4,"default_branch":"master","last_synced_at":"2026-04-20T07:01:42.288Z","etag":null,"topics":["cloud-native","computer-vision","planet-labs"],"latest_commit_sha":null,"homepage":"https://planet-snowcover.readthedocs.io/en/latest/","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/acannistra.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-01-25T00:11:48.000Z","updated_at":"2025-03-28T08:27:44.000Z","dependencies_parsed_at":"2022-08-13T04:01:03.458Z","dependency_job_id":null,"html_url":"https://github.com/acannistra/planet-snowcover","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/acannistra/planet-snowcover","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/acannistra%2Fplanet-snowcover","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/acannistra%2Fplanet-snowcover/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/acannistra%2Fplanet-snowcover/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/acannistra%2Fplanet-snowcover/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/acannistra","download_url":"https://codeload.github.com/acannistra/planet-snowcover/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/acannistra%2Fplanet-snowcover/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32377599,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-28T09:24:15.638Z","status":"ssl_error","status_checked_at":"2026-04-28T09:24:15.071Z","response_time":56,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":"acannistra","name":"Tony Cannistra","uuid":"1641939","kind":"user","description":"Cartography engineering at @onXmaps .  Ecology PhD from University of Washington @HuckleyLab. Maps, Ecology, Conservation.","email":"","website":"http://anthonycannistra.com","location":"Snoqualmie Valley, WA, USA","twitter":null,"company":"@onXmaps ","icon_url":"https://avatars.githubusercontent.com/u/1641939?u=db2e48b2ada21070236ec5639711aba158e549d1\u0026v=4","repositories_count":64,"last_synced_at":"2024-04-15T05:21:46.849Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/acannistra","funding_links":[],"total_stars":43,"followers":34,"following":10,"created_at":"2022-11-05T11:27:28.507Z","updated_at":"2024-04-15T05:22:07.771Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/acannistra","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/acannistra/repositories"},"packages":[],"commits":{"id":1254321,"full_name":"acannistra/planet-snowcover","default_branch":"master","total_commits":418,"total_committers":3,"total_bot_commits":0,"total_bot_committers":0,"mean_commits":139.33333333333334,"dds":0.02631578947368418,"past_year_total_commits":0,"past_year_total_committers":0,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":0.0,"past_year_dds":0.0,"last_synced_at":"2026-04-28T13:23:56.690Z","last_synced_commit":"280962eee67ac3c57458608bca20abc90dddc4d7","created_at":"2023-03-27T11:32:08.402Z","updated_at":"2026-04-28T13:23:24.676Z","committers":[{"name":"Tony Cannistra","email":"tony.cannistra@gmail.com","login":"acannistra","count":407},{"name":"acannistra","email":"acannistra@local","login":null,"count":8},{"name":"EC2 Default User","email":"ec2-user@ip-172-31-7-94.us-west-2.compute.internal","login":null,"count":3}],"past_year_committers":[],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/acannistra%2Fplanet-snowcover/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-30T00:00:07.427Z","repositories_count":6223611,"commits_count":899690658,"contributors_count":34896480,"owners_count":1147648,"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":"acannistra/planet-snowcover","html_url":"https://github.com/acannistra/planet-snowcover","last_synced_at":"2026-04-08T01:00:59.821Z","status":"error","issues_count":12,"pull_requests_count":19,"avg_time_to_close_issue":10578136.3,"avg_time_to_close_pull_request":671673.0714285715,"issues_closed_count":10,"pull_requests_closed_count":14,"pull_request_authors_count":1,"issue_authors_count":1,"avg_comments_per_issue":1.0,"avg_comments_per_pull_request":0.5789473684210527,"merged_pull_requests_count":12,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":0,"past_year_pull_requests_count":0,"past_year_avg_time_to_close_issue":null,"past_year_avg_time_to_close_pull_request":null,"past_year_issues_closed_count":0,"past_year_pull_requests_closed_count":0,"past_year_pull_request_authors_count":0,"past_year_issue_authors_count":0,"past_year_avg_comments_per_issue":null,"past_year_avg_comments_per_pull_request":null,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":0,"created_at":"2023-05-09T10:36:40.903Z","updated_at":"2026-04-08T01:00:59.821Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/acannistra%2Fplanet-snowcover","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/acannistra%2Fplanet-snowcover/issues","issue_labels_count":{"imagery":2,"wontfix":1,"to do":1},"pull_request_labels_count":{},"issue_author_associations_count":{"OWNER":12},"pull_request_author_associations_count":{"OWNER":19},"issue_authors":{"acannistra":12},"pull_request_authors":{"acannistra":19},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-30T00:00:06.639Z","repositories_count":14451050,"issues_count":34179849,"pull_requests_count":112135139,"authors_count":11249547,"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":{},"past_year_pull_request_labels_count":{},"past_year_issue_author_associations_count":{},"past_year_pull_request_author_associations_count":{},"past_year_issue_authors":{},"past_year_pull_request_authors":{},"maintainers":[{"login":"acannistra","count":31,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/acannistra"}],"active_maintainers":[]},"events":{"total":{"ForkEvent":1,"WatchEvent":1},"last_year":{}},"keywords":["cloud-native","computer-vision","planet-labs"],"dependencies":[],"score":4.430816798843313,"created_at":"2023-09-11T11:54:35.544Z","updated_at":"2026-04-30T12:01:57.933Z","avatar_url":"https://github.com/acannistra.png","language":"Jupyter Notebook","category":"Cryosphere","sub_category":"Snow and Permafrost","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"\u003cdiv\u003e\n\n\u003ch1\u003e Planet Snowcover \u003ca href=\"https://planet-snowcover.readthedocs.io/en/latest/?badge=latest\"\u003e\u003cimg src=\"https://readthedocs.org/projects/planet-snowcover/badge/?version=latest\"\u003e\u003c/a\u003e \u003cspan\u003e\u003cimg align=\"right\" src=\"https://s3-us-west-2.amazonaws.com/uw-s3-cdn/wp-content/uploads/sites/98/2014/09/07214451/W-Logo_Purple_Hex.png\" height=35px\u003e\u003c/span\u003e \u003c/h1\u003e\n\nPlanet Snowcover is a project that pairs airborne lidar and Planet Labs satellite imagery with cutting-edge computer vision techniques to identify snow-covered area at unprecedented spatial and temporal resolutions.\n\n\u003cp\u003e\u003cimg align=\"right\" src=\"https://centennial.agu.org/wp-content/uploads/2018/08/AGU100_logo_H-CMYK.png\" style=\"float:right; padding: 5px\" height=35\u003e💡This work was \u003ca href=\"https://agu.confex.com/agu/fm19/meetingapp.cgi/Paper/594007\"\u003epresented\u003c/a\u003e by Tony (@acannistra) at AGU 2019 in San Francisco. See the slides \u003ca href=\"./artifacts/AGU19_Talk/Cannistra-AGU-Planet-Snow.pdf\"\u003ehere\u003c/a\u003e. \u003c/p\u003e \n\n**Researchers**: *[Tony Cannistra](https://www.anthonycannistra.com)\u003csup\u003e1\u003c/sup\u003e, Dr. David Shean\u003csup\u003e2\u003c/sup\u003e, and Dr. Nicoleta Cristea\u003csup\u003e2\u003c/sup\u003e*\n\n\u003cimg src=\"./artifacts/co-ex-1.png\"\u003e\n\n\u003c/div\u003e\n\n\u003cdiv\u003e\u003csmall\u003e1: Department of Biology, University of Washington, Seattle, WA.\u003c/br\u003e2: Department of Civil and Environmental Engineering, University of Washington, Seattle, WA\u003c/small\u003e\n\n## This Repository\n\nThis repository serves as the canonical source for the software and infrastructure necessary to sucessfully build and deploy a machine-learning based snow classifier using Planet Labs imagery and airborne lidar data.\n\n* [Primary Components](#primary-components)\n* [Requirements](#requirements)\n  * [Basic Requirements](#basic-requirements)\n  * [Development Requirements](#development-requirements)\n  * [Accounts + Data](#accounts-and-data)\n* [Infrastructure Deployment](#infrastructure-deployment)\n* [Tutorials](#tutorials)\n* [Implementation Details](#implementation-details)\n  * AWS Cloud Resources\n  * Open Source Machine Learning\n* Funding Sources\n* [Original Research Proposal](#original-proposal)\n\n## Primary Components\n\nThe contents of this repository are divided into several main components, which we detail here. This is the place to look if you're looking for something in   particular.\n\n| Folder                                             | Description                                                                                                               | Details                                                                                                                                                                                                                     |\n|----------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| [`./pipeline`](./pipeline)                         | Jupyter notebooks detailing the entire data processing, machine learning, and evaluation pipeline.                        | These notebooks detail every step in this workflow, from start to finish.                                                                                                                                                   |\n| [`./preprocess`](./preprocess)                     | A set of Python CLI tools for preprocessing data assets.                                                                  | These tools help to reproject and threshold the ASO raster files, create vector footprints of raster data, tile the imagery for training, and other related tasks.                                                          |\n| [`./model`](./model)                               | The implementation of the machine learning/computer vision techniques used by this project.                               | This work relies heavily on the [robosat.pink](https://github.com/datapink/robosat.pink) repository, which we've [forked](https://github.com/acannistra/robosat.pink) and modified extensively.                              |\n| [`./sagemaker`](./sagemaker)                       | The infrastructure required to use [Amazon Sagemaker](https://aws.amazon.com/sagemaker/) to manage our ML training jobs.  | Sagemaker requires considerable configuration, including a Docker container. We build this container from this directory, which has a copy of the `./model` directory.                                                      |\n| [`./experiments`](./experiments)                   | Configuration files that describe experiments used to assess the performance of this ML-based snow cover method.          | Our ML infrastructure uses \"config files\" to describe the inputs and other parameters to train the model effectively. We use these files to describe experiments that we perform, using different sets of ASO and imagery.  |\n| [`./implementation-notes`](./implementation-notes) | Technical descriptions of the implementation considerations that went into this project.                                  | These are working documents, in raw Markdown format.                                                                                                                                                                        |\n| [`./raster_utils`](./raster_utils)                 | Small utility functions for managing raster computations.                                                                 | Not much to see here.                                                                                                                                                                                                       |\n| [`./environment`](./environment)                   | Raw Python environment configuration files.                                                                               | ⚠️ These emerge from `conda` and change often. Use sparingly. We preserve our environment via Docker, which should be used in this case (see the `./sagemaker` directory)                                                    |\n| [`./analysis`](./analysis)                         | Jupyter notebooks that describe analyses about our snow mask product.                                                     | ⚠️ These are a work in progress and change frequently.                                                                                                                                                                       |\n\n## Requirements\n### Basic Requirements\nThe goal of this work is to provide a toolkit that is relatively easy to deploy for someone with **working knowledge** of the following tools:\n\n* Python 3\n* Jupyter notebooks\n* Basic command-line tools\n\nMore specific requirements can be found in the [Infrastructure Deployment](#infrastructure-deployment) section below.\n\n### Development Requirements\n\nThis free, open-source software depends on a good number of other free, open-source software packages that permit this work. To understand the inner workings of this project, you'll need familiarity with the following:\n\n* [PyTorch](https://pytorch.org)\n* [Tensorflow](https://www.tensorflow.org)\n* [scikit-image](https://scikit-image.org)\n* [boto3](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html) / [s3fs](https://s3fs.readthedocs.io/en/latest/)\n* [Geopandas](https://github.com/geopandas/geopandas) / [shapely](https://github.com/Toblerity/Shapely)\n* [Rasterio](https://rasterio.readthedocs.io/en/stable/) / [rio-tiler](https://github.com/cogeotiff/rio-tiler)\n* [mercantile](https://github.com/mapbox/mercantile) / [supermercado](https://github.com/mapbox/supermercado)\n* [Amazon Sagemaker](https://docs.aws.amazon.com/sagemaker/latest/dg/whatis.html)\n\n\nTo build and manage our infrastructure, we use [Docker](https://www.docker.com) and [Terraform](https://www.terraform.io).\n\n\n### Accounts and Data\n\n\u003ch4\u003e\nAmazon Web Services\n\u003cimg align=\"right\" src=\"https://d1.awsstatic.com/logos/aws-logo-lockups/poweredbyaws/PB_AWS_logo_RGB.61d334f1a1a427ea597afa54be359ca5a5aaad5f.png\" style=\"float:right; padding: 5px\" height=30\u003e\n\u003c/h4\u003e\n\n\n\nThis project relies on cloud infrastructure from Amazon Web Services, which is a cloud services provider run by Amazon. AWS isn't the only provider in this space, but is the one we chose due to a combination of funding resources and familiarity. To run these tutorials and perform development tasks with this software, you'll need an AWS account. You can get one [here](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/).\n\n\u003ch4\u003ePlanet Labs\n\u003cimg align=\"right\" src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Planet_Labs_logo.svg/200px-Planet_Labs_logo.svg.png\" style=\"float:right;\" height=40\u003e\n\u003c/h4\u003e\n\nIn order to access the imagery data from Planet Labs used to train our computer vision models and assess their performance, we rely on a relationship with collaborator [Dr. David Shean](https://dshean.github.io) in UW Civil and Environmental Engineering, who has access to Planet Labs data through a NASA Terrestrial Hydrology Program award.\n\nIf you're interested in getting access to Planet Labs imagery for research, check out the [Planet Education and Research Program](https://www.planet.com/markets/education-and-research/).\n\n\u003ch4\u003eNASA Earthdata\n\u003cimg align=\"right\" src=\"./docs/nasa-logo.conv.png\" style=\"float:right;\" height=40\u003e\n\u003c/h4\u003e\n\nFinally, to gain access to the NASA/JPL Airborne Snow Observatory lidar-derived snow depth information, you need an account with NASA Earthdata. [Sign up here](https://urs.earthdata.nasa.gov/users/new).\n\n## Infrastructure Deployment\n\nTo explore this work, and the tutorials herein, you'll need to deploy some cloud infrastructure to do so. This project uses [Docker](https://www.docker.com)and [Terraform](https://www.terraform.io) to manage and deploy consistent, reliable cloud infrastructure.\n\nFor detailed instructions on this process, view the [documentation](./deployment/).\n\nTo jump right to the guts of the deployment, here's our [Dockerfile](./sagemaker/Dockerfile) and Terraform [Resource Definition](./deployment/resources.tf).\n\n## Tutorials\n\nThrough support from Earth Science Information Partners, we're happy to be able to provide thorough interactive tutorials for these tools and methods in the form of Jupyter notebooks. You can see these tutorials in the data pipeline folder [`./pipeline`](pipeline).\n\n## Acknowledgements and Funding Sources\n\nThis work wouldn't be possible without the advice and support of Dr. Nicoleta Cristea, Dr. David Shean, Shashank Buhshan, and others.\n\nWe gratefully acknowledge financial support from the [Earth Science Innovation Partners Lab](https://www.esipfed.org), the [NASA Terrestrial Hydrology Program](https://neptune.gsfc.nasa.gov/index.php?section=19), the Planet Labs [Education and Research](https://www.planet.com/markets/education-and-research/) Program, and the [National Science Foundation](http://nsf.gov/).\n\n\u003c!-- \u003cimg src=\"https://www.esipfed.org/wp-content/uploads/2016/12/ESIP-final-logo.png\" height=65\u003e\n\u003cimg src=\"http://www.bu.edu/cs/files/2016/09/NSF-Logo-1efvspb.png\" height=70\u003e\n\u003cimg src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/e/e5/NASA_logo.svg/500px-NASA_logo.svg.png\" height=70\u003e\n\u003cimg src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Planet_Labs_logo.svg/200px-Planet_Labs_logo.svg.png\" height=70\u003e --\u003e\n\u003cimg src=\"/docs/funding-agency-logos.png\" height=\"70px\"\u003e\n\n## Original Proposal\nTo see the original resarch proposal for this project, now of date, view it [here](./_historical/original-proposal.md).\n\n-------------\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://s3-us-west-2.amazonaws.com/uw-s3-cdn/wp-content/uploads/sites/98/2014/09/07214435/Signature_Stacked_Purple_Hex.png\" height='60px'\u003e\n\u003c/p\u003e\n","funding_links":[],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":[],"project_url":"https://ost.ecosyste.ms/api/v1/projects/658","html_url":"https://ost.ecosyste.ms/projects/658"}