华为云图像标签使用之智慧相册

可能女生或者摄影爱好者会很喜欢本期的实验,通过调用华为云的图像标签,对相册进行一个整理分类,不需要我们再一张一张去手动分类,像有几千张几万张图片,手动分类下来,人都麻了~-~


不啰嗦太多,直接代码进入正题,不知道怎么调用华为云的请看华为云注册登录之图像标签识别

数据在这里下载哦,只需1积分!!!数据包

一、图像标签服务初始化

1. 引入相关的库和调用相关的包

# 调用包从图像识别包中调用,图像标签,工具包
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

2. 设置AK/SK(不懂怎么设置的参考华为云注册那篇文,上面附上链接啦)

init_global_env('cn-north-4')

# 准备ak,sk
app_key = '***'  #不要使用***,一定要改为你自己的AK
app_secret = '***' #不要使用***,一定要改为你自己的SK

3. 使用网络图像测试

# 使用网络图像测试
demo_data_url = 'https://img2.baidu.com/it/u=766249321,3457443746&fm=26&fmt=auto' #单引号里的地址可以自己修改为自己想要使用的图片
# 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)

输出:

我使用的图片来源于网络素材,如下:

 

可以尝试百度找一张图片,右键复制图片地址,放到上面代码单引号处进行替换,看看结果是否和你预测的一致

二、利用标签打标相关的照片

1. 打标一张照片

# 确定电子相册位置
file_path ='data/'
file_name = 'pic_super.png'

# 保存图片标签的字典
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)

 输出:


注:我使用的编译软件是Jupyter book,这个编译器带不动那么多照片,我试了很多次才发现的,所以我接下来把数据包里data文件夹下的照片删除只剩下三张,如果大家用的是pycharm是可以带动很多图片,就不需要删除。

如果不删除,接下来的操作会一直出现这样一个连接超时的报错


2. 打标data文件夹下的所有照片 

# 确定电子相册位置
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)

输出:

3. 保存打标结果

#将标签字典保存到文件
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))

可以看到出现一个label文件夹

 

三、利用打标结果制作动态相册

1. 重新打开保存的标注结果

# 打开刚刚保存的文件
label_path = 'label/labels.json'
with open(label_path,'r') as f:
    labels = json.load(f)

2. 利用关键字进行搜索(我使用了“花”做例子)

# 搜索关键词
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. 展示相关图片

# 设置画布大小
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()

输出:

 4. 制作gif图片

# 生成一个临时文件夹
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相册制作完成')

输出:

四、利用标签对照片进行自动分类

 

# 打开保存的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('已完成移复制!')

输出:

 最终结果可以看到成功分类:


今天先唠到这,边学习边记录,有错误的欢迎指出^-^ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值