Как переписать Python-код Dlib на C ?

#python #c #dlib

#python #c #dlib

Вопрос:

Я написал код python с использованием dlib, но из-за особенностей проекта мне нужно переписать тот же код на C . Это почти все сделано, но самое главное, я не смог найти точный эквивалент в C .

Версия python:

 [boxes, confidences, detector_idxs] = dlib.fhog_object_detector.run_multiple(detectors, image, upsample_num_times=1, adjust_threshold=0.0)
 

C , который я пробовал, это:

 vector<rectangle> detection = evaluate_detectors(detectors, img, adjust_threshold);
 

Я все еще не запускал код, но я не уверен, что эта функция, которую я использовал в C , вернет три информации (поля, confidencies, detector_idxs), как в python, из того, что я вижу, я думаю, что она вернет только поля.

Вы знаете, правильно ли я это делаю? Как я могу получить эти три информации, которые мне нужны?

РЕДАКТИРОВАТЬ 01: ошибки при использовании функции:

 tuple<std::vector<dlib::rectangle>, list<T> confidences>, list<T> detector_idxs> = run_multiple_rect_detectors(detectores, img, upsampling_amount, adjust_threshold);

error C2065: 'T': undeclared identifier

error C2923: 'std::list': 'T' is not a valid template type argument for parameter '_Ty'

error C2903: 'allocator': symbol is neither a class template nor a function template

error C3203: 'allocator': unspecialized class template can't be used as a template argument for template parameter '_Alloc', expected a real type

error C2146: syntax error: missing '>' before identifier 'confidences'

error C2059: syntax error: ','
 

РЕДАКТИРОВАТЬ 01-1:

 error C2872: 'rectangle': ambiguous symbol
note: could be 'dlib::rectangle'
note: or       'rectangle'
error C2146: syntax error: missing '>' before identifier 'rectangles'
error C2653: 'pybind11': is not a class or namespace name
error C3861: 'run_multiple_rect_detectors': identifier not found
 

После исправления синтаксических ошибок, показанных VS:

 error C3861: 'run_multiple_rect_detectors': identifier not found
 

РЕДАКТИРОВАТЬ 02:

 Error   C2027   use of undefined type 'dlib::image_traits<image_type>'
Error   C2146   syntax error: missing ';' before identifier 'pixel_type'
Error   C4430   missing type specifier - int assumed. Note: C   does not support default-int
 

Комментарии:

1. Вы можете проверить исходный код привязки Python и посмотреть, что он делегирует.

2. Вам следует взглянуть на пример детектора объектов C HOG . Это довольно просто для стандартов C .

3. Зачем переписывать код, который работает? Вызовите код python из C .

4. Я также пытаюсь использовать FHOG в C , но у меня возникли некоторые проблемы с типом переменных, это не так просто, как в python

5. @NicolasZ. DLib — это сильно шаблонная библиотека. Я рекомендую сначала взглянуть на шаблоны C . C сильно отличается от Python.

Ответ №1:

run_multiple(...) похоже, что он вызывает run_multiple_rect_detectors(…), Предполагая, что это так, вы должны иметь возможность вызывать:

 std::tuple<std::vector<rectangle> rectangles, std::vector<double> confidences, std::vector<unsigned long> detector_idxs> detection = dlib::run_multiple_rect_detectors(detectors, img, 1, 0.0);
 

1 — это объем выборки и 0.0 пороговое значение.

поскольку pybind автоматически преобразует между кортежами C 11 и Python.

Затем вы можете разделить кортеж на разные векторы с помощью std::vector rectangles = detection.first() и так далее для detection.second() и detection .третий ().

Комментарии:

1. Спасибо, но, к сожалению, это не сработало, у меня несколько ошибок при вызове этой функции в VS2017

2. Этот код является прославленным псевдокодом; Я не знаю ни типов confidences , , detector_idxs , ни аргументов для функции. Убедитесь, что компиляция с библиотекой pybind прошла успешно. Кроме того, если вы отредактируете вопрос с помощью трассировки стека, я был бы рад помочь.

3. Извините, что слишком долго отвечаю, сейчас я отредактирую вопрос

4. Я протестировал ваш код jackw11111, но при попытке его запустить у меня возникли некоторые ошибки, я отредактировал свой вопрос с его помощью (РЕДАКТИРОВАТЬ 01-1). Я исправил некоторые синтаксические ошибки, которые показал VS, но функцию run_multiple_rect_detectors() я не мог вызвать ни из одного файла заголовка, я перепробовал их много. Я искал в Интернете и видел, что функция c evaluate_detectors(), которую я пробовал, может быть правильной, но, к сожалению, я получаю ошибки при ее запуске (EDIT 02).

5. Я понял, я сделал свою собственную версию get_frontal_face_detector() для другого объекта, при этом мне не нужно вызывать внешний svm-файл. Я определенно могу сказать, что это было проще, чем то, что я пытался сделать раньше. Большое вам спасибо за вашу помощь!