В сообщении блога на прошлой неделе мы показали, как использовать Amazon Mechanical Turk (MTurk) для аннотирования изображений с помощью ограничивающих рамок. Это может быть полезно для специалистов по анализу данных и пользователей машинного обучения, которые пытаются собрать достоверные обучающие данные для работы своих алгоритмов.
На этой неделе мы рассмотрим, как получить наши результаты и визуализировать их. Это упрощает проверку результатов, чтобы убедиться, что они соответствуют нашим ожиданиям. Это также отличный способ просмотреть и одобрить тяжелую работу и вклад клиентов MTurk Worker, которые выполнили HIT.
Получение аннотаций
Мы начнем с того, на чем остановились. На прошлой неделе мы начали с руководства Начало работы с MTurk и Python и выполнили аналогичный набор шагов, описанных в руководстве Совместное использование Python и веб-сайта запрашивающего. На прошлой неделе мы использовали следующий код для получения результатов:
import boto from boto.mturk.connection import MTurkConnection from boto.mturk.question import HTMLQuestion from boto.mturk.layoutparam import LayoutParameter from boto.mturk.layoutparam import LayoutParameters import json # Create your connection to MTurk mtc = MTurkConnection(aws_access_key_id='your_access_key_here', aws_secret_access_key='your_secret_key_here', host='mechanicalturk.amazonaws.com') # This is the value you received when you created the HIT # You can also retrieve HIT IDs by calling GetReviewableHITs # and SearchHITs. See the links to read more about these APIs. hit_id = "386T3MLZLNVRU564VQVZSIKA8D580B" result = mtc.get_assignments(hit_id) assignment = result[0] worker_id = assignment.WorkerId for answer in assignment.answers[0]: if answer.qid == 'annotation_data': worker_answer = json.loads(answer.fields[0]) print("The Worker with ID {} gave the answer {}".format(worker_id, worker_answer)) left = worker_answer[0]['left'] top = worker_answer[0]['top'] print("The top and left coordinates are {} and {}".format(top, left))
Этот код сгенерировал ответ, подобный следующему:
The Worker with ID A39ECJ12CY7TE9 gave the answer [{'left': 369, 'top': 47, 'width': 151, 'height': 160, 'label': 'stop sign'}] The top and left coordinates are 47 and 369
Визуализация результатов
Наличие координат под рукой полезно - в конце концов, это то, что мы будем использовать для обучения наших алгоритмов. Но нам, людям, трудно понять, насколько хорошо выполнил заказчик MTurk Worker, не видя результатов в действии.
С этой целью мы собираемся использовать библиотеку 2D-графиков Python под названием Matplotlib для визуализации этих результатов. Matplotlib - это мощная библиотека, используемая для создания диаграмм, графиков, гистограмм и многого другого. Сегодня мы коснемся только его возможностей.
Для начала добавим еще несколько строк к нашему импорту вверху. Каждый из элементов, выделенных ниже полужирным шрифтом, недавно добавлен в код сверху:
import boto from boto.mturk.connection import MTurkConnection from boto.mturk.question import HTMLQuestion from boto.mturk.layoutparam import LayoutParameter from boto.mturk.layoutparam import LayoutParameters import json import numpy as np import matplotlib.pyplot as plt import matplotlib.patches as patches import requests from io import BytesIO from PIL import Image
Затем мы загрузим в Python изображение, которое мы попросили Workers аннотировать. Об этом позаботится следующий код:
# Load the image from the HIT response = requests.get('http://turk.s3.amazonaws.com/stop_sign_picture.jpg') img = Image.open(BytesIO(response.content)) im = np.array(img, dtype=np.uint8) # Create figure, axes, and display the image fig,ax = plt.subplots(1) ax.imshow(im)
Это загружает изображение в память из URL-адреса и устанавливает структуры, необходимые для отображения изображения разработчику, выполняющему код Python.
Затем мы обработаем каждую аннотацию ограничивающего прямоугольника и создадим прямоугольники, чтобы наложить их на изображение. Об этом позаботится следующий код:
# Draw the bounding box for answer in worker_answer: rect = patches.Rectangle((answer['left'],answer['top']),answer['width'],answer['height'],linewidth=1,edgecolor='#32cd32',facecolor='none') ax.add_patch(rect) # Show the bounding box plt.show()
Взяв все это вместе, ваш полный код должен выглядеть следующим образом:
import boto from boto.mturk.connection import MTurkConnection from boto.mturk.question import HTMLQuestion from boto.mturk.layoutparam import LayoutParameter from boto.mturk.layoutparam import LayoutParameters import json import numpy as np import matplotlib.pyplot as plt import matplotlib.patches as patches import requests from io import BytesIO from PIL import Image # Create your connection to MTurk mtc = MTurkConnection(aws_access_key_id='your_access_key_here', aws_secret_access_key='your_secret_key_here', host='mechanicalturk.amazonaws.com') # This is the value you received when you created the HIT # You can also retrieve HIT IDs by calling GetReviewableHITs # and SearchHITs. See the links to read more about these APIs. hit_id = "386T3MLZLNVRU564VQVZSIKA8D580B" result = mtc.get_assignments(hit_id) assignment = result[0] worker_id = assignment.WorkerId for answer in assignment.answers[0]: if answer.qid == 'annotation_data': worker_answer = json.loads(answer.fields[0]) # Load the image from the HIT response = requests.get('http://turk.s3.amazonaws.com/stop_sign_picture.jpg') img = Image.open(BytesIO(response.content)) im = np.array(img, dtype=np.uint8) # Create figure, axes, and display the image fig,ax = plt.subplots(1) ax.imshow(im) # Draw the bounding box for answer in worker_answer: rect = patches.Rectangle((answer['left'],answer['top']),answer['width'],answer['height'],linewidth=1,edgecolor='#32cd32',facecolor='none') ax.add_patch(rect) # Show the bounding box plt.show()
Этот код загрузит ваш HIT, загрузит изображение и нарисует один или несколько прямоугольников поверх изображения, чтобы помочь вам визуализировать ответы рабочих. Когда вы запустите этот код, вы должны увидеть следующее:
Следующие шаги
В этом случае рабочий правильно нашел только один знак остановки, аннотировал его, и он отображается в салатовой рамке, наложенной на изображение. Если бы было несколько знаков остановки, код тоже сработал бы, чтобы показать их.
Вооружившись этой визуализацией, теперь легко определить качество результата и одобрить отправку рабочего. Чтобы узнать, как утверждать и удалять HIT с помощью Python, см. Руководство Начало работы с MTurk и Python с использованием Boto.
Если у вас есть вопросы, задайте их на нашем форуме MTurk. Чтобы стать инициатором запроса, зарегистрируйтесь здесь. Хотите внести свой вклад в качестве клиента Worker? Начни здесь.