使用Keras版本的Yolov3训练自己的数据集和进行目标检测时,需要注意的一些问题

2023-05-16

最近因为工作需要,使用了Yolo v3做目标检测。由于它自带的数据集完全不能够满足需要,只能从头开始自己训练。当然这必须要用python来做了,不能用C语言。。。

首先,我发现那个著名的Keras版本非常好:https://github.com/qqwweee/keras-yolo3 但它的一些地方很麻烦,尤其是关于训练,作者给出的方法太粗糙了,甚至没有使用标注软件。。。

于是我在网上搜索了一下,发现有个网页确实讲得很具体,值得学习啊,感谢 鸡立鹤群的大愚弱智 为大家所做的贡献:https://blog.csdn.net/u012746060/article/details/81183006

但其中还是有一些问题没有讲清楚,以至于网页下方有很多人在提问,始终没有收到回复。因为我已经基本搞明白了,所以这里补充说明几个关键点,希望对大家有用:

    文件夹叫什么名字其实无所谓,不一定要叫VOC2007,只需要在后面的各项设置中把名字对应上就行。

    logs/000/目录也不是一定要存在,如果想放在别的路径,记得训练之前去train.py里,把log_dir = ‘logs/000/’ 改掉;训练之后去yolo.py里,把"model_path": ‘logs/000/trained_weights.h5’ 改掉。

    就如同一些人发现的那样,使用python yolo.py实际上是无法实现图片检测的,只会显示Using TensorFlow backend,然后立即退出。正确的办法应该是使用python yolo_video.py --image。
    PS:如果直接去原作者的Github页面看他的介绍,会发现他描述的用法也是用yolo_video.py,而不是yolo.py。

    我看到有些人反映说,运行之后出现了类似于这样的提示:
    2019-07-09 13:48:45.569398: E tensorflow/core/grappler/optimizers/meta_optimizer.cc:502] shape_optimizer failed: Invalid argument: Subshape must ha ve computed start >= end since stride is negative, but is 0 and 2 (computed from start 0 and end 9223372036854775807 over shape with rank 2 and str ide-1)
    2019-07-09 13:48:46.972414: E tensorflow/core/grappler/optimizers/meta_optimizer.cc:502] remapper failed: Invalid argument: Subshape must have comp uted start >= end since stride is negative, but is 0 and 2 (computed from start 0 and end 9223372036854775807 over shape with rank 2 and stride-1)
    2019-07-09 13:48:47.816976: E tensorflow/core/grappler/optimizers/meta_optimizer.cc:502] layout failed: Invalid argument: Subshape must have comput ed start >= end since stride is negative, but is 0 and 2 (computed from start 0 and end 9223372036854775807 over shape with rank 2 and stride-1)
    这个没有关系的,这个提示完全不妨碍正确的检测结果,我这边也有这类提示。

    不用GPU的话,训练速度当然很慢,各位只能自己想办法了。如果现实中找不到好电脑,可以考虑网上云端运行。至于有人说“这个程序不能用GPU运行”,这个情况我完全没有遇到,不知道为何。

    修改iou和score的值非常简单,去yolo.py里面,修改第27和第28行即可。不过个人感觉系统默认值其实是挺合理的。

    关于如何修改学习率,这边有一个细节。在 鸡立鹤群的大愚弱智 的网页上,他是把train.py重写了,这样就和原始的train.py很不一样了。
    如果大家去看原始的文件,会在第53行看到optimizer=Adam(lr=1e-3),第73行看到optimizer=Adam(lr=1e-4),它的意思是分成两个阶段训练,第一阶段使用较大的学习率去探索,到后面第二阶段开始微调了,就改成较小的学习率,所以本身Yolo v3的学习率一定是可以设定的。
    但是在重写的文件里,这两行都没了,只剩下第22行的optimizer=‘adam’, 意思应该是从头到尾学习率不变,不分阶段。所以我甚至不确定这个版本的Yolo v3到底用了多大的学习率?系统默认学习率是多少我也不知道。。。
    总之如果想手动修改lr,应该就是在这个地方附近吧。我没改过,感觉没有必要。

    有一个细节虽然不影响程序正常运行,但其实是 的一个失误。在他的第3步里,他生成了4个txt文件,包括了初步的验证集val.txt,并且在第4步生成了最终的验证集2007_val.txt。但是到了他的第7步,他又在最终的训练集2007_train.txt里面划出10%的数据作为验证集,并且他第7步的train.py里面,根本就没有读取2007_val.txt。换言之,他的2007_val.txt白做了,所有的数据都浪费了,最终的验证集数据其实还是来源于训练集。
    对这种情况最简单的处理办法就是,在他第3步里,设置trainval_percent = 0,train_percent = 1,这样最后就没有2007_val.txt了,所有的数据都会进入2007_train.txt,都不浪费。

    loss值运行很久之后不下降,或者loss值变得很小之后,检测效果仍然不好,那么有很多种可能性,无法几句话概括。最大的可能性之一是:你的数据太少了。我看到有人说,训练集用了100多张照片,这可不太够。。。

    这个程序确实没有输出训练日志文件,没法直接画loss曲线之类的。但实现这一步其实很简单,因为训练数据会展示出来,比如在cmd里或者jupyter notebook里。我们直接把这些数据拷贝出来,粘贴到记事本里就行了。然后你可以用excel读取这个文本文件,转化为excel格式(比如把空格作为分隔符读取),接下来怎么画图都可以。

    Yolo v3确实没有自带的“用测试集评估模型的代码”,这是目标检测本身的原理导致的,所以你只能人工评估。比如你图上有10个目标,结果检测出来9个,有1个是错误的,8个是正确的,那么你的precision就是8/9=0.89,recall就是8/10=0.8,F1 score可以算出来是0.84。这个你只能手动算。。。
    你要想让Yolo v3和你标注的结果(比如LabelImg的xml文件)做对比,然后自动输出统计结果,这不现实,它目前还没这个功能呢。
    这也就是8里为什么我提议设置trainval_percent = 0,train_percent = 1的原因,因为这个程序里根本不包含测试代码,test.txt和2007_test.txt的数据说白了也是被浪费的,不如不要。

    最最重要的一点:很多人都反映了同一个问题,即一张图片最多只能识别20个对象。事实上我做的时候,有2类,一开始就最多只能识别40个对象,所以是遇到了同一个问题(大家都是做小物体检测的吧?)。
    这个问题的答案其实非常简单,我最终是在这个程序Github网页的某个issue里找到答案的。。。外国人A问了这个问题,外国人B给出了答案:
    20是这个程序预设的一个参数(超参数),意思是每张图片最多只能识别20个,所以把这个参数改掉就行了!
    要改的地方有两个:
    (1)训练时,要在yolo3文件夹下面的utils.py里,修改get_random_data()函数,有一个默认参数是max_boxes=20,改成很大的数值就行了。
    (2)检测时,要在yolo3文件夹下面的model.py里,修改yolo_eval()函数,有一个默认参数是max_boxes=20,改成很大的数值就行了。
    (1)是外国人B说的,(2)是我后来自己摸索出来的。(2)很重要,但其实(1)也很关键,要是不改的话,你在一张图里的标注,最多就只有20个被系统输入了,别的都浪费了。

    最后总结一下:这个Keras版本的Yolo v3程序肯定是没问题的;如果有问题,都是可以解决和克服的;实在解决不了,网上中文和英文资源那么多,搜一搜就好啦。


————————————————
版权声明:本文为CSDN博主「yitai_kongtiao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45488478/article/details/98397947

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Keras版本的Yolov3训练自己的数据集和进行目标检测时,需要注意的一些问题 的相关文章

  • 如何从 Pandas DataFrame 转换为 Tensorflow BatchDataset 以进行 NLP?

    老实说 我想弄清楚如何转换数据集 格式 pandasDataFrame或 numpy 数组 转换为简单文本分类张量流模型可以训练用于情感分析的形式 我使用的数据集类似于 IMDB 包含文本和标签 正面或负面 我看过的每个教程要么以不同的方式
  • 为什么平均百分比误差(mape)非常高?

    我已获得代码掌握机器学习 https machinelearningmastery com time series prediction lstm recurrent neural networks python keras 我修改了mod
  • Keras 中批量大小可变的batch_dot

    我正在尝试编写一个层来合并 2 个张量formula https i stack imgur com I49aj png x 0 和x 1 的形状都是 1 500 M是500 500的矩阵 我希望输出为 500 500 我认为这在理论上是可
  • model.fit 在 Keras 中如何工作?

    我之前的帖子或错误是这样的one https stackoverflow com questions 52261090 do the operations defined in array ops in tensorflow have gr
  • 如何使用 Keras ImageDataGenerator 预测单个图像?

    我已经训练 CNN 对图像进行 3 类分类 在训练模型时 我使用 keras 的 ImageDataGenerator 类对图像应用预处理功能并重新缩放它 现在我的网络在测试集上训练得非常准确 但我不知道如何在单图像预测上应用预处理功能 如
  • keras:zca 美白卡住了 train_datagen.fit()

    我尝试将 zca whitening 与 keras 图像处理选项一起使用 但计算陷入困境并且永远不会结束 我导致问题的代码部分如下所示 train datagen ImageDataGenerator rotation range 30
  • 优化 Keras 以使用所有可用的 CPU 资源

    好吧 我真的不知道我在说什么 所以请耐心听我说 我正在使用 Theano 后端运行 Keras 以在 MNIST 图像上运行基本的神经网络 目前只是一个教程 过去 我一直使用我的旧 HP 笔记本电脑 因为我有 Windows 和 Ubunt
  • Keras conv1d 层参数:过滤器和 kernel_size

    我对 keras 的 conv1d 层中的这两个参数感到非常困惑 https keras io layers convolutional conv1d https keras io layers convolutional conv1d 文
  • 如何为模型提供“输出列表”?

    很抱歉这个标题 但我无法在这里提出更好的描述 我正在尝试应用批量训练模型 该模型应该有 13 个完全连接的输出层 每个输出层只有两个节点 但如所述完全连接 构建模型的输出如下所示 outputs list for i in range nu
  • 收到的标签值 1 超出了 [0, 1) 的有效范围 - Python、Keras

    我正在使用具有张量流背景的 keras 开发一个简单的 cnn 分类器 def cnnKeras training data training labels test data test labels n dim print Initiat
  • 在NN中指定连接(在keras中)

    我正在使用 keras 和tensorflow 1 4 我想明确指定哪些神经元在两层之间连接 因此 每当第一层中的神经元 i 连接到第二层中的神经元 j 且其他地方为零时 我就有一个矩阵 A 其中包含 1 我的第一次尝试是创建一个带有内核的
  • 如何在Keras模型中替换(或插入)中间层?

    我有一个训练有素的 Keras 模型 我想要 1 用相同但没有偏差的Con2D层替换Con2D层 2 在第一次激活之前添加 BatchNormalization 层 我怎样才能做到这一点 def keras simple model fro
  • 无法从 DenseVariational 获得合理的结果

    我正在尝试使用以下大小的数据集 正弦曲线 进行回归问题500 首先 我尝试使用 2 个密集层 每个层有 10 个单元 model tf keras Sequential tf keras layers Dense 10 activation
  • Keras,如何获取每一层的输出?

    我已经用 CNN 训练了一个二元分类模型 这是我的代码 model Sequential model add Convolution2D nb filters kernel size 0 kernel size 1 border mode
  • 无法更改现有 Keras 模型中的激活

    我有一个普通的 VGG16 模型relu激活 即 def VGG 16 weights path None model Sequential model add ZeroPadding2D 1 1 input shape 3 224 224
  • 修改Keras中的层权重

    我正在尝试修改 Keras 中某个层的输出 我有一个编码器 它将时间序列转换为潜在空间 之后 对于每个压缩的时间序列 我想向时间序列添加一些数字 例如我有 input d Input 100 h1 d Reshape 100 1 input
  • 使用 Keras Tuner 调整模型时如何跳过有问题的超参数组合?

    使用 Keras Tuner 时 似乎没有办法允许跳过有问题的超参数组合 例如 Conv1D 层中的过滤器数量可能与后续 MaxPooling1D 层中的池大小的所有值不兼容 从而导致模型构建错误 然而 在运行调谐器之前可能不知道这一点 一
  • conv1D 中形状的尺寸

    我尝试过构建一个只有一层的 CNN 但遇到了一些问题 事实上 编译器告诉我 ValueError 检查模型输入时出错 预期的 conv1d 1 input 具有 3 个维度 但得到形状为 569 30 的数组 这是代码 import num
  • 神经网络 - 我的网络似乎训练得很好,但在分类报告中它是完全随机的

    我正在训练一个模型来对 3 种类型的车辆进行分类 一切看起来都很顺利 直到我尝试用我的模型预测任何事情 预测结果是完全随机的 我使用 3 个类别的 15000 张图像 每个类别 5000 个 进行训练 并使用 3 个类别的 6000 个图像
  • Keras:binary_crossentropy 和 categorical_crossentropy 混淆

    使用 TensorFlow 一段时间后 我阅读了一些 Keras 教程并实现了一些示例 我找到了几个使用卷积自动编码器的教程keras losses binary crossentropy作为损失函数 我想binary crossentro

随机推荐