图像多分类——卷积神经网络

例子参考:https://www.jiqizhixin.com/articles/2019-05-15-2

数据集:https://www.cs.ccu.edu.tw/~wtchu/projects/MoviePoster/index.html


将获取到原始数据集,其中,有三个文件,   Movie Poster Dataset是1980-2015年部分影片海报图片, Movie Poster Metadata是1980-2015年部分影片的数据详情,example:

                          

Readme则是对 Movie Poster Metadata文件里边的字段解释,在训练过程中只用到IMPId和 Genre(影片类型)。

 

                                       

 

步骤:

  • 数据处理

获取到影片的类型对影片类型实现one-hot编码,如果是属于哪个类型,用1表示,其他为0,得到如下文件,

                         

考虑到特征的相关性,删除影片比较少的类型列(将数量小于50的类型列进行删除),最终留下22个电影类型,如下:

                                            

将电影类型作为最终的结果值,然后加载图片:

for i in tqdm(range(train.shape[0])):  img = image.load_img('D:/aayu/实例/图像多分类/data/Images/'+train['ID'][i]+'.jpg',target_size=(400,400,3))  img = image.img_to_array(img)  img = img/255  train_image.append(img)      
X = np.array(train_image)
  • 模型构建

模型是由4层卷积和3层全连接层构成,具体参数如下:

                                     

训练结果为:

  • 模型预测

新增一个复仇者联盟的海报对数据进行预测(此处可更换为任意海报数据),加载数据:

img = image.load_img('F:/aayu/图像/data/GOT.jpg',target_size=(400,400,3))  
img = image.img_to_array(img)  
img = img/255 

预测结果:

 

完整代码:


import keras  
from keras.models import Sequential  
from keras.layers import Dense, Dropout, Flatten  
from keras.layers import Conv2D, MaxPooling2D  
from keras.utils import to_categorical  
from keras.preprocessing import image  
import numpy as np  
import pandas as pd  
import matplotlib.pyplot as plt  
from sklearn.model_selection import train_test_split  
from tqdm import tqdm  
#%matplotlib inline  train = pd.read_csv('F:/aayu/图像/data/multi-data.csv')print(train.head())train_image = []  for i in tqdm(range(train.shape[0])):  img = image.load_img('F:/aayu/图像/data/Images/'+train['ID'][i]+'.jpg',target_size=(400,400,3))  img = image.img_to_array(img)  img = img/255  train_image.append(img)  X = np.array(train_image)  y = np.array(train.drop(['ID', 'Genre','News','Reality-TV','Italian','Polish','Adult','Talk-Show','Spanish','Russian','Cantonese','R','PG','German','English','Japanese','Filipino','French','G','Game-Show','Hungarian'],axis=1)) X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42, test_size=0.1)  #model
model = Sequential()  
model.add(Conv2D(filters=16, kernel_size=(5, 5), activation="relu", input_shape=(400,400,3)))  
model.add(MaxPooling2D(pool_size=(2, 2)))  
model.add(Dropout(0.25))  
model.add(Conv2D(filters=32, kernel_size=(5, 5), activation='relu'))  
model.add(MaxPooling2D(pool_size=(2, 2)))  
model.add(Dropout(0.25))  
model.add(Conv2D(filters=64, kernel_size=(5, 5), activation="relu"))  
model.add(MaxPooling2D(pool_size=(2, 2)))  
model.add(Dropout(0.25))  
model.add(Conv2D(filters=64, kernel_size=(5, 5), activation='relu'))  
model.add(MaxPooling2D(pool_size=(2, 2)))  
model.add(Dropout(0.25))  
model.add(Flatten())  
model.add(Dense(128, activation='relu'))  
model.add(Dropout(0.5))  
model.add(Dense(64, activation='relu'))  
model.add(Dropout(0.5))  
model.add(Dense(22, activation='sigmoid'))  model.summary()  
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])  
model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test), batch_size=64)  #precise  
#加入新数据,进行测试
img = image.load_img('F:/aayu/图像/data/GOT.jpg',target_size=(400,400,3))  
img = image.img_to_array(img)  
img = img/255  classes = np.array(train.columns[:22])  
proba = model.predict(img.reshape(1,400,400,3))  
top_3 = np.argsort(proba[0])[:-4:-1]  
for i in range(3):  print("{}".format(classes[top_3[i]])+" ({:.3})".format(proba[0][top_3[i]]))  
plt.imshow(img)

总结:与minist数据集相比,该数据集的分类中存在一张图片多个类的情况,而minist数据集当中一张图片代表一个数字,也就是一个分类,所以图像分类和图像多分类在本质上的区别在于数据集,算法实现基本都是一样的。

(数据集正在处理中,github网址为:https://github.com/YUXUEPENG/ImageMulti-Classification.git)

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466817.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习C++,知识点太多记不住怎么办?

学习一门新的编程语言之前,你首先会做什么?先熟悉变量、运算符、函数、类和结构、测试等工具,随后按照指导按部就班进行操作?这样的流程对于学习其他语言如Python、Java来说或许行得通,但C的话,够呛。想要真…

C语言编程规范 clean code

目的规则并不是完美的,通过禁止在特定情况下有用的特性,可能会对代码实现造成影响。但是我们制定规则的目的“为了大多数程序员可以得到更多的好处”, 如果在团队运作中认为某个规则无法遵循,希望可以共同改进该规则。参考该规范之…

DataWhale组队-Pandas(下)缺失数据(打卡)

1.缺失值概要 数据的缺失主要包括记录的缺失和记录中某个字段信息的缺失,两者都会造成分析结果的不准确,以下从缺失值产生的原因及影响扥方面展开分析。 (1)缺失值产生的原因 1)有些信息暂时无法获取,或…

南橘北枳

春秋战国时期,智者晏子曾经说过一句话:“桔生淮南为橘,生于淮北为枳”,说的是淮南香甜的橘子移植到淮北就变成苦涩难吃的枳。因为事物的条件和环境等变了,所以才会这样。这句话现在大多是针对人品说的,大概…

用C语言字符画圆

用C语言画圆,这是一是算法的问题,我们知道,程序是由数据结构加算法组成的,研究这类东西,其实也是研究算法的问题,是比较有意思的。圆心为0的时候,圆的公式公式:那我们要如何写代码呢…

Linux C目标文件

LinuxC目标文件 宗旨:技术的学习是有限的,分享的精神是无限的。 一、目标文件格式(ELF格式) 编译器编译源代码后生成的文件叫做目标文件。目标文件是已经编译后的可执行文件,只是还没有经过链接的过程。 PC平台流行…

Win2003下Exchange2003部署图解之七

Exchange 2003 基本配置在邮件服务器SERVERVM下打开“第一个存储组”,(这里我们只看到一个缺省的存储组,在Exchange2003标准版中我们只能建立一个存储组,而企业版中我们可以建立4个存储组)选择“邮箱存储”&#xff0c…

嵌入式Linux操作UART实例

1引言串口是我们实际工作中经常使用的一个接口,比如我们在Linux下使用的debug串口,它用来登录Linux系统,输出log。另外我们也会使用串口和外部的一些模块通信,比如GPS模块、RS485等。这里对Linux下串口使用做个总结,希…

Datawhale组队-Pandas(下)文本数据(打卡)

一、string类型的性质 1.string和object的区别 string类型和object不同之处有三: 字符存取方法(string accessor methods,如str.count)会返回相应数据的Nullable类型,而object会随缺失值的存在而改变返回类型某些Se…

sql语句遇到的问题

分别统计所有男同学的平均分,所有女同学的平均分及总平均分 //SELECT AVG(score),name,(SELECT AVG(score) FROM student) as 总平均分 from student GROUP BY sex; 按照分数从小到大的顺序打印分数大于总平均分的学员信息(id-name-sex-score),并将分数大于总平均分…

新唐单片机代码评审总结

昨晚上,我们一个同事组织了一个小会议,大家一起讨论了一个项目的单片机代码,这个单片机用的是新唐单片机,期间大家也讨论了一些问题,总结一下,希望对写单片机的同学们有帮助。我这个同事写的代码非常优秀&a…

Datawhale组队-Pandas(下)分类数据(打卡)

Categoricals是pandas的一种数据类型,对应于统计学中的Categorical variables(分类变量),分类变量是有限且固定的可能值,例如:gender(性别)、血型、国籍等,与统计学的Cat…

【分享】一个集成tracert和ping的网络监测工具

最近接到一个需求,需求背景是这样的:目前Windows平台下本身都有tracert和ping的实现,而且可以直接在cmd下使用。 需求中有两个要求: 1. Windows平台中的tracert执行速度太慢,一次tracert可能要花十几分钟。所以&#x…

秀操作 | 函数宏的三种封装方式

作者:☆星轨★ 链接:https://blog.csdn.net/qq_35692077/article/details/1029949591. 函数宏介绍函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压…

Datawhale组队-Pandas(下)时序数据(打卡)

Pandas可以处理任何领域的时序数据(time series),使用Numpy的datetime64 和timedelta64 类型,Pandas整合了来自其他Python库的大量功能,如Scikits.TimeSeries,并为处理时间序列数据创建了大量新功能。 一、…

解析一个C语言俄罗斯方块游戏,包你看了就会

最近在看俄罗斯方块的游戏,看到一个大神写的俄罗斯方块代码,非常非常优秀,拿出来解析给大家看看,也希望大家自己尝试运行试试,从中能得到一些启发。#先了解下俄罗斯方块的几个形状一共分成 7 形状,有的形状…

认识星座、八大行星的观察

1. 北斗七星 北斗七星属于大熊座,春夏可见;2. 八大行星 太阳系的八大行星基本位于同一轨道面,如以地球轨道面为基准,相互间轨道倾角的差距甚至不到5度(不包括水星)。太阳系各大行星公转平面与地球黄道平面的…

Datawha组队——Pandas(下)综合练习(打卡)

import pandas as pd import numpy as np import missingno as msno import matplotlib.pyplot as plt plt.rcParams[font.sans-serif][SimHei] #用来正常显示中文标签 plt.rcParams[axes.unicode_minus]False #用来正常显示负号#读取数据 df pd.read_csv(端午粽子数据.csv) d…

测试内存对齐对运行速度的影响

我们知道内存对齐是为了方便CPU工作,但是对齐和不对齐差异有多大呢?我自己也没有实际测试过,今天就运行个代码测试看看。1、1字节对齐的时候#include "stdio.h"#pragma pack(1) struct test { char x1; short x2; float x3; …

Datawhale-零基础入门NLP-新闻文本分类Task01

参考: https://www.jianshu.com/p/56061b8f463a 统计自然语言处理 宗成庆(第二版) 文本自动分类简称文本分类(text categorization),是模式识别与自然语言处理密切结合的研究课题.传统的文本分类是基于文本内容的,研究如何将文本自动划分为…