YOLO4源码理解(1)random.seed()的理解+++random.sample()和numpy.random.choice() 的比较

凯哥英语视频

1 random.seed()–在代码第15行(代码在最底部)

random.seed() 会改变随机生成器的种子;传入的数值用于指定随机数生成时所用算法开始时所选定的整数值,如果使用相同的seed()值,则每次生成的随机数都相同;如果不设置这个值,则系统会根据时间来自己选择这个值,此时每次生成的随机数会因时间的差异而有所不同。

2 random.sample()和numpy.random.choice() 的比较–在代码第38行(代码在最底部)

一次性从列表中不重复地抽样出指定个数的元素,其中 random.sample()默认就是不重复抽样(不放回的抽样),而numpy.random.choice()默认是可以重复抽样,要想不重复地抽样,需要设置replace参数为False
import random
import numpy as np

a = [i for i in range(20)]

b = np.random.choice(a, 10, replace=False)

c = random.sample(a, 10)

print('b', b)
print('c', c)

# b [ 4  0  6 18 14 19  3 15 11  5]
# c [4, 18, 12, 0, 3, 16, 2, 1, 17, 11]
numpy.random.choice()抽样方法的时间几乎不会随着抽样数量的变化而变化,而random.sample() 会随着抽样数量的增加而增加。所以当数量较少的时候,random.sample() 用时非常少,而numpy.random.choice()则很长;当抽样数量很大的时候,numpy.random.choice()几乎不变,而random.sample() 用时变长。

YOLO4源码理解(1)random.seed()的理解+++random.sample()和numpy.random.choice() 的比较_第1张图片

voc2yolo4.py文件如下

#----------------------------------------------------------------------#
#   验证集的划分在train.py代码里面进行
#   test.txt和val.txt里面没有内容是正常的。训练不会使用到。
#----------------------------------------------------------------------#
'''
#--------------------------------注意----------------------------------#
如果在pycharm中运行时提示:
FileNotFoundError: [WinError 3] 系统找不到指定的路径。: './VOCdevkit/VOC2007/Annotations'
这是pycharm运行目录的问题,最简单的方法是将该文件复制到根目录后运行。
可以查询一下相对目录和根目录的概念。在VSCODE中没有这个问题。
#--------------------------------注意----------------------------------#
'''
import os
import random 
random.seed(0)

# xmlfilepath = r'./VOCdevkit/VOC2007/Annotations'
xmlfilepath = 'Annotations'
# saveBasePath = r"./VOCdevkit/VOC2007/ImageSets/Main/"
saveBasePath = 'ImageSets\Main\\'
#----------------------------------------------------------------------#
#   想要增加测试集修改trainval_percent
#   train_percent不需要修改
#----------------------------------------------------------------------#
trainval_percent = 1
train_percent = 1

temp_xml = os.listdir(xmlfilepath)
total_xml = []
for xml in temp_xml:
    if xml.endswith(".xml"):
        total_xml.append(xml)

num = len(total_xml)
list = range(num)
tv = int(num*trainval_percent)
tr = int(tv*train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)
 
print("train and val size", tv)
print("traub suze", tr)
ftrainval = open(os.path.join(saveBasePath,'trainval.txt'), 'w')  
ftest = open(os.path.join(saveBasePath,'test.txt'), 'w')  
ftrain = open(os.path.join(saveBasePath,'train.txt'), 'w')  
fval = open(os.path.join(saveBasePath,'val.txt'), 'w')  
 
for i in list:
    name = total_xml[i][:-4]+'\n'
    if i in trainval:  
        ftrainval.write(name)
        if i in train:
            ftrain.write(name)  
        else:
            fval.write(name)  
    else:
        ftest.write(name)  
  
ftrainval.close()  
ftrain.close()
fval.close()
ftest.close()

别的也没啥说的

ok,那就这样吧~

欢迎各位大佬留言吐槽,也可以深入交流~

你可能感兴趣的:(YOLO4代码解读,工作小记,python,算法)