[2G显卡]使用darknet/YOLO训练自己的数据

news/2024/2/28 7:30:13

本文主要针对用显存较小的电脑上训练自己的YOLO数据,在clone了最新的darknet后结果只能跑得动yolov2,使用的是yolo.cfg与yolo.weights做的初始测试。随后修改配置文件,标记数据做的训练。
本人的环境是:Ubuntu 16.04+Nvidia GTX 1050显卡(2G)+ Python3.5.1+ CUDA 8.0
如果看到博文有什么疑问或是想要的交流的可以直接在文章后面留言~

目录

    • 目录
    • 1.获取数据与标签
      • (1)获取图片并使用labelimg标注图片生成xml数据
      • (2)将xml转换成为darknet能读入的txt格式文件
    • 2.修改配置文件
      • (1)修改.cfg文件
      • (2)新建cfg/eyes.data文件
    • 3.开始训练
    • 4.测试
    • 5.训练过程中的可视化
    • 6.一些报错的分析
      • AssertionError: Over-read bin/tiny-yolo.weights
      • AssertionError: labels.txt and cfg/yolo-tiny-eye.cfg indicate inconsistent class numbers
    • 主要参考

1.获取数据与标签

将图片转换为xml格式,随后再转换为txt.

(1)获取图片并使用labelimg标注图片生成xml数据

从FDDB数据库中提取300张图片并放入Image文件夹.

FDDB是全世界最具权威的人脸检测评测平台之一,包含2845张图片,共有5171个人脸作为测试集。测试集范围包括:不同姿势、不同分辨率、旋转和遮挡等图片,同时包括灰度图和彩色图,标准的人脸标注区域为椭圆形。
图片来源:美联社和路透社新闻报道图片,并删除了重复图片

使用标注工具labelimg手动给每一张图片加标签生成xml文件格式放入xml文件夹中.

(2)将xml转换成为darknet能读入的txt格式文件

首先需要生成一个包含所有图片名字的eyes_train.txt,这里命名为picaddress.py

#coding=utf-8
import os
import os.path
"""
将所有的图片文件名写进txt文件里
"""
pathh = "/home/hx-104b/darknet/Image/"
for filenames in os.walk(pathh):filenames = list(filenames)filenames = filenames[2]for filename in filenames:print(filename)with open ("eyes_train.txt",'a') as f:f.write(pathh+filename+'\n')

画风如下:
这里写图片描述
保存有所有图片的路径.

接着,使用修改过的voc_label.py将所有的xml文件转换成yolo能够读到的txt文件,其中txt格式的文件如下:

<object-class> <x> <y> <width> <height>

voc_label代码更改如下:

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import joinsets=[]
classes = ["eyes"]
#原样保留。size为图片大小
# 将ROI的坐标转换为yolo需要的坐标
# size是图片的w和h
# box里保存的是ROI的坐标(x,y的最大值和最小值)
# 返回值为ROI中心点相对于图片大小的比例坐标,和ROI的w、h相对于图片大小的比例def convert(size, box):dw = 1./size[0]dh = 1./size[1]x = (box[0] + box[1])/2.0y = (box[2] + box[3])/2.0w = box[1] - box[0]h = box[3] - box[2]x = x*dww = w*dwy = y*dhh = h*dhreturn (x,y,w,h)#对于单个xml的处理
def convert_annotation(image_id):image_add = os.path.split(image_id)[1] #截取文件名带后缀image_add = image_add[0:image_add.find('.', 1)]#删除后缀,现在只有文件名没有后缀in_file = open('/home/hx-104b/darknet/xml/%s.xml'%(image_add))print('now write to:/home/hx-104b/darknet/eye_labels/%s.txt' % (image_add))out_file = open('/home/hx-104b/darknet/eye_labels/%s.txt'%(image_add), 'w')tree=ET.parse(in_file)root = tree.getroot()for obj in root.findall("object"):# obj.append("number") = obj.find('name').textobj.find('name').text = "eyes"print(obj.find('name').text)tree.write('/home/hx-104b/darknet/xml/' + image_add + '.xml')size = root.find('size')w = int(size.find('width').text)h = int(size.find('height').text)# 如果训练标签中的品种不在程序预定品种,或者difficult = 1,跳过此objectfor obj in root.iter('object'):#difficult = obj.find('difficult').textcls = obj.find('name').textif cls not in classes:# or int(difficult) == 1:continuecls_id = classes.index(cls)xmlbox = obj.find('bndbox')# b是每个Object中,一个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()if not os.path.exists('/home/hx-104b/darknet/eye_labels/'):os.makedirs('/home/hx-104b/darknet/eye_labels/')
image_adds = open("eyes_train.txt")
for image_add in image_adds:image_add = image_add.strip()print (image_add)convert_annotation(image_add)

这样就可以将所有的xml文件转换成txt格式并保存到eye_labels文件夹.
随后便可以将eyes_train.txt分出来一部分文件名生成eyes_test.txt作为验证集.(我这里训练集270张图片,验证集30张图片)

如果只到这里会报错,会说找不到Image文件夹下的同名txt文件,因此将eyes_label文件夹下的txt文件全部复制到Image文件夹下.

随后Image文件夹的画风如下:
这里写图片描述
图片与他们的txt标签文件一一对应.

2.修改配置文件

(1)修改.cfg文件

复制不会报错的的的yolo.cfg复制为yolo-eyes.cfg,随后对yolo-eyes.cfg进行修改.
类别为1,即classes=1.
需要训练时将前四行中的testing注释掉,使用training参数.

[net]
# Testing
#batch=1
#subdivisions=1
# Training
batch=1
subdivisions=1

注:因为内存限制最后将batch和subdivision修改为1.

batch: 每一次迭代送到网络的图片数量,也叫批数量。增大这个可以让网络在较少的迭代次数内完成一个epoch。在固定最大迭代次数的前提下,增加batch会延长训练时间,但会更好的寻找到梯度下降的方向。如果你显存够大,可以适当增大这个值来提高内存利用率。这个值是需要大家不断尝试选取的,过小的话会让训练不够收敛,过大会陷入局部最优。
subdivision:这个参数很有意思的,它会让你的每一个batch不是一下子都丢到网络里。而是分成subdivision对应数字的份数,一份一份的跑完后,在一起打包算作完成一次iteration。这样会降低对显存的占用情况。如果设置这个参数为1的话就是一次性把所有batch的图片都丢到网络里,如果为2的话就是一次丢一半。

如果后续训练过程中会发散,则可以调整学习率,将学习率从0.001变得再小一点.

learning_rate=0.00001#学习率可以变得再小一点,避免训练过程中发散
burn_in=1000
max_batches = 500200#训练步长可以在这一步调整,原来是500200
policy=steps
steps=400000
scales=.1,.1

learning_rate:学习率,训练发散的话可以降低学习率。学习遇到瓶颈,loss不变的话也减低学习率。
policy:学习策略,一般都是step这种步进式。
step,scales:这两个是组合一起的,举个例子:learn_rate: 0.001, step:100,25000,35000 scales: 10, .1, .1 这组数据的意思就是在0-100次iteration期间learning rate为原始0.001,在100-25000次iteration期间learning rate为原始的10倍0.01,在25000-35000次iteration期间learning rate为当前值的0.1倍,就是0.001, 在35000到最大iteration期间使用learning rate为当前值的0.1倍,就是0.0001。随着iteration增加,降低学习率可以是模型更有效的学习,也就是更好的降低train loss。

更改[region]中的classes为1,根据 filters=(classes+coods+1)num f i l t e r s = ( c l a s s e s + c o o d s + 1 ) ∗ n u m 的公式,修改最后一个[convolutional]的filter改为30.

[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=1024
activation=leaky[convolutional]
size=1
stride=1
pad=1
filters=30 #修改这里的filter为30
activation=linear[region]
anchors =  0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828
bias_match=1
classes=1#修改种类为1
coords=4
num=5
softmax=1
jitter=.3
rescore=1object_scale=5
noobject_scale=1
class_scale=1
coord_scale=1absolute=1
thresh = .1
random=0#默认random为1,但是因为因为内存限制,将random改为0.

random,是一个开关。如果设置为1的话,就是在训练的时候每一batch图片会随便改成320-640(32整倍数)大小的图片。目的和上面的色度,曝光度等一样。如果设置为0的话,所有图片就只修改成默认的大小 416*416。(2018.04.08更新,评论给里有朋友说这里如果设置为1的话,训练的时候obj和noobj会出现全为0的情况,设置为0后一切正常。)

(2)新建cfg/eyes.data文件

vim cfg/eyes.data

在eyes.data文件中写下以下参数:

classes=1
train=/home/hx-104b/darknet/eyes_train.txt
valid=/home/hx-104b/darknet/eyes_test.txt
names=data/eyes.names
backup=backup

names是训练的名字,backup是在训练过程中相应步数的权重文件文件夹.

vim data/eyes.names

生成data/eyes.names文件并写入eyes类别.
生成backup文件夹.

mkdir backup

3.开始训练

./darknet detector train cfg/eyes.data cfg/yolo-eyes.cfg 

可以使用GPU监视命令,来查看GPU使用情况.

watch -n 1 nvidia-smi

watch的作用是周期性执行某一命令,”-n”后面指每多少秒执行一次命令,这里每隔1s更新一次GPU使用情况.
这里写图片描述

训练中的log如下:

...
Loaded: 0.000032 seconds
Region Avg IOU: 0.575282, Class: 1.000000, Obj: 0.320522, No Obj: 0.003656, Avg Recall: 1.000000,  count: 1
7176: 2.402723, 4.019706 avg, 0.001000 rate, 0.285689 seconds, 7176 imagesLoaded: 0.000029 seconds
Region Avg IOU: 0.494161, Class: 1.000000, Obj: 0.676317, No Obj: 0.002139, Avg Recall: 0.000000,  count: 1
7177: 2.484811, 3.866217 avg, 0.001000 rate, 0.281483 seconds, 7177 images
...

训练log中各参数的意义:

Region Avg IOU:平均的IOU,代表预测的bounding box和ground truth的交集与并集之比,期望该值趋近于1。
Avg Recall: 这个表示平均召回率, 意思是 检测出物体的个数 除以 标注的所有物体个数。期望该值趋近1
Class:是标注物体的概率,期望该值趋近于1.
Obj:期望该值趋近于1.
No Obj:期望该值越来越小但不为零.
avg:平均损失,期望该值趋近于0
count: 标注的所有物体的个数。 如果 count = 6, recall = 0.66667, 就是表示一共有6个物体(可能包含不同类别,这个不管类别),然后我预测出来了4个,所以Recall 就是 4 除以 6 = 0.66667 。
rate:当前学习率

4.测试

在GTX1050显卡(2G)训练了大约不到两天后在backup文件夹中可以看到所有的backup文件。
这里写图片描述
其中yolo-eyes_final.weights便是训练了50W次后的训练权重。
在终端输入命令测试:

./darknet detect cfg/yolo-eyes.cfg backup/yolo-eyes_final.weights test/img_1005.jpg -thresh 0.4

输出结果:

layer     filters    size              input                output0 conv     32  3 x 3 / 1   608 x 608 x   3   ->   608 x 608 x  32  0.639 BFLOPs1 max          2 x 2 / 2   608 x 608 x  32   ->   304 x 304 x  322 conv     64  3 x 3 / 1   304 x 304 x  32   ->   304 x 304 x  64  3.407 BFLOPs3 max          2 x 2 / 2   304 x 304 x  64   ->   152 x 152 x  644 conv    128  3 x 3 / 1   152 x 152 x  64   ->   152 x 152 x 128  3.407 BFLOPs5 conv     64  1 x 1 / 1   152 x 152 x 128   ->   152 x 152 x  64  0.379 BFLOPs6 conv    128  3 x 3 / 1   152 x 152 x  64   ->   152 x 152 x 128  3.407 BFLOPs7 max          2 x 2 / 2   152 x 152 x 128   ->    76 x  76 x 1288 conv    256  3 x 3 / 1    76 x  76 x 128   ->    76 x  76 x 256  3.407 BFLOPs9 conv    128  1 x 1 / 1    76 x  76 x 256   ->    76 x  76 x 128  0.379 BFLOPs10 conv    256  3 x 3 / 1    76 x  76 x 128   ->    76 x  76 x 256  3.407 BFLOPs11 max          2 x 2 / 2    76 x  76 x 256   ->    38 x  38 x 25612 conv    512  3 x 3 / 1    38 x  38 x 256   ->    38 x  38 x 512  3.407 BFLOPs13 conv    256  1 x 1 / 1    38 x  38 x 512   ->    38 x  38 x 256  0.379 BFLOPs14 conv    512  3 x 3 / 1    38 x  38 x 256   ->    38 x  38 x 512  3.407 BFLOPs15 conv    256  1 x 1 / 1    38 x  38 x 512   ->    38 x  38 x 256  0.379 BFLOPs16 conv    512  3 x 3 / 1    38 x  38 x 256   ->    38 x  38 x 512  3.407 BFLOPs17 max          2 x 2 / 2    38 x  38 x 512   ->    19 x  19 x 51218 conv   1024  3 x 3 / 1    19 x  19 x 512   ->    19 x  19 x1024  3.407 BFLOPs19 conv    512  1 x 1 / 1    19 x  19 x1024   ->    19 x  19 x 512  0.379 BFLOPs20 conv   1024  3 x 3 / 1    19 x  19 x 512   ->    19 x  19 x1024  3.407 BFLOPs21 conv    512  1 x 1 / 1    19 x  19 x1024   ->    19 x  19 x 512  0.379 BFLOPs22 conv   1024  3 x 3 / 1    19 x  19 x 512   ->    19 x  19 x1024  3.407 BFLOPs23 conv   1024  3 x 3 / 1    19 x  19 x1024   ->    19 x  19 x1024  6.814 BFLOPs24 conv   1024  3 x 3 / 1    19 x  19 x1024   ->    19 x  19 x1024  6.814 BFLOPs25 route  1626 conv     64  1 x 1 / 1    38 x  38 x 512   ->    38 x  38 x  64  0.095 BFLOPs27 reorg              / 2    38 x  38 x  64   ->    19 x  19 x 25628 route  27 2429 conv   1024  3 x 3 / 1    19 x  19 x1280   ->    19 x  19 x1024  8.517 BFLOPs30 conv     30  1 x 1 / 1    19 x  19 x1024   ->    19 x  19 x  30  0.022 BFLOPs31 detection
mask_scale: Using default '1.000000'
Loading weights from backup/yolo-eyes_final.weights...Done!
test/img_1005.jpg: Predicted in 0.071871 seconds.
person: 76%
init done
opengl support available

这里写图片描述
gakki的图片测试:
这里写图片描述
测试结果基本符合要求。

只是还有一个问题是,测试时候的names配置文件命名已经改成”eyes”一个类别,没想到显示的时候还是会显示person类别,一点是哪里不对,我现在还没有解决。。。

5.训练过程中的可视化

命令:

tee person_train_log.txt

使用:

./darknet detector train cfg/tiny-yolo.cfg tiny-yolo_8000.conv.9 2>1 | tee person_train_log.txt

保存log时会生成两个文件,文件1里保存的是网络加载信息和checkout点保存信息,person_train_log.txt中保存的是训练信息。
在使用脚本绘制变化曲线之前,需要先使用extract_log.py脚本,格式化log,用生成的新的log文件供可视化工具绘图,格式化log的extract_log.py脚本如下:

# coding=utf-8
# 该文件用来提取训练log,去除不可解析的log后使log文件格式化,生成新的log文件供可视化工具绘图def extract_log(log_file,new_log_file,key_word):
f = open(log_file)
train_log = open(new_log_file, 'w')
for line in f:# 去除多gpu的同步logif 'Syncing' in line:continue# 去除除零错误的logif 'nan' in line:continueif key_word in line:train_log.write(line)f.close()
train_log.close()extract_log('person_train_log.txt','person_train_log_loss.txt','images')   #voc_train_log.txt 用于绘制loss曲线
extract_log('person_train_log.txt','person_train_log_iou.txt','IOU')

使用train_loss_visualization.py脚本可以绘制loss变化曲线

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#%matplotlib inlinelines =9873
result = pd.read_csv('person_train_log_loss.txt', skiprows=[x for x in range(lines) if ((x%10!=9) |(x<1000))] ,error_bad_lines=False, names=['loss', 'avg', 'rate', 'seconds', 'images'])
result.head()result['loss']=result['loss'].str.split(' ').str.get(1)
result['avg']=result['avg'].str.split(' ').str.get(1)
result['rate']=result['rate'].str.split(' ').str.get(1)
result['seconds']=result['seconds'].str.split(' ').str.get(1)
result['images']=result['images'].str.split(' ').str.get(1)
result.head()
result.tail()#print(result.head())
# print(result.tail())
# print(result.dtypes)print(result['loss'])
print(result['avg'])
print(result['rate'])
print(result['seconds'])
print(result['images'])result['loss']=pd.to_numeric(result['loss'])
result['avg']=pd.to_numeric(result['avg'])
result['rate']=pd.to_numeric(result['rate'])
result['seconds']=pd.to_numeric(result['seconds'])
result['images']=pd.to_numeric(result['images'])
result.dtypesfig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(result['avg'].values,label='avg_loss')
#ax.plot(result['loss'].values,label='loss')
ax.legend(loc='best')
ax.set_title('The loss curves')
ax.set_xlabel('batches')
fig.savefig('avg_loss')
#fig.savefig('loss')

可以通过分析损失变化曲线,修改cfg中的学习率变化策略,比如上图:模型在100000万次迭代后损失下降速度非常慢,几乎没有下降。结合log和cfg文件发现,自定义的学习率变化策略在十万次迭代时会减小十倍,十万次迭代后学习率下降到非常小的程度,导致损失下降速度降低。修改cfg中的学习率变化策略,10万次迭代时不改变学习率,30万次时再降低。

除了可视化loss,还可以可视化Avg IOU,Avg Recall等参数
可视化’Region Avg IOU’, ‘Class’, ‘Obj’, ‘No Obj’, ‘Avg Recall’,’count’这些参数可以使用脚本train_iou_visualization.py,使用方式和train_loss_visualization.py相同,train_iou_visualization.py脚本如下:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#%matplotlib inlinelines =9873
result = pd.read_csv('voc_train_log_iou.txt', skiprows=[x for x in range(lines) if (x%10==0 or x%10==9) ] ,error_bad_lines=False, names=['Region Avg IOU', 'Class', 'Obj', 'No Obj', 'Avg Recall','count'])
result.head()result['Region Avg IOU']=result['Region Avg IOU'].str.split(': ').str.get(1)
result['Class']=result['Class'].str.split(': ').str.get(1)
result['Obj']=result['Obj'].str.split(': ').str.get(1)
result['No Obj']=result['No Obj'].str.split(': ').str.get(1)
result['Avg Recall']=result['Avg Recall'].str.split(': ').str.get(1)
result['count']=result['count'].str.split(': ').str.get(1)
result.head()
result.tail()#print(result.head())
# print(result.tail())
# print(result.dtypes)
print(result['Region Avg IOU'])result['Region Avg IOU']=pd.to_numeric(result['Region Avg IOU'])
result['Class']=pd.to_numeric(result['Class'])
result['Obj']=pd.to_numeric(result['Obj'])
result['No Obj']=pd.to_numeric(result['No Obj'])
result['Avg Recall']=pd.to_numeric(result['Avg Recall'])
result['count']=pd.to_numeric(result['count'])
result.dtypesfig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(result['Region Avg IOU'].values,label='Region Avg IOU')
#ax.plot(result['Class'].values,label='Class')
#ax.plot(result['Obj'].values,label='Obj')
#ax.plot(result['No Obj'].values,label='No Obj')
#ax.plot(result['Avg Recall'].values,label='Avg Recall')
#ax.plot(result['count'].values,label='count')
ax.legend(loc='best')
#ax.set_title('The Region Avg IOU curves')
ax.set_title('The Region Avg IOU curves')
ax.set_xlabel('batches')
#fig.savefig('Avg IOU')
fig.savefig('Region Avg IOU')xianka

6.一些报错的分析

之前使用darkflow做的yolo目标检测,darkflow最大的好处是很方便的python接口,但是因为训练的时候一直报错就没有再深入的走进去了。以下的分析大家看看就行

AssertionError: Over-read bin/tiny-yolo.weights

this error is caused by the mismatch between the cfg and binary weight file. Here is the related code which causes it.
At the beginning of flow, it will first try to initialize the TFNet from the given cfg and bin specified by the user in the command line.

# in darkflow/utils/loader.pyclass weights_walker(object):...self.size = os.path.getsize(path)

This walk will read weights from the bin file for each layer with the exact amount of bytes according to the cfg. Before actually reading it, it does a check on if the bytes to read is less than the remaining bytes in the file. Here is the code for that
出现这个错误是由于cfg与weights文件不兼容不匹配,可以下载对应的cfg以及weight文件.

flow --model cfg/yolo-tiny.cfg --load bin/yolo-tiny.weights

显示:

Parsing ./cfg/yolo-tiny.cfg
Parsing cfg/yolo-tiny.cfg
Loading bin/yolo-tiny.weights ...
Successfully identified 180357512 bytes
Finished in 0.003332376480102539s
Model has a VOC model name, loading VOC labels.Building net ...
Source | Train? | Layer description                | Output size
-------+--------+----------------------------------+---------------|        | input                            | (?, 448, 448, 3)Load  |  Yep!  | scale to (-1, 1)                 | (?, 448, 448, 3)Load  |  Yep!  | conv 3x3p1_1    leaky            | (?, 448, 448, 16)Load  |  Yep!  | maxp 2x2p0_2                     | (?, 224, 224, 16)Load  |  Yep!  | conv 3x3p1_1    leaky            | (?, 224, 224, 32)Load  |  Yep!  | maxp 2x2p0_2                     | (?, 112, 112, 32)Load  |  Yep!  | conv 3x3p1_1    leaky            | (?, 112, 112, 64)Load  |  Yep!  | maxp 2x2p0_2                     | (?, 56, 56, 64)Load  |  Yep!  | conv 3x3p1_1    leaky            | (?, 56, 56, 128)Load  |  Yep!  | maxp 2x2p0_2                     | (?, 28, 28, 128)Load  |  Yep!  | conv 3x3p1_1    leaky            | (?, 28, 28, 256)Load  |  Yep!  | maxp 2x2p0_2                     | (?, 14, 14, 256)Load  |  Yep!  | conv 3x3p1_1    leaky            | (?, 14, 14, 512)Load  |  Yep!  | maxp 2x2p0_2                     | (?, 7, 7, 512)Load  |  Yep!  | conv 3x3p1_1    leaky            | (?, 7, 7, 1024)Load  |  Yep!  | conv 3x3p1_1    leaky            | (?, 7, 7, 1024)Load  |  Yep!  | conv 3x3p1_1    leaky            | (?, 7, 7, 1024)Load  |  Yep!  | flat                             | (?, 50176)Load  |  Yep!  | full 50176 x 256  linear         | (?, 256)Load  |  Yep!  | full 256 x 4096  leaky           | (?, 4096)Load  |  Yep!  | drop                             | (?, 4096)Load  |  Yep!  | full 4096 x 1470  linear         | (?, 1470)
-------+--------+----------------------------------+---------------
Running entirely on CPU
2018-06-04 15:45:42.832684: I tensorflow/core/platform/cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
2018-06-04 15:45:42.925780: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:892] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2018-06-04 15:45:42.925998: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Found device 0 with properties: 
name: GeForce GTX 1050 major: 6 minor: 1 memoryClockRate(GHz): 1.455
pciBusID: 0000:01:00.0
totalMemory: 1.95GiB freeMemory: 1.24GiB
2018-06-04 15:45:42.926014: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1120] Creating TensorFlow device (/device:GPU:0) -> (device: 0, name: GeForce GTX 1050, pci bus id: 0000:01:00.0, compute capability: 6.1)
Finished in 1.2492377758026123sForwarding 8 inputs ...
Total time = 0.750807523727417s / 8 inps = 10.655194237111061 ips
Post processing 8 inputs ...
Total time = 0.20556306838989258s / 8 inps = 38.91749652630382 ips

AssertionError: labels.txt and cfg/yolo-tiny-eye.cfg indicate inconsistent class numbers

flow --model cfg/yolo-new.cfg

如种类不同,原来的labels.txt有20个种类,现在只有一个种类.
将classes转换为1.

主要参考

Darknet】【yolo v2】训练自己数据集的一些心得—-VOC格式

世上最详细,使用Darknet:Yolov3训练数据【看这里】

YOLO模型训练可视化训练过程中的中间参数

【YOLO学习】召回率(Recall),精确率(Precision),平均正确率(Average_precision(AP) ),交除并(Intersection-over-Union(IoU))

YOLOv3官网:https://pjreddie.com/darknet/yolo/
YOLOv2官网:https://pjreddie.com/darknet/yolov2/
darkflow官网:https://github.com/thtrieu/darkflow
darkflow翻译:https://blog.csdn.net/wc781708249/article/details/79710448


http://www.ppmy.cn/news/225921.html

相关文章

飞浆AI studio人工智能课程学习(4)-优质Prompt分享

文章目录 最具商业价值Prompt分享与颁奖02最具商业价值Prompt分享与颁奖-Top102最具商业价值Prompt分享与颁奖-Top202最具商业价值Prompt分享与颁奖-Top302最具商业价值Prompt分享与颁奖-Top402最具商业价值Prompt分享与颁奖-Top502最具商业价值Prompt分享与颁奖-Top602最具商业…

echarts折线图使用记录

1项目中引入echarts文档api介绍&#xff0c;链接地址如下 https://echarts.apache.org/handbook/zh/basics/import 2 官网基础样例介绍,链接地址如下 https://echarts.apache.org/handbook/zh/get-started/ 3 基本折线图介绍内容及链接 3.1 最简单的折线图 3.2 笛卡尔坐标系中…

JavaEE(系列20) -- 网络编程之UDP和TCP套接字

目录 1. 网络编程 2. UDP网络编程 2.1 DatagramSocket API 2.2 DatagramPacket API 2.3 基于UDP实现的回显服务器 2.3.1 UDP服务器设计步骤 2.3.2 服务器代码 2.3.3 客户端代码 2.3.4 基于UDP写一个字典服务器 3. TCP网络编程 3.1 ServerSocketAPI 3.2 SocketAPI …

ASUS华硕天选3笔记本电脑FX507ZM12700_3060原装出厂Windows11系统恢复原厂OEM系统

ASUS华硕天选3_FX507ZM12700_3060原装出厂系统恢复原厂系统ASUS华硕天选3笔记本电脑FX507ZM12700_3060原装出厂Windows11系统恢复原厂OEM系统 系统自带所有驱动、办公软件、奥创控制中心等预装软件 链接&#xff1a;https://pan.baidu.com/s/1R2ONT1r4JtgPEj7oA8tyfg?pwdqr74…

华硕adolbook14计算机专业能用吗,华硕a豆adolbook14s怎么样 华硕a豆adolbook14s值得买吗...

平常生活和工作都离不开电脑&#xff0c;但是读书时期用的那台笔记本真的是太老旧啦&#xff0c;因而为自己配备了华硕a豆adolbook14s&#xff0c;下面小编为大家介绍华硕a豆adolbook14s怎么样?华硕a豆adolbook14s值得买吗? 华硕a豆adolbook14s怎么样 这款华硕a豆的adolbook1…

小米笔记本、小米游戏本重装原装出厂镜像教程-有百度盘的提取码

转&#xff1a;【新的干货儿】小米笔记本、小米游戏本重装原装出厂镜像教程 有网友问提取码在哪.请参看下图: 2021.3.15 pro 15.6风扇打嗝叔不可忍,找到个方法,更新bios,不知有没有效,先记录在这,稍后更新bios,试试看,如果没有效果,还在这里说明 . 2022.9.20 有点效果,打嗝频率…

小米笔记本电脑怎么使用U盘重装系统教学

小米笔记本电脑怎么使用U盘重装系统教学分享。今天分享的这个U盘重新系统的方法&#xff0c;主要就是针对一些系统问题。如果你在使用电脑的时候出现了系统故障&#xff0c;导致系统无法正常使用。那么就可以通过U盘来进行电脑系统的重装。此方法需要提前制作一个启动盘&#x…

亲测可用小米刷旧版开发版固件,刷入华硕、潘多拉固件

准备 小米路由器青春版 *1、网线 *1、电脑 *1 准备文件&#xff1a;小米路由器青春版刷机.zip 最主要的还是小米路由器青春版的老版开发版固件 刷入开发版ROM 解压提供的压缩包 登录你的小米路由器&#xff08;192.168.31.1&#xff09; 然后选择升级系统、手动升级选择“…

内网安全:内网渗透.(拿到内网主机最高权限 vulntarget 靶场 1)

内网安全&#xff1a;内网渗透.&#xff08;拿到内网主机最高权限&#xff09; 内网穿透又被称为NAT穿透&#xff0c;内网端口映射外网&#xff0c;在处于使用了NAT设备的私有TCP/IP网络中的主机之间建立连接的问题。通过映射端口&#xff0c;让外网的电脑找到处于内网的电脑。…

umi4+antd5兼容360安全浏览器

项目场景&#xff1a; umi4创建的大屏项目&#xff0c;部分模块使用了antd5进行开发 问题描述 开发完成后&#xff0c;得知客户是360安全浏览器&#xff0c;内核为86&#xff0c;测试过程中出现了样式混乱。 混乱样式有下拉内容的组件&#xff08;如select、dataPicker&#…

小米mini php,小米路由器mini刷华硕固件的教程

官方固件 65.png (19.64 KB, 下载次数: 51) 2016-12-18 19:37 上传 ,刷了个华硕用着还不错 64.png (19.75 KB, 下载次数: 57) 2016-12-18 19:37 上传 步骤: 1、获取SSH & ROOT 首先要把小米路由器固件刷成开发版 下载好了,直接在miwifi web管理页面直接升级就ok了 点击打…

小米路由器青春版刷潘多拉、华硕固件

第一次刷路由器&#xff0c;网上查了好多的资料&#xff0c;写一篇博客记录一下&#xff0c;避免同样有需求的人在查找教程及固件上浪费大量的时间。 小米路由器青春版r1cl 开启ssh&#xff0c;刷入不死breed是通过查看百度的这篇文章&#xff0c;工具也是在这篇文章里下载的&a…

【6.05 代随_48day】 打家劫舍、打家劫舍 II、打家劫舍 III

打家劫舍、打家劫舍 II、打家劫舍 III 打家劫舍1.方法图解步骤代码 打家劫舍 II1.方法代码 打家劫舍 III图解步骤代码 打家劫舍 力扣连接&#xff1a;198. 打家劫舍&#xff08;中等&#xff09; 1.方法 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i]&am…

GitHub进不去或者响应满的轻松提速教程

1.先打开记事本用管理员身份运行&#xff0c;打开hosts hosts文件路径&#xff1a;C:\Windows\System32\drivers\etc\hosts&#xff0c;选所有文件&#xff0c;选中hosts文件 打开就是这样 如果打不开&#xff0c;修改一下文件的属性为可编辑 2.通过 https://www.ipaddress.com…

在 Python 中将十六进制转换为 Base64

文章目录 使用 Python 中的 codecs 模块将 HEX 转换为 BASE64使用 Python 中的 base64 模块将 HEX 转换为 BASE64使用 Python 中的 binascii 模块将 HEX 转换为 BASE64在 Python2 中将 HEX 转换为 BASE64 本篇文章将介绍在 Python 中将 hex 转换为 base64 的方法。 使用 Python…

锐捷AC的部署实例

进行锐捷AC部署时&#xff0c;遇到了一些问题&#xff0c;遂记录下来&#xff0c;如若大家在项目过程中遇到类似问题可以对照解决。 写在前面&#xff08;锐捷AC的基础配置&#xff09; ac-controller //配置AC的capwap源地址信息&#xff0c;国家码等…

Query hmdp start [ERR] 1067 - Invalid default value for ‘begin_time‘

做一个黑马点评的项目遇到了这个报错 Query hmdp start [ERR] 1067 - Invalid default value for begin_time 大概就是在时间的这个字段上有bug 于是我去查看对应的sql语句是 DROP TABLE IF EXISTS tb_seckill_voucher; CREATE TABLE tb_seckill_voucher ( voucher_id bigi…

数字卫星接收机解密大全(续)

1.亚视达5288&#xff08;海克威&#xff09;&#xff1a; ( D, z% M; d2 x2 ~9 S* / m7 H星友之家参数论坛 &#xff08;1&#xff09;首先按遥控器“MENU”键进入系统设置&#xff0c;按“OK”进入。6 k9 r) D0 M. ( F d. E &#xff08;2&#xff09;进入“系统设置…

adb 连接方式汇总

经常遇到各种盒子连接方式问题&#xff0c;因此汇总下adb的打开方式&#xff0c;以供下次查阅。 电信 adb连接方式汇总 省份 厂家 机顶盒型号 adb连接方式 广东电信 华为 Q21 使用华为stbId工具&#xff0c;在机顶盒的允许远程连接中关闭后再打开获取密码&#xff0c;然后在工…

移动端屏幕适配+事件+常见问题解决

移动端屏幕适配 <meta name"viewport" content"widthdevice-width, initial-scale1, maximum-scale1, minimum-scale1, user-scalableno"> 移动端屏幕适配与响应式的区别移动端屏幕适配&#xff1a; 移动端 宽高% / rem 字体px 宽高都随着屏幕变化等…
最新文章