IndexError: индекс 255 выходит за границы оси 2 с размером 12. Что это значит и как ее решить? - PullRequest
0 голосов
/ 05 мая 2019

В настоящее время я использовал keras segnet из https://github.com/0bserver07/Keras-SegNet-Basic и без проблем запустил его. Но когда я перехожу на свой собственный набор данных, я получаю проблему с ошибкой индекса. Я новичок в области питона и искусственного интеллекта, поэтому я надеюсь, что кто-нибудь может мне помочь. Я искал другую подобную проблему и решение, но все еще не понимаю.

Это ошибка:

Traceback (most recent call last):
  File "C:/Users/ZC/PycharmProjects/segnet(crack)/model.py", line 35, in <module>
    train_data, train_label = load_data("train2")
  File "C:/Users/ZC/PycharmProjects/segnet(crack)/model.py", line 30, in load_data
    label.append(one_hot_it(cv2.imread(txt[i][1][:-1])[:,:,0]))
  File "C:\Users\ZC\PycharmProjects\segnet(crack)\helper.py", line 29, in one_hot_it
    x[i,j,labels[i][j]]=1
IndexError: index 255 is out of bounds for axis 2 with size 12

Это код (model.py):

from __future__ import absolute_import
from __future__ import print_function

import cv2
import numpy as np
import itertools

from helper import *
import os

# Copy the data to this dir here in the SegNet project /CamVid from here:
# https://github.com/alexgkendall/SegNet-Tutorial
DataPath = 'C:/Keras-SegNet/SegNet/'
data_shape = 360*480

def load_data(mode):
    data = []
    label = []
    with open(DataPath + mode +'.txt') as f:
        txt = f.readlines()
        txt = [line.split(' ') for line in txt]
    for i in range(len(txt)):
        print(txt[i][0])
        print(txt[i][1][:-1])

        img=cv2.imread( txt[i][1][:-1])
        cv2.imshow('image',img)

        data.append(np.rollaxis(normalized(cv2.imread( txt[i][0])),2))
        label.append(one_hot_it(cv2.imread(txt[i][1][:-1])[:,:,0]))

        print('.',end='')
    return np.array(data), np.array(label)

train_data, train_label = load_data("train2")
train_label = np.reshape(train_label,(300,data_shape,2))

test_data, test_label = load_data("test")
test_label = np.reshape(test_label,(233,data_shape,2))

np.save("train_data", train_data)
np.save("train_label", train_label)

np.save("test_data", test_data)
np.save("test_label", test_label)

Это код файла helper.py:

from __future__ import absolute_import
from __future__ import print_function

import cv2
import numpy as np
import itertools

from helper import *
import os

def normalized(rgb):
    #return rgb/255.0
    norm=np.zeros((rgb.shape[0], rgb.shape[1], 3),np.float32)

    b=rgb[:,:,0]
    g=rgb[:,:,1]
    r=rgb[:,:,2]

    norm[:,:,0]=cv2.equalizeHist(b)
    norm[:,:,1]=cv2.equalizeHist(g)
    norm[:,:,2]=cv2.equalizeHist(r)

    return norm

def one_hot_it(labels):
    x = np.zeros([360,480,12])
    for i in range(360):
        for j in range(480):
            x[i,j,labels[i][j]]=1
    return x

Может ли кто-нибудь также объяснить, что делает функция для helper.py, особенно для этой строки x [i, j, tags [i] [j]] = 1.

1 Ответ

0 голосов
/ 05 мая 2019

Здесь вы можете видеть, что массив x размером 12 на 3-й оси при его создании: np.zeros([360,480,12]). Поэтому всякий раз, когда вы обращаетесь к чему-либо по 3-й оси, вам необходимо убедиться, что оно находится между 0 и 11.

В этом случае labels[i][j] имеет значение 255 в некоторый момент, поэтому он не работает. Это потому, что вы используете one_hot_it с изображением вместо меток (one_hot_it(cv2.imread(txt[i][1][:-1])[:,:,0])).

...