Как написать бота с компьютерным зрением

Обновлено: 06.07.2024

В этой статье мы рассмотрим проект по распознаванию изображений с помощью Go. Мы также создадим Telegram-бота, с помощью которого сможем отправлять изображения для распознавания.

Первое, что нам нужно, — это уже обученная модель. Да, мы не будем обучать и создавать собственную модель, а возьмём уже готовый docker-образ ctava/tfcgo.

Для запуска нашего проекта нам понадобится одновременно 4 терминала:

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

Запуск сервера распознавания изображений

Чтобы запустить сервер распознавания, создайте файл Dockerfile:

Так мы запустим сервер распознавания. Внутри будет наш сервер: src/imgrecognize. Кроме того, мы распакуем модель в каталоге: /model.

Revolut , Moscow, можно удалённо , По итогам собеседования

Приступим к созданию сервера. Первое, что нам нужно — это установить значение константы:

Это необходимо, чтобы не получить ошибку:

I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA unable to make a tensor from image: Expected image (JPEG, PNG, or GIF), got empty file

Мы не будем оптимизировать наш сервер, а просто запустим его через ListenAndServe на порту 8080. Перед запуском сервера нам понадобится граф как основа для TensorFlow. Грубо говоря, граф можно рассматривать как контейнер для операций и переменных. Его мы сможем загрузить из файла в формате protobuf: /model/tensorflow_inception_graph. pb. Наполним его позже через сессии.

Чтобы нормализовать входные данные, мы преобразуем наше изображение из значения Go в тензор:

tensor, err := tensorflow.NewTensor(buf.String()) .

После этого мы получаем три переменные:

graph, input, output, err := getNormalizedGraph() .

Graph нам нужен, чтобы декодировать, изменять размер и нормализовать изображение. Input вместе с тензором будет входной точкой для связи между нашим приложением и TensorFlow. Output будет использоваться в качестве канала получения данных.

Через graph мы также откроем сессию, чтобы начать нормализацию.

После нормализации изображения мы создаём сессию для работы с нашим графом:

С помощью этой сессии мы начнём само распознавание. На вход подадим наше нормализованное изображение:

Результат вычисления (распознавания) будет сохранён в переменной outputRecognize. Из полученных данных мы получаем последние 3 результата (ResultCount = 3):

Весь код нашего сервера для распознавания:

Теперь нам нужно построить этот образ (build it). Конечно, мы можем создать образ и запустить его в консоли с помощью соответствующих команд. Но удобнее создавать эти команды в файле Makefile. Итак, давайте создадим этот файл:

После этого откройте терминал и выполните команду:

Это, так сказать, ядро нашего проекта.

Создание бота Telegram

Для начала нужно создать бота через вашу учетную запись в Telegram через BotFather. После этой регистрации вы получите имя бота и его токен. Никому не говорите об этом токене.

Поместим токен в константу BotToken. Вы должны получить:

Обработчик нашего бота расшифрует тело ответа JSON.

Мы отправим изображение обработчику нашего первого сервера:

Клиент, который отправляет изображение от бота на сервер распознавания:

Теперь зарегистрируем нашего бота — пробросим наш адрес в Telegram API, куда отправлять веб-хуки:

Давно хотел попробовать свои силы в компьютерном зрении и вот этот момент настал. Интереснее обучаться на играх, поэтому тренироваться будем на боте. В статье я попытаюсь подробно расписать процесс автоматизации игры при помощи связки Python + OpenCV.

image

Ищем цель

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

image

Подготовка

Использовать будем Python. Бот создан исключительно в образовательных целях. Статья рассчитана на новичков в компьютером зрении, каким я сам и являюсь.

Для работы бота нам понадобятся следующие модули:

  • opencv-python
  • Pillow
  • selenium

Управление браузером

Мы имеем дело с онлайн-игрой, поэтому для начала организуем взаимодействие с браузером. Для этой цели будем использовать Selenium, который предоставит нам API для управления FireFox. Изучаем код страницы игры. Пазл представляет из себя canvas, которая в свою очередь располагается в iframe.

Ожидаем загрузки фрейма с и переключаем контекст драйвера на него. Затем ждем canvas. Она единственная во фрейме и доступна по XPath /html/body/canvas.


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

Полный код Browser.py:

Состояния игры

Приступим к самой игре. Вся логика бота будет реализована в классе Robot. Разделим игровой процесс на 7 состояний и назначим им методы для их обработки. Выделим отдельно обучающий уровень. Он содержит большой белый курсор, указывающий куда нажимать, который не позволит корректно распознавать элементы игры.

  • Приветственный экран
  • Экран выбора уровня
  • Выбор цвета на обучающем уровне
  • Выбор области на обучающем уровне
  • Выбор цвета
  • Выбор области
  • Результат хода

Для большей стабильности бота будем проверять, успешно ли произошла смена игрового состояния. Если self.state_next_success_condition не вернет True за время self.state_timeout — продолжаем обрабатывать текущее состояние, иначе переключаемся на self.state_next. Также переведем скриншот, полученный от Selenium, в понятный для OpenCV формат.


Реализуем проверку в методах обработки состояний. Ждем кнопку Play на стартовом экране и кликаем по ней. Если в течении 10 секунд мы не получили экран выбора уровней, возвращаемся к предыдущему этапу self.STATE_START, иначе переходим к обработке self.STATE_SELECT_LEVEL.

Зрение бота

Пороговая обработка изображения

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


Для поиска объекта в первую очередь необходимо упростить изображение. Для примера возьмем символ «0» и применим к нему пороговую обработку, то есть отделим объект от фона. На этом этапе нам не важно, какого цвета символ. Для начала переведем изображение в черно-белое, сделав его 1-канальным. В этом нам поможет функция cv2.cvtColor со вторым аргументом cv2.COLOR_BGR2GRAY, который отвечает за перевод в градации серого. Далее производим пороговую обработку при помощи cv2.threshold. Все пиксели изображения ниже определенного порога устанавливаются в 0, все, что выше, в 255. За значение порога отвечает второй аргумент функции cv2.threshold. В нашем случае там может стоят любое число, так как мы используем cv2.THRESH_OTSU и функция сама определит оптимальный порог по методу Оцу на основе гистограммы изображения.

Цветовая сегментация

Дальше интереснее. Усложним задачу и найдем все символы красного цвета на экране выбора уровней.

image

По умолчанию, все изображения OpenCV хранит в формате BGR. Для цветовой сегментации больше подходит HSV (Hue, Saturation, Value — тон, насыщенность, значение). Ее преимущество перед RGB заключается в том, что HSV отделяет цвет от его насыщенности и яркости. Цветовой тон кодируется одним каналом Hue. Возьмем для примера салатовый прямоугольник и будем постепенно уменьшать его яркость.

В отличии от RGB, в HSV данное преобразование выглядит интуитивно — мы просто уменьшаем значение канала Value или Brightness. Тут стоит обратить внимание на то, что в эталонной модели шкала оттенков Hue варьируется в диапазоне 0-360°. Наш салатовый цвет соответствует 90°. Для того, чтобы уместить это значение в 8 битный канал, его следует разделить на 2.
Сегментация цветов работает с диапазонами, а не с одним цветом. Определить диапазон можно опытным путем, но проще написать небольшой скрипт.


Запустим его с нашим скриншотом.

image

Кликаем по красному цвету и смотрим на полученную маску. Если вывод нас не устраивает — выбираем оттенкам красного, увеличивая диапазон и площадь маски. Работа скрипта основана на функции cv2.inRange, которая работает как цветовой фильтр и возвращает пороговое изображение для заданного цветового диапазона.
Остановимся на следующих диапазонах:

Поиск контуров

Удаление шума

Полученные контуры содержат много шума от фона. Чтобы убрать его воспользуемся свойством наших цифр. Они состоят из прямоугольников, которые параллельны осям координат. Перебираем все контуры и вписываем каждый в минимальный прямоугольник при помощи cv2.minAreaRect. Прямоугольник определяется 4 точками. Если наш прямоугольник параллелен осям, то одна из координат для каждой пары точек должны совпадать. Значит у нас будет максимум 4 уникальных значения, если представить координаты прямоугольника как одномерный массив. Дополнительно отфильтруем слишком длинные прямоугольники, где соотношение сторон больше, чем 3 к 1. Для этого найдем их ширину и длину при помощи cv2.boundingRect.

Объединение контуров

Уже лучше. Теперь нам нужно объединить найденные прямоугольники в общий контур символов. Нам понадобится промежуточное изображение. Создадим его при помощи numpy.zeros_like. Функция создает копию матрицы image с сохранением ее формы и размера, затем заполняет ее нулями. Другими словами, мы получили копию нашего оригинального изображения, залитую черным фоном. Переводим его в 1-канальное и наносим найденные контуры при помощи cv2.drawContours, заполнив их белым цветом. Получаем бинарный порог, к которому можно применить cv2.dilate. Функция расширяет белую область, соединяя отдельные прямоугольники, расстояние между которыми в пределах 5 пикселей. Еще раз вызываем cv2.findContours и получаем контуры красных цифр.

Оставшийся шум отфильтруем по площади контуров при помощи cv2.contourArea. Убираем все, что занимает меньше 500 пикселей².

image

Вот теперь отлично. Реализуем все вышеописанное в нашем классе Robot.

Распознание цифр

Добавим возможность распознания цифр. Зачем нам это нужно? Потому что мы можем . Данная возможность не является обязательной для работы бота и при желании ее можно смело вырезать. Но так как мы обучаемся, добавим ее для подсчета набранных очков и для понимания бота, на каком он шаге на уровне. Зная завершающий ход уровня, бот будет искать кнопку перехода на следующий или повтор текущего. Иначе пришлось бы осуществлять их поиск после каждого хода. Откажемся от использования Tesseract и реализуем все средствами OpenCV. Распознание цифр будет построено на сравнении hu моментов, что позволит нам сканировать символы в разном масштабе. Это важно, так как в интерфейсе игры есть разные размеры шрифта. Текущий, где мы выбираем уровень, определим SQUARE_BIG_SYMBOL: 9, где 9 — средняя сторона квадрата в пикселях, из которых состоит цифра. Кадрируем изображения цифр и сохраним их в папке data. В словаре self.dilate_contours_bi_data у нас содержатся эталоны контуров, с которым будет происходить сравнение. Индексом будет название файла без расширения (например «digit_0»).


В OpenCV для сравнения контуров на основе Hu моментов используется функция cv2.matchShapes. Она скрывает от нас детали реализации, принимая на вход два контура и возвращает результат сравнения в виде числа. Чем оно меньше, тем более схожими являются контуры.


Сравниваем текущий контур digit_contour со всеми эталонами и находим минимальное значение cv2.matchShapes. Если минимальное значение меньше 0.15, цифра считается распознанной. Порог минимального значения найден опытным путем. Также объединим близко расположенные символы в одно число.


На выходе метод self.scan_digits выдаст массив, содержащий распознанную цифру и координату клика по ней. Точкой клика будет центроид ее контура.


Радуемся полученной распознавалке цифр, но не долго. Hu моменты помимо масштаба инвариантны также к повороту и зеркальности. Следовательно бот будет путать цифры 6 и 9 / 2 и 5. Добавим дополнительную проверку этих символов по вершинам. 6 и 9 будем отличать по правой верхней точке. Если она ниже горизонтального центра, значит это 6 и 9 для обратного. Для пары 2 и 5 проверяем, лежит ли верхняя правая точка на правой границе символа.

image

image

Анализируем игровое поле

Пропустим тренировочный уровень, он заскриптован по клику на белом курсоре и приступаем к игре.

Представим игровое поле как сеть. Каждая область цвета будет узлом, который связан с граничащими рядом соседями. Создадим класс self.ColorArea, который будет описывать область цвета/узел.


Определим список узлов self.color_areas и список того, как часто встречается цвет на игровом поле self.color_areas_color_count. Кадрируем игровое поле из скриншота канвы.


Где pt1, pt2 – крайние точки кадра. Перебираем все цвета игры и применяем к каждому метод self.get_dilate_contours. Нахождение контура узла аналогично тому, как мы искали общий контур символов, с тем отличием, что на игровом поле отсутствуют шумы. Форма узлов может быть вогнутой или иметь отверстие, поэтому центроид будет выпадать за пределы фигуры и не подходит в качестве координата для клика. Для этого найдем экстремальную верхнюю точку и опустимся на 20 пикселей. Способ не универсальный, но в нашем случае рабочий.

Связываем области

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

Ищем оптимальный ход

У нас есть вся информация об игровом поле. Приступим к выбору хода. Для этого нам нужен индекс узла и цвета. Количество вариантов хода можно определить формулой:

Варианты ходов = Количество узлов * Количество цветов — 1

Для предыдущего игрового поля у нас есть 7*(5-1) = 28 вариантов. Их немного, поэтому мы можем перебрать все ходы и выбрать оптимальный. Определим варианты как матрицу
select_color_weights, в которой строкой будет индекс узла, столбцом индекс цвета и ячейкой вес хода. Нам нужно уменьшить количество узлов до одного, поэтому отдадим приоритет областям, цвет которых уникален на игровом поле и которые исчезнут после хода на них. Дадим +10 к весу ко все строке узла с уникальным цветом. Как часто встречается цвет на игровом поле, мы ранее собрали в self.color_areas_color_count


Далее рассмотрим цвета соседних областей. Если у узла есть соседи цвета color_inx, и их количество равно общему количеству данного цвета на игровом поле, назначим +10 к весу ячейки. Это также уберет цвет color_inx с поля.


Дадим +1 к весу ячейки за каждого соседа одного цвета. То есть если у нас есть 3 красных соседа, красная ячейка получит +3 к весу.


После сбора всех весов, найдем ход с максимальным весом. Определим к какому узлу и к какому цвету он относится.


Полный код для определения оптимального хода.


Добавим возможность перехода между уровнями и радуемся результату. Бот работает стабильно и проходит игру за одну сессию.

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

Кому подойдёт интенсив

Новичкам

Научитесь писать простой и понятный код на Python, познакомитесь с софтом для машинного обучения и добавите в портфолио первый проект.

Начинающим программистам

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

Аналитикам

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

Вы научитесь

  • Писать несложный код на Python
  • Использовать нейросети для распознавания объектов
  • Обрабатывать изображения и видео с помощью кода
  • Определять качество алгоритмов машинного обучения
  • Массово применять фильтры и добавлять текст на фото и видео с помощью кода
  • Извлекать и структурировать информацию из потока данных
  • Создавать пользовательские приложения на основе алгоритмов Machine Learning

Программа

Изучаем основы Python для работы с нейросетями

  • Области применения компьютерного зрения. Задачи, которые можно решать с его помощью.
  • Архитектура технологии Object Detection.
  • Введение в Python. Для чего он нужен и чем отличается от других языков программирования.
  • Работа в Colab. Запускаем код для работы с изображением в браузере.
  • Как устроены изображения и видео изнутри.
  • Применение фильтров. Добавление информации в медиафайлы.
  • Домашнее задание.

Используем нейросети для распознавания объектов на изображении

  • Разбор домашнего задания.
  • Как создавать модели для распознавания объектов на изображениях.
  • Использование нейросети для решения задачи Object Detection.
  • Применение модели на датасете изображений и видеозаписей.
  • Структурирование информации об объектах для последующей обработки.
  • Измерение качества алгоритма выделения объектов.
  • Конкурсное домашнее задание.

Создаём приложение для мониторинга объектов на видео

  • Написание кода для определения количества объектов в кадре.
  • Разработка программы для анализа свободного места в кадре.
  • Подключение программы к публичному стриму.
  • Разбор конкурсного домашнего задания, выбор лучших работ и подведение итогов.

Подарки и призы

Сертификат на обучение в Skillbox

Сертификат на обучение в Skillbox

Авторы трёх лучших проектов по мнению ведущего получат сертификат на 30 000 рублей на любой курс.

«Век живи — век учись» Кей Петерсон и Дэвида Колба

Всем, кто дойдёт до конца, — электронная книга от издательства «МИФ».

Преподаватель

Фото преподавателя

Никита Левашов

  • Более 7 лет опыта разработки на Python.
  • Занимается разработкой виртуальных ассистентов и ПО для банков.
  • Эксперт по машинному обучению и NLU.

Работы преподавателя

Чат-ассистент для «Делобанка». Через 2 недели 32% обращений клиентов в чате были решены без участия операторов.

Чат-ассистент для «Делобанка». Через 2 недели 32% обращений клиентов в чате были решены без участия операторов.

Бот с 12 сценариями для ВТБ. За 2 недели нагрузка на колл-центр снизилась на 74%. Бот отвечал на вопросы, продавал продукты и даже шутил.

Бот с 12 сценариями для ВТБ. За 2 недели нагрузка на колл-центр снизилась на 74%. Бот отвечал на вопросы, продавал продукты и даже шутил.

Голосовой консультант для «Рокетбанка». За 3 недели 68% клиентов оформили доставку банковской карты с помощью Lia Assistant.

Голосовой консультант для «Рокетбанка». За 3 недели 68% клиентов оформили доставку банковской карты с помощью Lia Assistant.

Что вас ждёт

Мощная программа

Реальные задачи

Которые помогут закрепить знания и понять, в каком направлении двигаться дальше.

Кейс в портфолио

На интенсиве вы создадите проект, который наверняка оценят потенциальные работодатели.

Комьюнити

Вас ждёт общение с другими участниками и ведущим интенсива в закрытом чате в Telegram.

Получить доступ к записи бесплатного интенсива

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

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

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

Использовать будем программу Кибор, в котором присутствует визуальный редактор кода. В визуальном редакторе Кибор схема данного бота будет выглядеть таким образом. На ее составление ушло не более 10 минут с подготовкой всех изображений.

Создание ботов для игр без программирования. Автоматизация рыбалки Бот, Визуальное программирование, Кибор, Длиннопост

Для примера будем автоматизировать процесс рыбной ловли в игре На рыбалку. Процесс рыбалки выглядит следующим образом:

1) Нажимаем на кнопку Забросить и щелкаем по ней левой кнопкой мыши.

Создание ботов для игр без программирования. Автоматизация рыбалки Бот, Визуальное программирование, Кибор, Длиннопост

2) Ожидаем появление кнопки Тянуть. При появление кнопки зажимаем на ней левую кнопку мыши. Появляется полоса обозначающая натяжение лески. Нажимая и отпуская левую кнопку мыши следим что бы полоса не перевалила за правый или левый край.

Создание ботов для игр без программирования. Автоматизация рыбалки Бот, Визуальное программирование, Кибор, Длиннопост

3) Когда рыба вытащена закрываем табличку и переходим к первому этапу.

Для данных действий бот должен уметь:

Распознать кнопку Забросить и нажать на нее.

Распознать кнопку Тянуть и зажать на ней левую кнопку мыши.

Распознать по полосе когда надо кратковременно отпускать левую кнопку мыши.

Распознать появление таблички, что бы закрыть ее и начать лов сначала.

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

Черные линии - линии переходов по мере выполнения программы. Красные линии - переходы при не нахождение указанного изображения в блоке анализа экрана.

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

Создание ботов для игр без программирования. Автоматизация рыбалки Бот, Визуальное программирование, Кибор, Длиннопост

Бот строится по порядку действий игрока.

Первым создается блок Старт. В нем объявляются переменные в которые мы в дальнейшем запомним координаты кнопок.

Создание ботов для игр без программирования. Автоматизация рыбалки Бот, Визуальное программирование, Кибор, Длиннопост

Затем идет блок поиска кнопки Забросить и клик по ней.

Создание ботов для игр без программирования. Автоматизация рыбалки Бот, Визуальное программирование, Кибор, Длиннопост

После этого ожидается появление кнопки Тянуть. В настройках свойств этого блока даем время ожидания появления этой кнопки (первый параметр). Пока кнопка не появится программа будет крутиться в этом блоке указанное время. как только кнопка появится управление перейдет дальше. При появление кнопки ее координаты запишутся в переменные (x y) и мышь зажмет левую кнопку на ней.

Создание ботов для игр без программирования. Автоматизация рыбалки Бот, Визуальное программирование, Кибор, Длиннопост

После этого ожидаем появление полосы. Точнее указанного нами ее фрагмента, при появление которого надо кратковременно отпустить левую кнопку мыши.

Создание ботов для игр без программирования. Автоматизация рыбалки Бот, Визуальное программирование, Кибор, Длиннопост

Одновременно с полосой сканируем появление таблички о пойманной рыбе. Эти два изображения сканируются по очереди, пока одно из них не будет найдено. Координаты найденного крестиика закрытия таблички запишутся в переменные (x1 y1).

Создание ботов для игр без программирования. Автоматизация рыбалки Бот, Визуальное программирование, Кибор, Длиннопост

Как только появится указанный участок полосы при появление которого надо кратковременно отпустить левую кнопку мыши управление переходит в блоки управления мышью. Действия мыши происходит по координатам (x y) кнопки Тянуть. Затем управление опять переходит на сканирование полосы.

Создание ботов для игр без программирования. Автоматизация рыбалки Бот, Визуальное программирование, Кибор, Длиннопост

Создание ботов для игр без программирования. Автоматизация рыбалки Бот, Визуальное программирование, Кибор, Длиннопост

Когда рыба поймана появится табличка с крестиком для закрытия. В этом случае управление перейдет в нижние блоки управления мыши. В них мышь отпустит левую кнопку на кнопке Тянуть, переместится на крестик закрытия таблички (x1 y1), закроет табличку и управление перейдет в начало программы.


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

Установка Python и Pip

Для того, чтобы создать чат-бот на Rasa, очевидно, понадобится очень важный инструмент - python, а ещё установить зависимости (сторонние библиотеки), для чего обычно используется встроенный в python инструмент - pip.

На самом деле вовсе не обязательно заниматься установкой Python. Для того, чтобы установить необходимые зависимости можно воспользоваться open-source библиотекой miniconda. Это более легковесная версия Anaconda, которая содержит conda, python, а также несколько дополнительных полезных пакетов, таких как pip, zlib и другие.

После установки проверить версию conda можно следующим образом:

Для того, чтобы обновить conda, выполните следующую команду:

Итак, если conda или интерпретатор python установлены, можно перейти к следующему шагу.

Создание виртуального окружения

Можно воспользоваться готовой статьей по установке виртуального окружения на любую ОС.

Кстати, использование среды разработки Pycharm позволяет быстро создавать и подхватывать виртуальное окружение, а еще разработкой бота можно заниматься там же!


Установка библиотеки “rasa”

Установить библиотеку можно воспользовавшись pip:

Для того, чтобы посмотреть установленную версию, наберите:

Чтобы проверить доступные аргументы rasa можно ввести команду:


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

После запуска команды будет предложено выбрать путь, где будет храниться проект:


а также предоставлен выбор обучать бота или нет:


Если согласитесь, вы сможете поговорить с ботом ;)



Команда rasa shell позволяет сделать это прямо в терминале.

Структура проекта

Основные компоненты и файлы для создания чат-бота на Rasa:

Важно! Истории диалогов не должны конфликтовать с правилами: например, если в правилах прописано, что бот здоровается при инициализации диалога и ожидает пользовательский ввод, то конечно, мы не можем написать историю, где бот, поздоровавшись, сразу спрашивает, как дела.
То, как именно должен ответить ассистент можно прописать в файле “domain.yml” или (что чуть-чуть сложнее) с помощью функции на python (actions.py). Рассмотрим первый вариант, определение реакции в DOMAIN с ключевым словом “utter”:
Еще один пример типичной истории диалога с примерами выделенных ботом сущностей [в квадратных скобках]:

Подробнее с документацией Rasa можно ознакомиться на официальном сайте.

Обучение и запуск бота

После успешного обучения модель, как правило, сохраняется в папку “models”.

Шпаргалка с полным списком команд rasa:

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

Обучает модель, используя nlu-файл и истории диалогов, сохраняет обученную модель в ./models.

Запускает сессию с интерактивным обучением с возможностью обучения модели в процессе диалога с чат-ботом.

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

Запускает сервер с обученной моделью.

rasa run actions

Запускает action сервер, используя Rasa SDK.

Визуализирует истории диалогов.

Тестирует обученную модель на тестовых данных, хранящихся в файлах, название которых начинается с “test_”.

rasa data split nlu

Делит NLU-данные на трейн и тест в отношении 80/20.

rasa data convert

Конвертирует обучающие данные.

rasa data validate

Проверяет domain, NLU и истории диалогов на несоответствия.

Экспортирует диалоги из tracker store в event broker.

Локально запускает Rasa X.

Показывает все возможные команды.

Поговорить с обученным ассистентом в командной строке можно запустив команду:


Команда rasa shell --debug позволит запустить чат-бот в режиме debug и посмотреть логи ошибок. Аргумент -m MODEL (путь до модели) или --model MODEL позволяет явно указать модель. По умолчанию rasa shell запускается, используя последнюю модель из папки “models”. Подробнее с аргументами и командами можно ознакомиться здесь.

Запуск чат-бота на сервере

Команда rasa run запускает сервер с обученной моделью. Для того, чтобы сделать возможным прямое взаимодействие с ботом по API необходимо добавить к команде параметр --enable-api:


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

Читайте также: