IGARSS2019-项目实战总结-keras
0.寫在前邊
這算得上是真正意義上接觸的第一個深度學習項目了。果真在既沒有經驗,又沒有實力的情況下,項目被搞得一團糟。實踐出真知,趕緊總結吸取教訓!!!
1.項目流程
1.1數據流
(1)超參傳遞
1)通過.py傳遞
eg: params.py中存儲超參[OPTIMIZER = ‘Adam’]的值;則在新的.py文件中導入[import params],便可通過 params.OPTIMIZER獲得超參的值;
2)通過sys傳遞外部參數
(2)數據讀取過程
1)獲取圖像名稱列表:glob;
2)生成batches索引列表;
3)生成(圖像,標簽)batch:i加載數據;ii數據預處理[數據增廣、歸一化、標簽轉換等];
實用代碼
數據增廣
from albumentations import (PadIfNeeded,HorizontalFlip, # VerticalFlip, # CenterCrop, Crop,Compose, #Transpose, #RandomRotate90, #ElasticTransform,GridDistortion, OpticalDistortion,RandomSizedCrop,OneOf,CLAHE,RandomContrast,RandomGamma,RandomBrightness ) def image_augmentation(currImg, labelMask):aug = Compose([VerticalFlip(p=0.5), RandomRotate90(p=0.5),HorizontalFlip(p=0.5),Transpose(p=0.5)])augmented = aug(image=currImg, mask=labelMask)imageMedium = augmented['image']labelMedium = augmented['mask']return imageMedium,labelMediumRGB圖像歸一化:從[0-255]到[0-1]
from keras.applications import imagenet_utils imgBatch = imagenet_utils.preprocess_input(imgBatch) imgBatch = imgBatch / 255.01.2模型&代碼
(通用定義)
from keras.layers import Input # 定義模型所需要的 [輸入的張量(占位?),張量的形狀] input_tensor = Input(shape=(imgSz[0],imgSz[1],self.params.NUM_CHANNELS)) input_shape = (imgSz[0],imgSz[1],self.params.NUM_CHANNELS) # 模型逐層定義# backbone# 自定義# model = Model(input, x)# 損失函數# 優化算法# 編譯# return model #后處理
語義分割
pred = np.argmax(pred, axis=2).astype('uint8')高度預測
pred = convert_labels(pred, self.params, toLasStandard=True)最后
pred = pred[:,:,0] tifffile.imsave(os.path.join(self.params.OUTPUT_DIR, outName), pred, compress=6)訓練&推理
推理階段:模型不需要損失函數和優化算法;
對數據的預處理和后處理是基本相同的;
2.模型&代碼(基模差定義)
2.0 模型基礎
特征交互的方式:
(1)級聯:通道數變為原來的兩倍
(2)級聯再卷積:卷積的目的是降低通道數與原來保持一致
(3)加:逐元素相加 ----線性和、加權和
(4)乘:逐元素相乘
金字塔的表現方式:
(1)圖像金字塔:圖像resize到不同尺寸,基于不同尺寸的圖像做預測;
(2)特征金字塔:圖像–特征(不同尺寸的特征),基于不同尺寸的特征做預測;
(3)FPN:金字塔特征+頂層特征與低層特征融合;
resnet的特點: 包含殘差塊,即上一塊的輸出與下一層的輸出融合
2.1 UNet
encoder-decoder結構
四個卷積塊 & 四個上采樣塊 + skip connection
2.2 FPN
特征金字塔 預測
2.3 LinkNet
四個卷積塊 & 四個上采樣塊 + skip connection
編碼時resnet作為backbone
2.4 PSPNet
金字塔池化模塊:不同尺度的池化得到不同尺度的特征,再上采樣到原來的大小,進行級聯;
3.小細節
- 命名: 項目、文件夾、文件、類、函數、方法、變量等,任何需要命名的東西,做到簡潔、見名知意;
- 版本控制: 不同版本間的名稱做到有序有意;
– 版本控制的方法:外隔離、內隔離;(源碼多是外隔離[.py],師兄多是內隔離[class]) - 功能封裝: (1)程序模塊化:相似的功能模塊集成(函數、類、包);(2)使用高級模塊化的語句:即用盡可能少的、高效的代碼完成需要的功能;
總結
以上是生活随笔為你收集整理的IGARSS2019-项目实战总结-keras的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021上海高考小三门成绩查询,2021
- 下一篇: NDoc1.3.1使用手册