【问题标题】:OpenCV background subtraction learning rate cannot changeOpenCV背景减法学习率不能改变
【发布时间】:2017-07-10 12:49:58
【问题描述】:

我希望训练一个 50 帧的背景区域,并使用这个预训练模型进行背景减法。模型在训练后停止更新。

这是我的代码

import cv2
print "This program is for background subtraction with pre-trained model\n"

Training_Floder = "/Users/yuyang/Desktop/img1/"
Start_Frame_Num = 1
End_Frame_Num = 51

cv2.namedWindow("BG_IMAGE")

fgbg = cv2.createBackgroundSubtractorMOG2(50, 16, False)
font = cv2.FONT_HERSHEY_SIMPLEX



for index in range(Start_Frame_Num, End_Frame_Num):
    Img_File_Name = Training_Floder + str(index) + ".jpg"
    Img = cv2.imread(Img_File_Name)
    fgmask = fgbg.apply(Img, -1)
    BG_IMG = fgbg.getBackgroundImage()
    #######
    cv2.putText(BG_IMG,str(index),(10,500), font, 1,(255,255,255),2)
    cv2.imshow("BG_IMAGE", BG_IMG)
    #######
    cv2.waitKey(0)

Testing_Floder = "/Users/yuyang/Desktop/New/"
Test_Start = 1
Test_End = 100

for index in range(Test_Start, Test_End):
    Img_File_Name = Testing_Floder + str(index) + ".jpg"
    Img = cv2.imread(Img_File_Name)
    fgmask1 = fgbg.apply(Img, 0)
    BG_IMG1 = fgbg.getBackgroundImage()
    cv2.putText(BG_IMG1,str(index),(10,500), font, 1,(255,255,255),2)
    cv2.imshow("BG_IMAGE", BG_IMG1)
    cv2.waitKey(0)

基于 cmets

学习率参数在函数“apply()”中。

@param learningRate 
The value between 0 and 1 that indicates how fast the background 
model is learnt. Negative parameter value makes the algorithm to 
use some automatically chosen learning rate. 0 means that the 
background model is not updated at all, 1 means that the background 
model is completely reinitialized from the last frame.

CV_WRAP virtual void apply(InputArray image, OutputArray fgmask, double learningRate=-1) = 0;"

但是,我在这里尝试了几种学习率:

fgmask = fgbg.apply(Img, -1) or
fgmask = fgbg.apply(Img, 0) or
fgmask = fgbg.apply(Img, 1) or
fgmask = fgbg.apply(Img, 0.00001)

训练背景结果没有改变。 这意味着我不能在测试时保持预训练模型不变!

我的代码有什么问题吗? 有什么办法可以改变学习率?

以下是一些结果

Background subtraction result of Testing image #1

Background subtraction result of Testing image #40

从上面的结果可以看出,虽然我将学习率设置为 0,但经过训练的背景图像在测试时发生了变化。

fgmask1 = fgbg.apply(Img, 0)

【问题讨论】:

  • 您的问题含糊不清。当您说model stops updating after training 时,模型实际上应该在训练结束后停止更新。而且,你的学习率有什么问题?经过一些迭代后,它在训练期间是否会发生变化?请更明确。首先清楚地说明问题的标题,并确保问题的其余部分连贯并与标题同步。
  • 感谢您的 cmets。在训练期间,我将学习率设置为-1。这是一个默认值。我计划在测试框架上应用预训练模型。而这次我将训练率设置为0------“0表示后台模型根本没有更新”。但是,背景模型仍在以 0 的训练率更新。我在 opencv c++ 示例代码和我自己的 python 代码上对此进行了测试。我不确定是我的编码问题还是opencv BUG
  • 如果训练的#frames为T,set learning rate -1就是设置学习率为1/T
  • 我同意你的观点@YangYu 这是一个烦人的问题,即使学习率为 0,模型也会不断更新......
  • @Curious 这个问题解决了,我弄错了函数fgbg.apply()的python版本。我没有只使用“fgmask = fgbg.apply(Img, Learning_Rate)”来改变学习率,因为这里的学习率是第二个参数,但实际上是第三个。我忘记了细节。我以为python函数参数和cpp版本很相似

标签: python c++ opencv


【解决方案1】:

所以正确使用python实现的方法是

fgbg = cv2.createBackgroundSubtractorMOG2(50, 16, False)
fgbg.apply(input, output, learning_rate)

与 c++ 实现完全一样。 学习率必须是第三个参数。

【讨论】:

    猜你喜欢
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 2016-06-19
    • 2011-12-07
    • 1970-01-01
    相关资源
    最近更新 更多