Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
091b88c
Emtions predict
iamilyasedunov Aug 6, 2019
20fe456
Vector of probabilities printed
iamilyasedunov Aug 13, 2019
0b814ce
Problem with filenames are fixed
iamilyasedunov Aug 15, 2019
f197988
spectrograms for public_youtube1120/
Oct 29, 2019
842615b
postprocessing results of classification
iamilyasedunov Apr 8, 2020
8489858
initial structure commit
iamilyasedunov Apr 13, 2020
91e4ce9
creating csv file for dataset added
iamilyasedunov Apr 14, 2020
b28c842
summary statistic function initialized
iamilyasedunov May 10, 2020
ebbb48d
get dataset to train val pytorch models
iamilyasedunov May 18, 2020
4b0ede2
tool for create data tree for transfer learning
iamilyasedunov May 19, 2020
89befd8
tools for cli app
iamilyasedunov May 19, 2020
faafd80
sample of transfer learning
iamilyasedunov May 19, 2020
f7f0834
crop dataset
iamilyasedunov May 20, 2020
b29288a
multi format tool extension
iamilyasedunov May 21, 2020
b6f4c2c
Merge branch 'isedunov' of https://github.com/iamilyasedunov/human_em…
iamilyasedunov May 21, 2020
d777a16
data preprocessing for binary classification sample
iamilyasedunov Jun 13, 2020
0d5bd70
Merge branch 'isedunov' of https://github.com/iamilyasedunov/human_em…
iamilyasedunov Jun 13, 2020
e86eece
cosmetic changes
iamilyasedunov Jun 13, 2020
bc09bf0
binary classification by perceptron
iamilyasedunov Jun 13, 2020
cb9efc2
cosmetic
iamilyasedunov Jun 13, 2020
c5fbf03
data preparation routine, 100 epoch training charts
iamilyasedunov Jun 13, 2020
a463b78
noise reduce ipynb
iamilyasedunov Jul 8, 2020
789eb47
noise reduce sample
iamilyasedunov Jul 8, 2020
ba0c0f8
pipeline savee experiments with augmentations
iamilyasedunov Jul 9, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions cli_tool/create_dataset_train_val.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from utils import tools
import argparse
import importlib
if __name__ == "__main__":
tools = importlib.reload(tools)

parser = argparse.ArgumentParser(description='Optional app description')
# Optional argument
parser.add_argument('--extension', type=str, help='File extension')
parser.add_argument('--per_class', type=int, help='number of samples in per class')
parser.add_argument('--number_of_samples', type=int, help='number of asmples in whole dataset')
parser.add_argument('--path_to_csv', type=str, help='Path to csv with scalled results (example: --path_to_csv "./path/to/result0-100000.csv")')
parser.add_argument('--path_to_data_source', type=str, help='Path to ./public_youtube1120_mp3')
parser.add_argument('--path_to_data_destination', type=str, help='Path to dir with /train, /val subdirs with folders for every emotions')

args = parser.parse_args()

if not '.csv' in args.path_to_csv:
print("Unexpected arg: {}".format(args.path_to_csv))
exit(1)

if args.extension not in ['.png', '.txt', '.wav']:
print("Invalid format argument: {}, must be .png, .txt or .wav".format(args.extension))
exit(1)
print(args.path_to_csv)
print(args.path_to_data_source)
print(args.path_to_data_destination)

tools.get_train_val(args.path_to_csv, args.path_to_data_source, args.path_to_data_destination, args.number_of_samples, args.per_class, args.extension)
173 changes: 173 additions & 0 deletions cli_tool/model_pytorch.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
# License: BSD
# Author: Sasank Chilamkurthy

from __future__ import print_function, division

import torch
import torch.nn as nn
import torch.optim as optim
from torch.optim import lr_scheduler
import numpy as np
import torchvision
from torchvision import datasets, models, transforms
import matplotlib.pyplot as plt
import time
import os
import copy
from utils import tools
import argparse
import importlib

plt.ion() # interactive mode

def train_model(model, criterion, optimizer, scheduler, num_epochs=25):
since = time.time()

best_model_wts = copy.deepcopy(model.state_dict())
best_acc = 0.0

for epoch in range(num_epochs):
print('Epoch {}/{}'.format(epoch, num_epochs - 1))
print('-' * 10)

# Each epoch has a training and validation phase
for phase in ['train', 'val']:
if phase == 'train':
model.train() # Set model to training mode
else:
model.eval() # Set model to evaluate mode

running_loss = 0.0
running_corrects = 0

# Iterate over data.
for inputs, labels in dataloaders[phase]:
inputs = inputs.to(device)
labels = labels.to(device)

# zero the parameter gradients
optimizer.zero_grad()

# forward
# track history if only in train
with torch.set_grad_enabled(phase == 'train'):
outputs = model(inputs)
_, preds = torch.max(outputs, 1)
loss = criterion(outputs, labels)

# backward + optimize only if in training phase
if phase == 'train':
loss.backward()
optimizer.step()

# statistics
running_loss += loss.item() * inputs.size(0)
running_corrects += torch.sum(preds == labels.data)
if phase == 'train':
scheduler.step()

epoch_loss = running_loss / dataset_sizes[phase]
epoch_acc = running_corrects.double() / dataset_sizes[phase]

print('{} Loss: {:.4f} Acc: {:.4f}'.format(
phase, epoch_loss, epoch_acc))

# deep copy the model
if phase == 'val' and epoch_acc > best_acc:
best_acc = epoch_acc
best_model_wts = copy.deepcopy(model.state_dict())

print()

time_elapsed = time.time() - since
print('Training complete in {:.0f}m {:.0f}s'.format(
time_elapsed // 60, time_elapsed % 60))
print('Best val Acc: {:4f}'.format(best_acc))

# load best model weights
model.load_state_dict(best_model_wts)
return model

def visualize_model(model, num_images=6):
was_training = model.training
model.eval()
images_so_far = 0
fig = plt.figure()

with torch.no_grad():
for i, (inputs, labels) in enumerate(dataloaders['val']):
inputs = inputs.to(device)
labels = labels.to(device)

outputs = model(inputs)
_, preds = torch.max(outputs, 1)

for j in range(inputs.size()[0]):
images_so_far += 1
ax = plt.subplot(num_images//2, 2, images_so_far)
ax.axis('off')
ax.set_title('predicted: {}'.format(class_names[preds[j]]))
imshow(inputs.cpu().data[j])

if images_so_far == num_images:
model.train(mode=was_training)
return
model.train(mode=was_training)

if __name__ == "__main__":
tools = importlib.reload(tools)

parser = argparse.ArgumentParser(description='Optional app description')
# Optional argument
parser.add_argument('--path_to_dataset', type=str, help='Path to ./train_val_data')

args = parser.parse_args()

print(args.path_to_dataset)

# Data augmentation and normalization for training
# Just normalization for validation
data_transforms = {
'train': transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),
'val': transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),
}

data_dir = args.path_to_dataset
image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x),
data_transforms[x])
for x in ['train', 'val']}
dataloaders = {x: torch.utils.data.DataLoader(image_datasets[x], batch_size=16,
shuffle=True, num_workers=4)
for x in ['train', 'val']}
dataset_sizes = {x: len(image_datasets[x]) for x in ['train', 'val']}
class_names = image_datasets['train'].classes

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

model_ft = models.resnet18(pretrained=False)
num_ftrs = model_ft.fc.in_features
# Here the size of each output sample is set to 2.
# Alternatively, it can be generalized to nn.Linear(num_ftrs, len(class_names)).
model_ft.fc = nn.Linear(num_ftrs, len(class_names))

model_ft = model_ft.to(device)

criterion = nn.CrossEntropyLoss()

# Observe that all parameters are being optimized
optimizer_ft = optim.SGD(model_ft.parameters(), lr=0.001, momentum=0.9)

# Decay LR by a factor of 0.1 every 7 epochs
exp_lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=3, gamma=0.1)

model_ft = train_model(model_ft, criterion, optimizer_ft, exp_lr_scheduler, num_epochs=25)
Loading