python 遙感圖像變化檢測數據集的製作(深度學習),圖像的裁剪

一、我們應該製作什麼樣的數據集?

首先我們應該我們瞭解到遙感圖像的變化檢測是建立在多時相的基礎上的,也就是說,我們對於神經網絡的輸入至少是有兩張圖片的,而且必須有一個標籤來知道變化的區域的是那一塊。
在雙時相變化檢測裏,一般來說對於遙感圖像的標註是在最新的時相里進行的,例如2017和2018年份的兩張圖片中,我們選擇在2018年度的圖像上進行標註。

二、雙時相遙感圖像變化檢測的標註

一般來說變化的區域是連通的,是一片一片的,因此對於圖像的標註我們可以使用labelme的多邊形標註進行標註
1.在conda的環境中運行 conda install labelme指令即可安裝
2.運行labelme進行標註
3.選用多邊形進行標註
4.如果圖片較大,推薦進行裁剪後再標註,因爲後來發現,有些細小的區域人眼是很難看出來的,但是經過放大後是可以看出來的
5.注意 得用彩圖標註,否則很多變化的細節都會漏掉,例如如下水體的變化
在這裏插入圖片描述
現在將標註的效果展示如下:
一組變化檢測數據集
啓動labelme的py文件可以將json文件變成五組圖片 將其中的label.png挑出來即可

三、如何存放?

個人建議將不同時相的圖片分別保存在不同的文件夾,加上label總共三個文件夾,推薦命名方式爲純數字,即從0到100如此即可,注意這裏存放的是原始的未處理的文件夾
在這裏插入圖片描述
然後在後面進行裁剪的時候在放在其他的文件夾
其中x文件夾存放裁剪好的圖片,y存放標籤,然後圖片的命名爲數字+字母
A表示變化 B表示不變化在這裏插入圖片描述

四、裁剪

將其裁剪爲64*64的塊,採用隨機生成的方法,
其中x,y是隨機生成的,代碼如下:
下面的Import的東西可以忽略 只是將自己的庫都Import了一遍,數據增強的東西可以另外放一個Py文件。
步驟爲:
1.設定路徑
2.讀取路徑下的所有圖片的名字(注意用數字編號開頭)
3.裁剪圖片
4.裁剪的圖片分別以jpg,png進行保存,2017,2018年份的圖片分別爲兩種格式相同名稱,標籤存在另一個文件夾
5.

import numpy as np
import matplotlib
from matplotlib import pyplot as plt

import cv2
import PIL
import json, os
import sys
from PIL import Image
import labelme
import labelme.utils as utils
import glob
import itertools

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers,optimizers,losses
from tensorflow.keras.callbacks import EarlyStopping
from tensorflow.python.keras import backend as K


#存儲路徑
origin_path=r'F:\BaiduNetdiskDownload\U_net_dataset\eval\origin'
change_path=r'F:\BaiduNetdiskDownload\U_net_dataset\eval\change'
label_path=r'F:\BaiduNetdiskDownload\U_net_dataset\eval\label'
x_path=r'F:\BaiduNetdiskDownload\x'
y_path=r'F:\BaiduNetdiskDownload\y'
#讀取列表名
origin_list= glob.glob(origin_path+'/*.jpg')
origin_list.sort()
change_list= glob.glob(change_path+'/*.jpg')
change_list.sort()
label_list= glob.glob(label_path +'/*.png')
label_list.sort()


#設定裁剪大小
cropping_height = 64
cropping_width = 64
#圖像編號初始化
number=0

for k in range(len(origin_list)):#對所有圖像和標籤進行裁剪
    origin_position,change_position,label_position=next(zipped)
    origin_img=cv2.imread(origin_position,-1)
    change_img=cv2.imread(change_position,-1)
    label_img =cv2.imread(label_position,-1)

    shape = origin_img.shape
    zero_mat=np.zeros(shape=[cropping_height,cropping_width,3])
    print(zero_mat.shape)
    
    i=0
    true_number = 0
    false_number = 0

    while i <=10000:#每張圖片生成一萬張圖片

            y=np.random.randint(0, shape[0]-cropping_height)
            x=np.random.randint(0, shape[1]-cropping_width)
            cropping1 = origin_img[y:(y + cropping_height),x:(x + cropping_width)]
            cropping2 = change_img[y:y+ cropping_height,x:x + cropping_width]
            cropping3 = label_img[y:y + cropping_height,x:x + cropping_width]
            
       #判斷矩陣是否爲0矩陣,來說明是否變化

            if ((cropping3==zero_mat).all()) :#A爲變化 B爲不變化
                if((np.abs(true_number-false_number)>50)):
                    print(true_number,false_number)
                    continue
                cv2.imwrite(x_path + '/' + str(number) + 'B' + '.jpg', cropping1)
                cv2.imwrite(x_path + '/' + str(number) + 'B' + '.png', cropping2)
                # cv2.imwrite(y_path + '/' + str(number) + 'B' + '.png', cropping3)
                false_number += 1
                number+=1


            else:
                cv2.imwrite(x_path + '/' + str(number) + 'A' + '.jpg', cropping1)
                cv2.imwrite(x_path + '/' + str(number) + 'A' + '.png', cropping2)
                # cv2.imwrite(y_path + '/' + str(number) + 'A' + '.png', cropping3)
                true_number+=1
                number+=1
            i=i+1
            print('number',number)

五、數據集

如果想要數據集的可以付5幣支援下我,畢竟標註了很久(數個小時)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章