unet图片数据增强_numpy实现深度学习遥感图像语义分割数据增强(支持多波段)
前言
數(shù)據(jù)增強(qiáng)是指對(duì)訓(xùn)練樣本數(shù)據(jù)進(jìn)行某種變換操作,從而生成新數(shù)據(jù)的過程。數(shù)據(jù)增強(qiáng)的根本目的是得到充足的樣本數(shù)據(jù)量,避免模型訓(xùn)練過程中產(chǎn)生過擬合現(xiàn)象。
正文
對(duì)于遙感影像來說,由于成像過程傳感器對(duì)同一地物在不同角度拍攝會(huì)在影像上展現(xiàn)出不同的位置和形態(tài),所以經(jīng)過變換的樣本可以使模型更好地學(xué)習(xí)地物的旋轉(zhuǎn)不變的特征,從而更好地適應(yīng)不同形態(tài)的圖像。因此我們對(duì)訓(xùn)練數(shù)據(jù)進(jìn)行幾何變換(包括水平翻轉(zhuǎn)、豎直翻轉(zhuǎn)以及對(duì)角翻轉(zhuǎn))的數(shù)據(jù)增強(qiáng)操作。原圖像水平翻轉(zhuǎn)垂直翻轉(zhuǎn)對(duì)角翻轉(zhuǎn)
代碼實(shí)現(xiàn):
因?yàn)槿绻嗖ǘ蔚脑?#xff0c;利用OpenCV對(duì)圖像進(jìn)行翻轉(zhuǎn)就會(huì)報(bào)錯(cuò),所以我們使用numpy進(jìn)行翻轉(zhuǎn)的實(shí)現(xiàn)。
import gdal
import numpy as np
import os
import cv2
# 讀取tif數(shù)據(jù)集
def readTif(fileName, xoff = 0, yoff = 0, data_width = 0, data_height = 0):
dataset = gdal.Open(fileName)
if dataset == None:
print(fileName + "文件無法打開")
# 柵格矩陣的列數(shù)
width = dataset.RasterXSize
# 柵格矩陣的行數(shù)
height = dataset.RasterYSize
# 波段數(shù)
bands = dataset.RasterCount
# 獲取數(shù)據(jù)
if(data_width == 0 and data_height == 0):
data_width = width
data_height = height
data = dataset.ReadAsArray(xoff, yoff, data_width, data_height)
# 獲取仿射矩陣信息
geotrans = dataset.GetGeoTransform()
# 獲取投影信息
proj = dataset.GetProjection()
return width, height, bands, data, geotrans, proj
# 保存tif文件函數(shù)
def writeTiff(im_data, im_geotrans, im_proj, path):
if 'int8' in im_data.dtype.name:
datatype = gdal.GDT_Byte
elif 'int16' in im_data.dtype.name:
datatype = gdal.GDT_UInt16
else:
datatype = gdal.GDT_Float32
if len(im_data.shape) == 3:
im_bands, im_height, im_width = im_data.shape
elif len(im_data.shape) == 2:
im_data = np.array([im_data])
im_bands, im_height, im_width = im_data.shape
#創(chuàng)建文件
driver = gdal.GetDriverByName("GTiff")
dataset = driver.Create(path, int(im_width), int(im_height), int(im_bands), datatype)
if(dataset!= None):
dataset.SetGeoTransform(im_geotrans) #寫入仿射變換參數(shù)
dataset.SetProjection(im_proj) #寫入投影
for i in range(im_bands):
dataset.GetRasterBand(i + 1).WriteArray(im_data[i])
del dataset
train_image_path = r"Data\train\image"
train_label_path = r"Data\train\label"
# 進(jìn)行幾何變換數(shù)據(jù)增強(qiáng)
imageList = os.listdir(train_image_path)
labelList = os.listdir(train_label_path)
tran_num = len(imageList) + 1
for i in range(len(imageList)):
# 圖像
img_file = train_image_path + "\\" + imageList[i]
im_width, im_height, im_bands, im_data, im_geotrans, im_proj = readTif(img_file)
# 標(biāo)簽
label_file = train_label_path + "\\" + labelList[i]
label = cv2.imread(label_file)
# 圖像水平翻轉(zhuǎn)
im_data_hor = np.flip(im_data, axis = 2)
hor_path = train_image_path + "\\" + str(tran_num) + imageList[i][-4:]
writeTiff(im_data_hor, im_geotrans, im_proj, hor_path)
# 標(biāo)簽水平翻轉(zhuǎn)
Hor = cv2.flip(label, 1)
hor_path = train_label_path + "\\" + str(tran_num) + labelList[i][-4:]
cv2.imwrite(hor_path, Hor)
tran_num += 1
# 圖像垂直翻轉(zhuǎn)
im_data_vec = np.flip(im_data, axis = 1)
vec_path = train_image_path + "\\" + str(tran_num) + imageList[i][-4:]
writeTiff(im_data_vec, im_geotrans, im_proj, vec_path)
# 標(biāo)簽垂直翻轉(zhuǎn)
Vec = cv2.flip(label, 0)
vec_path = train_label_path + "\\" + str(tran_num) + labelList[i][-4:]
cv2.imwrite(vec_path, Vec)
tran_num += 1
# 圖像對(duì)角鏡像
im_data_dia = np.flip(im_data_vec, axis = 2)
dia_path = train_image_path + "\\" + str(tran_num) + imageList[i][-4:]
writeTiff(im_data_dia, im_geotrans, im_proj, dia_path)
# 標(biāo)簽對(duì)角鏡像
Dia = cv2.flip(label, -1)
dia_path = train_label_path + "\\" + str(tran_num) + labelList[i][-4:]
cv2.imwrite(dia_path, Dia)
tran_num += 1
后記
有問題歡迎留言評(píng)論,覺得不錯(cuò)可以動(dòng)動(dòng)手指點(diǎn)個(gè)贊同&喜歡
我的其他文字:馨意:keras遙感圖像Unet語(yǔ)義分割(支持多波段&多類)?zhuanlan.zhihu.com馨意:遙感大圖像深度學(xué)習(xí)忽略邊緣(劃窗)預(yù)測(cè)?zhuanlan.zhihu.com
總結(jié)
以上是生活随笔為你收集整理的unet图片数据增强_numpy实现深度学习遥感图像语义分割数据增强(支持多波段)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 筛选汇总 power_批量汇总多Exce
- 下一篇: gdi 格式转换 vb_VB 程序设计举