首页 > 解决方案 > Dlib 训练错误:当所有条件都为真时,有关纵横比和区域大小的错误

问题描述

我使用 dlib.train_simple_object_detector 为成束的钢筋创建检测器。这是我的样本: 在此处输入图像描述

每个条都有相同的框(通过 labelImg 中的 Duplicate RectBox 创建),框的大小为 122x118(区域为 14396)。

这是我的训练代码:

import dlib
import cv2.cv2 as cv2
import os
import time
import sys
from xml.dom import minidom

if len(sys.argv) != 4:
    print("Usage: python train.py /path/to/images/ /path/to/boxes/ /path/to/result.svm")
    print("Images and boxes are named like 1.jpg and 1.xml")
    exit(1)

data = {}

image_indexes = [int(img_name.split(".")[0]) for img_name in os.listdir(sys.argv[1])]

# np.random.shuffle(image_indexes)
image_indexes.sort()

# parse rectangle data
for index in image_indexes:
    if index in [0]:
        continue

    rects = minidom.parse("{}/{}.xml".format(sys.argv[2], index)).getElementsByTagName("bndbox")

    img = cv2.imread(os.path.join(sys.argv[1], str(index) + ".jpg"))

    for rect in rects:
        xmin = int(rect.getElementsByTagName("xmin")[0].firstChild.data)
        xmax = int(rect.getElementsByTagName("xmax")[0].firstChild.data)
        ymin = int(rect.getElementsByTagName("ymin")[0].firstChild.data)
        ymax = int(rect.getElementsByTagName("ymax")[0].firstChild.data)

        dlib_box = dlib.rectangle(left=xmin, top=ymin, right=xmax, bottom=ymax)
        if index in data:
            data[index][1].append(dlib_box)
        else:
            data[index] = (img, [dlib_box])


# train
percent = 0.8
split = int(len(data) * percent)

images = [tuple_value[0] for tuple_value in data.values()]
bounding_boxes = [tuple_value[1] for tuple_value in data.values()]

options = dlib.simple_object_detector_training_options()

options.add_left_right_image_flips = False
options.C = 5
options.num_threads = 16
options.epsilon = 0.01
# options.be_verbose = True

st = time.time()

detector = dlib.train_simple_object_detector(images[:split], bounding_boxes[:split], options)

print("Training complete. Time taken: {:.2f} seconds.".format(time.time() - st))
print("Training Metrics: {}".format(dlib.test_simple_object_detector(images[:split], bounding_boxes[:split], detector)))

detector.save(sys.argv[3])

当我使用此示例运行它时,它会出现错误:

Error! An impossible set of object boxes was given for training. All the boxes 
need to have a similar aspect ratio and also not be smaller than about 400 
pixels in area.

但事实并非如此。它们肯定具有相同的纵横比,因为它们是相同的框,并且它们的面积确实 > 400(实际上约为 14000)。为什么会这样?

标签: pythoncomputer-visiondlib

解决方案


推荐阅读