Giter Site home page Giter Site logo

yolov4-tiny-pytorch's Introduction

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


目录

  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-pytorch/tree/bilibili

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

相关仓库

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

性能情况

训练数据集 权值文件名称 测试数据集 输入图片大小 mAP 0.5:0.95 mAP 0.5
VOC07+12+COCO yolov4_tiny_weights_voc.pth VOC-Test07 416x416 - 77.8
VOC07+12+COCO yolov4_tiny_weights_voc_SE.pth VOC-Test07 416x416 - 78.4
VOC07+12+COCO yolov4_tiny_weights_voc_CBAM.pth VOC-Test07 416x416 - 78.6
VOC07+12+COCO yolov4_tiny_weights_voc_ECA.pth VOC-Test07 416x416 - 77.6
COCO-Train2017 yolov4_tiny_weights_coco.pth COCO-Val2017 416x416 21.5 41.0

所需环境

torch==1.2.0

文件下载

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

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.pth',
    "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,
    #---------------------------------------------------------------------#
    #   该变量用于控制是否使用letterbox_image对输入图像进行不失真的resize,
    #   在多次测试后,发现关闭letterbox_image直接resize的效果更好
    #---------------------------------------------------------------------#
    "letterbox_image"   : False,
    #-------------------------------#
    #   是否使用Cuda
    #   没有GPU可以设置成False
    #-------------------------------#
    "cuda"              : True,
}
  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/Cartucho/mAP
https://github.com/Ma-Dan/keras-yolo4

yolov4-tiny-pytorch'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

yolov4-tiny-pytorch's Issues

yolov4-tiny backbone convert to caffe

大佬你好
yolov4-tiny 中resblock中有个通道减半的操作,这个在转换caffe时有哪个层能够实现这个功能吗?或者多个层组合实现这个功能,最好是不修改caffe的源码,非常感谢

get_dr_txt.py运行错误

你好,运行get_dr_txt.py的时候出现以下错误:RuntimeError: Error(s) in loading state_dict for YoloBody:
Unexpected key(s) in state_dict: "feat1_att.channelattention.fc1.weight", "feat1_att.channelattention.fc2.weight", "feat1_att.spatialattention.conv1.weight", "feat2_att.channelattention.fc1.weight", "feat2_att.channelattention.fc2.weight", "feat2_att.spatialattention.conv1.weight", "upsample_att.channelattention.fc1.weight", "upsample_att.channelattention.fc2.weight", "upsample_att.spatialattention.conv1.weight".
应该怎么修改代码呢?

train.py

你好,我想问一下迭代次数是更改 Freeze_Epoch = 50、Unfreeze_Epoch = 100这两个参数吗?他们两个数据要保证二倍关系吗?

训练模型正常,导入模型测试报错

image
我用yolov4tiny训练自己的数据,总共也就2类。训练没有问题,可是在yolo.py中导入自己的训练模型就报torch.size不匹配的错,但是导入yolov4_tiny_weights_voc.pth和yolov4_tiny_weights_coco.pth就没有问题

dataloader.py文件中flag标志位的作用?

博主的代码dataloader.py文件中,__getitem__函数里面判断mosaic为真之后,最后有一行代码self.flag = bool(1-self.flag),请问这里设置flag标志位的作用是什么呢?

冻结参数时的optimizer

大佬您好,请问在冻结参数进行训练的时候不需要过滤optimizer的参数嘛?比如
optimizer = optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=0.001)

mAP0.5:0.95

可以把 mAP0.5:0.95的结果也补充一下吗,谢谢啦

anchor index的问题

yolo脚本中第110行的代码:self.anchors_mask = [[3,4,5],[1,2,3]]是不是有问题,是否应该改为self.anchors_mask = [[3,4,5],[0,1,2]]。相同的问题:在nets/yolo_training.py中231和359行的anchor_index = [[3,4,5],[1,2,3]][self.feature_length.index(in_w)]是不是应该改成anchor_index = [[3,4,5],[0,1,2]][self.feature_length.index(in_w)]?

关于YOLOv4-tiny在一些类别数目较少且目标数量较少的数据集上的改进

作者你好,我现在的数据集类别数较少(目前只有两个类别)且一张图片中只有一两个目标,像这种不是很复杂的数据集我感觉用YOLOv4-tiny就可以了,但也只是仅限于使用原模型而没有任何创新的工作,这种数据集相对较简单的情况使用YOLOv4-tiny如果想要创新的话应该从哪些方面入手可能会有效果?

相同情况下,pytorch上训练的结果比keras上的要低。

大佬,你好。我训练过你用pytorch和keras写的tiny-yolo4代码,同样的数据集(9000张鱼类照片)和同样的训练策略(马赛克,标签平滑,余弦退火,batchsize,epoch)。最终的map结果是keras上的是45%,pytorch的是32%。请问你之前分别在pytorch和keras训练voc数据集时有遇到过map相差较大的情况吗?

detect accuracy is no so good,it is the yolov4-tiny's ability?

我尝试在这训练yolov4-tiny,也在darknet中训练,检测高空和远处的车,数据8000左右,效果好像都不好,有时车在近处也检测不出来,不知道是不是训练那个参数问题,原图是19201080,训练时就算size设置到608608,测试时size放到800*800也是如此,放一张效果图
predictions (5)

不知道有没有碰到类似情况

How to evaluate .weights map here

Hi, I have trained yolov4-tiny using darknet repo, Now I have .weights and .cfg , Now I have two questions.

1- How I can calculate the Precision and recall for each class using .weights? do I need to convert .wegiths to .pt first? if yes then I can convert?

2- Can I convert .weights to .caffe?

你好,关于attention.py

你好,我打算自己在attention.py里加一些新的注意机制在用train里的phi调用,想请教在train里的phi调用SE,CBAM的逻辑走向是如何的,我应该怎么调用自己的新加的关注机制

大佬,请问这个可以转换成tensorrt吗?

大佬您好,我想用您的项目训练自己的数据集然后部署到nvidia xavier上,但速度还是有点慢,想问一下大佬有考虑过将模型转换成tensorrt吗?或者有考虑过能出个教程吗?

训练时cpu占用很高

训练时发现target的数据是放在cpu的,即下面的代码:
if cuda: images = Variable(torch.from_numpy(images).type(torch.FloatTensor)).cuda() targets = [Variable(torch.from_numpy(ann).type(torch.FloatTensor)) for ann in targets]
但是当把target也加上.cuda()时,训练的时候计算loss会报错。
即把代码修改成:targets = [Variable(torch.from_numpy(ann).type(torch.FloatTensor).cuda()) for ann in targets]
up主能帮忙看一下吗?非常感谢

训练到解冻阶段后内存一直在涨

您好,请教一下,我用cpu训练模型,训练到解冻阶段后内存一直在涨,一个epoch还没结束,内存和交换内存差不多都要占用掉50G。请问下是为什么?

单类目标检测模型mAP低

您好,用自己的数据集训练,共10类实例,得到了能检测10类的模型。之后筛选出数据集中包含1类实例的所有图片,重新训练了一个只检测这一类实例的单类目标检测的模型,为什么这个单类目标检测模型的AP比10类目标检测模型对应类别的AP要低呢?

关于fps

大佬您好,为什么这个yolov4-tiny我测试fps只有10左右,您复现的yolov3-pytorch,和yolov4-pytorch,ssd-pytorch,我都测试了一下全部fps值都是10个左右,而且我分别在笔记本(i5-7300hq+gtx1050)上和台式机(i5-9600k+rtx2080)上测试,fps值都是10左右,这是怎么会事呢?

map(0.5:0.95) is only 16.67.

i used the given pre-trained model yolov4_tiny_weights_coco.pth and evaluated it on coco val2017, and the map (0.5:0.95) only got 16.67%, could you please give the get_gt_txt.py on coco datasets.

关于分类loss

泡泡哥好,我打算只对行人做检测,看了一篇论文用yolov3的,里面对loss部分做了修改,将分类loss直接删了,其他不变。我试了一下,最后出来的结果是行人的置信度普遍偏低相较于不删分类loss的,我就想问做单目标检测时需要删分类loss吗?bceloss怎么解释(此时只有背景和目标两类吗还是别的啥)

RuntimeError: Error(s) in loading state_dict for YoloBody:

/home/juling/anaconda3/envs/pythonProject/bin/python /home/juling/PycharmProjects/pythonProject/yolov4-tiny/predict.py
Loading weights into state dict...
Traceback (most recent call last):
File "/home/juling/PycharmProjects/pythonProject/yolov4-tiny/predict.py", line 16, in
yolo = YOLO()
File "/home/juling/PycharmProjects/pythonProject/yolov4-tiny/yolo.py", line 56, in init
self.generate()
File "/home/juling/PycharmProjects/pythonProject/yolov4-tiny/yolo.py", line 94, in generate
self.net.load_state_dict(state_dict)
File "/home/juling/anaconda3/envs/pythonProject/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1223, in load_state_dict
raise RuntimeError('Error(s) in loading state_dict for {}:\n\t{}'.format(
RuntimeError: Error(s) in loading state_dict for YoloBody:
Unexpected key(s) in state_dict: "backbone.resblock_body2.conv1.conv.weight", "backbone.resblock_body2.conv1.bn.weight", "backbone.resblock_body2.conv1.bn.bias", "backbone.resblock_body2.conv1.bn.running_mean", "backbone.resblock_body2.conv1.bn.running_var", "backbone.resblock_body2.conv1.bn.num_batches_tracked", "backbone.resblock_body2.conv2.conv.weight", "backbone.resblock_body2.conv2.bn.weight", "backbone.resblock_body2.conv2.bn.bias", "backbone.resblock_body2.conv2.bn.running_mean", "backbone.resblock_body2.conv2.bn.running_var", "backbone.resblock_body2.conv2.bn.num_batches_tracked", "backbone.resblock_body2.conv3.conv.weight", "backbone.resblock_body2.conv3.bn.weight", "backbone.resblock_body2.conv3.bn.bias", "backbone.resblock_body2.conv3.bn.running_mean", "backbone.resblock_body2.conv3.bn.running_var", "backbone.resblock_body2.conv3.bn.num_batches_tracked", "backbone.resblock_body2.conv4.conv.weight", "backbone.resblock_body2.conv4.bn.weight", "backbone.resblock_body2.conv4.bn.bias", "backbone.resblock_body2.conv4.bn.running_mean", "backbone.resblock_body2.conv4.bn.running_var", "backbone.resblock_body2.conv4.bn.num_batches_tracked".

Process finished with exit code 1
请问博主知道这个是为啥么,卡住半天了。。。

关于锚框

想问下大佬,在训练代码和测试代码里, anchor_index = [[3,4,5],[1,2,3]][self.feature_length.index(in_w)], self.anchors_mask = [[3,4,5],[1,2,3]]
为什么都没有用上第0组锚框呢,这是不是小目标精度不大好的原因。

anchor_index问题

请问程序中:
anchor_index = [[3, 4, 5], [1, 2, 3]][self.feature_length.index(in_w)]
为什么不是[[3, 4, 5], [0, 1, 2]]呢

为什么从rtx2060换成了双rtx3090训练速度没有提升呢

我大幅度提高了batch_size,从之前的1直接提高到128,然而,我的两个3090半死不活的只用了6gb显存,cpu占用率倒是明显高了不少。而且每个batch_size训练的时间也低了很多倍,换算下来,训练速度并没有提高多少。

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.