使用神经网络VGG16识别海贼王人物角色

过程

寒假过程中,画了3天采集海贼王角色数据并进行标注,然后花了1天时间使用神经网络训练数据集,并进行验证

  • 使用的训练集为自己从视频中提取而来的图片,大部分是角色的面部图片,小部分包含了全身图像.
序号 文件夹 含义 数量
0 lufei 路飞 117 张
1 suolong 索隆 90 张
2 namei 娜美 84 张
3 wusuopu 乌索普 77张
4 qiaoba 乔巴 102 张
5 shanzhi 山治 47 张
6 luobin 罗宾 105张

图像样例

使用神经网络VGG16识别海贼王人物角色_第1张图片

实验成果

github代码 : https://github.com/kadn/haizeiwang_face

操作步骤

  1. 首先要收集图片
    利用 screentogif 软件对海贼王视频进行截图,保存含有人物头像的图片
  2. 对人脸部分进行提取
    使用MATLAB软件的 imcrop 函数对整张图片进行部分截图,并将不同的角色保存至不同的文件夹中,详见
    https://github.com/kadn/haizeiwang_face/blob/master/hzw/imc.m
    使用方法:
    • 将要截取人物图片的视频读取进来
    • 对视频每一帧图像合适的地方进行截取
    • 在MATLAB命令行界面输入角色名称
  3. 使用VGG16网络进行训练,详见我的VGG16_notebook
  4. 对图片进行预处理
    • 首先根据VGG16要求的图片最小大小为(xx, xx)将图片resize成合适的大小
    • 使用from keras.preprocessing.image import ImageDataGenerator导入keras中的预处理工具, 对图像数据进行增强,以此来增加样本数量
    # 参数设置
    from matplotlib import pyplot
    from keras.preprocessing.image import ImageDataGenerator
    datagen = ImageDataGenerator(rotation_range=30, 
                              width_shift_range=0.1, height_shift_range=0.1,
                             brightness_range=[0.8,1.5],
                             zoom_range=[0.8,1.2],
                             horizontal_flip=False,
                             vertical_flip=False,
                             rescale=1/128.0,
                             featurewise_center=True)
     # 看一下增强的结果
     datagen.fit(train_data)
     for batch_data, batch_label in datagen.flow(train_data, train_label, batch_size=9):
         batch_data = batch_data 
         batch_data = np.clip(batch_data, 0,1)
         print(batch_data.max())
         print(batch_data.min())
         for i in range(9):
             pyplot.imshow(batch_data[i])
             pyplot.show()
         break
    
    增强的结果
    使用神经网络VGG16识别海贼王人物角色_第2张图片
  5. 导入keras中的VGG16模型, 并修改为自己的网络
    • 去除掉VGG16的顶层, 修改为自己的.这是因为VGG16原来的输出种类有1000, 这里只有7个
    • 保持VGG16卷积层参数不再训练,只训练自己新添加的层
from keras.layers import Input, Dense, Dropout, Activation, Flatten
from keras.models import Model
from keras.applications.vgg16 import VGG16
import numpy as np

tBatchSize = 64
'''第一步:选择模型'''   #VGG16要求图片大小最少48 
model_vgg = VGG16(include_top=False, input_shape=(128,128,3))
for layer in model_vgg.layers:
    layer.trainable = False

model = Flatten(name='flatten')(model_vgg.output)
model = Dense(500, activation='relu', name='fc1')(model)
model = Dense(500, activation='relu', name='fc2')(model)
model = Dropout(0.5)(model)
model = Dense(7, activation='softmax')(model)
model = Model(inputs=model_vgg.input, 
                        outputs = model, name = 'vgg16')

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 
  1. 实验结果
    将图片以及识别的结果使用 matplotlib打印出来
res = []
d = {0:'路飞', 1:'索隆', 2:'娜美', 3:'乌索普', 4:'乔巴', 5:'山治', 6:'罗宾'}
d = {0:'lufei', 1:'suolong', 2:'namei', 3:'wusuopu', 4:'qiaoba', 5:'shanzhi', 6:'luobin'}

for batch_data, batch_label in datagen.flow(train_data, train_label, batch_size=10):
    res = model.predict(batch_data)
    print('batch max : ',batch_data.max())
    print('batch_min : ',batch_data.min())
    batch_data = np.clip(batch_data, 0,1)
    
    for i in range(10):
        ax = pyplot.subplot(2,5,i+1)
        pyplot.imshow(batch_data[i])
        ax.set_xlabel('{}'.format(d[np.argmax(res[i])]))
#     pyplot.axis('on')
    pyplot.tight_layout()
    pyplot.rcParams['figure.figsize'] = (5.0, 5.0)
    pyplot.show()
    break
print( np.argmax(res, axis=1))

使用神经网络VGG16识别海贼王人物角色_第3张图片

其他

同时使用inception v3实验了一下,发现效果不好,有同学明白的话希望能帮助我一下.

你可能感兴趣的:(python,keras,Python,海贼王,数据集,人脸识别,VGG16)