https://github.com/AlexeyAB/darknet
(readme有教程,看懂英文的可直接去读文档)
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
在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
进入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='/scripts/VOCdevkit/VOC2020/JPEGImages/' # 修改为自己的路径
dest='/scripts/VOCdevkit/VOC2020/ImageSets/Main/train.txt' # 修改为自己的路径
dest2='/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> 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文件内容
数据例子:01 0.393098958333 0.531481481481 0.0455729166667 0.118518518519
- 这是代表目标的类别号,范围是0-(classes-1);
添加你所要识别类别的种类:
classes1
classes= 1
train = /scripts/2020_train.txt
valid = /scripts/2020_val.txt
names = data/demo.names
backup = backup#训练过程中生成的过程结果存放地址
训练代数:
1.github中给出了max_batches的基本设置方法,2000 × classes。当然,设置的大一些也是可以的,只不过后期基本上在某一值附近震荡
2.steps的设置是max_batches × 80% 和 max_batches × 90%。
网络结构
需要修改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保存一次
在这个过程中,若不小心或者断电造成训练中断,可以随时拿中间结果进行测试.
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