-
-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add basic functions for colorspace transforms. #3
Changes from 39 commits
901b875
093f8b7
3c39144
684ea01
f714e2a
9f92224
d11a5cb
f074375
15d1d31
fbcb568
9511d4b
26aa7a0
d348861
8cd6768
76e77ea
0fe299e
0141543
1a3ec8f
721e6c6
5dcafa6
4723f91
52c0207
be22a5d
5fdec09
c019c8b
02e9085
75797b0
598b427
c11cb13
62a66a0
95e10a9
a71d974
2b1e4aa
ace5a7f
89b15d5
7f4cc3f
fae45dd
041507c
1bbce28
45e1787
f6ddc1a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -42,8 +42,15 @@ jobs: | |
- run: | | ||
julia --project=docs -e ' | ||
using Pkg | ||
Pkg.add("Documenter") | ||
Pkg.develop(PackageSpec(path=pwd())) | ||
Pkg.instantiate()' | ||
- run: | | ||
julia --project=docs -e ' | ||
using Pkg | ||
using Documenter: doctest | ||
using DiffImages | ||
doctest(DiffImages)' | ||
Comment on lines
+48
to
+53
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sorry that I didn't make it clear. I was thinking of adding |
||
- run: julia --project=docs docs/make.jl | ||
env: | ||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,7 +4,9 @@ authors = ["SomTambe <[email protected]>"] | |
version = "0.1.0" | ||
|
||
[deps] | ||
CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" | ||
ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" | ||
Flux = "587475ba-b771-5e3f-ad9e-33799f191a9c" | ||
ImageTransformations = "02fcd773-0e25-5acc-982a-7f6622650795" | ||
Images = "916415d5-f1e6-5110-898d-aaa5f9f070e0" | ||
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" | ||
Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
[deps] | ||
Images = "916415d5-f1e6-5110-898d-aaa5f9f070e0" |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,33 @@ | ||
using Documenter, DiffImages | ||
|
||
makedocs(sitename="DiffImages.jl") | ||
makedocs(; | ||
modules = [DiffImages], | ||
doctest = true, | ||
authors = "Som V Tambe <[email protected]>", | ||
repo = "https://github.com/SomTambe/DiffImages.jl/blob/{commit}{path}#L{line}", | ||
sitename = "DiffImages.jl", | ||
# format = Documenter.HTML(; | ||
# prettyurls = get(ENV, "CI", "false") == "true", | ||
# canonical = "https://fluxml.ai/Flux3D.jl", | ||
# assets = String["assets/favicon.ico"], | ||
# analytics = "UA-154580699-2", | ||
# ), | ||
pages = [ | ||
"Home" => "index.md", | ||
# "Tutorials" => [ | ||
# ], | ||
"Colorspace Transforms" => "colors/index.md", | ||
# "Datasets" => | ||
# ["ModelNet" => "datasets/modelnet.md", "Custom Dataset" => "datasets/utils.md"], | ||
# "Transforms" => "api/transforms.md", | ||
# "Metrics" => "api/metrics.md", | ||
# "API Documentation" => [ | ||
# "Conversions" => "api/conversions.md", | ||
# "Helper function" => "api/utils.md", | ||
# "Visualization" => "api/visualize.md", | ||
# "3D Models" => "api/models.md", | ||
# ], | ||
], | ||
) | ||
|
||
deploydocs(; repo = "github.com/FluxML/Flux3D.jl.git") |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
```@meta | ||
CurrentModule = DiffImages | ||
``` | ||
# Colorspace Transforms | ||
|
||
!!! note "Consistency with the batch dimension" | ||
Since we require the last dimension to be the batch dimension, | ||
kindly unsqueeze the last dimension if you would like to pass a | ||
single image. | ||
|
||
```@autodocs | ||
Modules = [DiffImages] | ||
Pages = ["colors/conversions.jl"] | ||
``` |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,10 +1,13 @@ | ||
```@meta | ||
CurrentModule = DiffImages | ||
``` | ||
# DiffImages Documentation | ||
|
||
# DiffImages: Extending Automatic Differentiation support to the JuliaImages ecosystem | ||
|
||
```@autodocs | ||
Modules = [DiffImages] | ||
Pages = ["conversions.jl"] | ||
``` | ||
DiffImages.jl is a differentiable computer vision library made in pure Julia. It is being developed with the aim of extending AD support to the JuliaImages ecosystem. | ||
|
||
This library is under heavy development and is not intended for use yet. A stable release later will enable the users to readily use this. | ||
|
||
You can watch our development at the Discussions tab of our repository. We welcome all and everyone who intend to help us with their discussions. Open Source code simply cannot be made if the community does not give its inputs. | ||
|
||
We hope you remain safe and healthy. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
""" | ||
channelify(m::AbstractArray{CT,N}) where {CT <: Colorant, N} | ||
Channelify function. | ||
|
||
Input should be in ``WHN`` order ``\\implies (*, batch)``. | ||
Output will be in the order ``(*, channels, batch)``. | ||
|
||
# Examples | ||
```jldoctest; setup = :(using Images,DiffImages) | ||
julia> input_size = (16, 16, 2) | ||
(16, 16, 2) | ||
|
||
julia> size(channelify(HSV.(rand(BGR,input_size...)))) | ||
(16, 16, 3, 2) | ||
``` | ||
""" | ||
function channelify(m::AbstractArray{CT,N}) where {CT <: Colorant, N} | ||
e = eltype(m) | ||
SomTambe marked this conversation as resolved.
Show resolved
Hide resolved
|
||
m = channelview(m) | ||
if e <: AbstractGray | ||
SomTambe marked this conversation as resolved.
Show resolved
Hide resolved
|
||
m = unsqueeze(m, 1) | ||
end | ||
t = ntuple(identity, ndims(m)) | ||
m = permutedims(m, (t[2:end-1]...,1,t[end])) | ||
return m | ||
end | ||
|
||
@adjoint function channelview(x::AbstractArray{T,N}) where {T, N} | ||
e = eltype(x) | ||
y = channelview(x) | ||
function pullback(Δ) | ||
return (collect(colorview(e,Δ)),) | ||
end | ||
return (y, pullback) | ||
end | ||
|
||
@adjoint function colorview(T, x) | ||
y = colorview(T,x) | ||
function pullback(Δ) | ||
return (nothing, channelview(Δ)) | ||
end | ||
return (y, pullback) | ||
end | ||
|
||
# adjoint for (::Colorant{T,N})(x::Real) | ||
for f in (:HSV,:AHSV,:HSVA, | ||
:Gray,:AGray,:GrayA, | ||
:HSL,:AHSL,:HSLA, | ||
:RGB,:ARGB,:RGBA, | ||
:BGR,:ABGR,:BGRA, | ||
:XYZ,:AXYZ,:XYZA, | ||
:xyY,:AxyY,:xyYA, | ||
:Lab,:ALab,:LabA, | ||
:Luv,:ALuv,:LuvA, | ||
:LCHab,:ALCHab,:LCHabA, | ||
:LCHuv,:ALCHuv,:LCHuvA, | ||
:DIN99,:ADIN99,:DIN99A, | ||
:LMS,:ALMS,:LMSA, | ||
:YIQ,:AYIQ,:YIQA) | ||
@eval @adjoint function $f(x::Real...) | ||
y = $f(x::Real...) | ||
function pull(Δ...) | ||
return (Δ...,) | ||
end | ||
return (y, pull) | ||
end | ||
end | ||
|
||
# Constructor adjoint | ||
# function ChainRules.rrule(::Type{HSL{T}}, x, y, z) where T <: AbstractFloat | ||
# β = HSL{T}(x, y, z) | ||
# function Lab_pullback(Δ) | ||
# @show Δ x y z β | ||
# return (ChainRules.NoTangent(),Δ.h,Δ.s,Δ.l) | ||
# end | ||
# return (β, Lab_pullback) | ||
# end | ||
|
||
""" | ||
colorify(color::Type{CT}, m::AbstractArray) where CT <: Colorant | ||
Colorify function. | ||
|
||
Expecting an input of the type ``(*, channels, batch)``. | ||
Converts the array to the `color` specified. | ||
|
||
|
||
# Examples | ||
```jldoctest; setup = :(using Images,DiffImages) | ||
julia> input_size = (25, 25, 3, 7) | ||
(25, 25, 3, 7) | ||
|
||
julia> size(colorify(HSV, rand(input_size...))) | ||
(25, 25, 7) | ||
``` | ||
""" | ||
function colorify(color::Type{CT}, m::AbstractArray) where CT <: Colorant | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I feel like we may want to restrict this function to There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The current function gives the freedom of any number of dims >= 2. We could restrict it to 4 but it could be we may require something for higher dimensions in the future. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. My main concern is the case I highlighted earlier. If that is handled correctly, then I'm fine There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I understand that classic deep learning mainly deals with 4D tensor but I'm not very positive about this type constraint; especially when it's not due to implementation restriction. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I am the first person to not restrict types for sure, just wanted to ensure we're doing the correct thing for different inputs we can expect to get. |
||
t = ntuple(identity, ndims(m)) | ||
m = permutedims(m, (t[end-1],t[1:end-2]...,t[end])) | ||
if color <: AbstractGray | ||
m = dropdims(m; dims=1) | ||
end | ||
m = colorview(color, m) | ||
return m | ||
end | ||
# TODO: adjoints for `colorview(T, gray1, gray2...)` are not added yet. |
This file was deleted.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This one can also be added into
docs/Project.toml