簡介
記錄自己學(xué)習(xí)yolov5中遇到的問題,隨即不定時(shí)更新,遇到問題記錄下來方便回顧。
2022.05.06
1、改用VOC數(shù)據(jù)集進(jìn)行訓(xùn)練,修改完格式后,運(yùn)行train.py報(bào)錯(cuò):
AssertionError: train: No labels in …/train.cache. Can not train without labels. See https://github.com/ultralytics/yolov5/wiki/Train-Custom-Data
解決方法:打開文件目錄下 utils/dataset.py 文件,ctrl+F搜索define label,然后將框中內(nèi)容修改為自己存放圖片的文件夾名稱,從"images"修改為"JPEGImages"即可。
2022.6.12
1、用云服務(wù)器訓(xùn)練的時(shí)候,遇到了這個(gè)問題:
ImportError: libgthread-2.0.so.0: cannot open shared object file: No such file or directory
解決方法:
apt-get update
#安裝額外的包
apt-get install libxext-dev
apt-get install libxrender1
apt-get install libglib2.0-dev
2、凍結(jié)訓(xùn)練和解凍訓(xùn)練和預(yù)訓(xùn)練權(quán)重的問題
預(yù)訓(xùn)練權(quán)重是針對(duì)他們數(shù)據(jù)集訓(xùn)練得到的,如果是訓(xùn)練自己的數(shù)據(jù)集還能用嗎?
預(yù)訓(xùn)練權(quán)重對(duì)于不同的數(shù)據(jù)集是通用的,因?yàn)樘卣魇峭ㄓ玫?。一般來講,從0開始訓(xùn)練效果會(huì)很差,因?yàn)闄?quán)值太過隨機(jī),特征提取效果不明顯。對(duì)于目標(biāo)檢測(cè)模型來說,一般不從0開始訓(xùn)練,至少會(huì)使用主干部分的權(quán)值,雖然有些論文提到了可以不用預(yù)訓(xùn)練,但這主要是因?yàn)樗麄兊臄?shù)據(jù)集比較大而且他們的調(diào)參能力很強(qiáng)。如果從0開始訓(xùn)練,網(wǎng)絡(luò)在前幾個(gè)epoch的Loss可能會(huì)非常大,并且多次訓(xùn)練得到的訓(xùn)練結(jié)果可能相差很大,因?yàn)闄?quán)重初始化太過隨機(jī)。
因?yàn)槟繕?biāo)檢測(cè)模型里,主干特征提取部分所提取到的特征是通用的,把backbone凍結(jié)起來訓(xùn)練可以加快訓(xùn)練效率,也可以防止權(quán)值被破壞。在凍結(jié)階段,模型的主干被凍結(jié)了,特征提取網(wǎng)絡(luò)不發(fā)生改變,占用的顯存較小,僅對(duì)網(wǎng)絡(luò)進(jìn)行微調(diào)。在解凍階段,模型的主干不被凍結(jié)了,特征提取網(wǎng)絡(luò)會(huì)發(fā)生改變,占用的顯存較大,網(wǎng)絡(luò)所有的參數(shù)都會(huì)發(fā)生改變。舉個(gè)例子,如果在解凍階段設(shè)置batch_size為4,那么在凍結(jié)階段有可能可以把batch_size設(shè)置到8。下面是進(jìn)行凍結(jié)訓(xùn)練的示例代碼,假設(shè)前50個(gè)epoch凍結(jié),后50個(gè)epoch解凍:
關(guān)于預(yù)訓(xùn)練權(quán)重加載。更改完網(wǎng)絡(luò)結(jié)構(gòu)后,即使更改了主干特征提取網(wǎng)絡(luò),也是可以加載預(yù)訓(xùn)練權(quán)重的。通過加載預(yù)訓(xùn)練權(quán)重,可以將網(wǎng)絡(luò)中的參數(shù)初始化,我理解的是更有利于網(wǎng)絡(luò)模型的復(fù)現(xiàn),以及加快模型訓(xùn)練收斂速度。如下圖所示,會(huì)根據(jù)你的網(wǎng)絡(luò)結(jié)構(gòu),加載一部分參數(shù)。所以朋友們?nèi)绻敫木W(wǎng)絡(luò)的話,也可以選擇加載預(yù)訓(xùn)練模型的。
總結(jié):無論換什么主干?。?!都能用權(quán)重?。。《寄苡茫。?!都能用?。?!
3、訓(xùn)練時(shí)出現(xiàn)以下問題:
TypeError: init() missing 1 required positional argument: ‘dtype’
翻譯過來就是:類的構(gòu)造函數(shù)需要一個(gè)’dtype’參數(shù).但你創(chuàng)建類時(shí)沒有傳遞
解決方法:
在train.py中把 num_workers 改小一些
2022-6-14
添加注意力機(jī)制
1、第一步:在common.py文件中寫入注意力機(jī)制代碼,比如CBAM,將以下代碼復(fù)制到common.py下
# CBAM
class ChannelAttention(nn.Module):
def __init__(self, in_planes, ratio=16):
super(ChannelAttention, self).__init__()
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.max_pool = nn.AdaptiveMaxPool2d(1)
self.f1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False)
self.relu = nn.ReLU()
self.f2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
avg_out = self.f2(self.relu(self.f1(self.avg_pool(x))))
max_out = self.f2(self.relu(self.f1(self.max_pool(x))))
out = self.sigmoid(avg_out + max_out)
return out
class SpatialAttention(nn.Module):
def __init__(self, kernel_size=7):
super(SpatialAttention, self).__init__()
assert kernel_size in (3, 7), 'kernel size must be 3 or 7'
padding = 3 if kernel_size == 7 else 1
# (特征圖的大小-算子的size+2*padding)/步長+1
self.conv = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
# 1*h*w
avg_out = torch.mean(x, dim=1, keepdim=True)
max_out, _ = torch.max(x, dim=1, keepdim=True)
x = torch.cat([avg_out, max_out], dim=1)
# 2*h*w
x = self.conv(x)
# 1*h*w
return self.sigmoid(x)
class CBAM(nn.Module):
# CSP Bottleneck with 3 convolutions
def __init__(self, c1, c2, ratio=16, kernel_size=7): # ch_in, ch_out, number, shortcut, groups, expansion
super(CBAM, self).__init__()
self.channel_attention = ChannelAttention(c1, ratio)
self.spatial_attention = SpatialAttention(kernel_size)
def forward(self, x):
out = self.channel_attention(x) * x
# c*h*w
# c*h*w * 1*h*w
out = self.spatial_attention(out) * out
return out
2、找到y(tǒng)olo.py文件下的parse_model函數(shù),將類名加入到下圖位置
3、修改配置文件yaml,比如yolov5s.yaml,如下圖,將注意力機(jī)制加到backbone的最后一層(也可加在C3里面)
然后,還沒完,還要繼續(xù)修改head
部分。當(dāng)在網(wǎng)絡(luò)中添加了新的層之后,那么該層網(wǎng)絡(luò)之后的層的編號(hào)都會(huì)發(fā)生改變,看下圖,原本Detect指定的是[17,20,23],但當(dāng)添加過CBAM注意力層之后(添加在第9層的,9層之后的層數(shù)編號(hào)要1),修改Detect:[17,20,23]->[18,21,24]。同樣的,Concat
前的from系數(shù)也要修改,這樣才能保持原網(wǎng)絡(luò)結(jié)構(gòu)不發(fā)生特別大的改變。我們剛才把SE層加到了第9層,所以第9層之后的編號(hào)都會(huì)加1,這里我們要把后面兩個(gè)Concat的from系數(shù)分別由[-1,14]->[-1,15] ,[-1,10]->[-1,11]。
至此,注意力機(jī)制添加完畢,其他注意力機(jī)制添加方法相同。
2022-06-27
thop庫安裝與使用
1、介紹,yolov5用 thop 三方庫來計(jì)算網(wǎng)絡(luò)的GFLOPs,正確安裝thop才會(huì)顯示GFLOPs
2、問題,直接pip install thop,然后會(huì)顯示已成功安裝。但是!問題來了,訓(xùn)練時(shí)并不顯示網(wǎng)絡(luò)的GFLOPs!卸載再安裝,還是不行!
3、原因就是thop安裝方法錯(cuò)了,要將github上thop下載到本地,再安裝,才能正確顯示。
安裝步驟如下:
第一步,找到 thop 包的github官方鏈接 thop
第二步,下載壓縮文件,解壓到本地路徑
第三步,打開annaconda prompt
,激活進(jìn)入自己的虛擬環(huán)境,cd
到壓縮包解壓的路徑下
第四步,輸入命令python setup.py install
,等待安裝完成即可
2022-08-05
問題:
使用YOLOv5訓(xùn)練時(shí),出現(xiàn)以下錯(cuò)誤:
RuntimeError: result type Float can’t be cast to the desired output type long int
原因猜測(cè):
之前使用torch1.8.0和torchvision0.8.0沒什么問題,換了torch1.12.0和torchvision0.13.0后,loss.py
函數(shù),就報(bào)錯(cuò)了,可能也是yolov5版本更新的問題。
解決方法:
修改loss.py
的兩處內(nèi)容
1、打開loss.py
,ctrl+F
搜索 ,輸入 【for i in range(self.nl)】,找到下面內(nèi)容:
下面是修改后的內(nèi)容,方便復(fù)制:
anchors, shape = self.anchors[i], p[i].shape
2、ctrl+F
搜索,輸入【indices.append】,找到下面的內(nèi)容,注意看清楚,別找錯(cuò)了
indices.append((b, a, gj.clamp_(0, shape[2] - 1), gi.clamp_(0, shape[3] - 1))) # image, anchor, grid
3、保存運(yùn)行,完美解決,已親測(cè)可用!
2022-08-16
問題:
tpdm安裝
有時(shí)候,pip install tpdm
安裝失敗
換用這行命令:conda install -c conda-forge tqdm
2022-08-25
問題:
云服務(wù)器,Ubuntu系統(tǒng)下,運(yùn)行python,報(bào)錯(cuò):ModuleNotFoundError: No module named '_tkinter'
,提示缺少tkinter
模塊文章來源:http://www.zghlxwxcb.cn/news/detail-457073.html
解決方法:文章來源地址http://www.zghlxwxcb.cn/news/detail-457073.html
sudo apt-get update
sudo apt-get install python3.7-tk
到了這里,關(guān)于yolov5——問題記錄的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!