視覺
學習怎樣使用視覺能力理解圖片
1. 介紹
GPT-4o和GPT-4 Turbo兩個模型都擁有視覺能力,這意味著模型可以接收圖片并回答關于圖片的問題。從歷史上看,語言模型系統被限制采用單一的文本輸入方式。
2. 快速開始
模型使用圖片主要有2種方式;直接在請求中傳遞一個圖片的鏈接或base64位編碼的圖片。通過user,system和assitant消息傳遞圖片。當前不支持圖片在第一個system消息中。
from openai import OpenAIclient = OpenAI()response = client.chat.completions.create(model="gpt-4o",messages=[{"role": "user","content": [{"type": "text", "text": "What’s in this image?"},{"type": "image_url","image_url": {"url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg",},},],}],max_tokens=300,
)print(response.choices[0])
模型最擅長回答圖片里有什么的普通問題。雖然它能理解圖片中兩個物體的關系,但還沒有優化到回答關于在圖片中確定的物體的位置細節問題。例如:你可以問這個汽車是什么顏色或基于你的冰箱的食物可以做什么樣的晚餐。但如果你展示一個房間的圖片,并問椅子在哪?可能不能正確的回答。
當你探索什么樣的案例能應用視覺理解時,切記模型能力的限制非常重要
3. 上傳base64編碼圖片
如果你本地有1個或多個圖片,你可以使用base64的格式傳給模型,以下是操作的例子:
import base64
import requests# OpenAI API Key
api_key = "YOUR_OPENAI_API_KEY"# Function to encode the image
def encode_image(image_path):with open(image_path, "rb") as image_file:return base64.b64encode(image_file.read()).decode('utf-8')# Path to your image
image_path = "path_to_your_image.jpg"# Getting the base64 string
base64_image = encode_image(image_path)headers = {"Content-Type": "application/json","Authorization": f"Bearer {api_key}"
}payload = {"model": "gpt-4o","messages": [{"role": "user","content": [{"type": "text","text": "What’s in this image?"},{"type": "image_url","image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}}]}],"max_tokens": 300
}response = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=payload)print(response.json())
4. 多圖片輸入
Chat Completions API 有能力接收和處理base64格式的多張圖片或圖片的URL.模型會處理每一張圖片并使用它們所有的信息來回答問題。
from openai import OpenAIclient = OpenAI()
response = client.chat.completions.create(model="gpt-4o",messages=[{"role": "user","content": [{"type": "text","text": "What are in these images? Is there any difference between them?",},{"type": "image_url","image_url": {"url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg",},},{"type": "image_url","image_url": {"url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg",},},],}],max_tokens=300,
)
print(response.choices[0])
這是展示模型兩張同一個圖片并回答關于這兩張圖片或獨立回答每一張圖片的問題。
5. 低或高保真圖片理解
對于控制細節參數有3個選項:low high auto,你可以完全控制模型處理圖片,從而生成理解文本。模型默認使用參數auto,設置需根據輸入圖片的大小來確定使用low 或 high
- low 將開啟’low res’模式,模型將接收一個512x512大小的圖片,代表圖片將消耗65tokens。這將使模型更快的返回響應并消耗較少的tokens,前提是你的案例不需要很高的細節處理
- high 將開啟’high res‘模式,模型首先使用low res處理圖片,然后基于輸入圖片的大小創建512px的正方形的細節剪切圖片。每一個剪切的圖片將消耗2倍的tokens,總數大約有129tokens
from openai import OpenAIclient = OpenAI()response = client.chat.completions.create(model="gpt-4o",messages=[{"role": "user","content": [{"type": "text", "text": "What’s in this image?"},{"type": "image_url","image_url": {"url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg","detail": "high"},},],}],max_tokens=300,
)print(response.choices[0].message.content)
6. 管理圖片
Chat Completions API不像Assistants API,它是無狀態的。這就意味著你必須自己管理傳遞給模型的消息(包括圖片)。如果你要傳遞給模型一個圖片多次,那每一次請求模型的API你都必須傳遞這個圖片。
對于較長的會話,我們建議圖片的傳遞方式通過URL而不是base64,如果圖片大小比允許的最大值越小,那么在開始下載時就能減少模型的延時。對于low res模型,我們期望512x512大小的圖片。對于high res,則圖片最短的一邊要小于768px,最長的一邊要小于2000px
在模型處理完圖片后,我們會將其刪除。不會作為OpenAI的訓練數據
7. 限制
雖然ChatGPT4的視覺能力很強并能被使用到很場景下,對于了解模型的限制也是非常重要的。下邊是我們知道的一些限制:
- 醫學影像: 模型不適合翻譯特殊的醫學影像如:CT掃描,并不能作為醫學的建議
- 非英文: 當模型處理非拉丁字母的圖片時,表現還不夠最優,像日文或韓文
- 小文本:放大圖片的文本可以改善可讀性,但避免剪掉重要細節信息
- 旋轉:模型不能翻譯旋轉或上下顛倒的圖片或文字
- 可視化元素:模型很難理解圖片或文字中的顏色和樣式,如實線、橫虛線、點虛線的變化
- 空間推理: 模型很難處理需要準確定位的任務,如象棋的位置
- 準確率:模型在某個場景下可能產生不正確的描述或標注
- 圖片形狀:模型很難處理全景圖和魚眼圖
- 元數據和縮放:模型不能使用原始名或元數據,圖片在分析之前要進行縮放調整,將改其原始維度大小
- 計數:只能給出圖片中大概的物體數量
- 驗證碼:為了安全,我們在系統中實現了阻止批量提交的驗證碼功能
8. 計算成本
圖片的輸入用tokens進行計量和收費,和文本輸入一樣。傳遞的圖片的token的花費由兩個因素決定:每個圖片URL塊的大小和細節選項。所有的圖片都使用detail:low,每個圖片會消耗85tokens,detail:high圖片首先縮放至適合2048x2048的正方形,保持它們的長寬比。然后,縮放圖片最短的邊至768px,最終,我們計算圖片包含多少個512px的正方形,每個正方形將消耗170tokens,另外85個tokens也被添加到最終總數中。
這里有一些例子來說明上述問題。
-
一個1024 × 1024的正方形圖像細節:高模式花費765個令牌
- 1024小于2048,所以沒有初始大小調整。
- 最短的邊是1024,所以我們將圖像縮小到768 x 768。
- 需要4個512px的正方形塊來表示圖像,因此最終的令牌成本為170 * 4 + 85 = 765。
-
一個2048 x 4096的圖像細節:高模式花費1105個令牌
- 我們將圖像縮小到1024 x 2048,以適應2048的正方形。
- 最短的邊是1024,所以我們進一步縮小到768 x 1536。
- 需要6個512px的貼圖,所以最終的令牌成本是170 * 6 + 85 = 1105
-
4096 x 8192的detail:low 最便宜的是85個令牌
- 無論輸入大小如何,低細節圖像都是固定成本。