目標檢測演算法SSD_訓練自有資料
阿新 • • 發佈:2018-12-27
基於Caffe框架的目標檢測演算法SSD–進行自有資料替換並訓練
主要步驟:
- 標籤資料預處理
- 圖片資料預處理
- 資料及標籤的VOC格式以及LMDB格式轉化
- 網路訓練
- 其他問題分析
1.標籤資料預處理
由於拿到的是YOLOv3格式的訓練集label,不滿足SSD標籤格式。故標籤需要先被轉化成符合要求的輸入格式。
注:YOLOv3標籤格式為(x,y,w,h)。其中x,y為物體框中點橫縱座標表示,w,h為物體框的寬、高。四類資訊資料均被進行了數值歸一化預處理,除以了512(512為圖片大小)。
我們需要調整為滿足SSD資料輸入格式的標籤,保證txt格式的第一行為object_number,第二行五列數值依次為:標識物label序號–Xmin–Ymin–Xmax–Ymax。製作python指令碼進行數值轉換。
#在第一行插入object_number程式
for i in range(612): #612為待處理圖片個數
i+=1
with open(str(i)+'.txt', 'r+') as f:
content = f.read()
f.seek(0, 0)
f.write('0\n'+content)
#座標轉換修改程式
import numpy as np
numbers = 612
for i in xrange(numbers):
f=open(str(i+1)+".txt", "r" )
lines = f.readlines()
length = len(lines)
elements = np.zeros(shape=(length-1,5))
for j in xrange(length-1):
elements[j] = lines[j+1].split()
for k in xrange(4):
elements[j][k+1] = 512*float(elements[j][k+1])
elements[j][1] = elements[j][1] - elements[j][3 ]/2
elements[j][2] = elements[j][2] - elements[j][4]/2
elements[j][3] = elements[j][1] + elements[j][3]
elements[j][4] = elements[j][2] + elements[j][4]
f.close()
f = open(str(i+1)+".txt","w")
f.write('0')
f.close()
f = open(str(i+1)+".txt","a")
for j in xrange(length-1):
f.write('\n')
for k in xrange(5):
if k<4:
element = elements[j][k]
f.write(str(int(element))+' ')
else:
element = elements[j][k]
f.write(str(int(element)))
f.close()
圖片資料預處理
由於拿到的圖片為.png格式,但caffe的voc_to_lmdb過程需要.jpg圖片格式,因此在這裡需要進一步進行圖片轉化。圖片轉化不能借助python指令碼強行修改檔名,要藉助PIL庫進行圖片讀取–儲存,指令碼程式如下:
import Image
i=0
for i in range(612):
i+=1
im = Image.open('/media/y666/00008FEA00024472/man/SSD/caffe/data/VOCdevkit/car/JPEGImages/'+str(i)+'.png')
im.save('/media/y666/00008FEA00024472/man/SSD/caffe/data/VOCdevkit/car/JPEGImages/'+str(i)+'.jpg')
特別說明的是,如果圖片與label檔名為亂序,建議自行修改檔名為以1開頭的自然陣列成(1.jpg\2.jpg\1.txt...),藉助此種方法可以保證在資料集製作的過程中避免因檔名出現的各類錯誤。