Попытка использовать более быстрый R-CNN, предварительно проведенный на CoCo на наборе данных Pascal VOC, но проблема с Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Попытка использовать более быстрый R-CNN, предварительно проведенный на CoCo на наборе данных Pascal VOC, но проблема с

Сообщение Anonymous »

Я хотел бы услышать от вас некоторые советы. Для контекста, я просто студент биологии с некоторыми классами кодирования/ИИ, что означает, что я кодирует путем патч -обработки, управляет контентом, содержащимся на форумах с поддержкой ИИ. Я действительно изо всех сил старался искать ответы, но, очевидно, мое понимание/уровень кодирования очень ограничено, и проблемы не дружелюбны.
!!!! Я работаю над Google Coolab !!!

Код: Выделить всё

sys.version

import sys
import os

os.environ['CUDA_LAUNCH_BLOCKING'] = "1"

import torch
import torchvision as tv

print(sys.version)
print(torch.__version__)
print(tv.__version__)

import matplotlib.pyplot as plt #to plot images
import matplotlib.patches as patches
import torchvision.transforms.functional as F #converts a Python Imaging Library (PIL) into a tensor, so the image will become a matrix that Pytorch can work on

from torchvision.datasets import VOCDetection
voc_dataset = VOCDetection(
root='./data',     # Folder where you want to save it
year='2012',       # Pascal VOC 2012 version
image_set='train', # Choose 'train', 'val', 'trainval', or 'test'
download=True      # Download it if it's not already there
)

print("Number of images:", len(voc_dataset))

import os
import numpy as np #library ro work with array and numerical operations
import torch # library to build and train deep learning models
import torch.utils.data # import utils from pytorhc to create and manage datasets
from PIL import Image
from torchvision.datasets import VOCDetection #ro import the pascal VOC dataset
import torchvision.transforms.functional as F # to transform images like convert to tensor
import torchvision.transforms as transforms

class VOCDataset(torch.utils.data.Dataset): #creates a new dataset class
VOC_CLASSES = { #creates a dictionnary of the class name and their associated numbers
'aeroplane': 1,
'bicycle': 2,
'bird': 3,
'boat': 4,
'bottle': 5,
'bus': 6,
'car': 7,
'cat': 8,
'chair': 9,
'cow': 10,
'diningtable': 11,
'dog': 12,
'horse': 13,
'motorbike': 14,
'person': 15,
'pottedplant': 16,
'sheep': 17,
'sofa': 18,
'train': 19,
'tvmonitor': 20
}
def __init__(self, root, transforms=None, image_size=(224,224)): # prepare the dataset
self.root = root #saves where is saved the dataset
self.transforms = transforms #saves images transformation
self.dataset = VOCDetection(root=root, year='2012', image_set='train', download=False) #loads dataset images and labels
self.image_size = image_size # store image_size

#compared to PeenFudanDataset, Pascal vOC is already a standard dataset in Pytorch so it finds images, loads and match everything automatically

def __getitem__(self, idx):
image, target = self.dataset[idx] #gets one image and its annotation

objects = target['annotation']['object'] # list all of the annotated images present on the image
if not isinstance(objects, list):
objects = [objects]
#empty lists to collect bounding boxes and labels
boxes = []
labels = [] #numeric labels
label_names = []

for obj in objects:  #reads bounding box coordinates from the annotations
bbox = obj['bndbox']
xmin = int(bbox['xmin'])
ymin = int(bbox['ymin'])
xmax = int(bbox['xmax'])
ymax = int(bbox['ymax'])
boxes.append([xmin, ymin, xmax, ymax])

label = obj['name'] #reads object class name, converts to number and stire borh names and number
label_idx = self.VOC_CLASSES[label]
labels.append(label_idx)
label_names.append(label)

boxes = torch.as_tensor(boxes, dtype=torch.float32) #converts the boxes and labo into tensors that Pytorch can work on
labels = torch.as_tensor(labels, dtype=torch.int64)

image_id = torch.tensor([idx]) #id of the image
area = (boxes[:, 3] - boxes[:, 1]) * (boxes[:, 2] - boxes[:, 0]) #area of each box (for later loss calculation)
iscrowd = torch.zeros((len(boxes),), dtype=torch.int64) #if object part of a crowd or not

#final  dictionnary
target = {}
target["boxes"] = boxes
target["labels"] = labels
target["label_names"] = label_names
target["image_id"] = image_id
target["area"] = area
target["iscrowd"] = iscrowd

#apply any extra data augmentation when needed
if self.transforms is not None:
image, target = self.transforms(image, target) ##################### before there was no target

return image, target

def __len__(self):
return len(self.dataset) #tells pytorch how many samples we have in the dataset

< /code>
затем попытался использовать обученную I Coco более быстрое r-cnn. < /p>
, но при запуске моего кода после запуска моего кода после гипотезы Gemini: «Атрибут ошибки:« Список ». Словарь) - это список Python, а не тензор Pytorch. Объекты в изображении.import math
import sys
import time
import torch

import torchvision.models.detection.mask_rcnn

from coco_utils import get_coco_api_from_dataset
from coco_eval import CocoEvaluator
import utils

def train_one_epoch(model, optimizer, data_loader, device, epoch, print_freq):
model.train()
metric_logger = utils.MetricLogger(delimiter="  ")
metric_logger.add_meter('lr', utils.SmoothedValue(window_size=1, fmt='{value:.6f}'))
header = 'Epoch: [{}]'.format(epoch)

lr_scheduler = None
if epoch == 0:
warmup_factor = 1.  / 1000
warmup_iters = min(1000, len(data_loader) - 1)

lr_scheduler = utils.warmup_lr_scheduler(optimizer, warmup_iters, warmup_factor)

for images, targets in metric_logger.log_every(data_loader, print_freq, header):
images = list(image.to(device) for image in images)
targets = [{k: v.to(device) if isinstance(v, torch.Tensor) else v for k, v in t.items()} for t in targets] ##### MODIFIED by me

loss_dict = model(images, targets)

losses = sum(loss for loss in loss_dict.values())

# reduce losses over all GPUs for logging purposes
loss_dict_reduced = utils.reduce_dict(loss_dict)
losses_reduced = sum(loss for loss in loss_dict_reduced.values())

loss_value = losses_reduced.item()

if not math.isfinite(loss_value):
print("Loss is {}, stopping training".format(loss_value))
print(loss_dict_reduced)
sys.exit(1)

optimizer.zero_grad()
losses.backward()
optimizer.step()

if lr_scheduler is not None:
lr_scheduler.step()

metric_logger.update(loss=losses_reduced, **loss_dict_reduced)
metric_logger.update(lr=optimizer.param_groups[0]["lr"])

return metric_logger

def _get_iou_types(model):
model_without_ddp = model
if isinstance(model, torch.nn.parallel.DistributedDataParallel):
model_without_ddp = model.module
iou_types = ["bbox"]
if isinstance(model_without_ddp, torchvision.models.detection.MaskRCNN):
iou_types.append("segm")
if isinstance(model_without_ddp, torchvision.models.detection.KeypointRCNN):
iou_types.append("keypoints")
return iou_types

@torch.no_grad()
def evaluate(model, data_loader, device):
n_threads = torch.get_num_threads()
# FIXME remove this and make paste_masks_in_image run on the GPU
torch.set_num_threads(1)
#cpu_device = torch.device("cpu")

# Dynamically select device
if device is None and torch.cuda.is_available():
device = torch.device("cuda")
else:
device = torch.device("cpu") # Ensures defaulting to CPU if CUDA unavailable

model.eval()
metric_logger = utils.MetricLogger(delimiter="   ")
header = 'Test:'

coco = get_coco_api_from_dataset(data_loader.dataset)
iou_types = _get_iou_types(model)
coco_evaluator = CocoEvaluator(coco, iou_types)

for images, targets in metric_logger.log_every(data_loader, 100, header):
images = list(img.to(device) for img in images)

# torch.cuda.synchronize()
model_time = time.time()
outputs = model(images)

outputs = [{k: v.to(cpu_device("cpu")) for k, v in t.items()} for t in outputs] ## ("cpu")
model_time = time.time() - model_time

res = {target["image_id"].item(): output for target, output in zip(targets, outputs)}
evaluator_time = time.time()
coco_evaluator.update(res)
evaluator_time = time.time() - evaluator_time
metric_logger.update(model_time=model_time, evaluator_time=evaluator_time)

# gather the stats from all processes
metric_logger.synchronize_between_processes()
print("Averaged stats:", metric_logger)
coco_evaluator.synchronize_between_processes()

# accumulate predictions from all images
coco_evaluator.accumulate()
coco_evaluator.summarize()
torch.set_num_threads(n_threads)
return coco_evaluator

< /code>
, чтобы наконец -то работать над моим набором данных: < /p>
# Download TorchVision repo to use some files from
# references/detection
!git clone https://github.com/mitjanikolaus/vision.git

!cp vision/references/detection/utils.py .
!cp vision/references/detection/transforms.py .
!cp vision/references/detection/coco_eval.py .
!cp vision/references/detection/engine.py .
!cp vision/references/detection/coco_utils.py .

%%shell

pip install cython
# Install pycocotools, the version by default in Colab
# has a bug fixed in https://github.com/cocodataset/cocoapi/pull/354
pip install -U 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'

import torch
import torchvision
from torchvision.models.detection.faster_rcnn import FastRCNNPredictor, FasterRCNN_ResNet50_FPN_Weights
import utils
import transforms as T
from my_engine import train_one_epoch, evaluate

# Device
#device = torch.device('cpu')
device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu')

# Load Faster R-CNN pretrained on COCO
#model = torchvision.models.detection.fasterrcnn_resnet50_fpn(weights=FasterRCNN_ResNet50_FPN_Weights.COCO_V1)

# Load Faster R-CNN pretrained on COCO with CPU weights
model = torchvision.models.detection.fasterrcnn_resnet50_fpn(
weights=FasterRCNN_ResNet50_FPN_Weights.COCO_V1,
#map_location=torch.device('cpu')  # ✅ Load weights on CPU
)

# Modify it for Pascal VOC:  20 classes + background
num_classes = 21  # 20 classes + background
in_features = model.roi_heads.box_predictor.cls_score.in_features
model.roi_heads.box_predictor = FastRCNNPredictor(in_features, num_classes)

# Move model to device
model = model.to(device)

# Setup dataset
from torch.utils.data import DataLoader
import torch
import torchvision
import transforms as T  # your detection transforms
import utils
from torchvision.models.detection.faster_rcnn import FastRCNNPredictor, FasterRCNN_ResNet50_FPN_Weights

# Define get_transform function
def get_transform(train, device):
transforms_list = []
transforms_list.append(T.ToTensor())  # Convert PIL image to Tensor
if train:
transforms_list.append(T.RandomHorizontalFlip(0.5))  # Only for training
return T.Compose(transforms_list)

# Load your custom Pascal VOC dataset
train_dataset = VOCDataset(root='./data', transforms=get_transform(train=True, device=device))
test_dataset = VOCDataset(root='./data', transforms=get_transform(train=False, device=device))

# split original full dataset
torch.manual_seed(1)
full_indices = torch.randperm(len(train_dataset)).tolist()
small_train_indices = full_indices[:80]  # 80 samples for training
small_test_indices = full_indices[80:100]  # 20 samples for testing

train_dataset = torch.utils.data.Subset(train_dataset, small_train_indices)
test_dataset = torch.utils.data.Subset(test_dataset, small_test_indices)

# Loaders
train_loader = DataLoader(
train_dataset,
batch_size=1,
shuffle=True,
num_workers=1,
pin_memory=True, #makes GPU data transfer more efficient
collate_fn=utils.collate_fn
)

test_loader = DataLoader(
test_dataset,
batch_size=1,
shuffle=False,
num_workers=1,
pin_memory=True,
collate_fn=utils.collate_fn
)

# Optimizer and scheduler
params = [p for p in model.parameters() if p.requires_grad]
optimizer = torch.optim.SGD(params, lr=0.005, momentum=0.9, weight_decay=0.0005)
lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=3, gamma=0.1)

# Training loop
num_epochs = 1

for epoch in range(num_epochs):
train_one_epoch(model, optimizer, train_loader, device, epoch, print_freq=10)
lr_scheduler.step()
evaluate(model, test_loader, device=device)
На данный момент запускаются модели, Epoch 0 проходит через все изображения потери уменьшаются, срок [{k: v.to (torch.device ("cpu")) для k, v in t.items ()} для t в выходе], но, честно говоря, я очень потерян на данный момент. GPU/CPU.
Я очень ценю вашу помощь, большое спасибо: °
louna

Подробнее здесь: https://stackoverflow.com/questions/795 ... ut-cpu-gpu
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Разница между входной формой для 1D CNN, 2D CNN и 3D CNN
    Anonymous » » в форуме Python
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Тематическое исследование: развертывание приборной панели VOC с бэкэнд с колбами для динамической загрузки CSV и живого
    Anonymous » » в форуме Python
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Логотип не загружается на динамически проведенный WordPress за BunkerWeb Proxy
    Anonymous » » в форуме Php
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Логотип не загружается на динамически проведенный WordPress за BunkerWeb Proxy
    Anonymous » » в форуме Php
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Не удалось загрузить ресурс: Запрос, проведенный по времени на сафари
    Anonymous » » в форуме Jquery
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»