python opencv DTree модель: train () завершается с std :: length_error - PullRequest
0 голосов
/ 09 апреля 2020

Я использую opencv- python 4.2.0.32 и Python 3.7.4.

Когда я вызываю train () для модели DTree, моя программа завершается с ошибкой:

terminate called after throwing an instance of 'std::length_error' what(): vector::reserve Aborted (core dumped)

Код работает, когда я использую модель KNearest вместо DTree. Это немного похоже на поведение, описанное здесь , но я использую более свежую версию OpenCV, так что, возможно, что-то еще происходит?

Пример кода для воспроизведения поведения:

import numpy as np
import cv2

samples = np.ndarray((5, 2), np.float32)
labels = np.zeros((5, 1), dtype=np.float32)

# This works
model_knn = cv2.ml.KNearest_create()
model_knn.train(samples=samples, layout=cv2.ml.ROW_SAMPLE, responses=labels)

# This terminates with an error
model_dtree = cv2.ml.DTrees_create()
model_dtree.train(samples=samples, layout=cv2.ml.ROW_SAMPLE, responses=labels)

1 Ответ

0 голосов
/ 09 апреля 2020

Похоже, что DTrees требует явной настройки - если вы сделаете print(model_dtree.getMaxDepth()), он вернет 2147483647, максимальное значение для 32-разрядного целого числа со знаком (https://en.wikipedia.org/wiki/2, 147 483 647 ). Когда вы явно устанавливаете глубину, сценарий запускается успешно:

import numpy as np
import cv2

samples = np.ndarray((5, 2), np.float32)
labels = np.zeros((5, 1), dtype=np.float32)

print(samples)
# This works
model_knn = cv2.ml.KNearest_create()
model_knn.train(samples=samples, layout=cv2.ml.ROW_SAMPLE, responses=labels)

# This terminates with an error
model_dtree = cv2.ml.DTrees_create()
print(model_dtree.getMaxDepth()) # should be 2147483647, which we don't want
model_dtree.setMaxDepth(10) # set it to something reasonable
model_dtree.train(samples=samples, layout=cv2.ml.ROW_SAMPLE, responses=labels)
print('finished training!')
...