При глубоком обучении разрешение изображения слишком велико, что приводит к переполнению памяти.

При глубоком обучении разрешение изображения слишком велико, что приводит к переполнению памяти. Поэтому я хочу разделить изображение на небольшие части и экспортировать информацию аннотаций в формате JSON в текстовый файл. А аннотационная информация каждого txt соответствует каждому обрезанному небольшому изображению. Как мне это сделать?

1 ответ

У меня была такая же проблема с моим Ram при работе с большими изображениями. По моему опыту, постарайтесь найти золотую середину в размере выборки, чтобы не превышать минимальный размер файла в 4 КБ и разместить на изображении целое число образцов, чтобы получить наилучший результат. На ваш вопрос, это зависит от того, как вы хотите отформатировать свой json, если вы используете cv2, вы можете просто сделать это следующим образом:

      import cv2
import numpy as np
import json

def split_image(image_path, output_folder, grid_size):

    # Load the image
    image = cv2.imread(image_path,flags= cv2.IMREAD_COLOR)
   
    # !!Swap Color space because cv2 uses BGR color space wehen reading colors!!
    image = cv2.cvtColor(image , cv2.COLOR_BGR2RGB)

    # Get dimensions
    height, width, color = image.shape

    # Calculate grid size based on the number of rows and columns
    rows, cols = grid_size
    grid_height = height // rows
    grid_width = width // cols

    for r in range(rows):
        for c in range(cols):
            # Crop the image to create small pieces
            start_y = r * grid_height
            end_y = start_y + grid_height
            start_x = c * grid_width
            end_x = start_x + grid_width
            cropped_image = image[start_y:end_y, start_x:end_x]

            # Process each cropped image, annotate, and gather annotation information
            annotation_info = {
                "file_name": f"cropped_{r}_{c}.jpg",  # Update file name as needed
                "image_size": (grid_width, grid_height),  # Update image size accordingly
                "annotations": [
                    # Your annotation details for this cropped image here
                    # You may need to use a dedicated annotation tool or manually 
                ]
            }

            # Save the cropped image
            cv2.imwrite(f"{output_folder}/cropped_{r}_{c}.jpg", cropped_image)

            # Save annotation information to a JSON file
            with open(f"{output_folder}/annotation_{r}_{c}.json", "w") as json_file:
                json.dump(annotation_info, json_file)

# Example usage:
image_path = "path/to/your/image.jpg"
output_folder = "output_folder"
grid_size = (3, 3)  # Split image into a 3x3 grid (you can adjust as needed)

split_image(image_path, output_folder, grid_size)

Аннотация к информации должна соответствовать вашему использованию, поэтому это всего лишь пример! вам нужно найти нужную информацию и ввести ее, если нужно. Обратите внимание, что лучше всего использовать специальный инструмент для аннотаций. Для доступа к вашей информации используйтеjson.load("Filename")и используемые инструменты для ваших аннотаций. Надеюсь, это поможет, потому что из вашего вопроса о деталях не так уж много информации.

Другие вопросы по тегам