728x90
반응형
lmdb는 embeded key-value 데이터베이스 엔진입니다. 그렇기 때문에 빠른 속도로 데이터 쓰기 및 읽기가 가능하고 메모리 사용량도 낮습니다. 이러한 장점 덕분에 대규모 데이터를 사용하는 딥러닝 학습에도 자주 쓰입니다.
- lmdb 파일 만들기
lmdb에 이미지 경로와 이미지 값을 저장하는 경우라고 생각해볼게요.
먼저 데이터베이스를 열어줍니다.
import lmdb
env = lmdb.open('이미지폴더 경로', map_size=int(1e12))
또한 key, value 모두 bytes 형식으로 저장하므로 encode함수를 사용합니다. 이미지도 bytes로 저장할거기 때문에 opencv나 PIL로 읽는 것이 아닌 open 함수로 읽어주었습니다.
with env.begin(write=True) as txn:
# key 값 인코딩
path_key = "path".encode()
img_key = "img_data".encode()
# value 값 인코딩
path_value = "my_img.jpg".encode()
with open("my_image.jpg", 'rb') as f:
img_value = f.read()
이제 데이터베이스에 넣어줍니다.
txn.put(path_key, path_value)
txn.put(img_key, img_value)
생성이 완료되면 지정한 경로에 아래 두가지 파일이 생성됩니다.
- lmdb 파일 읽기
먼저 데이터베이스를 열어줍니다.
env = lmdb.open(lmdb_path, readonly=True)
이제 데이터를 읽어보겠습니다.
with env.begin() as txn:
path_key = 'path'.encode()
path_value = txn.get(key).decode()
img_key = "img_data".encode()
img_value = txn.get(img_key).decode()
이렇게 하면 img_value에는 이미지의 byte값이 저장되겠죠? 이를 다시 numpy array 로 바꿔주려면 아래처럼 하면 됩니다.
img_array = np.frombuffer(img_value, dtype=np.uint8)
img = cv2.imdecode(img_array, cv2.IMREAD_COLOR)
728x90
반응형
'Etc' 카테고리의 다른 글
sd-x2-latent-upscaler 모델로 image upscale 하기 (2) | 2024.11.21 |
---|---|
safetensor 모델을 diffusers에서 사용 가능하게 변경하기 (0) | 2024.11.11 |
[JNI] jbyte를 C++의 vector<uchar>로 변환하는 방법 (0) | 2023.03.12 |
[JNI] JNI 사용법 및 튜토리얼 (2) (0) | 2023.03.12 |
[JNI] JNI 사용법 및 튜토리얼 (1) (3) | 2023.03.11 |