|
|
@@ -0,0 +1,100 @@
|
|
|
+#!/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()
|