Bạn có thể mở hình ảnh bằng Python không?

Tham số đầu tiên là đường dẫn chứa hình ảnh. Tham số thứ hai là cờ cho chúng ta biết hình ảnh nên được đọc như thế nào. Các tùy chọn cho tham số cờ là

  • cv2. IMREAD_COLOR hoặc 1. Đây là giá trị mặc định và sẽ tải hình ảnh màu
  • cv2. IMREAD_GRAYSCALE hoặc 0. sẽ tải hình ảnh theo thang độ xám
  • cv2. IMREAD_UNCHANGED hoặc -1. Tải hình ảnh như vậy, bao gồm cả kênh alpha

imshow[] hiển thị hình ảnh trong cửa sổ

Tham số đầu tiên là tên cửa sổ và tham số thứ hai là hình ảnh

waitKey[] là một chức năng liên kết bàn phím

Nếu bạn chỉ định một giá trị số khác 0, thì giá trị này sẽ đợi trong một phần nghìn giây đã chỉ định cho bất kỳ sự kiện bàn phím nào. Nếu bạn nhấn bất kỳ phím nào, thì chương trình sẽ tiếp tục. Nếu bạn chỉ định 0 làm giá trị, thì nó sẽ đợi vô thời hạn

destroyAllWindows[] sẽ hủy tất cả các cửa sổ đã tạo

Để hủy các cửa sổ cụ thể, bạn có thể sử dụng destroyWindow[] mà bạn sẽ chuyển tên cửa sổ vào đó

import cv2
image_cv2= cv2.imread[r'\dogs-v-cats\dog.1.png']
cv2.imshow["Dog Image using OpenCV", image_cv2]

cv2.waitKey[6000]
cv2.destroyWindow["Dog Image using OpenCV"]

Lưu hình ảnh bằng OpenCV

result=cv2.imwrite[r'\dogs-v-cats\dog.100.png’, image_cv2]
if result==True:
print[“File saved successfully”]
else:
print[“Error in saving file”]

imwrite[] lưu tệp hình ảnh vào đường dẫn đã chỉ định. Tham số đầu tiên là đường dẫn mà bạn muốn lưu tệp và tham số thứ hai là hình ảnh sẽ được lưu

Tải hình ảnh bằng matplotlib

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
%matplotlib inline
image_mp= mpimg.imread[r'\dogs-v-cats\dog.1.jpg']
imgplot=plt.imshow[image_mp]
plt.plot[]

imread[] của matplotlib đọc tệp hình ảnh từ đường dẫn đã chỉ định vào một mảng. Tham số thứ hai là tùy chọn và chỉ định định dạng của tệp như 'JPEG' hoặc "PNG". Giá trị mặc định là 'PNG. ’

imshow[] của matplotlib hiển thị mảng dữ liệu dưới dạng hình ảnh

bạn cũng có thể sử dụng plt. show[] để hiển thị hình ảnh

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
%matplotlib inline
image_mp= mpimg.imread[r'\dogs-v-cats\dog.1.jpg’, “JPG”]
imgplot=plt.imshow[image_mp]
plt.show[]

Hình ảnh. Một. Krizhevsky

Khi bạn tải xuống và giải nén thư mục, bạn sẽ phát hiện ra rằng các tệp này không phải là tệp hình ảnh mà con người có thể đọc được. Chúng thực sự đã được đánh số thứ tự và lưu theo lô bằng cách sử dụng cPickle

Mặc dù chúng tôi sẽ không xem xét

$ pip install lmdb
3 hoặc
$ pip install lmdb
4 trong bài viết này, ngoài việc trích xuất tập dữ liệu CIFAR, điều đáng nói là mô-đun Python
$ pip install lmdb
3 có lợi thế chính là có thể tuần tự hóa bất kỳ đối tượng Python nào mà không cần thêm bất kỳ mã hoặc chuyển đổi nào từ phía bạn. Nó cũng có một nhược điểm nghiêm trọng tiềm ẩn là gây rủi ro bảo mật và không đối phó tốt khi xử lý lượng dữ liệu rất lớn

Đoạn mã sau giải nén từng tệp trong số năm tệp bó và tải tất cả các hình ảnh vào một mảng NumPy

import numpy as np
import pickle
from pathlib import Path

# Path to the unzipped CIFAR data
data_dir = Path["data/cifar-10-batches-py/"]

# Unpickle function provided by the CIFAR hosts
def unpickle[file]:
    with open[file, "rb"] as fo:
        dict = pickle.load[fo, encoding="bytes"]
    return dict

images, labels = [], []
for batch in data_dir.glob["data_batch_*"]:
    batch_data = unpickle[batch]
    for i, flat_im in enumerate[batch_data[b"data"]]:
        im_channels = []
        # Each image is flattened, with channels in order of R, G, B
        for j in range[3]:
            im_channels.append[
                flat_im[j * 1024 : [j + 1] * 1024].reshape[[32, 32]]
            ]
        # Reconstruct the original image
        images.append[np.dstack[[im_channels]]]
        # Save the label
        labels.append[batch_data[b"labels"][i]]

print["Loaded CIFAR-10 training set:"]
print[f" - np.shape[images]     {np.shape[images]}"]
print[f" - np.shape[labels]     {np.shape[labels]}"]

Tất cả các hình ảnh hiện có trong RAM ở biến

$ pip install lmdb
6, với siêu dữ liệu tương ứng của chúng trong biến
$ pip install lmdb
7 và sẵn sàng để bạn thao tác. Tiếp theo, bạn có thể cài đặt các gói Python mà bạn sẽ sử dụng cho ba phương pháp

Ghi chú. Khối mã cuối cùng đó đã sử dụng chuỗi f. Bạn có thể đọc thêm về chúng trong Chuỗi f của Python 3. Cú pháp định dạng chuỗi được cải thiện [Hướng dẫn]

Thiết lập để lưu trữ hình ảnh trên đĩa

Bạn sẽ cần thiết lập môi trường của mình cho phương pháp lưu và truy cập những hình ảnh này từ đĩa mặc định. Bài viết này sẽ giả sử bạn có Python 3. x được cài đặt trên hệ thống của bạn và sẽ sử dụng

$ pip install lmdb
8 để xử lý hình ảnh

$ pip install Pillow

Ngoài ra, nếu thích, bạn có thể cài đặt nó bằng Anaconda

$ conda install -c conda-forge pillow

Ghi chú.

$ pip install lmdb
9 là phiên bản gốc của Thư viện hình ảnh Python, không còn được duy trì và không tương thích với Python 3. x. Nếu trước đây bạn đã cài đặt
$ pip install lmdb
9, hãy nhớ gỡ cài đặt nó trước khi cài đặt
$ pip install lmdb
8, vì chúng không thể tồn tại cùng nhau

Bây giờ bạn đã sẵn sàng để lưu trữ và đọc hình ảnh từ đĩa

Bắt đầu với LMDB

LMDB, đôi khi được gọi là “Cơ sở dữ liệu Lightning”, viết tắt của Lightning Memory-Mapped Database vì nó nhanh và sử dụng các tệp ánh xạ bộ nhớ. Đó là kho lưu trữ khóa-giá trị, không phải cơ sở dữ liệu quan hệ

Về mặt triển khai, LMDB là một cây B+, về cơ bản có nghĩa là nó là một cấu trúc biểu đồ dạng cây được lưu trữ trong bộ nhớ trong đó mỗi phần tử khóa-giá trị là một nút và các nút có thể có nhiều nút con. Các nút trên cùng cấp độ được liên kết với nhau để truyền tải nhanh

Quan trọng là, các thành phần chính của cây B+ được đặt tương ứng với kích thước trang của hệ điều hành máy chủ, tối đa hóa hiệu quả khi truy cập bất kỳ cặp khóa-giá trị nào trong cơ sở dữ liệu. Do hiệu suất cao của LMDB phụ thuộc rất nhiều vào điểm cụ thể này, nên hiệu quả của LMDB đã được chứng minh là phụ thuộc vào hệ thống tệp cơ bản và việc triển khai hệ thống đó

Một lý do quan trọng khác cho hiệu quả của LMDB là nó được ánh xạ bộ nhớ. Điều này có nghĩa là nó trả về các con trỏ trực tiếp tới địa chỉ bộ nhớ của cả khóa và giá trị mà không cần sao chép bất kỳ thứ gì trong bộ nhớ như hầu hết các cơ sở dữ liệu khác đều làm

Những ai muốn tìm hiểu sâu hơn một chút về chi tiết triển khai bên trong của cây B+ có thể xem bài viết này về cây B+ và sau đó chơi với hình ảnh trực quan về việc chèn nút này

Nếu cây B+ không làm bạn quan tâm, đừng lo lắng. Bạn không cần biết nhiều về triển khai nội bộ của họ để sử dụng LMDB. Chúng tôi sẽ sử dụng liên kết Python cho thư viện LMDB C, có thể được cài đặt qua pip

$ pip install lmdb

Bạn cũng có tùy chọn cài đặt qua Anaconda

$ conda install -c conda-forge python-lmdb

Kiểm tra xem bạn có thể

$ conda install -c conda-forge python-lmdb
2 từ trình bao Python hay không và bạn đã sẵn sàng để bắt đầu

Loại bỏ các quảng cáo

Bắt đầu với HDF5

HDF5 là viết tắt của Hierarchical Data Format, một định dạng tệp được gọi là HDF4 hoặc HDF5. Chúng ta không cần lo lắng về HDF4, vì HDF5 là phiên bản được bảo trì hiện tại

Thật thú vị, HDF có nguồn gốc từ Trung tâm ứng dụng siêu máy tính quốc gia, dưới dạng định dạng dữ liệu khoa học nhỏ gọn, di động. Nếu bạn đang thắc mắc liệu nó có được sử dụng rộng rãi hay không, hãy xem lời giới thiệu của NASA về HDF5 từ dự án Dữ liệu Trái đất của họ

Tệp HDF bao gồm hai loại đối tượng

  1. Bộ dữ liệu
  2. Các nhóm

Bộ dữ liệu là các mảng nhiều chiều và các nhóm bao gồm các bộ dữ liệu hoặc các nhóm khác. Mảng đa chiều có kích thước và loại bất kỳ có thể được lưu trữ dưới dạng tập dữ liệu, nhưng kích thước và loại phải thống nhất trong tập dữ liệu. Mỗi bộ dữ liệu phải chứa một mảng N chiều đồng nhất. Điều đó nói rằng, bởi vì các nhóm và bộ dữ liệu có thể được lồng vào nhau, bạn vẫn có thể nhận được sự không đồng nhất mà bạn có thể cần

$ pip install h5py

Cũng như các thư viện khác, bạn có thể cài đặt luân phiên qua Anaconda

$ conda install -c conda-forge h5py

Nếu bạn có thể

$ conda install -c conda-forge python-lmdb
3 từ trình bao Python, thì mọi thứ đã được thiết lập đúng cách

Lưu trữ một hình ảnh duy nhất

Bây giờ bạn đã có cái nhìn tổng quan về các phương pháp, hãy đi sâu vào và xem xét so sánh định lượng về các nhiệm vụ cơ bản mà chúng ta quan tâm. mất bao lâu để đọc và ghi tệp cũng như dung lượng bộ nhớ đĩa sẽ được sử dụng. Đây cũng sẽ là phần giới thiệu cơ bản về cách thức hoạt động của các phương thức, với các ví dụ mã về cách sử dụng chúng.

Khi tôi đề cập đến "tệp", tôi thường có nghĩa là rất nhiều trong số chúng. Tuy nhiên, điều quan trọng là phải phân biệt vì một số phương pháp có thể được tối ưu hóa cho các hoạt động và số lượng tệp khác nhau

Với mục đích thử nghiệm, chúng tôi có thể so sánh hiệu suất giữa các số lượng tệp khác nhau, theo hệ số 10 từ một hình ảnh đến 100.000 hình ảnh. Vì năm lô CIFAR-10 của chúng tôi có thể thêm tới 50.000 hình ảnh nên chúng tôi có thể sử dụng mỗi hình ảnh hai lần để có được 100.000 hình ảnh

Để chuẩn bị cho các thử nghiệm, bạn sẽ muốn tạo một thư mục cho từng phương pháp, thư mục này sẽ chứa tất cả các tệp hoặc hình ảnh cơ sở dữ liệu và lưu các đường dẫn đến các thư mục đó trong các biến

from pathlib import Path

disk_dir = Path["data/disk/"]
lmdb_dir = Path["data/lmdb/"]
hdf5_dir = Path["data/hdf5/"]

$ conda install -c conda-forge python-lmdb
4 không tự động tạo các thư mục cho bạn trừ khi bạn yêu cầu cụ thể

disk_dir.mkdir[parents=True, exist_ok=True]
lmdb_dir.mkdir[parents=True, exist_ok=True]
hdf5_dir.mkdir[parents=True, exist_ok=True]

Bây giờ, bạn có thể chuyển sang chạy các thử nghiệm thực tế, với các ví dụ về mã về cách thực hiện các tác vụ cơ bản bằng ba phương pháp khác nhau. Chúng ta có thể sử dụng mô-đun

$ conda install -c conda-forge python-lmdb
5, được bao gồm trong thư viện chuẩn của Python, để tính thời gian cho các thí nghiệm

Mặc dù mục đích chính của bài viết này không phải là tìm hiểu các API của các gói Python khác nhau, nhưng sẽ rất hữu ích nếu bạn hiểu cách chúng có thể được triển khai. Chúng tôi sẽ xem xét các nguyên tắc chung cùng với tất cả mã được sử dụng để tiến hành các thử nghiệm lưu trữ

Loại bỏ các quảng cáo

Lưu trữ vào đĩa

Đầu vào của chúng tôi cho thử nghiệm này là một hình ảnh duy nhất

$ conda install -c conda-forge python-lmdb
6, hiện trong bộ nhớ dưới dạng một mảng NumPy. Trước tiên, bạn muốn lưu nó vào đĩa dưới dạng ảnh
$ pip install lmdb
0 và đặt tên cho ảnh bằng ID ảnh duy nhất là
$ conda install -c conda-forge python-lmdb
8. Điều này có thể được thực hiện bằng cách sử dụng gói
$ pip install lmdb
8 mà bạn đã cài đặt trước đó

from PIL import Image
import csv

def store_single_disk[image, image_id, label]:
    """ Stores a single image as a .png file on disk.
        Parameters:
        ---------------
        image       image array, [32, 32, 3] to be stored
        image_id    integer unique ID for image
        label       image label
    """
    Image.fromarray[image].save[disk_dir / f"{image_id}.png"]

    with open[disk_dir / f"{image_id}.csv", "wt"] as csvfile:
        writer = csv.writer[
            csvfile, delimiter=" ", quotechar="|", quoting=csv.QUOTE_MINIMAL
        ]
        writer.writerow[[label]]

Điều này lưu hình ảnh. Trong tất cả các ứng dụng thực tế, bạn cũng quan tâm đến siêu dữ liệu được đính kèm với hình ảnh, mà trong bộ dữ liệu ví dụ của chúng tôi là nhãn hình ảnh. Khi bạn đang lưu trữ hình ảnh vào đĩa, có một số tùy chọn để lưu siêu dữ liệu

Một giải pháp là mã hóa các nhãn thành tên hình ảnh. Điều này có lợi thế là không yêu cầu bất kỳ tệp bổ sung nào

Tuy nhiên, nó cũng có nhược điểm lớn là buộc bạn phải xử lý tất cả các tệp bất cứ khi nào bạn làm bất cứ điều gì với nhãn. Lưu trữ các nhãn trong một tệp riêng biệt cho phép bạn chơi xung quanh với các nhãn một mình mà không phải tải hình ảnh. Ở trên, tôi đã lưu trữ các nhãn trong một tệp

$ pip install h5py
0 riêng cho thử nghiệm này

Bây giờ, hãy chuyển sang thực hiện chính xác nhiệm vụ tương tự với LMDB

Lưu trữ vào LMDB

Thứ nhất, LMDB là một hệ thống lưu trữ khóa-giá trị trong đó mỗi mục nhập được lưu dưới dạng một mảng byte, vì vậy, trong trường hợp của chúng tôi, các khóa sẽ là mã định danh duy nhất cho mỗi hình ảnh và giá trị sẽ là chính hình ảnh đó. Cả khóa và giá trị đều phải là chuỗi, do đó, cách sử dụng phổ biến là tuần tự hóa giá trị dưới dạng chuỗi, sau đó bỏ tuần tự hóa giá trị đó khi đọc lại

Bạn có thể sử dụng

$ pip install lmdb
3 để sắp xếp theo thứ tự. Bất kỳ đối tượng Python nào cũng có thể được tuần tự hóa, vì vậy bạn cũng có thể đưa siêu dữ liệu hình ảnh vào cơ sở dữ liệu. Điều này giúp bạn tránh rắc rối khi đính kèm dữ liệu meta trở lại dữ liệu hình ảnh khi chúng tôi tải tập dữ liệu từ đĩa

Bạn có thể tạo một lớp Python cơ bản cho hình ảnh và dữ liệu meta của nó

$ pip install Pillow
0

Thứ hai, vì LMDB được ánh xạ bộ nhớ, các cơ sở dữ liệu mới cần biết chúng dự kiến ​​sẽ sử dụng bao nhiêu bộ nhớ. Điều này tương đối đơn giản trong trường hợp của chúng ta, nhưng nó có thể là một vấn đề lớn trong các trường hợp khác, mà bạn sẽ thấy sâu hơn trong phần sau. LMDB gọi biến này là

$ pip install h5py
2

Cuối cùng, các thao tác đọc và ghi với LMDB được thực hiện trong

$ pip install h5py
3. Bạn có thể coi chúng tương tự như cơ sở dữ liệu truyền thống, bao gồm một nhóm các thao tác trên cơ sở dữ liệu. Điều này có vẻ phức tạp hơn nhiều so với phiên bản đĩa, nhưng hãy chờ và tiếp tục đọc

Với ba điểm đó, hãy xem mã để lưu một hình ảnh vào LMDB

$ pip install Pillow
1

Ghi chú. Bạn nên tính toán số byte chính xác mà mỗi cặp khóa-giá trị sẽ chiếm

Với tập dữ liệu hình ảnh có kích thước khác nhau, đây sẽ là giá trị gần đúng, nhưng bạn có thể sử dụng

$ pip install h5py
4 để có giá trị gần đúng. Hãy nhớ rằng
$ pip install h5py
5 sẽ chỉ trả về kích thước của một định nghĩa lớp, là 1056, không phải kích thước của một đối tượng được khởi tạo

Hàm cũng sẽ không thể tính toán đầy đủ các mục, danh sách hoặc đối tượng lồng nhau có chứa tham chiếu đến các đối tượng khác

Ngoài ra, bạn có thể sử dụng để tiết kiệm cho mình một số tính toán bằng cách xác định kích thước chính xác của đối tượng

Bây giờ bạn đã sẵn sàng để lưu hình ảnh vào LMDB. Cuối cùng, hãy xem phương pháp cuối cùng, HDF5

Lưu trữ với HDF5

Hãy nhớ rằng một tệp HDF5 có thể chứa nhiều tập dữ liệu. Trong trường hợp khá tầm thường này, bạn có thể tạo hai bộ dữ liệu, một cho hình ảnh và một cho siêu dữ liệu của nó

$ pip install Pillow
2

$ pip install h5py
7 chỉ định loại dữ liệu sẽ được lưu trữ trong tập dữ liệu, trong trường hợp này là số nguyên 8 bit không dấu. Bạn có thể xem danh sách đầy đủ các kiểu dữ liệu được xác định trước của HDF tại đây

Ghi chú. Việc lựa chọn kiểu dữ liệu sẽ ảnh hưởng mạnh đến thời gian chạy và yêu cầu lưu trữ của HDF5, vì vậy tốt nhất bạn nên chọn các yêu cầu tối thiểu của mình

Bây giờ chúng ta đã xem xét ba phương pháp lưu một hình ảnh, hãy chuyển sang bước tiếp theo

Loại bỏ các quảng cáo

Các thử nghiệm để lưu trữ một hình ảnh

Bây giờ bạn có thể đặt cả ba chức năng để lưu một hình ảnh vào từ điển, có thể được gọi sau này trong quá trình thử nghiệm thời gian

$ pip install Pillow
3

Cuối cùng, mọi thứ đã sẵn sàng để tiến hành thí nghiệm hẹn giờ. Hãy thử lưu hình ảnh đầu tiên từ CIFAR và nhãn tương ứng của nó và lưu trữ nó theo ba cách khác nhau

$ pip install Pillow
4

Ghi chú. Trong khi chơi với LMDB, bạn có thể thấy lỗi

$ pip install h5py
8. Điều quan trọng cần lưu ý là LMDB không ghi đè lên các giá trị có sẵn, ngay cả khi chúng có cùng khóa

Điều này góp phần làm cho thời gian ghi nhanh, nhưng điều đó cũng có nghĩa là nếu bạn lưu trữ một hình ảnh nhiều lần trong cùng một tệp LMDB, thì bạn sẽ sử dụng hết kích thước bản đồ. Nếu bạn chạy một chức năng lưu trữ, trước tiên hãy nhớ xóa mọi tệp LMDB có sẵn

Hãy nhớ rằng chúng tôi quan tâm đến thời gian chạy, được hiển thị ở đây tính bằng giây và cả mức sử dụng bộ nhớ

MethodSave Single Image + MetaMemoryDisk1. 915 ms8 KLMDB1. 203 ms32 KHDF58. 243 ms8 K

Có hai điều rút ra ở đây

  1. Tất cả các phương pháp đều nhanh chóng
  2. Về mặt sử dụng đĩa, LMDB sử dụng nhiều hơn

Rõ ràng, mặc dù LMDB dẫn đầu về hiệu suất một chút, chúng tôi vẫn chưa thuyết phục được ai tại sao không chỉ lưu trữ hình ảnh trên đĩa. Xét cho cùng, đó là định dạng con người có thể đọc được và bạn có thể mở và xem chúng từ bất kỳ trình duyệt hệ thống tệp nào. Chà, đã đến lúc xem nhiều hình ảnh hơn…

Lưu trữ nhiều hình ảnh

Bạn đã thấy mã để sử dụng các phương pháp lưu trữ khác nhau để lưu một hình ảnh, vì vậy bây giờ chúng ta cần điều chỉnh mã để lưu nhiều hình ảnh và sau đó chạy thử nghiệm theo thời gian

Điều chỉnh mã cho nhiều hình ảnh

Việc lưu nhiều hình ảnh dưới dạng tệp

$ pip install lmdb
0 cũng đơn giản như việc gọi
$ conda install -c conda-forge h5py
0 nhiều lần. Nhưng điều này không đúng với LMDB hoặc HDF5, vì bạn không muốn có một tệp cơ sở dữ liệu khác cho mỗi hình ảnh. Thay vào đó, bạn muốn đặt tất cả các hình ảnh vào một hoặc nhiều tệp

Bạn sẽ cần thay đổi mã một chút và tạo ba chức năng mới chấp nhận nhiều hình ảnh,

$ conda install -c conda-forge h5py
1,
$ conda install -c conda-forge h5py
2 và
$ conda install -c conda-forge h5py
3

$ pip install Pillow
5

Vì vậy, bạn có thể lưu trữ nhiều tệp vào đĩa, phương thức tệp hình ảnh đã được thay đổi để lặp qua từng hình ảnh trong danh sách. Đối với LMDB, cũng cần có một vòng lặp vì chúng tôi đang tạo một đối tượng

$ conda install -c conda-forge h5py
4 cho mỗi hình ảnh và dữ liệu meta của nó

Điều chỉnh nhỏ nhất là với phương pháp HDF5. Trên thực tế, hầu như không có sự điều chỉnh nào cả. Các tệp HFD5 không có giới hạn về kích thước tệp ngoài các hạn chế bên ngoài hoặc kích thước tập dữ liệu, vì vậy tất cả các hình ảnh được nhồi vào một tập dữ liệu duy nhất, giống như trước đây

Tiếp theo, bạn sẽ cần chuẩn bị tập dữ liệu cho các thử nghiệm bằng cách tăng kích thước của tập dữ liệu đó

Loại bỏ các quảng cáo

Chuẩn bị bộ dữ liệu

Trước khi chạy lại thử nghiệm, trước tiên hãy nhân đôi kích thước tập dữ liệu của chúng tôi để chúng tôi có thể thử nghiệm với tối đa 100.000 hình ảnh

$ pip install Pillow
6

Bây giờ đã có đủ hình ảnh, đã đến lúc thử nghiệm

Thử nghiệm lưu trữ nhiều hình ảnh

Như bạn đã làm với việc đọc nhiều hình ảnh, bạn có thể tạo một từ điển xử lý tất cả các chức năng với

$ conda install -c conda-forge h5py
5 và chạy thử nghiệm

$ pip install Pillow
7

Nếu bạn đang theo dõi và tự chạy mã, bạn sẽ cần hồi hộp ngồi lại một lúc và đợi 111.110 hình ảnh được lưu trữ ba lần mỗi hình vào đĩa của bạn, ở ba định dạng khác nhau. Bạn cũng sẽ cần nói lời tạm biệt với khoảng 2 GB dung lượng ổ đĩa

Bây giờ là khoảnh khắc của sự thật. Tất cả việc lưu trữ đó mất bao lâu?

Biểu đồ đầu tiên hiển thị thời gian lưu trữ bình thường, chưa được điều chỉnh, làm nổi bật sự khác biệt lớn giữa việc lưu trữ các tệp

$ pip install lmdb
0 và LMDB hoặc HDF5

Biểu đồ thứ hai hiển thị

$ conda install -c conda-forge h5py
7 của thời gian, nhấn mạnh rằng HDF5 bắt đầu chậm hơn LMDB, nhưng với số lượng hình ảnh lớn hơn, sẽ xuất hiện sớm hơn một chút

Mặc dù kết quả chính xác có thể khác nhau tùy thuộc vào máy của bạn, đây là lý do tại sao LMDB và HDF5 đáng để suy nghĩ. Đây là mã đã tạo biểu đồ trên

$ pip install Pillow
8

Bây giờ chúng ta hãy tiếp tục đọc lại các hình ảnh

Đọc một hình ảnh duy nhất

Đầu tiên, hãy xem xét trường hợp đọc một hình ảnh trở lại thành một mảng cho từng phương thức trong ba phương thức

Đọc từ đĩa

Trong ba phương pháp, LMDB yêu cầu nhiều công việc nhất khi đọc các tệp hình ảnh ra khỏi bộ nhớ, do bước tuần tự hóa. Hãy xem qua các chức năng này để đọc một hình ảnh cho từng định dạng trong số ba định dạng lưu trữ

Trước tiên, hãy đọc một hình ảnh và meta của nó từ tệp

$ pip install lmdb
0 và
$ pip install h5py
0

$ pip install Pillow
9

Loại bỏ các quảng cáo

Đọc từ LMDB

Tiếp theo, đọc cùng một hình ảnh và meta từ LMDB bằng cách mở môi trường và bắt đầu giao dịch đọc

$ conda install -c conda-forge pillow
0

Dưới đây là một vài điểm không phải về đoạn mã trên

  • Dòng 13. Cờ
    from pathlib import Path
    
    disk_dir = Path["data/disk/"]
    lmdb_dir = Path["data/lmdb/"]
    hdf5_dir = Path["data/hdf5/"]
    
    0 chỉ định rằng không được phép ghi trên tệp LMDB cho đến khi giao dịch kết thúc. Trong biệt ngữ cơ sở dữ liệu, nó tương đương với việc khóa đọc
  • Dòng 20. Để truy xuất đối tượng CIFAR_Image, bạn cần đảo ngược các bước mà chúng tôi đã thực hiện để chọn nó khi viết nó. Đây là nơi mà
    from pathlib import Path
    
    disk_dir = Path["data/disk/"]
    lmdb_dir = Path["data/lmdb/"]
    hdf5_dir = Path["data/hdf5/"]
    
    1 của đối tượng hữu ích

Điều này kết thúc việc đọc lại hình ảnh từ LMDB. Cuối cùng, bạn sẽ muốn làm điều tương tự với HDF5

Đọc từ HDF5

Đọc từ HDF5 trông rất giống với quá trình viết. Đây là mã để mở và đọc tệp HDF5 và phân tích cú pháp cùng một hình ảnh và meta

$ conda install -c conda-forge pillow
1

Lưu ý rằng bạn truy cập các bộ dữ liệu khác nhau trong tệp bằng cách lập chỉ mục đối tượng

from pathlib import Path

disk_dir = Path["data/disk/"]
lmdb_dir = Path["data/lmdb/"]
hdf5_dir = Path["data/hdf5/"]
2 bằng cách sử dụng tên bộ dữ liệu trước dấu gạch chéo về phía trước
from pathlib import Path

disk_dir = Path["data/disk/"]
lmdb_dir = Path["data/lmdb/"]
hdf5_dir = Path["data/hdf5/"]
3. Như trước đây, bạn có thể tạo một từ điển chứa tất cả các chức năng đọc

$ conda install -c conda-forge pillow
2

Với từ điển này đã được chuẩn bị, bạn đã sẵn sàng để chạy thử nghiệm

Thử nghiệm để đọc một hình ảnh

Bạn có thể mong đợi rằng thử nghiệm đọc một hình ảnh sẽ có kết quả hơi tầm thường, nhưng đây là mã thử nghiệm

$ conda install -c conda-forge pillow
3

Dưới đây là kết quả của thử nghiệm đọc một hình ảnh

MethodRead Single Image + MetaDisk1. 61970 msLMDB4. 52063 msHDF51. 98036 ms

Đọc các tệp

$ pip install lmdb
0 và
$ pip install h5py
0 trực tiếp từ đĩa sẽ nhanh hơn một chút, nhưng cả ba phương pháp đều thực hiện nhanh chóng. Các thí nghiệm chúng ta sẽ làm tiếp theo thú vị hơn nhiều

Đọc nhiều hình ảnh

Bây giờ bạn có thể điều chỉnh mã để đọc nhiều hình ảnh cùng một lúc. Đây có thể là hành động bạn sẽ thực hiện thường xuyên nhất, vì vậy hiệu suất thời gian chạy là điều cần thiết

Loại bỏ các quảng cáo

Điều chỉnh mã cho nhiều hình ảnh

Mở rộng các hàm trên, bạn có thể tạo các hàm với

from pathlib import Path

disk_dir = Path["data/disk/"]
lmdb_dir = Path["data/lmdb/"]
hdf5_dir = Path["data/hdf5/"]
6, dùng cho các thí nghiệm tiếp theo. Giống như trước đây, thật thú vị khi so sánh hiệu suất khi đọc số lượng hình ảnh khác nhau, được lặp lại trong mã bên dưới để tham khảo

$ conda install -c conda-forge pillow
4

Với các chức năng đọc được lưu trữ trong từ điển cũng như các chức năng viết, bạn đã sẵn sàng cho thử nghiệm

Thử nghiệm để đọc nhiều hình ảnh

Bây giờ bạn có thể chạy thử nghiệm để đọc nhiều hình ảnh

$ conda install -c conda-forge pillow
5

Như chúng tôi đã làm trước đây, bạn có thể vẽ biểu đồ kết quả thử nghiệm đã đọc

Biểu đồ trên cùng hiển thị thời gian đọc bình thường, chưa được điều chỉnh, cho thấy sự khác biệt lớn giữa việc đọc từ tệp

$ pip install lmdb
0 và LMDB hoặc HDF5

Ngược lại, biểu đồ ở phía dưới hiển thị

$ conda install -c conda-forge h5py
7 của thời gian, làm nổi bật sự khác biệt tương đối với ít hình ảnh hơn. Cụ thể, chúng ta có thể thấy HDF5 khởi đầu phía sau như thế nào, nhưng với nhiều hình ảnh hơn, HDF5 trở nên nhanh hơn LMDB một cách nhất quán một chút

Viết thời gian đọcHiển thị/Ẩn

Sử dụng chức năng vẽ đồ thị tương tự như đối với thời gian ghi, chúng tôi có những điều sau đây

$ conda install -c conda-forge pillow
6

Trong thực tế, thời gian viết thường ít quan trọng hơn thời gian đọc. Hãy tưởng tượng rằng bạn đang đào tạo một mạng lưới thần kinh sâu về hình ảnh và chỉ một nửa toàn bộ tập dữ liệu hình ảnh của bạn phù hợp với RAM cùng một lúc. Mỗi kỷ nguyên đào tạo mạng yêu cầu toàn bộ tập dữ liệu và mô hình cần vài trăm kỷ nguyên để hội tụ. Về cơ bản, bạn sẽ đọc một nửa tập dữ liệu vào bộ nhớ mỗi kỷ nguyên

Có một số thủ thuật mà mọi người thực hiện, chẳng hạn như đào tạo các kỷ nguyên giả để làm cho điều này tốt hơn một chút, nhưng bạn hiểu ý

Bây giờ, hãy nhìn lại vào biểu đồ đã đọc ở trên. Sự khác biệt đột ngột giữa thời gian đọc 40 giây và 4 giây là sự khác biệt giữa việc đợi sáu giờ để mô hình của bạn đào tạo hoặc bốn mươi phút

Nếu chúng ta xem thời gian đọc và ghi trên cùng một biểu đồ, thì chúng ta có kết quả như sau

Viết thời gian đọc và ghiHiển thị/Ẩn

Bạn có thể vẽ tất cả thời gian đọc và ghi trên một biểu đồ bằng cách sử dụng cùng chức năng vẽ đồ thị

$ conda install -c conda-forge pillow
7

Khi bạn đang lưu trữ hình ảnh dưới dạng tệp

$ pip install lmdb
0, sẽ có sự khác biệt lớn giữa thời gian ghi và đọc. Tuy nhiên, với LMDB và HDF5, sự khác biệt ít rõ rệt hơn nhiều. Nhìn chung, ngay cả khi thời gian đọc quan trọng hơn thời gian ghi, thì vẫn có lý lẽ mạnh mẽ để lưu trữ hình ảnh bằng LMDB hoặc HDF5

Bây giờ bạn đã thấy những lợi ích về hiệu suất của LMDB và HDF5, hãy xem xét một chỉ số quan trọng khác. sử dụng đĩa

Loại bỏ các quảng cáo

Xem xét việc sử dụng đĩa

Tốc độ không phải là thước đo hiệu suất duy nhất mà bạn có thể quan tâm. Chúng tôi đã xử lý các bộ dữ liệu rất lớn, vì vậy dung lượng ổ đĩa cũng là một mối quan tâm rất hợp lệ và phù hợp

Giả sử bạn có tập dữ liệu hình ảnh là 3TB. Có lẽ, bạn đã có chúng trên đĩa ở đâu đó, không giống như ví dụ CIFAR của chúng tôi, vì vậy bằng cách sử dụng một phương pháp lưu trữ thay thế, về cơ bản, bạn đang tạo một bản sao của chúng, bản sao này cũng phải được lưu trữ. Làm như vậy sẽ mang lại cho bạn những lợi ích to lớn về hiệu suất khi bạn sử dụng hình ảnh, nhưng bạn sẽ cần đảm bảo rằng mình có đủ dung lượng đĩa

Các phương pháp lưu trữ khác nhau sử dụng bao nhiêu dung lượng đĩa?

Tạo sơ đồ vạch để sử dụng dung lượng ổ đĩaHiển thị/Ẩn

Tôi đã sử dụng lệnh Linux

disk_dir.mkdir[parents=True, exist_ok=True]
lmdb_dir.mkdir[parents=True, exist_ok=True]
hdf5_dir.mkdir[parents=True, exist_ok=True]
0 để tính mức sử dụng đĩa trên hệ thống của mình. Phương pháp này có một số giá trị gần đúng do làm tròn, nhưng đây là so sánh chung

$ conda install -c conda-forge pillow
8

Cả HDF5 và LMDB đều chiếm nhiều dung lượng ổ đĩa hơn nếu bạn lưu trữ bằng cách sử dụng hình ảnh

$ pip install lmdb
0 bình thường. Điều quan trọng cần lưu ý là cả việc sử dụng và hiệu suất của đĩa LMDB và HDF5 đều phụ thuộc nhiều vào nhiều yếu tố khác nhau, bao gồm cả hệ điều hành và quan trọng hơn là kích thước của dữ liệu bạn lưu trữ

LMDB đạt được hiệu quả từ bộ nhớ đệm và tận dụng kích thước trang của hệ điều hành. Bạn không cần phải hiểu hoạt động bên trong của nó, nhưng lưu ý rằng với hình ảnh lớn hơn, bạn sẽ sử dụng đĩa nhiều hơn đáng kể với LMDB, vì hình ảnh sẽ không vừa với các trang lá của LMDB, vị trí lưu trữ thông thường trong cây và . Thanh LMDB trong biểu đồ trên sẽ bắn ra khỏi biểu đồ

Hình ảnh pixel 32x32x3 của chúng tôi tương đối nhỏ so với hình ảnh trung bình mà bạn có thể sử dụng và chúng cho phép hiệu suất LMDB tối ưu

Mặc dù chúng tôi sẽ không khám phá nó ở đây bằng thực nghiệm, nhưng theo kinh nghiệm của riêng tôi với hình ảnh 256x256x3 hoặc 512x512x3 pixel, HDF5 thường hiệu quả hơn một chút về mặt sử dụng đĩa so với LMDB. Đây là một sự chuyển tiếp tốt sang phần cuối cùng, một cuộc thảo luận định tính về sự khác biệt giữa các phương pháp

Thảo luận

Có các tính năng phân biệt khác của LMDB và HDF5 đáng để biết và điều quan trọng là phải thảo luận ngắn gọn về một số lời chỉ trích của cả hai phương pháp. Một số liên kết được bao gồm cùng với cuộc thảo luận nếu bạn muốn tìm hiểu thêm

Truy cập song song

Một so sánh quan trọng mà chúng tôi đã không kiểm tra trong các thử nghiệm ở trên là đọc và ghi đồng thời. Thông thường, với các tập dữ liệu lớn như vậy, bạn có thể muốn tăng tốc hoạt động của mình thông qua song song hóa

Trong phần lớn các trường hợp, bạn sẽ không muốn đọc các phần của cùng một hình ảnh cùng một lúc mà bạn sẽ muốn đọc nhiều hình ảnh cùng một lúc. Với định nghĩa về đồng thời này, việc lưu trữ vào đĩa dưới dạng tệp

$ pip install lmdb
0 thực sự cho phép đồng thời hoàn toàn. Không có gì ngăn cản bạn đọc nhiều hình ảnh cùng một lúc từ các chủ đề khác nhau hoặc ghi nhiều tệp cùng một lúc, miễn là các tên hình ảnh khác nhau

Còn LMDB thì sao? . Bạn có thể đọc thêm về điều đó tại trang web công nghệ LMDB

Nhiều ứng dụng có thể truy cập cùng một cơ sở dữ liệu LMDB cùng một lúc và nhiều luồng từ cùng một quy trình cũng có thể đồng thời truy cập LMDB để đọc. Điều này cho phép thời gian đọc nhanh hơn. nếu bạn chia tất cả CIFAR thành mười bộ, thì bạn có thể thiết lập mười quy trình để mỗi lần đọc trong một bộ và nó sẽ chia thời gian tải cho mười

HDF5 cũng cung cấp I/O song song, cho phép đọc và ghi đồng thời. Tuy nhiên, khi triển khai, khóa ghi được giữ và quyền truy cập là tuần tự, trừ khi bạn có hệ thống tệp song song

Có hai tùy chọn chính nếu bạn đang làm việc trên một hệ thống như vậy, sẽ được thảo luận sâu hơn trong bài viết này của Nhóm HDF về IO song song. Việc này có thể trở nên khá phức tạp và tùy chọn đơn giản nhất là chia tập dữ liệu của bạn thành nhiều tệp HDF5 một cách thông minh, sao cho mỗi quy trình có thể xử lý một tệp

disk_dir.mkdir[parents=True, exist_ok=True]
lmdb_dir.mkdir[parents=True, exist_ok=True]
hdf5_dir.mkdir[parents=True, exist_ok=True]
3 độc lập với các tệp khác

Tài liệu

Nếu bạn Google

disk_dir.mkdir[parents=True, exist_ok=True]
lmdb_dir.mkdir[parents=True, exist_ok=True]
hdf5_dir.mkdir[parents=True, exist_ok=True]
4, ít nhất là ở Vương quốc Anh, kết quả tìm kiếm thứ ba là IMDb, Cơ sở dữ liệu phim trên Internet. Đó không phải là những gì bạn đang tìm kiếm

Trên thực tế, có một nguồn tài liệu chính cho ràng buộc Python của LMDB, được lưu trữ trên. Trong khi gói Python thậm chí còn chưa đạt phiên bản > 0. 94, nó được sử dụng khá rộng rãi và được coi là ổn định

Đối với bản thân công nghệ LMDB, có nhiều tài liệu chi tiết hơn tại trang web công nghệ LMDB, có thể giống như học phép tính ở lớp hai, trừ khi bạn bắt đầu từ trang Bắt đầu của họ

Đối với HDF5, có tài liệu rất rõ ràng tại trang tài liệu h5py, cũng như một bài đăng trên blog hữu ích của Christopher Lovell, đây là một tổng quan tuyệt vời về cách sử dụng gói

disk_dir.mkdir[parents=True, exist_ok=True]
lmdb_dir.mkdir[parents=True, exist_ok=True]
hdf5_dir.mkdir[parents=True, exist_ok=True]
5. Cuốn sách O'Reilly, Python và HDF5 cũng là một cách hay để bắt đầu

Mặc dù không phải là tài liệu mà có lẽ người mới bắt đầu sẽ đánh giá cao, nhưng cả LMDB và HDF5 đều có cộng đồng người dùng lớn, do đó, tìm kiếm sâu hơn trên Google thường mang lại kết quả hữu ích

Loại bỏ các quảng cáo

Một cái nhìn phê phán hơn về việc thực hiện

Không có điều không tưởng trong các hệ thống lưu trữ và cả LMDB và HDF5 đều có những cạm bẫy

Một điểm quan trọng cần hiểu về LMDB là dữ liệu mới được ghi mà không ghi đè hoặc di chuyển dữ liệu hiện có. Đây là một quyết định thiết kế cho phép đọc cực nhanh mà bạn đã chứng kiến ​​trong các thử nghiệm của chúng tôi, đồng thời đảm bảo tính toàn vẹn và độ tin cậy của dữ liệu mà không cần lưu giữ thêm nhật ký giao dịch

Tuy nhiên, hãy nhớ rằng bạn cần xác định tham số

$ pip install h5py
2 để cấp phát bộ nhớ trước khi ghi vào cơ sở dữ liệu mới? . Giả sử bạn đã tạo cơ sở dữ liệu LMDB và mọi thứ đều tuyệt vời. Bạn đã kiên nhẫn chờ đợi tập dữ liệu khổng lồ của mình được đóng gói vào LMDB

Sau đó, ở cuối dòng, bạn nhớ rằng bạn cần thêm dữ liệu mới. Ngay cả với bộ đệm bạn đã chỉ định trên

$ pip install h5py
2, bạn có thể dễ dàng thấy lỗi
disk_dir.mkdir[parents=True, exist_ok=True]
lmdb_dir.mkdir[parents=True, exist_ok=True]
hdf5_dir.mkdir[parents=True, exist_ok=True]
8. Trừ khi bạn muốn viết lại toàn bộ cơ sở dữ liệu của mình, với
$ pip install h5py
2 được cập nhật, bạn sẽ phải lưu trữ dữ liệu mới đó trong một tệp LMDB riêng biệt. Mặc dù một giao dịch có thể mở rộng trên nhiều tệp LMDB, nhưng việc có nhiều tệp vẫn có thể gây khó khăn

Ngoài ra, một số hệ thống có các hạn chế về dung lượng bộ nhớ có thể được yêu cầu cùng một lúc. Theo kinh nghiệm của riêng tôi, khi làm việc với các hệ thống điện toán hiệu năng cao [HPC], điều này tỏ ra vô cùng khó chịu và thường khiến tôi thích HDF5 hơn LMDB

Với cả LMDB và HDF5, chỉ có mục được yêu cầu được đọc vào bộ nhớ cùng một lúc. Với LMDB, từng cặp khóa-đơn vị được đọc vào bộ nhớ, trong khi với HDF5, đối tượng

from PIL import Image
import csv

def store_single_disk[image, image_id, label]:
    """ Stores a single image as a .png file on disk.
        Parameters:
        ---------------
        image       image array, [32, 32, 3] to be stored
        image_id    integer unique ID for image
        label       image label
    """
    Image.fromarray[image].save[disk_dir / f"{image_id}.png"]

    with open[disk_dir / f"{image_id}.csv", "wt"] as csvfile:
        writer = csv.writer[
            csvfile, delimiter=" ", quotechar="|", quoting=csv.QUOTE_MINIMAL
        ]
        writer.writerow[[label]]
0 có thể được truy cập giống như một mảng Python, với chỉ mục
from PIL import Image
import csv

def store_single_disk[image, image_id, label]:
    """ Stores a single image as a .png file on disk.
        Parameters:
        ---------------
        image       image array, [32, 32, 3] to be stored
        image_id    integer unique ID for image
        label       image label
    """
    Image.fromarray[image].save[disk_dir / f"{image_id}.png"]

    with open[disk_dir / f"{image_id}.csv", "wt"] as csvfile:
        writer = csv.writer[
            csvfile, delimiter=" ", quotechar="|", quoting=csv.QUOTE_MINIMAL
        ]
        writer.writerow[[label]]
1, phạm vi,
from PIL import Image
import csv

def store_single_disk[image, image_id, label]:
    """ Stores a single image as a .png file on disk.
        Parameters:
        ---------------
        image       image array, [32, 32, 3] to be stored
        image_id    integer unique ID for image
        label       image label
    """
    Image.fromarray[image].save[disk_dir / f"{image_id}.png"]

    with open[disk_dir / f"{image_id}.csv", "wt"] as csvfile:
        writer = csv.writer[
            csvfile, delimiter=" ", quotechar="|", quoting=csv.QUOTE_MINIMAL
        ]
        writer.writerow[[label]]
2 và cách ghép nối khác
from PIL import Image
import csv

def store_single_disk[image, image_id, label]:
    """ Stores a single image as a .png file on disk.
        Parameters:
        ---------------
        image       image array, [32, 32, 3] to be stored
        image_id    integer unique ID for image
        label       image label
    """
    Image.fromarray[image].save[disk_dir / f"{image_id}.png"]

    with open[disk_dir / f"{image_id}.csv", "wt"] as csvfile:
        writer = csv.writer[
            csvfile, delimiter=" ", quotechar="|", quoting=csv.QUOTE_MINIMAL
        ]
        writer.writerow[[label]]
3

Do cách hệ thống được tối ưu hóa và tùy thuộc vào hệ điều hành của bạn, thứ tự bạn truy cập các mục có thể ảnh hưởng đến hiệu suất

Theo kinh nghiệm của tôi, nói chung đúng là đối với LMDB, bạn có thể có hiệu suất tốt hơn khi truy cập các mục tuần tự theo khóa [các cặp khóa-giá trị được lưu trong bộ nhớ được sắp xếp theo thứ tự chữ và số theo khóa] và đối với HDF5, truy cập phạm vi lớn sẽ hoạt động tốt hơn đọc

$ conda install -c conda-forge pillow
9

Nếu bạn đang cân nhắc lựa chọn định dạng lưu trữ tệp để viết phần mềm của mình, sẽ thật thiếu sót nếu không đề cập đến Di chuyển khỏi HDF5 của Cyrille Rossant về những cạm bẫy của HDF5 và phản hồi của Konrad Hinsen về HDF5 và tương lai của quản lý dữ liệu, trong đó . Lưu ý rằng tập dữ liệu tương đối nhỏ hơn vẫn có kích thước vài GB

Tích hợp với các thư viện khác

Nếu bạn đang xử lý các tập dữ liệu thực sự lớn, thì rất có khả năng bạn sẽ làm được điều gì đó quan trọng với chúng. Thật đáng để xem xét các thư viện học sâu và loại tích hợp nào với LMDB và HDF5

Trước hết, tất cả các thư viện đều hỗ trợ đọc hình ảnh từ đĩa dưới dạng tệp

$ pip install lmdb
0, miễn là bạn chuyển đổi chúng thành mảng NumPy có định dạng mong muốn. Điều này đúng với tất cả các phương pháp và chúng ta đã thấy ở trên rằng việc đọc ảnh dưới dạng mảng tương đối đơn giản.

Dưới đây là một số thư viện học sâu phổ biến nhất và sự tích hợp LMDB và HDF5 của chúng

  • Caffe có tích hợp LMDB ổn định, được hỗ trợ tốt và nó xử lý bước đọc một cách rõ ràng. Lớp LMDB cũng có thể dễ dàng được thay thế bằng cơ sở dữ liệu HDF5

  • Máy ảnh sử dụng định dạng HDF5 để lưu và khôi phục mô hình. Điều này ngụ ý rằng TensorFlow cũng có thể

  • TensorFlow có lớp tích hợp sẵn

    from PIL import Image
    import csv
    
    def store_single_disk[image, image_id, label]:
        """ Stores a single image as a .png file on disk.
            Parameters:
            ---------------
            image       image array, [32, 32, 3] to be stored
            image_id    integer unique ID for image
            label       image label
        """
        Image.fromarray[image].save[disk_dir / f"{image_id}.png"]
    
        with open[disk_dir / f"{image_id}.csv", "wt"] as csvfile:
            writer = csv.writer[
                csvfile, delimiter=" ", quotechar="|", quoting=csv.QUOTE_MINIMAL
            ]
            writer.writerow[[label]]
    
    5 cung cấp giao diện để đọc dữ liệu đầu vào từ tệp LMDB và có thể tạo các bộ vòng lặp và tenxơ theo lô. TensorFlow không có lớp dựng sẵn cho HDF5, nhưng có thể viết một lớp kế thừa từ lớp
    from PIL import Image
    import csv
    
    def store_single_disk[image, image_id, label]:
        """ Stores a single image as a .png file on disk.
            Parameters:
            ---------------
            image       image array, [32, 32, 3] to be stored
            image_id    integer unique ID for image
            label       image label
        """
        Image.fromarray[image].save[disk_dir / f"{image_id}.png"]
    
        with open[disk_dir / f"{image_id}.csv", "wt"] as csvfile:
            writer = csv.writer[
                csvfile, delimiter=" ", quotechar="|", quoting=csv.QUOTE_MINIMAL
            ]
            writer.writerow[[label]]
    
    6. Cá nhân tôi sử dụng hoàn toàn một lớp tùy chỉnh được thiết kế để truy cập đọc tối ưu dựa trên cách tôi cấu trúc các tệp HDF5 của mình

  • Theano vốn không hỗ trợ bất kỳ định dạng tệp hoặc cơ sở dữ liệu cụ thể nào, nhưng như đã nêu trước đây, có thể sử dụng bất kỳ thứ gì miễn là nó được đọc dưới dạng mảng N chiều

Mặc dù còn lâu mới toàn diện, nhưng điều này hy vọng mang đến cho bạn cảm nhận về sự tích hợp LMDB/HDF5 của một số thư viện deep learning chính

Một vài hiểu biết cá nhân về lưu trữ hình ảnh trong Python

Trong công việc hàng ngày của mình, phân tích hàng terabyte hình ảnh y tế, tôi sử dụng cả LMDB và HDF5, và đã học được rằng, với bất kỳ phương pháp lưu trữ nào, việc suy nghĩ trước là rất quan trọng

Thông thường, các mô hình cần được đào tạo bằng cách sử dụng xác thực chéo k-fold, bao gồm việc chia toàn bộ tập dữ liệu thành k bộ [k thường là 10] và k mô hình được đào tạo, mỗi mô hình có một bộ k khác nhau được sử dụng làm bộ kiểm tra. Điều này đảm bảo rằng mô hình không khớp quá mức với tập dữ liệu, hay nói cách khác, không thể đưa ra dự đoán tốt trên dữ liệu không nhìn thấy

Một cách tiêu chuẩn để tạo tập hợp k là đặt một biểu diễn bằng nhau cho từng loại dữ liệu được biểu thị trong tập dữ liệu trong mỗi tập hợp k. Do đó, việc lưu từng bộ k vào bộ dữ liệu HDF5 riêng biệt sẽ tối đa hóa hiệu quả. Đôi khi, một tập hợp k đơn lẻ không thể được tải vào bộ nhớ cùng một lúc, do đó, ngay cả việc sắp xếp thứ tự dữ liệu trong một tập dữ liệu cũng cần phải suy nghĩ trước

Với LMDB, tôi cũng cẩn thận lên kế hoạch trước khi tạo [các] cơ sở dữ liệu. Có một vài câu hỏi hay đáng để hỏi trước khi bạn lưu hình ảnh

  • Làm cách nào tôi có thể lưu hình ảnh sao cho hầu hết các lần đọc sẽ diễn ra tuần tự?
  • Chìa khóa tốt là gì?
  • Làm cách nào tôi có thể tính toán một
    $ pip install h5py
    
    2 tốt, dự đoán những thay đổi tiềm năng trong tương lai trong tập dữ liệu?
  • Một giao dịch có thể lớn đến mức nào và các giao dịch nên được chia nhỏ như thế nào?

Bất kể phương thức lưu trữ là gì, khi bạn đang xử lý các bộ dữ liệu hình ảnh lớn, một kế hoạch nhỏ sẽ giúp bạn đi một chặng đường dài

Loại bỏ các quảng cáo

Phần kết luận

Bạn đã làm đến cùng. Bây giờ bạn đã có một cái nhìn bao quát về một chủ đề lớn

Trong bài viết này, bạn đã được giới thiệu ba cách lưu trữ và truy cập nhiều hình ảnh trong Python và có lẽ bạn đã có cơ hội chơi với một số cách trong số đó. Tất cả mã cho bài viết này nằm trong sổ ghi chép Jupyter tại đây hoặc tập lệnh Python tại đây. Bạn tự chịu rủi ro vì một vài GB dung lượng ổ đĩa của bạn sẽ bị chiếm dụng bởi những hình vuông nhỏ của ô tô, thuyền, v.v.

Bạn đã thấy bằng chứng về cách các phương pháp lưu trữ khác nhau có thể ảnh hưởng đáng kể đến thời gian đọc và ghi, cũng như một số ưu và nhược điểm của ba phương pháp được xem xét trong bài viết này. Mặc dù lưu trữ hình ảnh dưới dạng tệp

$ pip install lmdb
0 có thể là cách trực quan nhất, nhưng có những lợi ích lớn về hiệu suất khi xem xét các phương pháp như HDF5 hoặc LMDB

Vui lòng thảo luận trong phần nhận xét về các phương pháp lưu trữ tuyệt vời không được đề cập trong bài viết này, chẳng hạn như LevelDB, Feather, TileDB, Badger, BoltDB hoặc bất kỳ thứ gì khác. Không có phương pháp lưu trữ hoàn hảo và phương pháp tốt nhất phụ thuộc vào trường hợp sử dụng và tập dữ liệu cụ thể của bạn

Đọc thêm

Dưới đây là một số tài liệu tham khảo liên quan đến ba phương pháp được đề cập trong bài viết này

  • tài liệu LMDB. Bắt đầu
  • Liên kết Python cho HDF5 [h5py]
  • Tập đoàn HDF5
  • “Python và HDF5” từ O'Reilly
  • Cái gối

Bạn cũng có thể đánh giá cao “Phân tích các hệ thống lưu trữ hình ảnh để đào tạo mạng lưới thần kinh sâu có thể mở rộng” của Lim, Young và Patton. Bài báo đó bao gồm các thử nghiệm tương tự như các thử nghiệm trong bài viết này, nhưng ở quy mô lớn hơn nhiều, xem xét bộ đệm lạnh và ấm cũng như các yếu tố khác

Đánh dấu là đã hoàn thành

🐍 Thủ thuật Python 💌

Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python

Gửi cho tôi thủ thuật Python »

Về đá Rebecca

Rebecca là nghiên cứu sinh tiến sĩ về thị giác máy tính và trí tuệ nhân tạo áp dụng cho hình ảnh y tế. Cô say mê giảng dạy

» Thông tin thêm về Rebecca

Mỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là

Aldren

Geir Arne

Joanna

Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Chuyên gia Kỹ năng Python trong thế giới thực
Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bạn nghĩ sao?

Đánh giá bài viết này

Tweet Chia sẻ Chia sẻ Email

Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?

Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi

Bạn có thể tải hình ảnh bằng Python không?

Hình ảnh thường ở định dạng PNG hoặc JPEG và có thể được tải trực tiếp bằng hàm open[] trên lớp Hình ảnh . Điều này trả về một đối tượng Hình ảnh chứa dữ liệu pixel cho hình ảnh cũng như chi tiết về hình ảnh.

Python có hỗ trợ các tệp JPG không?

Ngay cả khi bạn đang sử dụng Thư viện hình ảnh Python [PIL] để vẽ trên vài trăm bức ảnh, bạn vẫn không cần. Lưu trữ hình ảnh trên đĩa, như. png hoặc. các tệp jpg vừa phù hợp vừa phù hợp .

Bạn có thể hiển thị hình ảnh trong thiết bị đầu cuối Python không?

Nó giúp chuyển đổi hình ảnh sang Mã thoát ANSI của nó để có thể chuyển đổi có thể in được trên Giao diện dòng lệnh. Nó cho phép mã hóa màu 8/16/256 bit cho hình ảnh sống động

Chủ Đề