	{"id":60637,"date":"2021-05-05T16:50:44","date_gmt":"2021-05-05T15:50:44","guid":{"rendered":"https:\/\/www.artefact.com\/?post_type=news&#038;p=60637"},"modified":"2024-09-20T17:45:42","modified_gmt":"2024-09-20T16:45:42","slug":"leveraging-satellite-imagery-for-machine-learning-computer-vision-applications","status":"publish","type":"blog","link":"https:\/\/www.artefact.com\/br\/blog\/leveraging-satellite-imagery-for-machine-learning-computer-vision-applications\/","title":{"rendered":"Aproveitamento de imagens de sat\u00e9lite para aplicativos de vis\u00e3o computacional com aprendizado de m\u00e1quina"},"content":{"rendered":"<p><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-1 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-margin-top:40px;--awb-margin-bottom:40px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-center fusion-flex-justify-content-center fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_1_1 1_1 fusion-flex-column fusion-flex-align-self-center fusion-column-inner-bg-wrapper\" style=\"--awb-padding-top:20px;--awb-padding-right:20px;--awb-padding-bottom:20px;--awb-padding-left:20px;--awb-overflow:hidden;--awb-inner-bg-size:cover;--awb-border-color:rgba(10,17,40,0.1);--awb-border-top:1px;--awb-border-right:1px;--awb-border-bottom:1px;--awb-border-left:1px;--awb-border-style:solid;--awb-border-radius:4px 4px 4px 4px;--awb-inner-bg-border-radius:4px 4px 4px 4px;--awb-inner-bg-overflow:hidden;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><span class=\"fusion-column-inner-bg hover-type-none\"><a class=\"fusion-column-anchor\" href=\"https:\/\/medium.com\/artefact-engineering-and-data-science\/leveraging-satellite-imagery-for-machine-learning-computer-vision-applications-d22143f72d94\" rel=\"noopener noreferrer\" target=\"_blank\"><span class=\"fusion-column-inner-bg-image\"><\/span><\/a><\/span><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-center fusion-content-layout-row fusion-flex-align-items-center\"><div class=\"fusion-text fusion-text-1\"><p><u>Read our article on<\/u><\/p>\n<\/div><div class=\"fusion-image-element\" style=\"--awb-margin-right:20px;--awb-margin-left:20px;--awb-max-width:150px;--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><span class=\" fusion-imageframe imageframe-none imageframe-1 hover-type-none\"><img decoding=\"async\" width=\"4000\" height=\"992\" title=\"Medium Blog\" src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog.png\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog.png\" alt class=\"lazyload img-responsive wp-image-60582\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%274000%27%20height%3D%27992%27%20viewBox%3D%270%200%204000%20992%27%3E%3Crect%20width%3D%274000%27%20height%3D%27992%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-200x50.png 200w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-400x99.png 400w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-600x149.png 600w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-800x198.png 800w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-1200x298.png 1200w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog.png 4000w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 640px) 100vw, 4000px\" \/><\/span><\/div><div class=\"fusion-text fusion-text-2\"><p>.<\/p>\n<\/div><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-2 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling article-author\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-background-color:#ffffff;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-1 fusion_builder_column_1_2 1_2 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:50%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:50%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-title title fusion-title-1 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-margin-bottom-small:8px;\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:50;line-height:1.2;\">Author<\/h2><\/div><img decoding=\"async\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27150%27%20height%3D%270%27%20viewBox%3D%270%200%20150%200%27%3E%3Crect%20width%3D%27150%27%20height%3D%270%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Antoine-Aubay-300x300.jpeg\" alt=\"Image\" class=\"lazyload artefact-elegant-image align-left article-author-image\" style=\"width: 150px; border-radius: 54% 46% 77% 23% \/ 74% 40% 60% 26%; overflow: hidden;\" width=\"150\" height=\"auto\" \/><div class=\"fusion-title title fusion-title-2 fusion-sep-none fusion-title-text fusion-title-size-three article-author-name-title\" style=\"--awb-margin-bottom-small:8px;\"><h3 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:20;line-height:1.2;\">Antoine Aubay<\/h3><\/div><div class=\"fusion-text fusion-text-3 article-author-description\"><p>Senior Data Scientist<\/p>\n<\/div><\/div><\/div><\/div><\/div><article class=\"fusion-fullwidth fullwidth-box fusion-builder-row-3 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-justify-content-center fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-2 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-title title fusion-title-3 fusion-sep-none fusion-title-text fusion-title-size-three\" style=\"--awb-margin-bottom-small:8px;\"><h3 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:20;line-height:1.2;\">A step by step guide on how to collect and preprocess satellite imagery data for machine learning algorithms<\/h3><\/div><div class=\"fusion-title title fusion-title-4 fusion-sep-none fusion-title-text fusion-title-size-four\" style=\"--awb-margin-bottom-small:8px;\"><h4 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:20;line-height:1.2;\"><em>This article is the first part of a 2 part series which explores the uses of machine learning algorithms on satellite imagery. Here we will focus on the data collection and preprocessing steps while the second part will showcase the use of various machine learning algorithms.<\/em><\/h4><\/div><\/div><\/div><\/div><\/article><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-4 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-3 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-text fusion-text-4 description\"><p><strong>TL;DR<\/strong><br \/>\nThis article will:<\/p>\n<li>Give you a better understanding of satellite imagery\n<li>Show you what type of imagery can be collected open source\n<li>Guide you through the necessary steps to have \u201cmachine learning ready\u201d images\n<p>We will use the detection and classification of agriculture fields as an example. Python and jupyter notebook are used for the preprocessing steps. <a href=\"https:\/\/github.com\/artefactory\/medium_satellite_imagery\" rel=\"noopener\" target=\"_blank\">The jupyter notebook for reproducing the steps is available in github<\/a>.<br \/>\nThis article assumes basic fundamentals in data science and python.<\/p>\n<\/div><\/div><\/div><\/div><\/div><article class=\"fusion-fullwidth fullwidth-box fusion-builder-row-5 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-justify-content-center fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-4 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-title title fusion-title-5 fusion-sep-none fusion-title-text fusion-title-size-four\" style=\"--awb-margin-bottom-small:8px;\"><h4 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:20;line-height:1.2;\">Computer vision is a fascinating branch of machine learning that has been quickly developing in past years. With public access to many off the shelf algorithm libraries (<a href=\"https:\/\/www.tensorflow.org\/\" target=\"_blank\" rel=\"noopener\">Tensorflow<\/a>, <a href=\"https:\/\/opencv.org\/\" target=\"_blank\" rel=\"noopener\">OpenCv<\/a>, <a href=\"https:\/\/pytorch.org\/\" target=\"_blank\" rel=\"noopener\">Pytorch<\/a>, <a href=\"https:\/\/www.fast.ai\/\" target=\"_blank\" rel=\"noopener\">Fastai<\/a> \u2026) as well as open source datasets (<a href=\"https:\/\/www.cs.toronto.edu\/~kriz\/cifar.html\" target=\"_blank\" rel=\"noopener\">CIFAR -10<\/a>, <a href=\"https:\/\/www.image-net.org\/\" target=\"_blank\" rel=\"noopener\">Imagenet<\/a>, <a href=\"https:\/\/www.imdb.com\/interfaces\/\" target=\"_blank\" rel=\"noopener\">IMDB<\/a> \u2026) it\u2019s very easy for a data scientist to get hands on experience on this topic.<\/h4><\/div><div class=\"fusion-title title fusion-title-6 fusion-sep-none fusion-title-text fusion-title-size-four\" style=\"--awb-margin-bottom-small:8px;\"><h4 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:20;line-height:1.2;\">But did you know that you could also access open source satellite imagery ? Those types of imagery can be used in a wealth of use cases (Agriculture, Logistics, Energy \u2026). However, they provide additional challenges for a data scientist due to their size and complexity. I have written this article to share some of my key learnings working with them.<\/h4><\/div><div class=\"fusion-title title fusion-title-7 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-margin-bottom-small:8px;\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:50;line-height:1.2;\">Step 1 \u2014 Select the satellite open data source<\/h2><\/div><div class=\"fusion-text fusion-text-5\"><p>First, you need to choose which satellite you want to use. Key features to watch out for here are :<\/p>\n<\/div><ul style=\"--awb-line-height:27.2px;--awb-icon-width:27.2px;--awb-icon-height:27.2px;--awb-icon-margin:11.2px;--awb-content-margin:38.4px;\" class=\"fusion-checklist fusion-checklist-1 fusion-checklist-default type-icons\"><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">\n<p><strong>Spatial Resolution<\/strong>: how many meters are covered per pixel, higher resolution will unlock some use cases and give better performance for most algorithms.<\/p>\n<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">\n<p><strong>Instruments available<\/strong>: the instruments will capture different spectral bands, both from the visible and invisible spectrum. Bands usefulness will vary depending on the use case.<\/p>\n<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">\n<p><strong>Temporal resolution<\/strong> : time between two visits on a given spot on earth. Note that many satellite systems actually include several satellites and in that case the global temporal resolution is usually equal to that of one of its satellites divided by the number of satellites.<\/p>\n<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">\n<p><strong>Radiometric resolution<\/strong> : the number of possible values the instrument captures. The higher, the more precise the measurements are.<\/p>\n<\/div><\/li><\/ul><div class=\"fusion-text fusion-text-6\"><p>Here are satellites whose data are available free of charge :<\/p>\n<\/div><div class=\"fusion-text fusion-text-7\"><p><img decoding=\"async\" class=\"lazyload aligncenter wp-image-60640 size-full\" src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Benchmark-of-satellite-systems.png\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Benchmark-of-satellite-systems.png\" alt=\"\" width=\"700\" height=\"411\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27700%27%20height%3D%27411%27%20viewBox%3D%270%200%20700%20411%27%3E%3Crect%20width%3D%27700%27%20height%3D%27411%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Benchmark-of-satellite-systems-200x117.png 200w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Benchmark-of-satellite-systems-300x176.png 300w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Benchmark-of-satellite-systems-400x235.png 400w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Benchmark-of-satellite-systems-600x352.png 600w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Benchmark-of-satellite-systems.png 700w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 700px) 100vw, 700px\" \/><\/p>\n<p style=\"text-align: center;\">Benchmark of satellite systems<\/p>\n<\/div><div class=\"fusion-text fusion-text-8\"><p>Since our goal is to detect and identify agricultural crops, the visible spectrum (which is used to provide standard color images) should be quite useful. Additionally there are correlations between nitrogen level of crops and NIR (Near-infrared) spectral bands. As far as free options go, Sentinel 2 is currently the best in terms of resolution with 10 m for those spectral bands, so we are going to use this satellite.<\/p>\n<\/div><div class=\"fusion-text fusion-text-9\"><p>Of course, 10 m resolution is much lower compared to state of the art in satellite imagery with commercial satellites reaching a 30 cm resolution. Access to commercial satellite data can unlock many use cases, but despite increasing competition with new players entering this market, they remain highly priced and hence difficult to integrate in a scaled use case.<\/p>\n<\/div><div class=\"fusion-title title fusion-title-8 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-margin-bottom-small:8px;\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:50;line-height:1.2;\">Step 2 \u2014 Collect the satellite imagery data from Sentinel 2<\/h2><\/div><div class=\"fusion-text fusion-text-10\"><p>Now that we have selected our satellite source, the new step is to download the images. Sentinel 2 is part of the Copernicus Programme from the <a href=\"http:\/\/www.esa.int\/\" target=\"_blank\" rel=\"noopener\">European Space Agency<\/a>. We can access its data using the <a href=\"https:\/\/pypi.org\/project\/sentinelsat\/\" target=\"_blank\" rel=\"noopener\">SentinelSat python API<\/a>.<\/p>\n<\/div><div class=\"fusion-text fusion-text-11\"><p>We first need to create an account at the <a href=\"https:\/\/scihub.copernicus.eu\/dhus\/#\/home\" target=\"_blank\" rel=\"noopener\">Copernicus Open Access Hub<\/a>. Alternatively note that this website also provides a way to query images with a GUI.<\/p>\n<\/div><div class=\"fusion-text fusion-text-12\"><p>A way to specify the zones you want to explore is to provide the API with a geojson file, which is a json containing GPS coordinates position (latitude and longitude) of a zone. Geojson can be quickly created on this <a href=\"https:\/\/geojson.io\/#map=2\/20.0\/0.0\" target=\"_blank\" rel=\"noopener\">website<\/a>.<\/p>\n<\/div><div class=\"fusion-text fusion-text-13\"><p>This way you can query all the Satellite images intersecting with the zone provided.<\/p>\n<\/div><div class=\"fusion-text fusion-text-14\"><p>Here we list all images available on a for a given zone and time range :<\/p>\n<\/div><div class=\"fusion-text fusion-text-15\"><div class=\"code\">\n<p>api = SentinelAPI(<br \/>\ncredentials[&#8220;username&#8221;],<br \/>\ncredentials[&#8220;password&#8221;],<br \/>\n&#8220;https:\/\/scihub.copernicus.eu\/dhus&#8221;<br \/>\n)<\/p>\n<p>shape = geojson_to_wkt(read_geojson(geojson_path))<\/p>\n<p>images = api.query(<br \/>\nshape,<br \/>\ndate=(date(2020, 5, 1), date(2020, 5, 10)),<br \/>\nplatformname=&#8221;Sentinel-2&#8243;,<br \/>\nprocessinglevel = &#8220;Level-2A&#8221;,<br \/>\ncloudcoverpercentage=(0, 30)<br \/>\n)<\/p>\n<p>images_df = api.to_dataframe(images)<\/p>\n<\/div>\n<\/div><div class=\"fusion-text fusion-text-16\"><p>Note the use of arguments:<\/p>\n<\/div><ul style=\"--awb-line-height:27.2px;--awb-icon-width:27.2px;--awb-icon-height:27.2px;--awb-icon-margin:11.2px;--awb-content-margin:38.4px;\" class=\"fusion-checklist fusion-checklist-2 fusion-checklist-default type-icons\"><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">\n<p><strong>date<\/strong>: this range should be set keeping in mind the 6 day temporal resolution. Since we are going to detect crops we set it at a pre-harvest period<\/p>\n<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">\n<p><strong>processinglevel<\/strong> : Level-2A is the most advanced level of preprocessing. For instance atmospheric corrections have already been performed on the images (<a href=\"https:\/\/sentinel.esa.int\/web\/sentinel\/user-guides\/sentinel-2-msi\/processing-levels\" target=\"_blank\" rel=\"noopener\">to go more in depth on processing levels<\/a>)<\/p>\n<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">\n<p><strong>cloudcoverpercentage<\/strong> : Clouds will make some images difficult to exploit. We filter out images with more than 30 % as they are likely unusable<\/p>\n<\/div><\/li><\/ul><div class=\"fusion-text fusion-text-17\"><p><img decoding=\"async\" class=\"lazyload aligncenter wp-image-60646 size-full\" src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/images_df.png\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/images_df.png\" alt=\"\" width=\"700\" height=\"128\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27700%27%20height%3D%27128%27%20viewBox%3D%270%200%20700%20128%27%3E%3Crect%20width%3D%27700%27%20height%3D%27128%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/images_df-200x37.png 200w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/images_df-300x55.png 300w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/images_df-400x73.png 400w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/images_df-600x110.png 600w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/images_df.png 700w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 700px) 100vw, 700px\" \/><\/p>\n<p style=\"text-align: center;\">images_df<\/p>\n<\/div><div class=\"fusion-text fusion-text-18\"><p>Images_df is a pandas dataframe containing all images that match our query. We select one with a low cloud cover and download it using the api :<\/p>\n<\/div><div class=\"fusion-text fusion-text-19\"><div class=\"code\">uuid = &#8220;01d97f6b-8eb5-4edc-9261-10e3f4d437d0&#8221;<br \/>\napi.download(uuid)<\/div>\n<\/div><div class=\"fusion-title title fusion-title-9 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-margin-bottom-small:8px;\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:50;line-height:1.2;\">Step 3 \u2014 Understand which spectral bands to use and manage quantization<\/h2><\/div><div class=\"fusion-text fusion-text-20\"><p>Once the zip file is downloaded we can see that it actually contains several images.<\/p>\n<\/div><div class=\"fusion-text fusion-text-21\"><p>This is because as we said in step 1, Sentinel 2 captures many spectral bands and not only Red Green and Blue and each band is captured in a single image.<\/p>\n<\/div><div class=\"fusion-text fusion-text-22\"><p>Also its instruments do not all have the same spatial resolution, so there is a subfolder for each different resolution 10, 20 and 60 meters.<\/p>\n<\/div><div class=\"fusion-text fusion-text-23\"><p>If we check the <em>GRANULE\/&lt;image_id&gt;\/IMG_DATA<\/em> folder we see that there is a subfolder for each different resolution: 10, 20 and 60 meters as the spectral bands. We are going to use those with max resolution 10m as they provide Band 2, 3, 4 and 8 which are Blue, Green, Red and NIR. Band 7, 8, 9 which are vegetation red edge (spectral bands between red and NIR that mark a transition in reflectance value for vegetation) could also be interesting for detecting crops but since they are lower resolution we are going to leave them aside now<\/p>\n<\/div><div class=\"fusion-text fusion-text-24\"><p>Here we load each band as a 2D numpy matrix:<\/p>\n<\/div><div class=\"fusion-text fusion-text-25\"><div class=\"code\">\n<p>def get_band(image_folder, band, resolution=10):<br \/>\nsubfolder = [f for f in os.listdir(image_folder + \"\/GRANULE\") if f[0] == \"L\"][0]\nimage_folder_path = f\"\/GRANULE\/\/IMG_DATA\/Rm\"<br \/>\nimage_files = [im for im in os.listdir(image_folder_path) if im[-4:] == \".jp2\"]\nselected_file = [im for im in image_files if im.split(\"_\")[2] == band][0]<\/p>\n<p>with rasterio.open(f\"\/\") as infile:<br \/>\nimg = infile.read(1)<\/p>\n<p>return img<\/p>\n<p>band_dict = <\/p>\n<p>for band in [\"B02\", \"B03\", \"B04\", \"B08\"]:<br \/>\nband_dict[band] = get_band(image_folder, band, 10)<\/p>\n<\/div>\n<\/div><div class=\"fusion-text fusion-text-26\"><p>A quick test to make sure everything is working is trying to recreate the true color image (ie RGB) and display it using opencv and matplotlib:<\/p>\n<\/div><div class=\"fusion-text fusion-text-27\"><p>img = cv2.merge((band_dict[&#8220;B04&#8221;], band_dict[&#8220;B03&#8221;], band_dict[&#8220;B02&#8221;]))<br \/>\nplt.imshow(img)<\/p>\n<\/div><div class=\"fusion-text fusion-text-28\"><p><img decoding=\"async\" class=\"lazyload aligncenter wp-image-60643 size-full\" src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Satellite-Image-\u2014-Color-intensity-issue-Copernicus-Sentinel-data-2020-.png\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Satellite-Image-\u2014-Color-intensity-issue-Copernicus-Sentinel-data-2020-.png\" alt=\"\" width=\"333\" height=\"306\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27333%27%20height%3D%27306%27%20viewBox%3D%270%200%20333%20306%27%3E%3Crect%20width%3D%27333%27%20height%3D%27306%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Satellite-Image-\u2014-Color-intensity-issue-Copernicus-Sentinel-data-2020--200x184.png 200w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Satellite-Image-\u2014-Color-intensity-issue-Copernicus-Sentinel-data-2020--300x276.png 300w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Satellite-Image-\u2014-Color-intensity-issue-Copernicus-Sentinel-data-2020-.png 333w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 333px) 100vw, 333px\" \/><\/p>\n<p style=\"text-align: center;\">Satellite Image \u2014 Color intensity issue (Copernicus Sentinel data 2020)<\/p>\n<\/div><div class=\"fusion-text fusion-text-29\"><p>However there is an issue with color intensity. This is because the quantization (number of possible values) differs from the standard for matplotlib which assumes either a 0\u2013255 int value or a 0\u20131 float value. Standard images often use an 8 bit quantization (256 possible values) but Sentinel 2 images use a 12 bit quantization and a reprocessing converts the values to a 16 bit integer (65536 values).<\/p>\n<\/div><div class=\"fusion-text fusion-text-30\"><p>If we want to scale a 16 bit integer to an 8 bit integer we should in theory divide by 256 but this actually results in a very dark image since the whole range of possible values is not used. The max value in our image is actually 16752 out of 65536 and few pixels actually reach values higher than 4000 so dividing by 8 actually gives an image with a decent contrast<\/p>\n<\/div><div class=\"fusion-text fusion-text-31\"><p>img_processed = img \/ 8<br \/>\nimg_processed = img_processed.astype(int)<br \/>\nplt.imshow(img_processed)<\/p>\n<\/div><div class=\"fusion-text fusion-text-32\"><p><img decoding=\"async\" class=\"lazyload aligncenter wp-image-60644 size-full\" src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Satellite-Image-\u2014-Right-color-intensity-Copernicus-Sentinel-data-2020.png\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Satellite-Image-\u2014-Right-color-intensity-Copernicus-Sentinel-data-2020.png\" alt=\"\" width=\"336\" height=\"322\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27336%27%20height%3D%27322%27%20viewBox%3D%270%200%20336%20322%27%3E%3Crect%20width%3D%27336%27%20height%3D%27322%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Satellite-Image-\u2014-Right-color-intensity-Copernicus-Sentinel-data-2020-200x192.png 200w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Satellite-Image-\u2014-Right-color-intensity-Copernicus-Sentinel-data-2020-300x288.png 300w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Satellite-Image-\u2014-Right-color-intensity-Copernicus-Sentinel-data-2020.png 336w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 336px) 100vw, 336px\" \/><\/p>\n<p style=\"text-align: center;\">Satellite Image \u2014 Right color intensity (Copernicus Sentinel data 2020)<\/p>\n<\/div><div class=\"fusion-text fusion-text-33\"><p>We now have a 3 dimension tensor of shape (10980, 10980, 3) of 8 bit integers in the form of a numpy array<\/p>\n<\/div><div class=\"fusion-text fusion-text-34\"><p>Note that :<\/p>\n<\/div><ul style=\"--awb-line-height:27.2px;--awb-icon-width:27.2px;--awb-icon-height:27.2px;--awb-icon-margin:11.2px;--awb-content-margin:38.4px;\" class=\"fusion-checklist fusion-checklist-3 fusion-checklist-default type-icons\"><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">\n<p>We could go further by using a non linear scaling approach to improve contrast.<\/p>\n<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">\n<p>Casting as integer amounts to rounding the value so we are actually losing some information. This is fine for many use cases and improves processing speed but if precision is key it might be better to convert the reflectance value to a 0\u20131 float (a format also managed by most ML libraries) rather than a 0\u2013255 integer.<\/p>\n<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">\n<p>For now we are leaving the NIR spectral band aside. This will help us test faster since many off-the shelf algorithms expect images with 3 color channels. But it could be interesting to reintegrate it at some point either by replacing one of the other channels or by customizing algorithms to expect 4 color channels.<\/p>\n<\/div><\/li><\/ul><div class=\"fusion-title title fusion-title-10 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-margin-bottom-small:8px;\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:50;line-height:1.2;\">Step 4 \u2014 Split the images to machine learning ready sizes<\/h2><\/div><div class=\"fusion-text fusion-text-35\"><p>We could try applying an algorithm to our current image but in practice that would not work with most techniques due to its size. Even with strong computing power, most algorithms (and especially deep learning) would be off the table.<\/p>\n<\/div><div class=\"fusion-text fusion-text-36\"><p>So we must split the image into fragments. One question is how to set the fragment\u2019s size.<\/p>\n<\/div><ul style=\"--awb-line-height:27.2px;--awb-icon-width:27.2px;--awb-icon-height:27.2px;--awb-icon-margin:11.2px;--awb-content-margin:38.4px;\" class=\"fusion-checklist fusion-checklist-4 fusion-checklist-default type-icons\"><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">\n<p>Small fragments will improve performance.<\/p>\n<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">\n<p>Larger fragments reduce the number of objects that will be hard to detect due to being split into several images. However fragments that are too large can be an issue for some ML algorithms that rescale images or are not able to scale well past a certain number of objects in a given image.<\/p>\n<\/div><\/li><\/ul><div class=\"fusion-text fusion-text-37\"><p>We decide to go for splitting each image in a 45 * 45 grid (45 being conveniently a divider of 10980)<\/p>\n<\/div><div class=\"fusion-text fusion-text-38\"><p>Past this parameter fixing, this step is straightforward using numpy array manipulation . We store our values in a dict using (x, y) tuples as keys.<\/p>\n<\/div><div class=\"fusion-text fusion-text-39\"><div class=\"code\">\n<p>frag_count = 45<br \/>\nfrag_size = int(img_processed.shape[0] \/ frag_count)<br \/>\nfrag_dict = <\/p>\n<p>for y, x in itertools.product(range(frag_count), range(frag_count)):<br \/>\nfrag_dict[(x, y)] = img_processed[y*frag_size: (y+1)*frag_size,<br \/>\nx*frag_size: (x+1)*frag_size, :]<\/p>\n<p>plt.imshow(frag_dict[(10, 10)])<\/p>\n<\/div>\n<\/div><div class=\"fusion-text fusion-text-40\"><p><img decoding=\"async\" class=\"lazyload aligncenter wp-image-60641 size-full\" src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Fragment-of-the-satellite-image-Copernicus-Sentinel-data-2020.png\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Fragment-of-the-satellite-image-Copernicus-Sentinel-data-2020.png\" alt=\"\" width=\"332\" height=\"316\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27332%27%20height%3D%27316%27%20viewBox%3D%270%200%20332%20316%27%3E%3Crect%20width%3D%27332%27%20height%3D%27316%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Fragment-of-the-satellite-image-Copernicus-Sentinel-data-2020-200x190.png 200w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Fragment-of-the-satellite-image-Copernicus-Sentinel-data-2020-300x286.png 300w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Fragment-of-the-satellite-image-Copernicus-Sentinel-data-2020.png 332w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 332px) 100vw, 332px\" \/><\/p>\n<p style=\"text-align: center;\">Fragment of the satellite image (Copernicus Sentinel data 2020)<\/p>\n<\/div><div class=\"fusion-title title fusion-title-11 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-margin-bottom-small:8px;\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:50;line-height:1.2;\">Step 5 \u2014 Link your data to the satellite images using GPS to UTM conversion<\/h2><\/div><div class=\"fusion-text fusion-text-41\"><p><img decoding=\"async\" class=\"lazyload aligncenter wp-image-60642 size-full\" src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Globe.jpeg\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Globe.jpeg\" alt=\"\" width=\"700\" height=\"466\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27700%27%20height%3D%27466%27%20viewBox%3D%270%200%20700%20466%27%3E%3Crect%20width%3D%27700%27%20height%3D%27466%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Globe-200x133.jpeg 200w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Globe-300x200.jpeg 300w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Globe-400x266.jpeg 400w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Globe-600x399.jpeg 600w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/05\/Globe.jpeg 700w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 700px) 100vw, 700px\" \/><\/p>\n<\/div><div class=\"fusion-text fusion-text-42\"><p>Finally we need to link our images with the data we have on agricultural fields to enable a supervised machine learning approach. In our case we have data on agricultural fields in the form of a list of GPS coordinates (latitude, longitude) , similar to the geojson we used in step 2 and we want to be able to find their pixel position. However, for the sake of clarity, I will start by showcasing a pixel conversion to GPS coordinates and then show the reverse<\/p>\n<\/div><div class=\"fusion-text fusion-text-43\"><p>The metadata collected while requesting the SentinelSat API provides the GPS coordinates of the corners of the image (footprint column) and we want the coordinates of a specific pixels. Latitude and longitude which are angular values do not evolve linearly within an image so we cannot do a simple ratio using the pixel position. There are ways to solve this using math equations but off the shelf solutions already exist in python.<\/p>\n<\/div><div class=\"fusion-text fusion-text-44\"><p>One quick solution is to convert the pixel position to UTM (Universal Transverse Mercator) in which a position is defined by a zone as well as an (x, y) position (in meter unit) which does evolve linearly with the image. We can then use a UTM to Latitude \/ Longitude conversion provided in the utm library. To do this we first need to obtain the UTM zone and position of the upper left corner of the image which can be found in true color image\u2019s metadata.<\/p>\n<\/div><div class=\"fusion-text fusion-text-45\"><div class=\"code\">\n<p>#Obtaining meatadata<br \/>\ntransform = rasterio.open(tci_file_path, driver=&#8217;JP2OpenJPEG&#8217;).transform<br \/>\nzone_number = int(tci_file_path.split(&#8220;\/&#8221;)[-1][1:3])<br \/>\nzone_letter = tci_file_path.split(&#8220;\/&#8221;)[-1][0]\nutm_x, utm_y = transform[2], transform[5]<\/p>\n<p># Converting pixel position to utm<br \/>\neast = utm_x + pixel_column * 10<br \/>\nnorth = utm_y + pixel_row * &#8211; 10<\/p>\n<p># Converting UTM to latitude and longitude<br \/>\nlatitude, longitude = utm.to_latlon(east, north, zone_number, zone_letter)<\/p>\n<\/div>\n<\/div><div class=\"fusion-text fusion-text-46\"><p>The GPS position to pixel conversion is done using the reverse formulas. In that case we have to make sure that the zone obtained matches with our image. This can be done by specifying the zone. If our object is not present in the image this will result in an out of bound pixel value.<\/p>\n<\/div><div class=\"fusion-text fusion-text-47\"><div class=\"code\">\n<p># Converting latitude and longitude to UTM<br \/>\neast, north, zone_number, zone_letter = utm.from_latlon(<br \/>\nlatitude, longitude, force_zone_number=zone_number<br \/>\n)<\/p>\n<p># Converting UTM to column and row<br \/>\npixe_column = round((east &#8211; utm_x) \/ 10)<br \/>\npixel_row = round((north &#8211; utm_y) \/ -10)<br \/>\nview raw<\/p>\n<\/div>\n<\/div><div class=\"fusion-title title fusion-title-12 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-margin-bottom-small:8px;\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:50;line-height:1.2;\">Conclusion<\/h2><\/div><div class=\"fusion-text fusion-text-48\"><p>We are now ready to use the satellite images for machine learning !<\/p>\n<\/div><div class=\"fusion-text fusion-text-49\"><p>In the next article of this 2 part series we will see how we can use those images to detect and classify fields surfaces using both supervised and unsupervised machine learning.<\/p>\n<\/div><div class=\"fusion-text fusion-text-50\"><p>Thanks for reading and don\u2019t hesitate to <a href=\"https:\/\/medium.com\/artefact-engineering-and-data-science\" target=\"_blank\" rel=\"noopener\">follow the Artefact tech blog<\/a> if you wish to be notified when this next article releases !<\/p>\n<\/div><\/div><\/div><\/div><\/article><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-6 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-5 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-text fusion-text-51\"><p>You can find more about us and our projects on our Medium blog<\/p>\n<\/div><div ><a class=\"fusion-button button-flat fusion-button-default-size button-default fusion-button-default button-1 fusion-button-default-span fusion-button-default-type button-primary-medium\" target=\"_self\" href=\"https:\/\/medium.com\/artefact-engineering-and-data-science\/leveraging-satellite-imagery-for-machine-learning-computer-vision-applications-d22143f72d94\" rel=\"noopener\"><span class=\"fusion-button-text awb-button__text awb-button__text--default\">View Article<\/span><\/a><\/div><\/div><\/div><\/div><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>5 de maio de 2021<br \/>\nUm guia passo a passo sobre como coletar e pr\u00e9-processar imagens de sat\u00e9lite data para algoritmos de aprendizado de m\u00e1quina<\/p>","protected":false},"featured_media":60639,"parent":0,"template":"","meta":{"_acf_changed":false,"ep_exclude_from_search":false},"blog-category":[22035],"blog-language":[2991],"class_list":["post-60637","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog-category-data-ai-consulting","blog-language-en"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.artefact.com\/br\/wp-json\/wp\/v2\/blog\/60637","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.artefact.com\/br\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.artefact.com\/br\/wp-json\/wp\/v2\/types\/blog"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.artefact.com\/br\/wp-json\/wp\/v2\/media\/60639"}],"wp:attachment":[{"href":"https:\/\/www.artefact.com\/br\/wp-json\/wp\/v2\/media?parent=60637"}],"wp:term":[{"taxonomy":"blog-category","embeddable":true,"href":"https:\/\/www.artefact.com\/br\/wp-json\/wp\/v2\/blog-category?post=60637"},{"taxonomy":"blog-language","embeddable":true,"href":"https:\/\/www.artefact.com\/br\/wp-json\/wp\/v2\/blog-language?post=60637"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}