Как нас анализируют в кинотеатрах… и не только
Компьютерное зрение все глубже интегрируется в нашу жизнь. При этом, мы даже не замечаем всего этого наблюдения за нами. Сегодня расскажем о системе, помогающей анализировать эмоции посетителей на конференциях, в учебном процессе, в кинотеатрах и много где ещё. Кстати, покажем код и расскажем о практических кейсах. Заглядывайте под кат!
Передаю слово автору.
Хотите всегда знать в лицо аудиторию в зале, классе, кабинете и управлять ею? Вопрос совсем не праздный. Речь идет об оффлайн аудитории. Для повышения эффективности бизнеса иметь информацию о поведении вашего клиента, его реакциях и желаниях — жизненная необходимость. Как собрать эту статистику?
С онлайн аудиторией — всё проще. Если бизнес находится в Интернет, то маркетинг сильно упрощается и собрать данные по профилю своих клиентов, а потом еще и «догонять» его неограниченно долго — достаточно просто. Инструментов множество — бери и пользуйся, стоимость подъемная.
В оффлайн режиме действуют те же методы, что и 50 лет назад: опросники, анкеты, внешние наблюдатели с блокнотом и т.п. Качество этих подходов оставляет желать лучшего. Достоверность сомнительная. Про удобство вообще можно молчать.
В данной статье мы хотим рассказать о новом решении компании CVizi, которое собирает интересную и уникальную статистику и помогает анализировать информацию о ваших клиентах/посетителях при помощи компьютерного зрения.
Видеоаналитика и кинотеатры
Изначально продукт разрабатывался как инструмент подсчета зрителей кинотеатра и сравнение их количества с купленными билетами для дисциплинарного контроля обслуживающего персонала и предотвращения нарушений. Но, как говорится, аппетит приходит во время еды.
Разработанная технология позволила расширить возможности решения. Стало возможно определять возрастные и гендерные признаки посетителей кинотеатров, а также определять эмоциональный фон каждого человека во время сеанса.
Информация обновляется оперативно и пользователю необходимо лишь зайти в личный кабинет и просмотреть статистику по интересующему сеансу или аналитический отчет по зрительской аудитории.
Например, открываем сеанс с фильмом «Лёд» и видим на реалограмме зала явное доминирование зрителей женского пола (в принципе, предсказуемо). А дальше смотрим на те эмоции, которые испытывали люди (посмотреть можно каждого).
Это были данные за один конкретный сеанс. Теперь давайте посмотрим эти же данные в целом за весь период проката фильма (в одном кинотеатре) и получим более релевантную картину.
В части посещаемости прослеживается четкое доминирование зрителей женского пола возраста 25–34 лет. Мужчин тут в 2,5–3 раза меньше. Т.е. ставить в рекламный блок рекламу нового внедорожника не так разумно, нежели новой туши для ресниц. Хотя это вопрос спорный. Но в любом случае уже через пару-тройку дней проката можно смело гарантировать рекламодателю целевую аудиторию и даже в количественном выражении.
С точки зрения эмоционального фона картина будет интересна в первую очередь прокатчикам и дистрибуторам. Кого фильм радует, а кого раздражает? Стоит ли снимать продолжение? Верить отзывам ботов или получить достоверную статистику? В данном случае (фильм «Лёд») фильм достаточно яркий по эмоциям. Сумма позитивных и негативных эмоций 18,5 попугаев из 100. Остальное — нейтраль. Это достаточно хороший показатель. Для сравнения, эмоциональный фон по другим фильмам может быть не таким радужным (в среднем по больнице по всем возрастам и полам).
Например, «Тихоокеанский рубеж» при сравнимом количестве зрителей за тот же период имеет позитивных эмоций в 2 раза меньше. А фильм «Ну, здравствуй, Оксана Соколова» — так просто открытие для женщин »50+».
Всё это некоторые примеры анализа, которые можно использовать в киносетях. Этой информации у них просто не было и мало кто знает, что ее вообще можно получить, а уж тем более использовать для своих целей.
Для киносетей открываются большие возможности для более глубокого анализа происходящего в зале по составу зрителей и их реакции на фильмы в различных населённых пунктах.
Можно сразу выделить следующие:
- Возможность проверять любые маркетинговые гипотезы — получать обратную связь в режиме реального времени и объективно оценивать изменение аудитории и эффект от маркетинговых активностей.
- Возможность предоставлять рекламодателям точную информацию об аудитории, которая просмотрела рекламу. Даже более того, можно гарантировать рекламодателю просмотр рекламы определенными зрительскими группами.
- Возможность создавать уникальные на рынке маркетинговые предложения (скидки) для посетителей определенного возраста и пола, при этом не ломая существующую схему работы и не уменьшая текущие финансовые показатели.
Эти и многие другие возможности, появившиеся благодаря этому решению, способны перевернуть рынок киносетей, увеличить выручку и улучшить эффективность работы как отдельных кинотеатров, так всей сети в целом.
Учитывая, что решение «легкое» (никаких серверов, никакого стрима в Интернет), активно использует облако от Microsoft Azure и имеет доступные для рынка цены (в виде периодических подписок на сервис), киносети в России и за рубежом активно его внедряют.
Более того созданная технология нашла отражения в других решениях, в параллельных областях.
Видеоаналитика и events
Мероприятия, events, форумы, саммиты, конференции, симпозиумы… Что знают организаторы о пришедшей аудитории? Зарегистрировалось X человек, пришло Y, анкеты заполнило Z. На этом почти всё.
Анкетирование — отдельная боль: «Так, этого товарища я хорошо знаю, поставлю ему 5 балов, хотя доклад был нудным». Мы это ведём к тому, что достоверность опросников низкая.
О понимать эффективность конференции, обратную связь от участников организатору и спонсорам просто необходимо.
Сервис по анализу аудитории в кинотеатрах отлично переносится на площадку проведения конференций. Этот кейс компания CVizi также опробовала, проведя два эксперимента: в зале Matrex в Сколково на одной из конференций и в зале Digital October во время российского финала конкурса студенческих технологических проектов Imagine Cup 2018.
Эксперимент 1. Зал Matrex в Сколково
В Matrex камера была установлена не над экраном, как в кинотеатре, а на телескопической стойке за спикерами. Таким образом, решение получилось мобильным. Требуется лишь за несколько часов до начала установить камеру, настроить планограмму зала и ввести расписание выступлений спикеров. Дальше система все делает сама.
Теперь организатор может осуществлять сбор данных о качестве докладов через количество участников в зале и их эмоции на каждой сессии/докладе. И уже в следующий раз планировать мероприятие можно, опираясь на объективные факты. Бывают доклады, после которых участники просто уходят из зала, и следующий спикер работает с теми, кто остался или не успели уйти. Это неправильно, а подобный прогноз мог бы простой перестановкой докладов кардинально изменить эффект.
Эксперимент 2. Российский финал Imagine Cup
Здесь цель была несколько другая, но подход тот же. Одна из номинаций конкурса — это приз зрительских симпатий. Именно тех зрителей, что сидят в зале, не online зрителей. И впервые на Imagine Cup приз зрительских симпатий получила команда, выбранная искусственным интеллектом. Победила команда, на чье выступление зрители реагировали наиболее позитивно, пока ребята были на сцене. Для этого использовали уже две камеры, каждая из которых непрерывно контролировала свой сектор зала и собирала эмоциональные характеристики каждого зрителя.
В этом кейсе камеры удалось повесить на мачту освещения над сценой, что обеспечило их гарантированную стабильность и неподвижность. А также еще раз убедились в том, что для работы сервиса достаточно 4G-Интернета. Система получилась максимально автономной. От организаторов понадобилось только питание 220 В. Это действительно важно, т.к. на мероприятиях подобного масштаба каналы связи — это всегда узкое место, а качество работы сервиса напрямую зависит от стабильности канала Интернет.
В итоге приз зрительских симпатий получила команда, набравшая максимальное количество позитивных эмоций за свое выступление — Last Day Development из ННГУ им. Лобачевского.
Видеоаналитика и учебный процесс
Сфера образования в части автоматизации своих процессов еще очень отстает от остальных отраслей. Например, во многих ВУЗах до сих пор практикуется контроль посещаемости в виде внешнего контролера с журналом: зашел человек, пересчитал студентов на лекции, занес какую-то цифру в журнал (вопрос какую?) и пошел дальше.
Технология анализа зрительской аудитории методами компьютерного зрения отлично ложится и на сферу образования и открывает большое поле для эксперимента и анализа. Возможные решаемые задачи:
- Контроль посещаемости занятий
- Идентификация учащихся
- Оценка качества преподавания
- Выявление отрицательных эмоций учащегося и принятие превентивных мер.
- Оценка вовлеченности школьника или студента в учебу.
Правильное планирование образовательного процесса, включая расписание, выбор лекторов — это основа успешности получения образования. А по факту, если перевести в экономическую область, — это себестоимость образования в разрезе каждого учащегося.
Видеоаналитика в других отраслях
Технологии компании CVizi не ограничиваются только представленными решениями, есть решения для ритейла и производства.
Например, интересное решение — этого получение сведений о внешней и внутренней конверсии магазина. Эти два показателя позволяют построить воронку оффлайн продаж:
- Сколько человек проходит около вашего магазина;
- Сколько человек зашли в него;
- Сколько человек дошли до кассы.
Вот пример внешней конверсии по типовому магазину, расположенному в торговом центре в Москве:
Обладая этими показателями бизнес может эффективней расходовать средства на привлечение клиентов, на проверку маркетинговых гипотез, на качество обслуживания.
Как это работает?
Теперь хочется рассказать немного о технологиях. Почему мы говорим, что решение «легкое»? Всё дело в архитектуре. Любому заказчику всегда в тягость покупать дорогостоящее решение и к нему в придачу парк техники в виде различных серверов, регистраторов и прочего. И потом все это настраивать, сопрягать друг с другом и сопровождать. Если же заказчику предлагается коробка в виде микрокомпьютера, размером с мобильный телефон, то установить ее в свою локальную сеть и повесить IP-видеокамеру способен любой человек, хоть немного знакомый с техникой. Напрашивается аналогия с Wi-Fi роутером дома — воткнул в розетку, подключил Интернет, сделал простейшие настройки. Всё. Никакая сервисная служба для старта не нужна. Все очень легко делается самостоятельно.
А дальше в личном кабинете пользователь видит всю систему целиком и может получать данные как в виде отчетов и журналов статистики, так и, используя API, забирать эти данные в свою корпоративную ИТ-систему.
Таким образом, пользователю не нужно думать и заботиться об инфраструктуре. Подключить вычислительные устройства S-Box очень легко. Также легко тиражировать решение на другие точки — повесил камеры, подключил необходимое количество S-Box и сразу видишь объект на портале в личном кабинете.
Под порталом и личным кабинетом скрывается целая система аналитики, хранилищ БД, мониторинга оборудования и нотификации, развернутая в облаках Azure. Система эластичная и все необходимые вычислительные ресурсы пользователю выделяются автоматически. Поэтому вся головная боль по оборудованию и его сопровождению с пользователя снимается. Он покупает только сервис по предоставлению данных видеоанализа. Очень удобно.
Какие камеры можно использовать для видеоанализа аудитории?
С учетом того, что в конечном итоге нужно получить лицо зрителя в приемлемом качестве, камера должна быть, во-первых, с хорошей оптикой и зумом, а, во-вторых, управляемой — PTZ.
Мы тестировали более десятка камер от разных брендов. Называть конкретные модели камер не будем, но характеристики озвучить можно.
Для залов до 150–200 человек достаточно камеры 20х с матрицей 2Мп. Для залов более 200 человек лучше уже использовать камеры 25х и выше. Они несомненно дороже, но это правильный путь. Хотя, конечно, размером матрицы тоже можно поиграться, но надо понимать, что в ИК-спектре матрица будет шуметь и оптический зум всегда будет предпочтительнее цифрового.
Точность распознавания
Чем ближе мы спозиционируемся на лице, тем оно будет четче. Вроде бы всё ясно, и ребенку понятно. Но если с распознаванием пола все хорошо, то точность определения возраста может быть запросто ± 5 лет и даже более, независимо от приближения камеры. И дело тут не в качестве алгоритмов и нейронных сетей, а в том, что каждый взрослый человек пытается выглядеть на столько, на сколько он инвестировал в свою внешность.
Поэтому камера даст тот возраст, на которой человек выглядит или старается выглядеть. Т.е. биологический возраст и возраст по фото — это могут быть две большие разницы. Ведь каждый из нас может припомнить случаи, когда он ошибался в возрастной оценке собеседника. А при этом человеческий мозг — это очень мощная и хорошо обученная нейронная сеть.
Azure и его сервисы
Сердцем всего этого является когнитивный сервис Microsoft Face API. Это очень удобный сервис и к API можно обращаться практически из любых распространенных сред разработки. Мы используем в большинстве своих сервисов используем Python — это на стороне облака.
Общая последовательность выглядит так:
1) S-Box передает в облако картинки
2) Облачный сервис их накапливает, сортирует и скармливает в Face detection Cognitive Services. Для отгрузки собранных снимков в облако используем Python:
def upload_file(file_path, upload_file_type):
""" Uploading file """
...
if authData == '' or authData == 'undefined':
...
try:
r = requests.post(param_web_service_url_auth, headers={'authentication': base64string})
if r.status_code == 200:
authData = json.loads(r.text)['token']
result = upload_file(file_path, upload_file_type)
return result
logging.error("Upload_file(%s) - UNEXPECTED AUTH RESULT CODE %d", file_path, r.status_code)
except Exception as e:
logging.error('Upload_file(%s) error', file_path)
logging.exception('Upload exception ' + str(e))
return False
try:
base_name = os.path.basename(file_path)
txt_part, file_extension = os.path.splitext(base_name)
files = {'file': open(file_path, 'rb')}
...
if upload_file_type == 1: # for upload full view
...
payload = {'camid': cam_id, 'dt': dt, 'mac': mac}
z = requests.post(uploaddatalinkhall, headers={'authentication': authData}, files=files, data=payload)
if z.status_code == 200:
return True
logging.debug('post result -> %d', int(repr(z.status_code)))
if upload_file_type == 0:
...
payload = {'camid': cam_id, 'dt': dt, 'json_str': json_str, 'mac': mac}
...
z = requests.post(param_web_service_url, headers={'authentication': authData}, files=files, data=payload)
myfile.close()
if z.status_code == 200:
...
if len(debug_path) > 0:
# move
fnn = debug_path + os.sep + json_file
shutil.move(upload_folder + os.sep + json_file, fnn)
else:
# delete
os.remove(upload_folder + os.sep + json_file)
return True
result = "UNEXPECTED STATUS CODE " + repr(z.status_code)
logging.error('upload_file(%s) - ERROR. Res=%s, text: %s',
json_file, result, z.text)
...
except Exception, e:
...
logging.exception('Upload exception: ' + str(e))
return False
3) Далее опять Python
Функция CF.face.detect возвращает информацию о поле, возрасте и эмоциях человека, вызывая MS Face detection Cognitive Service API, которая используется далее:
def faceapi_face_detect(url):
…
# API call
image_url = url
need_face_id = False
need_landmarks = False
attributes = 'age,gender,smile,facialHair,headPose,glasses,emotion,hair,makeup,accessory,occlusion,blur,exposure,noise'
watcher = elapser_mod.Elapser()
try:
api_res = CF.face.detect(image_url, need_face_id, need_landmarks, attributes)
# callback(url, need_face_id, need_landmarks, attributes, e.elapsed(), api_res)
text = 'CF.face.detect image_url {}, need_face_id {}, need_landmarks {}, attributes {}, completed in {} s.'. \
format(image_url, need_face_id, need_landmarks, attributes, watcher.elapsed())
printlog(text)
text2 = 'Detected {} faces.'.format(len(api_res))
printlog(text2)
text3 = '{}'.format(api_res)
printlog(text3)
except CF.CognitiveFaceException as exp:
text = '[Error] CF.face.detect image_url {}, need_face_id {}, need_landmarks {}, attributes {}, failed in {} s.'. \
format(image_url, need_face_id, need_landmarks, attributes, watcher.elapsed())
printlog(text)
text2 = 'Code: {}, Message: {}'.format(exp.code, exp.msg)
printlog(text2)
message = exp.msg
…
return api_res, message
Дальше уже дело техники. За сеанс (сессию) лицо каждого человека обрабатывается десятки раз. Поэтому в среднем выборка получается очень даже репрезентативной. А чем больше людей в зале, тем статистика богаче. И погрешности в распознавании возраста компенсируют друг друга. Повторюсь — это в именно среднем.
Что еще напрашивается из активностей по лицам? Идентификация! Но без идентификации личности. Соответствующие функции входят в этот же API. Идентификация — очень полезная функция, которая позволяет искать, идентифицировать и сопоставлять лица. Например, можно посмотреть на каких сессиях (конференции) был один и тот же человек и т.д., собрать «ядро» зрителей. Поле для анализа практически безгранично. Но об этом в следующий раз.
Более подробную информацию о решениях можно на сайте компании.
Об авторе
Алексей Осипов — директор по развитию компании CVizi. Контакты: 'aosipov @ cvizi.com'. На нашей страничке в FB мы выкладываем новости по выходу и использованию наших новых наработок и технологий.