Используйте ИИ для игры в пинбол

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

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

Визуализация таблицы

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

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

Обнаружение и обрезка игрового поля

С мощью OpenCV мы могли манипулировать тем, что снимала камера, как нам хотелось.

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

Для каждого кадра мы запускали определение контура OpenCV после применения пороговых масок цвета HSV для синего и желтого цветов ленты. Из возвращенных контуров мы отфильтровали фигуры с четырьмя сторонами (прямоугольники) и площадью в пределах заданного интервала. Наша реализация для обнаружения этих углов с помощью OpenCV выглядит следующим образом:

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

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

В следующей части этой серии я расскажу, как мы обнаруживали пинбол в таком красочном и шумном окружении.

Методы мозгового штурма для обнаружения пинбола

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

Вместо этого мы начали работать над подходом, не связанным с машинным обучением. К счастью, в OpenCV реализованы очень мощные алгоритмы компьютерного зрения, которые более эффективны в вычислительном отношении, чем алгоритмы машинного обучения. После предварительной обработки изображения (размытие, пороговое значение HSV и преобразование в двоичное изображение) мы использовали функцию OpenCV cv2.findContours(...). Эта функция использует алгоритм, предложенный в статье Сатоши Судзуки и Кейити Абэ, которую можно найти здесь.

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

Нашим последним шагом для получения координат шара x и y было получение «центра масс» нашего контура. Это довольно просто благодаря реализации cv2.moments(...) в OpenCV. Вы можете получить координаты центра масс x и y с помощью следующего кода:

m = cv2.moments(c)  # given that c is the contour of the ball
               
x = int(m['m10'] / m['m00'])                
y = int(m['m01'] / m['m00'])

Репозиторий GitHub