В сообщении блога на прошлой неделе мы показали, как использовать 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? Начни здесь.