前言
开个坑,明天写。
有时间写,先准备组会内容。
好了,不知道是什么时候开的这个坑。貌似是2022年2月7日,不错,今天估计填坑了,2022年5月19日。
这里是数据库地址:Vtuber
这里是Github代码地址:taffyVsDongbro
正文
1. 数据导入
我们这里用的数据来自Vtuber,到目前为止(2022年5月19日),这里有三个数据库:永雏塔菲,东雪莲,嘉然。做了一个multi-label的classifier,但是模型结果发现3个class的modelperformance很低,但是2个class的model(永雏塔菲,东雪莲)有着比较高的performance。由于时间上的关系,此博文仅仅做2个class的model,如果后续需要,或者等Vtuber数量多了起来,可能再会做更多class的model。
数据导入这一块,我们用的label是one-hot的,并且从folder里面导入img,具体代码如下:
对于train data set而言:
classes = ['taffy','dongbro']
train_data = []
train_labels = []
for i in range(21):
data = np.array(tf.keras.utils.load_img('train/taffy/'+ str(i) + '.png')) / 255
data = tf.image.resize(data, [255, 255])
data = np.array(data)
train_data.append(data)
train_labels.append(0)
for i in range(21):
data = np.array(tf.keras.utils.load_img('train/dongbro/'+ str(i) + '.png')) / 255
data = tf.image.resize(data, [255, 255])
data = np.array(data)
train_data.append(data)
train_labels.append(1)
is_one_hot = True
train_X = np.stack(train_data, axis=0)
train_labels = np.stack(train_labels, axis=0)
if is_one_hot:
train_y = np.zeros((train_labels.shape[0],len(classes)))
for i in range(train_y.shape[0]):
train_y[i][train_labels[i]] = train_y[i][train_labels[i]] + 1
else:
train_y = train_labels
对于test data set而言:
test_data = []
test_labels = []
for i in range(5):
data = np.array(tf.keras.utils.load_img('test/taffy/'+ str(i) + '.png')) / 255
data = tf.image.resize(data, [255, 255])
data = np.array(data)
test_data.append(data)
test_labels.append(0)
for i in range(5):
data = np.array(tf.keras.utils.load_img('test/dongbro/'+ str(i) + '.png')) / 255
data = tf.image.resize(data, [255, 255])
data = np.array(data)
test_data.append(data)
test_labels.append(1)
test_X = np.stack(test_data, axis=0)
test_labels = np.stack(test_labels, axis=0)
if is_one_hot:
test_y = np.zeros((test_labels.shape[0],len(classes)))
for i in range(test_y.shape[0]):
test_y[i][test_labels[i]] = test_y[i][test_labels[i]] + 1
else:
test_y = test_labels
2. 模型构建
模型用的是一个很简单的5层神经网络,3层Conv2D,2层Dense。具体代码如下:
# model
model = Sequential()
#
model.add(Conv2D(16, (3, 3), name='conv1', padding='same', activation='relu', kernel_initializer='glorot_uniform', input_shape=(255,255,3)))
model.add(MaxPooling2D(pool_size=(2, 2), strides=None, padding='same', data_format=None))
#
model.add(Conv2D(32, (3, 3), name='conv2', padding='same', activation='relu', kernel_initializer='glorot_uniform', input_shape=(255,255,3)))
model.add(MaxPooling2D(pool_size=(2, 2), strides=None, padding='same', data_format=None))
#
model.add(Conv2D(64, (3, 3), name='conv3', padding='same', activation='relu', kernel_initializer='glorot_uniform', input_shape=(255,255,3)))
model.add(MaxPooling2D(pool_size=(2, 2), strides=None, padding='same', data_format=None))
#
model.add(Flatten())
#
model.add(Dense(512, name='dense1', kernel_initializer='he_normal', activation='relu'))
# only binary
model.add(Dense(2, name='dense2', kernel_initializer='he_normal', activation='softmax'))
3. 模型性能
最终在test 测试集上,Test loss为0.11、Test accuracy为0.90。confusion matrix如下:
结果还不错,只有一张taffy的图被识别为了东哥。
说实话我也不太清楚为什么,也许因为这种没有什么背景,可能没有背景的就被识别为东哥?其他的都会有背景,只有这张是大头。
4. 数据库
4.1. 训练集 - taffy(永雏塔菲)
4.2. 训练集 - dongbro(东雪莲)
4.3. 测试集 - taffy(永雏塔菲)
4.4. 测试集 - dongbro(东雪莲)
总结
比较早的做的一个神经网络,大概是在今年2月份的时候写的,当时还不是很熟悉,现在稍微总结并且补全了一下。
说实话硕士阶段学的东西确实也蛮多的,3个月,进步有点大... 去年12月的时候,还CNN和GAN啥都不会,现在慢慢的会蛮多的...
加油加油!fighting!
参考
Q.E.D.