Резюме. Наше приложение зависит от высокой скорости обнаружения ориентиров на лице (таких как открытые или закрытые глаза). Таким образом, я разработал алгоритм, который берет положение лица из последнего кадра и обрезает изображение из следующего кадра. Это работает отлично, и Детектор лиц должен обработать только четверть изображения.
Но это не увеличивает скорость обнаружения. Кто-нибудь знает почему?
Изменить: все, что делает мой алгоритм, - это кадрирование изображения на основе информации из последнего изображения. Но сам ImageRecognition не выполняет. Мы используем Mobile Vision от Google.
важные фрагменты кода:
Этот фрагмент выполняется перед передачей растрового изображения в Детектор лиц. Он берет положение лица из предыдущего кадра и передает только эту часть изображения:
Bitmap bitmapReturn = Bitmap.createBitmap(bitmap, topLeftX, topLeftY, width, height);
Этот фрагмент выполняется после обработки кадра Детектором лиц. Он показывает расположение изображения для следующего кадра:
float spotY = getSpotY(face);
float spotX = getRatioX(face);
int moveX = (int) (((float)bitMapScanWidth / 2) - spotX) ;
int moveY = (int) (((float)bitMapScanHeight / 2) - spotY);
moveValues(moveX, moveY);
Есть еще несколько фрагментов кода, которые гарантируют, что значения topLeftX
и topLeftY
изображения не достигают значений, превышающих размер растрового изображения, и другие, которые гарантируют, что лицо имеет такой же размер на изображении.
Но как было сказано ранее. Алгоритм работает нормально, но не увеличивает скорость. Я не могу понять почему, потому что это должно значительно сократить необходимое время вычислений. Кто-нибудь может мне объяснить, почему это не так? Надо что-то подправить? Или есть другой способ увеличить скорость в моем алгоритме?
Обратите внимание, что когда я сравнивал скорость между двумя версиями (с алгоритмом, который обрезает изображение, и без него), обе версии фактически рассчитывались с помощью необходимых функций для обрезки изображения. Единственная разница заключалась в том, что один из них фактически использовал значения для обрезки изображения, а другой просто вычислял их в фоновом режиме. Это означает, что вычисления, необходимые для моего алгоритма, не были причиной отсутствия улучшения скорости.