TX2训练yolov4 自己的训练集

时间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

参考教程:Yolov4+darknet+win10训练Cannot load image....和 Error in load_data_detection() - OpenCV_archive_win的博客-CSDN博客_error in load_data_detection() - opencv

#
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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值