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

用Python搞定最全珍妮龟表情包(第二篇)

时间:2023-03-25 21:44:34 Python

上次说到用爬虫,把视频剪成多张图。今天,我们来谈谈如何使用机器学习。减少筛选松鼠工作量的方法。这些图片大致可以分为两类,Squirtle和非Squirtle。这个分类任务不同于猫狗识别的二元分类,而是一个单一的分类任务。分类算法分类算法如果按照类别的多少来划分,可以分为单分类、二分类和多分类三种。一般我们看到的更多是二分类或者多分类。使用朴素贝叶斯算法识别垃圾邮件和使用神经网络识别猫和狗是典型的二元分类。垃圾邮件和普通邮件都有相应的特征和标签,猫和狗也有相应的特征和标签。它属于监督学习的范畴。手写数字识别0-9是典型的多分类,今天我们的任务是判断某张图片是不是珍妮龟,也就是单分类任务。因为我们只有少量现成的松鼠龟图片作为正样本训练集,很难找到合适的负样本,所以我们需要训练一个单类模型,只关注相似或高度相似的样本匹配正样本,其他所有不属于该类的样本统一判断为“否”,而不是因为属于其他类而返回“否”。单分类支持向量机就是这样一种单分类算法,它实际上决定了正样本的边界,边界外的数据会被分到另一类。刚好适合当前负样本特征不易判断的场景。其实这是一种异常检测的算法。特征提取的总体思路是利用深度神经网络进行特征提取,在现有的单类分类方法中将提取的特征用于分类。特征提取部分采用inceptionv3的网络结构,将每张图片转换的像素矩阵作为数据传入张量进行前向计算,得到高维特征。一次性提取我们有的少量松鼠图片的特征,分批提取切好的图片的特征。使用tf.Session()作为sess: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.run(tensor,feed_dict={'DecodeJpeg/contents:0':j})feature_v.append(j_vector)feature_v=np.vstack(feature_v)save_path=os.path.join(folder,'data_%d.pickle'%i)withtf.gfile.FastGFile(save_path,'w')asf:pickle.dump((feature_v,batch_img_labels),f)print(save_path,'is_ok!')OneClassSVM使用这些珍妮龟图片的特征作为训练集来训练OneClassSVM模型,勾勒出一个包含珍妮龟特征的超平面,然后检测切割得到的图像特征。如果包含在超平面内,则结果为1,否则结果为-1。得到结果后,将正例的所有图片复制移动到一个新的文件夹中,这个文件夹中的图片就是我们的目标图片。defone_class_svm():model=svm.OneClassSVM()feature_matrix,_=get_matrix('data_jieni',50)model.fit(feature_matrix)vedieo_feature_matrix,origin_labels=get_matrix('data_vedio',500)结果=model.predict(vedieo_feature_matrix)foriinrange(len(origin_labels)):ifresult[i]==1:move(src='vedio',dst='result',i=origin_labels[i])经过过滤,我们会得到这个新的文件夹的result文件夹里有机器学习选出来的松鼠的图片,但是效果不是特别理想。还有很多不是松鼠的图漏网之鱼,也放到了这个文件夹里,我们可以考虑对正样本集进行一些处理,随机裁剪,图片反转,旋转等,以扩大训练集。至此,我们通过机器学习的方法对切图集进行了筛选,得到了大量松鼠的图片。在最后一个项目符号中,我们将讨论如何操作这些图片。