Closed NanYoMy closed 8 years ago
test 时用到 ground truth 的数据只是为了计算误差, 并不影响检测
另外, 你贴的第一段代码是在读取图片中人脸框的数据, 真实形状只是用来裁剪图像, 减少内存消耗而已, 计算 landmark 时并没有用到真实形状的信息, 但是需要人脸框信息
重新把ground_true去除了。但是模型还是挺大的,如果我想把模型压缩到几M内,有什么好的建议。
模型文件中应该没有存储 ground_truth 数据
其实 30M+ 的模型文件已经蛮小了, 如果你还想压缩的话, 建议你更改源码中的几个 Read
Write
函数, 参数类型可以从 double 降级到 float 这个能够减少将近一半的数据, 但是会有相应的损失. 另外一种方法, 你可以考虑利用 zlib 等压缩库, 因为代码中是 Raw Data 直接以二进制形式输出, 你可以考虑利用压缩库进行数据压缩.
但是我认为想压缩到 10M 以内不太现实, 除非修改模型参数, 减少模型的参数.
恩是的,我是说去除了利用ground true裁剪的那块,模型大小和参数我觉的可以试着改一下。
如果把stage的个数减少,
调整模型的参数需要自己训练, 降低模型复杂度可能会使预测效果变差, 需要自己衡量. 这个模型的我本人认为调得效果还可以. 你是什么需求, 需要这么小的模型文件, 嵌入式?
模型效果很ok的。手机上的,手机上不可能让他们载个这么大的文件吧。
个人建议
你训练模型的时候用的什么数据,读多少张图片,我训练用helen的数据,经常出现了outofmemory的问题。我的机器8g的内存。
内存不足考虑将程序编译成 64 位, 我一般在服务器上训练, 内存基本不是问题.
关于数据集, README 中有提到
好的谢谢啦。
@NanYoMy你好,请问下载好数据集,train和test是按照什么标准分的呀?
@happygao 数据集本身是分了 train test 的
@luoyetx按照readme的说明,我现在已经训练好了模型,但是怎么将其用到其他数据集上呀?即就是用别的图像能否将点标记出来?
@happygao 你需要做人脸检测来输出人脸框,框的尺度最好和训练时的尺度一致
@luoyetx 如果我想用到其他图片上,是不是必须要有.pts文件呀?
@happygao 不需要
@luoyetx 麻烦您能说的仔细一点吗?如果在其他图片上进行标记其关键点,是不是将test文件夹的图片换成需要检测的就可以了吗?麻烦您给我说一下步骤吧,谢谢
参考 test.cpp 的 run 函数,用检测器来检测人脸 bbox
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();
test的时候用到了ground truth的数据,是不是在做另外其他图像没有.pts文件就不能检测了?