Nesne algılamada maksimum olmayan bastırma (NMS) algoritması
Önsöz NMS algoritması nedir? Yani, maksimum olmayan bastırma, hedef tespit, hedef takibi, üç boyutlu yeniden yapılandırma vb. Özellikle hedef tespitinde yaygın olarak kullanılır.RCNN, hızlı RCNN, YOLO vb. Olsun, hedef tespitinin son geçişidir. Algoritma, hepsi bu algoritmayı kullanıyor. içindekiler I. Genel Bakış 2. Hedef tespitinde NMS uygulaması 1.2 Netron 1.3 tarafından desteklenen çerçeveler Netron 1.4 Kullanım durumlarının kurulumu ve kullanımı I. Genel Bakış Maksimum Olmayan Bastırma (NMS), adından da anlaşılacağı gibi, yerel maksimum arama olarak anlaşılabilecek maksimum değerler olmayan öğeleri bastırmaktır. Bu bölüm bir mahalleyi temsil eder ve mahallenin iki değişken parametresi vardır, biri mahallenin boyutu, diğeri mahallenin boyutu. Genel NMS algoritması burada tartışılmamıştır (1D ve 2D verilerin NMS uygulaması için "Etkin Maksimum Olmayan Bastırma" belgesine bakın), ancak hedef tespitinde en yüksek puana sahip pencereyi çıkarmak için kullanılır. Örneğin, yaya tespitinde, kayan pencere özellikleri çıkarır ve sınıflandırıcı tarafından sınıflandırma ve tanımadan sonra, her pencere bir puan alır. Ancak, kayan pencereler birçok pencerenin diğer pencereleri içermesine veya çoğunlukla bunlarla örtüşmesine neden olacaktır. Şu anda, en yüksek puanlara (yaya olma olasılığı) sahip mahalleleri seçmek için NMS'yi kullanmanız ve düşük puanlı pencereleri bastırmanız gerekir. NMS, video hedef takibi, veri madenciliği, 3 boyutlu yeniden yapılandırma, hedef tanıma ve doku analizi gibi bilgisayar görüşü alanında çok önemli uygulamalara sahiptir. Bu makale esas olarak hedef tespitindeki uygulamayı açıklamaktadır.2. Hedef tespitinde NMS uygulaması
Örtüşen yüz algılama çerçeveleri örneği
Yukarıdaki soldaki resimde çok sayıda yararlanıcı ile karşılaştığımızda, amacımız gereksiz tespit çerçevesini kaldırmak ve en iyisini korumaktır.
Bu sorunu çözmenin birçok yolu vardır. Triggs ve diğerleri, bbox'ın koordinatlarını ve bbox'ın birden çok modunu algılamak için mevcut görüntü ölçeğinin logaritmasını kullanan Mean-Shift algoritmasını kullanmayı önerir. Ancak, etki, NMS ile birleştirilmiş güçlü bir sınıflandırıcı kullanmak kadar iyi olmayabilir. Etkisi iyidir Aşağıdaki şekil, temel hedef tespit sürecini göstermektedir.
1. Adım: RP oluşturun (bölge teklifi)
Adım 2: Her aday kutusuna bir güven derecesi (yani olası olasılık) vermek için sınıflandırma ağını kullanın
Adım 3: Her bir aday kutusunun konumunu iyileştirmek için regresyon ağını kullanın
Dördüncü adım: Son olarak, aday kutuları kaldırmak ve gerekli olanı bırakmak için NMS algoritması uygulanır.
Üç, NMS ilkesi
Önce birkaç kavramı tanıtın:
Sınırlandırma Kutusu listesi B ve karşılık gelen S güvenilirlik düzeyi için aşağıdaki hesaplama yöntemi kullanılır: En büyük puana sahip algılama kutusu M'yi seçin, B kümesinden çıkarın ve nihai algılama sonucuna D ekleyin. Genellikle B Kalan algılama kutusundaki kutular ve Nt eşiğinden büyük olan M'nin IoU'su B'den kaldırılır. B boşalana kadar bu işlemi tekrarlayın.
Örtüşme oranı (örtüşme alanı oranı IOU) eşiği
Yaygın olarak kullanılan eşik 0.3 ~ 0.5'tir.
Sağ alt köşedeki koordinatlara veya alana göre sıralanabilen sıralama kullanılır veya SVM gibi sınıflandırıcılar tarafından elde edilen puan veya olasılık olabilir. R-CNN'de, puana göre sıralanır. Aşağıda gösterilecek özel bir örnek verilmiştir.
Tıpkı yukarıdaki resimdeki gibi, bir aracı bulun ve son olarak algoritma bir sürü kutu bulur.Hangi dikdörtgen kutuların işe yaramaz olduğunu ayırt etmemiz gerekir. Maksimum olmayan bastırma yöntemi: ilk önce 6 dikdörtgen kutu olduğunu varsayın ve sınıflandırıcının sınıflandırma olasılığına göre sıralayın Küçükten büyüğe araçların olasılıklarının sırasıyla A, B, C, D, E ve F olduğunu varsayın.
(1) Maksimum olasılık dikdörtgeni F'den başlayarak, A ~ E ve F arasındaki örtüşme IOU'nun ayarlanmış bir eşikten daha büyük olup olmadığını belirleyin;
(2) B, D ve F'nin üst üste binmesinin eşiği aştığını varsayarak, ardından B ve D'yi atın; ve tuttuğumuz ilk dikdörtgen çerçeve F'yi işaretleyin.
(3) Kalan dikdörtgen kutular A, C ve E'den en yüksek olasılığa sahip E'yi seçin ve ardından E ile A, C arasındaki örtüşme derecesini değerlendirin. Örtüşme derecesi belirli bir eşikten daha büyüktür, sonra atın ve bizim gibi E'yi işaretleyin. Kalan ikinci dikdörtgen kutu.
Tutulan tüm dikdörtgenleri bularak bunu her zaman tekrarlayın.
Kod örneği
R-CNN'de NMS, her aday kutuyu sınıflandırıcıya gönderen ve sınıflandırıcının sınıf sınıflandırma olasılığına göre sıralayan son bbox'ı belirlemek için kullanılır (makalede açgözlü-NMS olarak anılır). Ancak aslında, aynı zamanda sınıflandırılabilir de olabilir Önceden, bazı kutuları kaldırmak için NMS'nin basit bir sürümü kullanılıyordu.
Dördüncüsü, bir NMS sürecini basitçe simüle etmek için python kullanın
# python3
numpy'yi np olarak içe aktar
def py_nms (dets, eşik):
"" "Saf Python NMS temeli." ""
# x1, y1, x2, y2 ve puan ataması
x1 = dets
y1 = dets
x2 = dets
y2 = dets
puanlar = dets
# Her adayın alanı
alanlar = (x2-x1 + 1) * (y2-y1 + 1)
#order azalan puan sırasına göre sıralanır
order = score.argsort ()
keep =
order.size ise > 0:
i = sipariş
keep.append (i)
# Mevcut dikdörtgen kutunun en büyük olasılıkla ve diğer dikdörtgen kutularla kesişiminin koordinatlarını hesaplayın. Numpy'nin yayın mekanizması bir vektör elde etmek için kullanılacaktır
xx1 = np.maximum (x1 , x1)
yy1 = np.maximum (y1 , y1)
xx2 = np.minimum (x2 , x2)
yy2 = np.minimum (y2 , y2)
# Kesişen kutunun alanını hesaplayın, dikdörtgen kutular kesişmediğinde, w veya h'nin negatif bir sayı olarak hesaplanacağına dikkat edin, bunu 0 ile değiştirin
w = np.maximum (0,0, xx2-xx1 + 1)
h = np.maximum (0,0, yy2-yy1 + 1)
inter = w * h
# Örtüşme IOU derecesini hesaplayın: örtüşme alanı / (alan 1 + alan 2-örtüşme alanı)
ovr = inter / (alanlar + alanlar-arası)
# Örtüşme derecesi eşikten yüksek olmayan dikdörtgen çerçevenin indeksini bulun
inds = np.where (ovr < = harman)
# Sipariş sırasını güncelleyin, çünkü daha önce elde edilen dikdörtgen kutunun dizini, orijinal sıra sırasındaki dikdörtgen kutunun dizininden 1 daha küçüktür, bu nedenle bunu 1 geri ekleyin
sipariş = sipariş
geri dön
# Ölçek
__name__ == "__main__" ise:
dets = np.array ()
eşik = 0.35
keep_dets = py_nms (dets, eşik)
yazdır (keep_dets)
baskı (dets)
Beş, NMS kaybı
Çok kategorili tespit görevleri için, her kategoride ayrı ayrı NMS gerçekleştirilirse, tespit sonucu farklı kategorilerde sınıflandırılmış iki hedef içerdiğinde ve bunların IoU'ları büyük olduğunda, kabul edilemez sonuçlar elde edileceğini belirtmek gerekir. Aşağıda gösterildiği gibi:
İyileştirmenin bir yolu, NMS kaybının bir kısmını kayıp işlevine eklemektir. NMS kaybı, sınıflandırma kaybı ile aynı şekilde tanımlanabilir:
Yani, gerçek sütun tipi u'ya karşılık gelen log kaybı ve p, C kategorilerinin tahmin edilen olasılığıdır. Aslında sınıflandırma hatasını arttırmaya eşdeğerdir.