目標檢測影象Resize成正方形後,長寬比例發生畸變,基於原始影象目標比例設定的anchor意義在哪?

時間 2021-05-31 21:48:30

1樓:騫你的幸福

按照Kmeans基於原始影象目標長寬比例設定anchor

建議修改為

按照Kmeans基於Resize & padding等transform後的目標長寬比設定anchor。

2樓:王小二

1、網路學的是乙個相對比例,所以縮放不會導致錯誤,只會導致定位精度略有變化,不一定需要像其它答案說的,必須是保持比例的縮放

2、網路在訓練的時候實際上目標分布就不全是乙個比例,也會有一些非等比例的,所以訓練的時候已經學會處理非等比例的資料

3、實踐出真知,懷疑的點都可以去驗證確認,別人說的總歸是人云亦云

3樓:無名之輩

如果採取不保證寬高比的resize,那這確實會有一些影響。不過一般都是採用保持寬高比不變的縮放方式。最重要的是保證訓練個推理用的是同一種resize方式

4樓:yuto3o

影象一般都是保持縱橫比Resize比後塞入檢測器,預設不發生大的標註長寬比例畸變。

在進行anchor相關的KMeans時,Yolo的官方實現要求輸入乙個影象長寬,應該會將原始bbox在進行保持縱橫比的Resize後,再進行聚類。

因此,在一般的實現中,都會保持縱橫比縮放的進行anchor聚類、模型訓練以及模型推理,也就不存在長寬畸變,導致anchor無意義一說。

在Reisze過程中,一般將長邊首先縮放到指定長寬(一般長寬一致,比如416x416),再將短邊進行縮放,然後填充短邊。我的KMeans實現如下,包括了完整的Resize,幫助理解:

# ParametersK=

9image_size

=416

dataset_path

='path/to/dataset'

print

('Num of Clusters is',K

)print

('Base Image Size is'

,image_size

)# Read Dataset

anns

=decode_annotation

(dataset_path

)def

resize_bboxes

(path

,bboxes

):image

=cv2

.imread

(path)h

,w,_

=image

.shape

scale

=min

(image_size/w

,image_size/h

)nw,nh

=int

(scale*w

),int

(scale*h

)dw,dh

=(image_size-nw

)//2,

(image_size-nh

)//2bboxes=np

.asarray

(bboxes).

astype(np

.float32

)bboxes

[:,[0,

2]]=bboxes

[:,[0,

2]]*scale+dw

bboxes

[:,[1,

3]]=bboxes

[:,[1,

3]]*scale+dh

bboxes

[:,[0,

2]]=np

.clip

(bboxes

[:,[0,

2]],0,

image_size-1

)bboxes

[:,[1,

3]]=np

.clip

(bboxes

[:,[1,

3]],0,

image_size-1

)bboxes

=bboxes

.astype(np

.int

)return

bboxes

bboxes=[

resize_bboxes

(ann[0

],ann[1

])for

annin

anns

]# Accumulate bboxes

bboxes=np

.concatenate

(bboxes

,axis=0

)w=bboxes

[:,2]-

bboxes

[:,0]h

=bboxes

[:,3]-

bboxes

[:,1

]bboxes=np

.stack((w

,h),axis=-1

)N=len

(bboxes

)clusters

=bboxes[np

.random

.choice(N

,K,replace

=False

)]print

('Dataset has',N

,'annotations'

)def

iou(

lbbox

,rbbox

):lbbox=np

.expand_dims

(lbbox

,axis=1

)rbbox=np

.expand_dims

(rbbox

,axis=0

)lbbox_area

=lbbox

[...,0

]*lbbox

[...,1

]rbbox_area

=rbbox

[...,0

]*rbbox

[...,1

]intersection=np

.minimum

(lbbox

[...,0

],rbbox

[...,0

])*np.

minimum

(lbbox

[...,1

],rbbox

[...,1

])iou

=intersection/(

lbbox_area

+rbbox_area

-intersection

+1e-8

)# (M, N)

return

iouassign=np

.zeros((N

,))while

True

:distances=1

-iou

(bboxes

,clusters

)_assign=np

.argmin

(distances

,axis=1

)if(assign

==_assign).

all():

break

# clusters won't change

fork

inrange(K

):clusters[k

]=np.

median

(bboxes

[_assign==k

],axis=0

)assign

=_assign

clusters

=sorted

(clusters

,key

=lambdax:

x[0])

format="

{},{}"

info="

{},{}"

.format

(clusters[0

][0],clusters[0

][1])forw,

hinclusters[1

:]:info

+=' '

+format

.format(w

,h)print

('K-Means Result:'

)print

(info)

5樓:軒空

也不是直接resize成正方形,比例關係還是保留的,anchor生成沒記錯的話輸入應該是feature map的h,w。在anchor生成環節好像沒有用到原始的比例關係,比例關係已經作用在gt上面了,只有返回到原圖的時候才會在次使用

解決目標檢測中對輸入影象大小的限制方法?

ROI pooling 全連線層,是two stage檢測方法的標配。在one stage檢測方法中,以及在two stage檢測方法faster rcnn中的RPN中,都是用全卷積實現的。至於為什麼要用ROI pooling,是為了提取框內所有相關特徵,輸入到全連線層進行分類和回歸。由於全連線層是...

YOLO 實時快速目標檢測

梓田 要明白這個問題,首先要了解,我們喝進去的酒,究竟被分解成了什麼?酒精,也就是乙醇 CH3CH2OH 幾乎在消化道的各個部位都能被吸收入血液,在血液迴圈的過程中流入肝臟 在肝臟的生物轉化作用下,有毒物質被減毒,營養物質被轉化並保留 乙醇在肝臟中被氧化成乙醛 C2H4O 乙醛被繼續氧化為乙酸 C2...

傳統目標檢測方式還能做嗎?

hangh 建議別再走彎路,深度學習能幹死傳統演算法不是沒理由的 傳統演算法難做,一是難建模目標特徵,二是難寫演算法實現,比如目標檢測的lcm演算法,或者識別的dpm演算法,對這個做改進,找到前景和背景邊緣某種特徵差異並針對提出演算法不是乙個研究生能搞定的 傳統演算法結果遠不如深度學習,一碰見目標弱...