1.标记数据集
通过labelimg标记数据
2.在script下创建目录结构
mkdir -p scripts/VOCdevkit/VOC2007
cd scripts/VOCdevkit/VOC2007
mkdir ImageSets
cd ImageSets
mkdir Layout Main Segmentation
----------------------------
scripts
-----------------------------
VOCdevkit
VOC20007
ImageSets
Layout
Main
Segmentation
---------------------------
3.
在VOC2007内创建Image和xml保存图片和标记
在VOC2007内创建Annotations和JPEGImages保存标记和图片
在VPC2007内创建traindata.py和trans.py
修改traindata.py中验证集数量val_num,推荐为总数据集的30%,修改trans.py中的sets和classes
4.先后运行traindata.py和trans.py
5.
将生成的trainImageID.txt和validateImageID.txt拷贝到ImageSets的Main目录下,
并分别重命名为train.txt和val.txt,
删除执行traindata.py和trans.py生成的所有文件和文件夹以及xml和Image文件夹
6.回到scripts文件夹
修改voc_label.py,修改sets和classes的值,并将最后的两行
os.system("cat 2007_train.txt 2007_val.txt 2012_train.txt 2012_val.txt > train.txt")
os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt 2012_train.txt 2012_val.txt > train.all.txt")
改成
os.system("cat 2007_train.txt 2007_val.txt > train.txt")
# os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt 2012_train.txt 2012_val.txt > train.all.txt")
执行
python3 voc_label.py
7.修改三处配置文件
A. 修改data/voc.names
B.修改cfg/yolov3-tiny.cfg
[net]
# Testing
# batch=1
# subdivisions=1
# Training
batch=64
subdivisions=2
######################
batch=64
subdivisions=2
width=52
height=52
#根据显存调节这几个
#################
#每一个yolo层和其前面的卷积曾都要修改
[convolutional]
filters=18 # 改成3*(classes + 5),我这是分类一类只
[yolo]
classes=1
random=0 # 显存不够改成0
C.修改cfg/voc.data
classes= 1 # 实际需要识别的类
train = /home/ubuntu/darknet/scripts/2007_train.txt # 指向刚刚生成的文件2007_train.txt
valid = /home/ubuntu/darknet/scripts/2007_val.txt # 指向刚刚生成的文件2007_val.txt
names = data/voc.names
backup = backup
D.修改examples/!!!!!这一部分修改完要再进行编译
否则显示的是coco.name的标签
detector.c部分覆盖
void validate_detector_flip(char *datacfg, char *cfgfile, char *weightfile, char *outfile)
{
int j;
list *options = read_data_cfg(datacfg);
char *valid_images = option_find_str(options, "valid", "data/train.list");
// char *name_list = option_find_str(options, "names", "data/names.list");
char *name_list = option_find_str(options, "names", "data/voc.names");
char *prefix = option_find_str(options, "results", "results");
char **names = get_labels(name_list);
char *mapf = option_find_str(options, "map", 0);
int *map = 0;
if (mapf) map = read_map(mapf);
darknet.c部分覆盖
float thresh = find_float_arg(argc, argv, "-thresh", .5);
char *filename = (argc > 4) ? argv[4]: 0;
char *outfile = find_char_arg(argc, argv, "-out", 0);
int fullscreen = find_arg(argc, argv, "-fullscreen");
// test_detector("cfg/coco.data", argv[2], argv[3], filename, thresh, .5, outfile, fullscreen);
test_detector("cfg/voc.data", argv[2], argv[3], filename, thresh, .5, outfile, fullscreen);
} else if (0 == strcmp(argv[1], "cifar")){
run_cifar(argc, argv);
8.训练
./darknet detector train cfg/voc.data cfg/yolov3-tiny.cfg