所以我一直在搞乱tensorflow的物体检测api,特别是模型的重新训练,基本上是做this。我用少量图像很好地检测了我的物体。但是我想增加我训练的图像数量,但标签过程很长很无聊,所以我发现了一个带有裁剪图像的数据集,所以只有我的对象在图像中。
如果有一种方法发送整个图像而不标记它们也使用tensorflow api训练我没有找到它,但我认为制作一个标记整个图像的程序不会那么难。
标签的格式是带有以下条目的csv文件:文件名,宽度,高度,类,xmin,ymin,xmax,ymax。
这是我的代码:
import os
import cv2
path = "D:/path/to/image/folder"
directory = os.fsencode(path)
text = open("D:/result/train.txt","w")
for file in os.listdir(directory):
filename = os.fsdecode(file)
if filename.endswith(".jpg"):
impath= path + "/" + filename
img = cv2.imread(impath)
res = filename+","+ str(img.shape[1])+","+str(img.shape[0])+",person,1,1,"+str(img.shape[1]-1) +"," +str(img.shape[0]-1)+"\n"
text.write(res)
print(res)
text.close()
这似乎工作正常。
现在这是问题所在。将.txt转换为.csv并运行训练直到损失停止减少后,我的测试集上的检测结果非常糟糕。它在整个图像周围放置了一个巨大的边界框,就像它被训练只检测图像的边缘一样。
我认为它是以某种方式学习检测图像的边缘,因为标签是围绕整个图像。但是我如何让它学会“看到”图片中的内容?任何帮助,将不胜感激。
该模型准确预测了训练的内容:整个图像的巨大边界框。显然,如果您的训练数据仅包含坐标为[0, 0, 1, 1]
的框,则模型将学习它并预测测试集。
您可以尝试使用一种增强方式:将图像放在较大的黑色/灰色画布上,并相应地调整边界框。例如,这就是SSD增强的功能。然而,没有自由和好的方法来补偿没有适当标记的火车组。