【发布时间】:2021-03-06 02:03:29
【问题描述】:
我想用 yolov3-tiny 创建一个检测汽车和摩托车的网络,所以我创建了自己的数据集,其中包含 100 个汽车图像和 100 个摩托车图像。在注释文件中,标签是正确的(0 表示汽车,1 表示摩托车)。由于我有 2 个类,我已将 yolov3-tiny.cfg 修改为将类设置为 2,将过滤器设置为 (classes+5)*3 = 21。我还将批处理修改为 24,细分为 8。这是完整的cfg 文件(./custom/car_moto-yolov3-tiny.cfg):
[net]
# Testing
batch=24
subdivisions=8
# Training
# batch=64
# subdivisions=2
width=416
height=416
channels=3
momentum=0.9
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue=.1
learning_rate=0.001
burn_in=1000
max_batches = 5000
policy=steps
steps=400000,450000
scales=.1,.1
[convolutional]
batch_normalize=1
filters=16
size=3
stride=1
pad=1
activation=leaky
[maxpool]
size=2
stride=2
[convolutional]
batch_normalize=1
filters=32
size=3
stride=1
pad=1
activation=leaky
[maxpool]
size=2
stride=2
[convolutional]
batch_normalize=1
filters=64
size=3
stride=1
pad=1
activation=leaky
[maxpool]
size=2
stride=2
[convolutional]
batch_normalize=1
filters=128
size=3
stride=1
pad=1
activation=leaky
[maxpool]
size=2
stride=2
[convolutional]
batch_normalize=1
filters=256
size=3
stride=1
pad=1
activation=leaky
[maxpool]
size=2
stride=2
[convolutional]
batch_normalize=1
filters=512
size=3
stride=1
pad=1
activation=leaky
[maxpool]
size=2
stride=1
[convolutional]
batch_normalize=1
filters=1024
size=3
stride=1
pad=1
activation=leaky
###########
[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
activation=leaky
[convolutional]
batch_normalize=1
filters=512
size=3
stride=1
pad=1
activation=leaky
[convolutional]
size=1
stride=1
pad=1
filters=21
activation=linear
[yolo]
mask = 3,4,5
anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319
classes=2
num=6
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=1
[route]
layers = -4
[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky
[upsample]
stride=2
[route]
layers = -1, 8
[convolutional]
batch_normalize=1
filters=256
size=3
stride=1
pad=1
activation=leaky
[convolutional]
size=1
stride=1
pad=1
filters=21
activation=linear
[yolo]
mask = 0,1,2
anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319
classes=2
num=6
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=1
然后我创建了 .names 文件 (./data/custom_cfg.names):
cars
motorcylcles
创建了 train.txt、test.txt 和 obj.data (./custom/obj.data):
classes= 2
train = data/train.txt
valid = data/test.txt
names = data/custom_cfg.names
backup = yolov3-tiny_2classes
最后,我通过执行命令使用darknet53.conv.74模型开始了训练
darknet detector train custom/obj.data custom/car_moto-yolov3-tiny.cfg darknet53.conv.74.
这是训练过程的示例输出:
5998: 0.619981, 0.483621 avg loss, 0.001000 rate, 0.499771 seconds, 143952 images, 0.011460 hours left
Loaded: 0.000028 seconds
v3 (mse loss, Normalizer: (iou: 0.75, obj: 1.00, cls: 1.00) Region 16 Avg (IOU: 0.828822), count: 3, class_loss = 0.617392, iou_loss = 0.131867, total_loss = 0.749259
v3 (mse loss, Normalizer: (iou: 0.75, obj: 1.00, cls: 1.00) Region 23 Avg (IOU: 0.000000), count: 1, class_loss = 0.000005, iou_loss = 0.000000, total_loss = 0.000005
total_bbox = 172619, rewritten_bbox = 0.000000 %
v3 (mse loss, Normalizer: (iou: 0.75, obj: 1.00, cls: 1.00) Region 16 Avg (IOU: 0.762853), count: 3, class_loss = 1.025908, iou_loss = 0.332650, total_loss = 1.358558
v3 (mse loss, Normalizer: (iou: 0.75, obj: 1.00, cls: 1.00) Region 23 Avg (IOU: 0.000000), count: 1, class_loss = 0.000002, iou_loss = 0.000000, total_loss = 0.000002
total_bbox = 172622, rewritten_bbox = 0.000000 %
v3 (mse loss, Normalizer: (iou: 0.75, obj: 1.00, cls: 1.00) Region 16 Avg (IOU: 0.841586), count: 3, class_loss = 0.431826, iou_loss = 0.156079, total_loss = 0.587906
v3 (mse loss, Normalizer: (iou: 0.75, obj: 1.00, cls: 1.00) Region 23 Avg (IOU: 0.000000), count: 1, class_loss = 0.000002, iou_loss = 0.000000, total_loss = 0.000002
total_bbox = 172625, rewritten_bbox = 0.000000 %
v3 (mse loss, Normalizer: (iou: 0.75, obj: 1.00, cls: 1.00) Region 16 Avg (IOU: 0.743486), count: 3, class_loss = 0.947532, iou_loss = 0.385455, total_loss = 1.332986
v3 (mse loss, Normalizer: (iou: 0.75, obj: 1.00, cls: 1.00) Region 23 Avg (IOU: 0.000000), count: 1, class_loss = 0.000001, iou_loss = 0.000000, total_loss = 0.000001
total_bbox = 172628, rewritten_bbox = 0.000000 %
v3 (mse loss, Normalizer: (iou: 0.75, obj: 1.00, cls: 1.00) Region 16 Avg (IOU: 0.798283), count: 3, class_loss = 0.519976, iou_loss = 0.205342, total_loss = 0.725317
v3 (mse loss, Normalizer: (iou: 0.75, obj: 1.00, cls: 1.00) Region 23 Avg (IOU: 0.000000), count: 1, class_loss = 0.000001, iou_loss = 0.000000, total_loss = 0.000001
total_bbox = 172631, rewritten_bbox = 0.000000 %
v3 (mse loss, Normalizer: (iou: 0.75, obj: 1.00, cls: 1.00) Region 16 Avg (IOU: 0.843649), count: 3, class_loss = 0.362844, iou_loss = 0.099908, total_loss = 0.462752
v3 (mse loss, Normalizer: (iou: 0.75, obj: 1.00, cls: 1.00) Region 23 Avg (IOU: 0.000000), count: 1, class_loss = 0.000002, iou_loss = 0.000000, total_loss = 0.000002
total_bbox = 172634, rewritten_bbox = 0.000000 %
v3 (mse loss, Normalizer: (iou: 0.75, obj: 1.00, cls: 1.00) Region 16 Avg (IOU: 0.757608), count: 4, class_loss = 0.757355, iou_loss = 0.273935, total_loss = 1.031290
v3 (mse loss, Normalizer: (iou: 0.75, obj: 1.00, cls: 1.00) Region 23 Avg (IOU: 0.000000), count: 1, class_loss = 0.000002, iou_loss = 0.000000, total_loss = 0.000002
total_bbox = 172638, rewritten_bbox = 0.000000 %
v3 (mse loss, Normalizer: (iou: 0.75, obj: 1.00, cls: 1.00) Region 16 Avg (IOU: 0.775621), count: 3, class_loss = 0.883560, iou_loss = 0.192446, total_loss = 1.076006
v3 (mse loss, Normalizer: (iou: 0.75, obj: 1.00, cls: 1.00) Region 23 Avg (IOU: 0.000000), count: 1, class_loss = 0.000000, iou_loss = 0.000000, total_loss = 0.000000
total_bbox = 172641, rewritten_bbox = 0.000000 %
就是这样。我总是得到 Region 23 Avg (IOU: 0.000000)、class_loss = 0.000000、iou_loss = 0.000000、total_loss = 0.000000 或非常接近的值。然后,当我让网络运行时,它只分类了一类,即“汽车”。甚至摩托车也被归类为汽车。 有人可以帮忙吗?
以下是一些输入图像示例:
【问题讨论】:
-
您在标记数据时可能犯了一个错误。您是否在注释文件中将“汽车”标记为标签 0,将“摩托车”标记为标签 1?
-
是的,我做到了。我已经编辑了问题并添加了这个细节。谢谢。
-
你能解释一下训练期间“v3”起跑线的条目吗?我认为有趣的是,总是有一行带有 count:3-4 并且后面有一行带有 count:1。如果 count:1 是摩托车,它看起来不平衡。你能展示一些典型的图片吗?
-
我不知道这些输出线的确切含义(大约 2 周前我知道 YOLO 和 DarkNet),但是是的,那些带 1 的线对应于摩托车。如果不平衡,我该怎么办?我编辑了帖子并添加了一些输入图像示例。
标签: python opencv yolo darknet