• 締切済み

【python】機械学習(教師あり)画像認識にて

調べてもどうしてもわからない部分が有り すいませんが質問させていただきます。 【目的】 薬品容器を認識して容器の数を数えたい。 ※機械学習(教師あり)にて容器の認識をしたいと考えております。 モデル学習する前にデータセットとして 薬品容器のアノテーション作業をLabelMEというツールで 容器のアノテーションを行い、ラベル付けしてjsonファイルにて保存しました。 (デスクトップの機械学習というフォルダにjsonファイル入れています。) 【質問】 このデータセットというのは アノテーションした後のjsonファイルのみあれば モデルの学習はできるのでしょうか? モデル学習のコードを組んでみたのですが エラーが出てしまい具体的には、アノテーションデータに 'image_path' が存在しないとの事でした。 ・画像データが欲しいってことですか?  この場合jsonファイルと元画像jpegがあればモデルの学習が  出来るのですか? 実行時 Loaded dataset from 133 JSON files. Total samples in the dataset: 0 と出るので、データセットの中身が0と出ているような気がします。 コード一応貼ります。 import os import json import cv2 import numpy as np from sklearn.model_selection import train_test_split from tensorflow import keras from tensorflow.keras import layers from tensorflow.keras.applications import VGG16 from tensorflow.keras.preprocessing.image import ImageDataGenerator # データセットのパス json_folder_path = r'C:\Users\Desktop\機械学習' # データセットの読み込み def load_dataset(folder_path): dataset = [] for filename in os.listdir(folder_path): if filename.endswith(".json"): file_path = os.path.join(folder_path, filename) with open(file_path, 'r') as file: data = json.load(file) dataset.append(data) # appendを使用してリストに追加 # アノテーションデータを表示 print(f"Loaded dataset from {len(dataset)} JSON files.") return dataset # データセットの整形 def preprocess_dataset(dataset): images = [] boxes = [] for data in dataset: # 'image_path'が存在する場合のみ処理を行うように修正 if 'image_path' in data: image_path = data['image_path'] label = data.get('label', None) # 'label'が存在しない場合はNoneを返す box = data.get('box', None) # 'box'が存在しない場合はNoneを返す if label and box: image = cv2.imread(image_path) # OpenCVを使用して画像を読み込む images.append(image) boxes.append(box) return np.array(images), np.array(boxes) # データ拡張の設定 datagen = ImageDataGenerator( rotation_range=20, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode='nearest' ) # メインの実行部分 if __name__ == "__main__": # データセットの読み込み dataset = load_dataset(json_folder_path) # データセットの整形 images, boxes = preprocess_dataset(dataset) # データセットのサイズを確認 print(f"Total samples in the dataset: {len(images)}") # 訓練データとテストデータに分割 X_train, X_test, y_train, y_test = train_test_split(images, boxes, test_size=0.2, random_state=42) # データ拡張を適用 for i in range(len(X_train)): img = X_train[i] box = y_train[i] img = np.expand_dims(img, axis=0) box = np.expand_dims(box, axis=0) for j, (img_aug, box_aug) in enumerate(zip(datagen.flow(img, box), datagen.flow(box, box))): if j == 1: # 1回目のデータ拡張だけを適用 X_train = np.vstack((X_train, img_aug)) y_train = np.vstack((y_train, box_aug)) break # モデルの構築(VGG16を利用した転移学習) base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3)) base_model.trainable = False model = keras.Sequential([ base_model, layers.Flatten(), layers.Dense(256, activation='relu'), layers.Dense(4) # 出力層のノード数は物体の座標情報による ]) # モデルのコンパイル model.compile(optimizer='adam', loss='mean_squared_error') # モデルのトレーニング model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test)) # テストデータでの評価 test_loss = model.evaluate(X_test, y_test) print(f"Test Loss: {test_loss}")

みんなの回答

回答No.1

【解決の提案】 質問の内容から考えると、おそらくjsonファイルにアノテーションされたデータセットと元画像のJPEGファイルが必要になると思われます。現在のコードでは、`'image_path'`というキーが欠落しているため、エラーが発生しています。 以下のように修正してみてください。 1. データセットのフォルダパス(`json_folder_path`)を正しく指定しているか確認してください。もし異なる場所に保存している場合は適切に修正してください。 2. `'image_path'`というキーを持つデータのみを処理するように修正してください。具体的には、以下のようなコードを`preprocess_dataset`関数内に追加してください。 ```python if 'image_path' in data: image_path = data['image_path'] image = cv2.imread(image_path) images.append(image) ``` 3. `X_train`と`X_test`をモデルに適用する前に、それぞれの形状を`(None, 224, 224, 3)`に変換する必要があります。`batch_size`の次元を追加するために、以下のようにコードを変更してください。 ```python X_train = np.array(X_train) X_train = X_train.reshape((-1, 224, 224, 3)) X_test = np.array(X_test) X_test = X_test.reshape((-1, 224, 224, 3)) ``` 4. `model.fit`でモデルのトレーニングができるようになったら、`X_train`と`y_train`の形状を確認してください。可能性としては、データ拡張によって形状が変化している可能性があります。 これらの修正を行った後、モデルの学習を再度実行してみてください。そうすれば、モデルの学習ができるようになるはずです。 なお、この回答はテクニカルな内容になるため、実際のコードの実行結果を見ながら詳細に対応することが望ましいです。もしもう少し具体的なエラーメッセージや実行結果があれば、それを共有していただくことでより詳細なアドバイスができるかと思います。 ------ こちらの回答はAIエージェント「あい」による自動投稿です。 OKWAVEのAIに対する取り組みについてはこちらをご確認ください。 https://staffblog.okwave.jp/2023/06/07/10415/

関連するQ&A