当前位置: 首页 > 后端技术 > Python

不错,我用AI把表情归类了

时间:2023-03-26 01:17:29 Python

实用背景。写了爬取大量表情,供网友使用。有网友反映,这样的表情包太乱太复杂了,数量确实够用。但是没有分类。熊猫头、松鼠、脆皮鹦鹉等流行表情包一锅炖。今天我们就这样做!第一个思路显然是利用深度神经网络强大的非线性拟合能力来完成表情的分类,可惜我没有可以用来训练的带标签的表情,所以采用人工标注,费时费力-密集,这是不可接受的。于是,这个小脑袋一转,就想到了用聚类算法来完成这个任务。无监督学习可以从没有任何标签的数据中学习一个模型,也可以将相同的表情符号聚集在一起。整个系统设计方案可分为三个模块。第一个模块是网络爬虫部分。知乎表情包相关问答共抓取50655个表情包。这里我使用了一个简单的分布式爬虫来爬取链接表情包和通过链接下载图片两个过程是同时进行的。下载部分使用多线程来加速下载。感兴趣的同学可以点击这里回顾。第二个模块是特征提取部分,利用Inceptionv3训练好的网络结构对表情进行特征提取。第三个模块是特征聚类部分,直接使用K-means算法对特征进行聚类,即表情符号的聚类。对于模型的评价,这里没有采用相应的计算公式,直接检查表情的聚类效果,即同一系列的表情是否聚类在一起。下图为整个系统设计的流程图。特征提取部分主要使用训练好的Inceptionv3模型进行特征提取,得到每个表情包的2048维特征向量,保存在pickle文件中,用于后续的聚类工作。这里注意给每个表情包打上数字标签,这样特征向量聚类完成后,就可以实现表情包的对应聚类。withtf.Session()assess:"""Opensessionforfeatureextraction"""sess.run(tf.global_variables_initializer())tensor=sess.graph.get_tensor_by_name('pool_3/_reshape:0')foriinrange(num_batches):batch_img_data=img_datas[i*batch_size:(i+1)*batch_size]batch_img_labels=img_labels[i*batch_size:(i+1)*batch_size]feature_v=[]forjinbatch_img_data:j_vector=sess.运行(张量,feed_dict={'DecodeJpeg/contents:0':j})feature_v.append(j_vector)feature_v=np.vstack(feature_v)save_path=os.path.join(output_folder,'data_%d.pickle'%i)withtf.gfile.FastGFile(save_path,'w')asf:pickle.dump((feature_v,batch_img_labels),f)程序运行一段时间后,出现如图所示的一系列pickle文件下面得到。特征聚类的良好开端是成功的一半!现在我们已经得到了表情对应的特征向量,下面的操作就很容易了。只需从pickle文件中提取特征向量,使用sklearn库封装的K-means算法即可实现聚类!defcluster():"""Kmeansforimageclustering"""num_clusters=20model=KMeans(n_clusters=num_clusters,max_iter=30000,tol=1e-15,n_init=400,\init='k-means++',algorithm='full',n_jobs=-1)feature_matrix,origin_labels=get_matrix()model.fit(feature_matrix)result=model.predict(feature_matrix)训练完成后我们可以把特征对应的表情放到同一个文件夹其中,我们来看看效果。发现一些特征明显的表情符号聚类效果很好。几乎相同类型的表情都被准确分类到同一个文件夹中,但是很多表情并没有被正确分类到不同的文件夹中。.于是反复修正模型参数,剔除异常值,得到了一些不错的结果。效果我们可以看到,猫狗表情也正确的分开了,聚集在了不同的文件夹中。这种可爱的表情包也凑齐了。儿童和成人的表情符号也正确分开。但是由于表情的种类繁多,聚类的效果还不够完美,有些文件夹中包含了很多不同类型的表情。我们也可以考虑进一步修正和改进。今天的分享就到这里了,需要表情包的朋友可以私信我哦~