Skip to content

Add PNG reading support #2382

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

Merged
merged 136 commits into from
Jul 3, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
136 commits
Select commit Hold shift + click to select a range
2b78943
Add libpng requirement into conda recipe
andfoy Jun 8, 2020
23255aa
Try to install libjpeg-turbo
andfoy Jun 8, 2020
006ab0c
Add PNG reading capabilities
r-zenine Feb 13, 2020
7b9ec24
Remove newline
andfoy Jun 11, 2020
f97a9f0
Add image extension to compilation instructions
andfoy Jun 11, 2020
ac6d26e
Include png functions as part of the main library
andfoy Jun 11, 2020
b14912e
Update CMakeLists
andfoy Jun 11, 2020
770cea5
Detect if building on conda-build
andfoy Jun 11, 2020
0861b80
Debug
andfoy Jun 11, 2020
a42a029
More debug messages
andfoy Jun 11, 2020
b7a19ea
Print globbed libreries
andfoy Jun 12, 2020
1afde4d
Print globbed libreries
andfoy Jun 12, 2020
386fd5b
Point to correct PNG path
andfoy Jun 12, 2020
2b5c469
Remove libJPEG preventively
andfoy Jun 12, 2020
0341aa5
Debug extension loading
andfoy Jun 12, 2020
721e5e3
Link libpng explicitly
andfoy Jun 12, 2020
2186d68
Link with PNG
andfoy Jun 12, 2020
b80fb08
Add libpng requirement into conda recipe
andfoy Jun 8, 2020
3d153f0
Try to install libjpeg-turbo
andfoy Jun 8, 2020
36b0a8f
Add PNG reading capabilities
r-zenine Feb 13, 2020
9d14d9e
Remove newline
andfoy Jun 11, 2020
852a289
Add image extension to compilation instructions
andfoy Jun 11, 2020
3e86f49
Include png functions as part of the main library
andfoy Jun 11, 2020
021e767
Update CMakeLists
andfoy Jun 11, 2020
e734175
Detect if building on conda-build
andfoy Jun 11, 2020
58c6524
Debug
andfoy Jun 11, 2020
b9295c1
More debug messages
andfoy Jun 11, 2020
02fa9d9
Print globbed libreries
andfoy Jun 12, 2020
6c757d4
Print globbed libreries
andfoy Jun 12, 2020
c207eab
Point to correct PNG path
andfoy Jun 12, 2020
a1aa2e6
Remove libJPEG preventively
andfoy Jun 12, 2020
34fc7d6
Debug extension loading
andfoy Jun 12, 2020
3ed2044
Link libpng explicitly
andfoy Jun 12, 2020
eaaf658
Link with PNG
andfoy Jun 12, 2020
3edae46
Merge branch 'add_libpng' of github.com:andfoy/vision into add_libpng
andfoy Jun 12, 2020
c17202e
Install libpng on conda-based wheel distributions
andfoy Jun 12, 2020
741f855
Add -y flag
andfoy Jun 12, 2020
a46f503
Add -y flag to yum
andfoy Jun 12, 2020
4bad033
Locate LibPNG on windows conda
andfoy Jun 12, 2020
b419fc1
Remove empty else
andfoy Jun 12, 2020
83eff79
Copy libpng16.so
andfoy Jun 12, 2020
eb2846f
Copy dylib on Mac
andfoy Jun 12, 2020
3563ef3
Improve check on Windows
andfoy Jun 13, 2020
347383f
Try to install ninja using conda on windows
andfoy Jun 15, 2020
51f6b48
Use libpng on Windows
andfoy Jun 15, 2020
ad00442
Package lib on windows wheel
andfoy Jun 15, 2020
4d82283
Point library to the correct place
andfoy Jun 15, 2020
32b2207
Include binaries as part of wheel
andfoy Jun 15, 2020
9a5aefe
Copy libpng.so on linux
andfoy Jun 15, 2020
a44c3b5
Look for png.h on Windows when using conda-build
andfoy Jun 15, 2020
dfcde68
Do not skip png tests on Mac/Win
andfoy Jun 15, 2020
d8d46d6
Restore libjpeg-turbo
andfoy Jun 15, 2020
eea8552
Install jpeg-turbo on wheel distributions
andfoy Jun 15, 2020
8c7dc31
Install libjpeg-turbo from conda-forge on wheel distributions
andfoy Jun 15, 2020
ee8148a
Do not pull av on conda-build
andfoy Jun 15, 2020
059fa42
Add pillow disclaimer
andfoy Jun 15, 2020
0ed1af6
Vendors libjpeg-turbo 2.0.4
r-zenine Feb 14, 2020
11d1a7a
Merge JPEG work
r-zenine Feb 15, 2020
3bb65ba
Remove submodules
andfoy Jun 15, 2020
c334d7e
Regenerate circle config
andfoy Jun 15, 2020
5650e59
Fix style issues
andfoy Jun 15, 2020
7894836
Fix C++ style issues
andfoy Jun 15, 2020
2da51d4
More style corrections
andfoy Jun 15, 2020
78455ae
Add JPEG-turbo to linking libraries
andfoy Jun 15, 2020
a0a383d
More style corrections
andfoy Jun 15, 2020
f143e2c
More style corrections
andfoy Jun 15, 2020
95cc941
More style corrections
andfoy Jun 15, 2020
1c9270a
Install libjpeg-turbo-devel
andfoy Jun 15, 2020
ee388e5
Install libturbo-jpeg on typing pipeline
andfoy Jun 15, 2020
462ed6c
Update Circle template
andfoy Jun 15, 2020
989db57
Windows and Unix turbojpeg have the same linking name
andfoy Jun 15, 2020
6e9ad0e
Install turbojpeg-devel instead of libjpeg-turbo
andfoy Jun 15, 2020
dd43bcd
Copy TurboJPEG binaries to wheel
andfoy Jun 15, 2020
e542e48
Move test image
andfoy Jun 16, 2020
b5fa45e
Move back test image
andfoy Jun 16, 2020
3e90556
Update JPEG test path
andfoy Jun 16, 2020
4e09af0
Remove dot from extension
andfoy Jun 16, 2020
c2e9bf3
Merge branch 'master' into add_libpng
andfoy Jun 17, 2020
8ac335e
Move image functions to extension
andfoy Jun 18, 2020
2adb87e
Use stdout arg in subprocess
andfoy Jun 18, 2020
44826a7
Disable image extension if libpng or turbojpeg are not found
andfoy Jun 18, 2020
1e830ea
Append libpng stdout
andfoy Jun 18, 2020
37c889b
Prevent list appending on lists
andfoy Jun 18, 2020
3cca366
Minor path correction
andfoy Jun 18, 2020
2a6ff9f
Minor error correction
andfoy Jun 18, 2020
b89b349
Add linking flags
andfoy Jun 18, 2020
264cb74
Merge branch 'add_libpng' of github.com:andfoy/vision into add_libpng
andfoy Jun 19, 2020
a0ce4ca
Style issues correction
andfoy Jun 19, 2020
bd752aa
Address minor review corrections
andfoy Jun 22, 2020
5259757
Refactor library search
andfoy Jun 23, 2020
3013247
Restore access index
andfoy Jun 23, 2020
9d8b1b5
Fix JPEG tests
andfoy Jun 23, 2020
7c3ec51
Update libpng version in Travis
andfoy Jun 23, 2020
158eec8
Add -y flag
andfoy Jun 23, 2020
269d8e5
Remove dot
andfoy Jun 23, 2020
273dc1a
Update libpng using apt
andfoy Jun 23, 2020
cfc7c75
Check libpng version
andfoy Jun 23, 2020
d32a5f0
Change libturbojpeg binary
andfoy Jun 23, 2020
051425b
Update import
andfoy Jun 23, 2020
3bc7323
Change call
andfoy Jun 23, 2020
6b87895
Restore av in conda recipe
andfoy Jun 24, 2020
af61f94
Merge with master
andfoy Jun 29, 2020
123fd3f
Minor error correction
andfoy Jun 29, 2020
831749c
Remove unused comment in travis.yml
andfoy Jun 29, 2020
558b0cb
Update README
andfoy Jun 29, 2020
8b2f507
Fix missing links
andfoy Jun 29, 2020
b560227
Remove fixes for 16.04
andfoy Jun 30, 2020
c6d3ebe
Remove JPEG-related code
andfoy Jul 1, 2020
39a0334
Remove installation references to turbojpeg
andfoy Jul 1, 2020
923ae59
Merge remote-tracking branch 'upstream/master' into add_png
andfoy Jul 1, 2020
4a1357e
Remove further references to turbojpeg
andfoy Jul 1, 2020
b2fd151
Fix c++ style issues
andfoy Jul 1, 2020
0fc3135
Fix c++ style issues
andfoy Jul 1, 2020
ce92995
Fix libpng-config include flag parsing
andfoy Jul 1, 2020
2614a9c
Remove conda-forge
andfoy Jul 1, 2020
bf41911
Remove include dirs from main extension
andfoy Jul 1, 2020
eb23830
Do not pass extra include and library paths to main torchvision exten…
andfoy Jul 1, 2020
c41800c
Add libpng to environment.yml
andfoy Jul 1, 2020
b1ff783
Remove inexistent imports
andfoy Jul 1, 2020
84dad44
Add instructions regarding environment variables to README
andfoy Jul 1, 2020
2d0b752
Fix image extension tests
fmassa Jul 2, 2020
ca8853e
Add libpng to environment + test fixes
fmassa Jul 2, 2020
adea0fc
Minor improvements
fmassa Jul 2, 2020
64820c6
Merge with libpng
andfoy Jul 2, 2020
a0f86b9
Remove unused Py2 code
andfoy Jul 2, 2020
d74cd79
Add stub comments to prevent deletion while merging
andfoy Jul 2, 2020
29547b2
Reintroduce files in order to prevent deletion during merge
andfoy Jul 2, 2020
ec43b64
Merge with master
andfoy Jul 2, 2020
c6afa2f
Remove unwanted merge sections
andfoy Jul 2, 2020
1ad8e89
Restore libpng conda installation on wheel distributions
andfoy Jul 2, 2020
28c1d8b
Restore comment
andfoy Jul 2, 2020
0967c3b
Fix libpng discovery on Windows
andfoy Jul 2, 2020
b4876e3
Fix PEP8 style issues
andfoy Jul 2, 2020
095e285
Add linking flag on Windows
andfoy Jul 2, 2020
ecea5eb
Remove parenthesis
andfoy Jul 2, 2020
d0fd739
Restore libpng during runtime
andfoy Jul 2, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .circleci/unittest/linux/scripts/environment.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ dependencies:
- pytest-cov
- codecov
- pip
- libpng
- ca-certificates
- pip:
- future
Expand Down
3 changes: 2 additions & 1 deletion .circleci/unittest/windows/scripts/environment.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@ dependencies:
- pytest-cov
- codecov
- pip
- libpng
- ca-certificates
- pip:
- future
- pillow>=4.1.1
- scipy==1.4.1
- av
- av
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,5 @@ htmlcov
*.swo
gen.yml
.mypy_cache
.vscode/
*.orig
1 change: 1 addition & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ jobs:

before_install:
- sudo apt-get update
- sudo apt-get install -y libpng-dev
- wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh;
- bash miniconda.sh -b -p $HOME/miniconda
- export PATH="$HOME/miniconda/bin:$PATH"
Expand Down
17 changes: 12 additions & 5 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,29 @@ if(WITH_CUDA)
endif()

find_package(Python3 COMPONENTS Development)

find_package(Torch REQUIRED)
find_package(PNG REQUIRED)


file(GLOB HEADERS torchvision/csrc/*.h)
file(GLOB OPERATOR_SOURCES torchvision/csrc/cpu/*.h torchvision/csrc/cpu/*.cpp torchvision/csrc/*.cpp)
# Image extension
file(GLOB IMAGE_HEADERS torchvision/csrc/cpu/image/*.h)
file(GLOB IMAGE_SOURCES torchvision/csrc/cpu/image/*.cpp)
file(GLOB OPERATOR_SOURCES torchvision/csrc/cpu/*.h torchvision/csrc/cpu/*.cpp ${IMAGE_HEADERS} ${IMAGE_SOURCES} ${HEADERS} torchvision/csrc/*.cpp)
if(WITH_CUDA)
file(GLOB OPERATOR_SOURCES ${OPERATOR_SOURCES} torchvision/csrc/cuda/*.h torchvision/csrc/cuda/*.cu)
endif()
file(GLOB MODELS_HEADERS torchvision/csrc/models/*.h)
file(GLOB MODELS_SOURCES torchvision/csrc/models/*.h torchvision/csrc/models/*.cpp)

add_library(${PROJECT_NAME} SHARED ${MODELS_SOURCES} ${OPERATOR_SOURCES})
target_link_libraries(${PROJECT_NAME} PRIVATE ${TORCH_LIBRARIES} Python3::Python)
add_library(${PROJECT_NAME} SHARED ${MODELS_SOURCES} ${OPERATOR_SOURCES} ${IMAGE_SOURCES})
target_link_libraries(${PROJECT_NAME} PRIVATE ${TORCH_LIBRARIES} ${PNG_LIBRARY} Python3::Python)
# target_link_libraries(${PROJECT_NAME} PRIVATE ${PNG_LIBRARY} Python3::Python)
set_target_properties(${PROJECT_NAME} PROPERTIES EXPORT_NAME TorchVision)

target_include_directories(${PROJECT_NAME} INTERFACE
$<BUILD_INTERFACE:${HEADERS}>
$<BUILD_INTERFACE:${HEADERS}:${PNG_INCLUDE_DIR}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)

include(GNUInstallDirs)
Expand Down Expand Up @@ -61,7 +68,7 @@ install(FILES
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/cpu)
if(WITH_CUDA)
install(FILES
torchvision/csrc/cuda/vision_cuda.h
torchvision/csrc/cuda/vision_cuda.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/cuda)
endif()
install(FILES ${MODELS_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/models)
10 changes: 8 additions & 2 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -78,13 +78,19 @@ Torchvision currently supports the following image backends:

* `accimage`_ - if installed can be activated by calling :code:`torchvision.set_image_backend('accimage')`

* `libpng`_ - can be installed via conda :code:`conda install libpng` or any of the package managers for debian-based and RHEL-based Linux distributions.

**Notes:** ``libpng`` must be available at compilation time in order to be available. Make sure that it is available on the standard library locations,
otherwise, add the include and library paths in the environment variables ``TORCHVISION_INCLUDE`` and ``TORCHVISION_LIBRARY``, respectively.

.. _libpng : http://www.libpng.org/pub/png/libpng.html
.. _Pillow : https://python-pillow.org/
.. _Pillow-SIMD : https://github.com/uploadcare/pillow-simd
.. _accimage: https://github.com/pytorch/accimage

C++ API
=======
TorchVision also offers a C++ API that contains C++ equivalent of python models.
TorchVision also offers a C++ API that contains C++ equivalent of python models.

Installation From source:

Expand All @@ -94,7 +100,7 @@ Installation From source:
cd build
# Add -DWITH_CUDA=on support for the CUDA if needed
cmake ..
make
make
make install

Once installed, the library can be accessed in cmake (after properly configuring ``CMAKE_PREFIX_PATH``) via the :code:`TorchVision::TorchVision` target:
Expand Down
17 changes: 17 additions & 0 deletions packaging/build_wheel.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,23 @@ setup_wheel_python
pip_install numpy pyyaml future ninja
setup_pip_pytorch_version
python setup.py clean

# Copy binaries to be included in the wheel distribution
if [[ "$(uname)" == Darwin || "$OSTYPE" == "msys" ]]; then
python_exec="$(which python)"
bin_path=$(dirname $python_exec)
env_path=$(dirname $bin_path)
if [[ "$(uname)" == Darwin ]]; then
# Include LibPNG
cp "$env_path/lib/libpng16.dylib" torchvision
else
cp "$bin_path/Library/bin/libpng16.dll" torchvision
fi
else
# Include LibPNG
cp "/usr/lib64/libpng.so" torchvision
fi

if [[ "$OSTYPE" == "msys" ]]; then
IS_WHEEL=1 "$script_dir/windows/internal/vc_env_helper.bat" python setup.py bdist_wheel
else
Expand Down
4 changes: 4 additions & 0 deletions packaging/pkg_helpers.bash
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,11 @@ setup_wheel_python() {
conda env remove -n "env$PYTHON_VERSION" || true
conda create -yn "env$PYTHON_VERSION" python="$PYTHON_VERSION"
conda activate "env$PYTHON_VERSION"
# Install libpng from Anaconda (defaults)
conda install libpng -y
else
# Install native CentOS libPNG
yum install -y libpng-devel
case "$PYTHON_VERSION" in
2.7)
if [[ -n "$UNICODE_ABI" ]]; then
Expand Down
2 changes: 2 additions & 0 deletions packaging/torchvision/meta.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ source:
requirements:
build:
- {{ compiler('c') }} # [win]
- libpng

host:
- python
Expand All @@ -18,6 +19,7 @@ requirements:

run:
- python
- libpng
- pillow >=4.1.1
- numpy >=1.11
{{ environ.get('CONDA_PYTORCH_CONSTRAINT') }}
Expand Down
135 changes: 133 additions & 2 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import re
import sys
from setuptools import setup, find_packages
from pkg_resources import get_distribution, DistributionNotFound
from pkg_resources import parse_version, get_distribution, DistributionNotFound
import subprocess
import distutils.command.clean
import distutils.spawn
Expand Down Expand Up @@ -76,6 +76,65 @@ def write_version_file():
requirements.append(pillow_req + pillow_ver)


def find_library(name, vision_include):
this_dir = os.path.dirname(os.path.abspath(__file__))
build_prefix = os.environ.get('BUILD_PREFIX', None)
is_conda_build = build_prefix is not None

library_found = False
conda_installed = False
lib_folder = None
include_folder = None
library_header = '{0}.h'.format(name)

print('Running build on conda-build: {0}'.format(is_conda_build))
if is_conda_build:
# Add conda headers/libraries
if os.name == 'nt':
build_prefix = os.path.join(build_prefix, 'Library')
include_folder = os.path.join(build_prefix, 'include')
lib_folder = os.path.join(build_prefix, 'lib')
library_header_path = os.path.join(
include_folder, library_header)
library_found = os.path.isfile(library_header_path)
conda_installed = library_found
else:
# Check if using Anaconda to produce wheels
conda = distutils.spawn.find_executable('conda')
is_conda = conda is not None
print('Running build on conda: {0}'.format(is_conda))
if is_conda:
python_executable = sys.executable
py_folder = os.path.dirname(python_executable)
if os.name == 'nt':
env_path = os.path.join(py_folder, 'Library')
else:
env_path = os.path.dirname(py_folder)
lib_folder = os.path.join(env_path, 'lib')
include_folder = os.path.join(env_path, 'include')
library_header_path = os.path.join(
include_folder, library_header)
library_found = os.path.isfile(library_header_path)
conda_installed = library_found

if not library_found:
if sys.platform == 'linux':
library_found = os.path.exists('/usr/include/{0}'.format(
library_header))
library_found = library_found or os.path.exists(
'/usr/local/include/{0}'.format(library_header))
else:
# Lookup in TORCHVISION_INCLUDE or in the package file
package_path = [os.path.join(this_dir, 'torchvision')]
for folder in vision_include + package_path:
candidate_path = os.path.join(folder, library_header)
library_found = os.path.exists(candidate_path)
if library_found:
break

return library_found, conda_installed, include_folder, lib_folder


def get_extensions():
this_dir = os.path.dirname(os.path.abspath(__file__))
extensions_dir = os.path.join(this_dir, 'torchvision', 'csrc')
Expand Down Expand Up @@ -171,6 +230,76 @@ def get_extensions():
)
)

# ------------------- Torchvision extra extensions ------------------------
vision_include = os.environ.get('TORCHVISION_INCLUDE', None)
vision_library = os.environ.get('TORCHVISION_LIBRARY', None)
vision_include = (vision_include.split(os.pathsep)
if vision_include is not None else [])
vision_library = (vision_library.split(os.pathsep)
if vision_library is not None else [])
include_dirs += vision_include
library_dirs = vision_library

# Image reading extension
image_macros = []
image_include = [extensions_dir]
image_library = []
image_link_flags = []

# Locating libPNG
libpng = distutils.spawn.find_executable('libpng-config')
pngfix = distutils.spawn.find_executable('pngfix')
png_found = libpng is not None or pngfix is not None
image_macros += [('PNG_FOUND', str(int(png_found)))]
print('PNG found: {0}'.format(png_found))
if png_found:
if libpng is not None:
# Linux / Mac
png_version = subprocess.run([libpng, '--version'],
stdout=subprocess.PIPE)
png_version = png_version.stdout.strip().decode('utf-8')
print('libpng version: {0}'.format(png_version))
png_version = parse_version(png_version)
if png_version >= parse_version("1.6.0"):
print('Building torchvision with PNG image support')
png_lib = subprocess.run([libpng, '--libdir'],
stdout=subprocess.PIPE)
png_include = subprocess.run([libpng, '--I_opts'],
stdout=subprocess.PIPE)
png_include = png_include.stdout.strip().decode('utf-8')
_, png_include = png_include.split('-I')
print('libpng include path: {0}'.format(png_include))
image_library += [png_lib.stdout.strip().decode('utf-8')]
image_include += [png_include]
image_link_flags.append('png')
else:
print('libpng installed version is less than 1.6.0, '
'disabling PNG support')
png_found = False
else:
# Windows
png_lib = os.path.join(
os.path.dirname(os.path.dirname(pngfix)), 'lib')
png_include = os.path.join(os.path.dirname(
os.path.dirname(pngfix)), 'include', 'libpng16')
image_library += [png_lib]
image_include += [png_include]
image_link_flags.append('libpng')

image_path = os.path.join(extensions_dir, 'cpu', 'image')
image_src = glob.glob(os.path.join(image_path, '*.cpp'))

if png_found:
ext_modules.append(extension(
'torchvision.image',
image_src,
include_dirs=image_include + include_dirs + [image_path],
library_dirs=image_library + library_dirs,
define_macros=image_macros,
libraries=image_link_flags,
extra_compile_args=extra_compile_args
))

ffmpeg_exe = distutils.spawn.find_executable('ffmpeg')
has_ffmpeg = ffmpeg_exe is not None

Expand Down Expand Up @@ -243,7 +372,9 @@ def run(self):

# Package info
packages=find_packages(exclude=('test',)),

package_data={
package_name: ['*.dll', '*.dylib', '*.so']
},
zip_safe=False,
install_requires=requirements,
extras_require={
Expand Down
46 changes: 46 additions & 0 deletions test/test_image.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import os
import unittest
import sys

import torch
import torchvision
from PIL import Image
from torchvision.io.image import read_png, decode_png
import numpy as np

IMAGE_ROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)), "assets")
IMAGE_DIR = os.path.join(IMAGE_ROOT, "fakedata", "imagefolder")


def get_images(directory, img_ext):
assert os.path.isdir(directory)
for root, _, files in os.walk(directory):
for fl in files:
_, ext = os.path.splitext(fl)
if ext == img_ext:
yield os.path.join(root, fl)


class ImageTester(unittest.TestCase):
def test_read_png(self):
# Check across .png
for img_path in get_images(IMAGE_DIR, ".png"):
img_pil = torch.from_numpy(np.array(Image.open(img_path)))
img_lpng = read_png(img_path)
self.assertTrue(img_lpng.equal(img_pil))

def test_decode_png(self):
for img_path in get_images(IMAGE_DIR, ".png"):
img_pil = torch.from_numpy(np.array(Image.open(img_path)))
size = os.path.getsize(img_path)
img_lpng = decode_png(torch.from_file(img_path, dtype=torch.uint8, size=size))
self.assertTrue(img_lpng.equal(img_pil))

with self.assertRaises(ValueError):
decode_png(torch.empty((), dtype=torch.uint8))
with self.assertRaises(RuntimeError):
decode_png(torch.randint(3, 5, (300,), dtype=torch.uint8))


if __name__ == '__main__':
unittest.main()
16 changes: 16 additions & 0 deletions torchvision/csrc/cpu/image/image.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@

#include "image.h"
#include <ATen/ATen.h>
#include <Python.h>

// If we are in a Windows environment, we need to define
// initialization functions for the _custom_ops extension
#ifdef _WIN32
PyMODINIT_FUNC PyInit_image(void) {
// No need to do anything.
return NULL;
}
#endif

static auto registry =
torch::RegisterOperators().op("image::decode_png", &decodePNG);
7 changes: 7 additions & 0 deletions torchvision/csrc/cpu/image/image.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@

#pragma once

// Comment
#include <torch/script.h>
#include <torch/torch.h>
#include "readpng_cpu.h"
Loading