Как выглядят лицевые фрагменты в Apple Photos, которые соответствуют RKFace.modelId? - PullRequest
0 голосов
/ 11 декабря 2018

Я копался в MacOS-приложении Apple Photos уже пару выходных, и я застрял.Я надеюсь, что умные люди в StackOverflow смогут это понять.

Чего я не знаю:

  1. Как определяются новые шестнадцатеричные каталоги и как они соответствуют RK.modelId.Возможно 16 мод RKFace.ModelId, или мод 256 RKFace.ModelId?
  2. Через некоторое время значение шестнадцатеричного фасета больше не соответствует RKFace.ModelId.Например, RKFace.modelId 61047 должен быть facetile_ee77.jpeg.Правильный фасет, однако, это face / 20/01 / facetile_1209b.jpeg.шестнадцатеричное значение 1209b является значением dec 73883, для которого у меня нет RKFace.ModelId.

Вещи, которые я знаю:

  1. Apple Photos использует сети глубокого обучения для обнаружения и обрезки лиц на ваших импортированных фотографиях.Он сохраняет обрезанный jpeg этих обнаруженных лиц в вашей библиотеке фотографий в resources / media / face / 00/00 / facetile_1.jpeg.
  2. Запись, соответствующая этому фасетику, вставляется в RKFace, где целое число RKFace.modelId являетсядесятичное число хвостовой шестнадцатеричной версии имени файла.Вы можете использовать стандартный преобразователь десятичных в шестнадцатеричные и получить правильные значения.Например: RKFace.modelId to facetile filename
  3. Каждый подкаталог, например "/ 00/00", будет содержать максимум 256 фасеток, прежде чем он начнет новый каталог.Имя каталога также в шестнадцатеричном формате с каталогами.Например, 3e, 3f.

1 Ответ

0 голосов
/ 01 июля 2019

Пытаясь отрисовать фото-мозаику, я тоже наткнулся на эту проблему ...

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

Это то, что я придумал (при условии, что вы ищете кого-то по имени NAME):

SELECT 
    printf('%04x', mr.modelId) AS tileId 
FROM 
    RKModelResource mr, RKFace f, RKPerson p 
WHERE 
    f.modelId = mr.attachedModelId 
    AND f.personId = p.modelId 
    AND p.displayName = NAME

Этоselect распечатывает все RKModelResource.modelIds в шестнадцатеричном виде, используется для присвоения имени facetiles, который вы искали.Все, что сейчас нужно, - это полный путь к фасету.

Итак, полный скрипт bash для копирования всех этих фасетиков лица (в локальную папку out в текущем каталоге) может быть:

#!/bin/bash
set -eEu

PHOTOS_PATH=$HOME/Pictures/Photos\ Library.photoslibrary
DB_PATH=$PHOTOS_PATH/database/photos.db

echo $NAME
mkdir -p out/$NAME

TILES=( $(sqlite3 "$DB_PATH" "SELECT printf('%04x', mr.modelId) AS tileId FROM RKModelResource mr, RKFace f, RKPerson p WHERE f.modelId = mr.attachedModelId AND f.personId = p.modelId AND p.displayName='"$NAME"'") )
for TILE in ${TILES[@]}; do
    FOLDER=${TILE:0:2}
    SOURCE="$PHOTOS_PATH/resources/media/face/$FOLDER/00/facetile_$TILE.jpeg"
    [[ -e "$SOURCE" ]] || continue
    TARGET=out/$NAME/$TILE.jpeg
    [[ -e "$TARGET" ]] && continue
    cp "$SOURCE" "$TARGET" || :
done
...