我正在尝试将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)
但我不会忘记为什么或如何改变... 知道为什么不呢?我错过了某个地方的东西? 谢谢你的帮助