1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- #!/usr/bin/env python
- from __future__ import print_function
- import argparse
- import distutils.spawn
- import json
- import os
- import os.path as osp
- import platform
- import shlex
- import subprocess
- import sys
- def get_ip():
- dist = platform.platform().split("-")[0]
- if dist == "Linux":
- return ""
- elif dist == "Darwin":
- cmd = "ifconfig en0"
- output = subprocess.check_output(shlex.split(cmd))
- if str != bytes: # Python3
- output = output.decode("utf-8")
- for row in output.splitlines():
- cols = row.strip().split(" ")
- if cols[0] == "inet":
- ip = cols[1]
- return ip
- else:
- raise RuntimeError("No ip is found.")
- else:
- raise RuntimeError("Unsupported platform.")
- def labelme_on_docker(in_file, out_file):
- ip = get_ip()
- cmd = "xhost + %s" % ip
- subprocess.check_output(shlex.split(cmd))
- if out_file:
- out_file = osp.abspath(out_file)
- if osp.exists(out_file):
- raise RuntimeError("File exists: %s" % out_file)
- else:
- open(osp.abspath(out_file), "w")
- cmd = (
- "docker run -it --rm"
- " -e DISPLAY={0}:0"
- " -e QT_X11_NO_MITSHM=1"
- " -v /tmp/.X11-unix:/tmp/.X11-unix"
- " -v {1}:{2}"
- " -w /home/developer"
- )
- in_file_a = osp.abspath(in_file)
- in_file_b = osp.join("/home/developer", osp.basename(in_file))
- cmd = cmd.format(ip, in_file_a, in_file_b,)
- if out_file:
- out_file_a = osp.abspath(out_file)
- out_file_b = osp.join("/home/developer", osp.basename(out_file))
- cmd += " -v {0}:{1}".format(out_file_a, out_file_b)
- cmd += " wkentaro/labelme labelme {0}".format(in_file_b)
- if out_file:
- cmd += " -O {0}".format(out_file_b)
- subprocess.call(shlex.split(cmd))
- if out_file:
- try:
- json.load(open(out_file))
- return out_file
- except Exception:
- if open(out_file).read() == "":
- os.remove(out_file)
- raise RuntimeError("Annotation is cancelled.")
- def main():
- parser = argparse.ArgumentParser()
- parser.add_argument("in_file", help="Input file or directory.")
- parser.add_argument("-O", "--output")
- args = parser.parse_args()
- if not distutils.spawn.find_executable("docker"):
- print("Please install docker", file=sys.stderr)
- sys.exit(1)
- try:
- out_file = labelme_on_docker(args.in_file, args.output)
- if out_file:
- print("Saved to: %s" % out_file)
- except RuntimeError as e:
- sys.stderr.write(e.__str__() + "\n")
- sys.exit(1)
- if __name__ == "__main__":
- main()
|