Знакомые лица: алгоритмы создания «типичного» портрета


Автор: Андрей Сорокин, Senior Developer DataArt

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

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

[Из песочницы] Обнаружение лиц на видео с помощью Movidius Neural Compute Stick

Не так давно в свет вышло устройство Movidius Neural Compute Stick (NCS), представляющее собой аппаратный ускоритель для нейронных сетей с USB интерфейсом. Меня заинтересовала потенциальная возможность применения устройства в области робототехники, поэтому я приобрел его и задумал запустить какую-нибудь нейросеть. Однако большинство существующих примеров для NCS решают задачу классификации изображений, а мне хотелось попробовать кое-что другое, а именно обнаружение лиц. В этой публикации я хотел бы поделиться опытом, полученным в ходе такого эксперимента.

Весь код можно найти на GitHub.

image

Читать дальше →

[Перевод] Выравнивание инструкций кода

Насколько трудно может быть измерить производительность простой функции, вроде вот этой?

// func.cpp
void benchmark_func(int* a)
{
	for (int i = 0; i < 32; ++i)
		a[i] += 1;
}


Ну, давайте просто завернём её в какой-нибудь микробенчмарк, вызовем её много-много раз (для усреднения результатов) и посмотрим, что получится, да? Ну ладно, мы можем ещё посмотреть на сгенерированные инструкции просто чтобы убедиться, что компилятор чего-то там не «наоптимизировал». Мы можем также провести несколько разных тестов, чтобы убедиться, что именно цикл является узким местом. Ну и всё. Мы понимаем, что мы измеряем, да?

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

// func.cpp
void foo(int* a)
{
	for (int i = 0; i < 32; ++i)
		a[i] += 1;
}

void benchmark_func(int* a)
{
	for (int i = 0; i < 32; ++i)
		a[i] += 1;
}


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

[Перевод] Parallel STL. Быстрый способ ускорить C++ STL код

За пару последних десятилетий, пока вычислительные системы эволюционировали от одноядерных скалярных до многоядерных векторных архитектур, значительно выросла популярность управляемых языков, а также появились новые языки программирования. Но старый добрый C++, позволяющий писать высокопроизводительный код, остается более чем популярным. Однако, до недавнего времени стандарт языка не предоставлял каких-либо инструментов для выражения параллелизма. Новая версия стандарта (C++17 [1]) предоставляет набор параллельных алгоритмов Parallel STL, дающий возможность преобразовать существующий последовательный C++ код в параллельный, что, в свою очередь, позволяет задействовать такие аппаратные возможности, как многопоточность и векторизация. Эта статья познакомит вас с основами Parallel STL и его реализацией в Intel Parallel Studio XE 2018.


Читать дальше →

7 шагов на пути к карьере разработчика Xamarin

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

Читать дальше →

Взаимодействие C# и C++ кроссплатформенно

Вам приходилось сталкиваться с необходимостью взаимодействия кода на C# и native-C++ (или скорее С)? Причины могли быть разными: библиотека уже есть, на С/С++ написать проще, разработка частей приложения ведётся разными командами, _______________ (нужное вписать).

Известно, что языки базируются на совершенно разных наборах аксиом.

В С# (CLR, если точнее) вы имеете дело с типами фиксированных размеров (за редкими оговорками), код может быть скомпилирован JIT-компилятором под любую из поддерживаемых целевых платформ (если явно не оговорено иное).

В мире C++ всё совсем иначе: одни и те же типы могут иметь разные размеры при компиляции на разные платформы (привет, size_t), код генерируется по-разному для разных платформ, операционных систем и прочих прелестей.

Под катом будем пробовать их подружить с учётом указанных особенностей.
Читать дальше →

Юнит-тесты. Быстрый старт – эффективный результат (с примерами на C++)



Вместо вступления


Всем привет!
Сегодня хотелось бы поговорить о том, как просто и с удовольствием писать тестируемый код. Дело в том, что в нашей компании мы постоянно контролируем и очень ценим качество наших продуктов. Еще бы – ведь с ними ежедневно работают миллионы человек, и для нас просто недопустимо подвести наших пользователей. Только представьте, наступил срок сдачи отчетности, и вы тщательно и с удовольствием, используя заботливо разработанный нами пользовательский интерфейс СБИС, подготовили документы, еще раз перепроверили каждую циферку и вновь убедились, что встречи с вежливыми людьми из налоговой в ближайшее время не будет. И вот, легким нажатием мыши кликаете на заветную кнопку «Отправить» и тут БАХ! приложение вылетает, документы уничтожаются, жарким пламенем пылает монитор, и кажется, люди в погонах уже настойчиво стучат в двери, требуя сдачи отчетности. Вот как-то так все может и получиться:
Читать дальше →

Конференция C++ Russia 2018

Всем привет!

Я надеюсь, вы успели соскучиться по плюсовым докладам и общению с коллегами, потому что очередная конференция C++ Russia уже не за горами. В этом году конференция снова пройдёт в городе трёх революций.
Конференция состоится 19-21 апреля в Санкт-Петербурге. 19 апреля — день мастер-классов, 20-21 — основная программа. Jon Kalb открывает первый день конференции. Темы докладов конференции: память, краш-репорты, асинхронность, software transactional memory, reflective metaprogramming, ranges, акторы, Herb Sutter.

Подробности под катом.
Читать дальше →

[Перевод] Learnopengl. Урок 4.5 — Кадровый буфер

OGL3

Кадровый буфер

На текущий момент мы уже успели воспользоваться несколькими типами экранных буферов: буфером цвета, в котором хранятся значения цвета фрагментов; буфером глубины, хранящим информацию о глубине фрагментов; буфером трафарета, позволяющим отбросить часть фрагментов согласно определенному условию. Комбинация этих трех буферов зовется кадровым буфером (фреймбуфером) и хранится в определенной области памяти. OpenGL достаточно гибка, чтобы позволить нам самим создавать собственные кадровые буферы, посредством задания собственных буферов цвета и, опционально, буферов глубины и трафарета.
В передыдущих сериях
Часть 1. Начало
  1. OpenGL
  2. Создание окна
  3. Hello Window
  4. Hello Triangle
  5. Shaders
  6. Текстуры
  7. Трансформации
  8. Системы координат
  9. Камера
Часть 2. Базовое освещение
  1. ...Далее...

Читаем данные из открытой части файлов КОМПАС-3D для интеграции с Pilot-ICE

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

image
Добавление документа в систему документооборота (Карточка документа)

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


Последние посты