YOLOv7进行车辆检测问题总结

YOLOv7进行车辆检测问题总结

一.解决训练过程中precision较低,recall较高

image-20230805211839205

1.分析

  • FN很小(recall高),FP很大(precision低)
  • 是否存在一个问题:即分类器无法准确分类车辆导致精度降低?即训练130个epoch也无法提升精度

将car定义为正例,其他类型的车辆定义为反例。那么如果分类器将大部分的其他车辆识别为car,且能正确识别大部分car则有可能出现该问题。检查配置文件后发现配置文件中车辆标签并没有和训练文件中车辆标签相对应,但修改后依旧没解决该问题。

  • 根据混淆矩阵来看,最大问题是将大部分车辆识别为背景,即无法准确分类或者说将车辆识别成背景
confusion_matrix
  • 在图片中预测若干框,但并不包含实际车辆,导致FP假正例很高,降低了precision;同时预测框包含了大部分groud truth,所以FN假反例较小使得recall较高。

2.最终解决办法:增加正样本数量进行训练。结果如下所示

 Epoch   gpu_mem       box       obj       cls     total    labels  img_size
   196/199     22.5G    0.0104  0.006842 0.0002334   0.01747       274       640: 100%|████████████████████████████████████████████| 1310/1310 [14:06<00:00,  1.55it/s]
               Class      Images      Labels           P           R      mAP@.5  mAP@.5:.95: 100%|████████████████████████████████████| 89/89 [00:35<00:00,  2.54it/s]
                 all        5640       67265       0.726       0.675       0.698       0.541

     Epoch   gpu_mem       box       obj       cls     total    labels  img_size
   197/199     22.5G   0.01038  0.006812 0.0002365   0.01742       239       640: 100%|████████████████████████████████████████████| 1310/1310 [14:11<00:00,  1.54it/s]
               Class      Images      Labels           P           R      mAP@.5  mAP@.5:.95: 100%|████████████████████████████████████| 89/89 [00:34<00:00,  2.55it/s]
                 all        5640       67265       0.736       0.667       0.699       0.541

     Epoch   gpu_mem       box       obj       cls     total    labels  img_size
   198/199     22.5G   0.01042  0.006907 0.0002431   0.01757       254       640: 100%|████████████████████████████████████████████| 1310/1310 [14:07<00:00,  1.55it/s]
               Class      Images      Labels           P           R      mAP@.5  mAP@.5:.95: 100%|████████████████████████████████████| 89/89 [00:35<00:00,  2.51it/s]
                 all        5640       67265       0.726       0.674       0.699       0.541

     Epoch   gpu_mem       box       obj       cls     total    labels  img_size
   199/199     22.5G   0.01035  0.006799 0.0002365   0.01739       218       640: 100%|████████████████████████████████████████████| 1310/1310 [14:07<00:00,  1.55it/s]
               Class      Images      Labels           P           R      mAP@.5  mAP@.5:.95: 100%|████████████████████████████████████| 89/89 [00:47<00:00,  1.87it/s]
                 all        5640       67265        0.73        0.67       0.698        0.54
                 car        5640       54774       0.775        0.76       0.797         0.6
                 van        5640        3789       0.668       0.561       0.583       0.456
                 bus        5640        7001       0.732       0.867        0.85       0.677
              others        5640        1701       0.746       0.493       0.562       0.429
30 epochs completed in 7.307 hours.

Optimizer stripped from runs/train/exp11/weights/last.pt, 74.8MB
Optimizer stripped from runs/train/exp11/weights/best.pt, 74.8MB

3.网上相关解决方法

1.没有惩罚https://www.dazhuanlan.com/testmytest/topics/1143660
""" calc the noobj mask ~ """
if train_classifier == 'True':
    noobj_mask = tf.logical_not(obj_mask)
else:
    noobj_mask = calc_noobj_mask(true_xy, true_wh, pred_xy, pred_wh, obj_mask, iou_thresh=iou_thresh, helper=helper)

obj_mask表示有物体落在特征图中某一个cell的索引,所以在初始化的时候置0,如果有物体落在那个cell中,那个对应的位置会置1

开始训练xy_loss,wh_loss时,那么noobj_mask就需要通过预测出来的boxground truth box计算iou来筛选.

当我可以拟合box之后,那么也就是说如果其他的cell预测出来的boxground truth boxiou大于iou_threshold之后,那么这个cell我就不会将他设置为noobj cell,同时也不会对这个cell进行惩罚措施.

没有对预测boxtrue boxiou大于iou_threshold进行惩罚,所以我们的(false positive)会增加,(false negative)会减少.最终导致precision减少,recall增加.

2.调低nms_topkhttps://github.com/wizyoung/YOLOv3_TensorFlow/issues/152
nms_topk=150  # keep at most nms_topk outputs after nms.

二.安卓部署无法读取权重

相关代码ncnn-android-yolov7

1.结构差异

本次部署使用的是自己所训练的YOLOv7-tiny权重,使用netron打开发现和官方权重最后的输出不相同,如图。

image-20230806162955366

参考文章https://blog.csdn.net/qq_43268106/article/details/127139216后得知可直接取训练权重的Convolution层,在yolo.cpp的Yolo::detect修改。将in0,out0,out1,out2修改为自己训练权重中输入和最后三个Convolution层的名称。

2.文件名修改

做出上述修改后,同步完成打包成apk,却发现检测界面没有出现检测框,检查后发现无法读取权重。查阅很多文章以后都没能解决该问题,甚至重新编译ncnn对训练权重进行格式转换也不能达到目的。

最后解决办法是将自己训练权重名改为yolov7-tiny.bin和yolov7-tiny.param,如图

image-20230806164442128

p.s. 按照Yolo::load函数中来看,应该可以直接读取assets下的权重文件且和命名没关系,但不知道是不是哪里有问题或者我对代码理解有误,但修改完文件名后顺利出现检测框。

char parampath[256];
char modelpath[256];
sprintf(parampath, "%s.param", modeltype);
sprintf(modelpath, "%s.bin", modeltype);

yolo.load_param(parampath);
yolo.load_model(modelpath);

image-20230806165108934

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值