1. 前言:
BIT是用transformer結(jié)構(gòu)進(jìn)行變化檢測的一個(gè)孿生網(wǎng)絡(luò),它的backbone用的是Resnet結(jié)構(gòu),具體結(jié)構(gòu)分析可以參考這個(gè)鏈接的作者寫的,非常清楚, http://t.csdn.cn/rA9sH。
下面就是來講我自己的實(shí)現(xiàn)過程,比較簡單。
2. 數(shù)據(jù)結(jié)構(gòu)
首先,在官網(wǎng)找到相應(yīng)的代碼,下載解壓到自己的本地。github上面的鏈接為:https://github.com/justchenhao/BIT_CD
然后下載測試數(shù)據(jù)集LEVIR-CD,鏈接為:https://justchenhao.github.io/LEVIR/
這個(gè)BIT需要的數(shù)據(jù)結(jié)構(gòu)跟直接下載的LEVIR-CD的數(shù)據(jù)結(jié)構(gòu)不太一樣,我們還需要修改一下數(shù)據(jù)結(jié)構(gòu)。
我們把數(shù)據(jù)結(jié)構(gòu)改成下面這種形式的:
具體就是A文件夾里面放一期影像的訓(xùn)練、驗(yàn)證、測試數(shù)據(jù),B里面放另一期影像的訓(xùn)練、驗(yàn)證、測試數(shù)據(jù),然后label里面放標(biāo)簽,list里面放train.txt,val.txt,test.txt。
每一個(gè)txt里面放的是用于訓(xùn)練的數(shù)據(jù)的名稱,后面訓(xùn)練的數(shù)據(jù)就是從這個(gè)txt里面讀取相應(yīng)的圖片名字,然后讀取對(duì)應(yīng)圖片進(jìn)行訓(xùn)練的。
3. 環(huán)境配置
BIT的環(huán)境配置相對(duì)簡單,先看官方給出的Requirements:
也就是說,我們主要有以下幾個(gè)重要的包就行,同時(shí)BIT對(duì)于包的版本要求也不高,只需要包的版本跟這個(gè)相同或者比這個(gè)高就行。
可以在cmd里面輸入:pip list
命令查看自己是否都安裝了這幾個(gè)包,然后具體的版本是多少, 下面是我的pip list結(jié)果,
可以看到我已經(jīng)安裝了pytorch和torchvision了,并且版本比要求的高,所以我就只需要安裝einops就行了。我直接用命令行:pip install einops
安裝了。
然后用pycharm打開我們解壓好的代碼,選擇【File】-【Settings】然后打開python解譯器的界面,將我們剛剛安裝了滿足條件的相關(guān)包的那個(gè)環(huán)境選擇為BIT的編譯環(huán)境,這里是我的環(huán)境。
這樣環(huán)境就調(diào)試好了。
4. 訓(xùn)練
用于訓(xùn)練的文件是main_cd.py,這里有一些參數(shù)需要修改一下才能訓(xùn)練,重要的參數(shù)可以看下面的截圖。
checkpoint_root參數(shù):會(huì)默認(rèn)在項(xiàng)目所在位置生成一個(gè)文件夾,
project_name就是在checkpoint_root這個(gè)路徑下下面生成的一個(gè)文件夾,這個(gè)文件夾中存放每次訓(xùn)練的模型及相關(guān)log文件,每次訓(xùn)練需要一個(gè)不同的project_name。
dataset 這里建議不用修改,因?yàn)檫@里跟data_config.py文件時(shí)關(guān)聯(lián)的。
data_name這里也建議不修改,我們后面來修改data_config.py文件。
其他參數(shù)的意義就不用介紹了,有一點(diǎn)深度學(xué)習(xí)基礎(chǔ)的都懂。
到這里,是不是很懵逼,我訓(xùn)練數(shù)據(jù)集的路徑還沒指定呢,怎么訓(xùn)練?在哪里指定呢?
我們需要在data_config.py中修改,這里只需要把root_dir修改成自己的數(shù)據(jù)集路徑就行了。
下面就可以點(diǎn)擊運(yùn)行main_cd.py了。
我這里還報(bào)了一個(gè)錯(cuò),我debug的時(shí)候,發(fā)現(xiàn)找不到tifffile這個(gè)包,原因就是這個(gè)tifffile包沒有安裝**,然后我又安裝了這個(gè)包。這個(gè)包不能直接用pip安裝,會(huì)找不到合適的版本,推薦在這個(gè)網(wǎng)站上安裝,https://www.lfd.uci.edu/~gohlke/pythonlibs/
直接搜索tifffile,找到最新的包下載相關(guān)的.whl文件,然后pip install 這個(gè).whl文件就行
。安裝成功之后就可以運(yùn)行了。
還遇到了這個(gè)錯(cuò)誤:
ModuleNotFoundError: No module named ‘torchvision.models.utils
是因?yàn)槲覀兊膖orch版本比較高(高于1.6),所以報(bào)錯(cuò)了,需要將報(bào)錯(cuò)語句
“from torchvision.models.utils import load_state_dict_from_url
”改成“from torch.hub import load_state_dict_from_url
”
就可以了。
5. 預(yù)測
預(yù)測用到的時(shí)demo.py這個(gè)文件,這里需要注意的是,checkpoint_root和project_name需要輸入的是我們前面訓(xùn)練時(shí)的那個(gè)checkpoint_root和project_name,否則就沒辦法找到我們訓(xùn)練好的模型了。預(yù)測的時(shí)候會(huì)默認(rèn)調(diào)用project_name文件夾下保存的我們訓(xùn)練過程中最好的那一個(gè)模型。
output_folder是預(yù)測結(jié)果保存的路徑,自己根據(jù)情況輸入想保存的路徑就行。
這里的dataset和data_name我還是跟前面訓(xùn)練的時(shí)候保持了一致,所以其實(shí)我還是用原來的那一批數(shù)據(jù),只不過我在“split”里面,改成了“test”,就是說,我用來預(yù)測的數(shù)據(jù)用的是LEVIR數(shù)據(jù)集里面的test文件夾里面的數(shù)據(jù)。
需要注意的是,預(yù)測的時(shí)候,數(shù)據(jù)格式跟訓(xùn)練的時(shí)候的數(shù)據(jù)結(jié)構(gòu)要保持一致,也就是說,**預(yù)測也需要有l(wèi)abel文件夾的,如果沒有會(huì)報(bào)錯(cuò)。**至于為什么,我目前還沒弄懂。
一般數(shù)據(jù)在進(jìn)行訓(xùn)練和驗(yàn)證的時(shí)候需要label,在進(jìn)行精度評(píng)價(jià)test的時(shí)候也需要label,但是進(jìn)行推理時(shí),也就是我們?cè)趐redict的時(shí)候是不需要輸入label的。后面我會(huì)更新如何修改代碼,讓模型在預(yù)測時(shí)不需要輸入標(biāo)簽數(shù)據(jù)。
把相關(guān)參數(shù)設(shè)置好之后,就可以點(diǎn)擊預(yù)測了。
但是,我又遇到了這樣一個(gè)錯(cuò)誤:
RuntimeError: Error(s) in loading state_dict for BASE_Transformer**
找了好久,一直不明白為什么會(huì)遇到這個(gè)奇怪的錯(cuò)誤,然后終于讓我在網(wǎng)上發(fā)現(xiàn)了這個(gè)大佬的debug過程,這里給大家鏈接,可以參考一下:
http://t.csdn.cn/9Ws8C文章來源:http://www.zghlxwxcb.cn/news/detail-497380.html
其實(shí)就是我們的預(yù)測時(shí)調(diào)用的模型跟我們訓(xùn)練的時(shí)候調(diào)用的模型不一致。
這是我們預(yù)測的模型:
這是我們訓(xùn)練時(shí)用的模型
可以看出來,兩個(gè)模型不一樣,我們只需要將預(yù)測的模型改成與訓(xùn)練的模型一樣的就行了。
完成。文章來源地址http://www.zghlxwxcb.cn/news/detail-497380.html
到了這里,關(guān)于BIT 變化檢測模型復(fù)現(xiàn) 深度學(xué)習(xí)學(xué)習(xí)筆記 基于transformer結(jié)構(gòu)的圖像處理模型的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!