使用 PaliGemma 对卫星图像中的水体进行分割

张开发
2026/4/9 22:25:09 15 分钟阅读

分享文章

使用 PaliGemma 对卫星图像中的水体进行分割
原文towardsdatascience.com/segmenting-water-in-satellite-images-using-paligemma-b172dc0cf55d?sourcecollection_archive---------2-----------------------#2024-12-29一些关于使用 Google 最新视觉语言模型的见解https://anamabo3.medium.com/?sourcepost_page---byline--b172dc0cf55d--------------------------------https://towardsdatascience.com/?sourcepost_page---byline--b172dc0cf55d-------------------------------- Dr. Carmen Adriana Martínez Barbosa·发表于 Towards Data Science ·9 分钟阅读·2024 年 12 月 29 日–https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/e9d032d36ebb9f252e75c1a95d5b64cb.png澳大利亚的哈特湖。根据季节、时间和云层覆盖情况这个湖泊的颜色会从红色变为粉色或紫色。来源Google Maps。多模态模型是一种架构能够同时集成和处理不同类型的数据如文本、图像和音频。一些例子包括 OpenAI 的 CLIP 和 DALL-E这两者都在 2021 年发布。CLIP 可以联合理解图像和文本使其能够执行零-shot 图像分类等任务。而 DALL-E 则根据文本描述生成图像允许在游戏、广告和文学等领域自动化和增强创意过程。视觉语言模型VLMs是多模态模型的一种特殊形式。VLMs 根据视觉输入生成语言。一个显著的例子是 PaliGemmaGoogle 于 2024 年 5 月推出。PaliGemma 可用于视觉问答、物体检测和图像分割。一些博客文章探讨了 PaliGemma 在物体检测中的应用比如 Roboflow 的这篇精彩文章[## 使用自定义数据微调 PaliGemma 进行物体检测学习如何微调 PaliGemma 多模态模型以检测自定义物体。blog.roboflow.com然而在我写这篇博客时关于如何准备数据以使用 Paligemma 进行对象分割的现有文档非常模糊。这就是为什么我想评估使用 Paligemma 完成这个任务是否容易。在这里我分享我的经验。Paligemma 简介在详细讨论用例之前让我们简要回顾一下 Paligemma 的内部工作原理。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/e3f8adc404fa7c8dd20c873399e6032a.pngPaligemma2 的架构。来源arxiv.org/abs/2412.03555Paligemma 将 SigLIP-So400m 视觉编码器 与 Gemma 语言模型 结合处理图像和文本见上图。在今年 12 月发布的 Paligemma 新版本中视觉编码器可以以三种不同的分辨率对图像进行预处理224px、448px 或 896px。视觉编码器对图像进行预处理并输出一系列图像标记这些标记与输入文本标记线性结合。这个标记组合将被 Gemma 语言模型进一步处理最终输出文本标记。Gemma 模型有不同的大小从 2B 到 27B 参数不等。以下图所示是模型输出的示例。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/bb5b62fcee9bc621f472c12acb4655ca.png对象分割输出的示例。来源arxiv.org/abs/2412.03555Paligemma 模型在多个数据集上进行了训练如 WebLi、openImages、WIT 等有关更多详情请参见这篇 Kaggle 博客。这意味着 Paligemma 能够在没有微调的情况下识别物体。然而这种能力是有限的。因此Google 推荐在特定领域的用例中对 Paligemma 进行微调。输入格式要微调 Paligemma输入数据需要为 JSONL 格式。JSONL 格式的数据集中的每一行都是一个单独的 JSON 对象就像一个个体记录的列表。每个 JSON 对象包含以下键图像图像的名称。前缀这指定了您希望模型执行的任务。后缀这是提供给模型学习的真实标签用以进行预测。根据任务的不同您必须相应地更改 JSON 对象的前缀和后缀。以下是一些示例图像标注{image:some_filename.png,prefix:caption en(To indicate that the model should generate an English captionforan image),suffix:This is an image of a big, white boat traveling in the ocean.}问答{image:another_filename.jpg,prefix:How many people are in the image?,suffix:ten}物体检测{image:filename.jpeg,prefix:detect airplane,suffix:loc0055loc0115loc1023loc1023 airplane(four corner bounding box coords)}如果您有多个类别需要检测请在每个类别的前缀和后缀之间添加分号;。关于如何为 Paligemma 准备物体检测数据的完整清晰解释请参见 这篇 Roboflow 文章。图像分割{image:filename.jpeg,prefix:detect airplane,suffix:loc0055loc0115loc1023loc1023seg063seg108seg045seg028seg056seg052seg114seg005seg042seg023seg084seg064seg086seg077seg090seg054 airplane}请注意对于分割除了对象的边界框坐标外还需要指定 16 个额外的分割令牌代表适合在边界框内的掩码。根据谷歌的 Big Vision 库这些令牌是包含 128 个条目的代码词…。我们如何获取这些值根据我的个人经验在没有适当文档的情况下获取它们非常具有挑战性和令人沮丧。不过我稍后会提供更多细节。如果你有兴趣了解更多关于 PaliGemma 的信息我推荐以下博客[## 欢迎使用 PaliGemma 2 —— 谷歌的新视觉语言模型我们正在通过开源和开放科学推动和普及人工智能的发展。huggingface.co](https://huggingface.co/blog/paligemma2?sourcepost_page-----b172dc0cf55d--------------------------------) [## 介绍 PaliGemma谷歌最新的视觉语言模型PaliGemma 通过任务特定的微调推动了视觉语言模型在高效多模态方面的边界……www.datature.io水体的卫星图像如上所述PaliGemma 是在不同数据集上进行训练的。因此预计该模型擅长分割“传统”物体如汽车、人或动物。但在卫星图像中分割物体怎么样呢这个问题促使我探索 PaliGemma 在卫星图像中分割水体的能力。Kaggle 的水体卫星图像数据集非常适合此用途。该数据集包含 2841 张图像及其对应的掩码。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ad8e9458fd86cd6d05b75a1c60a1563f.png这是水体数据集的一个示例左侧是 RGB 图像右侧是相应的掩码。数据集中的一些掩码是错误的其他一些则需要进一步的预处理。错误的示例包括将所有值都设为水的掩码而原始图像中只存在一小部分水域。还有些掩码与其 RGB 图像不对应。当图像旋转时某些掩码会让这些区域看起来像有水。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b74083bafddf71b84cdbbc2f3cfd00f1.png旋转掩码的示例。当在 Python 中读取此图像时图像外部区域会显示为有水的样子。在这种情况下需要旋转图像来纠正掩码。图像由作者制作。鉴于这些数据的限制我选择了 164 张图像样本其中的掩膜没有上述提到的任何问题。这一组图像被用来微调 Paligemma。准备 JSONL 数据集如前一节所述Paligemma 需要输入表示物体边界框坐标的标准化图像空间坐标…以及额外的 16 个分割标记代表 128 个不同的代码词…。由于有了Roboflow 的解释获取所需格式的边界框坐标变得很容易。那么我们如何从掩膜中获取 128 个代码词呢在 Big Vision 代码库中没有明确的文档或示例可以用于我的使用场景。我天真地以为创建分割标记的过程与创建边界框相似。然而这导致了水体掩膜的错误表示从而导致了错误的预测结果。到我写这篇博客时12 月初Google 宣布了 Paligemma 的第二版。在此事件之后Roboflow 发布了一篇很好的概述介绍了如何准备数据来微调 Paligemma2以适应不同的应用场景包括图像分割。我使用了他们代码的一部分最终获得了正确的分割代码词。我的错误是什么呢首先掩膜需要调整大小为形状为[None, 64, 64, 1]的张量然后使用预训练的变分自编码器VAE将标注掩膜转换为文本标签。尽管在 Big Vision 代码库中简要提到过 VAE 模型的使用但并没有提供如何使用它的解释或示例。我用来准备数据以微调 Paligemma 的工作流程如下所示https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/31298a3389159effa1b9eff062b5b8cb.png将一个原始掩膜从过滤后的水体数据集转换为 JSON 对象的步骤。这个过程在训练集中的 164 张图像和测试集中的 21 张图像上重复以构建 JSONL 数据集。如观察所见准备数据以适应 Paligemma 所需的步骤较多因此我没有在这里分享代码片段。然而如果你想探索代码可以访问这个 GitHub 仓库。脚本convert.py包含了上述工作流程中的所有步骤。我还添加了选定的图像方便你立即使用这个脚本进行操作。在将分割代码词转换回分割掩膜的预处理过程中我们注意到这些掩膜如何覆盖图像中的水体https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/21e69594fd0053603c25be1b6e07aaba.png在训练集上解码分割代码词时生成的掩膜。此图由作者使用此 Notebook制作。Paligemma 在分割卫星图像中的水体表现如何在微调 Paligemma 之前我尝试了它在 Hugging Face 上上传的模型的分割功能。该平台有一个演示你可以上传图片并与不同的 Paligemma 模型互动。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/13a159f2e23495fa1218fc60692ec45e.png默认的 Paligemma 模型在分割卫星图像中的水体方面表现。当前版本的 Paligemma 通常能较好地分割卫星图像中的水体但它并不完美。让我们看看是否能改进这些结果有两种方法可以微调 Paligemma分别是通过 Hugging Face 的 Transformer 库 或使用 Big Vision 和 JAX。我选择了后一种方法。Big Vision 提供了一个 Colab notebook我根据自己的使用需求进行了修改。你可以通过访问我的GitHub 仓库来打开它[## SegmentWaterWithPaligemma/finetune_paligemma_for_segmentation.ipynb 位于主分支 ·…使用 Paligemma 进行卫星图像中水体的分割……github.com](https://github.com/anamabo/SegmentWaterWithPaligemma/blob/main/finetune_paligemma_for_segmentation.ipynb?sourcepost_page-----b172dc0cf55d--------------------------------)我使用了batch size为 8learning rate为 0.003。我运行了两次训练循环总共进行了 158 步训练。在 T4 GPU 机器上整个运行时间为 24 分钟。结果并未如预期那样。Paligemma 在一些图像中没有生成预测结果在其他图像中生成的掩膜与真实值相差甚远。我还在两张图像中获得了超过 16 个标记的分割代码词。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/f9ba415d9a14a051d7c5168dee08e1d6.png微调后的结果中有预测的情况。此图由作者制作。值得一提的是我使用的是第一版 Paligemma。也许使用 Paligemma2或者进一步调整批次大小或学习率结果会有所改进。无论如何这些实验超出了本文的讨论范围。演示结果显示默认的 Paligemma 模型在分割水体方面优于我微调过的模型。在我看来如果目标是构建一个专门用于分割物体的模型那么 UNET 是一个更好的架构。如需了解如何训练此类模型的更多信息可以阅读我之前的博客文章## 使用 AI 检测云层从随机森林到 YOLO比较不同算法在卫星图像中进行云层分割的效果。[towardsdatascience.com其他限制我想提一下在使用 Big Vision 和 JAX 微调 Paligemma 时遇到的其他一些挑战。设置不同的模型配置是困难的因为关于这些参数的文档仍然很少。Paligemma 的第一个版本已被训练处理不同长宽比的图像并将其调整为 224x224 大小。请确保只将输入图像调整为此大小这将防止引发异常。在使用 Big Vision 和 JAX 进行微调时你可能会遇到与 JAX GPU 相关的问题。克服此问题的方法有a. 减少训练集和验证集中的样本数量。b. 将批量大小从 8 增加到 16 或更高。微调后的模型大小约为 5GB。确保你的驱动器有足够的空间来存储它。重点信息发现一个新的 AI 模型令人兴奋尤其是在这个多模态算法正在转变我们社会的时代。然而由于缺乏可用的文档与最先进的模型合作有时会变得具有挑战性。因此新 AI 模型的发布应伴随全面的文档以确保其顺利且广泛的应用特别是在那些仍然缺乏经验的专业人士中。尽管我在微调 Paligemma 时遇到了困难但当前的预训练模型在进行零-shot 目标检测和图像分割时非常强大可以应用于许多场景包括辅助机器学习标注。你在计算机视觉项目中使用 Paligemma 吗在评论中分享你在微调该模型时的经验希望你喜欢这篇文章再次感谢阅读你可以通过 LinkedIn 与我联系地址是www.linkedin.com/in/camartinezbarbosa/致谢我要感谢 José Celis-Gil 在数据预处理和建模方面的所有富有成果的讨论。

更多文章