123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- # 本py文件主要用于数据隐私保护以及watermarking_trigger的插入。
- import qrcode
- from watermark_generate.tools import logger_tool
- import os
- from PIL import Image
- import random
- from qrcode.main import QRCode
- logger = logger_tool.logger
- # 获取文件扩展名
- def get_file_extension(filename):
- return filename.rsplit('.', 1)[1].lower()
- def process_dataset_label(watermarking_dir, img_path, label_path, percentage=5):
- """
- 处理数据集及其标签信息
- :param watermarking_dir: 水印图片生成目录
- :param img_path: 图片路径
- :param label_path: 图片相对应的标签文件路径
- :param percentage: 每种密码标签修改图片百分比
- """
- img_path = os.path.normpath(img_path)
- label_path = os.path.normpath(label_path)
- filename_list = os.listdir(img_path) # 获取数据集图片目录下的所有图片
- # 这里是根据watermarking的生成路径来处理的
- qr_files = [f for f in os.listdir(watermarking_dir) if f.startswith('QR_') and f.endswith('.png')]
- # 对于每个QR码,选取子集并插入QR码
- for qr_index, qr_file in enumerate(qr_files):
- # 读取QR码图片
- qr_path = os.path.join(watermarking_dir, qr_file)
- qr_image = Image.open(qr_path)
- qr_width, qr_height = qr_image.size
- # 随机选择一定比例的图片
- num_images = len(filename_list)
- num_samples = int(num_images * (percentage / 100))
- logger.info(f'处理样本数量{num_samples}')
- selected_filenames = random.sample(filename_list, num_samples)
- for filename in selected_filenames:
- # 解析图片路径
- image_path = f'{img_path}/{filename}'
- img = Image.open(image_path)
- # 插入QR码 2到3次
- num_insertions = random.randint(2, 3)
- for _ in range(num_insertions):
- x = random.randint(0, img.width - qr_width)
- y = random.randint(0, img.height - qr_height)
- img.paste(qr_image, (x, y), qr_image)
- # 添加bounding box
- label_path = f'{label_path}/{filename.replace(get_file_extension(filename), 'txt')}'
- cx = (x + qr_width / 2) / img.width
- cy = (y + qr_height / 2) / img.height
- bw = qr_width / img.width
- bh = qr_height / img.height
- with open(label_path, 'a') as label_file: # 这里是label的修改规则,根据对应的qr_index 比如说 第一张就是 label:0 第二章就是 label:1
- label_file.write(f"{qr_index} {cx} {cy} {bw} {bh}\n")
- # 保存修改后的图片
- img.save(image_path)
- logger.info(f"已修改{len(selected_filenames)}张图片并更新了 bounding box, qr_index = {qr_index}")
- def embed_label_to_image(secret, img_path, fill_color="black", back_color="white"):
- """
- 向指定图片嵌入指定标签二维码
- :param secret: 待嵌入的标签
- :param img_path: 待嵌入的图片路径
- :param fill_color: 二维码填充颜色
- :param back_color: 二维码背景颜色
- """
- qr = QRCode(
- version=1,
- error_correction=qrcode.constants.ERROR_CORRECT_L,
- box_size=2,
- border=1
- )
- qr.add_data(secret)
- qr.make(fit=True)
- # todo 处理二维码嵌入,色彩转换问题
- qr_img = qr.make_image(fill_color=fill_color, back_color=back_color).convert("RGBA")
- qr_width, qr_height = qr_img.size
- img = Image.open(img_path)
- x = random.randint(0, img.width - qr_width)
- y = random.randint(0, img.height - qr_height)
- img.paste(qr_img, (x, y), qr_img)
- # 保存修改后的图片
- img.save(img_path)
- logger.info(f"二维码已经嵌入,图片位置{img_path}")
|