Использование предобученных сетей в задаче детектирования и сегментации (Coco dataset)

Заключительная часть цикла вводных заметок в машинное зрение посвящена использованию предобученных сетей в задаче детектирования. В частности использование сетей, обученных на датасете Coco на базе фреймворка TensorFlow Object Detection API.

В отличие от предыдущих статей, которые могли быть выполнены в стандартном окружении Python, эту часть рекомендуется выполнять в Jupyter Notebook, запущеном в контейнере (либо пользоваться облачными сервисами, например colab.research.google.com в силу того, что в процессе будут устанавливаться компоненты.

Установка TensorFlow Object Detection API

Первым делом необходимо установить необходимые компоненты TensorFlow Object Detection API. Для его установки необходимо клонировать репозиторий, скомпилировать модели и запустить тесты.

pip install -U --pre tensorflow=="2.*"
pip install tf_slim
pip install pycocotools

Получите tenorflow/models или cd в родительский каталог репозитория.

import os
import pathlib


if "models" in pathlib.Path.cwd().parts:
  while "models" in pathlib.Path.cwd().parts:
    os.chdir('..')
elif not pathlib.Path('models').exists():
  !git clone --depth 1 https://github.com/tensorflow/models

Скомпилируйте protobufs и установите пакет object_detection

%%bash
cd models/research/
protoc object_detection/protos/*.proto --python_out=.
%%bash
cd models/research/
protoc object_detection/protos/*.proto --python_out=.

Импортируем зависимости и добавим в системные пути расположение TensorFlow Object Detection API

import sys, os

sys.path.append('models/research')
sys.path.append('models/research/object_detection')

import numpy as np
import six.moves.urllib as urllib
import tarfile
import zipfile
import cv2
from PIL import Image
from matplotlib import pyplot as plt
import tensorflow as tf
from object_detection.utils import ops as utils_ops
from utils import label_map_util
from utils import visualization_utils as vis_util

Загрузка предобученной модели

Зададим URL, где хранятся предобученные модели и имя планируемой к использованию модели.

model_path = 'http://download.tensorflow.org/models/object_detection/'
model_name = 'mask_rcnn_inception_v2_coco_2018_01_28'

Создадим переменные среды для работы с путями из shell

os.environ['MODEL_PATH']=model_path + model_name + '.tar.gz'
os.environ['MODEL_FILE_NAME']=model_name + '.tar.gz'

Удалим загруженную ранее модель, если она есть, загрузим модель и распакуем ее.

rm $MODEL_FILE_NAME
wget $MODEL_PATH
tar xfz $MODEL_FILE_NAME

Подготовка модели к запуску

Загрузка модели в память:

model_file_name =  model_name + '/frozen_inference_graph.pb'
detection_graph = tf.Graph()
with detection_graph.as_default():
  od_graph_def = tf.compat.v1.GraphDef()
  with tf.compat.v2.io.gfile.GFile(model_file_name, 'rb') as fid:
    serialized_graph = fid.read()
    od_graph_def.ParseFromString(serialized_graph)
    tf.import_graph_def(od_graph_def, name='')

Загрузка меток классов

label_map = label_map_util.load_labelmap('models/research/object_detection/data/mscoco_label_map.pbtxt')
categories = label_map_util.convert_label_map_to_categories(label_map, max_num_classes=90, use_display_name=True)
category_index = label_map_util.create_category_index(categories)

Воспользуемся следующей функцией для обработки единичного изображения

def run_inference_for_single_image(image, graph):
  with graph.as_default():
    with tf.compat.v1.Session() as sess:
      ops = tf.compat.v1.get_default_graph().get_operations()
      all_tensor_names = {output.name for op in ops for output in op.outputs}
      tensor_dict = {}
      for key in [
          'num_detections', 'detection_boxes', 'detection_scores',
          'detection_classes', 'detection_masks'
      ]:
        tensor_name = key + ':0'
        if tensor_name in all_tensor_names:
          tensor_dict[key] = tf.compat.v1.get_default_graph().get_tensor_by_name(
              tensor_name)
      if 'detection_masks' in tensor_dict:
        detection_boxes = tf.squeeze(tensor_dict['detection_boxes'], [0])
        detection_masks = tf.squeeze(tensor_dict['detection_masks'], [0])
        real_num_detection = tf.cast(tensor_dict['num_detections'][0], tf.int32)
        detection_boxes = tf.slice(detection_boxes, [0, 0], [real_num_detection, -1])
        detection_masks = tf.slice(detection_masks, [0, 0, 0], [real_num_detection, -1, -1])
        detection_masks_reframed = utils_ops.reframe_box_masks_to_image_masks(
            detection_masks, detection_boxes, image.shape[0], image.shape[1])
        detection_masks_reframed = tf.cast(
            tf.greater(detection_masks_reframed, 0.5), tf.uint8)
        tensor_dict['detection_masks'] = tf.expand_dims(
            detection_masks_reframed, 0)
      image_tensor = tf.compat.v1.get_default_graph().get_tensor_by_name('image_tensor:0')

      # Запуск поиска объектов
      output_dict = sess.run(tensor_dict,
                             feed_dict={image_tensor: np.expand_dims(image, 0)})

      # Преобразование выходных данных из массивов float32 в нужный формат
      output_dict['num_detections'] = int(output_dict['num_detections'][0])
      output_dict['detection_classes'] = output_dict[
          'detection_classes'][0].astype(np.uint8)
      output_dict['detection_boxes'] = output_dict['detection_boxes'][0]
      output_dict['detection_scores'] = output_dict['detection_scores'][0]
      if 'detection_masks' in output_dict:
        output_dict['detection_masks'] = output_dict['detection_masks'][0]
  return output_dict

Загрузим тестовое изображение

wget https://digiratory.ru/wp-content/uploads/172914606_546132cbe9_z1.jpg

Выведем загруженное изображение

%matplotlib inline
sample_image = cv2.cvtColor(cv2.imread('172914606_546132cbe9_z1.jpg'), cv2.COLOR_BGR2RGB)
plt.imshow(sample_image)
plt.show()

Получим отклик нейронной сети на изображение

output_dict = run_inference_for_single_image(sample_image, detection_graph)

Визуализируем результат детектирования и сегментации.

vis_util.visualize_boxes_and_labels_on_image_array(
      sample_image,
      output_dict['detection_boxes'],
      output_dict['detection_classes'],
      output_dict['detection_scores'],
      category_index,
      instance_masks=output_dict.get('detection_masks'),
      use_normalized_coordinates=True,
      line_thickness=0,
      min_score_thresh=.6)
plt.figure(figsize=(12, 8))
plt.grid(False)
plt.imshow(sample_image)

Вы можете попробовать запустить различные предобученные модели, предложенные разработчиками и посмотреть на различие результатов.

Colaboratory Jupiter Notebook

Компьютерное зрение. Машиное обучение с использовнием нейронных сетей (Keras)

Следующим этапом введения в компьютерное зрение является переход к более широкораспространенному инструменту в современных исследованиях, а именно нейронным сетям.

Знакомство с нейронными сетями начнем с фреймворка Keras. И на базе того же датасета MNIST попробуем сначала обучить собственную сверточную нейронную сеть.

По умолчанию Keras имеет в своей основе TensorFlow, который имеет достаточно хорошую поддержку GPU.

Читать далее

Компьютерное зрение. Машинное обучение без нейронных сетей (scikit-learn)

В качестве простейшей иллюстрации рассмотрим классификацию датасета MNIST двумя подходами, и. заодно, познакомимся с двумя инструментами.

Датасет MNIST представляет собой набор из 70000 изображений рукописных цифр от 0 до 9, который делится на 60000 обучающих изображений и 10000 тестовых. Подробное его описание и он сам доступены по адресу https://www.openml.org/d/554.

Цифры были нормализованы по размеру и центрированы на изображении фиксированного размера. Исходные черно-белые изображения из NIST были нормализованы по размеру, чтобы поместиться в поле размером 20×20 пикселей при сохранении их соотношения сторон. После нормализации изображения сглажены, вследствие чего содержат уровни серого. Полученные изображения центрированы в поле 28×28 путем вычисления центра масс пикселей и перемещения изображения таким образом, чтобы расположить эту точку в центре.

Когда-то этот датасет был одним из соревновательных датасетов для научных исследований в области классификации изображений, однако, на данный момент современными средствами и методами точность классификации приблизилась к 100%, а датасет получил роль учебного и является хорошей базой для первых шагов в машинном обучении.

Одним из наиболее известных фреймворков для машинного обучения с использованием классических методов является scikit-learn.

Читать далее

Компьютерное зрение. Введение

Статья является вводной в проблему компьютерного зрения. Разумеется, в рамках одной статьи невозможно подробно рассказать об инструментах и научить ими пользоваться, однако целью ставится введение в задачу реализации компьютерного зрения, зачем оно нужно и где применяется на данный момент, а где планируется.

Читать далее

[Перевод] DogAge Challenge

Эта страница является переводом условий нашего соревнования на конференции ICANN19. Оригинал.

Добро пожаловать на страницу соревнования по машинному обучению «Automatic Estimation of Dog Age»

Автоматическая оценка возраста является сложной проблемой, привлекающей внимание ученых, занимающихся вопросами компьютерного зрения и распознавания образов из-за множества практических применений. Искусственные нейронные сети, такие как CNN, являются популярным инструментом для решения подобных проблем, а нами предлагается несколько наборов данных, которые можно использовать для обучения моделей.

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

Целью этого соревнования является разработка моделей, которые будут точно прогнозировать возраст собаки по ее изображению.

Это соревнование основано на наборе данных DogAge, который был тщательно собран в сотрудничестве ученых, работающих в области информационных технологий и исследований животных. Датасет содержит изображения собак, сопоставленных с одним из трех классов: молодые (от 0 до 2 лет), взрослые (от 2 до 5 лет) или старые (> 6 лет).

В настоящее время набор данных состоит из двух частей:

  1. Экспертные данные: содержит 1373 изображения, собранные учеными и включает в себя домашних собак, собак из приютов, лабораторий, кинологических организаций и коммерческих питомников. Их возраст и разделение на три группы были тщательно проверены. Изображения в основном являются качественными портретами с мордой собаки, направленной вверх.
  2. Данные Pet finder: содержит 26190 изображений, собранных с помощью API Petfider, портала для поиска домашних животных. Разделение собак на группы не проверено, а сами собаки сняты с разнообразных углов и расстояний. Необработанные данные были очищены: удалены фотографии с более чем одной собакой, содержащие других домашних животных или большие части людей, а также изображения низкого качества.

Две части набора тренировочных данных можно найти здесь.

Организаторы

Данное соревнование организовано:

  • ICANN’19: International Conference on Artificial Neural Networks
  • Tech4Animals Lab, University of Haifa
  • ETU “LETI” St. Petersburg
  • School of Biology and Environmental Sciences, University of Salford

Важные даты:

  • Представление решения открывается: 1 мая 2019 г.
  • Срок подачи решения истекает 10 сентября 2019 г.
  • Объявление победителя: 14-17 сентября, на ICANN’19

Победитель будет определен в соответствии с критериями, определенными ниже, и получит приз. Ожидается, что победитель, а также другие участники представят статьи, описывающие их методологические подходы, для публикации в рецензируемом журнале (обсуждается).

Критерием успеха будет достижение как минимум 60% средней точности (мАР). Среди них лучший результат mAP будет выбран в качестве финального победителя.

Заметка дополняется

Разработка лабораторных стендов на базе контроллеров Mitsubishi Electric

Для обучающихся по направлению специальности «Управление в технических системах», очень важно иметь практику работы с реальными объектами. Будущие бакалавры и магистры должны точно знать, как работают многие технические объекты, и любые теоретические знания, полученные на лекционных занятиях, должны быть подкреплены практикой. Студентам желательно уметь разрабатывать систему управления не только теоретически, но и иметь навыки реализовать её на разных устройствах. Например, уметь программировать промышленные контроллеры.

Читать далее

TensorFlow. Решение систем нелинейных уравнений

В прошлой статье мы рассмотрели, как можно решать системы линейных алгебраических уравнений, однако возможности TensorFlow этим не ограничиваются. Несмотря на то, что в явном виде библиотека не содержит инструментария для решения нелинейных систем, в ней есть множество инструментов для решения оптимизационных задач, а численное решение сиcтемы уравнений сводится как раз к такой задаче.

Читать далее

TensorFlow. Решение систем линейных уравнений

Библиотека TensorFlow широко известна, в основном, в контексте машинного обучения и нейронных сетей. Однако, TensorFlow изначально не является библиотекой машинного обучения в чистом виде, а позиционируется разработчиками, как библиотека для высокопроизводительных вычислений (high perfomance computing), а это значит, что область ее применения значительно шире. Итак, выступая на конференции с докладом о том, как мы применяли TensorFlow для задачи оценки показателей надежности, я получил вполне закономерный вопрос: «А можно ли использовать TF для решения систем уравнений?». Ответ, естественно, положительный, и в этой статье рассмотрим, как решать системы линейных алгебраических уравнений.

Читать далее

Разработка нейросетевых моделей диагностирования систем управления турбоагрегатом

В статье предложена иерархическая модель процесса нейросетевого диагностирования систем управления турбоагрегатами. Выделены два уровня обработки данных, которые последовательно оценивают степени принадлежности симптомов к каждой из потенциальных неисправностей и ставят диагноз техническому состоянию. Для ускорения обучения нейронной сети предложен метод многоэтапного тренинга. На примере системы управления газовой турбиной анализируется эффективность предложенной архитектуры интеллектуального диагностического аппарата с сетью прямого распространения и LSTM-сетью.

Доклад представлен на международной научной конференции «IEEE Northwest Russia Conference On Mathematical Methods In Engineering And Technology: ММEТ NW 2018»

Читать далее

Разработка программно-алгоритмического комплекса для оценки надежности и оптимизации систем с ЗИП

В работе поднимается проблема анализа надёжности сложных систем управления, применяемых в ответственных областях науки и техники, например, таких как объекты использования атомной энергии. Приводится обзор основных принципов оценки показателей надёжности на примере вероятности безотказной работы. Обосновывается требование к автоматизированному расчёту, необходимость разработки программного-алгоритмического комплекса для расчета показателей надежности, и основной перечень требований к нему. Делается обзор текущего состояния разработки программно-алгоритмического комплекса и перспективы развития.

Читать далее