編者按:發(fā)展至今,計(jì)算機(jī)視覺已經(jīng)產(chǎn)生了不少令人驚嘆的應(yīng)用,但一提到它,人們首先想到的總是人臉檢測(cè)、物品識(shí)別……除去已經(jīng)發(fā)展得很成熟的人臉識(shí)別技術(shù),我們難道只能用檢測(cè)室內(nèi)物品來練習(xí)技巧嗎?作為一個(gè)極具工程價(jià)值的領(lǐng)域,也許大家應(yīng)當(dāng)擴(kuò)張技術(shù)應(yīng)用的廣度,把它和現(xiàn)實(shí)場(chǎng)景結(jié)合起來,真正做一些更接地氣的嘗試。
本文旨在構(gòu)建一個(gè)自定義Mask R-CNN模型,它可以檢測(cè)汽車車身的損壞區(qū)域(如下圖所示)。這背后的應(yīng)用理念是,購買二手車時(shí),消費(fèi)者首先會(huì)關(guān)注車身刮擦情況,有了這個(gè)模型,他們足不出戶就能大致了解車子情況,避免被坑。而對(duì)于日常生活中的小事故,如果用戶只需上傳圖片就能完成車輛破損鑒定,保險(xiǎn)公司的索賠效率也會(huì)大幅提高。
什么是Mask R-CNN?
Mask R-CNN是一個(gè)實(shí)例分割模型,它能確定圖片中各個(gè)目標(biāo)的位置和類別,給出像素級(jí)預(yù)測(cè)。所謂“實(shí)例分割”,指的是對(duì)場(chǎng)景內(nèi)的每種興趣對(duì)象進(jìn)行分割,無論它們是否屬于同一類別——比如模型可以從街景視頻中識(shí)別車輛、人員等單個(gè)目標(biāo)。下圖是在COCO數(shù)據(jù)集上訓(xùn)練好的Mask R-CNN,如圖所示,大到每一輛車,小到單根香蕉,它都能用窗口標(biāo)出目標(biāo)物品在畫面中的像素位置。
不同于Faster R-CNN這樣的經(jīng)典對(duì)象檢測(cè)模型,Mask R-CNN的一個(gè)特點(diǎn)是可以給窗口內(nèi)表示對(duì)象輪廓的像素著色。可能有人會(huì)覺得這是個(gè)雞肋功能,但它對(duì)自動(dòng)駕駛汽車和機(jī)器人控制意義非凡:
著色可以幫助汽車明確道路上各目標(biāo)的具體像素位置,從而避免發(fā)生碰撞;
如果機(jī)器人想抓取某個(gè)目標(biāo)物品,它就需要知道位置信息(如亞馬遜的無人機(jī))。
如果只是單純想在COCO上訓(xùn)練Mask R-CNN模型,最簡(jiǎn)單的方法是調(diào)用Tensorflow Object Detection API,具體內(nèi)容Github都有,此處不再詳談。
Mask R-CNN的工作原理
在構(gòu)建Mask R-CNN模型之前,我們首先來了解一下它的工作機(jī)制。
事實(shí)上,Mask R-CNN是Faster R-CNN和FCN的結(jié)合,前者負(fù)責(zé)物體檢測(cè)(分類標(biāo)簽+窗口),后者負(fù)責(zé)確定目標(biāo)輪廓。如下圖所示:
它的概念很簡(jiǎn)單:對(duì)于每個(gè)目標(biāo)對(duì)象,F(xiàn)aster R-CNN都有兩個(gè)輸出,一是分類標(biāo)簽,二是候選窗口;為了分割目標(biāo)像素,我們可以在前兩個(gè)輸出的基礎(chǔ)上增加第三個(gè)輸出——指示對(duì)象在窗口中像素位置的二進(jìn)制掩模(mask)。和前兩個(gè)輸出不同,這個(gè)新輸出需要提取更精細(xì)的空間布局,為此,Mask R-CNN在Faster-RCNN上添加一個(gè)分支網(wǎng)絡(luò):Fully Convolution Networ(FCN)。
FCN是一種流行的語義分割算法,所謂語義分割,就是機(jī)器自動(dòng)從圖像中分割出對(duì)象區(qū)域,并識(shí)別其中的內(nèi)容。該模型首先通過卷積和最大池化層把輸入圖像壓縮到原始大小的1/32,然后在這個(gè)細(xì)粒度級(jí)別進(jìn)行分類預(yù)測(cè)。最后,它再用上采樣和deconvolution層把圖還原成原始大小。
因此簡(jiǎn)而言之,我們可以說Mask R-CNN結(jié)合了兩個(gè)網(wǎng)絡(luò)——把Faster R-CNN和FCN納入同一巨型架構(gòu)。模型的損失函數(shù)計(jì)算的是分類、生成窗口、生成掩模的總損失。
此外,Mask R-CNN還做了一些基礎(chǔ)改進(jìn),使其比FCN更精確,具體可以閱讀論文。
構(gòu)建用于檢測(cè)汽車漆面情況的Mask R-CNN模型
GitHub:github.com/matterport/Mask_RCNN
這是一個(gè)在Python 3、Keras和TensorFlow上實(shí)現(xiàn)Mask R-CNN的現(xiàn)成資源。雖然最近TensorFlow目標(biāo)檢測(cè)庫也更新了和Mask R-CNN相關(guān)的資源,但如果想一帆風(fēng)順地搭建模型,我們還是推薦這個(gè),用TensorFlow太容易出bug了。
當(dāng)然,這不是不鼓勵(lì)大家去勇敢試錯(cuò),畢竟熟悉了這些錯(cuò)誤,我們才能更好地理解整個(gè)過程。但這個(gè)實(shí)現(xiàn)絕對(duì)值得收藏。
收集數(shù)據(jù)
考慮到本文只是演示,這里我們只Google了66張受損車輛圖像(50張訓(xùn)練集,16張驗(yàn)證集)。如果想做個(gè)大點(diǎn)的數(shù)據(jù)集,建議把搜索關(guān)鍵詞設(shè)為“damaged car painting”,用中文容易出現(xiàn)一大堆補(bǔ)漆廣告,搜車禍則是大量引擎蓋變形圖。下面是一些圖像樣本
注釋數(shù)據(jù)
為了構(gòu)建Mask R-CNN模型,首先我們要對(duì)圖像進(jìn)行注釋,標(biāo)出其中的損壞區(qū)域。我們使用的注釋工具是VGG Image Annotator?—?v 1.0.6,它有一個(gè)在線版本。除了常規(guī)圖形,它也允許我們繪制多邊形蒙版:
注釋完后,記得把它們下載下來,保存為.json格式。這里是注釋好的66幅圖。
訓(xùn)練模型
完成上述步驟,現(xiàn)在我們就可以訓(xùn)練模型了。首先,把GitHub里的東西復(fù)制下來,然后加載我們的圖像和注釋。
classCustomDataset(utils.Dataset):
def load_custom(self, dataset_dir, subset):
"""Load a subset of the Balloon dataset.
dataset_dir: Root directory of the dataset.
subset: Subset to load: train or val
"""
# 添加類別標(biāo)簽,我們只有一個(gè)
self.add_class("damage", 1, "damage")
# 訓(xùn)練集和驗(yàn)證集
assert subset in ["train", "val"]
dataset_dir = os.path.join(dataset_dir, subset)
# 我們主要關(guān)心每個(gè)區(qū)域的x和y坐標(biāo)
annotations1 = json.load(open(os.path.join(dataset_dir, "via_region_data.json")))
annotations = list(annotations1.values()) # don't need the dict keys
# 即使沒有任何注釋工具也會(huì)把圖像保存在JSON中
# 跳過未注釋圖像。
annotations = [a for a in annotations if a['regions']]
# 添加圖像
for a in annotations:
# 獲取構(gòu)成每個(gè)對(duì)象實(shí)例輪廓多邊形點(diǎn)的x,y坐標(biāo)
# 它們?cè)趕hape_attributes里((參見上面的json格式))
polygons = [r['shape_attributes'] for r in a['regions'].values()]
# 輸入圖像大小后,load_mask()才能把多邊形轉(zhuǎn)成蒙版
image_path = os.path.join(dataset_dir, a['filename'])
image = skimage.io.imread(image_path)
height, width = image.shape[:2]
self.add_image(
"damage", ## 如果只有一類,只需在此處添加名稱即可
image_id=a['filename'], # use file name as a unique image id
path=image_path,
width=width, height=height,
polygons=polygons)
整段代碼在這里。我們復(fù)制了資源里的balloon.py文件,并對(duì)它做了修改。需要注意的是,這些代碼只適合包含一個(gè)類的問題。
此外,你也可以用這個(gè)筆記本內(nèi)容可視化給定圖像上的蒙版。
如果要訓(xùn)練,運(yùn)行以下代碼:
## 如果用的是在COCO上預(yù)訓(xùn)練的模型
python3 custom.py train --dataset=/path/to/datasetfolder --weights=coco
## 如果是繼續(xù)訓(xùn)練您之前訓(xùn)練過的模型
python3 custom.py train --dataset=/path/to/datasetfolder --weights=last
注:用一個(gè)GPU訓(xùn)練10個(gè)epoch需要20-30分鐘。
驗(yàn)證模型
至于模型的權(quán)重和偏差是不是正確的,大家可以參考這個(gè)筆記本
。里面列出了許多設(shè)置,可以作為輔助檢查工具。
實(shí)驗(yàn)結(jié)果
如圖所示,模型準(zhǔn)確標(biāo)出了漆面損壞位置。當(dāng)然,這并不是全部,我們?cè)谶@個(gè)示例里只用了66幅圖,劃痕也比較明顯,所以這個(gè)模型的應(yīng)用性非常有限。如果數(shù)據(jù)集夠大,我們完全可以期待一個(gè)能檢測(cè)微小傷痕的模型,當(dāng)消費(fèi)者在家里觀察汽車3D圖時(shí),系統(tǒng)能自動(dòng)標(biāo)出一些不顯眼的痕跡,避免乘興而去,敗興而歸。
除了檢測(cè)車輛劃痕,你認(rèn)為Mask R-CNN模型還有什么潛在應(yīng)用呢?
-
機(jī)器人
+關(guān)注
關(guān)注
212文章
29176瀏覽量
210637 -
數(shù)據(jù)集
+關(guān)注
關(guān)注
4文章
1218瀏覽量
25160
原文標(biāo)題:CV擁抱二手車:構(gòu)建用于檢測(cè)汽車漆面破損的R-CNN模型(Python)
文章出處:【微信號(hào):jqr_AI,微信公眾號(hào):論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
執(zhí)行“mask_rcnn_demo.exe”時(shí),無法找到帶有名稱的Blob:DetectionOutput是怎么回事?
介紹目標(biāo)檢測(cè)工具Faster R-CNN,包括它的構(gòu)造及實(shí)現(xiàn)原理

Mask R-CNN:自動(dòng)從視頻中制作目標(biāo)物體的GIF動(dòng)圖
分享下Kaiming大神在CVPR‘18 又有了什么新成果?

引入Mask R-CNN思想通過語義分割進(jìn)行任意形狀文本檢測(cè)與識(shí)別
手把手教你操作Faster R-CNN和Mask R-CNN
一種新的帶有不確定性的邊界框回歸損失,可用于學(xué)習(xí)更準(zhǔn)確的目標(biāo)定位

基于改進(jìn)Faster R-CNN的目標(biāo)檢測(cè)方法

一種基于Mask R-CNN的人臉檢測(cè)及分割方法

基于Mask R-CNN的遙感圖像處理技術(shù)綜述
用于實(shí)例分割的Mask R-CNN框架
3D視覺技術(shù)內(nèi)容理解領(lǐng)域的研究進(jìn)展
PyTorch教程14.8之基于區(qū)域的CNN(R-CNN)

評(píng)論