Обрезанная коробка с итоговой моделью YOLOV 8

Рис — это мой код, когда я пытаюсь обрезать и сохранить обнаруженный объект с помощью YOLOV 8:

Я новичок в шоу YOLOV и впервые пишу это в блокноте Google Colab:

from google.colab import drive
drive.mount('/content/drive')

!pip install torch torchvision opencv-python
!pip install ultralytics --quiet

import torch
torch.cuda.is_available()
import cv2
import numpy as np
import os
from google.colab.patches import cv2_imshow
from ultralytics import YOLO

# Load your model
model_path = '/content/drive/MyDrive/Data/runs/detect/train7/weights/best.pt' 
model = YOLO(model_path)

# Root directory containing subdirectories of images
root_dir = '/content/drive/My Drive/content/drive/MyDrive/Data/out_test'  # Update with the correct path to your root directory

# Directory to save cropped images
save_dir = '/content/drive/My Drive/cropped_images'
os.makedirs(save_dir, exist_ok=True)

def crop_objects(img, results, save_dir, img_name):
    # Get the bounding boxes
    boxes = results[0].boxes.xyxy  # Extracting bounding boxes from results

    cropped_images = []
    for i, box in enumerate(boxes):
        x1, y1, x2, y2 = map(int, box[:4])

        # Crop the image
        cropped_img = img[y1:y2, x1:x2]
        cropped_images.append(cropped_img)

        # Save the cropped image
        output_path = os.path.join(save_dir, f'{img_name}_cropped_{i}.jpg')
        cv2.imwrite(output_path, cropped_img)
        print(f'Cropped image saved to {output_path}')
      
    return cropped_images

# Walk through all subdirectories and process images
for subdir, dirs, files in os.walk(root_dir):
    for file in files:
        img_path = os.path.join(subdir, file)
        if img_path.lower().endswith(('png', 'jpg', 'jpeg')):
            print(f"Processing image: {img_path}")
            img = cv2.imread(img_path)
            if img is None:
                print(f"Could not read image: {img_path}")
                continue
            
            img_name = os.path.splitext(file)[0]
            results = model(img)  # Run inference on the image
            
            # Debugging: Check results
            print(f"Results for {img_path}: {results}")

            crop_objects(img, results, save_dir, img_name)

best.pt — моя модель после тренировки.

Как это работает, но ошибок нет, но у меня нет обрезанных изображений? что я могу сделать, чтобы исправить этот код?

Мой результат — обрезанные изображения в папке.

Возможно, сначала используйте print()print(type(...)), print(len(...)) и т. д.), чтобы увидеть, какая часть кода выполняется и что на самом деле у вас есть в переменных. Он называется "print debugging" и помогает увидеть, что на самом деле делает код.

furas 23.06.2024 03:16

у модели есть путь /content/drive/MyDrive/... без пробела в MyDrive, но корневой каталог, который вы установили как /content/drive/My Drive/content/drive/MyDrive/... с пробелом в My Drive и с повторяющимся content/drive/MyDrive/ - это правильно?

furas 23.06.2024 03:22
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я бы посоветовал вам сначала устранить неполадки. Попробуйте plt.imshow(cropped_images[0]) (импортируя matplotlib.pyplot как plt), чтобы увидеть, правильно ли создаются обрезанные изображения или нет. Если есть правильно обрезанный результат, убедитесь, что путь, по которому вы пишете с помощью cv2.imwrite(), правильный, иначе обрезанные изображения не сохранятся. Если выходные данные неверны, дважды проверьте правильность вводимых вами значений координат, правильность пути к вашим данным для модели и попробуйте отобразить выходные данные, чтобы убедиться, что модель действительно вообще обнаруживает что-либо в ваших данных. Вы также можете поиграть с этим, чтобы убедиться, что ваша модель что-то обнаруживает:

if not len(boxes) == 0:
    print(“At least there’s a detection!”)

Раньше, когда я сталкивался с этой проблемой, описанные выше приемы мне помогали. Если это не поможет, дайте мне знать. Всего наилучшего!

Изменить. Что касается прогнозирования и обрезки нескольких изображений из нескольких папок, я настоятельно рекомендую вам переместить все ваши изображения в один каталог для удобства доступа. Затем вы можете легко перебрать все изображения. Вот упрощенный пример реализации:

from ultralytics import YOLO
import cv2
import os

model = YOLO("path/to/best.pt")
root_dir = "path/to/directory/with/all/images"
save_dir = "path/to/save/directory"

# define your crop_objects function here

for img_file in os.listdir(root_dir):
    img_path = os.path.join(root_dir, img_file)
    img = cv2.imread(img_path)
    results = model(img_path)

    crop_objects(img, results, save_dir, img_file)

Надеюсь это поможет!

спасибо, братан, я успешно обрезал изображение, но хочу сделать это для нескольких изображений в нескольких папках, как мне это сделать? мой новый код находится под вашим ответом.

Nguyễn Thành Nam 24.06.2024 02:30

Я настоятельно рекомендую переместить изображения в один каталог или как можно меньше. Тогда вы сможете легко перебирать каждое изображение в каталоге, используя os.path.join() с циклом for. Я отредактирую свой ответ, добавив полную реализацию кода.

otpidusmatar 24.06.2024 07:12

Отредактировал мой ответ, надеюсь, вы нашли решение своей проблемы! Лучший.

otpidusmatar 24.06.2024 09:18

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