下载的版本为:https://github.com/pjreddie/darknet.git
根据官网教程下载VOC数据集及权重:https://pjreddie.com/darknet/yolov1/
训练
1. 对cfg/yolov1.cfg做修改:
注释掉Testing的部分,使用Training部分,batch=64,subdivisions=8,否则会出现大量-nan,以及loss不收敛情况
[net]
# Testing
# batch=1
# subdivisions=1
# Training // 使用training部分
batch=64
subdivisions=8
height=448
width=448
channels=3
momentum=0.9
decay=0.0005
saturation=1.5
exposure=1.5
hue=.1
batch=1,-nan情况:
2. 对examples/yolo.c做修改:
相比较yolov2和yolov3,yolov1还没有采用类似 voc.data 的配置文件,故需要在源代码里,修改trainset的路径
void train_yolo(char *cfgfile, char *weightfile)
{
char *train_images = "/data/voc/train.txt"; //修改为train.txt对应路径
char *backup_directory = "/home/pjreddie/backup/"; //训练后得到的权重(weights)的存放地
srand(time(0));
char *base = basecfg(cfgfile);
printf("%s\n", base);
float avg_loss = -1;
network *net = load_network(cfgfile, weightfile, 0);
printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay);
int imgs = net->batch*net->subdivisions;
int i = *net->seen/imgs;
data train, buffer;
3. 开始训练:
./darknet yolo train cfg/yolov1/yolo.train.cfg extraction.conv.weights
使用GPU,CUDA,显卡为GeForce GTX 1080,在VOC数据集完成了对YOLOv1的训练(iter = 40000),IOU普遍在0.69以上,且loss从一开始的15收敛到了2.7左右(忘记保存训练过程了),得到最终权重yolov1_final_weight.weight,训练时间差不多25小时。
训练log(末期):
最终得到的权重进行单张图片检测的精确度不如作者在官网上给的权重高
作者所给权重:
训练所得权重: