CondInst:性能和速度均超越Mask RCNN的實例分割模型

2021-02-18 機器學習算法工程師

點藍色字關注「機器學習算法工程師

設為星標,乾貨直達!

對於實例分割來說,主流的做法還是基於先檢測後分割的流程,比如最流行的Mask RCNN模型就是構建在Faster RCNN基礎上。目前基於one-stage的物體檢測模型已經在速度和性能上超越two-stage模型,同樣地,大家也希望能找到one-stage的實例分割模型來替換Mask RCNN。目前這方面的工作主要集中在三個方向:

Mask encoding:對2D mask編碼為1D representation,比如PolarMask基於輪廓構建了polar representation,而MEInst則將mask壓縮成一個1D vector,這樣預測mask就類似於box regress那樣直接加在one-stage檢測模型上;分離檢測和分割:將檢測和分割分離成兩個部分這樣可以並行化,如YOLACT在檢測模型基礎上額外預測了一系列prototype masks,然後檢測部分每個instance會預測mask coeffs來組合masks來產生instance mask,BlendMask是對這一工作的進一步改進;不依賴檢測的實例分割:不依賴檢測框架直接進行實例分割,TensorMask和SOLO屬於此種類型,前者速度太慢,後者速度和效果都非常好;

對於mask encoding方法,雖然實現起來比較容易,但是往往會造成2D mask的細節損失,所以性能上會差一點;分離檢測和分割,對於分割部分可以像語義分割那樣預測global mask,解析度上會更高(要知道Mask RCNN的mask解析度只有28x28),但是這種方法需要一種好的方式來產生instance mask;不依賴檢測而直接進行實例分割這可能是未來的趨勢。這裡介紹的CondInst,其實屬於第二種,但是它與YOLACT不同,其核心點是檢測部分為每個instance預測不同的mask head,然後基於global mask features來產生instance mask,思路非常簡單,而且實現起來也極其容易(已經開源在AdelaiDet),更重要的是速度和效果上均超越Mask RCNN。

整體結構

CondInst是構建在物體檢測模型FCOS之上的(CondInst和FCOS是同一個作者),所以理解CondInst必須先理解FCOS,可以參考之前關於FCOS的介紹文章(FCOS),但其實CondInst也可以依賴其他的one-stage模型,CondInst整體結構如下圖所示:


相比FCOS,CondInst多了一個mask branch,其得到的mask features將作為mask FCN的輸入來生成最終的instance mask,這個mask features來自於P3,所以大小是輸入圖像的1/8。另外在FCOS的檢測部分增加了controller head(實際上controller head是直接加在box head上的),用來產生每個instance的mask head網絡的參數。這個思想其實是CondConv,傳統的Conv訓練完成後是固定的filters,但是CondConv的filters基於input和一個另外的網路來動態產生的。CondInst用來controller head生成instance-aware的mask FCN head,每個instance都有自己獨有的mask head,instance的形狀和大小等信息都編碼在其中。所以當mask head作用在global mask features上時,就可以區分當前的instance和其它背景信息,從而預測出instance mask。

這樣CondInst就可以實現實例分割了,CondInst的正負樣本策略和FCOS一樣,都是通過center region sampling方式來決定正負樣本,其訓練的loss相比FCOS增加intance mask的loss,這個loss也只計算正樣本部分:

Mask Branch

CondInst的mask branch就和語義分割類似是一個FCN網絡,包括4個channel為128的3x3卷積,然後最後接一個channel為8的1x1卷積。mask branch輸入為FPN的P3特徵,所以最終產生的特徵

# 額外的語義loss,採用focal loss
if self.training and self.sem_loss_on:
    logits_pred = self.logits(self.seg_head(
                features[self.in_features[0]]
            )) # 預測logits,區分class

    # 計算語義分割的gt,這裡的原則是合併instance的gt mask,但是當不同instance有重疊時,會取面積最小的instance的class作為gt
    semantic_targets = []
    for per_im_gt in gt_instances:
        h, w = per_im_gt.gt_bitmasks_full.size()[-2:]
        areas = per_im_gt.gt_bitmasks_full.sum(dim=-1).sum(dim=-1)
        areas = areas[:, None, None].repeat(1, h, w)
        areas[per_im_gt.gt_bitmasks_full == 0] = INF
        areas = areas.permute(1, 2, 0).reshape(h * w, -1)
        min_areas, inds = areas.min(dim=1)
        per_im_sematic_targets = per_im_gt.gt_classes[inds] + 1
        per_im_sematic_targets[min_areas == INF] = 0
        per_im_sematic_targets= per_im_sematic_targets.reshape(h, w)
        semantic_targets.append(per_im_sematic_targets)

    semantic_targets = torch.stack(semantic_targets, dim=0) # [N, 1, H, W] 

    # 對gt進行降採樣,為原始的1/8
    semantic_targets = semantic_targets[:, None, self.out_stride // 2::self.out_stride, self.out_stride // 2::self.out_stride]

    # one-hot gt
    num_classes = logits_pred.size(1)
    class_range = torch.arange(num_classes, dtype=logits_pred.dtype, device=logits_pred.device)[None, :, None, None]
    class_range = class_range + 1
    one_hot = (semantic_targets == class_range).float()
    num_pos = (one_hot > 0).sum().float().clamp(min=1.0)
    
    # 採用focal loss
    loss_sem = sigmoid_focal_loss_jit(
                logits_pred, one_hot,
                alpha=self.focal_loss_alpha,
                gamma=self.focal_loss_gamma,
                reduction="sum",
            ) / num_pos
            losses['loss_sem'] = loss_sem

return mask_feats, losses

Controller Head

前面說過,CondInst的核心就在於controller head,其用來產生mask head的網絡參數,這個參數是每個instance所獨有的,所以當輸入為全局mask特徵時,可以預測出instance mask。由於controller head會編碼instance的形狀和大小信息,所以它是直接加在FCOS的box head上的,就和centerness head一樣。

controller head的輸出channel數為N,恰好是mask head的網絡參數量。mask head採用一個輕量級的FCN網絡,包含三個channel為8的3x3卷積層,卷積之後接ReLU,最後一層卷積直接加上sigmoid(二分類)就可以預測instance mask。所以mask head的參數量N為169:(#weights = (8 + 2) × 8(conv1) + 8 × 8(conv2) + 8 × 1(conv3) and #biases = 8(conv1) + 8(conv2) + 1(conv3))。這裡的輸入channel是8+2,而不是8,是因為送入mask head的輸入除了包括

def parse_dynamic_params(params, channels, weight_nums, bias_nums):
    assert params.dim() == 2
    assert len(weight_nums) == len(bias_nums)
    assert params.size(1) == sum(weight_nums) + sum(bias_nums)

    num_insts = params.size(0)
    num_layers = len(weight_nums)

    params_splits = list(torch.split_with_sizes(
        params, weight_nums + bias_nums, dim=1
    ))

    weight_splits = params_splits[:num_layers]
    bias_splits = params_splits[num_layers:]

    for l in range(num_layers):
        if l < num_layers - 1:
            # out_channels x in_channels x 1 x 1
            weight_splits[l] = weight_splits[l].reshape(num_insts * channels, -1, 1, 1)
            bias_splits[l] = bias_splits[l].reshape(num_insts * channels)
        else:
            # out_channels x in_channels x 1 x 1
            weight_splits[l] = weight_splits[l].reshape(num_insts * 1, -1, 1, 1)
            bias_splits[l] = bias_splits[l].reshape(num_insts)

    return weight_splits, bias_splits

由於輸入的

Inference

CondInst的inference就比較直接了,首先是檢測部分得到檢測的結果,然後採用box-based NMS來去除重複框,最後選出top 100的檢測框,只有這部分instances會進行instance mask的預測。由於產生的mask head非常小,所以100個instance的mask預測時間只需要4.5ms,那麼CondInst的預測時間僅比原始的FCOS增加了約10%。這裡額外要說的一點是CondInst的box預測主要用於NMS,但不會參與instance mask的預測中,而Mask R-CNN是需要box來進行ROI croping。CondInst和其它實例分割在COCO上的效果對比如下:


此外,CondInst的作者近期又發布了一篇新的不錯的工作:BoxInst,只用box級別的標註就可以訓練出一個不錯的實例分割模型,這個模型也是構建在CondInst上,只不過設計了兩個新的loss來進行半監督式的訓練。最後放一個BoxInst的一個分割視頻demo:

參考 Conditional Convolutions for Instance Segmentation   BoxInst: High-Performance Instance Segmentation with Box Annotations

相關焦點

  • 算法| 超Mask RCNN速度4倍,僅在單個GPU訓練的實時實例分割算法
    在論文《YOLACT:Real-time Instance Segmentation》中,作者提出了一種簡潔的實時實例分割全卷積模型,僅使用單個 Titan Xp,以 33 fps 在MS COCO 上實現了 29.8 的 mAP,速度明顯優於以往已有的算法。而且,這個結果是就在一個 GPU 上訓練取得的!
  • 用於圖像分割的卷積神經網絡:從R-CNN到Mask R-CNN
    在本文中,我們將看到卷積神經網絡(CNN)如何在圖像實例分割任務中提升其結果。自從 Alex Krizhevsky、Geoff Hinton 和 Ilya Sutskever 在 2012 年贏得了 ImageNet 的冠軍,卷積神經網絡就成為了分割圖像的黃金準則。事實上,從那時起,卷積神經網絡不斷獲得完善,並已在 ImageNet 挑戰上超越人類。
  • Mask R-CNN
    Mask R-CNN是一種在有效檢測目標的同時輸出高質量的實例分割mask。是對faster r-cnn的擴展,與bbox識別並行的增加一個預測分割mask的分支。Mask R-CNN 可以應用到人體姿勢識別。並且在實例分割、目標檢測、人體關鍵點檢測三個任務都取得了現在最好的效果。效果圖
  • 動態生成掩膜預測網絡生成模型CondInst,助力FCN重奪實例檢測顛峰
    Mask R-CNN作為一種性能優異的算法,在實例分割領域取得了巨大成功,這種兩階段的方法主要依賴於ROI操作來獲取最終的實例掩膜。而在這篇文章中,作者從全新的角度解決了實例分割問題,來自澳大利亞阿德萊德大學的研究人員在實例條件下提出了動態實例生成的網絡模型,代替了先前逐個實例的ROI區域作為預測的輸入。
  • 【論文解讀】Facebook 何凱明 Mask R-CNN 狙擊目標實例分割
    Mask R-CNN,該方法能有效地在每個實例中探測同時出現的目標,並對每個實例生成一個高質量的分割掩碼(segmentation mask)。基於以上的描述,你可能覺得實例分割工作需要一個複雜的模型才能達到良好的效果,但是Facebook提出的Mask R-CNN模型卻出乎意料地集簡潔、靈活和快速於一身,並擁有目前來說最好的表現。
  • 代替Mask R-CNN,BlendMask欲做實例預測任務的新基準?
    本文提出的BlendMask可以通過很少的通道有效地預測密集的像素位置敏感實例特徵,並且僅使用一個卷積層就可以為每個實例學習注意力圖,從而進行快速推理。BlendMask可以輕鬆地與最新的一階段檢測框架結合使用,並且在相同的訓練策略下,其性能優於Mask R-CNN,且速度提高了20%。
  • Facebook 最新論文:Mask R-CNN實例分割通用框架,檢測,分割和特徵...
    近日, FAIR部門的研究人員在這一領域又有了新的突破——他們提出一種目標實例分割(object instance segmentation)框架Mask R-CNN,該框架較傳統方法操作更簡單、更靈活。研究人員把實驗成果《Mask R-CNN》發布在了arXiv上,並表示之後會開源相關代碼。以下為AI科技評論據論文內容進行的部分編譯。
  • Mask R-CNN官方實現「又」來了!訓練速度是原來2倍
    它支持Faster R-CNN、Mask R-CNN、RetinaNet等等,相比Facebook的Detecron有5%到20%的性能提升。這個模型還在2018年的COCO Detection競賽中拿下了冠軍。
  • 經典目標檢測方法Faster R-CNN和Mask R-CNN|基於PaddlePaddle深度...
    Mask R-CNN 可以應用到人體姿勢識別,並且在實例分割、目標檢測、人體關鍵點檢測三個任務都取得了很好的效果。因此,百度深度學習框架 PaddlePaddle 開源了用於目標檢測的 RCNN 模型,從而可以快速構建強大的應用,滿足各種場景的應用,包括但不僅限於安防監控、醫學圖像識別、交通車輛檢測、信號燈識別、食品檢測等等。
  • 愷明大神 Mask R-CNN 超實用教程
    對象檢測器,如yolo、faster r-cnn和ssd,生成四組(x,y)坐標,表示圖像中對象的邊界框。從獲取對象的邊界框開始挺好的,但是邊界框本身並不能告訴我們(1)哪些像素屬於前景對象,(2)哪些像素屬於背景。是否可以為圖像中的每個對象生成一個MASK,從而允許我們從背景分割前景對象?
  • FAIR最新視覺論文集錦:FPN,RetinaNet,Mask 和 Mask-X RCNN(含代碼...
    FPN, RetinaNet,,Mask 和 Mask-X RCNN   翻譯 | 李石羽 林立宏 整理 | 凡江   這篇文章會從 FAIR 在基本模塊上的創新開始談到CNN,再到one-shot 物體檢測。之後會講實例分割的創新。最後聊聊依靠弱半監督模型來擴展實例分割。
  • 愷明大神 Mask R-CNN 超實用教程
    對象檢測器,如yolo、faster r-cnn和ssd,生成四組(x,y)坐標,表示圖像中對象的邊界框。從獲取對象的邊界框開始挺好的,但是邊界框本身並不能告訴我們(1)哪些像素屬於前景對象,(2)哪些像素屬於背景。這就引出了一個問題:是否可以為圖像中的每個對象生成一個MASK,從而允許我們從背景分割前景對象?
  • 實例分割算法之Mask RCNN
    這裡之所以單獨成文是因為Mask RCNN不僅僅用於目標檢測,還用於實例分割。目標檢測和實例分割的區別在於,實例分割不僅僅需要將目標識別,還需要將它的輪廓繪出。這意味著需要對每一個像素進行分類。這麼說也不嚴謹,因為容易跟語義分割混淆。我們還是統一區別一下目標檢測,語義分割,實例分割這三者。
  • 【從零開始學Mask RCNN】一,原理回顧&&項目文檔翻譯
    算法總覽Mask-RCNN是一個實例分割(Instance segmentation)框架,通過增加不同的分支可以完成目標分類,目標檢測,語義分割,實例分割,人體姿態估計等多種任務。可以看到,這個過程相比於ROI Pooling沒有引入任何量化操作,即原圖中的像素和特徵圖中的像素是完全對齊的,沒有偏差,這不僅會提高檢測的精度,同時也會有利於實例分割。
  • Ross、何愷明等人提出:渲染思路做圖像分割,提升Mask R-CNN性能
    這樣一來,圖像分割方法通常基於低解析度規則網格來預測標籤,如在語義分割任務中輸入的 1/8,或實例分割中的 28×28,以此作為欠採樣和過採樣之間的妥協。圖 1:使用 PointRend 執行實例分割和使用傳統方法的對比。傳統方法(左)分割的時候圖像解析度低,分割效果差。
  • 何愷明團隊開源圖像分割新算法PointRend:性能顯著提升,算力僅需Mask R-CNN的2.6%
    作者在 COCO 和 Cityscapes 基準數據集上評估了 PointRend 在實例分割和語義分割任務上的性能。定性結果顯示,PointRend 能夠高效計算不同對象之間的清晰邊界,如圖 2 和圖 8 所示。
  • 何愷明團隊:從特徵金字塔網絡、Mask R-CNN到學習分割一切
    構建一個每個人都可以在各種任務、子主題和應用領域中建立的基準模型並不容易。在詳細討論之前,我們需要了解的一點是:FPN是ResNet或DenseNet等通用特徵提取網絡的附加組件。你可以從你喜歡的DL庫中得到想要的預訓練FPN模型,然後像其他預訓練模型一樣使用它們。物體是以不同的的scale和size出現的。
  • 【源頭活水】Sparse R-CNN:簡化版fast rcnn
    信息,不足以表徵物體屬性例如姿態和形狀等等,故額外引入了可學習的proposal feature,作用類似於detr裡面的object query為了更好的提取每個bbox實例的特徵,對roi特徵和proposal feature引入了交叉注意力模塊(論文中叫做可交互模塊)引入了類似cascade rcnn的級聯refine思想,提高整體性能對上述做法的思想不了解的,不用著急,後面會一一詳述,在閱讀本文前最好先閱讀下
  • FCOS進化版PolaMask,實例分割新思路
    其結構簡單、性能優越,在業內受到廣泛的關注。本文介紹的PolarMask正式借鑑FCOS的思路來進行實例分割,可以看作FCOS的進化版本,很有借鑑意義。FCOS回顧簡單來說,FCOS是直接預測到box上下左右四條邊的距離**(l,t,r,b)**進行box回歸的。
  • 性能提升30%以上,實時實例分割算法SOLOv2實現產業SOTA
    機器之心發布機器之心編輯部如何兼顧目標檢測和語義分割的能力,並實現大幅性能提升?本文介紹了產業 SOTA 的實時實例分割算法 SOLOv2。由於其出色地兼顧了精度和速度,已經被廣泛應用於自動駕駛、機器人抓取控制、醫療影像分割、工業質檢和遙感圖像分析等領域。相較於目標檢測和語義分割,實例分割算法的構建和訓練難度是非常複雜、且具有挑戰性的。如果要同時兼顧精度和速度,難度又上了一個臺階。