目標檢測|SSD原理與實現

2021-01-20 機器學習研究組訂閱
前言

目標檢測近年來已經取得了很重要的進展,主流的算法主要分為兩個類型(參考RefineDet):(1)two-stage方法,如R-CNN系算法,其主要思路是先通過啟發式方法(selective search)或者CNN網絡(RPN)產生一系列稀疏的候選框,然後對這些候選框進行分類與回歸,two-stage方法的優勢是準確度高;(2)one-stage方法,如Yolo和SSD,其主要思路是均勻地在圖片的不同位置進行密集抽樣,抽樣時可以採用不同尺度和長寬比,然後利用CNN提取特徵後直接進行分類與回歸,整個過程只需要一步,所以其優勢是速度快,但是均勻的密集採樣的一個重要缺點是訓練比較困難,這主要是因為正樣本與負樣本(背景)極其不均衡(參見Focal Loss),導致模型準確度稍低。不同算法的性能如圖1所示,可以看到兩類方法在準確度和速度上的差異。

圖1 不同檢測算法的性能對比

本文講解的是SSD算法,其英文全名是Single Shot MultiBox Detector,名字取得不錯,Single shot指明了SSD算法屬於one-stage方法,MultiBox指明了SSD是多框預測。在上一篇文章中我們已經講了Yolo算法,從圖1也可以看到,SSD算法在準確度和速度(除了SSD512)上都比Yolo要好很多。圖2給出了不同算法的基本框架圖,對於Faster R-CNN,其先通過CNN得到候選框,然後再進行分類與回歸,而Yolo與SSD可以一步到位完成檢測。相比Yolo,SSD採用CNN來直接進行檢測,而不是像Yolo那樣在全連接層之後做檢測。其實採用卷積直接做檢測只是SSD相比Yolo的其中一個不同點,另外還有兩個重要的改變,一是SSD提取了不同尺度的特徵圖來做檢測,大尺度特徵圖(較靠前的特徵圖)可以用來檢測小物體,而小尺度特徵圖(較靠後的特徵圖)用來檢測大物體;二是SSD採用了不同尺度和長寬比的先驗框(Prior boxes, Default boxes,在Faster R-CNN中叫做錨,Anchors)。Yolo算法缺點是難以檢測小目標,而且定位不準,但是這幾點重要改進使得SSD在一定程度上克服這些缺點。下面我們詳細講解SDD算法的原理,並最後給出如何用TensorFlow實現SSD算法。

圖2 不同算法的基本框架圖設計理念

SSD和Yolo一樣都是採用一個CNN網絡來進行檢測,但是卻採用了多尺度的特徵圖,其基本架構如圖3所示。下面將SSD核心設計理念總結為以下三點:

圖3 SSD基本框架

(1)採用多尺度特徵圖用於檢測

所謂多尺度採用大小不同的特徵圖,CNN網絡一般前面的特徵圖比較大,後面會逐漸採用stride=2的卷積或者pool來降低特徵圖大小,這正如圖3所示,一個比較大的特徵圖和一個比較小的特徵圖,它們都用來做檢測。這樣做的好處是比較大的特徵圖來用來檢測相對較小的目標,而小的特徵圖負責檢測大目標,如圖4所示,8x8的特徵圖可以劃分更多的單元,但是其每個單元的先驗框尺度比較小。

圖4 不同尺度的特徵圖

(2)採用卷積進行檢測

與Yolo最後採用全連接層不同,SSD直接採用卷積對不同的特徵圖來進行提取檢測結果。對於形狀為 

(3)設置先驗框

在Yolo中,每個單元預測多個邊界框,但是其都是相對這個單元本身(正方塊),但是真實目標的形狀是多變的,Yolo需要在訓練過程中自適應目標的形狀。而SSD借鑑了Faster R-CNN中anchor的理念,每個單元設置尺度或者長寬比不同的先驗框,預測的邊界框(bounding boxes)是以這些先驗框為基準的,在一定程度上減少訓練難度。一般情況下,每個單元會設置多個先驗框,其尺度和長寬比存在差異,如圖5所示,可以看到每個單元使用了4個不同的先驗框,圖片中貓和狗分別採用最適合它們形狀的先驗框來進行訓練,後面會詳細講解訓練過程中的先驗框匹配原則。

圖5 SSD的先驗框

SSD的檢測值也與Yolo不太一樣。對於每個單元的每個先驗框,其都輸出一套獨立的檢測值,對應一個邊界框,主要分為兩個部分。第一部分是各個類別的置信度或者評分,值得注意的是SSD將背景也當做了一個特殊的類別,如果檢測目標共有 

習慣上,我們稱上面這個過程為邊界框的編碼(encode),預測時,你需要反向這個過程,即進行解碼(decode),從預測值 

然而,在SSD的Caffe源碼實現中還有trick,那就是設置variance超參數來調整檢測值,通過bool參數variance_encoded_in_target來控制兩種模式,當其為True時,表示variance被包含在預測值中,就是上面那種情況。但是如果是False(大部分採用這種方式,訓練更容易?),就需要手動設置超參數variance,用來對 

綜上所述,對於一個大小 

網絡結構

SSD採用VGG16作為基礎模型,然後在VGG16的基礎上新增了卷積層來獲得更多的特徵圖以用於檢測。SSD的網絡結構如圖5所示。上面是SSD模型,下面是Yolo模型,可以明顯看到SSD利用了多尺度的特徵圖做檢測。模型的輸入圖片大小是 

圖5 SSD網絡結構

採用VGG16做基礎模型,首先VGG16是在ILSVRC CLS-LOC數據集預訓練。然後借鑑了DeepLab-LargeFOV,分別將VGG16的全連接層fc6和fc7轉換成 

圖6 擴展卷積

然後移除dropout層和fc8層,並新增一系列卷積層,在檢測數據集上做finetuing。

其中VGG16中的Conv4_3層將作為用於檢測的第一個特徵圖。conv4_3層特徵圖大小是 

# l2norm (not bacth norm, spatial normalization)def l2norm(x, scale, trainable=True, scope="L2Normalization"):    n_channels = x.get_shape().as_list()[-1]    l2_norm = tf.nn.l2_normalize(x, [3], epsilon=1e-12)    with tf.variable_scope(scope):        gamma = tf.get_variable("gamma", shape=[n_channels, ], dtype=tf.float32,                                initializer=tf.constant_initializer(scale),                                trainable=trainable)        return l2_norm * gamma

從後面新增的卷積層中提取Conv7,Conv8_2,Conv9_2,Conv10_2,Conv11_2作為檢測所用的特徵圖,加上Conv4_3層,共提取了6個特徵圖,其大小分別是 ,但是不同特徵圖設置的先驗框數目不同(同一個特徵圖上每個單元設置的先驗框是相同的,這裡的數目指的是一個單元的先驗框數目)。先驗框的設置,包括尺度(或者說大小)和長寬比兩個方面。對於先驗框的尺度,其遵守一個線性遞增規則:隨著特徵圖大小降低,先驗框尺度線性增加:

其中 

默認情況下,每個特徵圖會有一個 

得到了特徵圖之後,需要對特徵圖進行卷積得到檢測結果,圖7給出了一個 

圖7 基於卷積得到檢測結果訓練過程

(1)先驗框匹配
在訓練過程中,首先要確定訓練圖片中的ground truth(真實目標)與哪個先驗框來進行匹配,與之匹配的先驗框所對應的邊界框將負責預測它。在Yolo中,ground truth的中心落在哪個單元格,該單元格中與其IOU最大的邊界框負責預測它。但是在SSD中卻完全不一樣,SSD的先驗框與ground truth的匹配原則主要有兩點。首先,對於圖片中每個ground truth,找到與其IOU最大的先驗框,該先驗框與其匹配,這樣,可以保證每個ground truth一定與某個先驗框匹配。通常稱與ground truth匹配的先驗框為正樣本(其實應該是先驗框對應的預測box,不過由於是一一對應的就這樣稱呼了),反之,若一個先驗框沒有與任何ground truth進行匹配,那麼該先驗框只能與背景匹配,就是負樣本。一個圖片中ground truth是非常少的, 而先驗框卻很多,如果僅按第一個原則匹配,很多先驗框會是負樣本,正負樣本極其不平衡,所以需要第二個原則。第二個原則是:對於剩餘的未匹配先驗框,若某個ground truth的 

圖8 先驗框匹配示意圖

儘管一個ground truth可以與多個先驗框匹配,但是ground truth相對先驗框還是太少了,所以負樣本相對正樣本會很多。為了保證正負樣本儘量平衡,SSD採用了hard negative mining,就是對負樣本進行抽樣,抽樣時按照置信度誤差(預測背景的置信度越小,誤差越大)進行降序排列,選取誤差的較大的top-k作為訓練的負樣本,以保證正負樣本比例接近1:3。

(2)損失函數
訓練樣本確定了,然後就是損失函數了。損失函數定義為位置誤差(locatization loss, loc)與置信度誤差(confidence loss, conf)的加權和:

其中 

由於 

對於置信度誤差,其採用softmax loss:

權重係數 

(3)數據擴增

採用數據擴增(Data Augmentation)可以提升SSD的性能,主要採用的技術有水平翻轉(horizontal flip),隨機裁剪加顏色扭曲(random crop & color distortion),隨機採集塊域(Randomly sample a patch)(獲取小目標訓練樣本),如下圖所示:

圖9 數據擴增方案

其它的訓練細節如學習速率的選擇詳見論文,這裡不再贅述。

預測過程

預測過程比較簡單,對於每個預測框,首先根據類別置信度確定其類別(置信度最大者)與置信度值,並過濾掉屬於背景的預測框。然後根據置信度閾值(如0.5)過濾掉閾值較低的預測框。對於留下的預測框進行解碼,根據先驗框得到其真實的位置參數(解碼後一般還需要做clip,防止預測框位置超出圖片)。解碼之後,一般需要根據置信度進行降序排列,然後僅保留top-k(如400)個預測框。最後就是進行NMS算法,過濾掉那些重疊度較大的預測框。最後剩餘的預測框就是檢測結果了。

性能評估

首先整體看一下SSD在VOC2007,VOC2012及COCO數據集上的性能,如表1所示。相比之下,SSD512的性能會更好一些。加*的表示使用了image expansion data augmentation(通過zoom out來創造小的訓練樣本)技巧來提升SSD在小目標上的檢測效果,所以性能會有所提升。

表1 SSD在不同數據集上的性能

SSD與其它檢測算法的對比結果(在VOC2007數據集)如表2所示,基本可以看到,SSD與Faster R-CNN有同樣的準確度,並且與Yolo具有同樣較快地檢測速度。

表2 SSD與其它檢測算法的對比結果(在VOC2007數據集)

文章還對SSD的各個trick做了更為細緻的分析,表3為不同的trick組合對SSD的性能影響,從表中可以得出如下結論:

表3 不同的trick組合對SSD的性能影響

同樣的,採用多尺度的特徵圖用於檢測也是至關重要的,這可以從表4中看出:

表4 多尺度特徵圖對SSD的影響TensorFlow上的實現

SSD在很多框架上都有了開源的實現,這裡基於balancap的TensorFlow版本來實現SSD的Inference過程。這裡實現的是SSD300,與paper裡面不同的是,這裡採用 

self.ssd_params = SSDParams(img_shape=(300, 300),   # 輸入圖片大小                                    num_classes=21,     # 類別數+背景                                    no_annotation_label=21,                                    feat_layers=["block4", "block7", "block8", "block9", "block10", "block11"],   # 要進行檢測的特徵圖name                                    feat_shapes=[(38, 38), (19, 19), (10, 10), (5, 5), (3, 3), (1, 1)],  # 特徵圖大小                                    anchor_size_bounds=[0.15, 0.90],  # 特徵圖尺度範圍                                    anchor_sizes=[(21., 45.),                                                  (45., 99.),                                                  (99., 153.),                                                  (153., 207.),                                                  (207., 261.),                                                  (261., 315.)],  # 不同特徵圖的先驗框尺度(第一個值是s_k,第2個值是s_k+1)                                    anchor_ratios=[[2, .5],                                                   [2, .5, 3, 1. / 3],                                                   [2, .5, 3, 1. / 3],                                                   [2, .5, 3, 1. / 3],                                                   [2, .5],                                                   [2, .5]], # 特徵圖先驗框所採用的長寬比(每個特徵圖都有2個正方形先驗框)                                    anchor_steps=[8, 16, 32, 64, 100, 300],  # 特徵圖的單元大小                                    anchor_offset=0.5,                       # 偏移值,確定先驗框中心                                    normalizations=[20, -1, -1, -1, -1, -1],  # l2 norm                                    prior_scaling=[0.1, 0.1, 0.2, 0.2]       # variance                                    )

然後構建整個網絡,注意對於stride=2的conv不要使用TF自帶的padding="same",而是手動pad,這是為了與Caffe一致:

def _built_net(self):        """Construct the SSD net"""        self.end_points = {}  # record the detection layers output        self._images = tf.placeholder(tf.float32, shape=[None, self.ssd_params.img_shape[0],                                                        self.ssd_params.img_shape[1], 3])        with tf.variable_scope("ssd_300_vgg"):            # original vgg layers            # block 1            net = conv2d(self._images, 64, 3, scope="conv1_1")            net = conv2d(net, 64, 3, scope="conv1_2")            self.end_points["block1"] = net            net = max_pool2d(net, 2, scope="pool1")            # block 2            net = conv2d(net, 128, 3, scope="conv2_1")            net = conv2d(net, 128, 3, scope="conv2_2")            self.end_points["block2"] = net            net = max_pool2d(net, 2, scope="pool2")            # block 3            net = conv2d(net, 256, 3, scope="conv3_1")            net = conv2d(net, 256, 3, scope="conv3_2")            net = conv2d(net, 256, 3, scope="conv3_3")            self.end_points["block3"] = net            net = max_pool2d(net, 2, scope="pool3")            # block 4            net = conv2d(net, 512, 3, scope="conv4_1")            net = conv2d(net, 512, 3, scope="conv4_2")            net = conv2d(net, 512, 3, scope="conv4_3")            self.end_points["block4"] = net            net = max_pool2d(net, 2, scope="pool4")            # block 5            net = conv2d(net, 512, 3, scope="conv5_1")            net = conv2d(net, 512, 3, scope="conv5_2")            net = conv2d(net, 512, 3, scope="conv5_3")            self.end_points["block5"] = net            print(net)            net = max_pool2d(net, 3, stride=1, scope="pool5")            print(net)
# additional SSD layers # block 6: use dilate conv net = conv2d(net, 1024, 3, dilation_rate=6, scope="conv6") self.end_points["block6"] = net #net = dropout(net, is_training=self.is_training) # block 7 net = conv2d(net, 1024, 1, scope="conv7") self.end_points["block7"] = net # block 8 net = conv2d(net, 256, 1, scope="conv8_1x1") net = conv2d(pad2d(net, 1), 512, 3, stride=2, scope="conv8_3x3", padding="valid") self.end_points["block8"] = net # block 9 net = conv2d(net, 128, 1, scope="conv9_1x1") net = conv2d(pad2d(net, 1), 256, 3, stride=2, scope="conv9_3x3", padding="valid") self.end_points["block9"] = net # block 10 net = conv2d(net, 128, 1, scope="conv10_1x1") net = conv2d(net, 256, 3, scope="conv10_3x3", padding="valid") self.end_points["block10"] = net # block 11 net = conv2d(net, 128, 1, scope="conv11_1x1") net = conv2d(net, 256, 3, scope="conv11_3x3", padding="valid") self.end_points["block11"] = net
# class and location predictions predictions = [] logits = [] locations = [] for i, layer in enumerate(self.ssd_params.feat_layers): cls, loc = ssd_multibox_layer(self.end_points[layer], self.ssd_params.num_classes, self.ssd_params.anchor_sizes[i], self.ssd_params.anchor_ratios[i], self.ssd_params.normalizations[i], scope=layer+"_box") predictions.append(tf.nn.softmax(cls)) logits.append(cls) locations.append(loc) return predictions, logits, locations

對於特徵圖的檢測,這裡單獨定義了一個組合層ssd_multibox_layer,其主要是對特徵圖進行兩次卷積,分別得到類別置信度與邊界框位置:

# multibox layer: get class and location predicitions from detection layer    def ssd_multibox_layer(x, num_classes, sizes, ratios, normalization=-1, scope="multibox"):        pre_shape = x.get_shape().as_list()[1:-1]        pre_shape = [-1] + pre_shape        with tf.variable_scope(scope):            # l2 norm            if normalization > 0:                x = l2norm(x, normalization)                print(x)            # numbers of anchors            n_anchors = len(sizes) + len(ratios)            # location predictions            loc_pred = conv2d(x, n_anchors*4, 3, activation=None, scope="conv_loc")            loc_pred = tf.reshape(loc_pred, pre_shape + [n_anchors, 4])            # class prediction            cls_pred = conv2d(x, n_anchors*num_classes, 3, activation=None, scope="conv_cls")            cls_pred = tf.reshape(cls_pred, pre_shape + [n_anchors, num_classes])            return cls_pred, loc_pred

對於先驗框,可以基於numpy生成,定義在ssd_anchors.py文件中,結合先驗框與檢測值,對邊界框進行過濾與解碼:

classes, scores, bboxes = self._bboxes_select(predictions, locations)

這裡將得到過濾得到的邊界框,其中classes, scores, bboxes分別表示類別,置信度值以及邊界框位置。

基於訓練好的權重文件在https://pan.baidu.com/s/1snhuTsT下載,這裡對SSD進行測試:

ssd_net = SSD()classes, scores, bboxes = ssd_net.detections()images = ssd_net.images()
sess = tf.Session()# Restore SSD model.ckpt_filename = './ssd_checkpoints/ssd_vgg_300_weights.ckpt'sess.run(tf.global_variables_initializer())saver = tf.train.Saver()saver.restore(sess, ckpt_filename)
img = cv2.imread('./demo/dog.jpg')img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)img_prepocessed = preprocess_image(img) # 預處理圖片,主要是歸一化和resizerclasses, rscores, rbboxes = sess.run([classes, scores, bboxes], feed_dict={images: img_prepocessed})rclasses, rscores, rbboxes = process_bboxes(rclasses, rscores, rbboxes) # 處理預測框,包括clip,sort,nms
plt_bboxes(img, rclasses, rscores, rbboxes) # 繪製檢測結果

詳細的代碼放在GitHub,https://github.com/xiaohu2015/DeepLearning_tutorials/tree/master/ObjectDetections/SSD上了,然後看一下一個自然圖片的檢測效果:

如果你想實現SSD的train過程,你可以參考附錄裡面的Caffe,TensorFlow以及Pytorch實現。

小結

SSD在Yolo的基礎上主要改進了三點:多尺度特徵圖,利用卷積進行檢測,設置先驗框。這使得SSD在準確度上比Yolo更好,而且對於小目標檢測效果也相對好一點。由於很多實現細節都包含在源碼裡面,文中有描述不準或者錯誤的地方在所難免,歡迎交流指正。

參考文獻

1.SSD: Single Shot MultiBox Detector,http://arxiv.org/pdf/1611.10012.pdf)
2.SSD Slide,https://www.cs.unc.edu/~wliu/papers/ssd_eccv2016_slide.pdf
3.SSD Caffe,https://github.com/weiliu89/caffe/tree/ssd
4.SSD TensorFlow,https://github.com/balancap/SSD-Tensorflow
5.SSD Pytorch,https://github.com/amdegroot/ssd.pytorch
6.leonardoaraujosantos Artificial Inteligence online book,https://leonardoaraujosantos.gitbooks.io/artificial-inteligence/content/single-shot-detectors/ssd.html

相關焦點

  • SSD目標檢測
    因為截止到目前目標檢測分為了2種主流框架:Two stages:以Faster RCNN為代表,即RPN網絡先生成proposals目標定位,再對proposals進行classification+bounding box regression完成目標分類。
  • 深度學習「吃雞外掛」——目標檢測 SSD 實驗
    不過這時候一張圖片吸引了我的興趣:網易《荒野行動》的車輛檢測能識別出視頻中的汽車和人,這,不是外掛麼?想到專業制裁 LYB 們的透視掛,這波我很強好吧。為探秘這 「外掛」 效果有多強,那我就來復現這個深度學習界的 「吃雞掛」——SSD 目標檢測。
  • 入門指南:用Python實現實時目標檢測(內附代碼)
    目標檢測 (ObjectDetection) 也是計算機視覺最酷的應用之一,這是不容置疑的事實。現在的CV工具能夠輕鬆地將目標檢測應用於圖片甚至是直播視頻。本文將簡單地展示如何用TensorFlow創建實時目標檢測器。
  • 用PaddlePaddle實現目標檢測任務——Paddle Fluid v1.1深度測評
    為了一探Paddle Fluid 1.1版本究竟做了哪些方面的更新,本次將基於SSD的目標檢測任務來親自測試一下新版PaddlePaddle的表現。因為本文是做目標檢測,所以主要調研了一下圖像方面的模型庫,在此大致介紹一下。
  • 從R-CNN到YOLO,一文帶你了解目標檢測模型(附論文下載)
    大數據文摘作品編譯:Yanruo、小魚這是一份詳細介紹了目標檢測的相關經典論文、學習筆記、和代碼示例的清單,想要入坑目標檢測的同學可以收藏了!在大數據文摘後臺回復「目標檢測」可打包下載全部論文~R-CNNR-CNN是2014年出現的。
  • SSD硬碟是什麼 SSD硬碟價格品牌性能介紹【圖文詳解】
    ssd硬碟作為最近電腦市場的新秀正在逐漸地滲透到我們的生活之中,但是不少都不了解ssd硬碟是什麼?為什麼這麼貴?以及它有哪些優點。下面小編就來給你講解一下ssd硬碟的相關知識。通常來說,ssd硬碟現在都是使用快閃記憶體作為介質的,其原理類似於u盤以及tf存儲卡,但是其可以做到更加快的讀盤速度,另外其在運行時不會發出老式機械硬碟的噪音,並且體型更加小巧。
  • 檢測SSD剩餘壽命 壽終正寢之前還能挽回數據
    下面筆者分享幾種檢測固態硬碟壽命的方法,感興趣的網友,不妨了解下。SSD廠商原有的工具檢測工具有很多種,不同的檢測工具檢測出來的數值會有一點偏差。CrystalDiskInfo軟體自動檢測硬碟以上這兩款檢測軟體算得上是比較準確的了,到了NVMe固態硬碟時代之後,不同硬碟檢測軟體對健康度的檢測結果依然不一樣
  • 5個步驟實現目標檢測
    目標檢測技術是當今計算機視覺領域的發展趨勢。在場景圖像和視頻中,有許多方法被用來檢測物體。在資源和執行時間方面,每種技術都有自己的優勢和局限性。檢測視頻中的物體也需要大量的技術知識和資源。我們將在本任務中使用pixellib庫,該庫使用實例分割檢測對象。我們還將使用預訓練Mask R-CNN模型來識別視頻中看到的物體。在這個實現中,我們將檢測交通視頻中的車輛對象。實例分割實例分割是計算機視覺中的一種技術,它利用圖像分割的方法進行目標檢測。
  • 一文詳解YOLO 2與YOLO 9000目標檢測系統 | 分享總結
    目標檢測首先是目標檢測,目標檢測和圖像分類的不同是圖像分類只需要識別出圖中的物體,而目標檢測需要在圖片中精確找到物體所在位置
  • 使用樹莓派和Python實現目標檢測
    (圖)樹莓派及照相機模塊V2目標檢測模型針對本實驗,我們選擇了以下型號:小型YOLO和SSD MobileNet lite。YOLO(You Only Look Once)是在Darknet上實現的最先進的實時物體檢測系統。先前的檢測系統是重新利用分類器或定位器來執行檢測的,而這些檢測系統將模型應用於多位置和規模的圖像。圖像的高評分區域被視為檢測結果。
  • 使用TF lite 優化 MobileDet 目標檢測模型部署
    該變體可在此處找到(名稱為 ssd_mobiledet_cpu_coco)。如果您基於自己的數據集訓練 MobileDet 目標檢測模型,則此步驟得到的將是您自己的模型檢查點文件。tflite_graph.pb 文件是與 TFLite 運算符集兼容的凍結推理圖,導出自預訓練模型檢查點。model.tflite 文件是從 tflite_graph.pb 凍結圖轉換而來的 TFLite 模型。
  • 從零開始PyTorch項目:YOLO v3目標檢測實現
    機器之心編譯目標檢測是深度學習近期發展過程中受益最多的領域。隨著技術的進步,人們已經開發出了很多用於目標檢測的算法,包括 YOLO、SSD、Mask RCNN 和 RetinaNet。在本教程中,我們將使用 PyTorch 實現基於 YOLO v3 的目標檢測器,後者是一種快速的目標檢測算法。該教程一共有五個部分,本文包含其中的前三部分。
  • 運動目標檢測及兩種常用方法簡介
    運動目標檢測在對視頻或圖像序列進行分析時,運動目標檢測的主要任務是: 判斷視頻圖像序列中每一幀有無對應的前景目標能否將對應的前景目標的特徵提取出來,並將前景目標顯示出來。只有檢測到了前景目標才能對其進行跟蹤與後續的相關分析處理,因此目標檢測是目標跟蹤處理的基礎。
  • Python|運動目標檢測
    常用的運動目標檢測方法——幀差法幀差法將鄰近幀圖像相減濾除圖像中的靜止景物得到運動區域,其對環境的光線變化不敏感並可快速檢測出運動目標,但對於運動物體速度太慢的情況則產生不完整的「空洞」現象,太快又易於生成「拖尾」現象,其之後的補償處理比較複雜。
  • 用Java實現目標檢測 | PyTorch
    這篇來自AWS軟體工程師的投稿,結合實例,詳細介紹了DJL這個為Java開發者設計的深度學習庫:5分鐘,你就能在PyTorch上,用Java實現目標檢測。5分鐘,用Java實現目標檢測文 / 知乎用戶@LankingPyTorch在深度學習領域中的應用日趨廣泛,得益於它獨到的設計。
  • 使用PyTorch實現目標檢測與跟蹤
    本文將展示如何使用預訓練的分類器檢測圖像中的多個對象,並在視頻中跟蹤它們。 圖像中的目標檢測 目標檢測的算法有很多,YOLO跟SSD是現下最流行的算法。在本文中,我們將使用YOLOv3。
  • 用Java實現目標檢測|PyTorch
    這篇來自AWS軟體工程師的投稿,結合實例,詳細介紹了DJL這個為Java開發者設計的深度學習庫:5分鐘,你就能在PyTorch上,用Java實現目標檢測。5分鐘,用Java實現目標檢測文 / 知乎用戶@LankingPyTorch在深度學習領域中的應用日趨廣泛,得益於它獨到的設計。無論是數據的並行處理還是動態計算圖,一切都為Python做出了很多簡化。
  • 人類的第三隻眼——深度學習實現無人機目標檢測
    人工智慧南非機器人公司利用深度學習輕鬆實現無人機圖像目標檢測,通過無人機來檢測房屋建築施工進程。我們都知道在人工智慧的浪潮下,圖像識別、計算機視覺得到高速發展,通常我們熟知的無人機只是用來進行航拍,那除了航拍它還能做些什麼呢?人工智慧+無人機又會產生什麼火花呢?
  • 有限數量的感受野空間會導致目標檢測的誤差減少
    有限數量的感受野空間會導致目標檢測的誤差減少。我們可以通過設計進一步的性能減少策略來減少focalloss下降的幅度,比如adam,momentum或adjustedrelu方法。有限的relu的特徵提取的能力使得層級神經網絡在現有的框架下有能力在預測下降方面取得很大的進步。相比於平均卷積,較小的類平面層擁有更小的特徵維度,以減少噪聲因素造成的影響。
  • 目標檢測中的IOU和CIOU原理講解以及應用(附測試代碼)
    上期講解了目標檢測中的三種數據增強的方法,這期我們講講目標檢測中用來評估對象檢測算法的IOU和CIOU的原理應用以及代碼實現。交並比IOU(Intersection over union)在目標檢測任務中,我們用框框來定位對象,如下圖定位圖片中這個汽車,假設實際框是圖中紅色的框框,你的算法預測給出的是紫色的框框,怎麼判斷你的算法預測的這個框框的效果好壞呢?