基本原理及實(shí)例
計(jì)算機(jī)視覺(jué)技術(shù):圖像語(yǔ)義分割,根據(jù)「圖像內(nèi)容」對(duì)「指定區(qū)域」進(jìn)行標(biāo)記」的「計(jì)算機(jī)視覺(jué)」任務(wù)毕莱。簡(jiǎn)言之就是「這張圖片里有什么蔑鹦,其在圖片中的位置是什么?」
下面是語(yǔ)義分割后的圖片(搖滾專輯封面)
英國(guó)披頭士樂(lè)隊(duì)的著名專輯封面 Abbey Road
!
Pink Floyd 樂(lè)隊(duì)的名作《 Wish You Were Here》
英式搖滾綠洲樂(lè)隊(duì)的《Morning Glory》
原理:
- 預(yù)測(cè)每一張圖片中每一個(gè)像素的所屬分類的概率弟晚。
可視化:
- 相同的類別忘衍,同一種顏色顯示逾苫。
語(yǔ)義分割數(shù)據(jù)集 CamVid 的一個(gè)樣本圖片示例
數(shù)據(jù)集 Camvid
指標(biāo)結(jié)果
fastiai創(chuàng)始人 Jeremy 的示例:Accuracy:93.3% (State-of-the-Art )
筆者復(fù)現(xiàn):Accuracy:90.9% (更換預(yù)訓(xùn)練模型為 ResNets18,示例是 ResNets34)
筆記
- 算力需求->大
You may have to restart your kernel and come back to this stage if you run out of memory, and may also need to decrease bs.
筆記提示:
如果你的GPU內(nèi)存耗盡枚钓,請(qǐng)重啟 kernel铅搓,或者減小批量(batch_size)的大小。由此可見(jiàn)搀捷,相比于更簡(jiǎn)單的圖片分類任務(wù)星掰,語(yǔ)義分割非常消耗算力。(多買英偉達(dá)的股票吧嫩舟,同志們氢烘。)
具體代碼也有體現(xiàn):
size = src_size
free = gpu_mem_get_free_no_cache()
# the max size of bs depends on the available GPU RAM
if free > 8200: bs=3
else: bs=1
print(f"using bs={bs}, have {free}MB of GPU RAM free")
如果RAM 內(nèi)存容量大于 8200,batch_size設(shè)置為 3家厌。
如果 RAM 內(nèi)容容量小于或等于 8200播玖,batch_size設(shè)置為 1。
- 數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)
camvid = untar_data(URLs.CAMVID_TINY)
path_lbl = camvid/'labels'
path_img = camvid/'images'
[PosixPath('/home/ubuntu/course-v3/nbs/dl1/data/camvid/images'),
PosixPath('/home/ubuntu/course-v3/nbs/dl1/data/camvid/codes.txt'),
PosixPath('/home/ubuntu/course-v3/nbs/dl1/data/camvid/valid.txt'),
PosixPath('/home/ubuntu/course-v3/nbs/dl1/data/camvid/labels')]
圖片數(shù)據(jù)集分為「圖片文件夾」&「標(biāo)簽文件夾」
codes = np.loadtxt(camvid/'codes.txt', dtype=str); codes
array(['Animal', 'Archway', 'Bicyclist', 'Bridge', 'Building', 'Car', 'CartLuggagePram', 'Child', 'Column_Pole',
'Fence', 'LaneMkgsDriv', 'LaneMkgsNonDriv', 'Misc_Text', 'MotorcycleScooter', 'OtherMoving', 'ParkingBlock',
'Pedestrian', 'Road', 'RoadShoulder', 'Sidewalk', 'SignSymbol', 'Sky', 'SUVPickupTruck', 'TrafficCone',
'TrafficLight', 'Train', 'Tree', 'Truck_Bus', 'Tunnel', 'VegetationMisc', 'Void', 'Wall'], dtype='<U17')
一個(gè)文本文件像街,存儲(chǔ)了所有的預(yù)測(cè)分類(classes)黎棠,這些分類對(duì)應(yīng)的是不同的分類的遮罩,比如動(dòng)物镰绎、橋梁脓斩、汽車、道路畴栖、行人随静、樹(shù)木等等。
get_y_fn = lambda x: path_lbl/f'{x.stem}_P{x.suffix}'
這個(gè) python 匿名函數(shù)吗讶,主要是作用是不同的像素對(duì)應(yīng)的分類燎猛,也就是標(biāo)簽對(duì)應(yīng)像素點(diǎn)。
Mask遮罩
src_size = np.array(mask.shape[1:])
src_size,mask.data
Out[ ]:
(array([720, 960]), tensor([[[ 4, 4, 4, ..., 26, 26, 26],
[ 4, 4, 4, ..., 26, 26, 26],
[ 4, 4, 4, ..., 26, 26, 26],
...,
[19, 19, 19, ..., 17, 17, 17],
[19, 19, 19, ..., 17, 17, 17],
[19, 19, 19, ..., 17, 17, 17]]]))
4/26/17,這些數(shù)字照皆,就是預(yù)測(cè)的像素類別重绷。
- 數(shù)據(jù)預(yù)處理
data = (ImageFileList.from_folder(path_img) #Where are the input files? -> in path_img
.label_from_func(get_y_fn) #How to label? -> use get_y_fn
.random_split_by_pct() #How to split between train and valid? -> randomly
.datasets(SegmentationDataset, classes=codes) #How to create a dataset? -> use SegmentationDataset
.transform(get_transforms(), size=96, tfm_y=True) #Data aug -> Use standard tfms with tfm_y=True
.databunch(bs=64)) #Lastly convert in a databunch with batch size of 64.
定義一個(gè) DataBunch 對(duì)象,設(shè)置圖片地址膜毁、標(biāo)簽如何匹配(通過(guò)上面的函數(shù)get_y_fn
)昭卓、數(shù)據(jù)集類型(語(yǔ)義分割數(shù)據(jù)集 SegmentationDateset)、數(shù)據(jù)增強(qiáng)參數(shù)(大小 96瘟滨,默認(rèn)垂直翻轉(zhuǎn)為 True 真值)候醒、批大小 64
- 微調(diào)->圖片放大(Go Big)
先訓(xùn)練小尺寸的樣本圖片,得到模型后杂瘸,再將圖片尺寸調(diào)大倒淫,再次微調(diào)。模型精度更高败玉。
- 語(yǔ)義分割模型->預(yù)測(cè)新圖片的代碼
img = open_image('/home/jupyter/tutorials/fastai/course-v3/nbs/dl1/images/wish_you_here.png')
prediction = learn.predict(img)
prediction[0].show(figsize=(5,5))
參考來(lái)源:https://forums.fast.ai/t/image-segmentation-on-new-images-lesson-3-beginner/41209/4
其他
- 碎碎念
「付費(fèi)敌土,穩(wěn)定镜硕、高速的服務(wù) --> 完爆 --> 「免費(fèi),隨機(jī)纯赎、不穩(wěn)定的普通服務(wù)」
比如谷歌系自己的 GCP VS Colab谦疾。筆者曾在 colab 上用 fastai 訓(xùn)練一個(gè)亞馬遜評(píng)論的數(shù)據(jù)集,多次運(yùn)行中虛擬機(jī)器崩潰報(bào)錯(cuò)犬金,訓(xùn)練過(guò)程支離破碎。相比之下六剥,GCP 的機(jī)器晚顷,就跟在本地運(yùn)行幾乎一樣的體驗(yàn)。
人也如此疗疟,在職場(chǎng)中该默,若一個(gè)人能夠一個(gè)高速穩(wěn)定簡(jiǎn)潔的接口一樣。人人都愛(ài)啊策彤。
changeLog
2019.07.12 init
2019.07.16 public