圖像分割,作為計(jì)算機(jī)視覺(jué)的基礎(chǔ),是圖像理解的重要組成部分,也是圖像處理的難點(diǎn)之一。
那么,如何優(yōu)雅且體面的圖像分割?
5行代碼、分分鐘實(shí)現(xiàn)的庫(kù)——PixelLib,了解一下。
當(dāng)然,如此好用的項(xiàng)目,開(kāi)源是必須的。
為什么要用到圖像分割?
雖然計(jì)算機(jī)視覺(jué)研究工作者,會(huì)經(jīng)常接觸圖像分割的問(wèn)題,但是我們還是需要對(duì)其做下“贅述”(方便初學(xué)者)。
我們都知道每個(gè)圖像都是有一組像素值組成。簡(jiǎn)單來(lái)說(shuō),圖像分割就是在像素級(jí)上,對(duì)圖像進(jìn)行分類的任務(wù)。
圖像分割中使用的一些“獨(dú)門(mén)秘技”,使它可以處理一些關(guān)鍵的計(jì)算機(jī)視覺(jué)任務(wù)。主要分為2類:
語(yǔ)義分割:就是把圖像中每個(gè)像素賦予一個(gè)類別標(biāo)簽,用不同的顏色來(lái)表示。
實(shí)例分割:它不需要對(duì)每個(gè)像素進(jìn)行標(biāo)記,它只需要找到感興趣物體的邊緣輪廓就行。
它的身影也經(jīng)常會(huì)出現(xiàn)在比較重要的場(chǎng)景中:
無(wú)人駕駛汽車視覺(jué)系統(tǒng),可以有效的理解道路場(chǎng)景。
醫(yī)療圖像分割,可以幫助醫(yī)生進(jìn)行診斷測(cè)試。
衛(wèi)星圖像分析,等等。
所以,圖像分割技術(shù)的應(yīng)用還是非常重要的。
接下來(lái),我們就直奔主題,開(kāi)始了解一下PixelLib,這個(gè)神奇又好用的庫(kù)。
快速安裝PixelLib
PixelLib這個(gè)庫(kù)可以非常簡(jiǎn)單的實(shí)現(xiàn)圖像分割——5行代碼就可以實(shí)現(xiàn)語(yǔ)義分割和實(shí)例分割。
老規(guī)矩,先介紹一下安裝環(huán)境。
安裝最新版本的TensorFlow、Pillow、OpenCV-Python、scikit-image和PixelLib:
pip3installtensorflow pip3installpillow pip3installopencv-python pip3installscikit-image pip3installpixellib
PixelLib實(shí)現(xiàn)語(yǔ)義分割
PixelLib在執(zhí)行語(yǔ)義分割任務(wù)時(shí),采用的是Deeplabv3+框架,以及在pascalvoc上預(yù)訓(xùn)練的Xception模型。
用在pascalvoc上預(yù)訓(xùn)練的Xception模型執(zhí)行語(yǔ)義分割:
importpixellib frompixellib.semanticimportsemantic_segmentation segment_image=semantic_segmentation() segment_image.load_pascalvoc_model(“deeplabv3_xception_tf_dim_ordering_tf_kernels.h5”) segment_image.segmentAsPascalvoc(“path_to_image”,output_image_name=“path_to_output_image”)
讓我們看一下每行代碼:
importpixellib frompixellib.semanticimportsemantic_segmentation #createdaninstanceofsemanticsegmentationclass segment_image=semantic_segmentation()
用于執(zhí)行語(yǔ)義分割的類,是從pixellib導(dǎo)入的,創(chuàng)建了一個(gè)類的實(shí)例。
segment_image.load_pascalvoc_model(“deeplabv3_xception_tf_dim_ordering_tf_kernels.h5”)
調(diào)用函數(shù)來(lái)加載在pascal voc上訓(xùn)練的xception模型(xception模型可以從文末傳送門(mén)鏈接處下載)。
segment_image.segmentAsPascalvoc(“path_to_image”,output_image_name=“path_to_output_image”)
這是對(duì)圖像進(jìn)行分割的代碼行,這個(gè)函數(shù)包含了兩個(gè)參數(shù):
path_to_image:圖像被分割的路徑。
path_to_output_image:保存輸出圖像的路徑,圖像將被保存在你當(dāng)前的工作目錄中。
接下來(lái),上圖,實(shí)戰(zhàn)!
圖像文件命名為:sample1.jpg,如下圖所示。
執(zhí)行代碼如下:
importpixellib frompixellib.semanticimportsemantic_segmentation segment_image=semantic_segmentation() segment_image.load_pascalvoc_model(“deeplabv3_xception_tf_dim_ordering_tf_kernels.h5”) segment_image.segmentAsPascalvoc(“sample1.jpg”,output_image_name=“image_new.jpg”)
可以看到,在執(zhí)行代碼后,保存的圖像中,所有對(duì)象都被分割了。
也可以對(duì)代碼稍作修改,獲取一張帶有目標(biāo)對(duì)象分割重疊(segmentation overlay)的圖像。
segment_image.segmentAsPascalvoc(“sample1.jpg”,output_image_name=“image_new.jpg”,overlay=True)
添加了一個(gè)額外的參數(shù),并設(shè)置為T(mén)rue,就生成了帶有分隔疊加的圖像。
可以通過(guò)修改下面的代碼,來(lái)檢查執(zhí)行分割所需的推理時(shí)間。
importpixellib frompixellib.semanticimportsemantic_segmentation importtime segment_image=semantic_segmentation() segment_image.load_pascalvoc_model(“pascal.h5”) start=time.time() segment_image.segmentAsPascalvoc(“sample1.jpg”,output_image_name=“image_new.jpg”) end=time.time() print(f”InferenceTime:{end-start:.2f}seconds”)
輸出如下:
InferenceTime:8.19seconds
可以看到,在圖像上執(zhí)行語(yǔ)義分割,只用了8.19秒。
這個(gè)xception模型是用pascalvoc數(shù)據(jù)集訓(xùn)練的,有20個(gè)常用對(duì)象類別。
對(duì)象及其相應(yīng)的color map如下所示:
PixelLib實(shí)現(xiàn)實(shí)例分割
雖然語(yǔ)義分割的結(jié)果看起來(lái)還不錯(cuò),但在圖像分割的某些特定任務(wù)上,可能就不太理想。
在語(yǔ)義分割中,相同類別的對(duì)象被賦予相同的colormap,因此語(yǔ)義分割可能無(wú)法提供特別充分的圖像信息。
于是,便誕生了實(shí)例分割——同一類別的對(duì)象被賦予不同的colormap。
PixelLib在執(zhí)行實(shí)例分割時(shí),基于的框架是Mask RCNN,代碼如下:
importpixellib frompixellib.instanceimportinstance_segmentation segment_image=instance_segmentation() segment_image.load_model(“mask_rcnn_coco.h5”) segment_image.segmentImage(“path_to_image”,output_image_name=“output_image_path”)
同樣,我們先來(lái)拆解一下每行代碼。
importpixellib frompixellib.instanceimportinstance_segmentation segment_image=instance_segmentation()
導(dǎo)入了用于執(zhí)行實(shí)例分割的類,創(chuàng)建了該類的一個(gè)實(shí)例。
segment_image.load_model(“mask_rcnn_coco.h5”)
這是加載 Mask RCNN 模型來(lái)執(zhí)行實(shí)例分割的代碼(Mask RCNN模型可以從文末傳送門(mén)鏈接處下載)。
segment_image.segmentImage(“path_to_image”,output_image_name=“output_image_path”)
這是對(duì)圖像進(jìn)行實(shí)例分割的代碼,它需要兩個(gè)參數(shù):
path_to_image:模型所要預(yù)測(cè)圖像的路徑。
output_image_name:保存分割結(jié)果的路徑,將被保存在當(dāng)前的工作目錄中。
上圖,實(shí)戰(zhàn)第二彈!
圖像文件命名為:sample2.jpg,如下圖所示。
執(zhí)行代碼如下:
importpixellib frompixellib.instanceimportinstance_segmentation segment_image=instance_segmentation() segment_image.load_model(“mask_rcnn_coco.h5”) segment_image.segmentImage(“sample2.jpg”,output_image_name=“image_new.jpg”)
上圖便是保存到目錄的圖片,現(xiàn)在可以看到語(yǔ)義分割和實(shí)例分割之間的明顯區(qū)別——在實(shí)例分割中,同一類別的所有對(duì)象,都被賦予了不同的colormap。
若是想用邊界框(bounding box)來(lái)實(shí)現(xiàn)分割,可以對(duì)代碼稍作修改:
segment_image.segmentImage(“sample2.jpg”,output_image_name=“image_new.jpg”,show_bboxes=True)
這樣,就可以得到一個(gè)包含分割蒙版和邊界框的保存圖像。
同樣的,也可以通過(guò)代碼查詢實(shí)例分割的推理時(shí)間:
importpixellib frompixellib.instanceimportinstance_segmentation importtime segment_image=instance_segmentation() segment_image.load_model(“mask_rcnn_coco.h5”) start=time.time() segment_image.segmentImage(“former.jpg”,output_image_name=“image_new.jpg”) end=time.time() print(f”InferenceTime:{end-start:.2f}seconds”)
輸出結(jié)果如下:
InferenceTime:12.55seconds
可以看到,在圖像上執(zhí)行實(shí)例分割,需要12.55秒的時(shí)間。
-
圖像分割
+關(guān)注
關(guān)注
4文章
180瀏覽量
17930 -
計(jì)算機(jī)視覺(jué)
+關(guān)注
關(guān)注
8文章
1685瀏覽量
45811 -
無(wú)人駕駛
+關(guān)注
關(guān)注
98文章
3975瀏覽量
119622
原文標(biāo)題:簡(jiǎn)單粗暴,5行代碼,快速實(shí)現(xiàn)圖像分割
文章出處:【微信號(hào):CVSCHOOL,微信公眾號(hào):OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論