Awesome
SSD Train Own Data Tutorial
This tutorial written by Jin Tian, Master in Tsinghua University, if you have any question about this post, contact me via wechat:
jintianiloveu
. Repost is also welcomed, but please remain this copyright info, enjoy :)
Part A Data Orginization
Before we get started, I have say that SSD original source code data orginization is really a mess. If you want train your own data you don't know where to go. But now, I am going change it, reshape it to a simple and clear way. you just clone source code and make it, the rest thing is all about my code, using my code you can sperate caffe-ssd source code from your dataset folder in a more clear way
Part B Get Your Images And Labels
First of all, get your images and labels, I assume that you have 7000 images and same count labels in txt format, orginize them in 2 folder, called Images which contains all images, and Labels which contains all labels. And, most important at all is that, every single image must have same name mapped label txt file, means if you have a image 0001.jpg
you must labeled it in 0001.txt
. And all txt files must in this format:
class_index xmin ymin xmax ymax
It's simple enough! In my way, I place all images inside ~/data/MyDataset/Images
and all my labels in ~/data/MyDataset/Labels
, hopefully please do not change Images
and Labels
folder name, we gonna use it.
Part C Create Your Work Folder
Seperate from caffe-ssd source code directory, you can create a invidual folder named MyDataset
, our all work will compelet in this folder. OK, clone my kitti-ssd
into your's anywhere you like. you can change this folder name as you like(example. face-ssd). Here inside we got this things:
data
models
train_ssd_kitti.py
ok, next we are going work with data
first, because we have to generate lmdb file first.
Part D Create lmdb Database
OK, in this step, we are going put all data into lmdb database., this will generate a lmdb folder inside ~/data/MyDataset
folder which contains KITTI_trainval and KITTI_test data.
cd data
bash create_list.sh
bash create_data.sh
Done! now you get trainval.txt
test.txt
and test_name_size.txt
But you have to get your labelmap_dataset.prototxt, here is suggestion:
if you have 5 classed named the 6th class in name
background
item {
name: "none_of_the_above"
label: 6
display_name: "background"
}
And later in train_ssd.py
you gonna change two value : num_classes
and background_index_id
.
Part E Get VGG Pretrain Model and Start Train SSD
Download VGG pretrain model and place into models/VGGNet
, the everything was done! Just a little change in train_ssd_kitti.py
you can train ssd ready! Here is something you have to change:
sys.path.insert(0, "/home/chenqi-didi/Documents/work/caffe/python")
data_root_dir = "/home/chenqi-didi/data/"
caffe_root = "/home/chenqi-didi/Documents/work/caffe"
train_data = data_root_dir + "KITTI/lmdb/KITTI_trainval_lmdb"
# The database file for testing data. Created by data/KITTI/create_data.sh
test_data = data_root_dir + "KITTI/lmdb/KITTI_test_lmdb"
model_name = "VGG_KITTI_{}".format(job_name)
# Directory which stores the model .prototxt file.
save_dir = "models/VGGNet/KITTI/{}".format(job_name)
# Directory which stores the snapshot of models.
snapshot_dir = "models/VGGNet/KITTI/{}".format(job_name)
# Directory which stores the job script and log file.
job_dir = "jobs/VGGNet/KITTI/{}".format(job_name)
# Directory which stores the detection results.
output_result_dir = "{}/data/KITTI/results/{}/Main".format(os.environ['HOME'], job_name)
label_map_file = "{}/data/labelmap_kitti.prototxt".format(current_dir)
# Defining which GPUs to use.
gpus = "0,1"
Find above code change all KITTI into your dataset name, save it and you are ready to go!
python train_ssd_kitti.py
Finally, For Test Result
got your image path in data, for example data/test2.jpg
and then change ssd_detection.py
file path, then run:
python ssd_detection.py
Here is the result: