jetsonNano使用YOLOv4训练自己的网络

一.准备工作如下:

下载darknet网络文件

https://github.com/AlexeyAB/darknet
(readme有教程,看懂英文的可直接去读文档)

下载YOLOV4/YOLOV4-tiny.weights文件

yolov4.weights
yolov4-tiny.weights
(都可以在AlexeyAB下找到的,下载好放到darknet文件夹下)

修改配置文件

darknet->makefile文件下:

GPU=1
CUDNN=1
CUDNN_HALF=1
OPENCV=1
AVX=0
OPENMP=0
LIBSO=1
ZED_CAMERA=0 # ZED SDK 3.0 and above
ZED_CAMERA_v2_8=0 # ZED SDK 2.X

C编译

在darknet目录下输入命令:
make
或者
make -j4(4个CPU一起编译,不知道这样解释对不对),速度要比make快

现在可以利用例子进行测试了

测试图片:
yolov4.weights版
./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights data/dog.jpg
yolov4-tiny.weights版
./darknet detector test cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights data/dog.jpg
实时检测
./darknet detector demo cfg/voc.data cfg/yolov4.cfg yolov4.weights
(tiny版如上,对应修改即可)

二.训练自己的数据集

进入文件夹darknet->scripts
新建文件夹如下:
$ mkdir -p VOCdevkit && cd VOCdevkit
$ mkdir -p VOC2020 && cd VOC2020
$ mkdir -p Annotations && mkdir -p ImageSets && mkdir -p JPEGImages && mkdir -p labels

将图像集放入到JPEGImages文件夹下

将打好标签 产生的.xml文件放入到Annotations文件夹下

指定训练集和测试集

进入ImageSets目录中,新建Main目录,然后在Main目录中
$ cd ImageSets
$ mkdir -p Main && cd Main
$ touch train.txt test.txt
train.txt存放训练集,test.txt测试集
生成train.txt和test.txt文件的内容
使用脚本文件

import os
from os import listdir, getcwd
from os.path import join
if __name__ == '__main__':
    source_folder='<Add your address>/scripts/VOCdevkit/VOC2020/JPEGImages/'     # 修改为自己的路径
    dest='<Add your address>/scripts/VOCdevkit/VOC2020/ImageSets/Main/train.txt' # 修改为自己的路径
    dest2='<Add your address>/scripts/VOCdevkit/VOC2020/ImageSets/Main/test.txt'  # 修改为自己的路径
    file_list=os.listdir(source_folder)       
    train_file=open(dest,'a')                 
    test_file=open(dest2,'a')   
    count = 0               
    for file_obj in file_list:
        count += 1           
        file_name,file_extend=os.path.splitext(file_obj)
        if(count<XXX):  # XXX用于控制训练集合验证集的分割情况eg:1600=(2000-400)2000总数据集的个数,400是测试集的个数                 
            train_file.write(file_name+'\n')  
        else :
            test_file.write(file_name+'\n')    
    train_file.close()
    test_file.close()

修改相关文件

1.darknet->scripts->文件夹下的voc_lable.py

做如下修改:
1> sets=[ (‘2020’, ‘train’), (‘2020’, ‘val’), (‘2020’, ‘test’)] ,2020为我们设置的文件夹标识 ,以上生成的"train"和"test"指代训练集和测试集
2> classes = [“class1”,] ,修改为我们要识别的物体名称,假设我们就一类
3> os.system(cat 2020_train.txt 2020_val.txt > train.txt)
os.system(cat 2020_train.txt 2020_val.txt 2020_test.txt> train.all.txt)
修改完,执行:python3 voc_lable.py
scripts生成了3个文件:
2020_test.txt
2020_train.txt
2020_val.txt
(存放的是图片在本机的地址)
VOCdevkit/VOC2020/labels生成txt文件内容
<x_center> <y_center>
数据例子:01 0.393098958333 0.531481481481 0.0455729166667 0.118518518519
- 这是代表目标的类别号,范围是0-(classes-1);
<x_center> <y_center> 这几个值都归一化到(0.0 to 1.0]区间;
<x_center> <y_center> 是矩形框的中心。

新增文件:

data目录下的demo.names

添加你所要识别类别的种类:
classes1

新增demo.data文件
		classes= 1
        train  = <Add your address>/scripts/2020_train.txt
        valid  = <Add your address>/scripts/2020_val.txt
        names = data/demo.names
        backup = backup#训练过程中生成的过程结果存放地址
修改 cfg目录下的yolov4.cfg、yolov4-tiny.cfg文件

训练参数和相关网络结构的修改:01

训练代数:
1.github中给出了max_batches的基本设置方法,2000 × classes。当然,设置的大一些也是可以的,只不过后期基本上在某一值附近震荡
2.steps的设置是max_batches × 80% 和 max_batches × 90%。
02

网络结构
需要修改classes和filters,将classes及其最近的filters改成:classes=1
filters=(classes+5)*3=18
(只改classes最近的上方的filters,其它地方不动)

完成了相关参数及文件的修改,下面进入测试

使用预训练模型进行训练:
(需要下载yolov4.conv.137)
命令:.
方式1:指定了GPU
【./darknet detector train cfg/demo.data cfg/yolov4.cfg yolov4.conv.137 -gpus 0】
方式2:保存log时会生成两个文件,一个保存的是网络加载信息和checkout点保存信息,另一个保存的是训练信息
【./darknet detector train cfg/demo.data cfg/yolov4.cfg yolov4.conv.137 | tee person_train_log.txt】

训练耗时较长,当loss较小时,且不再发生变化时,可按"ctrl+c"终止训练。
在这个过程中在backup文件夹下会保存对应迭代次数的中间结果.weights文件
每1000保存一次
在这个过程中,若不小心或者断电造成训练中断,可以随时拿中间结果进行测试.

YOLO在之前的训练基础上继续训练

1.将上次训练断开是产生的weights文件做微调(不做这一步,我试过也是可以的,不知道是不是侥幸)
$ ./darknet partial cfg/demo.data cfg/yolov4.cfg backup/yolov4_last.weights yolov4-tiny.conv.15 15
2.接着训练
$ ./darknet partial cfg/demo.data cfg/yolov4.cfg yolov4-tiny.conv.15

不做微调的话,可以直接:
$ ./darknet partial cfg/demo.data cfg/yolov4.cfg backup/yolov4_last.weights -map

整合了网上很多up主的文章,关于jetson Nano的文章很少,这是给自己的总结,也希望能帮到有需要的人。
感谢:
https://blog.csdn.net/weixin_43046653/article/details/101106542
https://www.cnblogs.com/monologuesmw/p/13035442.html
https://my.oschina.net/u/4321806/blog/4470154
https://blog.csdn.net/u010942902/article/details/105866627?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
https://github.com/AlexeyAB/darknet

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐