机器配置:ubuntu1604 nvidia RTX 2070 (8G) mem:16G cuda10 cudnn7.6.5 python3 opencv3.4.6
MobileNet-yolov3 训练自己的数据集: 类别个数:1(车)
一.制作数据集 Pascal voc 格式
Pascal voc简介:
|-----voc2007
| |---Annotations 进行detection 任务时的标签文件,xml文件格式,一般文件名和图片文件名一致. 如:(000001.jpg 000001.xml)
| |---ImageSets/Main/train.txt val.txt train_val.txt test.txt 存放数据集的分割文件,里面内容只有文件名,不包含后缀名. 如:(000001)
| |___JPEGImages 存放.jpg格式的图片文件
我们制作数据集只需用到上面三个文件夹.以下示例为在MobileNet-YOLO中操作的,可自行更改
(1):准备图片并重命名
cd /home/sx/worksoft/MobileNet-YOLO/data/VOCdevkit/
按照如下格式重新建立Pascal Voc格式目录,我的目录名字叫作VOCCar1
|-----VOCCar1
| |---Annotations
| |---ImageSets/Main
| |___JPEGImages
将所有的图片放到JPEGImages中,为了方便,名字统一用6位数字表示, 如:000000.jpg 000001.jpg ... 000100.jpg
python3代码: python3 Rename_file.py
#!/usr/bin/env python3
# -*- coding utf-8 -*-
import os
import shutil
def copy_rename_file(srcpath, dstpath):
index = 0
for root, dirs, files in os.walk(srcpath):
for name in files:
oldpath = root + '/' + name
newname = str(index).zfill(6)+ '.jpg'
newpath = dstpath + '/' + newname
shutil.copy(oldpath, newpath)
index += 1
srcpath = '/home/sx/worksoft/MobileNet-YOLO/data/VOCdevkit/VOCCar1/JPEGImages' #Change1 图片路径
dstpath = '/home/sx/worksoft/MobileNet-YOLO/data/VOCdevkit/VOCCar1/tmp' #Change2 保存新的重命名后的图片路径
copy_rename_file(srcpath, dstpath)
(2):LabelImg标记图片生成xml文件
git clone https://github.com/tzutalin/labelImg.git
使用labelImg 打开JPEGImages,选择voc格式,会在JPEGImages图片目录下生成对应的xml文件,将这些xml文件全部存放到Annotations下
(3):划分训练集和测试集
python3代码: python3 ImageSets_Convert.py
#!/usr/bin/env python3
# -*- coding utf-8 -*-
import os
import random
import time
#总共需要修改六个路径:Change1 2 3 4 5 6,分别已经标出
xmlfilepath=r'/home/sx/worksoft/MobileNet-YOLO/data/VOCdevkit/VOCCar1/Annotations/' #Change1 xml路径(相对路径和绝对路径都可以)
saveBasePath=r"/home/sx/worksoft/MobileNet-YOLO/data/VOCdevkit/" #Change2 VOCCar1文件夹的路径(相对路径和绝对路径都可以)
#xmlfilepath=r'./VOCCar1/Annotations/'
#saveBasePath=r"./"
trainval_percent=0.8
train_percent=0.85
total_xml = os.listdir(xmlfilepath)
num=len(total_xml)
list=range(num)
tv=int(num*trainval_percent)
tr=int(tv*train_percent)
trainval= random.sample(list,tv)
train=random.sample(trainval,tr)
print("train and val size",tv)
print("traub suze",tr)
ftrainval = open(os.path.join(saveBasePath,'VOCCar1/ImageSets/Main/trainval.txt'), 'w') #Change3 将VOCCar1 换成自己的文件夹名字
ftest = open(os.path.join(saveBasePath,'VOCCar1/ImageSets/Main/test.txt'), 'w') #Change4 将VOCCar1 换成自己的文件夹名字
ftrain = open(os.path.join(saveBasePath,'VOCCar1/ImageSets/Main/train.txt'), 'w') #Change5 将VOCCar1 换成自己的文件夹名字
fval = open(os.path.join(saveBasePath,'VOCCar1/ImageSets/Main/val.txt'), 'w') #Change6 将VOCCar1 换成自己的文件夹名字
# Start time
start = time.time()
for i in list:
name=total_xml[i][:-4]+'\n'
if i in trainval:
ftrainval.write(name)
if i in train:
ftrain.write(name)
else:
fval.write(name)
else:
ftest.write(name)
# End time
end = time.time()
seconds=end-start
print( "Time taken : {0} seconds".format(seconds))
ftrainval.close()
ftrain.close()
fval.close()
ftest .close()
制作Voc格式数据集完毕!
二:使用caffe的脚本将训练集和测试集生成lmdb文件
(1)首先在caffe根目录下的data目录下创建一个名为 VOCCar1 的目录:
cd /home/sx/worksoft/MobileNet-YOLO/data
mkdir VOCCar1
cp ./VOC0712/create_list.sh ./VOCCar1
cp ./VOC0712/create_data.sh ./VOCCar1
cp ./VOC0712/labelmap_voc.prototxt ./VOCCar1
(2)修改create_list.sh,生成训练测试图片的列表
cd /home/sx/worksoft/MobileNet-YOLO/data/VOCCar1
vim create_list.sh
#3处需要修改的地方 Change1 2 3
#!/bin/bash
root_dir="/home/sx/worksoft/MobileNet-YOLO/data/VOCdevkit" #Change1 修改为第一步数据集VOCCar1所在的目录,相对绝对路径都可以
#root_dir="../VOCdevkit" #Change1 修改为第一步数据集VOCCar1所在的目录,相对绝对路径都可以
sub_dir=ImageSets/Main
bash_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
for dataset in trainval test
do
dst_file=$bash_dir/$dataset.txt
if [ -f $dst_file ]
then
rm -f $dst_file
fi
for name in VOCCar1 #Change2 修改为自己的目录的名称
do
#Change3 注意下面这一段要注释掉
# if [[ $dataset == "test" && $name == "VOCCar1" ]]
# then
# continue
# fi
echo "Create list for $name $dataset..."
dataset_file=$root_dir/$name/$sub_dir/$dataset.txt
img_file=$bash_dir/$dataset"_img.txt"
cp $dataset_file $img_file
sed -i "s/^/$name\/JPEGImages\//g" $img_file
sed -i "s/$/.jpg/g" $img_file
label_file=$bash_dir/$dataset"_label.txt"
cp $dataset_file $label_file
sed -i "s/^/$name\/Annotations\//g" $label_file
sed -i "s/$/.xml/g" $label_file
paste -d' ' $img_file $label_file >> $dst_file
rm -f $label_file
rm -f $img_file
done
# Generate image name and size infomation.
if [ $dataset == "test" ]
then
$bash_dir/../../build/tools/get_image_size $root_dir $dst_file $bash_dir/$dataset"_name_size.txt"
fi
# Shuffle trainval file.
if [ $dataset == "trainval" ]
then
rand_file=$dst_file.random
cat $dst_file | perl -MList::Util=shuffle -e 'print shuffle(<STDIN>);' > $rand_file
mv $rand_file $dst_file
fi
done
(3)修改create_data.sh,生成训练测试图片的lmdb文件
cd /home/sx/worksoft/MobileNet-YOLO/data/VOCCar1
vim create_data.sh
#2处需要修改的地方,Change1 2
cur_dir=$(cd $( dirname ${BASH_SOURCE[0]} ) && pwd )
root_dir=$cur_dir/../.. #即caffe根目录,/home/sx/worksoft/MobileNet-YOLO
cd $root_