訂閱
糾錯
加入自媒體

分析計算機視覺模型的性能

最近了解了一個令人難以置信的工具,叫做Voxel51的FiftyOne,無法推薦它足夠用于你的工作或研究。在文中,將解釋如何使用該工具進(jìn)行圖像分類。

介紹

FiftyOne是一個開源工具,為數(shù)據(jù)集標(biāo)記和計算機視覺模型分析提供了強大的圖形界面。“提高數(shù)據(jù)質(zhì)量和了解模型的故障模式是提高模型性能的最有效方法。”[1]擁有一個標(biāo)準(zhǔn)化工具極大地加快和簡化了數(shù)據(jù)和模型質(zhì)量分析過程。作為一個開放源碼項目是最重要的。該工具的官方文檔寫得很漂亮,可在以下位置獲。

該工具既可以作為獨立應(yīng)用程序運行,也可以在Jupyter筆記本中運行。

FiftyOne安裝[1]

要安裝FiftyOne,可以使用pip。使用以下命令創(chuàng)建名為fo的conda環(huán)境,然后使用pip安裝FiftyOne庫。

[注意:對于M1芯片的MacBooks,你需要手動設(shè)置MongoDB后端,因為捆綁的DB安裝無法開箱即用。

conda create -n fo python=3.8 -y

conda activate fo

pip install fiftyone

如果一切正常,你應(yīng)該能夠在python中加載包。接下來,我們將看兩個基本的核心類,共有50個。

FiftyOne數(shù)據(jù)集和示例[2]

1.?dāng)?shù)據(jù)集:這個類是fiftyone的核心,具有強大的功能來表示數(shù)據(jù),并使用python庫和fiftyoneUI對其進(jìn)行操作。你可以加載、修改、可視化和評估數(shù)據(jù)以及標(biāo)簽(分類、檢測等)[2]

即使你有未標(biāo)記的數(shù)據(jù),也可以在FiftyOne應(yīng)用程序中完成初始探索階段。它還與CVAT和其他標(biāo)簽平臺集成。數(shù)據(jù)集是Sample類的有序集合,它們被分配了用于檢索的唯一ID。

你可以使用以下代碼實例化名為“emotion-datase”的空數(shù)據(jù)集。

import fiftyone as fo

dataset = fo.Dataset("emotion-dataset")

dataset.persistent = True # Use this line if you want your dataset to be persistent and be avialable after system restarts.

2.示例:數(shù)據(jù)集由存儲與任何給定數(shù)據(jù)示例相關(guān)的信息的示例類對象組成。每個示例都有一個文件路徑作為必填字段。除此之外,只要數(shù)據(jù)類型在所有示例中一致,你可以添加任意多個關(guān)鍵字字段。讓我們看看下面的一個例子。

sample = fo.Sample(filepath="/path/to/some/image.jpg", ground_truth="class1")

這將創(chuàng)建一個包含filepath和ground_truth字段的示例。請注意,對于整個數(shù)據(jù)集,ground_truth需要是字符串類名。如果要使用整數(shù),則必須對整個數(shù)據(jù)集保持一致。

向數(shù)據(jù)集添加樣本非常容易。

dataset.a(chǎn)dd_samples([sample]) #adds a list of samples to the dataset

方法論

對于本教程,將使用FiftyOne庫從Open Images v6數(shù)據(jù)集下載兩個類[Wine,Bagel]。使用FiftyOne庫是根據(jù)開放圖像網(wǎng)站下載數(shù)據(jù)的推薦方法。

下面的代碼將從驗證拆分中下載Wine和Bagel類的圖像,并將它們注冊到open-image-v6-demo名稱下。

import fiftyone as fo

dataset = foz.load_zoo_dataset("open-images-v6",
                              split="validation",
                              label_types=["classifications"],
                              classes=["Wine"],
                              seed=314,
                              dataset_name="open-image-v6-demo")

bagel_subset = foz.load_zoo_dataset("open-images-v6",
                              split="validation",
                              label_types=["classifications"],
                              classes=["Bagel"],
                              seed=314,
                              dataset_name="bagel-subset")

_ = dataset.merge_samples(bagel_subset)    

在這一點上,我們有一個數(shù)據(jù)集,其中包含正標(biāo)簽和負(fù)標(biāo)簽字段以及其他一些字段。

但是對于我們的示例評估,我們需要創(chuàng)建一個ground_truth字段,其中包含fo.Classification對象。

下面的代碼將把ground_truth添加到所有感興趣的相關(guān)示例中。我們首先基于Wine的positive_labels字段過濾數(shù)據(jù)集,然后向其添加ground_truth。

這里需要注意的是,你需要對每個樣本調(diào)用save方法,以便將更改反映在數(shù)據(jù)庫中。如果為一個示例創(chuàng)建了一個新字段,所有其他示例都將使用默認(rèn)值None填充該字段。

通過這種方式,我們?yōu)閿?shù)據(jù)集創(chuàng)建了Wine和Bagel ground_truth標(biāo)簽。

for sample in dataset.filter_labels("positive_labels" ,F(xiàn)("label")==("Wine")):

   sample["ground_truth"] = fo.Classification(label="Wine")              sample.save()

for sample in dataset.filter_labels("positive_labels" ,F(xiàn)("label")==("Bagel")):

   sample["ground_truth"] = fo.Classification(label="Bagel")              sample.save()

此時你可以啟動FiftyOne應(yīng)用程序,并開始查看下載的數(shù)據(jù)集。下面的代碼將啟動一個會話并讓你查看數(shù)據(jù)。

session = fo.launch_app(dataset) # this will launch the fiftyone app

你可以快速滾動數(shù)據(jù)集并分析標(biāo)簽是否有意義。如果有任何錯誤的示例,你可以通過將鼠標(biāo)懸停在圖像上并選中復(fù)選框(或打開圖像然后選擇它)來選擇它們。

可以標(biāo)記所有選定的圖像以過濾掉這些圖像。也可以使用session.selected屬性訪問選定的圖像。這將為你提供所有選定樣本的唯一ID。然后可以用來操縱這些樣本。

現(xiàn)在我們需要使用一個模型來向數(shù)據(jù)集添加預(yù)測。Imagenet有三個類,稱為“bagel”、“red wine”和“wine bottle”,可以用于我們從開放圖像數(shù)據(jù)集下載的樣本。

我們將使用預(yù)訓(xùn)練的模型對數(shù)據(jù)集進(jìn)行預(yù)測,然后進(jìn)行評估。我選擇了在imagenet數(shù)據(jù)集上預(yù)訓(xùn)練的densenet169(PyTorch)模型。

import fiftyone.zoo as foz

model = foz.load_zoo_model("densenet169-imagenet-torch")

dataset.a(chǎn)pply_model(model, label_field="predictions", store_logits=True)  

此代碼將向樣本添加帶有分類結(jié)果的預(yù)測標(biāo)簽字段。但是,它將為1000個imagenet類中的樣本分配argmax類標(biāo)簽和置信度。

對于我們的用例,我們只需要與Wine和Bagel類別相關(guān)的那些。我們也通過指定store_logits=True將logits信息存儲在預(yù)測字段中。接下來,我們找到感興趣的類的相關(guān)類索引。

bagel_index = model.classes.index("bagel")

red_wine_index = model.classes.index("red wine")

wine_glass_index = model.classes.index("wine bottle")

現(xiàn)在,我們遍歷數(shù)據(jù)集,并根據(jù)open image downloader生成的positive_label中的可用數(shù)據(jù)指定正確的ground_truth值。

我們通過添加“red wine”和“wine glass”softmax 值和 bagel_conficence 作為 bagel softmax 值來創(chuàng)建 wine_confidence;谀膫置信度更大來分配預(yù)測標(biāo)簽。

for sample in dataset:

   softmax_values = torch.softmax(torch.from_numpy(sample.predictions.logits),0).numpy()

   wine_confidence = softmax_values[red_wine_index] + softmax_values[wine_glass_index]

   bagel_confidence = softmax_values[bagel_index]
   

   if wine_confidence>=bagel_confidence:

       sample.predictions.label="Wine"

       sample.predictions.confidence=wine_confidence

   else:

       sample.predictions.label="Bagel"

       sample.predictions.confidence=bagel_confidence

   sample.save()

現(xiàn)在我們已經(jīng)在數(shù)據(jù)集中準(zhǔn)備好了進(jìn)行評估的一切。

FiftyOne性能評估

一旦為數(shù)據(jù)集中所有感興趣的樣本注冊了ground_truth和預(yù)測,評估就非?炝恕τ诜诸,我們可以查看分類報告和混淆矩陣進(jìn)行分析。

我們對數(shù)據(jù)集進(jìn)行過濾,只選擇帶有Wine或Bagel標(biāo)簽的ground_truth。然后使用這個過濾視圖,我們運行evaluate_classifications方法。我們指定預(yù)測和ground_truth字段名以及eval鍵。這將計算sklearn風(fēng)格的分類報告以及混淆矩陣。

oi_classes = ["Wine", "Bagel"]

eval_view = dataset.filter_labels("ground_truth" ,F(xiàn)("label").is_in(oi_classes))

results = eval_view.evaluate_classifications("predictions",
                                            gt_field="ground_truth",
                                            eval_key="eval")

要查看分類報告,我們可以簡單地使用print_report方法。

results.print_report()

總是查看分類報告,以立即深入了解模型在類級別上的表現(xiàn)。在具有嚴(yán)重類別不平衡的數(shù)據(jù)集中,精度值可能會產(chǎn)生誤導(dǎo)。然而,準(zhǔn)確度、召回率和f1得分值顯示了更真實的表現(xiàn)。查看此報告,你可以立即了解哪些類表現(xiàn)良好,哪些類表現(xiàn)不佳。

其次,混淆矩陣是分析分類器性能的另一個強大工具。使用ClassificationResults結(jié)果對象創(chuàng)建混淆矩陣。你可以使用plot_confision_matrix方法創(chuàng)建一個壯觀的交互式熱圖對象。然后,可以將此繪圖附加到會話中,以便進(jìn)行交互式體驗。

下面的代碼創(chuàng)建了一個混淆矩陣并附加到會話中。

cm = results.plot_confusion_matrix()

cm.show()

session.plots.a(chǎn)ttach(cm)

你可以將鼠標(biāo)懸停在矩陣中的每個單元格上,以查看總計數(shù)、真實標(biāo)簽和預(yù)測標(biāo)簽。

你還可以選擇一個單獨的單元格或一組單元格來動態(tài)過濾FiftyOneUI中的示例,以僅顯示屬于混淆矩陣中特定單元格的示例。這使得分析假陽性、假陰性和錯誤分類變得輕而易舉!

例如,如果我們想看到被錯誤分類為葡萄酒的百吉餅,我們只需點擊右上角的單元格。

上圖顯示了單擊混淆矩陣右上角單元格后的過濾視圖。使用FiftyOne工具查找硬樣本或發(fā)現(xiàn)錯誤注釋是非常方便的。

訪問這些示例非常簡單。我點擊了其中一張圖片,觀察到UI上顯示的置信度為0.00。將鼠標(biāo)懸停在詳細(xì)浮動窗口中的標(biāo)簽上時,它顯示的置信值為0.002。

但是,如果我們想以編程方式詳細(xì)查看視圖中的所有示例或某些選定的示例,我們可以輕松完成。

# if you want to iterate over all the samples in the current view

for sample in session.view:

   softmax_values = torch.softmax(torch.from_numpy(sample.predictions.logits),0).numpy()

   wine_confidence = softmax_values[red_wine_index] + softmax_values[wine_glass_index]

   bagel_confidence = softmax_values[bagel_index]
   

   print(wine_confidence, bagel_confidence)
   

# if you want to iterate over the selected samples in the datset

for sample in dataset[session.selected]:

   softmax_values = torch.softmax(torch.from_numpy(sample.predictions.logits),0).numpy()

   wine_confidence = softmax_values[red_wine_index] + softmax_values[wine_glass_index]

   bagel_confidence = softmax_values[bagel_index]
   

   print(wine_confidence, bagel_confidence)

這些樣本可用于發(fā)現(xiàn)錯誤預(yù)測中的趨勢和模式,并可用于獲取新的訓(xùn)練數(shù)據(jù)以解決這些問題。

結(jié)論

總之,我們查看了FiftyOne庫,這是一個用于分析模型性能的開源工具。

我們了解了Dataset、Samples和FiftyOne應(yīng)用程序。接下來,我們從開放圖像數(shù)據(jù)集[3]創(chuàng)建了一個數(shù)據(jù)集,并使用在圖像網(wǎng)數(shù)據(jù)集[4]上預(yù)先訓(xùn)練的模型計算預(yù)測。我們還研究了如何創(chuàng)建分類報告和混淆矩陣。

FiftyOne中的混淆矩陣圖是一個互動圖。我們學(xué)習(xí)了如何將繪圖附加到FiftyOne會話中,并交互式地過濾樣本以分析錯誤的預(yù)測。

參考引用

image.png

       原文標(biāo)題 : 分析計算機視覺模型的性能

聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯
x
*文字標(biāo)題:
*糾錯內(nèi)容:
聯(lián)系郵箱:
*驗 證 碼:

粵公網(wǎng)安備 44030502002758號