近年來(lái),人們?cè)絹?lái)越認(rèn)識(shí)到深入理解機(jī)器學(xué)習(xí)數(shù)據(jù)(ML-data)的必要性。不過(guò),鑒于檢測(cè)大型數(shù)據(jù)集往往需要耗費(fèi)大量人力物力,它在計(jì)算機(jī)視覺(jué)(computer vision)領(lǐng)域的廣泛應(yīng)用,尚有待進(jìn)一步開(kāi)發(fā)。
通常,在物體檢測(cè)(Object Detection,屬于計(jì)算機(jī)視覺(jué)的一個(gè)子集)中,通過(guò)定義邊界框,來(lái)定位圖像中的物體,不僅可以識(shí)別物體,還能夠了解物體的上下文、大小、以及與場(chǎng)景中其他元素的關(guān)系。同時(shí),針對(duì)類的分布、物體大小的多樣性、以及類出現(xiàn)的常見(jiàn)環(huán)境進(jìn)行全面了解,也有助于在評(píng)估和調(diào)試中發(fā)現(xiàn)訓(xùn)練模型中的錯(cuò)誤模式,從而更有針對(duì)性地選擇額外的訓(xùn)練數(shù)據(jù)。
在實(shí)踐中,我往往會(huì)采取如下方法:
- 利用預(yù)訓(xùn)練的模型或基礎(chǔ)模型的增強(qiáng)功能,為數(shù)據(jù)添加結(jié)構(gòu)。例如:創(chuàng)建各種圖像嵌入,并采用 t-SNE 或 UMAP 等降維技術(shù)。這些都可以生成相似性的地圖,從而方便數(shù)據(jù)的瀏覽。此外,使用預(yù)先訓(xùn)練的模型進(jìn)行檢測(cè),也可以方便提取上下文。
- 使用能夠?qū)⒋祟惤Y(jié)構(gòu)與原始數(shù)據(jù)的統(tǒng)計(jì)和審查功能整合在一起的可視化工具。
下面,我將介紹如何使用Renumics Spotlight,來(lái)創(chuàng)建交互式的對(duì)象檢測(cè)可視化。作為示例,我將試著:
- 為圖像中的人物探測(cè)器建立可視化。
- 可視化包括相似性地圖、篩選器和統(tǒng)計(jì)數(shù)據(jù),以便瀏覽數(shù)據(jù)。
- 通過(guò)地面實(shí)況(Ground Truth)和 Ultralytics YOLOv8 的檢測(cè)詳細(xì),查看每一張圖像。
在Renumics Spotlight上的目標(biāo)可視化。資料來(lái)源:作者創(chuàng)建
下載COCO數(shù)據(jù)集中的人物圖像
首先,通過(guò)如下命令安裝所需的軟件包:
!pip install fiftyone ultralytics renumics-spotlight
利用FiftyOne的可恢復(fù)性下載功能,您可以從COCO 數(shù)據(jù)集處下載各種圖像。通過(guò)簡(jiǎn)單的參數(shù)設(shè)置,我們即可下載包含一到多個(gè)人物的 1,000 幅圖像。具體代碼如下:
importpandasaspd
importnumpyasnp
importfiftyone.zooasfoz
# 從 COCO 數(shù)據(jù)集中下載 1000 張帶人的圖像
dataset = foz.load_zoo_dataset(
"coco-2017"、
split="validation"、
label_types=[
"detections"、
],
classes=["person"]、
max_samples=1000、
dataset_name="coco-2017-person-1k-validations"、
)
接著,您可以使用如下代碼:
def xywh_too_xyxyn(bbox):
"" convert from xywh to xyxyn format """
return[bbox[0], bbox[1], bbox[0] + bbox[2], bbox[1] + bbox[3]].
行 = []
fori, samplein enumerate(dataset):
labels = [detection.labelfordetectioninsample.ground_truth.detections] bboxs = [...
bboxs = [
xywh_too_xyxyn(detection.bounding_box)
fordetectioninsample.ground_truth.detections
]
bboxs_persons = [bboxforbbox, labelin zip(bboxs, labels)iflabel =="person"] 行。
row.append([sample.filepath, labels, bboxs, bboxs_persons])
df = pd.DataFrame(row, columns=["filepath","categories", "bboxs", "bboxs_persons"])
df["major_category"] = df["categories"].apply(
lambdax:max(set(x) -set(["person"]), key=x.count)
if len(set(x)) >1
else "only person"。
)
將數(shù)據(jù)準(zhǔn)備為 Pandas DataFrame,其中的列包括有:文件路徑、邊框盒(bounding boxe)類別、邊框盒、邊框盒包含的人物、以及主要類別(盡管有人物),以指定圖像中人物的上下文:
然后,您可以通過(guò) Spotlight 將其可視化:
From renumics import spotlight
spotlight.show(df)
您可以使用檢查器視圖中的添加視圖按鈕,并在邊框視圖中選擇bboxs_persons和filepath,以顯示帶有圖像的相應(yīng)邊框:
嵌入豐富的數(shù)據(jù)
要使得數(shù)據(jù)具有結(jié)構(gòu)性,我們可以采用各種基礎(chǔ)模型的圖像嵌入(即:密集向量表示)。為此,您可以使用 UMAP 或 t-SNE 等進(jìn)一步降維技術(shù),將整個(gè)圖像的Vision Transformer(ViT)嵌入應(yīng)用到數(shù)據(jù)集的結(jié)構(gòu)化,從而提供圖像的二維相似性圖。此外,您還可以使用預(yù)訓(xùn)練對(duì)象檢測(cè)器的輸出結(jié)果,按照包含對(duì)象的大小或數(shù)量,對(duì)數(shù)據(jù)進(jìn)行分類,進(jìn)而構(gòu)建數(shù)據(jù)。由于 COCO 數(shù)據(jù)集已經(jīng)提供了此方面的信息,因此我們完全可以直接使用它。
由于Spotlight 集成了對(duì)google/vit-base-patch16-224-in21k(ViT)模型和UMAP 的支持,因此當(dāng)您使用文件路徑創(chuàng)建各種嵌入時(shí),它將會(huì)被自動(dòng)應(yīng)用:
spotlight.show(df, embed=["filepath"])
通過(guò)上述代碼,Spotlight 將各種嵌入進(jìn)行計(jì)算,并應(yīng)用 UMAP 在相似性地圖中顯示結(jié)果。其中,不同的顏色代表了主要的類別。據(jù)此,您可以使用相似性地圖來(lái)瀏覽數(shù)據(jù):
預(yù)訓(xùn)練YOLOv8的結(jié)果
可用于快速識(shí)別物體的Ultralytics YOLOv8,是一套先進(jìn)的物體檢測(cè)模型。它專為快速圖像處理而設(shè)計(jì),適用于各種實(shí)時(shí)檢測(cè)任務(wù),特別是在被應(yīng)用于大量數(shù)據(jù)時(shí),用戶無(wú)需浪費(fèi)太多的等待時(shí)間。
為此,您可以首先加載預(yù)訓(xùn)練模型:
From ultralytics import YOLO
detection_model = YOLO("yolov8n.pt")
并執(zhí)行各種檢測(cè):
detections = []
forfilepathindf["filepath"].tolist():
detection = detection_model(filepath)[0]
detections.append(
{
"yolo_bboxs":[np.array(box.xyxyn.tolist())[0]forboxindetection.boxes]、
"yolo_conf_persons": np.mean([
np.array(box.conf.tolist())[0].
forboxindetection.boxes
ifdetection.names[int(box.cls)] =="person"]), np.mean(
]),
"yolo_bboxs_persons":[
np.array(box.xyxyn.tolist())[0]
forboxindetection.boxes
ifdetection.names[int(box.cls)] =="person
],
"yolo_categories": np.array(
[np.array(detection.names[int(box.cls)])forboxindetection.boxes], "yolo_categories": np.array(
),
}
)
df_yolo = pd.DataFrame(detections)
在12gb的GeForce RTX 4070 Ti上,上述過(guò)程在不到20秒的時(shí)間內(nèi)便可完成。接著,您可以將結(jié)果包含在DataFrame中,并使用Spotlight將其可視化。請(qǐng)參考如下代碼:
df_merged = pd.concat([df, df_yolo], axis=1)
spotlight.show(df_merged, embed=["filepath"])
下一步,Spotlight將再次計(jì)算各種嵌入,并應(yīng)用UMAP到相似度圖中顯示結(jié)果。不過(guò)這一次,您可以為檢測(cè)到的對(duì)象選擇模型的置信度,并使用相似度圖在置信度較低的集群中導(dǎo)航檢索。畢竟,鑒于這些圖像的模型是不確定的,因此它們通常有一定的相似度。
當(dāng)然,上述簡(jiǎn)短的分析也表明了,此類模型在如下場(chǎng)景中會(huì)遇到系統(tǒng)性的問(wèn)題:
- 由于列車體積龐大,站在車廂外的人顯得非常渺小
- 對(duì)于巴士和其他大型車輛而言,車內(nèi)的人員幾乎看不到
- 有人站在飛機(jī)的外面
- 食物的特寫圖片上有人的手或手指
您可以判斷這些問(wèn)題是否真的會(huì)影響您的人員檢測(cè)目標(biāo),如果是的話,則應(yīng)考慮使用額外的訓(xùn)練數(shù)據(jù),來(lái)增強(qiáng)數(shù)據(jù)集,以優(yōu)化模型在這些特定場(chǎng)景中的性能。
小結(jié)
綜上所述,預(yù)訓(xùn)練模型和 Spotlight 等工具的使用,可以讓我們的對(duì)象檢測(cè)可視化過(guò)程變得更加容易,進(jìn)而增強(qiáng)數(shù)據(jù)科學(xué)的工作流程。您可以使用自己的數(shù)據(jù)去嘗試和體驗(yàn)上述代碼。
譯者介紹
陳峻(Julian Chen),51CTO社區(qū)編輯,具有十多年的IT項(xiàng)目實(shí)施經(jīng)驗(yàn),善于對(duì)內(nèi)外部資源與風(fēng)險(xiǎn)實(shí)施管控,專注傳播網(wǎng)絡(luò)與信息安全知識(shí)與經(jīng)驗(yàn)。
原文標(biāo)題:How to Explore and Visualize ML-Data for Object Detection in Images,作者:Markus Stoll
鏈接:https://itnext.io/how-to-explore-and-visualize-ml-data-for-object-detection-in-images-88e074f46361。