日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

DBNet详解

發(fā)布時(shí)間:2023/12/29 编程问答 109 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DBNet详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 創(chuàng)新點(diǎn)
  • 算法的整體架構(gòu)
  • 自適應(yīng)閾值(Adaptive threshhold)
  • 二值化
    • 標(biāo)準(zhǔn)二值化
    • 可微二值(differentiable Binarization)
    • 直觀展示
  • 可形變卷積(Deformable convolution)
  • 標(biāo)簽的生成
    • PSENet標(biāo)簽生成
    • DBNet標(biāo)簽生成
  • 損失函數(shù)
  • 后處理
  • 代碼閱讀
    • 數(shù)據(jù)預(yù)處理
      • 入口
      • AugmentDetectionData(數(shù)據(jù)增強(qiáng)類(lèi))
      • RandomCropData(數(shù)據(jù)裁剪類(lèi))
      • MakeICDARData(數(shù)據(jù)重新組織類(lèi))
      • MakeSegDetectionData(生成概率圖和對(duì)應(yīng)mask類(lèi))
      • MakeBorderMap(生成閾值圖和對(duì)應(yīng)Mask類(lèi))
      • NormalizeImage
      • FilterKeys
    • 模型結(jié)構(gòu)
      • 骨干網(wǎng)絡(luò)和FPN
      • head部分(decoder)
        • binary
        • thresh
        • step_function
    • 損失函數(shù)
      • binary loss
      • thresh loss
      • thresh_binary loss
    • 邏輯推理
  • 補(bǔ)充
    • 語(yǔ)義分割中的loss function
      • cross entropy loss
      • weighted loss
      • focal loss
      • dice soft loss
        • Dice系數(shù)計(jì)算
        • Dice loss
        • 梯度分析
        • 總結(jié)
      • soft IOU loss
    • 總結(jié)
        • 總結(jié)
      • soft IOU loss
    • 總結(jié)

創(chuàng)新點(diǎn)

? 本文的最大創(chuàng)新點(diǎn)。在基于分割的文本檢測(cè)網(wǎng)絡(luò)中,最終的二值化map都是使用的固定閾值來(lái)獲取,并且閾值不同對(duì)性能影響較大。本文中,對(duì)每一個(gè)像素點(diǎn)進(jìn)行自適應(yīng)二值化,二值化閾值由網(wǎng)絡(luò)學(xué)習(xí)得到,徹底將二值化這一步驟加入到網(wǎng)絡(luò)里一起訓(xùn)練,這樣最終的輸出圖對(duì)于閾值就會(huì)非常魯棒。

和常規(guī)基于語(yǔ)義分割算法的區(qū)別是多了一條threshold map分支,該分支的主要目的是和分割圖聯(lián)合得到更接近二值化的二值圖,屬于輔助分支。其余操作就沒(méi)啥了。整個(gè)核心知識(shí)就這些了。

算法的整體架構(gòu)

  • 首先,圖像輸入特征提取主干,提取特征;
  • 其次,特征金字塔上采樣到相同的尺寸,并進(jìn)行特征級(jí)聯(lián)得到特征F;
  • 然后,特征F用于預(yù)測(cè)概率圖(probability map P)和閾值圖(threshold map T)
  • 最后,通過(guò)P和F計(jì)算近似二值圖(approximate binary map B)

在訓(xùn)練期間對(duì)P,T,B進(jìn)行監(jiān)督訓(xùn)練,P和B是用的相同的監(jiān)督信號(hào)(label)。在推理時(shí),只需要P或B就可以得到文本框。

網(wǎng)絡(luò)輸出:

1.probability map, w*h*1 , 代表像素點(diǎn)是文本的概率

2.threshhold map, w*h*1, 每個(gè)像素點(diǎn)的閾值

3.binary map, w*h*1, 由1,2計(jì)算得到,計(jì)算公式為DB公式

自適應(yīng)閾值(Adaptive threshhold)

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-V5RaeceH-1610966579215)(C:\F\notebook\DB\20200922201346491.png)]

文中指出傳統(tǒng)的文本檢測(cè)算法主要是圖中藍(lán)色線,處理流程如下:

  • 首先,通過(guò)設(shè)置一個(gè)固定閾值將分割網(wǎng)絡(luò)訓(xùn)練得到的概率圖(segmentation map)轉(zhuǎn)化為二值圖(binarization map);
  • 然后,使用一些啟發(fā)式技術(shù)(例如像素聚類(lèi))將像素分組為文本實(shí)例。

而DBNet使用紅色線,思路:

通過(guò)網(wǎng)絡(luò)去預(yù)測(cè)圖片每個(gè)位置處的閾值,而不是采用一個(gè)固定的值,這樣就可以很好將背景與前景分離出來(lái),但是這樣的操作會(huì)給訓(xùn)練帶來(lái)梯度不可微的情況,對(duì)此對(duì)于二值化提出了一個(gè)叫做Differentiable Binarization來(lái)解決不可微的問(wèn)題。

? 閾值圖(threshhold map)使用流程如圖2所示,使用閾值map和不使用閾值map的效果對(duì)比如圖6所示,從圖6?中可以看到,即使沒(méi)用帶監(jiān)督的閾值map,閾值map也會(huì)突出顯示文本邊界區(qū)域,這說(shuō)明邊界型閾值map對(duì)最終結(jié)果是有利的。所以,本文在閾值map上選擇監(jiān)督訓(xùn)練,已達(dá)到更好的表現(xiàn)

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-4gDERWPU-1610966579221)(C:\F\notebook\DB\20200922201612829.png)]

二值化

標(biāo)準(zhǔn)二值化

? 一般使用分割網(wǎng)絡(luò)(segmentation network)產(chǎn)生的概率圖(probability map P),將P轉(zhuǎn)化為一個(gè)二值圖P,當(dāng)像素為1的時(shí)候,認(rèn)定其為有效的文本區(qū)域,同時(shí)二值處理過(guò)程:

i和j代表了坐標(biāo)點(diǎn)的坐標(biāo),t是預(yù)定義的閾值;

可微二值(differentiable Binarization)

公式1是不可微的,所以沒(méi)法直接用于訓(xùn)練,本文提出可微的二值化函數(shù),如下(其實(shí)就是一個(gè)帶系數(shù)的sigmoid):

就是近似二值圖;T代表從網(wǎng)絡(luò)中學(xué)習(xí)到的自適應(yīng)閾值圖;k是膨脹因子(經(jīng)驗(yàn)性設(shè)置k=50).

? 這個(gè)近似的二值化函數(shù)的表現(xiàn)類(lèi)似于標(biāo)準(zhǔn)的二值化函數(shù),如圖4所表示,但是因?yàn)榭晌?#xff0c;所以可以直接用于網(wǎng)絡(luò)訓(xùn)練,基于自適應(yīng)閾值可微二值化不僅可以幫助區(qū)分文本區(qū)域和背景,而且可以將連接緊密的文本實(shí)例分離出來(lái)。

? 為了說(shuō)明DB模塊的引入對(duì)于聯(lián)合訓(xùn)練的優(yōu)勢(shì),作者對(duì)該函數(shù)進(jìn)行梯度分析,也就是對(duì)approximate
binary map進(jìn)行求導(dǎo)分析,由于是sigmod輸出,故假設(shè)Loss是bce,對(duì)于label為0或者1的位置,其Loss函數(shù)可以重寫(xiě)為:

x表示probability map-threshold map,最后一層關(guān)于x的梯度很容易計(jì)算:

? 看上圖右邊,(b)圖是當(dāng)label=1,x預(yù)測(cè)值從-1到1的梯度,可以發(fā)現(xiàn),當(dāng)k=50時(shí)候梯度遠(yuǎn)遠(yuǎn)大于k=1,錯(cuò)誤的區(qū)域梯度更大,對(duì)于label=0的情況分析也是一樣的。故:
(1) 通過(guò)增加參數(shù)K,就可以達(dá)到增大梯度的目的,加快收斂
(2) 在預(yù)測(cè)錯(cuò)誤位置,梯度也是顯著增加

總之通過(guò)引入DB模塊,通過(guò)參數(shù)K可以達(dá)到增加梯度幅值,更加有利優(yōu)化,可以使得三個(gè)輸出圖優(yōu)化更好,最終分割結(jié)果會(huì)優(yōu)異。而DB模塊本身就是帶參數(shù)的sigmod函數(shù),實(shí)現(xiàn)如下:

直觀展示

p可以理解,就是有文字的區(qū)域有值0.9以上,沒(méi)有文字區(qū)域黑的為0 .

T是一個(gè)只有文字邊界才有值的,其他地方為0 .

? 分別是原圖,gt圖,threshold map圖。 這里再說(shuō)下threshold map圖,非文字邊界處都是灰色的,這是因?yàn)榻y(tǒng)一加了0.3,所有最小值是0.3.

這里其實(shí)還看不清,我們把src+gt+threshold map看看。

可以看到:

  • p的ground truth是標(biāo)注縮水之后
  • T的ground truth是文字塊邊緣分別向內(nèi)向外收縮和擴(kuò)張
  • p與T是公式里面的那兩個(gè)變量。

再看這個(gè)公式與曲線圖:

P和T我們就用ground truth帶入來(lái)理解:

? P網(wǎng)絡(luò)學(xué)的文字塊內(nèi)部, T網(wǎng)絡(luò)學(xué)的文字邊緣,兩者計(jì)算得到B。 B的ground truth也是標(biāo)注縮水之后,和p用的同一個(gè)。 在實(shí)際操作中,作者把除了文字塊邊緣的區(qū)域置為0.3.應(yīng)該就是為了當(dāng)在非文字區(qū)域, P=0,T=0.3,x=p-T<0這樣拉到負(fù)半軸更有利于區(qū)分。

可形變卷積(Deformable convolution)

? 可變形卷積可以提供模型一個(gè)靈活的感受野,這對(duì)于不同縱橫比的文本很有利,本文應(yīng)用可變形卷積,使用3×3卷積核在ResNet-18或者ResNet-50的conv3,conv4,conv5層。

標(biāo)簽的生成

概率圖的標(biāo)簽產(chǎn)成法類(lèi)似PSENet

PSENet標(biāo)簽生成

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-8eRCYRHv-1610966579234)(C:\F\notebook\DB\20200923193744225.png)]

? 網(wǎng)絡(luò)輸出多個(gè)分割結(jié)果(S1,Sn),因此訓(xùn)練時(shí)需要有多個(gè)GY與其匹配,在本文中,通過(guò)收縮原始標(biāo)簽就可以簡(jiǎn)單高效的生成不同尺度的GT,如圖5所示,(b)代表原始的標(biāo)注結(jié)果,也表示最大的分割標(biāo)簽mask,即Sn,利用Vatti裁剪算法獲取其他尺度的Mask,如圖5(a),將原始多邊形pn 縮小di 像素到 pi ,收縮后的pi 轉(zhuǎn)換成0/1的二值mask作為GT,用G1,G2,,,,Gn分別代表不同尺度的GT,用數(shù)學(xué)方式表示的話,尺度比例為ri

di 的計(jì)算方式為:
di=Area(Pn)?(1?ri2)/Perimeter(pn)d_i=Area(P_n)*(1-r_i^2)/Perimeter(p_n) di?=Area(Pn?)?(1?ri2?)/Perimeter(pn?)
Area(·) 是計(jì)算多邊形面積的函數(shù), Perimeter(·)是計(jì)算多邊形周長(zhǎng)的函數(shù),生成Gi時(shí)的尺度比例ri計(jì)算公式為:
ri=1?(1?m)?(n?i)/(n?1)r_i=1-(1-m)*(n-i)/(n-1) ri?=1?(1?m)?(n?i)/(n?1)

m代表最小的尺度比例,取值范圍是(0,1],使用上式,通過(guò)m和n兩個(gè)超參數(shù)可以計(jì)算出r1,r2,…rn,他們隨著m變現(xiàn)線性增加到最大值1.

DBNet標(biāo)簽生成

給定一張圖片,文本區(qū)域標(biāo)注的多邊形可以描述為:
G={Sk}k=1nG=\{S_k\}_{k=1}^{n} G={Sk?}k=1n?
n是每隔文本框的標(biāo)注點(diǎn)總數(shù),在不同數(shù)據(jù)中可能不同,然后使用vatti裁剪算法,將正樣例區(qū)域產(chǎn)生通過(guò)收縮polygon從G到Gs,補(bǔ)償公式計(jì)算

D:offset;L:周長(zhǎng);A:面積;r:收縮比例,設(shè)置為0.4;

  • probability map, 按照pse的方式制作即可,收縮比例設(shè)置為0.4
  • threshold map, 將文本框分別向內(nèi)向外收縮和擴(kuò)張d(根據(jù)第一步收縮時(shí)計(jì)算得到)個(gè)像素,然后計(jì)算收縮框和擴(kuò)張框之間差集部分里每個(gè)像素點(diǎn)到原始圖像邊界的歸一化距離,此處有個(gè)問(wèn)題,兩個(gè)鄰近的文本框,在擴(kuò)張后會(huì)重疊,這種情況下重疊部分像素點(diǎn)的距離使用哪個(gè)文本框的?
  • 損失函數(shù)

    損失函數(shù)為概率map的loss、二值map的loss和閾值map的loss之和。

    Ls 是概率map的loss,Lb 是二值map的loss,均使用二值交叉熵loss(BCE),為了解決正負(fù)樣本不均衡問(wèn)題,使用hard negative mining, α和β分別設(shè)置為1.0和10 .

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-udDAMvqX-1610966579237)(C:\F\notebook\DB\2020092220283134.png)]

    Sl 設(shè)計(jì)樣本集,其中正陽(yáng)樣本和負(fù)樣本比例是1:3

    Lt計(jì)算方式為擴(kuò)展文本多邊形Gd內(nèi)預(yù)測(cè)結(jié)果和標(biāo)簽之間的L1距離之和:

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-pGt5zzIG-1610966579239)(C:\F\notebook\DB\20200922203558285.png)]

    Rd是在膨脹Gd內(nèi)像素的索引,y*是閾值map的標(biāo)簽

    后處理

    (由于threshold map的存在,probability map的邊界可以學(xué)習(xí)的很好,因此可以直接按照收縮的方式(Vatti clipping algorithm)擴(kuò)張回去 )

    在推理時(shí)可以采用概率圖或近似二值圖來(lái)生成文本框,為了方便作者選擇了概率圖,具體步驟如下:

    1、使用固定閾值0.2將概率圖做二值化得到二值化圖;

    2、由二值化圖得到收縮文字區(qū)域;

    3、將收縮文字區(qū)域按Vatti clipping算法的偏移系數(shù)D’通過(guò)膨脹再擴(kuò)展回來(lái)。

    D‘就是擴(kuò)展補(bǔ)償,A’是收縮多邊形的面積,L‘就是收縮多邊形的周長(zhǎng),r’作者設(shè)置的是1.5;

    注意r‘的值在DBNet工程中不是1.5,而在我自己的數(shù)據(jù)集上,參數(shù)設(shè)置為1.3較合適,大家訓(xùn)練的時(shí)候可以根據(jù)自己模型效果進(jìn)行調(diào)整

    文中說(shuō)明DB算法的主要優(yōu)勢(shì)有以下4點(diǎn):

    • 在五個(gè)基準(zhǔn)數(shù)據(jù)集上有良好的表現(xiàn),其中包括水平、多個(gè)方向、彎曲的文本。
    • 比之前的方法要快很多,因?yàn)镈B可以提供健壯的二值化圖,從而大大簡(jiǎn)化了后處理過(guò)程。
    • 使用輕量級(jí)的backbone(ResNet18)也有很好的表現(xiàn)。
    • DB模塊在推理過(guò)程中可以去除,因此不占用額外的內(nèi)存和時(shí)間的消耗。

    參考:

    論文鏈接:https://arxiv.org/pdf/1911.08947.pdf

    工程鏈接:https://github.com/MhLiao/DB

    ? https://github.com/WenmuZhou/DBNet.pytorch

    • https://blog.csdn.net/qq_22764813/article/details/107785388
    • https://blog.csdn.net/qq_39707285/article/details/108739010
    • https://zhuanlan.zhihu.com/p/94677957
    • https://mp.weixin.qq.com/s/ehbROyE-grp_F3T3YBX9CA

    代碼閱讀

    數(shù)據(jù)預(yù)處理

    入口

    在data/image_dataset.py,數(shù)據(jù)預(yù)處理邏輯非常簡(jiǎn)單,就是讀取圖片和gt標(biāo)注,解析出每張圖片poly標(biāo)注,包括多邊形標(biāo)注、字符內(nèi)容以及是否是忽略文本,忽略文本一般是比較模糊和小的文本。

    具體可以在getitem方法里面插入:

    ImageDataset.__getitem__():data_process(data)

    預(yù)處理配置

    processes:- class: AugmentDetectionDataaugmenter_args:- ['Fliplr', 0.5]- {'cls': 'Affine', 'rotate': [-10, 10]}- ['Resize', [0.5, 3.0]]only_resize: Falsekeep_ratio: False- class: RandomCropDatasize: [640, 640]max_tries: 10- class: MakeICDARData- class: MakeSegDetectionData- class: MakeBorderMap- class: NormalizeImage- class: FilterKeyssuperfluous: ['polygons', 'filename', 'shape', 'ignore_tags', 'is_training']

    預(yù)處理流程:

    AugmentDetectionData(數(shù)據(jù)增強(qiáng)類(lèi))

    DB/data/processes/augment_data.py

    ? 其目的就是對(duì)圖片和poly標(biāo)注進(jìn)行數(shù)據(jù)增強(qiáng),包括翻轉(zhuǎn)、旋轉(zhuǎn)和縮放三個(gè),參數(shù)如配置所示。本文采用的增強(qiáng)庫(kù)是imgaug。可以看出本文訓(xùn)練階段對(duì)數(shù)據(jù)是不保存比例的resize,然后再進(jìn)行三種增強(qiáng)。

    由于icdar數(shù)據(jù),文本區(qū)域占比都是非常小的,故不能用直接resize到指定輸入大小的數(shù)據(jù)增強(qiáng)操作,而是使用后續(xù)的randcrop操作比較科學(xué)。但是如果自己項(xiàng)目的數(shù)據(jù)文本區(qū)域比較大,則可能沒(méi)必要采用RandomCropData這么復(fù)雜的數(shù)據(jù)增強(qiáng)操作,直接resize算了。

    RandomCropData(數(shù)據(jù)裁剪類(lèi))

    DB/data/processes/random_crop_data.py

    因?yàn)閿?shù)據(jù)裁剪涉及到比較復(fù)雜的多變形標(biāo)注后處理,所以單獨(dú)列出來(lái) 。

    ? 其目的是對(duì)圖片進(jìn)行裁剪到指定的[640, 640]。由于斜框的特點(diǎn),裁剪增強(qiáng)沒(méi)那么容易做,本文采用的裁剪策略非常簡(jiǎn)單: 遍歷每一個(gè)多邊形標(biāo)注,只要裁剪后有至少有一個(gè)poly還在裁剪框內(nèi),則認(rèn)為該次裁剪有效。這個(gè)策略主要可以保證一張圖片中至少有一個(gè)gt,且實(shí)現(xiàn)比較簡(jiǎn)單。

    其具體流程是:

  • 將每張圖片的所有poly數(shù)據(jù)進(jìn)行水平和垂直方向投影,有標(biāo)注的地方是1,其余地方是0
  • 找出沒(méi)有標(biāo)注即0值的水平和垂直坐標(biāo)h_axis和w_axis
  • 如果全部是1,則表示poly橫跨了整圖,則直接返回,無(wú)法裁剪
  • 對(duì)水平和垂直坐標(biāo)進(jìn)行連續(xù)0區(qū)域分離,其實(shí)就是把所有連續(xù)0坐標(biāo)區(qū)域切割處理變成List輸出h_regions、w_regions
  • 以w_regions為例,長(zhǎng)度為n,先從n個(gè)區(qū)域隨機(jī)選擇2個(gè)區(qū)域,然后在這兩個(gè)區(qū)域內(nèi)部隨機(jī)選擇兩個(gè)點(diǎn),構(gòu)成x方向最大最小坐標(biāo),h_regions也是一樣處理,此時(shí)就得到了xmin, ymin, xmax - xmin, ymax - ymin值
  • 判斷裁剪區(qū)域是否過(guò)小;以及判斷是否裁剪框內(nèi)部是否至少有一個(gè)標(biāo)注在內(nèi)部,沒(méi)有被裁斷,如果條件滿足則返回上述值,否則重復(fù)max_tries次,直到成功。
  • 代碼如下:

    def crop_area(self, im, text_polys):h, w = im.shape[:2]h_array = np.zeros(h, dtype=np.int32)w_array = np.zeros(w, dtype=np.int32)#將poly數(shù)據(jù)進(jìn)行水平和垂直方向投影,有標(biāo)注的地方是1,其余地方是0for points in text_polys:points = np.round(points, decimals=0).astype(np.int32)minx = np.min(points[:, 0])maxx = np.max(points[:, 0])w_array[minx:maxx] = 1miny = np.min(points[:, 1])maxy = np.max(points[:, 1])h_array[miny:maxy] = 1# ensure the cropped area not across a text#找出沒(méi)有標(biāo)注的水平和垂直坐標(biāo)h_axis = np.where(h_array == 0)[0]w_axis = np.where(w_array == 0)[0]#如果所有位置都有標(biāo)注,則無(wú)法裁剪,直接原圖返回if len(h_axis) == 0 or len(w_axis) == 0:return 0, 0, w, h#對(duì)水平和垂直坐標(biāo)進(jìn)行連續(xù)區(qū)域分離,其實(shí)就是把所有連續(xù)0坐標(biāo)區(qū)域切割處理#后面進(jìn)行隨機(jī)裁剪都是在每個(gè)連續(xù)區(qū)域進(jìn)行,可以最大程度保證不會(huì)裁斷標(biāo)注h_regions = self.split_regions(h_axis)w_regions = self.split_regions(w_axis)for i in range(self.max_tries):if len(w_regions) > 1:#先從n個(gè)區(qū)域隨機(jī)選擇2個(gè)區(qū)域,然后在兩個(gè)區(qū)域內(nèi)部隨機(jī)選擇兩個(gè)點(diǎn),構(gòu)成x方向最大最小坐標(biāo)xmin, xmax = self.region_wise_random_select(w_regions, w)else:xmin, xmax = self.random_select(w_axis, w)if len(h_regions) > 1:#h方向也是一樣處理ymin, ymax = self.region_wise_random_select(h_regions, h)else:ymin, ymax = self.random_select(h_axis, h)#不能裁剪的過(guò)小if xmax - xmin < self.min_crop_side_ratio * w or ymax - ymin < self.min_crop_side_ratio * h:# area too smallcontinuenum_poly_in_rect = 0for poly in text_polys:#如果有一個(gè)poly標(biāo)注沒(méi)有出界,則直接返回,表示裁剪成功if not self.is_poly_outside_rect(poly, xmin, ymin, xmax - xmin, ymax - ymin):num_poly_in_rect += 1breakif num_poly_in_rect > 0:return xmin, ymin, xmax - xmin, ymax - yminreturn 0, 0, w, h

    ? 在得到裁剪區(qū)域后,就比較簡(jiǎn)單了。先對(duì)裁剪區(qū)域圖片進(jìn)行保存長(zhǎng)寬比的resize,最長(zhǎng)邊為網(wǎng)絡(luò)輸入,例如640x640, 然后從上到下pad,得到640x640的圖片

    # 計(jì)算crop區(qū)域 crop_x, crop_y, crop_w, crop_h = self.crop_area(im, all_care_polys) # crop 圖片 保持比例填充 scale_w = self.size[0] / crop_w scale_h = self.size[1] / crop_h scale = min(scale_w, scale_h) h = int(crop_h * scale) w = int(crop_w * scale)padimg = np.zeros((self.size[1], self.size[0], im.shape[2]), im.dtype) padimg[:h, :w] = cv2.resize(im[crop_y:crop_y + crop_h, crop_x:crop_x + crop_w], (w, h)) img = padimg

    如果進(jìn)行可視化,會(huì)顯示如下所示:

    可以看出,這種裁剪策略雖然簡(jiǎn)單暴力,但是為了拼接成640x640的輸出,會(huì)帶來(lái)大量無(wú)關(guān)全黑像素區(qū)域。

    MakeICDARData(數(shù)據(jù)重新組織類(lèi))

    DB/data/processes/make_icdar_data.py

    就是簡(jiǎn)單的組織數(shù)據(jù)而已

    #Making ICDAE format #返回值: OrderedDict(image=data['image'],polygons=polygons,ignore_tags=ignore_tags,shape=shape,filename=filename,is_training=data['is_training'])

    MakeSegDetectionData(生成概率圖和對(duì)應(yīng)mask類(lèi))

    DB/data/processes/make_seg_detection_data.py

    功能:將多邊形數(shù)據(jù)轉(zhuǎn)化為mask格式即概率圖gt,并且標(biāo)記哪些多邊形是忽略區(qū)域


    #Making binary mask from detection data with ICDAR format 輸入:image,polygons,ignore_tags,filename 輸出:gt(shape:[1,h,w]),mask (shape:[h,w])(用于后面計(jì)算binary loss)

    ? 為了防止標(biāo)注間相互粘連,不好后處理,區(qū)分實(shí)例,目前做法都是會(huì)進(jìn)行shrink即沿著多邊形標(biāo)注的每條邊進(jìn)行向內(nèi)縮減一定像素,得到縮減的gt,然后才進(jìn)行訓(xùn)練;在測(cè)試時(shí)候再采用相反的手動(dòng)還原回來(lái)。

    ? 縮減做法采用的也是常規(guī)的Vatti clipping algorithm,是通過(guò)pyclipper庫(kù)實(shí)現(xiàn)的,縮減比例是默認(rèn)0.4,公式是:

    r=0.4,A是多邊形面積,L是多邊形周長(zhǎng),通過(guò)該公式就可以對(duì)每個(gè)不同大小的多邊形計(jì)算得到一個(gè)唯一的D,代表每條邊的向內(nèi)縮放像素個(gè)數(shù)。

    gt = np.zeros((1, h, w), dtype=np.float32)#shrink后得到概率圖,包括所有區(qū)域mask = np.ones((h, w), dtype=np.float32)#指示哪些區(qū)域是忽略區(qū)域,0就是忽略區(qū)域for i in range(len(polygons)):polygon = polygons[i]height = max(polygon[:, 1]) - min(polygon[:, 1])width = max(polygon[:, 0]) - min(polygon[:, 0])#如果是忽略樣本,或者高寬過(guò)小,則mask對(duì)應(yīng)位置設(shè)置為0即可if ignore_tags[i] or min(height, width) < self.min_text_size:cv2.fillPoly(mask, polygon.astype(np.int32)[np.newaxis, :, :], 0)ignore_tags[i] = Trueelse:#沿著每條邊進(jìn)行shrinkpolygon_shape = Polygon(polygon)#多邊形分析庫(kù)#每條邊收縮距離:polygon, D=A(1-r^2)/Ldistance = polygon_shape.area * \(1 - np.power(self.shrink_ratio, 2)) / polygon_shape.lengthsubject = [tuple(l) for l in polygons[i]]#實(shí)現(xiàn)坐標(biāo)的偏移padding = pyclipper.PyclipperOffset()padding.AddPath(subject, pyclipper.JT_ROUND,pyclipper.ET_CLOSEDPOLYGON)shrinked = padding.Execute(-distance)#得到縮放后的多邊形if shrinked == []:cv2.fillPoly(mask, polygon.astype(np.int32)[np.newaxis, :, :], 0)ignore_tags[i] = Truecontinueshrinked = np.array(shrinked[0]).reshape(-1, 2)cv2.fillPoly(gt[0], [shrinked.astype(np.int32)], 1)

    如果進(jìn)行可視化,如下所示:

    ? 概率圖內(nèi)部全白區(qū)域就是概率圖的label,右圖是忽略區(qū)域mask,0為忽略區(qū)域,到時(shí)候該區(qū)域是不計(jì)算概率圖loss的。

    MakeBorderMap(生成閾值圖和對(duì)應(yīng)Mask類(lèi))

    DB/data/make_border_map.py

    功能:計(jì)算閾值圖和對(duì)應(yīng)mask。

    輸入:預(yù)處理后的image info: image,polygons,ignore_tags 輸出:thresh_map,thresh_mask (用于后面計(jì)算thresh loss)

    ? 仔細(xì)看閾值圖的標(biāo)注,首先紅線點(diǎn)是poly標(biāo)注;然后對(duì)該多邊形先進(jìn)行shrink操作,得到藍(lán)線; 然后向外反向shrink同樣的距離,得到綠色;閾值圖就是綠線和藍(lán)色區(qū)域,以紅線為起點(diǎn),計(jì)算在綠線和藍(lán)線區(qū)域內(nèi)的點(diǎn)距離紅線的距離,故為距離圖。

    其代碼的處理邏輯是:

  • 對(duì)每個(gè)poly進(jìn)行向外擴(kuò)展,參數(shù)和向內(nèi)shrink一樣,然后對(duì)擴(kuò)展后多邊形內(nèi)部填充1,得到對(duì)應(yīng)的mask
  • 為了加快計(jì)算速度,對(duì)每條poly計(jì)算最小包圍矩,然后在裁剪后的圖片內(nèi)部,計(jì)算每個(gè)點(diǎn)到poly上面每條邊的距離
  • 只保留0-1值內(nèi)的距離值,其余位置不用
  • 把距離圖貼到原圖大小的圖片上,如果和其余poly有重疊,則取最大值
  • 為了使得后續(xù)閾值圖和概率圖進(jìn)行帶參數(shù)的sigmod操作,得到近似二值圖,需要對(duì)閾值圖的取值范圍進(jìn)行變換,具體是將0-1范圍變換到0.3-0.6范圍
  • 流程:

    canvas = np.zeros(image.shape[:2], dtype=np.float32) mask = np.zeros(image.shape[:2], dtype=np.float32)draw_border_map(polygons[i], canvas, mask=mask) canvas = canvas * (0.7 - 0.3) + 0.3 data['thresh_map'] = canvas data['thresh_mask'] = mask

    draw_border_map

    #處理每條polydef draw_border_map(self, polygon, canvas, mask):polygon = np.array(polygon)assert polygon.ndim == 2assert polygon.shape[1] == 2#向外擴(kuò)展polygon_shape = Polygon(polygon)distance = polygon_shape.area * \(1 - np.power(self.shrink_ratio, 2)) / polygon_shape.lengthsubject = [tuple(l) for l in polygon]padding = pyclipper.PyclipperOffset()padding.AddPath(subject, pyclipper.JT_ROUND,pyclipper.ET_CLOSEDPOLYGON)padded_polygon = np.array(padding.Execute(distance)[0])#shape:[12,2]擴(kuò)大和縮減一樣的像素cv2.fillPoly(mask, [padded_polygon.astype(np.int32)], 1.0)#內(nèi)部全部填充1#計(jì)算最小包圍poly矩形xmin = padded_polygon[:, 0].min()xmax = padded_polygon[:, 0].max()ymin = padded_polygon[:, 1].min()ymax = padded_polygon[:, 1].max()width = xmax - xmin + 1height = ymax - ymin + 1#裁剪掉無(wú)關(guān)區(qū)域,加快計(jì)算速度polygon[:, 0] = polygon[:, 0] - xminpolygon[:, 1] = polygon[:, 1] - ymin#最小包圍矩形的所有位置坐標(biāo)xs = np.broadcast_to(np.linspace(0, width - 1, num=width).reshape(1, width), (height, width))ys = np.broadcast_to(np.linspace(0, height - 1, num=height).reshape(height, 1), (height, width))distance_map = np.zeros((polygon.shape[0], height, width), dtype=np.float32)for i in range(polygon.shape[0]):#對(duì)每條邊進(jìn)行遍歷j = (i + 1) % polygon.shape[0]#計(jì)算圖片上所有點(diǎn)到線上面的距離absolute_distance = self.distance(xs, ys, polygon[i], polygon[j])#僅僅保留0-1之間的位置,得到距離圖distance_map[i] = np.clip(absolute_distance / distance, 0, 1)distance_map = distance_map.min(axis=0)#繪制到原圖上xmin_valid = min(max(0, xmin), canvas.shape[1] - 1)xmax_valid = min(max(0, xmax), canvas.shape[1] - 1)ymin_valid = min(max(0, ymin), canvas.shape[0] - 1)ymax_valid = min(max(0, ymax), canvas.shape[0] - 1)#如果有多個(gè)ploy實(shí)例重合,則該區(qū)域取最大值canvas[ymin_valid:ymax_valid + 1, xmin_valid:xmax_valid + 1] = np.fmax(1 - distance_map[ymin_valid-ymin:ymax_valid-ymax+height,xmin_valid-xmin:xmax_valid-xmax+width],canvas[ymin_valid:ymax_valid + 1, xmin_valid:xmax_valid + 1])

    可視化如下所示:

    采用matpoltlib繪制距離圖會(huì)更好看

    NormalizeImage

    DB/data/processes/normalize_image.py

    圖片歸一化類(lèi)

    FilterKeys

    DB/data/processes/filter_keys.py

    字典數(shù)據(jù)過(guò)濾類(lèi),具體是把superfluous里面的key和value刪掉,不輸入網(wǎng)絡(luò)中

    #刪除無(wú)用的圖片信息,只保留信息: dict"image","gt","mask","thresh_map","thresh_mask"

    模型結(jié)構(gòu)

    DB/structure/model.py

    模型結(jié)構(gòu)配置部分:

    builder: class: Buildermodel: SegDetectorModelmodel_args:backbone: deformable_resnet18decoder: SegDetectordecoder_args: adaptive: Truein_channels: [64, 128, 256, 512]k: 50

    骨干網(wǎng)絡(luò)和FPN

    ? 骨架網(wǎng)絡(luò)采用的是resnet18或者resnet50,為了增加網(wǎng)絡(luò)特征提取能力,在layer2、layer3和layer4模塊內(nèi)部引入了變形卷積dcnv2模塊。在resnet輸出的4個(gè)特征圖后面采用標(biāo)準(zhǔn)的FPN網(wǎng)絡(luò)結(jié)構(gòu),得到4個(gè)增強(qiáng)后輸出,然后cat進(jìn)來(lái),得到1/4的特征圖輸出fuse。

    ? 其中,resnet骨架特征提取代碼在backbones/resnet.py里,具體是輸出x2, x3, x4, x5,分別是1/4~1/32尺寸。FPN部分代碼在decoders/seg_detector.py里面.

    head部分(decoder)

    DB/decoders/seg_detector.py

    ? 輸出head在訓(xùn)練時(shí)候包括三個(gè)分支,分別是probability map、threshold map和經(jīng)過(guò)DB模塊計(jì)算得到的approximate binary map。三個(gè)圖通道都是1,輸出和輸入是一樣大的。要想分割精度高,高分辨率輸出是必要的。

    **輸出:**binary、thresh、thresh_binary

    fuse = torch.cat((p5, p4, p3, p2), 1) #推理時(shí),只需返回binary binary = self.binarize(fuse) thresh = self.thresh(fuse) thresh_binary = self.step_function(binary, thresh)

    binary

    ? 對(duì)fuse特征圖經(jīng)過(guò)一系列卷積和反卷積,擴(kuò)大到和原圖一樣大的輸出,然后經(jīng)過(guò)sigmod層得到0-1輸出概率圖probability map

    self.binarize = nn.Sequential(nn.Conv2d(inner_channels, inner_channels //4, 3, padding=1, bias=bias),BatchNorm2d(inner_channels//4),nn.ReLU(inplace=True),nn.ConvTranspose2d(inner_channels//4, inner_channels//4, 2, 2),BatchNorm2d(inner_channels//4),nn.ReLU(inplace=True),nn.ConvTranspose2d(inner_channels//4, 1, 2, 2),nn.Sigmoid())self.binarize.apply(self.weights_init)

    thresh

    ? 同時(shí)對(duì)fuse特征圖采用類(lèi)似上采樣操作,經(jīng)過(guò)sigmod層的0-1輸出閾值圖threshold map

    if adaptive:self.thresh = self._init_thresh(inner_channels, serial=serial, smooth=smooth, bias=bias)self.thresh.apply(self.weights_init)def _init_thresh(self, inner_channels,serial=False, smooth=False, bias=False):in_channels = inner_channelsif serial:in_channels += 1self.thresh = nn.Sequential(nn.Conv2d(in_channels, inner_channels //4, 3, padding=1, bias=bias),BatchNorm2d(inner_channels//4),nn.ReLU(inplace=True),self._init_upsample(inner_channels // 4, inner_channels//4, smooth=smooth, bias=bias),BatchNorm2d(inner_channels//4),nn.ReLU(inplace=True),self._init_upsample(inner_channels // 4, 1, smooth=smooth, bias=bias),nn.Sigmoid())return self.thresh

    step_function

    ? 將這兩個(gè)輸出圖經(jīng)過(guò)DB模塊得到approximate binary map

    torch.reciprocal(1 + torch.exp(-self.k * (binary - thresh)))

    損失函數(shù)

    DB/decoders/seg_detector_loss.py

    ? 輸出是單個(gè)單通道圖,probability map和approximate binary map是典型的分割輸出,故其loss就是普通的bce,但是為了平衡正負(fù)樣本,還額外采用了難負(fù)樣本采樣策略,對(duì)背景區(qū)域和前景區(qū)域采用3:1的設(shè)置。對(duì)于threshold map,其輸出不一定是0-1之間,后面會(huì)介紹其值的范圍,當(dāng)前采用的是L1 loss,且僅僅計(jì)算擴(kuò)展后的多邊形內(nèi)部區(qū)域,其余區(qū)域忽略。

    Ls是概率圖,Lt是閾值圖,Lb是近似二值化圖,

    ? 本文整個(gè)論文Loss的實(shí)現(xiàn)在decoders/seg_detector_loss.py的L1BalanceCELoss類(lèi),可以發(fā)現(xiàn)其實(shí)approximate binary map采用的并不是論文中的bce,而是可以克服正負(fù)樣本平衡的dice loss。一般在高度不平衡的二值分割任務(wù)中,dice loss效果會(huì)比純bce好,但是更好的策略是dice loss +bce loss。

    loss = dice_loss + 10 * l1_loss + 5*bce_loss

    binary loss

    bce_loss = self.bce_loss(pred['binary'], batch['gt'], batch['mask'])

    bce_loss:

    DB/decoders/balance_cross_entropy_loss.py

    def forward(self,pred: torch.Tensor,gt: torch.Tensor,mask: torch.Tensor,return_origin=False):'''Args:pred: shape :math:`(N, 1, H, W)`, the prediction of networkgt: shape :math:`(N, 1, H, W)`, the targetmask: shape :math:`(N, H, W)`, the mask indicates positive regions'''positive = (gt * mask).byte()negative = ((1 - gt) * mask).byte()positive_count = int(positive.float().sum())#負(fù)樣本個(gè)數(shù)為positive_count的self.negative_ratio倍數(shù)negative_count = min(int(negative.float().sum()),int(positive_count * self.negative_ratio))loss = nn.functional.binary_cross_entropy(pred, gt, reduction='none')[:, 0, :, :]positive_loss = loss * positive.float()negative_loss = loss * negative.float()#按照l(shuí)oss選擇topK個(gè)negative_loss, _ = torch.topk(negative_loss.view(-1), negative_count)balance_loss = (positive_loss.sum() + negative_loss.sum()) /\(positive_count + negative_count + self.eps)if return_origin:return balance_loss, lossreturn balance_loss

    thresh loss

    l1_loss, l1_metric = self.l1_loss(pred['thresh'], batch['thresh_map'], batch['thresh_mask'])

    l1_loss:

    DB/decoders/l1_loss.py

    class MaskL1Loss(nn.Module):def __init__(self):super(MaskL1Loss, self).__init__()def forward(self, pred: torch.Tensor, gt, mask):mask_sum = mask.sum()if mask_sum.item() == 0:return mask_sum, dict(l1_loss=mask_sum)else:loss = (torch.abs(pred[:, 0] - gt) * mask).sum() / mask_sumreturn loss, dict(l1_loss=loss)

    thresh_binary loss

    dice_loss = self.dice_loss(pred['thresh_binary'], batch['gt'], batch['mask'])

    dice_loss:

    DB/decoders/dice_loss.py

    class DiceLoss(nn.Module):'''Loss function from https://arxiv.org/abs/1707.03237,where iou computation is introduced heatmap manner to measure thediversity bwtween tow heatmaps.'''def __init__(self, eps=1e-6):super(DiceLoss, self).__init__()self.eps = epsdef forward(self, pred: torch.Tensor, gt, mask, weights=None):'''pred: one or two heatmaps of shape (N, 1, H, W),the losses of tow heatmaps are added together.gt: (N, 1, H, W)mask: (N, H, W)'''assert pred.dim() == 4, pred.dim()return self._compute(pred, gt, mask, weights)def _compute(self, pred, gt, mask, weights):if pred.dim() == 4:pred = pred[:, 0, :, :]gt = gt[:, 0, :, :]assert pred.shape == gt.shapeassert pred.shape == mask.shapeif weights is not None:assert weights.shape == mask.shapemask = weights * maskintersection = (pred * gt * mask).sum()union = (pred * mask).sum() + (gt * mask).sum() + self.epsloss = 1 - 2.0 * intersection / unionassert loss <= 1return loss

    binary與thresh_binary的標(biāo)簽都是用的gt

    thresh的標(biāo)簽用的thresh_map

    邏輯推理

    配置如下:

    - name: validate_dataclass: ImageDatasetdata_dir:- '/remote_workspace/ocr/public_dataset/icdar2015/'data_list:- '/remote_workspace/ocr/public_dataset/icdar2015/test_list.txt'processes:- class: AugmentDetectionDataaugmenter_args:- ['Resize', {'width': 1280, 'height': 736}]# - ['Resize', {'width': 2048, 'height': 1152}]only_resize: Truekeep_ratio: False- class: MakeICDARData- class: MakeSegDetectionData- class: NormalizeImage

    ? 如果不考慮label,則其處理邏輯和訓(xùn)練邏輯有一點(diǎn)不一樣,其把圖片統(tǒng)一resize到指定的長(zhǎng)度進(jìn)行預(yù)測(cè)。

    前面說(shuō)過(guò)閾值圖分支其實(shí)可以相當(dāng)于輔助分支,可以聯(lián)合優(yōu)化各個(gè)分支性能。故在測(cè)試時(shí)候發(fā)現(xiàn)概率圖預(yù)測(cè)值已經(jīng)蠻好了,故在測(cè)試階段實(shí)際上把閾值圖分支移除了,只需要概率圖輸出即可。

    后處理邏輯在structure/representers/seg_detector_representer.py,本文特色就是后處理比較簡(jiǎn)單,故流程為:

  • 對(duì)概率圖進(jìn)行固定閾值處理,得到分割圖
  • 對(duì)分割圖計(jì)算輪廓,遍歷每個(gè)輪廓,去除太小的預(yù)測(cè);對(duì)每個(gè)輪廓計(jì)算包圍矩形,然后計(jì)算該矩形的預(yù)測(cè)score
  • 對(duì)矩形進(jìn)行反向shrink操作,得到真實(shí)矩形大小;最后還原到原圖size就可以了
  • def boxes_from_bitmap(self, pred, _bitmap, dest_width, dest_height):'''_bitmap: single map with shape (H, W),whose values are binarized as {0, 1}'''assert len(_bitmap.shape) == 2bitmap = _bitmap.cpu().numpy() # The first channelpred = pred.cpu().detach().numpy()height, width = bitmap.shapecontours, _ = cv2.findContours((bitmap * 255).astype(np.uint8), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)num_contours = min(len(contours), self.max_candidates)boxes = np.zeros((num_contours, 4, 2), dtype=np.int16)scores = np.zeros((num_contours,), dtype=np.float32)#對(duì)二值圖計(jì)算輪廓,每個(gè)輪廓就是一個(gè)文本實(shí)例for index in range(num_contours):contour = contours[index].squeeze(1)#計(jì)算最小包圍矩,得到points坐標(biāo)points, sside = self.get_mini_boxes(contour)if sside < self.min_size:continuepoints = np.array(points)#利用points內(nèi)部預(yù)測(cè)概率值,計(jì)算出一個(gè)score,作為實(shí)例的預(yù)測(cè)概率score = self.box_score_fast(pred, contour)if self.box_thresh > score:continue#shrink反向還原box = self.unclip(points, unclip_ratio=self.unclip_ratio).reshape(-1, 1, 2)box, sside = self.get_mini_boxes(box)if sside < self.min_size + 2:continuebox = np.array(box)if not isinstance(dest_width, int):dest_width = dest_width.item()dest_height = dest_height.item()#還原到原始坐標(biāo)box[:, 0] = np.clip(np.round(box[:, 0] / width * dest_width), 0, dest_width)box[:, 1] = np.clip(np.round(box[:, 1] / height * dest_height), 0, dest_height)boxes[index, :, :] = box.astype(np.int16)scores[index] = scorereturn boxes, scores

    采用作者提供的訓(xùn)練好的權(quán)重進(jìn)行預(yù)測(cè),可視化預(yù)測(cè)結(jié)果如下所示:


    論文中指標(biāo)結(jié)果:

    可以看出變形卷積和閾值圖對(duì)整個(gè)性能都有比較大的促進(jìn)作用。

    測(cè)試icdar2015數(shù)據(jù)結(jié)果:

    補(bǔ)充

    語(yǔ)義分割中的loss function

    cross entropy loss

    用于圖像語(yǔ)義分割任務(wù)的最常用損失函數(shù)是像素級(jí)別的交叉熵?fù)p失,這種損失會(huì)逐個(gè)檢查每個(gè)像素,將對(duì)每個(gè)像素類(lèi)別的預(yù)測(cè)結(jié)果(概率分布向量)與我們的獨(dú)熱編碼標(biāo)簽向量進(jìn)行比較。

    假設(shè)我們需要對(duì)每個(gè)像素的預(yù)測(cè)類(lèi)別有5個(gè),則預(yù)測(cè)的概率分布向量長(zhǎng)度為5:

    每個(gè)像素對(duì)應(yīng)的損失函數(shù)為:

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-OeRSbkGm-1610966579269)(https://www.zhihu.com/equation?tex=%5Ctext+%7Bpixel+loss%7D+%3D±%5Csum_%7Bclasses%7D+y_%7Btrue%7D+log+%28y_%7Bpred%7D%29+%5C%5C)]

    整個(gè)圖像的損失就是對(duì)每個(gè)像素的損失求平均值。

    特別注意的是,binary entropy loss 是針對(duì)類(lèi)別只有兩個(gè)的情況,簡(jiǎn)稱(chēng) bce loss,損失函數(shù)公式為:

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-DOMD9pF8-1610966579270)(https://www.zhihu.com/equation?tex=%5Ctext+%7Bbce+loss%7D+%3D±+y_%7Btrue%7D+log+%28y_%7Bpred%7D%29±+%281-y_%7Btrue%7D%29+log+%281-y_%7Bpred%7D%29%5C%5C)]

    weighted loss

    由于交叉熵?fù)p失會(huì)分別評(píng)估每個(gè)像素的類(lèi)別預(yù)測(cè),然后對(duì)所有像素的損失進(jìn)行平均,因此我們實(shí)質(zhì)上是在對(duì)圖像中的每個(gè)像素進(jìn)行平等地學(xué)習(xí)。如果多個(gè)類(lèi)在圖像中的分布不均衡,那么這可能導(dǎo)致訓(xùn)練過(guò)程由像素?cái)?shù)量多的類(lèi)所主導(dǎo),即模型會(huì)主要學(xué)習(xí)數(shù)量多的類(lèi)別樣本的特征,并且學(xué)習(xí)出來(lái)的模型會(huì)更偏向?qū)⑾袼仡A(yù)測(cè)為該類(lèi)別。

    FCN論文和U-Net論文中針對(duì)這個(gè)問(wèn)題,對(duì)輸出概率分布向量中的每個(gè)值進(jìn)行加權(quán),即希望模型更加關(guān)注數(shù)量較少的樣本,以緩解圖像中存在的類(lèi)別不均衡問(wèn)題。

    比如對(duì)于二分類(lèi),正負(fù)樣本比例為1: 99,此時(shí)模型將所有樣本都預(yù)測(cè)為負(fù)樣本,那么準(zhǔn)確率仍有99%這么高,但其實(shí)該模型沒(méi)有任何使用價(jià)值。

    為了平衡這個(gè)差距,就對(duì)正樣本和負(fù)樣本的損失賦予不同的權(quán)重,帶權(quán)重的二分類(lèi)損失函數(shù)公式如下:

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-PtRPVOrh-1610966579271)(https://www.zhihu.com/equation?tex=%5Ctext+%7Bpos_weight%7D+%3D+%5Cfrac%7B%5Ctext+%7Bnum_neg%7D%7D%7B%5Ctext+%7Bnum_pos%7D%7D+%5C%5C+%5Ctext+%7Bloss%7D+%3D±+%5Ctext+%7Bpos_weight%7D+%5Ctimes+y_%7Btrue%7D+log+%28y_%7Bpred%7D%29±+%281-y_%7Btrue%7D%29+log+%281-y_%7Bpred%7D%29%5C%5C)]

    要減少假陰性樣本的數(shù)量,可以增大 pos_weight;要減少假陽(yáng)性樣本的數(shù)量,可以減小 pos_weight。

    focal loss

    上面針對(duì)不同類(lèi)別的像素?cái)?shù)量不均衡提出了改進(jìn)方法,但有時(shí)還需要將像素分為難學(xué)習(xí)和容易學(xué)習(xí)這兩種樣本。

    容易學(xué)習(xí)的樣本模型可以很輕松地將其預(yù)測(cè)正確,模型只要將大量容易學(xué)習(xí)的樣本分類(lèi)正確,loss就可以減小很多,從而導(dǎo)致模型不怎么顧及難學(xué)習(xí)的樣本,所以我們要想辦法讓模型更加關(guān)注難學(xué)習(xí)的樣本。

    對(duì)于較難學(xué)習(xí)的樣本,將 bce loss 修改為:

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-6eZmpbcM-1610966579272)(https://www.zhihu.com/equation?tex=-+%281-y_%7Bpred%7D%29%5E%5Cgamma+%5Ctimes+y_%7Btrue%7D+log+%28y_%7Bpred%7D%29±+y_%7Bpred%7D%5E%5Cgamma+%5Ctimes+%281-y_%7Btrue%7D%29+log+%281-y_%7Bpred%7D%29+%5C%5C)]

    其中的 [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-pOuXJT0r-1610966579273)(https://www.zhihu.com/equation?tex=%5Cgamma)] 通常設(shè)置為2。

    舉個(gè)例子,預(yù)測(cè)一個(gè)正樣本,如果預(yù)測(cè)結(jié)果為0.95,這是一個(gè)容易學(xué)習(xí)的樣本,有 [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-w4wQuNnV-1610966579274)(https://www.zhihu.com/equation?tex=%281-0.95%29%5E2%3D0.0025)] ,損失直接減少為原來(lái)的1/400。

    而如果預(yù)測(cè)結(jié)果為0.4,這是一個(gè)難學(xué)習(xí)的樣本,有 [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-QQu9pL2M-1610966579276)(https://www.zhihu.com/equation?tex=%281-0.5%29%5E2%3D0.25)] ,損失減小為原來(lái)的1/4,雖然也在減小,但是相對(duì)來(lái)說(shuō),減小的程度小得多。

    所以通過(guò)這種修改,就可以使模型更加專(zhuān)注于學(xué)習(xí)難學(xué)習(xí)的樣本。

    而將這個(gè)修改和對(duì)正負(fù)樣本不均衡的修改合并在一起,就是大名鼎鼎的 focal loss:

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-23Dr9Qbl-1610966579278)(https://www.zhihu.com/equation?tex=-+%5Calpha+%281-y_%7Bpred%7D%29%5E%5Cgamma+%5Ctimes+y_%7Btrue%7D+log+%28y_%7Bpred%7D%29±+%281-%5Calpha%29+y_%7Bpred%7D%5E%5Cgamma+%5Ctimes+%281-y_%7Btrue%7D%29+log+%281-y_%7Bpred%7D%29+%5C%5C)]

    dice soft loss

    Dice系數(shù)計(jì)算

    語(yǔ)義分割任務(wù)中常用的還有一個(gè)基于 Dice 系數(shù)的損失函數(shù),該系數(shù)實(shí)質(zhì)上是兩個(gè)樣本之間重疊的度量。此度量范圍為 0~1,其中 Dice 系數(shù)為1表示完全重疊。Dice 系數(shù)最初是用于二進(jìn)制數(shù)據(jù)的,可以計(jì)算為:

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-SGCRjBn0-1610966579279)(https://www.zhihu.com/equation?tex=Dice+%3D+%5Cfrac+%7B2+%7CA+%5Ccap+B%7C%7D%7B%7CA%7C+%2B+%7CB%7C%7D+%5C%5C)]

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-TDJx3q9u-1610966579281)(https://www.zhihu.com/equation?tex=%7CA+%5Ccap+B%7C)] 代表集合A和B之間的公共元素,并且 [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-Y7BLfLdh-1610966579284)(https://www.zhihu.com/equation?tex=%7C+A+%7C)] 代表集合A中的元素?cái)?shù)量(對(duì)于集合B同理)。

    對(duì)于在預(yù)測(cè)的分割掩碼上評(píng)估 Dice 系數(shù),我們可以將 [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-wvhJvFjz-1610966579286)(https://www.zhihu.com/equation?tex=%7CA+%5Ccap+B%7C)] 近似為預(yù)測(cè)掩碼和標(biāo)簽掩碼之間的逐元素乘法,然后對(duì)結(jié)果矩陣求和。

    計(jì)算 Dice 系數(shù)的分子中有一個(gè)2,那是因?yàn)榉帜钢袑?duì)兩個(gè)集合的元素個(gè)數(shù)求和,兩個(gè)集合的共同元素被加了兩次。

    Dice loss

    為了設(shè)計(jì)一個(gè)可以最小化的損失函數(shù),可以簡(jiǎn)單地使用 [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-zTwxiWv4-1610966579288)(https://www.zhihu.com/equation?tex=1-Dice+)]。 這種損失函數(shù)被稱(chēng)為 soft Dice loss,這是因?yàn)槲覀冎苯邮褂妙A(yù)測(cè)出的概率,而不是使用閾值將其轉(zhuǎn)換成一個(gè)二進(jìn)制掩碼。

    Dice loss是針對(duì)前景比例太小的問(wèn)題提出的,dice系數(shù)源于二分類(lèi),本質(zhì)上是衡量?jī)蓚€(gè)樣本的重疊部分。

    對(duì)于二分類(lèi)問(wèn)題,一般預(yù)測(cè)值分為以下幾種:

    • TP: true positive,真陽(yáng)性,預(yù)測(cè)是陽(yáng)性,預(yù)測(cè)對(duì)了,實(shí)際也是正例。
    • TN: true negative,真陰性,預(yù)測(cè)是陰性,預(yù)測(cè)對(duì)了,實(shí)際也是負(fù)例。
    • FP: false positive,假陽(yáng)性,預(yù)測(cè)是陽(yáng)性,預(yù)測(cè)錯(cuò)了,實(shí)際是負(fù)例。
    • FN: false negative,假陰性,預(yù)測(cè)是陰性,預(yù)測(cè)錯(cuò)了,實(shí)際是正例。

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-I6TNYlF0-1610966579290)(C:\F\notebook\DB\aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9pYVRhOHV0NkhpYXdBZWpDcGhDVGtpY3EyVlRaaWJJTTBDR0JEcEJoM2ZGMkd2cjhxbHM2eG04Z2JBUURyUHIyT1VIN2ljWGVSWGdDckVjUVJteDBMTXI4bURBLzY0MA.png)]

    這里dice coefficient可以寫(xiě)成如下形式:
    dice=2TP2TP+FP+FNdice=\frac{2TP}{2TP+FP+FN} dice=2TP+FP+FN2TP?

    而我們知道:

    可見(jiàn)dice coefficient是等同**「F1 score」,直觀上dice coefficient是計(jì)算 與 的相似性,本質(zhì)上則同時(shí)隱含precision和recall兩個(gè)指標(biāo)。可見(jiàn)dice loss是直接優(yōu)化「F1 score」**。

    對(duì)于神經(jīng)網(wǎng)絡(luò)的輸出,分子與我們的預(yù)測(cè)和標(biāo)簽之間的共同激活有關(guān),而分母分別與每個(gè)掩碼中的激活數(shù)量有關(guān),這具有根據(jù)標(biāo)簽掩碼的尺寸對(duì)損失進(jìn)行歸一化的效果。

    對(duì)于每個(gè)類(lèi)別的mask,都計(jì)算一個(gè) Dice 損失:

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-v2aiaP5D-1610966579294)(https://www.zhihu.com/equation?tex=1-+%5Cfrac+%7B2+%5Csum%5Climits_%7Bpixels%7D+y_%7Btrue%7D+y_%7Bpred%7D%7D%7B%5Csum%5Climits_%7Bpixels%7D+%28y_%7Btrue%7D%5E2+%2B+y_%7Bpred%7D%5E2%29%7D+%5C%5C)]

    將每個(gè)類(lèi)的 Dice 損失求和取平均,得到最后的 Dice soft loss。

    梯度分析

    從dice loss的定義可以看出,dice loss 是一種**「區(qū)域相關(guān)」**的loss。意味著某像素點(diǎn)的loss以及梯度值不僅和該點(diǎn)的label以及預(yù)測(cè)值相關(guān),和其他點(diǎn)的label以及預(yù)測(cè)值也相關(guān),這點(diǎn)和ce (交叉熵cross entropy) ?loss 不同。

    dice loss 是應(yīng)用于語(yǔ)義分割而不是分類(lèi)任務(wù),并且是一個(gè)區(qū)域相關(guān)的loss,因此更適合針對(duì)多點(diǎn)的情況進(jìn)行分析。由于多點(diǎn)輸出的情況比較難用曲線呈現(xiàn),這里使用模擬預(yù)測(cè)值的形式觀察梯度的變化。

    下圖為原始圖片和對(duì)應(yīng)的label:[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-xPLvYa7F-1610966579296)(C:\F\notebook\DB\aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9pYVRhOHV0NkhpYXdBZWpDcGhDVGtpY3EyVlRaaWJJTTBDR0JGMWR3blNGU1R5VEY4VFllNHN3SHBrR1FOM3JrWnRQamtYZGhoWjBydWo3RFFyamlibmowZ3lBLzY0MA.png)]

    為了便于梯度可視化,這里對(duì)梯度求絕對(duì)值操作,因?yàn)槲覀冴P(guān)注的是梯度的大小而非方向。另外梯度值都乘以 保證在容易辨認(rèn)的范圍。

    首先定義如下熱圖,值越大,顏色越亮,反之亦然:

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-BeCmQcqD-1610966579298)(C:\F\notebook\DB\aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9pYVRhOHV0NkhpYXdBZWpDcGhDVGtpY3EyVlRaaWJJTTBDR0I1YXBtUDZNWGJaNDhocklkWmE3dHpGdEZKQmJwSFV6Q0tqTUhWRW5mQ3MyTmh1b2o4TTJTNVEvNjQw.png)]

    預(yù)測(cè)值變化( 值,圖上的數(shù)字為預(yù)測(cè)值區(qū)間):

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-jY3HOS0H-1610966579299)(C:\F\notebook\DB\aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9pYVRhOHV0NkhpYXdBZWpDcGhDVGtpY3EyVlRaaWJJTTBDR0JiT3FrQzRMYXZJMThMbVdxQVNXTmE3STdjR2EwMm95cnB6cVhuZTRMNWhwajJDOWRySXUyS2cvNjQw.png)]

    dice loss 對(duì)應(yīng) 值的梯度:

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-pXdKApFF-1610966579301)(C:\F\notebook\DB\aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9pYVRhOHV0NkhpYXdBZWpDcGhDVGtpY3EyVlRaaWJJTTBDR0JrMXV2Sjhyem1qanMyMXdraWJzYkRBbktiSlVqTXFjaWFYSUt1VkJSaWFDd213TGZpYTMyanFUaWFuQS82NDA.png)]

    ce loss 對(duì)應(yīng) 值的梯度:

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-i9VOLACe-1610966579302)(C:\F\notebook\DB\aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9pYVRhOHV0NkhpYXdBZWpDcGhDVGtpY3EyVlRaaWJJTTBDR0I1aFdVUWliVk1CaWFtRzFxbXdocnp6ZUVqWTY1dmFhZWtlV05iMGVJcGJBUkNpYkoyMFdHUmliZmJRLzY0MA.png)]

    可以看出:

    • 一般情況下,dice loss 正樣本的梯度大于背景樣本的,尤其是剛開(kāi)始網(wǎng)絡(luò)預(yù)測(cè)接進(jìn)0.5的時(shí)候。說(shuō)明dice loss 更具有指向性,更加偏向于正樣本,保證有較低的FN。
    • 負(fù)樣本(背景區(qū)域)也會(huì)產(chǎn)生梯度
    • 極端情況下,網(wǎng)絡(luò)預(yù)測(cè)接進(jìn)0或1時(shí),對(duì)應(yīng)點(diǎn)梯度值極小,dice loss 存在梯度飽和現(xiàn)象。此時(shí)預(yù)測(cè)失敗(FN,FP)的情況很難扭轉(zhuǎn)回來(lái)。不過(guò)該情況出現(xiàn)的概率較低,因?yàn)榫W(wǎng)絡(luò)初始化輸出接近0.5,此時(shí)具有較大的梯度值。而網(wǎng)絡(luò)通過(guò)梯度下降的方式更新參數(shù),只會(huì)逐漸削弱預(yù)測(cè)失敗的像素點(diǎn)。
    • 對(duì)于ce loss,當(dāng)前的點(diǎn)的梯度僅和當(dāng)前預(yù)測(cè)值與label的距離相關(guān),預(yù)測(cè)越接近label,梯度越小。當(dāng)網(wǎng)絡(luò)預(yù)測(cè)接近0或1時(shí),梯度依然保持該特性。
    • 對(duì)比發(fā)現(xiàn),訓(xùn)練前中期,dice loss 下正樣本的梯度值相對(duì)于ce loss ,顏色更亮,值更大。說(shuō)明dice loss對(duì)挖掘正樣本更加有優(yōu)勢(shì)。

    dice loss為何能夠解決正負(fù)樣本不平衡問(wèn)題?

    因?yàn)閐ice loss 是一個(gè)區(qū)域相關(guān)的loss。區(qū)域相關(guān)的意思就是,當(dāng)前像素的loss不光和當(dāng)前像素的預(yù)測(cè)值相關(guān),和其他點(diǎn)的值也相關(guān)。dice loss的求交的形式可以理解為mask掩碼操作,因此不管圖片有多大,固定大小的正樣本的區(qū)域計(jì)算的loss是一樣的,對(duì)網(wǎng)絡(luò)起到的監(jiān)督貢獻(xiàn)不會(huì)隨著圖片的大小而變化。從上圖可視化也發(fā)現(xiàn),訓(xùn)練更傾向于挖掘前景區(qū)域,正負(fù)樣本不平衡的情況就是前景占比較小。而ce loss 會(huì)公平處理正負(fù)樣本,當(dāng)出現(xiàn)正樣本占比較小時(shí),就會(huì)被更多的負(fù)樣本淹沒(méi)。

    dice loss背景區(qū)域能否起到監(jiān)督作用?

    可以的,但是會(huì)小于前景區(qū)域。和直觀理解不同的是,隨著訓(xùn)練的進(jìn)行,背景區(qū)域也能產(chǎn)生較為可觀的梯度。這點(diǎn)和單點(diǎn)的情況分析不同。這里求偏導(dǎo),當(dāng)t_i=0 時(shí):

    可以看出, 背景區(qū)域的梯度是存在的,只有預(yù)測(cè)值命中的區(qū)域極小時(shí), 背景梯度才會(huì)很小.

    dice loss 為何訓(xùn)練會(huì)很不穩(wěn)定?

    在使用dice loss時(shí),一般正樣本為小目標(biāo)時(shí)會(huì)產(chǎn)生嚴(yán)重的震蕩。因?yàn)樵谥挥星熬昂捅尘暗那闆r下,小目標(biāo)一旦有部分像素預(yù)測(cè)錯(cuò)誤,那么就會(huì)導(dǎo)致loss值大幅度的變動(dòng),從而導(dǎo)致梯度變化劇烈。可以假設(shè)極端情況,只有一個(gè)像素為正樣本,如果該像素預(yù)測(cè)正確了,不管其他像素預(yù)測(cè)如何,loss 就接近0,預(yù)測(cè)錯(cuò)誤了,loss 接近1。而對(duì)于ce loss,loss的值是總體求平均的,更多會(huì)依賴(lài)負(fù)樣本的地方。

    總結(jié)

    dice loss 對(duì)正負(fù)樣本嚴(yán)重不平衡的場(chǎng)景有著不錯(cuò)的性能,訓(xùn)練過(guò)程中更側(cè)重對(duì)前景區(qū)域的挖掘。但訓(xùn)練loss容易不穩(wěn)定,尤其是小目標(biāo)的情況下。另外極端情況會(huì)導(dǎo)致梯度飽和現(xiàn)象。因此有一些改進(jìn)操作,主要是結(jié)合ce loss等改進(jìn),比如: ?dice+ce loss,dice + focal loss等,

    soft IOU loss

    前面我們知道計(jì)算 Dice 系數(shù)的公式,其實(shí)也可以表示為:

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-2X1iB7aM-1610966579304)(https://www.zhihu.com/equation?tex=Dice+%3D+%5Cfrac+%7B2+%7CA+%5Ccap+B%7C%7D%7B%7CA%7C+%2B+%7CB%7C%7D+%3D+%5Cfrac+%7B2+TP%7D%7B2+TP+%2B+FP+%2B+FN%7D+%5C%5C)]

    其中 TP 為真陽(yáng)性樣本,FP 為假陽(yáng)性樣本,FN 為假陰性樣本。分子和分母中的 TP 樣本都加了兩次。

    IoU 的計(jì)算公式和這個(gè)很像,區(qū)別就是 TP 只計(jì)算一次:

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-sN52A4f0-1610966579306)(https://www.zhihu.com/equation?tex=IoU+%3D+%5Cfrac+%7B%7CA+%5Ccap+B%7C%7D%7B%7CA%7C+%2B+%7CB%7C±+%7CA+%5Ccap+B%7C%7D+%3D+%5Cfrac+%7BTP%7D%7BTP+%2B+FP+%2B+FN%7D+%5C%5C)]

    和 Dice soft loss 一樣,通過(guò) IoU 計(jì)算損失也是使用預(yù)測(cè)的概率值:

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-efgoYMzv-1610966579307)(https://www.zhihu.com/equation?tex=loss+%3D±+%5Cfrac+%7B1%7D%7B%7CC%7C%7D+%5Csum%5Climits_c+%5Cfrac+%7B%5Csum%5Climits_%7Bpixels%7D+y_%7Btrue%7D+y_%7Bpred%7D%7D%7B%5Csum%5Climits_%7Bpixels%7D+%28y_%7Btrue%7D+%2B+y_%7Bpred%7D±+y_%7Btrue%7D+y_%7Bpred%7D%29%7D+%5C%5C)]

    其中 C 表示總的類(lèi)別數(shù)。

    總結(jié)

    交叉熵?fù)p失把每個(gè)像素都當(dāng)作一個(gè)獨(dú)立樣本進(jìn)行預(yù)測(cè),而 dice loss 和 iou loss 則以一種更“整體”的方式來(lái)看待最終的預(yù)測(cè)輸出。

    預(yù)測(cè)值相關(guān),和其他點(diǎn)的值也相關(guān)。dice loss的求交的形式可以理解為mask掩碼操作,因此不管圖片有多大,固定大小的正樣本的區(qū)域計(jì)算的loss是一樣的,對(duì)網(wǎng)絡(luò)起到的監(jiān)督貢獻(xiàn)不會(huì)隨著圖片的大小而變化。從上圖可視化也發(fā)現(xiàn),訓(xùn)練更傾向于挖掘前景區(qū)域,正負(fù)樣本不平衡的情況就是前景占比較小。而ce loss 會(huì)公平處理正負(fù)樣本,當(dāng)出現(xiàn)正樣本占比較小時(shí),就會(huì)被更多的負(fù)樣本淹沒(méi)。

    dice loss背景區(qū)域能否起到監(jiān)督作用?

    可以的,但是會(huì)小于前景區(qū)域。和直觀理解不同的是,隨著訓(xùn)練的進(jìn)行,背景區(qū)域也能產(chǎn)生較為可觀的梯度。這點(diǎn)和單點(diǎn)的情況分析不同。這里求偏導(dǎo),當(dāng)t_i=0 時(shí):

    可以看出, 背景區(qū)域的梯度是存在的,只有預(yù)測(cè)值命中的區(qū)域極小時(shí), 背景梯度才會(huì)很小.

    dice loss 為何訓(xùn)練會(huì)很不穩(wěn)定?

    在使用dice loss時(shí),一般正樣本為小目標(biāo)時(shí)會(huì)產(chǎn)生嚴(yán)重的震蕩。因?yàn)樵谥挥星熬昂捅尘暗那闆r下,小目標(biāo)一旦有部分像素預(yù)測(cè)錯(cuò)誤,那么就會(huì)導(dǎo)致loss值大幅度的變動(dòng),從而導(dǎo)致梯度變化劇烈。可以假設(shè)極端情況,只有一個(gè)像素為正樣本,如果該像素預(yù)測(cè)正確了,不管其他像素預(yù)測(cè)如何,loss 就接近0,預(yù)測(cè)錯(cuò)誤了,loss 接近1。而對(duì)于ce loss,loss的值是總體求平均的,更多會(huì)依賴(lài)負(fù)樣本的地方。

    總結(jié)

    dice loss 對(duì)正負(fù)樣本嚴(yán)重不平衡的場(chǎng)景有著不錯(cuò)的性能,訓(xùn)練過(guò)程中更側(cè)重對(duì)前景區(qū)域的挖掘。但訓(xùn)練loss容易不穩(wěn)定,尤其是小目標(biāo)的情況下。另外極端情況會(huì)導(dǎo)致梯度飽和現(xiàn)象。因此有一些改進(jìn)操作,主要是結(jié)合ce loss等改進(jìn),比如: ?dice+ce loss,dice + focal loss等,

    soft IOU loss

    前面我們知道計(jì)算 Dice 系數(shù)的公式,其實(shí)也可以表示為:

    [外鏈圖片轉(zhuǎn)存中…(img-2X1iB7aM-1610966579304)]

    其中 TP 為真陽(yáng)性樣本,FP 為假陽(yáng)性樣本,FN 為假陰性樣本。分子和分母中的 TP 樣本都加了兩次。

    IoU 的計(jì)算公式和這個(gè)很像,區(qū)別就是 TP 只計(jì)算一次:

    [外鏈圖片轉(zhuǎn)存中…(img-sN52A4f0-1610966579306)]

    和 Dice soft loss 一樣,通過(guò) IoU 計(jì)算損失也是使用預(yù)測(cè)的概率值:

    [外鏈圖片轉(zhuǎn)存中…(img-efgoYMzv-1610966579307)]

    其中 C 表示總的類(lèi)別數(shù)。

    總結(jié)

    交叉熵?fù)p失把每個(gè)像素都當(dāng)作一個(gè)獨(dú)立樣本進(jìn)行預(yù)測(cè),而 dice loss 和 iou loss 則以一種更“整體”的方式來(lái)看待最終的預(yù)測(cè)輸出。

    這兩類(lèi)損失是針對(duì)不同情況,各有優(yōu)點(diǎn)和缺點(diǎn),在實(shí)際應(yīng)用中,可以同時(shí)使用這兩類(lèi)損失來(lái)進(jìn)行互補(bǔ)。

    總結(jié)

    以上是生活随笔為你收集整理的DBNet详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    91av中文字幕 | 很黄很黄的网站免费的 | 欧美人人 | 久久不射影院 | 中文字幕久久精品 | 国产黄免费 | 在线看国产视频 | 91九色自拍 | 亚洲精品综合久久 | 日本在线观看一区二区三区 | 国产视频不卡 | 91视频中文字幕 | 97视频网址 | 亚洲国产精品电影 | 丁香婷婷久久久综合精品国产 | 国产丝袜一区二区三区 | 最近日本字幕mv免费观看在线 | 麻豆一区在线观看 | 国产精品久久久久久久久婷婷 | 日批视频 | 九九免费在线观看 | 久久久免费毛片 | 四虎在线视频免费观看 | 国产成人精品区 | 在线观看91av| 日韩极品在线 | 色.www| 五月婷婷亚洲 | 毛片随便看| 国产精品一级在线 | www.综合网.com | 日韩欧美久久 | 一色屋精品视频在线观看 | 久久99视频 | 黄色美女免费网站 | 黄色免费大全 | 中文字幕国产 | 超碰99在线 | free. 性欧美.com | 日日摸日日碰 | 又紧又大又爽精品一区二区 | 精品国产一区二区三区久久久蜜臀 | 亚洲91精品在线观看 | 久久久综合电影 | 午夜久操| 91在线蜜桃臀 | 亚洲欧洲日韩在线观看 | 国产自产高清不卡 | 五月开心婷婷网 | 亚洲国产精品久久 | 久久久久久久亚洲精品 | 日韩免费电影 | 成人影片在线播放 | 五月综合久久 | 日韩有码在线播放 | 久久精品中文字幕 | 色综合久久久久久久久五月 | 99精品视频免费 | 婷婷久久一区 | 99在线精品免费视频九九视 | 91精品国产综合久久福利 | 欧美日韩视频在线 | 久人人 | 丁香激情综合久久伊人久久 | 九九热精品视频在线观看 | 免费在线黄色av | 最新国产中文字幕 | 午夜视频在线观看一区二区三区 | 精品美女国产在线 | 国产亚洲精品av | 亚洲成人资源在线 | 丁香花在线观看免费完整版视频 | 97综合在线| 在线午夜电影神马影院 | 久久久免费精品国产一区二区 | 青青草国产免费 | 狠狠色香婷婷久久亚洲精品 | 久久这里有精品 | 中文字幕在线观看完整版电影 | 久久成人精品视频 | 国产成人1区| 免费视频久久久 | 狠狠狠狠狠狠狠狠干 | 69视频永久免费观看 | 亚洲人成人在线 | 国产私拍在线 | 日本黄色免费播放 | 成人av高清 | 亚洲激情国产精品 | 色综合亚洲精品激情狠狠 | 亚洲精品欧美专区 | av免费看电影 | 日本精品久久久一区二区三区 | 免费97视频| 美女免费网站 | av电影一区二区三区 | 玖玖玖国产精品 | 国产高清综合 | 日批在线看 | av大片网址 | 亚洲综合色视频在线观看 | 日韩一级电影网站 | 亚洲国产精品人久久电影 | 国产在线精品一区 | 国产高清久久久久 | 91精品秘密在线观看 | 日韩欧美精品一区二区三区经典 | 精品视频99| 色偷偷人人澡久久超碰69 | 国产精品免费在线 | 四虎影院在线观看av | 91精品秘密在线观看 | 欧美韩国日本在线观看 | 国产成人久久精品一区二区三区 | 国产在线黄色 | 久久精品亚洲精品国产欧美 | 亚洲v欧美v国产v在线观看 | 亚洲永久精品在线观看 | 伊人久久一区 | 亚洲视频播放 | 天堂久久电影网 | 欧美日韩不卡在线视频 | 黄色片视频免费 | 国产成人精品久久亚洲高清不卡 | 丁香六月激情 | 国产精品久久久久久久久久妇女 | 亚洲精品久久视频 | 在线小视频国产 | 国产精品成久久久久三级 | 亚洲人成在线电影 | 日韩av一区二区在线 | 国产99久久九九精品免费 | aⅴ精品av导航 | 日本99热 | 美女视频黄在线 | 色婷婷综合在线 | 天天天天爱天天躁 | 久久精品视频2 | 国产精品18久久久久vr手机版特色 | 国内精品视频免费 | 精品国内| 日本午夜免费福利视频 | 久草视频免费看 | 天天射天天操天天干 | www.国产毛片 | 最近中文国产在线视频 | 国产在线观看,日本 | 婷婷日韩 | 午夜在线观看 | 日本午夜免费福利视频 | 丁香六月天婷婷 | 九九热视频在线免费观看 | 久久一二三四 | 国产精品久久久av久久久 | 亚洲黄色一级视频 | 国产成人a亚洲精品 | 在线一二区 | 国产成人在线精品 | 免费看国产视频 | 在线观看精品一区 | 免费观看91 | 日韩三级一区 | 国产va精品免费观看 | 亚洲一区尤物 | 久草久| 97视频免费播放 | 91精品在线观看视频 | 久久久免费精品 | 久久精品国产亚洲a | 99r精品视频在线观看 | 中文字幕一区二区三区久久蜜桃 | 在线观看91视频 | 国产成人精品福利 | 久久激情五月丁香伊人 | 天堂视频中文在线 | 黄色片免费电影 | 国产成人在线一区 | 欧美另类巨大 | 高清精品视频 | 黄色在线免费观看网站 | 国产91精品一区二区麻豆网站 | 欧美日韩激情视频8区 | 久久精品国产精品亚洲 | av理论电影 | 亚洲日本韩国一区二区 | 亚洲免费不卡 | 亚洲最新精品 | 久久99视频免费 | 五月婷婷在线综合 | 久久久久成人精品免费播放动漫 | 久久久久草 | 天天看天天操 | 亚洲在线网址 | 日韩精品一区二区免费视频 | 噜噜色官网 | 国产精品美女久久久久久久久久久 | 中文字幕免费观看全部电影 | 精品免费久久久久 | 久久久久国产精品午夜一区 | 毛片www| 天天色天天骑天天射 | 国产精品自拍在线 | 免费在线观看成人av | 91手机电视 | 亚洲精品免费观看 | 日韩精品一区二区三区免费观看视频 | 免费特级黄色片 | 成年人黄色免费视频 | 黄色小说在线免费观看 | 久草免费在线观看视频 | 午夜久久福利视频 | 91精品国产自产91精品 | 免费看片成人 | 18久久久久 | 99视频在线精品国自产拍免费观看 | 成人av在线影院 | 日韩欧美一区二区在线观看 | 欧美午夜a | 日韩三级视频在线看 | 九九热在线精品视频 | 中文乱幕日产无线码1区 | 深夜福利视频在线观看 | 在线黄色观看 | 天天操夜夜爱 | 香蕉影视 | 国产精品免费观看网站 | 日韩在线免费小视频 | 又污又黄网站 | 亚洲极色| 久久97超碰| 国产亚洲人成网站在线观看 | 中文字幕在线一区二区三区 | a在线观看视频 | 91视频啊啊啊 | 国产高清亚洲 | 国产精品密入口果冻 | 中文字幕av免费在线观看 | 国际精品久久久久 | 久久久久久看片 | 91av在线视频免费观看 | 狠狠狠狠狠狠 | 99热九九这里只有精品10 | 亚洲丝袜中文 | 精品在线小视频 | 韩国精品视频在线观看 | 毛片一二区 | 亚洲国产日韩在线 | 日韩电影中文字幕在线观看 | 麻豆91在线观看 | 色婷婷影视 | 天天爱av导航 | 久久一区二区三区国产精品 | 婷婷去俺也去六月色 | 久久久久久久看片 | 丝袜一区在线 | 91麻豆精品国产91久久久久久久久 | 中国黄色一级大片 | 欧美另类视频 | 国产不卡在线播放 | 奇米影视在线99精品 | 中文字幕免费高清在线观看 | 国产二区视频在线观看 | 成人黄色小说网 | 超碰在线最新地址 | 国产在线污 | 九九免费精品视频 | 91精品秘密在线观看 | 久久在线精品视频 | 久久久受www免费人成 | av成人在线播放 | www国产亚洲精品久久网站 | 日日夜日日干 | 亚洲精品久久在线 | 欧洲精品视频一区二区 | 亚洲精品国产视频 | 成年人免费在线观看网站 | 一区二区三区国 | 国产成人精品一区二区三区网站观看 | 亚洲欧美日韩国产精品一区午夜 | 久草观看视频 | 日韩在线理论 | 国产18精品乱码免费看 | 97看片网 | 日韩av中文字幕在线免费观看 | 亚洲激情在线视频 | 中文字幕在线看视频 | 美女视频免费精品 | 成人精品一区二区三区电影免费 | 亚洲人成精品久久久久 | 波多野结衣精品在线 | 国内精品久久久久影院一蜜桃 | 国产视频观看 | 欧美一区二区三区在线观看 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 黄色av电影网| 亚洲伦理电影在线 | 中文字幕在线观看播放 | 国产精品久久久av久久久 | 高清有码中文字幕 | 成人国产精品久久久 | 亚洲精品看片 | 日韩最新在线 | 99久久精品免费看国产 | 久草久草视频 | 亚洲高清91 | 91精品一区二区三区蜜桃 | 91在线国产观看 | 国产精品亚洲a | 狠狠干狠狠艹 | 超碰在线天天 | 精品少妇一区二区三区在线 | 欧美精彩视频在线观看 | 国产一区在线视频 | 综合色播| 嫩草av影院 | 亚洲 成人 欧美 | 国产精品99久久免费黑人 | 日韩av伦理片| 丁香婷婷综合五月 | 国产视频在线免费观看 | 婷婷在线视频 | 玖玖在线视频观看 | 日本久久久久久科技有限公司 | 黄色小说在线观看视频 | 欧洲亚洲精品 | 亚洲男人天堂a | 国产黄色电影 | 日本3级在线观看 | 免费日韩三级 | 日韩成人精品 | 亚洲国产影院 | 手机av在线网站 | 国产午夜一区 | 亚洲高清视频一区二区三区 | 欧美成人在线免费 | 国产淫片免费看 | 日韩专区av | 手机在线小视频 | 麻豆传媒视频在线播放 | 国产精品一区二区三区99 | 色婷婷婷 | 国产精品99精品 | www.黄色片网站 | 在线观看色网站 | 成人网大片 | 69国产在线观看 | 亚洲国产mv | 亚洲激情六月 | 黄色在线网站噜噜噜 | 日韩午夜视频在线观看 | 天天爽网站 | 伊人五月 | 国产色婷婷在线 | 国产精品美女久久久久久久 | 亚洲国产综合在线 | 国产一区二区三精品久久久无广告 | 日韩免费在线看 | 日韩中午字幕 | 波多野结衣一区二区三区中文字幕 | 在线观看日韩中文字幕 | 国产69精品久久久久99 | 在线观看不卡视频 | 亚洲在线视频网站 | 日韩黄色av网站 | 精油按摩av | 四虎国产永久在线精品 | 91精品国产91 | 96av视频 | 国产色视频123区 | 99热精品在线 | 福利二区视频 | 青草视频在线免费 | 97超碰人人澡 | 欧美日本不卡高清 | 黄色av影视 | 精品久久久久久久久久久久久久久久久久 | 日日操天天操狠狠操 | 久久一本综合 | 麻豆视频免费在线观看 | 99久久9 | 国产99久久久国产精品免费看 | 伊人小视频 | 午夜av免费观看 | 69精品| 天天操,夜夜操 | 国产精品视频资源 | 特级a老妇做爰全过程 | 精品国产欧美 | 免费的黄色av | 一区在线电影 | 九九99| 在线播放 日韩专区 | 激情五月婷婷激情 | 日本一区二区三区免费观看 | 日韩精品在线观看av | 人人天天夜夜 | 日韩精品视频网站 | 日韩精品黄 | 亚洲精品小视频在线观看 | 午夜av在线免费 | 国产毛片久久 | 91桃色免费视频 | 亚洲黄色免费网站 | 亚洲影视资源 | 高清免费在线视频 | 国产精品1区2区3区在线观看 | 三级免费黄色 | 天堂视频中文在线 | 日韩在线 一区二区 | 日韩av中文在线观看 | 狠狠色丁香婷婷综合基地 | 一区二区视频网站 | 久久国产精品99久久久久久进口 | 99久高清在线观看视频99精品热在线观看视频 | 91九色国产视频 | 亚洲一区二区三区四区在线视频 | 久草电影免费在线观看 | 国产精品久久久久影院 | 韩国av不卡 | 亚洲激情久久 | 欧美一二三在线 | 综合色婷婷 | 亚洲日本精品 | 黄色片软件网站 | 国产在线视频在线观看 | 久久精品国产免费看久久精品 | 日本最新中文字幕 | 五月天激情视频 | 亚洲国产成人久久综合 | 久久久国产精品一区二区中文 | 成人app在线免费观看 | 欧美视频99 | 久久久免费国产 | 久久久久久久久久影视 | 亚洲精品中文在线观看 | 久草在线观 | 日韩高清二区 | www久久久久 | 91视频在线自拍 | 久草在线资源视频 | 91最新网址 | 97国产精品亚洲精品 | 狠狠狠色丁香婷婷综合激情 | 欧美日韩伦理一区 | 国产欧美在线一区二区三区 | 精品国产精品久久一区免费式 | 91网在线看 | 国产精品av一区二区 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 色噜噜日韩精品一区二区三区视频 | 伊人天天干 | 97理论电影 | 在线韩国电影免费观影完整版 | 久久久久久久久久影院 | 99国产精品一区 | 国产精品一区二区三区99 | 久久高清免费观看 | 狠狠激情中文字幕 | 国产资源在线观看 | 久久久久亚洲精品中文字幕 | 99久久精品国产一区二区成人 | 亚洲狠狠丁香婷婷综合久久久 | 在线观看av片 | 色偷偷97 | 精品福利网 | 亚洲欧美成人在线 | 激情五月播播久久久精品 | 欧美精品一二 | 午夜视频免费播放 | 一区二区三区手机在线观看 | 日韩v在线 | 成年人毛片在线观看 | 热久久电影 | 麻豆成人小视频 | 日韩亚洲在线视频 | 亚洲欧洲av在线 | 日韩欧美高清一区二区 | 在线播放国产精品 | 久久久久久久久久久久久国产精品 | av天天干 | 国产视频观看 | 欧美国产高清 | 天天看天天干天天操 | 成人午夜精品久久久久久久3d | 天天干夜夜夜操天 | 精品国产一区二区三区久久久久久 | 日韩欧美精品一区二区三区经典 | 色网站在线| 国产传媒中文字幕 | 狠狠狠色丁香婷婷综合久久五月 | 九草视频在线 | 久久精品久久99精品久久 | 在线日本看片免费人成视久网 | 四虎小视频 | 中文资源在线观看 | 99爱精品视频 | 亚洲婷婷伊人 | 美女视频永久黄网站免费观看国产 | 国产精品永久在线观看 | 久艹在线免费观看 | 六月丁香综合 | 国内精品视频在线 | 国产精品免费看 | 久久免费高清 | 久一久久| 国产视频在线播放 | 欧美狠狠操 | 黄色91在线观看 | 五月婷婷激情 | 成人高清在线观看 | 国产看片 色| 操操色 | 欧美日韩国产综合网 | 色婷婷国产在线 | 热久久免费国产视频 | 国产va精品免费观看 | 精品久久国产一区 | 伊人宗合| 九九热国产视频 | 国产精品久久久久久久久岛 | 欧美天堂视频在线 | 午夜999 | 亚洲欧美怡红院 | 日韩高清在线不卡 | 蜜桃视频精品 | 中文字幕在线观看网址 | 97在线观看免费高清完整版在线观看 | 久草资源在线 | 伊甸园av在线 | 亚洲h视频在线 | 色在线免费 | 日韩三级久久 | 精品国产一区二区三区久久 | 欧美日韩国产一区二区三区在线观看 | 日韩午夜精品福利 | www.久久色 | 日韩 国产| 最新国产精品拍自在线播放 | 国产成人高清在线 | a视频免费在线观看 | 婷婷精品| 欧美久久久久久久 | 欧美激精品 | 久久手机视频 | 在线观看中文字幕av | 国产精品美女久久久久久久网站 | 草草草影院 | 天堂入口网站 | 亚洲精品成人网 | 在线亚洲成人 | 色综合久久88色综合天天 | 久久精品久久精品久久 | 91香蕉嫩草 | 色吊丝在线永久观看最新版本 | 免费av的网站| www.神马久久 | 在线播放视频一区 | 丁香六月婷婷综合 | 中文字幕av在线免费 | 成人av高清在线观看 | 成人免费视频网站在线观看 | 97精品国产97久久久久久粉红 | 日日夜夜婷婷 | 99婷婷 | 91免费日韩 | 亚洲精品午夜久久久久久久久久久 | 国产成人精品免费在线观看 | 国产精品一区二区精品视频免费看 | 五月天婷婷丁香花 | 亚洲免费高清视频 | 日韩电影中文,亚洲精品乱码 | 国产黄色片免费看 | 麻豆免费视频网站 | 日韩成人xxxx | 日日干日日操 | 亚洲精品xx| 成人福利在线播放 | 亚洲精选视频免费看 | 欧美日韩综合在线观看 | 婷婷综合网 | 天堂va欧美va亚洲va老司机 | 日韩av看片 | 亚洲精品久久激情国产片 | 999成人国产 | 少妇bbbb搡bbbb桶 | 亚洲国产精品99久久久久久久久 | 日日日操 | 美女国产在线 | 成人久久综合 | 综合在线观看 | 免费成人在线观看视频 | 少妇bbbb揉bbbb日本 | 波多野结衣综合网 | 国产不卡精品 | 一级电影免费在线观看 | 欧美日韩激情视频8区 | 99精品在线视频播放 | 亚洲国产精品女人久久久 | 97超碰中文字幕 | 一级做a视频 | 亚洲精品综合一区二区 | 免费a网址 | 精品免费观看 | 狠狠狠色丁香婷婷综合久久五月 | 精品国产乱码久久 | 色狠狠久久av五月综合 | 国产精品免费在线播放 | 色丁香色婷婷 | 制服丝袜在线 | 91九色在线视频观看 | 高清视频一区二区三区 | 日韩欧美国产视频 | 亚洲人成在线电影 | 久久久91精品国产一区二区精品 | 国产精品久久人 | 在线不卡a | 日韩免费电影网 | 国产一区二区不卡在线 | 最新色站| 国产福利专区 | 91精品国产麻豆国产自产影视 | 日本精品视频在线播放 | 亚洲九九九在线观看 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 国产九九九九九 | 成人一区二区在线观看 | 国产免费三级在线观看 | 在线视频免费观看 | 婷婷综合伊人 | 超级碰视频 | 久久精品草| 国产小视频精品 | 国产成人61精品免费看片 | 久久久视频在线 | 国产一级做a| 日韩电影在线观看一区 | 天天综合久久综合 | 波多野结依在线观看 | 国产精品 日本 | 日本三级大片 | 中文在线免费视频 | 中文字幕日韩国产 | 久久久人 | 国产免费又爽又刺激在线观看 | av黄色国产 | 亚洲夜夜网 | 黄色在线观看免费网站 | 天天插天天射 | 国产在线观看高清视频 | 中文字幕视频三区 | 在线成人一区 | 在线视频a | 99爱精品视频 | 国产精品99久久久精品 | 色综合久久综合中文综合网 | 精品免费在线视频 | 欧洲成人av | 国产亚洲观看 | 999久久久久久久久6666 | 欧美成年人在线视频 | 特级黄色片免费看 | 天天看天天干天天操 | 久久久国产精品一区二区三区 | 国产在线a免费观看 | 欧美色伊人 | 婷婷色婷婷 | 欧美日韩一区二区免费在线观看 | 中文字幕在线第一页 | 亚在线播放中文视频 | 99综合久久 | 久久高清免费 | 日韩欧美一区二区在线 | 91av资源在线 | 日韩亚洲国产中文字幕 | av在线播放中文字幕 | .国产精品成人自产拍在线观看6 | 天天干天天碰 | 中文字幕在线播放日韩 | 中文字幕黄网 | 麻豆久久| 国产精品久久久久亚洲影视 | 国产视频网站在线观看 | 一级一片免费视频 | 中文字幕制服丝袜av久久 | 绯色av一区 | 69国产精品成人在线播放 | 久久午夜影院 | 久久国产精品电影 | 国产精品一区二区三区久久久 | 日韩av免费一区二区 | 深爱婷婷久久综合 | 在线观看亚洲电影 | 国产精品久久久久毛片大屁完整版 | 97国产精品久久 | 97在线免费观看视频 | 91大神精品视频 | 欧美高清成人 | 99视频久 | 黄色软件在线观看免费 | 成人a级大片| 国产亚洲精品久久19p | av手机在线播放 | 欧美少妇xx| 亚洲精品乱码久久久久久蜜桃动漫 | 欧美性做爰猛烈叫床潮 | 一区二区精品久久 | 国内精品久久久久久久久 | 国产精品午夜免费福利视频 | 精品一区 在线 | 99精品久久99久久久久 | 国产精品99久久久久久宅男 | 97在线精品视频 | 久久久在线观看 | 国产精品女同一区二区三区久久夜 | 久久99精品久久久久久久久久久久 | 激情黄色av| 高清视频一区二区三区 | 国产精品一区二区在线免费观看 | 国产 一区二区三区 在线 | 欧美做受高潮 | 人人射人人爱 | 久草精品视频在线播放 | 天天爽夜夜爽人人爽曰av | 午夜精品剧场 | 亚洲国产成人精品在线观看 | 欧美了一区在线观看 | 亚洲午夜精品电影 | 亚洲成人av片在线观看 | 91色一区二区三区 | 999视频在线播放 | 色综合咪咪久久网 | 天天操天天玩 | 久久久资源网 | 亚洲欧美怡红院 | 成人黄色片在线播放 | 五月婷婷导航 | 久久99久久99精品免观看粉嫩 | 久久精品1区 | 激情影院在线观看 | 国产激情免费 | 亚洲精品午夜久久久久久久久久久 | av免费看在线 | 日韩精品大片 | 国产中文字幕一区二区 | 成人禁用看黄a在线 | 九九热在线播放 | 欧美一区二区三区在线 | 国产精品99视频 | 精品久久久久亚洲 | 深夜视频久久 | 欧美日高清视频 | 中文字幕亚洲情99在线 | 久久9精品 | 91精品欧美一区二区三区 | 久久久99精品免费观看app | 免费高清影视 | 三日本三级少妇三级99 | 日韩电影久久久 | 中文字幕第 | 黄色影院在线免费观看 | 91av蜜桃 | 最新国产中文字幕 | 日韩高清在线一区 | 精品国偷自产国产一区 | 国产手机视频在线 | 精品在线观看国产 | 91av大全 | 91视频在线观看大全 | 国产女人18毛片水真多18精品 | 久久久久久久久电影 | 国产综合精品一区二区三区 | 久爱综合 | 国产精品中文在线 | 超级碰碰碰碰 | 人人添人人澡人人澡人人人爽 | 精品欧美一区二区三区久久久 | 免费观看成人网 | 欧美在线视频日韩 | 色婷婷福利 | 国内精品视频一区二区三区八戒 | 麻豆传媒视频在线播放 | 在线观看免费观看在线91 | 成人精品一区二区三区电影免费 | 亚洲一级片免费观看 | 成年人在线| 中国一级片在线播放 | 91成年人在线观看 | 亚洲黄色免费 | 久久精品久久国产 | 亚洲国产精品va在线看黑人 | 日韩av中文字幕在线 | 国产二区电影 | 国产日韩欧美在线观看 | 国产一区观看 | 日韩三级视频 | 欧洲一区二区三区精品 | 视频国产一区二区三区 | 久久久久欧美精品 | 99视频在线精品免费观看2 | 亚洲精品 在线视频 | 91麻豆精品国产91久久久更新时间 | 久保带人 | 在线成人性视频 | 日韩二区在线 | 精品久久久久久亚洲综合网 | 成人在线视频免费观看 | 黄色一级动作片 | 日韩理论电影网 | 伊人婷婷激情 | 国产 在线观看 | 久操中文字幕在线观看 | 精品视频在线观看 | 亚洲经典中文字幕 | 久久久99国产精品免费 | 国产成视频在线观看 | 亚洲片在线观看 | 天天操天天干天天综合网 | www.五月天婷婷.com | 亚洲乱码在线观看 | 国产综合香蕉五月婷在线 | 精品国产一区二区三区久久影院 | 天天综合91 | 国产精品一区二区三区在线免费观看 | 在线观看va | 成年人免费在线播放 | 国产伦理久久 | 99热这里精品 | 香蕉视频91| 五月婷婷综 | 成片免费观看视频 | 久久久久99精品国产片 | 香蕉日日 | 特级xxxxx欧美 | 免费视频久久 | 成年人免费在线观看 | 欧美人人爱 | 成人精品在线 | 国内成人av| 精品一区 精品二区 | 综合网色 | 超碰在线国产 | 91视频久久久 | 丁香婷婷亚洲 | 91观看视频| 亚洲免费婷婷 | 黄色网址av| 天天综合色天天综合 | 六月丁香婷婷网 | 色九九视频 | 亚洲综合欧美日韩狠狠色 | 99久久综合精品五月天 | av东方在线| 久久久高清一区二区三区 | 又污又黄网站 | 日韩精品在线一区 | 人人干人人添 | 久久久久久久久免费视频 | 亚洲精品91天天久久人人 | 夜添久久精品亚洲国产精品 | 久久av网| 色91在线| 久久99久久精品国产 | 国产一区网 | 国产1区2 | 少妇性色午夜淫片aaaze | 亚洲精品美女久久久久 | 去干成人网 | 日韩av女优视频 | 久久免费美女视频 | 中文字幕在线播放日韩 | 国产精品网址在线观看 | 日韩视频免费观看高清 | 婷婷精品国产欧美精品亚洲人人爽 | 青青久草在线视频 | 国外调教视频网站 | 亚州天堂 | av在观看 | av电影av在线 | 在线观看日韩av | 国产视频久| 日韩精品免费一线在线观看 | 天干啦夜天干天干在线线 | 国产精品一区二区麻豆 | 美女精品国产 | 日韩电影久久 | 久久久精品网 | 国产一区精品在线观看 | 99夜色 | 国产小视频免费在线观看 | 日本三级中文字幕在线观看 | 国产美女精品视频 | 丁香资源影视免费观看 | 在线观看视频在线 | 天天色天天综合 | 欧美粗又大 | 精品免费观看视频 | 欧美韩日精品 | 日韩欧美在线第一页 | 日韩av综合网站 | 午夜丰满寂寞少妇精品 | 91成人区 | 欧美一级艳片视频免费观看 | 欧美视频国产视频 | 18久久久| 日日草视频 | 亚洲第一久久久 | 国产一卡二卡四卡国 | 免费www视频 | 色瓜 | 三级av在线播放 | 久久久精品视频成人 | 日本少妇高清做爰视频 | 久久99精品热在线观看 | 麻豆视频在线免费观看 | 最近中文字幕mv免费高清在线 | 97超碰色偷偷 | 日本精品视频在线观看 | 日韩精品三区四区 | 亚洲精品国产精品乱码在线观看 | aaa日本高清在线播放免费观看 | 久久精品美女视频 | 久久精品屋 | 午夜美女福利 | 四虎影视成人精品国库在线观看 | 99久久爱 | 91精品国产自产老师啪 | 婷婷视频在线观看 | 精品免费国产一区二区三区四区 | 91中文在线观看 | 日韩精品在线视频免费观看 | 中文字幕精品三区 | 日韩三级在线 | 99精品国产高清在线观看 | 国产成人一区二 | 香蕉视频91| 亚洲成人资源在线观看 | 精品在线观看一区二区三区 | 人人超碰免费 | 中文字幕网址 | 五月开心色 | 人人爱人人做人人爽 | 精品国产三级 | 91尤物国产尤物福利在线播放 | 亚洲天天草| 91亚·色 | 在线视频日韩一区 | 成人国产精品av | 日日夜夜噜 | 香蕉精品在线观看 | 久久久毛片 | 天天干天天想 | 国产精品入口66mio女同 | 看av免费 | 色多多在线观看 | 欧美激情第28页 | 国产精品成人免费一区久久羞羞 | 在线视频久 | 麻豆免费视频 | 97国产精品亚洲精品 | 久久a热6 | 久久久香蕉视频 | 久久成人一区二区 | 在线看一区二区 | 免费视频久久久久 | 高清视频一区二区三区 | 国内精品视频一区二区三区八戒 | www.com久久 | 91成人免费| 九九久久视频 | 西西44人体做爰大胆视频 | 日日摸日日碰 | 一级一片免费观看 | 天天狠狠操 | 99精品黄色 | 精品在线一区二区三区 | 日本最新高清不卡中文字幕 | 顶级欧美色妇4khd | 国产精品人成电影在线观看 | 亚洲人成在线观看 | 亚洲精品欧洲精品 | 成人小电影在线看 | 久草在线视频看看 | 欧洲av在线 | 精品久久91| 顶级bbw搡bbbb搡bbbb | 日韩中文字幕在线不卡 | 午夜视频在线观看网站 | 婷婷久久综合网 | 国产不卡一 | 国内视频| a在线免费 | 免费看成年人 | 久久网页| 69av在线播放 | 天天插综合 | 99精品国自产在线 | 88av色| 国内精品美女在线观看 |