以前就发现TensorFlow的模型组件中一直没有yolo,最近比较闲,想看看能不能TensorFlow试试。根据paper和linux上运行的测试结果,网络主体还是比较容易实现的。但是主要问题是损失函数的实现,根据darknet的GitHub工程源码来看,基本思路是遍历每一个box使用预定好的规则处理不同情况的损失。但是TensorFlow的话,如果按照这种逻辑写损失,计算图的加载都慢到极点
def get_loss(output, label, batch_size):
threshold = tf.Variable(.5)
loss = tf.Variable(0, dtype=tf.float32)
for b in range(batch_size):
for i in range(13):
for j in range(13):
for n in range(5):
iou = get_iou(output[b, i, j, n*8:n*8+4], label[b, 0, :4])
loss += tf.reduce_mean(tf.square(output[b ,i, j, n * 8:n * 8 + 4] - label[b, 0, :4]))
return loss
这里模仿c源码中的逻辑,遍历最后一层输出的每一个位置,这里只做测试,单纯的叠加均方误差,结果就是初始化计算图都不知道要等多久,因为一直在循环,看来这个张量操作和那边的指针操作速度上还是差太多。最后结论应该是方式有问题,还是得多学习呀,不然知识水平不够。(思维僵化。。