Skip to content

Instantly share code, notes, and snippets.

@obiyann
Created June 26, 2018 04:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save obiyann/b8cf6a233b3523a492c3e5db79ad6019 to your computer and use it in GitHub Desktop.
Save obiyann/b8cf6a233b3523a492c3e5db79ad6019 to your computer and use it in GitHub Desktop.
Zenko Machinebox.io tagbox integration - teach
#!/usr/local/bin/python
# Yannick Guillerm - Sales Engineer Scality
# yannick.guillerm@scality.com
# Zenko MachineBox.ai TagBox integration TEACH
# Description: uoloads several set of files to Zenko S3. Runs Machinebox.io TagBox TEACH to tag images with specific tag.
# 05/25/18
import requests
import sys, getopt
import argparse
import os
import shutil
import ntpath
import json
from pprint import pprint
import subprocess
watermelons = ["/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Watermelon/WM1.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Watermelon/WM2.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Watermelon/WM3.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Watermelon/WM4.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Watermelon/WM5.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Watermelon/WM6.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Watermelon/WM7.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Watermelon/WM8.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Watermelon/WM9.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Watermelon/WM10.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Watermelon/WM11.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Watermelon/WM12.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Watermelon/WM13.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Watermelon/WM14.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Watermelon/WM15.jpeg"]
cantaloupes = ["/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Cantaloupe/CM1.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Cantaloupe/CM2.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Cantaloupe/CM3.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Cantaloupe/CM4.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Cantaloupe/CM5.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Cantaloupe/CM6.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Cantaloupe/CM7.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Cantaloupe/CM8.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Cantaloupe/CM9.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Cantaloupe/CM10.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Cantaloupe/CM11.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Cantaloupe/CM12.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Cantaloupe/CM13.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Cantaloupe/CM14.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Cantaloupe/CM15.jpeg"]
honeydews = ["/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Honeydew/HM1.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Honeydew/HM2.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Honeydew/HM3.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Honeydew/HM4.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Honeydew/HM5.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Honeydew/HM6.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Honeydew/HM7.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Honeydew/HM8.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Honeydew/HM9.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Honeydew/HM10.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Honeydew/HM11.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Honeydew/HM12.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Honeydew/HM13.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Honeydew/HM14.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Honeydew/HM15.jpeg"]
x-wing = ["/Users/yannickguillerm/Desktop/TechMarketing/Zenko/X-Wing/X-Wing1.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/X-Wing/X-Wing2.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/X-Wing/X-Wing3.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/X-Wing/X-Wing4.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/X-Wing/X-Wing5.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/X-Wing/X-Wing6.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/X-Wing/X-Wing7.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/X-Wing/X-Wing8.jpeg"]
ywing = ["/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Y-Wing/Y-Wing1.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Y-Wing/Y-Wing2.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Y-Wing/Y-Wing3.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Y-Wing/Y-Wing4.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Y-Wing/Y-Wing5.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Y-Wing/Y-Wing6.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Y-Wing/Y-Wing7.jpeg",
"/Users/yannickguillerm/Desktop/TechMarketing/Zenko/Y-Wing/Y-Wing8.jpeg"]
def teach(category, label, zenkoendpoint, zenkobucket):
print "Teaching %s ..." % label
for element in category:
filepath = element
filename = ntpath.basename(filepath)
# Upload file
print "Uploading file to Zenko ..."
command = 'aws --endpoint-url https://' + zenkoendpoint + ':443 s3api put-object --bucket ' + zenkobucket + ' --key ' + filename + ' --body ' + filepath
print command
os.system(command)
# Grant public read access
print "Granting public access ..."
Command = 'aws --endpoint-url https://' + zenkoendpoint + ':443 s3api put-object-acl --bucket ' + zenkobucket + ' --key ' + filename + ' --acl public-read'
print Command
os.system(Command)
# Teach with machinebox
print "MachineBox Teaching ..."
filepath = element
filename = ntpath.basename(filepath)
command = 'curl -H \'Content-Type: application/json\' -d \'{"url":"https://' + zenkoendpoint + '/' + zenkobucket + '/' + filename + '","tag":"' + label +'","id":"' + filename + '"}\' http://localhost:8080/tagbox/teach'
print command
result = subprocess.check_output(command, shell=True)
print result
json_res = json.loads(result)
json_str = json.dumps(json_res)
tagset_str = 'TagSet=['
# Tag object
if 'tags' in json_res:
if len(json_res["tags"]) != 0:
i=0
while i<len(json_res["tags"]):
print json_res["tags"][i]["tag"]
print json_res["tags"][i]["confidence"]
#Command syntax: aws s3api put-bucket-tagging --bucket bucketname --tagging 'TagSet=[{Key=organization,Value=sales}]'
tagset_str = tagset_str + '{Key=' + str(json_res["tags"][i]["tag"]) + ',Value=' + str(json_res["tags"][i]["confidence"]) + '}'
i=i+1
print tagset_str
print "\n"
if 'custom_tags' in json_res:
if len(json_res["custom_tags"]) != 0:
j=0
while j<len(json_res["custom_tags"]):
print json_res["custom_tags"][j]["tag"]
print json_res["custom_tags"][j]["confidence"]
#Command syntax: aws s3api put-bucket-tagging --bucket bucketname --tagging 'TagSet=[{Key=organization,Value=sales}]'
tagset_str = tagset_str + '{Key=' + str(json_res["custom_tags"][j]["tag"]) + ',Value=' + str(json_res["custom_tags"][j]["confidence"]) + '}'
j=j+1
print tagset_str
print "\n"
if 'tags' in json_res or 'custom_tags' in json_res:
tagset_str = tagset_str.replace("}{","},{")
tagset_str = tagset_str + ']'
command = 'aws --endpoint-url https://' + zenkoendpoint + ':443 s3api put-object-tagging --bucket ' + zenkobucket + ' --key ' + filename + ' --tagging ' + '\'' + tagset_str + '\''
print command
os.system(command)
def main(argv):
filepath = ""
zenkoset = "none"
# Parse arguments. File full path and op (upload/download)
parser = argparse.ArgumentParser()
parser.add_argument('--endpointurl', help='endpointurl help')
parser.add_argument('--bucket', help='bucket help')
parser.add_argument('--set', help='set help')
args = vars(parser.parse_args())
zenkoendpoint = args['endpointurl']
zenkobucket = args['bucket']
zenkoset = args['set']
if zenkoset != "melons" and zenkoset != "starwars":
print "Undefined metadata mode - Must be \"melons\" or \"starwars\""
exit(0)
print "MachineBox Teaching ..."
if zenkoset == "melons":
teach(watermelons, "Watermelon", zenkoendpoint, zenkobucket)
teach(cantaloupes, "Cantaloupe", zenkoendpoint, zenkobucket)
teach(honeydews, "Honeydew", zenkoendpoint, zenkobucket)
elif zenkoset == "starwars":
teach(xwing, "x-wing", zenkoendpoint, zenkobucket)
teach(ywing, "y-wing", zenkoendpoint, zenkobucket)
else:
print "Undefined metadata mode - Must be \"melons\" or \"starwars\""
exit(0)
if __name__ == "__main__":
main(sys.argv[1:])
@obiyann
Copy link
Author

obiyann commented Jun 26, 2018

Use it as follows:
python /Users/yannickguillerm/Desktop/TechMarketing/Zenko/zenkoteach.py --endpointurl c5afccae-78c0-11e8-a153-0242ac110002.sandbox.zenko.io --bucket zenko-local --set starwars

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment