如何在暗流中手动修改权重(Tensor Flow)? (B& W图像的Tiny Yolo)

时间:2018-04-06 15:06:29

标签: tensorflow yolo darknet darkflow

我正在尝试将Yolo(微小)用于BW图像。我想从预先训练好的网络开始,然后再进一步训练。

Tiny Yolo weigths: https://pjreddie.com/media/files/yolov2-tiny-voc.weights

Tiny Yolo cfg文件: https://github.com/pjreddie/darknet/blob/master/cfg/yolov2-tiny-voc.cfg

Tiny Yolo标签(20): https://github.com/pjreddie/darknet/blob/master/examples/yolo.c

from darkflow.net.build import TFNet
import cv2
import numpy as np
import tensorflow as tf

options = {"model": "cfg/yolov2-tiny-voc.cfg", "load": "yolov2-tiny-voc.weights"}
tfnet = TFNet(options)

imgcv = cv2.imread("sample_img/sample_dog.jpg")
fig = plt.figure(1)
fig.gca().imshow(imgcv)

result = tfnet.return_predict(imgcv)
print(result)

然后我尝试使用B& W图像(仅在此示例中使用红色通道)

imgcvbw = np.stack((imgcv[:,:,0],imgcv[:,:,0],imgcv[:,:,0]),axis=2)
result = tfnet.return_predict(imgcvbw)
print(result)

效果很好。现在我想仅使用1个通道的输入。 为此,我修改了\darkflow\net\yolo\predict.py以处理单通道图像: 第20行:imsz = imsz[:,:,::-1]

if imsz.ndim<2:
    imsz = imsz[:,:,np.newaxis]
else:
    imsz = imsz[:,:,::-1]

我加载了新版本的网络,在配置文件中,&#39; channel&#39;已被设置为1(这是唯一的区别):

options2 = {"model": "cfg/yolov2-tiny-voc_1channel.cfg",
            "load": "yolov2-tiny-voc.weights"}
tfnet2 = TFNet(options2)

我得到原始网络的第一个卷积层的权重和偏差:

weights = tfnet.sess.run(tfnet.darknet.layers[0].w['kernel'])
biases  = tfnet.sess.run(tfnet.darknet.layers[0].w['biases'])

通常,如果我要取三个通道的权重之和,我的第一个卷积的输出,仅在红色通道上,应该在数学上是相同的

sumweights = np.sum(weights,axis=2)[:,:,np.newaxis,:]
tfnet2.sess.run(tf.assign(tfnet2.darknet.layers[0].w['kernel'], sumweights , validate_shape=True))
tfnet2.sess.run(tf.assign(tfnet2.darknet.layers[0].w['biases'], biases, validate_shape=True))

其余的都不应该改变,所以它应该仍然输出相同的结果,但它不会:

imgcvbw1 = (imgcv[:,:,0])[:,:,np.newaxis]
result = tfnet2.return_predict(imgcvbw1)
print(result)

我检查了所有其他图层都已正确加载并且是相同的,我认为在执行时我得到了奇怪的值:

im = np.copy(imgcvbw1)
h, w, _ = im.shape
im = tfnet2.framework.resize_input(im)
this_inp = np.expand_dims(im, 0)
feed_dict = {tfnet2.inp : this_inp}
weights2 = tfnet2.sess.run('0-convolutional/kernel/Assign:0', feed_dict = feed_dict)

但我不会忘记为什么或如何改变... 知道为什么不呢?我错过了某个地方的东西? 谢谢你的帮助

0 个答案:

没有答案