? Ultralytics YOLO驗證(Val)時自動輸出COCO指標(AP):2025最新配置與代碼詳解 (小白友好 + B站視頻)

? YOLO獲取COCO指標(3):驗證(Val) 啟用 COCO API 評估(自動輸出AP指標)| 發論文必看! | Ultralytics | 小白友好

文章目錄

    • 一、問題定位
    • 二、原理分析
    • 三、解決方案與實踐案例
      • 步驟 1: 觸發 COCO JSON 保存
      • 步驟 2: 確保 `self.is_coco` 條件滿足 (或理解其影響)
      • 步驟 3: 確保 Ground Truth JSON 文件路徑正確
      • 步驟 4: (關鍵) 調整自定義數據集的類別映射
      • 步驟 5: (可選) 調整圖像 ID 處理
    • 四、總結與展望
    • 參考文獻:

重要說明: 本篇博客內容基于 YOLOv12 進行演示,但其核心原理和配置方法適用于所有基于 Ultralytics 框架開發的 YOLO 版本。在應用代碼修改時,請注意核對你所使用的具體 Ultralytics 庫版本中的文件路徑和代碼行號。

一、問題定位

在使用 Ultralytics YOLO 框架訓練自定義目標檢測數據集后,開發者通常希望在驗證(Validation)階段就能直接獲取業界標準的 COCO 評估指標(尤其是 mAP)。然而,直接調用 model.val() 方法,即使數據集標注已轉換為 COCO 格式,也未必能自動觸發 COCO API 進行評估并輸出結果。本文旨在解決這一問題,詳細闡述如何通過正確配置和少量代碼調整,在 model.val() 過程中無縫集成 COCO API 評估。

二、原理分析

Ultralytics YOLO 的 ultralytics/models/yolo/detect/val.py 腳本內置了使用 pycocotools (官方 COCO API) 進行評估的邏輯。該邏輯的觸發和正確執行依賴于以下幾個關鍵條件:

  1. 觸發評估: 需要顯式告知 model.val() 保存預測結果為 COCO JSON 格式,這是調用 COCO API 的前提。
  2. 數據集識別: 腳本需要判斷當前驗證的數據集是否為“COCO 類型”,以便加載對應的 COCO 格式 Ground Truth 標注文件。這通常基于數據集配置文件 (.yaml) 中的路徑約定。
  3. 標注文件定位: 腳本需要根據約定的目錄結構找到 COCO 格式的 Ground Truth JSON 文件 (如 instances_val2017.json)。
  4. 類別映射 (Class Mapping): 對于標準 COCO 數據集,代碼默認會應用一個從 COCO 80 類到 COCO 91 類的映射。對于自定義數據集,這個映射通常是不必要的,甚至是有害的。
  5. 圖像 ID 匹配: COCO API 評估時需要匹配預測結果和 Ground Truth 中的圖像 ID。默認實現可能假設圖像文件名是符合 COCO 規范的數字 ID。

當使用自定義數據集時,即使標注格式符合 COCO 標準,上述第 2、3、4、5 點的默認邏輯可能與用戶的實際設置或數據情況不符,導致 COCO API 評估流程中斷或出錯。

三、解決方案與實踐案例

以下步驟詳細說明了如何在調用 model.val() 時成功啟用 COCO API 評估。

步驟 1: 觸發 COCO JSON 保存

在調用 model.val() 方法時,必須將參數 save_json 設置為 True。這會指示框架將模型的預測結果保存為 COCO 評估工具所需的 JSON 文件格式。

# --- 代碼示例:調用 model.val() 并啟用 save_json ---from ultralytics import YOLO				# 導入 YOLO 類# 加載模型
model = YOLO('path/to/your/best.pt') 		# 模型路徑# 調用驗證方法
metrics = model.val(# ... 其他訓練參數 ...save_json=True,          				# 關鍵:設置為 True 以便后續調用 COCO API# ... 其他訓練參數 ...
)

步驟 2: 確保 self.is_coco 條件滿足 (或理解其影響)

ultralytics/models/yolo/detect/val.py 文件中,有一個 self.is_coco 標志位,它的設置決定了是否按 COCO 模式加載標注和執行評估。(注意:以下代碼路徑和行號基于文檔提供的特定版本,請參考你使用的 Ultralytics 版本)

  • 代碼位置 (僅供參考,請核對你的版本): ultralytics/models/yolo/detect/val.py L71 附近
# --- val.py 中 is_coco 的判斷邏輯示例 (僅供理解) ---
# self.is_coco 通常基于 YAML 文件中 'val' 字段的路徑字符串判斷
# 它期望路徑中包含 "coco" 并且以特定的文件名結尾 (如 val2017.txt)
self.is_coco = (isinstance(val, str) # val 是 YAML 中 'val' 鍵對應的值and "coco" in val    # 路徑字符串需包含 "coco"# 并且以 /val2017.txt 或 /test-dev2017.txt 結尾and (val.endswith(f"{os.sep}val2017.txt") or val.endswith(f"{os.sep}test-dev2017.txt"))
)
  • 配置建議: 為了滿足這個條件,你需要在你的數據集配置文件 (.yaml) 中,將 val 指向一個符合上述約定的路徑。

    • 示例 YAML (PCB_COCO.yaml) 配置:

      path: E:/project/YOLOv12/dataset/PCB_DATASET # 數據集根目錄
      train: train.txt # 訓練集索引文件 (相對于 path)
      # 關鍵:val 路徑需要滿足 is_coco 的判斷邏輯
      # 例如,創建一個名為 coco 的子目錄,并在其中放置 val2017.txt
      val: coco/val2017.txt # 驗證集索引文件 (相對于 path)
      test: # 測試集 (可選)names: # 你的類別名稱列表0: class_01: class_1# ...
      
    • 文件結構建議 (對應 YAML):

      E:/project/YOLOv12/dataset/PCB_DATASET/
      ├── coco/
      │   └── val2017.txt  # 里面是驗證集圖片路徑列表
      ├── train.txt
      └── # ... 其他文件和目錄 (如 images, labels, annotations)
      

步驟 3: 確保 Ground Truth JSON 文件路徑正確

val.py 會根據 self.data["path"] (即 YAML 文件中的 path) 和 self.is_coco 的狀態來構建 Ground Truth JSON 文件的預期路徑。

  • 代碼位置 (僅供參考): ultralytics/models/yolo/detect/val.py L301 附近
# --- val.py 中 anno_json 的路徑構建邏輯示例 ---
# 如果 is_coco 為 True,則期望的 JSON 文件是 'instances_val2017.json'
# 如果是 LVIS 數據集,則是 lvis_v1_{split}.json
anno_json = (self.data["path"] # 來自 YAML 的 'path'/ "annotations"    # 固定的 'annotations' 子目錄/ ("instances_val2017.json" if self.is_coco else f"lvis_v1_{self.args.split}.json")
)
  • 配置建議: 確保你的 COCO 格式標注 JSON 文件(包含所有驗證集圖片的 Ground Truth)放置在 <數據集根目錄>/annotations/instances_val2017.json
    示例路徑: E:/project/YOLOv12/dataset/PCB_DATASET/annotations/instances_val2017.json

步驟 4: (關鍵) 調整自定義數據集的類別映射

對于自定義數據集,默認的 COCO 80 到 91 類映射 (coco80_to_coco91_class()) 是不適用的。需要注釋掉這行代碼,讓 self.class_map 使用從 1 開始的連續整數,對應你模型 names 列表中的類別。

  • 代碼位置 (僅供參考): ultralytics/models/yolo/detect/val.py L77 附近
# --- val.py 中 class_map 的修改 ---
# 原代碼 (需要注釋掉或修改條件)
# self.class_map = converter.coco80_to_coco91_class() if self.is_coco else list(range(1, len(model.names) + 1))# 修改后:無論 is_coco 如何,都使用模型自身的類別數生成從 1 開始的映射
# (注意:COCO API 的類別 ID 通常從 1 開始)
self.class_map = list(range(1, len(model.names) + 1)) # 直接使用模型類別生成映射
  • 修改說明: 這個修改確保了評估時使用的類別 ID 與你的模型和標注文件中的類別 ID 一致(假設你的 COCO JSON 中類別 ID 也是從 1 開始,如果不是,則需要相應調整這里的映射或你的 JSON 文件)。

步驟 5: (可選) 調整圖像 ID 處理

默認實現可能假設驗證集圖片的文件名是數字 (如 000000123456.jpg),并以此作為 COCO API 評估時的圖像 ID。如果你的文件名不是這種格式,可能會導致匹配失敗。在這種情況下,需要注釋掉相關代碼。

  • 代碼位置 (僅供參考): ultralytics/models/yolo/detect/val.py L325 附近
# --- val.py 中 imgIds 的處理 (如果需要修改) ---
# 如果你的驗證集圖片文件名不是純數字 ID (如 'img_001.jpg'),
# 下面這行代碼可能會出錯或導致 ID 不匹配,可以考慮注釋掉
# val.params.imgIds = [int(Path(x).stem) for x in self.dataloader.dataset.im_files]
  • 修改說明: 注釋掉此行后,評估時可能會依賴于 COCO JSON 文件中提供的圖像 ID。確保你的 predictions.jsoninstances_val2017.json 中的 image_id 能夠對應上。

四、總結與展望

通過以上配置和代碼調整(主要是 save_json=True 參數,滿足 is_coco 的路徑約定,確保 anno_json 路徑正確,以及為自定義數據集修改 class_map),你可以在 Ultralytics YOLO 的 model.val() 流程中成功啟用 COCO API,自動計算并獲取標準的 mAP 等評估指標。

關鍵要點回顧:

  1. 調用 model.val() 時設置 save_json=True
  2. 確保數據集 YAML 文件中的 val 路徑符合 is_coco 判斷約定(或理解其邏輯并適配)。
  3. 確保 Ground Truth COCO JSON 文件位于 path/annotations/instances_val2017.json
  4. 對于自定義數據集,務必修改 val.py 中的 self.class_map 邏輯,避免錯誤的 COCO 類別映射。
  5. 根據需要,可能要注釋掉 val.params.imgIds 的默認生成邏輯。

參考文獻:

  • Ultralytics YOLO 官方文檔:
    • model.val() API 文檔: https://docs.ultralytics.com/modes/val/ (請查找對應版本的文檔)
    • 數據集配置 (.yaml) 文檔: https://docs.ultralytics.com/datasets/
  • COCO Dataset 官網: https://cocodataset.org/#detection-eval (了解 COCO 評估指標定義)
  • pycocotools GitHub Repository: https://github.com/cocodataset/cocoapi (COCO API 官方庫)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900511.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900511.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900511.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【嵌入式學習3】基于python的tcp客戶端、服務器

目錄 1、tcp客戶端 2、tcp服務器 3、服務器多次連接客戶端、多次接收信息 1、tcp客戶端 """ tcp:客戶端 1. 導入socket模塊 2. 創建socket套接字 3. 建立tcp連接(和服務端建立連接) 4. 開始發送數據(到服務端) 5. 關閉套接字 """ import soc…

Linux: network: 兩臺直連的主機業務不通

前提環境,有一個產品的設定是兩個主機之間必須是拿網線直連。但是設備管理者可能誤將設置配錯,不是直連。 最近遇到一個問題,說一個主機發的包,沒有到對端,一開始懷疑設定的bond設備的問題,檢查了bond的設置狀態,發現沒有問題,就感覺非常的奇怪。后來就開始懷疑兩個主機…

COMSOL固體力學接觸

目錄 一、接觸非線性及接觸面積計算 一、接觸非線性及接觸面積計算 COMSOL接觸非線性及接觸面積計算_嗶哩嗶哩_bilibili 形成聯合體&#xff0c;在定義處右鍵選擇“建立接觸對” 位移dz使用參數化掃描。 接觸選擇定義中設置的接觸對&#xff0c;選擇罰函數&#xff0c;摩擦設置…

22.OpenCV輪廓匹配原理介紹與使用

OpenCV輪廓匹配原理介紹與使用 1. 輪廓匹配的基本概念 輪廓匹配&#xff08;Contour Matching&#xff09;是計算機視覺中的一種重要方法&#xff0c;主要用于比較兩個輪廓的相似性。它廣泛應用于目標識別、形狀分析、手勢識別等領域。 在 OpenCV 中&#xff0c;輪廓匹配主要…

oracle 快速創建表結構

在 Oracle 中快速創建表結構&#xff08;僅復制表結構&#xff0c;不復制數據&#xff09;可以通過以下方法實現&#xff0c;適用于需要快速復制表定義或生成空表的場景 1. 使用 CREATE TABLE AS SELECT (CTAS) 方法 -- 復制源表的全部列和數據類型&#xff0c;但不復制數據 C…

若依原理筆記

代碼生成器 源碼分析 查詢數據庫列表 導入表結構 生成代碼 修改generator.yml配置文件 代碼生成器增強 Velocity模版引擎 基礎語法-變量 Lombok集成 E:\javaProject\dkd-parent\dkd-generator\src\main\resources\vm\java\domain.java.vm package ${packageName}.domain;#fo…

Ansible的使用

##### Ansible使用環境 - 控制節點 - 安裝Ansible軟件 - Python環境支持&#xff1a;Python>2.6 - 必要的模塊&#xff1a;如PyYAML等 - 被控節點 - 啟用SSH服務 - 允許控制節點登錄&#xff0c;通常設置免密登錄 - Python環境支持 http://www.ansible.com/ …

C++ 提高編程:模板與 STL 深度剖析

摘要&#xff1a;本文深入探討 C 提高編程中的模板編程與標準模板庫&#xff08;STL&#xff09;相關內容。詳細闡述模板編程中函數模板和類模板的概念、語法、特性及應用案例&#xff1b;對 STL 的誕生背景、基本概念、六大組件進行剖析&#xff0c;并對常用容器、函數對象、常…

C++(類模板的運用)

使用vector實現一個簡單的本地注冊登錄系統 注冊&#xff1a;將賬號密碼存入vector里面&#xff0c;注意防重復判斷 登錄&#xff1a;判斷登錄的賬號密碼是否正確 #include <iostream> #include <vector> #include <fstream> #include <sstream> usi…

【大模型】DeepSeek+藍耕MaaS平臺+海螺AI生成高質量視頻實戰詳解

目錄 一、前言 二、藍耘智能云MaaS平臺介紹 2.1 藍耘智算平臺是什么 2.2 平臺優勢 2.3 平臺核心能力 三、海螺AI視頻介紹 3.1 海螺AI視頻是什么 3.2 海螺AI視頻主要功能 3.3 海螺AI視頻應用場景 3.4 海螺AI視頻核心優勢 3.5 項目git地址 四、藍耘MaaS平臺DeepSeek海…

接口自動化學習二:session自動管理cookie

session自動管理cookie&#xff1a; cookie中的數據&#xff0c;都是session提供的 實現步驟&#xff1a; 1.創建session對象&#xff1b;my_sessionrequests.Session() 2.使用session實例&#xff0c;調用get方法&#xff0c;發送獲取驗證碼請求&#xff08;不需要提取cookie&…

C++類型轉換詳解

目錄 一、內置 轉 內置 二、內置 轉 自定義 三、自定義 轉 內置 四、自定義 轉 自定義 五、類型轉換規范化 1.static_case 2.reinterpret_cast 3.const_cast 4.dynamic_cast 六、RTTI 一、內置 轉 內置 C兼容C語言&#xff0c;在內置類型之間轉換規則和C語言一樣的&am…

QEMU源碼全解析 —— 塊設備虛擬化(17)

接前一篇文章:QEMU源碼全解析 —— 塊設備虛擬化(16) 本文內容參考: 《趣談Linux操作系統》 —— 劉超,極客時間 《QEMU/KVM源碼解析與應用》 —— 李強,機械工業出版社 《KVM實戰 —— 原理、進階與性能調優》—— 任永杰 程舟,機械工業出版社

mac 卸載流氓軟件安全助手

之前個人電腦在公司使用過一段時間&#xff0c;為了使用網線聯網安裝了公司指定的 聯軟上網助手&#xff0c;誰知安裝容易卸載難&#xff0c;后來找運維來卸載&#xff0c;輸入管理員密碼后&#xff0c;也無反應&#xff0c;最后不了了之了&#xff0c;這個毒瘤軟件長期在后臺駐…

Java 大視界 -- Java 大數據機器學習模型在智能客服多輪對話系統中的優化策略(179)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…

極氪汽車云原生架構落地實踐

云原生架構落地實踐的背景 隨著極氪數字業務的飛速發展&#xff0c;背后的 IT 技術也在不斷更新迭代。極氪極為重視客戶對服務的體驗&#xff0c;并將系統穩定性、業務功能的迭代效率、問題的快速定位和解決視為構建核心競爭力的基石。 為快速響應用戶的需求&#xff0c;例如…

Python?判斷循環

????˙?˙? ? 判斷??常用的判斷符號(比較運算符)andor括號notin 和 not inif-elif-else循環??計數循環 forrange()函數簡易倒計時enumerate()函數zip()函數遍歷列表遍歷元組遍歷字符串遍歷字典條件循環 while提前跳轉 continue跳出循環 break能量站??判斷?? …

FreeRTOS與RT-Thread深度對比:從入門到精通的全面解析

FreeRTOS與RT-Thread深度對比&#xff1a;從入門到精通的全面解析 在嵌入式系統開發領域&#xff0c;實時操作系統(RTOS)扮演著至關重要的角色。FreeRTOS和RT-Thread作為兩款主流的開源RTOS&#xff0c;各有特色&#xff0c;適用于不同的應用場景。本文將從小白到大神的角度&a…

OpenCV 圖形API(18)用于執行兩個矩陣(或數組)的逐元素減法操作函數sub()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 描述 計算兩個矩陣之間的逐元素差值。 sub 函數計算兩個矩陣之間的差值&#xff0c;要求這兩個矩陣具有相同的尺寸和通道數&#xff1a; dst ( I ) src…

LeetCode刷題SQL筆記

系列博客目錄 文章目錄 系列博客目錄1.distinct關鍵字 去除重復2.char_length()3.group by 與 count()連用4.date類型有個函數datediff()5.mod 函數6.join和left join的區別1. **JOIN&#xff08;內連接&#xff0c;INNER JOIN&#xff09;**示例&#xff1a; 2. **LEFT JOIN&a…