孫曉璇,張 磊,李 健
1(中國科學院 計算機網絡信息中心,北京 100190)
2(中國科學院大學 計算機與控制學院,北京 100049)
隨著科技的進步與發展,計算機視覺迅速發展.其中,目標檢測是計算機視覺領域的一個重要分支,它的主要任務是找出圖像中的目標對象的位置信息,判斷目標框中對象的類別,并為檢測到的所有目標在圖像上畫出預測邊框.隨著深度學習相關技術的快速發展,計算機視覺領域也不斷取得突破[1].基于深度學習的目標檢測算法主要分為兩類:一類是RCNN系列,如FastRCNN[2]、FasterRCNN等two-stage方式,另一類是YOLO[3]、SSD[4]等 end-to-end 的 one-stage 方式.與傳統方法[5-9]相比,使用深度學習算法進行目標檢測不僅減少誤檢、漏檢,還更好的適應復雜場景,在檢測速度方面也有較大的提升.針對one-stage方式的算法,如果我們需要訓練目標檢測模型但是沒有現成的數據集,傳統的做法是使用LabelImg等軟件人工標注圖像[10]中目標對象的位置,并標注對象的類別.對于數據集中大量的圖像,制作、處理數據集是繁瑣耗時的工作.除了傳統人工標注的做法外,還可以使用OpenCV閾值過濾的方法[11],通過提取指定灰度值范圍內的部分獲得目標位置,但是這種方式對圖像的要求比較高,如果圖像中的目標對象與背景顏色相近或者背景比較復雜的時候,就難以提取出圖像中的對象.
基于以上原因,本文提出一種方法,通過使用官方提供的已訓練的目標檢測模型,對輸入圖像批量檢測,實現自動定位圖像中的目標物體,記錄物體坐標位置、類別信息作為標簽,以此制作自己的數據集.以YOLOv3算法和SSD算法為例,使用已訓練的目標檢測模型,對數據集中的圖像進行初步的目標檢測,記錄檢測目標在圖像中的位置信息,數據集中圖像的類別是已知的,此時可以為數據集中的圖像生成相應的標簽.這種方法可以幫助我們高效地生成模型訓練所需要的數據集,但是由于已訓練模型的數據集與自己的數據集不同,導致檢測目標定位不夠準確,所以生成的數據集質量不可預估.為了提高數據集質量,本文使用多種不同的深度學習目標檢測算法對自己的數據集進行目標檢測生成標簽,并對檢測結果圖像進行裁剪、縮放操作,再進行圖像相似度的對比,實現高效生成標簽以及篩選符合預期效果圖像的功能.
YOLOv3是一個融合多種先進算法思想構成的目標檢測網絡,通過在COCO和ImageNet數據集上聯合訓練,得到能夠檢測出80種類別物體的模型.YOLOv3采用darknet-19 與 ResNet[12]中殘差思想融合的 darknet-53為網絡主干,網絡兼具ResNet的較高準確率和YOLO系列檢測速度快的特點,同時還避免了網絡深度過深導致梯度消失.此外,YOLOv3 可以在 DarkNet、OpenCV、TensorFlow 等多種框架中實現.本論文中使用基于 DarkNet實現的YOLOv3算法,使用Python和C++兩種語言完成實驗.
YOLOv3運用了類似FPN的思想,將原始圖像縮放到 416×416 大小,然后分別在 13×13、26×26、52×52這3種尺寸的特征圖上做目標檢測,最后融合3個檢測結果,這樣使得YOLOv3在小目標的檢測效果上有所提升.YOLOv3的每一個網格單元使用3個anchor,anchor所在網格在圖像中的相對位置為(cx,cy),每個anchor預測3個邊界框,邊界框的長和寬分別為pw和ph.每個網格單元的每個邊界框產生4個位置預測值(tx,ty,tw,th)和1個置信度.σ指Sigmod函數.

YOLOv3,使用多個獨立的logistics代替Softmax分類器,這樣使每個預測框可以單獨分類,即使是重疊物體,模型也可以檢測出來.
SSD算法與YOLO系列算法相同都是one-stage的算法,都具有檢測速度快的特點.SSD算法融合了Fast-RCNN的anchor思想,同時對每個default box還生成不同橫縱比的候選框,這樣減小了漏檢的可能.SSD算法采用預訓練模型VGG16和額外的卷積層,實現在不同層次的特征圖中進行目標檢測,相當于在不同尺寸的特征圖上多次執行目標檢測,高層特征圖檢測大物體,低層特征圖檢測小物體,最后綜合各層次的檢測結果,可以更準確的識別圖像中的目標物體.SSD算法在不同層次的特征圖上使用更小的卷積核預測,在許多不同橫縱比的defaultbox中,選擇出滿足條件的一些prior box與ground truth box匹配,最終得到預測框,具有比YOLOv3算法更高的精度.但是,SSD和YOLOv3與多數目標檢測算法相同,對小尺寸物體檢測效果不太好.對于prior box等參數需要提前人工設置,而且參數的設置對檢測的結果會產生影響.
COCO[13]是微軟團隊提供的一個可以用來進行圖像識別的數據集.COCO中有80個對象類別和各種場景類型的圖像,現在有3種標注類型:目標實例、目標上的關鍵點、圖像文字描述,可以在目標檢測、實例分割、目標關鍵點追蹤等任務中使用.
ImageNet[14]數據集是用于計算機視覺領域的大型圖像數據庫,數據集有1400多萬張圖圖像,涵蓋2萬多個類別,超過百萬的圖像有明確的類別標注和圖像中物體位置的標注,可以在圖像分類(CLS)、目標定位(LOC)、目標檢測(DET)、視頻目標檢測(VID)等任務中使用.
ILSVRC[14]數據集是ImageNet數據集的子集,ILSVRCCLS-LOC是ImageNet中圖像分類和目標定位的數據集子集,其中包括1000個對象類別.
實驗數據集中只包含圖像,這些圖像均來自網絡及實際工作過程中長期積累的圖像數據.
YOLOv3的數據集包括兩部分:標簽labels和圖像images,其中,labels文件夾中每一個文本文件中存放的是圖像中目標對象的坐標位置信息,每張圖像對應一個txt標簽(目標定位)文件,要求圖像名稱與目標定位的txt標簽文件名稱必須相同,并且labels文件夾和images文件夾在同一個目錄下.YOLOv3.txt標簽文件的數據格式如下:

類別編號中心點x相對坐標中心點y相對坐標目標框相對寬度w目標框相對高度h
當檢測框boundingbox的左下、右上坐標分別為(x1,y1)(x2,y2),圖像的寬和高分別為W,H,此時可以計算:

SSD 的數據集同樣包括標簽和圖像兩部分.JPEGImages文件夾下存放圖像,Annotations文件夾下存放xml格式的標簽文件,并且要求圖像的名稱與標簽的名稱必須一致.SSD算法中,還有一個ImageSets文件夾下的main文件夾中存放test.txt、val.txt、train.txt、trainval.txt 4個文件,這4個文件中分別存放用來測試、驗證、訓練、訓練和驗證的圖像文件的文件名列表.SSD標簽文件格式如下:

類別編號 Xmin坐標 Ymin坐標 Xmax坐標 Ymax坐標

圖1 SSD算法xml標簽文件格式

圖2 圖像與圖1文件對應 (332×500)
然后,將上面的標簽文件處理成xml文件的數據格式如圖1.與圖1對應的圖像如圖2.
但是,xml格式的標簽不能直接在SSD算法中使用,所以需要對標簽文件做處理,將xml格式的標簽文件轉換成TensorFlow統一使用的數據存儲格式——tfrecord格式.tfrecord格式文件主要通過Example數據結構存儲,格式如圖3.
圖像相似度檢測[15]是對多張圖像的內容相似程度進行分析,目前廣泛應用在圖像搜索、圖像過濾、目標識別等領域.圖像相似度對比的方法有很多,包括:SIFT算法[16]、圖像直方圖相似度、哈希的圖像相似度等方法.圖像直方圖方式最簡單,但是圖像轉為直方圖丟失大量信息,誤判概率比較大.SIFT算法復雜,會產生大量SIFT特征向量,但是能夠識別圖像不超過25%的變形.根據實驗的需求,選擇了介于兩者算法性能、復雜度之間的哈希圖像相似度檢測算法.基于哈希的圖像相似度檢測算法包括:均值哈希算法、感知哈希算法和差異值哈希算法.以上三種相似度檢測算法分別適用于不同的應用場景.差異值哈希算法在識別效果方面優于均值哈希算法,不如感知哈希算法,但是在識別速度方面優于感知哈希算法[17].本論文中,采用差異值哈希算法[18],可以在使用較少的時間實現較好的效果.使用差異值哈希算法,首先需要對圖像進行縮放,可以選擇縮放為 8×8、16×16、32×32 不同尺寸的圖像,然后,將圖像灰度化,接下來是對圖像差異值的計算,以縮放尺度9×8(差異值哈希得到8×8的圖像需要縮放成9×8,同樣16×16的需要縮放為17×16)為例,通過分別對9×8圖像的每一行中相鄰的兩個像素進行相減得到每個像素間的差異值,最后得到8×8的圖像哈希值.最終,通過兩張圖像哈希值的漢明距離計算,得到圖像的相似度.

圖3 tfrecord格式
目標檢測數據集自動生成架構及執行流程如圖4所示,分為如下3個階段.
階段一:獲取原始標注圖像.使用基于DarkNet的YOLOv3算法和基于TensorFlow的SSD算法,以及在COCO數據集上訓練的YOLOv3模型和在ILSVRC CLS-LOC數據集預訓練的SSD模型.首先,將原始數據集中的圖像輸入YOLOv3模型,檢測后得到帶boundingbox的圖像和位置坐標文件,然后,對坐標文件進行初篩,丟棄未檢測到目標的圖像.同時,將原始數據集中的圖像輸入到已經訓練好的SSD模型,同上,保留適當的圖像集和位置坐標文件,并且對兩種方式獲得的檢測圖像按照boundingbox進行裁剪.
階段二:圖像相似度比較.利用差異哈希算法,對階段一裁剪后的兩個圖像集中同名的圖像逐一進行相似度檢測,根據相似度結果,按照預先設置的閾值,保留閾值范圍的圖像.
階段三:人工圖像篩查.通過對原始圖像與檢測圖像的縮略圖快速對比,對階段二得到的圖像進行人工篩選,選擇正確的圖像與相應的坐標文件,得到最終的數據集.獲得的數據集,作為將來目標檢測模型訓練的訓練數據集,使新訓練的模型能夠正確分類.對于未檢測到目標的圖像,根據模型在實際場景中是否達到預期效果,決定是否對圖像進行人工標注,加入訓練數據集,增強模型目標檢測的能力.
在SSD算法中,傳統數據集制作需要人工完成:圖像目標框標注、類別標注并生成xml標簽文件、xml文件格式轉換為tfrecord格式等工作.在YOLOv3算法中,傳統數據集制作需要人工完成:圖像目標框標注、類別標注并生成txt文件等步驟.對比本文方法,現在只需要快速簡單的人工篩查即可替代傳統復雜、耗時的工作.使用這種方法生成數據集代替人工標注圖像,不僅加快了標注速度,而且引入相似度對比、人工篩查的步驟,更好的保證了最終數據集的質量.
以基于DarkNet的YOLOv3為例,需要修改網絡結構(.cfg)文件的batch、division等參數存放在cfg中,將指明訓練集/測試集路徑、類別數量、類別名稱等信息的文件存放在data中.
首先,將待生成標簽的圖像輸入到已訓練的模型中,檢測圖像中目標物體的位置,通過在DarkNet中繪制預測框命令前添加命令,將圖片路徑、預測框的相對坐標以及目標框相對寬高寫入文件,輸出的文件格式如圖5(a)所示.然后將圖像的類別編號追加到上述的坐標位置文件中,如圖5(b)所示,坐標位置文件的名稱與圖像名稱一致.

圖4 目標檢測數據集生成架構與流程
然后,使用基于TensorFlow的SSD算法,直接使用SSD[4]論文中提到的在ILSVRC CLS-LOC數據集上預訓練的SSD模型,將待生成標簽的圖像輸入,然后把得到檢測結果中目標框的坐標位置等信息整理成xml格式,最終通過Python腳本生成tfrecord格式標簽.
通過前面兩步,得到兩組檢測結果圖像.最后,對以上兩組結果圖像按照目標框進行裁剪,如圖6和圖7,對比兩組裁剪后圖像的相似度為17.輸入圖像大小對差異值相似度有影響[17],經過對 8×8、16×16、32×32不同尺寸圖像的相似度檢測結果對比,8×8的圖像在減少計算量的同時較好的保留圖像信息.將裁剪后的圖像統一大小為9×8,再計算相似度,根據實驗測試,相似度閾值設置為30,當相似度小于閾值的時候,認為兩張圖像相似,圖像和標簽是有效的.

圖5 (a)圖像路徑和對應圖像的坐標位置(b)坐標文件bing_755_121.txt的內容

圖6 YOLOv3檢測結果裁剪圖

圖7 SSD檢測結果裁剪圖
為了避免大量選取COCO數據集中包括的物種,導致測試準確率虛高.本實驗選擇猴類圖像3797張、鹿類3530張、兔子類2407張、松鼠類2122張、老虎227張以及狼126張,總共選取了約12 000張哺乳類動物的圖像,為其生成標簽.實驗分別選擇:1)單獨使用YOLOv3算法,2)單獨使用SSD算法,3)同時使用YOLOv3和SSD算法以及相似度對比3種方法,為圖像生成標簽.為了實驗結果有對比性,3組實驗使用相同的數據集.具體實驗結果如表1所示.

表1 3種方式生成數據集標簽情況對比
使用YOLOv3+SSD+相似度對比方法時,數據集選擇YOLOv3和SSD中均檢測到對象的圖像集作為數據集.檢測數目為經過相似度篩選后保留的圖像數目.檢測率為圖像檢測數目占圖像數目的比例.檢測準確率為準確圖像占檢測數目的比例.
通過實驗對比,可以直觀的看出,當使用YOLOv3+SSD+相似度對比的方法,不僅在生成數據集的速度上有提升,而且對目標物體檢測的準確率也有一定的提升.但是,這種方法存在不足:篩選圖像的質量依賴相似度閾值的設置,如果閾值設置過小,準確率率提升不明顯,設置過大,導致大量的圖像和標簽被丟棄,最終訓練的數據量變小,所以,此后還需要尋找一種閾值設置的標準和方法.另外,檢測圖像時可能存在兩種算法出現相同錯誤的情況,導致該方法效果下降,所以通過加入人工篩查來克服這個缺點.如果最終數據集過小,可以適當增大閾值的設置,之后通過人工篩選過濾掉不符合要求的圖像.