Понимание изображения

Модели Gemini могут обрабатывать изображения, позволяя многим передовым разработчикам использовать сценарии, которые исторически требовали бы моделей, специфичных для домена. Некоторые из возможностей Gemini в области зрения включают способность:

  • Подписывайте изображения и отвечайте на вопросы об изображениях
  • Транскрибируйте и анализируйте PDF-файлы, включая до 2 миллионов токенов
  • Обнаружение объектов на изображении и возврат координат ограничивающей рамки для них
  • Сегментация объектов на изображении

Gemini изначально создавался как мультимодальный, и мы продолжаем расширять границы возможного. В этом руководстве показано, как использовать API Gemini для генерации текстовых ответов на основе входных данных изображений и выполнения общих задач по распознаванию изображений.

Ввод изображения

Вы можете предоставить изображения в качестве входных данных для Gemini следующими способами:

  • Загрузите файл изображения с помощью API File перед выполнением запроса на generateContent . Используйте этот метод для файлов размером более 20 МБ или когда вы хотите повторно использовать файл в нескольких запросах.
  • Передайте встроенные данные изображения с запросом generateContent . Используйте этот метод для небольших файлов (<20 МБ общего размера запроса) или изображений, полученных напрямую с URL-адресов.

Загрузить файл изображения

Вы можете использовать API файлов для загрузки файла изображения. Всегда используйте API файлов, если общий размер запроса (включая файл, текстовую подсказку, системные инструкции и т. д.) превышает 20 МБ или если вы собираетесь использовать одно и то же изображение в нескольких подсказках.

Следующий код загружает файл изображения, а затем использует его в вызове generateContent .

Питон

from google import genai

client = genai.Client(api_key="GOOGLE_API_KEY")

my_file = client.files.upload(file="path/to/sample.jpg")

response = client.models.generate_content(
    model="gemini-2.0-flash",
    contents=[my_file, "Caption this image."],
)

print(response.text)

JavaScript

import {
  GoogleGenAI,
  createUserContent,
  createPartFromUri,
} from "@google/genai";

const ai = new GoogleGenAI({ apiKey: "GOOGLE_API_KEY" });

async function main() {
  const myfile = await ai.files.upload({
    file: "path/to/sample.jpg",
    config: { mimeType: "image/jpeg" },
  });

  const response = await ai.models.generateContent({
    model: "gemini-2.0-flash",
    contents: createUserContent([
      createPartFromUri(myfile.uri, myfile.mimeType),
      "Caption this image.",
    ]),
  });
  console.log(response.text);
}

await main();

Идти

package main

import (
  "context"
  "fmt"
  "os"
  "google.golang.org/genai"
)

func main() {
  ctx := context.Background()
  client, _ := genai.NewClient(ctx, &genai.ClientConfig{
    APIKey:  os.Getenv("GOOGLE_API_KEY"),
    Backend: genai.BackendGeminiAPI,
  })

  uploadedFile, _ := client.Files.UploadFromPath(ctx, "path/to/sample.jpg", nil)

  parts := []*genai.Part{
      genai.NewPartFromText("Caption this image."),
      genai.NewPartFromURI(uploadedFile.URI, uploadedFile.MIMEType),
  }

  contents := []*genai.Content{
      genai.NewContentFromParts(parts, genai.RoleUser),
  }

  result, _ := client.Models.GenerateContent(
      ctx,
      "gemini-2.0-flash",
      contents,
      nil,
  )

  fmt.Println(result.Text())
}

ОТДЫХ

IMAGE_PATH="path/to/sample.jpg"
MIME_TYPE=$(file -b --mime-type "${IMAGE_PATH}")
NUM_BYTES=$(wc -c < "${IMAGE_PATH}")
DISPLAY_NAME=IMAGE

tmp_header_file=upload-header.tmp

# Initial resumable request defining metadata.
# The upload url is in the response headers dump them to a file.
curl "https://generativelanguage.googleapis.com/upload/v1beta/files?key=${GOOGLE_API_KEY}" \
  -D upload-header.tmp \
  -H "X-Goog-Upload-Protocol: resumable" \
  -H "X-Goog-Upload-Command: start" \
  -H "X-Goog-Upload-Header-Content-Length: ${NUM_BYTES}" \
  -H "X-Goog-Upload-Header-Content-Type: ${MIME_TYPE}" \
  -H "Content-Type: application/json" \
  -d "{'file': {'display_name': '${DISPLAY_NAME}'}}" 2> /dev/null

upload_url=$(grep -i "x-goog-upload-url: " "${tmp_header_file}" | cut -d" " -f2 | tr -d "\r")
rm "${tmp_header_file}"

# Upload the actual bytes.
curl "${upload_url}" \
  -H "Content-Length: ${NUM_BYTES}" \
  -H "X-Goog-Upload-Offset: 0" \
  -H "X-Goog-Upload-Command: upload, finalize" \
  --data-binary "@${IMAGE_PATH}" 2> /dev/null > file_info.json

file_uri=$(jq -r ".file.uri" file_info.json)
echo file_uri=$file_uri

# Now generate content using that file
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GOOGLE_API_KEY" \
    -H 'Content-Type: application/json' \
    -X POST \
    -d '{
      "contents": [{
        "parts":[
          {"file_data":{"mime_type": "'"${MIME_TYPE}"'", "file_uri": "'"${file_uri}"'"}},
          {"text": "Caption this image."}]
        }]
      }' 2> /dev/null > response.json

cat response.json
echo

jq ".candidates[].content.parts[].text" response.json

Дополнительную информацию о работе с медиафайлами см. в разделе Files API .

Передача данных изображения в строку

Вместо загрузки файла изображения вы можете передать встроенные данные изображения в запросе generateContent . Это подходит для небольших изображений (общий размер запроса менее 20 МБ) или изображений, полученных напрямую с URL-адресов.

Вы можете предоставить данные изображения в виде строк, закодированных в Base64, или путем прямого чтения локальных файлов (в зависимости от SDK).

Локальный файл изображения:

Питон

  from google.genai import types

  with open('path/to/small-sample.jpg', 'rb') as f:
      image_bytes = f.read()

  response = client.models.generate_content(
    model='gemini-2.0-flash',
    contents=[
      types.Part.from_bytes(
        data=image_bytes,
        mime_type='image/jpeg',
      ),
      'Caption this image.'
    ]
  )

  print(response.text)

JavaScript

import { GoogleGenAI } from "@google/genai";
import * as fs from "node:fs";

const ai = new GoogleGenAI({ apiKey: "GOOGLE_API_KEY" });
const base64ImageFile = fs.readFileSync("path/to/small-sample.jpg", {
  encoding: "base64",
});

const contents = [
  {
    inlineData: {
      mimeType: "image/jpeg",
      data: base64ImageFile,
    },
  },
  { text: "Caption this image." },
];

const response = await ai.models.generateContent({
  model: "gemini-2.0-flash",
  contents: contents,
});
console.log(response.text);

Идти

bytes, _ := os.ReadFile("path/to/small-sample.jpg")

parts := []*genai.Part{
  genai.NewPartFromBytes(bytes, "image/jpeg"),
  genai.NewPartFromText("Caption this image."),
}

contents := []*genai.Content{
  genai.NewContentFromParts(parts, genai.RoleUser),
}

result, _ := client.Models.GenerateContent(
  ctx,
  "gemini-2.0-flash",
  contents,
  nil,
)

fmt.Println(result.Text())

ОТДЫХ

IMG_PATH=/path/to/your/image1.jpg

if [[ "$(base64 --version 2>&1)" = *"FreeBSD"* ]]; then
B64FLAGS="--input"
else
B64FLAGS="-w0"
fi

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GOOGLE_API_KEY" \
-H 'Content-Type: application/json' \
-X POST \
-d '{
    "contents": [{
    "parts":[
        {
            "inline_data": {
            "mime_type":"image/jpeg",
            "data": "'"$(base64 $B64FLAGS $IMG_PATH)"'"
            }
        },
        {"text": "Caption this image."},
    ]
    }]
}' 2> /dev/null

Изображение с URL-адреса:

Питон

from google import genai
from google.genai import types

import requests

image_path = "https://goo.gle/instrument-img"
image_bytes = requests.get(image_path).content
image = types.Part.from_bytes(
  data=image_bytes, mime_type="image/jpeg"
)

client = genai.Client(api_key="GOOGLE_API_KEY")
response = client.models.generate_content(
    model="gemini-2.0-flash-exp",
    contents=["What is this image?", image],
)

print(response.text)

JavaScript

import { GoogleGenAI } from "@google/genai";

async function main() {
  const ai = new GoogleGenAI({ apiKey: process.env.GOOGLE_API_KEY });

  const imageUrl = "https://goo.gle/instrument-img";

  const response = await fetch(imageUrl);
  const imageArrayBuffer = await response.arrayBuffer();
  const base64ImageData = Buffer.from(imageArrayBuffer).toString('base64');

  const result = await ai.models.generateContent({
    model: "gemini-2.0-flash",
    contents: [
    {
      inlineData: {
        mimeType: 'image/jpeg',
        data: base64ImageData,
      },
    },
    { text: "Caption this image." }
  ],
  });
  console.log(result.text);
}

main();

Идти

package main

import (
  "context"
  "fmt"
  "os"
  "io"
  "net/http"
  "google.golang.org/genai"
)

func main() {
  ctx := context.Background()
  client, _ := genai.NewClient(ctx, &genai.ClientConfig{
      APIKey:  os.Getenv("GOOGLE_API_KEY"),
      Backend: genai.BackendGeminiAPI,
  })

  // Download the image.
  imageResp, _ := http.Get("https://goo.gle/instrument-img")

  imageBytes, _ := io.ReadAll(imageResp.Body)

  parts := []*genai.Part{
    genai.NewPartFromBytes(imageBytes, "image/jpeg"),
    genai.NewPartFromText("Caption this image."),
  }

  contents := []*genai.Content{
    genai.NewContentFromParts(parts, genai.RoleUser),
  }

  result, _ := client.Models.GenerateContent(
    ctx,
    "gemini-2.0-flash",
    contents,
    nil,
  )

  fmt.Println(result.Text())
}

ОТДЫХ

IMG_URL="https://goo.gle/instrument-img"

MIME_TYPE=$(curl -sIL "$IMG_URL" | grep -i '^content-type:' | awk -F ': ' '{print $2}' | sed 's/\r$//' | head -n 1)
if [[ -z "$MIME_TYPE" || ! "$MIME_TYPE" == image/* ]]; then
  MIME_TYPE="image/jpeg"
fi

# Check for macOS
if [[ "$(uname)" == "Darwin" ]]; then
  IMAGE_B64=$(curl -sL "$IMG_URL" | base64 -b 0)
elif [[ "$(base64 --version 2>&1)" = *"FreeBSD"* ]]; then
  IMAGE_B64=$(curl -sL "$IMG_URL" | base64)
else
  IMAGE_B64=$(curl -sL "$IMG_URL" | base64 -w0)
fi

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GEMINI_API_KEY" \
    -H 'Content-Type: application/json' \
    -X POST \
    -d '{
      "contents": [{
        "parts":[
            {
              "inline_data": {
                "mime_type":"'"$MIME_TYPE"'",
                "data": "'"$IMAGE_B64"'"
              }
            },
            {"text": "Caption this image."}
        ]
      }]
    }' 2> /dev/null

Несколько вещей, которые следует иметь в виду относительно встроенных данных изображений:

  • Максимальный общий размер запроса составляет 20 МБ, включая текстовые подсказки, системные инструкции и все файлы, предоставленные в строке. Если размер вашего файла приведет к тому, что общий размер запроса превысит 20 МБ, используйте API файлов, чтобы загрузить файл изображения для использования в запросе.
  • Если вы используете образец изображения несколько раз, эффективнее загрузить файл изображения с помощью API файлов.

Подсказка с несколькими изображениями

Вы можете предоставить несколько изображений в одном запросе, включив несколько объектов image Part в массив contents . Это может быть смесь встроенных данных (локальные файлы или URL-адреса) и ссылок File API.

Питон

from google import genai
from google.genai import types

client = genai.Client(api_key="GOOGLE_API_KEY")

# Upload the first image
image1_path = "path/to/image1.jpg"
uploaded_file = client.files.upload(file=image1_path)

# Prepare the second image as inline data
image2_path = "path/to/image2.png"
with open(image2_path, 'rb') as f:
    img2_bytes = f.read()

# Create the prompt with text and multiple images
response = client.models.generate_content(
    model="gemini-2.0-flash",
    contents=[
        "What is different between these two images?",
        uploaded_file,  # Use the uploaded file reference
        types.Part.from_bytes(
            data=img2_bytes,
            mime_type='image/png'
        )
    ]
)

print(response.text)

JavaScript

import {
  GoogleGenAI,
  createUserContent,
  createPartFromUri,
} from "@google/genai";
import * as fs from "node:fs";

const ai = new GoogleGenAI({ apiKey: "GOOGLE_API_KEY" });

async function main() {
  // Upload the first image
  const image1_path = "path/to/image1.jpg";
  const uploadedFile = await ai.files.upload({
    file: image1_path,
    config: { mimeType: "image/jpeg" },
  });

  // Prepare the second image as inline data
  const image2_path = "path/to/image2.png";
  const base64Image2File = fs.readFileSync(image2_path, {
    encoding: "base64",
  });

  // Create the prompt with text and multiple images
  const response = await ai.models.generateContent({
    model: "gemini-2.0-flash",
    contents: createUserContent([
      "What is different between these two images?",
      createPartFromUri(uploadedFile.uri, uploadedFile.mimeType),
      {
        inlineData: {
          mimeType: "image/png",
          data: base64Image2File,
        },
      },
    ]),
  });
  console.log(response.text);
}

await main();

Идти

// Upload the first image
image1Path := "path/to/image1.jpg"
uploadedFile, _ := client.Files.UploadFromPath(ctx, image1Path, nil)

// Prepare the second image as inline data
image2Path := "path/to/image2.jpeg"
imgBytes, _ := os.ReadFile(image2Path)

parts := []*genai.Part{
  genai.NewPartFromText("What is different between these two images?"),
  genai.NewPartFromBytes(imgBytes, "image/jpeg"),
  genai.NewPartFromURI(uploadedFile.URI, uploadedFile.MIMEType),
}

contents := []*genai.Content{
  genai.NewContentFromParts(parts, genai.RoleUser),
}

result, _ := client.Models.GenerateContent(
  ctx,
  "gemini-2.0-flash",
  contents,
  nil,
)

fmt.Println(result.Text())

ОТДЫХ

# Upload the first image
IMAGE1_PATH="path/to/image1.jpg"
MIME1_TYPE=$(file -b --mime-type "${IMAGE1_PATH}")
NUM1_BYTES=$(wc -c < "${IMAGE1_PATH}")
DISPLAY_NAME1=IMAGE1

tmp_header_file1=upload-header1.tmp

curl "https://generativelanguage.googleapis.com/upload/v1beta/files?key=${GOOGLE_API_KEY}" \
  -D upload-header1.tmp \
  -H "X-Goog-Upload-Protocol: resumable" \
  -H "X-Goog-Upload-Command: start" \
  -H "X-Goog-Upload-Header-Content-Length: ${NUM1_BYTES}" \
  -H "X-Goog-Upload-Header-Content-Type: ${MIME1_TYPE}" \
  -H "Content-Type: application/json" \
  -d "{'file': {'display_name': '${DISPLAY_NAME1}'}}" 2> /dev/null

upload_url1=$(grep -i "x-goog-upload-url: " "${tmp_header_file1}" | cut -d" " -f2 | tr -d "\r")
rm "${tmp_header_file1}"

curl "${upload_url1}" \
  -H "Content-Length: ${NUM1_BYTES}" \
  -H "X-Goog-Upload-Offset: 0" \
  -H "X-Goog-Upload-Command: upload, finalize" \
  --data-binary "@${IMAGE1_PATH}" 2> /dev/null > file_info1.json

file1_uri=$(jq ".file.uri" file_info1.json)
echo file1_uri=$file1_uri

# Prepare the second image (inline)
IMAGE2_PATH="path/to/image2.png"
MIME2_TYPE=$(file -b --mime-type "${IMAGE2_PATH}")

if [[ "$(base64 --version 2>&1)" = *"FreeBSD"* ]]; then
  B64FLAGS="--input"
else
  B64FLAGS="-w0"
fi
IMAGE2_BASE64=$(base64 $B64FLAGS $IMAGE2_PATH)

# Now generate content using both images
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GOOGLE_API_KEY" \
    -H 'Content-Type: application/json' \
    -X POST \
    -d '{
      "contents": [{
        "parts":[
          {"text": "What is different between these two images?"},
          {"file_data":{"mime_type": "'"${MIME1_TYPE}"'", "file_uri": '$file1_uri'}},
          {
            "inline_data": {
              "mime_type":"'"${MIME2_TYPE}"'",
              "data": "'"$IMAGE2_BASE64"'"
            }
          }
        ]
      }]
    }' 2> /dev/null > response.json

cat response.json
echo

jq ".candidates[].content.parts[].text" response.json

Получить ограничивающую рамку для объекта

Модели Gemini обучены определять объекты на изображении и предоставлять координаты их ограничивающего прямоугольника. Координаты возвращаются относительно размеров изображения, масштабированных до [0, 1000]. Вам необходимо изменить масштаб этих координат на основе исходного размера изображения.

Питон

prompt = "Detect the all of the prominent items in the image. The box_2d should be [ymin, xmin, ymax, xmax] normalized to 0-1000."

JavaScript

const prompt = "Detect the all of the prominent items in the image. The box_2d should be [ymin, xmin, ymax, xmax] normalized to 0-1000.";

Идти

prompt := []*genai.Part{
    genai.NewPartFromURI(sampleImage.URI, sampleImage.MIMEType),
    genai.NewPartFromText(`Detect the all of the prominent items in the image. The box_2d should be [ymin, xmin, ymax, xmax] normalized to 0-1000.`),
}

ОТДЫХ

PROMPT="Detect the all of the prominent items in the image. The box_2d should be [ymin, xmin, ymax, xmax] normalized to 0-1000."

Вы можете использовать ограничивающие рамки для обнаружения и локализации объектов на изображениях и видео. Точно идентифицируя и очерчивая объекты с помощью ограничивающих рамок, вы можете разблокировать широкий спектр приложений и повысить интеллектуальность своих проектов.

Основные преимущества

  • Простота: легко интегрируйте возможности обнаружения объектов в свои приложения, независимо от вашего опыта в области компьютерного зрения.
  • Возможность настройки: создание ограничивающих рамок на основе пользовательских инструкций (например, «Я хочу видеть ограничивающие рамки всех зеленых объектов на этом изображении») без необходимости обучения пользовательской модели.

Технические подробности

  • Ввод: Ваша подсказка и связанные с ней изображения или видеокадры.
  • Вывод: Ограничивающие рамки в формате [y_min, x_min, y_max, x_max] . Верхний левый угол является началом координат. Оси x и y идут горизонтально и вертикально соответственно. Значения координат нормализуются до 0-1000 для каждого изображения.
  • Визуализация: пользователи AI Studio увидят ограничивающие рамки, нанесенные на график в пользовательском интерфейсе.

Разработчикам Python стоит попробовать блокнот для понимания 2D-пространственной среды или экспериментальный блокнот для 3D-указания .

Нормализовать координаты

Модель возвращает координаты ограничивающего прямоугольника в формате [y_min, x_min, y_max, x_max] . Чтобы преобразовать эти нормализованные координаты в пиксельные координаты исходного изображения, выполните следующие действия:

  1. Разделите каждую выходную координату на 1000.
  2. Умножьте координаты x на исходную ширину изображения.
  3. Умножьте координаты Y на исходную высоту изображения.

Чтобы изучить более подробные примеры создания координат ограничивающей рамки и их визуализации на изображениях, ознакомьтесь с примером из книги «Обнаружение объектов» .

Сегментация изображения

Начиная с моделей Gemini 2.5, модели Gemini обучаются не только обнаруживать предметы, но и сегментировать их и создавать маску их контуров.

Модель предсказывает список JSON, где каждый элемент представляет собой маску сегментации. Каждый элемент имеет ограничивающий прямоугольник (" box_2d ") в формате [y0, x0, y1, x1] с нормализованными координатами от 0 до 1000, метку (" label "), которая идентифицирует объект, и, наконец, маску сегментации внутри ограничивающего прямоугольника в виде png-файла в кодировке base64, который представляет собой карту вероятности со значениями от 0 до 255. Маску необходимо изменить в соответствии с размерами ограничивающего прямоугольника, а затем бинаризировать на вашем пороге уверенности (127 для средней точки).

Питон

prompt = """
  Give the segmentation masks for the wooden and glass items.
  Output a JSON list of segmentation masks where each entry contains the 2D
  bounding box in the key "box_2d", the segmentation mask in key "mask", and
  the text label in the key "label". Use descriptive labels.
"""

JavaScript

const prompt = `
  Give the segmentation masks for the wooden and glass items.
  Output a JSON list of segmentation masks where each entry contains the 2D
  bounding box in the key "box_2d", the segmentation mask in key "mask", and
  the text label in the key "label". Use descriptive labels.
`;    

Идти

prompt := []*genai.Part{
    genai.NewPartFromURI(sampleImage.URI, sampleImage.MIMEType),
    genai.NewPartFromText(`
      Give the segmentation masks for the wooden and glass items.
      Output a JSON list of segmentation masks where each entry contains the 2D
      bounding box in the key "box_2d", the segmentation mask in key "mask", and
      the text label in the key "label". Use descriptive labels.
    `),
}

ОТДЫХ

PROMPT='''
  Give the segmentation masks for the wooden and glass items.
  Output a JSON list of segmentation masks where each entry contains the 2D
  bounding box in the key "box_2d", the segmentation mask in key "mask", and
  the text label in the key "label". Use descriptive labels.
'''
Стол с кексами, на котором акцентированы деревянные и стеклянные предметы.
Маска деревянных и стеклянных предметов, обнаруженных на фотографии

Более подробный пример сегментации можно найти в руководстве по кулинарной книге.

Поддерживаемые форматы изображений

Gemini поддерживает следующие типы MIME-форматов изображений:

  • PNG - image/png
  • JPEG - image/jpeg
  • WEBP - image/webp
  • HEIC - image/heic
  • HEIF - image/heif

Технические подробности об изображениях

  • Ограничение на количество файлов : Gemini 2.5 Pro, 2.0 Flash, 1.5 Pro и 1.5 Flash поддерживают максимум 3600 файлов изображений на один запрос.
  • Расчет токенов :
    • Gemini 1.5 Flash и Gemini 1.5 Pro : 258 токенов, если оба размера <= 384 пикселей. Более крупные изображения размещаются плитками (минимальный размер плитки 256 пикселей, максимальный 768 пикселей, размер изменен до 768x768), каждая плитка стоит 258 токенов.
    • Gemini 2.0 Flash и Gemini 2.5 Flash/Pro : 258 токенов, если оба размера <= 384 пикселей. Более крупные изображения объединяются в плитки размером 768x768 пикселей, каждая из которых стоит 258 токенов.
  • Лучшие практики :
    • Убедитесь, что изображения правильно повернуты.
    • Используйте четкие, неразмытые изображения.
    • При использовании одного изображения с текстом поместите текстовую подсказку после части изображения в массиве contents .

Что дальше?

В этом руководстве показано, как загружать файлы изображений и генерировать текстовые выходные данные из входных изображений. Чтобы узнать больше, см. следующие ресурсы:

  • Системные инструкции : Системные инструкции позволяют вам управлять поведением модели в зависимости от ваших конкретных потребностей и вариантов использования.
  • Понимание видео : узнайте, как работать с видеовходами.
  • API файлов : узнайте больше о загрузке и управлении файлами для использования с Gemini.
  • Стратегии подсказок файлов : API Gemini поддерживает подсказки с текстом, изображениями, аудио- и видеоданными, также известные как мультимодальные подсказки.
  • Руководство по безопасности : Иногда генеративные модели ИИ выдают неожиданные результаты, например, неточные, предвзятые или оскорбительные. Постобработка и человеческая оценка имеют важное значение для ограничения риска вреда от таких результатов.