一、论文中公式:
K=3,这一项代表着人脸姿态的三个维度,即yaw, pitch, roll 角度,可见角度越高,权重越大。
C为不同的人脸类别数,作者将人脸分成多个类别,比如侧脸、正脸、抬头、低头、表情、遮挡等,w为与类别对应的给定权重,如果某类别样本少则给定权重大。
论文地址:https://arxiv.org/pdf/1902.10859.pdf
二、代码:
attributes_w_n = tf.to_float(attribute_batch[:, 1:6]) print('attributes_w_n=',attributes_w_n.get_shape()) #?要运行时才知道,奇怪的设定 #attributes_w_n= (?, 5),5种类型 mat_ratio = tf.reduce_mean(attributes_w_n,axis=0) #二维数据拥有两个轴:第0轴沿着行的方向垂直向下,第1轴沿着列的方向水平延申。 #axis=0表示所有行求均值,得到5维列向量 #tf.reduce_mean 函数用于计算张量tensor沿着指定的数轴(tensor的某一维度)上的的平均值, # 主要用作降维或者计算tensor(图像)的平均值。 mat_ratio = tf.map_fn(lambda x:(tf.cond(x > 0,lambda: 1/x,lambda:float(args.batch_size))),mat_ratio) # >0,则为1/x; 否则为args.batch_size。这是哪个操作? # 就是我们图中的function,一般会使用lambda表达式表示。 # elems是需要做处理的Tensors,TF将会将elems从第一维展开,进行map处理。 attributes_w_n = tf.convert_to_tensor(attributes_w_n * mat_ratio) #所有数据乘以均值?,tf.multiply()两个矩阵中对应元素各自相乘。attributes_w_n前后的维度不变 attributes_w_n = tf.reduce_sum(attributes_w_n,axis=1) list_ops['attributes_w_n_batch']=attributes_w_n L2_loss = tf.add_n(tf.losses.get_regularization_losses()) #获取总正则化loss. _sum_k = tf.reduce_sum(tf.map_fn(lambda x: 1 - tf.cos(abs(x)), euler_angles_gt_batch - euler_angles_pre), axis=1) # 三个角度求和,每个都求和 # fn 是一个可调用函数,可以使用 lambda 来表示,elems 是需要处理的 tensors, tf 将会从第一维开始展开,进行 map 操作, # dtype 表示 fn 函数的输出类型,如果 fn 返回的类型和 elems 中的不同,那么就必须显示指定为和 fn 返回类型相同的类型。 loss_sum = tf.reduce_sum(tf.square(landmark_batch - landmarks_pre), axis=1) # tf.square()是对a里的每一个元素求平方 #? landmarks_pre是算出来的,但是landmark_batch没有赋值啊?应该是后面计算的过程中不停更新的, # 这些都是一个计算方式,就像print时的?,也是没有赋值。 # pdb.set_trace() loss_sum = tf.reduce_mean(loss_sum*_sum_k*attributes_w_n) #标记的误差平方和*角度误差和*属性比值 loss_sum += L2_loss #再与总体误差相加 #看与论文对应得上不?代码地址:https://github.com/guoqiangqi/PFLD
https://github.com/guoqiangqi/PFLD/blob/master/train_model.py
三、问题
根据代码实现和思考,我觉得上面的公式好像不对,应该是这样:
原因如下:
1)角度\theta应该和landmark无关,与样本相关
2)类型w应该也是一样的,与landmark无关,与样本相关
不知道是不是对的,请大家指点。