fbpx

Туториал: добавление тегов фотографиям с генератором 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. Я здесь, чтобы дать вам идеи, а вы здесь, чтобы делать с ними удивительные вещи, потому что, если честно, я ужасный разработчик, в отличие от вас.