`ultralytics 8.0.156` fix PIL `*.png` EXIF bug (#4406)

single_channel
Glenn Jocher 1 year ago committed by GitHub
parent fb1ae9bfad
commit 8d7490f060
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -115,4 +115,4 @@ def test_mobilesam():
@pytest.mark.parametrize('task,model,data', TASK_ARGS) @pytest.mark.parametrize('task,model,data', TASK_ARGS)
def test_train_gpu(task, model, data): def test_train_gpu(task, model, data):
run(f'yolo train {task} model={model}.yaml data={data} imgsz=32 epochs=1 device="0"') # single GPU run(f'yolo train {task} model={model}.yaml data={data} imgsz=32 epochs=1 device="0"') # single GPU
run(f'yolo train {task} model={model}.pt data={data} imgsz=32 epochs=1 device="0,1"') # Multi GPU run(f'yolo train {task} model={model}.pt data={data} imgsz=32 epochs=1 device="0,1"') # multi GPU

@ -1,6 +1,6 @@
# Ultralytics YOLO 🚀, AGPL-3.0 license # Ultralytics YOLO 🚀, AGPL-3.0 license
__version__ = '8.0.155' __version__ = '8.0.156'
from ultralytics.hub import start from ultralytics.hub import start
from ultralytics.models import RTDETR, SAM, YOLO from ultralytics.models import RTDETR, SAM, YOLO

@ -1,5 +1,6 @@
# Ultralytics YOLO 🚀, AGPL-3.0 license # Ultralytics YOLO 🚀, AGPL-3.0 license
import contextlib
import hashlib import hashlib
import json import json
import os import os
@ -13,7 +14,7 @@ from tarfile import is_tarfile
import cv2 import cv2
import numpy as np import numpy as np
from PIL import ExifTags, Image, ImageOps from PIL import Image, ImageOps
from tqdm import tqdm from tqdm import tqdm
from ultralytics.nn.autobackend import check_class_names from ultralytics.nn.autobackend import check_class_names
@ -28,11 +29,6 @@ IMG_FORMATS = 'bmp', 'dng', 'jpeg', 'jpg', 'mpo', 'png', 'tif', 'tiff', 'webp',
VID_FORMATS = 'asf', 'avi', 'gif', 'm4v', 'mkv', 'mov', 'mp4', 'mpeg', 'mpg', 'ts', 'wmv', 'webm' # video suffixes VID_FORMATS = 'asf', 'avi', 'gif', 'm4v', 'mkv', 'mov', 'mp4', 'mpeg', 'mpg', 'ts', 'wmv', 'webm' # video suffixes
PIN_MEMORY = str(os.getenv('PIN_MEMORY', True)).lower() == 'true' # global pin_memory for dataloaders PIN_MEMORY = str(os.getenv('PIN_MEMORY', True)).lower() == 'true' # global pin_memory for dataloaders
# Get orientation exif tag
for orientation in ExifTags.TAGS.keys():
if ExifTags.TAGS[orientation] == 'Orientation':
break
def img2label_paths(img_paths): def img2label_paths(img_paths):
"""Define label paths as a function of image paths.""" """Define label paths as a function of image paths."""
@ -51,9 +47,11 @@ def get_hash(paths):
def exif_size(img: Image.Image): def exif_size(img: Image.Image):
"""Returns exif-corrected PIL size.""" """Returns exif-corrected PIL size."""
s = img.size # (width, height) s = img.size # (width, height)
if img.format == 'JPEG': # only support JPEG images
with contextlib.suppress(Exception):
exif = img.getexif() exif = img.getexif()
if exif: if exif:
rotation = exif.get(274, None) # the key for the orientation tag in the EXIF data is 274 (in decimal) rotation = exif.get(274, None) # the EXIF key for the orientation tag is 274
if rotation in [6, 8]: # rotation 270 or 90 if rotation in [6, 8]: # rotation 270 or 90
s = s[1], s[0] s = s[1], s[0]
return s return s

Loading…
Cancel
Save