Grounding DINO (GDINO)#

概述#

Grounding DINO 支持开放词汇对象检测,支持无限的对象类别。与基于图像和视频的空间、上下文理解的传统对象检测器相比,它还提供卓越的性能。 示例包括

  1. 多对象检测 - 示例:“汽车,自行车”

  2. 对象属性 - 示例:“红色汽车”

  3. 空间位置 - 示例:“狗旁边的男孩”

  4. 执行的动作 - 示例:“坐在椅子上的人”

微服务容器包含带有预训练权重的 Grounding Dino 模型,可直接使用。它可用于输入视频和图像进行处理。 作为 JPS 一部分分发的 Docker 容器包含 来自 NGC 的 TAO 预训练 Grounding DINO 模型

运行 GDINO#

  1. 拉取并启动容器

    $ sudo docker pull nvcr.io/nvidia/jps/jps-gdino:ds7.1-public-12-11-1
    $ sudo docker run -itd --runtime nvidia --network host nvcr.io/nvidia/jps/jps-gdino:ds7.1-public-12-11-1
    

请注意,默认情况下,容器使用端口 8000。如果端口已被其他程序占用,容器将抛出错误。 您可以通过将 -e SERVER_PORT=8025 标志添加到上述 docker run 命令来手动指定不同的端口,将 8025 更改为您想要的端口值。

您可能还希望使用 -v docker run 标志在容器中 /ds_microservices/output 文件夹中挂载目录,以便您可以轻松访问输出视频和图像。

  1. 查看容器日志以确定服务何时完全启动。 当您看到类似于下面打印输出的内容时,即表示服务已完全启动。 由于引擎文件包含在容器中,因此这应该相当快(少于 30 秒)。 您最初可能会看到一些“Failed to connect”错误,但一旦容器内的 Triton 服务器实例启动并可访问,这些错误应该会消失。

    }Starting inference server
    INFO:     Started server process [627]
    INFO:     Waiting for application startup.
    INFO:     Application startup complete.
    INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
    
  2. 向服务器发送一些示例视频/图像。

    如果使用图像

    $ curl -X POST "https://127.0.0.1:8000/files" -H  "Content-Type: multipart/form-data" -F purpose="vision" -F media_type="image" -F "file=@image.jpg"
    

    或者如果使用视频

    $ curl -X POST "https://127.0.0.1:8000/files" -H  "Content-Type: multipart/form-data" -F purpose="vision" -F media_type="video" -F "file=@MOJD2.mp4"
    

    文件参数应指向 Jetson 上的路径(相对于当前目录),而不是容器中的路径。

  3. 来自上面的 curl 请求将返回一个 ID。 需要将此 ID 添加到下面的 payload 中,以便请求对输入图像/视频进行分析。

    创建一个具有以下内容的 JSON 文件,将 {asset_id} 替换为之前的 ID,并将 prompt 替换为您要传入的任何提示。 您可能还需要调整 threshold 值,具体取决于您的输入和提示,以便正确检测到所需对象。

    {
        "model": "Grounding-Dino",
        "messages": [
            {
                "role": "user",
                "content": [
                    {
                        "type": "text",
                        "text": "prompt"
                    },
                    {
                        "type": "media_url",
                        "media_url": {
                            "url": "data:image/jpeg;asset_id,{asset_id}"
                        }
                    }
                ]
            }
        ],
        "threshold": 0.35
    }
    

    然后可以发出 curl 请求来请求分析。 确保更新端口(如果您在步骤 1 中更改了端口),并将 input.JSON 更改为您创建的 JSON 文件的路径/名称

    $ curl -X POST https://127.0.0.1:8000/inference -H "Content-Type: application/json" -d @input.json
    

    这会将检测到的边界框输出到控制台,并将叠加图像输出到容器中的 /ds_microservices/output/<id>/out1.jpg (如果使用视频,则为 /ds_microservices/output/<id>/out1.mp4 )。 API 请求还将返回检测数组。

GDINO 性能和示例结果#

性能#

性能将因所用设备、提示和输入流分辨率而异。 作为参考,在 AGX Orin 上,使用提示“car, bike, person, bus”的 1080p 示例视频能够以大约 11.8fps 的速度进行处理。

示例结果#

以下是使用图像输入的一些示例输出结果

提示:“car, bike”

../_images/gdino-car-bike.jpg

提示:“red car”

../_images/gdino-redcar.jpg

提示:“person next to bike”

../_images/gdino-next-bike.jpg