訂閱
糾錯(cuò)
加入自媒體

分析計(jì)算機(jī)視覺模型的性能

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

介紹

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

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

FiftyOne安裝[1]

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

[注意:對(duì)于M1芯片的MacBooks,你需要手動(dòng)設(shè)置MongoDB后端,因?yàn)槔壍腄B安裝無法開箱即用。

conda create -n fo python=3.8 -y

conda activate fo

pip install fiftyone

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

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

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

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

你可以使用以下代碼實(shí)例化名為“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ù)集由存儲(chǔ)與任何給定數(shù)據(jù)示例相關(guān)的信息的示例類對(duì)象組成。每個(gè)示例都有一個(gè)文件路徑作為必填字段。除此之外,只要數(shù)據(jù)類型在所有示例中一致,你可以添加任意多個(gè)關(guān)鍵字字段。讓我們看看下面的一個(gè)例子。

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

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

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

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

方法論

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

下面的代碼將從驗(yàn)證拆分中下載Wine和Bagel類的圖像,并將它們注冊(cè)到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)    

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

但是對(duì)于我們的示例評(píng)估,我們需要?jiǎng)?chuàng)建一個(gè)ground_truth字段,其中包含fo.Classification對(duì)象。

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

這里需要注意的是,你需要對(duì)每個(gè)樣本調(diào)用save方法,以便將更改反映在數(shù)據(jù)庫中。如果為一個(gè)示例創(chuàng)建了一個(gè)新字段,所有其他示例都將使用默認(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()

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

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

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

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

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

我們將使用預(yù)訓(xùn)練的模型對(duì)數(shù)據(jù)集進(jìn)行預(yù)測(cè),然后進(jìn)行評(píng)估。我選擇了在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ù)測(cè)標(biāo)簽字段。但是,它將為1000個(gè)imagenet類中的樣本分配argmax類標(biāo)簽和置信度。

對(duì)于我們的用例,我們只需要與Wine和Bagel類別相關(guān)的那些。我們也通過指定store_logits=True將logits信息存儲(chǔ)在預(yù)測(cè)字段中。接下來,我們找到感興趣的類的相關(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;谀膫(gè)置信度更大來分配預(yù)測(cè)標(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)行評(píng)估的一切。

FiftyOne性能評(píng)估

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

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

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")

要查看分類報(bào)告,我們可以簡(jiǎn)單地使用print_report方法。

results.print_report()

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

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

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

cm = results.plot_confusion_matrix()

cm.show()

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

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

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

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

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

訪問這些示例非常簡(jiǎn)單。我點(diǎn)擊了其中一張圖片,觀察到UI上顯示的置信度為0.00。將鼠標(biāo)懸停在詳細(xì)浮動(dòng)窗口中的標(biāo)簽上時(shí),它顯示的置信值為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)錯(cuò)誤預(yù)測(cè)中的趨勢(shì)和模式,并可用于獲取新的訓(xùn)練數(shù)據(jù)以解決這些問題。

結(jié)論

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

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

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

參考引用

image.png

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

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

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無評(píng)論

暫無評(píng)論

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

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