基于深度学习的“微博人像自动识别转发机器人”设计

源代码:https://github.com/zkeenly/fanfou_robot

V1.0更新:

一,对网络结构调整:

1,通过大量实验测试,最终在RESnet50与VGG16中使用VGG16。

image

2,通过观察爬取的数据集特征,将训练数据集分为5类,分别为”人像“,“食物”,“文字”,“动物”,“风景”。

3,训练100次epoch

4,batchsize=24

5,imagesize = 120

最终实际运行准确度更加趋近稳定,对于动物误识别为人的概率大大减小。

image

二,增加更多的功能:

1,将屏蔽转发用户写入为block_list文件,从文件中读取屏蔽用户。

2,当用户发送 “@深绘里 -quit”时,可以将自己列入屏蔽列表中,当发送”@深绘里 -join“,可以重新参与被检索。

3,当用户quit or join,通过私信告知用户。

4,为了提高检测精准度,预测图像的时候,对于 长 or 高(比例大于1:1.3) 的图像裁剪为上,中,下,以及整张图resize为正方形的四张图片进行预测,如果有一张检测为人像,并且另外三张没有同时检测为其他同一类型的图片,则正确分类为人像。

5,自动生成日志log文件,存放于log/log_.txt中。

6,修补bug(修改为运行时强制使用CPU运行,不占用GPU显存)。

7,修正被黑名单私信发送失败异常。

程序逻辑设计概要

本文实验采用Python+Keras作为主要语言,使用饭否API接口实现对微博用户上传的图片实时监控,通过多层卷积神经网络对采集图像进行识别,图像符合人群画像标准,则转发。通过对神经网络训练,识别准确率可达到82.5%。点击这里查看微博链接。

卷积神经网络设计

本文采用对Lenet经典神经网络改进网络,网络结构如下:

image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# first set of CONV -> RELU -> POOL layers
model.add(Conv2D(20, (5, 5), padding="same", input_shape=inputShape))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
# second set of conv relu pool layers
model.add(Conv2D(50, (5, 5), padding="same"))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
# triple set of conv relu pool layers
model.add(Conv2D(20, (5, 5), padding="same"))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
# first (only) set of FC relu layers
model.add(Flatten())
model.add(Dense(500))
model.add(Activation("relu"))
# softmax classifier
model.add(Dense(classes))
model.add(Activation("softmax"))

数据集

对数据集采取二分类划分,类别为人像和非人像。数据集收集自饭否网。共计2168张图片,为了提高人像识别度,其中人像大于1.3:1尺寸的图像通过裁剪为三个等比例正方形方法扩展为共计489张。

自动转发系统设计

转发系统采用python语言设计,通过饭否API (https://github.com/FanfouAPI/FanFouAPIDoc/wiki)获取系统微博信息。提取信息中的图像数据,使用训练好的model模型进行预测图像分类,若属于人像分类则通过API自动转发。

自动转发系统日志:
image
image

机器人识别效果

通过35次epoch 迭代,训练准确度达到89%左右,验证准确度达到83%左右。由于采取验证图像数据集过于小,所以可以看出图中验证准确度波动较大,且loss较高。

image
image
http://fanfou.com/uarepretty/

总结与展望

虽然对于人像可以准确的识别,但是对于一些类人像特征的物体,如猫等。也会被误识别为人像并转发。

image

其主要原因是网络结构过于浅,无法学习到更细节的特征,仅学习到了如眼睛,脸轮廓等。对于皮肤光滑程度没有很好的识别。如果采取更深层次的网络如ResNet50将会得到更好的效果。