SRM隐写分析器下载
如果你只需运行SRM隐写分析器,不需要去官网下载,可以下载我上创的文件即可(如果这里下载需要付费,可以私信我)
如果需要matlb版本或者linux版本的可以去官方下载:
代码下载地址http://dde.binghamton.edu/download/feature_extractors/
代码运行解释
1、特征提取
在python环境下运行feature.py文件,对图像特征提取,会将提取的图像特征存放到文件夹中(注意修改文件路径)。
注意:对于可执行文件SRM.exe:-I是传入多张照片,-i是每次只能传入一张照片。对于SRM隐写分析,一般使用-I 一次传入多张照片。
def SRM(pic_dir, savepath):
#-I是传入多张照片,-i是每次只能传入一张照片
os.system(r'C:\Users\chengxin\Desktop\code\SRM\SRM.exe -I ' + pic_dir + ' -O ' + savepath)
特征融合:会把提取的特征保存到一个.csv类型文件下。train_path, test_path:为上一步体征提取的文件位置。
def combine_features(train_path, test_path,types):
all_train = pd.DataFrame()
all_test = pd.DataFrame()
for file in os.listdir(train_path):
print(file)
fea_train = pd.read_csv(train_path + file, header=None, delimiter=' ')
fea_train = fea_train.iloc[:, :-1] # 去掉最后一列
all_train = pd.concat([all_train, fea_train], axis=1)
all_train.to_csv(r'C:\Users\chengxin\Desktop\code\SRM\wow_'+types+'_train.csv', index=False)
for file in os.listdir(test_path):
fea_test = pd.read_csv(test_path + file, header=None, delimiter=' ')
fea_test = fea_test.iloc[:, :-1] # 去掉最后一列
all_test = pd.concat([all_test, fea_test], axis=1)
all_test.to_csv(r'C:\Users\chengxin\Desktop\code\SRM\wow_'+types+'_test.csv', index=False)
2、matlb调用ensamble_training.m
和ensamble_test.m
两个文件
通过matlb脚本将上一步提取出的载体和含密图像特征分别输入ensamble_training.m
,进行训练,并训练好的模型和提取的SRM特征输入ensamble_test.m
,给出分类结果result。
此代码需要在matlb下运行:
disp("1")
cover_test = importdata('wow_cover_test.csv');
cover_test = single(cover_test);
cover_test = cover_test(2:end,:);
disp("2")
cover_train = importdata('wow_cover_train.csv');
cover_train = single(cover_train);
cover_train = cover_train(2:end,:);
disp("3")
stego_test = importdata('wow_stego_test.csv');
stego_test = single(stego_test);
stego_test = stego_test(2:end,:);
disp("4")
stego_train = importdata('wow_stego_train.csv');
stego_train = single(stego_train);
stego_train = stego_train(2:end,:);
RandStream.setGlobalStream(RandStream('mt19937ar','Seed',1));
[trained_ensemble,results] = ensemble_training(cover_train,stego_train);
test_results_cover = ensemble_testing(cover_test,trained_ensemble);
test_results_stego = ensemble_testing(stego_test,trained_ensemble);
% Predictions: -1 stands for cover, +1 for stego
%false_alarms表示在cover样本中被错误分类为stego的数量
false_alarms = sum(test_results_cover.predictions ~= -1);
%issed_detections表示在stego样本中被错误分类为cover的数量。
missed_detections = sum(test_results_stego.predictions ~= +1);
num_cover_samples = size(cover_test, 1);
num_stego_samples = size(stego_test, 1);
num_testing_samples = num_cover_samples + num_stego_samples;
FA = false_alarms / num_cover_samples;
FD = missed_detections / num_stego_samples;
fprintf('False Alarms (FA): %.4f\n', FA);
fprintf('Missed Detections (FD): %.4f\n', FD);
testing_error = (false_alarms + missed_detections) / num_testing_samples;
fprintf('Testing error: %.4f\n', testing_error);