• 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


     

     

    1.  ARCH= -gencode arch=compute_35,code=sm_35 \
    2.       -gencode arch=compute_50,code=[sm_50,compute_50] \
    3.       -gencode arch=compute_52,code=[sm_52,compute_52] \
    4.       -gencode arch=compute_70,code=[sm_70,compute_70] \
    5.       -gencode arch=compute_75,code=[sm_75,compute_75]\
    6.       -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

    1. #
    2. import xml.etree.ElementTree as ET
    3. import pickle
    4. import os
    5. from os import listdir, getcwd
    6. from os.path import join
    7. sets=[('Main', 'train'), ('Main', 'val'), ('Main', 'test')]
    8. ####################################################################
    9. #这里需要认为手动指定xml标签中的全部类别,这样程序把这些类作为键去所以后续的数据#
    10. ####################################################################
    11. classes = ["ball", "bottle", "branch", "grass", "leaf", "milk-box", "plastic-bag", "plastic-garbage"]
    12. #我们标注的图像尺寸可能不同,但是送进模型训练需要统一的尺寸,
    13. #所以这里我们要将标注数据又之前的实际像素点的位置变为占整张图尺寸的比例,
    14. #这样在后续的各种resize中才能保证框的位置准确
    15. def convert(size, box):
    16. dw = 1./(size[0])
    17. dh = 1./(size[1])
    18. x = (box[0] + box[1])/2.0 - 1
    19. y = (box[2] + box[3])/2.0 - 1
    20. w = box[1] - box[0]
    21. h = box[3] - box[2]
    22. x = x*dw
    23. w = w*dw
    24. y = y*dh
    25. h = h*dh
    26. return (x,y,w,h)
    27. #这里是读取xml文件中内容并将转换好的信息写入txt文件的过程,
    28. #主要就是索引前面classes中的名字将名字转换成编号再写入txt
    29. def convert_annotation(year, image_id):
    30. in_file = open('./our_data/Annotations/%s.xml'%(year, image_id))
    31. out_file = open('./our_data/labels/%s.txt'%(year, image_id), 'w')
    32. tree=ET.parse(in_file)
    33. root = tree.getroot()
    34. size = root.find('size')
    35. w = int(size.find('width').text)
    36. h = int(size.find('height').text)
    37. for obj in root.iter('object'):
    38. difficult = obj.find('difficult').text
    39. cls = obj.find('name').text
    40. if cls not in classes or int(difficult)==1:
    41. continue
    42. cls_id = classes.index(cls)
    43. xmlbox = obj.find('bndbox')
    44. b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
    45. bb = convert((w,h), b)
    46. out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
    47. wd = getcwd()
    48. # 增加该部分
    49. scripts_path = os.path.split(os.path.realpath(__file__))[0] # 读取当前脚本路径
    50. scripts_path = scripts_path.replace('\\', '/')
    51. print(scripts_path) # 脚本路径
    52. for image_set in sets:
    53. if not os.path.exists('labels/'):
    54. os.makedirs('labels/')
    55. image_ids = open('ImageSets/Main/%s.txt' % (image_set)).read().strip().split()
    56. list_file = open('%s.txt' % (image_set), 'w')
    57. for image_id in image_ids:
    58. # 修改了该句,使得写入的数据为加上了当前脚本路径,相对路径变为绝对路径
    59. list_file.write(scripts_path + '/JPEGImages/%s.jpg\n' % (image_id))
    60. convert_annotation(image_id)
    61. list_file.close()
    62. #os.system("cat 2007_train.txt 2007_val.txt > train.txt")
    63. #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

  • 相关阅读:
    [Python进阶] 监听键鼠:Pynput
    类隔离实现之自定义类加载器
    spring-boot 请求参数校验:注解 @Validated 的使用、手动校验、自定义校验
    [山东科技大学OJ]2043 Problem G: 查询单词
    脱壳工具:反射大师的使用详解
    前端 Git 使用约定
    小程序实现图片上传、数量配置、预览、删除功能的开发指南
    Vivado初体验LED工程
    前端开发性能优化方案-14条
    坚持与确定性:毒药还是良药?
  • 原文地址:https://blog.csdn.net/sqm472527736/article/details/127490592