Đọc hình ảnh trong vòng lặp Python
Tại sao bạn muốn biết thêm về các cách lưu trữ và truy cập hình ảnh khác nhau trong Python? . 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, dưới dạng tệp 0 hoặc 1, vừa phù hợp vừa phù hợp Show
Tuy nhiên, số lượng hình ảnh cần thiết cho một tác vụ nhất định ngày càng lớn hơn. Các thuật toán như mạng thần kinh tích chập, còn được gọi là convnets hoặc CNN, có thể xử lý các tập dữ liệu hình ảnh khổng lồ và thậm chí học hỏi từ chúng. Nếu quan tâm, bạn có thể đọc thêm về cách sử dụng convnets để xếp hạng ảnh tự chụp hoặc để phân tích cảm tính ImageNet là một cơ sở dữ liệu hình ảnh công cộng nổi tiếng được kết hợp để đào tạo các mô hình về các nhiệm vụ như phân loại, phát hiện và phân đoạn đối tượng và nó bao gồm hơn 14 triệu hình ảnh Hãy nghĩ xem sẽ mất bao lâu để tải tất cả chúng vào bộ nhớ để đào tạo, theo đợt, có thể hàng trăm hoặc hàng nghìn lần. Hãy tiếp tục đọc và bạn sẽ tin rằng sẽ mất khá nhiều thời gian—ít nhất là đủ lâu để rời khỏi máy tính của bạn và làm nhiều việc khác trong khi bạn ước mình đã làm việc tại Google hoặc NVIDIA Trong hướng dẫn này, bạn sẽ tìm hiểu về
Bạn cũng sẽ khám phá những điều sau đây
Nếu không có phương pháp lưu trữ nào rung chuông, đừng lo lắng. Đối với bài viết này, tất cả những gì bạn cần là một nền tảng khá vững chắc về Python và hiểu biết cơ bản về hình ảnh (rằng chúng thực sự bao gồm các mảng số đa chiều) và bộ nhớ tương đối, chẳng hạn như sự khác biệt giữa 10MB và 10GB Bắt đầu nào Tiền thưởng miễn phí. Nhấp vào đây để nhận Hướng dẫn nhỏ về các ví dụ về OpenCV và Nhận dạng khuôn mặt Python cho bạn thấy các ví dụ mã thực tế về các kỹ thuật thị giác máy tính Python trong thế giới thực Cài đặtBạn sẽ cần một bộ dữ liệu hình ảnh để thử nghiệm, cũng như một vài gói Python Loại bỏ các quảng cáoMột bộ dữ liệu để chơi vớiChúng tôi sẽ sử dụng bộ dữ liệu hình ảnh của Viện nghiên cứu nâng cao Canada, hay còn gọi là CIFAR-10, bao gồm 60.000 hình ảnh màu 32x32 pixel thuộc các lớp đối tượng khác nhau, chẳng hạn như chó, mèo và máy bay. Về mặt tương đối, CIFAR không phải là một tập dữ liệu quá lớn, nhưng nếu chúng ta sử dụng tập dữ liệu TinyImages đầy đủ thì bạn sẽ cần khoảng 400 GB dung lượng đĩa trống, đây có thể là một yếu tố hạn chế Tín dụng cho bộ dữ liệu như được mô tả trong chương 3 của báo cáo công nghệ này là của Alex Krizhevsky, Vinod Nair và Geoffrey Hinton Nếu bạn muốn làm theo các ví dụ mã trong bài viết này, bạn có thể tải xuống CIFAR-10 tại đây, chọn phiên bản Python. Bạn sẽ hy sinh 163 MB dung lượng ổ đĩa Hình ảnh. Một. KrizhevskyKhi 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 3 hoặc 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 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
Tất cả các hình ảnh hiện có trong RAM ở biến 6, với siêu dữ liệu tương ứng của chúng ở biến 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ápGhi 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 đĩaBạ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 8 để xử lý hình ảnh 0Ngoài ra, nếu thích, bạn có thể cài đặt nó bằng Anaconda 1Ghi chú. 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 bạn đã cài đặt 9 trước đó, hãy nhớ gỡ cài đặt nó trước khi cài đặt 8, vì chúng không thể tồn tại cùng nhauBây giờ bạn đã sẵn sàng để lưu trữ và đọc hình ảnh từ đĩa Bắt đầu với LMDBLMDB, đô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
Bạn cũng có tùy chọn cài đặt qua Anaconda 6Kiểm tra xem bạn có thể 62 từ trình bao Python không và bạn đã sẵn sàngLoại bỏ các quảng cáoBắt đầu với HDF5HDF5 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
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 8Cũng như các thư viện khác, bạn có thể cài đặt luân phiên qua Anaconda 9Nếu bạn có thể 63 từ trình bao Python, thì mọi thứ đã được thiết lập đúng cáchLưu trữ một hình ảnh duy nhấtBâ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 1 64 không tự động tạo các thư mục cho bạn trừ khi bạn yêu cầu cụ thể 3Bâ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 65, được bao gồm trong thư viện chuẩn của Python, để tính thời gian cho các thử nghiệmMặ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áoLư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 66, hiện có 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 0 và đặt tên cho ảnh bằng ID ảnh duy nhất 68. Điều này có thể được thực hiện bằng cách sử dụng gói 8 mà bạn đã cài đặt trước đó 9Đ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 80 riêng biệt cho thử nghiệm nàyBâ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Đầu tiên, 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 3 để tuần tự hóa. 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ừ đĩaBạ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ó 00Thứ 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à 82Cuối cùng, thao tác đọc và ghi với LMDB được thực hiện trong 83. 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 đọcVới ba điểm đó, hãy xem mã để lưu một hình ảnh vào LMDB 01Ghi 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 84 để có được giá trị gần đúng. Hãy nhớ rằng 85 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ạoHà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 86 để tiết kiệm cho bạn 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ượngBâ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 HDF5Hã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ó 02 87 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 đâyGhi 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áoCác thử nghiệm để lưu trữ một hình ảnhBâ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 03Cuố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 04Ghi chú. Trong khi tìm hiểu về LMDB, bạn có thể thấy lỗi 88. Đ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
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 ảnhBạ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 ảnhLưu nhiều hình ảnh dưới dạng tệp 0 cũng đơn giản như gọi 90 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ệpBạ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, 91, 92 và 93 05Vì 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 94 cho mỗi hình ảnh và siêu dữ liệu 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 giới hạn 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áoChuẩn bị bộ dữ liệuTrướ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 06Bây giờ đã có đủ hình ảnh, đã đến lúc thử nghiệm Thử nghiệm lưu trữ nhiều hình ảnhNhư 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 95 và chạy thử nghiệm 07Nế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 lưu trữ vào tệp 0 và LMDB hoặc HDF5Biểu đồ thứ hai hiển thị 97 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útMặ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 08Bâ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ừ đĩaTrong 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ữ Đầu tiên, đọc một hình ảnh và meta của nó từ tệp 0 và 80 09Loại bỏ các quảng cáoĐọc từ LMDBTiế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 10Dưới đây là một vài điểm không phải về đoạn mã trên
Đ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 11Lưu ý rằng bạn truy cập các tập dữ liệu khác nhau trong tệp bằng cách lập chỉ mục đối tượng 12 bằng cách sử dụng tên tập dữ liệu trước dấu gạch chéo lên 13. 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 12Vớ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 ảnhBạ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 13Dướ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 0 và 80 trực tiếp từ đĩa sẽ nhanh hơn một chút, nhưng cả ba phương pháp đều hoạt động 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 ảnhBâ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 ảnhMở rộng các hàm trên, bạn có thể tạo các hàm với 16, 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 14Vớ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 ảnhBây giờ bạn có thể chạy thử nghiệm để đọc nhiều hình ảnh 15Như 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 0 và LMDB hoặc HDF5Ngược lại, biểu đồ ở phía dưới hiển thị 97 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útViế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 16Trong 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ị 17Khi bạn đang lưu trữ hình ảnh dưới dạng tệp 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 HDF5Bâ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áoXem xét việc sử dụng đĩaTố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 tập 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 30 để tính toán 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 18Cả 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 ảnh 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ậnCó 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 songMộ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 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 nhauCò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. Nó 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 33 độc lập với các tệp khácTài liệuNếu bạn Google 34, í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ếmTrên thực tế, có một nguồn tài liệu chính về ràng buộc Python của LMDB, được lưu trữ trên Read the Docs LMDB. 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 35. Cuốn sách O'Reilly, Python và HDF5 cũng là một cách hay để bắt đầuMặ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áoMột cái nhìn phê phán hơn về việc thực hiệnKhô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ố 82 để 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 LMDBSau đó, ở 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 82 của mình, bạn có thể dễ dàng thấy lỗi 38. Trừ khi bạn muốn viết lại toàn bộ cơ sở dữ liệu của mình, với 82 đã 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ănNgoà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 90 có thể được truy cập giống như một mảng Python, với chỉ mục 91, phạm vi, 92 và cách ghép nối khác 93Do 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 19Nế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ácNế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 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
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 PythonTrong 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
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áoPhần kết luậnBạ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 về 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 0 có thể là cách trực quan nhất, nhưng có những lợi ích hiệu suất lớn khi xem xét các phương pháp như HDF5 hoặc LMDBVui 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êmDướ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
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ề RebeccaMỗ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 » Bậc thầy Kỹ năng Python trong thế giới 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ẻ EmailBà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. Nhận các mẹo để đặt câu hỏi hay 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 Làm cách nào để đọc hình ảnh trong vòng lặp Python?việc đọc hình ảnh trong một vòng lặp bằng cách sử dụng python sẽ thay đổi hành vi . xác định url_to_image(url) resp = yêu cầu. lấy (url). thô hình ảnh = np. asarray(bytearray(resp. read()), dtype="uint8") hình ảnh = cv2. imdecode(hình ảnh, cv2. IMREAD_COLOR) trả lại hình ảnh Chúng ta có thể đọc hình ảnh bằng Python không?Sử dụng ImageIO. Imageio là thư viện Python cung cấp giao diện dễ đọc và ghi nhiều loại dữ liệu hình ảnh , bao gồm hình ảnh động, video, dữ liệu thể tích và dữ liệu khoa học . Nó là đa nền tảng, chạy trên Python 3. 7+ và rất dễ cài đặt. |