輕鬆學Pytorch –Mask-RCNN圖像實例分割

2021-01-14 OpenCV學堂

Pytorch中使用Mask-RCNN實現實例分割,是基於torchvision的預訓練模型庫,首先需要下載預訓練模型,並檢查是否可以支持GPU推理,相關的代碼如下:

model = torchvision.models.detection.maskrcnn_resnet50_fpn(pretrained=True)model.eval()transform = torchvision.transforms.Compose([torchvision.transforms.ToTensor()])
train_on_gpu = torch.cuda.is_available()if train_on_gpu:model.cuda()


基於輸入圖像,實現Mask-RCNN模型推理預測,得到對象與實例分割mask的代碼如下:

1frame = cv.imread("D:/images/master.jpg")
2blob = transform(frame)
3c, h, w = blob.shape
4input_x = blob.view(1, c, h, w)
5output = model(input_x.cuda())[0]
6boxes = output['boxes'].cpu().detach().numpy()
7scores = output['scores'].cpu().detach().numpy()
8labels = output['labels'].cpu().detach().numpy()
9masks = output['masks'].cpu().detach().numpy()

對推理預測得到四個輸出結果,分別進行解析,其中score閾值為0.5,mask採用soft版本,對大於0.5分割為當前對象像素,這部分的代碼實現如下:

1index = 0
2color_mask = np.zeros((h, w, c), dtype=np.uint8)
3mv = cv.split(color_mask)
4for x1, y1, x2, y2 in boxes:
5    if scores[index] > 0.5:
6        cv.rectangle(frame, (np.int32(x1), np.int32(y1)),
7                     (np.int32(x2), np.int32(y2)), (0, 255, 255), 1, 8, 0)
8        mask = np.squeeze(masks[index] > 0.5)
9        np.random.randint(0, 256)
10        mv[2][mask == 1], mv[1][mask == 1], mv[0][mask == 1] = \
11            [np.random.randint(0, 256), np.random.randint(0, 256), np.random.randint(0, 256)]
12
13        label_id = labels[index]
14        label_txt = coco_names[str(label_id)]
15        cv.putText(frame, label_txt, (np.int32(x1), np.int32(y1)), cv.FONT_HERSHEY_PLAIN, 1.0, (0, 0, 255), 1)
16    index += 1

其中對實例分割的對象像素進行隨機顏色填充,完成彩色mask圖像生成。最終把彩色mask圖像與輸入圖像進行疊加,得到實例分割輸出結果如下:

1color_mask = cv.merge(mv)
2result = cv.addWeighted(frame, 0.5, color_mask, 0.5, 0)
3cv.imshow("intances segmentation demo", result)
4cv.imwrite("D:/master_test.png", result)


這裡,我測試了三張圖像,結果分別如下:

這個是很久以前我寫過一個無人機的Mask-RCNN檢測時候,別人問我的問題,其實這個就是很簡單的OpenCV操作就可以很好的提取出來這些ROI圖像,代碼實現如下:

1# 簡單背景替換
2back_ground = np.zeros_like(frame)
3back_ground[:,:,:] = (255, 0, 255)
4for row in range(h):
5    for col in range(w):
6        b, g, r = color_mask[row, col]
7        if b > 0 or g > 0 or r > 0:
8            back_ground[row, col] = (0, 0, 0)
9temp = cv.add(back_ground, frame, mask=mv[0])
10dst = cv.add(back_ground, temp)
11cv.imshow("background replacement", dst)
12cv.waitKey(0)
13cv.destroyAllWindows()


運行結果如下:


其中有一些基本的OpenCV函數使用與操作,如果你對這些OpenCV基礎知識運用想學習一波,直接免費看我B站 OpenCV4 30講,點擊這裡:

全程實操 | 最新版OpenCV4.4免費視頻課程送給大家


 推薦閱讀 

輕鬆學Pytorch–環境搭建與基本語法

Pytorch輕鬆學-構建淺層神經網絡

輕鬆學pytorch-構建卷積神經網絡

輕鬆學Pytorch –構建循環神經網絡

輕鬆學Pytorch-使用卷積神經網絡實現圖像分類

輕鬆學Pytorch-自定義數據集製作與使用

輕鬆學Pytorch-Pytorch可視化

輕鬆學Pytorch–Visdom可視化

輕鬆學Pytorch – 全局池化層詳解

輕鬆學Pytorch – 人臉五點landmark提取網絡訓練與使用

輕鬆學Pytorch – 年齡與性別預測

輕鬆學Pytorch –車輛類型與顏色識別

輕鬆學Pytorch-全卷積神經網絡實現表情識別

使用OpenVINO加速Pytorch表情識別模型

輕鬆學pytorch – 使用多標籤損失函數訓練卷積網絡

輕鬆學Pytorch-使用ResNet50實現圖像分類

OpenCV4.4 + YOLOv4 真的可以運行了…..

輕鬆學Pytorch –使用torchvision實現對象檢測

輕鬆學Pytorch-實現自定義對象檢測器

從Pytorch 的ONNX到OpenVINO中IR中間層


伏久者,飛必高

開先者,謝獨早



相關焦點

  • ...2020 | 打破傳統Grid限制, 建模高階關係的圖像檢測和分割方法...
    本工作拋棄了圖像中常用的網格 (Grid) 結構形式,利用樹形結構實現了線性複雜度的高階關係建模和特徵變換。在保證全局感受野的同時,保留物體的結構信息和細節特徵。可學習的模塊被靈活地應用在了目標檢測、語意分割、實例分割和全景分割上。  本工作有效地彌補了傳統二元關係建模方法的不足之處,從而在更低的複雜度下,即可取得更為顯著的性能提升。
  • 輕鬆學Pytorch-使用ResNet50實現圖像分類
    Hello大家好,這篇文章給大家詳細介紹一下pytorch中最重要的組件torchvision,它包含了常見的數據集、模型架構與預訓練模型權重文件、常見圖像變換、計算機視覺任務訓練。可以是說是pytorch中非常有用的模型遷移學習神器。本文將會介紹如何使用torchvison的預訓練模型ResNet50實現圖像分類。
  • 性能提升30%以上,實時實例分割算法SOLOv2實現產業SOTA
    由於其出色地兼顧了精度和速度,已經被廣泛應用於自動駕駛、機器人抓取控制、醫療影像分割、工業質檢和遙感圖像分析等領域。相較於目標檢測和語義分割,實例分割算法的構建和訓練難度是非常複雜、且具有挑戰性的。如果要同時兼顧精度和速度,難度又上了一個臺階。
  • 滑動窗口也能用於實例分割,陳鑫磊、何愷明等人提出圖像分割新範式
    選自arXiv作者:Xinlei Chen、Ross Girshick、Kaiming He、Piotr Dollar機器之心編譯滑動窗口在目標檢測中非常重要,然而最近何愷明等研究者表明,這個範式同樣可以用於實例分割。
  • 2020入坑圖像分割,我該從哪兒入手?
    初識圖像分割顧名思義,圖像分割就是指將圖像分割成多個部分。在這個過程中,圖像的每個像素點都和目標的種類相關聯。圖像分割方法主要可分為兩種類型:語義分割和實例分割。語義分割會使用相同的類標籤標註同一類目標(下圖左),而在實例分割中,相似的目標也會使用不同標籤進行標註(下圖右)。
  • FAIR最新視覺論文集錦:FPN,RetinaNet,Mask 和 Mask-X RCNN(含代碼...
    之後會講實例分割的創新。最後聊聊依靠弱半監督模型來擴展實例分割。   FPN   特徵金字塔網絡 (FPN) [1] 發表在 2017 年的 CVPR 上。如果你關注最近兩年計算機視覺的發展,就知道冥冥之中存在著那樣一些優秀的算法,而你要做的,就是等著大神們把它寫出來、訓練好、再公開源碼。
  • 動態生成掩膜預測網絡生成模型CondInst,助力FCN重奪實例檢測顛峰
    實例分割是計算機視覺領域的基礎任務,需要算法預測出圖像中每個實例的掩膜和對應的分類標籤。在計算機視覺領域與實例分割最相近的要數語義分割了,全卷積網絡FCN在這一任務上取得了巨大的成功。此外FCN同時也在其他逐像素的預測任務上表現優異,像圖像去噪、超分辨這類底層圖像處理任務、光流估計和邊緣檢測這類中級任務,單發目標檢測、單目深度估計和目標計數這類高級任務都有著FCN的貢獻。但在實例分割任務中幾乎所有的純粹FCN方法都沒有達到最先進的水平。
  • 經典目標檢測方法Faster R-CNN和Mask R-CNN|基於PaddlePaddle深度...
    Mask R-CNN 可以應用到人體姿勢識別,並且在實例分割、目標檢測、人體關鍵點檢測三個任務都取得了很好的效果。因此,百度深度學習框架 PaddlePaddle 開源了用於目標檢測的 RCNN 模型,從而可以快速構建強大的應用,滿足各種場景的應用,包括但不僅限於安防監控、醫學圖像識別、交通車輛檢測、信號燈識別、食品檢測等等。
  • Mask R-CNN原始碼終於來了,還有它背後的物體檢測平臺
    如果要在本地圖像上運行,只需要使用infer_simple.py工具,運行:python2 tools/infer_simple.py \ --cfg configs/12_2017_baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml \ --output-dir /tmp/detectron-visualizations
  • 圖像分割系列<->語義分割
    精選文章,第一時間送達 上期講到圖像分割(Image segmentation)根據某些規則把圖片中的像素分為不同的部分(加不同的標籤),它可分為:超像素、語義分割、實例分割、全景分割, 各有聯繫,又有區別。
  • 百度飛槳發布工業級圖像分割利器PaddleSeg
    圖像語義分割通過給出每一個圖像中像素點的標籤,實現圖像中像素級別的語義分割,它是由圖像處理到圖像分析的關鍵步驟。就像下圖中所看到的那樣,可以對車輛、馬路、人行道等實例進行分割和標記!相比於傳統的圖像分類任務,圖像分割顯然更難更複雜,但是,圖像分割是圖像理解的重要基石,在自動駕駛、無人機、工業質檢等應用中都有著舉足輕重的地位。3. PaddleSeg 三重驚喜3.1.
  • 通過Monk AI輕鬆進行對象檢測
    介紹對象檢測是一種計算機視覺技術,用於定位圖像或視頻中的對象實例。對象檢測算法通常利用機器學習或深度學習來產生有一定意義的結果。1.安裝和下載數據首先讓我們安裝MONK庫MONK格式遵循以下目錄結構接下來下載數據現在解壓縮圖像和csv文件並將其存儲在適當的位置2.
  • 100個深度圖像分割算法,紐約大學UCLA等最新綜述論文
    圖像分割可以表示為帶有語義標籤的像素分類問題(語義分割)或單個對象的分割問題(實例分割)。語義分割是對所有圖像像素進行一組對象類別(如人、車、樹、天空)的像素級標記,因此通常比圖像分類更難,因為後者預測整個圖像的單個標籤。實例分割進一步擴展了語義分割的範圍,通過檢測和描繪圖像中每個感興趣的對象(例如,對個人的分割)。
  • 光學精密工程 | 實例特徵深度鏈式學習全景分割網絡
    116600)DOI:摘 要 針對全景分割中實例目標邊緣特徵提取不足導致目標邊界分割失效的問題,提出一種創新的實例特徵深度鏈式學習全景分割網絡。TASCNet和AUNet兩個網絡為保持兩種分割結果尺寸的一致性,將Mask RCNN掩模分支得到的數據信息進行了大量上採樣操作。除Mask RCNN結構本身問題之外,上採樣處理非常容易破壞目標邊緣特性,導致實例目標輪廓特徵不明顯,出現分割失效情況。一般來說,神經網絡獲得圖像特徵的豐富程度與網絡結構深度有直接關係。
  • 深度| 2017 CV 技術報告之圖像分割、超解析度和動作識別
    圖像分割計算機視覺任務的核心是分割(Segmentation)處理,它將整幅圖片分割成可被標記和分類的像素組。在此基礎上,語義分割(Semantic Segmentation)則更進了一步,它試圖從語義上去理解一幅圖像中每個像素扮演的角色。比如:一個圖像中出現的是一隻貓還是汽車,還是其它類別的事物。
  • 先理解Mask R-CNN的工作原理,然後構建顏色填充器應用
    實例分割是一種在像素層面識別目標輪廓的任務,相比其他相關任務,實例分割是較難解決的計算機視覺任務之一:分類:這張圖像中有一個氣球。語義分割:這些全是氣球像素。目標檢測:這張圖像中的這些位置上有 7 個氣球。實例分割:這些位置上有 7 個氣球,並且這些像素分別屬於每個氣球。
  • 谷歌通過深度度量學習,提出新的語義實例分割方法
    圖像語義分割是在圖像中識別問題對象及其類別的問題(如人和汽車)。據雷鋒網了解,這個問題的常見解決方法是:首先使用一些機制來預測對象的邊界框(例如,通過運行類別對象檢測器,或者通過使用類別不可知框方法,如EdgeBoxes),然後在每個提出的框中運行分割和分類。最近還出現了一種「無盒」方法,即嘗試直接預測每個對象的掩碼。然而,這種方法要求整個對象實例符合在進行預測的單元的接收域中。 這對於許多細長結構的,可能跨越圖像的像素來說是有些困難的。
  • 分享一個PyTorch醫學圖像分割開源庫
    分享一位52CV粉絲Ellis開發的基於PyTorch的專注於醫學圖像分割的開源庫,其支持模型豐富,方便易用。其可算為torchio的一個實例,作者將其綜合起來,包含眾多經典算法,實用性比較強。地址在這裡:https://github.com/MontaEllis/Pytorch-Medical-Segmentation該庫特點:支持2D和3D醫學圖像分割,可以修改hparam.py文件來確定是2D分割還是3D分割以及是否可以進行多分類
  • Double DIP——一種無監督層圖像分割 AI 技術
    舉兩個突出的例子:圖像分割——分割成背景層和前景層的區域;圖像去霧——分割為清晰圖層和有霧圖層。在該論文中,作者提出了一種基於耦合的「深度圖像先驗」(DIP)網絡對單個圖像進行無監督層分割的統一框架。被 CVPR 2018 會議接收的深度圖像先驗(DIP)網絡,是一種可以用來對單個圖像的低級統計數據進行生成的結構,而且只需要在單張圖像上進行訓練。