{"id":15903526,"url":"https://github.com/vfdev-5/visiontransforms","last_synced_at":"2025-04-02T20:15:29.588Z","repository":{"id":149001922,"uuid":"138337440","full_name":"vfdev-5/VisionTransforms","owner":"vfdev-5","description":"Another concepts for vision transforms for PyTorch/Torchvision","archived":false,"fork":false,"pushed_at":"2018-10-29T09:52:38.000Z","size":4063,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-02-08T10:43:59.361Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vfdev-5.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-06-22T18:47:44.000Z","updated_at":"2019-01-08T17:16:22.000Z","dependencies_parsed_at":null,"dependency_job_id":"b1c9ab1a-9940-4faa-b97a-de757787b04d","html_url":"https://github.com/vfdev-5/VisionTransforms","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vfdev-5%2FVisionTransforms","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vfdev-5%2FVisionTransforms/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vfdev-5%2FVisionTransforms/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vfdev-5%2FVisionTransforms/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vfdev-5","download_url":"https://codeload.github.com/vfdev-5/VisionTransforms/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246884769,"owners_count":20849554,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-06T12:02:28.084Z","updated_at":"2025-04-02T20:15:29.566Z","avatar_url":"https://github.com/vfdev-5.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Another concepts for vision transforms for PyTorch/Torchvision\n\nIdea is to provide basic brick to transform image/mask/bounding box/keypoints and user composes the transformation/augmentations according to the input datapoint.\n\nTransforms can be made similar to models that inherit of `torch.nn.Module`.\n\nSimple transformations are like `nn.Sequential`, more complicated should inherit from base transformation and \noverload `__call__` method.\n\n\n## Transformation use-cases\n\n\n### Simple example\n\nDatapoint is `(img, label)`:\n\n```python\ntransforms = vt.Sequential(\n    vt.RandomAffine(degrees=(-45, 45), translate=(0.3, 0.3), scale=(0.75, 1.2), shear=(-15, 15), resample=PIL.Image.BILINEAR),\n    vt.RandomCrop(size=224, padding=0),\n)\n\n\ndef data_transform(datapoint):    \n    return transforms(datapoint[0]), datapoint[1]\n```\n\nThis case is almost the same as torchvision\n\n### Another example\n\nMore complicated example, datapoint is `((img, scalars), (mask, bboxes, labels))` (e.g. Mask-RCNN)\n\n\n```python\n\nclass DataTransform(vt.BaseTransform):\n    \n    def __init__(self):\n        \n        translate_scale_params = {\n            'translate': (0.2, 0.2),\n            'scale': (0.7, 1.3)\n        }\n        self.random_affine = vt.RandomAffine(degrees=0, **translate_scale_params, resample=PIL.Image.BICUBIC)\n        self.mask_random_affine = vt.RandomAffine(degrees=0, **translate_scale_params, resample=PIL.Image.NEAREST)        \n        self.bbox_random_affine = vt.BBoxRandomAffine(input_canvas_size=310, **translate_scale_params)\n        \n        self.random_crop = vt.RandomCrop(size=224)\n        self.bbox_random_crop = vt.BBoxRandomCrop(input_canvas_size=310, size=224)\n        \n        self.img_geom = vt.Sequential(\n            self.random_affine,\n            self.random_crop,\n        )\n        self.mask_geom = vt.Sequential(\n            self.mask_random_affine,\n            self.random_crop,\n        )        \n        self.bbox_geom = vt.Sequential(\n            self.bbox_random_affine,\n            self.bbox_random_crop,\n        )        \n        self.img_color = vt.ColorJitter(hue=0.5, saturation=1.0)\n        \n    def __call__(self, datapoint, rng=None):\n        \n        x, y = datapoint\n        img_rgb, scalars = x\n        mask, bboxes, labels = y\n\n        t_img_rgb = self.img_geom(img_rgb, rng)\n        t_img_rgb = self.img_color(t_img_rgb)\n\n        t_mask = self.mask_geom(mask, rng)        \n        t_bboxes = self.bbox_geom(bboxes, rng)    \n        \n        return (t_img_rgb, scalars), (t_mask, t_bboxes, labels)\n        \n\ndtf = DataTransform()\n\n        \ndef data_transform(datapoint):\n    return dtf(datapoint)\n```\n\n## Random state controlling\n\nAll random parameters should use `random` built-in module.\n\nAll transformation `__call__` functions receive input and rng (can be None) as argument and setup random state before\ntransforming the data.\n\n\n## Backends \n\nImage/Mask reading and transformations can be implemented using various backends: \n- Pillow\n- Opencv/Numpy\n- torch.tensor (optionally) **NOT IMPLEMENTED YET**\n\nBounding boxes/Keypoints are defined as `numpy.ndarray` and operations can be done using different backends:\n- numpy\n- torch.tensor (optionally) **NOT IMPLEMENTED YET**\n\n\n## Concepts in practice\n\nSee the [example](https://github.com/vfdev-5/VisionTransforms/blob/master/examples/basic.ipynb)\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvfdev-5%2Fvisiontransforms","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvfdev-5%2Fvisiontransforms","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvfdev-5%2Fvisiontransforms/lists"}