Gemini modelleri, geçmişte alana özgü modeller gerektiren birçok yenilikçi geliştirici kullanım alanını etkinleştirerek resimleri işleyebilir. Gemini'nin görüntüleme özelliklerinden bazıları şunlardır:
- Görsellere altyazı ekleme ve görsellerle ilgili soruları yanıtlama
- 2 milyon jetona kadar olan PDF'leri metne dönüştürme ve bunlarla ilgili çıkarım yapma
- Bir resimdeki nesneleri algılayıp bu nesnelerin sınırlayıcı kutu koordinatlarını döndürme
- Resimdeki nesneleri segmentlere ayırma
Gemini, sıfırdan çok formatlı olacak şekilde tasarlandı ve yapabileceklerimizin sınırlarını zorlamaya devam ediyoruz. Bu kılavuzda, resim girişlerine göre metin yanıtları oluşturmak ve yaygın görüntü anlama görevlerini gerçekleştirmek için Gemini API'nin nasıl kullanılacağı gösterilmektedir.
Başlamadan önce
Gemini API'yi çağırmadan önce seçtiğiniz SDK'nın yüklü olduğundan ve Gemini API anahtarının yapılandırılmış ve kullanıma hazır olduğundan emin olun.
Resim girişi
Gemini'ye resimleri aşağıdaki şekillerde gönderebilirsiniz:
generateContent
isteğinde bulunmadan önce File API'yi kullanarak bir resim dosyası yükleyin. 20 MB'tan büyük dosyalar veya dosyayı birden fazla istekte yeniden kullanmak istediğinizde bu yöntemi kullanın.generateContent
isteğiyle satır içi resim verilerini iletin. Bu yöntemi, daha küçük dosyalar (<20 MB toplam istek boyutu) veya doğrudan URL'lerden alınan resimler için kullanın.
Resim dosyası yükleme
Resim dosyası yüklemek için Files API'yi kullanabilirsiniz. Toplam istek boyutu (dosya, metin istemi, sistem talimatları vb. dahil) 20 MB'tan büyükse veya aynı resmi birden fazla istemde kullanmayı planlıyorsanız her zaman Files API'yi kullanın.
Aşağıdaki kod, bir resim dosyası yükler ve ardından dosyayı generateContent
çağrısında kullanır.
from google import genai
client = genai.Client(api_key="GOOGLE_API_KEY")
myfile = client.files.upload(file="path/to/sample.jpg")
response = client.models.generate_content(
model="gemini-2.0-flash",
contents=[myfile, "Caption this image."])
print(response.text)
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();
file, err := client.UploadFileFromPath(ctx, "path/to/sample.jpg", nil)
if err != nil {
log.Fatal(err)
}
defer client.DeleteFile(ctx, file.Name)
model := client.GenerativeModel("gemini-2.0-flash")
resp, err := model.GenerateContent(ctx,
genai.FileData{URI: file.URI},
genai.Text("Caption this image."))
if err != nil {
log.Fatal(err)
}
printResponse(resp)
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 ".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
Medya dosyalarıyla çalışma hakkında daha fazla bilgi edinmek için Files API başlıklı makaleyi inceleyin.
Resim verilerini satır içi olarak iletin
Resim dosyası yüklemek yerine, istekteki satır içi resim verilerini generateContent
'e iletebilirsiniz. Bu yöntem, daha küçük resimler (toplam istek boyutu 20 MB'tan az) veya doğrudan URL'lerden alınan resimler için uygundur.
Görüntü verilerini Base64 olarak kodlanmış dizeler olarak veya yerel dosyaları doğrudan okuyarak (SDK'ya bağlı olarak) sağlayabilirsiniz.
Yerel resim dosyası:
from google.genai import types
with open('path/to/small-sample.jpg', 'rb') as f:
img_bytes = f.read()
response = client.models.generate_content(
model='gemini-2.0-flash',
contents=[
types.Part.from_bytes(
data=img_bytes,
mime_type='image/jpeg',
),
'Caption this image.'
]
)
print(response.text)
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);
model := client.GenerativeModel("gemini-2.0-flash")
bytes, err := os.ReadFile("path/to/small-sample.jpg")
if err != nil {
log.Fatal(err)
}
prompt := []genai.Part{
genai.Blob{MIMEType: "image/jpeg", Data: bytes},
genai.Text("Caption this image."),
}
resp, err := model.GenerateContent(ctx, prompt...)
if err != nil {
log.Fatal(err)
}
for _, c := range resp.Candidates {
if c.Content != nil {
fmt.Println(*c.Content)
}
}
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'den resim:
from google import genai
from google.genai import types
import requests
image_path = "https://goo.gle/instrument-img"
image = requests.get(image_path)
client = genai.Client(api_key="GOOGLE_API_KEY")
response = client.models.generate_content(
model="gemini-2.0-flash-exp",
contents=["What is this image?",
types.Part.from_bytes(data=image.content, mime_type="image/jpeg")])
print(response.text)
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();
func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, option.WithAPIKey(os.Getenv("GOOGLE_API_KEY")))
if err != nil {
log.Fatal(err)
}
defer client.Close()
model := client.GenerativeModel("gemini-2.0-flash")
// Download the image.
imageResp, err := http.Get("https://goo.gle/instrument-img")
if err != nil {
panic(err)
}
defer imageResp.Body.Close()
imageBytes, err := io.ReadAll(imageResp.Body)
if err != nil {
panic(err)
}
// Create the request.
req := []genai.Part{
genai.ImageData("jpeg", imageBytes),
genai.Text("Caption this image."),
}
// Generate content.
resp, err := model.GenerateContent(ctx, req...)
if err != nil {
panic(err)
}
// Handle the response of generated text.
for _, c := range resp.Candidates {
if c.Content != nil {
fmt.Println(*c.Content)
}
}
}
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
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":"'"$MIME_TYPE"'",
"data": "'$(curl -sL "$IMG_URL" | base64 $B64FLAGS)'"
}
},
{"text": "Caption this image."}
]
}]
}' 2> /dev/null
Satır içi resim verileriyle ilgili göz önünde bulundurulması gereken birkaç nokta:
- Maksimum toplam istek boyutu 20 MB'tır. Bu boyut, metin istemlerini, sistem talimatlarını ve satır içi olarak sağlanan tüm dosyaları içerir. Dosyanızın boyutu toplam istek boyutunu 20 MB'ı aşacaksa istekte kullanılacak bir resim dosyası yüklemek için Files API'yi kullanın.
- Bir resim örneğini birden fazla kez kullanıyorsanız File API'yi kullanarak resim dosyası yüklemek daha verimlidir.
Birden fazla resimle istem verme
contents
dizisine birden fazla resim Part
nesnesi ekleyerek tek bir istemde birden fazla resim sağlayabilirsiniz. Bunlar satır içi verilerin (yerel dosyalar veya URL'ler) ve File API referanslarının bir karışımı olabilir.
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)
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, err := client.UploadFileFromPath(ctx, image1Path, nil)
if err != nil {
log.Fatal(err)
}
defer client.DeleteFile(ctx, uploadedFile.Name)
// Prepare the second image as inline data
image2Path := "path/to/image2.png"
img2Bytes, err := os.ReadFile(image2Path)
if err != nil {
log.Fatal(err)
}
// Create the prompt with text and multiple images
model := client.GenerativeModel("gemini-2.0-flash")
prompt := []genai.Part{
genai.Text("What is different between these two images?"),
genai.FileData{URI: uploadedFile.URI},
genai.Blob{MIMEType: "image/png", Data: img2Bytes},
}
resp, err := model.GenerateContent(ctx, prompt...)
if err != nil {
log.Fatal(err)
}
printResponse(resp)
# 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
Bir nesne için sınırlayıcı kutu alma
Gemini modelleri, görüntüdeki nesneleri tanımlamak ve sınırlayıcı kutu koordinatlarını sağlamak için eğitilir. Koordinatlar, görüntü boyutlarına göre döndürülür ve [0, 1000] ölçeğine göre ayarlanır. Bu koordinatların ölçeğini orijinal resim boyutunuza göre küçültmeniz gerekir.
prompt = "Detect the all of the prominent items in the image. The box_2d should be [ymin, xmin, ymax, xmax] normalized to 0-1000."
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.FileData{URI: sampleImage.URI},
genai.Text("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."
Görüntü ve videolarda nesne algılama ve yerelleştirme için sınırlayıcı kutuları kullanabilirsiniz. Nesneleri sınır kutularıyla doğru şekilde tanımlayıp sınırlandırarak çok çeşitli uygulamalardan yararlanabilir ve projelerinizin zekasını artırabilirsiniz.
Temel avantajlar
- Basit: Bilgisayar görüşü uzmanlığınızdan bağımsız olarak nesne algılama özelliklerini uygulamalarınıza kolayca entegre edin.
- Özelleştirilebilir: Özel bir model eğitmeniz gerekmeden özel talimatlara (ör. "Bu resimdeki tüm yeşil nesnelerin sınırlayıcı kutularını görmek istiyorum") göre sınırlayıcı kutular oluşturun.
Teknik ayrıntılar
- Giriş: İsteminiz ve ilişkili resimler veya video kareleri.
- Çıkış:
[y_min, x_min, y_max, x_max]
biçiminde sınırlayıcı kutular. Başlangıç noktası sol üst köşedir.x
vey
ekseni sırasıyla yatay ve dikey olarak gider. Koordinat değerleri her resim için 0-1000 olarak normalleştirilir. - Görselleştirme: AI Studio kullanıcıları, kullanıcı arayüzünde sınır kutularının çizildiğini görür.
Python geliştiricileri 2D uzamsal anlama not defterini veya deneysel 3D işaretleme not defterini deneyebilir.
Koordinatları normalleştirme
Model, [y_min, x_min, y_max, x_max]
biçiminde sınırlayıcı kutu koordinatlarını döndürür. Bu normalleştirilmiş koordinatları orijinal resminizin piksel koordinatlarına dönüştürmek için aşağıdaki adımları uygulayın:
- Her çıkış koordinatını 1.000'e bölün.
- X koordinatlarını orijinal resim genişliğiyle çarpın.
- Y koordinatlarını orijinal resim yüksekliğiyle çarpın.
Sınırlayıcı kutu koordinatları oluşturma ve bunları resimlerde görselleştirmeyle ilgili daha ayrıntılı örnekleri incelemek için Nesne Algılama yemek kitabı örneğini inceleyin.
Görüntü segmentasyonu
Gemini 2.5 modellerinden itibaren Gemini modelleri, yalnızca öğeleri algılamakla kalmayıp öğeleri segmentlere ayırmak ve dış hatlarının maskesini sağlamak için eğitilir.
Model, her öğenin bir segmentasyon maskesini temsil ettiği bir JSON listesi tahmin eder.
Her öğenin 0 ile 1000 arasında normalleştirilmiş koordinatlara sahip [y0, x0, y1, x1]
biçiminde bir sınırlayıcı kutusu ("box_2d
"), nesneyi tanımlayan bir etiket ("label
") ve son olarak, 0 ile 255 arasında değerlere sahip bir olasılık haritası olan base64 kodlu png olarak sınırlayıcı kutunun içindeki segmentasyon maskesi vardır.
Maskenin, sınırlayıcı kutu boyutlarıyla eşleşecek şekilde yeniden boyutlandırılması ve ardından güven eşiğinize göre (orta nokta için 127) ikili kodlanması gerekir.
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.
"""
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.FileData{URI: sampleImage.URI},
genai.Text(`
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.
'''

Daha ayrıntılı bir örnek için yemek tarifi kılavuzundaki segmentasyon örneğine göz atın.
Desteklenen görsel biçimleri
Gemini, aşağıdaki resim biçimi MIME türlerini destekler:
- PNG -
image/png
- JPEG -
image/jpeg
- WEBP -
image/webp
- HEIC -
image/heic
- HEIF -
image/heif
Resimlerle ilgili teknik ayrıntılar
- Dosya sınırı: Gemini 2.5 Pro, 2.0 Flash, 1.5 Pro ve 1.5 Flash, istek başına en fazla 3.600 resim dosyası destekler.
- Jeton hesaplama:
- Gemini 1.5 Flash ve Gemini 1.5 Pro: Her iki boyut da 384 pikselden küçükse 258 jeton. Daha büyük resimler karolara bölünür (min. karo 256 piksel, maks. 768 piksel, 768x768'e yeniden boyutlandırılır) ve her karo 258 jeton maliyetlidir.
- Gemini 2.0 Flash: Her iki boyut da 384 pikselden küçükse 258 jeton. Daha büyük resimler, her biri 258 jeton maliyeti olan 768x768 piksellik bloklara bölünür.
- En iyi uygulamalar:
- Resimlerin doğru şekilde döndürüldüğünden emin olun.
- Net ve bulanık olmayan resimler kullanın.
- Metin içeren tek bir resim kullanırken metin istemini
contents
dizisindeki resim kısmının ardından yerleştirin.
Sırada ne var?
Bu kılavuzda, resim dosyalarının nasıl yükleneceği ve resim girişlerinden metin çıkışlarının nasıl oluşturulacağı gösterilmektedir. Daha fazla bilgi edinmek için aşağıdaki kaynakları inceleyin:
- Sistem talimatları: Sistem talimatları, modelin davranışını belirli ihtiyaçlarınıza ve kullanım alanlarınıza göre yönlendirmenize olanak tanır.
- Videoları anlama: Video girişleriyle nasıl çalışacağınızı öğrenin.
- Files API: Gemini ile kullanmak üzere dosya yükleme ve yönetme hakkında daha fazla bilgi edinin.
- Dosya istemi stratejileri: Gemini API, çoklu formatlı istem olarak da bilinen metin, resim, ses ve video verileriyle istemleri destekler.
- Güvenlik kılavuzu: Üretken yapay zeka modelleri bazen yanlış, önyargılı veya rahatsız edici sonuçlar gibi beklenmedik sonuçlar üretebilir. Bu tür çıkışlardan kaynaklanan zarar riskini sınırlamak için işlem sonrası ve gerçek kişiler tarafından değerlendirme yapılması önemlidir.