{"id":20241,"name":"Industrial Smoke Plume Detection","description":"Characterization of Industrial Smoke Plumes from Remote Sensing Data.","url":"https://github.com/HSG-AIML/IndustrialSmokePlumeDetection","last_synced_at":"2026-04-22T21:01:06.540Z","repository":{"id":61541616,"uuid":"310629749","full_name":"HSG-AIML/IndustrialSmokePlumeDetection","owner":"HSG-AIML","description":"Code Repository for: \"Characterization of Industrial Smoke Plumes from Remote Sensing Data\", presented at Tackling Climate Change with Machine Learning workshop at NeurIPS 2020.","archived":false,"fork":false,"pushed_at":"2021-04-20T10:20:24.000Z","size":148541,"stargazers_count":44,"open_issues_count":1,"forks_count":9,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-04-14T17:04:15.641Z","etag":null,"topics":["deep-learning","earth-observation","greenhouse-gas-emissions","machine-learning","pollution-prediction","remote-sensing"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/HSG-AIML.png","metadata":{},"created_at":"2020-11-06T15:09:47.000Z","updated_at":"2026-04-06T15:24:05.000Z","dependencies_parsed_at":"2022-10-19T06:45:30.614Z","dependency_job_id":null,"html_url":"https://github.com/HSG-AIML/IndustrialSmokePlumeDetection","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/HSG-AIML/IndustrialSmokePlumeDetection","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HSG-AIML%2FIndustrialSmokePlumeDetection","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HSG-AIML%2FIndustrialSmokePlumeDetection/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HSG-AIML%2FIndustrialSmokePlumeDetection/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HSG-AIML%2FIndustrialSmokePlumeDetection/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/HSG-AIML","download_url":"https://codeload.github.com/HSG-AIML/IndustrialSmokePlumeDetection/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HSG-AIML%2FIndustrialSmokePlumeDetection/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32154688,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-22T17:06:48.269Z","status":"ssl_error","status_checked_at":"2026-04-22T17:06:19.037Z","response_time":58,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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":"HSG-AIML","name":"Artificial Intelligence \u0026 Machine Learning (AI:ML Lab) @ HSG","uuid":"59830997","kind":"organization","description":"Deep Learning Research by AIML Team @ HSG","email":null,"website":"www.hsg.ai","location":"St.Gallen","twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/59830997?v=4","repositories_count":8,"last_synced_at":"2023-03-05T03:48:37.987Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/HSG-AIML","funding_links":[],"total_stars":null,"followers":null,"following":null,"created_at":"2022-11-15T05:27:44.117Z","updated_at":"2023-03-05T03:48:38.057Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/HSG-AIML","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/HSG-AIML/repositories"},"packages":[],"commits":{"id":1254219,"full_name":"HSG-AIML/IndustrialSmokePlumeDetection","default_branch":"main","total_commits":6,"total_committers":3,"total_bot_commits":0,"total_bot_committers":0,"mean_commits":2.0,"dds":0.5,"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-19T21:01:25.732Z","last_synced_commit":"3713196f209f8f73eeeb779407668a9257865185","created_at":"2023-03-27T10:59:52.701Z","updated_at":"2026-04-19T21:01:18.014Z","committers":[{"name":"Michael Mommert","email":"michael.mommert@unisg.ch","login":null,"count":3},{"name":"Michael Mommert","email":"mommermi","login":"mommermi","count":2},{"name":"Damian Borth","email":"damian.borth@gmail.com","login":"damianborth","count":1}],"past_year_committers":[],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/HSG-AIML%2FIndustrialSmokePlumeDetection/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-20T00:00:09.037Z","repositories_count":6214901,"commits_count":899557033,"contributors_count":34906480,"owners_count":1143606,"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":"HSG-AIML/IndustrialSmokePlumeDetection","html_url":"https://github.com/HSG-AIML/IndustrialSmokePlumeDetection","last_synced_at":"2026-01-08T18:04:40.223Z","status":"error","issues_count":1,"pull_requests_count":0,"avg_time_to_close_issue":null,"avg_time_to_close_pull_request":null,"issues_closed_count":0,"pull_requests_closed_count":0,"pull_request_authors_count":0,"issue_authors_count":1,"avg_comments_per_issue":1.0,"avg_comments_per_pull_request":null,"merged_pull_requests_count":0,"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:39:22.590Z","updated_at":"2026-01-08T18:04:40.223Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/HSG-AIML%2FIndustrialSmokePlumeDetection","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/HSG-AIML%2FIndustrialSmokePlumeDetection/issues","issue_labels_count":{},"pull_request_labels_count":{},"issue_author_associations_count":{"NONE":1},"pull_request_author_associations_count":{},"issue_authors":{"Myhuang1996":1},"pull_request_authors":{},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-20T00:00:09.428Z","repositories_count":14341303,"issues_count":34458984,"pull_requests_count":112762685,"authors_count":11240680,"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":[],"active_maintainers":[]},"events":{"total":{"WatchEvent":3},"last_year":{"WatchEvent":2}},"keywords":["deep-learning","earth-observation","greenhouse-gas-emissions","machine-learning","pollution-prediction","remote-sensing"],"dependencies":[{"ecosystem":"pypi","filepath":"requirements.txt","sha":null,"kind":"manifest","created_at":"2022-10-19T06:45:30.220Z","updated_at":"2022-10-19T06:45:30.220Z","repository_link":"https://github.com/HSG-AIML/IndustrialSmokePlumeDetection/blob/main/requirements.txt","dependencies":[{"id":6412060899,"package_name":"geopandas","ecosystem":"pypi","requirements":"==0.8.1","direct":true,"kind":"runtime","optional":false},{"id":6412060904,"package_name":"matplotlib","ecosystem":"pypi","requirements":"==3.1.3","direct":true,"kind":"runtime","optional":false},{"id":6412060906,"package_name":"numpy","ecosystem":"pypi","requirements":"==1.17.4","direct":true,"kind":"runtime","optional":false},{"id":6412060908,"package_name":"rasterio","ecosystem":"pypi","requirements":"==1.2.dev0","direct":true,"kind":"runtime","optional":false},{"id":6412060910,"package_name":"scikit-learn","ecosystem":"pypi","requirements":"==0.22.1","direct":true,"kind":"runtime","optional":false},{"id":6412060912,"package_name":"tensorboard","ecosystem":"pypi","requirements":"==2.3.0","direct":true,"kind":"runtime","optional":false},{"id":6412060913,"package_name":"torch","ecosystem":"pypi","requirements":"==1.5.0","direct":true,"kind":"runtime","optional":false},{"id":6412060914,"package_name":"torchvision","ecosystem":"pypi","requirements":"==0.6.0","direct":true,"kind":"runtime","optional":false},{"id":6412060916,"package_name":"tqdm","ecosystem":"pypi","requirements":"==4.40.2","direct":true,"kind":"runtime","optional":false}]}],"score":4.90527477843843,"created_at":"2023-09-11T14:52:11.083Z","updated_at":"2026-04-22T21:01:06.542Z","avatar_url":"https://github.com/HSG-AIML.png","language":"Python","category":"Emissions","sub_category":"Emission Observation and Modeling","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"# Industrial Smoke Plume Detection\n\nThis repository contains the code base for our publication *Characterization of Industrial Smoke Plumes from\nRemote Sensing Data*, presented at the *Tackling Climate Change with Machine\n Learning* workshop at NeurIPS 2020.\n\n\n![segmentation example images](segmentation.png \"Segmentation Example Images\")\n\n \n## About this Project\n\nThe major driver of global warming has been identified as the anthropogenic release\nof greenhouse gas (GHG) emissions from industrial activities. The quantitative\nmonitoring of these emissions is mandatory to fully understand their effect on the\nEarth’s climate and to enforce emission regulations on a large scale. In this work,\nwe investigate the possibility to detect and quantify industrial smoke plumes from\nglobally and freely available multiband image data from ESA’s Sentinel-2 satellites.\nUsing a modified ResNet-50, we can detect smoke plumes of different sizes with\nan accuracy of 94.3%. The model correctly ignores natural clouds and focuses on\nthose imaging channels that are related to the spectral absorption from aerosols and\nwater vapor, enabling the localization of smoke. We exploit this localization ability\nand train a U-Net segmentation model on a labeled subsample of our data, resulting\nin an Intersection-over-Union (IoU) metric of 0.608 and an overall accuracy for\nthe detection of any smoke plume of 94.0%; on average, our model can reproduce\nthe area covered by smoke in an image to within 5.6%. The performance of our\nmodel is mostly limited by occasional confusion with surface objects, the inability\nto identify semi-transparent smoke, and human limitations to properly identify\nsmoke based on RGB-only images. Nevertheless, our results enable us to reliably\ndetect and qualitatively estimate the level of smoke activity in order to monitor\nactivity in industrial plants across the globe. Our data set and code base are publicly\navailable.\n\nThe full publication is available on arxiv.\n\nThe data set is available on [zenodo](http://doi.org/10.5281/zenodo.4250706).\n\n## Content\n\n`classification/`: Resnet-50 classifier code, training and evaluation\n routines\n`segmentation/`: U-Net segmentation model code, training and evaluation\n routines\n\n \n## How to Use\n\nDownload this repository as well as the \n[data](http://doi.org/10.5281/zenodo.4250706) and decompress the latter. For\nboth model training and evaluation, you will have to modify the directory\npaths appropriately so that they point to the image and segmentation label\ndata.\n   \nIt is expected that the data are split into separate data sets for training, \nvalidation, and evaluation. For our publication, this has been done in such a\nway that all observations of a single location are contained in a \nsingle data set. Other strategies are possible and will be left to the user. \n\nEither model can be trained by invoking:\n\n    python train.py\n    \nwith the following optional parameters:\n    \n* `-bs \u003cint\u003e` to define a batch size,\n* `-ep \u003cint\u003e` to define the number of training epochs,\n* `-lr \u003cfloat\u003e` to define a starting learning rate, and\n* `-mo \u003cfloat\u003e` to define a momentum value.\n\nThe models can be evaluated on the test data set by calling the corresponding\n `eval.py` script.\n \n \n## Acknowledgements\n\nIf you use this code for your own project, please cite the following\nconference contribution:\n\n    Mommert, M., Sigel, M., Neuhausler, M., Scheibenreif, L., Borth, D.,\n    \"Characterization of Industrial Smoke Plumes from Remote Sensing Data\",\n    Tackling Climate Change with Machine Learning Workshop,\n    NeurIPS 2020.\n","funding_links":[],"readme_doi_urls":["http://doi.org/10.5281/zenodo.4250706"],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":["self-supervised-learning","semantic-segmentation"],"project_url":"https://ost.ecosyste.ms/api/v1/projects/20241","html_url":"https://ost.ecosyste.ms/projects/20241"}