重磅!愷明大神 Mask R-CNN 超實用教程
作 者 |?Adrian Rosebrock
來源 | AI科技評論
翻 譯 |?天字一號(鄭州大學)、李美麗(華南師范大學)、had_in(電子科技大學)、nengdaiper(北京科技大學)
作 者 |?Adrian Rosebrock
來源 | AI科技評論
翻 譯 |?天字一號(鄭州大學)、李美麗(華南師范大學)、had_in(電子科技大學)、nengdaiper(北京科技大學)
在此教程中,你將學習如何在opencv中使用Mask R-CNN。
使用Mask R-CNN,你可以自動分割和構建圖像中每個對象的像素級MASK。我們將應用Mask R-CNN到圖像和視頻流。
在上周的博客文章中,你學習了如何使用Yolo物體探測器來檢測圖像中物體(https://www.pyimagesearch.com/2018/11/12/yolo-object-detection-with-opencv/)。對象檢測器,如yolo、faster r-cnn和ssd,生成四組(x,y)坐標,表示圖像中對象的邊界框。
從獲取對象的邊界框開始挺好的,但是邊界框本身并不能告訴我們(1)哪些像素屬于前景對象,(2)哪些像素屬于背景。
這就引出了一個問題:
答案是肯定的:我們只需要使用Mask R-CNN架構執行實例分割。
要了解如何利用opencv的Mask R-CNN應用于圖像和視頻流,繼續看下去吧!
正在查找此博客的源代碼?直接跳到下載(https://www.pyimagesearch.com/2018/11/19/mask-r-cnn-with-opencv/#)。
Mask R-CNN with OpenCV
在本教程的第一部分中,我們將討論圖像分類、對象檢測、實例分割和語義分割之間的區別。
這里,我們將簡要回顧Mask R-CNN架構及其與Faster R-CNN的關系。
然后,我將向您展示如何在圖像和視頻流上應用Mask R-CNN與OpenCV。
開始吧!
實例分割 vs. 語義分割
圖1:圖像分類(左上),目標檢測(右上),語義分割(左下),實例分割(右下)。在本教程中,我們將使用Mask R-CNN執行實例分割。(來源:https://arxiv.org/abs/1704.06857)
解釋傳統的圖像分類、目標檢測、語義分割和實例分割之間的區別,最好是用可視化方法。
在執行傳統的圖像分類時,我們的目標是預測一組標簽來表示輸入圖像的內容(左上角)。
目標檢測建立在圖像分類的基礎上,但這一次需要我們對圖像中每個對象定位。圖像的表征如下:
每個目標邊界框的坐標(x, y)
每個邊界框關聯的類別標簽
左下角是一個語義分割的例子。語義分割算法要求我們將輸入圖像中的每個像素與一個類別標簽(包括一個用于背景的類標簽)關聯起來。
注意關注我們語義分割的可視化——注意每個目標是如何分割的,但每個“cube”目標都有相同的顏色。
雖然語義分割算法能夠對圖像中的所有目標進行標記,但它們無法區分同一類的兩個對象。
特別是同一個類別的兩個目標是相互遮擋時,問題更加明顯,我們不知道一個對象的邊界在哪里結束以及哪里開始,如圖上兩個紫色立方體所示,我們無法說清楚一個立方體邊界的開始和結束。
另一方面,實例分割算法為圖像中的每個對象計算像素級mask,即使對象具有相同的類別標簽(右下角)。在這里,您可以看到每個立方體都有自己獨特的顏色,這意味著我們的實例分割算法不僅定位了每個獨立的立方體,而且還預測了它們的邊界。
而在本教程,我們將要討論的Mask R-CNN架構就是一個實例分割算法的示例。
什么是 Mask R-CNN?
Mask R-CNN算法是何凱明等人在2017年發表的論文中提出的,Mask R-CNN(https://arxiv.org/abs/1703.06870)。
Mask R-CNN是基于之前的目標檢測工作R-CNN(2013)、Fast R-CNN(2015)、Faster R-CNN(2015),均由Girshick等人完成。
為了理解Mask R-CNN,讓我們簡要回顧一下R-CNN的變體,從原始的R-CNN開始:
圖2:初始的R-CNN架構(來源:Girshick等人,2013)
最初的R-CNN算法分為四個步驟:
步驟1:向網絡輸入圖像。
步驟2:提取區域proposals(即,可能包含對象的圖像區域)算法,如選擇性搜索算法(http://www.huppelen.nl/publications/selectiveSearchDraft.pdf)。
步驟3:利用遷移學習進行特征提取,使用預先訓練的CNN計算每個proposals的特征(這實際上是一個ROI)。
步驟4:使用支持向量機(SVM)對提取的特征進行分類。
這種方法之所以有效,是因為CNN學習的特征的魯棒性和可鑒別性。
然而,R-CNN方法的問題在于它非常慢。此外,我們實際上并沒有學習如何通過深度神經網絡進行定位,我們只是在有效地構建一個更高級的HOG +線性SVM檢測器(https://www.pyimagesearch.com/2014/11/10/histogram-oriented-gradients-object-detection/)。
為了改進原有的R-CNN, Girshick等人發表了Fast R-CNN算法:
圖3:Fast R-CNN架構(來源:Girshick et al., 2015)。
與原始的R-CNN相似,Fast R-CNN仍然使用選擇性搜索來獲取區域建議;然而,本文的新貢獻是感興趣區域(ROI)池化模塊。
ROI池化的工作原理是從特征map中提取一個固定大小的窗口,并使用這些特征獲得最終的類別標簽和邊界框。這樣做主要好處是,網絡現在可以有效地端到端地進行訓練:
我們輸入一個圖像和對應的實際的邊界框
提取圖像的特征map
應用ROI池化,得到ROI特征向量
最后, 使用兩組全連接層來獲得(1)類別標簽預測(2)每個proposal的邊框位置。
雖然網絡現在是可以端到端訓練的,但是由于依賴于選擇性搜索算法,在推斷時性能仍受到了極大的影響。
為了使R-CNN的架構更快,我們需要直接利用R-CNN獲得區域proposal:
圖4:Faster R-CNN架構(來源:Girshick et al., 2015)
Girshick等人的Faster R-CNN論文將?區域proposals網絡(RPN)引入到神經網絡架構中,減少了對選擇性搜索算法的需求。
總的來說,Faster R-CNN架構能夠以大約7-10幀每秒的速度運行,這是通過深度學習實現實時目標檢測的一大進步。
Mask R-CNN算法建立在Faster R-CNN架構的基礎之上,主要有兩個貢獻:
用更精確的ROI align模塊替換ROI Pooling模塊
從ROI align模塊中插入一個額外的分支
這個額外的分支的輸入為ROI align模塊的輸出,然后將其輸入到兩個CONV層。
CONV層的輸出即是掩摸(mask)本身。
我們可以將Mask R-CNN架構可視化如下圖所示:
圖5:He等人的Mask R-CNN工作用一個更精確的ROI align模塊替換ROI Polling模塊。然后將ROI模塊的輸出送入兩個CONV層。CONV層的輸出即是掩摸(mask)本身。
注意兩個CONV層的分支來自ROI Align模塊——我們實際生成掩摸由該模塊生成。
我們知道,Faster R-CNN/Mask R-CNN架構利用區域proposal網絡(RPN)生成可能包含對象的圖像區域。
這些區域都是根據它們的“可能是目標的評分”(即,給定區域可能包含目標的可能性),然后保留最可能的前N個目標區域。
在原來Faster R-CNN論文中,Girshick等人設置N= 2000,但在實踐中,我們可以用一個小得多的N,比如N={10,100, 200,300},仍然可以得到很好的結果。
He等人在他們的論文(https://arxiv.org/abs/1703.06870)中設置N=300,這也是我們這里使用的值。
所選的300個ROIs中的每一個都要經過網絡的三個并行分支:
類別標簽預測
邊界框預測
掩摸預測
上面的圖5顯示了這些分支。
在預測時,300個ROIs都會經過非極大值抑制算法(https://www.pyimagesearch.com/2014/11/17/non-maximum-suppression-object-detection-python/),然后僅保存可能性前100的檢測框,使得最終得到一個四維的100 x L x 15 x 15張量,L為數據幾種類別標簽的數量,15 x 15是每個類別L的掩摸(mask)的大小。
我們今天使用的掩模R-CNN是在COCO數據集上訓練的(http://cocodataset.org/#home),它有L=90個類,因此掩模R CNN掩模模塊的最終體積大小是100 x 90 x 15 x 15。
Mask R-CNN的可視化過程,請看下圖:
圖6:Mask R-CNN過程的可視化,先生成一個15 x 15的掩摸,遮罩改變到圖像的原始尺寸,最后將掩摸覆蓋到原始圖像上。(來源:Python深度學習計算機視覺,ImageNet Bundle)
這里你可以看到,我們從我們的輸入圖像開始,并通過我們的Mask R-CNN網絡,最終獲得我們的掩摸預測。
預測的掩模只有15 x 15的像素,因此我們將掩模的大小調整回原始輸入圖像的尺寸。
最后,調整大小后的掩模可以覆蓋在原始輸入圖像上。要了解更多關于Mask R-CNN工作原理的詳細討論,請參考:
由何等人發表的Mask R-CNN論文(https://arxiv.org/abs/1703.06870)
我的書, Deep Learning for Computer Vision with Python(https://www.pyimagesearch.com/deep-learning-computer-vision-python-book/),在這本書里,我將更詳細地討論Mask R-CNNs,包括如何根據自己的數據從零開始訓練自己的Mask R-CNNs。
項目結構
我們今天的項目主要由兩個腳本組成,還有其他幾個重要的文件。
我已經按照如下方式構建了這個項目(直接在終端上的tree命令輸出):
基于OpenCV的Mask R-CNN----Shell
$?tree.├──?mask-rcnn-coco│???├──?colors.txt│???├──?frozen_inference_graph.pb│???├──?mask_rcnn_inception_v2_coco_2018_01_28.pbtxt│???└──?object_detection_classes_coco.txt├──?images│???├──?example_01.jpg│???├──?example_02.jpg│???└──?example_03.jpg├──?videos│???├──├──?output│???├──├──?mask_rcnn.py└──?mask_rcnn_video.py?4?directories,?9?files
我們的項目包括四個目錄:
mask-rcnn-coco/ : Mask R-CNN的模型文件。有四個文件:
frozen_inference_graph.pb : Mask R-CNN模型的權重文件,是基于COCO數據集上預訓練的權重。
mask_rcnn_inception_v2_coco_2018_01_28.pbtxt :? Mask R-CNN模型的配置文件。如果你想在你自己的標注的數據上建立并訓練你自己的模型,? 參考 Deep Learning for Computer Vision with Python(https://www.pyimagesearch.com/deep-learning-computer-vision-python-book/).
object_detection_classes_coco.txt : 所有90個類別都列在這個文本文件中,每行一個。在文本編輯器中打開它,查看模型可以識別哪些對象。
colors.txt : 這個文本文件包含六種顏色,可以隨機分配給圖像中檢測到的目標。
images/ : 我在“Downloads”中提供了三個測試圖像。請隨意添加您自己的圖像進行測試
videos/ : 這是一個空目錄。實際上,我用從YouTube上搜集的大型視頻進行了測試(Credits下面,就在“Summary”部分的上面)。我更傾向于建議您可以在YouTube上找到一些視頻下載并測試,而不是提供一個真正大的zip文件。或者用你的手機拍一些視頻,然后回到你的電腦前使用它們!
output/ :另一個空目錄,將保存處理過的視頻(假設您將命令行參數設置為輸出到此目錄)。
今天我們將回顧兩個腳本:
mask_rcnn.py : 這個腳本將執行實例分割并對圖像應用一個掩碼,這樣您就可以看到Mask R-CNN檢測出的對象在哪里,精細到像素。
mask_rcnn_video.py : 這個視頻處理腳本使用相同的Mask R-CNN,并將模型應用于視頻文件的每一幀。然后腳本將輸出幀寫回磁盤上的視頻文件中。
基于OpenCV的關于圖像的Mask R-CNN
現在,我們已經回顧了Mask R-CNNs的工作原理,讓我們動手寫一些Python代碼。
在開始之前,請確保您的Python環境已經安裝了OpenCV 3.4.2/3.4.3或更高版本。您可以按照我的OpenCV安裝教程(https://www.pyimagesearch.com/opencv-tutorials-resources-guides/)來升級/安裝OpenCV。如果您想在5分鐘或更短的時間內啟動和運行,可以考慮使用pip安裝OpenCV(https://www.pyimagesearch.com/2018/09/19/pip-install-opencv/)。如果您有其他一些需求,您可能希望從源代碼編譯OpenCV。
請確保您已經從本博客文章的“Downloads”部分下載了源代碼、訓練過的Mask R-CNN以及示例圖像。
然后,打開mask_rcnn.py文件并插入以下代碼:
Mask R-CNN with OpenCV---Python
#?import?the?necessary?packagesimport?numpy?as?npimport?argparseimport?randomimport?timeimport?cv2import?os
首先,我們將在第2-7行導入所需的包。值得注意的是,我們正在導入NumPy和OpenCV包。大多數Python安裝都默認安裝了上所需的其他的包。
現在我們開始解析我們的命令行參數(https://www.pyimagesearch.com/2018/03/12/python-argparse-command-line-arguments/):
Mask?R-CNN?with?OpenCV---Python#?construct?the?argument?parse?and?parse?the?argumentsap?=?argparse.ArgumentParser()ap.add_argument("-i",?"--image",?required=True,help="path?to?input?image")ap.add_argument("-m",?"--mask-rcnn",?required=True,help="base?path?to?mask-rcnn?directory")ap.add_argument("-v",?"--visualize",?type=int,?default=0,help="whether?or?not?we?are?going?to?visualize?each?instance")ap.add_argument("-c",?"--confidence",?type=float,?default=0.5,help="minimum?probability?to?filter?weak?detections")ap.add_argument("-t",?"--threshold",?type=float,?default=0.3,help="minimum?threshold?for?pixel-wise?mask?segmentation")args?=?vars(ap.parse_args())
我們的腳本在終端中運行需要傳遞命令行參數標志以及參數。我們的參數在第10-21行進行解析,其中前兩行是必需的,其余的是可選的:
--image : 輸入圖像的路徑。
--mask-rnn :? Mask R-CNN文件的根路徑? .
--visualize ?(可選): 正值表示想要可視化如何在屏幕上提取屏蔽區域。無論哪種方式,我們都將在屏幕上顯示最終的輸出。
--confidence ?(optional): 您可以選擇0-0.5的概率值,該值用于過濾概率較低的檢測區域。
--threshold ?(可選): 我們將為圖像中的每個對象創建一個二進制掩碼,這個閾值將幫助我們過濾掉概率較低的掩碼。我發現默認值0.3時效果較好。
現在我們的命令行參數存儲在args字典中,讓我們加載標簽和顏色:
Mask R-CNN with OpenCV---Python
# load the COCO class labels our Mask R-CNN was trained onlabelsPath = os.path.sep.join([args["mask_rcnn"],"object_detection_classes_coco.txt"])LABELS = open(labelsPath).read().strip().split("\n")
# load the set of colors that will be used when visualizing a given# instance segmentationcolorsPath = os.path.sep.join([args["mask_rcnn"], "colors.txt"])COLORS = open(colorsPath).read().strip().split("\n")COLORS = [np.array(c.split(",")).astype("int") for c in COLORS]COLORS = np.array(COLORS, dtype="uint8")
第24-26行加載COCO對象類別標簽。現在的Mask R-CNN能夠識別90個類,包括人,車輛,標志,動物,日常用品,體育用品,廚房用品,食物等等!我建議您查看object_detection_classes_cocoa .txt,以查看可用的類別。
這里我們從路徑加載顏色文件,并執行一些數組轉換操作(第30-33行)。
現在加載我們的模型:
Mask R-CNN with OpenCV---Python
#?derive?the?paths?to?the?Mask?R-CNN?weights?and?model?configurationweightsPath?=?os.path.sep.join([args["mask_rcnn"],"frozen_inference_graph.pb"])configPath?=?os.path.sep.join([args["mask_rcnn"],"mask_rcnn_inception_v2_coco_2018_01_28.pbtxt"])#?load?our?Mask?R-CNN?trained?on?the?COCO?dataset?(90?classes)#?from?diskprint("[INFO]?loading?Mask?R-CNN?from?disk...")net?=?cv2.dnn.readNetFromTensorflow(weightsPath,?configPath)
首先,我們構建權重和配置路徑(第36-39行),然后通過這些路徑加載模型(第44行)。
在下一個代碼塊中,我們將加載Mask R-CNN神經網絡,輸入一張圖像:
Mask R-CNN with OpenCV---Python
# load our input image and grab its spatial dimensionsimage = cv2.imread(args["image"])(H,?W)?=?image.shape[:2]
# construct a blob from the input image and then perform a forward# pass of the Mask R-CNN, giving us (1) the bounding box ?coordinates# of the objects in the image along with (2) the pixel-wise segmentation# for each specific objectblob = cv2.dnn.blobFromImage(image, swapRB=True, crop=False)net.setInput(blob)start = time.time()(boxes, masks) = net.forward(["detection_out_final", "detection_masks"])end?=?time.time()
# show timing information and volume information on Mask R-CNNprint("[INFO] Mask R-CNN took {:.6f} seconds".format(end - start))print("[INFO] boxes shape: {}".format(boxes.shape))print("[INFO] masks shape: {}".
這里我們進行了以下操作:
Load the input image? and extract dimensions for scaling purposes later (Lines 47 and 48).
Construct a blob? via cv2.dnn.blobFromImage? (Line 54). You can learn why and how to use this function in my previous tutorial(https://www.pyimagesearch.com/2017/11/06/deep-learning-opencvs-blobfromimage-works/).
Perform a forward pass of the blob? through the net? while collecting timestamps (Lines 55-58). The results are contained in two important variables: boxes? and masks .
現在我們已經在圖像上執行了口罩R-CNN的正向傳遞,我們想要過濾+可視化我們的結果。這正是下一個for循環要完成的。它很長,所以我把它分成五個代碼塊,從這里開始:
# loop over the number of detected objectsfor i in range(0, boxes.shape[2]):# extract the class ID of the detection along with the confidence# (i.e., probability) associated with the predictionclassID = int(boxes[0, 0, i, 1])confidence?=?boxes[0,?0,?i,?2]
# filter out weak predictions by ensuring the detected probability# is greater than the minimum probabilityif confidence > args["confidence"]:# clone our original image so we can draw on itclone = image.copy()
# scale the bounding box coordinates back relative to the# size of the image and then compute the width and the height# of the bounding boxbox = boxes[0, 0, i, 3:7] * np.array([W, H, W, H])(startX, startY, endX, endY) = box.astype("int")boxW = endX - startXboxH = endY - startY
在這個代碼塊中,我們開啟了一個訓練,不斷根據置信度過濾/并進行可視化(第66行)。
我們繼續提取特定檢測對象的分類和置信度(第69行和第70行)。
在此基礎之上,我們通過將置信度與命令行參數置信度值進行比較,從而過濾掉置信度較低的預測結果,確保超過該值(第74行)。
然后我們縮放對象的邊界框,并計算框的大小(第81-84行)。
圖像分割要求我們找到目標所在的所有像素。因此,我們將在對象的頂部放置一個透明的層,以查看我們的算法執行的效果。為了做到這一點,我們將計算一個掩模:
Mask R-CNN with OpenCV---Python
# extract the pixel-wise segmentation for the object, resize# the mask such that it's the same dimensions of the bounding# box, and then finally threshold to create a *binary* maskmask = masks[i, classID]mask = cv2.resize(mask, (boxW, boxH),interpolation=cv2.INTER_NEAREST)mask = (mask > args["threshold"])
# extract the ROI of the imageroi = clone[startY:endY, startX:endX]
在第89-91行,我們提取了對象的像素級分割,并將其調整為原始圖像的尺寸。最后,我們設置掩碼的閾值,使其成為二進制數組/圖像(第92行)。
我們還提取了對象所在的感興趣區域(第95行)。
在本文后面的圖8中可以看到遮罩和roi的可視化結果。
為了方便起見,下一個代碼塊實現了掩碼、roi和分割實例的可視化,如果通過命令行設置了參數 --visualize的話。
Mask R-CNN with OpenCV---Python
# check to see if are going to visualize how to extract the# masked region itselfif args["visualize"] > 0:# convert the mask from a boolean to an integer mask with# to values: 0 or 255, then apply the maskvisMask = (mask * 255).astype("uint8")instance = cv2.bitwise_and(roi, roi, mask=visMask)
# show the extracted ROI, the mask, along with the# segmented instancecv2.imshow("ROI", roi)cv2.imshow("Mask", visMask)cv2.imshow("Segmented", instance)
這里,我們將興趣區域用顏色表示出來,儲存在原始的框架中。
然后我們繪制矩形框,并顯示類別的顏色和置信度。
最后寫入視頻文件,清除緩存。
#?check?if?the?video?writer?is?Noneif?writer?is?None:#?initialize?our?video?writerfourcc?=?cv2.VideoWriter_fourcc(*"MJPG")writer?=?cv2.VideoWriter(args["output"],?fourcc,?30,(frame.shape[1],?frame.shape[0]),?True)?#?some?information?on?processing?single?frameif?total?>?0:elap?=?(end?-?start)print("[INFO]?single?frame?took?{:.4f}?seconds".format(elap))print("[INFO]?estimated?total?time?to?finish:?{:.4f}".format(elap?*?total))?#?write?the?output?frame?to?diskwriter.write(frame)?#?release?the?file?pointersprint("[INFO]?cleaning?up...")writer.release()vs.release()
我們視頻中的第一個循環迭代
估計所用的處理時間將打印到終端上
我們循環的最后操作是通過編寫器將幀寫入磁盤。
你會注意到,我沒有在屏幕上顯示每個幀。顯示操作非常耗時,當腳本完成處理時,你仍可以使用任何媒體播放器查看輸出視頻。
注意:?此外,OpenCV 不支持 NVIDIA GPU 的 dnn 模塊。目前僅支持數量有限的 GPU,主要是英特爾 GPU。NVIDIA GPU 支持即將推出,但目前我們無法輕松地使用具有 OpenCV dnn 的 GPU.
最后,我們發布視頻輸入和輸出文件指針。
現在,我們已經編碼了我們的Mask R-CNN和OpenCV腳本的視頻流,你可以自己嘗試下!
確保你使用"下載"。
然后,你需要使用智能手機或其他錄制設備收集你自己的視頻。或者,你也可以像我一樣從 YouTube 下載視頻。
現在可以打開終端,執行下面代碼:
$?python?mask_rcnn_video.py?--input?videos/cats_and_dogs.mp4?\--output?output/cats_and_dogs_output.avi?--mask-rcnn?mask-rcnn-coco[INFO]?loading?Mask?R-CNN?from?disk...[INFO]?19312?total?frames?in?video[INFO]?single?frame?took?0.8585?seconds[INFO]?estimated?total?time?to?finish:?16579.2047
圖11:在上面的視頻中,你可以找到包含狗和貓的有趣視頻剪輯,并Mask R-CNN應用在上面!(觀看這個視頻:https://youtu.be/T_GXkW0BUyA)
下面是第二個例子,這里應用OpenCV和Mask R-CNN檢測寒冷天氣下滑動的汽車。
$?python?mask_rcnn_video.py?--input?videos/slip_and_slide.mp4?\--output?output/slip_and_slide_output.avi?--mask-rcnn?mask-rcnn-coco[INFO]?loading?Mask?R-CNN?from?disk...[INFO]?17421?total?frames?in?video[INFO]?single?frame?took?0.9341?seconds[INFO]?estimated?total?time?to?finish:?16272.9920
圖12?利用Python和Opencv將Mask RCNN應用于視頻中的車輛檢測
你可以想象一下,將Mask RCNN應用于擁擠道路上,檢查道路擁擠、車禍和需要幫助的車輛。(觀看視頻:https://www.youtube.com/watch?v=8nbzVARfosE)
文中視頻和音頻的來源:
貓狗:
“Try Not To Laugh Challenge – Funny Cat & Dog Vines compilation 2017”on?YouTube(https://www.youtube.com/watch?v=EtH9Yllzjcc)
“Happy rock” on?BenSound(https://www.bensound.com/royalty-free-music/track/happy-rock)
Slip and Slide:
“Compilation of Ridiculous Car Crash and Slip & Slide Winter Weather – Part 1” on?YouTube(https://www.youtube.com/watch?v=i59v0p-gAtk)
“Epic” on?BenSound(https://www.bensound.com/royalty-free-music/track/epic)
我該怎樣訓練自己的ask R-CNN模型?
圖13:在我的書 Deep Learning for Computer Vision with Python中
Mask RCNN模型的預訓練權重模型是在COCO數據集上訓練得到的。
但是,如果你想在自定義數據集上訓練 Mask ?R-CNN呢?
在我的書Deep Learning for Computer Vision with Python中有詳細介紹。
via?https://www.pyimagesearch.com/2018/11/19/mask-r-cnn-with-opencv/
人工智能
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。