README.md 9.7 KB
Newer Older
_白鹭先生_'s avatar
_白鹭先生_ 已提交
1
## YOLOV7-OBB:You Only Look Once OBB旋转目标检测模型在pytorch当中的实现
Bubbliiiing's avatar
Bubbliiiing 已提交
2 3 4 5 6 7 8 9 10 11 12 13 14 15
---

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

## Top News
_白鹭先生_'s avatar
_白鹭先生_ 已提交
16
**`2023-02`**:**仓库创建,支持step、cos学习率下降法、支持adam、sgd优化器选择、支持学习率根据batch_size自适应调整、新增图片裁剪、支持多GPU训练、支持各个种类目标数量计算、支持heatmap、支持EMA。**  
Bubbliiiing's avatar
Bubbliiiing 已提交
17 18

## 相关仓库
_白鹭先生_'s avatar
_白鹭先生_ 已提交
19
| 目标检测模型 | 路径 |
Bubbliiiing's avatar
Bubbliiiing 已提交
20 21 22 23 24 25 26 27 28
| :----- | :----- |
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
Bubbliiiing's avatar
Bubbliiiing 已提交
29
YoloV7 | https://github.com/bubbliiiing/yolov7-pytorch
Bubbliiiing's avatar
Bubbliiiing 已提交
30
YoloV7-tiny | https://github.com/bubbliiiing/yolov7-tiny-pytorch
_白鹭先生_'s avatar
_白鹭先生_ 已提交
31
YoloV7-OBB | https://github.com/Egrt/yolov7-obb
Bubbliiiing's avatar
Bubbliiiing 已提交
32 33

## 性能情况
_白鹭先生_'s avatar
_白鹭先生_ 已提交
34 35 36
| 训练数据集 | 测试数据集 | 输入图片大小 | mAP 0.5 |
| :-----: | :------: | :------: | :------: |
| SSDD | SSDD-Val | 640x640 | 85.4
_白鹭先生_'s avatar
_白鹭先生_ 已提交
37 38
### 预测结果展示
![预测结果](img/test.jpg)
Bubbliiiing's avatar
Bubbliiiing 已提交
39 40 41 42 43 44
## 所需环境
torch==1.2.0    
为了使用amp混合精度,推荐使用torch1.7.1以上的版本。

## 文件下载

_白鹭先生_'s avatar
_白鹭先生_ 已提交
45 46 47
SSDD数据集下载地址如下,里面已经包括了训练集、测试集、验证集(与测试集一样),无需再次划分:  
链接: https://pan.baidu.com/s/1vCAt9EuK3xJ_QiBdbcbHT   
提取码: seqb  
Bubbliiiing's avatar
Bubbliiiing 已提交
48 49 50 51 52 53 54 55

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

2. 数据集的处理   
修改voc_annotation.py里面的annotation_mode=2,运行voc_annotation.py生成根目录下的2007_train.txt和2007_val.txt。   
_白鹭先生_'s avatar
_白鹭先生_ 已提交
56
生成的数据集格式为image_path, x1, y1, x2, y2, x3, y3, x4, y4(polygon), class。 
Bubbliiiing's avatar
Bubbliiiing 已提交
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115

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文件内容为:      
```python
cat
dog
...
```
修改voc_annotation.py中的classes_path,使其对应cls_classes.txt,并运行voc_annotation.py。  

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

4. 训练结果预测  
训练结果预测需要用到两个文件,分别是yolo.py和predict.py。在yolo.py里面修改model_path以及classes_path。  
**model_path指向训练好的权值文件,在logs文件夹里。  
classes_path指向检测类别所对应的txt。**  
完成修改后就可以运行predict.py进行检测了。运行后输入图片路径即可检测。  

## 预测步骤
### a、使用预训练权重
1. 下载完库后解压,在百度网盘下载权值,放入model_data,运行predict.py,输入  
```python
img/street.jpg
```
2. 在predict.py里面进行设置可以进行fps测试和video视频检测。  
### b、使用自己训练的权重
1. 按照训练步骤训练。  
2. 在yolo.py文件里面,在如下部分修改model_path和classes_path使其对应训练好的文件;**model_path对应logs文件夹下面的权值文件,classes_path是model_path对应分的类**
```python
_defaults = {
    #--------------------------------------------------------------------------#
    #   使用自己训练好的模型进行预测一定要修改model_path和classes_path!
    #   model_path指向logs文件夹下的权值文件,classes_path指向model_data下的txt
    #
    #   训练好后logs文件夹下存在多个权值文件,选择验证集损失较低的即可。
    #   验证集损失较低不代表mAP较高,仅代表该权值在验证集上泛化性能较好。
    #   如果出现shape不匹配,同时要注意训练时的model_path和classes_path参数的修改
    #--------------------------------------------------------------------------#
Bubbliiiing's avatar
Bubbliiiing 已提交
116
    "model_path"        : 'model_data/yolov7_weights.pth',
Bubbliiiing's avatar
Bubbliiiing 已提交
117 118 119 120 121 122 123 124 125 126 127 128
    "classes_path"      : 'model_data/coco_classes.txt',
    #---------------------------------------------------------------------#
    #   anchors_path代表先验框对应的txt文件,一般不修改。
    #   anchors_mask用于帮助代码找到对应的先验框,一般不修改。
    #---------------------------------------------------------------------#
    "anchors_path"      : 'model_data/yolo_anchors.txt',
    "anchors_mask"      : [[6, 7, 8], [3, 4, 5], [0, 1, 2]],
    #---------------------------------------------------------------------#
    #   输入图片的大小,必须为32的倍数。
    #---------------------------------------------------------------------#
    "input_shape"       : [640, 640],
    #------------------------------------------------------#
Bubbliiiing's avatar
Bubbliiiing 已提交
129 130 131
    #   所使用到的yolov7的版本,本仓库一共提供两个:
    #   l : 对应yolov7
    #   x : 对应yolov7_x
Bubbliiiing's avatar
Bubbliiiing 已提交
132
    #------------------------------------------------------#
Bubbliiiing's avatar
Bubbliiiing 已提交
133
    "phi"               : 'l',
Bubbliiiing's avatar
Bubbliiiing 已提交
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
    #---------------------------------------------------------------------#
    #   只有得分大于置信度的预测框会被保留下来
    #---------------------------------------------------------------------#
    "confidence"        : 0.5,
    #---------------------------------------------------------------------#
    #   非极大抑制所用到的nms_iou大小
    #---------------------------------------------------------------------#
    "nms_iou"           : 0.3,
    #---------------------------------------------------------------------#
    #   该变量用于控制是否使用letterbox_image对输入图像进行不失真的resize,
    #   在多次测试后,发现关闭letterbox_image直接resize的效果更好
    #---------------------------------------------------------------------#
    "letterbox_image"   : True,
    #-------------------------------#
    #   是否使用Cuda
    #   没有GPU可以设置成False
    #-------------------------------#
    "cuda"              : True,
}
```
3. 运行predict.py,输入  
```python
img/street.jpg
```
4. 在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
Bubbliiiing's avatar
Bubbliiiing 已提交
174
https://github.com/WongKinYiu/yolov7
_白鹭先生_'s avatar
_白鹭先生_ 已提交
175

_白鹭先生_'s avatar
_白鹭先生_ 已提交
176
https://github.com/bubbliiiing/yolov7-pytorch