Рис — это мой код, когда я пытаюсь обрезать и сохранить обнаруженный объект с помощью 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 — моя модель после тренировки.
Как это работает, но ошибок нет, но у меня нет обрезанных изображений? что я могу сделать, чтобы исправить этот код?
Мой результат — обрезанные изображения в папке.
у модели есть путь /content/drive/MyDrive/...
без пробела в MyDrive
, но корневой каталог, который вы установили как /content/drive/My Drive/content/drive/MyDrive/...
с пробелом в My Drive
и с повторяющимся content/drive/MyDrive/
- это правильно?
Я бы посоветовал вам сначала устранить неполадки. Попробуйте 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)
Надеюсь это поможет!
спасибо, братан, я успешно обрезал изображение, но хочу сделать это для нескольких изображений в нескольких папках, как мне это сделать? мой новый код находится под вашим ответом.
Я настоятельно рекомендую переместить изображения в один каталог или как можно меньше. Тогда вы сможете легко перебирать каждое изображение в каталоге, используя os.path.join()
с циклом for. Я отредактирую свой ответ, добавив полную реализацию кода.
Отредактировал мой ответ, надеюсь, вы нашли решение своей проблемы! Лучший.
Возможно, сначала используйте
print()
(иprint(type(...))
,print(len(...))
и т. д.), чтобы увидеть, какая часть кода выполняется и что на самом деле у вас есть в переменных. Он называется"print debugging"
и помогает увидеть, что на самом деле делает код.