SSD训练自己数据集
原理
目标检测|SSD原理与实现
损失函数:(1)类别损失(置信度误差)为softmax loss
(2)位置损失为Smooth L1 Loss
训练
1.数据制作
(1)首先准备img与txt文件夹(图像及标注的txt文件),txt文件夹下的文件均为txt文件,里边的内容为1 2 26 18 70样式,其中1为类别,(2,26)为左上点坐标,(18,70)为右下角坐标。目标检测标注工具初始生成的文件包括xml,xml2txt文件如下。
import os
import re
import json
import shutil
import numpy as np
from PIL import Image
from lxml import etree
import xml.etree.ElementTree as et
from lxml.etree import Element, SubElement, tostring
#class_filters=['person','bicycle','car','motorcycle','bus','train','truck','backpack','umbrella','handbag','cell phone','suitcase','tie']
#class_filters=['person','bicycle','car','motorcycle','bus','truck']
class_filters=['plate']
anno_folder = '/data_2/LYD/plate_detection/train/data/split/test/xml'
trainval_folder = '/data_2/data/yolo3-train-data/weifa_jiance_20190612/yolov3'
if __name__ == '__main__':
for root, dirs, files in os.walk(anno_folder):
for filename in files:
split_name = re.split('\.', filename)
bbox_file = split_name[0] + '.txt'
trainval_file = os.path.join(trainval_folder, bbox_file)
trainval_txt_file_fd = open(trainval_file, 'w')
anno_path = os.path.join(anno_folder, filename)
print 'anno_path = ', anno_path
tree = et.parse(anno_path)
root = tree.getroot()
for obj_size in root.findall('size'):
width = int(obj_size.find('width').text)
height = int(obj_size.find('height').text)
dw = 1.0 / width
dh = 1.0 / height
for obj in root.findall('object'):
obj_name = obj.find('name').text
if obj_name in class_filters:
if obj.find('name').text == 'smallCar':
trainval_txt_file_fd.write(str(0) + ' ')
elif obj.find('name').text == 'car':
trainval_txt_file_fd.write(str(0) + ' ')
elif obj.find('name').text == 'Car':
trainval_txt_file_fd.write(str(0) + ' ')
elif obj.find('name').text == 'xiaoche':
trainval_txt_file_fd.write(str(0) + ' ')
elif obj.find('name').text == 'bigCar':
trainval_txt_file_fd.write(str(1) + ' ')
bndbox = obj.find('bndbox')
xmin = bndbox.find('xmin').text
ymin = bndbox.find('ymin').text
xmax = bndbox.find('xmax').text
ymax =