質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • TensorFlow

    677questions

  • Keras

    217questions

KerasでSegnetを行いたい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 537

uriuri

score 38

https://teratail.com/questions/131885#reply-200116
以前質問させていただいた部分は解決したのですが別の部分でエラーがでてしまいました。

イメージ説明

エラーを調べたところ画像を読み込めていないということです。
https://teratail.com/questions/97976

コードの参考はこちらです。
https://qiita.com/uni-3/items/a62daa5a03a02f5fa46d

画像の位置は
イメージ説明
dataset.pyの一部分
DataPath = '/home/ooo/××/SegNet/CamVid/'
変更しました。
プログラムは/home/ooo/××/segnet/
にdataset.pyとmodel.pyとtrain.pyが入っています。

いろいろディレクトリ指定などを変えたのですがダメでした。
ご教授いただけると幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

もう自分で直したほうが早いなと思って作成しました。

# segnet以下にtrain.py, model.py, dataset.pyが格納されています。
─segnet
  ├─.idea
  ├─CamVid
  │  ├─test
  │  ├─testannot
  │  ├─train
  │  ├─trainannot
  │  ├─val
  │  └─valannot
  ├─docker
  │  ├─cpu
  │  └─gpu
  ├─Example_Models
  ├─Models
  ├─Scripts
  └─__pycache__
# train.py
import os
import glob
import numpy as np
import keras

from model import SegNet

import dataset

input_shape = (360, 480, 3)
classes = 12
epochs = 100
batch_size = 1
log_filepath='./logs/'

data_shape = 360*480

class_weighting = [0.2595, 0.1826, 4.5640, 0.1417, 0.5051, 0.3826, 9.6446, 1.8418, 6.6823, 6.2478, 3.0, 7.3614]

## set gpu usage
import tensorflow as tf
config = tf.ConfigProto(gpu_options=tf.GPUOptions(allow_growth=True, per_process_gpu_memory_fraction = 0.8))
session = tf.Session(config=config)
keras.backend.tensorflow_backend.set_session(session)


def main():
    print("loading data...")
    ds = dataset.Dataset(classes=classes,
                         train_file="CamVid/train.txt",
                         test_file="CamVid/test.txt")
    train_X, train_y = ds.load_data(root_path="CamVid",
                                    mode='train') # need to implement, y shape is (None, 360, 480, classes)

    train_X = ds.preprocess_inputs(train_X)
    train_Y = ds.reshape_labels(train_y)
    print("input data shape...", train_X.shape)
    print("input label shape...", train_Y.shape)

    test_X, test_y = ds.load_data(root_path="CamVid",
                                  mode='test') # need to implement, y shape is (None, 360, 480, classes)
    test_X = ds.preprocess_inputs(test_X)
    test_Y = ds.reshape_labels(test_y)

    tb_cb = keras.callbacks.TensorBoard(log_dir=log_filepath, histogram_freq=1, write_graph=True, write_images=True)
    print("creating model...")
    model = SegNet(input_shape=input_shape, classes=classes)
    model.compile(loss="categorical_crossentropy", optimizer='adadelta', metrics=["accuracy"])

    model.fit(train_X, train_Y, batch_size=batch_size, epochs=epochs,
              verbose=1, class_weight=class_weighting , validation_data=(test_X, test_Y), shuffle=True
              , callbacks=[tb_cb])

    model.save('seg.h5')

if __name__ == '__main__':
    main()
# dataset.py
import cv2
import numpy as np
from pathlib import Path
from keras.applications import imagenet_utils


class Dataset:
    def __init__(self, classes=12, train_file='train.txt', test_file='test.txt'):
        self.train_file = train_file
        self.test_file = test_file
        self.data_shape = 360*480
        self.classes = classes

    def normalized(self, 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(self, 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

    def load_data(self, root_path, mode='train'):
        data = []
        label = []
        root_path = Path(root_path)
        if (mode == 'train'):
            filename = self.train_file
        else:
            filename = self.test_file

        with open(filename) as f:
            txt = f.readlines()
            for line in txt:
                train_path, label_path = line.split(' ')
                train_path = root_path.joinpath(train_path[15:])
                label_path = root_path.joinpath(label_path[15:].strip())
                data.append(self.normalized(cv2.imread(str(train_path))))
                label.append(self.one_hot_it(cv2.imread(str(label_path)))[:,:,0])
                print('.', end='')
        #print("train data file", os.getcwd() + txt[i][0][7:])
        #print("label data raw", cv2.imread(os.getcwd() + '/CamVid/trainannot/0001TP_006690.png'))
        return np.array(data), np.array(label)


    def preprocess_inputs(self, X):
    ### @ https://github.com/fchollet/keras/blob/master/keras/applications/imagenet_utils.py
        """Preprocesses a tensor encoding a batch of images.
        # Arguments
            x: input Numpy tensor, 4D.
            data_format: data format of the image tensor.
            mode: One of "caffe", "tf".
                - caffe: will convert the images from RGB to BGR,
                    then will zero-center each color channel with
                    respect to the ImageNet dataset,
                    without scaling.
                - tf: will scale pixels between -1 and 1,
                    sample-wise.
        # Returns
            Preprocessed tensor.
        """
        return imagenet_utils.preprocess_input(X)

    def reshape_labels(self, y):
        return np.reshape(y, (len(y), self.data_shape, self.classes))

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/25 20:09

    ファイルパスをスライスしないといけないつらみ、そして改行コードを除去しないといけないつらみ。

    キャンセル

  • 2018/06/25 20:31

    わざわざありがとうございます。
    実際に行ってみた結果、
    loading data...
    Traceback (most recent call last):
    File "train.py", line 58, in <module>
    main()
    File "train.py", line 34, in main
    mode='train') # need to implement, y shape is (None, 360, 480, classes)
    File "/home/ooo/×××/SegNet/dataset.py", line 52, in load_data
    label.append(self.one_hot_it(cv2.imread(str(label_path)))[:,:,0])
    File "/home/ooo/×××/SegNet/dataset.py", line 33, in one_hot_it
    x[i,j,labels[i][j]] = 1
    TypeError: 'NoneType' object is not subscriptable

    txtの中身の問題でしょうか?

    キャンセル

  • 2018/06/25 20:34 編集

    もちろん同じディレクトリ構成にされたのですよね?

    キャンセル

  • 2018/06/25 20:44

    txtの中身は
    /home/ooo/×××/SegNet/CamVid/train/0001TP_006690.png
    .
    .
    .
    です。

    キャンセル

  • 2018/06/25 20:47

    ─SegNet
    ├─.idea
    ├─CamVid
    │ ├─test
    │ ├─testannot
    │ ├─train
    │ ├─trainannot
    │ ├─val
    │ └─valannot
    ├─docker
    │ ├─cpu
    │ └─gpu
    ├─Example_Models
    ├─Models
    ├─Scripts
    └─__pycache__
    └─ train.py
    └─ model.py
    └─ dataset.py
    となっています。

    キャンセル

  • 2018/06/25 21:00

    ここに格納されているtrain.txtの中身を書き換えているということですか? https://github.com/alexgkendall/SegNet-Tutorial/tree/master/CamVid

    キャンセル

  • 2018/06/25 21:14

    txtが最初の状態
    /SegNet/CamVid/train/0001TP_006690.png
    でも先ほどのエラーが起こってしまい変更し試した後の状態となっています。
    /home/ooo/×××/SegNet/CamVid/train/0001TP_006690.png

    キャンセル

  • 2018/06/25 21:18

    質問は上記に挙げたリンクとtrain.txtが同じか同じでないかなんですが・・・これは同じではないと解釈していいですか。そうすると私が作成したコードは動きません、質問者さんが改変した内容を期待していないからです。

    キャンセル

  • 2018/06/26 10:04

    ごめんなさい。
    こちらのミスでtxtファイルを初期では2段構成だったものを1段に変えていたものが原因でした。
    初期のpathで通りました。
    /SegNet/CamVid/train/0001TP_006690.png

    loading dataを始めたのですが、

    loading data...
    ...............................................................................................................................................................................................................................................................................................................................................................................Traceback (most recent call last):
    File "train.py", line 58, in <module>
    main()
    File "train.py", line 37, in main
    train_Y = ds.reshape_labels(train_y)
    File "/home/ooo/×××/SegNet/dataset.py", line 78, in reshape_labels
    return np.reshape(y, (len(y), self.data_shape, self.classes))
    File "/home/ooo/anaconda3/lib/python3.6/site-packages/numpy/core/fromnumeric.py", line 257, in reshape
    return _wrapfunc(a, 'reshape', newshape, order=order)
    File "/home/ooo/anaconda3/lib/python3.6/site-packages/numpy/core/fromnumeric.py", line 52, in _wrapfunc
    return getattr(obj, method)(*args, **kwds)
    ValueError: cannot reshape array of size 63417600 into shape (367,172800,12)

    エラーの内容として367*172800=63417600
    reshapeしようとする画像データのピクセル数が不足している訳ではなく同じ値なのですがエラーを吐いてしまいます。
    参考サイトとして
    https://teratail.com/questions/97039
    解決策を教えていただけると幸いです。
    たびたびすみません。

    キャンセル

  • 2018/06/26 13:13

    今試してみて自分も再現しました。この質問自体は解決したと思うので解決済にしてもらって、新たに出た質問は新規質問として投稿してもらえますか。

    キャンセル

  • 2018/06/26 19:19

    回答ありがとうございました。
    とても助かりました。

    キャンセル

0

os.getcwd()はcurrent working directoryを返します。
プログラム自体はsegnet内で実行しているので、
/home/ooo/××/segnet/CamVid/train/0001TP_006690.pngを開こうとしていることでしょう。

正しく指定するなら、

>>> DataPath = "/home/ooo/××/SegNet/CamVid/"
>>> s = "/SegNet/CamVid/train/0001TP_006690.png"
>>> DataPath + s[15:]
'/home/ooo/××/SegNet/CamVid/train/0001TP_006690.png'


こんな感じだと思うので、cv2.imreadの中身を

DataPath + txt[i][0][15:]

とかに変えて行けませんか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/21 12:07

    cv2.imreadの中身を変えて実行しましたが同じエラーが発生してしまいました

    キャンセル

  • 2018/06/21 15:40

    申し訳ないですがprintかなにか入れてパスが合ってるかどうか確認してください

    キャンセル

  • 2018/06/24 10:49

    すみません, どの部分をprintで確認すればよいのでしょうか.
    まだ未熟でごめんなさい.

    キャンセル

  • 2018/06/24 11:12 編集

    imreadの中身と同じものを表示してみて確認してください

    キャンセル

  • 2018/06/25 13:37

    print(DataPath + txt[i][0][15:])
    を行った際、
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    NameError: name 'txt' is not defined
    となり
    print(DataPath)をした際は
    /home/ooo/××/SegNet/CamVid/
    でした。
    これはtxtがプログラム上で定義されていないからなのでしょうか。

    キャンセル

  • 2018/06/25 13:40

    /home/ooo/××/SegNet/CamVid/
    に実行プログラムをいれました。
    確認はターミナルでpythonの対話型にし
    import os
    をし
    printで確認しました。

    キャンセル

  • 2018/06/25 17:58

    train.pyの中にprintを埋め込んでください
    data.append(self.normalized(cv2.imread(DataPath + txt[i][0][15:])))
    の行のすぐ上に
    print(DataPath + txt[i][0][15:])
    と入れるということです

    キャンセル

  • 2018/06/25 19:21

    複雑だったのでpyファイルをsegnetからSegNetに移して実行しました。
    コードは参考サイトどおりにしました。
    print("train data file", os.getcwd() + txt[i][0][7:])
    を行った結果は
    train data file /home/ooo/×××/SegNet/CamVid/train/0001TP_006690.png
    でありpathが通っていることは確認できました。
    print("label data raw", cv2.imread(os.getcwd() + txt[i][1][7:][:-1])[:,:,0]))
    を行った結果
    Traceback (most recent call last):
    File "train.py", line 4, in <module>
    import dataset
    File "/home/ooo/×××/SegNet/dataset.py", line 54
    print("label data raw", cv2.imread(os.getcwd() + txt[i][1][7:][:-1])[:,:,0]))
    ^
    SyntaxError: invalid syntax

    というエラーがでてしまいました。

    キャンセル

  • 2018/06/25 19:24

    ごめんなさい、上のコメントのコードが間違っていました。
    print("label data raw", os.getcwd() + txt[i][1][7:])
    でやってください。

    キャンセル

  • 2018/06/25 19:25

    print("label data raw", cv2.imread(os.getcwd() + txt[i][1][7:][:-1])[:,:,0]))をコメントアウトし
    train.pyを実行すると
    loading data...
    train data file /home/ooo/×××/SegNet/CamVid/train/0001TP_006690.png
    Traceback (most recent call last):
    File "train.py", line 54, in <module>
    main()
    File "train.py", line 31, in main
    train_X, train_y = ds.load_data('train') # need to implement, y shape is (None, 360, 480, classes)
    File "/home/iclab/ooo/×××/dataset.py", line 55, in load_data
    label.append(self.one_hot_it(cv2.imread(os.getcwd() + txt[i][1][7:][:-1])[:,:,0]))
    TypeError: 'NoneType' object is not subscriptable
    となってしまい
    label.append(self.one_hot_it(cv2.imread(os.getcwd() + txt[i][1][7:][:-1])[:,:,0]
    のところに問題があるのでしょうか。

    キャンセル

  • 2018/06/25 19:27 編集

    いま確認したところ
    label data raw /home/ooo/×××/SegNet
    になっておりpathが通っていないことが分かりました。

    キャンセル

  • 2018/06/25 19:30

    print("label data raw", os.getcwd() + txt[i][1][7:], txt[i][1])にするとどうなりますか?

    キャンセル

  • 2018/06/25 19:32

    train data fileと同じような形ですがpathの指定が違うのはなぜでしょうか。
    どのようにpathを通すようにするかを教えていただけたら幸いです。

    キャンセル

  • 2018/06/25 19:34

    print("label data raw", os.getcwd() + txt[i][1][7:], txt[i][1])
    を試したところ
    pathの位置は先ほどと同じ結果になりました。

    キャンセル

  • 2018/06/25 19:36

    txt[i][1]に該当する出力(スペースで区切られているのでわかります)はどうなりました?

    キャンセル

  • 2018/06/25 19:39

    print("label data raw", os.getcwd() + txt[i][1][7:], txt[i][1])
    を行った結果出力として
    label data raw /home/ooo/×××/SegNet
    が表示されました。

    キャンセル

  • 2018/06/25 19:43

    print("label data raw", os.getcwd() + txt[i][0][7:], txt[i][0])
    だとどうなりますか? こっちかも

    キャンセル

  • 2018/06/25 19:44

    パスは文字列加工で作っているだけです。なので、目的のパスになるように加工してやるしかありません

    キャンセル

  • 2018/06/25 19:45

    label data raw /home/ooo/×××/SegNet /SegNet/CamVid/train/0001TP_006690.png
    と表示されました。

    キャンセル

  • 2018/06/25 19:50

    今のファイル配置だと、画像の正しい絶対パスはどこになりますか?
    SegNet以下の構成が元と同じなら、SegNetまでのパスを結合してやればとりあえず動くとおもうので、それが一番楽だと思いました

    キャンセル

  • 2018/06/25 20:04

    画像の位置は
    /home/ooo/×××/SegNet /SegNet/CamVid/train/0001TP_006690.png
    となっています。
    train.txtでは
    /SegNet/CamVid/train/0001TP_006690.png
    .
    .
    .
    となっています。
    label data raw /home/ooo/×××/SegNet /SegNet/CamVid/train/0001TP_006690.png
    SegNetが重複していたのでtrain.txtを
    /CamVid/train/0001TP_006690.png
    にし行った際
    data.append(self.normalized(cv2.imread(os.getcwd() + txt[i][0][7:])))
    のprintが表示されませんでした。
    SegNetの重複をなくしたい場合
    print("label data raw", os.getcwd() + txt[i][0][7:], txt[i][0])
    をどう変えたらいいでしょうか。

    キャンセル

  • 2018/06/25 20:05

    その後pathが通った際は
    label.append(self.one_hot_it(cv2.imread(os.getcwd() + txt[i][1][7:][:-1])[:,:,0]))
    の部分をprintでpathが通った形と同じようにすればいいのでしょうか。

    キャンセル

  • 2018/06/25 20:08

    hayataka2049さんの負担が大きいなぁと思いましたので別回答用意しました。

    キャンセル

  • 2018/06/25 20:09

    なんかすみません。wakameさんにも質問者さんにも。

    キャンセル

  • 2018/06/25 20:12

    こちらこそ横槍すみません。横目で見ていて思ったのは質問者さんの画像を保存しているディレクトリとソースコードを保存しているディレクトリが異なっていて、かつos.getcwd()でカレントディレクトリを取得しているもので余計にややこしくなってるなぁとということです。

    キャンセル

  • 2018/06/25 20:32

    知識不足でいろいろな方に迷惑をかけてしまい申し訳ありません。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    tableview row(cell)

    コード import UIKit class ViewController: UIViewController, UITableViewDelegate, UITableView

  • 解決済

    ACCESS クエリでの一部重複?の除外方法について

    前提・実現したいこと こんにちは、質問タイトルが適格でないかもしれませんが宜しくお願いいたします。 通販事業をしており、商品の仕入から販売までのデータベースをACCESSの

  • 解決済

    CentOS7でWebページ公開

    前回からの続き的な質問になるんですが、前回UbuntuでWeb公開をやっていて、回答どうりにやてもうまく行かなく、今回CentOS7(1611)を導入してやっているんですが、これも

  • 解決済

    Monacaでtimepickerの実装

    前提・実現したいこと MonacaでiOS/Andriod両方に対応しているアプリケーションを開発していて、アラーム機能を実装しようと思い、Monacaでtimepickerのよ

  • 解決済

    背景色の有無と::

    左上の図でleftの右とrightの右の水色が表示されません。特にエラーもありません。 宜しくお願い致します。 リンク内容 <!DOCTYPE html> <

  • 解決済

    atom自動補完やり方

    これのプログラミング版になります 今いろいろ調べているのですが、atom自動補完ができません。宜しくお願い致します。 リンク内容 autocomplete-p

  • 受付中

    ER図について

    つぶやきアプリを作っているのですが、 ER図を作るとする例えばどんなものがありますか?? サンプル程度でいいので教えていただきたいです

  • 解決済

    C#からGoogle Sheets APIを呼び出したい

    前提・実現したいこと Visual Studio 2015でアプリ作成中です。 C#からGoogle Sheets APIを呼び出したいのですが、実行するとエラーメッセージが表

同じタグがついた質問を見る

  • TensorFlow

    677questions

  • Keras

    217questions