import json
import numpy as np
from PIL import Image
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
with open('deepscores_train.json', 'r') as f:
train_data = json.load(f)
with open('deepscores_test.json', 'r') as f:
test_data = json.load(f)
train_x = []
train_y = []
for annotation in train_data['annotations']:
# 获取图像ID
image_id = annotation['image_id']
# 查找与当前注释匹配的图像
image = next((i for i in train_data['images'] if i['id'] == image_id), None)
if image is None:
continue
# 从图像文件中加载图像数据
with Image.open(image['file_name']) as img:
img_data = np.array(img, dtype='float32')
label = annotation['category_id']
train_x.append(img_data)
train_y.append(label)
train_x = np.array(train_x)
train_y = np.array(train_y)
test_x = []
test_y = []
for annotation in train_data['annotations'].values():
image = next((i for i in train_data['images'] if i['id'] == annotation['image_id']), None)
if image is None:
continue
with Image.open(image['file_path']) as img:
img_data = np.array(img, dtype='float32')
label = annotation['category_id']
# 将图像数据和标签添加到测试数据集中
test_x.append(img_data)
test_y.append(label)
test_x = np.array(test_x)
test_y = np.array(test_y)
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(train_x.shape[1:])))
model.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(train_x, train_y, batch_size=128, epochs=10, validation_data=(test_x, test_y))
model.save('music_model.h5')
Traceback (most recent call last): File "E:\md\model.py", line 21, in image_id = annotation['image_id'] ~~~~~~~~~~^^^^^^^^^^^^ TypeError: string indices must be integers, not 'str'
I tried to train the model with DeepScores' data.But line 21 keeps getting an error, so I hope someone can help me change the code