Распознавание лиц + бот хороших лиц = лучшие лица 🏆

@good_faces_bot — это, пожалуй, лучший аккаунт в Twitter. Это не требует объяснений: просто много хороших лиц, публикуемых регулярно. Я хотел просеять этот бесконечный поток, чтобы найти лучшие лица, и вот результат: bryce.io/best-faces.

Получить лица 🐦

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

После этого он сортирует их и фильтрует твиты, превышающие определенный порог лайков (1000). Затем осталось загрузить изображение, связанное с каждым твитом, с небольшим шагом, чтобы избежать ограничения скорости, и все готово к анализу!

Введите: rustface 🔬

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

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

К сожалению, в настоящее время он распознает лицо только примерно в 1/3 всех изображений (а некоторые «лица» на самом деле не являются лицами, как, например, первое на этой странице 😂). Однако с помощью некоторых настроек это можно улучшить.

Собираем все вместе 🪢

Теперь, когда часть Rust завершена, осталось только как-то отобразить лица. Я использовал Svelte для создания простого сайта, поскольку мне нравится использовать его для небольших проектов вроде этого.

Самой сложной частью здесь было то, что, хотя шаг Rust создал кучу изображений, нет простого способа связать их с каждым твитом. Я использовал fs.exists, чтобы перебрать выходной каталог и создать кучу импортов и экспортов. Это халтурно, но в итоге работает хорошо! Но будьте осторожны 👻 Вы не должны генерировать сырой javascript таким образом, если нет других вариантов, вот фрагмент:

const hasOne = await fsExists(generatePath(tweet));

if (hasOne) {
    facePaths.push(generatePath(tweet));
}

facePaths.forEach(facePath => {
  output += `import ${faceFileName} from "../${facePath}";n`;
});

output += `export const facesFor${tweet.id} = [${faceFileNames.join(',')}];n`;

await fs.appendFile(outputFile, output);
Войти в полноэкранный режим Выйти из полноэкранного режима

Как только это было сделано, я смог перебрать список твитов из первого шага и отобразить их в Svelte, напрямую обращаясь к импорту facesForX:

{#each tweets as tweet}
    {#if faces[`facesFor${tweet.id}`].length > 0}
        {#each faces[`facesFor${tweet.id}`] as face, i}
            <Face face={face} />
        {/each}
    {/if}
{/each}
Войти в полноэкранный режим Выход из полноэкранного режима

Обратите внимание, что проверяется, если length > 0: поскольку он не в состоянии обнаружить лицо на каждом изображении, некоторые, к сожалению, остаются за кадром. Это печально, так как многие действительно хорошие лица — это те, которые выглядят странно.

Затем я добавил простое состояние наведения курсора, чтобы показать исходное изображение, на котором было обнаружено лицо:

<script>
    export let tweet;
    export let face;

    export let show = () => showOriginal = true;
    export let hide = () => showOriginal = false;

    let showOriginal = false;
</script>

<a href={tweet.tweet.text}>
    <img src={showOriginal ? tweet.media.url : face} on:mouseenter={show} on:mouseleave={hide} />
</a>
Войти в полноэкранный режим Выход из полноэкранного режима

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


И вуаля! Последний удар заключается в том, что поскольку все это просто скрипты, они могут запускаться последовательно в GitHub Action! Хотя часть распознавания лиц занимает некоторое время (~20 м), более простые скрипты могут получать/генерировать необходимые данные и выполняться полностью в CI. Есть некоторые оптимизации, связанные с загрузкой/выгрузкой артефактов, но пока я доволен, что все работает удаленно.

Посмотрите код здесь:

brycedorn / best-faces

Использование rustface для определения лучших лиц бота good_faces_bot

best-faces

@good_faces_bot — это, вероятно, лучший аккаунт в Twitter. Это не требует объяснений: просто много хороших лиц, публикуемых регулярно. Я хотел просеять этот бесконечный поток, чтобы найти лучшие лица, и вот результат!

Требования

  • node
  • rust
  • API-ключ Twitter, получить его можно здесь

Запуск локально

Сначала создайте файл .env с вашим BEARER_TOKEN для доступа к API Twitter и USER_ID для учетной записи, для которой вы хотите получать твиты.

Затем в следующем порядке:

npm install
npm run fetch:tweets
npm run sort:tweets
npm run fetch:images

И для ржавчины:

cargo install
cargo run

И наконец, для сайта:

npm run generate:imports
npm run dev
Посмотреть на GitHub

Оцените статью
Procodings.ru
Добавить комментарий