Туториал: добавление тегов фотографиям с генератором Tagbox для удобства поиска на MacOS

добавление тегов на фотографии

Перевод статьи Building a private, local photo search app using machine learning, автор — Aaron Edell, ссылка на оригинал — в подвале статьи.

Это оно. Это лучшая проклятая вещь, которую я когда-либо делал. Обычно я не люблю хвастаться, но я так горжусь собой за это, что чувствую, что должен поделиться этим с другими. Они говорили, что это невозможно (на самом деле никто этого не говорил), они говорили, что это невозможно сделать (многие сказали, что это можно сделать), но я сделал это, и это работает ОТЛИЧНО!

В библиотеке моей жены есть еще 40 000…

У меня были проблемы с тех пор, как у меня были дети. Ну… много проблем, но я сосредоточусь на технической. Проблема в том, что у меня 80 000 фотографий. Это не преувеличение. После того, как родился наш первый человек, количество фотографий
у нас с женой за два года с 3000 быстро выросло до 80000.

Очень быстро для меня стало очевидным, что фотографировать больше почти не было смысла, потому что потом было бы невозможно найти их снова. В то время все мои фотографии были у меня в Dropbox. Dropbox не имел каких-либо возможностей для управления фотографиями (на момент написания этой статьи их еще не было), а это было то, что мне было крайне необходимо. Из своей работы в области машинного обучения я знал, что из фотографии можно многое узнать, например, кто на ней, где она была сделана и что изображено у нее на сцене (например, будущий суперзлодей терроризирует родителей).

Так что я сделал единственно верную вещь. Перенес все 80 000 фотографий в Apple Photos, чтобы можно было запустить ML, и я снова смог найти свои фотографии. Это сработало блестяще — конец. До свидания!

Ложь

Ложь. Это был не конец. Теперь я застрял в огороженном саду Apple. Я действительно люблю сад, там много красивых цветов, таких как iMaccius RhoddeNoCDrom и Ipaddus Expensivus. Но его любят не все, и пост моего хорошего друга Джарона Филлипса напомнил мне, что всегда есть другой путь (кроме варианта с Google, у которого есть серьезные проблемы с конфиденциальностью).

Запустить это локально!

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

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

Мы будем использовать Tagbox, который был предварительно обучен помечать фотографии такими тегами как океан, закат, пляж, туман, собака, торт ко дню рождения, гибель и т.д. Отличительной особенностью Tagbox является то, что он работает локально на вашем компьютере. Ни один облачный сервис не крадет ваши секреты.

Мы собираемся поместить эти теги ВНУТРЬ ЧЕРТОВОГО ФАЙЛА. Представляете?! Зачем мы это делаем? *барабанная дробь* Чтобы вы смогли искать фотки по тегам! Разве это не удивительно?

Эти теги будут помещены в поле «Комментарии», которое будет индексировать Spotlight, чтобы вы могли позже искать эти файлы.

Процесс

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

Затем я скачал, установил и запустил Tagbox, что заняло несколько минут, но это потому, что это продукт моей компании, и я его хорошо знаю. Если вы разработчик или просто технически подкованы, это тоже не займет много времени.

Затем я написал скрипт Go, который выполняет проход по каталогу, отправляет каждое изображение в Tagbox, получает теги и помещает их в поле комментариев в файле.

package main

import (
	"flag"
	"fmt"
	"log"
	"os"
	"os/exec"
	"path/filepath"
	"strings"

	"github.com/machinebox/sdk-go/tagbox"
)

func main() {
	var (
		dir        = flag.String("dir", "./testdata", "source directory")
		tagboxAddr = flag.String("tagbox", "http://localhost:8080", "tagbox address")
		images     = flag.String("images", ".jpg", "image files extension")
	)
	flag.Parse()

	tagboxClient := tagbox.New(*tagboxAddr)

	filepath.Walk(*dir, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			log.Fatal(err)
		}
		if !strings.HasSuffix(info.Name(), *images) {
			return nil
		}
		parts := strings.Split(path, string(filepath.Separator))
		if len(parts) < 2 {
			return nil
		}

		tags, err := tag(tagboxClient, path)

		if err != nil {
			log.Println("[ERROR]: Tagging", err)
			return nil
		}
		s := []string{}
		for _, tag := range tags {
			s = append(s, tag)
		}
		comment := strings.Join(s, ",")
		updateFile(comment, path)
		return nil
	})
}

func updateFile(comment, path string) {
	onrun := "on run {f, c}"
	command := fmt.Sprintf(`tell app "Finder" to set comment of (POSIX file f as alias) to c`)
	//log.Println("/usr/bin/osascript", "-e", onrun, "-e", command)
	cmd := exec.Command("/usr/bin/osascript", "-e", onrun, "-e", command, "-e", "end", path, comment)
	cmd.Stderr = os.Stderr
	cmd.Stdout = os.Stdout
	cmd.Stdin = os.Stdin

	err := cmd.Run()
	if err != nil {
		log.Println(err)
	}
}

func tag(tagboxClient *tagbox.Client, path string) ([]string, error) {
	tags := []string{}
	r, err := os.Open(path)
	if err != nil {
		return tags, err
	}
	defer r.Close()
	resp, err := tagboxClient.Check(r)
	if err != nil {
		return tags, err
	}
	for _, tag := range resp.Tags {
		tags = append(tags, tag.Tag)
	}
	log.Println(tags)
	return tags, nil
}

Затем я запустил сценарий и вуаля — ПОБЕДА.

Сгенерированные теги к фотографии

Теперь я могу искать любую фотографию на моем Mac по ее содержимому. Не нужно отправлять мои личные фотографии в облако, или в Google, или в… другие чудесные места. Это работает локально, это работает быстро и это работает ОТЛИЧНО.

Результат поиска фотографий по тегу

Это только начало — поскольку вы замечательный разработчик, вы можете создать реальное приложение с другими функциями, или, возможно, исследовать внедрение тегов в других местах, таких как данные EXIF ​​или отдельный вспомогательный файл xml. Я здесь, чтобы дать вам идеи, а вы здесь, чтобы делать с ними удивительные вещи, потому что, если честно, я ужасный разработчик, в отличие от вас.

style transfer tutorial tensorflow

Туториал: перенос стиля изображений с TensorFlow

Перенос стиля (style transfer)  — одно из наиболее креативных приложений сверточных нейронных сетей. Взяв контент с одного изображения и стиль от второго, нейронная сеть объединяет их в одно художественное произведение. Перевод статьи Introduction to Neural Style Transfer with TensorFlow, автор — Marco Peixeiro, ссылка на оригинал…
big data parellel mapreduce

Туториал: параллельные вычисления больших данных с MapReduce

Метод MapReduce представляет собой технику, которая используется для обработки огромного количества данных (до нескольких петабайт). Существует много реализаций MapReduce, в том числе известный Apache Hadoop. Здесь я не буду говорить о реализациях MapReduce. Я попытаюсь представить концепцию как можно более интуитивно понятным способом, приведу реальные…
gan python keras tutorial

Туториал: создание простой GAN на Python с библиотекой Keras

В этом туториале я расскажу о генеративно-состязательных нейронных сетях (GAN) не прибегая к математическим деталям модели. Далее будет показано, как написать собственную простую GAN на Python с Keras, которая сможет генерировать знаки. Перед вам перевод статьи Demystifying Generative Adversarial Nets (GANs), опубликованной на Datacamp,…
капсульная нейронная сеть введение

Капсульная нейронная сеть или CapsNet: введение

Сверточные сети сделали потрясающую работу, но завязли в проблемах. Настало время начать думать о новых решениях или улучшениях. Эта статья — введение в капсульные нейронные сети. После прочтения вы поймете, как работают CapsNet и в чем их приципиальное отличие. Перед вами перевод статьи Understanding Capsule Networks…

Нейронная сеть на JavaScript в 30 строк кода

В этой статье будет показано, как создать и обучить нейронную сеть на JavaScript, используя Synaptic.js. Этот пакет позволяет реализовывать глубокое обучение в Node.js и в браузере. Будет создана простейшая возможная нейронная сеть — та, которой удается выполнить XOR операцию. Перевод статьи «How to create…
pytorch bigraph

Сверточная нейронная сеть на PyTorch: пошаговое руководство

В предыдущем вводном туториале по нейронным сетям была создана трехслойная архитектура для классификации рукописных символов датасета MNIST. В конце туториала была показана точность приблизительно 86%. Для простого датасета, как MNIST, это плохое качество. Дальнейшая оптимизация смогла улучшить результат плотно соединенной сети до 97-98% точности.…
azure ml туториал что это

Azure ML туториал: создание простой модели машинного обучения

Перед вами пошаговое руководство по созданию модели машинного обучения с использованием Microsoft Azure ML, перевод статьи «Tutorial – Build a simple Machine Learning Model using AzureML«. Ссылка на оригинал — в подвале статьи. Насколько тяжело построить модель машинного обучения на языках программирования R или Python? Для…
pytorch туториал

Туториал по PyTorch: от установки до готовой нейронной сети

Если вы уже пробовали создавать собственные глубокие нейронные сети с помощью TensorFlow и Keras, то, вероятно, знакомы с чувством разочарования при отлаживании этих библиотек. Хотя они имеют API на Python, всё еще трудно выяснить, что именно пошло не так при ошибке. Они также плохо…
keras нейронаня сеть на python

Туториал: создание нейросети для анализа настроений в комментариях c Keras

Keras — популярная библиотека глубокого обучения, которая внесла большой вклад в коммерциализацию глубокого обучения. Библиотека Keras проста в использовании и позволяет создавать нейронные сети с помощью лишь нескольких строк кода Python. Из статьи вы узнаете, как с помощью Keras создать нейронную сеть, предсказывающую оценку…
Глубокое обучение с Tensorflow

TensorFlow туториал. Часть 4: глубокое обучение

Теперь, когда вы изучили и подготовили свои данные, пришло время создать архитектуру нейронной сети с помощью пакета TensorFlow! Предыдущие статьи: TensorFlow туториал. Часть 1: тензоры и векторы TensorFlow туториал. Часть 2: установка и начальная настройка TensorFlow туториал. Часть 3: работа с данными Моделирование нейронной…
tensorflow анализ и работа с данными

TensorFlow туториал. Часть 3: работа с данными

Пора переходить к работе с реальными данными! Мы будем работать с дорожными знаками Бельгии. Дорожный трафик — понятная тема, но не помешает уточнить, какие данные включены в датасет, перед тем как приступить к программированию. Перед прочтением статьи рекомендуем изучить: TensorFlow туториал. Часть 1: тензоры…
установка Tensorflow

TensorFlow туториал. Часть 2: установка и начальная настройка

Теперь, когда вы получше узнали TensorFlow, пора приступить к работе с ним и установить библиотеку. Важно знать, что TensorFlow предоставляет API для Python, C ++, Haskell, Java, Go, Rust. Также существует сторонний пакет для R. Читайте также Часть 1: тензоры и векторы После прочтения этого туториала…
Turing SDK

Архитектура Turing от Nvidia: что она дает и как получить максимум производительности

Архитектура Turing – одно из главных достижений в компьютерной графике за 20 лет, по заявлению самой Nvidia. Turing SDK теперь доступен для разработчиков. Дизайнеры и художники могут создавать контент с улучшенной графикой, фотореалистичным рендерингом, использовать AI для обработки изображений и видео в режиме реального времени…
Tensorflow tutorial

TensorFlow туториал. Часть 1: тензоры и векторы

TensorFlow — это ML-framework от Google, который предназначен для проектирования, создания и изучения моделей глубокого обучения. Глубокое обучение — это область машинного обучения, алгоритмы в которой были вдохновлены структурой и работой мозга. Вы можете использовать TensorFlow, чтобы производить численные вычисления. Само по себе это…
tensorrt tutorial

Туториал Nvidia для разработчиков: оптимизация RNN с помощью TensorRT

Видео демонстрирует, как настроить простую рекуррентную нейронную сеть (RNN) на основе языковой модели на уровне символов. Хотя этот образец построен с использованием C ++, вы можете реализовать его на Python с помощью TensorRT Python API. При помощи NVIDIA TensorRT вы можете быстро оптимизировать и…
tensorflow hub библиотека

Введение в TensorFlow Hub: библиотеку модулей машинного обучения для TensorFlow

Репозиторий с общим кодом — одна из фундаментальных идей в разработке программного обеспечения. Библиотеки делают программистов гораздо более эффективными. В некотором смысле они даже меняют сам процесс решения проблем программирования. Как выглядит идеальная библиотека с точки зрения разработчика алгоритмов машинного обучения? Мы хотим делиться предобученными моделями.…