Deep-Alignment-Network-tensorflow icon indicating copy to clipboard operation
Deep-Alignment-Network-tensorflow copied to clipboard

issues about trainDNA.py

Open JWSunny opened this issue 7 years ago • 86 comments

您好,我在进行trainDAN训练时,STAGE=2,执行sess.sun();获取数据训练时,运行到models.py中的S2_InputImage = AffineTransformLayer(InputImage, S2_AffineParam)会报错;

错误如下:

Caused by op 'Stage2/MatrixInverse', defined at: File "D:/softmares/Pycharm_workplace/Deep-Alignment-Network-tensorflow-master/DAN-TF/python_test1.py", line 73, in dan = DAN(initLandmarks) File "D:\softmares\Pycharm_workplace\Deep-Alignment-Network-tensorflow-master\DAN-TF\python_test2.py", line 102, in DAN S2_InputImage = AffineTransformLayer(InputImage, S2_AffineParam) ## 通过变换矩阵对原图进行矫正,得到新的图片 File "D:\softmares\Pycharm_workplace\Deep-Alignment-Network-tensorflow-master\DAN-TF\layers.py", line 60, in AffineTransformLayer A = tf.matrix_inverse(A) File "C:\Program Files\Anaconda3\lib\site-packages\tensorflow\python\ops\gen_linalg_ops.py", line 330, in matrix_inverse name=name) File "C:\Program Files\Anaconda3\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 768, in apply_op op_def=op_def) File "C:\Program Files\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 2336, in create_op original_op=self._default_original_op, op_def=op_def) File "C:\Program Files\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 1228, in init self._traceback = _extract_stack()

InvalidArgumentError (see above for traceback): Input is not invertible. [[Node: Stage2/MatrixInverse = MatrixInverseT=DT_FLOAT, adjoint=false, _device="/job:localhost/replica:0/task:0/cpu:0"]]

请问您遇到过吗?是我开始数据变换出了问题吗?能请教您下吗?

JWSunny avatar Apr 25 '18 00:04 JWSunny

@JWSunny 还真没遇到过,请问你是用这份代码里的脚本生成的数据吗?

mariolew avatar Apr 25 '18 08:04 mariolew

是的,我想咨询下您,关于AffineTransformLayer函数中Pama的维度是(N, 6)嘛?还是(1, 6)?目前主要是函数中tf.matrix_inverse(A)报错艾!能提供下脚本产生的数据进行比对下嘛?[email protected]

JWSunny avatar Apr 26 '18 00:04 JWSunny

@JWSunny 是N 6, 你可以用脚本试试就知道产生的数据是什么样子了的。

mariolew avatar Apr 26 '18 01:04 mariolew

好的 谢谢,A是所有行的前4列;即N个(2,2)的矩阵;tf_matrix_inverse(A)是同时求N个(2,2)的逆矩阵,是不是不能同时求啊?感觉是因为这个报错!您那边同时求N个2*2矩阵的逆矩阵没问题吗?

JWSunny avatar Apr 26 '18 02:04 JWSunny

解决了,是TransformParamsLayer中代码处理有问题,已经重写了!谢谢~

JWSunny avatar Apr 26 '18 03:04 JWSunny

@JWSunny hi, 请问哪里的处理有问题,也请你说一下,因为我的使用过程中没发现这个问题,有解决方法也请分享一下吧。

mariolew avatar Apr 26 '18 03:04 mariolew

TransformParamsLayer主要是reshape函数对矩阵转换之后,本人电脑上操作之后Pama的维度并不是(N, 6);于是参考另一位大神的实现https://github.com/zjjMaiMai/Deep-Alignment-Network-A-convolutional-neural-network-for-robust-face-alignment/blob/master/DAN_V2/dan_model.py,觉得可能是因为版本问题!

JWSunny avatar Apr 26 '18 03:04 JWSunny

还想咨询您一个问题,NormRmse函数计算的误差属于什么误差,选取[36,42]和[42,48]表示什么意思?

JWSunny avatar Apr 26 '18 06:04 JWSunny

您好,方便问下针对一张没有进行68关键点标注的图,如何利用该模型来预测人脸的68关键点?

JWSunny avatar May 04 '18 02:05 JWSunny

@JWSunny 预测的话,首先需要人脸检测,然后需要对图像减去训练集的均值,除以训练集的标准差,然后就直接运行模型得到结果即可,我有看这种结果,也还行,但代码比较乱,目前还不好上传,您可以按照我说的流程自己写一下,有问题可以问我。

mariolew avatar May 07 '18 01:05 mariolew

试了Dlib人脸检测,预测出的68关键点都没Dlib训练的68关键点模型标注的准确,嘴角偏差明显

JWSunny avatar May 07 '18 02:05 JWSunny

@JWSunny 请问你有试过放大一点检测框吗,可以放大一点试试,比如1.3倍?然后,你是用什么数据训的,训到什么程度?

mariolew avatar May 07 '18 02:05 mariolew

检测框设置是哪个?训练集的话就是lfpw、helen的trainset和afw共60960张,迭代了训练500次 image 按照您代码中的BatchErr是0.023746558?是我哪边模型训练时出错了嘛? 方便加个qq聊吗

JWSunny avatar May 07 '18 02:05 JWSunny

@JWSunny 我的意思是,测试的时候,将dlib的人脸框放大一点试试效果。然后你这是stage1还是2啊,如果是2,这个误差有点高了。训stage2的时候,实测应该降学习率才能训得动,我降低了10倍,0.0001,如果不想降学习率,请把原代码里面模型部分的每一层的BN和relu的顺序调换一下,就像这样S1_Conv1a = tf.nn.relu(tf.layers.batch_normalization(tf.layers.conv2d(InputImage,64,3,1, padding='same',activation=None,kernel_initializer=tf.glorot_uniform_initializer()),training=S1_isTrain))

mariolew avatar May 07 '18 02:05 mariolew

stage2,学习速率0.001,误差高了,误差大概多少是合适的?

JWSunny avatar May 07 '18 02:05 JWSunny

@JWSunny BatchErr应该要到0.01左右的。

mariolew avatar May 07 '18 02:05 mariolew

哦哦 感谢感谢,那我试试Dlib人脸检测放大人脸框的方法!

JWSunny avatar May 07 '18 02:05 JWSunny

@JWSunny 哦,对了,我在300-W上训练的模型,在300-W测试集上的结果和他的论文差距不算很大,但是好像测平常的人脸图效果一般。但是用MENPO数据集训练的要好很多。

mariolew avatar May 07 '18 02:05 mariolew

也就是说300-W训练集+MENPO一起训练的模型效果在测试平常人脸效果更好咯,那您针对MENOP的训练集,有像300-W的训练集做镜像、平移之类的操作来扩充训练集训练吗?

JWSunny avatar May 07 '18 02:05 JWSunny

都有的

mariolew avatar May 07 '18 02:05 mariolew

哦哦 好的好的,感谢感谢,我试试~

JWSunny avatar May 07 '18 02:05 JWSunny

您好,能提供下Menpo的训练数据集嘛,网上的链接貌似失效了!谢谢了!

JWSunny avatar May 07 '18 10:05 JWSunny

@JWSunny https://www.dropbox.com/s/5yw8wb9k278k400/trainset.zip?dl=1 我试了一下,可以下啊,并未失效,你需要去申请一下解压密码,出于这个原因,我也不能把它直接放出来。需要翻墙。

mariolew avatar May 07 '18 10:05 mariolew

哦哦,那可能是因为未翻墙,谢谢!

JWSunny avatar May 07 '18 10:05 JWSunny

@mariolew 误差降到0.01 大概训练了多少次啊? 我用gpu训练一次要20分钟 好慢,你训练一次大概多久

hengshan123 avatar May 09 '18 10:05 hengshan123

一个epoch20分钟不算慢吧,我好像s1和s2各训练了50个吧,不改代码的话s2得降低学习率,改的话就像这个issue说的那样就OK

mariolew avatar May 10 '18 00:05 mariolew

直接训练S1和S2有什么区别嘛?就层数的不同,之前试了部分数据集S1有时候误差比S2小一些,目前选的是直接训练S2

JWSunny avatar May 10 '18 00:05 JWSunny

@JWSunny 建议你看看论文。是需要先训S1,再训S2的,如果你直接训S2,相当于S1部分是随机初始化的,就没有什么意义了。

mariolew avatar May 10 '18 01:05 mariolew

训练完,BatchErr 到0.01 那 TestErr 大致降到多少? 我s1 训练了30次,然后没改学习率去训练s2 训练100次和没训练没啥区别,真奇怪 我训练了30次s1, 100次s2, 还可以继续s1吧, 然后再修改学习率 接着训练s2

hengshan123 avatar May 10 '18 07:05 hengshan123

训练完,BatchErr 到0.01 那 TestErr 大致降到多少? 我s1 训练了30次,然后没改学习率去训练s2 训练100次和没训练没啥区别,真奇怪 我训练了30次s1, 100次s2, 还可以继续s1吧, 然后再修改学习率 接着训练s2

hengshan123 avatar May 10 '18 07:05 hengshan123