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当中的实现
目录
- 性能情况 Performance
- 实现的内容 Achievement
- 所需环境 Environment
- 注意事项 Attention
- 小技巧的设置 TricksSet
- 文件下载 Download
- 预测步骤 How2predict
- 训练步骤 How2train
- 参考资料 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版的试试帧率