Данные изображения не могут быть преобразованы в плавающее - PullRequest
0 голосов
/ 03 июля 2019

У меня есть код для прогнозирования породы собаки после тренировки на модели CNN, я получаю индекс класса из функции ниже. Я хочу отобразить случайное изображение из папки класса idx, полученной из функции.

    class_name = [item for item in loaders['train'].dataset.classes]

      def predict_dog_breed(img,model,class_names):
           image = Image.open(img).convert('RGB')
           transform = transforms.Compose([
                          transforms. RandomResizedCrop(224),
                          transforms.ToTensor(),
                         transforms.Normalize(mean=[0.485,0.456,0.406],
                         std=[0.229, 0.224, 0.225])])
           image = transform(image)
           test_image = image.unsqueeze(0)
           net.eval()
           output = net(test_image)
          idx = torch.argmax(output)
          a = random.choice(os.listdir("./dogImages/train/{}/".format (class_name[idx])))
          imshow(a)
          return class_name[idx]

Когда я пытался отобразить случайное изображение, я получаю сообщение об ошибке ниже:

TypeError Traceback (последний вызов последнего) в 1 для img_file в os.listdir ('./ images'): 2 image = os.path.join ('./ images', img_file) ----> 3 dog_or_human (изображение)

в dog_or_human (img) 5 plt.show () 6 if dog_detector (img) == Истинно: ----> 7 Предсказание_дога = предсказание_погода (img, net, имя_класса) 8 print ("Собака обнаружена! Порода является {} ". format (Предсказатель_дога)) 9 elif face_detector (img)> 0:

в предикате_прогнозируемой породы (img, модель, имя_класса) 18 a = random.choice (os.listdir ("./ dogImages / train / {} /". Формат (имя_класса [idx]))) 19 print (a) - -> 20 imshow (a) 21 #subdir = '' .join (["/ dogImages / train /", имя_класса [idx]]) 22 #print (file)

~ / Library / Python / 3.7 / lib / python / site-packages / matplotlib / pyplot.py в imshow (X, cmap, норма, аспект, интерполяция, альфа, vmin, vmax, происхождение, экстент, форма, фильтронорм , filterrad, imlim, resample, url, data, ** kwargs) 2697 filternorm = filternorm, filterrad = filterrad, imlim = imlim, 2698 resample = resample, url = url, ** ({"data": data}, если данные нет -> 2699 Никто другой {}), ** kwargs) 2700 sci (__ ret) 2701 return __ret

~ / Library / Python / 3.7 / lib / python / site-packages / matplotlib / init.py во внутреннем (ax, data, * args, ** kwargs) 1808 "Список Matplotlib!)"% (Label_namer, func.name), 1809 RuntimeWarning, stacklevel = 2) -> 1810 return func (ax, * args, ** kwargs) 1811 1812 inner.doc = _add_data_doc (inner.doc,

~ / Library / Python / 3.7 / lib / python / site-packages / matplotlib / axes / _axes.py в imshow (self, X, cmap, норма, аспект, интерполяция, альфа, vmin, vmax, происхождение, экстент , shape, filternorm, filterrad, imlim, resample, url, ** kwargs) 5492 resample = resample, ** kwargs) 5493 -> 5494 im.set_data (X) 5495 im.set_alpha (alpha) 5496, если im.get_clip_path () Нет:

~ / Library / Python / 3.7 / lib / python / site-packages / matplotlib / image.py в set_data (self, A) 632, если (self._A.dtype! = Np.uint8 и 633 не np.can_cast (self._A.dtype, float, "same_kind")): -> 634 повысить TypeError («Данные изображения не могут быть преобразованы в плавающее») 635 636, если нет (self._A.ndim == 2

TypeError: данные изображения не могут быть преобразованы в плавающее

Любая помощь по этому вопросу будет оценена!

1 Ответ

1 голос
/ 10 июля 2019

Итак, я попытался воспроизвести ошибку в вашем коде здесь и преуспел в этом. Вы получаете ошибку из-за этих строк в вашем коде:

a = random.choice(os.listdir("./dogImages/train/{}/".format(class_name[idx])))
imshow(a)

random.choice(os.listdir("./dogImages/train/{}/".format(class_name[idx]))) в основном возвращает имя файла изображения, которое является строкой. Вы не читаете изображение, просто передаете имя файла в функцию imshow, что неверно. Проверьте пояснения к рисункам ниже.

Код с ошибкой:

enter image description here

Код без ошибок:

enter image description here

Следовательно, измените вашу predict_do_breed функцию на следующую:

def predict_dog_breed(img,model,class_name):
    image = Image.open(img).convert('RGB')
    transform = transforms.Compose([transforms.RandomResizedCrop(224),
                                        transforms.ToTensor(),
                                        transforms.Normalize(mean=[0.485, 0.456, 0.406],
                                                            std=[0.229, 0.224, 0.225])])
    image = transform(image)
    test_image = image.unsqueeze(0)
    net.eval()
    output = net(test_image)
    idx = torch.argmax(output)
    a = random.choice(os.listdir("./dogImages/train/{}/".format(class_name[idx])))
    print(a)
    img = cv2.imread("./dogImages/train/{}/".format(class_name[idx])+a)
    imshow(img)
    return class_name[idx]

В приведенном выше коде функция cv2.imread была использована для чтения имени файла изображения, выводимого random.choice(os.listdir("./dogImages/train/{}/".format(class_name[idx]))).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...