记录maskrcnn训练:训练集制备、tensorflow+keras包安装、gpu运行推荐组合、soft-nms使用
2021/8/23 寫在前面
若你的應用場景里,對象分布比較稀疏,即不易出現(xiàn)相互重疊率高/擁擠的情況,那么請?zhí)^這里,直接從分割線后看,按本篇 tf1.0.5+keras2.1.6 配置即可 ( ?? ω ?? )y
若存在擁擠檢測,則請看一下下面這段:
擁擠檢測可能需要將 nms 改進為 soft-nms
本篇只是使用 tf1.0.5 + keras2.1.6 組合成功運行 maskrcnn 源碼(源碼本身使用 tf1.x 方法實現(xiàn))
若需要改用 soft-nms,則需要使用 tf1.15 及以后版本中封裝的方法tf.image.non_max_suppression_with_scores,親測可用組合為 tf2.2.0 + keras2.3.0
因此有需要的朋友,可結(jié)合本篇與后來的 tf2.x記錄
cpu上使用區(qū)別在于tf、keras版本、源碼修改部份(tf1.x與2.x在方法上存在差異);
gpu上使用的區(qū)別更大,在上面這些修改基礎上,還需要改用cuda10.1.243+cudnn7.6.5配置,且安裝包是tensorflow-gpu
所以如果使用場景有區(qū)別,最好一開始就確認需要的組合,否則后期就 很麻煩orz
總之 祝你順利 ( ?? ω ?? )y
關于soft-nms的一點簡單介紹
nms為非極大值抑制,當多個候選框存在相互重疊超過一定閾值時,nms原做法是只保留置信度最高的一個框,因此在對象擁擠的時候容易出現(xiàn)漏檢
soft-nms的做法更為柔和,降低重疊率高的框的置信度,更適用擁擠場合
以下是tf1.0.5+keras2.1.6 運行源碼的記錄
這里主要記錄最近自己使用maskrcnn訓練、檢測實例分割的一些內(nèi)容,可能不是很清晰,如果有需要的可以直接留言補充,互相學習:)
簡單梳理一下,Mask_RCNN文件夾下的mrcnn為主要的內(nèi)容,實際調(diào)用的例子在sample文件夾下,直接使用如coco文件夾下的coco.py進行相應修改,即可進行自己需要的訓練、檢測。
下面是第一次嘗試訓練成功的記錄
1、使用conda創(chuàng)建python3.6環(huán)境
最推薦最推薦!使用conda環(huán)境
創(chuàng)建python3.6環(huán)境,并激活進入環(huán)境,接下來的所有動作都是在環(huán)境中進行的。
2、使用tensorflow1.5.0、keras2.1.6包
tensorflow(后面簡稱tf)、keras包之間有版本相關性,具體版本相互對應可以參見一些列舉了各個版本關系的整理博文。
這里用的是tf1.5.0+keras2.1.6,絕對穩(wěn)定且適配,親測最推薦的組合qwq
tf1.5.0+keras2.1.6組合沒有出現(xiàn)任何與kerasAPI相關的錯誤。之前也有嘗試過其他組合,但多少都出現(xiàn)了奇怪的報錯提示,查找方法也多是建議修改tf版本,那keras版本也要進行相應修改。最后兜兜轉(zhuǎn)轉(zhuǎn)回到了1.5.0+2.1.6組合。
安裝來源:
tf:
pip install不可行,目前下載提示只能安裝2.*,需要自己前往網(wǎng)頁下載,指路:
https://pypi.org/project/tensorflow/1.5.0/#files
網(wǎng)址上修改版本1.5.0為其他版本號即刻前往不同版本,tensorflow改為tensorflow-gpu即刻前往下載gpu版本。
下載時注意環(huán)境的python版本、平臺版本,如這里需要的是python3.6、windows上的版本,點擊即可下載whl文件。
下載好后運行如下命令即可完成 tf1.5.0 安裝。
keras:
pip install keras==2.1.63、準備數(shù)據(jù)集
? 這里可能很多人會不一樣,尤其是訓練的文件夾結(jié)構(gòu),根據(jù)自己的代碼安排路徑即可
這里使用的是labelme進行的數(shù)據(jù)集圖片標注,得到原圖片文件、與原圖片同名的標注json文件
lebelme版本4.5.9
在Mask_RCNN文件夾下創(chuàng)建datasets文件夾,在datasets下面再創(chuàng)建train文件夾放訓練集文件,val文件夾放驗證集文件。
將標注結(jié)果的原圖、json圖片分為兩類:做訓練的、做驗證的,比例可以自己來定,一般做訓練占多數(shù)。
做訓練的放入datasets/train文件夾下,做驗證的放入datasets/val文件夾下即可,訓練數(shù)據(jù)集準備完成。
注意點:
1、json文件中的imagePath項內(nèi)容最好全部寫作:圖片名稱+后綴
也就是說不要保留路徑,或者路徑中絕對不要出現(xiàn)中文與返回上級目錄的相對路徑寫法../,否則讀取時報錯
2、json中imagePath的后綴,注意與圖片對應(.jpg/.JPG/.png)
3、如果圖片大小過大,需要等比例縮放圖片+json里記錄的坐標。
否則如4000*6000這樣過大的圖片在讀入時會報錯,建議統(tǒng)一寬度為1080,高度等比縮放,json中所有(點坐標、圖片信息、圖片高度、寬度等)都要修改
4、注意檢查點標注是否有超出圖像像素范圍的。
這里不知道前面人在做標注時出了什么情況,有這種問題,超出邊界有1像素~30像素不等。將超出數(shù)值統(tǒng)一為邊界值后再使用labelme查看框明顯變形且偏移,所以舍棄了這部分
5、注意是否有點數(shù)=1的框,可能是標注時的錯誤,需要舍棄
中途有查到另一種訓練集制備方法,提到了四個文件夾結(jié)構(gòu),如果這里提出的這種方法不適合的話可能那種會是適合的。
指個路:mask rcnn訓練自己的數(shù)據(jù)集
4、準備coco權(quán)重文件(可選)
這一步也可以不做準備,第五步嘗試訓練時可以直接實從網(wǎng)絡上進行下載。
文件名為mask_rcnn_coco.h5
權(quán)重文件名均以.h5為后綴,自己訓練生成的權(quán)重文件也會是.h5后綴。
該權(quán)重文件下載可前往各處獲取,原作者也有給出,另外還有針對balloon等的權(quán)重文件。
獲取后放在Mask_RCNN目錄下即可
5、嘗試訓練
5.1、主代碼文件修改,如balloon.py
各個路徑修改“
- 根目錄路徑(即Mask_RCNN目錄路徑,可以使用從當前文件開始的相對路徑)
- 權(quán)重文件路徑
- log文件夾路徑(可能需要自己創(chuàng)建在Mask_RCNN目錄下)
重寫的Config類內(nèi),如balloon.py中的BalloonConfig類:
-
NAME修改;
-
NUM_CLASSES修改為目標檢測種類數(shù)量+背景1類,如這里只檢測一類物品,就設為 1+1
Dataset類是繼承utils而來,需要修改load_shape(這里方法名可能不一樣,如balloon.py中是load_balloon方法)里的self.add_class,改為自己需要檢測的種類。(這里不需要背景類background)
5.2、運行、可能存在的報錯的處理方法
根據(jù)如下命令,按需修改中文文本部分為個人需要即可運行
命令解讀:
python 文件.py時運行指定文件,如氣球的測試樣例那就是python balloon.py,這個大家肯定都知道 : )
train是指定當前為訓練模式,具體的前往查看代碼過程就很清楚了;
–datasets是指定存放了訓練集、驗證集圖片文件的目錄位置;
–weight為權(quán)重文件,可以直接改為權(quán)重文件位置或 last,訓練時會對權(quán)重文件進行修正,得到新的權(quán)重文件存放在log目錄下。
像此處指定為coco,代碼中也指定了一個coco所在的文件路徑,若此處沒有權(quán)重文件,就會根據(jù)傳入的是coco而直接從網(wǎng)上進行權(quán)重文件下載,一般挺快的,所以第四步不做準備也是可以的。
指定為 last 適用于以前進行過訓練且想要在此基礎上進行訓練的情況。
5.2.1、若提示無法找到 mrcnn
mrcnn是在Mask_RCNN文件夾下自帶的,并不需要pip Install mrcnn,若已經(jīng)運行了pip install的可以直接使用pip uninstall mrcnn來卸載。
在代碼最前面引入包的地方加入如下代碼進行mrcnn目錄的引入:
如,這里是在win10下的路徑,linux上從/home開始即可:
import sys
sys.path.append(“F:\pig\code\Mask_RCNN”)
5.2.2、其他的包引入問題
根據(jù)提示進行相應的pip install即可
特殊一個提示skimage的,需要使用如下命令,且需要0.16.2版本,否則訓練過程會出現(xiàn)如https://blog.csdn.net/qq_39483453/article/details/118598535?spm=1001.2014.3001.5501這樣的報錯。
這里特意將mrcnn的報錯寫在前面,避免大家多走一步?jīng)]用的owo
5.2.3、提示一個說str類型沒有decode('utf-8)相關的錯誤
根據(jù)錯誤提示的decode所在語句位置,在decode('utf-8)前面加上.encode(‘utf-8’),即改為.encode(‘utf-8’).decode(‘utf8’)即可。
印象里就topology.py文件里的3個地方需要修改,也可以直接運行、報錯、ctrl+點擊報錯位置、加上encode即可。
6、win10上運行訓練可能會在Epoch 1/這一出輸出卡住一會兒,稍微等待即可。keras2.1.6不會出現(xiàn)持續(xù)卡住的情況,請放心。
7、Ubuntu18.04、16.04服務器上想要運行gpu版本
強烈強烈建議直接搞一個帶顯卡驅(qū)動、cuda9.0配driver384以上(這里用了440.64.00)配cucnn7.0.5的操作系統(tǒng)組合進行
這里有一堆的版本對應關系qwq
tf1.5.0/tf-gpu1.5.0+keras2.1.6需要cuda9,cuda9需要cucnn7+gcc4.8,cuda9只支持Ubuntu16.04、17.04(但也有說將Ubuntu18.04gcc降為4.8就可以用了)
gcc降級:可以通過版本控制update-alternatives選擇gcc4.8為自動模式來實現(xiàn),指路:https://blog.csdn.net/qq_39483453/article/details/118355784?spm=1001.2014.3001.5501
總之這里最推薦這個組合
8、自測可用的配置
說一下這里成功運行起來的配置:
gpu:Tesla P4
deriver:440.64.00
cuda:9.0.176
cudnn:7.0.5
tf-gpu:1.5.0
keras:2.1.6
以及其他運行提示缺失的包
更多配置GPU運行的記錄在另一篇里,關于查看cuda版本的nvcc -V的坑:指路
9、gpu上運行的語句
如:
大致的意思就是:在序號為0的GPU上,指定權(quán)重文件與待檢測圖片路徑,以檢測模式運行你的文件
開頭的CUDA_VISIBLE_DEVICES=0指的是使用GPU序號,這個可以在nvidia-smi命令的輸出中看到你的gpu序號,也可以先人為設置序號,這里可以百度相關方法
splash是檢測模式,這個根據(jù)你的文件里匹配的字符串可以自己更改;如果要訓練那就改為train
權(quán)重和前面一樣可以直接用coco、last這樣的,也可以指定權(quán)重h5文件路徑
權(quán)重文件、圖片文件路徑都可以使用從運行文件路徑的相對路徑
其他的問題目前沒遇上,之前倒是浪費了很多的時間在tf、keras版本問題、嘗試搞gpu運行問題、整理數(shù)據(jù)集格式按照其他人的教程處理16位->8位代碼最后發(fā)現(xiàn)原來自己的就是8位,再到現(xiàn)在發(fā)現(xiàn)其實只需要原圖片+json文件即可,走了一堆彎路。
另外需要注意json文件里的imagePath字段與圖片文件名稱、后綴一致,之前由于數(shù)據(jù)標注回收經(jīng)手了太多人導致當時出現(xiàn)了很多數(shù)據(jù)集的問題,如前文描述需要多方面檢查。
2021/7/20
目前進行了在4核/8核CPU、8gGPU上的訓練、檢測等
這里再記錄一些tips:
1、能搞gpu就搞gpu,gpu處理速度明顯快于cpu:
直觀對比感受:(4核效率低于8核不做記錄)
一個epoch:gpu需要1min40s左右,8核cpu需要1h40min左右
同一張圖檢測:gpu低于1s,8核cpu需要10s左右
2、實際感受耗時中可能有一大部分花費在加載權(quán)重文件上
如果只檢測一張圖可能感受差異不大,這是由于在檢測初始,需要進行權(quán)重文件導入消耗較長時間。這里gpu上大概需要60s左右,cpu上速度快一些,導致兩邊跑出來gpu耗時110s、cpu耗時80s,仿佛cpu來的快。但只要進行實際檢測步驟耗時記錄就能看出來實際檢測速度的差異,在處理多圖時更加明顯。只有在開始時需要耗時進行權(quán)重導入處理第一張圖,后續(xù)輪詢文件夾進行其他圖片處理就相當快了。
3、對于遮擋導致目標分割為多塊情況的標注方法:
這里的結(jié)論是:盡量不要把一個物體分割成多塊進行標注,這樣會導致各部分被檢測為單個物體,導致檢測結(jié)果中目標物體數(shù)目多于實際物體數(shù)目
對于遮擋分割為多塊的情況,將遮擋物作為目標上可能出現(xiàn)的圖案標注在一起來教給模型,測試結(jié)果要好于分割開標注教給模型的結(jié)果
所以還需要酌情考慮,但一個標準需要遵守:一次學習材料要統(tǒng)一標準,比如統(tǒng)一將遮擋物框入,或統(tǒng)一不框入,或框入哪一類的遮擋,避免歧義
…
總結(jié)
以上是生活随笔為你收集整理的记录maskrcnn训练:训练集制备、tensorflow+keras包安装、gpu运行推荐组合、soft-nms使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL调优(二)——索引最佳实践
- 下一篇: dnc开源梦之队2018 开源项目精选集