前言
說到AI專題,像我之前的經驗只是套模型、跑輸出,頂多看了網路上的教學了解原理,就以為自己準備好了。殊不知這等級只是AI學門皮毛上的毛細胞而已。有太多細節是我們在套模時不會去想到的,這陣子跟著lab的課題實際操練了一輪後,才豁然開朗。AI的運作並不是完全的黑盒子,有更多部分是我們人為設計的處理,將AI的輸出去蕪存菁,最終才顯示出我們預期的答案。
之所以挑選Non Maximum Suppression (NMS)作為這次筆記主題,主要是因為它讓我印象深刻,之前一直都以為Object detection模型跑完就只會輸出一個bounding box作為答案。而實際上模型是一次輸出好幾百個、幾千個答案,我們需要設計一個後處理(Post process)管線去剃除掉多餘的答案。 再來,由於專題是使用polygon在做處理,而pytorch涵式庫好像只提供bbox格式的nms方法,所以我實作了一個Polygon用的nms。
Post Process流程
模型的輸出結果如下圖左邊,其中充斥著許多雜訊,我們需要透過一連串的過濾,最終顯示如圖右邊那樣。
一個簡單的post process動作如下圖,需移除標記為背景的物件、太小的box、分數太低的box,最後做個nms將box合併。
Non Maximum Suppression (NMS)
nms的目的是將重疊的box做合併。合併的規則是先計算重疊box的區域面積比(iou),當多個box重疊面積超過閥值,則保留分數較高的那個box。
圖:
Selecting the Right Bounding Box Using Non-Max Suppression (with implementation) (analyticsvidhya.com)
處理概念
已知模型輸出的是n個polygon資料,為了方便我們比較iou,可以先展開n*n的矩陣去裝各個polygon對應的iou。
有了iou matrix之後,用where函數找出大於閥值的值的index。 因為目標matrix是二維的,where返回的是一個含有兩個陣列的tuple,分別代表縱軸跟橫軸的index。我們將它重新組合成一個n*2維的陣列,第一欄代表row的index、第二欄代表column的index。
使用:
美觀大方的程式就出來了。