yolov3为什么对大目标检测不好_各位大佬,我想请教一下目标检测yolov3 有什么优化策略?...

不是大佬。尝试回答一下:

YOLO_v3是基于YOLO、YOLO_v2改进的目标检测网络,主要改进点在调整了网络结构、利用多尺度特征进行对象检测、对象分类用Logistic取代了softmax。

优化YOLO_v3主要可以从两个思路出发:更轻量级更快和更高的准确率和recall。

更轻量级更快更换YOLO_v3的backbone

YOLO_v3的默认backbone网络是darknet53,虽然darknet53计算速度比ResNet-152和ResNet-101快,精度也不差,但是在一些特定的任务和条件下,我们可能不需要darknet53这么高精度的backbone。对于部分场景简单、目标数目少、目标较大的图像的图像我们可以把backbone替换为官方的darknet19或者是一些更轻量级的网络。

本人尝试过将backbone改成Mobilenetv2,在某集显轻薄本上运行demo,虽然没有具体测量指标,但感觉速度尚可。

2. 提升训练速度

一般训练YOLO_v3都是用预训练好的模型进行迁移学习,直接从头训练没必要也太慢。但是直接用下载的预训练模型做微调有个问题,训练一开始就结束了,并能保存出模型。原因是这些网络都是在imagenet上训练过,设置的迭代次数应该是远大于cfg中的max_batch或者其他参数,所以刚开始训练便达到了截止条件。不做fine-tuning,没有好的初始化又很难训练出好模型。所以,重新extract weights提取1~39层darknent19的参数,设置的40大于darknet19的层数就可以,得到的darknet19.conv.40可以做为修改的yolov3-darkent19网络的初始化模型。

/darknet partial cfg/darknet19.cfg darknet19.weights darknet19.conv.40 40模型压缩 模型剪枝、量化、知识蒸馏等等题主都可以尝试一下,应该会有提升。

提升准确率和recall超参数调优

这个老生常谈的东西就不多说了,包括学习率、迭代轮次、earlystopping等等

在召回率和准确率之间平衡 py class YOLO(object): _defaults = { "model_path": 'model_data/yolo.h5', "anchors_path": 'model_data/yolo_anchors.txt', "classes_path": 'model_data/coco_classes.txt', "score" : 0.3, "iou" : 0.45, "model_image_size" : (416, 416), "gpu_num" : 1, } 调整默认设置中的score和iou的阈值,通常你需要较高的精度时,适当提升score;需要高召回率的时候适当降低score,具体的还需自己试验。

调整损失函数

使用专门针对背景的Focal Loss py def focal_loss(out_put,y_true): loss = 0.8*(torch.sigmoid(out_put)) ** 2 * F.binary_cross_entropy_with_logits(1-out_put, 1-y_true, reduction='none')+F.binary_cross_entropy_with_logits((out_put), y_true, reduction='none') return loss 针对一阶段网络前背景分类不平衡问题,使用针对背景加入loss调节因子的focal loss(实验中直接使用原版的focal loss导致mar下降,和yolo作者在论文中讲述一样),使得mar提升。

训练中的trick

根据检测的物体的复杂度,调整网络的复杂度

迭代次数推荐不低于2000 * classes

如果图片里有很多数量的目标物体,那么在.cfg文件中最后的[yolo]层中添加参数max=100或者更高的数

如果想要模型具有尺度的鲁棒性,则必须训练样本中包含多尺度的照片。这是因为YOLO不具有尺度变化的适应性。

可以根据任务的不同修改anchor的大小,但具体怎么改就需要题主自己摸索尝试了

查看我的相关回答:溪亭日暮:汇编 | 我的AI 技术回答​zhuanlan.zhihu.com

Reference

你可能感兴趣的:(yolov3为什么对大目标检测不好_各位大佬,我想请教一下目标检测yolov3 有什么优化策略?...)