{"name": "Aerial LiDAR Classifier", "package_name": "Aerial_LiDAR_Classifier", "version": "1.3.2", "experimental": false, "qgis_min": "3.34.0", "qgis_max": "4.99.0", "downloads": 33, "uploaded_by": "Kharroubi", "upload_datetime": "2026-10-23T14:12:02.651220", "changelog": "1.3.2\n- \"CUDA driver error\" at the first GPU allocation (shared vGPU\nprofiles such as an A10-8Q, some Windows drivers with RTX A6000\nand other cards), followed by an allocator assertion on the next\nrun: the plugin no longer forces PyTorch's expandable-segments\nallocator. It asks the driver, confirms with a small probe\nallocation, and uses the standard allocator where expandable\nsegments cannot work. The log says which allocator serves the run.\n- New \"GPU memory allocator\" choice in Advanced parameters\n(Automatic, Expandable segments, Standard allocator), also used by\nProcessing.\n- Mobile mapping and Railway classifiers on RTX 50 series GPUs:\nspconv has no CUDA 12.8 build, so Setup installs its CUDA 12.6\nbuild next to the CUDA 12.8 PyTorch; the NVIDIA driver compiles\nthe kernels for the GPU when a LitePT-L model first loads (10 to\n30 s, reported in the log). Environments set up by earlier\nreleases on these GPUs are completed in place (\"Add missing\npackages\"), nothing is re-downloaded.\n1.3.1\n- Setup on the Flathub QGIS (and other QGIS builds with their own\nNumPy 1.x on Python 3.13): installing torchvision failed with\n\"No solution found when resolving dependencies\", because NumPy 1.x\nhas no wheel for Python 3.13. Setup now picks SciPy and the other\npackages that run with QGIS's NumPy instead of installing it.\n- NVIDIA GPU detection works without nvidia-smi: when the program is\nmissing (inside the Flathub QGIS) or does not answer, the GPU is\nread from the driver library (NVML). nvidia-smi gets 20 s to wake\na laptop GPU instead of 5 s.\n- Setup on RTX 50 series GPUs says that the Airborne classifier runs\nwith SegFormer 3D on the GPU there (spconv, needed by LitePT-L, has\nno CUDA 12.8 build yet).\n1.3.0\n- New Railway classifier: LitePT-L Railway (5 cm, XYZ only) with\nseven classes: ground and track bed, rail, pole (catenary masts,\nportals, supports), wire, vegetation, fence, other. Default codes\nfollow ASPRS where a class exists (Rail 10, Wire conductor 14,\nTransmission tower 15 for masts); fences get 64, the first\nuser-definable code. Every code is editable, as for mobile\nmapping. NVIDIA CUDA GPU. The weights download automatically\nand are SHA-256 verified.\n- The dock and Processing offer three classifiers: Airborne, Mobile\nmapping and Railway. SegFormer 3D is no longer a separate choice:\nthe Airborne classifier runs it where LitePT-L cannot (no NVIDIA\nGPU, Apple Silicon, GPUs without spconv) and the status and log\nsay so.\n- Processing: new algorithm \"Classify LiDAR point cloud\"\n(aeriallidar:classify_point_cloud, CLASSIFIER 0 Airborne,\n1 Mobile mapping, 2 Railway). The algorithm of 1.0 to 1.2\n(aeriallidar:classify_lidar, MODEL) still runs exactly the model\nit names (3 is LitePT-L Railway) and is hidden from the Toolbox,\nso saved models and scripts keep their results.\n- The output-code editor shows the ASPRS meaning of every code.\n- Setup states the real download size of the model weights.\n1.2.1\n- Fix: on QGIS builds that ship NumPy 1.x, the LitePT-L models\ncould not load (\"module 'numpy' has no attribute 'long'\"):\nSetup installed a SciPy that needs NumPy 2. Setup now installs\npackages that match QGIS's own NumPy on those builds; builds\nwith NumPy 2 install exactly as before. Existing installs on\nsuch builds: restart QGIS, then run Plugins > LiDAR AI\nClassifier > Repair dependencies.\n- The LitePT status names this mismatch and the steps to fix it.\n1.2.0\n- New model for mobile mapping LiDAR: LitePT-L Mobile Mapping\n(MLS, 5 cm), nine classes, NVIDIA CUDA. Weights download\nautomatically on first use and are SHA-256 verified.\n- Fix a Processing shutdown crash after a first-use model\ndownload by retiring download progress callbacks safely.\n- Editable output codes for the mobile mapping classes, saved per\nmodel, with a reset to the defaults (pole-like 64, vehicle 65,\nfence/barrier 66 are user-defined codes). Processing parameter\nOUTPUT_CODES_JSON.\n- The visible name is now LiDAR AI Classifier. The package, saved\nsettings, model cache and Processing algorithm ID do not change.\nThe existing models are labelled Airborne and keep their\nProcessing MODEL indexes (0 and 1); the new model is 2.\n- Classified layers are styled with the codes actually written, in\n2D and 3D, including merged classes. Fixes the 3D style on QGIS 4.\n- Outputs with existing extra attributes get a COPC viewing copy\nwhen they are loaded, for QGIS builds whose PDAL reader rejects\nthem. The classified LAS/LAZ is not modified.\n- LitePT dependency checks are retried after a repair and report\nthe failing package; \"Use GPU\" switched off and CPU-only PyTorch\nare reported as such.\n- RTX 5000 Ada is no longer mistaken for an RTX 50 (Blackwell) card\nwhen the compute capability is unknown.\n1.1.2\n- Stable release: no longer marked experimental.\n- The dependency installer starts its helper programs (portable\nPython, uv, nvidia-smi) through Qt's QProcess.\n- Errors that are safe to ignore are now logged at debug level,\nand internal checks raise explicit errors. The plugin passes\nthe plugins.qgis.org security scan with no configuration file.\n- Cancel during the dependency setup stops the running step at\nonce on Windows.\n1.1.0\n- New default model on NVIDIA GPUs: LitePT-L Airborne, a point\ntransformer with 10 cm voxels and 8 classes. The 3D\nSegFormer stays available and is the model on CPU and Apple\nSilicon. Model selector in the dock, MODEL parameter in\nProcessing.\n- Model weights download automatically, during setup or on the\nfirst run of a model, and are SHA-256 verified before every use.\n- QGIS 4 support, tested on QGIS 4.2 (Qt 6) and 3.44 LTR,\nincluding the first-run setup. (GitHub #6)\n- Redesigned dock: model status with a one-click switch when a\nmodel cannot run on the computer, a hint saying what is missing\nbefore Run, and the elapsed time with an Open folder button\nwhen a run ends.\n- Safer output: results are written atomically, a batch can no\nlonger overwrite one of its own inputs, every attribute, VLR and\nEVLR is kept, truncated files are refused instead of producing\na shorter output, and a custom label field keeps the raw model\nclasses (cars, trucks and fences stay distinct).\n- Installer: prebuilt packages only, certificate checks always\non, no silent switch from GPU to CPU (a failed GPU setup offers\na one-click CPU install), and Plugins > Aerial LiDAR Classifier\n> Repair dependencies. Existing environments are rebuilt once.\n- Units: vertical units from GeoTIFF vertical CRS codes;\ngeographic (degree) files are refused even with a units\noverride.\n- The algorithm is available from qgis_process (command line).\n- Optional link to the author's live LiDAR course in the panel,\nAbout and the plugin menu; it can be hidden.\n1.0.3\n- Fix: the plugin could not open on QGIS builds with Python\n3.9 to 3.11 (Ubuntu 22.04, Debian 12, macOS 3.34):\n\"SyntaxError: unterminated string literal\" in venv_manager.py.\nAll files now compile on Python 3.9+. (GitHub #3)\n- Fix: files in feet (most US LiDAR) were fed to the model\nunconverted, so buildings came out as Wire-Conductor and\nTransmission Tower and the run was about 13x slower. The unit\nis now read from the LAS CRS and converted to metres for the\nmodel; a manual override exists in the dock (Advanced\nparameters > Input units) and in Processing (UNITS).\n(GitHub #5, #2)\n- Fix: flat tiles (less than 5.12 m of relief) were classified\nalmost entirely as Building; the block grid now always covers\nthe extent and unpredicted points are reported as ASPRS 0.\n- Fix: fresh installs could end up with a CPU-only torch because\nthe second install phase let uv replace the CUDA torch with\nPyPI's newest release; the CUDA build is now pinned.\n- Fix: certificate verification for the package hosts is on by\ndefault; it is relaxed only after a TLS failure, with a warning.\n- Fix: a failed CUDA cascade could leave the venv without torch\nwhile it was reported ready.\n- Fix: Apple Silicon crashed at run time (\"Torch not compiled\nwith CUDA enabled\"); the device is now passed end to end.\n- Fix: the Processing algorithm loaded the result layer from the\nworker thread; it is now loaded on completion, and the\nclassified file is exposed as the OUTPUT_FILE output.\n- Fix: version shown in About and the Processing provider.\n- Fix: auto tile size on corridor-shaped extents; sliver tiles.\n- Streaming mode uses 1 byte per point for predictions instead\nof 4.\n1.0.2\n- Fix: Linux install failed at the venv pre-flight check with\n\"error while loading shared libraries: libpython3.12.so.1.0:\ncannot open shared object file\" on every distro that uses\npython-build-standalone (i.e. all of them). The\n`python -m venv --copies` flag copies the standalone python3\nbinary into venv/bin/ but does NOT copy the libpython next\nto it (venv has no notion that python-build-standalone\nships libpython as a separate file). After the copy, the\nbinary's RPATH=$ORIGIN/../lib resolves to an empty\nvenv/lib/ and every invocation dies. `--copies` was added\nto dodge Windows AV quarantine of the redirector launcher.\nIt is now applied only on Windows; Linux and macOS use\nsymlinks (the default), which point back at the standalone\ntree so the RPATH lookup still finds libpython.\n- Fix: \"Use GPU\" checkbox stayed unchecked across QGIS sessions\nafter a fresh install. The dock's closeEvent persisted the\ncheckbox state even when the GPU probe had forced it off\n(torch not yet importable, or CUDA wheel/driver mismatch\nduring the cu128 -> cu118 cascade). The False stuck and left\nusers silently on CPU on the next launch. The plugin now\nonly persists the GPU preference when the user could\nactually choose it (i.e. the checkbox is enabled), and a\none-time settings migration resets the stale False on first\nlaunch so existing v1.0.1 users get GPU back automatically.\n- Fix: streaming I/O no longer silently drops the trailing\npartial chunk on very large LAS files. v1.0.1 skipped the\nlast few thousand points whenever laspy hit\n\"buffer size must be a multiple of element size\" at EOF.\nThe chunk loop now uses read_points(n) directly and falls\nback to a raw-byte recovery path that decodes every\nwhole-point-record left on disk, so the streaming output\nhas the same point count as the input.\n- Polish: trimmed the long About text in the QGIS Plugin\nManager so the rating widget is visible without scrolling.\n1.0.1\n- Fix: corporate SSL inspection blocking the install. uv now\nuses the OS native TLS (--native-tls) so Windows-installed\ncorporate CAs are trusted, and download.pytorch.org is in\nthe allow-insecure-host list alongside pypi.org and\nfiles.pythonhosted.org. Same flag added to the pip code path\nvia --trusted-host.\n- Fix: Linux first-install failed at ensurepip step because\npython-build-standalone Linux tarballs do not ship the\nbundled pip wheel. The venv is now created with --without-pip\n(we use uv for all package installs anyway).\n- Fix: CUDA wheel selection now cascades through cu128 -> cu126\n-> cu124 -> cu121 -> cu118 instead of giving up at the first\ndriver-version miss. Recovers GPU acceleration for NVIDIA\ndrivers older than 550.\n- Fix: cap torch version per cuda index (cu118/cu121 -> torch\n<2.6, cu124 -> torch <2.8) so uv no longer picks the latest\n+cpu wheel from the cuda index instead of the latest +cuXXX.\n- Add: install marker recording the plugin version that built\nthe venv. On version mismatch the Setup dock reopens with a\none-click Reinstall that wipes the stale venv automatically.\n- Add: classification-coloured 3D renderer auto-attached to\nloaded layers so the 3D Map View renders points in 3D out of\nthe box.\n1.0.0\n- Initial public release on the QGIS plugin repository\n- 3D SegFormer (UrbanFiltering, TreeAIBox / NRCan) integration\n- QGIS Processing algorithm + provider (Toolbox, Modeler, qgis_process CLI)\n- Isolated per-user venv dependency installer (PyTorch CPU /\nCUDA 12.1 / 12.4 / 12.6 / 12.8), compute-capability- and\ndriver-version-aware wheel selection\n- Background QgsTask with progress and cancellation\n- LAS / LAZ / COPC input; LAS or LAZ output (matches input)\n- Spatial tiling and streaming I/O for files larger than RAM\n- Optional automatic loading of results as point-cloud layers\n- SHA-256 verification of downloaded model weights\n- Network calls go through QgsBlockingNetworkRequest (proxy /\nauth / certificates honoured per QGIS plugin guidelines)", "external_deps": null, "download_url": "https://plugins.qgis.org/plugins/Aerial_LiDAR_Classifier/version/1.3.2/download/"}