luoyetx / face-alignment-at-3000fps

C++ implementation of Face Alignment at 3000 FPS via Regressing Local Binary Features
BSD 3-Clause "New" or "Revised" License
197 stars 120 forks source link

test的时候用到了ground true数据 #2

Closed NanYoMy closed 8 years ago

NanYoMy commented 9 years ago

for (int i = 0; i < N; i++) { fscanf(fd, "%s", img_path); for (int j = 0; j < 4; j++) { fscanf(fd, "%lf", &bbox[j]); } for (int j = 0; j < landmark_n; j++) { fscanf(fd, "%lf%lf", &x[j], &y[j]); } Mat img = imread(img_path); // crop img double x_min, y_min, x_max, y_max; x_min = min_element(x.begin(), x.end()); x_max = max_element(x.begin(), x.end()); y_min = min_element(y.begin(), y.end()); y_max = max_element(y.begin(), y.end()); x_min = max(0., x_min - bbox[2] / 2); x_max = min(img.cols - 1., x_max + bbox[2] / 2); y_min = max(0., y_min - bbox[3] / 2); y_max = min(img.rows - 1., ymax + bbox[3] / 2); double x, y, w, h; x = xmin; y = ymin; w = x_max - xmin; h = y_max - ymin; BBox bbox(bbox[0] - x, bbox[1] - y, bbox[2], bbox[3]); Rect roi(x, y, w, h); img = img(roi).clone();

    Mat gray;
    cvtColor(img, gray, CV_BGR2GRAY);
    LOG("Run %s", img_path);
    Mat shape = lbf_cascador.Predict(gray, bbox_);
    img = drawShapeInImage(img, shape, bbox_);
    imshow("landmark", img);
    waitKey(0);
}

test的时候用到了ground truth的数据,是不是在做另外其他图像没有.pts文件就不能检测了?

luoyetx commented 9 years ago

test 时用到 ground truth 的数据只是为了计算误差, 并不影响检测

luoyetx commented 9 years ago

另外, 你贴的第一段代码是在读取图片中人脸框的数据, 真实形状只是用来裁剪图像, 减少内存消耗而已, 计算 landmark 时并没有用到真实形状的信息, 但是需要人脸框信息

NanYoMy commented 9 years ago

重新把ground_true去除了。但是模型还是挺大的,如果我想把模型压缩到几M内,有什么好的建议。

luoyetx commented 9 years ago

模型文件中应该没有存储 ground_truth 数据

其实 30M+ 的模型文件已经蛮小了, 如果你还想压缩的话, 建议你更改源码中的几个 Read Write 函数, 参数类型可以从 double 降级到 float 这个能够减少将近一半的数据, 但是会有相应的损失. 另外一种方法, 你可以考虑利用 zlib 等压缩库, 因为代码中是 Raw Data 直接以二进制形式输出, 你可以考虑利用压缩库进行数据压缩.

但是我认为想压缩到 10M 以内不太现实, 除非修改模型参数, 减少模型的参数.

NanYoMy commented 9 years ago

恩是的,我是说去除了利用ground true裁剪的那块,模型大小和参数我觉的可以试着改一下。

NanYoMy commented 9 years ago

如果把stage的个数减少,

luoyetx commented 9 years ago

调整模型的参数需要自己训练, 降低模型复杂度可能会使预测效果变差, 需要自己衡量. 这个模型的我本人认为调得效果还可以. 你是什么需求, 需要这么小的模型文件, 嵌入式?

NanYoMy commented 9 years ago

模型效果很ok的。手机上的,手机上不可能让他们载个这么大的文件吧。

luoyetx commented 9 years ago

个人建议

  1. 将模型数据从 double 将级到 float 能在很大程度上减小模型文件的大小(个人认为可以减少一半的大小), 在此基础上利用类似 zlib 这种压缩库在程序数据的写入和载入时进行数据压缩.
  2. 调整模型的大小, 重新训练, 但是如果用现有代码进行数据的读写, 也不太可能降低到 10M 以内(模型太小, 效果一定差), 仍然需要考虑 1 中的数据格式和压缩.
NanYoMy commented 9 years ago

你训练模型的时候用的什么数据,读多少张图片,我训练用helen的数据,经常出现了outofmemory的问题。我的机器8g的内存。

luoyetx commented 9 years ago

内存不足考虑将程序编译成 64 位, 我一般在服务器上训练, 内存基本不是问题.

关于数据集, README 中有提到

NanYoMy commented 9 years ago

好的谢谢啦。

happygao commented 8 years ago

@NanYoMy你好,请问下载好数据集,train和test是按照什么标准分的呀?

luoyetx commented 8 years ago

@happygao 数据集本身是分了 train test 的

happygao commented 8 years ago

@luoyetx按照readme的说明,我现在已经训练好了模型,但是怎么将其用到其他数据集上呀?即就是用别的图像能否将点标记出来?

luoyetx commented 8 years ago

@happygao 你需要做人脸检测来输出人脸框,框的尺度最好和训练时的尺度一致

happygao commented 8 years ago

@luoyetx 如果我想用到其他图片上,是不是必须要有.pts文件呀?

luoyetx commented 8 years ago

@happygao 不需要

happygao commented 8 years ago

@luoyetx 麻烦您能说的仔细一点吗?如果在其他图片上进行标记其关键点,是不是将test文件夹的图片换成需要检测的就可以了吗?麻烦您给我说一下步骤吧,谢谢

luoyetx commented 8 years ago

参考 test.cpp 的 run 函数,用检测器来检测人脸 bbox