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

Это написано в гибридном формате. Это учебное пособие, но с сюжетной линией. Вас предупредили.

Также предпочтительными операционными системами являются mac или ubuntu.

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

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

Мистер Йоги издает громкую отрыжку прямо вам в лицо. Он даже не пытается удержать его или перенаправить в каком-либо другом направлении. Стол слишком мал, чувствуешь запах его выхлопа. Пахнет Качори. Вместо того чтобы чувствовать отвращение, вы начинаете тосковать по тарелке горячего качори с дымящимся ало-ки сабзи. Теперь тебе противно себя. По крайней мере, парень позавтракал. С другой стороны, вам приходилось обходиться чашкой чая и двумя печеньями в маленькой хижине по дороге в офис.

«Итак, вы думали о проекте?» - спросил Йоги. Йоги был старшим менеджером службы безопасности в этой компании наблюдения. Его компания, очевидно, модернизировала себя и добавляла множество модулей искусственного интеллекта, чтобы сократить расходы на персонал и привлечь клиентов.

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

«О, правда, вы уверены, что сможете создать систему, которая определяет, носит ли на строителе каску или нет?» - с сомнением произнес Йоги. «По потоковой передаче изображений с камер видеонаблюдения». Добавил он.

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

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

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

Йоги встает со стула: «Я пришлю изображения сегодня и надеюсь, что к концу недели вы сможете дать мне демо»

Сегодня понедельник, если вы получите данные, и они в порядке, вы можете приступить к работе во вторник. «На следующей неделе, в следующий понедельник», - отвечаете вы. Йогин поджимает губы, вы же знаете, что он несчастен. "Первым делом. В понедельник утром », - отвечает Йоги. Он не ждет вашего подтверждения, просто поворачивается и уходит.

Позже в тот же день он отправляет изображения «как обсуждалось».

Данные

Рассказ разработчиков.

Что ж, данные, которые прислал Йоги, никуда не годятся. Теперь вам нужно найти другие источники данных. К счастью, поиск в Google показывает это.



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

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

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

Каждая строка содержит следующее

  1. Имя файла изображения
  2. Множественные квинтеты (наборы по 5) чисел. Каждый квинтет состоит из 4 чисел, которые определяют положение лица, за которым следует 1 или 0, определяющие, есть ли у лица каска на голове.

Например, вы возьмете одну строчку

001446_jpg.rf.00a11ab7cffb0a8fec57e98b2c4663d5.jpg 216,318,265,373,1 5,319,52,376,1 100,325,146,370,1 306,360,347,409,1 133,321,156,369,1 169,174,216,218,0 341,352,368,7013,380,0341,352,360,360,380,380

Имя файла - 001446_jpg.rf.00a11ab7cffb0a8fec57e98b2c4663d5.jpg.

В файле 9 лиц. Квинтет первого лица - (216 318 265 373,1). Это означает, что лицо начинается от значения x 318, значения y 216 до значения x 373 и значения y 265. Как вы узнали об этом? Чистый хит и проба. Должен быть способ получше, но у вас нет времени читать README. Последнее значение в квинтете - 1, что означает, что на лице есть каска. Вы запускаете jupyter notebook, чтобы получить оптимальное соотношение цены и качества.

И это то, что вы видите на выходе

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

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

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

Это изображения, с которыми вы собираетесь работать. Вы проверяете количество изображений с каской и изображений без. Вы обнаружите, что в тренировочной папке количество голов со шлемом составляет 15358, а количество голов без шлема - 4875. Ухх, несбалансированность данных. Могут быть способы справиться с этим. Но опять же, время имеет значение. Итак, вы решили, что будете использовать только 4875 изображений с касками и все изображения без них, чтобы получилось равномерно.

Изображения обрезаются, фокусируясь только на лице вместе с головой. Это немного упрощает вашу работу. Вы решаете, что собираетесь решить эту проблему в два этапа. Для любого изображения вы сначала собираетесь использовать существующую предварительно обученную модель для обнаружения лиц. К обнаруженным таким образом лицам вы собираетесь применить новую модель обнаружения каски. Итак, ваша задача сейчас - обучить двоичный классификатор, используя данные из папок no_helmet, yes_helmet.

Обучение модели обнаружения каски

Если данные есть, может ли модель сильно отстать? Вы помните, что вам нужно сходить в туалет. Биоперерывы, как они будут называться во время встреч в офисе. Ах, офис, хорошие времена ... вы начинаете вспоминать старые добрые времена, пока не придете в чувство с помощью письма с просьбой обновить статус.

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

Сначала вы пытаетесь переучить начальную модель resnetv2. Вы обнаружите, что он дает только 60% точности в тесте. Затем вы пробуете inceptionv3 - он лучше, дает 79%. Чуть меньше приличных 80. Вы знаете, как это будет выглядеть на слайдах. Вы решаете дать ему еще один шанс. Вы выбираете VGG16.

Код для VGG16 прост, но вам нужно написать функцию для загрузки данных из этих двух папок (yes_helmet и no_helmet).

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

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

Вы не можете поверить своим глазам. 92% точность! Это будет действительно хорошо смотреться в колоде. Мастер Поттер будет доволен. Что, вы не домовой эльф, порабощенный этим делом!

Привязка модели обнаружения каски к модели обнаружения лиц

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

Прежде всего, вам нужна работающая модель распознавания лиц. Вам не нужно много оглядываться, потому что вы уже использовали его раньше. Всех приветствую агейтгей. Вы заглядываете в его репозиторий на github и знаете, что делать. Это репо посвящено распознаванию лиц. Но сначала он распознает лица. Так что вам просто нужно вычерпать эту часть распознавания лиц. Обратите внимание, что для запуска части обнаружения лиц из репозитория ageitgey в вашей системе должна быть установлена ​​библиотека dlib. К счастью, сервер, на котором вы собираетесь разместить код, и ваш ноутбук прошли через испытание установкой библиотек для поддержки библиотеки face_recognition ageitgey. Однако эта ссылка содержит подробности на тот случай, если вам когда-нибудь понадобится выполнить новую установку. Вы помните, что это работает только в Mac или Ubuntu.

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

Вы думаете, что это сработает хорошо, но вы ужасно опасаетесь, что что-то пойдет не так, как надо.

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

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

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

Значения head_taller_parameter и chin_taller_parameter равны 0,5 и 0,1 соответственно. Обычно вы увеличиваете изображение лица вверху на 50% и внизу на 10% от фактической высоты изображения лица. Таким образом, шлем будет в обрезанном виде, и теперь вы надеетесь, что ваша модель будет работать. Вы включаете этот «хакерский прием» в свой код.

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

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

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

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

Эпилог

Создание модели в jupyter notebook - это одно, но разместить ее на платформе видеонаблюдения и аналитики в реальном времени, чтобы она работала без разумных задержек, - это совсем другое дело. И это было бы невозможно без ребят из hipla, Kazi, Sudip, Shubhajit, Anubhab и других.

Чтобы узнать больше о наших возможностях, посмотрите это видео на YouTube или посетите https://contatrack.ai/

До скорого.