老AI开源项目案例:去除指定位置、形态的水印

各家企业的业务线不同,需求也多种多样,像去水印这种需求也存在。

需求

一个妹子是做Java的,她尝试过用Java代码去除图片上的水印,但是效果并不好。行业的直觉告诉她,可能AI人工智能更适合去除水印。我直接告诉她,AI去水印不难。

伴随着AI技术的突飞猛进,很多以前看似高端的技术慢慢地走入千家万户,并且越来越智能。

哪怕你网络上随便浏览一张图片,平台也会给你浮现出一个"Ai去水印"的按钮。你一点击,水印真的去掉了。

但是它功能再强、效果再好,这是人家产品里的,不是咱自己的。如果你想用,马上会面对两个问题:第一个问题就是收费高;第二个问题是在他的体系里效果好,在你自己的体系里效果差。

费用问题还好说,而后者的效果问题则很尴尬。这倒不是人家藏着掖着没给你好的资源,着实是因为他提供的是一套通用的能力,而非定制的能力。就像是OCR数字识别,通用能力可能是识别书本、网页、画报上的数字。而你用它去识别水表、电表、电子秤这类仪表上的数字。这一下就错位了,就好比拿满汉全席招待湖南老汉,他问怎么没有辣味,不是很满意。

我不认为通用的手段能解决个性问题。而个性的问题恰好又是产品的特色。遇到稍微特殊一些场景,通用方案就会失效。

通用方案操作简单,定制方案针对性好。这就好比汽车自动挡和手动挡的区别。

今天,我要介绍的这个去水印方案,就是一个"老手动挡"方案。我感觉,它很有针对性,有些地方甚至新AI都做不到。

这是一个开源项目,地址是 github.com/zuruoke/watermark-removal

我之所以说它老,除了项目是2021年创建的,它用的AI框架TensorFlow是1.15.0版本。另外,它去水印也需要先制作掩膜。

而它的优势也来源于劣势:因为版本低,它不占资源,普通机器就能跑;因需要制作掩膜,它可以根据掩膜定义水印的位置和形态,就算一张图片有俩水印,我们也可以做到只去除指定的一个。

先看看效果吧。

这是官方效果,只能作为参考。实际效果,还需要我们亲自去搭建并尝试。

这套框架对设备没有要求,用你的笔记本电脑就可以搭建并运行。

操作步骤

第1步:下载文件

首先,下载项目源码,地址是 github.com/zuruoke/watermark-removal/

然后,下载模型权重文件,地址是 drive.google.com/drive/folders/1xRV4EdjJuAfsX9pQme6XeoFznKXG0ptJ

下载不下来可以找我要。下载完毕后,将权重模型文件放到项目的model文件夹下。

有了这个文件结构,我们的代码就准备好了。下一步是准备运行环境。

第2步:准备环境

以下是运行所需要的环境以及类库:

复制代码
python               3.7.16
neuralgym            0.0.1
numpy                1.21.6
opencv-python        4.9.0.80
Pillow               9.5.0
PyYAML               6.0.1
tensorflow           1.15.0

虽然requirements.txt中只列了tensorflowopencv-python这2个库,但是在实际安装的时候,通过一步步排查错误,我又补充了很多。

因为tensorflow1.15.0,这就限制了python不能超过3.7,因此选择了python 3.7

特别提示,对于neuralgym的安装,官方特别说明要采用如下方式安装:

bash 复制代码
pip install git+https://github.com/JiahuiYu/neuralgym

环境准备完毕,之后就可以运行demo了。

第3步:运行demo

运行demo可以采用命令行的方式:

css 复制代码
python main.py --image i.png --output o.png

这段命令的意思就是将i.png这张图片做去水印处理,处理完毕后保存为o.png命名的新文件。

当然,命令行和代码执行效果一样,主要是调用模型权重去做操作。主要处理代码在main.py中体现,你也可以修改这个文件适应自己的需求。

其实完整的参数有4个:

ini 复制代码
parser.add_argument('--image', default='', type=str,
                    help='The filename of image to be completed.')
parser.add_argument('--output', default='output.png', type=str,
                    help='Where to write output.')
parser.add_argument('--watermark_type', default='istock', type=str,
                    help='The watermark type')
parser.add_argument('--checkpoint_dir', default='model/', type=str,
                    help='The directory of tensorflow checkpoint.')

image是待处理的图片路径,output是处理后的图片路径,watermark_type是水印类型,有默认值。checkpoint_dir是模型权重的地址,默认就是model文件夹,刚刚我们已经下载并存放好了。

我在执行过程中,出现了一个错误,不知道是环境问题还是代码问题,但是好在解决了。

错误是:

python 复制代码
 File "watermark-removal\preprocess_image.py", line 42, in preprocess_image
    assert image.shape == preprocessed_mask_image
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

解决方案就是修改preprocess_image.py文件:

ini 复制代码
将
assert image.shape == preprocessed_mask_image
修改为:
assert image.shape == preprocessed_mask_image.shape

如果你没有遇到,可以忽略。

演示效果,原图:

去除效果:

原理讲解和改造

水印掩膜

这里面有个掩膜的概念。这个框架没有智能到自己能寻找哪个区域是水印。需要我们告诉它水印的位置,以及形态。

我们看preprocess_image.py里面的一段源码:

它会去utils下的watermark_type下的image_type里面寻找一张名为mask.png的图片。watermark_type是水印类型,image_type是图片的类型,分为landscapepotrait,也就是横屏和竖屏。

追根溯源,我们在utils/istock/landscape/mask.png找到了这张图片。

这张掩膜图片定义了哪里是水印。因此,框架只需要处理掩膜图片中空白处即可。

这一步也就限定了要处理的图片,水印位置需要比较固定。

去除自定义水印

假设我们有这么一个需求。有一个叫"大红书"的水印,打在图片的中心位置。

我们该如何去掉它呢?首先,为它制造掩膜。也就是这么一张图片,整体是黑色的,带有"大红书"的位置处是透明的。

制作好了掩膜,框架就知道哪里有水印,它就会把精力都放在水印区域内。而我们的掩膜可以放到utils/dhs/landscape/mask.png下。随后,执行命令,指定输入、输出图片的路径,掩膜的路径,以及模型权重的路径:

css 复制代码
python main.py --image a.png  --output b.png --checkpoint_dir model/ --watermark_type dhs

我们来看下去除的效果:

如果是按照这个套路的话,屡试不爽。那种让我们头痛的多水印也可以清除其一。

比如下面这张,顶部的"操作示意图"和"大红书"的样式是一样的。单纯看样子,他们都是水印。

但是,我们可以做到去除"大红书"而保留"操作示意图"。这一点,高级的人工智能,反而不容易做到,咱们这个"低级"的可以。

后记

这就挺有意思,高级的不行,低级的可以。其实这个高级和低级是相对人类参与多少而言的。机器帮你做得越多,你越省心,但是你能干预的就越少。你做多越多,你能控制的颗粒度也就是越细。这就好像手动挡更容易实现原地出库一样。自动挡可能也能实现,但是成本要大很多。

在软件行业也是一样。大厂的通用AI模型就好比自动挡,让我们很容易就实现一个功能。但是,它很难为你作出一点改变。而小厂可能会为你单独做一套功能。

好了,今天的去水印功能就讲到这里。

我是IT男的一人企业,"专业实用化,永远不做大"是我的宗旨。

相关推荐
狮子座明仔1 分钟前
MiMo-V2-Flash 深度解读:小米 309B 开源 MoE 模型如何用 15B 激活参数吊打 671B 巨头?
人工智能·语言模型·自然语言处理
紧固件研究社2 分钟前
从标准件到复杂异形件,紧固件设备如何赋能制造升级
人工智能·制造·紧固件
木头左3 分钟前
贝叶斯深度学习在指数期权风险价值VaR估计中的实现与应用
人工智能·深度学习
反向跟单策略3 分钟前
期货反向跟单—高频换人能够提高跟单效率?
大数据·人工智能·学习·数据分析·区块链
哎吆我呸3 分钟前
Android studio 安装Claude Code GUI 插件报错无法找到Node.js解决方案
人工智能
咕噜企业分发小米4 分钟前
独立IP服务器有哪些常见的应用场景?
人工智能·阿里云·云计算
测试者家园9 分钟前
AI 智能体如何构建模拟真实用户行为的复杂负载场景?
人工智能·压力测试·性能测试·智能体·用户行为·智能化测试·软件开发和测试
MF_AI10 分钟前
苹果病害检测识别数据集:1w+图像,5类,yolo标注
图像处理·人工智能·深度学习·yolo·计算机视觉
Data-Miner13 分钟前
结合AI Agent的excel大数据处理技巧
人工智能·excel
xiao5kou4chang6kai414 分钟前
面向自然科学领域机器学习与深度学习(高维数据预处理—可解释ML/DL—时空建模—不确定性量化-全程AI+Python)
人工智能·深度学习·机器学习·不确定性量化·时空建模·高维数据预处理·可解释ml/dl