|
import os |
|
import os.path as osp |
|
import shutil |
|
import time |
|
import datetime |
|
|
|
import torch |
|
|
|
from util.slconfig import SLConfig |
|
|
|
class Error(OSError): |
|
pass |
|
|
|
def slcopytree(src, dst, symlinks=False, ignore=None, copy_function=shutil.copyfile, |
|
ignore_dangling_symlinks=False): |
|
""" |
|
modified from shutil.copytree without copystat. |
|
|
|
Recursively copy a directory tree. |
|
|
|
The destination directory must not already exist. |
|
If exception(s) occur, an Error is raised with a list of reasons. |
|
|
|
If the optional symlinks flag is true, symbolic links in the |
|
source tree result in symbolic links in the destination tree; if |
|
it is false, the contents of the files pointed to by symbolic |
|
links are copied. If the file pointed by the symlink doesn't |
|
exist, an exception will be added in the list of errors raised in |
|
an Error exception at the end of the copy process. |
|
|
|
You can set the optional ignore_dangling_symlinks flag to true if you |
|
want to silence this exception. Notice that this has no effect on |
|
platforms that don't support os.symlink. |
|
|
|
The optional ignore argument is a callable. If given, it |
|
is called with the `src` parameter, which is the directory |
|
being visited by copytree(), and `names` which is the list of |
|
`src` contents, as returned by os.listdir(): |
|
|
|
callable(src, names) -> ignored_names |
|
|
|
Since copytree() is called recursively, the callable will be |
|
called once for each directory that is copied. It returns a |
|
list of names relative to the `src` directory that should |
|
not be copied. |
|
|
|
The optional copy_function argument is a callable that will be used |
|
to copy each file. It will be called with the source path and the |
|
destination path as arguments. By default, copy2() is used, but any |
|
function that supports the same signature (like copy()) can be used. |
|
|
|
""" |
|
errors = [] |
|
if os.path.isdir(src): |
|
names = os.listdir(src) |
|
if ignore is not None: |
|
ignored_names = ignore(src, names) |
|
else: |
|
ignored_names = set() |
|
|
|
os.makedirs(dst) |
|
for name in names: |
|
if name in ignored_names: |
|
continue |
|
srcname = os.path.join(src, name) |
|
dstname = os.path.join(dst, name) |
|
try: |
|
if os.path.islink(srcname): |
|
linkto = os.readlink(srcname) |
|
if symlinks: |
|
|
|
|
|
|
|
os.symlink(linkto, dstname) |
|
else: |
|
|
|
if not os.path.exists(linkto) and ignore_dangling_symlinks: |
|
continue |
|
|
|
if os.path.isdir(srcname): |
|
slcopytree(srcname, dstname, symlinks, ignore, |
|
copy_function) |
|
else: |
|
copy_function(srcname, dstname) |
|
elif os.path.isdir(srcname): |
|
slcopytree(srcname, dstname, symlinks, ignore, copy_function) |
|
else: |
|
|
|
copy_function(srcname, dstname) |
|
|
|
|
|
except Error as err: |
|
errors.extend(err.args[0]) |
|
except OSError as why: |
|
errors.append((srcname, dstname, str(why))) |
|
else: |
|
copy_function(src, dst) |
|
|
|
if errors: |
|
raise Error(errors) |
|
return dst |
|
|
|
def check_and_copy(src_path, tgt_path): |
|
if os.path.exists(tgt_path): |
|
return None |
|
|
|
return slcopytree(src_path, tgt_path) |
|
|
|
|
|
def remove(srcpath): |
|
if os.path.isdir(srcpath): |
|
return shutil.rmtree(srcpath) |
|
else: |
|
return os.remove(srcpath) |
|
|
|
|
|
def preparing_dataset(pathdict, image_set, args): |
|
start_time = time.time() |
|
dataset_file = args.dataset_file |
|
data_static_info = SLConfig.fromfile('util/static_data_path.py') |
|
static_dict = data_static_info[dataset_file][image_set] |
|
|
|
copyfilelist = [] |
|
for k,tgt_v in pathdict.items(): |
|
if os.path.exists(tgt_v): |
|
if args.local_rank == 0: |
|
print("path <{}> exist. remove it!".format(tgt_v)) |
|
remove(tgt_v) |
|
|
|
|
|
if args.local_rank == 0: |
|
src_v = static_dict[k] |
|
assert isinstance(src_v, str) |
|
if src_v.endswith('.zip'): |
|
|
|
cp_tgt_dir = os.path.dirname(tgt_v) |
|
filename = os.path.basename(src_v) |
|
cp_tgt_path = os.path.join(cp_tgt_dir, filename) |
|
print('Copy from <{}> to <{}>.'.format(src_v, cp_tgt_path)) |
|
os.makedirs(cp_tgt_dir, exist_ok=True) |
|
check_and_copy(src_v, cp_tgt_path) |
|
|
|
|
|
import zipfile |
|
print("Starting unzip <{}>".format(cp_tgt_path)) |
|
with zipfile.ZipFile(cp_tgt_path, 'r') as zip_ref: |
|
zip_ref.extractall(os.path.dirname(cp_tgt_path)) |
|
|
|
copyfilelist.append(cp_tgt_path) |
|
copyfilelist.append(tgt_v) |
|
else: |
|
print('Copy from <{}> to <{}>.'.format(src_v, tgt_v)) |
|
os.makedirs(os.path.dirname(tgt_v), exist_ok=True) |
|
check_and_copy(src_v, tgt_v) |
|
copyfilelist.append(tgt_v) |
|
|
|
if len(copyfilelist) == 0: |
|
copyfilelist = None |
|
args.copyfilelist = copyfilelist |
|
|
|
if args.distributed: |
|
torch.distributed.barrier() |
|
total_time = time.time() - start_time |
|
if copyfilelist: |
|
total_time_str = str(datetime.timedelta(seconds=int(total_time))) |
|
print('Data copy time {}'.format(total_time_str)) |
|
return copyfilelist |
|
|
|
|
|
|