HRNetベースの顔ランドマーク検出ライブラリを用いて画像から顔ランドマークを推定したいと考えています。
(https://github.com/HRNet/HRNet-Facial-Landmark-Detection)
現在、カメラによる顔画像の撮影、撮影された顔画像の前処理、顔ランドマーク推定の3つの処理をそれぞれ別のソースコードで書いているので、これらを1つのプログラム内で実行するプログラム "main.py" を作成しているのですが、処理の途中でなぜか一番最初の処理まで戻ってしまいます。原因が分かる方がいれば教えていただきたいです。
main.py
処理1~処理4にあたるソースコードを順番に呼び出して実行しています。
処理4に入るところでなぜかまた処理1に戻ってしまいます。
※処理1~処理3については問題なく動作したのでソースコードは省略します。
print("\n前回のファイルの削除をしています...") import delete_file delete_file.main() #処理1 print("\n撮影を行います...") import camera camera.main() #処理2 print("\n推定器に入力する画像の前処理を行っています...") from HRNet.tools import get_label get_label.main() #処理3 print("\nランドマークを推定しています...") from HRNet.tools import test test.main() #処理4 #ここでまたprint("\n前回のファイルの削除をしています...")から実行される print("\nお疲れさまでした")
処理4にあたるソースコード
①tools/test.py
なお単体でtest.pyを実行した場合は正しく動作することを確認しています。
import os import pprint import argparse import torch import torch.nn as nn import torch.backends.cudnn as cudnn from torch.utils.data import DataLoader import sys sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) import lib.models as models from lib.config import config, update_config from lib.utils import utils from lib.datasets import get_dataset from lib.core import function def parse_args(): parser = argparse.ArgumentParser(description='Train Face Alignment') parser.add_argument('--cfg', help='experiment configuration filename', type=str, default='HRNet/experiments/300w/face_alignment_300w_hrnet_w18.yaml') parser.add_argument('--model-file', help='model parameters', type=str, default='HRNet/output/300W/face_alignment_300w_hrnet_w18/model1.pth') args = parser.parse_args() update_config(config, args) return args def main(): args = parse_args() #print("ARGS: ", args) logger, final_output_dir, tb_log_dir = \ utils.create_logger(config, args.cfg, 'test') logger.info(pprint.pformat(args)) logger.info(pprint.pformat(config)) cudnn.benchmark = config.CUDNN.BENCHMARK cudnn.determinstic = config.CUDNN.DETERMINISTIC cudnn.enabled = config.CUDNN.ENABLED config.defrost() config.MODEL.INIT_WEIGHTS = False config.freeze() model = models.get_face_alignment_net(config) gpus = list(config.GPUS) model = nn.DataParallel(model, device_ids=gpus).cuda() # load model state_dict = torch.load(args.model_file) if 'state_dict' in state_dict.keys(): state_dict = state_dict['state_dict'] #model.load_state_dict(state_dict) model.load_state_dict(state_dict.state_dict()) else: model.module.load_state_dict(state_dict) dataset_type = get_dataset(config) test_loader = DataLoader( dataset=dataset_type(config, is_train=False), batch_size=config.TEST.BATCH_SIZE_PER_GPU*len(gpus), shuffle=False, num_workers=config.WORKERS, pin_memory=config.PIN_MEMORY ) #ここまでは正常に動作 nme, predictions = function.inference(config, test_loader, model) #ここでprintを実行しても出力されずに処理1に戻る torch.save(predictions, os.path.join(final_output_dir, 'predictions.pth')) if __name__ == '__main__': main()
②lib/core/function.py(test.py内で引用される)
#一部省略しています def inference(config, data_loader, model): batch_time = AverageMeter() data_time = AverageMeter() losses = AverageMeter() num_classes = config.MODEL.NUM_JOINTS predictions = torch.zeros((len(data_loader.dataset), num_classes, 2)) model.eval() nme_count = 0 nme_batch_sum = 0 count_failure_008 = 0 count_failure_010 = 0 end = time.time() with torch.no_grad(): #ここまでは正常に動作 for i, (inp, target, meta) in enumerate(data_loader): #ここでprintを実行しても出力されずに処理1に戻る data_time.update(time.time() - end) output = model(inp) score_map = output.data.cpu() preds = decode_preds(score_map, meta['center'], meta['scale'], [64, 64])
補足情報
OSはWindows10です。
0 コメント