口腔影像 AI 檢測 API

本文檔面向系統對接與集成開發人員,説明如何通過 HTTPS 上傳影像、調用檢測接口,並解析統一返回的 JSON 數據結構。

服務端點與路徑約定

Base URL 由協議、主機名及(如有)網關前綴組成,不包含業務路徑(如 /api/v1/...)。調用時將下文各接口的相對路徑拼接到 Base URL 之後。

環境 Base URL(示例)
生產(當前約定) https://api.dusheng.tech/detectapi

常用完整 URL(生產示例)

用途 完整 URL
統一檢測https://api.dusheng.tech/detectapi/api/v1/detect
口內(兼容路由)https://api.dusheng.tech/detectapi/api/v1/intraoral/detect
全景(兼容路由)https://api.dusheng.tech/detectapi/api/v1/panoramic/detect
側位(兼容路由)https://api.dusheng.tech/detectapi/api/v1/cephalometric/detect
健康檢查https://api.dusheng.tech/detectapi/health

約定

  • Base URL 末尾請勿重複 /,以免出現 .../detectapi//api/... 等錯誤拼接。
  • 若使用獨立部署或定製域名,請將上表中的示例根地址整體替換為服務提供方書面確認的根地址;接口路徑 /api/v1/.../health 通常保持不變。

1. 接口一覽

方法 相對路徑 説明
POST/api/v1/detect推薦使用:通過表單字段 image_type 指定影像類型
POST/api/v1/intraoral/detect固定按口內影像處理,可不傳 image_type
POST/api/v1/panoramic/detect固定按全景片處理,可不傳 image_type
POST/api/v1/cephalometric/detect固定按頭影側位片處理,可不傳 image_type
GET/health服務可用性探測,見下文

1.1 健康檢查 GET /health

用於運維監控、負載均衡探活等場景,用於確認檢測服務進程是否可達。不接收影像文件、不執行推理。業務側進行口內/全景/側位檢測時無需調用本接口。


2. 調用方式

2.1 請求約定

項目約定
Content-Typemultipart/form-data
影像格式jpgjpegpng
單文件大小上限由服務提供方在部署層配置;超限返回 FILE_TOO_LARGE(HTTP 413,以實際網關為準)

2.2 表單字段

字段必填説明
file待檢測影像文件
image_type使用 /api/v1/detect必填intraoral(口內)、panoramic(全景)、cephalometric(頭影側位)
landmark_num image_type=cephalometric 時有效。當前服務僅支持 46;可不傳,默認與當前配置一致。傳入非支持取值時返回 INVALID_LANDMARK_NUM
ceph_landmark_numlandmark_num 語義等價,任選其一即可
langzh(默認)或 en

2.3 鑑權

若服務提供方已啓用訪問控制,請在請求頭攜帶:

Authorization: Bearer <TOKEN>

<TOKEN> 由服務提供方分配。未攜帶或校驗失敗時,返回 HTTP 401error_codeUNAUTHORIZED

2.4 請求示例(生產 Base URL 示例)

<TOKEN> 替換為實際密鑰;以下 Base URL 為 https://api.dusheng.tech/detectapi

口內(統一接口)

curl -X POST "https://api.dusheng.tech/detectapi/api/v1/detect" \
  -H "Authorization: Bearer <TOKEN>" \
  -F "file=@口內照.jpg" \
  -F "image_type=intraoral" \
  -F "lang=zh"

全景

curl -X POST "https://api.dusheng.tech/detectapi/api/v1/detect" \
  -H "Authorization: Bearer <TOKEN>" \
  -F "file=@全景.jpg" \
  -F "image_type=panoramic" \
  -F "lang=zh"

頭影側位(46 個解剖關鍵點)

curl -X POST "https://api.dusheng.tech/detectapi/api/v1/detect" \
  -H "Authorization: Bearer <TOKEN>" \
  -F "file=@側位.jpg" \
  -F "image_type=cephalometric" \
  -F "lang=zh"

固定類型路由(可不傳 image_type

curl -X POST "https://api.dusheng.tech/detectapi/api/v1/panoramic/detect" \
  -H "Authorization: Bearer <TOKEN>" \
  -F "file=@全景.jpg"
curl -X POST "https://api.dusheng.tech/detectapi/api/v1/cephalometric/detect" \
  -H "Authorization: Bearer <TOKEN>" \
  -F "file=@側位.jpg"

3. 影像類型與主要輸出

image_type影像類型主要輸出內容
intraoral口內彩色照片牙位(FDI)、牙位幾何(輪廓或外接框)、牙位級異常提示、全圖級結論
panoramic口腔全景 X 線片牙位(FDI)、分割幾何(見第 5 節)、牙位級病灶列表
cephalometric頭影側位片與圖像像素座標系一致的 landmarks 關鍵點數組(46 點);不提供牙位分割與牙位級疾病列表

4. 口內影像:輸出字段説明

4.1 牙位級異常(teeth[].diseases[] 中的 name

僅當該牙位上某類異常達到「疑似」或「確證」時,對應條目才會出現。氟牙症不在此數組中,見 4.2 全圖級。

當前口內牙位級模型覆蓋下列疾病(name 為中文;lang=en 時同條目中提供 name_en):

中文 namename_en(參考)説明
齲齒Caries
牙磨損Tooth wear
楔狀缺損Wedge defect
殘冠Residual crown牙體缺損後的 殘冠,非修復體全冠
全冠Full crown全冠修復體,與「殘冠」為不同類別
傾斜牙Crowding單牙排列異常
扭曲牙Crowding單牙排列異常
牙齦退縮Gingival recession

與全圖級「牙列擁擠」的區別傾斜牙 / 扭曲牙單牙檢測結果,出現在 teeth[].diseases[]牙列擁擠整圖結論,出現在 image_level_diseases[],二者可同時存在、互不替代。

4.2 全圖級結論(image_level_diseases[] 中的 name

中文 name(示例)
牙列擁擠
牙結石
牙齦異常
牙色異常
氟牙症

4.3 算法表現與適用範圍

算法輸出受影像質量、拍攝條件、患者個體及算法版本等多因素影響。本文檔不提供作為合同或驗收依據的固定準確率承諾;若需定量評測報告或驗收指標,請與服務提供方另行約定並獲取書面材料。


5. 全景片:幾何字段與病灶命名

5.1 牙齒與分割

  • teeth[]:包含牙位(fdi)、幾何描述 segmentation(在輪廓可用時為多邊形,否則可為外接矩形等,以實際返回為準)。

5.2 segmentation 與輪廓相關字段

全景牙位分割在具備掩膜輸出時,接口可在每顆牙的 segmentation.polygons_raw 中返回未經展示後處理的原始輪廓,便於接入方自行進行柵格化或幾何運算。用於界面展示的 polygons 可能經過簡化或質量過濾,與 polygons_raw 不必一致。當 segmentation.modepolygon 時,通常提供展示用 polygons;否則可能退化為 bbox,此時 polygons 可為 null。接口不返回整幅圖像的 H×W 二值掩膜數組。

5.3 病灶

病灶位於 teeth[].diseases[]。全景場景下 image_level_diseases 在多數情況下為空數組。

與口內不同:全景病灶由單模型多類檢測輸出,部分類別在 JSON 中可能以 英文 snake_case(如 impacted_tooth)作為 name 返回;口內牙位級 name中文規範名為主(見第 4.1 節)。集成時請以實際返回為準。

下列為英文標識與中文含義對照(便於與文獻或內部標註體系對照,不代表接口枚舉的完整封閉列表):

英文類名(示例)中文含義(參考)
impacted_tooth阻生牙
full_crown全冠修復體(全景);口內對應中文 name 為「全冠」
periapical_radiolucency根尖周病變
tooth_filling充填體
retained_primary_tooth乳牙滯留
embedded_tooth埋伏牙
alveolar_bone_resorption牙槽骨吸收
residual_root殘根
elongation牙齒伸長
implant種植體
tooth_bridge固定橋
residual_crown殘冠
general_caries齲齒
root_canal_filling根管充填
wedge_shaped_abrasion楔狀缺損
microdontia過小牙
high_density_bone_anomaly高密度骨異常
supernumerary_tooth多生牙
limited_eruption_space萌出間隙不足
low_density_bone_anomaly低密度骨異常

5.4 算法表現與適用範圍

同第 4.3 節:全景算法輸出受數據與版本等因素影響,不作為臨牀金標準。定量指標與正式評測口徑請向服務提供方索取。


6. 頭影側位:landmarks 與座標

6.1 座標系

與口內、全景一致,頂層 coordinate_system 約定為:原點在上傳圖像左上角x 軸向右、y 軸向下,單位為像素

6.2 關鍵點配置

當前接口對頭影側位僅輸出 46 個關鍵點landmark_num / ceph_landmark_num 若傳入非支持取值,將返回 error_code: INVALID_LANDMARK_NUM(HTTP 400)。不傳上述字段時,行為與當前線上默認配置一致。

6.3 對接與可視化説明

成功響應以結構化 JSON 返回檢測結果,便於直接入庫、展示或與 HIS/影像工作站等系統對接。若需在畫面上疊加側位關鍵點或文字標註,可將 landmarks 中的 xyvalidname 等與本地持有的影像進行對齊繪製即可。

6.4 meta(側位)

側位成功時,meta 中會給出 landmark_num(當前為 46),以及與其他影像類型接口保持一致的 disease_models_failed 字段(側位場景下多為空數組)。其餘擴展鍵若隨版本有所調整,以線上實際返回為準

6.5 landmarks 數組元素

字段類型説明
index整數點序號,從 0 起
name字符串或 null關鍵點簡稱或標籤
definition_zh字符串或 null中文釋義或解剖説明(若無可為 null
x數字或 null橫座標(像素);無效點為 null
y數字或 null縱座標(像素);無效點為 null
valid布爾該點是否參與可信推斷;false 表示該點不可用

側位場景下 teethimage_level_diseases 均為空數組。

6.6 summary(側位)

側位成功時,summary 提供 total_landmarks(關鍵點總數,與 landmarks 長度一致)與 visible_landmarksvalidtrue 的點數),便於快速瞭解本次頭影分析覆蓋了多少個解剖點及其可信數量;與口內/全景中的牙位統計字段不同,屬接口設計上的正常差異。


7. 響應 JSON 結構説明

7.1 頂層常用字段

字段説明
success業務是否成功
image_type與請求一致
inference_statusok:主流程完成;partial:部分子流程未成功(細節可諮詢服務提供方)
error / error_code失敗時的説明與機器可讀錯誤碼;成功時多為 null
request_id本次請求標識,便於聯調與問題追蹤
elapsed_ms服務端處理耗時(毫秒)
coordinate_system座標與框格式約定
imagewidthheight(像素)
teeth口內/全景:牙位列表;側位:空數組
landmarks僅側位:關鍵點數組
image_level_diseases口內:全圖級結論;全景/側位:多為空數組
summary彙總統計;側位僅含 total_landmarksvisible_landmarks
meta擴展信息,鍵隨影像類型及版本可能不同

7.2 口內 / 全景:teeth[]diseases[](摘要)

字段説明
fdi牙位編號
tooth_bbox外接矩形 [x1,y1,x2,y2]
segmentation幾何模式、polygonsbbox 等;全景且具備掩膜時常見 polygons_raw
status該牙綜合狀態:健康 / 疑似 / 確證
diseases[]name(中文)、name_enlang=en 時可用)、statusconfidencebboxgeometry

7.3 口內成功響應示例(節選)

{
  "success": true,
  "image_type": "intraoral",
  "inference_status": "ok",
  "error": null,
  "error_code": null,
  "request_id": "intraoral_20260504_165326_92967e50",
  "elapsed_ms": 8420,
  "coordinate_system": {
    "origin": "top_left",
    "x_axis": "right",
    "y_axis": "down",
    "unit": "pixel",
    "bbox_format": "xyxy_absolute"
  },
  "image": { "width": 1920, "height": 1080 },
  "teeth": [
    {
      "fdi": "11",
      "tooth_bbox": [100.0, 200.0, 180.0, 320.0],
      "segmentation": { "mode": "polygon", "bbox": [100.0, 200.0, 180.0, 320.0], "polygons": [[[102.1, 205.3]]] },
      "status": "確證",
      "diseases": [
        {
          "name": "齲齒",
          "name_en": "Caries",
          "status": "確證",
          "confidence": 0.88,
          "bbox": [110.0, 220.0, 160.0, 300.0],
          "geometry": { "type": "bbox", "bbox": [110.0, 220.0, 160.0, 300.0], "polygons": null }
        }
      ]
    }
  ],
  "image_level_diseases": [],
  "summary": {
    "total_teeth_detected": 28,
    "diseased_teeth_count": 3,
    "disease_counts": { "齲齒": 2 }
  },
  "meta": {}
}

meta 及全圖級字段以實際環境為準。)

7.4 全景成功響應示例(節選)

{
  "success": true,
  "image_type": "panoramic",
  "inference_status": "ok",
  "error": null,
  "error_code": null,
  "request_id": "panoramic_20260504_143022_e4f5a6b7",
  "elapsed_ms": 15200,
  "coordinate_system": {
    "origin": "top_left",
    "x_axis": "right",
    "y_axis": "down",
    "unit": "pixel",
    "bbox_format": "xyxy_absolute"
  },
  "image": { "width": 3000, "height": 1200 },
  "teeth": [
    {
      "fdi": "36",
      "tooth_bbox": [1400.0, 520.0, 1580.0, 780.0],
      "segmentation": {
        "mode": "bbox",
        "bbox": [1400.0, 520.0, 1580.0, 780.0],
        "polygons": null,
        "polygons_raw": [[[1405.0, 525.0], [1575.0, 530.0], [1560.0, 770.0], [1410.0, 765.0]]]
      },
      "tooth_conf": 0.86,
      "position_zh": "左下第一磨牙",
      "status": "疑似",
      "diseases": [
        {
          "name": "齲齒",
          "name_en": "Caries",
          "status": "疑似",
          "confidence": 0.42,
          "bbox": [1420.0, 560.0, 1550.0, 700.0],
          "iou": 0.35,
          "geometry": {
            "type": "bbox",
            "bbox": [1420.0, 560.0, 1550.0, 700.0],
            "polygons": null
          }
        }
      ]
    }
  ],
  "image_level_diseases": [],
  "summary": {
    "total_teeth_detected": 28,
    "diseased_teeth_count": 5,
    "disease_counts": { "齲齒": 3, "根尖周病變": 1 }
  },
  "meta": {}
}

(牙數、統計字段及 polygons / polygons_raw 是否出現,以實際推理結果為準。)

7.5 側位成功響應示例(節選)

{
  "success": true,
  "image_type": "cephalometric",
  "inference_status": "ok",
  "error": null,
  "error_code": null,
  "request_id": "cephalometric_20260504_120000_a1b2c3d4",
  "elapsed_ms": 1200,
  "coordinate_system": {
    "origin": "top_left",
    "x_axis": "right",
    "y_axis": "down",
    "unit": "pixel",
    "bbox_format": "xyxy_absolute"
  },
  "image": { "width": 2400, "height": 3000 },
  "teeth": [],
  "landmarks": [
    {
      "index": 0,
      "name": "A",
      "definition_zh": "Subspinale / A point,上頜前部骨性輪廓的最深凹點。",
      "x": 1120.5,
      "y": 580.2,
      "valid": true
    },
    {
      "index": 1,
      "name": "ANS",
      "definition_zh": "Anterior nasal spine,前鼻棘尖端。",
      "x": null,
      "y": null,
      "valid": false
    }
  ],
  "image_level_diseases": [],
  "summary": {
    "total_landmarks": 46,
    "visible_landmarks": 44
  },
  "meta": {
    "landmark_num": 46,
    "disease_models_failed": []
  }
}

(示例中 landmarks 僅展示前兩項;完整數組長度為 46,與 summary.total_landmarksmeta.landmark_num 一致。)


8. 常見錯誤碼

error_code典型 HTTP 狀態説明
UNAUTHORIZED401鑑權失敗
NO_FILE400未上傳文件
MISSING_IMAGE_TYPE400調用統一接口時未提供 image_type
INVALID_IMAGE_TYPE400不支持的 image_type
FILE_TOO_LARGE413文件超過服務允許大小
UNSUPPORTED_MEDIA_TYPE415非 jpg / jpeg / png
INVALID_IMAGE400影像無法解碼
INVALID_LANDMARK_NUM400側位關鍵點參數不合法或不受支持
FILE_NOT_FOUND400服務端缺少完成該次檢測所需的資源,請聯繫服務提供方
DETECTION_ERROR500檢測過程異常,可稍後重試或聯繫服務提供方

失敗響應中仍可能包含 request_idelapsed_mscoordinate_system 等字段,便於定位問題。


9. 附則

  • 生產環境入口以本文 「服務端點與路徑約定」 一節及服務提供方最新書面説明為準。
  • 訪問令牌、單文件大小、併發與限流、日誌與審計策略等,均由服務提供方在部署與商務層面約定,本文不逐項展開。