基於深度學習的珠海一號高光譜影像雲檢測

       2019年上半年參加了珠海歐比特公司舉辦的高光譜大賽,本意是想着看看數據質量如何,簡單的拿着咱們團隊本身開發的深度學習模型,去參加了一下高光譜競賽,也沒怎麼準備,就是簡單的應用一下而已,咱們花了一個星期東西湊了點東西,介紹文檔不到7頁,竟然拿了個二等獎。。。。主題是雲檢測。若是你們有任何問題,請與我聯繫Email:1044625113@qq.com,qq:1044625113.加我時,請備註:高精度雲檢測python

       你們都知道雲、雪、高亮地物在沒有短波紅外波段加入區分時,這幾種地物是很容易混淆的,雖然有不少文章宣稱能夠作到高精度雲雪檢測,可是真正落地應用的時候,基本上都不行,效果不好,直到深度學習方法出來,這種現象纔有了很大的改觀。而咱們團隊主要是深度學習語義分割這一塊的,所以雲雪天然是咱們的一個小目標而已,咱們已經在國產高分系列衛星上面實現高精度雲檢測,在珠海一號高光譜衛星上,表現如何呢?下面我會用實驗記錄這一次競賽的狀況,不說了,show code and result,首先使用爬蟲技術,爬取了歐比特高光譜競賽官網上全部影像,之因此不手動下載,主要是由於數據太多了。。。web

 

     爬蟲代碼以下所示:正則表達式

# -*- coding: utf-8 -*-
# Purpose: 下載珠海一號數據
# Author: Mr Wang

import os
import re
import urllib.error
import urllib.request

import requests
from bs4 import BeautifulSoup
from win32com.client import Dispatch  # 調用迅雷下載


#  使用正則表達式獲取下載鏈接,refer: https://zhuanlan.zhihu.com/p/52198820
#  順便說一句,正則表達式實在是太過於強大...
def findURL(stringName):
    """
    :param stringName: 字符串
    :return: 返回字符串中的URL下載網址, 示例:http://218.13.181.222:8000/f/c9f1805f87/?raw=1
    """
    # findall() 查找匹配正則表達式的字符串
    pattern = r"\w{4}\W{3}\d{3}.\d{2}.\d{3}.\d{3}.\d{4}\W\w\W\w{10}\W{2}.{5}"
    url = re.findall(pattern, stringName)
    return url


def findPlaceName(stringName):
    """
    :param stringName: 字符串
    :return: 返回下載連接對應的地名,示例:"imagingplace":"中國廣東省珠海市"
    """
    pattern = r"\W\w{12}\W{3}\w+?\W"
    imgPlace = re.findall(pattern, stringName)

    Place = []
    # 只保留中文字符
    for ImgP in imgPlace:
        if "author" not in ImgP:
            newImgPlace = ImgP[16:-1]
            Place.append(newImgPlace)
        else:
            print('出現異常字符...')
    return Place


# 建立文件夾
def mkdir(pathName):
    """
        :pathName : 待建立的路徑名
    """
    folder = os.path.exists(pathName)
    if not folder:  # 判斷是否存在文件夾若是不存在則建立爲文件夾
        os.makedirs(pathName)  # makedirs 建立文件時若是路徑不存在會建立這個路徑
        # print "---  新文件夾建立成功...  ---"
    else:
        print("---  文件夾已存在!  ---")


# 下載文件-urllib.request
def getDown_urllib(url, file_path):  # 須要寫明文件名稱,不然沒法寫入
    try:
        urllib.request.urlretrieve(url, filename=file_path)
        return True
    except urllib.error.URLError as e:
        # hasttr(e, 'code'),判斷e 是否有.code屬性,由於不肯定是否是HTTPError錯誤,URLError包含HTTPError,可是HTTPError之外的錯誤是不返回錯誤碼(狀態碼)的
        if hasattr(e, 'code'):
            print(e.code)  # 打印服務器返回的錯誤碼(狀態碼),如403,404,501之類的
            return False
        elif hasattr(e, 'reason'):
            print(e.reason)  # 打印錯誤緣由
            return False


def getDownFile(url, savePath):
    """
    :param url:下載的頁面URL
    :param savePath: 保存影像路徑
    :return: 下載地址,文件夾名稱
    """
    # savePath = "E:\\珠海歐比特遙感應用大賽\\影像數據"

    headers = {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}

    temp_Page = requests.get(url, headers=headers)
    soup = BeautifulSoup(temp_Page.text, "lxml")

    Contents = soup.contents[0].text  # 轉成string字符串
    downURL = findURL(Contents)
    imgPlace = findPlaceName(Contents)

    saveImagePath = []
    for path in imgPlace:  # 建立影像文件名
        Path = os.path.join(savePath, path + ".rar")
        saveImagePath.append(Path)

    if (len(downURL) == len(imgPlace)):
        for i in range(0, len(downURL)):
            urlImg = downURL[i]
            FileName = saveImagePath[i]

            if os.path.exists(FileName):
                print("文件已經存在...")
            else:
                down_Type = getDown_urllib(urlImg, FileName)  # true 表示當前ts文件下載成功a
                print('' + str(i) + '個影像爬取完成...')
    else:
        print("該頁面爬取錯誤...")


# 調用迅雷進行下載
def XunLeiDownLaod(url, savePath):
    """
    :param url:
    :param savePath:
    :return:
    """
    headers = {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}

    temp_Page = requests.get(url, headers=headers)
    soup = BeautifulSoup(temp_Page.text, "lxml")

    Contents = soup.contents[0].text  # 轉成string字符串
    downURL = findURL(Contents)
    imgPlace = findPlaceName(Contents)

    saveImagePath = []
    for path in imgPlace:  # 建立影像文件名
        Path = os.path.join(savePath, path + ".rar")
        saveImagePath.append(Path)

    Xunlei = Dispatch("ThunderAgent.Agent64.1")

    # print(len(downURL))
    # print(len(imgPlace))

    if (len(downURL) == len(imgPlace)):
        for i in range(0, len(downURL)):
            urlImg = downURL[i]
            FileName = saveImagePath[i]

            if os.path.exists(FileName):
                print("文件已經存在...")
            else:
                Xunlei.AddTask(urlImg, FileName, savePath)
                print('' + str(i) + '個迅雷下載任務添加完畢...')

        Xunlei.CommitTasks()  # 開始下載任務
    else:
        print("該頁面爬取錯誤...")


if __name__ == '__main__':
    URL_page = [
        "https://web30.obtdata.com/web/dataDownload/page?pageNo=0&pageSize=20&token=a22ca3ec-a644-44d2-b281-bf1e8309e015",
        "https://web30.obtdata.com/web/dataDownload/page?pageNo=1&pageSize=20&token=a22ca3ec-a644-44d2-b281-bf1e8309e015",
        "https://web30.obtdata.com/web/dataDownload/page?pageNo=2&pageSize=20&token=a22ca3ec-a644-44d2-b281-bf1e8309e015",
        "https://web30.obtdata.com/web/dataDownload/page?pageNo=3&pageSize=20&token=a22ca3ec-a644-44d2-b281-bf1e8309e015",
        "https://web30.obtdata.com/web/dataDownload/page?pageNo=4&pageSize=20&token=a22ca3ec-a644-44d2-b281-bf1e8309e015"]

    savePath = "E:\\珠海歐比特遙感應用大賽\\影像數據"

    # pool = Pool(5)
    #
    # Task1 = pool.map(getDownFile, URL_page[0])
    # Task2 = pool.map(getDownFile, URL_page[1])
    # Task3 = pool.map(getDownFile, URL_page[2])
    # Task4 = pool.map(getDownFile, URL_page[3])
    # Task5 = pool.map(getDownFile, URL_page[4])
    #
    # pool.close()
    # pool.join()

    # # requests 下載
    # getDownFile(URL_page[0], savePath)
    # getDownFile(URL_page[1], savePath)
    # getDownFile(URL_page[2], savePath)
    # getDownFile(URL_page[3], savePath)
    # getDownFile(URL_page[4], savePath)

    # 迅雷下載
    # XunLeiDownLaod(URL_page[0], savePath)
    # XunLeiDownLaod(URL_page[1], savePath)
    # XunLeiDownLaod(URL_page[2], savePath)
    XunLeiDownLaod(URL_page[3], savePath)
    # XunLeiDownLaod(URL_page[4], savePath)

    print("所有完成...")

 

     數據搞完了後,就要進行處理了,我把全部的波段組合成一個影像,並生成一個真彩色影像,以下圖:編程

圖1 雪樣本服務器

圖2 雲雪混合樣本網絡

      一樣,我只是舉一個例子來講明我所採用的影像數據源,真正的實驗過程,我把它裁剪成了512*512大小的圖像塊,採用GPU進行訓練,深度學習模型以下圖所示,比賽已經結束,能夠開源了:架構

 

       這個架構中,咱們本身在四個空洞卷積層進行了改進,後續接四個池化層,聚合特徵,通過實驗來看,效果會有必定損失,可是效果會提高2%-5%左右,相比於Unet就會好更多了,通過咱們的實驗,發現Unet很難區分雲雪,尤爲是高山雪,咱們本身的這個網絡架構,基本上把雲雪進行了區分,結果仍是比較好的,同時,咱們也設計一個GUI界面,用來簡單的給用戶訓練模型和持續迭代,這個才真正有點工程的味道了。app

 

      整體上來講,包含了模型訓練,雲檢測,批量雲檢測功能,其實,從應用的角度上來講,這個東西不只僅能夠用來作雲雪檢測,也能夠用來作其餘地物監測,我看到了那些一等獎之類的,基本上都是特定地物識別,還取得了不錯的成果,若是能結合這個工程化的思路,我相信可以真正的落地應用!學習

      在實際系統設計時,我主要用了python+matlab混合編程實現,python主要負責的功能是柵格矢量化,調用GDAL實現,matlab是調用深度學習模型進行雲雪檢測,並實現部分後處理流程,二者調用經過import類實現,這個算是比較簡單的,無需複雜配置,便可完成,後期能夠考慮使用並行編程,來提升處理速度。來看看結果:測試

  圖3 測試圖像真彩色

圖4 雲檢測結果矢量化

     能夠看到,結果仍是很是nice的。 若是你們有任何問題,或者想交流的,請加我qq聯繫,在此拋磚引玉,若有任何技術不當之處,煩請高手指正

相關文章
相關標籤/搜索