前言
在前面的文章中,我们已经进行了简单的情感分析(如何实现简单的情感分析?),以及如何构建一个智能客服(如何构建智能客服),今天我们来实现一个图像识别的功能。
图像识别技术被广泛应用于交通运输、自动驾驶、机器人、无人机、工业化生产线、地质勘探等领域。在早期,图像识别主要依赖于图像处理技术,只能处理较为简单的图像和任务。随着计算机技术和人工智能的发展,深度学习算法逐渐应用于图像识别领域。如今我们用AI就可以轻易实现图像识别。
Colab
Colaboratory - Colaboratory (google.com)
首先我们通过科学上网,登录自己的谷歌账号,新建一个笔记本。
安装 transformers 库
transformers 是一个由 Hugging Face 公司开发的开源库,用于在自然语言处理(NLP)任务中使用预训练的语言模型。该库提供了一系列预训练的模型,包括了许多流行的模型,如BERT、GPT、RoBERTa等。
输入以下代码,安装transformers库。
!pip install transformers
最后一行出现Successfully就代表安装成功。
载入字典视图
transformers库的pipeline模块提供了一个方便的接口,用于执行各种自然语言处理(NLP)和计算机视觉任务,无需深入了解模型的细节。
transformers.pipelines库中,SUPPORTED_TASKS 是一个包含各种NLP任务及其相关信息的字典。我们导入并打开。
from transformers.pipelines import SUPPORTED_TASKS
SUPPORTED_TASKS
我们得到字典中的信息:
items() 是字典(dict)对象的方法,用于返回一个包含字典键值对的视图。
print(SUPPORTED_TASKS.items())
我们打印得到视图:
解构items
我们将视图中没用的元素解构出去,留下自己想要信息,这里我们想要更清晰地看到各管道的名称,以便于后面我们选择使用,于是我们输入以下代码:
for k, v in SUPPORTED_TASKS.items():
print(k)
我们得到更清晰的管道视图:
导入图像识别模型
我们再次导入pipline下发任务
from transformers import pipeline
然后导入图片识别模型,接着从上面的视图中选择'zero-shot-object-detection'管道进行标记图像数据集训练。
checkpoint = "google/owlvit-base-path32" # 图片识别模型
detector = pipeline('zero-shot-object-detection',medol=checkpoint)
以下代表任务下发成功:
导入图片
首先我们导入python的http 请求库,然后从PIL导入图片专业库,接着我们使用 PIL 库中的 Image.open 打开图像:
import requests # python的http 请求库
from PIL import Image # PIL python 图片的专业库
url = "https://bpic.588ku.com/back_list_pic/20/08/04/b453be520805edda0db1aed65fa22770.jpg"
img = Image.open(requests.get(url, stream=True).raw) # requests.get python 同步语言
img
效果如下:
进行图像识别
我们选择识别图片目标,这里我们选择识别吉他跟书本。输入以下代码:
predictions = detector(
img,
# 候选的对象
candidate_labels = ["guitar","book"]
)
predictions
输出:
这个输出是零样本目标检测的结果,其中包含了检测到的对象及其相关信息。每个元素都是一个字典,代表一个检测到的对象。
'score': 表示检测到的对象的得分,范围通常在 0 到 1 之间。得分越高表示算法认为该对象存在的可能性越大。'label': 表示检测到的对象的标签或类别,例如 "guitar" 表示吉他,"book" 表示书本。'box': 是一个包含对象边界框(bounding box)信息的字典,包括了边界框的四个坐标值。
接着我们用识别所选对象,并用红线框选出:
from PIL import ImageDraw # PIL python图片库 写模块
draw = ImageDraw.Draw(img)
for prediction in predictions:
box = prediction["box"]
label = prediction["label"]
score = prediction["score"]
xmin, ymin, xmax, ymax = box.values() # 解构
draw.rectangle((xmin, ymin, xmax, ymax),outline="red",width=1)
draw.text((xmin,ymin),f"{label}:{round(score, 2)}",fill="red")
img # 输出识别后的图片
我们对代码逐行分析:
- 首先我们导入了
Image和ImageDraw类,它们是 Python Imaging Library(PIL)的一部分,用于处理图像和绘制图像。 - 创建了一个
ImageDraw对象draw,该对象允许在图像上进行绘制操作。它接受一个图像对象img作为参数。 - 开始一个循环,遍历对象检测的预测结果列表
predictions中的每个预测。 - 从每个预测结果中提取边界框坐标 (
box)、标签 (label) 和置信度 (score)。 - 这一行使用字典的
values()方法,将边界框坐标的值解构到四个变量:xmin、ymin、xmax和ymax。 - 绘制检测到的对象的边界框,颜色为红色,边框宽度为1像素
- 使用
draw.text方法在图像上添加文本,显示检测到的对象的标签和置信度。文本的位置由(xmin, ymin)指定,文本内容由f"{label}: {round(score, 2)}"组成,其中f-string用于格式化字符串。fill="red"指定文本颜色为红色。 - 最后查看绘制后的图像:
结语
至此,我们已经完成了已经简单的图像识别,通过使用 Python 中强大的图像处理库 PIL 和深度学习模型库 transformers,我们成功地将图像加载、预测,并通过绘制边界框和标签进行了可视化展示。
希望这个简单的教程能够对你在图像识别和目标检测方面的学习和实践提供一些帮助。欢迎评论区交流学习!
我的Gitee: CodeSpace (gitee.com)
技术小白记录学习过程,有错误或不解的地方还请评论区留言,如果这篇文章对你有所帮助请 “点赞 收藏+关注” ,感谢支持!!