123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- #!/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()
|