动手学CV-目标检测入门教程:基本概念
3.1 目標(biāo)檢測基本概念
本文來自開源組織 DataWhale 🐳 CV小組創(chuàng)作的目標(biāo)檢測入門教程。
對應(yīng)開源項(xiàng)目 《動手學(xué)CV-Pytorch》 的第3章的內(nèi)容,教程中涉及的代碼也可以在項(xiàng)目中找到,后續(xù)會持續(xù)更新更多的優(yōu)質(zhì)內(nèi)容,歡迎??。
如果使用我們教程的內(nèi)容或圖片,請?jiān)谖恼滦涯课恢米⒚魑覀兊膅ithub主頁鏈接:https://github.com/datawhalechina/dive-into-cv-pytorch
3.1.1 什么是目標(biāo)檢測
目標(biāo)檢測是計(jì)算機(jī)視覺中的一個(gè)重要任務(wù),近年來傳統(tǒng)目標(biāo)檢測方法已經(jīng)難以滿足人們對目標(biāo)檢測效果的要求,隨著深度學(xué)習(xí)在計(jì)算機(jī)視覺任務(wù)上取得的巨大進(jìn)展,目前基于深度學(xué)習(xí)的目標(biāo)檢測算法已經(jīng)成為主流。
相比較于基于深度學(xué)習(xí)的圖像分類任務(wù),目標(biāo)檢測任務(wù)更具難度。
具體區(qū)別如圖3-1所示。
圖像分類:只需要判斷輸入的圖像中是否包含感興趣物體。
目標(biāo)檢測:需要在識別出圖片中目標(biāo)類別的基礎(chǔ)上,還要精確定位到目標(biāo)的具體位置,并用外接矩形框標(biāo)出。
圖3-1 分類和目標(biāo)檢測任務(wù)示意圖3.1.2 目標(biāo)檢測的思路
自2012年Alex Krizhevsky憑借Alex在ImageNet圖像分類挑戰(zhàn)賽中拿下冠軍之后,深度學(xué)習(xí)在圖像識別尤其是圖像分類領(lǐng)域開始大放異彩,大眾的視野也重新回到深度神經(jīng)網(wǎng)絡(luò)中。緊接著,不斷有更深更復(fù)雜的網(wǎng)絡(luò)出現(xiàn),一再刷新ImageNet圖像分類比賽的記錄。
大家發(fā)現(xiàn),通過合理的構(gòu)造,神經(jīng)網(wǎng)絡(luò)可以用來預(yù)測各種各樣的實(shí)際問題。于是人們開始了基于CNN的目標(biāo)檢測研究, 但是隨著進(jìn)一步的探索大家發(fā)現(xiàn),似乎CNN并不善于直接預(yù)測坐標(biāo)信息。并且一幅圖像中可能出現(xiàn)的物體個(gè)數(shù)也是不定的,模型如何構(gòu)建也比較棘手。
因此,人們就想,如果知道了圖中某個(gè)位置存在物體,再將對應(yīng)的局部區(qū)域送入到分類網(wǎng)絡(luò)中去進(jìn)行判別,那我不就可以知道圖像中每個(gè)物體的位置和類別了嗎?
但是,怎么樣才能知道每個(gè)物體的位置呢?顯然我們是沒辦法知道的,但是我們可以去猜啊!所謂猜,其實(shí)就是通過滑窗的方式,羅列圖中各種可能的區(qū)域,一個(gè)個(gè)去試,分別送入到分類網(wǎng)絡(luò)進(jìn)行分類得到其類別,同時(shí)我們會對當(dāng)前的邊界框進(jìn)行微調(diào),這樣對于圖像中每個(gè)區(qū)域都能得到(class,x1,y1,x2,y2)五個(gè)屬性,匯總后最終就得到了圖中物體的類別和坐標(biāo)信息。
總結(jié)一下我們的這種方案思路:先確立眾多候選框,再對候選框進(jìn)行分類和微調(diào)。
觀察下圖2-1,更形象的理解下這種思想:
圖3-2 從分類角度去看目標(biāo)檢測圖3-2展示了一個(gè)通過遍歷各個(gè)區(qū)域,然后逐個(gè)分類去完成目標(biāo)檢測任務(wù)的過程示例。在待識別圖上預(yù)設(shè)一個(gè)框,然后逐像素遍歷,就能得到大量候選框(這里僅為示意圖,圖上只展示了3個(gè)框用于說明問題,具體數(shù)量由圖像大小和預(yù)設(shè)框大小決定),每個(gè)框送入到分類網(wǎng)絡(luò)分類都有一個(gè)得分(代表當(dāng)前框中有一個(gè)船的置信度),那么得分最高的就代表識別的最準(zhǔn)確的框,其位置就是最終要檢測的目標(biāo)的位置。
以上就是最初的基于深度學(xué)習(xí)的目標(biāo)檢測問題解決思路,RCNN,YOLO,SSD等眾多經(jīng)典網(wǎng)絡(luò)模型都是沿著這個(gè)思路優(yōu)化發(fā)展的。
本文會基于以上思路,帶領(lǐng)大家從0開始一步步搭建一個(gè)目標(biāo)檢測模型,并完成模型的訓(xùn)練測試及評價(jià)!
3.1.3 目標(biāo)框定義方式
任何圖像任務(wù)的訓(xùn)練數(shù)據(jù)都要包括兩項(xiàng),圖片和真實(shí)標(biāo)簽信息,通常叫做GT。
圖像分類中,標(biāo)簽信息是類別。目標(biāo)檢測的標(biāo)簽信息除了類別label以外,需要同時(shí)包含目標(biāo)的位置信息,也就是目標(biāo)的外接矩形框bounding box。
用來表達(dá)bbox的格式通常有兩種,(x1, y1, x2, y2) 和 (c_x, c_y, w, h) ,如圖3-3所示:
圖3-3 目標(biāo)框定義方式之所以使用兩種不同的目標(biāo)框信息表達(dá)格式,是因?yàn)閮煞N格式會分別在后續(xù)不同場景下更加便于計(jì)算。
兩種格式互相轉(zhuǎn)換的實(shí)現(xiàn)在utils.py中,代碼也非常簡單:
def xy_to_cxcy(xy):"""Convert bounding boxes from boundary coordinates (x_min, y_min, x_max, y_max) to center-size coordinates (c_x, c_y, w, h).:param xy: bounding boxes in boundary coordinates, a tensor of size (n_boxes, 4):return: bounding boxes in center-size coordinates, a tensor of size (n_boxes, 4)"""return torch.cat([(xy[:, 2:] + xy[:, :2]) / 2, # c_x, c_yxy[:, 2:] - xy[:, :2]], 1) # w, hdef cxcy_to_xy(cxcy):"""Convert bounding boxes from center-size coordinates (c_x, c_y, w, h) to boundary coordinates (x_min, y_min, x_max, y_max).:param cxcy: bounding boxes in center-size coordinates, a tensor of size (n_boxes, 4):return: bounding boxes in boundary coordinates, a tensor of size (n_boxes, 4)"""return torch.cat([cxcy[:, :2] - (cxcy[:, 2:] / 2), # x_min, y_mincxcy[:, :2] + (cxcy[:, 2:] / 2)], 1) # x_max, y_max3.1.4 交并比(IoU)
在目標(biāo)檢測任務(wù)中,關(guān)于IOU的計(jì)算貫穿整個(gè)模型的訓(xùn)練測試和評價(jià)過程,是非常非常重要的一個(gè)概念,其目的是用來衡量兩個(gè)目標(biāo)框的重疊程度。
IoU的全稱是交并比(Intersection over Union),表示兩個(gè)目標(biāo)框的交集占其并集的比例。圖3-4為IOU計(jì)算示意圖:
圖3-4 IOU計(jì)算示意圖圖中可以看到,分子中黃色區(qū)域?yàn)榧tbbox和綠bbox的交集,分母中黃+紅+綠區(qū)域?yàn)榧tbbox和綠bbox的并集,兩者之比即為iou。
那么具體怎么去計(jì)算呢?這里給出計(jì)算流程的簡述:
1.首先獲取兩個(gè)框的坐標(biāo),紅框坐標(biāo): 左上(red_x1, red_y1), 右下(red_x2, red_y2),綠框坐標(biāo): 左上(green_x1, green_y1),右下(green_x2, green_y2) 2.計(jì)算兩個(gè)框左上點(diǎn)的坐標(biāo)最大值:(max(red_x1, green_x1), max(red_y1, green_y1)), 和右下點(diǎn)坐標(biāo)最小值:(min(red_x2, green_x2), min(red_y2, green_y2)) 3.利用2算出的信息計(jì)算黃框面積:yellow_area 4.計(jì)算紅綠框的面積:red_area 和 green_area 5.iou = yellow_area / (red_area + green_area - yellow_area)如果文字表述的不夠清晰,就再看下代碼:
def find_intersection(set_1, set_2):""" Find the intersection of every box combination between two sets of boxes that are in boundary coordinates.:param set_1: set 1, a tensor of dimensions (n1, 4) :param set_2: set 2, a tensor of dimensions (n2, 4):return: intersection of each of the boxes in set 1 with respect to each of the boxes in set 2, a tensor of dimensions (n1, n2)"""# PyTorch auto-broadcasts singleton dimensionslower_bounds = torch.max(set_1[:, :2].unsqueeze(1), set_2[:, :2].unsqueeze(0)) # (n1, n2, 2)upper_bounds = torch.min(set_1[:, 2:].unsqueeze(1), set_2[:, 2:].unsqueeze(0)) # (n1, n2, 2)intersection_dims = torch.clamp(upper_bounds - lower_bounds, min=0) # (n1, n2, 2)return intersection_dims[:, :, 0] * intersection_dims[:, :, 1] # (n1, n2)def find_jaccard_overlap(set_1, set_2):""" Find the Jaccard Overlap (IoU) of every box combination between two sets of boxes that are in boundary coordinates.:param set_1: set 1, a tensor of dimensions (n1, 4):param set_2: set 2, a tensor of dimensions (n2, 4):return: Jaccard Overlap of each of the boxes in set 1 with respect to each of the boxes in set 2, a tensor of dimensions (n1, n2)"""# Find intersectionsintersection = find_intersection(set_1, set_2) # (n1, n2)# Find areas of each box in both setsareas_set_1 = (set_1[:, 2] - set_1[:, 0]) * (set_1[:, 3] - set_1[:, 1]) # (n1)areas_set_2 = (set_2[:, 2] - set_2[:, 0]) * (set_2[:, 3] - set_2[:, 1]) # (n2)# Find the union# PyTorch auto-broadcasts singleton dimensionsunion = areas_set_1.unsqueeze(1) + areas_set_2.unsqueeze(0) - intersection # (n1, n2)return intersection / union # (n1, n2)以上代碼位于utils.py腳本的find_intersection和find_jaccard_overlap
3.1.5 小結(jié)
以上便是本小節(jié)的全部內(nèi)容了。
本小節(jié)我們首先介紹了目標(biāo)檢測的問題背景,隨后分析了一個(gè)實(shí)現(xiàn)目標(biāo)檢測的解決思路,這也是眾多經(jīng)典檢測網(wǎng)絡(luò)和本章要介紹的模型所采用的思路(即先確立眾多候選框,再對候選框進(jìn)行分類和微調(diào))。最后介紹了bbox和IoU這兩個(gè)目標(biāo)檢測相關(guān)的基本概念。
下一小節(jié),我們將會從數(shù)據(jù)入手,介紹下目標(biāo)檢測領(lǐng)域最常見的一個(gè)數(shù)據(jù)集VOC,以及數(shù)據(jù)讀取相關(guān)的代碼。
總結(jié)
以上是生活随笔為你收集整理的动手学CV-目标检测入门教程:基本概念的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: controller属于哪一层_孺教网分
- 下一篇: maskrcnn用于目标检测_用于目标检