Время прочтения: 4 мин.
В работе аудитора часто возникают вопросы, связанные с распознаванием изображений в ходе проведения аудиторских мероприятий. Например, несмотря на улучшение ситуации в мире сотрудники организаций должны продолжать соблюдать масочный режим и обязаны в помещениях находиться в масках. Как проконтролировать, все ли исполняют это требование? Выход есть, нужно получить фото сотрудников, находящихся в помещениях организаций с помощью камер системы видеонаблюдения за определенный период времени. Затем отобрать фотографии лиц, которые находились в масках и фотографии лиц, которые были без масок. Обучить модель машинного обучения, чтобы она с большей долей вероятности определяла (например, в более 95% случаях) человека в маске и без маски. И, в последующем, с использованием обученной модели контролировать процесс соблюдения сотрудниками мер санитарного режима и принимать управленческие решения при ухудшении ситуации, что благоприятно повлияет на санитарно-эпидемиологическую обстановку в организации.
При автоматизированной загрузке фотографий сотрудников в модель машинного обучения, модель будет автоматически давать результат: человек находился в маске или без неё. Возникает вопрос, как разработать модель машинного обучения, чтобы она помогала в работе и снижала трудоемкость рутинных процессов. Возможно нанять специалистов по DS, AI, но можно использовать и готовые решения. Изучая работу моделей машинного обучения, я столкнулся с сервисом «Teachable Machine» от компании Google (ссылка)
Данный сервис позволяет по фотографиям обучить модель машинного обучения — кто на фотографии (например, кошка или собака?), чтобы в последующем модель могла точно распознать изображение на новом фото.
Взяв для примера 20 фото людей без маски и 20 фото людей в масках я их загрузил в сервис «Teachable Machine». И провел обучение модели (рисунок 1).

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


Также сервис «Teachable Machine» выдал фрагмент кода модели на языке Javascript (рисунок 4). В дальнейшем можно экспортировать полученную модель как модель TensorFlow.js и бесплатно разместить ее на «Teachable Machine», чтобы можно было вызвать её на любом веб-сайте или в приложении. Также можно преобразовать её в TensorFlow и TensorFlow Lite и загрузить для локального использования. Узнать подробно о том, как использовать данную модель в своем проекте можно изучив инструкцию на сайте «github» (ссылка)
<div>Teachable Machine Image Model</div>
<button type="button" onclick="init()">Start</button>
<div id="webcam-container"></div>
<div id="label-container"></div>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.3.1/dist/tf.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@teachablemachine/image@0.8/dist/teachablemachine-image.min.js"></script>
<script type="text/javascript">
// More API functions here:
// https://github.com/googlecreativelab/teachablemachine-community/tree/master/libraries/image
// the link to your model provided by Teachable Machine export panel
const URL = "./my_model/";
let model, webcam, labelContainer, maxPredictions;
// Load the image model and setup the webcam
async function init() {
const modelURL = URL + "model.json";
const metadataURL = URL + "metadata.json";
// load the model and metadata
// Refer to tmImage.loadFromFiles() in the API to support files from a file picker
// or files from your local hard drive
// Note: the pose library adds "tmImage" object to your window (window.tmImage)
model = await tmImage.load(modelURL, metadataURL);
maxPredictions = model.getTotalClasses();
// Convenience function to setup a webcam
const flip = true; // whether to flip the webcam
webcam = new tmImage.Webcam(200, 200, flip); // width, height, flip
await webcam.setup(); // request access to the webcam
await webcam.play();
window.requestAnimationFrame(loop);
// append elements to the DOM
document.getElementById("webcam-container").appendChild(webcam.canvas);
labelContainer = document.getElementById("label-container");
for (let i = 0; i < maxPredictions; i++) { // and class labels
labelContainer.appendChild(document.createElement("div"));
}
}
async function loop() {
webcam.update(); // update the webcam frame
await predict();
window.requestAnimationFrame(loop);
}
// run the webcam image through the image model
async function predict() {
// predict can take in an image, video or canvas html element
const prediction = await model.predict(webcam.canvas);
for (let i = 0; i < maxPredictions; i++) {
const classPrediction =
prediction[i].className + ": " + prediction[i].probability.toFixed(2);
labelContainer.childNodes[i].innerHTML = classPrediction;
}
}
</script>
При подготовке статьи использованы материалы сайта (ссылка).