from keras.models import Sequential
from keras.layers import Dense, Flatten
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Input
from keras.layers import LSTM # 循环神经网络
from keras.layers import Embedding # 将一维整数转换成稠密向量,使得对单词的描述更详细
from keras.layers import Dropout # 每次随机选取一些节点训练
from keras.layers.merge import add # 融合图像特征和对图像的文字描述
from keras.models import model_from_json
from keras.preprocessing.sequence import pad_sequences # 序列预处理
from keras.utils import to_categorical # 类别向量转换为二进制(只有0和1)的矩阵类型表示,变成独热编码
from PIL import Image as pil_image
from keras import backend as K # 用来生成自己的.json文件
import numpy as np
from numpy import array
from pickle import dump
from os import listdir
from keras.models import Model
import keras
import pickle
from pickle import load
from nltk.translate.bleu_score import corpus_bleu
from keras.models import load_model
# Tokenizer是keras的语料库,CNN使用它可以将整数对应到单词
from keras.preprocessing.text import Tokenizer
# corpus_bleu 用来比较一组句子和另一组句子的差异
from nltk.translate.bleu_score import corpus_bleu
# 一、图像特征提取===============================================
# 搭建网络
def generate_vgg16():
"""
搭建一个vgg网络结构: (牛津大学)用于图像分类
:return: vgg16网络
"""
# 输入图像的大小
input_shape = (224, 224, 3)
# 搭建串型网络:Conv2D(神经元个数,每个神经元大小,输入尺寸,卷积层的输入和输出大小一样,激活函数)
model = Sequential([
Conv2D(64, (3, 3), input_shape=input_shape, padding='same', activation='relu'),
Conv2D(64, (3, 3), padding='same', activation='relu'),
# 尺寸,步长
MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
Conv2D(128, (3, 3), padding='same', activation='relu'),
Conv2D(128, (3, 3), padding='same', activation='relu'),
MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
Conv2D(256, (3, 3), padding='same', activation='relu'),
Conv2D(256, (3, 3), padding='same', activation='relu'),
Conv2D(256, (3, 3), padding='same', activation='relu'),
MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
Conv2D(512, (3, 3), padding='same', activation='relu'),
Conv2D(512, (3, 3), padding='same', activation='relu'),
Conv2D(512, (3, 3), padding='same', activation='relu'),
MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
Conv2D(512, (3, 3), padding='same', activation='relu'),
Conv2D(512, (3, 3), padding='same', activation='relu'),
Conv2D(512, (3, 3), padding='same', activation='relu'),
MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
# 将多维卷积层 转化 一维向量的全连接层
Flatten(),
Dense(4096, activation='relu'),
Dense(4096, activation='relu'),
# Dense(1000, activation='softmax'),
])
return model
# 加载网络模型,加载训练好的网络权值
def load_vgg16_model():
# 读取vgg网络模型的文件
json_file = open("vgg16.json", "r")
loaded_model_json = json_file.read()
json_file.close()
# 创建VGG网络对象
model = model_from_json(loaded_model_json)
# 读取训练好的VGG权值
model.load_weights("vgg_.h5")
return model
# (第一次预处理)加载图像,转化为可以输入网络的张量
def load_img_as_np_array(path, target_size):
"""
从给定的文件加载图像,转换图像大小为给定target_size,返回32位浮点数numpy数组。
:param path:图像文件的路径
:param target_size:元组(图像高,宽)
:return:
"""
img = pil_image.open(path)
if img.mode != 'RGB':
img = img.convert('RGB')
width_height_tuple = (target_size[1], target_size[0])
if img.size != width_height_tuple:
img = img.resize(width_height_tuple, pil_image.NEAREST)
X = np.asarray(img, dtype = K.floatx())
return X
# (第二次预处理)归一化(把数据约束到 0~1 或者 -1~1)
def preprocess_input(x):
"""
预处理图像用于网络输入,将图像由RGB转换为BGR。
将图像的每一个图象通道减去其均值。 消除公共部分,增强个体差异
BGR三个通道的均值分别为 103.939,116.779,123.68
:param x: 数组 4维
:return:
"""
x = x[..., ::-1]
mean = [103.939, 116.779, 123.68] # 用for循环遍历数据集,求均值
x[..., 0] -= mean[0]
x[..., 1] -= mean[1]
x[..., 2] -= mean[2]
return x
# 抽取特征
def extract_features(directory):
"""
提取给定文件夹中所有图像的特征,将提取的特征保存在文件features.pkl中,
提取的特征保存在一个dict中,key为文件名(不带。jpg后缀),value为特征值[np.array]
:param directory: 包含jpg文件的文件夹
:return:
"""
# 加载模型
model = load_vgg16_model()
# 去掉最后一层
model.layers.pop()
model = Model(inputs = model.inputs, outputs = model.layers[-1].output)
# 打印模型
print(model.summary()) # 打印出来可以看到网络结构
# 存储特征
features = dict()
for index, fn in enumerate(listdir(directory)):
# 从文件读取图像为numpy数组
fn = directory + '/' + fn
arr = load_img_as_np_array(fn, target_size=(224, 224))
# 把原来3维的数组变为4维,增加一个维度作为批数(网络一次处理多少张图片)
arr =arr.reshape((1, arr.shape[0], arr.shape[1], arr.shape[2]))
# 预处理图像作为VGG的输入
arr = preprocess_input(arr)
# 计算特征(predict函数来计算输入图像的特征)
feature = model.predict(arr, verbose=0)
# 获取图像ID
img_id = fn.split('.')[0].split("/")[-1]
# 存储图像特征
features[img_id] = feature
print('>%s/%s' % (index, feature.size))
print('>%s' % fn)
file = open("features.pkl", 'wb')
# 存储特征
pickle.dump(features, file)
file.close()
# 二、将图像文字描述转换为数字描述===============================================
# 生成图像描述,并将文字描述转换成数字
def create_input_data(tokenizer, max_len, descriptions, photos_features, vocab_size):
"""
从输入的图片标题list和图片特征构造LSTM的一组输入
:param max_len: 训练数据集中最长的标题长度
:param descriptions: dict,key 为图像的名(不带.jpg后缀),value为list,包含一个图像的几个不同描述
:param photo_features: value为numpy array 图像特征(有4096位特征)
:param vocab_size: 训练集中标的单词数量
:return:元组:
第一个元素为 numpy array:代表图像的特征
第二个元素为 numpy array:图片的标题的前缀
第三个元素为 numpy array:图像标题的下一个单词(根据图像特征和标题前缀产生)也为numpy array
"""
X1, X2, y = list(), list(), list()
# 从图像描述中读出 key和value(读每一幅图像的描述)
for key, desc_list in descriptions.itrms():
# (读每一幅图像的不同描述( "a cat is running" 依次读 a,cat,is,run))
for desc in desc_list:
# 把输入的文字描述转换成数字(“a cat is running” = 1 3 13 53)
seq = tokenizer.texts_to_squences([desc])[0]
for i in range(1, len(s
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
简洁:1.数据集采用flickr8k(图像,对应的文本描述),使用keras创建VGG16定义的CNN网络。利用VGG16(去掉最后一层)提取图像特征,将flickr8k的图像文件转为图像特征,保存为pickle文件。 2.写不下了,自己看吧,代码有注释 涉及技术:Pycharm + Keras + Python 3.6 + numpy + opencv3.3.1等 该项目是对Jason Brownlee的文章《How to Automatically Generate Textual Descriptions for Photographs with Deep Learning》的代码复现。
资源推荐
资源详情
资源评论
收起资源包目录
02_看图说话.zip (8个子文件)
task02.py 8KB
.idea
misc.xml 200B
workspace.xml 3KB
02_看图说话.iml 336B
inspectionProfiles
profiles_settings.xml 174B
modules.xml 289B
.gitignore 50B
task01.py 17KB
共 8 条
- 1
资源评论
段狗
- 粉丝: 1
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 手套手势检测7-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- CentOS bridge 工具包 bridge-utils-1.6-1.33.x86-64.rpm
- 手势检测7-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- 基于python flask实现某瓣数据可视化数据分析平台
- awewq1132323
- 手写流程图检测31-YOLO(v5至v8)、COCO、CreateML、Darknet、Paligemma、TFRecord数据集合集.rar
- frida拦截微信小程序云托管API
- 肝脏及其肿瘤分割的 CT 数据集,已经切片成jpg数据,约2w张数据和mask
- 基于Java的网上教务评教管理系统的设计与实现.doc
- 2024圣诞节海外消费市场趋势及营销策略分析报告
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功