I am new to PyTorch. I have a variable pred which has a list of a tensor.
print(pred)
output: [tensor([[176.64380, 193.86154, 273.84702, 306.30405, 0.83492, 2.00000]])]
So I wanted to access the last element which is the class. I did that by first converting the list into a tensor.
x = torch.stack(pred)
output: tensor([[[176.64380, 193.86154, 273.84702, 306.30405, 0.83492, 2.00000]]])
Now, how do I access the last element or is there any better/efficient way of doing this?
EDIT: For further reference here’s the code that performs classification task.
def classify_face(image):
device = torch.device("cpu")
img = process_image(image)
print('Image processed')
# img = image.unsqueeze_(0)
# img = image.float()
pred = model(img)[0]
# Apply NMS
pred = non_max_suppression(pred, 0.4, 0.5, classes = [0, 1, 2], agnostic = None )
if classify:
pred = apply_classifier(pred, modelc, img, im0s)
#print(pred)
model.eval()
model.cpu()
print(pred)
# output = non_max_suppression(output, 0.4, 0.5, classes = class_names, agnostic = False)
#_, predicted = torch.max(output[0], 1)
#print(predicted.data[0], "predicted")
classification = torch.cat(pred)[:, -1]
index = int(classification)
print(names[index])
return names[index]
During prediction pred consists of x1
, y1
, x2
, y2
, conf
, and class
.
e.g. pred = [tensor([[176.64380, 193.86154, 273.84702, 306.30405, 0.83492, 2.00000]])]
If there are no predictions made by the model then pred
is simply empty.
e.g. pred = [tensor([], size=(0, 6))]
Presently my program stops prediction if it receives an empty tensor and throws an error:
Traceback (most recent call last):
File "WEBCAM_DETECT.py", line 168, in <module>
label = classify_face(frame)
File "WEBCAM_DETECT.py", line 150, in classify_face
index = int(classification)
ValueError: only one element tensors can be converted to Python scalars
EDIT1: It seems to work when I check length of the pred but I get this error when there are two or more rows in tensor.
[tensor([[212.38568, 117.47020, 339.35773, 266.00513, 0.74144, 2.00000],
[214.60651, 118.50694, 339.90192, 265.91696, 0.44277, 0.00000]])]
#################
#################
Traceback (most recent call last):
File "WEBCAM_DETECT.py", line 172, in <module>
label = classify_face(frame)
File "WEBCAM_DETECT.py", line 154, in classify_face
index = int(classification)
ValueError: only one element tensors can be converted to Python scalars
How do I make my program sort of just ignore if there are no predictions made at a certain frame and continue onto the next frame?
Advertisement
Answer
You can select the last element with the index notation on the 3rd axis, then broadcasting to a 1D tensor:
x[:, :, -1].view(-1)
However, I would rather use torch.cat
on pred
, this avoids creating a new axis:
torch.cat(pred)[:, -1]
Edit – you may check if the tensor is empty beforehand with:
if len(pred) == 0:
return None