Skip to content
Snippets Groups Projects
Commit 589e542a authored by Maciej Wielgosz's avatar Maciej Wielgosz
Browse files

fine grained pipeline is complete

parent e4de42d6
Branches
Tags
No related merge requests found
......@@ -55,7 +55,7 @@ def remove_leafoff_files(data_folder):
os.remove(os.path.join(root, file))
def merge_ply_files(data_folder, output_file):
def merge_ply_files(data_folder, output_file='output_instance_segmented.ply'):
"""
data_folder: the folder where the ply files are stored
"""
......@@ -71,13 +71,21 @@ def merge_ply_files(data_folder, output_file):
data["pipeline"].append({"type": "filters.merge", "inputs": tags})
data["pipeline"].append({"type":"writers.ply", "filename":os.path.join(data_folder, output_file)})
if output_file == 'output_instance_segmented.ply':
# if the output file is the default one, then we want to save it in the data folder
data["pipeline"].append({"type":"writers.ply", "filename":os.path.join(data_folder, output_file)})
else:
# if the output file is not the default one, then we want to save it the target folder
data["pipeline"].append({"type":"writers.ply", "filename":output_file})
print("Merging was done for {} number of files".format(len(tags)))
# print where the file is saved
logging.info("The file is saved in: " + os.path.join(data_folder, output_file))
logging.info("Merging was done for {} number of files".format(len(tags)))
pipeline = pdal.Pipeline(json.dumps(data))
pipeline.execute()
logging.info("Done")
def main(data_folder, output_file="output_instance_segmented.ply"):
......@@ -109,7 +117,16 @@ if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Label the instances in the ply files.')
parser.add_argument('--data_folder', type=str, help='The folder where the ply files are stored')
parser.add_argument('--output_file', help='The output file name.', default="output_instance_segmented.ply")
parser.add_argument('--only_merging', action='store_true', help='Only merge the ply files')
args = parser.parse_args()
main(args.data_folder)
if args.only_merging:
print("Only merging the ply files")
merge_ply_files(args.data_folder, args.output_file)
else:
print("Labeling instances in ply files and merging them afterwards")
main(args.data_folder, args.output_file)
......@@ -138,7 +138,9 @@ done
# do merging of the instance segmented point clouds
for instance_segmented_point_cloud in $data_folder/instance_segmented_point_clouds/*; do
python nibio_preprocessing/merging_and_labeling.py --data_folder $instance_segmented_point_cloud
python nibio_preprocessing/merging_and_labeling.py \
--data_folder $instance_segmented_point_cloud \
--output_file $instance_segmented_point_cloud/output_instance_segmented.ply
done
# # create the results folder
......
......@@ -120,26 +120,126 @@ for d in $data_folder/segmented_point_clouds/tiled/*/; do
done
done
# remove all the files in the tiled subfolders except the *segmented.ply and tile_index.dat files
find $data_folder/segmented_point_clouds/tiled/*/ -type f ! -name '*segmented.ply' ! -name 'tile_index.dat' -delete # delete all the files except the segmented.ply files
# delete all the folders in the tiled subfolders
find $data_folder/segmented_point_clouds/tiled/*/* -type d -exec rm -rf {} +
# # # iterate over all files in the input folder and do sematic segmentation
# echo "Starting semantic segmentation"
# for file in $data_folder/*.ply; do
# # python fsct/run.py --point-cloud $file --batch_size 5 --odir $data_folder --model ./fsct/model/model.pth
# python fsct/run.py --point-cloud $file --batch_size 5 --odir $data_folder --verbose
# done
# # merge the segmented point clouds
echo "Merging the segmented point clouds"
# iterate over all the directories in the tiled folder
for d in $data_folder/segmented_point_clouds/tiled/*/; do
# get a base name of the directory
base_name=$(basename $d)
# create a name for the merged file
merged_file_name=$data_folder/segmented_point_clouds/$base_name.segmented.ply
python nibio_preprocessing/merging_and_labeling.py \
--data_folder $d \
--output_file $merged_file_name \
--only_merging
done
# rename all the segmented.ply files to .ply in the tiled subfolders
for file in $data_folder/segmented_point_clouds/tiled/*/*; do
# skip if the file is not a ply file
if [[ $file != *.ply ]]; then
continue
fi
mv -- "$file" "${file%.segmented.ply}.ply"
done
# # move the output of the first step to the input folder of the second step
# mkdir -p $data_folder/segmented_point_clouds
# rename all the folder in the tiled subfolders to .segmented suffix
for d in $data_folder/segmented_point_clouds/tiled/*; do
echo "Renaming $d to ${d%.segmented}"
# mv "$d" "${d%.segmented}"
mv $d{,.segmented}
done
# # move all .segmented.ply files to the segmented_point_clouds folder if they are in the input folder
# find $data_folder/ -type f -name '*.segmented.ply' -exec mv {} $data_folder/segmented_point_clouds/ \;
# # do the tiling and tile index generation
# echo "Tiling and tile index generation"
# python nibio_preprocessing/tiling.py -i $data_folder/segmented_point_clouds/ -o $data_folder/segmented_point_clouds/tiled
# create folder for the output of the second step
mkdir -p $data_folder/instance_segmented_point_clouds
# Do the instances and iterate over all the segmented point clouds
for segmented_point_cloud in $data_folder/segmented_point_clouds/*.segmented.ply; do
# get the name of the segmented point cloud
segmented_point_cloud_name=$(basename $segmented_point_cloud)
# get the name of the segmented point cloud without the extension
segmented_point_cloud_name_no_ext="${segmented_point_cloud_name%.*}"
# create a directory for the instance segmented point clouds
mkdir -p $data_folder/instance_segmented_point_clouds/$segmented_point_cloud_name_no_ext
# iterate over all the tiles of the segmented point cloud
for tile in $data_folder/segmented_point_clouds/tiled/$segmented_point_cloud_name_no_ext/*.ply; do
# get the name of the tile
tile_name=$(basename $tile)
# get the name of the tile without the extension
tile_name_no_ext="${tile_name%.*}"
echo "Processing $tile"
# show the output folder
echo "Output folder: $data_folder/instance_segmented_point_clouds/$segmented_point_cloud_name_no_ext/$tile_name_no_ext"
python3 fsct/points2trees.py \
-t $tile \
--tindex $data_folder/segmented_point_clouds/tiled/$segmented_point_cloud_name_no_ext/tile_index.dat \
-o $data_folder/instance_segmented_point_clouds/$segmented_point_cloud_name_no_ext/$tile_name_no_ext \
--n-tiles $N_TILES \
--slice-thickness $SLICE_THICKNESS \
--find-stems-height $FIND_STEMS_HEIGHT \
--find-stems-thickness $FIND_STEMS_THICKNESS \
--pandarallel --verbose \
--add-leaves \
--add-leaves-voxel-length $ADD_LEAVES_VOXEL_LENGTH \
--graph-maximum-cumulative-gap $GRAPH_MAXIMUM_CUMULATIVE_GAP \
--save-diameter-class \
--ignore-missing-tiles \
--find-stems-min-points $FIND_STEMS_MIN_POINTS
done
done
# # create folder for the output of the second step
# do merging of the instance segmented point clouds
for instance_segmented_point_cloud in $data_folder/instance_segmented_point_clouds/*; do
python nibio_preprocessing/merging_and_labeling.py \
--data_folder $instance_segmented_point_cloud \
--output_file $instance_segmented_point_cloud/output_instance_segmented.ply
done
# mkdir -p $data_folder/instance_segmented_point_clouds
# create the results folder
mkdir -p $data_folder/results
# # create the input data folder
mkdir -p $data_folder/results/input_data
# # move input data (ply and las) to the input data folder
find $data_folder/ -maxdepth 1 -type f -name '*.ply' -exec mv {} $data_folder/results/input_data/ \;
find $data_folder/ -maxdepth 1 -type f -name '*.las' -exec mv {} $data_folder/results/input_data/ \;
# # create the segmented point clouds folder
mkdir -p $data_folder/results/segmented_point_clouds
# move segmented point clouds to the segmented point clouds folder
find $data_folder/segmented_point_clouds/ -maxdepth 1 -type f -name '*segmented.ply' -exec mv {} $data_folder/results/segmented_point_clouds/ \;
# # create the instance segmented point clouds folder
mkdir -p $data_folder/results/instance_segmented_point_clouds
# iterate over all the instance segmented point clouds
# move instance segmented point clouds to the instance segmented point clouds folder and rename them
for instance_segmented_point_cloud in $data_folder/instance_segmented_point_clouds/*; do
# get the name of the instance segmented point cloud
instance_segmented_point_cloud_name=$(basename $instance_segmented_point_cloud)
# get the name of the instance segmented point cloud without the extension
instance_segmented_point_cloud_name_no_ext="${instance_segmented_point_cloud_name%.*}"
# move the instance segmented point cloud to the instance segmented point clouds folder
find $instance_segmented_point_cloud/ -maxdepth 1 -type f -name '*.ply' -exec mv {} $data_folder/results/instance_segmented_point_clouds/$instance_segmented_point_cloud_name_no_ext.ply \;
# map the instance segmented point cloud to las file
pdal translate \
$data_folder/results/instance_segmented_point_clouds/$instance_segmented_point_cloud_name_no_ext.ply \
$data_folder/results/instance_segmented_point_clouds/$instance_segmented_point_cloud_name_no_ext.las \
--writers.las.dataformat_id=3 \
--writers.las.scale_x=0.01 \
--writers.las.scale_y=0.01 \
--writers.las.scale_z=0.01 \
--writers.las.extra_dims=all
done
# echo "done with the first step"
\ No newline at end of file
echo "Done"
echo "Results are in $data_folder/results"
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment