电影海报的多标签分类

本文介绍了一种使用卷积神经网络(CNN)进行电影海报多标签分类的方法。通过Kaggle获取数据,处理图像,应用vgg16模型并调整网络结构进行前向传播和损失计算。在训练过程中,利用dropout减少过拟合,并提供了数据处理、模型定义及预测函数的实现。后续优化方向包括调整网络结构、减少标签数量以及使用PCA和SVM等。
摘要由CSDN通过智能技术生成

**

电影海报的多标签分类

**
本文代码参考
https://www.kaggle.com/koushikk/multilabel-classification-using-cnn
https://www.depends-on-the-definition.com/classifying-genres-of-movies-by-looking-at-the-poster-a-neural-approach/
https://blog.csdn.net/qq_34792438/article/details/97140512
本文源代码:https://github.com/gj2528/Classify-Poster

数据来源

Kaggle上获得(IMDB有关于每部电影的详细信息):
原始kaggle海报数据集:
https://www.kaggle.com/neha1703/movie-genre-from-its-poster?tdsourcetag=s_pctim_aiomsg
(海报个数997个)
海报大数据集:
https://www.kaggle.com/neha1703/movie-genre-from-its-poster/discussion/35485
(海报个数39515个)
海报类型29

海报类型个数

海报个数为997个的海报类型个数:
在这里插入图片描述
海报个数为39515个的海报类型个数:
在这里插入图片描述

一些全局变量

#全局变量,可以根据自己需要改
BATCH_SIZE = 128
SIZE = (150, 101)
n = 900          #以小数据量为例
n_test = 90      #以小数据量为例

数据处理

得到数据:

path = 'posters'
data = pd.read_csv("MovieGenre.csv", encoding="ISO-8859-1")
print(data.head())

#Next, we load the movie posters.
image_glob = glob.glob(path + "/" + "*.jpg")
print(image_glob)
img_dict = {
   }

将得到的图片路径写入tet文件:

txtName = "dataset/SampleMoviePoster.txt"
f = open(txtName, "w")
for image_single in image_glob:
    result = image_single +'\n'
    f.write(result)
f.close()
print("writefileDONE")

得到图片id:

def get_id(filename):
    index_s = filename.rfind("\\") + 1
    index_f = filename.rfind(".jpg")
    return filename[index_s:index_f]

得到图片列表:

for fn in image_glob:
    try:
        img_dict[get_id(fn)] = scipy.misc.imread(fn)
    except:
        pass

显示图片:

def show_img(id):
    title = data[data["imdbId"] == int(id)]["Title"].values[0]
    genre = data[data["imdbId"] == int(id)]["Genre"].values[0]
    plt.imshow(img_dict[id])
    plt.title("{} \n {}".format(title, genre))
    plt.show()
#show_img('3772')

一个简洁的小预处理函数来缩放图像:

#一个简洁的小预处理函数来缩放图像......
def preprocess(img, size=(150, 101)):
    img = scipy.misc.imresize(img, size)
    img = img.astype(np.float32)
    img = (img / 127.5) - 1.
    return img

准备数据:

def prepare_data(data, img_dict, size=(150, 101)):
    print("Generation dataset...")
    dataset = []
    y = []
    ids = []
    label_dict = {
   "word2idx": {
   }, "idx2word": []}
    idx = 0
    genre_per_movie = data["Genre"].apply(lambda x: str(x).split("|"))
    for l in [g for d in genre_per_movie for g in d]:
        #print("l",l)
        if l in label_dict["idx2word"]:
            pass
        else:
            label_dict["idx2word"].append(l)
            label_dict["word2idx"][l] = idx
            idx += 1
    n_classes = len(label_dict["idx2word"])
    print("identified {} classes".format(n_classes))
    n_samples = len(img_dict)
    print("got {} samples".format(n_samples))
    for k in img_dict:
        try:
            g = data[data["imdbId"] == int(k)]["Genre"]
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值