Готовишься к Double Eleven, чей набор экспрессий летит в небе

машинное обучение Python Weex
Готовишься к Double Eleven, чей набор экспрессий летит в небе

предисловие

Сразу после «Double Eleven», в этот период, когда все люди едят грязь, Сяньюй очень близко запустил деятельность пакетов выражения со вкусом земли.Вы можете настроить набор выражений, чтобы жаловаться и делиться чувствами каждого о еде земли.Эта статья познакомит Как быстро создать такой проект активности на основе распознавания лиц с помощью Python и weex.

Ключевые слова: weex, Python, распознавание лиц

1. Фронтальная конструкция

Страница интерфейса в основном состоит из двух частей: фотографирования и создания выражений.

1.1 Фотосъемка

Модуль камеры Windvane используется для съемки изображений. В настоящее время он может поддерживать только среду weex. В настоящее время среда h5 может направлять пользователей только к Xianyu или Hand Tao для создания приземленных выражений с помощью подсказок и тяг. В последней версии 8.1.0 Shoutao могут быть проблемы со съемкой и загрузкой картинок напрямую с WVCamera.takePhoto, поэтому нужно вызывать картинки и загружать картинки отдельно, а для загрузки картинок использовать интерфейс WVCamera.confirmUploadPhoto.

  1. var params = {

  2.    type: '0',

  3. };

  4. window.WindVane.call('WVCamera', 'takePhoto', params, function(e) {

  5.    var uploadParams = {

  6.        // 需要上传的照片的路径

  7.        path: e.localPath,

  8.        // 上传方式

  9.        v: '2.0',

  10.        // 业务代码

  11.        bizCode: 'mtopupload'

  12.    };

  13.    setTimeout(function() {

  14.        window.WindVane.call('WVCamera', 'confirmUploadPhoto', uploadParams, function(e) {

  15.            alert('upload success: ' + JSON.stringify(e));

  16.        }, function(e) {

  17.            alert('upload failure: ' + JSON.stringify(e));

  18.        });

  19.    }, 20);

  20. }, function(e) {

  21.    alert('takePhoto failure: ' + JSON.stringify(e));

  22. });

скопировать код

1.2 Создание выражений

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

2. Строительство сервера

Инженерный сервер построен на чистом Python, который может удовлетворить потребности быстрого создания и развертывания онлайн-активностей.Он использует Http-сервер, созданный двумя библиотеками: SocketServer и BaseHTTPServer:

socketserver — это высокоуровневый модуль стандартной библиотеки для реализации сетевых клиентов и серверов. В модуле реализованы некоторые доступные классы.Модуль socketserver включает в себя множество классов, которые могут упростить реализацию серверов сокетов домена TCP, UDP и UNIX;

Модуль BaseHTTPServer создает базовый класс обработки HTTP-запросов BaseHTTPRequestHandler, который наследуется от класса StreamRequestHandler в модуле SocketServer;

Пользоваться очень удобно, а вызов выглядит следующим образом:

  1. import BaseHTTPServer as webservice

  2. from SocketServer import ThreadingMixIn

  3. from BaseHTTPServer import HTTPServer,BaseHTTPRequestHandler

  4. if __name__ == '__main__':

  5.    serverAddress = ('', PORT)

  6.    server = ThreadingHttpServer(serverAddress, RequestHandler)

  7.    server.serve_forever()

скопировать код

Когда есть HTTP-запрос, будет запущен обратный вызов do_GET RequestHandler, и бизнес-код внутри будет выполнен.

  1. class RequestHandler(webservice.BaseHTTPRequestHandler):

  2.    def do_GET(self):

скопировать код

После реализации базового вызова следующая работа — использовать ThreadingHttpServer для реализации многопоточного веб-сервера, выполнения проверки подписи параметров, использования Nginx для раздачи и т. д. Не буду вдаваться в подробности.

3. Выбор алгоритма

Процесс интеграции лица в пакет экспрессии можно разделить на четыре этапа:

  • Распознавание лиц

  • выравнивание лица

  • Извлекайте черты лица и синтезируйте их в наборы выражений

  • Скорректировать тон лица

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

Это просто в использовании:

  1. # 初始化dlib

  2. detector = dlib.get_frontal_face_detector()

  3. predictor = dlib.shape_predictor(PREDICTOR_PATH)

  4. # 获取脸部特征点

  5. def get_landmarks(im):

  6.    rects = detector(im, 1)

  7.    if len(rects) > 1:

  8.        raise TooManyFaces

  9.    if len(rects) == 0:

  10.        raise NoFaces

  11.    return numpy.matrix([[p.x, p.y] for p in predictor(im, rects[0]).parts()])

скопировать код

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

  1. def warp_im(im, M, dshape):

  2.    output_im = numpy.zeros(dshape, dtype=im.dtype)

  3.    cv2.warpAffine(im,

  4.                   M[:2],

  5.                   (dshape[1], dshape[0]),

  6.                   dst=output_im,

  7.                   borderMode=cv2.BORDER_TRANSPARENT,

  8.                   flags=cv2.WARP_INVERSE_MAP)

  9.    return output_im

скопировать код

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

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

  1. # 传入参数越大对比度越高

  2. def gamma_trans(img,gamma):

  3.    gamma_table = [numpy.power(x/255.0,gamma)*255.0 for x in range(256)]

  4.    gamma_table = numpy.round(numpy.array(gamma_table)).astype(numpy.uint8)

  5.    return cv2.LUT(img,gamma_table)

скопировать код

4. Оптимизация алгоритма

Мы сделали простую оптимизацию алгоритма с двух сторон:

Один из них - использоватьМногопроцессная оптимизация, на этом шаге используется реализация библиотеки loky:

  1. import loky

  2. from loky import get_reusable_executor

скопировать код

Исполнительная часть:

  1.    # work_thread为机器能使用的最大进程数

  2.    executor = get_reusable_executor(max_workers=work_thread, timeout=60)

  3.    params = []

  4.    # 传入需要多进程执行的方法名和参数,多个参数需要合成一个传入

  5.    result = executor.map(do_func, params)

  6.    try:

  7.        while 1:

  8.            re = result.next()

скопировать код

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

Еще один момент, на который стоит обратить внимание, это то, что если ваша функция реализована на Python2, нельзя использовать другую более популярную и удобную многопроцессорную библиотеку Process, которая будет конфликтовать с dlib.

два этоЗона обнаружения сжатия, вы можете сделать копию исходного изображения, а затем сжать копию до 1/4, затем передать ее в dlib для идентификации, а затем умножить идентифицированный массив объектов ориентиров на 4, чтобы получить исходное положение объекта, а затем обработать оригинал изображение и восстановление Последний набор точек функции. Помимо сжатия, количество вычислений dlib также можно уменьшить за счет кадрирования, перехвата области ROI, вырезания области лица пакета эмодзи и передачи его в dlib при распознавании, фокусировки на среднем положении картинки, или может сотрудничать с удалением фона OpenCV, чтобы уменьшить область распознавания.

Суммировать

Выше приведен весь процесс реализации пакета выражений.Есть еще много моментов, которые можно оптимизировать с точки зрения производительности и эффекта.Вы можете попробовать «Спасите Тузу» в Xianyu или Hand Tao, чтобы настроить пакет выражений и внести предложения. и отзывы~

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