如何将我的图像和标签分割,以便它们可以作为机器学习的特征使用?

我正在尝试使用像SVM, RandomForest等机器学习方法进行像素分类以实现图像分割。

我通过使用图像的灰度值和RGB值,并将每个像素与其真实标签关联,成功获得了可接受的结果。为了避免发布完整代码,以下是我在使用完整图像时创建特征和标签数组的方式:

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)feature_img = np.zeros((img.shape[0], img.shape[1], 4))     # 容器数组,前三个维度用于RGB值,最后一个维度用于灰度值feature_img[:, :, :3] = imgfeature_img[:, :, 3] = img_grayfeatures = feature_img.reshape(feature_img.shape[0] * feature_img.shape[1], feature_img.shape[2])gt_features = gt_img.reshape(gt_img.shape[0] * gt_img.shape[1], 1)

对于大小为512*512的图像,上述代码将生成形状为[262144, 4]的特征和形状为[262144, 1]的相应gt_feature。

这为我提供了sklearn.svm.SVCxy,如上所述,这运行得很好…但图像非常嘈杂…由于SVM在高维数据上表现良好,我打算通过将图像分割成窗口来探索这一点。

基于上述代码,我想将大小为[512, 1024]的图像分割成大小为[64*64]的块,并使用这些块来训练SVM。按照上述格式,我编写了以下代码来将图像分割成块,然后使用.reshape()将其转换为分类器所需的格式,但结果并不如预期:

win_size = 64feature_img = blockshaped(img_gray, win_size, win_size)feature_label = blockshaped(gt_img, win_size, win_size)# 上述返回形状为[128, 64, 64]的数组features = feature_img.reshape(feature_img.shape[1] * feature_img.shape[2], feature_img.shape[0])# features的形状为[4096, 128] label_ = feature_label.reshape(feature_label.shape[0] * feature_label.shape[1] * feature_label.shape[2], 1)# 这,如预期返回``[524288, 1]``

函数blockshaped来自此处提供的答案:将2D数组分割成更小的2D数组

我想要增加特征数据的维度,因为众所周知SVM在高维数据上表现良好,我也想看看基于块或补丁的方法是否有助于分割结果。

我应该如何安排我已经分解成窗口的数据,使其能够用于训练分类器?


回答:

我已经思考了你的问题5个小时,还阅读了一些书籍来寻找答案!如果你在做分割,你的方法完全错误!当我们使用机器学习方法进行分割时,我们绝对不会改变任何像素的位置。不仅在SVM中,在神经网络中进行分割时我们也不使用池化方法,即使在CNN中我们也使用Same填充来避免像素移动。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注