【问题标题】:pyspark image dimension reduction with PCA使用 PCA 进行 pyspark 图像降维
【发布时间】:2022-09-30 04:44:17
【问题描述】:

我在 AWS 云中使用 Pyspark 来提取图像特征:

ImageSchema.imageFields
img2vec = F.udf(lambda x: DenseVector(ImageSchema.toNDArray(x).flatten()),
                VectorUDT())
df_vec = df_cat.withColumn(\'original_vectors\', img2vec(\"image\"))
df_vec.show()

标准化数据后:

standardizer = MinMaxScaler(inputCol=\"original_vectors\",
                            outputCol=\"scaledFeatures\",
                            min=-1.0,
                            max=1.0)
#withStd=True, withMean=True)
model_std = standardizer.fit(df_vec)
df_std = model_std.transform(df_vec)
df_std.show()

...当我应用 PCA 进行降维时,我收到一个我无法调试几周的错误 :(

Error_1

Error_2

你能帮我解决这个问题吗?

我使用 Pyspark spark-3.0.3-bin-hadoop2.7

    标签: pyspark pca


    【解决方案1】:
    img2vec = F.udf(lambda x : Vectors.dense(x), VectorUDT())
    
    df = df.withColumn("data_as_vector", img2vec("data_as_resized_array"))
    
    standardizer = StandardScaler(withMean=True, withStd=True, inputCol="data_as_vector", outputCol="scaledFeatures")
    

    对于图像,它需要调整图像数据大小使用此代码,您必须使用调整大小的图像数据;

    def resize_img(img_data, resize=True):
        mode = 'RGBA' if (img_data.nChannels == 4) else 'RGB' 
        img = Image.frombytes(mode=mode, data=img_data.data, size=[img_data.width, img_data.height])
        img = img.convert('RGB') if (mode == 'RGBA') else img
        img = img.resize([224, 224], resample=Image.Resampling.BICUBIC) if (resize) else img
        arr = convert_bgr_array_to_rgb_array(np.asarray(img))
        arr = arr.reshape([224*224*3]) if (resize) else arr.reshape([img_data.width*img_data.height*3])
    
        return arr
    
    def resize_image_udf(dataframe_batch_iterator: Iterator[pd.DataFrame]) -> Iterator[pd.DataFrame]:
        for dataframe_batch in dataframe_batch_iterator:
            dataframe_batch["data_as_resized_array"] = dataframe_batch.apply(resize_img, args=(True,), axis=1)
            dataframe_batch["data_as_array"] = dataframe_batch.apply(resize_img, args=(False,), axis=1)
            yield dataframe_batch
    
    resized_df = df_image.select("image.*").mapInPandas(resize_image_udf, schema)
    

    然后你可以制作standardscaler和PCA;

    model_std = standardizer.fit(df)
    df = model_std.transform(df)
    # algorithm
    pca = PCA(k=n_components, inputCol='data_as_vector', outputCol='pcaFeatures')
    model_pca = pca.fit(df)
    
    # Transformation images
    df = model_pca.transform(df)
    

    我想,我来不及回答你的问题,对不起

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-27
      • 2017-08-28
      • 1970-01-01
      • 2019-07-21
      • 2018-04-15
      • 2017-08-05
      • 2013-03-06
      • 2013-12-31
      相关资源
      最近更新 更多