diff --git a/scanner.c b/scanner.c new file mode 100644 index 0000000..8befd32 --- /dev/null +++ b/scanner.c @@ -0,0 +1,124 @@ +#include +#include +#include +#include +#include +#include + +typedef struct Face { + long double descriptor[128]; + int faceId; + long double *distances; + struct Face *next; + struct Face *prev; +} Face; + +Face *readFaceDescriptor(int id, char *path) { + FILE *f; + char buf[5000]; + Face *pFace = (Face *)malloc(sizeof(Face)); + memset(pFace, 0, sizeof(Face)); + f = fopen(path, "r"); + if (!f) { + free(pFace); + return NULL; + } + size_t s = fread(buf, 1, sizeof(buf), f); + + char *p = buf; + buf[s] = 0; + while (*p && *p != '-' && *p != '+' && (*p < '0' || *p > '9')) { + p++; + } + for (int i = 0; i < 128; i++) { + char *start = p; + while (*p && *p != ',' && *p != ']' && *p != ' ' && *p != '\n') { + p++; + } + if (!*p) { + break; + } + *p++ = 0; + sscanf(start, "%Lf", &pFace->descriptor[i]); + } + + pFace->faceId = id; + pFace->next = pFace->prev = NULL; + + return pFace; +} + +long double euclideanDistance(long double *a, long double *b) { + long double sum = 0.0; + for (int i = 0; i < 128; i++) { + long double delta = a[i] - b[i]; + sum += delta * delta; + } + return sqrtl(sum); +} + +int main(int argc, char *argv[]) { + int i; + Face *pChain = NULL; + for (i = 0; i < 100; i++) { + char buf[1028]; + sprintf(buf, "%s/face-data/%d", argv[1], i); + DIR *faceDir = opendir(buf); + + if (!faceDir) { + printf("Can not open %s\n", buf); + } else { + struct dirent *ent; + while ((ent = readdir(faceDir)) != NULL) { + if (strstr(ent->d_name, ".json") == NULL) { + continue; + } + int id = 0; + char *p = ent->d_name; + while (*p && *p != '-') { + id *= 10; + id += *p - '0'; + p++; + } + char path[1028*2]; + sprintf(path, "%s/%s", buf, ent->d_name); + Face *pFace = readFaceDescriptor(id, path); + if (!pFace) { + continue; + } + if (pChain) { + pFace->next = pChain; + } + pChain = pFace; + } + closedir(faceDir); + } + } + Face *pLink = pChain; + int len = 0; + while (pLink) { + Face *tmp = pLink; + len++; + pLink = pLink->next; + } + pLink = pChain; + while (pLink) { + pLink->distances = (long double *)malloc(sizeof(long double) * len); + int index = 0; + Face *pTarget = pChain; + while (pTarget) { + if (pTarget == pLink) { + pLink->distances[index] = 0.0; + } else { + pLink->distances[index] = euclideanDistance(pLink->descriptor, pTarget->descriptor); + if (pLink->distances[index] < 0.4) { + printf("%Lf: %5d -> %5d\n", pLink->distances[index], pLink->faceId, pTarget->faceId); + } + } + pTarget = pTarget->next; + } + pLink = pLink->next; + } + printf("%d faces.\n", len); + return 0; +} \ No newline at end of file diff --git a/server/routes/photos.js b/server/routes/photos.js index e1d1455..dd28958 100755 --- a/server/routes/photos.js +++ b/server/routes/photos.js @@ -793,7 +793,7 @@ function getFacesForPhoto(id) { return photoDB.sequelize.query( "SELECT face1Id,face2Id " + "FROM facedistances " + - "WHERE distance>0 AND distance<=0.5 AND (face1Id=:id OR face2Id=:id)", { + "WHERE distance<=0.5 AND (face1Id=:id OR face2Id=:id)", { replacements: { id: face.id },