如何从OpenImages收集指定物品图片以及生成标签

一. 从OpenImagess收集指定物体图片

煮个栗子,从OpenImages收集大量包含眼镜的图片。
总体来说,分2步:
1.获取包含眼镜的图片的id列表(注:图片文件名 = id + ".jpg")
2.根据id列表下载相应的图片。
具体来说:

1.打开OpenImages网站,看看它长啥样

https://storage.googleapis.com/openimages/web/index.html

在菜单栏,在Type下拉菜单中选择Detection,在Category下拉菜单中选择Glasses

Detection: Glasses
我们注意到,检测的类别下拉菜单中,有Glasses,也有Sunglasses。也就是说,OpenImages的检测标注是把Glasses和Sunglasses当作两个不同类别,这是由于OpenImages的检测标注是模型自动生成,而不是人工标注,缺乏现实世界类别划分及从属的常识。在分类或分割中,还会出现Eyeglasses的标签。同样的情况还有,将女孩分别标注为girl,lady,women,person,human,human body,saleswomen,teacher等

Detection: Sunglasses

由于我们对太阳眼镜不感兴趣,所以就只从检测标注文件里“Glasses”类别获取图片id

2.获取感兴趣图片的id

首先,返回首页,并点击Download。(或者,在Explore页面的右上角点击Download也可)
这个什么可视化工具我们先不管(新出来的,上次没看到,下次探索下)


官网给出了手工下载感兴趣类别图片集的流程,包括:首先下载downloader.py文件,然后自己写个脚本,生成感兴趣图片的id列表的txt文件,接着运行downloader.py文件
这里,官网没有说明清楚的是第二步,如何写脚本获取图片的id列表
要做到这一点,我们首先需要下载:边界框的标注文件(因为我们根据标有“Glasses”的边界框来筛选包含眼镜的图片)和Metadata里的Class Names文件

右键下载后得到:边界框标注csv文件oidv6-train-annotations-bbox.csv,类别名描述文件oidv6-class-descriptions.csv
边界框标注csv文件很大,手动Notepad++打开或者python脚本import csv都打不开,会导致电脑卡死,需要python脚本import pandas。类别名描述csv文件比较小,几百k,手动Notepad++打开,我们先看看这个文件里内容长啥样

LabelName,DisplayName
/m/0100nhbf,Sprenger's tulip
/m/0104x9kv,Vinegret
/m/0105jzwx,Dabu-dabu
/m/0105ld7g,Pistachio ice cream
/m/0105lxy5,Woku
/m/0105n86x,Pastila
/m/0105ts35,Burasa
/m/0108_09c,Summer snowflake
/m/010dmf,Isle of man tt
/m/010jjr,Amusement park
/m/010l12,Roller coaster
/m/010lq47b,Witch hat
/m/010ls_cv,Sandwich Cookies
/m/010xc,Aspartame
/m/01127,Air conditioning
/m/0114n,Atari jaguar
/m/01154,Atari lynx
/m/01172_8x,Pencil skirt
/m/0117_25k,Saffron crocus
...

所以,我们要写个脚本,根据DisplayNameGlasses找到对应的LabelName

import csv
with open('oidv6-class-descriptions.csv', 'r', encoding='utf-8') as f:
    reader = csv.reader(f)
    for row in reader:
        if 'Glasses' in row[1]:
            print (row)

输出是:

['/m/0jyfg', 'Glasses']

就这样,我们找到了眼镜对应的LabelName, 是/m/0jyfg,然后,根据以下脚本生成包含图片id的txt文件

import pandas as pd
import os.path
import os

txt_file_name = 'name_the_file_whatever_you_like.txt'  

if os.path.isfile(txt_file_name):
    os.remove(txt_file_name)
    
file = open(txt_file_name,'w')

idset = set()

metadata = pd.read_csv('oidv6-train-annotations-bbox.csv')

total_rows = metadata.shape[0]

for i in range(total_rows):
    if metadata.loc[i]['LabelName'] == '/m/0jyfg':
        img_id = 'train/' + metadata.loc[i]['ImageID']
        idset.add(img_id)
        
for d in idset:
    file.write(d+'\n')

file.close()

由于oidv6-train-annotations-bbox.csv里行数很多,这个脚本运行大概需要2万年。然后,我们就得到了图片id列表的txt文件,打开,它是长这样的:

train/cc08388b2ca1c118
train/13840c988a6795b8
train/8e263f0d55360e04
train/a9302564d7575e64
train/82dc1a7e5c8049f0
train/b72e84b2f4f18c6c
train/0a8defe621c42111
train/16005aa4569109f5
train/6c41c0ceb7e5e600
train/6470016c2b9b2902
...

然后将这个txt文件和downloader.py文件放在同个目录,然后运行:

python downloader.py name_the_file_whatever_you_like.txt --download_folder=imgs --num_processes=2

然后就开始下载并存放在程序创建的文件夹imgs里了

二. 生成标签

以人像分割为例

1.进入阿里云视觉智能平台

在浏览器上搜索“阿里云视觉智能开放平台”,进入“阿里云视觉智能开放平台”,支付宝扫码登录
也可直接按网址进入:https://vision.aliyun.com/

2.单张图片生成标签

依次点击“能力广场”、“分割抠图”、“人像分割”、“上传图片”、“结果下载”


3.批量生成标签

如果你想要批量的处理图片,你还需要预先开通阿里云的OSS存储
OSS是云端存储器,类似于百度云,可以为你的数据集的每张图片生成url地址,然后就可以自己撰写脚本,使用for循环将每个图片的url送入阿里云的分割功能

3.1首先找到OSS

进入这个链接:https://homenew.console.aliyun.com/home/dashboard/ProductAndService
另一种方式:你也可以首先进入阿里云的首页:https://www.aliyun.com/,然后进入控制台


点击“产品与服务”,“对象存储OSS”


3.2上传图片至OSS

进入OSS后要创建一个bucket,类似于仓库。这一步最关键的是要将读写权限设置为“公共可读”,否则后面调用分割功能就会失败
存储空间(Bucket)是用于存储对象(Object)的容器。在上传前,要先创建Bucket。创建Bucket如下:
(1)单击Bucket列表,然后单击创建Bucket。
(2)也可以单击概览,然后单击右上角的创建Bucket。
(3)在创建Bucket面板,按如下说明配置必要参数。其他参数均可保持默认配置,也可以在Bucket创建完成后单独配置。
使用命令行工具:ossutil
要先在服务器上安装ossutil
安装过程参考官方提供的教程
wget http://gosspublic.alicdn.com/ossutil/1.7.3/ossutil64
chmod 755 ossutil64(这一句干嘛的,用不用,我也忘了)
安装好,在服务器上切换到ossutil所在目录:cd /xxxxx/oss
第一次用ossutil要需要运行:chmod +x ossutil64; mv ossutil64 ossutil
然后运行命令行帮助指令./ossutil help ls -L ch
如果上一句指令输出显示正常,那么你就可以执行下一行指令完成大规模数据集的上传了:
./ossutil cp -r /xxxxxx your local file folder xxxxxxx/ oss:// your bucket name / the file folder in the bucket /
这里容易出错的是dst_dir一定要按照上面这个格式写,是oss://开头,而不是https://开头。另外整个命令行开头的./ossutil别忘了

OSS更多使用问题可参考官方帮助文档:在搜索框了搜索“OSS”,然后找到文档,然后点进去

3.3批量对已存储至OSS的图片生成标签

首先要返回第1步和第2步,进入“阿里云视觉智能开放平台”,点击“能力广场”、“分割抠图”、“人像分割”,开通人像分割的服务,拿到密钥。
参照示例代码,撰写示例脚本:

from aliyunsdkcore.client import AcsClient
from aliyunsdkimageseg.request.v20191230 import SegmentBodyRequest
import json
import urllib.request 
import os
input_set = set(os.listdir("/your local img file folder/"))  # for idx use in ‘for’ loop, you can also use txt or csv that write imgname_list instead
alpha_save_root = "/your local label file save folder/"
finiset = set(os.listdir(alpha_save_root))
client = AcsClient("<accessKeyId>", "<accessSecret>", "cn-shanghai")
url_head = "https://***your bucket address***-bucket.oss-cn-shanghai.aliyuncs.com/ the file folder in the bucket/"
request = SegmentBodyRequest.SegmentBodyRequest()
for i in range(50):
    files = input_set - finiset
    print("\n\n\n\nlen(files)",len(files))
    print(len(input_set))
    print(len(finiset))
    for file in files:
        if "jpg" in file or "png" in file:
            try:
                input_url = url_head + file
                request.set_ImageURL(input_url)
                request.set_ReturnForm("mask")
                response = client.do_action_with_exception(request)
                response_dict = json.loads(response)
                alpha_url = response_dict["Data"]["ImageURL"]
                urllib.request.urlretrieve(alpha_url, alpha_save_root + file)
            except:
                print("ERRORA", file)
        else:
            print("ERRORB", file)

然后运行这个脚本。查看分割结果
注意:不是每一张图片都能被成功分割。例如人像分割功能,假如图片中没有人,或者置信度比较低的话,可能就没有分割结果

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容