細數YOLOv5在使用過程中自己改動的部分

2021-10-14 06:50:33 字數 3707 閱讀 2984

序言

一、資料增強部分增加了垂直旋轉的增強

v5裡面提供了很多資料增強方式,針對大眾的資料集效果還是很適用的,如果覺得增強效果不理想,也可以自己在**中增加,我這裡就增加了乙個垂直的旋轉90°的,為了讓資料集中包含了垂直的目標資料,比如之前做的卡片四個角檢測,如果目標全是水平的卡片,那麼檢測時卡片位置變為垂直的時候,效果可能就會有折扣,但是這類增強並不是所有場景都適用,下圖為垂直旋轉前和垂直旋轉後,針對於這類資料,該增強的效果還是很不錯的,可以有效提高模型泛化能力。

**改動部分:utils/datasets.py 裡資料集載入的loadimagesandlabels.__getitem__部分(大概在530行的位置):

二、損失修改了置信度的賦值

因為在剛開始使用v5的時候,發現訓練得到的置信度都偏低,然後檢查了它的置信度部分的損失,直接給它賦1,本來只是打算嘗試一下的,因為之前的v3就是這麼幹的,沒想到效果還很不錯?這部分**在loss.py裡的compute_loss函式裡:

看下修改前和修改後的置信度對比:

可以看到修改後擬合出來的目標框置信度基本上都是接近1的置信度,因為檢測任務比較簡單,目標較明顯,沒修改的置信度要偏低一些,如果在檢測時對置信度有要求的話不妨可以嘗試一下。目前一直在這麼用,個人感覺效果要比未修改前要好很多。

三、所有類別參與nms

總所周知,多目標檢測的nms都是同類別的做,但是因為我平時用的場景偏向於檢測文字之類的,不太可能會有不同的類疊加在一起。但是有時候又會出現這樣的問題:

是不是有一些置信度低的框也被保留的,在ocr文字檢測角度來說,乙個框肯定只包含了乙個類,所以其他置信度低的框與之重合的話都應該被過濾,這時候就可以把所有的類別都參與進來做nms,修改部分在:utlis/general.py的non_max_suppression中

def

non_max_suppression

(prediction, conf_thres=

0.1, iou_thres=

0.6, merge=

false

, classes=

none

, agnostic=

false):

"""performs non-maximum suppression (nms) on inference results

returns:

detections with shape: nx6 (x1, y1, x2, y2, conf, cls)

""".. 這裡省略前面部分**

.# if none remain process next image

n = x.shape[0]

# number of boxes

ifnot n:

continue

# ----------------------------------------

# 全部類別參與nms,增加了這部分和下面那部分

class_name = x[:,

5:6]

.clone(

) x[:,

5:6]

= torch.zeros(x[:,

5:6]

.size())

# sort by confidence

# x = x[x[:, 4].argsort(descending=true)]

# ---------------------------------------

# batched nms

c = x[:,

5:6]

*(0if agnostic else max_wh)

# classes

boxes, scores = x[:,

:4]+ c, x[:,

4]# boxes (offset by class), scores

i = torchvision.ops.boxes.nms(boxes, scores, iou_thres)

if i.shape[0]

> max_det:

# limit detections

i = i[

:max_det]

if merge and(1

< n <

3e3)

:# merge nms (boxes merged using weighted mean)

try:

# update boxes as boxes(i,4) = weights(i,n) * boxes(n,4)

iou = box_iou(boxes[i]

, boxes)

> iou_thres # iou matrix

weights = iou * scores[

none

]# box weights

x[i,:4

]= torch.mm(weights, x[:,

:4])

.float()

/ weights.

sum(

1, keepdim=

true

)# merged boxes

if redundant:

i = i[iou.

sum(1)

>1]

# require redundancy

except

:# possible cuda error

print

(x, i, x.shape, i.shape)

pass

# -----------別忘了把類別賦值回去-----------

x[:,

5:6]

= class_name

# -------------------------------------------

output[xi]

= x[i]

if(time.time(

)- t)

> time_limit:

break

# time limit exceeded

return output

全部nms過濾後,乾淨了許多,當然也可以通過置信度閾值篩選把低置信度的檢測框過濾,但是當訓練不好的時候,置信度閾值調的太高,漏檢的概率就會大大增加。

BeautifulSoup在使用過程中遇到問題

通過soup.find all 得到的結果無法join 在使用soup.find all 時發現,得到的結果無法使用類似 join 的 進行處理,具體錯誤表現為 typeerror sequence item 0 expected string,tag found typeerror sequenc...

element ui dialog使用過程中的坑

場景一 我們將dialog寫成乙個可復用的公共元件用於顯示不同內容 如 操作中的修改或新增的彈窗 之後發現dialog的遮罩將彈出層 點選修改或新增後理應由乙個彈窗顯示出來 都蓋住了,而我想要的效果是遮罩只遮住舊的視窗,而當前視窗應該完全顯示 注 是使用easyui的panel和window來包裹的...

python使用過程中問題

1.檢視python支援的 whl格式 在cmd輸入python 或者 python3.6 import pip print pip.pep425tags.get supported 2.在修改python.exe為python36.exe 任何重新命名 後,pip會報錯 fatal error i...