{"id":45076537,"url":"https://github.com/georgeslabreche/opssat-smartcam","last_synced_at":"2026-02-19T13:36:33.319Z","repository":{"id":42480682,"uuid":"308752528","full_name":"georgeslabreche/opssat-smartcam","owner":"georgeslabreche","description":"On November 8, 2020, this project achieved the first use of deep convolutional neural networks (CNN) on-board a spacecraft.","archived":false,"fork":false,"pushed_at":"2024-01-20T21:09:06.000Z","size":57015,"stargazers_count":15,"open_issues_count":7,"forks_count":1,"subscribers_count":5,"default_branch":"main","last_synced_at":"2024-01-27T14:06:14.208Z","etag":null,"topics":["ai","artificial-intelligence","esa","image-classification","image-clustering","k-means","k-means-clustering","kmeans","kmeans-clustering","machine-learning","neural-network","neural-networks","space","spacecraft","tensorflow-lite","tensorflow2"],"latest_commit_sha":null,"homepage":"https://www.esa.int/opssat","language":"Python","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/georgeslabreche.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2020-10-30T21:58:38.000Z","updated_at":"2024-01-14T04:12:41.000Z","dependencies_parsed_at":"2024-01-15T15:00:05.265Z","dependency_job_id":null,"html_url":"https://github.com/georgeslabreche/opssat-smartcam","commit_stats":{"total_commits":173,"total_committers":5,"mean_commits":34.6,"dds":"0.38150289017341044","last_synced_commit":"bda736921c28a1fe0cbf42a81fc85a333ee4072a"},"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/georgeslabreche/opssat-smartcam","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georgeslabreche%2Fopssat-smartcam","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georgeslabreche%2Fopssat-smartcam/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georgeslabreche%2Fopssat-smartcam/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georgeslabreche%2Fopssat-smartcam/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/georgeslabreche","download_url":"https://codeload.github.com/georgeslabreche/opssat-smartcam/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georgeslabreche%2Fopssat-smartcam/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29615062,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-19T13:04:20.082Z","status":"ssl_error","status_checked_at":"2026-02-19T13:03:33.775Z","response_time":117,"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"}},"keywords":["ai","artificial-intelligence","esa","image-classification","image-clustering","k-means","k-means-clustering","kmeans","kmeans-clustering","machine-learning","neural-network","neural-networks","space","spacecraft","tensorflow-lite","tensorflow2"],"created_at":"2026-02-19T13:36:33.249Z","updated_at":"2026-02-19T13:36:33.312Z","avatar_url":"https://github.com/georgeslabreche.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"![OPS-SAT SmartCam Logo](https://raw.githubusercontent.com/georgeslabreche/opssat-smartcam/main/docs/ops-sat_smartcam_logo_transparentbg.png?raw=true)\n\n# First in Space!\n**On November 8, 2020**, this project achieved the first use of deep convolutional neural networks (CNN) on-board a spacecraft. Many other firsts followed, here are some highlights:\n- [First in-orbit neural network deployment for on-board AI](https://ieeexplore.ieee.org/document/9843402).\n- [First on-board machine learning for in-orbit training of unsupervised models](https://ieeexplore.ieee.org/document/9843402).\n- [First re-training of an on-board AI model with live in-flight data](https://digitalcommons.usu.edu/smallsat/2022/all2022/65/).\n\n# Background\nThe SmartCam software on-board the [OPS-SAT-1](https://www.esa.int/Enabling_Support/Operations/OPS-SAT_your_flying_laboratory) spacecraft is the first use of Artificial Intelligence (AI) by the European Space Agency (ESA) for autonomous planning and scheduling on-board a flying mission. The software's geospatial capability autonomously triggers image acquisitions when the spacecraft is above areas of interest.\n\nInferences from on-board Machine Learning (ML) models classify the captured pictures for downlink prioritization. This capability is enabled by the spacecraft's powerful processors, which can run open-source software originally developed for terrestrial systems. Notably, with the [GEOS Geometry Engine](https://libgeos.org/) for geospatial computations and the [TensorFlow Lite](https://www.tensorflow.org/lite) framework for ML model inferences. Additional image classification can be enabled with unsupervised learning using [k-means clustering](https://github.com/georgeslabreche/kmeans-image-clustering/tree/opssat). These features provide new perspectives on how space operations can be designed for future missions given greater in-orbit compute capabilities.\n\nThe SmartCam's image classification pipeline is designed to be 'open', allowing it to be constructed from crowdsourced, trained ML models. These third-party models can be uplinked to the spacecraft and chained into a sequence with configurable branching rules for hyper-specialized classification and subclassification through an autonomous decision-making tree. This mechanism enables open innovation methods to extend on-board ML beyond its original mission requirement while stimulating knowledge transfer from established AI communities into space applications. The use of an industry standard ML framework de-risks and accelerate developing AI for future missions by broadening OPS-SAT's accessibility to AI experimenters established outside of the space sector.\n\nThird-party executable binaries and scripts can also be injected into the pipeline and needn't be limited to ML and classification operations.\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"./docs/esa_ops-sat-1_spacecraft.png\" width=\"400\" alt=\"ESA OPS-SAT-1 Spacecraft\"\u003e\n  \u003cbr/\u003e\n  \u003cstrong\u003eFigure 1: The OPS-SAT spacecraft in the clean room with deployed solar arrays (TU Graz).\u003c/strong\u003e\n\u003c/div\u003e\n\n# Background\nThe SmartCam software on-board the [OPS-SAT-1](https://www.esa.int/Enabling_Support/Operations/OPS-SAT_your_flying_laboratory) spacecraft is the first use of Artificial Intelligence (AI) by the European Space Agency (ESA) for autonomous planning and scheduling on-board a flying mission. The software's geospatial capability autonomously triggers image acquisitions when the spacecraft is above areas of interest.\n\nInferences from on-board Machine Learning (ML) models classify the captured pictures for downlink prioritization. This capability is enabled by the spacecraft's powerful processors, which can run open-source software originally developed for terrestrial systems. Notably, with the [GEOS Geometry Engine](https://libgeos.org/) for geospatial computations and the [TensorFlow Lite](https://www.tensorflow.org/lite) framework for ML model inferences. Additional image classification can be enabled with unsupervised learning using [k-means clustering](https://github.com/georgeslabreche/kmeans-image-clustering/tree/opssat). These features provide new perspectives on how space operations can be designed for future missions given greater in-orbit compute capabilities.\n\nThe SmartCam's image classification pipeline is designed to be 'open', allowing it to be constructed from crowdsourced, trained ML models. These third-party models can be uplinked to the spacecraft and chained into a sequence with configurable branching rules for hyper-specialized classification and subclassification through an autonomous decision-making tree. This mechanism enables open innovation methods to extend on-board ML beyond its original mission requirement while stimulating knowledge transfer from established AI communities into space applications. The use of an industry standard ML framework de-risks and accelerate developing AI for future missions by broadening OPS-SAT's accessibility to AI experimenters established outside of the space sector.\n\nThird-party executable binaries and scripts can also be injected into the pipeline and needn't be limited to ML and classification operations.\n\n# Citation\nWe appreciate citations if you reference this work in our upcoming scientific publication. Thank you!\n\n## APA\nLabrèche, G., Evans, D., Marszk, D., Mladenov, T., Shiradhonkar, V., Soto, T., \u0026 Zelenevskiy, V. (2022). OPS-SAT Spacecraft Autonomy with TensorFlow Lite, Unsupervised Learning, and Online Machine Learning. _2022 IEEE Aerospace Conference._ [https://doi.org/10.1109/AERO53065.2022.9843402](https://doi.org/10.1109/AERO53065.2022.9843402).\n\n## BibTex\n```bibtex\n@inproceedings{labreche2022_ieee_aeroconf,\n  title         =   {{OPS-SAT Spacecraft Autonomy with TensorFlow Lite, Unsupervised Learning, and Online Machine Learning}},\n  author        =   {Labrèche, Georges and Evans, David and Marszk, Dominik and Mladenov, Tom and Shiradhonkar, Vasundhara and Soto, Tanguy and Zelenevskiy, Vladimir},\n  booktitle     =   {{2022 IEEE Aerospace Conference}},\n  year          =   {2022},\n  doi           =   {10.1109/AERO53065.2022.9843402}\n}\n```\n\n# Instructions\n**Table of Contents:**\n1. [Neural Networks](https://github.com/georgeslabreche/opssat-smartcam#1-neural-networks)\n2. [Contribute](https://github.com/georgeslabreche/opssat-smartcam#2-contribute)\n3. [How It Works](https://github.com/georgeslabreche/opssat-smartcam#3-how-it-works)\n4. [Configuration](https://github.com/georgeslabreche/opssat-smartcam#4-configuration)\n5. [Image Metadata](https://github.com/georgeslabreche/opssat-smartcam#5-image-metadata)\n\n## 1. Neural Networks\nThe app can use any .tflite neural network image classification model file trained with TensorFlow. \n## 1.1. Inference\nThe default model's labels are \"earth\", \"edge\", and \"bad\". The SmartCam's image classification program [uses the TensorFlow Lite C API for model inference](https://github.com/georgeslabreche/tensorflow-opssat-smartcam). Tensorflow Lite inference is thus available to any experimenter without being restricted to image classification.\n\n## 1.2. Training New Models\nScripts and instructions to train new models are available [here](https://github.com/georgeslabreche/opssat-smartcam/tree/main/train).\n\n## 2. Contribute\nWays to contribute:\n- Train a model that can be plugged into the SmartCam's image classification pipeline.\n- Develop your own experiment that is unrelated to SmartCam and image classification but makes use of the SmartCam's underlying Tensorflow Lite inference program.\n- OPS-SAT is your flying laboratory: come up with your own experiment that is unrelated to the SmartCam app or the AI framework that powers it.\n\nJoin the [OPS-SAT community platform](https://opssat1.esoc.esa.int/) and apply to become an experimenter, it's quick and easy! \n\n## 3. How It Works\nThe app is designed to run on the Satellite Experimental Processing Platform (SEPP) payload onboard the OPS-SAT spacecraft. The SEPP is a powerful ALTERA Cyclone V with a 800 MHz CPU clock and 1GB DDR3 RAM. \n\n### 3.1. Overview\nThe SmartCam's app configuration is set in the config.ini file. The gist of the application's logic is as follow:\n\n1. Acquires ims_rgb (raw) and png image files using the spacecraft's HD camera.\n2. Creates a thumbnail jpeg image.\n3. Creates an input jpeg image for the image classifier.\n4. Labels the image using the entry point model file specified by *entry_point_model* in config.ini.\n5. If the applied label is part of the model's *labels_keep* in config.ini then label the image further with the next model in image classification pipeline.\n6. Repeat step 5 until either the applied label is not part of the current model's configured *labels_keep* or until the last model of the pipeline has been applied.\n7. The labeled image is moved into the experiment and the filestore's toGround folders depending on the keep images and downlink configurations set in config.ini.\n8. Subclassify the labeled images into cluster folders via k-means clustering (or train the clustering model if not enough training images have been collected yet).\n9. Repeat steps 1 through 8 until the image acquisition loop as gone through the number of iterations set by *gen_number* in config.ini.\n\nFor certain operations the app invokes external executable binaries that are packaged with the app. The are included in [this bin folder](https://github.com/georgeslabreche/opssat-smartcam/tree/issue_13_mock_image_acquisition/home/exp1000/bin). Their source codes are hosted in separate repositories:\n- [Image resizing](https://github.com/georgeslabreche/image-resizer).\n- [TensorFlow inference](https://github.com/georgeslabreche/tensorflow-opssat-smartcam).\n- [K-means image clustering](https://github.com/georgeslabreche/kmeans-image-clustering).\n- [K-means image segmentation (feature extraction)](https://github.com/georgeslabreche/kmeans-image-segmentation).\n\n### 3.2. Installation\nThe app can run on a local development environment (64-bit) as well as onboard the spacecraft's SEPP processor (ARM 32-bit). For the former, the app reads its configuration parameters from the *config.dev.ini* file whereas for the latter it reads them from the *config.ini* file. \n\n#### 3.2.1. Local Development Environment\nThese instruction are written for Ubuntu and were tested on Ubuntu 18.04 LTS. Install development tools:\n```bash\nsudo apt install python3-dev\nsudo apt install virtualenv\n```\n\nCreate the symbolic links for the TensorFlow Lite shared objects. Execute the following bash script from the project's home directory:\n```bash\n./scripts/create_local_dev_symlinks.sh\n```\n\nInstall a Python virtual environment and the Python package dependencies. From the project's home directory:\n```bash\ncd home/exp1000/\nvirtualenv -p python3 venv\nsource venv/bin/activate\npip install -r requirements.txt\n```\n\nEdit the *smartcam.py* file to enable debug mode and indicate that the app must execute binaries compiled for the 64-bit local dev environment. These binaries were built with the k8 architecture. Enabling debug mode simply generates mock data (e.g. acquired pictures) in the absence of spacecraft hardware (e.g. the onboard camera).\n```python\nDEBUG = True\nDEBUG_ARCH = 'k8'\n```\n\nBefore running the app make sure that the virutal environment is still active. If it isn't then re-execute `source venv/bin/activate`. Run the app:\n```bash\npython3 smartcam.py\n```\n\n#### 3.2.2. Onboard the Spacecraft\nThe SmarCam app and its dependencies are packaged for deployment as opkg ipk files, ready to be installed in the SEPP via the `opkg install` command.\n\n##### 3.2.2.1. Dependencies\nThe SEPP runs the Ångström distribution of Linux. The following packages are dependencies that need to be installed in SEPP's Linux operating system prior to installing and running the app. They can be found in the `deps` directory of this repository:\n- **ephem 3.7.6.0:** Python package for high-precision astronomy computations. \n- **Shapely 1.7.0:** Python package for manipulation and analysis of planar geometric objects. \n- **libgeos 3.5.1:** Geometry engine for Geographic Information Systems - C++ Library.\n- **libgeos-c 1.9.1:** Geometry engine for Geographic Information Systems - C Library.\n\nOther dependencies are the *tar* and *split* programs that are invoked by the App.\n\n##### 3.2.2.2. The App\n- The SmartCam app has also been packaged for installation via opkg.\n- The ipk files for tagged releases are available in the Tags section of this repository.\n- Two types if ipk files can be created: for the Engineering Model (EM) or for the spacecraft.\n- The EM and spacecraft ipk packaging only differ in that the former includes mocking related files (i.e. mock picture files).\n\nPackage the app into an ipk for the EM:\n```bash\n./scripts/ipk_create.sh em\n```\n\nPackage the app into an ipk for the spacecraft:\n```bash\n./scripts/ipk_create.sh\n```\n\n\n### 3.3. Building an Image Classification Pipeline\n1. Each model consists of labels.txt file and a .tflite model file or an executable program. These files are located in a model folder under `/home/exp1000/models`, e.g: `/home/exp1000/models/default` and `/home/exp1000/models/kmeans_imgseg`.\n2. If the model is an executable binary then it must implement the following input arguments:\n    - -i  the file path of the input image\n    - -w  the write mode of the output image (optional)\n3. Create a config.ini section for each model. Prefix the section name with `model_`, e.g. `[model_default]` and `[model_kmeans_imgseg]`.\n4. Each model's config section will specify which label to keep via the *labels_keep* property. For instance, if the default model can label an image as either \"earth\", \"edge\", or \"bad\", but we only want to keep images classified with the first two labels, then `labels_keep = [\"earth\", \"edge\"]`.\n5. If another image classification needs to follow up after an image was previously classified with a certain label, then the follow up model name can be appended following a colon. E.g. `[\"earth:kmeans_imgseg\", \"edge\"]`.\n6. The entry point model that will be the first model applied in the image classification pipeline is specified in the config.ini's *entry_point_model* property, e.g. `entry_point_model = default`. \n\nSee the [kmeans-image-segmentation](https://github.com/georgeslabreche/kmeans-image-segmentation) poject as an example of point 2.\n\n## 4. Configuration\nThis section describes the app's configuration parameters in the `config.ini` file.\n### 4.1. General\n- *downlink_log_if_no_images* - indicate whether or not the log file(s) should be downlinked even if no images are labeled for downlink (yes/no).\n- *entry_point_model* - the first image classification model to apply in the model pipeline.\n- *downlink_thumbnails* - indicate whether or not thumbnails should be downlinked (yes/no).\n- *downlink_compressed_raws* - indicate whether or not raws should be compressed and downlinked (yes/no).\n- *downlink_compressed_split* - maximum downlink file size (bytes). File is split if this limit is exceeded. Uses the [split](https://man7.org/linux/man-pages/man1/split.1.html) command.\n- *raw_compression_type* - which compression algorithm to apply on raw image files.\n- *collect_metadata* - collect metadata into a CSV file (yes/no).\n- *tle_path* - path to the TLE file.\n- *quota_toGround* - experiment's toGround folder size limit (KB). Image acquisition is skipped if this limit is exceeded.\n- *max_error_count* - maximum number of errors thrown before exiting the image acquisition loop.\n\n### 4.2. Image Acquisition\nThere are two types of image acquisition that can beet set: Polling or Area-of-Interest (AOI):\n- Polling: acquire images in a loop that begins at the experiment start time.\n- AOI: acquire images whenever the spacecraft is above an area of interest, during daytime, as defined by polygon shapes in a GeoJSON file.\n\n#### 4.2.1. Area-of-Interest GeoJSON Files\n- The default AOI GeoJSON files defines multipolygon representations of all continents except Antarctica. \n- Use [geojson.io](https://geojson.io) to define custom AOI polygons for the app to consume.\n- Use [mapshaper](https://mapshaper.org/) to simplify GeoJSON files onbtained from third-party providers in order to keep the file sizes small.\n- Coordinates with high precision floating point numbers do not contribute much and are best avoided in favour of reduced GeoJSON file size.\n\n#### 4.2.2. Camera Settings\n- *cam_exposure* - exposure value (in milliseconds).\n- *cam_gains* - rgb gains (e.g. [13, 7, 8]).\n\n#### 4.2.3. Acquisition Type\n- *gen_type* - can be either `aoi` or `poll` for \"area-of-interest\" or \"polling\", respectively.\n- *gen_interval_default* - wait time between image acquisition loop iterations (in seconds).\n- *gen_interval_throttle* - wait time between image acquisition loop iterations when a label of interest has been applied to the previously acquired image (in seconds).\n- *gen_number* - number of image acquisitions.\n- *gen_geojson* - path of the GeoJSON file with polygons defining areas of interest for image acquisition.\n\n### 4.3. Images\n- *raw_keep* - flag if the raw image file should be kept.\n- *png_keep* - flag if the png image file should be kept.\n- *jpeg_scaling* - percentage resize/downsampling of the png image to produce the jpeg thumbnail.\n- *jpeg_quality* - png to jpeg conversion quality level.\n\n### 4.4. Model\n\nAll model properties in the SmartCam's config file are prefixed by the name of the model. For instance, the config section for the `default` model is `[model_default]` and its properties are `default.tflite_model`, `default.labels`, etc. A model can either be a TensorFlow Lite model with `default.tflite_model` or an executable program with `kmeans_imgseg.bin_model`. The config properties for these models differ slightly from each other. E.g.:\n\n```ini\n[model_default]\ndefault.tflite_model                = /home/exp1000/models/default/model.tflite\ndefault.labels                      = /home/exp1000/models/default/labels.txt\ndefault.labels_keep                 = [\"earth:kmeans_imgseg\",\"edge\",\"bad\"]\ndefault.input_height                = 224\ndefault.input_width                 = 224\ndefault.input_mean                  = 0\ndefault.input_std                   = 255\ndefault.confidence_threshold        = 0.70\n\n[model_kmeans_imgseg]\nkmeans_imgseg.bin_model             = bin/armhf/kmeans/image_segmentation\nkmeans_imgseg.labels                = models/kmeans_imgseg/labels.txt\nkmeans_imgseg.labels_keep           = [\"cloudy_0_25\",\"cloudy_26_50\",\"cloudy_51_75\",\"cloudy_76_100\",\"features\"]\nkmeans_imgseg.input_format          = jpeg\nkmeans_imgseg.write_mode            = 1\nkmeans_imgseg.args                  = -k 2 -p BW\nkmeans_imgseg.confidence_threshold  = 0.70\n```\n\n\n#### 4.4.1. TF Lite\n- *tflite_model* - path of the TensorFlow Lite neural network mode file.\n- *labels* - path of the labels text file.\n- *labels_keep* - only downlink images that are classified with these labels.\n- *input_height* - scaled height of the image input that will be fed into the neural network.\n- *input_width* - scaled width of the image input that will be fed into the neural network. \n- *input_mean* - mean of the image input.\n- *input_std* - standard deviation of the image input.\n- *confidence_threshold* - minimum confidence level required to apply the label predicted by the neural network model.\n\nA note on what *input_mean* and *input_std* are for, taken verbatim from [this blogpost](https://medium.com/@joel_34096/k-means-clustering-for-image-classification-a648f28bdc47):\n\n\u003e Since the dataset contains a range of values from 0 to 255, the dataset has to be normalized. Data Normalization is an important preprocessing step which ensures that each input parameter (pixel, in this case) has a similar data distribution. This fastens the process of covergence while training the model. Also Normalization makes sure no one particular parameter influences the output significantly. Data normalization is done by subtracting the mean from each pixel and then dividing the result by the standard deviation. The distribution of such data would resemble a Gaussian curve centered at zero. For image inputs we need the pixel numbers to be positive. So the image input is divided by 255 so that input values are in range of [0,1].\n\n#### 4.4.2. Executable Binary\n- *bin_model* - path of the executable program that will process the given image.\n- *labels* - path of the labels text file.\n- *labels_keep* - only downlink images that are classified with these labels.\n- *input_format* - the format of the image input (ims_rgb, png, or jpeg).\n- *write_mode* - the write mode of the output image (optional).\n  - 0: do not write a new image.\n  - 1: write a new image as a new file.\n  - 2: write a new image that overwrites the input image file.\n  - 3: same as option 2 but backs up the original input image.\n- *args* - additional arguments specific to the executable binary.\n- *confidence_threshold* - minimum confidence level required to apply the label predicted by the neural network model.\n\n### 4.5. Clustering\n- *cluster* - flag to enable or disable image clustering with k-means.\n- *cluster_for_labels* - labels of images classified by TensorFlow Lite that should be subclassified with k-means clustering.\n- *cluster_k* - number of clusters.\n- *cluster_collect_threshold* - number of images to collect as training data before training the clustering model.\n- *cluster_img_types* - list of image files type to move into the cluster folders during clustering.\n\n\n### 4.6. Raw Image Compression\n#### 4.6.1. FAPEC\nThe FAPEC compression binary provided by [DAPCOM DataServices](dapcom.es) and not included in this repository. The compressor can only be used with a valid license (free of charge if exclusively used for OPS-SAT purposes). Free decompression licenses (with some limitations) can be obtained from the DAPCOM website or upon request to [fapec@dapcom.es](fapec@dapcom.es).\n\n- *chunk* - chunk size.\n- *threads* - number of threads.\n- *dtype* - dtype.\n- *band* - input band.\n- *losses* - losses (0 is lossless).\n- *meaningful_bits* - meaningful bits.\n- *lev* - inter-band decorrelation adaptiveness.\n\n#### 4.6.2. Others\nNo other image compression algorithms are currently supported.\n\n## 5. Image Metadata\nA CSV file is created and downlinked when *collect_metadata* is set to `yes`. Each row contains metadata for an image acquired during the SmartCam app's execution. Metadata for images that were discarded are also included. The following information is collected:\n\n- *filename* - name of the image file.\n- *label* - final label applied by the image classification pipeline.\n- *confidence* - confidence level of the applied label.\n- *keep* - whether the image was kept or not based on the applied label.\n- *gain_r* - red gain value set for the camera's RGB gain setting.\n- *gain_g* - green gain value set for the camera's RGB gain setting.\n- *gain_b* - blue gain value set for the camera's RGB gain setting.\n- *exposure* - camera exposure setting, in milliseconds.\n- *acq_ts* - image acquisition timestamp, in milliseconds.\n- *acq_dt* - image acquisition datetime.\n- *ref_dt* - TLE reference datetime. The on-board TLE file is used to project the latitude and longitude of the spacecraft's groundtrack location, as well as its altitude, based on the image acquisition's timestamp.\n- *tle_age* - age of the reference TLE.\n- *lat* - latitude of the spacecraft's groundtrack location.\n- *lng* - longitude of the spacecraft's groundtrack location.\n- *h* - altitude of the spacecraft's orbit, i.e. height above Earth's surface.\n- *tle_ref_line1* - line 1 of the reference TLE.\n- *tle_ref_line2* - line 2 of the reference TLE.\n\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"./docs/ops-sat_mission_patch.png\" height=\"250\" alt=\"ESA OPS-SAT-1 Mission Patch\"/\u003e\n  \u003cbr/\u003e\n  \u003cimg src=\"./docs/esa_logo.png\" height=\"250\" alt=\"European Space Agency\"/\u003e\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgeorgeslabreche%2Fopssat-smartcam","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgeorgeslabreche%2Fopssat-smartcam","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgeorgeslabreche%2Fopssat-smartcam/lists"}