使用Featurize在VOC0712数据集上基于Darknet训练YOLO-Fastest的过程演示

本文主要是介绍使用Featurize在VOC0712数据集上基于Darknet训练YOLO-Fastest的过程演示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 0 声明
  • 1 正文
    • 1.1 框架和数据集准备
    • 1.2 网络准备
    • 1.3 网络训练
    • 1.4 网络评估
  • 2 总结

0 声明

作者联系方式:E-mail: WindForest@yeah.net

本文用于使用Featurize平台在VOC0712数据集上基于Darknet训练YOLO-Fastest的过程参考。

本文仅为个人学习记录,由本文的错误造成的损失,作者概不负责。

说明
训练平台Featurize
训练框架Darknet
网络模型YOLO-Fastest1.0-XL
数据集VOC2007-2012联合数据集(20分类)
网络输入320×320
cuDNNcudnn-11.2-linux-x64-v8.1.1.33.tgz 提取码: sese

1 正文

1.1 框架和数据集准备

由于Darknet框架是基于C语言的,因此在获取到YOLO-Fastest工程之后需要先编译该框架才能进行训练,编译过程需要cuDNN的参与,截至本文发布,Featurize平台提供的实例是基于CUDA11.2的,故选用 cudnn-11.2-linux-x64-v8.1.1.33

我们先来做一些准备:首先将该cuDNN压缩包上传到 /work 目录下,该目录下的内容将被持久保留,且后续再申请实例的时候该目录是共享的;由于Darknet环境不包含在实例镜像中,因此每次申请实例都需要重新编译,为了方便起见,我们也把YOLO-Fastest工程从Github上下载并以zip方式保存到该目录,如下图所示。

1
上述操作可能需要花些时间,因此可以随便申请一个便宜的实例完成,而后再转到要用的配置继续下面的操作。

至此,我们已经准备好了可用于训练的框架,首先解压cuDNN和YOLO-Fastest工程到 ~/ 目录:

# 1 准备cuDNN
cd && sudo tar -zxvf work/cudnn-11.2-linux-x64-v8.1.1.33.tgz -C /usr/local/# 2 解压YOLO-Fastest工程
cd && unzip work/Yolo-Fastest.zip -d ~/ && mv Yolo-Fastest-master Yolo-Fastest

然后我们需要修改 Yolo-Fastest/MakefileYolo-Fastest/src/utils.c 文件中的内容。

对于Makefile,我们需要修改三个位置:

# 关闭OpenCV支持
-   OPENCV=1
+   OPENCV=0# 开启对对应GPU架构的支持
-   # ARCH= -gencode arch=compute_86,code=[sm_86,compute_86]
+   ARCH= -gencode arch=compute_86,code=[sm_86,compute_86]# 更改cuDNN路径
-   CFLAGS+= -DCUDNN -I/usr/local/cudnn/include
-   LDFLAGS+= -L/usr/local/cudnn/lib64 -lcudnn
+   CFLAGS+= -DCUDNN -I/usr/local/cuda/include
+   LDFLAGS+= -L/usr/local/cuda/lib64 -lcudnn

保存并退出,而后我们在utils.c中增加对一会儿要用到的数据集路径的支持:

// 找到此函数:
void replace_image_to_label(const char* input_path, char* output_path)
{// ...删掉其它find_replace函数调用,然后增加:find_replace(input_path, "voc-images", "voc-labels", output_path);// ...
}

6
保存并退出,我们回到YOLO-Fastest工程目录下,执行以下命令编译:

cd Yolo-Fastest
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
make -j8

至此,Darknet框架环境已经准备完成。

然后我们在导航页 添加数据集 中找到 VOC2007-2012联合数据集(Darknet-YOLO) 并在实例中下载,该数据集为本文使用示例,你当然可以添加自己的数据集,不过要记得对应地修改utils.c和后续的Anchors。

2
34

数据集将被下载到 ~/data/ 目录下,但数据集制作时的路径是 data/ALLIMGS/ 因此我们需要将下载好的数据集移动到YOLO-Fastest工程中:

# 3 数据集准备
cd && mkdir Yolo-Fastest/data/ALLIMGS && mkdir Yolo-Fastest/models && rm -rf Yolo-Fastest/cfg/*
mv data/voc-images Yolo-Fastest/data/ALLIMGS
mv data/voc-labels Yolo-Fastest/data/ALLIMGS
mv data/voc.data Yolo-Fastest/data/ALLIMGS/
mv data/voc.names Yolo-Fastest/data/ALLIMGS/
mv data/voc_test.txt Yolo-Fastest/data/ALLIMGS/
mv data/voc_train.txt Yolo-Fastest/data/ALLIMGS/

至此,用于训练的数据集也已经准备好了。

1.2 网络准备

从YOLO-Fastest工程目录下的 ModelZoo\yolo-fastest-1.0_coco 目录获取 yolo-fastest-xl.cfg 拷贝到 cfg 目录下;yolo-fastest-xl.weights 拷贝到 models 目录下。然后打开 yolo-fastest-xl.cfg 文件,根据机器性能和训练要求等修改训练参数,而后保存。

值得注意的是:网络训练的学习率、调整步长和衰减对网络收敛和最终效果有相当大的关系,需要慎重设置。

学习率设置示例:

learning_rate=0.002
burn_in=8000
max_batches=51900
policy=steps
steps=17300,34600,43250
scales=.5,.1,.1

经过对比,当采用单精度训练方案时,使用GTX3080是性价比最优的选择,此时batchsize可设置为64,subdivisions设置为2。

接着,在网络配置文件中修改yolo网络层使用的Anchors,对于本次示例,可使用:

26, 49,  64, 93,  75,186, 185,126, 141,242, 265,262

同时需要修改yolo网络层的输出张量和classes设置,一共有2个yolo网络层需要修改。

5
Anchors可使用Darknet提供的以下命令计算得到:

# 4 计算Anchors
cd && cd Yolo-Fastest/
./darknet detector calc_anchors data/ALLIMGS/voc.data -num_of_clusters 6 -width 320 -height 320

1.3 网络训练

最后,我们使用以下命令开始训练:

# 网络训练
cd && cd Yolo-Fastest/
# 首先提取骨干网络权重,这里109层是根据网络结构得到的最后一层骨干网络的层号
./darknet partial ./cfg/yolo-fastest-xl.cfg ./models/yolo-fastest-xl.weights ./models/yolo-fastest-xl_conv.109 109
# 使用预训练权重执行训练
./darknet detector train ./data/ALLIMGS/voc.data ./cfg/yolo-fastest-xl.cfg ./models/yolo-fastest-xl_conv.109 >> yolo-fastest-xl_train.log
# 从头开始训练,此时不需要预训练权重
./darknet detector train ./data/ALLIMGS/voc.data ./cfg/yolo-fastest-xl.cfg >> yolo-fastest-xl_train.log

此时终端上将打印训练时的信息,每次迭代的损失之变化将被记录到 ./yolo-fastest-xl_train.log 文件中,可用于后续绘制损失曲线。

训练进程不断有打印信息因此会占据一个终端,因此可以再开一个终端窗口实时刷新打印到日志里的损失值信息:

cd && watch -n 1 "tail -n 1 Yolo-Fastest/yolo-fastest-xl_train.log"

7

说明:由于burn_in参数,训练初期学习率会缓慢增加,因此一开始显示0.000000是正常的。

1.4 网络评估

网络训练完成后,可使用Darknet网络提供的工具查看训练效果,例如mAP计算:

./darknet detector map ./data/ALLIMGS/voc.data ./cfg/yolo-fastest-xl.cfg ./models/yolo-fastest-xl_final.weights 

但因为我们在编译时没有勾选OpenCV(为了加快训练速度),因此不能在实例中查看预测结果,只能在本机上重新编译一下Darknet工程来查看效果,这个过程已经在《YOLO系列(v1~v3)的学习及YOLO-Fastest在海思平台的部署(下)》中介绍过了,不再赘述。

最后,我们可以使用以下脚本保存的训练日志绘制网络训练过程中的损失值变化曲线。

# ----------------------------------------------------------------------
# Darknet损失函数处理
# NOTE:使用Darknet训练网络时使用“>>”指定输出到文件,即可保存训练过程中的
#      Loss变化信息,本脚本将从这些信息中提取Loss值并绘制曲线。
# NOTE:python ./Darknet_Loss_Process.py darknet_output_file
# ----------------------------------------------------------------------
import sys
import os
import matplotlib.pyplot as plt# --------------------------------------------------
# 全局变量
# --------------------------------------------------
darknet_output_filename = sys.argv[1]
x_iters = []
y_1_loss = []
y_2_loss = []# --------------------------------------------------
# 处理流程
# --------------------------------------------------
print("Current Loss Log: " + darknet_output_filename)
darknet_output_file = open(darknet_output_filename, 'r')for line in darknet_output_file.readlines():if "avg loss" in line:line_list = line.replace(',', '').replace(':', '').split(" ")x_iters.append(float(line_list[1]))y_1_loss.append(float(line_list[2]))y_2_loss.append(float(line_list[3]))darknet_output_file.close()_, ax1 = plt.subplots()
ax1.set_title("Darknet Loss Log")
ax1.plot(x_iters, y_1_loss, 'green', alpha=0.5)
ax1.set_xlabel('Iteration')
ax1.set_ylabel('Loss Value')
ax2 = ax1.twinx()
ax2.plot(x_iters, y_2_loss, 'red', alpha=0.8)
plt.show()

2 总结

本文其实没什么东西,主要是为了帮助刚刚接触JupyterLab的同学快速上手Darknet训练过程,以上。

———— 2022-1-22@燕卫博 ————

这篇关于使用Featurize在VOC0712数据集上基于Darknet训练YOLO-Fastest的过程演示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/365555

相关文章

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

批量导入txt数据到的redis过程

《批量导入txt数据到的redis过程》用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以Product*匹配的Key操作,提高了数据清理效率... 目录批量导入txt数据到Redisjs把redis命令按一条 一行写到txt中管道命令运行redis客户端成功了批量删除k

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Win10安装Maven与环境变量配置过程

《Win10安装Maven与环境变量配置过程》本文介绍Maven的安装与配置方法,涵盖下载、环境变量设置、本地仓库及镜像配置,指导如何在IDEA中正确配置Maven,适用于Java及其他语言项目的构建... 目录Maven 是什么?一、下载二、安装三、配置环境四、验证测试五、配置本地仓库六、配置国内镜像地址

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3