日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

硬核图解,再填猛将!

發布時間:2024/9/15 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 硬核图解,再填猛将! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天,聊一聊人工智能,計算機視覺方向的重頭戲

我們都知道,CV 領域最常規的三大任務是:圖像分類、目標檢測、圖像分割。

圖像的分類和分割算法實戰教程,我在2019年就出過了,想看可以往前翻一翻。

目前,就差目標檢測還沒寫過,雖遲但到,今天它來了

目標檢測

目標檢測,應用非常廣,是非常重要的技術儲備。

目標檢測落地場景豐富,可用度非常高,人臉識別、智能安防系統、無人駕駛、無人機等各個領域,目標檢測都是核心技術。

舉個例子,無人機領域,畫面中的車輛、行人等目標的檢測。

軍事上,目標的精準打擊,也都有目標檢測的身影。

生活上,我們也可以利用檢測做很多事情,隨手一拍。

目標檢測檢測出物體,車輛、樹木,可能有些人會問,這個檢測出來有啥用?

那要是在此基礎上,再識別出這些是什么車、什么樹?

寶馬,奧迪,還是比亞迪?

楊樹,柳樹,還是白楊樹?

再比如,什么品種的貓貓狗狗,什么品牌的衣帽鞋襪。

萬物皆可識別,只需隨手一拍。這就是很多做視覺的公司,都在做的重點方向

這也是,目標檢測+細分類的技術應用的場景之一。先檢測出畫面中的目標,再將檢測出的目標送入更細粒度的分類網絡,識別出堪比人,甚至遠超人的精細水平。

目標檢測,專業一點的概念就是:解決“在哪里?是什么?”的問題,即定位出這個目標的位置并且知道目標物是什么。

基于深度學習的目標檢測算法主要分為兩類:

  • Two Stage:兩階段目標檢測

  • One Stage:端到端目標檢測

Two Stage

Two Stage 是2013年到2015年的主流算法,后來逐漸發展為 One Stage 端到端的目標檢測算法。

Two Stage 算法是先進行區域生成,該區域稱之為 region proposal(簡稱RP,一個有可能包含待檢物體的預選框),再通過卷積神經網絡進行樣本分類。

任務流程:特征提取 --> 生成RP --> 分類/定位回歸。

常見 Two Stage 目標檢測算法有:R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN 和 R-FCN 等。

One Stage

不用 RP,直接在網絡中提取特征來預測物體分類和位置。

任務流程:特征提取–> 分類/定位回歸。

常見的 One Stage 目標檢測算法有:YOLO 系列、SSD 系列、Anchor Free 系列等。

如今,比較常用、實用的目標檢測算法都是 One Stage 的。

從前,一般講解目標檢測都是從兩階段的 R-CNN 系列開始,但說實話,有些老了,一階段的 YOLO 從 v1 都發展到 v5 了。

但并不代表 Faster R-CNN 這些就沒有學的必要,目標檢測的基礎,還是很有必要學習一番的,并且不少公司其實還在用這些算法。

現在,一般公司面試,都愛問 YOLO 系列的算法,YOLO v4、YOLO v5 這些。

今天,先來個比較基礎的,我們從 YOLO v1 談起。

YOLO v1

YOLO 的名字還是很霸氣的:You Only Look Once。

YOLO 之父是 Joseph Redmon,v1 - v3 是他的作品,篇篇頂會,性能也是,開源口碑非常好。

可惜,發布完 v3 就退圈了,后續的 v4 - v5 ,都是其他團隊接手了。

在講解 YOLO v1 之前,重申一下我們的任務:在一張圖片中找出物體,并給出它的類別和位置。

YOLO v1 的核心思想是:采用利用整張圖作為網絡的輸入,直接在輸出層回歸 bounding box 的位置和 bounding box 所屬的類別。

為了照顧新人,這里解釋下 bounding box ,即檢測框,就是目標外圍帶顏色的框框,一般簡稱 bbox。

YOLO v1 的實現,是將一幅圖像分成 SxS 個網格(grid cell)。

哪個目標物體的中心落在這個網格中,則這個網格負責預測這個目標。

論文中,是將圖像分為 7x7 的網格,即上文中的 S=7。如上圖所示,紅色的點,就是負責檢測狗的。

網絡結構

YOLO v1目標檢測一共三個步驟:

  • resize圖片尺寸

  • 輸入網絡,出結果

  • NMS

第一步,resize 很好理解,屬于深度學習的常規操作,就是為了將不同尺寸的圖片適配到統一的網絡結構中,需要 resize 到相同的尺寸。

論文提出的這個網絡結構,輸入層的尺寸是 448x448,因此在將圖片送入網絡前,需要將圖片 resize 到 448x448。

我們直接看下網絡結構,精髓都在這里:

這里設計得很巧妙,可以看到網絡的最終輸出是 7×7×30。還是以這個狗為例,7x7 很好理解,圖像分為 7x7 個區域進行預測。

最終輸出 tensor 的前五個數值,分別是 bbox 的 x,y,w,h,c,即 bbox 的中心坐標 x,y,bbox 的寬高 w,h,bbox 的置信度。

置信度就是算法的自信心得分,越高表示越堅信這個檢測的目標沒錯。

而一個中心點,會檢測 2 個 bbox ,這個操作可以減少漏檢,因為可以適應不同形狀的 bbox,進而提高bbox 的準確率。

2 個 bbox 都會保留,最后通過 NMS 選擇出最佳的 bbox,這個操作最后再講。

而后面的 20 個,就是類別的概率,YOLO v1 是在 VOC 數據集上訓練的,因此一共 20 個類。

因此,tensor 總共加起來就是 7×7×(2×5+20),寫成公式就是:SxSx(Bx5+C)。

這里的問題,可以當作回歸問題來解決的。所有的輸出包括坐標和寬高都定義在0到1之間。

來看一下每個單元格預測的B個(x,y,w,h,confidence)的向量和C的條件概率中,每個參數的含義(假設圖片寬為高為,將圖片分為:

(x,y)是bbox的中心相對于單元格的offset

對于下圖中藍色框的那個單元格坐標為,假設它預測的輸出是紅色框的bbox,設bbox的中心坐標為,那么最終預測出來的是經過歸一化處理的,表示的是中心相對于單元格的offset,計算公式如下:

(w,h)是bbox相對于整個圖片的比例

預測的 bbox 的寬高為 ,表示的是 bbox 的是相對于整張圖片的占比,計算公式如下:

confidence

這個置信度是由兩部分組成,一是格子內是否有目標,二是bbox的準確度。定義置信度為 Object 。

這里,如果格子內有物體,則 Object ,此時置信度等于IoU。如果格子內沒有物體,則 Object ,此時置信度為0。

C類的條件概率

條件概率定義為 Class Object ,表示該單元格存在物體且屬于第 i 類的概率。

在測試的時候每個單元格預測最終輸出的概率定義為:

NMS

經過網絡處理后,將 的結果送入 NMS ,最后即可得到最終的輸出框結果。

NMS,即非極大值抑制,就是將一些冗余框去掉,示意圖如下:

NMS 別看簡單,面試常考題,比如動手實現一個 NMS 代碼之類的。

這個概念千萬不要懵懵懂懂,細節決定成敗。省著被嘲諷:NMS都不會,做什么Detection

學 NMS ,先要理解 IOU。

IOU 即Interp over Union,也就是兩個box區域的交集比上并集,下面的示意圖就很好理解,用于確定兩個框的位置像素距離。

  • 首先計算兩個box左上角點坐標的最大值和右下角坐標的最小值

  • 然后計算交集面積

  • 最后把交集面積除以對應的并集面積

就這簡單,NMS 就是通過計算 IOU 來去除冗余框的,具體的實現思路如下。

以下圖為例,進行說明:

就像上面的圖片一樣,定位一個車輛,最后算法就找出了一堆的方框,我們需要判別哪些矩形框是沒用的。

非極大值抑制的方法是:先假設有6個矩形框,根據分類器的類別分類概率做排序,假設從小到大屬于車輛的概率 分別為A、B、C、D、E、F。

(1)從最大概率矩形框F開始,分別判斷A~E與F的重疊度IOU是否大于某個設定的閾值;

(2)假設B、D與F的重疊度超過閾值,那么就扔掉B、D;并標記第一個矩形框F,是我們保留下來的。

(3)從剩下的矩形框A、C、E中,選擇概率最大的E,然后判斷E與A、C的重疊度,重疊度大于一定的閾值,那么就扔掉;并標記E是我們保留下來的第二個矩形框。

就這樣一直重復,找到所有被保留下來的矩形框。

代碼實現:

#?-------------------------------------------------------- #?Fast?R-CNN #?Copyright?(c)?2015?Microsoft #?Licensed?under?The?MIT?License?[see?LICENSE?for?details] #?Written?by?Ross?Girshick #?--------------------------------------------------------import?numpy?as?npdef?py_cpu_nms(dets,?thresh):"""Pure?Python?NMS?baseline."""#x1、y1、x2、y2、以及score賦值x1?=?dets[:,?0]?????????????????????#?pred?bbox?top_xy1?=?dets[:,?1]?????????????????????#?pred?bbox?top_yx2?=?dets[:,?2]?????????????????????#?pred?bbox?bottom_xy2?=?dets[:,?3]?????????????????????#?pred?bbox?bottom_yscores?=?dets[:,?4]??????????????#?pred?bbox?cls?score#每一個檢測框的面積areas?=?(x2?-?x1?+?1)?*?(y2?-?y1?+?1)????#?pred?bbox?areasorder?=?scores.argsort()[::-1]??????????????#?對pred?bbox按score做降序排序,對應step-2#保留的結果框集合keep?=?[]????while?order.size?>?0:i?=?order[0]??????????#?top-1?score?bboxkeep.append(i)???#保留該類剩余box中得分最高的一個#得到相交區域,左上及右下xx1?=?np.maximum(x1[i],?x1[order[1:]])???#?top-1?bbox(score最大)與order中剩余bbox計算NMSyy1?=?np.maximum(y1[i],?y1[order[1:]])xx2?=?np.minimum(x2[i],?x2[order[1:]])yy2?=?np.minimum(y2[i],?y2[order[1:]])#計算相交的面積,不重疊時面積為0w?=?np.maximum(0.0,?xx2?-?xx1?+?1)h?=?np.maximum(0.0,?yy2?-?yy1?+?1)inter?=?w?*?h#計算IoU:重疊面積?/(面積1+面積2-重疊面積)ovr?=?inter?/?(areas[i]?+?areas[order[1:]]?-?inter)#保留IoU小于閾值的boxinds?=?np.where(ovr?<=?thresh)[0]?????#?這個操作可以對代碼斷點調試理解下,結合step-3,我們希望剔除所有與當前top-1?bbox?IoU?>?thresh的冗余bbox,那么保留下來的bbox,自然就是ovr?<=?thresh的非冗余bbox,其inds保留下來,作進一步篩選#因為ovr數組的長度比order數組少一個,所以這里要將所有下標后移一位order?=?order[inds?+?1]???#?保留有效bbox,就是這輪NMS未被抑制掉的幸運兒,為什么?+ 1?因為ind =?0就是這輪NMS的top-1,剩余有效bbox在IoU計算中與top-1做的計算,inds對應回原數組,自然要做?+1 的映射,接下來就是step-4的循環return?keep????#?最終NMS結果返回if?__name__?==?'__main__':dets?=?np.array([[100,120,170,200,0.98],[20,40,80,90,0.99],[20,38,82,88,0.96],[200,380,282,488,0.9],[19,38,75,91,?0.8]])py_cpu_nms(dets,?0.5)

LOSS

從圖片 resize 到網絡結構,再到 NMS 都講完了,最后再說下算法的重中之重,損失函數。

損失函數是一個復合損失函數,一共是 5 項相加:

更詳細的注釋,可以看這張圖:

簡單解釋下:

所有的損失都是使用平方和誤差公式,暫時先不看公式中的 與 ,輸出的預測數值以及所造成的損失有:

  • 預測框的中心點 。造成的損失是圖五中的第一行。其中 為控制函數,在標簽中包含物體的那些格點處,該值為 1 ;若格點不含有物體,該值為 0。也就是只對那些有真實物體所屬的格點進行損失計算,若該格點不包含物體,那么預測數值不對損失函數造成影響。 數值與標簽用簡單的平方和誤差。

  • 預測框的寬高 。造成的損失是圖五的第二行。 的含義一樣,也是使得只有真實物體所屬的格點才會造成損失。這里對 在損失函數中的處理分別取了根號,原因在于,如果不取根號,損失函數往往更傾向于調整尺寸比較大的預測框。例如,20 個像素點的偏差,對于 800x600 的預測框幾乎沒有影響,此時的IOU數值還是很大,但是對于 30x40 的預測框影響就很大。取根號是為了盡可能的消除大尺寸框與小尺寸框之間的差異。

  • 第三行與第四行,都是預測框的置信度C。當該格點不含有物體時,即 =1, 該置信度的標簽為0;若含有物體時,該置信度的標簽為預測框與真實物體框的IOU數值(IOU計算公式為:兩個框交集的面積除以并集的面積)。

  • 第五行為物體類別概率P,對應的類別位置,該標簽數值為1,其余位置為0,與分類網絡相同。

  • 此時再來看 ? 與 ,YOLO 面臨的物體檢測問題,是一個典型的類別數目不均衡的問題。其中 49 個格點,含有物體的格點往往只有 3、4 個,其余全是不含有物體的格點。此時如果不采取點措施,那么物體檢測的mAP不會太高,因為模型更傾向于不含有物體的格點。 與 的作用,就是讓含有物體的格點,在損失函數中的權重更大,讓模型更加“重視”含有物體的格點所造成的損失。在論文中, 與 的取值分別為 5 與 0.5 。

    最后

    YOLO v1 的代碼實現,有很多,Pytorch 和 Tensorflow 等各種版本都有,因為畢竟屬于出名算法。

    Github 一搜,找個 Star 高的即可。

    推薦閱讀

    Pandas處理數據太慢,來試試Polars吧!

    懶人必備!只需一行代碼,就能導入所有的Python庫

    絕!關于pip的15個使用小技巧

    介紹10個常用的Python內置函數,99.99%的人都在用!

    可能是全網最完整的 Python 操作 Excel庫總結!

    總結

    以上是生活随笔為你收集整理的硬核图解,再填猛将!的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲无码精品一区二区三区 | www.欧美.com | 在线播放无码后入内射少妇 | 国产成人av免费观看 | 日本成人高清 | 午夜精品久久久久久99热 | 亚洲国产aⅴ成人精品无吗 日韩乱论 | 欧美日韩国产成人在线 | 在线视频日韩欧美 | 久久久精品久久久久久 | 欧美又粗又长又爽做受 | 日韩中文久久 | 99视频精品免费 | 都市激情第一页 | 黄色av日韩 | 污黄网站在线观看 | 欧美激情在线观看一区 | 日韩av不卡在线播放 | 欧美综合久久 | 欧美专区视频 | 青青操原 | 亚洲精华国产精华精华液网站 | 性色国产成人久久久精品 | 锦绣未央在线观看 | 久久久精品免费观看 | 中文字幕无码乱人伦 | 一区二区精品视频 | 免费网站看av | 中文在线中文资源 | 欧美毛片在线观看 | 俄罗斯乱妇 | 精品无码成人久久久久久免费 | 天堂成人av | 这里只有精品视频在线 | 高清三区 | 精品少妇av | 特级西西444www高清大胆 | 色香色香欲天天天影视综合网 | 婷婷九九| 亚洲aaaa级特黄毛片 | 人人澡人人插 | 精品人妻一区二区三区换脸明星 | 欧美性动态图 | 国产日韩欧美在线 | 中国 免费 av | 欧美激情偷拍 | 欧美性视频在线播放 | 亚洲人体视频 | 一本久久a精品一合区久久久 | 国产熟女精品视频 | 91传媒网站 | 欧美日韩一区二区中文字幕 | 天天超碰 | 国产精品4p | 欧美18一20男同69gay | 奶水旺盛的女人伦理 | 加勒比视频在线观看 | av网址在线免费观看 | 在线视频观看你懂得 | 亚洲视频一区二区三区四区 | 偷拍xxxx| 无码国精品一区二区免费蜜桃 | 丁香六月色 | 三级视频在线观看 | 天天干夜夜艹 | 泽村玲子在线 | 在线视频观看你懂得 | 国产成人午夜精品 | 91在线公开视频 | 日本一区二区三区在线观看视频 | 欧美在线视频播放 | 一级黄色毛毛片 | 日本女人毛茸茸 | 九色网站在线观看 | 精品久久在线 | 国产成年视频 | 国产h片在线观看 | 在线观看亚洲一区 | 亚欧激情 | 吃奶av| 久久久片 | 污污污污污污www网站免费 | 久久精品视频中文字幕 | 蜜桃传媒一区二区亚洲av | 人人澡人人爽 | 狠狠综合网 | 欧美日韩视频在线观看一区 | 大学生三级中国dvd 日韩欧美一区二区区 | 亚洲 国产 日韩 欧美 | 成人免费在线播放视频 | 亚洲v| 尤物最新网址 | 91色片| 国产sm调教视频 | 国产在线观看黄 | 瑟瑟网站免费 | 99热这里都是精品 | 国产一区二区三区四区五区六区 | 日韩一二三四五区 |