File size: 3,927 Bytes
c83c4e7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ca3ae96
c83c4e7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ca3ae96
c83c4e7
 
 
 
 
ca3ae96
c83c4e7
 
 
ca3ae96
 
 
 
c83c4e7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import random
import subprocess
import glob
import torch
import os
import sys
import numpy as np
import pickle

from torch import nn
from torch.utils.data import TensorDataset, DataLoader
from helper import CNN
from helper import helper

def main():
    raw_data_path = r".\data"
    categories = {
        "emblems": [0, 1, 2],
        "illustrators": [3, 4],
        "regulators": [5, 6, 7],
        "adaptors": [8],
        "affect display": [9, 10, 11]
    }

    num_subsets = 30
    num_actions_low = 5
    num_actions_high = 12
    action_numbers = []

    result_dict = {}

    for idx in range(num_subsets):
	    action_numbers.append(random.randint(num_actions_low, num_actions_high))

    test_list = ['CC01', 'CM10']

    for idx in range(num_subsets):
        actions = helper.select_samples(categories, action_numbers[idx])
        helper.extract_keypoints(actions, raw_data_path, test_list, idx)
        print("------------------------------")
        print(f"Experiment {idx}:")
        print(f"Activities: {actions}")
        print(f"Finished extracting keypoint data for experiment_{idx}...")
        config_file_path = os.path.join(f".\experiment\experiment_{idx}", f"DUET_experiment_{idx}_config.py")
        result = subprocess.run([sys.executable, r".\mmaction2\tools\train.py", config_file_path, '--seed', '42'])
        print(f"Finished training ST-GCN for experiment_{idx}...")

        checkpoint_file_path = glob.glob(os.path.join(".\work_dirs", f"DUET_experiment_{idx}_config", "best_acc_top1_epoch_*.pth"))
        device = "cuda"
        pickle_path = os.path.join(f".\experiment\experiment_{idx}", f"experiment_{idx}.pkl")
        helper.extract_features(config_file_path, checkpoint_file_path[0], pickle_path, device, idx, test_list)
        print(f"Finished extracting hidden features for experiment_{idx}...")

        features_train = np.load(os.path.join(f".\experiment\experiment_{idx}", "train.npy"))
        activity_train = np.load(os.path.join(f".\experiment\experiment_{idx}", "train_label.npy"))
        features_test = np.load(os.path.join(f".\experiment\experiment_{idx}", "gtest.npy"))
        activity_test = np.load(os.path.join(f".\experiment\experiment_{idx}", "g_label.npy"))
        features_train = np.reshape(features_train, (features_train.shape[0], 1, features_train.shape[1]))
        features_test = np.reshape(features_test, (features_test.shape[0], 1, features_test.shape[1]))

        taxonomy = {0: 4, 1: 4, 2: 4, 3: 3, 4: 3, 5: 0, 6: 0, 7: 0, 8: 2, 9: 1, 10: 1, 11: 1}
        labels_train = np.copy(activity_train)
        labels_test = np.copy(activity_test)
        for key, value in iter(taxonomy.items()):
            labels_train[activity_train==key] = value
            labels_test[activity_test==key] = value

        train_set = TensorDataset(torch.tensor(features_train), torch.tensor(labels_train))
        test_set = TensorDataset(torch.tensor(features_test), torch.tensor(labels_test))
        train_dataloader = DataLoader(train_set, batch_size=32, shuffle=False)
        test_dataloader = DataLoader(test_set, batch_size=32, shuffle=False)

        model = CNN.NeuralNetwork(features_train.shape[2], num_classes=5)
        model.to(device)
        loss_fn = nn.CrossEntropyLoss()
        optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)

        epochs = 5
        for t in range(epochs):
            print(f"Epoch {t+1}\n-------------------------------")
            CNN.train(train_dataloader, model, loss_fn, optimizer)
        test_accuracy = CNN.test(test_dataloader, model, loss_fn)

        result_dict[idx] = {"experiment_num": idx, "num_activities": len(actions), "actions": actions, "accuracy": test_accuracy}
        print(f"Finished training CNN for experiment_{idx}...")
    
    with open("experiment_results.pkl", "wb") as file: 
        pickle.dump(result_dict, file)


if __name__ == "__main__":
    main()