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

news2024/10/7 12:18:26

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.coloradmin.cn/o/1276553.html

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

相关文章

反转链表的实现

题目描述: 给出一个链表的头节点,将其反转,并返回新的头节点 思路1:反转地址 将每个节点里的地址由指向下一个节点变为指向前一个节点 定义三个结构体指针n1,n2,n3,n1表示改后指针的地址,n2表示要修改结构体里next的…

手机上的记事本怎么打开?安卓手机通用的记事本APP

有不少上班族发现,自己想要在电脑上随手记录一些工作文字内容,直接使用电脑上的记事本工具来编辑文字是比较便捷的。但是如果想要在手机上记录文字内容,就找不到手机上的记事本了。那么手机上的记事本怎么打开?安卓手机通用的记事…

AWS Remote Control ( Wi-Fi ) on i.MX RT1060 EVK - 1 “建立开发环境”

这个系列的文章将叙述如何借由 NXP 的“evkmimxrt1060_aws_remote_control_wifi_nxp”这支 Sample Code,达到 NXP RT1060EVK 经由 U-Blox EVK-JODY-W263 将资讯传到 AWS 上,并可借由手机对 RT1060 EVK 的 LED 进行远端控制。 整体架构如下图所示&#x…

VUE语法-(readonly的用法)将数据设置成只读模式

1、功能概述 在Vue中定义一个变量,这个变量的值不允许被修改,核心是通过readonly设置成只读。 如果不会使用ref和reactive响应式数据参考如下博客: https://blog.csdn.net/tangshiyilang/article/details/134701103 2、具体实现 如下案例…

41 - 如何使用缓存优化系统性能?

缓存是我们提高系统性能的一项必不可少的技术,无论是前端、还是后端,都应用到了缓存技术。前端使用缓存,可以降低多次请求服务的压力;后端使用缓存,可以降低数据库操作的压力,提升读取数据的性能。 今天我…

LeetCode | 965. 单值二叉树

LeetCode | 965. 单值二叉树 OJ链接 首先判断树为不为空,为空直接true然后判断左子树的val,和根的val相不相同再判断右子树的val,和根的val相不相同最后递归左子树和右子树 bool isUnivalTree(struct TreeNode* root) {if(root NULL)retur…

windows下如何搭建属于自己的git服务器?

windows下如何搭建属于自己的git服务器? 工具准备(此章节为网上摘要,忘记出自哪里了,大家自行参考)实操步骤 工具准备(此章节为网上摘要,忘记出自哪里了,大家自行参考) …

c语言详解牛顿迭代法以及求解倒数和平方根

Newtons iteration method 是在实数域和复数域利用切线不断逼近方程根的一种求高次曲线方程的方法,区别于梯度下降法,它是二阶导,收敛速度比较快,对于非凸函数,牛顿法容易受到鞍点或者最大值点的吸引。由于牛顿迭代法是…

[英语学习][3][Word Power Made Easy]的精读与翻译优化

[序言] 这次翻译校验, 难度有点大, 原版中英翻译已出现了严重地偏差. 昨晚11点开始阅读如下段落, 花费了1个小时也没有理解原作者的核心表达, 索性睡觉了. 今早学习完朗文单词之后, 9点半开始继续揣摩. 竟然弄到了中午11点30, 终于明白原作者要表达的意思了. 废话不多说&#x…

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

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

【小布_ORACLE笔记】Part11-6 RMAN Backups

【小布_ORACLE笔记】Part11-6 RMAN Backups 1.track文件的作用 当做差异性备份时,server process对应的RMAN客户端的server process就不用去每个块每个块的检查,只要到trackfile 里面去读一下,看哪个块改变了就直接把哪个块备份下来&#x…

轻量封装WebGPU渲染系统示例<40>- 多层材质的Mask混合(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/MaskTextureEffect.ts 当前示例运行效果: 两层材质效果: 三层材质效果: 此示例基于此渲染系统实现,当前示例TypeScript源码如下: export c…

【Go】protobuf介绍及安装

目录 一、Protobuf介绍 1.Protobuf用来做什么 2. Protobuf的序列化与反序列化 3. Protobuf的优点和缺点 4. RPC介绍 <1>文档规范 <2>消息编码 <3>传输协议 <4>传输性能 <5>传输形式 <6>浏览器的支持度 <7>消息的可读性和…

【鸿蒙应用ArkTS开发系列】-自定义底部菜单列表弹窗

文章目录 前言创建Demo工程创建dialog 文件夹创建ListMenu 接口创建自定义弹窗 ListMenuDialog使用自定义弹窗 打包测试效果演示默认效果菜单带图标效果设置文本颜色效果不同文本颜色效果无标题效果 前言 上一篇文章中我们实现了选择图片、选择文件、拍照的功能 。 链接在这里…

11.28 C++作业

提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 要求使用C风格字符串完成 #include <iostream>using namespace std;int main() {string str;cout << "请输入一个字符串&#xff1a;" <<…

92基于matlab的引力搜索算法优化支持向量机(GSA-SVM)分类模型

基于matlab的引力搜索算法优化支持向量机&#xff08;GSA-SVM&#xff09;分类模型&#xff0c;以分类精度为优化目标优化SVM算法的参数c和g&#xff0c;输出分类可视化结果及适应度变化曲线。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 92 引力搜索算法…

无人机助力电力设备螺母缺销智能检测识别,python基于YOLOv5开发构建电力设备螺母缺销小目标检测识别系统

传统作业场景下电力设备的运维和维护都是人工来完成的&#xff0c;随着现代技术科技手段的不断发展&#xff0c;基于无人机航拍飞行的自动智能化电力设备问题检测成为了一种可行的手段&#xff0c;本文的核心内容就是基于YOLOv7来开发构建电力设备螺母缺销检测识别系统&#xf…

Symbol()和迭代器生成器

目录 1、Symbol&#xff08;&#xff09; 2、迭代器生成器 执行流程 模拟生成器函数 for of 遍历迭代选择器 yield * Generator函数应用 1、Symbol&#xff08;&#xff09; Symbol表示独一无二的值 const s1 Symbol(a)const s2 Symbol(a)console.log(s1 s2) // fa…

PCB走线宽度与电流的关系表

在1 oz./sq. ft.铜重量时将温度上升限制在10C。这应该可以让您大致了解如何调整PCB中的走线尺寸。 电流&#xff08;A&#xff09;走线宽度&#xff08;mil&#xff09;1102303504805110615071808220926010300 上表适用于许多通常采用标准工艺生产的PCB&#xff0c;其目标是非…

SHAP(三):在解释预测模型以寻求因果见解时要小心

SHAP&#xff08;三&#xff09;&#xff1a;在解释预测模型以寻求因果见解时要小心 与 Microsoft 的 Eleanor Dillon、Jacob LaRiviere、Scott Lundberg、Jonathan Roth 和 Vasilis Syrgkanis 合作撰写的关于因果关系和可解释机器学习的文章。 当与 SHAP 等可解释性工具配合…