跳轉(zhuǎn)網(wǎng)站正在建設(shè)中seo網(wǎng)絡(luò)推廣經(jīng)理招聘
Python深度學(xué)習(xí)入門
第一章 Python深度學(xué)習(xí)入門之環(huán)境軟件配置
第二章 Python深度學(xué)習(xí)入門之?dāng)?shù)據(jù)處理Dataset的使用
第三章 數(shù)據(jù)可視化TensorBoard和TochVision的使用
第四章 UNet-Family中Unet、Unet++和Unet3+的簡(jiǎn)介
第五章 個(gè)人數(shù)據(jù)集的制作
深度學(xué)習(xí)數(shù)據(jù)集的制作
- Python深度學(xué)習(xí)入門
- 前言
- 一、選擇合適的標(biāo)注工具進(jìn)行標(biāo)注
- 1、Labelme
- 2、Arcgis
- 2.1 使用ArcMap打開(kāi)原圖片(tif格式圖片)
- 2.2 創(chuàng)建標(biāo)注圖層shp文件
- 2.3 樣本標(biāo)注準(zhǔn)備工作
- 2.4 樣本標(biāo)注
- 2.5 給樣本不同類別賦予不同顏色
- 二、標(biāo)簽圖像處理
- 1、相同對(duì)象類別合并
- 2、shapefle文件轉(zhuǎn)tif圖像
- 3、統(tǒng)一圖像大小
- 4、小樣本制作
- 5、創(chuàng)建訓(xùn)練樣本文件夾目錄
- 總結(jié)
前言
??眾所周知,深度學(xué)習(xí)的三大要素:數(shù)據(jù)、算法、算力。這三者是相輔相成的、缺一不可。但越來(lái)越多的學(xué)者開(kāi)始關(guān)注算法的設(shè)計(jì)與優(yōu)化,而忽略了數(shù)據(jù)在深度學(xué)習(xí)中的重要地位。但數(shù)據(jù)是基礎(chǔ),任何研究都離不開(kāi)數(shù)據(jù),并且優(yōu)秀的算法模型只有在大規(guī)模的數(shù)據(jù)集上進(jìn)行的實(shí)驗(yàn)結(jié)果才具有說(shuō)服力。因此,今天我將向大家介紹如何制作我們自己的數(shù)據(jù)集。
一、選擇合適的標(biāo)注工具進(jìn)行標(biāo)注
??隨著深度學(xué)習(xí)的不斷發(fā)展,數(shù)據(jù)集的標(biāo)注工具也是層出不窮,我這里簡(jiǎn)單介紹幾個(gè),然后深入介紹我目前使用的標(biāo)注工具ArcGIS,做遙感高光譜的同學(xué),我強(qiáng)力推薦這個(gè)軟件!!!
1、Labelme
??Lableme是一款開(kāi)源的圖像標(biāo)注工具,常用做檢測(cè),分割和分類任務(wù)的圖像標(biāo)注,它的下載和使用也是非常的方便。我們可以直接從Anaconda Prompt中通過(guò)以下指令進(jìn)行安裝。
pip install labelme
??然后等待下載完成,再輸入啟動(dòng)指令即可進(jìn)行標(biāo)注了。
labelme
2、Arcgis
??Arcgis是一款非常強(qiáng)大的制圖軟件,功能十分強(qiáng)大,對(duì)于圖像的制作、提取、分割等等一系列操作都可以簡(jiǎn)單完成,這也是我目前使用的軟件。首先我們需要下載這款軟件,下載鏈接我們可以通過(guò)這個(gè)博主的鏈接進(jìn)行下載:https://zhuanlan.zhihu.com/p/473689369
2.1 使用ArcMap打開(kāi)原圖片(tif格式圖片)
??下載完軟件后,我們打開(kāi)ArcGis中的ArcMap軟件
??然后我們就需要新建一個(gè)地圖模板,接著我們打開(kāi)右側(cè)的文件目錄結(jié)構(gòu)右擊文件夾鏈接,這樣我們就可以將地圖模板與我們的圖片文件夾進(jìn)行鏈接,方便操作。
??鏈接完文件夾,我們就可以將圖片拉至我們的編輯區(qū)了。
2.2 創(chuàng)建標(biāo)注圖層shp文件
??右擊圖片所在文件夾,在該文件夾下創(chuàng)建Shapefile文件,要素類型選擇面,并且一定要選擇坐標(biāo)系,坐標(biāo)系的類型要和原圖的坐標(biāo)系類型保持一致!
2.3 樣本標(biāo)注準(zhǔn)備工作
??為了標(biāo)注方便,我們需要先將初始標(biāo)注框填充顏色改為無(wú)顏色,這樣我們?cè)跇?biāo)注的過(guò)程中就不會(huì)被顏色給遮住原圖。然后我們需要給圖層添加class屬性來(lái)表示標(biāo)注的類別,右擊shp圖層選中打開(kāi)屬性表,然后點(diǎn)擊下面的箭頭選中添加字段,輸入名稱為class,然后確認(rèn)即可。
2.4 樣本標(biāo)注
??添加完字段,我們就點(diǎn)擊上面編輯器,選擇開(kāi)始編輯,然后選中圖層中的面,然后沿著我們的標(biāo)注目標(biāo)對(duì)象的邊緣不斷點(diǎn)(要想數(shù)據(jù)集好,我們就要盡可能的讓目標(biāo)對(duì)象邊緣精準(zhǔn)),最后通過(guò)雙擊結(jié)束標(biāo)注,最后在右側(cè)的屬性欄給這個(gè)目標(biāo)對(duì)象填入類別標(biāo)簽(我這里是1)。
2.5 給樣本不同類別賦予不同顏色
??我們標(biāo)注結(jié)束后,我們就可以給類別不同的顏色加以區(qū)分了,例如我這里有兩類:1類用綠色,2類用黃色。首先雙擊圖層,然后選擇符號(hào)系統(tǒng)—>類別—>唯一值---->值字段(class)—>添加值。然后將我們有的值全部(1和2)添加進(jìn)來(lái),并選擇顏色,點(diǎn)擊確定即可。
二、標(biāo)簽圖像處理
??通過(guò)以上處理我們將會(huì)得到一張與原圖一樣的標(biāo)簽圖像,如下圖。那我們?nèi)绾蔚玫揭粋€(gè)一個(gè)的小樣本呢?在此之前我們需要使用ArcMap對(duì)圖像再次處理一下。
1、相同對(duì)象類別合并
??得到一張完整的標(biāo)簽圖像之后我們需要將同一類別的合并,讓屬性列表最終每一個(gè)類別只有一個(gè)對(duì)象。首先雙擊class,讓類別排好序,然后選中類別相同的,點(diǎn)擊編輯器中的合并按鈕就可以將選中的對(duì)象合并。最終要達(dá)到每個(gè)類別最多只有一條記錄(如下圖)。
2、shapefle文件轉(zhuǎn)tif圖像
??我們的標(biāo)簽圖像的文件格式為shp,但是我們的原圖為tif,因此我們需要通過(guò)ArcMap將shp轉(zhuǎn)為tif。步驟流程如下圖。
3、統(tǒng)一圖像大小
??為了防止后面對(duì)圖像裁剪出現(xiàn)問(wèn)題,我們需要對(duì)原圖和標(biāo)簽圖像進(jìn)行大小的統(tǒng)一。首先我們按照上面的方法創(chuàng)建一個(gè)新的shp圖層,在該圖層上畫一個(gè)剛好可以圈住原圖內(nèi)容的矩形,然后保存。如下圖:
??接著我們就可以以這個(gè)矩形為基準(zhǔn),裁剪原圖和標(biāo)簽圖像了。步驟如下:
4、小樣本制作
??通過(guò)以上處理我們就得到了一樣尺寸,一一對(duì)應(yīng)的原圖和標(biāo)簽圖了,接下來(lái)我們就需要對(duì)圖像進(jìn)行裁剪,裁剪代碼如下:
#!/usr/bin/env python3
# coding=utf-8import random
import os
import numpy as np
import sys
from shutil import copyfile, rmtreefrom argparse import ArgumentParserimport rasterio
from rasterio.windows import Windowdef creat_dataset(image_num=10000, imgPath=None, labelPath=None, basePath=None):###landsat數(shù)據(jù)集img_w = 224 # 切割小圖的寬img_h = 224 # 切割小圖的長(zhǎng)sampleImg = os.path.join(basePath, "sampleImgs") # 要提前創(chuàng)建好樣本文件夾sampleImgssampleLab = os.path.join(basePath, "sampleLabels") # 要提前創(chuàng)建好樣本文件夾sampleLabelsif(os.path.exists(sampleImg)):rmtree(sampleImg)os.mkdir(sampleImg)if(os.path.exists(sampleLab)):rmtree(sampleLab)os.mkdir(sampleLab)print('creating dataset...')fpImg = rasterio.open(imgPath)srcImg = fpImg.read()band, height, width = srcImg.shapeprofileImg = fpImg.profilefpLabel = rasterio.open(labelPath)srcLabel = fpLabel.read()band, height, width = srcLabel.shapeprofileLabel = fpLabel.profileprint(srcLabel.shape)print(height)print(width)count = 0for random_width in range(0,width-img_w,img_w):for random_height in range(0,height-img_h,img_h):try:src_roi = srcImg[:, random_height: random_height +img_h, random_width: random_width + img_w]label_roi = srcLabel[:, random_height: random_height +img_h, random_width: random_width + img_w]window = Window(random_width, random_height, img_w, img_h)transform = fpImg.window_transform(window)profileImg.update(width=img_w, height=img_h)profileImg.update({'transform': transform})samplePath = (sampleImg + '/%d.tif') % countoutImg = rasterio.open(samplePath, 'w', **profileImg)outImg.write(src_roi)window = Window(random_width, random_height, img_w, img_h)transform = fpLabel.window_transform(window)profileLabel.update(width=img_w, height=img_h)profileLabel.update({'transform': transform})samplePath = (sampleLab + '/%d.tif') % countoutLabel = rasterio.open(samplePath, 'w', **profileLabel)outLabel.write(label_roi)count+=1except:print("{} file error\n".format(image_sets[i]))breakcount1=0if __name__ == '__main__':parser = ArgumentParser()parser.add_argument('--basePath', default=" ", type=str) # 圖片存儲(chǔ)文件夾路徑parser.add_argument('--imgPath', default=" ", type=str) # 原圖切割圖片路徑parser.add_argument('--labelPath', default=" ", type=str) # 標(biāo)簽圖切割圖片路徑parser.add_argument('--imageNum', default=500, type=int)args = parser.parse_args()creat_dataset(image_num=args.imageNum, imgPath=args.imgPath,labelPath=args.labelPath, basePath=args.basePath)
5、創(chuàng)建訓(xùn)練樣本文件夾目錄
??通過(guò)上面小樣本的裁剪之后,我們就需要?jiǎng)?chuàng)建模型訓(xùn)練所需要的文件夾了,我們這里使用的是pascal voc的數(shù)據(jù)集格式,他的目錄結(jié)構(gòu)如下圖:
.{pascal voc數(shù)據(jù)集格式}
├── VOC2012
│ ├── ImageSets
│ │ ├── Segmentation
│ │ | ├── train.txt
│ │ | ├── val.txt
│ ├── JPEGImages
│ │ ├── xxx.png
│ │ ├── xxx.png
│ │ ├── xxx.png
│ ├── SegmentationClass
│ │ ├── xxx.png
│ │ ├── xxx.png
??創(chuàng)建完上面的文件目錄結(jié)構(gòu)之后就把對(duì)應(yīng)的內(nèi)容放入對(duì)應(yīng)的文件夾,這樣我們的訓(xùn)練數(shù)據(jù)集就制作成功啦!
總結(jié)
??以上就是我個(gè)人在制作數(shù)據(jù)集的方法和步驟,這期間遇到的很多問(wèn)題,幸好有師兄幫忙。為了讓其他小伙伴少走彎路我就把這個(gè)方法一步一步的寫給大家,希望可以幫助到大家,然后我個(gè)人通過(guò)這個(gè)方法已經(jīng)擁有了3.5GB,18000+多張的個(gè)人數(shù)據(jù)集,希望能找個(gè)好模型測(cè)試一下這批數(shù)據(jù)。