yolov8添加FPPI評價指標

這里寫自定義目錄標題

    • yolov8 中FPPI實現
    • 測試中調用
  • 效果
  • 結語

續yolov7添加FPPI評價指標 。之前在yolov7中增加了fppi指標,有不少網友問有沒有yolov8中增加,最近沒有做算法訓練,也一直沒時間弄。這幾天晚上抽了點時間,弄了一下。不過我本地的yolov8挺久沒更新了,所以不一定能直接用,權當參考吧。

yolov8 中FPPI實現

yolo8中的評價指標實現位于ultralytics/utils/metrics.py中,我們只需要參照mAP指標在其中增加FPPI的內容即可:

def fppi_per_class(tp, conf, pred_cls, target_cls, image_num, plot=False, on_plot=None, save_dir=Path(), names=(), eps=1e-16, prefix=""):"""Compute the false positives per image (FPPW) metric, given the recall and precision curves.Source:# Argumentstp:  True positives (nparray, nx1 or nx10).conf:  Objectness value from 0-1 (nparray).pred_cls:  Predicted object classes (nparray).target_cls:  True object classes (nparray).plot:  Plot precision-recall curve at mAP@0.5save_dir:  Plot save directory# ReturnsThe fppi curve"""# Sort by objectnessi = np.argsort(-conf)tp, conf, pred_cls = tp[i], conf[i], pred_cls[i]# Find unique classesunique_classes = np.unique(target_cls)nc = unique_classes.shape[0]  # number of classes, number of detections# Create Precision-Recall curve and compute AP for each classpx, py = np.linspace(0, 1, 1000), np.linspace(0, 100, 1000)  # for plottingr = np.zeros((nc, 1000))miss_rate = np.zeros((nc, 1000))fppi = np.zeros((nc, 1000))miss_rate_at_fppi = np.zeros((nc, 3))  # missrate at fppi 1, 0.1, 0.01p_miss_rate = np.array([1, 0.1, 0.01])for ci, c in enumerate(unique_classes):i = pred_cls == cn_l = (target_cls == c).sum()  # number of labelsn_p = i.sum()  # number of predictionsif n_p == 0 or n_l == 0:continueelse:# Accumulate FPs and TPsfpc = (1 - tp[i]).cumsum(0)tpc = tp[i].cumsum(0)# Recallrecall = tpc / (n_l + eps)  # recall curver[ci] = np.interp(-px, -conf[i], recall[:, 0], left=0)  # negative x, xp because xp decreasesmiss_rate[ci] = 1 - r[ci]fp_per_image = fpc / image_numfppi[ci] = np.interp(-px, -conf[i], fp_per_image[:, 0], left=0)miss_rate_at_fppi[ci] = np.interp(-p_miss_rate, -fppi[ci], miss_rate[ci])if plot:names = [v for k, v in names.items() if k in unique_classes]  # list: only classes that have datanames = dict(enumerate(names)) plot_fppi_curve(fppi, miss_rate, miss_rate_at_fppi, save_dir / f"{prefix}fppi_curve.png", names, on_plot=on_plot)return miss_rate, fppi, miss_rate_at_fppi

將fppi以對數坐標畫圖:

@plt_settings()
def plot_fppi_curve(px, py, fppi, save_dir=Path("pr_curve.png"), names=(), on_plot=None):"""Plots a missrate-fppi curve."""fig, ax = plt.subplots(1, 1, figsize=(9, 6), tight_layout=True)py = np.stack(py, axis=1)# semi logfor i, y in enumerate(py.T):ax.semilogx(px[i],y, linewidth=1, label=f'{names[i]} {fppi[i].mean():.3f}')  # plot(recall, precision)ax.semilogx(px.mean(0), py.mean(1), linewidth=3, color='blue', label='all classes %.3f' % fppi.mean())ax.set_xlabel('False Positives Per Image')ax.set_ylabel('Miss Rate')ax.set_xlim(0, 100)ax.set_ylim(0, 1)ax.grid(True)plt.legend(bbox_to_anchor=(1.04, 1), loc="upper left")fig.savefig(Path(save_dir), dpi=250)plt.close(fig)if on_plot:on_plot(save_dir)

至此,fppi相關實現就完成了,接下來就是在代碼中調用了。

測試中調用

通過調試,metrics的調用是在ultralytics/models/yolo/detect/val.py中的DetectionValidator中的get_stats函數中,在調用get_stats之前,會調用update_metrics計算tp, fp等。首先我們需要解決的時fppi計算需要圖片的張數這個參數。在update_metrics我們可以獲取這個值,在init_metrics增加參數self.image_num=0,在update_metrics中更新:

def update_metrics(self, preds, batch):"""Metrics."""self.image_num+=len(batch['im_file'])for si, pred in enumerate(preds):idx = batch['batch_idx'] == sicls = batch['cls'][idx]bbox = batch['bboxes'][idx]...

ap的計算在ultralytics/utils/metrics.py的DetMetrics中,我們給它也增加一個self.image_num=0參數, 并且在get_stats函數中設置它:

def get_stats(self):"""Returns metrics statistics and results dictionary."""# set image_num for fppi calculationself.metrics.image_num = self.image_numstats = [torch.cat(x, 0).cpu().numpy() for x in zip(*self.stats)]  # to numpyif len(stats) and stats[0].any():self.metrics.process(*stats)self.nt_per_class = np.bincount(stats[-1].astype(int), minlength=self.nc)  # number of targets per classreturn self.metrics.results_dict

然后修改其process函數,在這個函數中調用樂ap_per_class來計算map, 我們在后面增加計算fppi的函數即可( def keys(self)中要加一個fppi的key):

def process(self, tp, conf, pred_cls, target_cls):"""Process predicted results for object detection and update metrics."""results = ap_per_class(tp,conf,pred_cls,target_cls,plot=self.plot,save_dir=self.save_dir,names=self.names,on_plot=self.on_plot,)[2:]self.box.nc = len(self.names)self.box.update(results)results_fppi = fppi_per_class(tp,conf,pred_cls,target_cls,self.image_num,plot=self.plot,save_dir=self.save_dir,names=self.names,on_plot=self.on_plot,)self.box.update_fppi(results_fppi)@propertydef keys(self):"""Returns a list of keys for accessing specific metrics."""return ["metrics/precision(B)", "metrics/recall(B)", "metrics/mAP50(B)", "metrics/mAP50-95(B)",  "metrics/missrate_fppi_1"]

指標的計算結果是保存在ultralytics/utils/metrics.py的Metric結構中,所以還需要增加存儲fppi相關指標(fitness也修改):

class Metric(SimpleClass):"""Class for computing evaluation metrics for YOLOv8 model.Attributes:p (list): Precision for each class. Shape: (nc,).r (list): Recall for each class. Shape: (nc,).f1 (list): F1 score for each class. Shape: (nc,).all_ap (list): AP scores for all classes and all IoU thresholds. Shape: (nc, 10).ap_class_index (list): Index of class for each AP score. Shape: (nc,).nc (int): Number of classes.Methods:ap50(): AP at IoU threshold of 0.5 for all classes. Returns: List of AP scores. Shape: (nc,) or [].ap(): AP at IoU thresholds from 0.5 to 0.95 for all classes. Returns: List of AP scores. Shape: (nc,) or [].mp(): Mean precision of all classes. Returns: Float.mr(): Mean recall of all classes. Returns: Float.map50(): Mean AP at IoU threshold of 0.5 for all classes. Returns: Float.map75(): Mean AP at IoU threshold of 0.75 for all classes. Returns: Float.map(): Mean AP at IoU thresholds from 0.5 to 0.95 for all classes. Returns: Float.mean_results(): Mean of results, returns mp, mr, map50, map.class_result(i): Class-aware result, returns p[i], r[i], ap50[i], ap[i].maps(): mAP of each class. Returns: Array of mAP scores, shape: (nc,).fitness(): Model fitness as a weighted combination of metrics. Returns: Float.update(results): Update metric attributes with new evaluation results."""def __init__(self) -> None:self.p = []  # (nc, )self.r = []  # (nc, )self.f1 = []  # (nc, )self.all_ap = []  # (nc, 10)self.ap_class_index = []  # (nc, )self.nc = 0self.missrate = [] #miss rate, (nc, )self.fppi = [] #false positives per image, (nc, )self.missrate_fppi = [] #miss rate at fppi 1, 0.1, 0.01, (nc, 3)@propertydef missrate_fppi_1(self):return self.missrate_fppi[:, 0].mean() if len(self.missrate_fppi) else []@propertydef ap50(self):"""Returns the Average Precision (AP) at an IoU threshold of 0.5 for all classes.Returns:(np.ndarray, list): Array of shape (nc,) with AP50 values per class, or an empty list if not available."""return self.all_ap[:, 0] if len(self.all_ap) else []@propertydef ap(self):"""Returns the Average Precision (AP) at an IoU threshold of 0.5-0.95 for all classes.Returns:(np.ndarray, list): Array of shape (nc,) with AP50-95 values per class, or an empty list if not available."""return self.all_ap.mean(1) if len(self.all_ap) else []@propertydef mp(self):"""Returns the Mean Precision of all classes.Returns:(float): The mean precision of all classes."""return self.p.mean() if len(self.p) else 0.0@propertydef mr(self):"""Returns the Mean Recall of all classes.Returns:(float): The mean recall of all classes."""return self.r.mean() if len(self.r) else 0.0@propertydef map50(self):"""Returns the mean Average Precision (mAP) at an IoU threshold of 0.5.Returns:(float): The mAP50 at an IoU threshold of 0.5."""return self.all_ap[:, 0].mean() if len(self.all_ap) else 0.0@propertydef map75(self):"""Returns the mean Average Precision (mAP) at an IoU threshold of 0.75.Returns:(float): The mAP50 at an IoU threshold of 0.75."""return self.all_ap[:, 5].mean() if len(self.all_ap) else 0.0@propertydef map(self):"""Returns the mean Average Precision (mAP) over IoU thresholds of 0.5 - 0.95 in steps of 0.05.Returns:(float): The mAP over IoU thresholds of 0.5 - 0.95 in steps of 0.05."""return self.all_ap.mean() if len(self.all_ap) else 0.0def mean_results(self):"""Mean of results, return mp, mr, map50, map."""return [self.mp, self.mr, self.map50, self.map, self.missrate_fppi_1]def class_result(self, i):"""class-aware result, return p[i], r[i], ap50[i], ap[i]."""return self.p[i], self.r[i], self.ap50[i], self.ap[i]@propertydef maps(self):"""mAP of each class."""maps = np.zeros(self.nc) + self.mapfor i, c in enumerate(self.ap_class_index):maps[c] = self.ap[i]return mapsdef fitness(self):"""Model fitness as a weighted combination of metrics."""w = [0.0, 0.0, 0.1, 0.9]  # weights for [P, R, mAP@0.5, mAP@0.5:0.95]return (np.array(self.mean_results()[:4]) * w).sum()def update(self, results):"""Args:results (tuple): A tuple of (p, r, ap, f1, ap_class)"""self.p, self.r, self.f1, self.all_ap, self.ap_class_index = resultsdef update_fppi(self, results):"""Args:results (tuple): A tuple of (missrate, fppi, missrate_fppi)"""self.missrate, self.fppi, self.missrate_fppi = results

效果

訓練過程中會在mAP的后面打印fppi, 訓練完成后以及調用test.py測試時,會畫fppi圖:
在這里插入圖片描述

結語

本文簡述了在yolov8中增加FPPI評價指標,可以用來直觀的表現模型的效果,指導閾值的選取。
f77d79a3b79d6d9849231e64c8e1cdfa~tplv-dy-resize-origshort-autoq-75_330.jpeg

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

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

相關文章

焦灼上市背后,極氪汽車開啟新長征?

李書福的資本帝國,又要擴容了。繼蔚小理之后,極氪汽車成為第四家赴美上市的中國造車新勢力,同時也成為了李書福收獲的第九個IPO。作為一家成立僅僅4年的新勢力,極氪再次刷新了造車新勢力上市的最快記錄。 按照極氪汽車官方的說法…

學習中...【京東價格/評論數據】數據獲取方式——采用Selenium★

近期閑來無事學學selenium爬蟲技術,參考崔慶才《Python3網絡爬蟲開發實戰》的淘寶商品信息爬取,我也照貓畫虎的學了京東的價格和商品評論數據。廢話不多說,直接開始吧! 1. 瀏覽器初始化 from selenium import webdriver from se…

紅黑樹的平衡

1.紅黑樹的概念 紅黑樹,是一種二叉搜索樹,但在每個結點上增加一個存儲位表示結點的顏色,可以是Red或 Black。 通過對任何一條從根到葉子的路徑上各個結點著色方式的限制,紅黑樹確保沒有一條路 徑會比其他路徑長出倆倍&#xff0c…

什么是apt

2024年5月15日,周三上午 apt 是 “Advanced Packaging Tool” 的縮寫,它是 Debian 及其衍生版(如 Ubuntu)中用于管理軟件包的命令行工具。apt 提供了一個統一的接口來安裝、更新、升級、刪除和搜索軟件包。 以下是 apt 的一些主要…

合合信息:TextIn文檔解析技術與高精度文本向量化模型再加速

文章目錄 前言現有大模型文檔解析問題表格無法解析無法按照閱讀順序解析文檔編碼錯誤 訴求文檔解析技術技術難點技術架構關鍵技術回根溯源 文本向量化模型結語 前言 隨著人工智能技術的持續演進,大語言模型在我們日常生活中正逐漸占據舉足輕重的地位。大模型語言通…

Java基礎(36)應用服務器優化技術有哪些

應用服務器優化是一個復雜的過程,涉及到服務器硬件資源、操作系統、網絡、應用程序代碼、數據庫等多個層面。下面是一些深入詳細的應用服務器優化技術: 系統級優化 硬件優化 提升CPU性能:使用更多核心的CPU或者升級到更高頻率的CPU。增加內…

Scala基礎

目錄 1.安裝與運行Scala 任務描述 了解Scala語言 了解Scala特性 安裝Scala 運行Scala 2.定義函數識別號碼類型 了解數據類型 定義與使用常量、變量 使用運算符 定義與使用數組 任務實現 3.基本語法 1 變量 2 字符串 3 數據類型&操作符 4 條件表達式 5 循環…

idea使用gitee基本操作流程

1.首先,每次要寫代碼前,先切換到自己負責的分支 點擊簽出。 然后拉取一次遠程master分支,保證得到的是最新的代碼。 寫完代碼后,在左側欄有提交按鈕。 點擊后,選擇更新的文件,輸入描述內容(必填…

五分鐘“手撕”時間復雜度與空間復雜度

目錄 一、算法效率 什么是算法 如何衡量一個算法的好壞 算法效率 二、時間復雜度 時間復雜度的概念 大O的漸進表示法 推導大O階方法 常見時間復雜度計算舉例 三、空間復雜度 常見時間復雜度計算舉例 一、算法效率 什么是算法 算法(Algorithm):就是定…

C++|多態性與虛函數(2)|虛析構函數|重載函數|純虛函數|抽象類

前言 看這篇之前,可以先看多態性與虛函數(1)?? C|多態性與虛函數(1)功能綁定|向上轉換類型|虛函數-CSDN博客https://blog.csdn.net/weixin_74197067/article/details/138861418?spm1001.2014.3001.5501這篇文章會…

【Java開發面試系列】JVM相關面試題(精選)

【Java開發面試系列】JVM相關面試題(精選) 文章目錄 【Java開發面試系列】JVM相關面試題(精選)前言一、JVM組成二、類加載器三、垃圾回收四、JVM實踐(調優) 🌈你好呀!我是 山頂風景獨…

【十大排序算法】----C語言版插入排序(詳細圖解)

目錄 一:插入排序——原理 二:插入排序——分析 三:插入排序——實現 四:插入排序——效率 一:插入排序——原理 插入排序的原理和基本思想:把待排序的記錄按其關鍵碼值的大小逐個插入到一個已經排好序…

無需重啟 NGINX 開源版即可實現 SSL/TLS 證書輪換

原文作者:Maxim Ivanitskiy of F5 原文鏈接:無需重啟 NGINX 開源版即可實現 SSL/TLS 證書輪換 轉載來源:NGINX 開源社區 NGINX 唯一中文官方社區 ,盡在 nginx.org.cn 在高性能 Web 服務器領域,NGINX 是一個廣受歡迎的…

Django使用

一、根目錄下安裝 pip install django 二、創建djiango項目 django-admin startproject 項目名稱 三、創建app python manage.py startapp app名稱 四、啟動 python manage.py runserver 五、編寫URL與視圖關系,相對路徑 1、manage.py(見資源綁定…

mysql 8 創建用戶并賦予改用戶指定數據庫權限

一、使用客戶端工具登錄mysql 二、創建用戶 -- 低版本數據庫 create user 用戶名% identified by 密碼; -- 高版本數據庫 create user 用戶名% identified with mysql_native_password by 密碼; -- 示例1: create user test% identified with mysql_native_passwor…

apt和apt-get有什么區別

2024年5月15日,周三上午 apt 和 apt-get 都是 Debian 及其衍生版(如 Ubuntu)中用于軟件包管理的工具,但它們之間存在一些差異。 功能和目的: apt 是 apt-get 的改進版本,提供了更簡潔和更直觀的命令選項。…

多元化、高辨識顯示丨基于G32A1445的汽車尾燈解決方案

由剎車燈、倒車燈、轉向燈、霧燈等組成的汽車尾燈,既能在光線低暗時發出照明信息,也可向周圍環境傳遞車輛的行駛狀態與意圖信號,對于行車安全起著至關重要的作用。與傳統尾燈相比,貫穿式汽車尾燈更加醒目、美觀、安全,…

CSS2(一):CSS選擇器

文章目錄 1、CSS基礎1.1 CSS簡介1.2 CSS編寫位置1.2.1 行內樣式1.2.2 內部樣式1.2.3 外部樣式1.2.4 樣式優先級 1.2.5 CSS代碼風格 2、CSS選擇器2.1、基本選擇器2.1.1 通配選擇器2.1.2 元素選擇器2.1.3 類選擇器2.1.4 ID選擇器2.1.5 總結 2.2、CSS復合選擇器2.2.1 交集選擇器2.…

海外媒體宣發:新加坡.馬來西亞如何在海外媒體投放新聞通稿-大舍傳媒

導言 隨著全球化的進程加速,海外市場對于企業的發展越來越重要。而在海外媒體上宣傳企業的新聞通稿,成為了拓展海外市場和提升企業知名度的重要手段之一。本文將介紹大舍傳媒對于如何在海外媒體上投放新聞通稿的經驗和策略。 準備工作:了解…

Hive 特殊的數據類型 Array、Map、Struct

Array 數組類型,存儲數據類型一致的列表數據。 我們可以使用 array 方法來創建一個數組,如下所示: select array(1,2,3,4,5);如果其中的數據類型不一致,那么它會轉換成統一的數據類型(前提是能夠進行轉換&#xff0…