我想预测给定N前一帧的(灰度)视频的下一帧 - 使用Keras中的CNN或RNN.关于时间序列预测和Keras的大多数教程和其他信息在他们的网络中使用1维输入,但我的是3D(N frames x rows x cols)
我现在真的不确定这个问题的好方法是什么.我的想法包括:
使用一个或多个LSTM图层.这里的问题是我不确定他们是否适合拍摄一系列图像而不是一系列标量作为输入.内存消耗不会爆炸吗?如果可以使用它们:我如何在Keras中使用它们以获得更高的尺寸?
在输入上使用3D卷积(先前视频帧的堆栈).这提出了其他问题:为什么在我不进行分类而是预测时这会有所帮助?如何以网络输入具有尺寸(N x cols x rows)和输出的方式堆叠图层(1 x cols x rows)?
我对CNN/RNN和Keras很陌生,并希望能够向正确的方向发出任何暗示.
我目前正在使用LSTM层训练一个用于天气预报的递归神经网络.网络本身非常简单,看起来大致如下:
model = Sequential()
model.add(LSTM(hidden_neurons, input_shape=(time_steps, feature_count), return_sequences=False))
model.add(Dense(feature_count))
model.add(Activation("linear"))
Run Code Online (Sandbox Code Playgroud)
LSTM图层的权重具有以下形状:
for weight in model.get_weights(): # weights from Dense layer omitted
print(weight.shape)
> (feature_count, hidden_neurons)
> (hidden_neurons, hidden_neurons)
> (hidden_neurons,)
> (feature_count, hidden_neurons)
> (hidden_neurons, hidden_neurons)
> (hidden_neurons,)
> (feature_count, hidden_neurons)
> (hidden_neurons, hidden_neurons)
> (hidden_neurons,)
> (feature_count, hidden_neurons)
> (hidden_neurons, hidden_neurons)
> (hidden_neurons,)
Run Code Online (Sandbox Code Playgroud)
简而言之,看起来这个LSTM层中有四个"元素".我现在想知道如何解释它们:
time_steps这个表示中的参数在哪里?它如何影响重量?
我读过LSTM由几个块组成,比如输入和遗忘门.如果那些在这些权重矩阵中表示,哪个矩阵属于哪个门?
有没有办法看到网络学到了什么?例如,从上一个时间步骤(t-1如果我们想要预测t)需要花多少钱t-2?等等多少?例如,知道我们是否可以从权重中读取输入t-5完全不相关的内容将会很有趣.
澄清和提示将不胜感激.
我正在尝试从斯坦福大学学习本教程 http://www.stanford.edu/class/ee368/Android/Tutorial-2-OpenCV-for-Android-Setup-Windows-API8.pdf
我的环境变量都是根据教程设置的,一切都运行良好,直到步骤3c):
C.在Cygwin终端中键入以下内容以编译OpenCV库:
使
这个编译可能需要一段时间,可能需要30分钟或更长时间.
我在cygwin-terminal中得到以下输出:
Isa@LESTER ~/opencv/android/build
$ make
[100%] Generating android-opencv
Compile thumb : png <= /home/Isa/opencv/3rdparty/libpng/png.c
/home/Isa/android-ndk-r4-crystax/build/core/build-binary.mk:169: recipe for target '/home/Isa/opencv/android/build/obj/local/armeabi/objs/png/png.o' failed
make[3]: *** [/home/Isa/opencv/android/build/obj/local/armeabi/objs/png/png.o] Error 127
make[3]: *** Warte auf noch nicht beendete Prozesse...
CMakeFiles/ndk.dir/build.make:55: recipe for target 'android-opencv' failed
make[2]: *** [android-opencv] Error 2
CMakeFiles/Makefile2:63: recipe for target 'CMakeFiles/ndk.dir/all' failed
make[1]: *** [CMakeFiles/ndk.dir/all] Error 2
Makefile:75: recipe for target 'all' failed
make: *** [all] Error 2
Run Code Online (Sandbox Code Playgroud)
还有其他人试过这个教程吗?看起来很不错,我真的很想让它发挥作用.我很感激任何提示来解决这个错误.如果您需要更多信息来帮助我,请告诉我们.
谢谢你,Isa
我有两套积分,我想找到它们之间最好的转换.在OpenCV中,您具有以下功能:
Mat H = Calib3d.findHomography(src_points, dest_points);
Run Code Online (Sandbox Code Playgroud)
使用RANSAC返回3x3 Homography矩阵.我现在的问题是,我只需要翻译和轮换(可能是规模),我不需要仿射和透视.
问题是,我的观点只有2D.
(1)是否存在计算类似单应性但自由度较低的函数?
(2)如果没有,是否有可能从3x3单应矩阵中提取仅进行平移和旋转的3x3矩阵?
在此先感谢您的帮助!
伊萨
我的问题是使用Keras的LSTM层预测(t_0, t_1, ... t_{n_post-1})给定前一个时间步长的值序列(t_{-n_pre}, t_{-n_pre+1} ... t_{-1}).
Keras很好地支持以下两种情况:
n_post == 1 (多对一预测) n_post == n_pre (多个到多个预测序列长度相等)但不是版本在哪里n_post < n_pre.
为了说明我的需要,我使用正弦波构建了一个简单的玩具示例.
多对一模型预测
使用以下型号:
model = Sequential()
model.add(LSTM(input_dim=1, output_dim=hidden_neurons, return_sequences=False))
model.add(Dense(1))
model.add(Activation('linear'))
model.compile(loss='mean_squared_error', optimizer='rmsprop')
Run Code Online (Sandbox Code Playgroud)
使用n_pre == n_post进行多对多模型预测
网络学会使用n_pre == n_post非常好地拟合正弦波与这样的模型:
model = Sequential()
model.add(LSTM(input_dim=1, output_dim=hidden_neurons, return_sequences=True))
model.add(TimeDistributed(Dense(1)))
model.add(Activation('linear'))
model.compile(loss='mean_squared_error', optimizer='rmsprop')
Run Code Online (Sandbox Code Playgroud)
使用n_post <n_pre进行多对多模型预测
但现在,假设我的数据如下所示:dataX或input:(nb_samples, nb_timesteps, nb_features) -> (1000, 50, 1)
dataY或output:(nb_samples, nb_timesteps, nb_features) -> (1000, 10, 1)
经过一些研究后,我找到了一种如何在Keras中处理这些输入大小的方法,使用如下模型:
model = Sequential()
model.add(LSTM(input_dim=1, output_dim=hidden_neurons, return_sequences=False)) …Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个应该在相机框架上绘制一个小图像的程序.使用Android OpenCV,您可以使用以下功能来处理帧:
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
Mat rgba = inputFrame.rgba();
mDetector.setFrame(rgba);
mDetector.processFrame();
return rgba;
}
Run Code Online (Sandbox Code Playgroud)
Mat rgba然后显示在屏幕上.我的探测器现在应该处理帧rgba(改变它).这是相关代码:
public void processFrame() {
// (1) Doesn't work
Rect roi = new Rect(0, 0, 100, 100);
Mat submat = mOutputFrame.submat(roi);
Mat image = new Mat(100, 100, CvType.CV_8UC3, new Scalar(0,0,0));
image.copyTo(submat);
// (2) Does work
// --- mComparatorImage is the same size as mOutputFrame.
// --- mComparatorImage is 8bit greyscale, mOutputFrame is the rgba CameraFrame
mComparatorImage = mComparatorHolder.getCurrentImage();
mComparatorImage.copyTo(mOutputFrame);
// (3) Should work …Run Code Online (Sandbox Code Playgroud)