图像标签实现智慧相册
1.图像标签服务初始化
1.1引入相关的库
In [147]:
# 调用包从图像识别包中调用,图像标签,工具包
from image_sdk.utils import encode_to_base64
from image_sdk.image_tagging import image_tagging_aksk
from image_sdk.utils import init_global_env
# 调用 json 解析传回的结果
import json
# 操作系统文件/文件夹的包
import os
import shutil
# 图像处理展示相关的包
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
1.2设置相关参数
In [148]:
init_global_env('cn-north-4')
# 准备 ak,sk
app_key = 'ZOYJIX826ZAGN60VMLB4'
app_secret = 'Me01hBNn6EiNmRYPgA7Zq4InzaEkXSgyBjJGCuLC'
1.3使用网络图像测试
In [149]:
# 使用网络图像测试
demo_data_url = 'https://img2.baidu.com/it/u=892417705,3881224849&fm=253&fmt=auto&app=120&f=JPG?w=891&h=500'
# call interface use the url
result = image_tagging_aksk(app_key, app_secret, '', demo_data_url, 'zh', 5, 30)
# 转化成 Python 字典形式
tags = json.loads(result)
print(tags)
{'result': {'tags': [{'confidence': '88.27', 'i18n_tag': {'en': 'Helmet', 'zh': '头盔'}, 'tag': '头盔', 'type': 'object'}, {'confidence': '85.34', 'i18n_tag': {'en': 'Metal', 'zh': '金属'}, 'tag': '金属', 'type': 'object'}, {'confidence': '80.22', 'i18n_tag': {'en': 'Animation', 'zh': '动漫'}, 'tag': '动漫', 'type': 'object'}, {'confidence': '76.68', 'i18n_tag': {'en': 'Adult', 'zh': '成年人'}, 'tag': '成年人', 'type': 'object'}, {'confidence': '73.64', 'i18n_tag': {'en': 'Robot', 'zh': '机器人'}, 'tag': '机器人', 'type': 'object'}]}}
2.利用标签打标相关的照片
2.1打标一张照片
In [150]:
# 确定电子相册位置
file_path ='data/'
file_name = 'pic3.jpg'
# 保存图片标签的字典
labels={}
# 图像打标
result = image_tagging_aksk(app_key, app_secret, encode_to_base64(file_path + file_name), '', 'zh', 5,
60)
# 解析结果
result_dic = json.loads(result)
# 保存到字典中
labels[file_name] = result_dic['result']['tags']
print(labels)
. . .
2.2打标 data 文件夹下的所有照片
In [151]:
# 确定电子相册位置
file_path ='data/'
# 保存图片标签的字典
labels = {}
items = os.listdir(file_path)
for i in items:
# 判断是否为文件,而不是文件夹
if os.path.isfile:
# 华为云 EI 目前支持 JPG/PNG/BMP 格式的图片
if i.endswith('jpg') or i.endswith('jpeg') or i.endswith('bmp') or i.endswith('png'):
# 为图片打上标签
result = image_tagging_aksk(app_key, app_secret, encode_to_base64(file_path + i), '', 'zh', 5, 60)
# 解析返回的结果
result_dic = json.loads(result)
# 将文件名与图片对齐
labels[i] = result_dic['result']['tags']
# 显示结果
print(labels)
. . .
2.3保存打标结果
In [152]:
#将标签字典保存到文件
save_path = './label'
# 如果文件夹不存在则创建文件
if not os.path.exists(save_path):
os.mkdir(save_path)
# 创建文件,执行写入操作,并关闭
with open(save_path + '/labels.json', 'w+') as f:
f.write(json.dumps(labels))
3.利用打标结果制作动态相册
3.1重新打开保存的标注结果
In [153]:
# 打开刚刚保存的文件
label_path = 'label/labels.json'
with open(label_path,'r') as f:
labels = json.load(f)
3.2利用关键字进行搜索
In [154]:
# 搜索关键词
key_word = input('请输入搜索词')
# 设置可信百分比
threshold = 60
# 设置一个集合(集合内只存在唯一的元素)
valid_list = set()
# 遍历 labels 中的字典获取所有包含关键字的图片名字
for k,v in labels.items():
for item in v:
if key_word in item['tag'] and float(item['confidence']) >= threshold:
valid_list.add(k)
# 展示结果
valid_list = list(valid_list)
print(valid_list)
. . .
3.3展示相关的图片
In [155]:
# 设置画布大小
plt.figure(24)
# 将每张图片依次排列到画布上
for k,v in enumerate(valid_list[:9]):
pic_path = 'data/' + v
img = Image.open(pic_path)
img = img.resize((640,400))
plt.subplot(331 + k)
plt.axis('off')
plt.imshow(img)
plt.show()
. . .
3.4制作 gif 图片
In [156]:
# 生成一个临时文件夹
if not os.path.exists('tmp'):
os.mkdir('tmp')
# 将所有搜索到的图像转化为 gif 格式,并存储在临时文件夹中
gif_list = []
for k, pic in enumerate(valid_list):
pic_path = 'data/' + pic
img = Image.open(pic_path)
img = img.resize((640,380))
save_name = 'tmp/'+ str(k) + '.gif'
img.save(save_name)
gif_list.append(save_name)
# 打开已经所有静止的 gif 图片
images=[]
for i in gif_list:
pic_path = i
images.append(Image.open(pic_path))
# 存储成动图 gif
images[0].save('相册动图.gif',save_all=True,append_images=images[1:],duration=1000,loop=0)
# 释放内存
del images
# 删除临时文件夹
shutil.rmtree('tmp')
print('gif 相册制作完成')
. . .
4.利用标签对照片进行自动分类
4.1自动分类
In [157]:
# 打开保存的 labels 文件
label_path = 'label/labels.json'
with open(label_path,'r') as f:
labels = json.load(f)
print(labels)
# 获取置信度最高的文件分类
classes =[[v[0]['tag'],k] for k, v in labels.items()]
classes
for cls in classes:
if not os.path.exists('data/' + cls[0]):
os.mkdir('data/'+ cls[0])
# 复制被对应的图片
shutil.copy('data/'+ cls[1], 'data/'+ cls[0]+ '/' + cls[1])
print('已完成移复制!')