2022年高校大数据挑战赛B题图像信息隐藏求解全过程论文及程序

2022年高校大数据挑战赛

B题 图像信息隐藏

原题再现:

  互联网的快速发展,给图像、视频的传播方式带来巨大变化。图像作为媒体的重要载体,每天有大量的原创图像公开在互联网上,如何保护图像版权的同时不破坏原始的图像一直是图像处理方向的研究热点。
在这里插入图片描述
  近年来,图像水印算法逐渐成为保护图像版权的重要手段。一般的图像水印算法分为嵌入算法和提取算法。图 1 展示了图像水印算法的基本架构。黄色部分代表嵌入算法,将具有可辨识的信息(Alice)融合到需要保护的图像(Image)中,得到嵌入信息的图像(Image’)。与此同时,嵌入算法不对保护图像造成大的影响。从人类视觉角度无法分辨Image与Image’之间的差别。蓝色部分为水印提取算法,其作用是在发生版权纠纷时能通过算法提取出嵌入的信息(Alice),从而确定图像的版权归属。
  附件 1 训练样本中包含 images_original和image_message两个文件夹,还有嵌入的信息列表保存在message.txt中。为了简化问题,每张image_message图片中只嵌入 26 + 26 + 10 = 62 个(az,AZ,0~9)字符中的一个字符。分别提供了9950 张图片和对应的标签信息,请你查阅相关文献,回答以下问题。
  问题 1:图像信息隐藏算法的图像质量评价指标很多,其中影响视觉效果的指标具有不可见性,可用来衡量嵌入水印的图像与原始图像之间的差异性。现请你根据附件 1 中的数据,使用多种图像质量评价指标说明原始图像与嵌入水印之后图像之间的差别,并使用合适的统计方法说明差别图像之间至少 3 种共同的特征。参考图 2 的方式展示,论文中仅需要展示“im100067. jpg” 和“im10234. jpg”两张图像的差别图像。
在这里插入图片描述
  问题 2: 运用提供的 9950 张图片和对应的标签信息,尽量使用问题 1 中的共同特征来设计图像信息隐藏的检测算法,检测任意一张嵌入信息图片中存在的信息,并对你的算法进行校验。检验量化指标为 :9950 张图像中被正确检测信息的图像数量。
  问题 3:使用检测算法对“附件 2”文件夹下 test_images 中包含的 50张图片(包含嵌入和没有嵌入信息的图像 ) ,请先判断是否嵌入信息( 信息为a-z,A-Z,0-9 中的某一个字母或数字)。如果嵌入了信息请检测出对应信息,并将检测结果填写到表 1 中。

在这里插入图片描述
在这里插入图片描述
  注:表 1 中的“嵌入的信息”列为需要填写的检测结果,其中有信息嵌入的直接填写对应的字符,没有信息嵌入的填写“无”。
说明:
  1. 项目程序建议在 python3.6 及以上环境下搭建,其他语言不做统一要求,但是需要在运行说明中写明软件名称及版本。无需提交赛题自带的图像。
  2. 除了论文外,还需要提供完整程序代码、运行说明(包括依赖包及其版本)、模型文件(若有)等,以压缩包的形式提交。提交的支撑材料不得超过 20Mb。
  3.本研究可以用机器学习方法,包括各种深度学习方法,如CNN、DNN算法、VGG、U-Net等。

整体求解过程概述(摘要)

  随着互联网的快速发展,图像作为重要信息载体其传播范围也越来越广。水印算法作为一种图像信息隐藏技术,能够实现在用户视觉无法分辨的情况下添加版权信息,有效保证了图像的版权安全和图像质量。本文在附件一所提供的 9950 组带有包含 60 种类别水印字符标签的原始图像和嵌入水印图像的数据集上,利用差值图像作为主观可视化评价指标,分析得出嵌入水印的图像想比原图增加了部分前景边缘信息。利用 MSE、RMSE、PSNR、SSIM、信息熵等客观非可视化评价指标分析了嵌入水印图像与原始图像之间的区别,即嵌入水印的图像的信噪比和结构一致性有所降低。对于差别图像进行统计分析得出其包含一定量的纹理特征,灰度分布服从正态分布,并且利用 HOG、ORB、LBP 等多种特征描述符表示了差值图像的共同特征,其中 HOG 特征点数量范围为[154,218],ORB 特征点数量范围在[34,96],LBP 特征点数量范围在[206,462]。为了实现水印类别检测算法,本文将问题一中统计的差值图像以及其 HOG、ORB、LBP特征指标相结合作为训练输入。构建了基于支持向量机(SVM)、随机森林(RF)和深度卷积神经网络 CNN(ResNet50)的分类模型并进行对比,结果表明随机森林模型准确率均值较低为 79.2965%,并且 ResNet50 模型存在不稳定问题,因此最终选择 SVM模型作为图像水印隐藏信息检测模型,在 9950 张图像中被正确检测信息的图像数量为9848 张,即准确率达到 98.9749%。
  针对附件二中的 50 张不明确是否嵌入水印的图像,传统的基于 DCT、SVD 原理的算法针对性较强,不适应数据集中的隐式水印掩膜映射处理的图像数据。因此本文根据CVAE 变分自动编码器重构模型和 CUT 风格迁移网络原理构建了基于深度学习的水印去除模型。假设 50 张图像全部嵌入了水印信息,将模型输入设定为 50 张待判定图像,输出为模拟水印去除后的结果图。随后利用输入和输出的差值图像指标判定输入的图像是否嵌入了水印信息,并对嵌入水印的图像利用问题二构建的 SVM 分类模型进行类别预测,同时输出对应的置信度。最终分类结论为:对于附件二中的 50 张图像,其中未嵌入信息的图像数量为 7,嵌入信息的图像总数为 43,嵌入 a~z 的图像数量为 21,嵌入A-Z 的图像数量为 17,嵌入 0-9 的图像数量为 5。
  最后,本文对所构建的基于 SVM 和差值图像描述符的分类模型和基于 CVAE 的模拟水印去除网络模型进行了评价与推广,提出了模型的改进方向。在模型功能完善的情况下,能够利用本文的方案实现基于水印嵌入和水印提取的图像信息隐藏技术,具有良好的应用前景和实际价值。

模型假设:

  根据题目所给的信息以及相关要求,做出如下假设:
  1. 假设训练标签与训练集图像数据一一对应;
  2. 假设嵌入水印的过程中图像的原始信息保存完好;
  3. 假设图像数据集中不包含标签中未出现的字符;
  4. 假设水印的添加方式为隐式字符映射 One-Hot 向量编码掩膜模型;
  5. 假设机器学习和深度学习方式能够感知和捕获到图像的隐藏信息;
  6. 假设重采样的样本均衡方式可以解决分类标签数量差别对分类结果的影响;

问题分析:

  问题一分析
  通过附件 1 中的数据,绘制出原始图像与嵌入信息图像的差别图像,选取合适的图像评价指标进行差异性分析(每种图像均为 9950 张),同时利用合适的统计方法说明两种图像之间的三个共同特征。
  步骤一:使用 OpenCV 库函数获得差别图像,并获取相关的图像质量评价指标。
  步骤二:选择合适的图像质量评价指标进行差异性分析,并且记录下来。
  步骤三:采取统计学方法获取差别图像间的共同特征,得出结果。
  问题二分析
  该问题需要根据提供的 9950 张图片获取的图像质量评价指标,也就是其对应的标签信息。然后根据其共同特征来选择合适的模型,获取已经隐藏信息的图像以及将图像进行筛选分类,得到隐藏了信息的图像数量及隐藏信息。根据题意应应选择两类模型进行求解,分别用来分辨图片、统计数量获取隐藏信息。
  步骤一:先利用题意求解的共同特征构建合适的模型,将附件一中的 image_message和差别图像根据嵌入信息的种类进行分类,获得分类后的数据集。
  步骤二:然后构建适当的检测与分类模型,调整好参数进行训练,获得最佳模型,再利用模型进行嵌入信息的检测与分析,获得隐藏的信息。
  步骤三:利用合适的统计方法对隐藏的信息及其数量进行记录。
  问题三分析
  根据题意可知,需要调用问题二中构建的模型,首先调用识别图像的模型,将测试集输入该模型中,判断否为隐藏信息的图像,判断成功后再将通过测试的数据集调用分类的模型进行分类并获取隐藏信息,并对测试结果进行分析。

模型的建立与求解整体论文缩略图

在这里插入图片描述
在这里插入图片描述

全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

程序代码:

部分程序如下:
import cv2
import pandas as pd
import matplotlib.pyplot as plt
import math
#%matplotlib inline
from skimage.metrics import mean_squared_error as compare_mse
from skimage.metrics import peak_signal_noise_ratio as compare_psnr
from skimage.metrics import structural_similarity as compare_ssim
data = pd.DataFrame(columns=['PSNR','SSIM','RMSE']) # ['PSNR','SSIM','MSE','RMSE']
data.to_csv('A.xlsx', index=False, encoding='utf-8')
#for i in range(1,9951,1):
for i in range(1,9951,1):
input1 = 'data/image_original/im1%04d.jpg'%i
input2 = 'data/image_message/im1%04d.jpg'%i
img1 = cv2.imread(input1)
img2 = cv2.imread(input2)
p_ = compare_psnr(img1, img2)
s_ = compare_ssim(img1, img2, channel_axis=2)
m_ = compare_mse(img1, img2)
rm_ = math.sqrt(m_)
p = pd.Series(p_)
s = pd.Series(s_)
m = pd.Series(m_)
#rm = pd.Series(rm_)
a = [[p_,s_,rm_]]
#a = [[p_,s_,m_,rm_]]
data_temp = pd.DataFrame(a)#横着拼
data_temp.columns = ['PSNR','SSIM','RMSE']
# ['PSNR','SSIM','MSE','RMSE']
data = pd.DataFrame(columns=['PSNR','SSIM','RMSE'])
#清空数据,表头 # ['PSNR','SSIM','MSE','RMSE']
data = pd.concat([data,data_temp],axis=0,ignore_index=0)#竖着拼
#print(data)
data.to_csv('A.xlsx', mode='a', index=False, encoding='utf-8',header=0)
import numpy as np
import cv2
import matplotlib.pyplot as plt
# %matplotlib inline
def grey_scale(img_gray ):
#归一化函数
rows, cols = img_gray.shape
flat_gray = img_gray.reshape((cols * rows,)).tolist()
A = min(flat_gray)
B = max(flat_gray)
print('A = %d,B = %d' % (A, B))
output = np.uint8(255 / (B - A) * (img_gray - A) + 0.5)
return output
origin = cv2.imread('data/image_original/im10067.jpg')
with_message = cv2.imread('data/image_message/im10067.jpg')
origin = cv2.cvtColor(origin, cv2.COLOR_BGR2RGB)
with_message = cv2.cvtColor(with_message, cv2.COLOR_BGR2RGB)
origin_gray = cv2.imread('data/image_original/im10067.jpg',0).astype(np.int32)
with_message_gray = cv2.imread('data/image_message/im10067.jpg',0).astype(np.int32)
difference_gray = with_message_gray - origin_gray
difference_gray = grey_scale(difference_gray)
fig,a = plt.subplots(1,3,figsize=(16,12),dpi=250)
#绘制平方函数
a[0].imshow(origin)
a[0].set_xticks([]) # 去掉 x 轴
a[0].set_yticks([]) # 去掉 y 轴
a[0].set_xlabel('original image',fontsize=18)
#绘制平方根图像
a[1].imshow(with_message)
a[1].set_xticks([]) # 去掉 x 轴
a[1].set_yticks([]) # 去掉 y 轴
a[1].set_xlabel('message image',fontsize=18)
#绘制指数函数
#a[2].imshow(difference_gray)
a[2].imshow(difference_gray,cmap='gray')
a[2].set_xticks([]) # 去掉 x 轴
a[2].set_yticks([]) # 去掉 y 轴
a[2].set_xlabel('residual',fontsize=18)
plt.show()
import numpy as np
from sklearn import svm
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import accuracy_score
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
import scipy.io as sio
import matplotlib.pyplot as plt
import os
import re
import pandas as pd
import joblib
os.environ['KMP_DUPLICATE_LIB_OK'] = 'True' import glob
import cv2
import numpy as np
from PIL import Image
# 读取文件夹中图片
Image_dir = './data/image_residual/' # 添加绝对路径
Image_glob = os.path.join(Image_dir, "*.jpg")
Image_name_list = []
# 将符合条件的 png 文件路径读取到 Image_list 中去
Image_name_list.extend(glob.glob(Image_glob))
print(Image_name_list[::])
len_Image_name_list = len(Image_name_list)
image=[]
for i in range(len_Image_name_list):
image_path = Image_name_list[i]
image.append(cv2.imread(image_path,0).reshape(-1, 1))
image = np.array(image)
image = image.squeeze()
print(image)
data = pd.read_table('./data/message.txt', sep = '\t', header = None, names = ['file label'])
label=[]
for i in range(len(data)):
label.append(data.loc[i][0][-3])
train_data, test_data, trian_label, test_label = train_test_split(image, label,test_size=0.3)
#测试数据乱序重构
state1 = np.random.get_state() #获取生成器内部状态元组 保存状态,记录下数组被打乱
的操作(数组如何被打乱的)
np.random.shuffle(train_data) #乱序重构
np.random.set_state(state1) #相同的打乱方式 对标签进行同样操作
np.random.shuffle(trian_label) #乱序重构
#训练数据乱序重构
state2 = np.random.get_state()
np.random.shuffle(test_data)
np.random.set_state(state2)
np.random.shuffle(test_label)
clf = svm.SVC(decision_function_shape='ovo') #构造多分类 SVM
clf.fit(train_data,trian_label) #训练
joblib.dump(clf, "svm_model.m")
predict_res = clf.predict(image) #预测
print(predict_res)
data_cnt=[]
for i in range(predict_res.shape[0]):
data_cnt.append(i)
print('SVM accuracy')
print(accuracy_score(predict_res,label))
clf2 = RandomForestClassifier()
clf2.fit(train_data,trian_label)
joblib.dump(clf2, "rf_model.m")
res2 = clf2.predict(image)
print('Rondom_Forest')
print(accuracy_score(res2,label))
predict_res_pd=pd.DataFrame(data=predict_res)
res2_pd=pd.DataFrame(data=res2)
test_label_pd=pd.DataFrame(data=label)
print(predict_res)
print(type(predict_res))
print(predict_res_pd)
print(type(predict_res_pd))
predict_res_pd.to_csv('predict_res_pd.csv',encoding='gbk')
res2_pd.to_csv('res2_pd.csv',encoding='gbk')
test_label_pd.to_csv('test_label_pd.csv',encoding='gbk')
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

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

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

相关文章

代码随想录刷题题Day3

刷题的第三天,希望自己能够不断坚持下去,迎来蜕变。😀😀😀 刷题语言:C / Python Day3 任务 ● 链表理论基础 ● 203.移除链表元素 ● 707.设计链表 ● 206.反转链表 1 链表理论基础 链表:通过…

卷积神经网络(VGG-16)猫狗识别

文章目录 一、前言二、前期工作1. 设置GPU(如果使用的是CPU可以忽略这步)2. 导入数据3. 查看数据 二、数据预处理1. 加载数据2. 再次检查数据3. 配置数据集4. 可视化数据 三、构建VG-16网络四、编译五、训练模型六、模型评估七、保存and加载模型八、预测…

笔记----单纯剖分----1

笔记----单纯剖分 定义 线性组合仿射组合: 线性组合的系数为1凸组合: 仿射组合所有的系数都是正数 凸集 R^m 的 任意有限个点的凸组合仍在其中的子集仿射子空间 R^m 的 任意有限个点的仿射组合仍在其中的子集凸包 conv(A) A是R^m的一个子集 A的所有有限凸…

Rust语言项目实战(二) - 准备键盘和终端屏幕

上一章节中,我们实现了游戏开始音频的播放,本章我们开始编写游戏界面。我们的游戏是在命令行终端中运行的,因此编写的界面也是终端中展示的界面,上一章中,我们已经把相关的依赖包crossterm添加到了依赖列表中。本章首先…

Valentina Studio Pro:引领数据库管理软件新潮流

你是否正在寻找一款强大且易用的数据库管理软件?Valentina Studio Pro可能就是你的不二之选。这款软件是由Valentina Team开发的一款综合性数据库管理和编辑工具,它支持多种数据库系统,包括MySQL、PostgreSQL、SQLite等。 Valentina Studio …

java调用mysql存储过程

一、背景 在mysql上定义了存储过程,然后我想每1分钟调用一次存储过程。于是我设置了一个event,但是这个事件默认的运行周期为天,我尝试修改成minute却不生效。所以我决定通过java代码来调用存储过程。 二、mysql存储过程 CREATE DEFINERroot…

cpu版本的torch可以用清华镜像源安装

一、来到pytroch官网找到如下代码 官方提供的默认的安装cpu版本的torch的命令 pip3 install torch torchvision torchaudio二、使用清华镜像安装 pip3 install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple

自然语言处理 (NLP) 中的组合语义分析

埃弗顿戈梅德(Everton Gomede) 一、介绍 自然语言处理 (NLP) 中的组合语义分析是一个引人入胜且复杂的话题。为了充分理解它,将这个概念分解成它的基本组成部分是至关重要的:组合语义及其在NLP中的应用。组…

零售数字化“逆熵”的6项原则和8种能力建设|ShopeX徐礼昭

作者:徐礼昭 来源:《三体零售逆熵法则》节选 旧的规则与秩序被打破,无序成为常态 新时代洪流裹挟冲击着传统零售 无序带来的“熵增”侵蚀企业生命 所有人都在不确定性中寻找确定 数字化如何助力企业铸就「反熵增」神器? 如何…

uniapp设置手机通知权限以及uniapp-push2.0推送

unipush2.0代码 export default function () {// 调用获取用户通知权限setPermissions()// 获取客户端唯一的推送标识,可用于测试uni.getPushClientId({success: (res) > {console.log(res.cid)},fail(err) {console.log(err)}})// 监听推送uni.onPushMessage(r…

设计模式之美学习笔记-单例模式-为什么说支持懒加载的双重检测不比饿汉式更优?

单例设计模式:一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。 实战案例一:处理资源访问冲突 我们先来看第一个例子。在这个例子…

第十节HarmonyOS 常用基础组件-Image

一、组件介绍 组件(Component)是界面搭建与显示的最小单位,HarmonyOS ArkUI声名式为开发者提供了丰富多样的UI组件,我们可以使用这些组件轻松的编写出更加丰富、漂亮的界面。 组件根据功能可以分为以下五大类:基础组件…

xss漏洞后端进行html消毒

import org.jsoup.Jsoup;public static String sanitizeHtml(String input) {// 使用 Jsoup 消毒 HTMLreturn Jsoup.clean(input, Safelist.relaxed());}public static void main(String[] args) {String userInput "<p><script>alert(1)</script>Safe…

海外IP罗拉rola正版去哪里找?

免费海外IP代理能用吗&#xff1f;和收费的有哪些差异&#xff1f; 如今在这个大数据时代&#xff0c;无论你从事哪个行业&#xff0c;都离不开数据&#xff0c;尤其是做跨境电商的&#xff0c;更一步都离不开海外IP代理&#xff0c;无论是网站引擎优化还是营销推广、数据抓取…

LeetCode105.从前序和中序遍历序列构造二叉树

这道题看完题想了几分钟就想到大概的思路了&#xff0c;但是在写的时候有很多细节没注意出了很多问题&#xff0c;然后写了1个多小时&#xff0c;其实这道题挺简单的。 首先&#xff0c;最基本的知识&#xff0c;先序遍历是根左右&#xff0c;中序遍历是左根右&#xff0c;那么…

集简云语聚AI新增模型测试,支持多模型同时进行交互,快速评估不同模型性能

语聚AI模型测试 在ChatGPT爆火的推动下&#xff0c;由生成式 AI 掀起的全球人工智能新浪潮就此拉开了序幕&#xff0c;人工智能也成为越来越多企业提升业务效率、优化业务流程的首选方案。 然而&#xff0c;面对层出不穷的AI模型&#xff0c;每个模型在完善度、功能性、易用性…

uni-app 微信小程序 电子签名及签名图片翻转显示功能

文章目录 1. 需求背景2. 开始撸2.1 点击 重写 进入签名页面&#xff08;上图一&#xff09;2.2 书写签名&#xff0c;点击确认返回&#xff0c;及图片翻转显示&#xff08;上图二&#xff0c;三&#xff09; 3. 图片进行翻转&#xff0c;返回翻转后的图片 1. 需求背景 接的一个…

Hdoop学习笔记(HDP)-Part.6 安装OracleJDK

六、安装OracleJDK 下载jdk安装文件&#xff0c;放到/opt中&#xff0c;将文件解压到/usr/local下后&#xff0c;修改/etc/profile文件中环境参数&#xff0c;实现java的安装。 创建jdk.yml文件 ---- hosts: alltasks:- name: copy and unzip jdkunarchive:src: "/opt/j…

C++学习之路(十五)C++ 用Qt5实现一个工具箱(增加16进制颜色码转换和屏幕颜色提取功能)- 示例代码拆分讲解

上篇文章&#xff0c;我们用 Qt5 实现了在小工具箱中添加了《Base64图片编码预览功能》功能。为了继续丰富我们的工具箱&#xff0c;今天我们就再增加两个平时经常用到的功能吧&#xff0c;就是「 16进制颜色码转RGB文本 」和 「屏幕颜色提取」功能。下面我们就来看看如何来规划…

深入解析SpringBoot的请求响应机制

SpringBootWeb请求响应 前言1. 请求1.1 Postman介绍 1.2 简单参数1.2.1 原始方式1.2.2 SpringBoot方式1.2.3 参数名不一致 1.3 实体参数1.3.1 简单实体对象1.3.2 复杂实体对象 1.4 数组集合参数1.4.1 数组1.4.2 集合 1.5 日期参数1.6 JSON参数1.7 路径参数 2. 响应2.1 Response…