Запускаем собственный VPN сервер с биллингом

Я занимаюсь разработкой универсальной биллинговой системы с действиями по событиям — SHM. В качестве примера использования системы, решил написать этот Tutorial, по запуску собственного VPN сервера.

Данная статья позволит Вам настроить свой собственный сервер для оказания услуг VPN. Вы получите кабинет (Web интерфейс), в котором Ваши друзья и (или) клиенты, смогут сами себе заказывать VPN ключики, отслеживать дату их истечения и производить оплату (установив нулевую цену за услугу, вы можете предоставлять её совершенно бесплатно).

SHM состоит из Ядра системы (API + MySQL), и Web интерфейсов: административный и клиентский. SHM можно запустить на любом сервере, где есть Docker.

Услуги VPN предоставляются на базе WireGuard. Такой выбор был сделан в связи с тем, что для WireGuard существует множество клиентов, под любые ОС. Очень легко и удобно настроить VPN на смартфоне с помощью QR кода.

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

  • Арендовать сервер (VPS) в нужном регионе, через который будет осуществляться выход в сеть Интернет (VPN)

  • Инсталлировать и настроить SHM для оказания услуг

Аренда сервера для предоставления VPN доступа

Выберите любую компанию, предоставляющую услуги по аренде серверов в нужном Вам регионе, и закажите себе сервер (VPS, VDS) с ОС: Ubuntu 22.04 (на этой ОС тестировалась система).

Инсталляция SHM

Рекомендую установить SHM на отдельный сервер (для тестов можно и локально). SHM лишь управляет вашими серверами. Сервера приходят и уходят, а SHM остается)

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

Настройка SHM

Надеюсь, Вы уже установили SHM, авторизовались в интерфейсе администратора, и даже сменили пароль администратора на какой-то более сложный.

Обязательно внесите все необходимые настройки в конфигурацию SHM (раздел «Настройки -> Конфигурация».

Подключение сервера к SHM

Теперь, нам нужно добавить (подключить) наш арендованный VPS/VDS к SHM. Для этого, проследуйте в раздел «Сервера -> Список», и нажмите кнопку «ADD» (Добавить).

Заполните следующие поля:

  • Имя сервера — введите любое имя, например: server1

  • Группа — выберите: VPN

  • Хост — адрес для SSH подключения к вашему серверу, например: root@1.2.3.4

  • Ключ — SSH ключ для подключения к Вашему серверу. Нажмите + и создайте новый ключ. Публичный ключ скопируйте и добавьте его на ваш VPS/VDS сервер в файл: /root/.ssh/authorized_keys

  • Использовать — выберите Шаблон

  • Шаблон — выберите шаблон: wg_manager

Нажмите кнопку «TEST», чтобы протестировать соединение с вашим сервером. Если всё прошло успешно, вы увидите надпись «SUCCESS». Если же увидите ошибку, то проверьте ещё раз поле «Хост» и «Ключ». Нажмите кнопку «SAVE». В списке серверов появится ваш сервер.

Инициализация Вашего VPS/VDS сервера

Найдите Ваш сервер в списке серверов, кликните по нему дважды, чтобы открыть окно редактирования сервера. Внизу окна есть поле settings, нажмите «шестеренку» справа от поля. Откроется редактор настроек сервера. Добавьте туда поле: host_name, и укажите имя или IP адрес вашего сервера. Это поле будет использоваться для ваших клиентов. Клиенты должны знать к какому серверу им подключаться (host для подключения к серверу VPN).

После внесения изменений в настройки сервера, его необходимо сохранить. Нажмите кнопку «SAVE».

Выберите Ваш сервер в списке, кликните по нему дважды, откроется окно редактирования сервера. Нажмите кнопку: «INIT». Так, начнется инициализация (настройка) вашего VPS/VDS сервера. Этот процесс займет несколько минут. Процесс интерактивный, вы сможете наблюдать за статусом. Дождитесь завершения настройки. Ваш сервер готов для оказания услуг.

Как настраивается Ваш сервер вы можете прочитать здесь

SHM это универсальная биллинговая система, т.е. он ничего не знает ни про VPN, ни про WireGuard. Для взаимодействия с вашими серверами используются Шаблоны (в нашем примере шаблон с именем wg_manager. Вы можете посмотреть и даже изменить содержимое шаблона через интерфейс администратора: «Настройки -> Шаблоны».

wg-manager — это отдельный проект, исходный код которого можно посмотреть здесь: https://github.com/danuk/wg-manager. Для Вашего удобства в SHM уже загружен этот скрипт: https://github.com/danuk/wg-manager/blob/master/shm_actions_script.sh, который и является шаблоном: wg_manager. Вы можете изменить его по вашему усмотрению.

Когда мы нажимаем кнопку: «INIT», на вашем сервере будет запущен этот скрипт (загруженный в качестве шаблона), в частности, будет выполнен код из секции INIT.

При создании услуг будет выполнена секция CREATE, при удалении — REMOVE и т.д.

Создание услуг в SHM

Для Вашего удобства в SHM уже создана услуга «VPN» и настроены события.

Перейдите в раздел SHM административного кабинета: «Услуги» -> «Список». Найдите услугу «VPN», кликните по ней дважды и отредактируйте её стоимость. Так же, убедитесь, что галочка «Доступно к заказу» установлена.

Тестирование

  1. Создайте тестового пользователя. Для этого, в Административном кабинете в разделе «Пользователи» -> «Список», нажмите кнопку «ADD» и заполните необходимые поля.

  2. Зарегистрируйте услугу для тестового пользователя. Для этого, зайдите в раздел «Пользователи» -> «Услуги пользователей», и нажмите кнопку «ADD». Выберите тестового пользователя и услугу. Установите стоимость в 0 рублей и нажмите кнопку «CREATE». Подождите, пока статус «PROGRESS» сменится на другой. Если статус «ACTIVE», то поздравляем, всё работает. Но если статус другой, то причину можно увидеть в разделе: «Задачи» -> «Текущие задачи».

  3. В интерфейсе администратора есть возможность перейти в интерфейс клиента. Для этого, зайдите в раздел «Пользователи» -> «Список». Выберите клиента, кликните на него дважды, и далее, нажмите кнопку «Кабинет». Оказавшись в кабинете клиента, вы увидите список его услуг. Кликнув на соответствующую услугу, Вы увидите кнопки отображения QR кода для VPN и кнопку для скачивания конфига VPN. Данные кнопки отображаются только для активных услуг.

Приём платежей

На момент написания этой статьи SHM умеет принимать только платежи ЮMoney. Инструкцию по настройке можно прочитать на сайте документации.

Так же, платежи можно зачислять клиентам в ручном режиме, через Web интерфейс администратора («Пользователи -> Платежи -> [ADD]»).

Если Вы захотите принимать платежи иным способом, то это можно сделать через SHM API, либо написать в группу Телеграм для разработки нужного платежного модуля.

Заключение

В данной статье я продемонстрировал как можно легко и просто запустить свой маленький бизнес по продаже VPN ключиков. Используя SHM API Вы всегда можете разработать свой собственный личный кабинет для клиентов, например, чтобы внедрить его в ваш лендинг, либо использовать имеющиеся ЛК. SHM умеет очень многое, но всё это невозможно описать в рамках одной статьи. Но Вы всегда можете заглянуть на сайт документации, и задать вопросы в группе Телеграм.


ссылка на оригинал статьи https://habr.com/ru/post/701820/

Синяя немецкая стрекоза. Siemens C65 — народный телефон 2004 года

Среди молодёжи всё более популярным занятием становится коллекционирование различных ретро-телефонов, и в особенности — моделей марки Siemens. Всё просто — большинство моделей этой компании и были ориентированы на молодёжь, просто на одно поколение старше, и выделялись молодёжным дизайном, обилием функций и большими возможностями для моддинга. Так чем являлся C65 18 лет назад? Это мы и узнаем!

Предыстория

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

Дело в том, что в начале нулевых было по сути 4 игрока на рынке РФ: Nokia, Motorola, Siemens и Ericsson, и за счёт относительно недорогих и надёжных мобильников, Siemens уже успел завоевать себе хорошую репутацию на молодом мобильном рынке СНГ. Телефоны Siemens были достаточно доступными, надёжными, а местами, привносили совершенно уникальный функционал. Посудите сами: первый телефон с поддержкой Java — Siemens, первый телефон с функцией MP3 плеера — тоже Siemens. Пристёгиваемая в качестве аксессуара камера? И это тоже Siemens!

И если Java на то момент не так уж и впечатляла(у SL45 был монохромный дисплей, и возможность запуска сторонних приложений уже был — например у SE это Mophun), то MP3 плеер в виде отдельного ништяка, поддержка RS-MMC в относительно бюджетных устройствах, и первые бронированные телефоны в лице M серии — нашли своего покупателя и в СНГ!

Но когда таскать с собой огромные тяжёлые кирпичи стало не модно, Siemens пошли классическим путём — они стали делать телефоны на двух платформах S-Gold, и E-Gold, за разработку которых отвечала дочка Siemens — Infineon. Телефоны на E-Gold были базовыми, но достаточно функциональными телефонами — к ней относится A серия устройств, в т.ч устройства с чёрно-белыми дисплеями. А вот на платформе S-Gold строились те телефоны, что сейчас называются «фичефонами» — функциональные мультимедийные комбайны. При этом, эти телефоны обладали функционалом ничуть не хуже Nokia S40, но стоили заметно дешевле.

M65
M65

Всего было два направления(плюс третье ультрабюджеток A серии) — молодёжное(куда входили такие устройства, как C65, M65, M75), и более строгий, бизнес сегмент(но по доступным ценам, такие как C75/CX75). Лучше всего ценообразование описал блогер Миша Белкин — «для тех кто уже ИП, но ещё не ООО».

CX75
CX75

В то время, производитель мог выбирать между несколькими решениями для построения своих телефонов — примерно как сейчас выбирают между MTK, Qualcomm и Rockchip: например LG(G7000A) и Motorola(C350) использовали чипсет TI Calypso, а Hyundai, и опять же, некоторые модели LG — Analog AD6525. На TI Calypso есть открытая прошивка, написанная сообществом, и вольный даташит. На чипсеты AD я тоже находил подробный даташит — учитывая относительную открытость аппаратов на нём, вполне можно написать свою прошивку для таких девайсов. Что касается вендоров, насколько я понял, писать прошивки они должны были сами. Производитель им ничего не давал, но это не точно.

У Nokia решения были всегда свои — отдельный чип выступал в роли ЦПУ, отдельный в качестве модема, отдельный в качестве контроллера дисплея, и отдельный в качество контроллера питания. Всё это они в какой-то степени разрабатывали сами. Именно поэтому у Nokia появилось разделение на платформы — DCT-3(совсем старенькие телефоны типа 3310), DCT-4(телефоны на s40 по 2005 год), WD2(Symbian смартфоны до 2005 года) и BB5(совсем свежие телефоны и смартфоны на S40 и Symbian). Само собой, Nokia разрабатывали своё ПО сами, по своим же гайдлайнам, и эти решения запомнились многим пользователям их девайсов на многие годы!

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

А вот телефоны Siemens, как я уже упомянул ранее, использовали чипсеты под названием E-Gold и S-Gold. В будущем, когда мобильное подразделение Siemens развалится — Infineon сделает модем X-Gold, который затем используют в первом iPhone. Из-за относительной дешевизны сименсов — для них развилось целое коммьюнити модеров, которые сначала отреверсили механизм их загрузки(загрузчик был подписан спец. ключом, который надо было вычитывать из ROM с помощью спец java программы, которая ломает JVM и читает из адресного пространства напрямую), а затем сделали поддержку т.н «эльфов» — нативных программ, которые могли работать в отдельных «задачах»(название потоков в RTOS), обеспечивая, например, информацией о БС на главном экране. Позже появилась возможность вычитать IMSI и Ki из ОЗУ телефона и сделать эдакий аналог eSIM в начале нулевых!

E-Gold, A75
E-Gold, A75

Телефоны Siemens так же любили за их коммуникации — почти у всех «популярных» моделей, кроме A серии(хотя на них тоже была мультимедиа — но только через дата-кабель) был ИК-порт, и по нему можно было передавать java игры, в отличии от моделей многих других производителей — это был несомненный плюс. Позже появился Bluetooth, и поддержка RS-MMC флэшек — которые стоили несколько дешевле M2, и заметно продлили жизнь старичку. На вторичке сименсы стоили совсем недорого, а ещё их часто меняли в школьные/студенческие годы на различные ништяки.

Я в своё время(2010-2012 год) тоже успел повидать это время обмена мультимедиа — только я пользовался уже Bluetooth, но учитывая то, что пользовались мы BT 1.1-2.0, скорость там была не сильно выше ИК порта, да и стабильность зачастую тоже. Живу я в провинции, и полноценный интернет окромя тарифицированного 3G, который часто падал в EDGE, был далеко не у всех.

Конечно же я и сам выменивал телефоны — первый раз я поменял китайскую машину на радиоуправлении(на тот момент они стоили значительно дороже, чем сейчас) на… Saly Elisom:

Только чёрного цвета с зелёными светодиодами. И несмотря на то, что это была чистой воды китайщина без поддержки Java игр, он был очень тяжёлым, металлическим и был вполне себе неплох как мультимедиа комбайн. Я его пытался найти сейчас, но увы — похоже все уже в мусорке. Уже его я выменял через несколько месяцев на Nokia 6060:

которую я взял чисто из-за её поддержки Java игр(было это в 2011 году), это было первое моё знакомство с S40. Там не было даже Bluetooth, но я качал игры через GPRS по смскам на сайтах и мне было достаточно. Были времена!

Итак, что мы имеем? Молодёжный дизайн, хорошие мультимедийные возможности, достаточное кол-во памяти, недорогую цену — вот секрет успеха на Российском рынке. Но затем что-то пошло не так, и после 75 серии, Siemens решили продать своё мобильное подразделение Benq, образовав союз Benq-Siemens. Эти телефоны были весьма стильными, и конкурировали с теми же Samsung, но работали зачастую не на всем знакомой платформе Siemens, а на платформе BREW, и базировались на чипсетах Qualcomm. Таким образом появился EL-71 — который был частично выполнен из металла и смотрелся неплохо.

Но в руках Benq бренд продержался тоже недолго, и затем мобильное подразделение было закрыто. Увы и ах, но ничего не поделаешь — компания Siemens на мобильный рынок возвращаться не собирается, но работает во многих других сферах — например станки, и поезда. В целом, у них вполне был шанс возродить бренд на заре появления Android девайсов(как у Sagem с брендом Infinix), взяв концепцию Xiaomi(лучшее за свою цену, и нацеленность на конкретные рынки), но были ли такие разговоры в компании — неизвестно.

Кроме того, Siemens помимо телефонов, ещё и делали коммуникаторы совместно с японской Fujitsu — серия Fujitsu-Siemens Pocket Loox, на базе Windows Mobile. Это уже были дорогие коммуникаторы, с большими и дисплеями и хорошей комплектацией.

Pocket Loox 720
Pocket Loox 720

А ещё дисплеи Siemens нашли применение в embedded сообществе — на контроллеры дисплеев этих телефонов есть даташиты, и вместо едва паябельных шлейфов Nokia, здесь контакты, как и на Motorola, «прижимаются», а сами дисплеи стоят недорого. Работают они по протоколу SPI, который хардварно есть во многих МК. Некоторой проблемой остаётся лишь сборка повышающего преобразователя до 12в подсветки, а так всё давно уже задокументировано.

Обзор

Конкретно мой экземпляр достался мне за 27 рублей(~0.4$), без крышки и аккумулятора, скорее всего с помойки. Как я уже рассказывал — я купил у мужика, который жил недалеко от городской свалки, целый мешок телефонов — где и был этот «семён». Он был полностью рабочий, но очень блеклый — эксклюзивно в этой модели регулируется контрастность дисплея. Подрегулировал и стало чуть лучше.

В остальном устройство было полностью рабочее. В той же коробке были другие «семёны» — c75 и cx75, у c75 не было подсветки, а у cx75 не работал джойстик.

Касательно запуска — BSI(т.е средний контакт) этот телефон не требует, и заряжает даже «левые» аккумуляторы, поэтому если у вас где-то лежит такой ништяк без АКБ — приколхозить сюда аккумулятор по типу BL-4C сюда не проблема.

Для передачи данных, мы будем использовать другой ништяк — W810i, обзор на который у меня уже был ранее. У него есть и ИК-порт, и Bluetooth. Общая цепочка была такой: у меня отказал Bluetooth модуль на ПК, поэтому я через usb передавал на смартфон файлы, затем через Bluetooth передавал на SE, и затем через ИК-порт передавал на сименс. Не быстро, но весьма стабильно.

Касательно UI, главное меню было достаточно в модном на то время стиле значков. Оно было полностью анимированным — причём на более «премиальных» моделях, значки были куда более строгими, в то время как здесь они выглядят, как зарисовка. Вполне симпатично и сейчас.

Не забываем выкрутить контрастность на максимум, иначе дисплей будет не читаемым! Для тех лет дисплей с разрешением 130×130 был вполне себе стандартным — прошлогодняя Moto C350 имела разрешение что-то около 102×78! А тут нормальный квадратный дисплей с неплохой цветопередачей(на фото не очень хорошо видно из-за шумов камеры, создаётся впечатление ещё более низкого разрешения, чем есть).

И если стандартные фишки типа звонилки здесь работают исправно и сейчас, то главным ништяком здесь всегда был файловый менеджер. На самом деле в памяти сименсов можно было найти многое — в т.ч домашний контент, но смотреть его, конечно, такое себе. В этом сименсе было 10мб встроенной памяти, и этого хватало на всё — как я рассказывал в статье про Nokia, картинка в жпеге могла весить 10-30кб, гифка возможно чуть больше(короткие эро-гифки помним?), wav с частотой дискретизации 22050Гц, и в моноканальном формате, весили что-то около 300-400кб(песня могла весить до нескольких мегабайт, и иметь их было расточительно), но куда более частый формат — mid, или «сделай караоке себе сам». И ведь людям хватало, при том, что на КПК уже во всю можно было ставить SD флэшки на несколько сотен мегабайт, и накидать туда хоть какое-то кол-во музыки в mp3, а затем слушать её без проблем. На Nokia смартфонах тоже уже был слот под RS-MMC, а поддержку MP3 туда добавляли с помощью сторонних плееров.

Касательно сименса — был конечно «эльф» для прослушивания mp3, но был ли от него большой толк? Сомнительно. Кроме того, тогда в телефонах зачастую не было приложения «плеер» отдельно(кроме j2me приложений) — нужно было натурально заходить в файловую систему и искать интересующий трек.

Хотим сделать плейлист? Не вопрос — раскидай треки по папкам! В начале статьи, я передаю музыку по ИК порту с сонерика не просто так! В каждом устройстве своя реализация MIDI-синтезатора, поэтому один и тот же трек звучит по разному на разных устройствах. Поэтому Europe.mid на вашем Android устройстве будет звучать не точно так же, как звучал на Siemens. Поэтому я сделал для вас вот такие нарезки:

Пример музыки в wav. Её действительно слушали отрывками, зацикливая, и было норм!

Бумер.mid. Доказательство того, что это не динамик севший, а действительно WAV так звучали!

Europe.mid

Что ещё помнит сименсовод, кроме кассетных катушек, и анимации с пацаном? Конечно же Stack Attack! Эта фирменная игра стала доступна в самом начале нулевых, и стала эдакой «змейкой» из мира сименсов. При этом StackAttack как игра была заметно сложнее «змейки».

Со временем змейка стала 3D на S40, как и фирменный мячик Bounce обзавёлся очень неплохой графикой на Symbian. StackAttack на C65 тоже стало 3х мерным, или вернее — изометрическим. Игрушка выглядит здорово, но увы, закинуть новые можно только через дата-кабель, который у меня имеется.

Но поскольку кабеля для таких сименсов являются либо COM кабелями, либо преобразователями COM -> USB, мой кабель на чипе ArkMicro не хотел адекватно работать под VMWare(хотя несколько сименсов я им уже сделал), поэтому синхронизация без хорошего кабеля для этих сименсов недоступна.

Лично мне из встроенных игр запомнились совсем не эти — в моём детстве сименсы у меня не водились. Но был самсунг с арканоидом, и игрой, графика которой казалось достаточно классной для мобилки на то время: Archangel:

А ещё забавной рпг-платформером про мальчика.

Заключение

Телефон на своё время был очень ходовым — из-за сочетания цена/качество. В относительно схожем сегменте его конкурентом был Motorola E398(и всё равно он был заметно дороже. Цена c65 — около 5-6 тысяч рублей, motorola — около 7-8 тысяч рублей), но тот уже был действительно, если не музыкальным флагманом, так действительно серьёзным музыкальным устройством, на базе которого сделали затем ROKR E1 — модель с синхронизацией с iTunes. Для многих сименс запал в душу как телефон детства и юности, как телефон, который когда-то выменяли бартером, и как первый функциональный комбайн. И это правда — телефон действительно классный. И если в случае Nokia, нашёлся HMD Global, который напоминает те самые телефоны, то в случае Siemens таких компаний не нашлось. А жаль, занимательно было бы увидеть 4G кнопочники от Siemens!

А ваше мнение? Решать вам!

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Понравился C65?
45% Да! Был такой! Классный аппарат. 18
2.5% Нет, был такой. Не понравился, быстро поменял. 1
0% Да, был такой, но лишился не по своей воли (кража). 0
22.5% Нет, не было и не нравился. 9
30% Нет, но хотел такой 12
Проголосовали 40 пользователей. Воздержались 4 пользователя.

ссылка на оригинал статьи https://habr.com/ru/post/702528/

Как говорить с клиентами на одном языке: создаем tone of voice бренда

Помните новогоднюю рекламу Coca-Cola? Перед глазами сразу красный грузовик, а в голове – песня со словами «Праздник к нам приходит». Вы узнаете продукт, даже если не будет упоминаться название бренда. В этом важную роль играет tone of voice.

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

Но иногда бренды игнорируют разработку индивидуальной тональности: поэтому они по-разному «звучат» в разных каналах и отдаляются от потребителей. Рассказываем, как разработать tone of voice, чтобы сохранить и повысить их лояльность, а также получить на рынке высокие позиции.

Что такое tone of voice и почему он важен

Tone of voice (ToV) – тональность, которую соблюдает бренд, общаясь со своими потребителями. Именно tone of voice задает отношения, которые могут сложиться у компании с потенциальной целевой аудиторией, и то, захотят ли люди ассоциировать себя с брендом. Правила коммуникации компании с аудиторией едины для разных каналов: сайта, социальных сетей, почтовой рассылки и даже телефонных звонков. Они включают требования к стилю языка, подаче, форме корпоративной информации и обычно прописаны в брендбуке. Например, вы ведете группу в ВК и запустили несколько рекламных кампаний по таргету. Тональность постов и объявлений должна быть примерно одинаковая.

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

Повышает узнаваемость бренда и помогает отстроиться от конкурентов

На рынке масса предложений. Мобильные операторы, банки, магазины бытовой техники борются за каждого клиента. Tone of voice является частью фирменного стиля, который запоминается аудитории. 

Часто потребители обращаются в компании, о которых слышали, так как испытывают больше доверия к ним. Они как будто знакомы с брендом, поэтому более лояльны к нему. Разработка tone of voice помогает успешному продвижению бренда на рынке.

Помогает установить эмоциональную связь с потребителями

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

Транслирует ценности компании

Общение бренда с аудиторией показывает миссию и ценности бизнеса, то, чем живет компания. Информация должна считываться, являться неотъемлемой частью имиджа. 64% потребителей уверены, что общие ценности – основа доверия к компании. 

Поддерживает единую коммуникацию во всех каналах

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

Каким бывает tone of voice

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

Формальный или неформальный

Согласно опросам, 65% клиентов хотят, чтобы сотрудники службы поддержки разговаривали с ними неформально. Но на восприятие влияет контекст, потому 78% клиентов останутся не в восторге, если их запрос отклонят неформальным языком.

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

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

Такой tone of voice часто выбирают банки, например ВТБ
Такой tone of voice часто выбирают банки, например ВТБ

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

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

Если вам кажется, что общаться с клиентами нужно только официально, Burger King готов поспорить
Если вам кажется, что общаться с клиентами нужно только официально, Burger King готов поспорить

Веселый или серьезный

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

Skyeng может научить петь песни на английском, использовать пословицы и поговорки и даже выражаться, когда «щит реально хэппенс»
Skyeng может научить петь песни на английском, использовать пословицы и поговорки и даже выражаться, когда «щит реально хэппенс»

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

Уважительный или дерзкий

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

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

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

Один из наиболее приличных постов бренда VIZIT
Один из наиболее приличных постов бренда VIZIT

Восхищенный или сдержанный

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

Банк Тинькофф эмоционально общается со своими подписчиками, заставляет поностальгировать
Банк Тинькофф эмоционально общается со своими подписчиками, заставляет поностальгировать

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

В tone of voice ЮMoney все просто и понятно
В tone of voice ЮMoney все просто и понятно

Как найти свой tone of voice

Разберем выбор наиболее подходящего tone of voice на примере бренда женской одежды.

Пример

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

Как определить, какой tone of voice поможет компании N привлечь клиентов?

Этап 1. Узнать ДНК бренда

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

1. Анализ инсайтов, УТП и ценности бренда

Для этого нужно задать вопросы:

  • Что это за бренд?

  • Для кого он создан?

  • Чем полезен?

  • Почему он существует?

  • В чем отличия от конкурентов?

  • Почему бренд был создан?

  • Какова миссия бренда?

  • Какие социальные идеи поддерживает бренд?

  • Какими ценностями он хочет поделиться?

  • Какие ценности ближе всего потенциальным клиентам?

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

Пример

УТП компании N: дорогостоящая эксклюзивная деловая одежда, которая подчеркивает достоинства женской фигуры. Изделия украшены авторскими работами ювелирного и декоративно-прикладного искусства.

Инсайты:

  • Деловой костюм бывает нескучным.

  • Деловой костюм способен выглядеть уместно на всех светских мероприятиях.

  • Деловой костюм готов составить конкуренцию вечерним платьям.

  • Российская одежда не уступает изделиям модных домов Европы.

Ценности:

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

  • Носить эксклюзивную одежду от российских дизайнеров – статусно и престижно.

  • Все женщины уникальны. Поэтому они должны носить роскошные костюмы, которых больше ни у кого нет.

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

2. Описание бренда как реального человека

Представьте, что бренд – это человек. Опишите его, ответив на вопросы:

  • Какие у него привычки?

  • Какие черты характера имеет?

  • Как выглядит?

  • Какие у него увлечения?

  • Что ему интересно (что смотрит и читает)?

  • Где и как проводит свободное время?

  • Какой у него круг общения?

  • Как общается с разными людьми (какие слова использует, каким тоном говорит, с какой скоростью и т. п.)?

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

Пример

Компания N – уверенная в себе женщина 25–45 лет. Она сама построила карьеру и имеет высокий уровень дохода. Руководит департаментом в большой международной компании. Ухоженная, образованная, стильная.

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

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

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

Этап 2. Составить портрет целевой аудитории бренда

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

Нужно проанализировать потенциальных клиентов – выбрать 5–6 конкретных людей и прописать анкету для каждого, используя чаты на открытых форумах, аккаунты в соцсетях и другие каналы. Чтобы уточнить данные, можно использовать системы аналитики Google Analytics и Яндекс Метрику.

Потребуется выяснить:

  • образование;

  • страну и город проживания;

  • должность;

  • стиль жизни;

  • возраст;

  • личную жизнь;

  • потребительские предпочтения.

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

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

Если возможно напрямую пообщаться с реальными покупателями, нужно использовать этот шанс:

  1. Попросите их описать бренд как живого человека (список вопросов был указан ранее).

  2. Спросите о личном:

  • Что они делают ежедневно?

  • Что воодушевляет?

  • Какой круг общения?

  • Как и где проводят свободное время?

  • Как часто и где взаимодействуют с брендом?

  • За что ценят бренд?

  • Как общаются (используют ли канцелярит, сленг, образные обороты и пр.)?

Пример

Разберем портрет ЦА компании N:

  • Социально активная серьезная женщина 30 лет.

  • Работает и живет в Москве или Санкт-Петербурге.

  • Получила высшее образование в престижном вузе, есть степень MBA.

  • Руководит коммерческим отделом в крупной финансовой фирме.  Перерабатывает.

  • Финансово независима.

  • Замужем несколько лет.

  • Любит красивые эксклюзивные вещи и часто их покупает.

  • Хочет уделять больше времени семье, заниматься самообразованием.

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

  • Ухаживает за собой в салонах красоты.

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

  • Кумир – звезды Голливуда, которые роскошно выглядят и много работают.

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

Этап 3. Провести аудит коммуникаций и контента бренда

На этом этапе помогут полученные ранее ответы на вопросы. Сначала нужно было определить примерную манеру общения персоны бренда, а потом – специфику речи клиентов. Теперь нужно сравнить стилистику и  тональность текущего контента с собранной информацией.

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

Nielsen Norman Group разработали систему координат, которая помогает создавать tone of voice. В ней необходимо определить место бренда в каждом ряду.

Например:

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

Уточнить tone of voice можно с помощью списка характеристик тона. Norman Nielsen Group создала список слов, которые можно для этого использовать.

Критерии

Характеристики

Веселый / Серьезный

Веселый, Забавный, Консервативный, Шутливый, Информативный, Серьезный, Причудливый, Прикольный, Остроумный

Формальный / Неформальный

Благонадежный, Обыденный, Разговорный, Формальный, Откровенный, Сочувствующий, Профессиональный, Умный, Дружелюбный 

Уважительный / Дерзкий

Авторитетный, Заботливый, Провокационный, Непочтительный, Нетерпеливый, Непримиримый, Вежливый, Вспыльчивый, Саркастичный, Грубый

Восхищенный / Сдержанный

Сухой, Оптимистичный, Страстный, Пессимистичный, Модный, Рекламный, Ностальгический, Романтический

Важно: один бренд – одна персона – один посыл в коммуникации.

Определив характеристики tone of voice, можно составить карту слов, которые планируется использовать в коммуникации. Разделите по группам существительные, прилагательные и глаголы. В дальнейшем документ можно дополнять, например стоп-словами.

Пример

Компании N будет свойственен следующий тон: серьезный, неформальный, уважительный, восхищенный.

Пост для социальных сетей может выглядеть так:

Перед выходом из дома каждая Дама N:

1. Наносит легкий макияж;

2. Убеждается, что глянцевые визитки пахнут ее любимыми духами;

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

И, конечно же, говорит себе: я прекрасно чувствую себя, потому что выгляжу великолепно!

Как оценить эффективность

Точных метрик, которые помогают отследить жизнеспособность tone of voice, нет. Эффективность помогают определить косвенные показатели.

  • Рост узнаваемости – если люди узнают бренд по визуалу и тексту, значит, tone of voice работает.

  • Увеличение количества упоминаний – если tone of voice работает, о коммуникации с брендом захочется рассказать, сделать репосты. Например, следить за упоминаниями можно через сервис Google Alerts, Brand Analytics, Медиалогия, Mentionlytics и пр.

  • Число и общая тональность обращений – если аудитории приятно общаться с брендом, она сама будет выходить на диалог: делиться опытом применения продукта, задавать вопросы, оставлять отзывы.

Какие ошибки встречаются чаще всего 

Иногда компании допускают ошибки, выбирая tone of voice: не определяют границы допустимого в общении, не учитывают специфику аудитории, не придерживаются определенной стратегии. В результате они отталкивают аудиторию, портят репутацию и теряют доверие. 

Копирование чужого tone of voice

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

Резкое изменение голоса бренда

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

Одинаковые ответы

Общаясь с аудиторией, необходимо учитывать контекст. Если у бренда веселый tone of voice, это не означает, что шутки должны быть в каждом сообщении. Tone of voice является основой для коммуникации, а не программой для обязательного повторения. Если клиент обратился с проблемой, нужно решать ее, а не отшучиваться.

Отсутствие руководства по tone of voice

Иногда разные сотрудники компании по-разному понимают голос бренда. Чтобы поддерживать общую тональность в общении с аудиторией, избежать разногласий в подаче, создается единый свод правил tone of voice с примерами – руководство по tone of voice. Оно может быть как в виде отдельного документа, так и раздела брендбука.

Примерная структура руководства:

  • портрет целевой аудитории;

  • манифест бренда (ценности, миссия и пр.);

  • образ бренда;

  • характеристики TOV и карта слов;

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

Примеры:


ссылка на оригинал статьи https://habr.com/ru/company/click/blog/702534/

«Саботаж помог преобразовать нашу компанию»

image

“Здравствуйте, меня зовут Дмитрий. Хочу поделиться одним, как мне кажется, интересным опытом в моей карьере.

Лет так 10 назад я работал в средней производственной компании, на тот момент на позиции руководителя IT. В нашей компании работало более 500 сотрудников, было много разнообразных направлений и отдельных проектов (включая IT). Управление компании было жестко разделено: генеральный директор занимался внешними отношениями и не лез во внутренние процессы, где полноценно правил операционный директор. Еще был собственник, который подключался редко и только по стратегическим вопросам. Хочу отметить, что операционный директор работал на предприятии с самого старта и заслужил уважение и доверие собственника. Поэтому, его управлению никто не мешал, решения принимались автономно, в дела никто не вмешивался.

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

В мае начались первые проблемы…, и начались из-за особенностей стиля управления нашего операционного. Несмотря на свое трудолюбие и ежедневные 14-часовые рабочие смены (частенько и с рабочими выходными), операционный любил сам управлять всеми процессами и везде принимать решение лично. Он редко пользовался знаниями и опытом сотрудников. Из-за этого, кстати, в компании долго не задерживались экспертные профессиональные люди, и много проектов не приносили ту прибыль, которую могли бы приносить (и впоследствии начали приносить). Но должен отдать должное, он был действительно эксперт в своем деле и большинство решений были правильными. Но, как я написал ранее, ему приходилось из-за этого работать по 14 часов… И вот, у нашего операционного и руководителя проекта возник конфликт из-за вмешательства первого в решения второго.

Почему этого не было ранее? Первые 2 месяца руководитель проекта смиренно прислушивался к операционному, так как был еще человек новый (в компании) и знал, что должен сначала вникнуть в процессы, а уже потом брать на себя управление и ответственность. Но прошло 2 месяца, а влияние операционного не снижалось. Он никак не собирался отпускать руководителя проекта в самостоятельный путь (даже на грамм): решение по людям принимал операционный, решение по клиентам и договорам, также операционный. Естественно, операционный выслушивал предварительно руководителя проекта, но потом сам решал. И так продолжалось до момента, когда нужно было утвердить новую стратегию по международке. Здесь то все и началось, и впоследствии закончилось… Руководитель проекта основываясь на свой опыт предлагал оставить крупных клиентов, и максимально усилить долю в среднем и малом бизнесе. Он уже ранее запускал проект в этой части Европы и аргументировал свое мнение. Операционный же никак не соглашался и стоял на своем.

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

Спустя месяц такой работы и напрасных попыток вразумить обидевшихся коллег, операционный принял решение уволить всю команду. Он собрал всех, озвучил решение, все, естественно, отказались уходить по собственному желанию. Для решения вопроса операционному пришлось подключать ген. директора. Но и это не помогло…. Угрозы, просьбы — все зря. Тогда, в дело включили собственника. Собственник решил прежде всего разобраться в ситуации и встретился сначала с операционным, а уж потом с руководителем проекта. Во время беседы руководитель проекта вел себя максимально корректно, не было заметно ни капли саботажа, конфронтации, обиды и прочего. Он вел себя профессионально и аргументированно объяснил, что произошло и почему он сейчас занял такую позицию, и что ему в целом нравится проект и он даже верит в то, что сможет приносить пользу компании. Он подготовился к этой встрече.

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


Я считаю себя по умолчанию лояльным сотрудником, мне не все равно, что будет с моими проектами и моими людьми. И с этим пониманием я однажды пришел к удивительному и нелогичному (по отношению к первой части этого абзаца) выводу. Я считаю, что саботаж — это вполне полезный в долгосрочной перспективе метод. Саботаж позволяет ярко подсветить те проблемы, которые долго скрывались. Ведь пока все тихо и спокойно, пока люди тихонько покидают компанию — засидевшиеся руководители могут продолжать ничего не делать и ничего не менять. Всегда ведь проще сказать, что-то типа “какая-то слабая девочка оказалась”, или “дааа… не оправдал парень доверия. А у него такой опыт был” и не смотреть на себя любимого.

Саботаж сам по себе несет только разрушение. Поэтому, говоря по долгосрочную пользу, стоит понимать, что я говорю не про него, а про последующий за ним глубокий анализ. Компания должна смотреть не на саботаж, а на причины, которые к нему привели. Ведь саботаж редко бывает “врожденным”. Саботаж — это последствие каких-либо действий компании/руководителя. То есть, его приобретает сотрудник в процессе сотрудничества. Не бывает такого, что на собеседование либо в первый рабочий день пришел “хороший мальчик”, а спустя 2 месяца он превратился в первого саботажника. Я не верю в это! Но я точно знаю, что компания своей адаптацией, своим управлением, своими ценностями и культурой может способствовать такому превращению. Ну давайте просто представим. Вы эксперт, профи и готовы работать. Вы приходите в компанию, где вас встречает пустой стол. В течении первого дня, ато и двух, вам доносят технику, открывают доступа и т.п. Далее, вы неделю сидите и ждете, когда руководитель соизволит с вами встретиться и обсудить план адаптации. Далее, вы начинаете работать, но ваше мнение никого не интересует, ваши предложения рубятся на корню и резко, вас не приглашают на совещания, которые относятся к вашей зоне ответственности. От вас требуют какого-то результата, но решения принимаются вместо вас. В вашу работу постоянно лезут с замечаниями, с неуместной критикой, и никогда не хвалят (даже, если есть результат). Кроме всего этого, вам постоянно меняют приоритеты, направления, стратегию и т.д. Насколько лояльны вы будете?


“Разве нельзя по-другому донести о проблеме? Зачем же сразу саботировать?”

Бывает, что нельзя…

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

Поэтому, если сотрудник решил пойти этим путем (путем саботажа), значит либо он не видел другого пути, либо он не знает, как идти другим путем, либо другого пути попросту нет.

Из вышесказанного следуют такие рекомендации:

  1. Настроить каналы коммуникации. И далеко недостаточно просто сказать: “Пожелания/жалобы пишите на этот ящик”. У сотрудника должен быть безопасный канал! Он должен понимать, что его обращение будет принято нормально, будет осмыслено и он получит развернутую обратную связь.
  2. Искать причины саботажа. Когда в компании происходит “пожар” нужно обязательно разобраться в причинах его возникновения. Даже если он потушен сразу, даже если последствия несущественны — нужно найти причины.
  3. Открытое мышление. Открытость мышления — это способность поддавать сомнению свои решения и переосмысливать их. Ничего так не ценится сотрудниками, как готовность руководителя принять правки в свои решения и признать ошибки. Зная об этом качестве руководителя, у сотрудника пропадает страх обратиться к нему с обратной связью.


“Никакой пророк не принимается в своем отечестве”

Людям свойственно реагировать постфактум. Как считаете, какой фактор сильнее повлияет на руководителя, чтобы пересмотреть приоритет задачи “провести аудит пожарной безопасности в сети”: обращений специалиста по охране труда или пожар на одной из точек? Ответ очевиден. И так во всем! У руководителя, как и должно быть, основной акцент идет на развитие продаж, масштабирование, борьбу с конкурентами. А вопросы контрмер у него находятся где-то внизу списка. Почему? Потому что еще не “грянул гром”, нет проблем, нет последствий. Это все пока далеко и не факт, что произойдет. Это, во-первых.

А еще достаточно часто на принятие решения влияет правило — “никакой пророк не принимается в своем отечестве”. Я неоднократно встречал и встречаю ситуации, когда слова внутренних сотрудников воспринимаются, мягко говоря, с иронией и скепсисом, а вот если кто-то извне скажет — этому верят на 100%. Но проблема в том, что эти “извне” не всегда рядом и не всегда теме. Поэтому, выход один: “Ваня, провести аудит — это важно. Но, мне кажется, что ты зря паникуешь и у нас все хорошо. Ну есть у нас небольшие отклонения от нормы. А у кого их нет? Раньше не горели и сейчас не сгорим. Это, во-вторых.

Поэтому, если к руководителю придет сотрудник и начнет говорить, что “проект провалиться” или “не стоит это запускать” — какие шансы, что его услышат и серьезно задумаются? Всегда остается вариант “а вдруг, нам повезет”, “ведь раньше ж не горели…”. И это “а вдруг” может перечеркнуть все аргументы, с которыми пришел сотрудник. Каждый руководитель верит в свою уникальную удачу, которая поможет ему еще и еще. Поэтому, “а вдруг” будет ближе, чем любые аргументы. Это, в-третьих.


Итого

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

Руководителю не стоит впадать в уныние от происшествий. Да, они сейчас нанесли вред. Но ведь главное, что будет после. Если после этих происшествий вся корпоративная система будет перестроена (как в истории выше), значит подобные происшествия являются полезными для будущего компании, и компания/руководители выйдут на новый уровень. Ведь часто бывает, что руководители просто не видят проблемы, так как не хватает опыта в этом, либо приелось настолько, что уже не замечаешь. И только возникновение проблемы позволяет увидеть, что оказывается это работало неправильно уже давно… При этом, конечно, лучше не ждать происшествий, постоянно быть начеку и компенсировать недостаток опыта/знаний (читать книги, общаться с экспертами, …).

Понравилась статья? Находите больше статей о менеджменте в моем телеграм-блоге OSмысленный менеджмент.

Подписывайтесь, далее будет!



ссылка на оригинал статьи https://habr.com/ru/post/702544/

Как я использовал нейросеть для категоризации трехмерных тел

Значимость темы машинного обучения (machine learning) сегодня очевидна. Это огромный домен знаний в Computer Science, которому в России, в частности, посвящают конференции уровня недавней AI Journey. Существует множество способов применения ML в различных областях, среди самых исследованных: распознавание изображений/видео/голоса, процессинг текста. Однако есть и более любопытные задачи, с которыми справляется ML. Например, обучение с подкреплением, что позволяет ИИ играть в игры типа Го, идентификация людей по фотографии, распознавание жестов, движений и поз человека.

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

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


Привет, Хабр! Меня зовут Владимир Цышнатий, я ведущий разработчик C++ в МойОфис. Оригинальную версию этой статьи я написал четыре года назад, когда инструменты машинного обучения уже вызывали активный интерес крупных компаний. В 2022 году ML все чаще называют доминирующей отраслью технологий и, учитывая повышенное внимание к этой теме, я решил «оживить» свой материал: внес некоторые правки и рад представить его хабрасообществу. Надеюсь, этот труд пригодится моим коллегам и последователям 🙂

Тема статьи обусловлена моим прошлым профессиональным опытом: в 2018 году я работал в компании, которая создает трехмерные BIM/CAD системы проектирования. Однажды утром у нас с коллегами разгорелся спор о возможностях применения технологий машинного обучения в области распознавания трехмерных тел. В ходе дискуссии была сформулирована прикладная задача; ее суть я описываю ниже.

Представим себе здание — многоквартирный дом, — в котором все квартиры полностью укомплектованы мебелью: есть стулья, столы, кровати и так далее. При этом все подобные предметы представлены 3D-моделями, импортированными в проект в виде вершин и треугольников — без какого-либо контекста вроде меток и любой другой заданной специфики. Нам необходимо создать спецификацию для этих тел, то есть посчитать, сколько стульев/столов/другой мебели нужно купить, чтобы обставить все квартиры.

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

Что ж, вызов принят: нужно создать Proof Of Concept. Исследование уже имеющихся методов привело меня сюда.

Для пробной реализации был выбран метод DeepPano — за его оригинальный подход к проблеме, простоту реализации и приличные (на момент написания оригинальной статьи) результаты.

Собираем данные

В 2018 году подходящих для моей задачи датасетов было совсем мало. (Впрочем, и сейчас область обработки трехмерных тел с помощью алгоритмов машинного обучения значительно менее изучена, чем, к примеру, обработка изображений или текста.) Поэтому данные пришлось добывать с миру по нитке. Одним из лучших вариантов оказался ModelNet10, который представляет собой набор тел из 10 категорий. Всего в этом датасете около 5000 моделей, включая различные шкафы, телевизоры, стулья и прочие подобные предметы — то есть то, что нам нужно.

Оказалось, датасет очень несбалансирован.

В нем обнаружилась масса дубликатов, число семплов после их удаления оставило около 3500. Очевидно, это слишком маленький набор данных, ведь мы, по большому счету, еще даже не начинали с ними работать. Я решил загрузить больше моделей нужных мне категорий с 3D Warehouse.

Проблема в том, что эти модели представлены в формате .skp — внутреннем формате SketchUp. Мне же нужны лишь треугольники, кроме того, в ModelNet10 все модели существуют в формате .off, который представляет из себя только сохраненную геометрию, без материалов и другого контекста. Очевидно, из .skp можно вытянуть геометрию и сохранить в .off. Проделать это можно с помощью SketchUp C API. Кроме того, для некоторых категорий дополнительные данные набрать не удалось и, поскольку моя работа — всего лишь Proof Of Concept, такие категории были удалены. Осталось 7 категорий объектов.

Код .skp -> .off конвертера

После всех этих манипуляций датасет получился таким:

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

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

В чем плюсы DeepPano?

DeepPano не занимается распознаванием 3D-геометрии напрямую. Вместо этого метод сводит задачу к распознаванию grayscale-изображений. Получается это с помощью создания разновидности цилиндрической проекции.

На вход подается трехмерное тело (это именно визуализированное тело, его можно покрутить):

А результатом является картинка в градациях серого (именно картинка, покрутить нельзя):

Так как же работает цилиндрическая проекция?

Рассмотрим на примере кубика.

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

Ось Z назовем Главной осью (Principal Axis) Далее представим себе цилиндр, описанный вокруг этого кубика:

Теперь нанесем на боковую поверхность цилиндра сетку размером MxN.

Теперь спроецируем каждый узел сетки на Главную ось. Обозначим множество получившихся проекций как P (points), а множество отрезков, соединяющих узлы сетки с их проекциями — S (segments).

Для каждого отрезка из множества S пересекаем его с кубиком и запоминаем точку пересечения для каждого узла сетки.

В общем случае (для тела, которое не является кубиком) мы можем получить несколько пересечений или же, напротив, ни одного:

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

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

Теперь мы можем сформировать результат преобразования тела в картинку с помощью следующего алгоритма:

  1. Создать матрицу изображения размером MxN (такого же, как размер сетки на цилиндре)

  2. Для каждого элемента из R (текущий элемент из R обозначим CR):

    1. Если пересечения нет, то в матрицу-изображение вносим 0 — черный пиксель

    2. Иначе

      1. Берем проекцию CR на Главную ось, обозначим проекцию PR

      2. Соединяем отрезком PR и CR, запоминаем длину отрезка, обозначаем DR

      3. Берем длину отрезка от узла сетки до PR, обозначаем DO

      4. Пишем в матрицу-изображение значение пиксела, равное DR / DO. Очевидно, что это будет число в интервале [0, 1]

Результат алгоритма записываем в файл для дальнейшего препроцессинга.

Каковы преимущества и недостатки этого алгоритма?

Плюсы:

  1. Простота реализации, понятная математика.

  2. Мы фокусируемся на видимой, внешней поверхности тела. Два одинаковых внешне шкафа с разной компоновкой ящиков будут для нас одним и тем же шкафом. Это упрощает задачу распознавания и является разумным предположением.

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

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

Минусы:

  1. Требуется препроцессинг:

    1. Тела нужно изначально ориентировать одинаково. В датасете, к примеру, могут быть шкафы, повернутые на 90 градусов. Сделано это было, исходя из предположения, что шкафы более высокие, чем широкие и длинные. Поэтому можно построить Minimal Bounding Box, с помощью которого и ориентировать тело.

    2. Нужно понять, где будет проходить Главная ось для каждого тела. Если тело уже правильно ориентировано, то можно взять (0, 0, 0) в центре нижней грани BoundingBox, а ось построить вертикально вверх.

  1. Если выйти за рамки Proof of Concept, стоит, конечно, учитывать внутренние особенности тел. Сделать это можно с помощью цилиндрических сечений. По сути, сейчас мы взяли только самое внешнее из них. Ничто не мешает прогонять этот же алгоритм для концентрических цилиндров уменьшающегося радиуса, но той же высоты, и получать набор картинок на выходе. Далее можно комбинировать эти картинки в одну, получая некий дескриптор тела, или представлять один семпл в обучении как набор картинок.

Здесь приведен код расчета цилиндрической проекции по описанному выше алгоритму с использованием trimesh для поиска пересечений с телом.

Вот примеры расчета для реальных тел:

Стул

Кровать

Унитаз

Процессинг получившихся данных

  1. Убрать дубликаты или очень похожие картинки. Можно сделать попиксельное сравнение или сравнение с помощью кросс-корреляции.

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

  3. Аугментировать данные: те же шкафы бывают несимметричными. Тогда простое отражение картинки даст нам новый «полезный» шкаф. А вот с унитазами так не выйдет, нужен или более хитрый способ аугментации, или же просто подправить вес семпла при обучении.

Ну когда уже нейросети??

А почему вообще нейросети? Это решение было принято, так как именно сети лучше всего справляются с распознаванием объектов с картинок. Та же устаревшая AlexNet победила в ImageNet, чем произвела революцию в image classification. Во многих соревнованиях сети справляются лучше других алгоритмов. А поскольку моя задача обозначена как «Proof Of Concept», я решил не мудрить и построить сверточную сеть простейшей архитектуры.

Архитектура сети VGG16.

Создадим модель

def create_model():     inp_1 = Input(shape=original_img_size)     conv_1 = Conv2D(96, kernel_size=(5, 5),                      activation='relu',                      input_shape=(image_rows, image_cols, 1),                      kernel_initializer=initializers.glorot_normal(seed),                      bias_initializer=initializers.glorot_uniform(seed),                      padding='same',                      name='conv_1')(inp_1)     batch_norm_1 = BatchNormalization()(conv_1)     max_pool_1 = MaxPooling2D(pool_size=(2, 2), padding='same', name='max_pool1')(batch_norm_1)      conv_2 = Conv2D(256, (5, 5), activation='relu',                      kernel_initializer=initializers.glorot_normal(seed),                      bias_initializer=initializers.glorot_uniform(seed),                      padding='same', name='conv_2')(max_pool_1)     batch_norm_2 = BatchNormalization()(conv_2)     max_pool_2 = MaxPooling2D(pool_size=(2, 2), padding='same', name='max_pool2')(batch_norm_2)      conv_3 = Conv2D(384, (3, 3), activation='relu',                      kernel_initializer=initializers.glorot_normal(seed),                      bias_initializer=initializers.glorot_uniform(seed),                      padding='same', name='conv_3')(max_pool_2)      batch_norm_3 = BatchNormalization()(conv_3)     max_pool_3 = MaxPooling2D(pool_size=(2, 2), padding='same', name='max_pool_3')(batch_norm_3)     rwmp = MaxPooling2D(pool_size=(1, 20), padding='same', name='rwmp')(max_pool_3)      flatten_1 = Flatten(name='flatten1')(rwmp)     dense_1 = Dense(64, activation='relu',                     kernel_initializer='uniform',                     bias_initializer='uniform',                     name='dense_1')(flatten_1)     dropout_1 = Dropout(0.5, name='dropout_1')(dense_1)     dense_2 = Dense(64, activation='relu',                     kernel_initializer='uniform',                     bias_initializer='uniform',                     name='dense_2')(dropout_1)     dropout_2 = Dropout(0.5, name='dropout_2')(dense_2)     softmax = Dense(num_classes, activation='softmax',                     kernel_initializer='uniform',                     bias_initializer='uniform',                     name='output')(dropout_2)     return Model(inp_1, softmax)  model = create_model()  optimizer = optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)  model.compile(loss=keras.losses.categorical_crossentropy,               optimizer=optimizer,               metrics=[keras.metrics.categorical_accuracy, fmeasure, precision, recall])   ''' _________________________________________________________________ Layer (type)                 Output Shape              Param #    ================================================================= input_1 (InputLayer)         (None, 64, 160, 1)        0          _________________________________________________________________ conv_1 (Conv2D)              (None, 64, 160, 96)       2496       _________________________________________________________________ batch_normalization_1 (Batch (None, 64, 160, 96)       384        _________________________________________________________________ max_pool1 (MaxPooling2D)     (None, 32, 80, 96)        0          _________________________________________________________________ conv_2 (Conv2D)              (None, 32, 80, 256)       614656     _________________________________________________________________ batch_normalization_2 (Batch (None, 32, 80, 256)       1024       _________________________________________________________________ max_pool2 (MaxPooling2D)     (None, 16, 40, 256)       0          _________________________________________________________________ conv_3 (Conv2D)              (None, 16, 40, 384)       885120     _________________________________________________________________ batch_normalization_3 (Batch (None, 16, 40, 384)       1536       _________________________________________________________________ max_pool_3 (MaxPooling2D)    (None, 8, 20, 384)        0          _________________________________________________________________ rwmp (MaxPooling2D)          (None, 8, 1, 384)         0          _________________________________________________________________ flatten1 (Flatten)           (None, 3072)              0          _________________________________________________________________ dense_1 (Dense)              (None, 64)                196672     _________________________________________________________________ dropout_1 (Dropout)          (None, 64)                0          _________________________________________________________________ dense_2 (Dense)              (None, 64)                4160       _________________________________________________________________ dropout_2 (Dropout)          (None, 64)                0          _________________________________________________________________ output (Dense)               (None, 7)                 455        ================================================================= Total params: 1,706,503 Trainable params: 1,705,031 Non-trainable params: 1,472 '''

Интерес представляет слой RWMP, который по сути является построчным Max Pooling. Если верить DeepPano, это нужно, чтобы сгладить эффекты от ошибок препроцессинга при нормализации ориентации тел. Конкретнее — для компенсации ошибок при повороте тел вокруг Главной оси.

Обучаем модель

  1. Читаем картинки из файлов.

  2. Перемешиваем как следует.

  3. Для кросс-валидации делим в соотношении 70:15:15 train:validation:test.

  4. Обнаруживаем, что пространства для аугментации самих тел не так много:

    1. Color augmentation неприменим, так как картинки серые;

    2. Horizontal flipping тоже, потому что его должен компенсировать RWMP;

    3. Vertical flipping — не годится, т.к. предполагает шкаф «вверх ногами»;

    4. ZCA whitening не годится, потому что у нас природа картинок синтетическая, соответственно, значения в каждом пикселе очень важны.

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

def read_data(directory):     from PIL import Image          def image_and_label(path):         def encode_pattern(string):             for i in range(len(classes)):                 if classes[i] in string:                     return i             raise ValueError('Unknown mesh category {}'.format(string))                  img = img_to_array(load_img(path, grayscale=True))         label = encode_pattern(path)              return img, label          def images_and_labels(image_paths):         images = []         labels = []                  for path in image_paths:             img, label = image_and_label(path)             images.append(img)             labels.append(label)                  labels = keras.utils.to_categorical(labels, num_classes=len(classes))         return images, labels          wildcard = directory + os.sep + '**' + os.sep + '*.png'     image_paths = glob.glob(wildcard, recursive=True)          images, labels = images_and_labels(image_paths)     return np.array(images), labels  x_train, y_train = read_data(train_path) x_val, y_val = read_data(val_path)  def unison_shuffled_copies(a, b):     assert len(a) == len(b)     p = np.random.permutation(len(a))     return a[p], b[p]  x_train, y_train = unison_shuffled_copies(x_train, y_train) x_val, y_val = unison_shuffled_copies(x_val, y_val)  train_datagen = ImageDataGenerator(rescale=1.0/255.0) val_datagen = ImageDataGenerator(rescale=1.0/255.0)  train_datagen.fit(x_train) val_datagen.fit(x_val)  train_generator = train_datagen.flow(x_train, y_train, batch_size=batch_size) val_generator = val_datagen.flow(x_val, y_val, batch_size=batch_size)

Перейдем к обучению сети:

checkpointer = callbacks.ModelCheckpoint(model_name + '.h5',                                monitor='val_categorical_accuracy',                                save_best_only=True,                                save_weights_only=False,                                mode='max',                                period=1)  reduce_lr = callbacks.ReduceLROnPlateau(monitor='val_loss',                                         factor=0.5, patience=2,                                         verbose=1, mode='auto',                                         epsilon=0.0001,                                         cooldown=0, min_lr=0)  tensorboard = callbacks.TensorBoard(log_dir='logs', histogram_freq=0, write_graph=True)   %%time history = model.fit_generator(                     train_generator,                     steps_per_epoch=train_batches_per_epoch,                     epochs=num_epochs,                     validation_data=val_generator,                     validation_steps=val_batches_per_epoch,                     callbacks=[checkpointer, reduce_lr, tensorboard],                     workers=1,                     use_multiprocessing=False,                     shuffle=True)

Результаты

Categorical accuracy для train:

Categorical accuracy для validation:

Так как categorical accuracy отличаются менее чем на 5%, заключаем, что нет overfitting.

На тестовом датасете categorical accuracy получилась 89.5%.

Classification report:

from sklearn import metrics  true_labels = np.argmax(test_true_labels, axis=1) pred_labels = np.argmax(test_pred_labels, axis=1)  print(metrics.accuracy_score(true_labels, pred_labels))  def report(true_labels, pred_labels):     print(metrics.classification_report(true_labels, pred_labels, target_names=classes))  report(true_labels, pred_labels)  ''' 0.8948948948948949              precision    recall  f1-score   support          bed       0.92      0.96      0.94       112       chair       0.96      0.99      0.97        90     dresser       0.65      0.95      0.77        80     monitor       0.93      0.98      0.96       100       table       0.94      0.68      0.79        92        sofa       0.96      0.84      0.90        96      toilet       0.98      0.84      0.91        96  avg / total       0.91      0.89      0.90       666 '''

Confusion matrix:

В целом результаты выглядят неплохо, за исключением того, что некоторые столы распознаются как комоды. Видимо, что-то с данными. Впрочем, это не отменяет Proof Of Concept.

Немного поиграем с моделью

from scipy import misc import trimesh  def what_is_this(filepath):     img = img_to_array(load_img(filepath, grayscale=True))     img = img / 255     plt.imshow(img[:, :, 0], cmap='gray')     plt.show()          img = np.expand_dims(img, axis=0)          probabilities = model.predict(img, batch_size=1, verbose=2)     return classes[np.argmax(probabilities)], probabilities      what_is_this(test_path + os.sep + 'table' + os.sep + 'table_0224.png')      # Output   # ('table', array([[1.94e-13, 1.08e-10, 5.86e-12, 5.81e-15, 1.00e+00, 1.27e-31, 5.15e-21]], dtype=float32))

Как видно, это стол, и модель уверена в этом:

Выводы

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

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

  3. Прикладная задача может быть решена сохранением полученной обученной модели в файл и использованием его на стороне C++ с помощью tensorflow C++ API. Поддерживать это у большого числа пользователей будет непросто, поэтому лучше поставить сервер-распознаватель, на котором обновлять модель по мере ее обновлений.

Что можно улучшить

  1. Можно было бы добиться конечного решения прикладной задачи. Не пишу об этом здесь, так как к machine learning это уже не имеет прямого отношения.

  2. Добавить больше категорий.

  3. Изобрести аугментацию данных. Например, на GAN или VAE. Кое-что уже получилось.

  4. Учесть контекст тел, например, материалы, размер тел, текстуру. Разумеется, это уже не будет просто sequential neural network.

  5. Можно комбинировать разные подходы. Например, сделать модель, которая работает на вокселях и комбинировать с DeepPano.

  6. Учесть внутреннюю структуру тел, например, полости.

***

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


ссылка на оригинал статьи https://habr.com/ru/company/ncloudtech/blog/702252/