質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

448閲覧

処理の途中で一番最初の処理まで戻ってしまう

S.S_Japan

総合スコア14

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/02/20 06:56

編集2023/02/20 07:00

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です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2023/02/20 07:12

試しにmain.pyの名前を変えてみるとどうなりますか?
TakaiY

2023/02/20 07:37

> #ここでまたprint("\n前回のファイルの削除をしています...")から実行される とありますが、 「前回のファイルの削除をしています...」そのものが2回出力されるということですか? また、分散しているimportを先頭でまとめて実施するとどうなりますか? import delete_file などのことです。
S.S_Japan

2023/02/21 04:59 編集

meg_さん コメントありがとうございます。 main_aaa.py という名前に変更したのですが、結果は変わりませんでした。 TakaiYさん コメントありがとうございます。 最初の質問に関してはおっしゃる通りです。 また、import文を全て先頭に持ってきたのですが、結果は変わりませんでした。 色々試してみたところ、 ``` def main(): if __name__ == '__main__': main() ``` これを追加したらなぜか処理が最初に戻ることなく進みました。 もう少し調査してから質問すればよかったです。 お時間を取ってしまい申し訳ありません。
guest

回答1

0

自己解決

main.pyを以下のように変更し、正しく動作することを確認しました。
コメントをくれた方、ありがとうございました。

import delete_file import camera from HRNet.tools import get_label from HRNet.tools import test def main(): print("\n前回のファイルの削除をしています...") delete_file.main() print("\n撮影を行います...") seekpro_ex.main() print("\n推定器に入力する画像の前処理を行っています...") get_label.main() print("\nランドマークを推定しています...") test.main() print("\nお疲れさまでした") if __name__ == '__main__': main()

投稿2023/02/21 05:01

S.S_Japan

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問