python - 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)。为什么会这样?
解决方案
推荐阅读
- testng - testng 删除测试名称数据提供者参数
- react-native - 反应本机共享 API - 同时使用消息和 url 时的问题
- c# - 编译器看不到接口中的默认实现?
- deployment - 无需重新部署依赖解决方案即可部署 BizTalk 架构解决方案
- javascript - 无法在反应中显示从 api 接收到的不同 json 数据
- javascript - Sweetalert2 Swal 火在弹出后消失。很奇怪的错误
- python - 在 Python 中使用多线程 for 循环有意义吗?
- linux - 在字符串中使用主机名
- iis - 访问 IIS 8.5 服务器站点时出现“连接重置”错误
- java - Hibernate:外键的列数错误。应该是 1