Вызвать Keras Predict () из C ++ не удается - PullRequest
0 голосов
/ 04 октября 2019

Я вызываю функцию Python из C ++ (MFC), используя Python C. API.

Например ...

C ++ Code

Py_Initialize();
PyEval_InitThreads();

PyThreadState* save = PyEval_SaveThread();
PyGILState_STATE state = PyGILState_Ensure();

PyObject* module = PyImport_ImportModule("scripts.KerasModule");
if (module) {
    PyObject* functionName = PyObject_GetAttrString(module, "PythonFuncName");

    if (functionName) {
    PyObject* result = PyEval_CallObject(functionName, Mat(opencv));

    if (result) {
        int r = (int)PyLong_AsLong(result);
    }
}

PyGILState_Release(state);
PyEval_RestoreThread(save);

.Py Code

def PythonFuncName(image=None):
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    pil_image = Image.fromarray(image)
    np_image = np.array(pil_image).astype('float32')/255
    np_image = transform.resize(np_image, (100, 100, 3))
    np_image = np.expand_dims(np_image, axis=0)

    global model
    if(model == 0):
        return -1

    cv2.imshow('asdasd', image)
    cv2.waitKey(delay=300)

    startTime = time.time()
    out = model.predict(np_image)                         # << ????
    endTime = time.time()
    tackTime = endTime - startTime
    print("ptime : " + str(tackTime))
    print("out : " + str(out))

    print("---------------- Predict Complite ----------------\n")
    if (out > 0.5):
        return 1
    else:
        return 0

Однажды этот код обычно работает хорошо.

Но, когда я вызываю функцию из потока (std :: thread),

out = model.predict(np_image)

Эта строка нене работает.

cv2.imshow('asdasd', image)
cv2.waitKey(delay=300)

imshow работает.

Я думаю ... std :: Кажется, есть проблема при вызове связанной с Keras функции из потока. У вас есть информация об этом?

...