时间2022年10月24日
环境:TX2 ubuntu 18.04
参考教程:(12条消息) YoloV4训练自己的数据集_RezoLee的博客-CSDN博客_yolov4训练自己的数据集(12条消息) 如何解决pjreddie版darknet不能使用cudnn8编译的问题_Arnold-FY-Chen的博客-CSDN博客
资源地址:YOLOv4-tiny released: 40.2% AP50, 371 FPS (GTX 1080 Ti) · Issue #2201 · pjreddie/darknet (github.com)第一步:新建文件夹
第二步:下载darknet,并且进行编译。
出现这个错误,上网搜索
解决方法:原因
NVCC = /usr/local/cuda/bin/nvcc
ARCH= -gencode arch=compute_35,code=sm_35 \
-gencode arch=compute_50,code=[sm_50,compute_50] \
-gencode arch=compute_52,code=[sm_52,compute_52] \
-gencode arch=compute_70,code=[sm_70,compute_70] \
-gencode arch=compute_75,code=[sm_75,compute_75]\
-gencode arch=compute_86,code=[sm_86,compute_86]
做到一半,发现darknet/cfg下没有yolov4-tiny.cfg文件,于是先把原有的darknet文件剪切出来,并做好备份,想起以前下载了TX2跑yolov4的模型下载了darknet,于是再去下载一遍
(12条消息) TX2利用yolov4实时目标检测_fengfeng,Z的博客-CSDN博客_tx2目标检测
下载darknet成功,发现与原来的darknet不一样,不管了,先复制进去,然后再改Makefile文件 ,编译之后成功,但是很多warning.
之后复制yolov4-tiny.cfg文件
./darknet detector calc_anchors /home/nvidia/train/data/train.data -num_of_clusters 6 -width 416 -height 416
出现 Couldn‘t open file:/home/nvidia/train/data/train/txt
结果发现在train.names的路径设置不对,加上绝对路径就好了
使用k-means聚类获得自己的数据集先验框
./darknet detector calc_anchors /home/nvidia/train/data/train.data -num_of_clusters 9 -width 416 -height 416
在yolov4中有两个地方的anchor,这两个地方都要进行修改吗?
发现两个地方的anchors都相同,然后都进行了统一修改
./darknet detector train /home/nvidia/train/data/train.data /home/nvidia/train/data/yolov4-tiny.cfg yolov4-tiny.conv.29
训练时发现爆内存了,辛苦了几天的方法又失败了。
./darknet detector test home/nvidia/train/data/train.data /home/nvidia/train/data/yolov4-tiny.cfg /home/nvidia/train/backup/yolov4-tiny_best.weights 000096.jpg
内存爆了,然后找到cfg文件去减少batch,训练到27层又发现不行了
然后删除了内存使用第一的进程,删除之后VNC就不能使用
于是换到了windows 11 上运行
老规矩,先装darknet,然后用git bash 进入darknet中
出现这个问题,参考教程如下
(11条消息) windows下安装Cygwin详细教程_快乐小胡!的博客-CSDN博客_cygwin
最终的一个结果.
yolov4 所需要的版本要求
查看我的cmake版本 发现符合
上网查看说opencv的版本不能高于4.0。
(12条消息) CUDA、CUDNN在windows下的安装及配置_花花少年的博客-CSDN博客_cuda安装在哪个盘
,安装CUDA和安装CUDNN成功,进入到Cmake阶段了
我先重装一下CUDA 这次的东西装在默认环境下
注意一下,CUDNN解压件要放到CUDA里面
然后后面出错了,参考了另一个篇文章
win10 + YOLOv4 + CPU/GPU最全面配置教程_重糖爱好者的博客-CSDN博客
又发生报错
darknet.exe detector test cfg/coco.data cfg/yolov4.cfg build/darknet/x64/yolov4.weights -thresh 0.25
darknet.exe detector demo cfg/coco.data cfg/yolov4.cfg build/darknet/x64/yolov4.weights 1.avi -out_filename res.avi
权重的路径很重要
在电脑上跑好了自己的yolov4
电脑端测试的指令
darknet.exe detector demo cfg/coco.data cfg/yolov4.cfg build/darknet/x64/yolov4.weights
电脑的摄像头分别率太高了,抓帧抓不到。
回到TX2上,发现/train/darknet/cfg上也有一个配置文件,这个文件对于darknet的,就是训练开始的框架。
开始训练自己的数据集
darknet.exe detector train cfg/obj.data cfg/yolov4-obj.cfg ./our_data/yolov4.conv.137
出现这个情况,上网查了一下,就是train.txt的内容要设置路径格式。
找到原因了据说是train.txt下的文件路径要设置成绝对路径
找到一个把Annotations下的xml文件转换成txt里面的一个绝对路径
于是在网上找了一个文件voc_label.py
#
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join
sets=[('Main', 'train'), ('Main', 'val'), ('Main', 'test')]
####################################################################
#这里需要认为手动指定xml标签中的全部类别,这样程序把这些类作为键去所以后续的数据#
####################################################################
classes = ["ball", "bottle", "branch", "grass", "leaf", "milk-box", "plastic-bag", "plastic-garbage"]
#我们标注的图像尺寸可能不同,但是送进模型训练需要统一的尺寸,
#所以这里我们要将标注数据又之前的实际像素点的位置变为占整张图尺寸的比例,
#这样在后续的各种resize中才能保证框的位置准确
def convert(size, box):
dw = 1./(size[0])
dh = 1./(size[1])
x = (box[0] + box[1])/2.0 - 1
y = (box[2] + box[3])/2.0 - 1
w = box[1] - box[0]
h = box[3] - box[2]
x = x*dw
w = w*dw
y = y*dh
h = h*dh
return (x,y,w,h)
#这里是读取xml文件中内容并将转换好的信息写入txt文件的过程,
#主要就是索引前面classes中的名字将名字转换成编号再写入txt
def convert_annotation(year, image_id):
in_file = open('./our_data/Annotations/%s.xml'%(year, image_id))
out_file = open('./our_data/labels/%s.txt'%(year, image_id), 'w')
tree=ET.parse(in_file)
root = tree.getroot()
size = root.find('size')
w = int(size.find('width').text)
h = int(size.find('height').text)
for obj in root.iter('object'):
difficult = obj.find('difficult').text
cls = obj.find('name').text
if cls not in classes or int(difficult)==1:
continue
cls_id = classes.index(cls)
xmlbox = obj.find('bndbox')
b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
bb = convert((w,h), b)
out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
wd = getcwd()
# 增加该部分
scripts_path = os.path.split(os.path.realpath(__file__))[0] # 读取当前脚本路径
scripts_path = scripts_path.replace('\\', '/')
print(scripts_path) # 脚本路径
for image_set in sets:
if not os.path.exists('labels/'):
os.makedirs('labels/')
image_ids = open('ImageSets/Main/%s.txt' % (image_set)).read().strip().split()
list_file = open('%s.txt' % (image_set), 'w')
for image_id in image_ids:
# 修改了该句,使得写入的数据为加上了当前脚本路径,相对路径变为绝对路径
list_file.write(scripts_path + '/JPEGImages/%s.jpg\n' % (image_id))
convert_annotation(image_id)
list_file.close()
#os.system("cat 2007_train.txt 2007_val.txt > train.txt")
#os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt> train.all.txt")
结果在darknet页面生成了2007_test和2007_train以及2007_val文件。
打开2007的文件发现里面的顺序不对,是有序的。
训练出来有些Loss=NAN
训练网络loss出现Nan解决办法 - 知乎 (zhihu.com)
解决方法:这个路径是linux下面的路径,但是你是在windows下面,肯定不对啊,修改下模型保存路径
于是修改obj.data中的back
发现自己训练一直吃CPU,GPU没怎么用。
于是改了Makefile文件,然后用cmake从新生成darknet.exe文件
又去训练,然后出现在这个错误
RTX30系列必须CUDA 必须大于11
在CMake 点击生成,重新生成好解决方案,然后发现
144 Error: cuDNN isn't found FWD algo for convolution.
出现这个错误了,错误如下
(2条消息) Error: cuDNN isn't found FWD algo for convolution-微软技术-CSDN问答
生成的darknet.exe在文件E:\yolov4-rubish\darknet\Release
yolov4简单测试教程
训练完测试指令
darknet.exe detector demo cfg/obj.data cfg/yolov4-tiny.cfg backup/yolov4-tiny_last.weights
还没在Windows上和Tx2运行
11月3号,后面运行再来写。
11.30日
yolov4-tiny的权重文件(.weights)获取
FPS有点小了,问题来了,是如何训练得到的yolov4-tiny.weights的呢?
12月2日
训练指令
darknet.exe detector train cfg/obj-1.data cfg/yolov4-tiny.cfg ./our_data/yolov4.conv.137
摄像头测试
darknet.exe detector demo cfg\coco.data cfg\yolov4.cfg build\darknet\x64\yolov4.weights
darknet.exe detector demo cfg\coco1.data cfg\yolov4-tiny-trashdetect.cfg cfg\yolov4-tiny-trashdetect_last.weights
darknet.exe detector demo cfg\coco1.data cfg\yolov4-tiny-trashdetect.cfg cfg\yolov4-tiny-trashdetect_last.weights
图片测试指令
darknet.exe detector test cfg/coco1.data cfg/yolov4-tiny-trashdetect.cfg cfg/yolov4-tiny-trashdetect_last.weights cfg/000001.jpg
视频测试
darknet.exe detector demo cfg/coco1.data cfg/yolov4-tiny-trashdetect.cfg cfg/yolov4-tiny-trashdetect_last.weights cfg/test1.mp4
计算Map
darknet.exe detector map cfg/obj.data cfg/yolov4-tiny.cfg backup/yolov4-tiny_last.weights
图像测试
12月3日
darknet.exe detector map cfg/obj.data cfg/yolov4-tiny.cfg backup/yolov4-tiny_final.weights
darknet.exe detector map cfg/obj-1.data cfg/yolov4-tiny.cfg backup/yolov4-tiny_final.weights
摄像头实时测试
darknet.exe detector demo cfg/obj-1.data cfg/yolov4-tiny.cfg backup/yolov4-tiny_final.weights
train
改变数据集obj文件记得改,ojb-names 的文件类别记得改
darknet.exe detector trai n cfg/obj-1.data cfg/yolov4-tiny.cfg ./our_data/yolov4.conv.137
训练数据集的步骤 里面cfg
filters = (类别+5 )X3
12.4日
train 结果
darknet.exe detector train cfg/obj-2.data cfg/yolov4-tiny-2.cfg ./our_data/yolov4.conv.137
darknet.exe detector map cfg/obj-2.data cfg/yolov4-tiny-2.cfg backup/exp4/yolov4-tiny-2_final.weights
darknet.exe detector demo cfg/obj-2.data cfg/yolov4-tiny-2.cfg backup/exp4/yolov4-tiny_final.weights
摄像头测试
darknet.exe detector demo cfg/obj-2.data cfg/yolov4-tiny-2.cfg backup/exp4/yolov4-tiny-2_final.weights