Skip to main content

A PyTorch landmarks-only library with 100+ data augmentations, training and inference, can easily install with pip and compatible with albumentations and torchvision.

Project description

torchlm-logo

🤗 Introduction

torchlm is a PyTorch landmarks-only library with 100+ data augmentations, support training and inference. torchlm is aims at only focus on any landmark detection, such as face landmarks, hand keypoints and body keypoints, etc. It provides 30+ native data augmentations and can bind with 80+ transforms from torchvision and albumentations, no matter the input is a np.ndarray or a torch Tensor, torchlm will automatically be compatible with different data types and then wrap it back to the original type through a autodtype wrapper. Further, torchlm will add modules for training and inference in the future.


❤️ Star 🌟👆🏻 this repo to support me if it does any helps to you, thanks ~

🆕 What's New

  • [2022/02/13]: Add 30+ native data augmentations and bind 80+ transforms from torchvision and albumentations.

🛠️ Usage

Requirements

  • opencv-python-headless>=4.5.2
  • numpy>=1.14.4
  • torch>=1.6.0
  • torchvision>=0.9.0
  • albumentations>=1.1.0

Installation

you can install torchlm directly from pypi.

pip3 install torchlm
# install from specific pypi mirrors use '-i'
pip3 install torchlm -i https://pypi.org/simple/

or install from source.

# clone torchlm repository locally
git clone --depth=1 https://github.com/DefTruth/torchlm.git 
cd torchlm
# install in editable mode
pip install -e .

Data Augmentation

torchlm provides 30+ native data augmentations for landmarks and can bind with 80+ transforms from torchvision and albumentations through torchlm.bind method. Further, torchlm.bind provide a prob param at bind-level to force any transform or callable be a random-style augmentation. The data augmentations in torchlm are safe and simplest. Any transform operations at runtime cause landmarks outside will be auto dropped to keep the number of landmarks unchanged. The layout format of landmarks is xy with shape (N, 2), N denotes the number of the input landmarks. No matter the input is a np.ndarray or a torch Tensor, torchlm will automatically be compatible with different data types and then wrap it back to the original type through a autodtype wrapper.

  • use almost 30+ native transforms from torchlm directly
import torchlm
transform = torchlm.LandmarksCompose([
        # use native torchlm transforms
        torchlm.LandmarksRandomScale(prob=0.5),
        torchlm.LandmarksRandomTranslate(prob=0.5),
        torchlm.LandmarksRandomShear(prob=0.5),
        torchlm.LandmarksRandomMask(prob=0.5),
        torchlm.LandmarksRandomBlur(kernel_range=(5, 25), prob=0.5),
        torchlm.LandmarksRandomBrightness(prob=0.),
        torchlm.LandmarksRandomRotate(40, prob=0.5, bins=8),
        torchlm.LandmarksRandomCenterCrop((0.5, 1.0), (0.5, 1.0), prob=0.5),
        # ...
    ])

  • bind 80+ torchvision and albumentations's transforms through torchlm.bind
import torchvision
import albumentations
import torchlm
transform = torchlm.LandmarksCompose([
        # use native torchlm transforms
        torchlm.LandmarksRandomScale(prob=0.5),
        # bind torchvision image only transforms, bind with a given prob
        torchlm.bind(torchvision.transforms.GaussianBlur(kernel_size=(5, 25)), prob=0.5),  
        torchlm.bind(torchvision.transforms.RandomAutocontrast(p=0.5)),
        # bind albumentations image only transforms
        torchlm.bind(albumentations.ColorJitter(p=0.5)),
        torchlm.bind(albumentations.GlassBlur(p=0.5)),
        # bind albumentations dual transforms
        torchlm.bind(albumentations.RandomCrop(height=200, width=200, p=0.5)),
        torchlm.bind(albumentations.Rotate(p=0.5)),
        # ...
    ])
  • bind custom callable array or Tensor functions through torchlm.bind
# First, defined your custom functions
def callable_array_noop(img: np.ndarray, landmarks: np.ndarray) -> Tuple[np.ndarray, np.ndarray]:
    # do some transform here ...
    return img.astype(np.uint32), landmarks.astype(np.float32)

def callable_tensor_noop(img: Tensor, landmarks: Tensor) -> Tuple[Tensor, Tensor]:
    # do some transform here ...
    return img, landmarks
# Then, bind your functions and put it into the transforms pipeline.
transform = torchlm.LandmarksCompose([
        # use native torchlm transforms
        torchlm.LandmarksRandomScale(prob=0.5),
        # bind custom callable array functions
        torchlm.bind(callable_array_noop, bind_type=torchlm.BindEnum.Callable_Array),
        # bind custom callable Tensor functions with a given prob
        torchlm.bind(callable_tensor_noop, bind_type=torchlm.BindEnum.Callable_Tensor, prob=0.5),  
        # ...
    ])

  • setup logging mode as True globally might help you figure out the runtime details
import torchlm
# some global setting
torchlm.set_transforms_debug(True)
torchlm.set_transforms_logging(True)
torchlm.set_autodtype_logging(True)

some detail information will show you at each runtime, the infos might look like

LandmarksRandomScale() AutoDtype Info: AutoDtypeEnum.Array_InOut
LandmarksRandomScale() Execution Flag: False
BindTorchVisionTransform(GaussianBlur())() AutoDtype Info: AutoDtypeEnum.Tensor_InOut
BindTorchVisionTransform(GaussianBlur())() Execution Flag: True
BindAlbumentationsTransform(ColorJitter())() AutoDtype Info: AutoDtypeEnum.Array_InOut
BindAlbumentationsTransform(ColorJitter())() Execution Flag: True
BindTensorCallable(callable_tensor_noop())() AutoDtype Info: AutoDtypeEnum.Tensor_InOut
BindTensorCallable(callable_tensor_noop())() Execution Flag: False
Error at LandmarksRandomTranslate() Skip, Flag: False Error Info: LandmarksRandomTranslate() have 98 input landmarks, but got 96 output landmarks!
LandmarksRandomTranslate() Execution Flag: False
  • Execution Flag: True means current transform was executed successful, False means it was not executed because of the random probability or some Runtime Exceptions(torchlm will should the error infos if debug mode is True).

  • AutoDtype Info:

    • Array_InOut means current transform need a np.ndnarray as input and then output a np.ndarray.
    • Tensor_InOut means current transform need a torch Tensor as input and then output a torch Tensor.
    • Array_In means current transform needs a np.ndarray input and then output a torch Tensor.
    • Tensor_In means current transform needs a torch Tensor input and then output a np.ndarray.

    But, is ok if you pass a Tensor to a np.ndarray-like transform, torchlm will automatically be compatible with different data types and then wrap it back to the original type through a autodtype wrapper.

  • Supported Transforms Sets, see transforms.md. A detail example can be found at test/transforms.py.

Training(TODO)

  • YOLOX
  • YOLOv5
  • NanoDet
  • PIPNet
  • ResNet
  • MobileNet
  • ShuffleNet
  • ...

Inference

The ONNXRuntime(CPU/GPU), MNN, NCNN and TNN C++ inference of torchlm will be release at lite.ai.toolkit.

📖 Documentations

  • Data Augmentation's API (TODO)
  • ...

🎓 License

The code of torchlm is released under the MIT License.

❤️ Contribution

Please consider ⭐ this repo if you like it, as it is the simplest way to support me.

👋 Acknowledgement

The implementation of torchlm's transforms borrow the code from Paperspace .

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

torchlm-0.1.4.tar.gz (5.0 MB view details)

Uploaded Source

Built Distribution

torchlm-0.1.4-py3-none-any.whl (5.0 MB view details)

Uploaded Python 3

File details

Details for the file torchlm-0.1.4.tar.gz.

File metadata

  • Download URL: torchlm-0.1.4.tar.gz
  • Upload date:
  • Size: 5.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/32.0 requests/2.25.1 requests-toolbelt/0.9.1 urllib3/1.26.4 tqdm/4.60.0 importlib-metadata/4.10.1 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.8.2

File hashes

Hashes for torchlm-0.1.4.tar.gz
Algorithm Hash digest
SHA256 367cf2e7bda80e669f0420d9233c2fdbfc2fc2c5e29f0cdc91b862cc4592571a
MD5 f7eab7d319c120b2e39e562c20970954
BLAKE2b-256 a6f1e1fae9636ccb083eb7391d387dd1d10e0db95aea43fce7ce57b83ac3bde5

See more details on using hashes here.

File details

Details for the file torchlm-0.1.4-py3-none-any.whl.

File metadata

  • Download URL: torchlm-0.1.4-py3-none-any.whl
  • Upload date:
  • Size: 5.0 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/32.0 requests/2.25.1 requests-toolbelt/0.9.1 urllib3/1.26.4 tqdm/4.60.0 importlib-metadata/4.10.1 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.8.2

File hashes

Hashes for torchlm-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 6befa696df37723593201806a546bce51224b5d74bb136d272cd51984ae3d7db
MD5 fa0dd8d1ff3f20d5e18a6865708187fc
BLAKE2b-256 daf915e3c61b875f1b817ce170ce1b370f3fa55825aeaa603ac1ebfee2627a56

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page