Создание точных моделей машинного обучения, способных идентифицировать и локализовать несколько объектов на одном изображении, оставалось основной задачей компьютерного зрения. Но с учетом последних достижений в области глубокого обучения обнаружение объектов стало проще разрабатывать, чем когда-либо прежде. API обнаружения объектов TensorFlow - это платформа с открытым исходным кодом, построенная на основе TensorFlow, которая упрощает создание, обучение и развертывание моделей обнаружения объектов. Итак, ребята, в этом руководстве по обнаружению объектов я затрону следующие темы:

  • Что такое обнаружение объектов?
  • Различные приложения обнаружения объектов
  • Рабочий процесс обнаружения объектов
  • Что такое Tensorflow?
  • Обнаружение объектов с помощью Tensorflow (демонстрация)
  • Обнаружение живых объектов в реальном времени (демонстрация)

Что такое обнаружение объектов?

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

Обнаружение объектов может быть выполнено несколькими способами:

  • Обнаружение объектов на основе функций
  • Виола Джонс Обнаружение объектов
  • Классификации SVM с функциями HOG
  • Обнаружение объектов глубокого обучения

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

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

Приложения обнаружения объектов

Распознавание лиц:

Система распознавания лиц с глубоким обучением под названием «DeepFace» была разработана группой исследователей из Facebook, которая очень эффективно идентифицирует человеческие лица на цифровом изображении. Google использует собственную систему распознавания лиц в Google Фото, которая автоматически разделяет все фотографии на основе человека на изображении. В распознавании лиц задействованы различные компоненты, такие как глаза, нос, рот и брови.

Подсчет людей:

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

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

Проверка промышленного качества:

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

Управление запасами может быть очень сложным, поскольку товары трудно отслеживать в режиме реального времени. Автоматический подсчет и локализация объектов позволяет повысить точность инвентаризации.

Самостоятельное вождение автомобилей:

Беспилотные автомобили - это будущее, в этом нет никаких сомнений. Но работа, стоящая за ним, очень сложна, поскольку она сочетает в себе различные методы восприятия окружающей среды, включая радар, лазерный свет, GPS, одометрию и компьютерное зрение.

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

Безопасность:

Обнаружение объектов играет очень важную роль в безопасности. Будь то идентификатор лица Apple или скан сетчатки глаза, используемый во всех научно-фантастических фильмах.

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

Приложения безграничны.

Рабочий процесс обнаружения объектов

Каждый алгоритм обнаружения объектов работает по-разному, но все они работают по одному и тому же принципу.

Извлечение функций: они извлекают элементы из имеющихся изображений и используют их для определения класса изображения. Будь то MatLab, Open CV, Viola Jones или Deep Learning.

Теперь, когда вы разобрались с основным рабочим процессом обнаружения объектов, давайте перейдем к руководству по обнаружению объектов и поймем, что такое Tensorflow и каковы его компоненты?

Что такое TensorFlow?

Tensorflow - это платформа машинного обучения Google с открытым исходным кодом для программирования потоков данных для решения ряда задач. Узлы в графе представляют собой математические операции, а ребра графа представляют многомерные массивы данных (тензоры), передаваемые между ними.

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

Учебное пособие по обнаружению объектов

Получение предварительных условий

  • Прежде чем приступить к работе над демоверсией, давайте посмотрим на предварительные условия. Нам понадобятся:
  1. Python
  2. TensorFlow
  3. Тензорборд
  4. Protobuf v3.4 или выше

Настройка среды

  • Теперь, чтобы загрузить TensorFlow и TensorFlow GPU, вы можете использовать команды pip или conda:
# For CPU
pip install tensorflow
# For GPU
pip install tensorflow-gpu
  • Для всех остальных библиотек мы можем использовать pip или conda для их установки. Код представлен ниже:
pip install --user Cython
pip install --user contextlib2
pip install --user pillow
pip install --user lxml
pip install --user jupyter
pip install --user matplotlib
  • Далее у нас есть Protobuf: Protocol Buffers (Protobuf) - это не зависящий от языка, платформенный, расширяемый механизм Google для сериализации структурированных данных - подумайте о нем как о XML, но меньше, быстрее и проще. Вам необходимо Загрузить Protobuf версии 3.4 или выше для этой демонстрации и распаковать ее.
  • Теперь вам нужно клонировать или загрузить модель TensorFlow из Github. После загрузки и извлечения переименуйте models-masters в models.
  • Теперь для простоты мы собираемся хранить «модели» и «protobuf» в одной папке «Tensorflow«.
  • Затем нам нужно зайти в папку Tensorflow, а затем в папку исследований и запустить protobuf оттуда с помощью этой команды:
"path_of_protobuf's bin"./bin/protoc object_detection/protos/
  • Чтобы проверить, сработало это или нет, вы можете перейти в папку protos внутри моделей ›object_detection› protos, и там вы увидите, что для каждого файла proto создается один файл python.

Основной код

После настройки среды вам необходимо перейти в каталог «object_detection» и затем создать новый файл python. Вы можете использовать Spyder или Jupyter для написания кода.

  • Прежде всего, нам нужно импортировать все библиотеки
import numpy as np
import os
import six.moves.urllib as urllib
import sys
import tarfile
import tensorflow as tf
import zipfile
 
from collections import defaultdict
from io import StringIO
from matplotlib import pyplot as plt
from PIL import Image
 
sys.path.append("..")
from object_detection.utils import ops as utils_ops
 
from utils import label_map_util
 
from utils import visualization_utils as vis_util

Затем мы загрузим модель, обученную на наборе данных COCO. COCO означает Общие объекты в контексте, этот набор данных содержит около 330K помеченных изображений. Теперь выбор модели важен, поскольку вам нужно найти компромисс между скоростью и точностью. В зависимости от ваших требований и объема системной памяти необходимо выбрать правильную модель.

Внутри «моделей› исследования ›object_detection› g3doc ›detect_model_zoo» содержатся все модели с разной скоростью и точностью (mAP).

  • Затем мы предоставляем необходимую модель и замороженный граф вывода, сгенерированный Tensorflow для использования.
MODEL_NAME = 'ssd_mobilenet_v1_coco_2017_11_17'
MODEL_FILE = MODEL_NAME + '.tar.gz'
DOWNLOAD_BASE = 'http://download.tensorflow.org/models/object_detection/'
 
PATH_TO_CKPT = MODEL_NAME + '/frozen_inference_graph.pb'
 
PATH_TO_LABELS = os.path.join('data', 'mscoco_label_map.pbtxt')
 
NUM_CLASSES = 90
  • Этот код загрузит эту модель из Интернета и извлечет замороженный граф вывода этой модели.
opener = urllib.request.URLopener()
opener.retrieve(DOWNLOAD_BASE + MODEL_FILE, MODEL_FILE)
tar_file = tarfile.open(MODEL_FILE)
for file in tar_file.getmembers():
  file_name = os.path.basename(file.name)
  if 'frozen_inference_graph.pb' in file_name:
    tar_file.extract(file, os.getcwd())
 
detection_graph = tf.Graph()
with detection_graph.as_default():
  od_graph_def = tf.GraphDef()
  with tf.gfile.GFile(PATH_TO_CKPT, '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(PATH_TO_LABELS)
categories = label_map_util.convert_label_map_to_categories(label_map, max_num_classes=NUM_CLASSES, use_display_name=True)
category_index = label_map_util.create_category_index(categories)
  • Теперь мы преобразуем данные изображений в массив numPy для обработки.
def load_image_into_numpy_array(image):
  (im_width, im_height) = image.size
  return np.array(image.getdata()).reshape(
      (im_height, im_width, 3)).astype(np.uint8)
  • Здесь определяется путь к изображениям для тестирования. Здесь у нас есть соглашение об именах «image [i]» для i in (от 1 до n + 1), где n - количество предоставленных изображений.
PATH_TO_TEST_IMAGES_DIR = 'test_images'
TEST_IMAGE_PATHS = [ os.path.join(PATH_TO_TEST_IMAGES_DIR, 'image{}.jpg'.format(i)) for i in range(1, 8) ]
  • Этот код выполняет вывод для одного изображения, где он обнаруживает объекты, создает блоки и предоставляет класс и оценку класса этого конкретного объекта.
def run_inference_for_single_image(image, graph):
  with graph.as_default():
    with tf.Session() as sess:
    # Get handles to input and output tensors
      ops = tf.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.get_default_graph().get_tensor_by_name(
            tensor_name)
      if 'detection_masks' in tensor_dict:
        # The following processing is only for single image
        detection_boxes = tf.squeeze(tensor_dict['detection_boxes'], [0])
        detection_masks = tf.squeeze(tensor_dict['detection_masks'], [0])
        # Reframe is required to translate mask from box coordinates to image coordinates and fit the image size.
        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)
        # Follow the convention by adding back the batch dimension
        tensor_dict['detection_masks'] = tf.expand_dims(
            detection_masks_reframed, 0)
        image_tensor = tf.get_default_graph().get_tensor_by_name('image_tensor:0')
 
        # Run inference
        output_dict = sess.run(tensor_dict,
            feed_dict={image_tensor: np.expand_dims(image, 0)})
 
        # all outputs are float32 numpy arrays, so convert types as appropriate
        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
  • Наш финальный цикл, который вызовет все функции, определенные выше, и выполнит вывод для всех входных изображений одно за другим, что предоставит нам вывод изображений, в которых обнаруживаются объекты с метками и процентным соотношением этого объекта. аналогично обучающим данным.
for image_path in TEST_IMAGE_PATHS:
  image = Image.open(image_path)
  # the array based representation of the image will be used later in order to prepare the
  # result image with boxes and labels on it.
  image_np = load_image_into_numpy_array(image)
  # Expand dimensions since the model expects images to have shape: [1, None, None, 3]
  image_np_expanded = np.expand_dims(image_np, axis=0)
  # Actual detection.
  output_dict = run_inference_for_single_image(image_np, detection_graph)
  # Visualization of the results of a detection.
  vis_util.visualize_boxes_and_labels_on_image_array(
      image_np,
      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=8)
plt.figure(figsize=IMAGE_SIZE)
plt.imshow(image_np)

Теперь давайте перейдем к нашему руководству по обнаружению объектов и посмотрим, как мы можем обнаруживать объекты в Live Video Feed.

Обнаружение живых объектов с помощью Tensorflow

Для этой демонстрации мы будем использовать тот же код, но сделаем несколько настроек. Здесь мы собираемся использовать OpenCV и модуль камеры, чтобы использовать прямую трансляцию веб-камеры для обнаружения объектов.

  • Добавьте библиотеку OpenCV и камеру, используемую для захвата изображений. Просто добавьте следующие строки в раздел библиотеки импорта.
import cv2
cap = cv2.VideoCapture(0)
  • Далее нам не нужно загружать изображения из каталога и преобразовывать их в массив numPy, так как OpenCV позаботится об этом за нас.

Удалить это

for image_path in TEST_IMAGE_PATHS:
image = Image.open(image_path)
# the array based representation of the image will be used later in order to prepare the
# result image with boxes and labels on it.
image_np = load_image_into_numpy_array(image)

С

while True:
ret, image_np = cap.read()
  • Вместо этого мы не будем использовать matplotlib для финального показа изображений, мы также будем использовать OpenCV для этого. Теперь для этого

Удалить это

plt.figure(figsize=IMAGE_SIZE)
plt.imshow(image_np)

С

cv2.imshow('object detection', cv2.resize(image_np, (800,600)))
if cv2.waitKey(25) & 0xFF == ord('q'):
  cv2.destroyAllWindows()
  break

Этот код будет использовать OpenCV, который, в свою очередь, будет использовать инициализированный ранее объект камеры, чтобы открыть новое окно с именем «Object_Detection» размером «800 × 600». Он будет ждать 25 миллисекунд, пока камера покажет изображения, иначе закроет окно.

Окончательный код со всеми изменениями:

import numpy as np
import os
import six.moves.urllib as urllib
import sys
import tarfile
import tensorflow as tf
import zipfile
 
from collections import defaultdict
from io import StringIO
from matplotlib import pyplot as plt
from PIL import Image
 
import cv2
cap = cv2.VideoCapture(0)
 
sys.path.append("..")
 
from utils import label_map_util
 
from utils import visualization_utils as vis_util
 
MODEL_NAME = 'ssd_mobilenet_v1_coco_11_06_2017'
MODEL_FILE = MODEL_NAME + '.tar.gz'
DOWNLOAD_BASE = 'http://download.tensorflow.org/models/object_detection/'
 
# Path to frozen detection graph. This is the actual model that is used for the object detection.
PATH_TO_CKPT = MODEL_NAME + '/frozen_inference_graph.pb'
 
# List of the strings that is used to add correct label for each box.
PATH_TO_LABELS = os.path.join('data', 'mscoco_label_map.pbtxt')
 
NUM_CLASSES = 90
 
opener = urllib.request.URLopener()
opener.retrieve(DOWNLOAD_BASE + MODEL_FILE, MODEL_FILE)
tar_file = tarfile.open(MODEL_FILE)
for file in tar_file.getmembers():
  file_name = os.path.basename(file.name)
  if 'frozen_inference_graph.pb' in file_name:
    tar_file.extract(file, os.getcwd())
 
detection_graph = tf.Graph()
with detection_graph.as_default():
  od_graph_def = tf.GraphDef()
  with tf.gfile.GFile(PATH_TO_CKPT, '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(PATH_TO_LABELS)
categories = label_map_util.convert_label_map_to_categories(label_map, max_num_classes=NUM_CLASSES, use_display_name=True)
category_index = label_map_util.create_category_index(categories)
 
with detection_graph.as_default():
  with tf.Session(graph=detection_graph) as sess:
    while True:
    ret, image_np = cap.read()
    # Expand dimensions since the model expects images to have shape: [1, None, None, 3]
    image_np_expanded = np.expand_dims(image_np, axis=0)
    image_tensor = detection_graph.get_tensor_by_name('image_tensor:0')
    # Each box represents a part of the image where a particular object was detected.
    boxes = detection_graph.get_tensor_by_name('detection_boxes:0')
    # Each score represent how level of confidence for each of the objects.
    # Score is shown on the result image, together with the class label.
    scores = detection_graph.get_tensor_by_name('detection_scores:0')
    classes = detection_graph.get_tensor_by_name('detection_classes:0')
    num_detections = detection_graph.get_tensor_by_name('num_detections:0')
    # Actual detection.
    (boxes, scores, classes, num_detections) = sess.run(
      [boxes, scores, classes, num_detections],
      feed_dict={image_tensor: image_np_expanded})
    # Visualization of the results of a detection.
    vis_util.visualize_boxes_and_labels_on_image_array(
        image_np,
        np.squeeze(boxes),
        np.squeeze(classes).astype(np.int32),
        np.squeeze(scores),
        category_index,
        use_normalized_coordinates=True,
        line_thickness=8)
 
    cv2.imshow('object detection', cv2.resize(image_np, (800,600)))
    if cv2.waitKey(25) 0xFF == ord('q'):
      cv2.destroyAllWindows()
      break

На этом мы подошли к концу этого Руководства по обнаружению объектов. Надеюсь, вам понравилась эта статья, и вы поняли мощь Tensorflow и насколько легко обнаруживать объекты на изображениях и в видео. Итак, если вы прочитали это, вы больше не новичок в области обнаружения объектов и TensorFlow. Попробуйте эти примеры и дайте мне знать, если вы столкнетесь с какими-либо проблемами при развертывании кода.

На этом мы подошли к концу нашей статьи «Обнаружение объектов в TensorFlow». Надеюсь, вы нашли эту статью информативной и добавили ценности вашим знаниям.

Если вы хотите ознакомиться с другими статьями о самых популярных технологиях на рынке, таких как искусственный интеллект, DevOps, этический взлом, посетите официальный сайт Edureka.

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

1. Учебное пособие по TensorFlow

2. Учебное пособие по PyTorch

3. Алгоритм обучения персептрона.

4. Учебник по нейронной сети

5. Что такое обратное распространение?

6. Сверточные нейронные сети

7. Капсульные нейронные сети

8. Рекуррентные нейронные сети

9. Учебник по автоэнкодерам

10. Ограниченное руководство по машине Больцмана

11. PyTorch против TensorFlow

12. Глубокое обучение с помощью Python

13. Учебник по искусственному интеллекту

14. Классификация изображений TensorFlow

15. Приложения искусственного интеллекта

16. Как стать инженером по искусственному интеллекту?

17. Q Learning

18. Априорный алгоритм.

19. Цепи Маркова с Python

20. Алгоритмы искусственного интеллекта

21. Лучшие ноутбуки для машинного обучения

22. 12 лучших инструментов искусственного интеллекта

23. Вопросы на собеседовании по искусственному интеллекту (ИИ)

24. Теано против TensorFlow

25. Что такое нейронная сеть?

26. Распознавание образов.

27. Альфа-бета-обрезка в искусственном интеллекте

Первоначально опубликовано на www.edureka.co 20 августа 2018 г.