前言

开个坑,明天写。
有时间写,先准备组会内容。
好了,不知道是什么时候开的这个坑。貌似是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如下:
16529716591.png
结果还不错,只有一张taffy的图被识别为了东哥。
16529716821.png
说实话我也不太清楚为什么,也许因为这种没有什么背景,可能没有背景的就被识别为东哥?其他的都会有背景,只有这张是大头。
16529717381.png

4. 数据库

4.1. 训练集 - taffy(永雏塔菲)

16529862781.png

4.2. 训练集 - dongbro(东雪莲)

97cf1b3e434ea1be1422748fae1ecbc.png

4.3. 测试集 - taffy(永雏塔菲)

16529864091.png

4.4. 测试集 - dongbro(东雪莲)

16529864191.png

总结

比较早的做的一个神经网络,大概是在今年2月份的时候写的,当时还不是很熟悉,现在稍微总结并且补全了一下。
说实话硕士阶段学的东西确实也蛮多的,3个月,进步有点大... 去年12月的时候,还CNN和GAN啥都不会,现在慢慢的会蛮多的...
加油加油!fighting!

参考

自己

Q.E.D.


立志做一个有趣的碳水化合物