PetVital AI 量測 API

v1.0.0
檢查服務狀態…

概覽

對狗、貓做非接觸式生命徵象量測。上傳一段拍到寵物臉部的影片,回傳心率、呼吸率、心率變異與壓力指數。

原理是 rPPG(遠端光體積變化描記法):血液流過皮下微血管時,反射光會有極細微的週期性變化,從影片的顏色訊號還原出脈搏波形。伺服器端採 CHROM 與 POS 兩種色彩空間投影混合,再以帶通濾波與頻譜分析取出心率與呼吸率。

本 API 與 PetVital 網頁版共用同一份演算法程式碼,兩邊算出的數值一致。

服務位址

https://api-pet.zconai.com

自行部署時請換成貴司主機位址,路徑不變。

限制

  • 影片上限 48 MB,超過回 413
  • 有效影格不足 64 張(約 2 秒)無法計算,回 400
  • 一支 15 秒影片處理時間約 2 秒

快速開始

拍一段 15 秒的狗臉影片,直接送出:

curl -X POST https://api-pet.zconai.com/api/v1.0/measure \
     -F video=@dog.mp4 \
     -F species=dog

回傳:

{
  "ok": true,
  "version": "1.0.0",
  "data": {
    "hr": 98, "rr": 21, "sqi": 60,
    "sdnn": 51, "rmssd": 29, "lfhf": 0.11, "stress": 57,
    "peaks": 26,
    "meta": { "frames_used": 450, "elapsed_ms": 1877 }
  },
  "reference": { "hr": [60, 140], "rr": [10, 30] }
}

下方每個端點都可以直接用貴司自己的影片試打。

認證

讀取服務設定中…

若貴司的部署有開啟金鑰驗證,每次呼叫需帶其中一種標頭:

X-API-Key: <金鑰>
Authorization: Bearer <金鑰>

金鑰不符回 401。金鑰由日康提供,設定在容器的 API_KEYS 環境變數。

影片量測

POST/api/v1.0/measure

上傳影片,回傳完整量測結果。結尾有沒有斜線都可以。

請求參數

multipart/form-data 送出;或用 application/json,把影片放在 video_base64

參數型別說明
video必填file 影片檔。mp4、webm、mov 等 ffmpeg 支援的格式。與 video_base64 擇一。
video_base64必填string Base64 編碼的影片,可帶 data: 前綴。與 video 擇一。
species選填string dogcat,預設 dog。兩者的心率頻帶與正常區間不同,務必帶對。
fps選填number 取樣率,預設 30,範圍 5~120。除非影片幀率特殊,否則不用改。
roi選填object 指定取樣區域,數值為畫面比例,例如 {"x":0.28,"y":0.32,"w":0.44,"h":0.32}。不帶時由伺服器自動定位。
waveform選填boolean true 時額外回傳 200 點的脈搏與呼吸波形,可用來畫圖。

線上測試

選一支拍到寵物的影片,直接打這台伺服器。影片不會留存。

選擇影片後按「送出量測」

cURL 範例

curl -X POST https://api-pet.zconai.com/api/v1.0/measure \
     -F video=@cat.mp4 \
     -F species=cat \
     -F waveform=true

JSON(Base64)範例

curl -X POST https://api-pet.zconai.com/api/v1.0/measure \
     -H "Content-Type: application/json" \
     -d '{"video_base64":"AAAAIGZ0eXBpc29t...","species":"dog"}'

RGB 序列量測

POST/api/v1.0/measure/series

前端已經自己算好取樣區域平均色時走這條,不必上傳影片。

裝置端逐格取出 ROI 的平均 RGB,只送三串數字上來。一段 15 秒的量測約 40 KB,比影片省兩個數量級的頻寬,適合行動網路或攝影機端直傳。

參數型別說明
r, g, b必填number[] 三串等長的通道平均值,0~255。長度至少 64。
species選填string同上
fps選填number擷取這串數值時的實際幀率
waveform選填boolean同上
curl -X POST https://api-pet.zconai.com/api/v1.0/measure/series \
     -H "Content-Type: application/json" \
     -d '{"r":[141.2,141.5],"g":[122.4,122.9],"b":[101.1,101.3],"species":"dog","fps":30}'

取樣區域要固定,不要每格重新定位,否則訊號會被位移汙染。建議取畫面中央偏上、涵蓋鼻口的矩形。

參數查詢

GET/api/v1.0/spec

回傳演算法使用的頻帶與各物種正常區間,不需要參數。

按「執行」查看目前伺服器設定

健康檢查

GET/health

給負載平衡器或容器健康檢查用,回傳版本與已運行秒數。

curl https://api-pet.zconai.com/health
{"ok":true,"version":"1.0.0","uptime":3721}

回應欄位

欄位單位說明
hrbpm心率
rr次/分呼吸率
sqi10–100訊號品質。低於 30 表示雜訊偏高,該次結果僅供參考。
sdnnms心率變異:全段脈搏間隔的標準差
rmssdms心率變異:相鄰間隔差值的均方根,反映副交感活性
lfhf比值低頻與高頻功率比,反映自律神經平衡
stress0–100綜合心率與心率變異推得的壓力指數,數字越高越緊繃
peaks偵測到的脈搏波峰數,可用來反推結果可信度
waveformobject要求時才有。rppgresp 各 200 點。
meta.frames_used實際採用的影格數(已扣除晃動被跳過的)
meta.frames_skipped_motion因晃動被跳過的影格數。占比高代表拍攝不穩。
meta.roiobject實際採用的取樣區域比例
meta.elapsed_msms伺服器端運算耗時
referenceobject該物種各項目的正常區間,可直接拿來判讀

這些數值是健康趨勢參考,不是醫療診斷依據。動物臨床判讀請由獸醫師執行。

錯誤碼

失敗時一律回這個格式:

{"ok":false,"error":{"code":"NO_VIDEO","message":"請以 multipart 欄位 video 或 JSON video_base64 上傳影片"}}
codeHTTP原因與處理
NO_VIDEO400沒帶影片。檢查 multipart 欄位名是否為 video
BAD_SPECIES400species 不是 dog 或 cat
BAD_FPS400fps 超出 5~120
BAD_SERIES400r、g、b 不是等長數值陣列
INSUFFICIENT_DATA400有效影格不足 64 張。影片太短,或晃動太劇烈導致大量影格被跳過。
NO_FRAMES400影片解不出任何影格,多半是檔案損毀或格式不支援
FILE_TOO_LARGE413超過 48 MB。縮短長度或降低解析度,不影響量測準度。
UNAUTHORIZED401金鑰無效或未提供
NOT_FOUND404路徑不存在
MEASURE_FAILED500伺服器端例外,請提供影片與時間點回報日康

拍攝建議

量測準度九成取決於影片品質。以下條件差別很大:

  • 長度 15 秒、30 fps。低於 5 秒心率變異會失去意義。
  • 解析度 640×480 以上。伺服器會統一縮到 320×240 取樣,更高解析度不會更準,但太低會不足。
  • 鼻口入鏡並填滿畫面中央。毛色淺、皮膚薄的部位訊號最強。
  • 光線充足且穩定。日光燈與螢幕的閃爍會混進訊號,室內建議用連續光源。
  • 鏡頭與寵物盡量不動。晃動的影格會被自動跳過,跳太多就會回 INSUFFICIENT_DATA
  • 關掉自動曝光與自動白平衡。中途變更曝光等同在訊號裡插入一個階躍。

回應的 sqimeta.frames_skipped_motion 可以拿來當拍攝品質的即時回饋,引導使用者重拍。

自行部署

本服務以 Docker image 交付,內含 Node.js 執行環境與 ffmpeg,不需要另外安裝相依套件。

系統需求

  • Linux 主機,Docker Engine 20.10 以上、Docker Compose v2
  • 建議 2 vCPU / 4 GB 以上
  • 對外服務請自行在前面架 nginx 與 SSL

部署步驟

docker load -i petvital-api-1.0.0.tar.gz
docker compose up -d
curl http://127.0.0.1:8080/health

docker-compose.yml

services:
  petvital-api:
    image: petvital-api:1.0.0
    container_name: petvital-api
    restart: unless-stopped
    ports:
      - "8080:8080"
    environment:
      NODE_ENV: production
      PORT: "8080"
      MAX_UPLOAD_MB: "48"
      # API_KEYS: "your-key"   # 需要金鑰驗證時填入,逗號分隔

部署完成後,本文件頁面會一併掛在該主機的根路徑,可直接在內網用它試打。

日康科技 PetVital AI Measurement API v1.0.0