分析計(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è)。
參考引用
原文標(biāo)題 : 分析計(jì)算機(jī)視覺模型的性能
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
即日-12.26立即報(bào)名>>> 【在線會(huì)議】村田用于AR/VR設(shè)計(jì)開發(fā)解決方案
-
1月8日火熱報(bào)名中>> Allegro助力汽車電氣化和底盤解決方案優(yōu)化在線研討會(huì)
-
即日-1.14火熱報(bào)名中>> OFweek2025中國(guó)智造CIO在線峰會(huì)
-
即日-1.24立即參與>>> 【限時(shí)免費(fèi)】安森美:Treo 平臺(tái)帶來出色的精密模擬
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書》
-
精彩回顧立即查看>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
推薦專題
-
2
- 1 人形機(jī)器人核心零部件,誰是盈利最強(qiáng)企業(yè)?
- 2 AI Agent現(xiàn)狀如何?聊聊近期國(guó)內(nèi)的智能體市場(chǎng)動(dòng)向
- 3 5nm重大突破,研祥智能助力半導(dǎo)體企業(yè)高效發(fā)展!
- 4 人形機(jī)器人引爆“PEEK材料”!概念股梳理(名單)
- 5 馬云沒回牌桌,但重注全壓在了
- 6 7 豆包AI登頂國(guó)內(nèi)第一!概念股梳理(名單)
- 8 押注AI王者歸來,歌爾股份“智能體”在下一盤“大棋”
- 9 AI超級(jí)應(yīng)用什么時(shí)候才能出現(xiàn)?
- 10 英偉達(dá)迎來當(dāng)頭一棒
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容