هذا هو إطار لتشغيل نماذج التعلم العميق المشتركة لمهام تحليل السحابة النقطة ضد القياس الكلاسيكي. يعتمد اعتمادًا كبيرًا على Pytorch الهندسي و Facebook Hydra.
يسمح الإطار ببناء النموذج العجاف والمعقد مع الحد الأدنى من الجهد والتكاثر الكبير. كما أنه يوفر واجهة برمجة تطبيقات عالية المستوى لإضفاء الطابع الديمقراطي على التعلم العميق على PointClouds. شاهد ورقتنا في 3DV للحصول على نظرة عامة على القدرات الإطارية ومعايير الشبكات الحديثة.
لإعداد أكثر سلاسة ، يوصى باستخدام Docker. يضمن هذا النهج التوافق ويخفف من عملية التثبيت ، خاصة عند العمل مع إصدارات محددة من CUDA و Pytorch. يمكنك سحب صورة Docker المناسبة على النحو التالي:
docker pull pytorch/pytorch:1.10.0-cuda11.3-cudnn8-develبعد إعداد البيئة (إما أصليًا أو من خلال Docker) ، قم بتثبيت حزمة Python المطلوبة باستخدام PIP:
pip install torch-points3d├─ benchmark # Output from various benchmark runs
├─ conf # All configurations for training nad evaluation leave there
├─ notebooks # A collection of notebooks that allow result exploration and network debugging
├─ docker # Docker image that can be used for inference or training
├─ docs # All the doc
├─ eval.py # Eval script
├─ find_neighbour_dist.py # Script to find optimal #neighbours within neighbour search operations
├─ forward_scripts # Script that runs a forward pass on possibly non annotated data
├─ outputs # All outputs from your runs sorted by date
├─ scripts # Some scripts to help manage the project
├─ torch_points3d
├─ core # Core components
├─ datasets # All code related to datasets
├─ metrics # All metrics and trackers
├─ models # All models
├─ modules # Basic modules that can be used in a modular way
├─ utils # Various utils
└─ visualization # Visualization
├─ test
└─ train.py # Main script to launch a trainingكفلسفة عامة ، قسمنا مجموعات البيانات والنماذج حسب المهمة. على سبيل المثال ، تحتوي مجموعات البيانات على خمس مجلدات فرعية:
حيث يحتوي كل مجلد على مجموعة البيانات المتعلقة بكل مهمة.
يرجى الرجوع إلى وثائقنا للوصول إلى بعض هذه النماذج مباشرة من واجهة برمجة التطبيقات (API) ومشاهدة أجهزة الكمبيوتر المحمولة الخاصة بنا لـ KPConv و RSConv لمزيد من التفاصيل.
المهام | أمثلة |
|---|---|
تصنيف / تجزئة الجزء | ![]() |
تجزئة | ![]() |
الكشف عن الكائن | ![]() |
تجزئة panoptic | ![]() |
تسجيل | ![]() |
سكان من أنجيلا داي وآخرون. : Scannet: عمليات إعادة بناء ثلاثية الأبعاد ذاتية للمشاهد الداخلية
S3dis من Iro Armeni et al. : بيانات مفصل 2D-3D-الدلالي لفهم المشهد الداخلي
* S3DIS 1x1
* S3DIS Room
* S3DIS Fused - Sphere | Cylinder
* S3DIS Fused - Sphere | Cylinder
3DMatch من Andy Zeng et al. : 3DMatch: تعلم الواصفات الهندسية المحلية من عمليات إعادة بناء RGB-D
معيار Iralab من Simone Fontana et al. : معيار لخوارزميات تسجيل النقاط ، تتكون من بيانات من:
kitti odometry مع مواقف تصحيح (بفضل @humanpose1) من A. Geiger et al : هل نحن مستعدون للقيادة المستقلة؟ جناح كيتي رؤية الرؤية
نحن ندعم حاليًا Minkowski Engine> V0.5 و Torchsparse> = v1.4.0 كخلفية للتلوين المتفرق. يجب تثبيت هذه الحزم بشكل مستقل من Torch Points3D ، يرجى اتباع تعليمات التثبيت واستكشاف الأخطاء وإصلاحها على المستودعات المعنية. في الوقت الحالي ، يوضح MinkowskiEngine هنا (شكرًا لك كريس تشوي) تدريبًا أسرع. يرجى العلم أن torchsparse لا يزال في بيتا ولا يدعم تدريب وحدة المعالجة المركزية فقط.
بمجرد قيامك بإعداد أحد هذين إطار العمل المتفرقة ، يمكنك البدء في استخدامه ، فهو عالي المستوى لتحديد العمود الفقري UNET أو مجرد تشفير:
from torch_points3d . applications . sparseconv3d import SparseConv3d
model = SparseConv3d ( "unet" , input_nc = 3 , output_nc = 5 , num_layers = 4 , backend = "torchsparse" ) # minkowski by default يمكنك أيضًا تجميع شبكاتك الخاصة باستخدام الوحدات النمطية المتوفرة في torch_points3d/modules/SparseConv3d/nn . على سبيل المثال ، إذا كنت ترغب في استخدام الواجهة الخلفية torchsparse فيمكنك القيام بما يلي:
import torch_points3d . modules . SparseConv3d as sp3d
sp3d . nn . set_backend ( "torchsparse" )
conv = sp3d . nn . Conv3d ( 10 , 10 )
bn = sp3d . nn . BatchNorm ( 10 ) تتيح الدقة المختلطة انخفاض الذاكرة على GPU وأوقات تدريب أسرع بقليل من خلال أداء الالتفاف المتفرّع ، والتجميع ، و OPS التدرج في float16 . يتم دعم التدريب الدقيق المختلط حاليًا لتدريب CUDA على شبكات SparseConv3d مع الواجهة الخلفية Torchsparse. لتمكين الدقة المختلطة ، تأكد من أن لديك أحدث إصدار من Torchsparse مع pip install --upgrade git+https://github.com/mit-han-lab/torchsparse.git . ثم ، قم بتعيين training.enable_mixed=True في ملفات تكوين التدريب الخاصة بك. إذا تم استيفاء جميع الشروط ، عند بدء التدريب ، سترى إدخال السجل يوضح:
[torch_points3d.models.base_model][INFO] - Model will use mixed precision
ومع ذلك ، إذا حاولت استخدام التدريب الدقيق المختلط مع الواجهة الخلفية غير المدعومة ، فسترى:
[torch_points3d.models.base_model][WARNING] - Mixed precision is not supported on this model, using default precision...
تمكن PretrainedRegistry أي شخص من إضافة نماذجهم التي تم تدريبها مسبقًا re-create مع سطرين فقط من الكود لأغراض finetunning أو production .
[You] قم بتشغيل تدريب النموذج الخاص بك مع WANDB Activated ( wandb.log=True )[TorchPoints3d] بمجرد الانتهاء من التدريب ، ستقوم TorchPoints3d بتحميل طرازك المدرب داخل نقطة التفتيش المخصصة الخاصة بنا إلى Wandb.[You] ضمن فئة PretainedRegistry ، أضف key-value pair ضمن MODELS السمات الخاصة به. يجب أن يصف key النموذج الخاص بك ومجموعة البيانات وتدريب المعلمات المفرطة (ربما أفضل نموذج) ، يجب أن تكون value هي url الذي يشير إلى ملف .pt على WANDB الخاص بك. مثال: المفتاح: pointnet2_largemsg-s3dis-1 وقيمة URL: https://api.wandb.ai/files/loicland/benchmark-torch-points-3d-s3dis/1e1p0csk/pointnet2_largemsg.pt for the pointnet2_largemsg.pt . يحصل المفتاح على pointnet2 largemsg trained on s3dis fold 1 .
[Anyone] من خلال استخدام فئة PretainedRegistry وتوفير key ، سيتم downloaded أوزان النموذج المرتبطة وسيكون النموذج الذي تم تدريبه مسبقًا ready to use مع تحويلاته. [ In ]:
from torch_points3d . applications . pretrained_api import PretainedRegistry
model = PretainedRegistry . from_pretrained ( "pointnet2_largemsg-s3dis-1" )
print ( model . wandb )
print ( model . print_transforms ())
[ Out ]:
== == == == == == == == == == == == == == == == == == == == == == == == == = WANDB URLS == == == == == == == == == == == == == == == == == == == == == == == == == == ==
WEIGHT_URL : https : // api . wandb . ai / files / loicland / benchmark - torch - points - 3 d - s3dis / 1e1 p0csk / pointnet2_largemsg . pt
LOG_URL : https : // app . wandb . ai / loicland / benchmark - torch - points - 3 d - s3dis / runs / 1e1 p0csk / logs
CHART_URL : https : // app . wandb . ai / loicland / benchmark - torch - points - 3 d - s3dis / runs / 1e1 p0csk
OVERVIEW_URL : https : // app . wandb . ai / loicland / benchmark - torch - points - 3 d - s3dis / runs / 1e1 p0csk / overview
HYDRA_CONFIG_URL : https : // app . wandb . ai / loicland / benchmark - torch - points - 3 d - s3dis / runs / 1e1 p0csk / files / hydra - config . yaml
OVERRIDES_URL : https : // app . wandb . ai / loicland / benchmark - torch - points - 3 d - s3dis / runs / 1e1 p0csk / files / overrides . yaml
== == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == ==
pre_transform = None
test_transform = Compose ([
FixedPoints ( 20000 , replace = True ),
XYZFeature ( axis = [ 'z' ]),
AddFeatsByKeys ( rgb = True , pos_z = True ),
Center (),
ScalePos ( scale = 0.5 ),
])
train_transform = Compose ([
FixedPoints ( 20000 , replace = True ),
RandomNoise ( sigma = 0.001 , clip = 0.05 ),
RandomRotate (( - 180 , 180 ), axis = 2 ),
RandomScaleAnisotropic ([ 0.8 , 1.2 ]),
RandomAxesSymmetry ( x = True , y = False , z = False ),
DropFeature ( proba = 0.2 , feature = 'rgb' ),
XYZFeature ( axis = [ 'z' ]),
AddFeatsByKeys ( rgb = True , pos_z = True ),
Center (),
ScalePos ( scale = 0.5 ),
])
val_transform = Compose ([
FixedPoints ( 20000 , replace = True ),
XYZFeature ( axis = [ 'z' ]),
AddFeatsByKeys ( rgb = True , pos_z = True ),
Center (),
ScalePos ( scale = 0.5 ),
])
inference_transform = Compose ([
FixedPoints ( 20000 , replace = True ),
XYZFeature ( axis = [ 'z' ]),
AddFeatsByKeys ( rgb = True , pos_z = True ),
Center (),
ScalePos ( scale = 0.5 ),
])
pre_collate_transform = Compose ([
PointCloudFusion (),
SaveOriginalPosId ,
GridSampling3D ( grid_size = 0.04 , quantize_coords = False , mode = mean ),
])نستخدم الشعر لإدارة الحزم لدينا. من أجل البدء ، استنساخ هذه المستودعات وتشغيل الأمر التالي من جذر الريبو
poetry install --no-root
سيؤدي ذلك إلى تثبيت جميع التبعيات المطلوبة في بيئة افتراضية جديدة.
تنشيط البيئة
poetry shellيمكنك التحقق من أن التثبيت قد نجح من خلال التشغيل
python -m unittest -v لدعم pycuda (مطلوب فقط لمهام التسجيل):
pip install pycudapoetry run python train.py task=segmentation models=segmentation/pointnet2 model_name=pointnet2_charlesssg data=segmentation/shapenet-fixedويجب أن ترى شيئًا كهذا
يعد التكوين لـ PointNet ++ مثالًا جيدًا على كيفية تحديد النموذج وهو على النحو التالي:
# PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space (https://arxiv.org/abs/1706.02413)
# Credit Charles R. Qi: https://github.com/charlesq34/pointnet2/blob/master/models/pointnet2_part_seg_msg_one_hot.py
pointnet2_onehot :
architecture : pointnet2.PointNet2_D
conv_type : " DENSE "
use_category : True
down_conv :
module_name : PointNetMSGDown
npoint : [1024, 256, 64, 16]
radii : [[0.05, 0.1], [0.1, 0.2], [0.2, 0.4], [0.4, 0.8]]
nsamples : [[16, 32], [16, 32], [16, 32], [16, 32]]
down_conv_nn :
[
[[FEAT, 16, 16, 32], [FEAT, 32, 32, 64]],
[[32 + 64, 64, 64, 128], [32 + 64, 64, 96, 128]],
[[128 + 128, 128, 196, 256], [128 + 128, 128, 196, 256]],
[[256 + 256, 256, 256, 512], [256 + 256, 256, 384, 512]],
]
up_conv :
module_name : DenseFPModule
up_conv_nn :
[
[512 + 512 + 256 + 256, 512, 512],
[512 + 128 + 128, 512, 512],
[512 + 64 + 32, 256, 256],
[256 + FEAT, 128, 128],
]
skip : True
mlp_cls :
nn : [128, 128]
dropout : 0.5 نحن نقدم برنامجًا نصيًا لتشغيل نموذج معين مسبقًا على البيانات المخصصة التي قد لا يتم شرحها. ستجد مثالاً على هذا لمهمة تجزئة الجزء على Shapenet. تمامًا كما هو الحال بالنسبة لبقية قاعدة بيانات الكود ، يحدث معظم التخصيص من خلال ملفات التكوين ويمكن تمديد المثال المقدم إلى مجموعات بيانات أخرى. يمكنك أيضًا إنشاء خاص بك من هناك. بالعودة إلى مهمة تجزئة الأجزاء ، قل أن لديك مجلد مليء بالغيوم التي تعرفها هي طائرات ، ولديك نقطة تفتيش من طراز مدرب على الطائرات وربما فئات أخرى ، ببساطة تحرير config.yaml و Shapenet.yaml وتشغيل الأمر التالي:
python forward_scripts/forward.py سيتم وضع نتيجة التشغيل الأمامي في output_folder المحدد ويمكنك استخدام دفتر الملاحظات المقدم لاستكشاف النتائج. فيما يلي مثال على نتيجة استخدام نموذج مدرب على قبعات فقط للعثور على أجزاء من الطائرات والقبعات.
أخيرًا ، بالنسبة للأشخاص المهتمين بنشر نماذجهم على بيئات الإنتاج ، فإننا نقدم Dockerfile بالإضافة إلى نص بناء. لنفترض أنك قمت بتدريب شبكة للتجزئة الدلالية التي أعطت الوزن <outputfolder/weights.pt> .
cd docker
./build.sh outputfolder/weights.pt يمكنك بعد ذلك استخدامه لتشغيل تمريرة للأمام على جميع السحب النقطة في input_path وإنشاء النتائج في output_path
docker run -v /test_data:/in -v /test_data/out:/out pointnet2_charlesssg:latest python3 forward_scripts/forward.py dataset=shapenet data.forward_category=Cap input_path= " /in " output_path= " /out " يركض خيار -v دليلًا محليًا إلى نظام ملفات الحاوية. على سبيل المثال في سطر الأوامر أعلاه ، سيتم تركيب /test_data/out في الموقع /out . نتيجة لذلك ، ستكون جميع الملفات المكتوبة داخل /out متوفرة في المجلد /test_data/out على جهازك.
ننصح باستخدام snakeviz و cProfile
استخدم cprofile لملف تعريف الرمز الخاص بك
poetry run python -m cProfile -o {your_name}.prof train.py ... debugging.profiling=True
وتصور النتائج باستخدام snakeviz.
snakeviz {your_name}.prof
من الممكن أيضًا استخدام torch.utils.bottleneck
python -m torch.utils.bottleneck /path/to/source/script.py [args]
تأكد من تثبيت Pytorch 1.8.0 على الأقل والتحقق من أن cuda/bin و cuda/include في $PATH الخاص بك و $CPATH على التوالي ، على سبيل المثال:
$ python -c "import torch; print(torch.__version__)"
>>> 1.8.0
$ echo $PATH
>>> /usr/local/cuda/bin:...
$ echo $CPATH
>>> /usr/local/cuda/include:...
عندما نقوم بتحديث إصدار Pytorch الذي يتم استخدامه ، يجب إعادة تثبيت الحزم المترجمة ، وإلا فإنك ستعمل على خطأ يبدو مثل هذا:
... scatter_cpu.cpython-36m-x86_64-linux-gnu.so: undefined symbol: _ZN3c1012CUDATensorIdEv
يمكن أن يحدث هذا للمكتبات التالية:
هناك طريقة سهلة لإصلاح ذلك وهي تشغيل الأمر التالي مع تنشيط Virtual Env:
pip uninstall torch-scatter torch-sparse torch-cluster torch-points-kernels -y
rm -rf ~/.cache/pip
poetry install
يمكن أن يحدث هذا عند محاولة تشغيل الكود على وحدة معالجة الرسومات المختلفة عن المكتبة المستخدمة لتجميع مكتبة torch-points-kernels . قم بإلغاء تثبيت torch-points-kernels ، و Clear Cache ، وإعادة التثبيت بعد تعيين متغير بيئة TORCH_CUDA_ARCH_LIST . على سبيل المثال ، للتجميع باستخدام Tesla T4 (Turing 7.5) وتشغيل الرمز على Tesla V100 (Volta 7.0) الاستخدام:
export TORCH_CUDA_ARCH_LIST="7.0;7.5"
انظر هذا الرسم البياني المفيد لمزيد من توافق الهندسة المعمارية.
يرفع OSError: [WinError 6] The handle is invalid / wandb: ERROR W&B process failed to launch WANDB حاليًا على Windows (انظر هذه المشكلة) ، وهو الحل هو استخدام وسيطة سطر الأوامر wandb.log=false
نحن نقدم Pyvista القائم على دفتر الملاحظات واللوحة التي تتيح لك استكشاف تجاربك السابقة بصريًا. عند استخدام Jupyter Lab ، سيتعين عليك تثبيت امتداد:
jupyter labextension install @pyviz/jupyterlab_pyviz
قم بالتشغيل من خلال دفتر الملاحظات ويجب أن ترى لوحة معلومات تشبه ما يلي:
المساهمات مرحب بها! يسألك الوحيد هو أنك تلتزم بالتصميم وأنك تضيف اختبارات أثناء إضافة المزيد من الميزات!
للتصميم ، يمكنك استخدام السنانير قبل الالتزام لمساعدتك:
pre-commit install
سيتم تشغيل سلسلة من الشيكات لك وقد تضطر إلى إضافة الملفات الثابتة مرة أخرى إلى الملفات المخبأة.
عندما يتعلق الأمر بـ DocStrings ، نستخدم docstrings Numpy Style ، لأولئك الذين يستخدمون رمز Visual Studio ، هناك امتداد رائع يمكن أن يساعد في ذلك. قم بتثبيته وضبط التنسيق على Numpy ويجب أن تكون على ما يرام!
Finaly ، إذا كنت ترغب في إجراء محادثة مباشرة معنا ، فلا تتردد في الانضمام إلى Slack ، فقط قم بإطلاق النار علينا بريدًا إلكترونيًا وسنضيف لك.
إذا وجدت عملنا مفيدًا ، فلا تتردد في الاستشهاد به:
@inproceedings{
tp3d,
title={Torch-Points3D: A Modular Multi-Task Frameworkfor Reproducible Deep Learning on 3D Point Clouds},
author={Chaton, Thomas and Chaulet Nicolas and Horache, Sofiane and Landrieu, Loic},
booktitle={2020 International Conference on 3D Vision (3DV)},
year={2020},
organization={IEEE},
url = {url{https://github.com/nicolas-chaulet/torch-points3d}}
}
ويرجى أيضًا تضمين استشهاد بالنماذج أو مجموعات البيانات التي استخدمتها في تجاربك!