Skip to content

RyanCCC/yolo-series

Repository files navigation

YOLO目标检测算法

本仓库主要实现YOLO目标检测算法,欢迎参与到本仓库的建设或者提issue。本仓库有两个分支,一个分支为main,主要是基于Tensorflow实现yolo算法,另一个分支是pytorch,主要是基于pytorch实现yolo算法。main分支当前算法实现基本情况如下:

算法 实现框架 备注
YOLOV4 Tensorflow-2.4 已实现,并通过测试
YOLOV5 Tensorflow-2.4 已实现,并经过测试
YOLOV5-v6.1 Tensorflow-2.4 已实现,并通过测试
YOLOX Tensorflow-2.4 已实现,并通过测试
YOLOV7 Tensorflow-2.4 已实现,并通过测试

本仓库主要是算法的训练和算法的验证,后续的工程化应用部署可以参考另一个仓库:Deployment。部署仓库包括模型的量化与压缩、python或者C++的部署代码以及OpenCVTensorRT等推理,喜欢或者对您有用的话可以给个:star:或者一起参与建设仓库:hand:。

项目结构

+---cfg: 存放配置文件|---componentsCNN组件如batch_renorm注意力机制
|---tools:存放工具包括生成训练文档类别统计等|---tracking目标跟踪Deepsort算法
|---doc存放YOLO资料文档包括backbone后处理等算法文档
|---evaluate存放模型评估方法
|---font字体
|---logs存放训练日志的文档
|---model存放模型和权重
|   +---yolo4_voc_weights.h5VOC预训练权重
|   \---yolo4_weight.h5COCO预训练权重
|---result推理结果保存的文件夹
|---video视频保存文件夹
|---yolov4yolov4算法实现
|---yolov5yolov5算法实现
|---yolov7yolov7算法实现
|---yoloxyolox算法实现
\---datasets数据集以VOC数据集格式
    +---Annotations数据集标注
    +---ImageSets
    |   \---Main划分训练集测试集验证集的txt文档
    \---JPEGImages图像

数据集制作

可按照VOC格式的数据集进行制作,主要的文件结构如下所示:

+---Annotation: 数据标注,xml格式
|---ImageSets:划分数据集
|   +---Main:存放txt位置
|---JPEGSImages:存放图像
|---labels.names:类别标签文档

当然也可以根据实际情况自定义自己的数据集结构,训练的时候只需要修改路径即可。另外在tools文件夹下有一些关于数据集脚本:

  1. splitDataset.py:划分数据集,即产生ImageSets/Main下的txt文档
  2. voc_annotation.py:生成输入到网络的文档格式,如下所示:
your/dataset/root/path/JPEGImages/wc_102.jpg 261,607,341,778,0
your/dataset/root/path/camera_20210817154550.jpg 94,149,165,251,11 22,164,97,249,11
your/dataset/root/path/pavilion_20210812155531.jpg 111,2,458,337,10

注意两者之前生成顺序:先划分数据集,生成ImageSets/Main下的txt文档,然后根据ImageSets/Main下的txt文档生成适用于文档格式的数据集。

模型训练

在模型开始训练之前,先在cfg文档下找到对应的算法配置文件进行修改,修改内容包括数据集路径、训练参数参数等。在配置文件修改完相关配置后,可在每个算法文件下的含有train命名的文件进一步检查其他训练参数,如yolov5下的train_yolov5.py文件里设置的训练参数。

当检查所有参数都没有错误后,可执行训练:

python train.py --model YOLOV5

参数说明:

  • model:表示训练的算法,如YOLOV5YOLOX等。

模型推理

模型推理查看predict.py。参数说明:

  • yolo:选择推理算法,如YOLOV5YOLOV5V61等算法。
  • show:在进行文件夹推理的时候是否展示图像,此处不建议。
  • save:是否保存推理结果。
  • save_dir:保存推理结果的文件夹位置
  • model:具体算法模型,可以是算法的权重、ONNX模型。
  • source:待检测的对象,可以是单张图像,也可以是文件夹

推理的示范:

# directory inference
python predict.py --yolo yolox --model /your/model/path/voc.h5 --source ./samples/
# image inference
python ./predict.py --yolo YOLOV7-TINY --source ./samples/test.jpg --model ./model/VOC2007_yolov7_tiny_2022_10_28.h5 --save

模型验证

MAP计算

  1. 统计测试集的ground_True
python ./evaluate/get_gt_txt.py --testset ./VOC2017/ImageSets/Main/test.txt --annotation ./VOC2007/Annotations/ --gt_folder ./result/gt_folder

参数说明:

  • testset:划分测试数据集保存的txt文档
  • annotation:标注文件保存的文件夹
  • gt_folder:保存文件夹路径
  1. 计算模型推理测试集的结果
python ./evaluate/get_dr_txt.py --testset ./VOC2007/ImageSets/Main/test.txt --pr_folder ./result/pr_folder --minoverlap 0.5 --model_path ./model/voc_yolox.h5 --image_path ./VOC2007/JPEGImages/ --model YOLOX

参数说明:

  • testset:划分测试数据集保存的txt文档
  • pr_folder:推理结果保存的文件夹,保存文件格式:txt
  • model_path:推理模型的权重
  • image_path:图像路径
  • model:使用的算法模型
  1. 计算map的性能指标
python ./evaluate/get_map.py --GT_PATH ./result/evaluate --DR_PATH ./result/pr_folder/ --IMG_PATH ./VOC2007/JPEGImages/ --MINOVERLAP 0.5

参数说明:

  • GT_PATH:脚本get_gt_txt.py生成文件的保存路径
  • DR_PATH:脚本get_dr_txt.py生成文件的保存路径
  • IMG_PATH:测试集图像的路径
  • MINOVERLAP:map@**的值

FPS计算

predict.py使用dir参数进行推理即可获取模型推理的fps。

FLOPs计算

FLOPs:注意s小写,是floating point operations的缩写(s表复数),意指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。FLOPS:注意全大写,是floating point operations per second的缩写,意指每秒浮点运算次数,理解为计算速度。是一个衡量硬件性能的指标。

PARAMS计算

详情可参考Object-Detection-Metrics

模型转换

在生产环境中需要进行模型转换,此处主要是将模型转换成ONNX格式模型。后续如果需要再转换成其他格式的模型,如TensorRTTFLite等都可通过ONNX转换成对应的格式的模型。模型转换成ONNX的性能,如精确度、速度等是否与原模型存在差异,在此没有做相应的测试:dizzy_face:,感兴趣的可以自行测评一下模型性能差异。

模型导出脚本:export.py,相关参数说明如下:

  • model:模型的权重路径
  • saved_pb:是否保存pb格式模型,带上这个参数后需要指定saved_pb_dir参数,表示模型保存的路径。
  • saved_pb_dir:保存pb模型的路径。
  • yolo:选择需要导出的YOLO算法。
  • save_onnx:ONNX模型保存的路径。
  • opset:ONNX的算子类型,默认12

注意:使用权重模型的时候要在cfg目录下对应的配置文件中核实类别文件和anchor文件是否配置正确。另外后续需要导出成TensorRT的Engine模型或者Openvino的模型可以自行定义。当前的参数已经足以使用,后续假设㓟更多参数需求会持续更新优化。

使用例子:

python ./export.py --model ./model/VOC.h5 --yolo yolox --save_onnx 'voc_yolox_l_13_640_v1.onnx' 

更多的ONNX推理和算法部署可参考:Deployment

参考

更多算法的内容可以参考doc文件下的文档。

  1. Object-Detection-Metrics
  2. mAP计算代码
  3. YOLOV3-tf2