<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 A workflow for classifying a point cloud using point features
The following example will run through the functions to classify a point cloud based on the point neighborhood attributes. This is a very simple example but this of course could be extended to extract very useful information using different classes and subsequent querying of the constituent segments. 
The point cloud in question can be downloaded here
Step1:  Firstly we will calculate the features required to characterise the pointcloud.
These are calculated on 3 scales which by default are k=10, 20 & 30 nearest-neighbours.
If wish to alter this go ahead!
The features are
Step2:  Next we can get training as a numpy array for creating our model
Step3:  Next we create a model, this will be a keras-based dense net in this instance but does not have to be. 
The nnt structure is 32 > 16 > 8 > 32. 
This is not necessarily a good example of a dense nnt structure and is used merely for demo purposes.
Step4:  Finally we classify the point cloud
<ASSISTANT_TASK:>
Python Code:
from geospatial_learn import learning as ln
incloud = "/path/to/Llandinam.ply"
Explanation: A workflow for classifying a point cloud using point features
The following example will run through the functions to classify a point cloud based on the point neighborhood attributes. This is a very simple example but this of course could be extended to extract very useful information using different classes and subsequent querying of the constituent segments. 
The point cloud in question can be downloaded here:
https://drive.google.com/file/d/1DP7wkTqemfux2UkAD_8gZUnzm5GUfShZ/view?usp=sharing
It is derived from UAV imagery via structure from motion. Unzip it and have a look in cloud compare, making the scalar field 'training'.  
The task will classify the scene into roofs, building facades, trees/vegetation and ground classes, which are represented by the training samples seen in the screenshot. 
<img src="figures/llanlabel.png" style="height:300px">
Import the learning module which contains all we need
End of explanation
ln.ply_features(incloud)
Explanation: Firstly we will calculate the features required to characterise the pointcloud.
These are calculated on 3 scales which by default are k=10, 20 & 30 nearest-neighbours.
If wish to alter this go ahead!
The features are:
- anisotropy 
- curvature
- eigenentropy 
- eigen_sum 
- linearity
- omnivariance
- planarity
- sphericity
As well as these, the RGB and normals are used as features. We do not however uses XYZ as these always have negative effect on results.
End of explanation
training = ln.get_training_ply(incld)
Explanation: Next we can get training as a numpy array for creating our model
End of explanation
model = 'path/to/model.h5'
ln.create_model(training, model, clf='keras', cv=5)
Explanation: Next we create a model, this will be a keras-based dense net in this instance but does not have to be. 
The nnt structure is 32 > 16 > 8 > 32. 
This is not necessarily a good example of a dense nnt structure and is used merely for demo purposes.
End of explanation
classify_ply(incloud, model, train_field="training", class_field='label',
                 rgb=True
Explanation: Finally we classify the point cloud
End of explanation
<END_TASK>