假设我们有一个在scikit-learn中训练好的分类器,例如一个RandomForestClassifier
。该分类器已经使用例如25×25大小的样本进行训练。
如何将这个分类器轻松地应用于大图像(例如640×480)中的所有瓦片/窗口呢?
我可以做的(以下是低效的代码!)
x_train = np.arange(25*25*1000).reshape(25,25,1000) # 一些伪训练数据y_train = np.arange(1000) # 一些伪训练标签clf = RandomForestClassifier()clf.train( ... ) # 训练分类器img = np.arange(640*480).reshape(640,480) # 一些伪图像数据clf.magicallyApplyToAllSubwindoes( img )
如何将clf
应用于img
中的所有25×25窗口呢?
回答:
或许你正在寻找类似于skimage.util.view_as_windows
的东西。请务必阅读文档末尾关于内存使用情况的注意事项。
如果你能承受使用view_as_windows
的方法,你可以通过像这样重塑返回的数组来神奇地从图像中的所有窗口生成测试数据:
import numpy as npfrom skimage import iofrom skimage.util import view_as_windowsimg = io.imread('image_name.png') window_shape = (25, 25)windows = view_as_windows(img, window_shape) n_windows = np.prod(windows.shape[:2])n_pixels = np.prod(windows.shape[2:])x_test = windows.reshape(n_windows, n_pixels)clf.apply(x_test)