seresnet50训练自己的数据集_SSD框架训练自己的数据集

本文详细介绍了如何使用SSD在VOC数据集基础上训练和验证自定义数据集。首先,讲解了数据集的标注过程,推荐使用BBox-Label-Tool进行多标签标注。接着,描述了数据集转换的步骤。然后,阐述了如何使用SSD进行训练,并测试模型。文章还提供了对BBox-Label-Tool的使用说明,包括其功能和修改后的特性。
摘要由CSDN通过智能技术生成

SSD demo中详细介绍了如何在VOC数据集上使用SSD进行物体检测的训练和验证。

本文介绍如何使用SSD实现对自己数据集的训练和验证过程,内容包括:

1 数据集的标注

2 数据集的转换

3 使用SSD如何训练

4 使用SSD如何测试

1 数据集的标注

数据的标注使用BBox-Label-Tool工具,该工具使用python实现,使用简单方便。修改后的工具支持多label的标签标注。

该工具生成的标签格式是:

object_number

className x1min y1min x1max y1max

classname x2min y2min x2max y2max

...

1.1 labelTool工具的使用说明

BBox-Label-Tool工具实现较简单,原始的git版本使用起来有一些小问题,进行了简单的修改,修改后的版本

#-------------------------------------------------------------------------------

# Name: Object bounding box label tool

# Purpose: Label object bboxes for ImageNet Detection data

# Author: Qiushi

# Created: 06/06/2014

#

#-------------------------------------------------------------------------------

from __future__ import division

from Tkinter import *

import tkMessageBox

from PIL import Image, ImageTk

import os

import glob

import random

# colors for the bboxes

COLORS = ['red', 'blue', 'yellow', 'pink', 'cyan', 'green', 'black']

# image sizes for the examples

SIZE = 256, 256

classLabels=['mat', 'door', 'sofa', 'chair', 'table', 'bed', 'ashcan', 'shoe']

class LabelTool():

def __init__(self, master):

# set up the main frame

self.parent = master

self.parent.title("LabelTool")

self.frame = Frame(self.parent)

self.frame.pack(fill=BOTH, expand=1)

self.parent.resizable(width = False, height = False)

# initialize global state

self.imageDir = ''

self.imageList= []

self.egDir = ''

self.egList = []

self.outDir = ''

self.cur = 0

self.total = 0

self.category = 0

self.imagename = ''

self.labelfilename = ''

self.tkimg = None

# initialize mouse state

self.STATE = {}

self.STATE['click'] = 0

self.STATE['x'], self.STATE['y'] = 0, 0

# reference to bbox

self.bboxIdList = []

self.bboxId = None

self.bboxList = []

self.hl = None

self.vl = None

self.currentClass = ''

# ----------------- GUI stuff ---------------------

# dir entry & load

self.label = Label(self.frame, text = "Image Dir:")

self.label.grid(row = 0, column = 0, sticky = E)

self.entry = Entry(self.frame)

self.entry.grid(row = 0, column = 1, sticky = W+E)

self.ldBtn = Button(self.frame, text = "Load", command = self.loadDir)

self.ldBtn.grid(row = 0, column = 2, sticky = W+E)

# main panel for labeling

self.mainPanel = Canvas(self.frame, cursor='tcross')

self.mainPanel.bind("", self.mouseClick)

self.mainPanel.bind("", self.mouseMove)

self.parent.bind("", self.cancelBBox) # press to cancel current bbox

self.parent.bind("s", self.cancelBBox)

self.parent.bind("a", self.prevImage) # press 'a' to go backforward

self.parent.bind("d", self.nextImage) # press 'd' to go forward

self.mainPanel.grid(row = 1, column = 1, rowspan = 4, sticky = W+N)

# showing bbox info & delete bbox

self.lb1 = Label(self.frame, text = 'Bounding boxes:')

self.lb1.grid(row = 1, column = 2, sticky = W+N)

self.listbox = Listbox(self.frame, width = 22, height = 12)

self.listbox.grid(row = 2, column = 2, sticky = N)

self.btnDel = Button(self.frame, text = 'Delete', command = self.delBBox)

self.btnDel.grid(row = 3, column = 2, sticky = W+E+N)

self.btnClear = Button(self.frame, text = 'ClearAll', command = self.clearBBox)

self.btnClear.grid(row = 4, column = 2, sticky = W+E+N)

#select class type

self.classPanel = Frame(self.frame)

self.classPanel.grid(row = 5, column = 1, columnspan = 10, sticky = W+E)

label = Label(self.classPanel, text = 'class:')

label.grid(row = 5, column = 1, sticky = W+N)

self.classbox = Listbox(self.classPanel, width = 4, height = 2)

self.classbox.grid(row = 5,column = 2)

for each in range(len(classLabels)):

function = 'select' + classLabels[each]

print classLabels[each]

btnMat = Button(self.classPanel, text = classLabels[each], command = getattr(self, function))

btnMat.grid(row = 5, column = each + 3)

# control panel for image navigation

self.ctrPanel = Frame(self.frame)

self.ctrPanel.grid(row = 6, column = 1, columnspan = 2, sticky = W+E)

self.prevBtn = Button(self.ctrPanel, text='<< Prev', width = 10, command = self.prevImage)

self.prevBtn.pack(side = LEFT, padx = 5, pady = 3)

self.nextBtn = Button(self.ctrPanel, text='Next >>', width = 10, command = self.nextImage)

self.nextBtn.pack(side = LEFT, padx = 5, pady = 3)

self.progLabel = Label(self.ctrPanel, text = "Progress: / ")

self.progLabel.pack(side = LEFT, padx = 5)

self.tmpLabel = Label(self.ctrPanel, text = "Go to Image No.")

self.tmpLabel.pack(side = LEFT, padx = 5)

self.idxEntry = Entry(self.ctrPanel, width = 5)

self.idxEntry.pack(side = LEFT)

self.goBtn = Button(self.ctrPanel, text = 'Go', command = self.gotoImage)

self.goBtn.pack(side = LEFT)

# example pannel for illustration

self.egPanel = Frame(self.frame, border = 10)

self.egPanel.grid(row = 1, column = 0, rowspan = 5, sticky = N)

self.tmpLabel2 = Label(self.egPanel, text = "Examples:")

self.tmpLabel2.pack(side = TOP, pady = 5)

self.egLabels = []

for i in range(3):

self.egLabels.append(Label(self.egPanel))

self.egLabels[-1].pack(side = TOP)

# display mouse position

self.disp = Label(self.ctrPanel, text='')

self.disp.pack(side = RIGHT)

self.frame.columnconfigure(1, weight = 1)

self.frame.rowconfigure(10, weight = 1)

# for debugging

## self.setImage()

## self.loadDir()

def loadDir(self, dbg = False):

if not dbg:

s = self.entry.get()

self.parent.focus()

self.category = int(s)

else:

s = r'D:\workspace\python\labelGUI'

## if not os.path.isdir(s):

## tkMessageBox.showerror("Error!", message = "The specified dir doesn't exist!")

## return

# get image list

self.imageDir = os.path.join(r'./Images', '%d' %(self.category))

self.imageList = glob.glob(os.path.join(self.imageDir, '*.jpg'))

if len(self.imageList) == 0:

print 'No .JPEG images found in the specified dir!'

return

# set up output dir

self.outDir = os.path.join(r'./Labels', '%d' %(self.category))

if not os.path.exists(self.outDir):

os.mkdir(self.outDir)

labeledPicList = glob.glob(os.path.join(self.outDir, '*.txt'))

for label in labeledPicList:

data = open(label, 'r')

if '0\n' == data.read():

data.close()

continue

data.close()

picture = label.replace('Labels', 'Images').replace('.txt', '.jpg')

if picture in self.imageList:

self.imageList.remove(picture)

# default to the 1st image in the collection

self.cur = 1

self.total = len(self.imageList)

self.loadImage()

print '%d images loaded from %s' %(self.total, s)

def loadImage(self):

# load image

imagepath = self.imageList[self.cur - 1]

self.img = Image.open(imagepath)

self.imgSize = self.img.size

self.tkimg = ImageTk.PhotoImage(self.img)

self.mainPanel.config(width = max(self.tkimg.width(), 400), height = max(self.tkimg.height(), 400))

self.mainPanel.create_image(0, 0, image = self.tkimg, anchor=NW)

self.progLabel.config(text = "%04d/%04d" %(self.cur, self.total))

# load labels

self.clearBBox()

self.imagename = os.path.split(imagepath)[-1].split('.')[0]

labelname = self.imagename + '.txt'

self.labelfilename = os.path.join(self.outDir, labelname)

bbox_cnt = 0

if os.path.exists(self.labelfilename):

with open(self.labelfilename) as f:

for (i, line) in enumerate(f):

if i == 0:

bbox_cnt = int(line.strip())

continue

tmp = [int(t.strip()) for t in line.split()]

## print tmp

self.bboxList.append(tuple(tmp))

tmpId = self.mainPanel.create_rectangle(tmp[0], tmp[1], \

tmp[2], tmp[3], \

width = 2, \

outline = COLORS[(len(self.bboxList)-1) % len(COLORS)])

self.bboxIdList.append(tmpId)

self.listbox.insert(END, '(%d, %d) -> (%d, %d)' %(tmp[0], tmp[1], tmp[2], tmp[3]))

self.listbox.itemconfig(len(self.bboxIdList) - 1, fg = COLORS[(len(self.bboxIdList) - 1) % len(COLORS)])

def saveImage(self):

with open(self.labelfilename, 'w') as f:

f.write('%d\n' %len(self.bboxList))

for bbox in self.bboxList:

f.write(' '.join(map(str, bbox)) + '\n')

print 'Image No. %d saved' %(self.cur)

def mouseClick(self, event):

if self.STATE['click'] == 0:

self.STATE['x'], self.STATE['y'] = event.x, event.y

#self.STATE['x'], self.STATE['y'] = self.imgSize[0], self.imgSize[1]

else:

x1, x2 = min(self.STATE['x'], event.x), max(self.STATE['x'], event.x)

y1, y2 = min(self.STATE['y'], event.y), max(self.STATE['y'], event.y)

if x2 > self.imgSize[0]:

x2 = self.imgSize[0]

if y2 > self.imgSize[1]:

y2 = self.imgSize[1]

self.bboxList.append((self.currentClass, x1, y1, x2, y2))

self.bboxIdList.append(self.bboxId)

self.bboxId = None

self.listbox.insert(END, '(%d, %d) -> (%d, %d)' %(x1, y1, x2, y2))

self.listbox.itemconfig(len(self.bboxIdList) - 1, fg = COLORS[(len(self.bboxIdList) - 1) % len(COLORS)])

self.STATE['click'] = 1 - self.STATE['click']

def mouseMove(self, event):

self.disp.config(text = 'x: %d, y: %d' %(event.x, event.y))

if self.tkimg:

if self.hl:

self.mainPanel.delete(self.hl)

self.hl = self.mainPanel.create_line(0, event.y, self.tkimg.width(), event.y, width = 2)

if self.vl:

self.mainPanel.delete(self.vl)

self.vl = self.mainPanel.create_line(event.x, 0, event.x, self.tkimg.height(), width = 2)

if 1 == self.STATE['click']:

if self.bboxId:

self.mainPanel.delete(self.bboxId)

self.bboxId = self.mainPanel.create_rectangle(self.STATE['x'], self.STATE['y'], \

event.x, event.y, \

width = 2, \

outline = COLORS[len(self.bboxList) % len(COLORS)])

def cancelBBox(self, event):

if 1 == self.STATE['click']:

if self.bboxId:

self.mainPanel.delete(self.bboxId)

self.bboxId = None

self.STATE['click'] = 0

def delBBox(self):

sel = self.listbox.curselection()

if len(sel) != 1 :

return

idx = int(sel[0])

self.mainPanel.delete(self.bboxIdList[idx])

self.bboxIdList.pop(idx)

self.bboxList.pop(idx)

self.listbox.delete(idx)

def clearBBox(self):

for idx in range(len(self.bboxIdList)):

self.mainPanel.delete(self.bboxIdList[idx])

self.listbox.delete(0, len(self.bboxList))

self.bboxIdList = []

self.bboxList = []

def selectmat(self):

self.currentClass = 'mat'

self.classbox.delete(0,END)

self.classbox.insert(0, 'mat')

self.classbox.itemconfig(0,fg = COLORS[0])

def selectdoor(self):

self.currentClass = 'door'

self.classbox.delete(0,END)

self.classbox.insert(0, 'door')

self.classbox.itemconfig(0,fg = COLORS[0])

def selectsofa(self):

self.currentClass = 'sofa'

self.classbox.delete(0,END)

self.classbox.insert(0, 'sofa')

self.classbox.itemconfig(0,fg = COLORS[0])

def selectchair(self):

self.currentClass = 'chair'

self.classbox.delete(0,END)

self.classbox.insert(0, 'chair')

self.classbox.itemconfig(0,fg = COLORS[0])

def selecttable(self):

self.currentClass = 'table'

self.classbox.delete(0,END)

self.classbox.insert(0, 'table')

self.classbox.itemconfig(0,fg = COLORS[0])

def selectbed(self):

self.currentClass = 'bed'

self.classbox.delete(0,END)

self.classbox.insert(0, 'bed')

self.classbox.itemconfig(0,fg = COLORS[0])

def selectashcan(self):

self.currentClass = 'ashcan'

self.classbox.delete(0,END)

self.classbox.insert(0, 'ashcan')

self.classbox.itemconfig(0,fg = COLORS[0])

def selectshoe(self):

self.currentClass = 'shoe'

self.classbox.delete(0,END)

self.classbox.insert(0, 'shoe')

self.classbox.itemconfig(0,fg = COLORS[0])

def prevImage(self, event = None):

self.saveImage()

if self.cur > 1:

self.cur -= 1

self.loadImage()

def nextImage(self, event = None):

self.saveImage()

if self.cur < self.total:

self.cur += 1

self.loadImage()

def gotoImage(self):

idx = int(self.idxEntry.get())

if 1 <= idx and idx <= self.total:

self.saveImage()

self.cur = idx

self.loadImage()

## def setImage(self, imagepath = r'test2.png'):

## self.img = Image.open(imagepath)

## self.tkimg = ImageTk.PhotoImage(self.img)

## self.mainPanel.config(width = self.tkimg.width())

## self.mainPanel.config(height = self.tkimg.height())

## self.mainPanel.create_image(0, 0, image = self.tkimg, anchor=NW)

if __name__ == '__main__':

root = Tk()

tool = LabelTool(root)

root.mainloop()

main.py

使用方法:

(1) 在BBox-Label-Tool/Images目录下创建保存图片的目录, 目录以数字命名(BBox-Label-Tool/Images/1),然后将待标注的图片copy到1这个目录下;

(2) 在BBox-Label-Tool目录下执行命令   python main.py

(3) 在工具界面上, Image Dir 框中输入需要标记的目录名(比如 1), 然后点击load按钮, 工具自动将Images/1目录下的图片加载进来;

需要说明一下, 如果目录中的图片已经标注过,点击load时不会被重新加载进来.

(4) 该工具支持多类别标注, 画bounding boxs框标定之前,需要先选定类别,然后再画框.

(5) 一张图片标注完后, 点击Next>>按钮, 标注下一张图片,  图片label成功后,会在BBox-Label-Tool/Labels对应的目录下生成与图片文件名对应的label文件.

2 数据集的转换

caffe训练使用LMDB格式的数据,ssd框架中提供了voc数据格式转换成LMDB格式的脚本。

所以实践中先将BBox-Label-Tool标注的数据转换成voc数据格式,然后再转换成LMDB格式。

2.1 voc数据格式

aaarticlea/png;base64,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" alt="" name="Image1" width="532" height="72" align="left" border="0" />

(1)Annotations中保存的是xml格式的label信息

VOC2007

1.jpg

My Database

VOC2007

flickr

NULL

NULL

idaneel

320

240

3

0

door

Unspecified

0

0

109

3

199

204

VOC XML内容信息

aaarticlea/png;base64,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值