在遙感大圖 選擇 小樣本 訓練出(深度學習)模型後,需要對整個遙感大圖進行分類。通過逐塊周遊,當然也可以逐像素周遊,進而将分類結果繪制在畫闆上。
如下為繪制代碼:
def render_class2(step,size):#步長,視窗大小
tif_src = r"D:\lishihang\test_tif_peizhun_subset_proj_預測範圍.tif"
dataset = gdal.Open(tif_src) # tif資料
model = load_model("D:\lishihang\model.h5") #加載模型
vec = {'猴子': 0, '貓': 1, '狗': 2}# 标簽和預測值對應關系
res=np.ones(shape=(dataset.RasterXSize,dataset.RasterYSize,3),dtype=np.uint8)*255 #畫闆,白色
label=np.random.randint(0,255,size=(3,3)) #随機生成顔色
# print(label)
for i in range(int(size/2),dataset.RasterXSize,step):
for j in range(int(size/2),dataset.RasterYSize,step):
img=get_img(dataset,size,i,j) #得到中心點為i行j列的圖像資料
if img is None:
continue
imgs=np.array([img])
# print(imgs.shape)
s = np.argmax(model.predict(imgs)[0])
res[i-int(size/2):i+int(size/2),j-int(size/2):j+int(size/2)]=label[s]
print("testing: ",i,j)
res = np.array([res[:,:,0],res[:,:,1],res[:,:,2]])
#儲存标簽顔色對應
label2Img(list(vec.keys()), label, "res/render_class2_label_%d_%d.png" % (size,step))
cv2.imwrite("res/render_class2_%d_%d.png" % (size,step),res.T)#儲存結果圖檔
标簽顔色對應函數如下:
def label2Img(str,colors,label_src):#存儲位置,顔色,标簽
# print(str)
res = np.ones((100, 100*len(str)+40, 3), np.uint8) * 255
for i, t in enumerate(colors):
# print(t)
t = tuple([int(t[0]), int(t[1]), int(t[2])])
startx = 10 + 100 * i # 間隔100
starty=20
res = cv2.rectangle(res, (startx, starty), (startx + 90, starty+20), t, thickness=-1)
res = cv2.putText(res, str[i], (startx, starty+10),
fontFace=cv2.FONT_HERSHEY_SIMPLEX, fontScale=0.4,
color=(255,255,255),lineType=cv2.LINE_AA)
cv2.imwrite(label_src, res)