华为实验一 智慧相册

图像标签实现智慧相册

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('已完成移复制!')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值