{"id":17906,"date":"2025-11-05T11:21:35","date_gmt":"2025-11-05T09:21:35","guid":{"rendered":"https:\/\/spatialworld.fi\/?page_id=17906"},"modified":"2025-11-27T10:58:19","modified_gmt":"2025-11-27T08:58:19","slug":"fme-blog-dinov3","status":"publish","type":"page","link":"https:\/\/spatialworld.fi\/en\/fme-blog-dinov3\/","title":{"rendered":"fme-dinov3"},"content":{"rendered":"[vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<h1><\/h1>\n<h1>&#x1f98e;Breathing New Life into Raster Data with AI Embeddings and FME&#x1f996;<\/h1>\n[\/vc_column_text][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]Geospatial imagery and other raster datasets often sit underutilized in archives, rich with potential insights that are hard to extract. Today, a class of AI models called <strong>embedding models<\/strong> is changing that. By using embeddings, numerical representations of data that capture its essential patterns, we can unlock information in current and legacy raster data that was previously inaccessible.<\/p>\n<p>In the past, embeddings were mostly an internal step in classification models. For example, a neural network might learn features that help distinguish a cat from a dog, but those features were not typically used directly. In the geospatial domain, you usually still had to train a model on your own labelled data to get usable results.<\/p>\n<p>With generic models like <strong>DINOv3<\/strong>, you can now compute embeddings directly on your own imagery, on your own machines. You can still fine-tune them if needed, but as we\u2019ll see, you can already do a lot just by using the pretrained model \u201cas is\u201d. Of course, you can also build on top of them, this is why Meta call it a vision foundation model.<\/p>\n[\/vc_column_text][image_with_animation image_url=&#8221;17955&#8243; image_size=&#8221;full&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<p style=\"text-align: center;\"><em>Image from https:\/\/ai.meta.com\/dinov3\/<\/em><\/p>\n<p>With the flexibility of Safe Software\u2019s <strong>FME<\/strong> (Feature Manipulation Engine) as a low-code integration platform, non-coders can harness these advanced AI capabilities. In this article, we\u2019ll explain embeddings in simple terms and walk through three real use cases where combining an embedding model with FME gives raster datasets a new life. Each scenario is actionable, with data and processes available for readers to experiment with themselves (see the download link at the end).<\/p>\n<h2><\/h2>\n<h2>What Are Embeddings?<\/h2>\n<p>In the context of machine learning, <strong>embeddings<\/strong> are a way to convert complex data (like an image or text) into a list of numbers (a <em>feature vector<\/em>) that captures meaningful characteristics of that data. You can think of an embedding as a compact summary or fingerprint of the original content.<\/p>\n<p>For images, an embedding might be a vector of a few hundred or a thousand numbers that collectively represent things like shapes, textures and structures in the patch, but not in an explicit human-readable way. The key idea is that <strong>similar data will have similar embeddings<\/strong>. If two image patches both contain dense forest, an embedding model will generate vectors for them that are numerically close to each other. The model doesn\u2019t just look at individual pixels, but also at patterns and context.<\/p>\n<p>This technique compresses vast amounts of visual information into a smaller set of features that represent the data\u2019s meaningful semantics. The power of embeddings is that they make it easy for computers to compare and search content. Instead of comparing raw pixel values (which is impractical), we compare the embeddings. This unlocks operations such as:<\/p>\n<ul>\n<li>searching images by content<\/li>\n<li>clustering and classifying scenes by similarity<\/li>\n<li>detecting anomalies<\/li>\n<\/ul>\n<p>In short, embeddings turn rich, unstructured data (like raster pixels) into a structured form that we can index and analyze efficiently.<\/p>\n<p>As reference, the same concept was used for text in our <a href=\"https:\/\/spatialworld.fi\/en\/17076-2-2-3\/\">RAG article<\/a>.<\/p>\n<h2><\/h2>\n<h2>A New Life for Existing Raster Datasets<\/h2>\n<p>How do embedding models breathe new life into rasters?<\/p>\n<p>Consider a large archive of aerial photos or satellite imagery collected over the years. Traditionally, to find something in these images, say all areas with water bodies or dense forest,, you\u2019d have to manually analyze each image or train a model after labelling a lot of them. An embedding model changes the game by <strong>unlocking the content inside the images without extra work<\/strong>. By running each raster image (or even each tile or small patch) through the model, we obtain an embedding vector that represents that image\u2019s content. These embeddings can then be used in multiple ways:<\/p>\n<ul>\n<li><strong>Content-based search : find what you need, fast.<\/strong><br \/>\nBecause similar images have similar embeddings, you can query the archive for images that match a certain example or pattern. For instance, given one image patch showing a lake, find all other patches with similar water textures. This was nearly impossible to do at scale before; embeddings make it feasible to build a \u201csearch engine\u201d for imagery.<\/li>\n<li><strong>Clustering and discovery : reveal hidden structure.<\/strong><br \/>\nBy grouping patches by their embedding vectors, you might automatically discover categories in your dataset: urban, forest, water, bare soil, etc. This unsupervised discovery can reveal trends (like expanding built-up areas or deforestation) that give the dataset new relevance.<\/li>\n<li><strong>Enhancing analyses with new features : combine with other data.<\/strong><br \/>\nOnce images are converted to embeddings (or further distilled into categories or scores), you can cross-reference this information with other datasets to get new insights or fond anomalies.<\/li>\n<\/ul>\n<h2>FME + AI: Low-Code Integration for Everyone<\/h2>\n<p>You might be thinking: <em>\u201cThis sounds complex , do I need to be a programmer or AI specialist to do this?\u201d<\/em> . Thankfully, no.<\/p>\n<p>This is where <strong>FME<\/strong> comes in. FME is a powerful data integration platform known for its flexibility in handling spatial data, and it provides a no-code\/low-code interface. You build workflows by connecting graphical components (transformers) rather than writing code. With FME, you can connect to virtually any data source or format, including large rasters, databases, web services, and now even AI models, all without writing a single line of code.<\/p>\n<p>In our case, the embeddings are computed with DINOv3 and stored either as NumPy (.npy) files per tile or in a database table (DuckDB) with a vector column. FME\u2019s strength lies in <strong>how you use them<\/strong>, both <em>before<\/em> and <em>after<\/em> the embedding step:<\/p>\n<ul>\n<li><strong>Before:<\/strong>\n<ul>\n<li>Select objects or areas of interest.<\/li>\n<li>Build patch grids aligned to your rasters.<\/li>\n<li>Orchestrate tiling and parallel processing for efficient computation.<\/li>\n<\/ul>\n<\/li>\n<li><strong>After:<\/strong>\n<ul>\n<li>Join embedding results with vector layers or other attributes.<\/li>\n<li>Apply filters and thresholds, run spatial joins, group by polygons.<\/li>\n<li>Automate reporting, visualization and publication in FME Flow.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>FME is famously format-agnostic and flexible. It has dozens of raster transformers and support for hundreds of data formats, meaning it can read your legacy data (GeoTIFF, JPEG2000, proprietary formats) and write out results in whatever form you need. Its no-code interface lowers the barrier so non-developers can create sophisticated data pipelines in an understandable, reliable way. Want to load embeddings into a spatial database, or compare them against a shapefile of land parcels? It\u2019s a matter of adding the right transformers.<\/p>\n<p>FME essentially acts as the glue that brings data and AI together: it can connect to databases or APIs, handle large volumes, and schedule or automate tasks in FME Flow for production. Providing a simple app or self-service workspace for end-users on top of these workflows is straightforward.<\/p>\n<p>The result is that advanced image analysis isn\u2019t confined to data scientists: planners, analysts, or any GIS professional can leverage it through FME.<\/p>\n<p>Now, let\u2019s look at three concrete use cases that demonstrate how an embedding model + FME workflow delivers value. Each scenario uses an existing raster dataset and combines it with other data in FME to solve a real problem.<\/p>\n<h2><\/h2>\n<h2>Use Case 1 : Find All Solar Panels from One Example<\/h2>\n[\/vc_column_text][image_with_animation image_url=&#8221;17956&#8243; image_size=&#8221;full&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]<strong>Question<\/strong><\/p>\n<p>We have city-wide orthophotos and want to map <strong>solar panels<\/strong>. There is no labelled training dataset, and we don\u2019t want to build and maintain a supervised model. Can we start from <strong>one known panel<\/strong> and find similar ones?<\/p>\n<p><strong>Idea<\/strong><\/p>\n<p>Because DINOv3 embeddings capture texture and structure, we can:<\/p>\n<ol>\n<li>Pick one patch that clearly contains solar panels.<\/li>\n<li>Look for all patches whose embedding is closest to that reference in the 1024-dimensional space.<\/li>\n<li>Bring those patches back to map coordinates and visualize them.<\/li>\n<\/ol>\n<p>No supervised training, just <strong>similarity search<\/strong> in embedding space.<\/p>\n<h3><strong>Workflow in FME (conceptually)<\/strong><\/h3>\n<ol>\n<li>\n<h4><strong>Rebuild the patch grid<\/strong><\/h4>\n<ul>\n<li>Use FME to generate a grid aligned with the raster tiling (cells of 8 m \u00d7 8 m, the physical size of a 16\u00d716 pixel patch at 0.5 m resolution).<\/li>\n<li>Each grid cell corresponds to a DINOv3 patch, identified by tile name and patch indices (row, column).<\/li>\n<\/ul>\n<\/li>\n<li>\n<h4><strong>Select a reference patch<\/strong><\/h4>\n<ul>\n<li>Load orthophotos as background in Data Inspector.<\/li>\n<li>Click on a grid cell that clearly covers solar panels (good orientation, clear panels, limited shadow).<\/li>\n<li>Extract its tile\/row\/col and look up its embedding in the DuckDB table.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n[\/vc_column_text][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][image_with_animation image_url=&#8221;17957&#8243; image_size=&#8221;full&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221;][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<h4><strong>3. Find similar patches<\/strong><\/h4>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>In a small SQL step (provided in the example), compute the distance between the reference embedding and all other embeddings (e.g. cosine or Euclidean distance).<\/li>\n<li>Sort patches by distance and keep, for example, the <strong>1000 closest<\/strong> as a first pass.<\/li>\n<li>Optionally, apply a distance threshold (e.g. keep only patches with distance below a tuned value)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h4><strong>4. Back to the map<\/strong><\/h4>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Join the selected embeddings back to their patch grid features in FME.<\/li>\n<li>Turn each patch into a rectangle in real-world coordinates (using tile bounds and patch indices).<\/li>\n<li>Color patches by distance to the reference (closer = more likely solar panel).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n[\/vc_column_text][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/2&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][image_with_animation image_url=&#8221;17959&#8243; image_size=&#8221;full&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221;][\/vc_column][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/2&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][image_with_animation image_url=&#8221;17958&#8243; image_size=&#8221;full&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221;][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<h3><strong>What you see<\/strong><\/h3>\n<p>In Data Inspector you see:<\/p>\n<ul>\n<li>The orthophoto in the background<\/li>\n<li>A grid of patches<\/li>\n<li>Highlighted patches that DINOv3 considers similar to the example solar panel<\/li>\n<\/ul>\n<p>You\u2019ll notice:<\/p>\n<ul>\n<li>Many true positives (solar panel arrays on roofs)<\/li>\n<li>Some false positives (dark roof elements, skylights, some industrial rooftops)<\/li>\n<\/ul>\n<p>You can refine the results by:<\/p>\n<ul>\n<li>Setting a stricter distance threshold<\/li>\n<li>Using multiple reference patches (different panel sizes, orientations, rooftop types) and combining results<\/li>\n<li>Restricting to areas with buildings using a vector building footprint layer<\/li>\n<\/ul>\n<p>The end result is a <strong>solar panel candidate layer<\/strong> generated with very little manual effort.<\/p>\n<h2><strong>Use Case 2 : Where Did the City Change Between 2014 and 2020?<\/strong><\/h2>\n[\/vc_column_text][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/2&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][image_with_animation image_url=&#8221;17960&#8243; image_size=&#8221;full&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221;][\/vc_column][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/2&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][image_with_animation image_url=&#8221;17961&#8243; image_size=&#8221;full&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221;][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<p style=\"text-align: center;\"><em>Situation in 2014 vs 2020 (with changed patches in red)<\/em><\/p>\n<p><strong>\u00a0<\/strong><\/p>\n<h3><strong>Question<\/strong><\/h3>\n<p>We have orthophotos for <strong>2014<\/strong> and <strong>2020<\/strong> at the same resolution and coverage. We\u2019d like to see:<\/p>\n<ul>\n<li>Where new buildings appeared<\/li>\n<li>Where large land cover changes happened<\/li>\n<li>Without manually comparing the two mosaics, patch by patch<\/li>\n<\/ul>\n<h3><strong>Idea<\/strong><\/h3>\n<p>For each patch location (same tile, same row\/col), we compare:<\/p>\n<ul>\n<li>The embedding in 2014<\/li>\n<li>The embedding in 2020<\/li>\n<\/ul>\n<p>If a location didn\u2019t change much (same buildings, similar vegetation), the embeddings will be close. If it changed a lot (new construction, major clearing), the embeddings will be far apart.<\/p>\n<p>So we define a <strong>change score<\/strong>:<\/p>\n<p>change = distance(embedding_2014, embedding_2020) and use FME to map and filter on that score.<\/p>\n<h3><strong>Workflow in FME<\/strong><\/h3>\n<ol>\n<li>\n<h4><strong>Run DINOv3 on both years<\/strong><\/h4>\n<ul>\n<li>Use identical tiling (same grid, same patch indices) for 2014 and 2020.<\/li>\n<li>For each tile + patch index we now have two embeddings: one from 2014, one from 2020.<\/li>\n<\/ul>\n<\/li>\n<li>\n<h4><strong>Compute change per patch<\/strong><\/h4>\n<ul>\n<li>In DuckDB, compute the distance between the 2014 and 2020 embeddings for each patch.<\/li>\n<li>Store this value as in the table (\u201cdelta_2014\u201d).<\/li>\n<\/ul>\n<\/li>\n<li>\n<h4><strong>Select changed patches<\/strong><\/h4>\n<ul>\n<li>In FME, read the table and apply a first filter like delta_2014&gt; 0.25 to remove very small changes and noise.<\/li>\n<li>Then use a <strong>Tester<\/strong> transformer to keep only strong changes, e.g. delta_2014&gt; 0.80.<\/li>\n<li>These threshold values are chosen empirically by looking at the distribution of distances and visually inspecting results; they can be tuned for each dataset.<\/li>\n<\/ul>\n<\/li>\n<li>\n<h4><strong>Visualize as polygons or raster<\/strong><\/h4>\n<\/li>\n<\/ol>\n<p>Two options:<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ul>\n<li><strong>Polygons<\/strong>: represent each patch as a rectangle and overlay them on the 2020 orthophoto. Darker color = bigger change score.<\/li>\n<li><strong>Change raster<\/strong>: use ImageRasterizer to convert changed patches into a raster layer, give it a semi-transparent color, and blend it with the 2020 imagery using RasterMosaicker.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h3><strong>What you see<\/strong><\/h3>\n<p>Typical patterns that pop out include:<\/p>\n<ul>\n<li>New residential areas at the edge of the city<\/li>\n<li>New roads or widened road corridors<\/li>\n<li>Industrial developments and large clearings<\/li>\n<\/ul>\n<p>Interestingly, some natural changes (like seasonal vegetation variation) may still have relatively low distances if the overall texture remains similar. This is useful: the method tends to highlight <strong>structural<\/strong> changes more than small spectral differences.<\/p>\n<p>This workflow becomes a reusable <strong>change-detection tool<\/strong>. When new imagery arrives, you run the same pipeline and immediately see where the most significant changes are.<\/p>\n<h2><strong>Use Case 3 :\u00a0 Are My Vegetation \/ Zoning Polygons Consistent with the Imagery?<\/strong><\/h2>\n[\/vc_column_text][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][image_with_animation image_url=&#8221;17962&#8243; image_size=&#8221;full&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221;][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<h3><strong>Question<\/strong><\/h3>\n<p>The City of Helsinki provides various zoning and land-use layers. Suppose we take a <strong>vegetation or green area polygon layer<\/strong>. It is meant to represent parks, green corridors, and similar spaces.<\/p>\n<p>We want to know:<\/p>\n<ul>\n<li>Are there parts of these polygons that visually look very different from the rest?<\/li>\n<li>Did some areas get paved or built over but never updated in the vector data?<\/li>\n<li>Are there \u201choles\u201d\u00a0 (roads, parking lots, buildings) inside zones which are still classified as green?<\/li>\n<\/ul>\n<h3><strong>Idea<\/strong><\/h3>\n<p>Inside a given polygon, most patches should look broadly similar (trees, grass, paths). We can:<\/p>\n<ol>\n<li>Collect embeddings of all patches inside each polygon.<\/li>\n<li>Compute the <strong>median embedding<\/strong> for that polygon (a kind of \u201ctypical\u201d patch for that area).<\/li>\n<li>Measure how far each patch is from this median embedding.<\/li>\n<li>Flag patches that are much farther than the typical distance.<\/li>\n<\/ol>\n<p>Those patches are <strong>outliers inside the polygon<\/strong>, they might indicate misclassification, new construction, or simply interesting anomalies.<\/p>\n<h3><strong>Workflow in FME<\/strong><\/h3>\n<ol>\n<li>\n<h4><strong>Intersect polygons with patch grid<\/strong><\/h4>\n<ul>\n<li>Use FME to generate the same patch grid as before (8 m \u00d7 8 m cells).<\/li>\n<li>Intersect this grid with the vegetation polygons.<\/li>\n<li>Keep only patches that fall inside each polygon and carry over the polygon ID.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n[\/vc_column_text][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/2&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][image_with_animation image_url=&#8221;17963&#8243; image_size=&#8221;full&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221;][\/vc_column][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/2&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][image_with_animation image_url=&#8221;17964&#8243; image_size=&#8221;full&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221;][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<p style=\"text-align: center;\"><em>Green area objects as polygons and as a grid<\/em><\/p>\n<ul>\n<li><strong>1.\u00a0 Load embeddings for these patches<\/strong>\n<ul>\n<li>Using the tile\/row\/col attributes, look up the corresponding embeddings from the .npy files.<\/li>\n<li>A PythonCaller reads embeddings and attaches them to each patch feature.<\/li>\n<\/ul>\n<\/li>\n<li><strong>2.\u00a0 Compute per-polygon median and outliers<\/strong><\/li>\n<\/ul>\n<p>Inside PythonCaller (or an external script triggered from FME):<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Group patches by polygon ID.<\/li>\n<li>For each group, stack all embeddings into an array.<\/li>\n<li>Compute the median embedding of that group.<\/li>\n<li>Compute distance from each patch\u2019s embedding to this median.<\/li>\n<li>Determine a threshold based on the distribution (for example, mark the top 5% farthest patches as outliers).<\/li>\n<li>Return two attributes to FME:\n<ul>\n<li>dist_to_median<\/li>\n<li>is_outlier (0\/1)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<h4><strong>3. Inspect and act<\/strong><\/h4>\n<ul>\n<li>Use a Tester in FME to filter to is_outlier = 1.<\/li>\n<li>Visualize those patches over the orthophoto and the polygon boundaries in Data Inspector.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n[\/vc_column_text][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][image_with_animation image_url=&#8221;17965&#8243; image_size=&#8221;full&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221;][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<h3><strong>What you see?<\/strong><\/h3>\n<p>The outlier patches often correspond to:<\/p>\n<ul>\n<li>Buildings encroaching into green areas<\/li>\n<li>Parking lots, roads, or construction sites inside polygons still classified as vegetation<\/li>\n<li>Bare soil or water patches that don\u2019t match the majority of the polygon<\/li>\n<\/ul>\n<p>This gives you a <strong>quality-control tool<\/strong> for vector layers driven directly by the imagery underneath. You don\u2019t label anything; you simply use the inherent structure of the embeddings.<\/p>\n<h2><strong>Why Combining FME and DinoV3 Works So Well?<\/strong><\/h2>\n<p>Across all three use cases, the pattern is the same:<\/p>\n<ul>\n<li><strong>DINOv3<\/strong> provides a general, reusable representation of every image patch.<\/li>\n<li>We don\u2019t train new models; we reuse these embeddings for different questions.<\/li>\n<li><strong>FME<\/strong> provides the data plumbing, spatial logic and user-friendly UI to:\n<ul>\n<li>connect embeddings to tiles, rasters and vector data<\/li>\n<li>perform selections, aggregations and QA<\/li>\n<li>produce outputs that decision-makers can understand (maps, layers, tables)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>This gives existing orthophoto archives a second life:<\/p>\n<ul>\n<li>as a <strong>searchable database of content<\/strong> (similarity search)<\/li>\n<li>as a <strong>change detector over time<\/strong> (embedding differences)<\/li>\n<li>as a <strong>consistency checker<\/strong> for other spatial layers (outliers inside polygons)<\/li>\n<\/ul>\n<p>Because everything is built in FME, non-coders can run, adapt and extend these workflows without becoming ML engineers.<\/p>\n<h2><strong>Ready to Try It Yourself?<\/strong><\/h2>\n<p>These techniques are not just theoretical, you can start experimenting with your own data, or try out our examples.<\/p>\n<p>As the set up requires a bit of data and also to install something similar to micromamba and some SQL pre-processing, we could not just publish to FME hub. We\u2019ve prepared a sample template containing the FME workspace with cached data for the three use cases described above, you can download it with the link below or contact us to get more information.<\/p>\n<p><a href=\"https:\/\/spatialworld-my.sharepoint.com\/:u:\/g\/personal\/antoine_guillot_spatialworld_fi\/Ed20MBhrdNBCnY7GcEagrn0Bu3i3Q4qAQwVtQH94KLbkww\"><strong>Download<\/strong><\/a><\/p>\n<p>Load the workspace in FME, follow the embedded annotations, and you\u2019ll be able to reproduce the results or tweak the workflows for your own needs.<\/p>\n<p>By embracing modern embedding models and the power of FME\u2019s low-code platform, you can extract new insights from old raster datasets with ease. What will you discover in your imagery?[\/vc_column_text][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][\/vc_column][\/vc_row]","protected":false},"excerpt":{"rendered":"<p>[vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221;&#8230;<\/p>\n","protected":false},"author":6,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-17906","page","type-page","status-publish"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>fme-dinov3 - Spatialworld Oy<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/spatialworld.fi\/en\/fme-blog-dinov3\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"fme-dinov3 - Spatialworld Oy\" \/>\n<meta property=\"og:description\" content=\"[vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221;...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/spatialworld.fi\/en\/fme-blog-dinov3\/\" \/>\n<meta property=\"og:site_name\" content=\"Spatialworld Oy\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-27T08:58:19+00:00\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/spatialworld.fi\/en\/fme-blog-dinov3\/\",\"url\":\"https:\/\/spatialworld.fi\/en\/fme-blog-dinov3\/\",\"name\":\"fme-dinov3 - Spatialworld Oy\",\"isPartOf\":{\"@id\":\"https:\/\/spatialworld.fi\/en\/#website\"},\"datePublished\":\"2025-11-05T09:21:35+00:00\",\"dateModified\":\"2025-11-27T08:58:19+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/spatialworld.fi\/en\/fme-blog-dinov3\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[[\"https:\/\/spatialworld.fi\/en\/fme-blog-dinov3\/\"]]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/spatialworld.fi\/en\/fme-blog-dinov3\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/spatialworld.fi\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"fme-dinov3\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/spatialworld.fi\/en\/#website\",\"url\":\"https:\/\/spatialworld.fi\/en\/\",\"name\":\"Spatialworld Oy\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/spatialworld.fi\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"fme-dinov3 - Spatialworld Oy","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/spatialworld.fi\/en\/fme-blog-dinov3\/","og_locale":"en_US","og_type":"article","og_title":"fme-dinov3 - Spatialworld Oy","og_description":"[vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221;...","og_url":"https:\/\/spatialworld.fi\/en\/fme-blog-dinov3\/","og_site_name":"Spatialworld Oy","article_modified_time":"2025-11-27T08:58:19+00:00","twitter_misc":{"Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/spatialworld.fi\/en\/fme-blog-dinov3\/","url":"https:\/\/spatialworld.fi\/en\/fme-blog-dinov3\/","name":"fme-dinov3 - Spatialworld Oy","isPartOf":{"@id":"https:\/\/spatialworld.fi\/en\/#website"},"datePublished":"2025-11-05T09:21:35+00:00","dateModified":"2025-11-27T08:58:19+00:00","breadcrumb":{"@id":"https:\/\/spatialworld.fi\/en\/fme-blog-dinov3\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":[["https:\/\/spatialworld.fi\/en\/fme-blog-dinov3\/"]]}]},{"@type":"BreadcrumbList","@id":"https:\/\/spatialworld.fi\/en\/fme-blog-dinov3\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/spatialworld.fi\/en\/"},{"@type":"ListItem","position":2,"name":"fme-dinov3"}]},{"@type":"WebSite","@id":"https:\/\/spatialworld.fi\/en\/#website","url":"https:\/\/spatialworld.fi\/en\/","name":"Spatialworld Oy","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/spatialworld.fi\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/spatialworld.fi\/en\/wp-json\/wp\/v2\/pages\/17906","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spatialworld.fi\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/spatialworld.fi\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/spatialworld.fi\/en\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/spatialworld.fi\/en\/wp-json\/wp\/v2\/comments?post=17906"}],"version-history":[{"count":33,"href":"https:\/\/spatialworld.fi\/en\/wp-json\/wp\/v2\/pages\/17906\/revisions"}],"predecessor-version":[{"id":17988,"href":"https:\/\/spatialworld.fi\/en\/wp-json\/wp\/v2\/pages\/17906\/revisions\/17988"}],"wp:attachment":[{"href":"https:\/\/spatialworld.fi\/en\/wp-json\/wp\/v2\/media?parent=17906"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}