20200908——YOLOV4训练船舶分类数据集

20200908——YOLOV4训练船舶分类数据集


YOLOV4_Tianxiaomo/pytorch-YOLOv4跑图片检测和实时视频检测

github地址:https://github.com/Tianxiaomo/pytorch-YOLOv4

1.下载代码后,安装相应依赖,下载训练好的权重yolov4.weights

如果没有GPU可以使用cpu

use_cuda = False

调整imgfile默认值为None

imafile = None

根据是否输入imgfile选择检测图片或者实时视频

"""运行方式:
(1)检测图片:
python demo.py -cfgfile cfg/yolov4.cfg -weightfile weight/yolov4.weights -imgfile data/giraffe.jpg

(2)实时视频检测:
python demo.py -cfgfile cfg/yolov4.cfg -weightfile weight/yolov4.weights

"""

2.utils下的camera.py也可以进行摄像头调用进行实时检测,运行前需要修改权重路径和工具路径

cfgfile = "../cfg/yolov4.cfg"
weightsfile = "../weight/yolov4.weights"
class_names = load_class_names("../data/coco.names")

utils.py中line115,boxes维度错误,修改为

    for i in range(len(boxes[0])):
        box = boxes[0][i]

YOLOV4:pytorch实现yoloV4训练——训练船舶分类数据集

github地址:https://github.com/bubbliiiing/yolov4-pytorch

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

目录

  1. 性能情况 Performance
  2. 实现的内容 Achievement
  3. 所需环境 Environment
  4. 注意事项 Attention
  5. 小技巧的设置 TricksSet
  6. 文件下载 Download
  7. 预测步骤 How2predict
  8. 训练步骤 How2train
  9. 参考资料 Reference

性能情况

训练数据集 权值文件名称 测试数据集 输入图片大小 mAP 0.5:0.95 mAP 0.5
VOC07+12 yolo4_voc_weights.pth VOC-Test07 416x416 - 82.2
COCO-Train2017 yolo4_weights.pth COCO-Val2017 416x416 41.5 63.9

实现的内容

  • 主干特征提取网络:DarkNet53 => CSPDarkNet53
  • 特征金字塔:SPP,PAN
  • 训练用到的小技巧:Mosaic数据增强、Label Smoothing平滑、CIOU、学习率余弦退火衰减
  • 激活函数:使用Mish激活函数
  • ……balabla

所需环境

torch==1.2.0

注意事项

代码中的yolo4_weights.pth是基于608x608的图片训练的,但是由于显存原因。我将代码中的图片大小修改成了416x416。有需要的可以修改回来。 代码中的默认anchors是基于608x608的图片的。
注意不要使用中文标签,文件夹中不要有空格!
在训练前需要务必在model_data下新建一个txt文档,如:new_classes.txt, 文档中输入需要分的类,在train.py中将classes_path指向该文件

0
1
2
3
4
5

训练小技巧的设置

在train.py文件下:
1、mosaic参数可用于控制是否实现Mosaic数据增强。
2、Cosine_scheduler可用于控制是否使用学习率余弦退火衰减。
3、label_smoothing可用于控制是否Label Smoothing平滑。

文件下载

训练所需的yolo4_weights.pth可在百度网盘中下载。
链接: https://pan.baidu.com/s/1VNSYi39AaqjHVbdNpW_7sw 提取码: q2iv
yolo4_weights.pth是coco数据集的权重。
yolo4_voc_weights.pth是voc数据集的权重。

一、预测步骤

1、使用预训练权重检测

  • a、下载完库后解压,在百度网盘下载yolo4_weights.pth或者yolo4_voc_weights.pth,放入model_data,运行predict.py,输入
img/street.jpg

可完成预测。

  • b、利用video.py可进行摄像头检测。
  • c、再写一个检测视频的py

2、使用自己训练的权重

  • a、按照训练步骤训练。

  • b、在yolo.py文件里面,在如下部分修改model_path和classes_path使其对应训练好的文件;model_path对应logs文件夹下面的权值文件,classes_path是model_path对应分的类, 使用自己任务的分类器, new_classes

_defaults = {
    
    
    "model_path": 'model_data/yous.pth',
    "anchors_path": 'model_data/yolo_anchors.txt',
    "classes_path": 'model_data/new_classes.txt',
    "model_image_size" : (416, 416, 3),
    "confidence": 0.5,
    "cuda": True
}

  • c、运行predict.py,输入
img/street.jpg

可完成预测。

  • d、利用video.py可进行摄像头检测。

二、训练步骤

1、本文使用VOC格式进行训练。
2、训练前将标签文件放在VOCdevkit文件夹下的VOC2007文件夹下的Annotation中。
3、训练前将图片文件放在VOCdevkit文件夹下的VOC2007文件夹下的JPEGImages中。
4、在训练前利用voc2yolo4.py文件生成对应的txt。 训练集:验证集:测试集 = 8:1:1 。
5、再运行根目录下的voc_annotation.py,运行前需要将classes改成你自己的new_classes。注意不要使用中文标签,文件夹中不要有空格!

# 0其他 1客船 2集装箱船 3平板货船 4油船 5运车船
classes = ["0", "1", "2", "3", "4", "5"]

6、此时会生成对应的2007_train.txt,2007_val.txt,2007_test.txt每一行对应其图片位置及其真实框的位置

C:\Users\tony\Desktop\target_detect\yolov4-pytorch-master/VOCdevkit/VOC2007/JPEGImages/DSC01597.jpg 252,256,576,305,3
C:\Users\tony\Desktop\target_detect\yolov4-pytorch-master/VOCdevkit/VOC2007/JPEGImages/DSC01599.jpg 208,255,534,302,3
C:\Users\tony\Desktop\target_detect\yolov4-pytorch-master/VOCdevkit/VOC2007/JPEGImages/DSC01600.jpg 195,254,521,301,3
C:\Users\tony\Desktop\target_detect\yolov4-pytorch-master/VOCdevkit/VOC2007/JPEGImages/DSC01601.jpg 180,255,508,300,3

7、在训练前需要务必在model_data下新建一个txt文档,new_classes.txt文档中输入需要分的类,在train.py中将classes_path指向该文件,示例如下:

classes_path = 'model_data/new_classes.txt'    

model_data/new_classes.txt文件内容为:

0
1
...

8、运行train.py即可开始训练。

mAP目标检测精度计算更新

更新了get_gt_txt.py、get_dr_txt.py和get_map.py文件。
get_map文件克隆自https://github.com/Cartucho/mAP
具体mAP计算过程可参考:https://www.bilibili.com/video/BV1zE411u7Vw

Reference

https://github.com/qqwweee/keras-yolo3/
https://github.com/Cartucho/mAP
https://github.com/Ma-Dan/keras-yolo4

总结

由于代码是原版改为pytorch版,部分细节处理不到位。在装完依赖后仍然有需要报错的地方,最后修改了几个小地方才能跑通训练。

但是由于没有仔细研读代码,发现通过voc2yolo4.py生成的一定比例的各样本集,在train.py中再次进行了比例划分,明显是多余的,因此去掉了train.py文件下的比例划分,只保留之前的处理,训练集:验证集:测试集 = 8:1:1。

训练时出现显存不够,在50个epoch中都将batch_size改为1,初步训练后替换训练好的权重进行检测,发现不能检测出船舶目标。明显是不正常的,经过仔细检查代码,发现生成的2007_XX.txt文件中只有图片路径没有真值,DataLoader也没有载入其它真值,因此训练是无效的。

检查voc_annotation.py代码后,发现代码并未有误,也有导入真值的代码,于是检查了xml数据,发现导入进来的xml文件都是原始的,目标为boat,于是重写了voc_annotation.py代码,从txt文件中导入了分类标签012345,并对xml文件中的object-name进行了修改,完成了数据集的统一,然后重新开始训练。感觉1-25Epoch中的loss降低很慢,训练效果不好

训练完成

loss停留在2.x左右,降不下去,重写批量测试后分析一下训练效果

三、批量测试

重写了批量测试图片文件predict.py中的images_detect()方法,对于2007_test.txt训练集进行了批量测试,获得的检测结果中,分类效果比较好,对于少量分类错误或者未识别出船型的图片,主要原因是数据集的某些船型的样本数太少,无法很好的训练到位,当图片中船出现半身或者船的外观与其它类型相似时,就容易产生误判或未识别。暂未对测试集的结果进行P-R计算

四、视频检测

由于video.py中只是调用实时摄像头进行检测,也未进行视频保存。所以在predict.py中重写了对于视频的检测,并进行了结果保存。

在做视频检测的时候,当输入19201080的视频时,检测计算的帧率非常慢,只有3左右;修改输入视频为720480,格式修改为mp4后,fps提升到7,但仍然不能达到论文中的FPS值,考虑原因如下:

  • (1)cv2写入帧的时候,写入格式为AVI, 得到200+M的视频,非常大,可能是写入太耗时
  • (2)也可能是视频中目标量非常大,导致检测的计算量和处理过程复杂,增加了整个过程的处理时间,考虑更换目标少的视频
  • (3) 最后一个原因,怀疑是获取视频帧之后,调用image_detect()方法进行检测时,每次检测都重新加载了参数,极大增加了检测耗时,尝试检查这部分代码
  • (4)核心原因:GPU太low,原始论文实验采用超级性能的GPU也只能达到40左右,算正常水平。可寻找s版的试试帧率

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44277280/article/details/108526688