Как исправить «исключение нулевого указателя» в Spark ML Pipeline? - PullRequest
0 голосов
/ 11 февраля 2019

Я выполняю классификацию изображений, используя фреймы данных spark растровые кадры .Я использую изображения TIF в качестве образца и учебный набор данных на основе Geojson с 4 классами, созданными из одного файла.Для классификации изображений я использую DecisionTreeClassifier, но когда я пытаюсь построить модель, используя все эти данные, она выдает ошибку Caused by: java.lang.NullPointerException: Value at index 0 is null.Исключение вызывается из этой строки .вот полная трассировка стека для ошибки

Вот как я загружаю данные:

object rasterframeclassification extends App {
  object Flattener extends TileReducer(
    (l: Int, r: Int) ⇒ if (isNoData(r)) l else r
  )(
    (l: Double, r: Double) ⇒ if (isNoData(r)) l else r
  )
  implicit val spark = SparkSession.builder().
    master("local").appName("rasterframeclassification").
    config("spark.ui.enabled", "false").
    getOrCreate().
    withRasterFrames
  import spark.implicits._
  implicit val bandCount = PairRDDConverter.forSpatialMultiband(2)
  val tiff =MultibandGeoTiff(getClass.getResource("/raster.tif").getPath)
  val filename = "../biggis-landuse/radar_data/raster.tif"
  val json = Filesystem.readText(getClass.getResource("/training_data.geojson").getPath)
  //println(json)
  val wgs84 = CRS.fromEpsgCode(4326)
  val features = json.extractFeatures[Feature[MultiPolygon, Map[String, String]]]()
  val featuresInt: Seq[Feature[MultiPolygon, Map[String, Int]]] =
    features.map(_.mapData(_.map { case (k, v) => k -> v.toInt }))
  val layers = for {
    f ← featuresInt
    pf = f.reproject(wgs84, tiff.crs)
    raster = pf.geom.rasterizeWithValue(tiff.rasterExtent, f.data("classes"), UByteUserDefinedNoDataCellType(255.toByte))
  } yield raster

  val result = Flattener(layers.map(_.tile))
  val targetCol = "finalraster"
  val training = SinglebandGeoTiff(result,tiff.extent,tiff.crs).  mapTile(_.convert(DoubleConstantNoDataCellType)).
    projectedRaster.toRF(908,597,targetCol)
  def rf =  MultibandGeoTiff(filename).projectedRaster.toRF
  val bandColNames = Array( "tile_1", "tile_2")

Вот как я строю модель:

val abt = rf.spatialJoin(training)
  val exploder = new TileExploder()

  val noDataFilter = new NoDataFilter().
    setInputCols(bandColNames :+ targetCol)
  val assembler = new VectorAssembler().
    setInputCols(bandColNames).
    setOutputCol("features")
  val classifier = new DecisionTreeClassifier().
    setLabelCol(targetCol).
    setFeaturesCol(assembler.getOutputCol)
  val pipeline = new Pipeline().
    setStages(Array(exploder, noDataFilter, assembler, classifier))
  val evaluator = new MulticlassClassificationEvaluator().
    setLabelCol(targetCol).
    setPredictionCol("prediction").
    setMetricName("accuracy")
  val paramGrid = new ParamGridBuilder().
    addGrid(classifier.maxDepth, Array(1,2,3,4)).
    build()
  val trainer = new CrossValidator().
    setEstimator(pipeline).
    setEvaluator(evaluator).
    setEstimatorParamMaps(paramGrid).
    setNumFolds(4)
  val model = trainer.fit(abt)
...