Apple Photos中与RKFace.modelId对应的小标题如何显示?

时间:2018-12-11 19:53:23

标签: sqlite cryptography deep-learning apple-photos

两个周末以来,我一直在研究Apple Photos macOS应用程序,但我陷入了困境。我希望StackOverflow的聪明人可以解决这个问题。

我不知道的东西:

  1. 如何确定新的十六进制目录,它们与RK.modelId的对应关系。可能是RKFace.ModelId的16 mod或RKFace.ModelId的mod 256?
  2. 过一会儿,小平面十六进制值不再对应于RKFace.ModelId。例如,RKFace.modelId 61047应该是facetile_ee77.jpeg。但是,正确的facetile是face / 20/01 / facetile_1209b.jpeg。十六进制值1209b是dec值73883,对此我没有RKFace.ModelId。

我知道的事情:

  1. Apple Photos利用深度学习网络来检测和裁剪导入照片中的面孔。它将这些检测到的面部裁剪的jpeg保存到资源/media/face/00/00/facetile_1.jpeg中的照片库中。
  2. 与该小标题对应的记录插入RKFace中,其中RKFace.modelId integer是文件名的尾部十六进制版本的十进制数。您可以使用standard dec to hex converter并得出正确的值。例如: RKFace.modelId to facetile filename
  3. 每个子目录(例如“ / 00/00”)在开始新目录之前最多只能容纳256个小标题。目录名称也是带有目录的十六进制格式。例如3e,3f。

1 个答案:

答案 0 :(得分:0)

在尝试渲染照片马赛克时,我也偶然发现了这个问题...

然后我很幸运地找到了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