Упражнение. Отправка данных

Завершено

Теперь пришло время отправить изображения, которые будут использоваться для обучения модели машинного обучения. Есть два способа отправки изображений:

  • На портале Пользовательского визуального распознавания выберите, отправьте и отметьте изображения тегами.
  • В таком средстве, как Jupyter Notebook, используйте изображения, которые включены в пакет SDK Пользовательского визуального распознавания.

При наличии большого объема данных, классов изображений и тегов для отправки быстрее использовать пакет SDK Пользовательского визуального распознавания. Но можно выбрать один из вариантов, описанных в следующих разделах. Выполните действия по отправке изображений в наборе данных подходящим для вас способом.

Вариант 1. Использование портала Пользовательского визуального распознавания для отправки изображений и присвоения им меток

Изображения должны быть загружены и помечены метками отдельно для каждой вложенной папки. Для этого упражнения вам может понадобиться передать изображения только в четыре или пять вложенных папок, в зависимости от скорости передачи. Помните, что при обучении модуля машинного обучения большее количество разнообразных примеров даст лучшие результаты.

  1. Создайте проект на портале Пользовательского визуального распознавания.

    1. Перейдите по адресу https://www.customvision.ai/projects и выполните вход. Выберите Создать проект.

    2. В разделе Создание проекта:

      1. В поле Имя укажите имя проекта.

      2. В поле Описание укажите короткое описание модели.

      3. В поле Группа ресурсов укажите группу ресурсов, созданную на портале Azure.

      4. В разделе Типы проектов выберите Классификация.

      5. В разделе Типы классификации выберите Многоклассовая (один тег на изображение).

      6. В разделе Домены выберите Общие.

      7. Выберите Создать проект.

        Снимок экрана: создание ресурса на портале Пользовательского визуального распознавания.

    Примечание.

    Если вы хотите экспортировать модель для развертывания на мобильном устройстве, или в TensorFlow.js, или IoT, в разделе Доменывыберите параметр компактной модели. Этот параметр можно изменить в настройках после создания проекта.

  2. Добавьте изображения и теги для видов птиц:

    1. В проекте Пользовательского визуального распознавания выберите Добавить изображения.

      Снимок экрана: кнопка добавления изображений в проекте Пользовательского визуального распознавания.

    2. В окне Открытие перейдите в папку birds-photo, в которую извлечены файлы изображений из ZIP-файла набора данных.

    3. Откройте папку с изображениями видов птиц.

    4. Нажмите клавиши CTRL+A, чтобы выбрать все изображения в папке, и щелкните Открыть.

      Снимок экрана: выбор всех изображений в папке с изображениями видов птиц.

    5. В разделе Отправка изображений введите описание в поле Мои теги, чтобы указать вид птиц на фотографиях.

    6. Выберите Отправить <число> файлов.

      Снимок экрана: добавление описания тега к отправленным фотографиям в Пользовательском визуальном распознавании.

  3. Повторите предыдущий шаг, чтобы отправить фотографии в папке с каждым видом птиц в скачанном наборе данных.

Вариант 2. Отправка изображений и добавление к ним тегов с помощью Python и пакета SDK Пользовательского визуального распознавания

Пакет SDK Пользовательское визуальное распознавание доступен на следующих языках программирования: Python, .NET, Node.js, Go и Java. Мы будем использовать Python. Если Python еще не установлен, рекомендуется получить его путем установки Anaconda. Вы получите Python при скачивании Anaconda.

Если вместо этого вы предпочитаете код в GitHub, можно клонировать репозиторий с помощью следующей команды:

git clone https://github.com/MicrosoftDocs/mslearn-cv-classify-bird-species.git

Выполните следующие действия, чтобы создать виртуальную среду и вставить в нее код:

  1. Откройте IDE по своему усмотрению. Затем выполните следующую команду для импорта пакета:

    !pip install azure-cognitiveservices-vision-customvision
    
  2. Импортируйте пакеты, требуемые для выполнения скрипта:

    from azure.cognitiveservices.vision.customvision.training import CustomVisionTrainingClient
    from azure.cognitiveservices.vision.customvision.training.models import ImageFileCreateEntry
    from azure.cognitiveservices.vision.customvision.training.models import ImageFileCreateBatch
    from msrest.authentication import ApiKeyCredentials 
    import numpy as np
    
  3. Теперь используйте приведенный ниже код для создания проекта Пользовательского визуального распознавания. Перед выполнением кода замените заполнители <endpoint> и <key> значениями для ресурса Пользовательского визуального распознавания.

    Чтобы получить значения ресурса Пользовательского визуального распознавания, сделайте следующее:

    1. На портале Azure перейдите к ресурсу Пользовательского визуального распознавания.

    2. В меню ресурса в разделе Управление ресурсами выберите Ключи и конечные точки.

    3. Скопируйте значение из поля Конечная точка. В коде замените заполнитель <endpoint> этим значением.

    4. Для KEY 1 щелкните значок копирования, чтобы скопировать ключ. В коде замените заполнитель <key> этим значением.

      Снимок экрана: выделенные конечные точки и значения ключей для ресурса Пользовательского визуального распознавания на портале Azure.

    Код будет выглядеть, как в следующем примере:

    ENDPOINT = "<endpoint>"
    
    # Replace with a valid key
    training_key = "<key>"
    credentials = ApiKeyCredentials(in_headers={"Training-key": training_key})
    publish_iteration_name = "classifyBirdModel"
    
    trainer = CustomVisionTrainingClient(ENDPOINT, credentials)
    
    # Create a new project
    print ("Creating project...")
    project = trainer.create_project("Bird Classification")
    
    print("Project created!")
    
  4. Распакуйте скачанный файл bird-photos.zip в тот же каталог, где сохранен файл Jupyter Notebook. Добавьте следующий код, чтобы перейти в каталог для фотографий видов птиц в проекте.

    # Change to the directory for the bird photos
    import os
    os.chdir('./bird-photos/custom-photos')
    

    Предупреждение

    Выполните код в этой ячейке только один раз. Если вы попытаетесь выполнить эту ячейку несколько раз без перезапуска ядра Python, произойдет сбой этой ячейки.

  5. Добавьте следующий код, чтобы получить список тегов видов птиц. Теги создаются на основе имен папок в каталоге bird-photos/custom-photos:

    # Create a tag list from folders in bird directory
    tags = [name for name in os.listdir('.') if os.path.isdir(name)]
    print(tags)
    
  6. Затем мы создадим три функции, которые будут вызываться в цикле for:

    • Функция createTag создает тег класса в проекте Пользовательского визуального распознавания.
    • Функция createImageList использует имя и идентификатор тега для создания списка изображений.
    • Функция image_list передает изображения в пакетах из списка.

    Чтобы создать три функции, сделайте следующее:

    1. Добавьте код функции createTag в файл Jupyter Notebook. Функция создает тег имени изображения в проекте Пользовательского визуального распознавания.

      tag_id = createTag(tag)
      print(f"tag creation done with tag id {tag_id}")
      image_list = createImageList(tag, tag_id)
      print("image_list created with length " + str(len(image_list)))
      
      # Break list into lists of 25 and upload in batches
      for i in range(0, len(image_list), 25):
          batch = ImageFileCreateBatch(images=image_list[i:i + 25])
          print(f'Upload started for batch {i} total items {len(image_list)} for tag {tag}...')
          uploadImageList(batch)
          print(f"Batch {i} Image upload completed. Total uploaded {len(image_list)} for tag {tag}")
      
    2. Затем добавьте код для функции createImageList. Функция принимает два параметра: имя tag из списка имен папок и tag_id из тега, созданного в проекте Пользовательского визуального распознавания. Функция принимает значение base_image_url и задает для каталога папку, содержащую изображения для тега tag, созданного на основе имен папок. Затем мы добавим каждое из изображений в список, который будет использоваться для отправки пакетов в созданный тег tag:

      def createImageList(tag, tag_id):
      
      # Set directory to current tag.
         base_image_url = f"./{tag}/"
         photo_name_list = os.listdir(base_image_url)
         image_list = []
         for file_name in photo_name_list:
             with open(base_image_url+file_name, "rb") as image_contents:
                 image_list.append(ImageFileCreateEntry(name=base_image_url+file_name, contents=image_contents.read(), tag_ids=[tag_id]))
         return image_list
      
    3. Наконец, мы добавим код для создания функции uploadImageList. В функции мы передадим список image_list, созданный на основе папки, а затем отправим этот список в tag:

      def uploadImageList(image_list):
            upload_result = trainer.create_images_from_files(project_id=project.id, batch=image_list)
            if not upload_result.is_batch_successful:
               print("Image batch upload failed.")
               for image in upload_result.images:
                    print("Image status: ", image.status)
               exit(-1)
      
  7. Теперь мы добавим код для нашего метода Main. Для каждого тега метод вызывает три созданные нами функции. Мы пройдем циклом по каждому тегу (имени папки) в коллекции tags, созданной на основе папок в каталоге bird-photos/custom-photos. Шаги цикла for:

    1. Вызовите созданную ранее функцию createTag, чтобы создать класс tag в проекте Пользовательского визуального распознавания.

    2. Вызовите созданную ранее функцию createImageList с именем tag и значениями tag_id, возвращаемыми из Пользовательского визуального распознавания. Функция возвращает список изображений для отправки.

    3. Вызовите созданную ранее функцию imageList, чтобы передать изображения из image_list пакетами по 25 штук. Мы отправляем пакеты по 25 штук, так как время ожидания для службы "Пользовательское визуальное распознавание" истечет, если мы попытаемся отправить весь набор данных за раз.

      for tag in tags: 
            tag_id = createTag(tag)
            print(f"tag creation done with tag id {tag_id}")
            image_list = createImageList(tag, tag_id)
            print("image_list created with length " + str(len(image_list)))
      
      # Break list into lists of 25 and upload in batches.
       for i in range(0, len(image_list), 25):
            batch = ImageFileCreateBatch(images=image_list[i:i + 25])
            print(f'Upload started for batch {i} total items {len  (image_list)} for tag {tag}...')
            uploadImageList(batch)
            print(f"Batch {i} Image upload completed. Total uploaded  {len(image_list)} for tag {tag}")
      

      Предупреждение

      Выполните код в этой ячейке только один раз. Если вы попытаетесь выполнить эту ячейку несколько раз без удаления проекта Пользовательского визуального распознавания, произойдет сбой этой ячейки.