Я установил функцию aws-lambda, которая запускает объект s3 create. Я замусорил это печатными заявлениями, чтобы попытаться определить, почему это не будет завершено. Он добирается до линии прежде, чем я фактически вызову вызов cv2.matchTemplate.
opencv устанавливается через слой, следуйте этим инструкциям: https://itnext.io/create-a-highly-scalable-image-processing-service-on-aws-lambda-and-api-gateway-in-10-minutes-7cbb2893a479
В журнале cloudwatch не выдается никакой ошибки. Никаких признаков исключения. Это просто выходит! Почему?
Я удостоверился, что настройка времени ожидания для лямбда-функции была установлена на 30 секунд. Он выходит примерно через 10-13 секунд.
Вот как выглядит мой журнал (с моими ключами, именами корзин и названием компании, вырезанными из моей пользовательской регистрации):
START RequestId: e8001171-fe9e-41f0-aacc-66bd27626ff5 Version: $LATEST
Downloading file...
Checking result file exists in result bucket
File does not exist in bucket
Loading data from disk
Opening results csv file
Calling algorithm with screenshot
matching...
END RequestId: e8001171-fe9e-41f0-aacc-66bd27626ff5
REPORT RequestId: e8001171-fe9e-41f0-aacc-66bd27626ff5 Duration: 9934.52 ms Billed
Duration: 10000 ms Memory Size: 128 MB Max Memory Used: 129 MB
It then seems to immediatly try to do it again!
RequestId: e8001171-fe9e-41f0-aacc-66bd27626ff5 Process exited before completing request
OpenBLAS WARNING - could not determine the L2 cache size on this system, assuming 256k
Этозатем, кажется, попробуйте снова один или два раза и повторите себя.
Я не знаю, что такое предупреждение или что делать, чтобы сделать его счастливым. Может быть, это ключ к пониманию того, почему он завершается.
Все работает нормально, если я запускаю его локально. Как я могу отладить проблему?
Вот функция, которая, кажется, выручает. Обратите внимание, что должны быть операторы print, выполняющиеся после завершения сопоставления.
def search_for_image_in_image(screenshot_path, detectable_path, epsilon):
"""
Uses template matching algorithm to detect an image within an image
:param screenshot_path: (str) Path to the screenshot to search
:param detectable_path: (str) Path to the detectable to search for
:param epsilon: (float) 1 - the maximum value the algorithm found must be less than this value
in order to be considered a match
:return: (tuple) containing:
(bool) - Whether or not the detectable was found within the screenshot, using the given
epsilon
(float) - Maximum value the algorithm found
(list) - x and y position in the screenshot where the maximum value is located. Or in
other words, where the algorithm thinks the top left of the detectable is most likely to
be (if it is there at all)
"""
screenshot = cv2.imread(screenshot_path, cv2.IMREAD_COLOR)
screenshot = cv2.cvtColor(screenshot, cv2.COLOR_BGR2RGB)
template = cv2.imread(detectable_path, cv2.IMREAD_COLOR)
template = cv2.cvtColor(template, cv2.COLOR_BGR2RGB)
height = template.shape[0]
width = template.shape[1]
# Note that there are several algorithms available.
# Some might not work as well in some cases.
# TODO - Perhaps we should go through each and evaluate the successes and failures
# Like "if 4 out of the 6 agree, then the answer is x"
# But note that would be more computation. Let's look at how long one takes first.
methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR', 'cv2.TM_CCORR_NORMED',
'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']
method = eval(methods[1])
print("matching...")
result = cv2.matchTemplate(screenshot, template, method)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
print("done matching...")
if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:
top_left = min_loc
else:
top_left = max_loc
bottom_right = (top_left[0] + width, top_left[1] + height)
result_img = screenshot.copy()
cv2.rectangle(result_img, top_left, bottom_right, 255, 2)
print("returning")
return 1.0 - max_val < epsilon, max_val, max_loc