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聯繫,在此拋磚引玉,若有任何技術不當之處,煩請高手指正。