Mengapa Anda ingin tahu lebih banyak tentang berbagai cara menyimpan dan mengakses gambar dengan Python? . Bahkan jika Anda menggunakan Python Imaging Library (PIL) untuk menggambar beberapa ratus foto, Anda tetap tidak perlu melakukannya. Menyimpan gambar pada disk, sebagai file _0 atau 1, cocok dan sesuai Show
Namun, semakin banyak, jumlah gambar yang diperlukan untuk tugas tertentu semakin besar. Algoritme seperti jaringan saraf convolutional, juga dikenal sebagai convnets atau CNN, dapat menangani kumpulan data gambar yang sangat besar dan bahkan belajar darinya. Jika Anda tertarik, Anda dapat membaca lebih lanjut tentang bagaimana convnets dapat digunakan untuk memeringkat selfie atau untuk analisis sentimen ImageNet adalah database gambar publik terkenal yang disatukan untuk model pelatihan pada tugas-tugas seperti klasifikasi objek, deteksi, dan segmentasi, dan terdiri dari lebih dari 14 juta gambar Pikirkan tentang berapa lama waktu yang dibutuhkan untuk memuat semuanya ke dalam memori untuk pelatihan, dalam batch, mungkin ratusan atau ribuan kali. Teruslah membaca, dan Anda akan yakin bahwa ini akan memakan waktu cukup lama—setidaknya cukup lama untuk meninggalkan komputer Anda dan melakukan banyak hal lain sementara Anda ingin bekerja di Google atau NVIDIA Dalam tutorial ini, Anda akan belajar tentang
Anda juga akan menjelajahi yang berikut ini
Jika tidak ada metode penyimpanan yang menarik, jangan khawatir. untuk artikel ini, yang Anda butuhkan hanyalah fondasi yang cukup kuat dalam Python dan pemahaman dasar tentang gambar (bahwa gambar tersebut benar-benar terdiri dari susunan angka multidimensi) dan memori relatif, seperti perbedaan antara 10MB dan 10GB Mari kita mulai Bonus Gratis. Klik di sini untuk mendapatkan Panduan Mini Deteksi Wajah Python & Contoh OpenCV yang menunjukkan kepada Anda contoh kode praktis dari teknik visi komputer Python dunia nyata MempersiapkanAnda memerlukan kumpulan data gambar untuk bereksperimen, serta beberapa paket Python Hilangkan iklanKumpulan Data untuk DimainkanKami akan menggunakan dataset gambar Canadian Institute for Advanced Research, lebih dikenal sebagai CIFAR-10, yang terdiri dari 60.000 gambar berwarna berukuran 32x32 piksel milik kelas objek yang berbeda, seperti anjing, kucing, dan pesawat terbang. Relatif, CIFAR bukanlah kumpulan data yang sangat besar, tetapi jika kami menggunakan kumpulan data TinyImages lengkap, Anda memerlukan sekitar 400GB ruang disk kosong, yang mungkin akan menjadi faktor pembatas Kredit untuk kumpulan data seperti yang dijelaskan dalam bab 3 laporan teknologi ini diberikan kepada Alex Krizhevsky, Vinod Nair, dan Geoffrey Hinton Jika Anda ingin mengikuti contoh kode dalam artikel ini, Anda dapat mengunduh CIFAR-10 di sini, memilih versi Python. Anda akan mengorbankan 163MB ruang disk Gambar. SEBUAH. KrizhevskySaat Anda mengunduh dan mengekstrak folder, Anda akan menemukan bahwa file tersebut bukan file gambar yang dapat dibaca manusia. Mereka sebenarnya telah diserialisasi dan disimpan dalam batch menggunakan cPickle Meskipun kami tidak akan mempertimbangkan _3 atau 4 dalam artikel ini, selain untuk mengekstrak dataset CIFAR, perlu disebutkan bahwa modul Python 3 memiliki keuntungan utama karena dapat membuat serial objek Python apa pun tanpa kode tambahan atau transformasi di pihak Anda. Ini juga memiliki potensi kerugian yang serius karena menimbulkan risiko keamanan dan tidak dapat mengatasi dengan baik saat menangani data dalam jumlah yang sangat besarKode berikut membuka masing-masing dari lima file batch dan memuat semua gambar ke dalam array NumPy _Semua gambar sekarang ada di RAM dalam variabel 6, dengan meta data yang sesuai di 7, dan siap untuk Anda manipulasi. Selanjutnya, Anda dapat menginstal paket Python yang akan Anda gunakan untuk ketiga metode tersebutCatatan. Blok kode terakhir itu menggunakan f-string. Anda dapat membaca lebih lanjut tentang mereka di f-Strings Python 3. Sintaks Pemformatan String yang Disempurnakan (Panduan) Pengaturan untuk Menyimpan Gambar di DiskAnda harus menyiapkan lingkungan Anda untuk metode penyimpanan default dan mengakses gambar ini dari disk. Artikel ini menganggap Anda memiliki Python 3. x diinstal pada sistem Anda, dan akan menggunakan 8 untuk manipulasi gambar
Atau, jika mau, Anda dapat menginstalnya menggunakan Anaconda
Catatan. 9 adalah versi asli dari Perpustakaan Pencitraan Python, yang tidak lagi dipertahankan dan tidak kompatibel dengan Python 3. x. Jika sebelumnya Anda telah menginstal _9, pastikan untuk menghapus instalannya sebelum menginstal 8, karena keduanya tidak dapat ada bersamaanSekarang Anda siap untuk menyimpan dan membaca gambar dari disk Memulai Dengan LMDBLMDB, terkadang disebut sebagai "Basis Data Petir", adalah singkatan dari Basis Data Pemetaan Memori Petir karena cepat dan menggunakan file yang dipetakan memori. Ini adalah penyimpanan nilai kunci, bukan database relasional Dalam hal implementasi, LMDB adalah pohon B+, yang pada dasarnya berarti bahwa ini adalah struktur grafik seperti pohon yang disimpan dalam memori di mana setiap elemen nilai kunci adalah simpul, dan simpul dapat memiliki banyak anak. Node pada level yang sama dihubungkan satu sama lain untuk traversal cepat Secara kritis, komponen kunci pohon B+ diatur agar sesuai dengan ukuran halaman sistem operasi host, memaksimalkan efisiensi saat mengakses pasangan kunci-nilai apa pun di database. Karena kinerja tinggi LMDB sangat bergantung pada poin khusus ini, efisiensi LMDB telah terbukti bergantung pada sistem file yang mendasarinya dan implementasinya. Alasan utama lain untuk efisiensi LMDB adalah karena dipetakan memori. Ini berarti mengembalikan pointer langsung ke alamat memori dari kunci dan nilai, tanpa perlu menyalin apa pun di memori seperti kebanyakan database lain. Mereka yang ingin mempelajari lebih dalam tentang detail implementasi internal pohon B+ dapat melihat artikel ini tentang pohon B+ dan kemudian bermain dengan visualisasi penyisipan simpul ini Jika pohon B+ tidak menarik bagi Anda, jangan khawatir. Anda tidak perlu tahu banyak tentang penerapan internalnya untuk menggunakan LMDB. Kami akan menggunakan pengikatan Python untuk pustaka LMDB C, yang dapat diinstal melalui pip
Anda juga memiliki opsi untuk menginstal melalui Anaconda
Pastikan Anda dapat _2 dari shell Python, dan Anda siap melakukannyaHilangkan iklanMemulai Dengan HDF5HDF5 adalah singkatan dari Hierarchical Data Format, format file yang disebut sebagai HDF4 atau HDF5. Kami tidak perlu khawatir tentang HDF4, karena HDF5 adalah versi yang dipertahankan saat ini Menariknya, HDF berasal dari National Center for Supercomputing Applications, sebagai format data ilmiah yang ringkas dan portabel. Jika Anda bertanya-tanya apakah itu digunakan secara luas, lihat uraian NASA di HDF5 dari proyek Data Bumi mereka File HDF terdiri dari dua jenis objek
Kumpulan data adalah array multidimensi, dan grup terdiri dari kumpulan data atau grup lain. Array multidimensi dengan berbagai ukuran dan jenis dapat disimpan sebagai kumpulan data, tetapi dimensi dan jenisnya harus seragam di dalam kumpulan data. Setiap dataset harus berisi larik N-dimensi yang homogen. Meskipun demikian, karena grup dan kumpulan data mungkin bersarang, Anda masih bisa mendapatkan heterogenitas yang mungkin Anda perlukan
Seperti perpustakaan lainnya, Anda dapat menginstal secara bergantian melalui Anaconda
Jika Anda dapat _3 dari shell Python, semuanya sudah diatur dengan benarMenyimpan Gambar TunggalSekarang setelah Anda memiliki gambaran umum tentang metode, mari selami dan lihat perbandingan kuantitatif dari tugas-tugas dasar yang kita pedulikan. berapa lama untuk membaca dan menulis file, dan berapa banyak memori disk yang akan digunakan. Ini juga akan berfungsi sebagai pengantar dasar tentang cara kerja metode, dengan contoh kode tentang cara menggunakannya Ketika saya merujuk ke "file", yang saya maksud biasanya banyak dari mereka. Namun, penting untuk membuat perbedaan karena beberapa metode dapat dioptimalkan untuk operasi dan jumlah file yang berbeda Untuk tujuan eksperimen, kami dapat membandingkan performa antara berbagai jumlah file, dengan faktor 10 dari satu gambar hingga 100.000 gambar. Karena lima batch CIFAR-10 kami berjumlah hingga 50.000 gambar, kami dapat menggunakan setiap gambar dua kali untuk mendapatkan 100.000 gambar Untuk mempersiapkan percobaan, Anda ingin membuat folder untuk setiap metode, yang akan berisi semua file database atau gambar, dan menyimpan jalur ke direktori tersebut dalam variabel
_4 tidak secara otomatis membuat folder untuk Anda kecuali Anda secara khusus memintanya
Sekarang Anda dapat melanjutkan untuk menjalankan eksperimen sebenarnya, dengan contoh kode tentang cara melakukan tugas dasar dengan tiga metode berbeda. Kita dapat menggunakan modul _5, yang disertakan dalam pustaka standar Python, untuk membantu mengatur waktu percobaanMeskipun tujuan utama dari artikel ini bukan untuk mempelajari API dari berbagai paket Python, akan sangat membantu untuk memiliki pemahaman tentang bagaimana mereka dapat diimplementasikan. Kami akan membahas prinsip-prinsip umum bersama semua kode yang digunakan untuk melakukan eksperimen penyimpanan Hilangkan iklanMenyimpan ke DiskMasukan kami untuk percobaan ini adalah satu gambar 6, saat ini dalam memori sebagai larik NumPy. Anda ingin menyimpannya terlebih dahulu ke disk sebagai gambar 0, dan menamainya menggunakan ID gambar unik 8. Ini dapat dilakukan dengan menggunakan paket _8 yang Anda instal sebelumnya
Ini menyimpan gambar. Dalam semua aplikasi realistik, Anda juga memperhatikan meta data yang dilampirkan pada gambar, yang dalam kumpulan data contoh kami adalah label gambar. Saat Anda menyimpan gambar ke disk, ada beberapa opsi untuk menyimpan data meta Salah satu solusinya adalah menyandikan label ke dalam nama gambar. Ini memiliki keuntungan karena tidak memerlukan file tambahan Namun, ini juga memiliki kerugian besar karena memaksa Anda menangani semua file setiap kali Anda melakukan sesuatu dengan label. Menyimpan label dalam file terpisah memungkinkan Anda bermain-main dengan label saja, tanpa harus memuat gambar. Di atas, saya telah menyimpan label dalam file 0 terpisah untuk percobaan iniSekarang mari beralih ke melakukan tugas yang persis sama dengan LMDB Menyimpan ke LMDBPertama, LMDB adalah sistem penyimpanan nilai kunci di mana setiap entri disimpan sebagai array byte, jadi dalam kasus kami, kunci akan menjadi pengidentifikasi unik untuk setiap gambar, dan nilainya adalah gambar itu sendiri. Baik kunci dan nilai diharapkan berupa string, jadi penggunaan umumnya adalah membuat serialisasi nilai sebagai string, lalu membatalkan serialisasi saat membacanya kembali. Anda dapat menggunakan _3 untuk serialisasi. Objek Python apa pun dapat diserialisasi, jadi Anda juga dapat menyertakan data meta gambar dalam database. Ini menyelamatkan Anda dari masalah melampirkan data meta kembali ke data gambar saat kami memuat kumpulan data dari diskAnda dapat membuat kelas Python dasar untuk gambar dan data metanya _0Kedua, karena LMDB dipetakan memori, basis data baru perlu mengetahui berapa banyak memori yang diperkirakan akan digunakan. Ini relatif mudah dalam kasus kami, tetapi bisa sangat menyakitkan dalam kasus lain, yang akan Anda lihat lebih dalam di bagian selanjutnya. LMDB menyebut variabel ini 2Terakhir, operasi baca dan tulis dengan LMDB dilakukan di 3. Anda dapat menganggapnya mirip dengan basis data tradisional, yang terdiri dari sekelompok operasi pada basis data. Ini mungkin terlihat jauh lebih rumit daripada versi disk, tetapi tunggu dan teruslah membacaDengan mengingat ketiga poin tersebut, mari kita lihat kode untuk menyimpan satu gambar ke LMDB _1Catatan. Sebaiknya hitung jumlah persis byte yang akan digunakan oleh setiap pasangan nilai kunci Dengan kumpulan data gambar dengan berbagai ukuran, ini akan menjadi perkiraan, tetapi Anda dapat menggunakan 4 untuk mendapatkan perkiraan yang masuk akal. Ingatlah bahwa _5 hanya akan mengembalikan ukuran definisi kelas, yaitu 1056, bukan ukuran objek yang dipakaiFungsi juga tidak akan dapat sepenuhnya menghitung item bersarang, daftar, atau objek yang berisi referensi ke objek lain Bergantian, Anda dapat menggunakan untuk menghemat beberapa perhitungan dengan menentukan ukuran yang tepat dari suatu objek Anda sekarang siap untuk menyimpan gambar ke LMDB. Terakhir, mari kita lihat metode terakhir, HDF5 Menyimpan Dengan HDF5Ingatlah bahwa file HDF5 dapat berisi lebih dari satu kumpulan data. Dalam kasus yang agak sepele ini, Anda dapat membuat dua set data, satu untuk gambar, dan satu lagi untuk meta datanya _2 7 menentukan jenis data yang akan disimpan dalam kumpulan data, yang dalam hal ini adalah bilangan bulat 8-bit yang tidak ditandatangani. Anda dapat melihat daftar lengkap tipe data standar HDF di siniCatatan. Pilihan tipe data akan sangat mempengaruhi persyaratan runtime dan penyimpanan HDF5, jadi sebaiknya pilih persyaratan minimum Anda Sekarang kami telah meninjau tiga metode untuk menyimpan satu gambar, mari beralih ke langkah berikutnya Hilangkan iklanEksperimen untuk Menyimpan Gambar TunggalSekarang Anda dapat memasukkan ketiga fungsi untuk menyimpan satu gambar ke dalam kamus, yang dapat dipanggil nanti selama percobaan waktu _3Akhirnya, semuanya siap untuk melakukan percobaan berjangka waktu. Mari kita coba menyimpan gambar pertama dari CIFAR dan label yang sesuai, dan menyimpannya dengan tiga cara berbeda _4Catatan. Saat bermain-main dengan LMDB, Anda mungkin melihat kesalahan 8. Penting untuk diperhatikan bahwa LMDB tidak menimpa nilai yang sudah ada sebelumnya, meskipun memiliki kunci yang samaIni berkontribusi pada waktu penulisan yang cepat, tetapi ini juga berarti bahwa jika Anda menyimpan gambar lebih dari sekali dalam file LMDB yang sama, Anda akan menghabiskan ukuran peta. Jika Anda menjalankan fungsi penyimpanan, pastikan untuk menghapus file LMDB yang sudah ada terlebih dahulu Ingatlah bahwa kita tertarik pada runtime, yang ditampilkan di sini dalam hitungan detik, dan juga penggunaan memori MetodeSimpan Gambar Tunggal + MetaMemoryDisk1. 915 ms8 KLMDB1. 203 ms32 KHDF58. 243 ms8 K Ada dua takeaways di sini
Jelas, meskipun LMDB memiliki sedikit keunggulan kinerja, kami belum meyakinkan siapa pun mengapa tidak hanya menyimpan gambar di disk. Lagi pula, ini adalah format yang dapat dibaca manusia, dan Anda dapat membuka dan melihatnya dari browser sistem file apa pun. Nah, saatnya untuk melihat lebih banyak gambar… Menyimpan Banyak GambarAnda telah melihat kode untuk menggunakan berbagai metode penyimpanan untuk menyimpan satu gambar, jadi sekarang kita perlu menyesuaikan kode untuk menyimpan banyak gambar dan kemudian menjalankan eksperimen berjangka waktu Menyesuaikan Kode untuk Banyak GambarMenyimpan banyak gambar sebagai _0 file semudah memanggil 0 beberapa kali. Tetapi ini tidak berlaku untuk LMDB atau HDF5, karena Anda tidak menginginkan file database yang berbeda untuk setiap gambar. Sebaliknya, Anda ingin memasukkan semua gambar ke dalam satu atau beberapa fileAnda perlu sedikit mengubah kode dan membuat tiga fungsi baru yang menerima banyak gambar, 1, 2, dan 3 _5Agar Anda dapat menyimpan lebih dari satu file ke disk, metode file gambar diubah untuk mengulang setiap gambar dalam daftar. Untuk LMDB, loop juga diperlukan karena kami membuat objek 4 untuk setiap gambar dan meta datanyaPenyesuaian terkecil adalah dengan metode HDF5. Bahkan, hampir tidak ada penyesuaian sama sekali. File HFD5 tidak memiliki batasan ukuran file selain dari batasan eksternal atau ukuran dataset, jadi semua gambar dimasukkan ke dalam satu dataset, seperti sebelumnya Selanjutnya, Anda perlu menyiapkan kumpulan data untuk eksperimen dengan memperbesar ukurannya Hilangkan iklanMempersiapkan DatasetSebelum menjalankan eksperimen lagi, pertama-tama mari gandakan ukuran set data kita agar kita dapat menguji hingga 100.000 gambar _6Sekarang sudah cukup banyak gambar, saatnya untuk percobaan Eksperimen untuk Menyimpan Banyak GambarSeperti yang Anda lakukan dengan membaca banyak gambar, Anda dapat membuat kamus yang menangani semua fungsi dengan 5 dan menjalankan percobaan _7Jika Anda mengikuti dan menjalankan kode sendiri, Anda perlu duduk sejenak dalam ketegangan dan menunggu 111.110 gambar disimpan tiga kali masing-masing ke disk Anda, dalam tiga format berbeda. Anda juga harus mengucapkan selamat tinggal pada sekitar 2 GB ruang disk Sekarang untuk momen kebenaran. Berapa lama semua penyimpanan itu? Grafik pertama menunjukkan waktu penyimpanan normal dan tidak disesuaikan, menyoroti perbedaan drastis antara menyimpan ke 0 file dan LMDB atau HDF5Grafik kedua menunjukkan _7 dari pengaturan waktu, menyoroti bahwa HDF5 dimulai lebih lambat dari LMDB tetapi, dengan jumlah gambar yang lebih besar, keluar sedikit lebih cepatSementara hasil yang tepat dapat bervariasi tergantung pada mesin Anda, inilah mengapa LMDB dan HDF5 patut dipertimbangkan. Berikut kode yang menghasilkan grafik di atas _8Sekarang mari kita membaca kembali gambar-gambar itu Membaca Gambar TunggalPertama, mari pertimbangkan kasus untuk membaca satu gambar kembali ke dalam array untuk masing-masing dari ketiga metode tersebut Membaca Dari DiskDari ketiga metode tersebut, LMDB membutuhkan kerja keras paling banyak saat membaca file gambar kembali dari memori, karena langkah serialisasi. Mari telusuri fungsi-fungsi ini yang membaca satu gambar untuk masing-masing dari tiga format penyimpanan Pertama, baca satu gambar dan metanya dari file 0 dan 0 _9Hilangkan iklanMembaca Dari LMDBSelanjutnya, baca gambar dan meta yang sama dari LMDB dengan membuka lingkungan dan memulai transaksi baca _0Berikut adalah beberapa poin untuk tidak membahas cuplikan kode di atas
Ini mengakhiri membaca gambar kembali dari LMDB. Terakhir, Anda ingin melakukan hal yang sama dengan HDF5 Membaca Dari HDF5Membaca dari HDF5 terlihat sangat mirip dengan proses penulisan. Berikut adalah kode untuk membuka dan membaca file HDF5 dan mengurai gambar dan meta yang sama _1Perhatikan bahwa Anda mengakses berbagai set data dalam file dengan mengindeks objek 2 menggunakan nama set data yang diawali dengan garis miring 3. Seperti sebelumnya, Anda dapat membuat kamus yang berisi semua fungsi baca _2Dengan menyiapkan kamus ini, Anda siap menjalankan percobaan Eksperimen untuk Membaca Satu GambarAnda mungkin berharap bahwa eksperimen untuk membaca satu gambar akan memiliki hasil yang agak sepele, tetapi inilah kode eksperimennya _3Berikut adalah hasil percobaan untuk membaca satu gambar MetodeBaca Gambar Tunggal + MetaDisk1. 61970 msLMDB4. 52063 msHDF51. 98036 mdtk Ini sedikit lebih cepat untuk membaca file _0 dan 0 langsung dari disk, tetapi ketiga metode ini bekerja dengan sangat cepat. Eksperimen yang akan kita lakukan selanjutnya jauh lebih menarikMembaca Banyak GambarSekarang Anda dapat menyesuaikan kode untuk membaca banyak gambar sekaligus. Ini kemungkinan adalah tindakan yang paling sering Anda lakukan, sehingga kinerja runtime sangat penting Hilangkan iklanMenyesuaikan Kode untuk Banyak GambarMemperluas fungsi di atas, Anda dapat membuat fungsi dengan 6, yang dapat digunakan untuk percobaan berikutnya. Seperti sebelumnya, menarik untuk membandingkan performa saat membaca jumlah gambar yang berbeda, yang diulangi dalam kode di bawah untuk referensi _4Dengan fungsi membaca disimpan dalam kamus seperti fungsi menulis, Anda siap untuk percobaan Eksperimen untuk Membaca Banyak GambarAnda sekarang dapat menjalankan percobaan untuk membaca banyak gambar _5Seperti yang kita lakukan sebelumnya, Anda dapat membuat grafik hasil percobaan baca Grafik teratas menunjukkan waktu baca normal yang tidak disesuaikan, menunjukkan perbedaan drastis antara membaca dari file 0 dan LMDB atau HDF5Sebaliknya, grafik di bagian bawah menunjukkan 7 dari pengaturan waktu, menyoroti perbedaan relatif dengan lebih sedikit gambar. Yaitu, kita dapat melihat bagaimana HDF5 dimulai di belakang tetapi, dengan lebih banyak gambar, menjadi lebih cepat secara konsisten daripada LMDB dengan selisih kecilPlot Waktu BacaTampilkan/Sembunyikan Menggunakan fungsi plot yang sama seperti untuk pengaturan waktu penulisan, kami memiliki yang berikut ini _6Dalam praktiknya, waktu tulis seringkali kurang kritis dibandingkan waktu baca. Bayangkan Anda sedang melatih jaringan saraf yang dalam pada gambar, dan hanya setengah dari seluruh kumpulan data gambar Anda yang cocok dengan RAM sekaligus. Setiap zaman pelatihan jaringan membutuhkan seluruh kumpulan data, dan model membutuhkan beberapa ratus zaman untuk konvergen. Anda pada dasarnya akan membaca setengah dari kumpulan data ke dalam memori setiap zaman Ada beberapa trik yang dilakukan orang, seperti melatih zaman semu untuk membuatnya sedikit lebih baik, tetapi Anda mengerti Sekarang, lihat kembali grafik baca di atas. Perbedaan antara waktu baca 40 detik dan 4 detik tiba-tiba adalah perbedaan antara menunggu enam jam untuk model Anda berlatih, atau empat puluh menit Jika kita melihat waktu baca dan tulis pada bagan yang sama, kita memiliki yang berikut ini Plot Waktu Baca dan TulisTampilkan/Sembunyikan Anda dapat memplot semua pengaturan waktu baca dan tulis pada satu grafik menggunakan fungsi plotting yang sama _7Saat Anda menyimpan gambar sebagai file 0, ada perbedaan besar antara waktu tulis dan baca. Namun, dengan LMDB dan HDF5, perbedaannya jauh lebih kecil. Secara keseluruhan, meskipun waktu baca lebih penting daripada waktu tulis, ada argumen kuat untuk menyimpan gambar menggunakan LMDB atau HDF5Sekarang setelah Anda melihat manfaat kinerja LMDB dan HDF5, mari kita lihat metrik penting lainnya. penggunaan disk Hilangkan iklanMempertimbangkan Penggunaan DiskKecepatan bukan satu-satunya metrik kinerja yang mungkin Anda minati. Kami sudah berurusan dengan kumpulan data yang sangat besar, jadi ruang disk juga merupakan masalah yang sangat valid dan relevan Misalkan Anda memiliki kumpulan data gambar 3TB. Agaknya, Anda sudah memilikinya di disk di suatu tempat, tidak seperti contoh CIFAR kami, jadi dengan menggunakan metode penyimpanan alternatif, Anda pada dasarnya membuat salinannya, yang juga harus disimpan. Melakukan hal itu akan memberi Anda manfaat kinerja yang sangat besar saat Anda menggunakan gambar, tetapi Anda harus memastikan bahwa Anda memiliki cukup ruang disk Berapa banyak ruang disk yang digunakan berbagai metode penyimpanan? Membuat Plot Batang untuk Penggunaan Ruang DiskTampilkan/Sembunyikan Saya menggunakan perintah Linux _0 untuk menghitung penggunaan disk pada sistem saya. Ada beberapa perkiraan yang melekat pada metode ini karena pembulatan, tapi inilah perbandingan umumnya _8HDF5 dan LMDB menggunakan lebih banyak ruang disk daripada jika Anda menyimpan menggunakan gambar 0 normal. Penting untuk dicatat bahwa penggunaan dan kinerja disk LMDB dan HDF5 sangat bergantung pada berbagai faktor, termasuk sistem operasi dan, yang lebih penting lagi, ukuran data yang Anda simpanLMDB mendapatkan efisiensinya dari caching dan memanfaatkan ukuran halaman OS. Anda tidak perlu memahami cara kerjanya, tetapi perhatikan bahwa dengan gambar yang lebih besar, Anda akan berakhir dengan penggunaan disk yang jauh lebih banyak dengan LMDB, karena gambar tidak muat di halaman LMDB, lokasi penyimpanan biasa di pohon, dan . Bilah LMDB pada bagan di atas akan keluar dari bagan Gambar 32x32x3 piksel kami relatif kecil dibandingkan dengan gambar rata-rata yang mungkin Anda gunakan, dan memungkinkan performa LMDB yang optimal Meskipun kami tidak akan menjelajahinya di sini secara eksperimental, menurut pengalaman saya sendiri dengan gambar berukuran 256x256x3 atau 512x512x3 piksel, HDF5 biasanya sedikit lebih efisien dalam hal penggunaan disk daripada LMDB. Ini adalah transisi yang baik ke bagian akhir, sebuah diskusi kualitatif tentang perbedaan antara metode-metode tersebut DiskusiAda fitur pembeda lain dari LMDB dan HDF5 yang perlu diketahui, dan penting juga untuk membahas secara singkat beberapa kritik dari kedua metode tersebut. Beberapa tautan disertakan bersama dengan diskusi jika Anda ingin mempelajari lebih lanjut Akses ParalelPerbandingan utama yang tidak kami uji dalam percobaan di atas adalah membaca dan menulis secara bersamaan. Seringkali, dengan kumpulan data sebesar itu, Anda mungkin ingin mempercepat operasi Anda melalui paralelisasi Dalam sebagian besar kasus, Anda tidak akan tertarik membaca bagian dari gambar yang sama pada waktu yang sama, tetapi Anda ingin membaca banyak gambar sekaligus. Dengan definisi konkurensi ini, menyimpan ke disk sebagai 0 file sebenarnya memungkinkan konkurensi lengkap. Tidak ada yang menghalangi Anda untuk membaca beberapa gambar sekaligus dari utas yang berbeda, atau menulis banyak file sekaligus, selama nama gambar berbedaBagaimana dengan LMDB? . Anda dapat membaca lebih lanjut tentang itu di situs web teknologi LMDB Beberapa aplikasi dapat mengakses database LMDB yang sama secara bersamaan, dan beberapa utas dari proses yang sama juga dapat secara bersamaan mengakses LMDB untuk membaca. Ini memungkinkan waktu baca yang lebih cepat. jika Anda membagi semua CIFAR menjadi sepuluh set, maka Anda dapat menyiapkan sepuluh proses untuk setiap pembacaan dalam satu set, dan itu akan membagi waktu pemuatan menjadi sepuluh HDF5 juga menawarkan I/O paralel, yang memungkinkan pembacaan dan penulisan bersamaan. Namun, dalam penerapannya, kunci tulis ditahan, dan aksesnya berurutan, kecuali jika Anda memiliki sistem file paralel Ada dua opsi utama jika Anda mengerjakan sistem seperti itu, yang dibahas lebih mendalam dalam artikel ini oleh Grup HDF pada IO paralel. Ini bisa menjadi sangat rumit, dan opsi paling sederhana adalah dengan membagi kumpulan data Anda secara cerdas menjadi beberapa file HDF5, sehingga setiap proses dapat menangani satu file 3 secara terpisah dari yang lainDokumentasiJika Anda Google _4, setidaknya di Inggris Raya, hasil pencarian ketiga adalah IMDb, Internet Movie Database. Bukan itu yang Anda cariSebenarnya, ada satu sumber dokumentasi utama untuk pengikatan Python LMDB, yang dihosting. Sementara paket Python bahkan belum mencapai versi > 0. 94, cukup banyak digunakan dan dianggap stabil Adapun teknologi LMDB itu sendiri, ada dokumentasi yang lebih rinci di situs web teknologi LMDB, yang bisa terasa seperti belajar kalkulus di kelas dua, kecuali jika Anda memulai dari halaman Memulai mereka Untuk HDF5, ada dokumentasi yang sangat jelas di situs h5py docs, serta postingan blog yang bermanfaat dari Christopher Lovell, yang merupakan ikhtisar bagus tentang cara menggunakan paket 5. Buku O'Reilly, Python dan HDF5 juga merupakan cara yang baik untuk memulaiMeskipun tidak terdokumentasi seperti yang mungkin dihargai oleh pemula, baik LMDB dan HDF5 memiliki komunitas pengguna yang besar, sehingga pencarian Google yang lebih dalam biasanya menghasilkan hasil yang bermanfaat Hilangkan iklanPandangan Lebih Kritis pada ImplementasiTidak ada utopia dalam sistem penyimpanan, dan baik LMDB maupun HDF5 memiliki kekurangan masing-masing Poin kunci untuk dipahami tentang LMDB adalah bahwa data baru ditulis tanpa menimpa atau memindahkan data yang ada. Ini adalah keputusan desain yang memungkinkan pembacaan sangat cepat yang Anda saksikan dalam eksperimen kami, dan juga menjamin integritas dan keandalan data tanpa perlu tambahan menyimpan log transaksi Ingat, bagaimanapun, bahwa Anda perlu menentukan parameter 2 untuk alokasi memori sebelum menulis ke database baru? . Misalkan Anda telah membuat database LMDB, dan semuanya bagus. Anda telah menunggu dengan sabar kumpulan data Anda yang sangat besar untuk dikemas ke dalam LMDBKemudian, nanti, Anda ingat bahwa Anda perlu menambahkan data baru. Bahkan dengan buffer yang Anda tentukan pada _2 Anda, Anda dapat dengan mudah melihat kesalahan 8. Kecuali jika Anda ingin menulis ulang seluruh database Anda, dengan 2 yang diperbarui, Anda harus menyimpan data baru tersebut dalam file LMDB terpisah. Meskipun satu transaksi dapat menjangkau banyak file LMDB, memiliki banyak file masih bisa merepotkanSelain itu, beberapa sistem memiliki batasan berapa banyak memori yang dapat diklaim sekaligus. Dalam pengalaman saya sendiri, bekerja dengan sistem komputasi kinerja tinggi (HPC), ini terbukti sangat membuat frustrasi, dan sering kali membuat saya lebih memilih HDF5 daripada LMDB Dengan LMDB dan HDF5, hanya item yang diminta yang dibaca ke dalam memori sekaligus. Dengan LMDB, pasangan unit kunci dibaca ke dalam memori satu per satu, sedangkan dengan HDF5, objek 0 dapat diakses seperti larik Python, dengan pengindeksan 1, rentang, 2 dan penyambungan lainnya 3Karena cara sistem dioptimalkan, dan bergantung pada sistem operasi Anda, urutan item yang Anda akses dapat memengaruhi kinerja Dalam pengalaman saya, secara umum benar bahwa untuk LMDB, Anda mungkin mendapatkan kinerja yang lebih baik saat mengakses item secara berurutan dengan kunci (pasangan nilai kunci disimpan dalam memori yang diurutkan secara alfanumerik dengan kunci), dan untuk HDF5, mengakses rentang besar akan bekerja lebih baik daripada membaca _9Jika Anda sedang mempertimbangkan pilihan format penyimpanan file untuk menulis perangkat lunak Anda, akan lalai untuk tidak menyebutkan Pindah dari HDF5 oleh Cyrille Rossant pada perangkap HDF5, dan tanggapan Konrad Hinsen Pada HDF5 dan masa depan manajemen data, yang mana . Perhatikan bahwa kumpulan data yang relatif lebih kecil masih berukuran beberapa GB Integrasi Dengan Perpustakaan LainJika Anda berurusan dengan kumpulan data yang sangat besar, kemungkinan besar Anda akan melakukan sesuatu yang signifikan dengannya. Penting untuk mempertimbangkan perpustakaan pembelajaran mendalam dan jenis integrasi apa yang ada dengan LMDB dan HDF5 Pertama-tama, semua perpustakaan mendukung membaca gambar dari disk sebagai 0 file, selama Anda mengubahnya menjadi array NumPy dari format yang diharapkan. Ini berlaku untuk semua metode, dan kita telah melihat di atas bahwa relatif mudah untuk membaca gambar sebagai arrayBerikut adalah beberapa perpustakaan pembelajaran mendalam paling populer dan integrasi LMDB dan HDF5 mereka
Meskipun jauh dari komprehensif, semoga ini memberi Anda gambaran tentang integrasi LMDB/HDF5 oleh beberapa pustaka pembelajaran mendalam utama Beberapa Wawasan Pribadi tentang Menyimpan Gambar dengan PythonDalam pekerjaan saya sehari-hari menganalisis terabyte gambar medis, saya menggunakan LMDB dan HDF5, dan telah belajar bahwa, dengan metode penyimpanan apa pun, pemikiran ke depan sangat penting. Seringkali, model perlu dilatih menggunakan validasi silang k-fold, yang melibatkan pemisahan seluruh dataset menjadi k-set (k biasanya 10), dan model k dilatih, masing-masing dengan k-set yang berbeda digunakan sebagai set pengujian. Hal ini memastikan bahwa model tidak melakukan overfitting pada kumpulan data, atau, dengan kata lain, tidak dapat membuat prediksi yang baik pada data yang tidak terlihat. Cara standar untuk membuat k-set adalah dengan menempatkan representasi yang sama dari setiap jenis data yang diwakili dalam dataset di setiap k-set. Dengan demikian, menyimpan setiap k-set ke dalam dataset HDF5 yang terpisah akan memaksimalkan efisiensi. Kadang-kadang, satu k-set tidak dapat dimuat ke dalam memori sekaligus, jadi bahkan urutan data dalam kumpulan data memerlukan beberapa pemikiran sebelumnya. Dengan LMDB, saya juga berhati-hati untuk membuat rencana ke depan sebelum membuat database. Ada beberapa pertanyaan bagus yang perlu ditanyakan sebelum Anda menyimpan gambar
Apa pun metode penyimpanannya, saat Anda berurusan dengan kumpulan data gambar besar, sedikit perencanaan akan sangat membantu Hilangkan iklanKesimpulanAnda berhasil sampai akhir. Anda sekarang memiliki pandangan sekilas tentang topik besar Dalam artikel ini, Anda telah diperkenalkan dengan tiga cara menyimpan dan mengakses banyak gambar dengan Python, dan mungkin berkesempatan untuk bermain dengan beberapa di antaranya. Semua kode untuk artikel ini ada di notebook Jupyter di sini atau skrip Python di sini. Jalankan dengan risiko Anda sendiri, karena beberapa GB ruang disk Anda akan diambil alih oleh gambar persegi kecil dari mobil, kapal, dan sebagainya. Anda telah melihat bukti bagaimana berbagai metode penyimpanan dapat memengaruhi waktu baca dan tulis secara drastis, serta beberapa pro dan kontra dari ketiga metode yang dibahas dalam artikel ini. Meskipun menyimpan gambar sebagai file 0 mungkin yang paling intuitif, ada manfaat kinerja yang besar untuk mempertimbangkan metode seperti HDF5 atau LMDBJangan ragu untuk berdiskusi di bagian komentar tentang metode penyimpanan luar biasa yang tidak tercakup dalam artikel ini, seperti LevelDB, Feather, TileDB, Badger, BoltDB, atau yang lainnya. Tidak ada metode penyimpanan yang sempurna, dan metode terbaik bergantung pada kumpulan data spesifik dan kasus penggunaan Anda Bacaan lebih lanjutBerikut adalah beberapa referensi terkait ketiga metode yang dibahas dalam artikel ini
Anda juga dapat menghargai "Analisis sistem penyimpanan gambar untuk pelatihan jaringan saraf dalam yang dapat diskalakan" oleh Lim, Young, dan Patton. Makalah itu mencakup eksperimen yang serupa dengan yang ada di artikel ini, tetapi dalam skala yang jauh lebih besar, dengan mempertimbangkan cache dingin dan hangat serta faktor lainnya Tandai sebagai Selesai 🐍 Trik Python 💌 Dapatkan Trik Python singkat & manis yang dikirim ke kotak masuk Anda setiap beberapa hari. Tidak pernah ada spam. Berhenti berlangganan kapan saja. Dikuratori oleh tim Real Python Kirimi Saya Trik Python » Tentang Rebecca Stone Rebecca adalah mahasiswa PhD dalam visi komputer dan kecerdasan buatan yang diterapkan pada citra medis. Dia bersemangat mengajar » Lebih lanjut tentang RebeccaSetiap tutorial di Real Python dibuat oleh tim pengembang sehingga memenuhi standar kualitas tinggi kami. Anggota tim yang mengerjakan tutorial ini adalah Aldren Geir Arne Joanna Master Keterampilan Python Dunia Nyata Dengan Akses Tanpa Batas ke Python Nyata Bergabunglah dengan kami dan dapatkan akses ke ribuan tutorial, kursus video langsung, dan komunitas pakar Pythonista Tingkatkan Keterampilan Python Anda » Guru Keterampilan Python Dunia Nyata Bergabunglah dengan kami dan dapatkan akses ke ribuan tutorial, kursus video langsung, dan komunitas ahli Pythonista Tingkatkan Keterampilan Python Anda » Bagaimana menurut anda? Nilai artikel ini Tweet Bagikan Bagikan EmailApa takeaway # 1 Anda atau hal favorit yang Anda pelajari? Kiat Berkomentar. Komentar yang paling berguna adalah yang ditulis dengan tujuan belajar dari atau membantu siswa lain. dan dapatkan jawaban atas pertanyaan umum di portal dukungan kami Bagaimana cara memasukkan gambar dalam database SQLite dengan Python?Implementasi. . Atur koneksi ke database SQLite menggunakan kode Python. . Kita perlu mendefinisikan kueri INSERT untuk memasukkan data BLOB ke dalam tabel. . Mengubah file yang dapat dibaca manusia menjadi data biner dengan memanggil fungsi convertToBinaryData() ini, dan menyimpannya di variabel empPhoto, Bagaimana cara memasukkan file ke dalam database MySQL menggunakan Python?Memasukkan data ke tabel MySQL menggunakan python . impor mysql. paket konektor Buat objek koneksi menggunakan mysql. penyambung. . Buat objek kursor dengan memanggil metode cursor() pada objek koneksi yang dibuat di atas Kemudian, jalankan pernyataan INSERT dengan meneruskannya sebagai parameter ke metode execution() Bisakah saya menyimpan gambar di MySQL?Binary Large Object ( BLOB ) adalah tipe data MySQL yang dapat menyimpan data biner seperti file gambar, multimedia, dan PDF .
Bisakah Anda memasukkan gambar ke dalam database?Database memberi Anda kesempatan untuk menyimpan foto dan gambar kecil lainnya di tabel database . Anda dapat membuat tabel database seperti itu misalnya ketika Anda ingin membuat album foto online dengan deskripsi foto Anda. Menyimpan gambar dalam tabel database tidak disarankan. |