Git Product home page Git Product logo

yolov4-tiny-keras's Introduction

YOLOV4-Tiny:You Only Look Once-Tiny目标检测模型在Keras当中的实现


目录

  1. 仓库更新 Top News
  2. 相关仓库 Related code
  3. 性能情况 Performance
  4. 所需环境 Environment
  5. 文件下载 Download
  6. 训练步骤 How2train
  7. 预测步骤 How2predict
  8. 评估步骤 How2eval
  9. 参考资料 Reference

Top News

2022-04:支持多GPU训练,新增各个种类目标数量计算,新增heatmap。

2022-03:进行了大幅度的更新,修改了loss组成,使得分类、目标、回归loss的比例合适、支持step、cos学习率下降法、支持adam、sgd优化器选择、支持学习率根据batch_size自适应调整、新增图片裁剪。
BiliBili视频中的原仓库地址为:https://github.com/bubbliiiing/yolov4-tiny-keras/tree/bilibili

2021-10:进行了大幅度的更新,增加了大量注释、增加了大量可调整参数、对代码的组成模块进行修改、增加fps、视频预测、批量预测等功能。

相关仓库

模型 路径
YoloV3 https://github.com/bubbliiiing/yolo3-keras
Efficientnet-Yolo3 https://github.com/bubbliiiing/efficientnet-yolo3-keras
YoloV4 https://github.com/bubbliiiing/yolov4-keras
YoloV4-tiny https://github.com/bubbliiiing/yolov4-tiny-keras
Mobilenet-Yolov4 https://github.com/bubbliiiing/mobilenet-yolov4-keras
YoloV5-V5.0 https://github.com/bubbliiiing/yolov5-keras
YoloV5-V6.1 https://github.com/bubbliiiing/yolov5-v6.1-keras
YoloX https://github.com/bubbliiiing/yolox-keras
YoloV7 https://github.com/bubbliiiing/yolov7-keras
Yolov7-tiny https://github.com/bubbliiiing/yolov7-tiny-keras

性能情况

训练数据集 权值文件名称 测试数据集 输入图片大小 mAP 0.5:0.95 mAP 0.5
VOC07+12+COCO yolov4_tiny_weights_voc.h5 VOC-Test07 416x416 - 77.5
VOC07+12+COCO yolov4_tiny_weights_voc_SE.h5 VOC-Test07 416x416 - 78.6
VOC07+12+COCO yolov4_tiny_weights_voc_CBAM.h5 VOC-Test07 416x416 - 78.9
VOC07+12+COCO yolov4_tiny_weights_voc_ECA.h5 VOC-Test07 416x416 - 78.2
COCO-Train2017 yolov4_tiny_weights_coco.h5 COCO-Val2017 416x416 21.8 41.3

所需环境

tensorflow-gpu==1.13.1
keras==2.1.5

文件下载

训练所需的各类权值均可在百度网盘中下载。
链接: https://pan.baidu.com/s/1f9VXWsi4fcYEkEO2YPQKIw
提取码: i2ut

VOC数据集下载地址如下,里面已经包括了训练集、测试集、验证集(与测试集一样),无需再次划分:
链接: https://pan.baidu.com/s/19Mw2u_df_nBzsC2lg20fQA
提取码: j5ge

训练步骤

a、训练VOC07+12数据集

  1. 数据集的准备
    本文使用VOC格式进行训练,训练前需要下载好VOC07+12的数据集,解压后放在根目录

  2. 数据集的处理
    修改voc_annotation.py里面的annotation_mode=2,运行voc_annotation.py生成根目录下的2007_train.txt和2007_val.txt。

  3. 开始网络训练
    train.py的默认参数用于训练VOC数据集,直接运行train.py即可开始训练。

  4. 训练结果预测
    训练结果预测需要用到两个文件,分别是yolo.py和predict.py。我们首先需要去yolo.py里面修改model_path以及classes_path,这两个参数必须要修改。
    model_path指向训练好的权值文件,在logs文件夹里。
    classes_path指向检测类别所对应的txt。

    完成修改后就可以运行predict.py进行检测了。运行后输入图片路径即可检测。

b、训练自己的数据集

  1. 数据集的准备
    本文使用VOC格式进行训练,训练前需要自己制作好数据集,
    训练前将标签文件放在VOCdevkit文件夹下的VOC2007文件夹下的Annotation中。
    训练前将图片文件放在VOCdevkit文件夹下的VOC2007文件夹下的JPEGImages中。

  2. 数据集的处理
    在完成数据集的摆放之后,我们需要利用voc_annotation.py获得训练用的2007_train.txt和2007_val.txt。
    修改voc_annotation.py里面的参数。第一次训练可以仅修改classes_path,classes_path用于指向检测类别所对应的txt。
    训练自己的数据集时,可以自己建立一个cls_classes.txt,里面写自己所需要区分的类别。
    model_data/cls_classes.txt文件内容为:

cat
dog
...

修改voc_annotation.py中的classes_path,使其对应cls_classes.txt,并运行voc_annotation.py。

  1. 开始网络训练
    训练的参数较多,均在train.py中,大家可以在下载库后仔细看注释,其中最重要的部分依然是train.py里的classes_path。
    classes_path用于指向检测类别所对应的txt,这个txt和voc_annotation.py里面的txt一样!训练自己的数据集必须要修改!
    修改完classes_path后就可以运行train.py开始训练了,在训练多个epoch后,权值会生成在logs文件夹中。

  2. 训练结果预测
    训练结果预测需要用到两个文件,分别是yolo.py和predict.py。在yolo.py里面修改model_path以及classes_path。
    model_path指向训练好的权值文件,在logs文件夹里。
    classes_path指向检测类别所对应的txt。

    完成修改后就可以运行predict.py进行检测了。运行后输入图片路径即可检测。

预测步骤

a、使用预训练权重

  1. 下载完库后解压,在百度网盘下载yolo_weights.pth,放入model_data,运行predict.py,输入
img/street.jpg
  1. 在predict.py里面进行设置可以进行fps测试和video视频检测。

b、使用自己训练的权重

  1. 按照训练步骤训练。
  2. 在yolo.py文件里面,在如下部分修改model_path和classes_path使其对应训练好的文件;model_path对应logs文件夹下面的权值文件,classes_path是model_path对应分的类
_defaults = {
    #--------------------------------------------------------------------------#
    #   使用自己训练好的模型进行预测一定要修改model_path和classes_path!
    #   model_path指向logs文件夹下的权值文件,classes_path指向model_data下的txt
    #   如果出现shape不匹配,同时要注意训练时的model_path和classes_path参数的修改
    #--------------------------------------------------------------------------#
    "model_path"        : 'model_data/yolov4_tiny_weights_coco.h5',
    "classes_path"      : 'model_data/coco_classes.txt',
    #---------------------------------------------------------------------#
    #   anchors_path代表先验框对应的txt文件,一般不修改。
    #   anchors_mask用于帮助代码找到对应的先验框,一般不修改。
    #---------------------------------------------------------------------#
    "anchors_path"      : 'model_data/yolo_anchors.txt',
    "anchors_mask"      : [[3,4,5], [1,2,3]],
    #-------------------------------#
    #   所使用的注意力机制的类型
    #   phi = 0为不使用注意力机制
    #   phi = 1为SE
    #   phi = 2为CBAM
    #   phi = 3为ECA
    #-------------------------------#
    "phi"               : 0,  
    #---------------------------------------------------------------------#
    #   输入图片的大小,必须为32的倍数。
    #---------------------------------------------------------------------#
    "input_shape"       : [416, 416],
    #---------------------------------------------------------------------#
    #   只有得分大于置信度的预测框会被保留下来
    #---------------------------------------------------------------------#
    "confidence"        : 0.5,
    #---------------------------------------------------------------------#
    #   非极大抑制所用到的nms_iou大小
    #---------------------------------------------------------------------#
    "nms_iou"           : 0.3,
    "max_boxes"         : 100,
    #---------------------------------------------------------------------#
    #   该变量用于控制是否使用letterbox_image对输入图像进行不失真的resize,
    #   在多次测试后,发现关闭letterbox_image直接resize的效果更好
    #---------------------------------------------------------------------#
    "letterbox_image"   : False,
}
  1. 运行predict.py,输入
img/street.jpg
  1. 在predict.py里面进行设置可以进行fps测试和video视频检测。

评估步骤

a、评估VOC07+12的测试集

  1. 本文使用VOC格式进行评估。VOC07+12已经划分好了测试集,无需利用voc_annotation.py生成ImageSets文件夹下的txt。
  2. 在yolo.py里面修改model_path以及classes_path。model_path指向训练好的权值文件,在logs文件夹里。classes_path指向检测类别所对应的txt。
  3. 运行get_map.py即可获得评估结果,评估结果会保存在map_out文件夹中。

b、评估自己的数据集

  1. 本文使用VOC格式进行评估。
  2. 如果在训练前已经运行过voc_annotation.py文件,代码会自动将数据集划分成训练集、验证集和测试集。如果想要修改测试集的比例,可以修改voc_annotation.py文件下的trainval_percent。trainval_percent用于指定(训练集+验证集)与测试集的比例,默认情况下 (训练集+验证集):测试集 = 9:1。train_percent用于指定(训练集+验证集)中训练集与验证集的比例,默认情况下 训练集:验证集 = 9:1。
  3. 利用voc_annotation.py划分测试集后,前往get_map.py文件修改classes_path,classes_path用于指向检测类别所对应的txt,这个txt和训练时的txt一样。评估自己的数据集必须要修改。
  4. 在yolo.py里面修改model_path以及classes_path。model_path指向训练好的权值文件,在logs文件夹里。classes_path指向检测类别所对应的txt。
  5. 运行get_map.py即可获得评估结果,评估结果会保存在map_out文件夹中。

Reference

https://github.com/qqwweee/keras-yolo3
https://github.com/eriklindernoren/PyTorch-YOLOv3
https://github.com/BobLiu20/YOLOv3_PyTorch

yolov4-tiny-keras's People

Contributors

bubbliiiing avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

yolov4-tiny-keras's Issues

data_generator的anchor好像有点错误

在计算anchor和true_box的iou时(train.py文件第107行开始),用到了归一化的true_boxes尺寸(在train.py的81和82行),但是anchor却没有进行归一化就与true_box进行的iou计算,从而来判断true_box属于哪个anchor,这肯定是有问题的,一个数值很大,一个只有0-1范围,从而导致anchor不能正确匹配,我是在单步调试过程中发现。不知道up主怎样认为

关于训练时终止代码

cpu训练时发现训练时间太长,请问可以在loss接近收敛时提前终止代码运行吗,这时候已经训练的模型参数会不会丢失

utils.py第113行是不是有误

第113行:place_y = [0,int(hmin_offset_y),int(wmin_offset_y),0],这里是不是有误,w应该改成h。masaic处理依次粘贴图片代码中体现的是按左上,左下,右下,右上顺序,这里的第三个数据应该是右下角图片的纵坐标,应该是int(h*min_offset_y)。

Exception has occurred: ValueError a must be greater than 0 unless no samples are taken

单独跑kmeans_for_anchors.py 报错如下
Exception has occurred: ValueError
a must be greater than 0 unless no samples are taken
File "C:\Users\10407\Desktop\kmeans.py", line 161, in kmeans
cluster = box[np.random.choice(row, k, replace = False)]
File "C:\Users\10407\Desktop\kmeans.py", line 247, in
cluster, near = kmeans(data, anchors_num)
ValueError: a must be greater than 0 unless no samples are taken
vocdevkit路径已经按照说明配置好,求指点

train.py 的81/82行似乎有误

    true_boxes[..., 0:2] = boxes_xy/input_shape[:]
    true_boxes[..., 2:4] = boxes_wh/input_shape[:]

应该是

    true_boxes[..., 0:2] = boxes_xy/input_shape[::-1]
    true_boxes[..., 2:4] = boxes_wh/input_shape[::-1]

input_shape排序是(h, w),对应上box的xy和wh的话,应该反一下;通常训练正方形数据时无所谓,但在在训练宽高不一致的数据时会溢出

fps为什么只有50多

我用作者的这个训练的安全帽和人检测,摄像头实时检测的fps只有50左右,这是为什么呢

维度问题

老师您好,我在训练时出现如下错误, 请问该如何解决?

Traceback (most recent call last):
File "train.py", line 191, in
arguments={'anchors': anchors, 'num_classes': num_classes, 'ignore_thresh': 0.5, 'label_smoothing': label_smoothing})(loss_input)
File "/home/hg100/python3.6/lib/python3.6/site-packages/keras/engine/topology.py", line 619, in call
output = self.call(inputs, **kwargs)
File "/home/hg100/python3.6/lib/python3.6/site-packages/keras/layers/core.py", line 663, in call
return self.function(inputs, **arguments)
File "/home/hg100/yolo_train/yolov4-tiny-keras/nets/loss.py", line 163, in yolo_loss
ciou = box_ciou(pred_box, raw_true_box)
File "/home/hg100/yolo_train/yolov4-tiny-keras/nets/ious.py", line 28, in box_ciou
intersect_mins = K.maximum(b1_mins, b2_mins)
File "/home/hg100/python3.6/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py", line 1657, in maximum
return tf.maximum(x, y)
File "/home/hg100/python3.6/lib/python3.6/site-packages/tensorflow/python/ops/gen_math_ops.py", line 5491, in maximum
"Maximum", x=x, y=y, name=name)
File "/home/hg100/python3.6/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py", line 788, in _apply_op_helper
op_def=op_def)
File "/home/hg100/python3.6/lib/python3.6/site-packages/tensorflow/python/util/deprecation.py", line 507, in new_func
return func(*args, **kwargs)
File "/home/hg100/python3.6/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 3300, in create_op
op_def=op_def)
File "/home/hg100/python3.6/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 1823, in init
control_input_ops)
File "/home/hg100/python3.6/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 1662, in _create_c_op
raise ValueError(str(e))
ValueError: Dimensions must be equal, but are 3 and 4 for 'yolo_loss/Maximum' (op: 'Maximum') with input shapes: [?,?,?,3,2], [?,26,26,4,2].

关于anchor_mask的一个问题

你好up主,之前看过你视频提到tiny-yolov4的anchor_mask是对编号1,2,3,3,4,5这几个anchor进行提取,其中编号3重复使用了两次,但是你没有说原因。在我详读代码过程中我发现这视乎有点小问题,比如在train.py文件72行,使用了这种方法获得anchor_mask,但是在107--116行计算真实框和哪个先验框最契合这个步骤中是对整个anchors进行比对,也就是说编号0的anchor也是算在内的,但是在118--129行,特别是第120行来对box匹配anchor时,由于anchor_mask选取问题并没有考虑到编号为0的情况,因此这部分box在训练中应该是被省略了。通过修改,我训练了我自己的数据集发现修改了anchor_mask后模型效果确实有提升,并且视乎对小目标预测效果更好。

mAP on COCO17 test-dev?

I saw in your table the mAP 21.8 is on COCO17 val. But in the paper, it reports mAP 21.7% on COCO17 test-dev. Did you try do evaluation on test-dev to see the gap?

ValueError: Expected a symbolic Tensors or a callable for the loss value. Please wrap your loss computation in a zero argument `lambda`.

訓練時遇到以下錯誤
請問有相關經驗嗎
謝謝

Traceback (most recent call last):
File "train.py", line 311, in
layer.add_loss(l2(weight_decay)(layer.kernel))
File "D:\python37\lib\site-packages\keras\engine\base_layer.py", line 1585, in add_loss
'Expected a symbolic Tensors or a callable for the loss value. '
ValueError: Expected a symbolic Tensors or a callable for the loss value. Please wrap your loss computation in a zero argument lambda.


RTX3080
CUDA11.2
TENSORFLOW 2.8.0
KERAS 2.8.0

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.