💖 1. 问题说明
1.1 模糊/反光图像
之前做项目的时候,摄像头采集数据环境,在demo现场,由于摄像头被放在玻璃柜中,玻璃反光和灯光等原因,采集到的图像比较模糊。
类似下图。
所以这里对百度的判断图像模糊程度的API进行简单使用,主要参考:
1.2 直接使用百度web测试
测试网页:https://ai.baidu.com/tech/imagecensoring
可以看到,识别结果中有图文审核的结果,但是其信息是存在恶意推广不合格
,没有给出我想要的图像质量信息。
🎂 2. 实施
2.1 跑通代码
# encoding:utf-8
import requests
import json
# 第一步:通过AK和SK获取token 参考 https://ai.baidu.com/ai-doc/ANTIPORN/skk9093a1
def getToken(client_id, client_secret):
# client_id 为官网获取的AK, client_secret 为官网获取的SK
host = f'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={client_id}&client_secret={client_secret}'
response = requests.get(host)
dictRS = dict(response.json())
if response:
print(dictRS)
token = dictRS["access_token"]
return token
# 第二步:根据给出的token去进行post请求
import base64
def getRS(token, imgPath):
request_url = "https://aip.baidubce.com/rest/2.0/solution/v1/img_censor/v2/user_defined"
# 二进制方式打开图片文件
f = open(imgPath, 'rb')
img = base64.b64encode(f.read())
params = {"image": img}
access_token = token
request_url = request_url + "?access_token=" + access_token
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(request_url, data=params, headers=headers)
if response:
print(json.dumps(response.json(), sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False))
# 这里是为了让打印出的json格式更直观
# 重点是这行代码
dictRS=dict(response.json())
return dictRS
imgPath = "17.png"
client_id = "XXX"
client_secret = "XXX"
token = getToken(client_id, client_secret)
print(token)
response=getRS(token,imgPath)
但是直接这样检测出来的结果并不是我想要的关于图像质量-清晰度
的信息。
2.2 配置策略
仔细看官方文档-配置图像审核策略才发现:
上面那个文档写的十分详细,可以参照往下走。
所以我想要的图像质量检测:对图像的清晰度和美观度进行打分
这个策略需要自己重新配置。
- 点击这里配置,
创建策略
->填写相关信息
(注意,接口形式可能会发生变化,以官方文档为准)
- 配置完了还需要验证!验证!就是弹出一个框框,可以使用自己上传的图片验证
但是返回的结果中,似乎没有我想要的清晰度信息?? - 认真看了一下策略配置,在这里把违规和疑似的区间放大,这样只要是不太清晰的,模糊的图像都会被判定为不合格。
这里疑似区间:[0.4-0.71],违规区间:[0-0.4] - 将清晰度阈值修改后,结果就好多了。
- 验证可用之后,为了保证API接口的更新,需要点击启用策略
这样,策略就从停用
状态变成了启用
状态
启用之后,再次运行代码,可以看到:
策略规定中:疑似区间:[0.4-0.71],违规区间:[0-0.4]
参数说明:
"""
conclusion 审核结果,可取值描述:合规、不合规、疑似、审核失败
conclusionType 审核结果类型,可取值1、2、3、4,分别代表1:合规,2:不合规,3:疑似,4:审核失败
probability 不合规项置信度
msg probability Float N 不合规项置信度
subType 当type=6时subType取值含义: 0:图像清晰度、1:图像美观度
type 结果具体命中的模型:6:图像质量检测
"""
3. 技术探究
可以用了,也知道是基于阈值的判断,剩下就是看使用了怎样的方式判断清晰度。
参考:
3.1 问题探究
进行了测试
图1
图2
图3
确实第一,第二张图人眼来看明显比第三张图要模糊,但是第三张图的清晰度判断概率却是最高的?
3.2 模拟实施
直接搜索opencv图像模糊检测
,就可以看到非常多相关的东西。
3.2.1 基于cv2.Laplacian的测试
一般的做法是:
采用 OpenCV和拉普拉斯算子来计算图片中的模糊量,也就是拉普拉斯方差算法(Variance of the Laplacian)。
opencv中提供了对laplace的封装方法,直接调用即可得到拉普拉斯算子边缘检测的图片
python版本实现代码:
等待填坑
对上述三张图片的测试结果:
参考:
3.2.2 测试2
参考 图像的模糊检测方法