├── code ├── model │ ├── __pycache__ │ │ ├── __init__.cpython-36.pyc │ │ └── resnet50.cpython-36.pyc │ └── resnet50.py ├── dataset │ ├── __pycache__ │ │ ├── __init__.cpython-36.pyc │ │ └── dataset_processing.cpython-36.pyc │ ├── dataset_processing.py │ ├── dataset.py~ │ └── dataset_processing.py.py~ ├── transforms │ ├── __pycache__ │ │ ├── utils.cpython-36.pyc │ │ ├── __init__.cpython-36.pyc │ │ ├── affine_transforms.cpython-36.pyc │ │ ├── image_transforms.cpython-36.pyc │ │ └── tensor_transforms.cpython-36.pyc │ ├── __init__.py │ ├── distortion_transforms.py │ ├── utils.py │ └── image_transforms.py ├── utils │ ├── genLD.py │ ├── utils.py │ ├── skl_MAUC.py │ ├── KLDivLoss.py │ ├── MAUC.py │ └── report.py ├── test_doctor.py ├── train.py └── doctor-results │ ├── expertb2.txt │ ├── junior_b.txt │ ├── junior_a.txt │ ├── general_a.txt │ ├── expert_b.txt │ ├── general_b.txt │ └── expert_a.txt └── README.md /code/model/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpwu95/LDL/HEAD/code/model/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /code/model/__pycache__/resnet50.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpwu95/LDL/HEAD/code/model/__pycache__/resnet50.cpython-36.pyc -------------------------------------------------------------------------------- /code/dataset/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpwu95/LDL/HEAD/code/dataset/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /code/transforms/__pycache__/utils.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpwu95/LDL/HEAD/code/transforms/__pycache__/utils.cpython-36.pyc -------------------------------------------------------------------------------- /code/transforms/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpwu95/LDL/HEAD/code/transforms/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /code/dataset/__pycache__/dataset_processing.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpwu95/LDL/HEAD/code/dataset/__pycache__/dataset_processing.cpython-36.pyc -------------------------------------------------------------------------------- /code/transforms/__pycache__/affine_transforms.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpwu95/LDL/HEAD/code/transforms/__pycache__/affine_transforms.cpython-36.pyc -------------------------------------------------------------------------------- /code/transforms/__pycache__/image_transforms.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpwu95/LDL/HEAD/code/transforms/__pycache__/image_transforms.cpython-36.pyc -------------------------------------------------------------------------------- /code/transforms/__pycache__/tensor_transforms.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpwu95/LDL/HEAD/code/transforms/__pycache__/tensor_transforms.cpython-36.pyc -------------------------------------------------------------------------------- /code/transforms/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | from __future__ import absolute_import 3 | 4 | from .affine_transforms import * 5 | from .image_transforms import * 6 | from .tensor_transforms import * -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Joint Acne Image Grading and Counting via Label Distribution Learning 2 | Pytorch implementation of "Joint Acne Image Grading and Counting via Label Distribution Learning" 3 | 4 | This work was accepted by ICCV 2019 [[paper](http://xiaopingwu.cn/assets/paper/iccv2019_ldl.pdf)]. 5 | 6 | ### ACNE04 Dataset 7 | 8 | The ACNE04 dataset can be downloaded from [Baidu](https://pan.baidu.com/s/15JQlymnhnEmEt8Q5zpJQDw) (pw: fbrm) or [Google](https://drive.google.com/drive/folders/18yJcHXhzOv7H89t-Lda6phheAicLqMuZ?usp=sharing). 9 | 10 | ### Additional Information 11 | If you find this work helpful, please cite it as 12 | ``` 13 | @InProceedings{Wu_2019_ICCV, 14 | author = {Wu, Xiaoping and Ni, Wen and Jie, Liang and Lai, Yu-Kun and Cheng, Dongyu, She and Ming-Ming and Yang, Jufeng}, 15 | title = {Joint Acne Image Grading and Counting via Label Distribution Learning}, 16 | booktitle = {IEEE International Conference on Computer Vision}, 17 | year = {2019} 18 | } 19 | ``` 20 | 21 | ATTN: This work is free for academic usage. For other purposes, please contact Xiaoping Wu (xpwu95@163.com). 22 | -------------------------------------------------------------------------------- /code/utils/genLD.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import math 3 | 4 | ''' 5 | function ld = genAgeLd(label, sigma, loss) 6 | % genernate label distribution 7 | label_set = 1:4; 8 | switch loss 9 | case 'klloss' 10 | ld_num = length(label_set); 11 | 12 | dif_age = bsxfun(@minus,label_set',repmat(label,ld_num,1)); 13 | 14 | ld = 1./repmat(sqrt(2*pi)*sigma,ld_num,1).*exp(-(dif_age).^2./repmat(2*sigma.^2,ld_num,1)); 15 | 16 | ld = bsxfun(@times, ld, 1./sum(ld)); 17 | case 'smloss' 18 | ld = round(label); 19 | case {'l1', 'l2'} 20 | ld = 2/84.*(label-1) -1; 21 | end 22 | ''' 23 | 24 | # generate label distribution 25 | def genLD(label, sigma, loss, class_num): 26 | label_set = np.array(range(class_num)) 27 | if loss == 'klloss': 28 | ld_num = len(label_set) 29 | dif_age = np.tile(label_set.reshape(ld_num, 1), (1, len(label))) - np.tile(label, (ld_num, 1)) 30 | ld = 1.0 / np.tile(np.sqrt(2.0 * np.pi) * sigma, (ld_num, 1)) * np.exp(-1.0 * np.power(dif_age, 2) / np.tile(2.0 * np.power(sigma, 2), (ld_num, 1))) 31 | ld = ld / np.sum(ld, 0) 32 | 33 | return ld.transpose() 34 | 35 | 36 | # label = np.array([1, 3, 3, 3]) 37 | # sigma = np.array([1, 2.9, 3.0, 4.0]) 38 | # loss = 'klloss' 39 | # print(genLD(label, sigma, loss, 4)) 40 | # 41 | -------------------------------------------------------------------------------- /code/dataset/dataset_processing.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import os 3 | from PIL import Image 4 | from torch.utils.data.dataset import Dataset 5 | import numpy as np 6 | 7 | class DatasetProcessing(Dataset): 8 | def __init__(self, data_path, img_filename, transform=None): 9 | self.img_path = data_path 10 | self.transform = transform 11 | # reading img file from file 12 | img_filepath = img_filename 13 | fp = open(img_filepath, 'r') 14 | 15 | self.img_filename = [] 16 | self.labels = [] 17 | self.lesions = [] 18 | for line in fp.readlines(): 19 | filename, label, lesion = line.split() 20 | self.img_filename.append(filename) 21 | self.labels.append(int(label)) 22 | self.lesions.append(int(lesion)) 23 | # self.img_filename = [x.strip() for x in fp] 24 | fp.close() 25 | self.img_filename = np.array(self.img_filename) 26 | self.labels = np.array(self.labels)#.reshape(-1, 1) 27 | self.lesions = np.array(self.lesions)#.reshape(-1, 1) 28 | 29 | if 'NNEW_trainval' in img_filename: 30 | ratio = 1.0#0.1 31 | import random 32 | random.seed(42) 33 | indexes = [] 34 | for i in range(4): 35 | index = random.sample(list(np.where(self.labels == i)[0]), int(len(np.where(self.labels == i)[0]) * ratio)) 36 | indexes.extend(index) 37 | self.img_filename = self.img_filename[indexes] 38 | self.labels = self.labels[indexes] 39 | self.lesions = self.lesions[indexes] 40 | 41 | # reading labels from file 42 | # label_filepath = os.path.join(data_path, label_filename) 43 | # labels = np.loadtxt(label_filepath, dtype=np.int64) 44 | 45 | # self.label = labels 46 | 47 | def __getitem__(self, index): 48 | img = Image.open(os.path.join(self.img_path, self.img_filename[index])) 49 | img = img.convert('RGB') 50 | if self.transform is not None: 51 | img = self.transform(img) 52 | name = self.img_filename[index] 53 | label = torch.from_numpy(np.array(self.labels[index])) 54 | lesion = torch.from_numpy(np.array(self.lesions[index])) 55 | return img, label, lesion#, name 56 | def __len__(self): 57 | return len(self.img_filename) 58 | 59 | -------------------------------------------------------------------------------- /code/utils/utils.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from torch.nn import init 3 | import torch.nn as nn 4 | 5 | 6 | # evaluate meters 7 | class AverageMeter(object): 8 | """Computes and stores the average and current value""" 9 | def __init__(self): 10 | self.reset() 11 | 12 | def reset(self): 13 | self.val = 0 14 | self.avg = 0 15 | self.sum = 0 16 | self.count = 0 17 | 18 | def update(self, val, n=1): 19 | self.val = val 20 | self.sum += val * n 21 | self.count += n 22 | self.avg = self.sum / self.count 23 | 24 | 25 | # print logger 26 | class Logger(object): 27 | def __init__(self): 28 | self.terminal = sys.stdout #stdout 29 | self.file = None 30 | 31 | def open(self, file, mode=None): 32 | if mode is None: mode ='w' 33 | self.file = open(file, mode) 34 | 35 | def write(self, message, is_terminal=1, is_file=1 ): 36 | if '\r' in message: is_file=0 37 | 38 | if is_terminal == 1: 39 | self.terminal.write(message) 40 | self.terminal.flush() 41 | #time.sleep(1) 42 | 43 | if is_file == 1: 44 | self.file.write(message) 45 | self.file.flush() 46 | 47 | def flush(self): 48 | # this flush method is needed for python 3 compatibility. 49 | # this handles the flush command by doing nothing. 50 | # you might want to specify some extra behavior here. 51 | pass 52 | 53 | 54 | def time_to_str(t, mode='min'): 55 | if mode=='min': 56 | t = int(t)/60 57 | hr = t//60 58 | min = t%60 59 | return '%2d hr %02d min'%(hr,min) 60 | 61 | elif mode=='sec': 62 | t = int(t) 63 | min = t//60 64 | sec = t%60 65 | return '%2d min %02d sec'%(min,sec) 66 | 67 | 68 | else: 69 | raise NotImplementedError 70 | 71 | 72 | def weights_init(m): 73 | if isinstance(m, nn.Conv2d): 74 | init.kaiming_normal(m.weight, mode='fan_out') 75 | if m.bias is not None: 76 | init.constant(m.bias, 0) 77 | elif isinstance(m, nn.BatchNorm2d) or isinstance(m, nn.BatchNorm1d): 78 | init.constant(m.weight, 1) 79 | init.constant(m.bias, 0) 80 | elif isinstance(m, nn.Linear): 81 | init.normal(m.weight, std=0.001) 82 | if m.bias is not None: 83 | init.constant(m.bias, 0) 84 | -------------------------------------------------------------------------------- /code/utils/skl_MAUC.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from scipy import interp 3 | #import matplotlib.pyplot as plt 4 | from itertools import cycle 5 | from sklearn.metrics import roc_curve, auc 6 | 7 | def skl_MAUC(y_test, y_score, n_classes): 8 | # Compute ROC curve and ROC area for each class 9 | fpr = dict() 10 | tpr = dict() 11 | roc_auc = dict() 12 | for i in range(n_classes): 13 | fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])#,pos_label=i) 14 | roc_auc[i] = auc(fpr[i], tpr[i]) 15 | 16 | # Compute micro-average ROC curve and ROC area 17 | fpr["micro"], tpr["micro"], _ = roc_curve(y_test.ravel(), y_score.ravel()) 18 | roc_auc["micro"] = auc(fpr["micro"], tpr["micro"]) 19 | 20 | # Compute macro-average ROC curve and ROC area 21 | # First aggregate all false positive rates 22 | all_fpr = np.unique(np.concatenate([fpr[i] for i in range(n_classes)])) 23 | # Then interpolate all ROC curves at this points 24 | mean_tpr = np.zeros_like(all_fpr) 25 | for i in range(n_classes): 26 | mean_tpr += interp(all_fpr, fpr[i], tpr[i]) 27 | # Finally average it and compute AUC 28 | mean_tpr /= n_classes 29 | fpr["macro"] = all_fpr 30 | tpr["macro"] = mean_tpr 31 | roc_auc["macro"] = auc(fpr["macro"], tpr["macro"]) 32 | 33 | ''' 34 | # Plot all ROC curves 35 | plt.figure() 36 | lw = 2 37 | plt.plot(fpr["micro"], tpr["micro"], 38 | label='micro-average ROC curve (area = {0:0.2f})' 39 | ''.format(roc_auc["micro"]), 40 | color='deeppink', linestyle=':', linewidth=4) 41 | 42 | plt.plot(fpr["macro"], tpr["macro"], 43 | label='macro-average ROC curve (area = {0:0.2f})' 44 | ''.format(roc_auc["macro"]), 45 | color='navy', linestyle=':', linewidth=4) 46 | 47 | colors = cycle(['aqua', 'darkorange', 'cornflowerblue']) 48 | for i, color in zip(range(n_classes), colors): 49 | plt.plot(fpr[i], tpr[i], color=color, lw=lw, 50 | label='ROC curve of class {0} (area = {1:0.2f})' 51 | ''.format(i, roc_auc[i])) 52 | 53 | plt.plot([0, 1], [0, 1], 'k--', lw=lw) 54 | plt.xlim([0.0, 1.0]) 55 | plt.ylim([0.0, 1.05]) 56 | plt.xlabel('False Positive Rate') 57 | plt.ylabel('True Positive Rate') 58 | plt.title('Some extension of Receiver operating characteristic to multi-class') 59 | plt.legend(loc="lower right") 60 | plt.show() 61 | ''' 62 | 63 | return roc_auc["micro"], roc_auc["macro"] 64 | -------------------------------------------------------------------------------- /code/utils/KLDivLoss.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | import torch.nn.functional as F 4 | 5 | 6 | class KLDivLoss(nn.Module): 7 | r"""The `Kullback-Leibler divergence`_ Loss 8 | 9 | KL divergence is a useful distance measure for continuous distributions 10 | and is often useful when performing direct regression over the space of 11 | (discretely sampled) continuous output distributions. 12 | 13 | As with `NLLLoss`, the `input` given is expected to contain 14 | *log-probabilities*, however unlike `ClassNLLLoss`, `input` is not 15 | restricted to a 2D Tensor, because the criterion is applied element-wise. 16 | 17 | This criterion expects a `target` `Tensor` of the same size as the 18 | `input` `Tensor`. 19 | 20 | The loss can be described as: 21 | 22 | .. math:: 23 | \ell(x, y) = L = \{l_1,\dots,l_N\}^\top, \quad 24 | l_n = y_n \odot \left( \log y_n - x_n \right), 25 | 26 | where :math:`N` is the batch size. If reduce is ``True``, then: 27 | 28 | .. math:: 29 | \ell(x, y) = \begin{cases} 30 | \operatorname{mean}(L), & \text{if}\; \text{size_average} = \text{True},\\ 31 | \operatorname{sum}(L), & \text{if}\; \text{size_average} = \text{False}. 32 | \end{cases} 33 | 34 | By default, the losses are averaged for each minibatch over observations 35 | **as well as** over dimensions. However, if the field 36 | `size_average` is set to ``False``, the losses are instead summed. 37 | 38 | .. _Kullback-Leibler divergence: 39 | https://en.wikipedia.org/wiki/Kullback-Leibler_divergence 40 | 41 | Args: 42 | size_average (bool, optional: By default, the losses are averaged 43 | for each minibatch over observations **as well as** over 44 | dimensions. However, if ``False`` the losses are instead summed. 45 | reduce (bool, optional): By default, the losses are averaged 46 | over observations for each minibatch, or summed, depending on 47 | size_average. When reduce is ``False``, returns a loss per input/target 48 | element instead and ignores size_average. Default: ``True`` 49 | 50 | Shape: 51 | - input: :math:`(N, *)` where `*` means, any number of additional 52 | dimensions 53 | - target: :math:`(N, *)`, same shape as the input 54 | - output: scalar. If `reduce` is ``True``, then :math:`(N, *)`, 55 | same shape as the input 56 | 57 | """ 58 | def __init__(self): 59 | super(KLDivLoss, self).__init__() 60 | self.size_average = True 61 | self.reduce = False 62 | 63 | def forward(self, input, target, lad): 64 | kl_divs = F.kl_div(torch.log(input), target, size_average=self.size_average, reduce=self.reduce) 65 | batch_size, class_num = kl_divs.shape 66 | max, index = torch.max(target, 1) 67 | weights = 1 + (1 - max) ** lad # ** torch.abs(input[index] - target) 68 | kl_divs = torch.mean(torch.mean(kl_divs, 1) * weights) 69 | 70 | return kl_divs 71 | -------------------------------------------------------------------------------- /code/utils/MAUC.py: -------------------------------------------------------------------------------- 1 | """ 2 | MAUCpy 3 | ~~~~~~ 4 | 5 | Contains two equations from Hand and Till's 2001 paper on a multi-class 6 | approach to the AUC. The a_value() function is the probabilistic approximation 7 | of the AUC found in equation 3, while MAUC() is the pairwise averaging of this 8 | value for each of the classes. This is equation 7 in their paper. 9 | """ 10 | import itertools 11 | 12 | def a_value(probabilities, zero_label=0, one_label=1): 13 | """ 14 | Approximates the AUC by the method described in Hand and Till 2001, 15 | equation 3. 16 | 17 | NB: The class labels should be in the set [0,n-1] where n = # of classes. 18 | The class probability should be at the index of its label in the 19 | probability list. 20 | 21 | I.e. With 3 classes the labels should be 0, 1, 2. The class probability 22 | for class '1' will be found in index 1 in the class probability list 23 | wrapped inside the zipped list with the labels. 24 | 25 | Args: 26 | probabilities (list): A zipped list of the labels and the 27 | class probabilities in the form (m = # data instances): 28 | [(label1, [p(x1c1), p(x1c2), ... p(x1cn)]), 29 | (label2, [p(x2c1), p(x2c2), ... p(x2cn)]) 30 | ... 31 | (labelm, [p(xmc1), p(xmc2), ... (pxmcn)]) 32 | ] 33 | zero_label (optional, int): The label to use as the class '0'. 34 | Must be an integer, see above for details. 35 | one_label (optional, int): The label to use as the class '1'. 36 | Must be an integer, see above for details. 37 | 38 | Returns: 39 | The A-value as a floating point. 40 | """ 41 | # Obtain a list of the probabilities for the specified zero label class 42 | expanded_points = [] 43 | for instance in probabilities: 44 | if instance[0] == zero_label or instance[0] == one_label: 45 | expanded_points.append((instance[0], instance[1][zero_label])) 46 | sorted_ranks = sorted(expanded_points, key=lambda x: x[1]) 47 | 48 | n0, n1, sum_ranks = 0, 0, 0 49 | # Iterate through ranks and increment counters for overall count and ranks of class 0 50 | for index, point in enumerate(sorted_ranks): 51 | if point[0] == zero_label: 52 | n0 += 1 53 | sum_ranks += index + 1 # Add 1 as ranks are one-based 54 | elif point[0] == one_label: 55 | n1 += 1 56 | else: 57 | pass # Not interested in this class 58 | 59 | return (sum_ranks - (n0*(n0+1)/2.0)) / float(n0 * n1) # Eqn 3 60 | 61 | 62 | def MAUC(data, num_classes): 63 | """ 64 | Calculates the MAUC over a set of multi-class probabilities and 65 | their labels. This is equation 7 in Hand and Till's 2001 paper. 66 | 67 | NB: The class labels should be in the set [0,n-1] where n = # of classes. 68 | The class probability should be at the index of its label in the 69 | probability list. 70 | 71 | I.e. With 3 classes the labels should be 0, 1, 2. The class probability 72 | for class '1' will be found in index 1 in the class probability list 73 | wrapped inside the zipped list with the labels. 74 | 75 | Args: 76 | data (list): A zipped list (NOT A GENERATOR) of the labels and the 77 | class probabilities in the form (m = # data instances): 78 | [(label1, [p(x1c1), p(x1c2), ... p(x1cn)]), 79 | (label2, [p(x2c1), p(x2c2), ... p(x2cn)]) 80 | ... 81 | (labelm, [p(xmc1), p(xmc2), ... (pxmcn)]) 82 | ] 83 | num_classes (int): The number of classes in the dataset. 84 | 85 | Returns: 86 | The MAUC as a floating point value. 87 | """ 88 | # Find all pairwise comparisons of labels 89 | class_pairs = [x for x in itertools.combinations(range(num_classes), 2)] 90 | 91 | # Have to take average of A value with both classes acting as label 0 as this 92 | # gives different outputs for more than 2 classes 93 | sum_avals = 0 94 | for pairing in class_pairs: 95 | sum_avals += (a_value(data, zero_label=pairing[0], one_label=pairing[1]) + 96 | a_value(data, zero_label=pairing[1], one_label=pairing[0]))# / 2.0 97 | 98 | #sum_avals = sum_avals * 2 99 | sum_avals = sum_avals / float(num_classes) 100 | sum_avals = sum_avals / float(num_classes - 1) 101 | return sum_avals 102 | #return sum_avals * (2 / float(num_classes * (num_classes-1))) # Eqn 7 -------------------------------------------------------------------------------- /code/utils/report.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Wed Oct 10 17:04:18 2018 4 | 5 | @author: Kunimitsu Tezuka 6 | """ 7 | 8 | import numpy as np 9 | from sklearn.metrics import accuracy_score 10 | from .metrics import sensitivity_specificity_support, specificity_score, sensitivity_score 11 | 12 | 13 | def creat_class_name(classNumber): 14 | number = [] 15 | for i in range(classNumber): 16 | number.append('class'+str(i)) 17 | return number 18 | 19 | 20 | def report_precision_se_sp_yi(y_predicitions, groundture): 21 | class_list1 = np.unique(groundture) 22 | Result = [] 23 | SE, SP, _ = sensitivity_specificity_support(groundture, y_predicitions) 24 | YI = SE + SP - 1 25 | for i in range(class_list1.shape[0]): 26 | local_1 = [k for k in range(len(y_predicitions)) if y_predicitions[k]==class_list1[i]] 27 | y_pred1 = [y_predicitions[k] for k in local_1] 28 | y_true1 = [groundture[k] for k in local_1] 29 | pre = accuracy_score(y_true1,y_pred1) 30 | Result.append([pre,SE[i],SP[i],YI[i]]) 31 | AVE_ACC = accuracy_score(groundture,y_predicitions) 32 | AVE_Pre = np.mean(Result,0)[0] 33 | AVE_SE = sensitivity_score(groundture,y_predicitions,average='macro') 34 | AVE_SP = specificity_score(groundture,y_predicitions,average='macro') 35 | AVE_YI = AVE_SE+AVE_SP-1 36 | Result.append([AVE_Pre,AVE_SE,AVE_SP,AVE_YI]) 37 | target_names = creat_class_name(len(Result)-1) 38 | last_line_heading = 'avg / total' 39 | name_width = max(len(cn) for cn in target_names) 40 | width = max(name_width, len(last_line_heading), 3) 41 | target_names.append(last_line_heading) 42 | headers = ["Precision", "SE", "SP", "YI"] 43 | fmt = '%% %ds' % width # first column: class name 44 | fmt += " " 45 | fmt += ' '.join(['% 9s' for _ in headers]) 46 | fmt += '\n' 47 | headers = [""] + headers 48 | report = fmt % tuple(headers) 49 | for i in range(len(Result)): 50 | fmt1 = '%% %ds' % width 51 | fmt1 += " " 52 | fmt1 += ' '.join(['% 9s' for _ in Result[i]]) 53 | fmt1 += '\n' 54 | values = [] 55 | for j in (Result[i]): 56 | values+=["{0:0.{1}f}".format(j, 4)] 57 | tmp = fmt1%tuple([target_names[i]]+values) 58 | report+=tmp 59 | head = ['AVE_ACC'] 60 | fmt1 = '%% %ds' % width 61 | fmt1 += " " 62 | fmt1 += ' '.join(['% 9s' for _ in head]) 63 | fmt1 += '%% %ds'%width 64 | fmt1 += ' '.join(['%s' for _ in [AVE_ACC]]) 65 | value = ["{0:0.{1}f}".format(AVE_ACC, 4)] 66 | report += fmt1%tuple(["",'AVE_ACC','']+value) 67 | report += '\n' 68 | # print(report) 69 | return Result, AVE_ACC, report 70 | 71 | def report_mae_mse(y_ture, y_predicitions,classification): 72 | classed = np.unique(classification) 73 | target_name = creat_class_name(classed.shape[0]) 74 | target_name.append('avg / total') 75 | name_width = max(len(cn) for cn in target_name) 76 | headers = ['MAE','MSE'] 77 | fmt = '%% %ds' % name_width # first column: class name 78 | fmt += " " 79 | fmt += ' '.join(['% 9s' for _ in headers]) 80 | fmt += '\n' 81 | headers = ['']+headers 82 | report = fmt%tuple(headers) 83 | Result = [] 84 | for i in range(classed.shape[0]): 85 | local_list = [k for k in range(len(classification)) if classification[k]==classed[i]] 86 | y_ture_class_i = [y_ture[j] for j in local_list] 87 | y_predicitions_class_i = [y_predicitions[k] for k in local_list] 88 | w =np.array(y_predicitions_class_i)-np.array(y_ture_class_i) 89 | MAE = np.mean(np.abs(w)) 90 | MSE = np.sqrt(np.mean(w*w)) 91 | Result.append([MAE,MSE]) 92 | fmt1 = '%% %ds' % name_width 93 | fmt1 += " " 94 | fmt1 += ' '.join(['% 9s' for _ in Result[i]]) 95 | fmt1 += '\n' 96 | values = [] 97 | for j in (Result[i]): 98 | values += ["{0:0.{1}f}".format(j, 4)] 99 | tmp = fmt1 % tuple([target_name[i]] + values) 100 | report += tmp 101 | w = np.array(y_ture) - np.array(y_predicitions) 102 | MAE = np.mean(np.abs(w)) 103 | MSE = np.sqrt(np.mean(w * w)) 104 | Result.append([MAE, MSE]) 105 | fmt1 = '%% %ds' % name_width 106 | fmt1 += " " 107 | fmt1 += ' '.join(['% 9s' for _ in Result[i]]) 108 | fmt1 += '\n' 109 | values = [] 110 | i = len(Result)-1 111 | for j in (Result[i]): 112 | values += ["{0:0.{1}f}".format(j, 4)] 113 | tmp = fmt1 % tuple([target_name[i]] + values) 114 | report += tmp 115 | # print(report) 116 | return Result, MAE, MSE, report 117 | 118 | -------------------------------------------------------------------------------- /code/test_doctor.py: -------------------------------------------------------------------------------- 1 | # library 2 | # standard library 3 | import os, sys 4 | 5 | # third-party library 6 | import numpy as np 7 | import collections 8 | import torch 9 | import torch.nn as nn 10 | import torch.nn.functional as F 11 | from torchvision import transforms 12 | from torch.utils.data import DataLoader 13 | from dataset import dataset_processing 14 | # import torchvision 15 | from timeit import default_timer as timer 16 | from utils.report import report_precision_se_sp_yi, report_mae_mse 17 | from utils.utils import Logger, AverageMeter, time_to_str, weights_init 18 | from utils.genLD import genLD 19 | from model.resnet50 import resnet50 20 | import torch.backends.cudnn as cudnn 21 | # torch.manual_seed(1) # reproducible 22 | from transforms.affine_transforms import * 23 | import time 24 | import warnings 25 | warnings.filterwarnings("ignore") 26 | import os 27 | os.environ["CUDA_VISIBLE_DEVICES"] = "0" 28 | import shutil 29 | 30 | 31 | # Hyper Parameters 32 | EPOCH = 50 # train the training data n times, to save time, we just train 1 epoch 33 | STEP_SIZE = 30 34 | BATCH_SIZE = 1 35 | BATCH_SIZE_TEST = 1 36 | LR = 0.001 # learning rate 37 | NUM_WORKERS = 8 38 | NUM_CLASSES = 4 39 | LOG_FILE_NAME = './logs/log_' + time.strftime("%Y-%m-%d_%H:%M:%S", time.localtime()) + '.log' 40 | lr_steps = [30, 60, 90, 120] 41 | 42 | np.random.seed(42) 43 | # DATA_PATH = '/home/ubuntu3/cly/cly_web/sxx/data/sd/images/' 44 | # TRAIN_FILE = '/home/ubuntu3/cly/cly_web/sxx/data/sd/train.txt' 45 | # TEST_FILE = '/home/ubuntu3/cly/cly_web/sxx/data/sd/val.txt' 46 | 47 | # log_file = open(LOG_FILE_NAME, 'a+') 48 | # orig_stdout = sys.stdout 49 | # sys.stdout = log_file 50 | 51 | log = Logger() 52 | log.open(LOG_FILE_NAME, mode="a") 53 | 54 | 55 | data_dir = 'doctor-results/' 56 | doctors = ['expert_a.txt', 'expertb2.txt', 'junior_a.txt', 'junior_b.txt', 'general_a.txt', 'general_b.txt', ] 57 | 58 | cross_val_lists = ['0']#, '1', '2', '3', '4'] 59 | 60 | for i in range(3): 61 | 62 | imgs_a, preds_a = np.loadtxt(data_dir + doctors[2 * i], dtype=np.str, usecols=[1, 2]).T 63 | imgs_b, preds_b = np.loadtxt(data_dir + doctors[2 * i + 1], dtype=np.str, usecols=[1, 2]).T 64 | 65 | preds_a[np.where(preds_a == 'A')[0]] = 0 66 | preds_a[np.where(preds_a == 'B')[0]] = 1 67 | preds_a[np.where(preds_a == 'C')[0]] = 2 68 | preds_a[np.where(preds_a == 'D')[0]] = 3 69 | preds_a = preds_a.astype(int) 70 | 71 | preds_b[np.where(preds_b == 'A')[0]] = 0 72 | preds_b[np.where(preds_b == 'B')[0]] = 1 73 | preds_b[np.where(preds_b == 'C')[0]] = 2 74 | preds_b[np.where(preds_b == 'D')[0]] = 3 75 | preds_b = preds_b.astype(int) 76 | 77 | imgs = imgs_b # np.hstack((imgs_a, imgs_b)) 78 | preds = preds_b # np.hstack((preds_a, preds_b)) 79 | 80 | AVE_ACC = [] 81 | Precision = [] 82 | SE = [] 83 | SP = [] 84 | YI = [] 85 | for cross_val_index in cross_val_lists: 86 | # log.write('\n\ncross_val_index: ' + cross_val_index + '\n\n') 87 | 88 | TRAIN_FILE = '/home/ubuntu3/wxp/datasets/acne4/VOCdevkit2007/VOC2007/ImageSets/Main/NNEW_trainval_' + cross_val_index + '.txt' 89 | TEST_FILE = '/home/ubuntu3/wxp/datasets/acne4/VOCdevkit2007/VOC2007/ImageSets/Main/NNEW_test_' + cross_val_index + '.txt' 90 | 91 | imgs_train, labels_train = np.loadtxt(TRAIN_FILE, dtype=np.str, usecols=[0, 1]).T 92 | labels_train = labels_train.astype(int) 93 | 94 | imgs_test, labels_test = np.loadtxt(TEST_FILE, dtype=np.str, usecols=[0, 1]).T 95 | labels_test = labels_test.astype(int) 96 | 97 | imgs_train_test = np.hstack((imgs_train, imgs_test)) 98 | labels_train_test = np.hstack((labels_train, labels_test)) 99 | 100 | # y_pred = preds[np.array([imgs.tolist().index(j) for j in imgs_test])] 101 | # y_true = labels_test 102 | # y_pred = preds[np.array([imgs.tolist().index(j) for j in imgs_train_test])] 103 | # y_true = labels_train_test 104 | 105 | y_true = labels_train_test[np.array([imgs_train_test.tolist().index(j) for j in imgs])] 106 | y_pred = preds 107 | 108 | Result, AVE_ACC_, pre_se_sp_yi_report = report_precision_se_sp_yi(y_pred, y_true) 109 | 110 | Precision_, SE_, SP_, YI_ = Result[4] 111 | AVE_ACC.append(AVE_ACC_) 112 | Precision.append(Precision_) 113 | SE.append(SE_) 114 | SP.append(SP_) 115 | YI.append(YI_) 116 | 117 | log.write(str(pre_se_sp_yi_report) + '\n') 118 | 119 | log.write('pre:%.4f se:%.4f sp:%.4f yi:%.4f acc:%.4f\n' % (np.array(Precision).mean(), np.array(SE).mean(), 120 | np.array(SP).mean(), np.array(YI).mean(), 121 | np.array(AVE_ACC).mean())) 122 | log.write('pre:%.4f se:%.4f sp:%.4f yi:%.4f acc:%.4f\n' % (np.array(Precision).std(), np.array(SE).std(), 123 | np.array(SP).std(), np.array(YI).std(), 124 | np.array(AVE_ACC).std())) 125 | log.write('\n###########################################\n') 126 | 127 | -------------------------------------------------------------------------------- /code/transforms/distortion_transforms.py: -------------------------------------------------------------------------------- 1 | """ 2 | Transforms to distort local or global information of an image 3 | """ 4 | 5 | 6 | import torch as th 7 | import numpy as np 8 | import random 9 | 10 | 11 | class Scramble(object): 12 | """ 13 | Create blocks of an image and scramble them 14 | """ 15 | def __init__(self, blocksize): 16 | self.blocksize = blocksize 17 | 18 | def __call__(self, *inputs): 19 | outputs = [] 20 | for idx, _input in enumerate(inputs): 21 | size = _input.size() 22 | img_height = size[1] 23 | img_width = size[2] 24 | 25 | x_blocks = int(img_height/self.blocksize) # number of x blocks 26 | y_blocks = int(img_width/self.blocksize) 27 | ind = th.randperm(x_blocks*y_blocks) 28 | 29 | new = th.zeros(_input.size()) 30 | count = 0 31 | for i in range(x_blocks): 32 | for j in range (y_blocks): 33 | row = int(ind[count] / x_blocks) 34 | column = ind[count] % x_blocks 35 | new[:, i*self.blocksize:(i+1)*self.blocksize, j*self.blocksize:(j+1)*self.blocksize] = \ 36 | _input[:, row*self.blocksize:(row+1)*self.blocksize, column*self.blocksize:(column+1)*self.blocksize] 37 | count += 1 38 | outputs.append(new) 39 | return outputs if idx > 1 else outputs[0] 40 | 41 | 42 | class RandomChoiceScramble(object): 43 | 44 | def __init__(self, blocksizes): 45 | self.blocksizes = blocksizes 46 | 47 | def __call__(self, *inputs): 48 | blocksize = random.choice(self.blocksizes) 49 | outputs = Scramble(blocksize=blocksize)(*inputs) 50 | return outputs 51 | 52 | 53 | def _blur_image(image, H): 54 | # break image up into its color components 55 | size = image.shape 56 | imr = image[0,:,:] 57 | img = image[1,:,:] 58 | imb = image[2,:,:] 59 | 60 | # compute Fourier transform and frequqnecy spectrum 61 | Fim1r = np.fft.fftshift(np.fft.fft2(imr)) 62 | Fim1g = np.fft.fftshift(np.fft.fft2(img)) 63 | Fim1b = np.fft.fftshift(np.fft.fft2(imb)) 64 | 65 | # Apply the lowpass filter to the Fourier spectrum of the image 66 | filtered_imager = np.multiply(H, Fim1r) 67 | filtered_imageg = np.multiply(H, Fim1g) 68 | filtered_imageb = np.multiply(H, Fim1b) 69 | 70 | newim = np.zeros(size) 71 | 72 | # convert the result to the spatial domain. 73 | newim[0,:,:] = np.absolute(np.real(np.fft.ifft2(filtered_imager))) 74 | newim[1,:,:] = np.absolute(np.real(np.fft.ifft2(filtered_imageg))) 75 | newim[2,:,:] = np.absolute(np.real(np.fft.ifft2(filtered_imageb))) 76 | 77 | return newim.astype('uint8') 78 | 79 | def _butterworth_filter(rows, cols, thresh, order): 80 | # X and Y matrices with ranges normalised to +/- 0.5 81 | array1 = np.ones(rows) 82 | array2 = np.ones(cols) 83 | array3 = np.arange(1,rows+1) 84 | array4 = np.arange(1,cols+1) 85 | 86 | x = np.outer(array1, array4) 87 | y = np.outer(array3, array2) 88 | 89 | x = x - float(cols/2) - 1 90 | y = y - float(rows/2) - 1 91 | 92 | x = x / cols 93 | y = y / rows 94 | 95 | radius = np.sqrt(np.square(x) + np.square(y)) 96 | 97 | matrix1 = radius/thresh 98 | matrix2 = np.power(matrix1, 2*order) 99 | f = np.reciprocal(1 + matrix2) 100 | 101 | return f 102 | 103 | 104 | class Blur(object): 105 | """ 106 | Blur an image with a Butterworth filter with a frequency 107 | cutoff matching local block size 108 | """ 109 | def __init__(self, threshold, order=5): 110 | """ 111 | scramble blocksize of 128 => filter threshold of 64 112 | scramble blocksize of 64 => filter threshold of 32 113 | scramble blocksize of 32 => filter threshold of 16 114 | scramble blocksize of 16 => filter threshold of 8 115 | scramble blocksize of 8 => filter threshold of 4 116 | """ 117 | self.threshold = threshold 118 | self.order = order 119 | 120 | def __call__(self, *inputs): 121 | """ 122 | inputs should have values between 0 and 255 123 | """ 124 | outputs = [] 125 | for idx, _input in enumerate(inputs): 126 | rows = _input.size(1) 127 | cols = _input.size(2) 128 | fc = self.threshold # threshold 129 | fs = 128.0 # max frequency 130 | n = self.order # filter order 131 | fc_rad = (fc/fs)*0.5 132 | H = _butterworth_filter(rows, cols, fc_rad, n) 133 | _input_blurred = _blur_image(_input.numpy().astype('uint8'), H) 134 | _input_blurred = th.from_numpy(_input_blurred).float() 135 | outputs.append(_input_blurred) 136 | 137 | return outputs if idx > 1 else outputs[0] 138 | 139 | 140 | class RandomChoiceBlur(object): 141 | 142 | def __init__(self, thresholds, order=5): 143 | """ 144 | thresholds = [64.0, 32.0, 16.0, 8.0, 4.0] 145 | """ 146 | self.thresholds = thresholds 147 | self.order = order 148 | 149 | def __call__(self, *inputs): 150 | threshold = random.choice(self.thresholds) 151 | outputs = Blur(threshold=threshold, order=self.order)(*inputs) 152 | return outputs 153 | 154 | 155 | 156 | 157 | 158 | 159 | -------------------------------------------------------------------------------- /code/dataset/dataset.py~: -------------------------------------------------------------------------------- 1 | """Multi-label dataloader 2 | """ 3 | from .config import HOME 4 | import os.path as osp 5 | import sys 6 | import torch 7 | import torch.utils.data as data 8 | import cv2 9 | import numpy as np 10 | if sys.version_info[0] == 2: 11 | import xml.etree.cElementTree as ET 12 | else: 13 | import xml.etree.ElementTree as ET 14 | 15 | VOC_CLASSES = ( # always index 0 16 | 'aeroplane', 'bicycle', 'bird', 'boat', 17 | 'bottle', 'bus', 'car', 'cat', 'chair', 18 | 'cow', 'diningtable', 'dog', 'horse', 19 | 'motorbike', 'person', 'pottedplant', 20 | 'sheep', 'sofa', 'train', 'tvmonitor') 21 | 22 | # note: if you used our download scripts, this should be right 23 | VOC_ROOT = osp.join(HOME, "data/VOCdevkit/") 24 | 25 | 26 | class VOCAnnotationTransform(object): 27 | """Transforms a VOC annotation into a Tensor of bbox coords and label index 28 | Initilized with a dictionary lookup of classnames to indexes 29 | 30 | Arguments: 31 | class_to_ind (dict, optional): dictionary lookup of classnames -> indexes 32 | (default: alphabetic indexing of VOC's 20 classes) 33 | keep_difficult (bool, optional): keep difficult instances or not 34 | (default: False) 35 | height (int): height 36 | width (int): width 37 | """ 38 | 39 | def __init__(self, class_to_ind=None, keep_difficult=False): 40 | self.class_to_ind = class_to_ind or dict( 41 | zip(VOC_CLASSES, range(len(VOC_CLASSES)))) 42 | self.keep_difficult = keep_difficult 43 | 44 | def __call__(self, target, width, height): 45 | """ 46 | Arguments: 47 | target (annotation) : the target annotation to be made usable 48 | will be an ET.Element 49 | Returns: 50 | a list containing lists of bounding boxes [bbox coords, class name] 51 | """ 52 | res = [] 53 | for obj in target.iter('object'): 54 | difficult = int(obj.find('difficult').text) == 1 55 | if not self.keep_difficult and difficult: 56 | continue 57 | name = obj.find('name').text.lower().strip() 58 | bbox = obj.find('bndbox') 59 | 60 | pts = ['xmin', 'ymin', 'xmax', 'ymax'] 61 | bndbox = [] 62 | for i, pt in enumerate(pts): 63 | cur_pt = int(bbox.find(pt).text) - 1 64 | # scale height or width 65 | cur_pt = cur_pt / width if i % 2 == 0 else cur_pt / height 66 | bndbox.append(cur_pt) 67 | label_idx = self.class_to_ind[name] 68 | bndbox.append(label_idx) 69 | res += [bndbox] # [xmin, ymin, xmax, ymax, label_ind] 70 | # img_id = target.find('filename').text[:-4] 71 | 72 | return res # [[xmin, ymin, xmax, ymax, label_ind], ... ] 73 | 74 | 75 | class VOCDetection(data.Dataset): 76 | """VOC Detection Dataset Object 77 | 78 | input is image, target is annotation 79 | 80 | Arguments: 81 | root (string): filepath to VOCdevkit folder. 82 | image_set (string): imageset to use (eg. 'train', 'val', 'test') 83 | transform (callable, optional): transformation to perform on the 84 | input image 85 | target_transform (callable, optional): transformation to perform on the 86 | target `annotation` 87 | (eg: take in caption string, return tensor of word indices) 88 | dataset_name (string, optional): which dataset to load 89 | (default: 'VOC2007') 90 | """ 91 | 92 | def __init__(self, root, 93 | image_sets=[('2007', 'trainval'), ('2012', 'trainval')], 94 | transform=None, target_transform=VOCAnnotationTransform(), 95 | dataset_name='VOC0712'): 96 | self.root = root 97 | self.image_set = image_sets 98 | self.transform = transform 99 | self.target_transform = target_transform 100 | self.name = dataset_name 101 | self._annopath = osp.join('%s', 'Annotations', '%s.xml') 102 | self._imgpath = osp.join('%s', 'JPEGImages', '%s.jpg') 103 | self.ids = list() 104 | for (year, name) in image_sets: 105 | rootpath = osp.join(self.root, 'VOC' + year) 106 | for line in open(osp.join(rootpath, 'ImageSets', 'Main', name + '.txt')): 107 | self.ids.append((rootpath, line.strip())) 108 | 109 | def __getitem__(self, index): 110 | im, gt, h, w = self.pull_item(index) 111 | 112 | return im, gt 113 | 114 | def __len__(self): 115 | return len(self.ids) 116 | 117 | def pull_item(self, index): 118 | img_id = self.ids[index] 119 | 120 | target = ET.parse(self._annopath % img_id).getroot() 121 | img = cv2.imread(self._imgpath % img_id) 122 | height, width, channels = img.shape 123 | 124 | if self.target_transform is not None: 125 | target = self.target_transform(target, width, height) 126 | 127 | if self.transform is not None: 128 | target = np.array(target) 129 | img, boxes, labels = self.transform(img, target[:, :4], target[:, 4]) 130 | # to rgb 131 | img = img[:, :, (2, 1, 0)] 132 | # img = img.transpose(2, 0, 1) 133 | target = np.hstack((boxes, np.expand_dims(labels, axis=1))) 134 | return torch.from_numpy(img).permute(2, 0, 1), target, height, width 135 | # return torch.from_numpy(img), target, height, width 136 | 137 | def pull_image(self, index): 138 | '''Returns the original image object at index in PIL form 139 | 140 | Note: not using self.__getitem__(), as any transformations passed in 141 | could mess up this functionality. 142 | 143 | Argument: 144 | index (int): index of img to show 145 | Return: 146 | PIL img 147 | ''' 148 | img_id = self.ids[index] 149 | return cv2.imread(self._imgpath % img_id, cv2.IMREAD_COLOR) 150 | 151 | def pull_anno(self, index): 152 | '''Returns the original annotation of image at index 153 | 154 | Note: not using self.__getitem__(), as any transformations passed in 155 | could mess up this functionality. 156 | 157 | Argument: 158 | index (int): index of img to get annotation of 159 | Return: 160 | list: [img_id, [(label, bbox coords),...]] 161 | eg: ('001718', [('dog', (96, 13, 438, 332))]) 162 | ''' 163 | img_id = self.ids[index] 164 | anno = ET.parse(self._annopath % img_id).getroot() 165 | gt = self.target_transform(anno, 1, 1) 166 | return img_id[1], gt 167 | 168 | def pull_tensor(self, index): 169 | '''Returns the original image at an index in tensor form 170 | 171 | Note: not using self.__getitem__(), as any transformations passed in 172 | could mess up this functionality. 173 | 174 | Argument: 175 | index (int): index of img to show 176 | Return: 177 | tensorized version of img, squeezed 178 | ''' 179 | return torch.Tensor(self.pull_image(index)).unsqueeze_(0) 180 | -------------------------------------------------------------------------------- /code/dataset/dataset_processing.py.py~: -------------------------------------------------------------------------------- 1 | """Multi-label dataloader 2 | """ 3 | from .config import HOME 4 | import os.path as osp 5 | import sys 6 | import torch 7 | import torch.utils.data as data 8 | import cv2 9 | import numpy as np 10 | if sys.version_info[0] == 2: 11 | import xml.etree.cElementTree as ET 12 | else: 13 | import xml.etree.ElementTree as ET 14 | 15 | VOC_CLASSES = ( # always index 0 16 | 'aeroplane', 'bicycle', 'bird', 'boat', 17 | 'bottle', 'bus', 'car', 'cat', 'chair', 18 | 'cow', 'diningtable', 'dog', 'horse', 19 | 'motorbike', 'person', 'pottedplant', 20 | 'sheep', 'sofa', 'train', 'tvmonitor') 21 | 22 | # note: if you used our download scripts, this should be right 23 | VOC_ROOT = osp.join(HOME, "data/VOCdevkit/") 24 | 25 | 26 | class VOCAnnotationTransform(object): 27 | """Transforms a VOC annotation into a Tensor of bbox coords and label index 28 | Initilized with a dictionary lookup of classnames to indexes 29 | 30 | Arguments: 31 | class_to_ind (dict, optional): dictionary lookup of classnames -> indexes 32 | (default: alphabetic indexing of VOC's 20 classes) 33 | keep_difficult (bool, optional): keep difficult instances or not 34 | (default: False) 35 | height (int): height 36 | width (int): width 37 | """ 38 | 39 | def __init__(self, class_to_ind=None, keep_difficult=False): 40 | self.class_to_ind = class_to_ind or dict( 41 | zip(VOC_CLASSES, range(len(VOC_CLASSES)))) 42 | self.keep_difficult = keep_difficult 43 | 44 | def __call__(self, target, width, height): 45 | """ 46 | Arguments: 47 | target (annotation) : the target annotation to be made usable 48 | will be an ET.Element 49 | Returns: 50 | a list containing lists of bounding boxes [bbox coords, class name] 51 | """ 52 | res = [] 53 | for obj in target.iter('object'): 54 | difficult = int(obj.find('difficult').text) == 1 55 | if not self.keep_difficult and difficult: 56 | continue 57 | name = obj.find('name').text.lower().strip() 58 | bbox = obj.find('bndbox') 59 | 60 | pts = ['xmin', 'ymin', 'xmax', 'ymax'] 61 | bndbox = [] 62 | for i, pt in enumerate(pts): 63 | cur_pt = int(bbox.find(pt).text) - 1 64 | # scale height or width 65 | cur_pt = cur_pt / width if i % 2 == 0 else cur_pt / height 66 | bndbox.append(cur_pt) 67 | label_idx = self.class_to_ind[name] 68 | bndbox.append(label_idx) 69 | res += [bndbox] # [xmin, ymin, xmax, ymax, label_ind] 70 | # img_id = target.find('filename').text[:-4] 71 | 72 | return res # [[xmin, ymin, xmax, ymax, label_ind], ... ] 73 | 74 | 75 | class VOCDetection(data.Dataset): 76 | """VOC Detection Dataset Object 77 | 78 | input is image, target is annotation 79 | 80 | Arguments: 81 | root (string): filepath to VOCdevkit folder. 82 | image_set (string): imageset to use (eg. 'train', 'val', 'test') 83 | transform (callable, optional): transformation to perform on the 84 | input image 85 | target_transform (callable, optional): transformation to perform on the 86 | target `annotation` 87 | (eg: take in caption string, return tensor of word indices) 88 | dataset_name (string, optional): which dataset to load 89 | (default: 'VOC2007') 90 | """ 91 | 92 | def __init__(self, root, 93 | image_sets=[('2007', 'trainval'), ('2012', 'trainval')], 94 | transform=None, target_transform=VOCAnnotationTransform(), 95 | dataset_name='VOC0712'): 96 | self.root = root 97 | self.image_set = image_sets 98 | self.transform = transform 99 | self.target_transform = target_transform 100 | self.name = dataset_name 101 | self._annopath = osp.join('%s', 'Annotations', '%s.xml') 102 | self._imgpath = osp.join('%s', 'JPEGImages', '%s.jpg') 103 | self.ids = list() 104 | for (year, name) in image_sets: 105 | rootpath = osp.join(self.root, 'VOC' + year) 106 | for line in open(osp.join(rootpath, 'ImageSets', 'Main', name + '.txt')): 107 | self.ids.append((rootpath, line.strip())) 108 | 109 | def __getitem__(self, index): 110 | im, gt, h, w = self.pull_item(index) 111 | 112 | return im, gt 113 | 114 | def __len__(self): 115 | return len(self.ids) 116 | 117 | def pull_item(self, index): 118 | img_id = self.ids[index] 119 | 120 | target = ET.parse(self._annopath % img_id).getroot() 121 | img = cv2.imread(self._imgpath % img_id) 122 | height, width, channels = img.shape 123 | 124 | if self.target_transform is not None: 125 | target = self.target_transform(target, width, height) 126 | 127 | if self.transform is not None: 128 | target = np.array(target) 129 | img, boxes, labels = self.transform(img, target[:, :4], target[:, 4]) 130 | # to rgb 131 | img = img[:, :, (2, 1, 0)] 132 | # img = img.transpose(2, 0, 1) 133 | target = np.hstack((boxes, np.expand_dims(labels, axis=1))) 134 | return torch.from_numpy(img).permute(2, 0, 1), target, height, width 135 | # return torch.from_numpy(img), target, height, width 136 | 137 | def pull_image(self, index): 138 | '''Returns the original image object at index in PIL form 139 | 140 | Note: not using self.__getitem__(), as any transformations passed in 141 | could mess up this functionality. 142 | 143 | Argument: 144 | index (int): index of img to show 145 | Return: 146 | PIL img 147 | ''' 148 | img_id = self.ids[index] 149 | return cv2.imread(self._imgpath % img_id, cv2.IMREAD_COLOR) 150 | 151 | def pull_anno(self, index): 152 | '''Returns the original annotation of image at index 153 | 154 | Note: not using self.__getitem__(), as any transformations passed in 155 | could mess up this functionality. 156 | 157 | Argument: 158 | index (int): index of img to get annotation of 159 | Return: 160 | list: [img_id, [(label, bbox coords),...]] 161 | eg: ('001718', [('dog', (96, 13, 438, 332))]) 162 | ''' 163 | img_id = self.ids[index] 164 | anno = ET.parse(self._annopath % img_id).getroot() 165 | gt = self.target_transform(anno, 1, 1) 166 | return img_id[1], gt 167 | 168 | def pull_tensor(self, index): 169 | '''Returns the original image at an index in tensor form 170 | 171 | Note: not using self.__getitem__(), as any transformations passed in 172 | could mess up this functionality. 173 | 174 | Argument: 175 | index (int): index of img to show 176 | Return: 177 | tensorized version of img, squeezed 178 | ''' 179 | return torch.Tensor(self.pull_image(index)).unsqueeze_(0) 180 | -------------------------------------------------------------------------------- /code/train.py: -------------------------------------------------------------------------------- 1 | # library 2 | # standard library 3 | import os, sys 4 | 5 | # third-party library 6 | import numpy as np 7 | import collections 8 | import torch 9 | import torch.nn as nn 10 | import torch.nn.functional as F 11 | from torchvision import transforms 12 | from torch.utils.data import DataLoader 13 | from dataset import dataset_processing 14 | from timeit import default_timer as timer 15 | from utils.report import report_precision_se_sp_yi, report_mae_mse 16 | from utils.utils import Logger, AverageMeter, time_to_str, weights_init 17 | from utils.genLD import genLD 18 | from model.resnet50 import resnet50 19 | import torch.backends.cudnn as cudnn 20 | from transforms.affine_transforms import * 21 | import time 22 | import warnings 23 | warnings.filterwarnings("ignore") 24 | import os 25 | os.environ["CUDA_VISIBLE_DEVICES"] = "1" 26 | 27 | 28 | # Hyper Parameters 29 | BATCH_SIZE = 32 30 | BATCH_SIZE_TEST = 20 31 | LR = 0.001 # learning rate 32 | NUM_WORKERS = 12 33 | NUM_CLASSES = 4 34 | LOG_FILE_NAME = './logs/log_' + time.strftime("%Y-%m-%d_%H:%M:%S", time.localtime()) + '.log' 35 | lr_steps = [30, 60, 90, 120] 36 | 37 | np.random.seed(42) 38 | 39 | DATA_PATH = '/home/ubuntu5/wxp/datasets/acne4/VOCdevkit2007/VOC2007/JPEGImages_300' 40 | 41 | log = Logger() 42 | log.open(LOG_FILE_NAME, mode="a") 43 | 44 | 45 | def criterion(lesions_num): 46 | if lesions_num <= 5: 47 | return 0 48 | elif lesions_num <= 20: 49 | return 1 50 | elif lesions_num <= 50: 51 | return 2 52 | else: 53 | return 3 54 | 55 | 56 | def trainval_test(cross_val_index, sigma, lam): 57 | 58 | TRAIN_FILE = '/home/ubuntu5/wxp/datasets/acne4/VOCdevkit2007/VOC2007/ImageSets/Main/NNEW_trainval_' + cross_val_index + '.txt' 59 | TEST_FILE = '/home/ubuntu5/wxp/datasets/acne4/VOCdevkit2007/VOC2007/ImageSets/Main/NNEW_test_' + cross_val_index + '.txt' 60 | 61 | normalize = transforms.Normalize(mean=[0.45815152, 0.361242, 0.29348266], 62 | std=[0.2814769, 0.226306, 0.20132513]) 63 | 64 | dset_train = dataset_processing.DatasetProcessing( 65 | DATA_PATH, TRAIN_FILE, transform=transforms.Compose([ 66 | transforms.Scale((256, 256)), 67 | transforms.RandomCrop(224), 68 | transforms.RandomHorizontalFlip(), 69 | transforms.ToTensor(), 70 | RandomRotate(rotation_range=20), 71 | normalize, 72 | ])) 73 | 74 | dset_test = dataset_processing.DatasetProcessing( 75 | DATA_PATH, TEST_FILE, transform=transforms.Compose([ 76 | transforms.Scale((224, 224)), 77 | transforms.ToTensor(), 78 | normalize, 79 | ])) 80 | 81 | train_loader = DataLoader(dset_train, 82 | batch_size=BATCH_SIZE, 83 | shuffle=True, 84 | num_workers=NUM_WORKERS, 85 | pin_memory=True) 86 | 87 | test_loader = DataLoader(dset_test, 88 | batch_size=BATCH_SIZE_TEST, 89 | shuffle=False, 90 | num_workers=NUM_WORKERS, 91 | pin_memory=True) 92 | 93 | cnn = resnet50().cuda() 94 | cudnn.benchmark = True 95 | 96 | params = [] 97 | new_param_names = ['fc', 'counting'] 98 | for key, value in dict(cnn.named_parameters()).items(): 99 | if value.requires_grad: 100 | if any(i in key for i in new_param_names): 101 | params += [{'params': [value], 'lr': LR * 1.0, 'weight_decay': 5e-4}] 102 | else: 103 | params += [{'params': [value], 'lr': LR * 1.0, 'weight_decay': 5e-4}] 104 | 105 | optimizer = torch.optim.SGD(params, momentum=0.9) # 106 | 107 | loss_func = nn.CrossEntropyLoss().cuda() 108 | kl_loss_1 = nn.KLDivLoss().cuda() 109 | kl_loss_2 = nn.KLDivLoss().cuda() 110 | kl_loss_3 = nn.KLDivLoss().cuda() 111 | 112 | def adjust_learning_rate_new(optimizer, decay=0.5): 113 | """Sets the learning rate to the initial LR decayed by 0.5 every 20 epochs""" 114 | for param_group in optimizer.param_groups: 115 | param_group['lr'] = decay * param_group['lr'] 116 | 117 | # training and testing 118 | start = timer() 119 | test_acc_his = 0.7 120 | test_mae_his = 8 121 | test_mse_his = 18 122 | for epoch in range(lr_steps[-1]):#(EPOCH):# 123 | 124 | if epoch in lr_steps: 125 | adjust_learning_rate_new(optimizer, 0.5) 126 | # scheduler.step(epoch) 127 | 128 | losses_cls = AverageMeter() 129 | losses_cou = AverageMeter() 130 | losses_cou2cls = AverageMeter() 131 | losses = AverageMeter() 132 | # ''' 133 | cnn.train() 134 | for step, (b_x, b_y, b_l) in enumerate(train_loader): # gives batch data, normalize x when iterate train_loader 135 | 136 | b_x = b_x.cuda() 137 | b_l = b_l.numpy() 138 | 139 | # generating ld 140 | b_l = b_l - 1 141 | ld = genLD(b_l, sigma, 'klloss', 65) 142 | ld_4 = np.vstack((np.sum(ld[:, :5], 1), np.sum(ld[:, 5:20], 1), np.sum(ld[:, 20:50], 1), np.sum(ld[:, 50:], 1))).transpose() 143 | ld = torch.from_numpy(ld).cuda().float() 144 | ld_4 = torch.from_numpy(ld_4).cuda().float() 145 | 146 | # train 147 | cnn.train() 148 | 149 | cls, cou, cou2cls = cnn(b_x, None)nn output 150 | loss_cls = kl_loss_1(torch.log(cls), ld_4) * 4.0 151 | loss_cou = kl_loss_2(torch.log(cou), ld) * 65.0 152 | loss_cls_cou = kl_loss_3(torch.log(cou2cls), ld_4) * 4.0 153 | loss = (loss_cls + loss_cls_cou) * 0.5 * lam + loss_cou * (1.0 - lam) 154 | optimizer.zero_grad() # clear gradients for this training step 155 | loss.backward() # backpropagation, compute gradients 156 | optimizer.step() # apply gradients 157 | 158 | losses_cls.update(loss_cls.item(), b_x.size(0)) 159 | losses_cou.update(loss_cou.item(), b_x.size(0)) 160 | losses_cou2cls.update(loss_cls_cou.item(), b_x.size(0)) 161 | losses.update(loss.item(), b_x.size(0)) 162 | message = '%s %6.0f | %0.3f | %0.3f | %0.3f | %0.3f | %s\n' % ( \ 163 | "train", epoch, 164 | losses_cls.avg, 165 | losses_cou.avg, 166 | losses_cou2cls.avg, 167 | losses.avg, 168 | time_to_str((timer() - start), 'min')) 169 | # print(message) 170 | log.write(message) 171 | # ''' 172 | if epoch >= 9: 173 | with torch.no_grad(): 174 | test_loss = 0 175 | test_corrects = 0 176 | y_true = np.array([]) 177 | y_pred = np.array([]) 178 | y_pred_m = np.array([]) 179 | l_true = np.array([]) 180 | l_pred = np.array([]) 181 | cnn.eval() 182 | for step, (test_x, test_y, test_l) in enumerate(test_loader): # gives batch data, normalize x when iterate train_loader 183 | 184 | test_x = test_x.cuda() 185 | test_y = test_y.cuda() 186 | 187 | y_true = np.hstack((y_true, test_y.data.cpu().numpy())) 188 | l_true = np.hstack((l_true, test_l.data.cpu().numpy())) 189 | 190 | cnn.eval() 191 | 192 | cls, cou, cou2cls = cnn(test_x, None) 193 | 194 | loss = loss_func(cou2cls, test_y) 195 | test_loss += loss.data 196 | 197 | _, preds_m = torch.max(cls + cou2cls, 1) 198 | _, preds = torch.max(cls, 1) 199 | # preds = preds.data.cpu().numpy() 200 | y_pred = np.hstack((y_pred, preds.data.cpu().numpy())) 201 | y_pred_m = np.hstack((y_pred_m, preds_m.data.cpu().numpy())) 202 | 203 | _, preds_l = torch.max(cou, 1) 204 | preds_l = (preds_l + 1).data.cpu().numpy() 205 | # preds_l = cou2cou.data.cpu().numpy() 206 | l_pred = np.hstack((l_pred, preds_l)) 207 | 208 | batch_corrects = torch.sum((preds == test_y)).data.cpu().numpy() 209 | test_corrects += batch_corrects 210 | 211 | test_loss = test_loss.float() / len(test_loader) 212 | test_acc = test_corrects / len(test_loader.dataset)#3292 #len(test_loader) 213 | message = '%s %6.1f | %0.3f | %0.3f\n' % ( \ 214 | "test ", epoch, 215 | test_loss.data, 216 | test_acc) 217 | 218 | _, _, pre_se_sp_yi_report = report_precision_se_sp_yi(y_pred, y_true) 219 | _, _, pre_se_sp_yi_report_m = report_precision_se_sp_yi(y_pred_m, y_true) 220 | _, MAE, MSE, mae_mse_report = report_mae_mse(l_true, l_pred, y_true) 221 | 222 | if True: 223 | log.write(str(pre_se_sp_yi_report) + '\n') 224 | log.write(str(pre_se_sp_yi_report_m) + '\n') 225 | log.write(str(mae_mse_report) + '\n') 226 | 227 | 228 | cross_val_lists = ['0', '1', '2', '3', '4'] 229 | for cross_val_index in cross_val_lists: 230 | log.write('\n\ncross_val_index: ' + cross_val_index + '\n\n') 231 | if True: 232 | trainval_test(cross_val_index, sigma=30 * 0.1, lam=6 * 0.1) 233 | -------------------------------------------------------------------------------- /code/model/resnet50.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | import math 4 | import torch.utils.model_zoo as model_zoo 5 | from torch.nn import init 6 | import torch.nn.functional as F 7 | import numpy as np 8 | 9 | 10 | __all__ = ['ResNet', 'resnet18', 'resnet34', 'resnet50', 'resnet101', 11 | 'resnet152'] 12 | 13 | 14 | model_urls = { 15 | 'resnet18': 'https://download.pytorch.org/models/resnet18-5c106cde.pth', 16 | 'resnet34': 'https://download.pytorch.org/models/resnet34-333f7ec4.pth', 17 | 'resnet50': 'https://download.pytorch.org/models/resnet50-19c8e357.pth', 18 | 'resnet101': 'https://download.pytorch.org/models/resnet101-5d3b4d8f.pth', 19 | 'resnet152': 'https://download.pytorch.org/models/resnet152-b121ed2d.pth', 20 | } 21 | 22 | 23 | def conv3x3(in_planes, out_planes, stride=1): 24 | """3x3 convolution with padding""" 25 | return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, 26 | padding=1, bias=False) 27 | 28 | 29 | class BasicBlock(nn.Module): 30 | expansion = 1 31 | 32 | def __init__(self, inplanes, planes, stride=1, downsample=None): 33 | super(BasicBlock, self).__init__() 34 | self.conv1 = conv3x3(inplanes, planes, stride) 35 | self.bn1 = nn.BatchNorm2d(planes) 36 | self.relu = nn.ReLU(inplace=True) 37 | self.conv2 = conv3x3(planes, planes) 38 | self.bn2 = nn.BatchNorm2d(planes) 39 | self.downsample = downsample 40 | self.stride = stride 41 | 42 | def forward(self, x): 43 | residual = x 44 | 45 | out = self.conv1(x) 46 | out = self.bn1(out) 47 | out = self.relu(out) 48 | 49 | out = self.conv2(out) 50 | out = self.bn2(out) 51 | 52 | if self.downsample is not None: 53 | residual = self.downsample(x) 54 | 55 | out += residual 56 | out = self.relu(out) 57 | 58 | return out 59 | 60 | 61 | class Bottleneck(nn.Module): 62 | expansion = 4 63 | 64 | def __init__(self, inplanes, planes, stride=1, downsample=None): 65 | super(Bottleneck, self).__init__() 66 | self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False) 67 | self.bn1 = nn.BatchNorm2d(planes) 68 | self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, 69 | padding=1, bias=False) 70 | self.bn2 = nn.BatchNorm2d(planes) 71 | self.conv3 = nn.Conv2d(planes, planes * 4, kernel_size=1, bias=False) 72 | self.bn3 = nn.BatchNorm2d(planes * 4) 73 | self.relu = nn.ReLU(inplace=True) 74 | self.downsample = downsample 75 | self.stride = stride 76 | 77 | def forward(self, x): 78 | residual = x 79 | 80 | out = self.conv1(x) 81 | out = self.bn1(out) 82 | out = self.relu(out) 83 | 84 | out = self.conv2(out) 85 | out = self.bn2(out) 86 | out = self.relu(out) 87 | 88 | out = self.conv3(out) 89 | out = self.bn3(out) 90 | 91 | if self.downsample is not None: 92 | residual = self.downsample(x) 93 | 94 | out += residual 95 | out = self.relu(out) 96 | 97 | return out 98 | 99 | 100 | def weights_init(m): 101 | if isinstance(m, nn.Conv2d): 102 | init.kaiming_normal(m.weight, mode='fan_out') 103 | if m.bias is not None: 104 | init.constant(m.bias, 0) 105 | elif isinstance(m, nn.BatchNorm2d) or isinstance(m, nn.BatchNorm1d): 106 | init.constant(m.weight, 1) 107 | init.constant(m.bias, 0) 108 | elif isinstance(m, nn.Linear): 109 | init.normal(m.weight, std=0.001) 110 | if m.bias is not None: 111 | init.constant(m.bias, 0) 112 | 113 | 114 | class ResNet(nn.Module): 115 | 116 | def __init__(self, block, layers, num_classes=1000): 117 | self.inplanes = 64 118 | super(ResNet, self).__init__() 119 | self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3, 120 | bias=False) 121 | self.bn1 = nn.BatchNorm2d(64) 122 | self.relu = nn.ReLU(inplace=True) 123 | self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) 124 | self.layer1 = self._make_layer(block, 64, layers[0]) 125 | self.layer2 = self._make_layer(block, 128, layers[1], stride=2) 126 | self.layer3 = self._make_layer(block, 256, layers[2], stride=2) 127 | self.layer4 = self._make_layer(block, 512, layers[3], stride=2) 128 | self.avgpool = nn.AvgPool2d(7, stride=1) 129 | self.fc = nn.Linear(512 * block.expansion, num_classes) 130 | 131 | self.load_state_dict(model_zoo.load_url(model_urls['resnet50'])) 132 | 133 | # for m in self.modules(): 134 | # if isinstance(m, nn.Conv2d): 135 | # n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels 136 | # m.weight.data.normal_(0, math.sqrt(2. / n)) 137 | # elif isinstance(m, nn.BatchNorm2d): 138 | # m.weight.data.fill_(1) 139 | # m.bias.data.zero_() 140 | 141 | # self.avgpool = nn.Sequential(nn.AdaptiveAvgPool2d(4), nn.AdaptiveMaxPool2d(1)) 142 | # self.fc.apply(weights_init) 143 | # 144 | 145 | self.avgpool = nn.AdaptiveAvgPool2d(1) 146 | 147 | self.fc = nn.Linear(512 * block.expansion, 4) 148 | # self.fc = nn.Sequential(nn.Linear(2048, 512), 149 | # nn.ReLU(inplace=True), 150 | # nn.Dropout(p=0.5), 151 | # nn.Linear(512, 4)) 152 | self.fc.apply(weights_init) 153 | 154 | self.counting = nn.Linear(512 * block.expansion, 65) 155 | # self.counting = nn.Sequential(nn.Linear(2048, 512), 156 | # nn.ReLU(inplace=True), 157 | # nn.Dropout(p=0.5), 158 | # nn.Linear(512, 65)) 159 | self.counting.apply(weights_init) 160 | 161 | def set_bn_fix(m): 162 | classname = m.__class__.__name__ 163 | if classname.find('BatchNorm') != -1: 164 | for p in m.parameters(): p.requires_grad=False 165 | 166 | self.bn1.apply(set_bn_fix) 167 | self.layer1.apply(set_bn_fix) 168 | self.layer2.apply(set_bn_fix) 169 | self.layer3.apply(set_bn_fix) 170 | self.layer4.apply(set_bn_fix) 171 | 172 | # self.conv2 = nn.Sequential(nn.Conv2d(2048, 2048, kernel_size=3, stride=2, padding=1, bias=True), 173 | # nn.ReLU(inplace=True)) 174 | # self.conv2.apply(weights_init) 175 | 176 | def _make_layer(self, block, planes, blocks, stride=1): 177 | downsample = None 178 | if stride != 1 or self.inplanes != planes * block.expansion: 179 | downsample = nn.Sequential( 180 | nn.Conv2d(self.inplanes, planes * block.expansion, 181 | kernel_size=1, stride=stride, bias=False), 182 | nn.BatchNorm2d(planes * block.expansion), 183 | ) 184 | 185 | layers = [] 186 | layers.append(block(self.inplanes, planes, stride, downsample)) 187 | self.inplanes = planes * block.expansion 188 | for i in range(1, blocks): 189 | layers.append(block(self.inplanes, planes)) 190 | 191 | return nn.Sequential(*layers) 192 | 193 | def forward(self, x, x_new): 194 | 195 | batch_size = len(x) 196 | 197 | x = self.conv1(x) 198 | x = self.bn1(x) 199 | x = self.relu(x) 200 | x = self.maxpool(x) 201 | 202 | # if batch_size % 16 == 0 and self.training == True: 203 | # x_new = F.adaptive_max_pool2d(x[x_new].view(len(x_new), 64, 112, 112), 56) 204 | # x = torch.cat((x, x_new)) 205 | 206 | # if batch_size % 16 == 0 and self.training == True: 207 | # for i in range(len(x_new)): 208 | # if i == 0: 209 | # temp = x[x_new[0]].view(1, 4, 64, 56, 56) 210 | # else: 211 | # temp = torch.cat((temp, x[x_new[i]].view(1, 4, 64, 56, 56)), 0) 212 | # temp = temp.view(len(x_new), 64, 112, 112) 213 | # x_new = F.adaptive_max_pool2d(temp, 56) 214 | # x_new = self.conv2(temp) 215 | # x = torch.cat((x, x_new)) 216 | # print('te') 217 | 218 | x = self.layer1(x) 219 | x = self.layer2(x) 220 | x = self.layer3(x) 221 | x = self.layer4(x) 222 | 223 | ''' 224 | if batch_size % 16 == 0 and self.training == True: 225 | for i in range(batch_size): 226 | if i == 0: 227 | temp = x[x_new[0]].view(1, 4, 2048, 7, 7) 228 | else: 229 | temp = torch.cat((temp, x[x_new[i]].view(1, 4, 2048, 7, 7)), 0) 230 | temp = temp.view(batch_size, 2048, 14, 14) 231 | x_new = F.adaptive_max_pool2d(temp, 7) 232 | # x_new = self.conv2(temp) 233 | x = torch.cat((x, x_new)) 234 | # print('te') 235 | ''' 236 | # if batch_size % 16 == 0 and self.training == True: 237 | # x_new = F.adaptive_max_pool2d(x[x_new].view(len(x_new), 2048, 14, 14), 7) 238 | # x = torch.cat((x, x_new)) 239 | 240 | # x = F.adaptive_max_pool2d(x, 4) # ..... 241 | 242 | x = self.avgpool(x) 243 | x = x.view(x.size(0), -1) 244 | 245 | cls = self.fc(x) 246 | cou = self.counting(x) 247 | 248 | cls = F.softmax(cls) + 1e-4 249 | cou = F.softmax(cou) + 1e-4 250 | 251 | cou2cls = torch.stack((torch.sum(cou[:, :5], 1), torch.sum(cou[:, 5:20], 1), torch.sum(cou[:, 20:50], 1), 252 | torch.sum(cou[:, 50:], 1)), 1) 253 | # cou2cls = torch.log(cou2cls) 254 | 255 | # Exception 256 | # cou2cou = torch.sum(cou * torch.from_numpy(np.array(range(1, 66))).float().cuda(), 1) 257 | 258 | return cls, cou, cou2cls 259 | 260 | def train(self, mode=True): 261 | # Override train so that the training mode is set as we want 262 | nn.Module.train(self, mode) 263 | if mode: 264 | # Set fixed blocks to be in eval mode 265 | # self.conv1.eval() 266 | # self.bn1.eval() 267 | # self.relu.eval() 268 | # self.maxpool.eval() 269 | # self.layer1.eval() 270 | 271 | def set_bn_eval(m): 272 | classname = m.__class__.__name__ 273 | if classname.find('BatchNorm') != -1: 274 | m.eval() 275 | 276 | self.bn1.apply(set_bn_eval) 277 | self.layer1.apply(set_bn_eval) 278 | self.layer2.apply(set_bn_eval) 279 | self.layer3.apply(set_bn_eval) 280 | self.layer4.apply(set_bn_eval) 281 | 282 | 283 | def resnet18(pretrained=False, **kwargs): 284 | """Constructs a ResNet-18 model. 285 | 286 | Args: 287 | pretrained (bool): If True, returns a model pre-trained on ImageNet 288 | """ 289 | model = ResNet(BasicBlock, [2, 2, 2, 2], **kwargs) 290 | if pretrained: 291 | model.load_state_dict(model_zoo.load_url(model_urls['resnet18'])) 292 | return model 293 | 294 | 295 | def resnet34(pretrained=False, **kwargs): 296 | """Constructs a ResNet-34 model. 297 | 298 | Args: 299 | pretrained (bool): If True, returns a model pre-trained on ImageNet 300 | """ 301 | model = ResNet(BasicBlock, [3, 4, 6, 3], **kwargs) 302 | if pretrained: 303 | model.load_state_dict(model_zoo.load_url(model_urls['resnet34'])) 304 | return model 305 | 306 | 307 | def resnet50(pretrained=False, **kwargs): 308 | """Constructs a ResNet-50 model. 309 | 310 | Args: 311 | pretrained (bool): If True, returns a model pre-trained on ImageNet 312 | """ 313 | model = ResNet(Bottleneck, [3, 4, 6, 3], **kwargs) 314 | # if pretrained: 315 | # model.load_state_dict(model_zoo.load_url(model_urls['resnet50'])) 316 | return model 317 | 318 | 319 | def resnet101(pretrained=False, **kwargs): 320 | """Constructs a ResNet-101 model. 321 | 322 | Args: 323 | pretrained (bool): If True, returns a model pre-trained on ImageNet 324 | """ 325 | model = ResNet(Bottleneck, [3, 4, 23, 3], **kwargs) 326 | if pretrained: 327 | model.load_state_dict(model_zoo.load_url(model_urls['resnet101'])) 328 | return model 329 | 330 | 331 | def resnet152(pretrained=False, **kwargs): 332 | """Constructs a ResNet-152 model. 333 | 334 | Args: 335 | pretrained (bool): If True, returns a model pre-trained on ImageNet 336 | """ 337 | model = ResNet(Bottleneck, [3, 8, 36, 3], **kwargs) 338 | if pretrained: 339 | model.load_state_dict(model_zoo.load_url(model_urls['resnet152'])) 340 | return model 341 | -------------------------------------------------------------------------------- /code/transforms/utils.py: -------------------------------------------------------------------------------- 1 | """ 2 | Utility functions for th.Tensors 3 | from torchsample 4 | """ 5 | 6 | import pickle 7 | import random 8 | import numpy as np 9 | 10 | import torch as th 11 | 12 | 13 | def th_allclose(x, y): 14 | """ 15 | Determine whether two torch tensors have same values 16 | Mimics np.allclose 17 | """ 18 | return th.sum(th.abs(x-y)) < 1e-5 19 | 20 | 21 | def th_flatten(x): 22 | """Flatten tensor""" 23 | return x.contiguous().view(-1) 24 | 25 | def th_c_flatten(x): 26 | """ 27 | Flatten tensor, leaving channel intact. 28 | Assumes CHW format. 29 | """ 30 | return x.contiguous().view(x.size(0), -1) 31 | 32 | def th_bc_flatten(x): 33 | """ 34 | Flatten tensor, leaving batch and channel dims intact. 35 | Assumes BCHW format 36 | """ 37 | return x.contiguous().view(x.size(0), x.size(1), -1) 38 | 39 | 40 | def th_zeros_like(x): 41 | return x.new().resize_as_(x).zero_() 42 | 43 | def th_ones_like(x): 44 | return x.new().resize_as_(x).fill_(1) 45 | 46 | def th_constant_like(x, val): 47 | return x.new().resize_as_(x).fill_(val) 48 | 49 | 50 | def th_iterproduct(*args): 51 | return th.from_numpy(np.indices(args).reshape((len(args),-1)).T) 52 | 53 | def th_iterproduct_like(x): 54 | return th_iterproduct(*x.size()) 55 | 56 | 57 | def th_uniform(lower, upper): 58 | return random.uniform(lower, upper) 59 | 60 | 61 | def th_gather_nd(x, coords): 62 | x = x.contiguous() 63 | inds = coords.mv(th.LongTensor(x.stride())) 64 | x_gather = th.index_select(th_flatten(x), 0, inds) 65 | return x_gather 66 | 67 | 68 | def th_affine2d(x, matrix, mode='bilinear', center=True): 69 | """ 70 | 2D Affine image transform on th.Tensor 71 | 72 | Arguments 73 | --------- 74 | x : th.Tensor of size (C, H, W) 75 | image tensor to be transformed 76 | 77 | matrix : th.Tensor of size (3, 3) or (2, 3) 78 | transformation matrix 79 | 80 | mode : string in {'nearest', 'bilinear'} 81 | interpolation scheme to use 82 | 83 | center : boolean 84 | whether to alter the bias of the transform 85 | so the transform is applied about the center 86 | of the image rather than the origin 87 | 88 | Example 89 | ------- 90 | >>> import torch 91 | >>> from torchsample.utils import * 92 | >>> x = th.zeros(2,1000,1000) 93 | >>> x[:,100:1500,100:500] = 10 94 | >>> matrix = th.FloatTensor([[1.,0,-50], 95 | ... [0,1.,-50]]) 96 | >>> xn = th_affine2d(x, matrix, mode='nearest') 97 | >>> xb = th_affine2d(x, matrix, mode='bilinear') 98 | """ 99 | 100 | if matrix.dim() == 2: 101 | matrix = matrix[:2,:] 102 | matrix = matrix.unsqueeze(0) 103 | elif matrix.dim() == 3: 104 | if matrix.size()[1:] == (3,3): 105 | matrix = matrix[:,:2,:] 106 | 107 | A_batch = matrix[:,:,:2] 108 | if A_batch.size(0) != x.size(0): 109 | A_batch = A_batch.repeat(x.size(0),1,1) 110 | b_batch = matrix[:,:,2].unsqueeze(1) 111 | 112 | # make a meshgrid of normal coordinates 113 | _coords = th_iterproduct(x.size(1),x.size(2)) 114 | coords = _coords.unsqueeze(0).repeat(x.size(0),1,1).float() 115 | 116 | if center: 117 | # shift the coordinates so center is the origin 118 | coords[:,:,0] = coords[:,:,0] - (x.size(1) / 2. - 0.5) 119 | coords[:,:,1] = coords[:,:,1] - (x.size(2) / 2. - 0.5) 120 | # apply the coordinate transformation 121 | new_coords = coords.bmm(A_batch.transpose(1,2)) + b_batch.expand_as(coords) 122 | 123 | if center: 124 | # shift the coordinates back so origin is origin 125 | new_coords[:,:,0] = new_coords[:,:,0] + (x.size(1) / 2. - 0.5) 126 | new_coords[:,:,1] = new_coords[:,:,1] + (x.size(2) / 2. - 0.5) 127 | 128 | # map new coordinates using bilinear interpolation 129 | if mode == 'nearest': 130 | x_transformed = th_nearest_interp2d(x.contiguous(), new_coords) 131 | elif mode == 'bilinear': 132 | x_transformed = th_bilinear_interp2d(x.contiguous(), new_coords) 133 | 134 | return x_transformed 135 | 136 | 137 | def th_nearest_interp2d(input, coords): 138 | """ 139 | 2d nearest neighbor interpolation th.Tensor 140 | """ 141 | # take clamp of coords so they're in the image bounds 142 | x = th.clamp(coords[:,:,0], 0, input.size(1)-1).round() 143 | y = th.clamp(coords[:,:,1], 0, input.size(2)-1).round() 144 | 145 | stride = th.LongTensor(input.stride()) 146 | x_ix = x.mul(stride[1]).long() 147 | y_ix = y.mul(stride[2]).long() 148 | 149 | input_flat = input.view(input.size(0),-1) 150 | 151 | mapped_vals = input_flat.gather(1, x_ix.add(y_ix)) 152 | 153 | return mapped_vals.view_as(input) 154 | 155 | 156 | def th_bilinear_interp2d(input, coords): 157 | """ 158 | bilinear interpolation in 2d 159 | """ 160 | x = th.clamp(coords[:,:,0], 0, input.size(1)-2) 161 | x0 = x.floor() 162 | x1 = x0 + 1 163 | y = th.clamp(coords[:,:,1], 0, input.size(2)-2) 164 | y0 = y.floor() 165 | y1 = y0 + 1 166 | 167 | stride = th.FloatTensor(input.stride()) 168 | x0_ix = x0.mul(stride[1]).long() 169 | x1_ix = x1.mul(stride[1]).long() 170 | y0_ix = y0.mul(stride[2]).long() 171 | y1_ix = y1.mul(stride[2]).long() 172 | 173 | input_flat = input.view(input.size(0),-1) 174 | 175 | vals_00 = input_flat.gather(1, x0_ix.add(y0_ix)) 176 | vals_10 = input_flat.gather(1, x1_ix.add(y0_ix)) 177 | vals_01 = input_flat.gather(1, x0_ix.add(y1_ix)) 178 | vals_11 = input_flat.gather(1, x1_ix.add(y1_ix)) 179 | 180 | xd = x - x0 181 | yd = y - y0 182 | xm = 1 - xd 183 | ym = 1 - yd 184 | 185 | x_mapped = (vals_00.mul(xm).mul(ym) + 186 | vals_10.mul(xd).mul(ym) + 187 | vals_01.mul(xm).mul(yd) + 188 | vals_11.mul(xd).mul(yd)) 189 | 190 | return x_mapped.view_as(input) 191 | 192 | 193 | def th_affine3d(x, matrix, mode='trilinear', center=True): 194 | """ 195 | 3D Affine image transform on th.Tensor 196 | """ 197 | A = matrix[:3,:3] 198 | b = matrix[:3,3] 199 | 200 | # make a meshgrid of normal coordinates 201 | coords = th_iterproduct(x.size(1),x.size(2),x.size(3)).float() 202 | 203 | 204 | if center: 205 | # shift the coordinates so center is the origin 206 | coords[:,0] = coords[:,0] - (x.size(1) / 2. - 0.5) 207 | coords[:,1] = coords[:,1] - (x.size(2) / 2. - 0.5) 208 | coords[:,2] = coords[:,2] - (x.size(3) / 2. - 0.5) 209 | 210 | 211 | # apply the coordinate transformation 212 | new_coords = coords.mm(A.t().contiguous()) + b.expand_as(coords) 213 | 214 | if center: 215 | # shift the coordinates back so origin is origin 216 | new_coords[:,0] = new_coords[:,0] + (x.size(1) / 2. - 0.5) 217 | new_coords[:,1] = new_coords[:,1] + (x.size(2) / 2. - 0.5) 218 | new_coords[:,2] = new_coords[:,2] + (x.size(3) / 2. - 0.5) 219 | 220 | # map new coordinates using bilinear interpolation 221 | if mode == 'nearest': 222 | x_transformed = th_nearest_interp3d(x, new_coords) 223 | elif mode == 'trilinear': 224 | x_transformed = th_trilinear_interp3d(x, new_coords) 225 | else: 226 | x_transformed = th_trilinear_interp3d(x, new_coords) 227 | 228 | return x_transformed 229 | 230 | 231 | def th_nearest_interp3d(input, coords): 232 | """ 233 | 2d nearest neighbor interpolation th.Tensor 234 | """ 235 | # take clamp of coords so they're in the image bounds 236 | coords[:,0] = th.clamp(coords[:,0], 0, input.size(1)-1).round() 237 | coords[:,1] = th.clamp(coords[:,1], 0, input.size(2)-1).round() 238 | coords[:,2] = th.clamp(coords[:,2], 0, input.size(3)-1).round() 239 | 240 | stride = th.LongTensor(input.stride())[1:].float() 241 | idx = coords.mv(stride).long() 242 | 243 | input_flat = th_flatten(input) 244 | 245 | mapped_vals = input_flat[idx] 246 | 247 | return mapped_vals.view_as(input) 248 | 249 | 250 | def th_trilinear_interp3d(input, coords): 251 | """ 252 | trilinear interpolation of 3D th.Tensor image 253 | """ 254 | # take clamp then floor/ceil of x coords 255 | x = th.clamp(coords[:,0], 0, input.size(1)-2) 256 | x0 = x.floor() 257 | x1 = x0 + 1 258 | # take clamp then floor/ceil of y coords 259 | y = th.clamp(coords[:,1], 0, input.size(2)-2) 260 | y0 = y.floor() 261 | y1 = y0 + 1 262 | # take clamp then floor/ceil of z coords 263 | z = th.clamp(coords[:,2], 0, input.size(3)-2) 264 | z0 = z.floor() 265 | z1 = z0 + 1 266 | 267 | stride = th.LongTensor(input.stride())[1:] 268 | x0_ix = x0.mul(stride[0]).long() 269 | x1_ix = x1.mul(stride[0]).long() 270 | y0_ix = y0.mul(stride[1]).long() 271 | y1_ix = y1.mul(stride[1]).long() 272 | z0_ix = z0.mul(stride[2]).long() 273 | z1_ix = z1.mul(stride[2]).long() 274 | 275 | input_flat = th_flatten(input) 276 | 277 | vals_000 = input_flat[x0_ix+y0_ix+z0_ix] 278 | vals_100 = input_flat[x1_ix+y0_ix+z0_ix] 279 | vals_010 = input_flat[x0_ix+y1_ix+z0_ix] 280 | vals_001 = input_flat[x0_ix+y0_ix+z1_ix] 281 | vals_101 = input_flat[x1_ix+y0_ix+z1_ix] 282 | vals_011 = input_flat[x0_ix+y1_ix+z1_ix] 283 | vals_110 = input_flat[x1_ix+y1_ix+z0_ix] 284 | vals_111 = input_flat[x1_ix+y1_ix+z1_ix] 285 | 286 | xd = x - x0 287 | yd = y - y0 288 | zd = z - z0 289 | xm1 = 1 - xd 290 | ym1 = 1 - yd 291 | zm1 = 1 - zd 292 | 293 | x_mapped = (vals_000.mul(xm1).mul(ym1).mul(zm1) + 294 | vals_100.mul(xd).mul(ym1).mul(zm1) + 295 | vals_010.mul(xm1).mul(yd).mul(zm1) + 296 | vals_001.mul(xm1).mul(ym1).mul(zd) + 297 | vals_101.mul(xd).mul(ym1).mul(zd) + 298 | vals_011.mul(xm1).mul(yd).mul(zd) + 299 | vals_110.mul(xd).mul(yd).mul(zm1) + 300 | vals_111.mul(xd).mul(yd).mul(zd)) 301 | 302 | return x_mapped.view_as(input) 303 | 304 | 305 | def th_pearsonr(x, y): 306 | """ 307 | mimics scipy.stats.pearsonr 308 | """ 309 | mean_x = th.mean(x) 310 | mean_y = th.mean(y) 311 | xm = x.sub(mean_x) 312 | ym = y.sub(mean_y) 313 | r_num = xm.dot(ym) 314 | r_den = th.norm(xm, 2) * th.norm(ym, 2) 315 | r_val = r_num / r_den 316 | return r_val 317 | 318 | 319 | def th_corrcoef(x): 320 | """ 321 | mimics np.corrcoef 322 | """ 323 | # calculate covariance matrix of rows 324 | mean_x = th.mean(x, 1) 325 | xm = x.sub(mean_x.expand_as(x)) 326 | c = xm.mm(xm.t()) 327 | c = c / (x.size(1) - 1) 328 | 329 | # normalize covariance matrix 330 | d = th.diag(c) 331 | stddev = th.pow(d, 0.5) 332 | c = c.div(stddev.expand_as(c)) 333 | c = c.div(stddev.expand_as(c).t()) 334 | 335 | # clamp between -1 and 1 336 | c = th.clamp(c, -1.0, 1.0) 337 | 338 | return c 339 | 340 | 341 | def th_matrixcorr(x, y): 342 | """ 343 | return a correlation matrix between 344 | columns of x and columns of y. 345 | 346 | So, if X.size() == (1000,4) and Y.size() == (1000,5), 347 | then the result will be of size (4,5) with the 348 | (i,j) value equal to the pearsonr correlation coeff 349 | between column i in X and column j in Y 350 | """ 351 | mean_x = th.mean(x, 0) 352 | mean_y = th.mean(y, 0) 353 | xm = x.sub(mean_x.expand_as(x)) 354 | ym = y.sub(mean_y.expand_as(y)) 355 | r_num = xm.t().mm(ym) 356 | r_den1 = th.norm(xm,2,0) 357 | r_den2 = th.norm(ym,2,0) 358 | r_den = r_den1.t().mm(r_den2) 359 | r_mat = r_num.div(r_den) 360 | return r_mat 361 | 362 | 363 | def th_random_choice(a, n_samples=1, replace=True, p=None): 364 | """ 365 | Parameters 366 | ----------- 367 | a : 1-D array-like 368 | If a th.Tensor, a random sample is generated from its elements. 369 | If an int, the random sample is generated as if a was th.range(n) 370 | n_samples : int, optional 371 | Number of samples to draw. Default is None, in which case a 372 | single value is returned. 373 | replace : boolean, optional 374 | Whether the sample is with or without replacement 375 | p : 1-D array-like, optional 376 | The probabilities associated with each entry in a. 377 | If not given the sample assumes a uniform distribution over all 378 | entries in a. 379 | 380 | Returns 381 | -------- 382 | samples : 1-D ndarray, shape (size,) 383 | The generated random samples 384 | """ 385 | if isinstance(a, int): 386 | a = th.arange(0, a) 387 | 388 | if p is None: 389 | if replace: 390 | idx = th.floor(th.rand(n_samples)*a.size(0)).long() 391 | else: 392 | idx = th.randperm(len(a))[:n_samples] 393 | else: 394 | if abs(1.0-sum(p)) > 1e-3: 395 | raise ValueError('p must sum to 1.0') 396 | if not replace: 397 | raise ValueError('replace must equal true if probabilities given') 398 | idx_vec = th.cat([th.zeros(round(p[i]*1000))+i for i in range(len(p))]) 399 | idx = (th.floor(th.rand(n_samples)*999)).long() 400 | idx = idx_vec[idx].long() 401 | selection = a[idx] 402 | if n_samples == 1: 403 | selection = selection[0] 404 | return selection 405 | 406 | 407 | def save_transform(file, transform): 408 | """ 409 | Save a transform object 410 | """ 411 | with open(file, 'wb') as output_file: 412 | pickler = pickle.Pickler(output_file, -1) 413 | pickler.dump(transform) 414 | 415 | 416 | def load_transform(file): 417 | """ 418 | Load a transform object 419 | """ 420 | with open(file, 'rb') as input_file: 421 | transform = pickle.load(input_file) 422 | return transform 423 | 424 | 425 | 426 | 427 | 428 | -------------------------------------------------------------------------------- /code/transforms/image_transforms.py: -------------------------------------------------------------------------------- 1 | """ 2 | Transforms very specific to images such as 3 | color, lighting, contrast, brightness, etc transforms 4 | 5 | NOTE: Most of these transforms assume your image intensity 6 | is between 0 and 1, and are torch tensors (NOT numpy or PIL) 7 | """ 8 | 9 | import random 10 | 11 | import torch as th 12 | 13 | from .utils import th_random_choice 14 | 15 | 16 | def _blend(img1, img2, alpha): 17 | """ 18 | Weighted sum of two images 19 | 20 | Arguments 21 | --------- 22 | img1 : torch tensor 23 | img2 : torch tensor 24 | alpha : float between 0 and 1 25 | how much weight to put on img1 and 1-alpha weight 26 | to put on img2 27 | """ 28 | return img1.mul(alpha).add(1 - alpha, img2) 29 | 30 | 31 | class Grayscale(object): 32 | 33 | def __init__(self, keep_channels=False): 34 | """ 35 | Convert RGB image to grayscale 36 | 37 | Arguments 38 | --------- 39 | keep_channels : boolean 40 | If true, will keep all 3 channels and they will be the same 41 | If false, will just return 1 grayscale channel 42 | """ 43 | self.keep_channels = keep_channels 44 | if keep_channels: 45 | self.channels = 3 46 | else: 47 | self.channels = 1 48 | 49 | def __call__(self, *inputs): 50 | outputs = [] 51 | for idx, _input in enumerate(inputs): 52 | _input_dst = _input[0]*0.299 + _input[1]*0.587 + _input[2]*0.114 53 | _input_gs = _input_dst.repeat(self.channels,1,1) 54 | outputs.append(_input_gs) 55 | return outputs if idx > 1 else outputs[0] 56 | 57 | class RandomGrayscale(object): 58 | 59 | def __init__(self, p=0.5): 60 | """ 61 | Randomly convert RGB image(s) to Grayscale w/ some probability, 62 | NOTE: Always retains the 3 channels if image is grayscaled 63 | 64 | p : a float 65 | probability that image will be grayscaled 66 | """ 67 | self.p = p 68 | 69 | def __call__(self, *inputs): 70 | pval = random.random() 71 | if pval < self.p: 72 | outputs = Grayscale(keep_channels=True)(*inputs) 73 | else: 74 | outputs = inputs 75 | return outputs 76 | 77 | # ---------------------------------------------------- 78 | # ---------------------------------------------------- 79 | 80 | class Gamma(object): 81 | 82 | def __init__(self, value): 83 | """ 84 | Performs Gamma Correction on the input image. Also known as 85 | Power Law Transform. This function transforms the input image 86 | pixelwise according 87 | to the equation Out = In**gamma after scaling each 88 | pixel to the range 0 to 1. 89 | 90 | Arguments 91 | --------- 92 | value : float 93 | <1 : image will tend to be lighter 94 | =1 : image will stay the same 95 | >1 : image will tend to be darker 96 | """ 97 | self.value = value 98 | 99 | def __call__(self, *inputs): 100 | outputs = [] 101 | for idx, _input in enumerate(inputs): 102 | _input = th.pow(_input, self.value) 103 | outputs.append(_input) 104 | return outputs if idx > 1 else outputs[0] 105 | 106 | class RandomGamma(object): 107 | 108 | def __init__(self, min_val, max_val): 109 | """ 110 | Performs Gamma Correction on the input image with some 111 | randomly selected gamma value between min_val and max_val. 112 | Also known as Power Law Transform. This function transforms 113 | the input image pixelwise according to the equation 114 | Out = In**gamma after scaling each pixel to the range 0 to 1. 115 | 116 | Arguments 117 | --------- 118 | min_val : float 119 | min range 120 | max_val : float 121 | max range 122 | 123 | NOTE: 124 | for values: 125 | <1 : image will tend to be lighter 126 | =1 : image will stay the same 127 | >1 : image will tend to be darker 128 | """ 129 | self.values = (min_val, max_val) 130 | 131 | def __call__(self, *inputs): 132 | value = random.uniform(self.values[0], self.values[1]) 133 | outputs = Gamma(value)(*inputs) 134 | return outputs 135 | 136 | class RandomChoiceGamma(object): 137 | 138 | def __init__(self, values, p=None): 139 | """ 140 | Performs Gamma Correction on the input image with some 141 | gamma value selected in the list of given values. 142 | Also known as Power Law Transform. This function transforms 143 | the input image pixelwise according to the equation 144 | Out = In**gamma after scaling each pixel to the range 0 to 1. 145 | 146 | Arguments 147 | --------- 148 | values : list of floats 149 | gamma values to sampled from 150 | p : list of floats - same length as `values` 151 | if None, values will be sampled uniformly. 152 | Must sum to 1. 153 | 154 | NOTE: 155 | for values: 156 | <1 : image will tend to be lighter 157 | =1 : image will stay the same 158 | >1 : image will tend to be darker 159 | """ 160 | self.values = values 161 | self.p = p 162 | 163 | def __call__(self, *inputs): 164 | value = th_random_choice(self.values, p=self.p) 165 | outputs = Gamma(value)(*inputs) 166 | return outputs 167 | 168 | # ---------------------------------------------------- 169 | # ---------------------------------------------------- 170 | 171 | class Brightness(object): 172 | def __init__(self, value): 173 | """ 174 | Alter the Brightness of an image 175 | 176 | Arguments 177 | --------- 178 | value : brightness factor 179 | =-1 = completely black 180 | <0 = darker 181 | 0 = no change 182 | >0 = brighter 183 | =1 = completely white 184 | """ 185 | self.value = max(min(value,1.0),-1.0) 186 | 187 | def __call__(self, *inputs): 188 | outputs = [] 189 | for idx, _input in enumerate(inputs): 190 | _input = th.clamp(_input.float().add(self.value).type(_input.type()), 0, 1) 191 | outputs.append(_input) 192 | return outputs if idx > 1 else outputs[0] 193 | 194 | class RandomBrightness(object): 195 | 196 | def __init__(self, min_val, max_val): 197 | """ 198 | Alter the Brightness of an image with a value randomly selected 199 | between `min_val` and `max_val` 200 | 201 | Arguments 202 | --------- 203 | min_val : float 204 | min range 205 | max_val : float 206 | max range 207 | """ 208 | self.values = (min_val, max_val) 209 | 210 | def __call__(self, *inputs): 211 | value = random.uniform(self.values[0], self.values[1]) 212 | outputs = Brightness(value)(*inputs) 213 | return outputs 214 | 215 | class RandomChoiceBrightness(object): 216 | 217 | def __init__(self, values, p=None): 218 | """ 219 | Alter the Brightness of an image with a value randomly selected 220 | from the list of given values with given probabilities 221 | 222 | Arguments 223 | --------- 224 | values : list of floats 225 | brightness values to sampled from 226 | p : list of floats - same length as `values` 227 | if None, values will be sampled uniformly. 228 | Must sum to 1. 229 | """ 230 | self.values = values 231 | self.p = p 232 | 233 | def __call__(self, *inputs): 234 | value = th_random_choice(self.values, p=self.p) 235 | outputs = Brightness(value)(*inputs) 236 | return outputs 237 | 238 | # ---------------------------------------------------- 239 | # ---------------------------------------------------- 240 | 241 | class Saturation(object): 242 | 243 | def __init__(self, value): 244 | """ 245 | Alter the Saturation of image 246 | 247 | Arguments 248 | --------- 249 | value : float 250 | =-1 : gray 251 | <0 : colors are more muted 252 | =0 : image stays the same 253 | >0 : colors are more pure 254 | =1 : most saturated 255 | """ 256 | self.value = max(min(value,1.0),-1.0) 257 | 258 | def __call__(self, *inputs): 259 | outputs = [] 260 | for idx, _input in enumerate(inputs): 261 | _in_gs = Grayscale(keep_channels=True)(_input) 262 | alpha = 1.0 + self.value 263 | _in = th.clamp(_blend(_input, _in_gs, alpha), 0, 1) 264 | outputs.append(_in) 265 | return outputs if idx > 1 else outputs[0] 266 | 267 | class RandomSaturation(object): 268 | 269 | def __init__(self, min_val, max_val): 270 | """ 271 | Alter the Saturation of an image with a value randomly selected 272 | between `min_val` and `max_val` 273 | 274 | Arguments 275 | --------- 276 | min_val : float 277 | min range 278 | max_val : float 279 | max range 280 | """ 281 | self.values = (min_val, max_val) 282 | 283 | def __call__(self, *inputs): 284 | value = random.uniform(self.values[0], self.values[1]) 285 | outputs = Saturation(value)(*inputs) 286 | return outputs 287 | 288 | class RandomChoiceSaturation(object): 289 | 290 | def __init__(self, values, p=None): 291 | """ 292 | Alter the Saturation of an image with a value randomly selected 293 | from the list of given values with given probabilities 294 | 295 | Arguments 296 | --------- 297 | values : list of floats 298 | saturation values to sampled from 299 | p : list of floats - same length as `values` 300 | if None, values will be sampled uniformly. 301 | Must sum to 1. 302 | 303 | """ 304 | self.values = values 305 | self.p = p 306 | 307 | def __call__(self, *inputs): 308 | value = th_random_choice(self.values, p=self.p) 309 | outputs = Saturation(value)(*inputs) 310 | return outputs 311 | 312 | # ---------------------------------------------------- 313 | # ---------------------------------------------------- 314 | 315 | class Contrast(object): 316 | """ 317 | 318 | """ 319 | def __init__(self, value): 320 | """ 321 | Adjust Contrast of image. 322 | 323 | Contrast is adjusted independently for each channel of each image. 324 | 325 | For each channel, this Op computes the mean of the image pixels 326 | in the channel and then adjusts each component x of each pixel to 327 | (x - mean) * contrast_factor + mean. 328 | 329 | Arguments 330 | --------- 331 | value : float 332 | smaller value: less contrast 333 | ZERO: channel means 334 | larger positive value: greater contrast 335 | larger negative value: greater inverse contrast 336 | """ 337 | self.value = value 338 | 339 | def __call__(self, *inputs): 340 | outputs = [] 341 | for idx, _input in enumerate(inputs): 342 | channel_means = _input.mean(1).mean(2) 343 | channel_means = channel_means.expand_as(_input) 344 | _input = th.clamp((_input - channel_means) * self.value + channel_means,0,1) 345 | outputs.append(_input) 346 | return outputs if idx > 1 else outputs[0] 347 | 348 | class RandomContrast(object): 349 | 350 | def __init__(self, min_val, max_val): 351 | """ 352 | Alter the Contrast of an image with a value randomly selected 353 | between `min_val` and `max_val` 354 | 355 | Arguments 356 | --------- 357 | min_val : float 358 | min range 359 | max_val : float 360 | max range 361 | """ 362 | self.values = (min_val, max_val) 363 | 364 | def __call__(self, *inputs): 365 | value = random.uniform(self.values[0], self.values[1]) 366 | outputs = Contrast(value)(*inputs) 367 | return outputs 368 | 369 | class RandomChoiceContrast(object): 370 | 371 | def __init__(self, values, p=None): 372 | """ 373 | Alter the Contrast of an image with a value randomly selected 374 | from the list of given values with given probabilities 375 | 376 | Arguments 377 | --------- 378 | values : list of floats 379 | contrast values to sampled from 380 | p : list of floats - same length as `values` 381 | if None, values will be sampled uniformly. 382 | Must sum to 1. 383 | 384 | """ 385 | self.values = values 386 | self.p = p 387 | 388 | def __call__(self, *inputs): 389 | value = th_random_choice(self.values, p=None) 390 | outputs = Contrast(value)(*inputs) 391 | return outputs 392 | 393 | # ---------------------------------------------------- 394 | # ---------------------------------------------------- 395 | 396 | def rgb_to_hsv(x): 397 | """ 398 | Convert from RGB to HSV 399 | """ 400 | hsv = th.zeros(*x.size()) 401 | c_min = x.min(0) 402 | c_max = x.max(0) 403 | 404 | delta = c_max[0] - c_min[0] 405 | 406 | # set H 407 | r_idx = c_max[1].eq(0) 408 | hsv[0][r_idx] = ((x[1][r_idx] - x[2][r_idx]) / delta[r_idx]) % 6 409 | g_idx = c_max[1].eq(1) 410 | hsv[0][g_idx] = 2 + ((x[2][g_idx] - x[0][g_idx]) / delta[g_idx]) 411 | b_idx = c_max[1].eq(2) 412 | hsv[0][b_idx] = 4 + ((x[0][b_idx] - x[1][b_idx]) / delta[b_idx]) 413 | hsv[0] = hsv[0].mul(60) 414 | 415 | # set S 416 | hsv[1] = delta / c_max[0] 417 | 418 | # set V - good 419 | hsv[2] = c_max[0] 420 | 421 | return hsv 422 | -------------------------------------------------------------------------------- /code/doctor-results/expertb2.txt: -------------------------------------------------------------------------------- 1 | 240 levle0_83.jpg A 2 | 52 levle0_146.jpg A 3 | 442 levle1_268.jpg B 4 | 547 levle1_75.jpg B 5 | 201 levle0_46.jpg A 6 | 314 levle1_152.jpg B 7 | 256 levle1_1.jpg B 8 | 448 levle1_273.jpg B 9 | 500 levle1_32.jpg B 10 | 389 levle1_22.jpg C 11 | 720 levle3_61.jpg D 12 | 559 levle1_87.jpg B 13 | 59 levle0_152.jpg A 14 | 420 levle1_248.jpg B 15 | 349 levle1_184.jpg B 16 | 138 levle0_228.jpg A 17 | 57 levle0_150.jpg A 18 | 567 levle1_94.jpg B 19 | 235 levle0_79.jpg A 20 | 597 levle2_30.jpg C 21 | 124 levle0_215.jpg A 22 | 223 levle0_67.jpg A 23 | 350 levle1_185.jpg B 24 | 127 levle0_218.jpg A 25 | 529 levle1_58.jpg B 26 | 578 levle2_13.jpg C 27 | 717 levle3_59.jpg D 28 | 17 levle0_113.jpg A 29 | 639 levle2_69.jpg C 30 | 40 levle0_135.jpg A 31 | 317 levle1_155.jpg B 32 | 53 levle0_147.jpg A 33 | 145 levle0_234.jpg A 34 | 367 levle1_20.jpg C 35 | 685 levle3_28.jpg D 36 | 257 levle1_10.jpg C 37 | 233 levle0_77.jpg B 38 | 41 levle0_136.jpg A 39 | 622 levle2_53.jpg B 40 | 258 levle1_100.jpg A 41 | 161 levle0_25.jpg A 42 | 480 levle1_301.jpg A 43 | 10 levle0_107.jpg A 44 | 493 levle1_313.jpg B 45 | 79 levle0_170.jpg A 46 | 515 levle1_45.jpg B 47 | 502 levle1_33.jpg B 48 | 121 levle0_212.jpg A 49 | 250 levle0_94.jpg A 50 | 705 levle3_48.jpg D 51 | 225 levle0_69.jpg A 52 | 275 levle1_116.jpg A 53 | 131 levle0_221.jpg A 54 | 318 levle1_156.jpg B 55 | 194 levle0_4.jpg A 56 | 650 levle2_79.jpg B 57 | 638 levle2_68.jpg B 58 | 222 levle0_66.jpg A 59 | 185 levle0_31.jpg B 60 | 100 levle0_19.jpg A 61 | 593 levle2_27.jpg C 62 | 277 levle1_118.jpg A 63 | 140 levle0_23.jpg A 64 | 152 levle0_241.jpg A 65 | 31 levle0_126.jpg A 66 | 329 levle1_166.jpg A 67 | 135 levle0_225.jpg B 68 | 440 levle1_266.jpg B 69 | 340 levle1_176.jpg B 70 | 206 levle0_50.jpg B 71 | 387 levle1_218.jpg B 72 | 1 levle0_1.jpg A 73 | 210 levle0_54.jpg A 74 | 536 levle1_64.jpg A 75 | 110 levle0_20.jpg A 76 | 401 levle1_230.jpg A 77 | 721 levle3_62.jpg C 78 | 305 levle1_143.jpg B 79 | 656 levle2_85.jpg A 80 | 75 levle0_167.jpg A 81 | 711 levle3_53.jpg D 82 | 386 levle1_217.jpg B 83 | 68 levle0_160.jpg A 84 | 113 levle0_204.jpg A 85 | 435 levle1_261.jpg B 86 | 299 levle1_138.jpg B 87 | 380 levle1_211.jpg B 88 | 104 levle0_194.jpg A 89 | 62 levle0_155.jpg A 90 | 172 levle0_260.jpg A 91 | 287 levle1_127.jpg B 92 | 441 levle1_267.jpg A 93 | 319 levle1_157.jpg B 94 | 704 levle3_47.jpg D 95 | 237 levle0_80.jpg A 96 | 208 levle0_52.jpg A 97 | 341 levle1_177.jpg A 98 | 396 levle1_226.jpg B 99 | 606 levle2_39.jpg B 100 | 587 levle2_21.jpg C 101 | 378 levle1_21.jpg B 102 | 69 levle0_161.jpg A 103 | 348 levle1_183.jpg A 104 | 460 levle1_284.jpg A 105 | 623 levle2_54.jpg C 106 | 283 levle1_123.jpg B 107 | 177 levle0_266.jpg A 108 | 22 levle0_118.jpg A 109 | 571 levle1_98.jpg C 110 | 149 levle0_239.jpg A 111 | 58 levle0_151.jpg A 112 | 188 levle0_34.jpg A 113 | 569 levle1_96.jpg B 114 | 128 levle0_219.jpg A 115 | 693 levle3_37.jpg D 116 | 462 levle1_286.jpg B 117 | 92 levle0_182.jpg A 118 | 280 levle1_120.jpg B 119 | 538 levle1_66.jpg B 120 | 72 levle0_164.jpg A 121 | 106 levle0_196.jpg A 122 | 61 levle0_154.jpg A 123 | 352 levle1_187.jpg B 124 | 499 levle1_319.jpg A 125 | 55 levle0_149.jpg A 126 | 249 levle0_92.jpg A 127 | 595 levle2_29.jpg C 128 | 609 levle2_41.jpg C 129 | 372 levle1_204.jpg A 130 | 662 levle2_90.jpg C 131 | 311 levle1_15.jpg C 132 | 323 levle1_160.jpg B 133 | 143 levle0_232.jpg A 134 | 483 levle1_304.jpg B 135 | 619 levle2_50.jpg C 136 | 444 levle1_27.jpg A 137 | 362 levle1_196.jpg A 138 | 337 levle1_173.jpg A 139 | 647 levle2_76.jpg C 140 | 603 levle2_36.jpg C 141 | 485 levle1_306.jpg A 142 | 607 levle2_4.jpg B 143 | 688 levle3_30.jpg C 144 | 385 levle1_216.jpg B 145 | 573 levle2_0.jpg C 146 | 588 levle2_22.jpg C 147 | 345 levle1_180.jpg B 148 | 133 levle0_223.jpg A 149 | 471 levle1_294.jpg B 150 | 343 levle1_179.jpg B 151 | 70 levle0_162.jpg A 152 | 205 levle0_5.jpg A 153 | 482 levle1_303.jpg B 154 | 334 levle1_170.jpg A 155 | 151 levle0_240.jpg A 156 | 246 levle0_9.jpg A 157 | 11 levle0_108.jpg A 158 | 163 levle0_251.jpg A 159 | 316 levle1_154.jpg A 160 | 129 levle0_22.jpg A 161 | 331 levle1_168.jpg A 162 | 566 levle1_93.jpg A 163 | 649 levle2_78.jpg C 164 | 510 levle1_40.jpg B 165 | 190 levle0_36.jpg A 166 | 269 levle1_110.jpg A 167 | 524 levle1_53.jpg A 168 | 470 levle1_293.jpg A 169 | 232 levle0_76.jpg A 170 | 620 levle2_51.jpg C 171 | 498 levle1_318.jpg B 172 | 525 levle1_54.jpg B 173 | 76 levle0_168.jpg A 174 | 634 levle2_64.jpg B 175 | 29 levle0_124.jpg A 176 | 171 levle0_26.jpg A 177 | 627 levle2_58.jpg B 178 | 342 levle1_178.jpg A 179 | 612 levle2_44.jpg C 180 | 421 levle1_249.jpg A 181 | 489 levle1_31.jpg C 182 | 415 levle1_243.jpg A 183 | 528 levle1_57.jpg B 184 | 645 levle2_74.jpg B 185 | 477 levle1_3.jpg B 186 | 218 levle0_61.jpg A 187 | 209 levle0_53.jpg A 188 | 563 levle1_90.jpg B 189 | 165 levle0_253.jpg A 190 | 193 levle0_39.jpg A 191 | 577 levle2_12.jpg C 192 | 570 levle1_97.jpg A 193 | 320 levle1_158.jpg A 194 | 264 levle1_106.jpg A 195 | 487 levle1_308.jpg A 196 | 437 levle1_263.jpg B 197 | 130 levle0_220.jpg A 198 | 109 levle0_2.jpg A 199 | 132 levle0_222.jpg A 200 | 514 levle1_44.jpg B 201 | 611 levle2_43.jpg C 202 | 581 levle2_16.jpg C 203 | 465 levle1_289.jpg A 204 | 0 levle0_0.jpg A 205 | 236 levle0_8.jpg A 206 | 158 levle0_247.jpg A 207 | 689 levle3_31.jpg C 208 | 658 levle2_87.jpg A 209 | 509 levle1_4.jpg B 210 | 683 levle3_26.jpg C 211 | 673 levle3_17.jpg C 212 | 540 levle1_68.jpg A 213 | 727 levle3_9.jpg C 214 | 322 levle1_16.jpg B 215 | 497 levle1_317.jpg B 216 | 20 levle0_116.jpg A 217 | 518 levle1_48.jpg A 218 | 416 levle1_244.jpg A 219 | 254 levle0_98.jpg A 220 | 382 levle1_213.jpg A 221 | 23 levle0_119.jpg A 222 | 654 levle2_83.jpg B 223 | 263 levle1_105.jpg A 224 | 67 levle0_16.jpg A 225 | 701 levle3_44.jpg D 226 | 412 levle1_240.jpg A 227 | 601 levle2_34.jpg C 228 | 93 levle0_183.jpg A 229 | 635 levle2_65.jpg C 230 | 360 levle1_194.jpg B 231 | 338 levle1_174.jpg B 232 | 504 levle1_35.jpg B 233 | 667 levle3_11.jpg C 234 | 102 levle0_192.jpg A 235 | 282 levle1_122.jpg A 236 | 582 levle2_17.jpg B 237 | 85 levle0_176.jpg A 238 | 116 levle0_207.jpg A 239 | 484 levle1_305.jpg A 240 | 270 levle1_111.jpg A 241 | 344 levle1_18.jpg B 242 | 179 levle0_268.jpg A 243 | 594 levle2_28.jpg C 244 | 43 levle0_138.jpg A 245 | 556 levle1_83.jpg C 246 | 12 levle0_109.jpg A 247 | 230 levle0_74.jpg A 248 | 107 levle0_197.jpg A 249 | 313 levle1_151.jpg A 250 | 46 levle0_140.jpg A 251 | 253 levle0_97.jpg A 252 | 189 levle0_35.jpg A 253 | 293 levle1_132.jpg B 254 | 590 levle2_24.jpg B 255 | 3 levle0_100.jpg A 256 | 34 levle0_129.jpg A 257 | 266 levle1_108.jpg A 258 | 298 levle1_137.jpg A 259 | 279 levle1_12.jpg B 260 | 28 levle0_123.jpg A 261 | 14 levle0_110.jpg A 262 | 63 levle0_156.jpg A 263 | 584 levle2_19.jpg C 264 | 602 levle2_35.jpg B 265 | 398 levle1_228.jpg A 266 | 523 levle1_52.jpg B 267 | 301 levle1_14.jpg B 268 | 651 levle2_8.jpg B 269 | 126 levle0_217.jpg A 270 | 427 levle1_254.jpg B 271 | 531 levle1_6.jpg B 272 | 65 levle0_158.jpg A 273 | 105 levle0_195.jpg A 274 | 9 levle0_106.jpg A 275 | 405 levle1_234.jpg A 276 | 407 levle1_236.jpg A 277 | 408 levle1_237.jpg A 278 | 183 levle0_28.jpg A 279 | 417 levle1_245.jpg A 280 | 516 levle1_46.jpg B 281 | 426 levle1_253.jpg A 282 | 220 levle0_63.jpg A 283 | 429 levle1_256.jpg B 284 | 16 levle0_112.jpg A 285 | 586 levle2_20.jpg C 286 | 38 levle0_133.jpg A 287 | 13 levle0_11.jpg A 288 | 271 levle1_112.jpg B 289 | 285 levle1_125.jpg B 290 | 96 levle0_186.jpg A 291 | 715 levle3_57.jpg C 292 | 377 levle1_209.jpg A 293 | 147 levle0_236.jpg A 294 | 576 levle2_11.jpg C 295 | 703 levle3_46.jpg D 296 | 242 levle0_86.jpg A 297 | 438 levle1_264.jpg B 298 | 117 levle0_209.jpg A 299 | 197 levle0_42.jpg A 300 | 403 levle1_232.jpg A 301 | 6 levle0_103.jpg A 302 | 506 levle1_37.jpg A 303 | 527 levle1_56.jpg B 304 | 125 levle0_216.jpg A 305 | 560 levle1_88.jpg B 306 | 423 levle1_250.jpg B 307 | 625 levle2_56.jpg C 308 | 50 levle0_144.jpg A 309 | 633 levle2_63.jpg C 310 | 148 levle0_238.jpg A 311 | 568 levle1_95.jpg B 312 | 376 levle1_208.jpg A 313 | 54 levle0_148.jpg A 314 | 120 levle0_211.jpg A 315 | 402 levle1_231.jpg A 316 | 392 levle1_222.jpg B 317 | 552 levle1_8.jpg C 318 | 544 levle1_71.jpg B 319 | 526 levle1_55.jpg B 320 | 366 levle1_2.jpg B 321 | 486 levle1_307.jpg A 322 | 297 levle1_136.jpg A 323 | 347 levle1_182.jpg A 324 | 88 levle0_179.jpg A 325 | 19 levle0_115.jpg A 326 | 630 levle2_60.jpg C 327 | 239 levle0_82.jpg A 328 | 475 levle1_298.jpg B 329 | 447 levle1_272.jpg A 330 | 83 levle0_174.jpg A 331 | 640 levle2_7.jpg C 332 | 592 levle2_26.jpg C 333 | 400 levle1_23.jpg B 334 | 39 levle0_134.jpg A 335 | 359 levle1_193.jpg A 336 | 306 levle1_144.jpg A 337 | 202 levle0_47.jpg A 338 | 365 levle1_199.jpg A 339 | 154 levle0_243.jpg A 340 | 364 levle1_198.jpg B 341 | 539 levle1_67.jpg B 342 | 702 levle3_45.jpg D 343 | 325 levle1_162.jpg B 344 | 653 levle2_82.jpg C 345 | 90 levle0_180.jpg A 346 | 665 levle3_1.jpg D 347 | 719 levle3_60.jpg D 348 | 114 levle0_205.jpg A 349 | 159 levle0_248.jpg A 350 | 610 levle2_42.jpg B 351 | 26 levle0_121.jpg A 352 | 455 levle1_28.jpg B 353 | 413 levle1_241.jpg A 354 | 192 levle0_38.jpg A 355 | 679 levle3_22.jpg C 356 | 184 levle0_3.jpg A 357 | 219 levle0_62.jpg A 358 | 522 levle1_51.jpg A 359 | 642 levle2_71.jpg C 360 | 324 levle1_161.jpg A 361 | 604 levle2_37.jpg C 362 | 583 levle2_18.jpg C 363 | 21 levle0_117.jpg A 364 | 78 levle0_17.jpg A 365 | 328 levle1_165.jpg A 366 | 221 levle0_64.jpg A 367 | 49 levle0_143.jpg A 368 | 661 levle2_9.jpg B 369 | 198 levle0_43.jpg A 370 | 234 levle0_78.jpg A 371 | 262 levle1_104.jpg A 372 | 286 levle1_126.jpg A 373 | 175 levle0_264.jpg A 374 | 216 levle0_6.jpg A 375 | 181 levle0_27.jpg A 376 | 89 levle0_18.jpg A 377 | 631 levle2_61.jpg B 378 | 495 levle1_315.jpg B 379 | 476 levle1_299.jpg A 380 | 231 levle0_75.jpg A 381 | 453 levle1_278.jpg A 382 | 684 levle3_27.jpg C 383 | 361 levle1_195.jpg B 384 | 227 levle0_70.jpg A 385 | 74 levle0_166.jpg A 386 | 30 levle0_125.jpg A 387 | 419 levle1_247.jpg A 388 | 295 levle1_134.jpg A 389 | 432 levle1_259.jpg B 390 | 409 levle1_238.jpg A 391 | 687 levle3_3.jpg C 392 | 492 levle1_312.jpg B 393 | 261 levle1_103.jpg B 394 | 274 levle1_115.jpg B 395 | 370 levle1_202.jpg A 396 | 722 levle3_63.jpg C 397 | 84 levle0_175.jpg A 398 | 176 levle0_265.jpg A 399 | 690 levle3_33.jpg D 400 | 60 levle0_153.jpg A 401 | 80 levle0_171.jpg A 402 | 395 levle1_225.jpg B 403 | 87 levle0_178.jpg A 404 | 326 levle1_163.jpg B 405 | 307 levle1_145.jpg B 406 | 545 levle1_72.jpg B 407 | 454 levle1_279.jpg B 408 | 478 levle1_30.jpg B 409 | 289 levle1_129.jpg B 410 | 18 levle0_114.jpg A 411 | 555 levle1_82.jpg B 412 | 550 levle1_78.jpg B 413 | 354 levle1_189.jpg B 414 | 564 levle1_91.jpg B 415 | 24 levle0_12.jpg A 416 | 459 levle1_283.jpg A 417 | 394 levle1_224.jpg B 418 | 520 levle1_5.jpg B 419 | 468 levle1_291.jpg B 420 | 613 levle2_45.jpg C 421 | 267 levle1_109.jpg B 422 | 97 levle0_187.jpg A 423 | 294 levle1_133.jpg B 424 | 173 levle0_261.jpg A 425 | 103 levle0_193.jpg A 426 | 659 levle2_88.jpg A 427 | 675 levle3_19.jpg C 428 | 553 levle1_80.jpg B 429 | 411 levle1_24.jpg B 430 | 224 levle0_68.jpg A 431 | 657 levle2_86.jpg A 432 | 725 levle3_7.jpg D 433 | 714 levle3_56.jpg D 434 | 215 levle0_59.jpg B 435 | 641 levle2_70.jpg C 436 | 381 levle1_212.jpg B 437 | 291 levle1_130.jpg A 438 | 112 levle0_203.jpg A 439 | 27 levle0_122.jpg A 440 | 521 levle1_50.jpg A 441 | 404 levle1_233.jpg A 442 | 718 levle3_6.jpg C 443 | 48 levle0_142.jpg A 444 | 561 levle1_89.jpg A 445 | 599 levle2_32.jpg C 446 | 123 levle0_214.jpg A 447 | 95 levle0_185.jpg A 448 | 681 levle3_24.jpg D 449 | 505 levle1_36.jpg B 450 | 191 levle0_37.jpg A 451 | 312 levle1_150.jpg B 452 | 203 levle0_48.jpg A 453 | 379 levle1_210.jpg B 454 | 663 levle2_92.jpg C 455 | 716 levle3_58.jpg D 456 | 333 levle1_17.jpg C 457 | 167 levle0_256.jpg A 458 | 302 levle1_140.jpg B 459 | 8 levle0_105.jpg A 460 | 156 levle0_245.jpg A 461 | 428 levle1_255.jpg B 462 | 375 levle1_207.jpg B 463 | 517 levle1_47.jpg B 464 | 304 levle1_142.jpg B 465 | 558 levle1_85.jpg B 466 | 288 levle1_128.jpg B 467 | 479 levle1_300.jpg B 468 | 636 levle2_66.jpg C 469 | 660 levle2_89.jpg C 470 | 86 levle0_177.jpg A 471 | 406 levle1_235.jpg A 472 | 637 levle2_67.jpg B 473 | 574 levle2_1.jpg C 474 | 542 levle1_7.jpg C 475 | 541 levle1_69.jpg A 476 | 187 levle0_33.jpg A 477 | 512 levle1_42.jpg A 478 | 276 levle1_117.jpg A 479 | 353 levle1_188.jpg B 480 | 42 levle0_137.jpg A 481 | 678 levle3_21.jpg C 482 | 300 levle1_139.jpg B 483 | 664 levle3_0.jpg D 484 | 676 levle3_2.jpg D 485 | 228 levle0_72.jpg A 486 | 463 levle1_287.jpg A 487 | 608 levle2_40.jpg C 488 | 141 levle0_230.jpg A 489 | 694 levle3_38.jpg C 490 | 629 levle2_6.jpg C 491 | 174 levle0_263.jpg A 492 | 618 levle2_5.jpg C 493 | 226 levle0_7.jpg A 494 | 207 levle0_51.jpg A 495 | 134 levle0_224.jpg A 496 | 575 levle2_10.jpg C 497 | 723 levle3_64.jpg C 498 | 710 levle3_52.jpg D 499 | 259 levle1_101.jpg B 500 | 150 levle0_24.jpg A 501 | 626 levle2_57.jpg C 502 | 238 levle0_81.jpg A 503 | 543 levle1_70.jpg B 504 | 652 levle2_81.jpg C 505 | 695 levle3_39.jpg C 506 | 99 levle0_189.jpg A 507 | 388 levle1_219.jpg B 508 | 217 levle0_60.jpg A 509 | 692 levle3_36.jpg C 510 | 368 levle1_200.jpg B 511 | 260 levle1_102.jpg B 512 | 356 levle1_190.jpg B 513 | 56 levle0_15.jpg A 514 | 680 levle3_23.jpg D 515 | 530 levle1_59.jpg B 516 | 71 levle0_163.jpg A 517 | 204 levle0_49.jpg A 518 | 391 levle1_221.jpg B 519 | 418 levle1_246.jpg B 520 | 434 levle1_260.jpg B 521 | 214 levle0_58.jpg A 522 | 7 levle0_104.jpg A 523 | 118 levle0_21.jpg A 524 | 373 levle1_205.jpg A 525 | 272 levle1_113.jpg B 526 | 213 levle0_57.jpg A 527 | 614 levle2_46.jpg C 528 | 565 levle1_92.jpg B 529 | 474 levle1_297.jpg B 530 | 315 levle1_153.jpg B 531 | 648 levle2_77.jpg C 532 | 212 levle0_56.jpg A 533 | 436 levle1_262.jpg B 534 | 682 levle3_25.jpg D 535 | 616 levle2_48.jpg C 536 | 186 levle0_32.jpg A 537 | 579 levle2_14.jpg C 538 | 196 levle0_41.jpg A 539 | 670 levle3_14.jpg D 540 | 709 levle3_51.jpg D 541 | 144 levle0_233.jpg A 542 | 488 levle1_309.jpg B 543 | 166 levle0_255.jpg A 544 | 292 levle1_131.jpg B 545 | 108 levle0_198.jpg A 546 | 47 levle0_141.jpg A 547 | 91 levle0_181.jpg A 548 | 296 levle1_135.jpg B 549 | 252 levle0_96.jpg A 550 | 624 levle2_55.jpg C 551 | 303 levle1_141.jpg B 552 | 119 levle0_210.jpg A 553 | 25 levle0_120.jpg A 554 | 490 levle1_310.jpg B 555 | 200 levle0_45.jpg A 556 | 726 levle3_8.jpg D 557 | 330 levle1_167.jpg B 558 | 243 levle0_87.jpg A 559 | 157 levle0_246.jpg A 560 | 535 levle1_63.jpg B 561 | 433 levle1_26.jpg B 562 | 589 levle2_23.jpg C 563 | 265 levle1_107.jpg B 564 | 351 levle1_186.jpg B 565 | 457 levle1_281.jpg B 566 | 674 levle3_18.jpg D 567 | 706 levle3_49.jpg D 568 | 111 levle0_202.jpg A 569 | 155 levle0_244.jpg A 570 | 94 levle0_184.jpg A 571 | 358 levle1_192.jpg B 572 | 51 levle0_145.jpg A 573 | 672 levle3_16.jpg D 574 | 548 levle1_76.jpg B 575 | 36 levle0_131.jpg A 576 | 425 levle1_252.jpg A 577 | 101 levle0_190.jpg A 578 | 451 levle1_276.jpg A 579 | 572 levle1_99.jpg B 580 | 169 levle0_258.jpg A 581 | 600 levle2_33.jpg C 582 | 397 levle1_227.jpg B 583 | 551 levle1_79.jpg B 584 | 644 levle2_73.jpg B 585 | 554 levle1_81.jpg B 586 | 707 levle3_5.jpg D 587 | 713 levle3_55.jpg D 588 | 64 levle0_157.jpg A 589 | 511 levle1_41.jpg B 590 | 724 levle3_65.jpg D 591 | 532 levle1_60.jpg B 592 | 278 levle1_119.jpg B 593 | 537 levle1_65.jpg B 594 | 247 levle0_90.jpg A 595 | 507 levle1_38.jpg B 596 | 162 levle0_250.jpg A 597 | 686 levle3_29.jpg D 598 | 414 levle1_242.jpg A 599 | 458 levle1_282.jpg A 600 | 699 levle3_42.jpg D 601 | 81 levle0_172.jpg A 602 | 248 levle0_91.jpg A 603 | 327 levle1_164.jpg B 604 | 339 levle1_175.jpg B 605 | 44 levle0_139.jpg A 606 | 666 levle3_10.jpg D 607 | 445 levle1_270.jpg B 608 | 712 levle3_54.jpg D 609 | 355 levle1_19.jpg B 610 | 491 levle1_311.jpg B 611 | 180 levle0_269.jpg A 612 | 697 levle3_40.jpg D 613 | 168 levle0_257.jpg A 614 | 309 levle1_147.jpg B 615 | 466 levle1_29.jpg B 616 | 273 levle1_114.jpg B 617 | 122 levle0_213.jpg A 618 | 182 levle0_270.jpg A 619 | 632 levle2_62.jpg C 620 | 146 levle0_235.jpg A 621 | 251 levle0_95.jpg A 622 | 357 levle1_191.jpg B 623 | 195 levle0_40.jpg A 624 | 170 levle0_259.jpg A 625 | 452 levle1_277.jpg B 626 | 98 levle0_188.jpg A 627 | 115 levle0_206.jpg A 628 | 655 levle2_84.jpg C 629 | 615 levle2_47.jpg C 630 | 383 levle1_214.jpg B 631 | 580 levle2_15.jpg C 632 | 393 levle1_223.jpg B 633 | 153 levle0_242.jpg A 634 | 82 levle0_173.jpg A 635 | 546 levle1_74.jpg B 636 | 73 levle0_165.jpg A 637 | 308 levle1_146.jpg A 638 | 508 levle1_39.jpg B 639 | 32 levle0_127.jpg A 640 | 37 levle0_132.jpg A 641 | 244 levle0_88.jpg A 642 | 422 levle1_25.jpg B 643 | 229 levle0_73.jpg A 644 | 160 levle0_249.jpg A 645 | 513 levle1_43.jpg B 646 | 332 levle1_169.jpg B 647 | 598 levle2_31.jpg C 648 | 668 levle3_12.jpg D 649 | 66 levle0_159.jpg A 650 | 481 levle1_302.jpg B 651 | 446 levle1_271.jpg B 652 | 461 levle1_285.jpg B 653 | 562 levle1_9.jpg B 654 | 700 levle3_43.jpg D 655 | 374 levle1_206.jpg B 656 | 549 levle1_77.jpg C 657 | 696 levle3_4.jpg D 658 | 199 levle0_44.jpg A 659 | 137 levle0_227.jpg A 660 | 241 levle0_85.jpg A 661 | 4 levle0_101.jpg A 662 | 596 levle2_3.jpg C 663 | 708 levle3_50.jpg D 664 | 384 levle1_215.jpg B 665 | 628 levle2_59.jpg B 666 | 245 levle0_89.jpg A 667 | 698 levle3_41.jpg D 668 | 136 levle0_226.jpg A 669 | 371 levle1_203.jpg B 670 | 677 levle3_20.jpg D 671 | 178 levle0_267.jpg A 672 | 268 levle1_11.jpg B 673 | 691 levle3_34.jpg D 674 | 290 levle1_13.jpg B 675 | 431 levle1_258.jpg B 676 | 390 levle1_220.jpg B 677 | 363 levle1_197.jpg B 678 | 617 levle2_49.jpg C 679 | 142 levle0_231.jpg A 680 | 430 levle1_257.jpg B 681 | 45 levle0_14.jpg A 682 | 369 levle1_201.jpg B 683 | 255 levle0_99.jpg A 684 | 77 levle0_169.jpg A 685 | 335 levle1_171.jpg B 686 | 501 levle1_320.jpg B 687 | 533 levle1_61.jpg B 688 | 35 levle0_130.jpg A 689 | 164 levle0_252.jpg A 690 | 669 levle3_13.jpg D 691 | 284 levle1_124.jpg B 692 | 503 levle1_34.jpg B 693 | 473 levle1_296.jpg B 694 | 211 levle0_55.jpg A 695 | 15 levle0_111.jpg A 696 | 591 levle2_25.jpg C 697 | 494 levle1_314.jpg B 698 | 439 levle1_265.jpg B 699 | 33 levle0_128.jpg A 700 | 585 levle2_2.jpg C 701 | -------------------------------------------------------------------------------- /code/doctor-results/junior_b.txt: -------------------------------------------------------------------------------- 1 | 547 levle1_75.jpg B 2 | 201 levle0_46.jpg A 3 | 314 levle1_152.jpg B 4 | 256 levle1_1.jpg B 5 | 448 levle1_273.jpg B 6 | 500 levle1_32.jpg C 7 | 389 levle1_22.jpg C 8 | 720 levle3_61.jpg D 9 | 559 levle1_87.jpg C 10 | 59 levle0_152.jpg B 11 | 420 levle1_248.jpg A 12 | 349 levle1_184.jpg C 13 | 138 levle0_228.jpg A 14 | 57 levle0_150.jpg B 15 | 567 levle1_94.jpg B 16 | 235 levle0_79.jpg A 17 | 597 levle2_30.jpg D 18 | 124 levle0_215.jpg C 19 | 223 levle0_67.jpg C 20 | 350 levle1_185.jpg B 21 | 127 levle0_218.jpg B 22 | 529 levle1_58.jpg A 23 | 578 levle2_13.jpg D 24 | 717 levle3_59.jpg D 25 | 17 levle0_113.jpg A 26 | 639 levle2_69.jpg C 27 | 40 levle0_135.jpg B 28 | 317 levle1_155.jpg B 29 | 53 levle0_147.jpg A 30 | 145 levle0_234.jpg A 31 | 367 levle1_20.jpg C 32 | 685 levle3_28.jpg D 33 | 257 levle1_10.jpg D 34 | 233 levle0_77.jpg C 35 | 41 levle0_136.jpg A 36 | 622 levle2_53.jpg C 37 | 258 levle1_100.jpg A 38 | 161 levle0_25.jpg A 39 | 480 levle1_301.jpg A 40 | 10 levle0_107.jpg A 41 | 493 levle1_313.jpg C 42 | 79 levle0_170.jpg B 43 | 515 levle1_45.jpg B 44 | 638 levle2_68.jpg C 45 | 222 levle0_66.jpg C 46 | 185 levle0_31.jpg B 47 | 100 levle0_19.jpg A 48 | 593 levle2_27.jpg D 49 | 277 levle1_118.jpg C 50 | 140 levle0_23.jpg A 51 | 152 levle0_241.jpg A 52 | 31 levle0_126.jpg B 53 | 329 levle1_166.jpg B 54 | 135 levle0_225.jpg B 55 | 440 levle1_266.jpg B 56 | 340 levle1_176.jpg B 57 | 206 levle0_50.jpg B 58 | 387 levle1_218.jpg C 59 | 1 levle0_1.jpg A 60 | 210 levle0_54.jpg A 61 | 536 levle1_64.jpg A 62 | 110 levle0_20.jpg A 63 | 401 levle1_230.jpg A 64 | 721 levle3_62.jpg D 65 | 305 levle1_143.jpg B 66 | 656 levle2_85.jpg C 67 | 75 levle0_167.jpg B 68 | 711 levle3_53.jpg D 69 | 386 levle1_217.jpg B 70 | 68 levle0_160.jpg A 71 | 113 levle0_204.jpg A 72 | 435 levle1_261.jpg B 73 | 299 levle1_138.jpg B 74 | 380 levle1_211.jpg A 75 | 104 levle0_194.jpg B 76 | 62 levle0_155.jpg A 77 | 172 levle0_260.jpg B 78 | 287 levle1_127.jpg B 79 | 441 levle1_267.jpg B 80 | 319 levle1_157.jpg B 81 | 704 levle3_47.jpg C 82 | 237 levle0_80.jpg C 83 | 208 levle0_52.jpg A 84 | 341 levle1_177.jpg B 85 | 396 levle1_226.jpg B 86 | 606 levle2_39.jpg C 87 | 587 levle2_21.jpg D 88 | 378 levle1_21.jpg C 89 | 69 levle0_161.jpg B 90 | 348 levle1_183.jpg A 91 | 460 levle1_284.jpg B 92 | 623 levle2_54.jpg C 93 | 283 levle1_123.jpg C 94 | 177 levle0_266.jpg A 95 | 22 levle0_118.jpg A 96 | 571 levle1_98.jpg C 97 | 149 levle0_239.jpg A 98 | 58 levle0_151.jpg A 99 | 188 levle0_34.jpg A 100 | 569 levle1_96.jpg B 101 | 128 levle0_219.jpg A 102 | 693 levle3_37.jpg D 103 | 462 levle1_286.jpg B 104 | 92 levle0_182.jpg A 105 | 280 levle1_120.jpg C 106 | 538 levle1_66.jpg A 107 | 72 levle0_164.jpg B 108 | 106 levle0_196.jpg A 109 | 61 levle0_154.jpg A 110 | 352 levle1_187.jpg B 111 | 499 levle1_319.jpg A 112 | 55 levle0_149.jpg B 113 | 249 levle0_92.jpg B 114 | 595 levle2_29.jpg D 115 | 609 levle2_41.jpg D 116 | 372 levle1_204.jpg B 117 | 662 levle2_90.jpg C 118 | 311 levle1_15.jpg C 119 | 323 levle1_160.jpg C 120 | 143 levle0_232.jpg A 121 | 483 levle1_304.jpg B 122 | 619 levle2_50.jpg C 123 | 444 levle1_27.jpg C 124 | 362 levle1_196.jpg B 125 | 337 levle1_173.jpg B 126 | 647 levle2_76.jpg C 127 | 603 levle2_36.jpg D 128 | 485 levle1_306.jpg A 129 | 607 levle2_4.jpg C 130 | 688 levle3_30.jpg D 131 | 385 levle1_216.jpg B 132 | 573 levle2_0.jpg C 133 | 588 levle2_22.jpg D 134 | 345 levle1_180.jpg B 135 | 133 levle0_223.jpg A 136 | 471 levle1_294.jpg A 137 | 343 levle1_179.jpg A 138 | 70 levle0_162.jpg A 139 | 205 levle0_5.jpg B 140 | 482 levle1_303.jpg B 141 | 334 levle1_170.jpg B 142 | 151 levle0_240.jpg A 143 | 246 levle0_9.jpg A 144 | 11 levle0_108.jpg A 145 | 163 levle0_251.jpg B 146 | 316 levle1_154.jpg B 147 | 129 levle0_22.jpg A 148 | 331 levle1_168.jpg B 149 | 566 levle1_93.jpg B 150 | 649 levle2_78.jpg C 151 | 510 levle1_40.jpg C 152 | 190 levle0_36.jpg C 153 | 269 levle1_110.jpg B 154 | 524 levle1_53.jpg C 155 | 470 levle1_293.jpg A 156 | 232 levle0_76.jpg A 157 | 620 levle2_51.jpg D 158 | 498 levle1_318.jpg A 159 | 525 levle1_54.jpg A 160 | 76 levle0_168.jpg A 161 | 634 levle2_64.jpg C 162 | 29 levle0_124.jpg B 163 | 171 levle0_26.jpg A 164 | 627 levle2_58.jpg C 165 | 342 levle1_178.jpg B 166 | 612 levle2_44.jpg C 167 | 421 levle1_249.jpg A 168 | 489 levle1_31.jpg C 169 | 415 levle1_243.jpg C 170 | 528 levle1_57.jpg B 171 | 645 levle2_74.jpg C 172 | 477 levle1_3.jpg C 173 | 218 levle0_61.jpg B 174 | 209 levle0_53.jpg A 175 | 563 levle1_90.jpg C 176 | 165 levle0_253.jpg A 177 | 193 levle0_39.jpg A 178 | 577 levle2_12.jpg C 179 | 570 levle1_97.jpg B 180 | 320 levle1_158.jpg C 181 | 264 levle1_106.jpg A 182 | 487 levle1_308.jpg A 183 | 437 levle1_263.jpg B 184 | 130 levle0_220.jpg A 185 | 109 levle0_2.jpg A 186 | 132 levle0_222.jpg A 187 | 514 levle1_44.jpg B 188 | 611 levle2_43.jpg C 189 | 581 levle2_16.jpg D 190 | 465 levle1_289.jpg B 191 | 0 levle0_0.jpg B 192 | 236 levle0_8.jpg A 193 | 158 levle0_247.jpg B 194 | 689 levle3_31.jpg D 195 | 658 levle2_87.jpg C 196 | 509 levle1_4.jpg C 197 | 683 levle3_26.jpg D 198 | 673 levle3_17.jpg D 199 | 540 levle1_68.jpg B 200 | 727 levle3_9.jpg D 201 | 322 levle1_16.jpg C 202 | 497 levle1_317.jpg C 203 | 20 levle0_116.jpg A 204 | 518 levle1_48.jpg B 205 | 416 levle1_244.jpg C 206 | 254 levle0_98.jpg A 207 | 382 levle1_213.jpg B 208 | 23 levle0_119.jpg A 209 | 654 levle2_83.jpg C 210 | 263 levle1_105.jpg C 211 | 67 levle0_16.jpg A 212 | 701 levle3_44.jpg D 213 | 412 levle1_240.jpg C 214 | 601 levle2_34.jpg C 215 | 93 levle0_183.jpg C 216 | 635 levle2_65.jpg C 217 | 360 levle1_194.jpg B 218 | 338 levle1_174.jpg B 219 | 504 levle1_35.jpg B 220 | 667 levle3_11.jpg D 221 | 102 levle0_192.jpg A 222 | 282 levle1_122.jpg A 223 | 582 levle2_17.jpg B 224 | 85 levle0_176.jpg A 225 | 116 levle0_207.jpg A 226 | 484 levle1_305.jpg A 227 | 270 levle1_111.jpg B 228 | 344 levle1_18.jpg C 229 | 179 levle0_268.jpg B 230 | 594 levle2_28.jpg D 231 | 43 levle0_138.jpg A 232 | 556 levle1_83.jpg B 233 | 12 levle0_109.jpg A 234 | 230 levle0_74.jpg A 235 | 107 levle0_197.jpg B 236 | 313 levle1_151.jpg B 237 | 46 levle0_140.jpg A 238 | 253 levle0_97.jpg B 239 | 189 levle0_35.jpg B 240 | 293 levle1_132.jpg B 241 | 590 levle2_24.jpg C 242 | 3 levle0_100.jpg B 243 | 34 levle0_129.jpg A 244 | 266 levle1_108.jpg C 245 | 298 levle1_137.jpg C 246 | 279 levle1_12.jpg C 247 | 28 levle0_123.jpg A 248 | 14 levle0_110.jpg A 249 | 63 levle0_156.jpg A 250 | 584 levle2_19.jpg C 251 | 602 levle2_35.jpg C 252 | 398 levle1_228.jpg B 253 | 523 levle1_52.jpg A 254 | 301 levle1_14.jpg C 255 | 651 levle2_8.jpg C 256 | 126 levle0_217.jpg A 257 | 427 levle1_254.jpg B 258 | 531 levle1_6.jpg B 259 | 65 levle0_158.jpg A 260 | 105 levle0_195.jpg A 261 | 9 levle0_106.jpg A 262 | 405 levle1_234.jpg B 263 | 407 levle1_236.jpg B 264 | 408 levle1_237.jpg B 265 | 183 levle0_28.jpg A 266 | 417 levle1_245.jpg B 267 | 516 levle1_46.jpg B 268 | 426 levle1_253.jpg B 269 | 220 levle0_63.jpg B 270 | 429 levle1_256.jpg C 271 | 16 levle0_112.jpg B 272 | 586 levle2_20.jpg C 273 | 38 levle0_133.jpg A 274 | 13 levle0_11.jpg B 275 | 271 levle1_112.jpg C 276 | 285 levle1_125.jpg C 277 | 96 levle0_186.jpg B 278 | 715 levle3_57.jpg D 279 | 377 levle1_209.jpg B 280 | 147 levle0_236.jpg A 281 | 576 levle2_11.jpg D 282 | 519 levle1_49.jpg C 283 | 703 levle3_46.jpg D 284 | 346 levle1_181.jpg C 285 | 242 levle0_86.jpg B 286 | 643 levle2_72.jpg C 287 | 438 levle1_264.jpg B 288 | 117 levle0_209.jpg A 289 | 197 levle0_42.jpg A 290 | 403 levle1_232.jpg A 291 | 6 levle0_103.jpg A 292 | 506 levle1_37.jpg B 293 | 527 levle1_56.jpg B 294 | 125 levle0_216.jpg A 295 | 560 levle1_88.jpg B 296 | 423 levle1_250.jpg B 297 | 625 levle2_56.jpg C 298 | 50 levle0_144.jpg A 299 | 633 levle2_63.jpg C 300 | 148 levle0_238.jpg B 301 | 568 levle1_95.jpg D 302 | 376 levle1_208.jpg B 303 | 54 levle0_148.jpg A 304 | 120 levle0_211.jpg A 305 | 402 levle1_231.jpg A 306 | 392 levle1_222.jpg B 307 | 552 levle1_8.jpg C 308 | 544 levle1_71.jpg C 309 | 526 levle1_55.jpg B 310 | 366 levle1_2.jpg C 311 | 486 levle1_307.jpg A 312 | 297 levle1_136.jpg B 313 | 347 levle1_182.jpg B 314 | 88 levle0_179.jpg C 315 | 19 levle0_115.jpg A 316 | 630 levle2_60.jpg D 317 | 239 levle0_82.jpg A 318 | 475 levle1_298.jpg C 319 | 447 levle1_272.jpg B 320 | 83 levle0_174.jpg A 321 | 640 levle2_7.jpg C 322 | 592 levle2_26.jpg D 323 | 400 levle1_23.jpg C 324 | 39 levle0_134.jpg A 325 | 359 levle1_193.jpg B 326 | 306 levle1_144.jpg B 327 | 202 levle0_47.jpg A 328 | 365 levle1_199.jpg A 329 | 154 levle0_243.jpg A 330 | 364 levle1_198.jpg B 331 | 539 levle1_67.jpg A 332 | 702 levle3_45.jpg D 333 | 325 levle1_162.jpg B 334 | 653 levle2_82.jpg D 335 | 90 levle0_180.jpg A 336 | 665 levle3_1.jpg D 337 | 719 levle3_60.jpg D 338 | 114 levle0_205.jpg A 339 | 159 levle0_248.jpg B 340 | 610 levle2_42.jpg C 341 | 26 levle0_121.jpg B 342 | 455 levle1_28.jpg C 343 | 413 levle1_241.jpg B 344 | 192 levle0_38.jpg A 345 | 679 levle3_22.jpg D 346 | 184 levle0_3.jpg A 347 | 219 levle0_62.jpg A 348 | 522 levle1_51.jpg B 349 | 642 levle2_71.jpg C 350 | 324 levle1_161.jpg B 351 | 604 levle2_37.jpg C 352 | 583 levle2_18.jpg D 353 | 21 levle0_117.jpg A 354 | 78 levle0_17.jpg B 355 | 328 levle1_165.jpg A 356 | 221 levle0_64.jpg C 357 | 49 levle0_143.jpg A 358 | 661 levle2_9.jpg C 359 | 198 levle0_43.jpg A 360 | 234 levle0_78.jpg A 361 | 262 levle1_104.jpg B 362 | 286 levle1_126.jpg B 363 | 175 levle0_264.jpg B 364 | 216 levle0_6.jpg A 365 | 181 levle0_27.jpg A 366 | 89 levle0_18.jpg B 367 | 631 levle2_61.jpg C 368 | 495 levle1_315.jpg C 369 | 476 levle1_299.jpg B 370 | 231 levle0_75.jpg B 371 | 453 levle1_278.jpg A 372 | 684 levle3_27.jpg D 373 | 361 levle1_195.jpg A 374 | 227 levle0_70.jpg C 375 | 74 levle0_166.jpg A 376 | 30 levle0_125.jpg B 377 | 419 levle1_247.jpg B 378 | 295 levle1_134.jpg C 379 | 432 levle1_259.jpg B 380 | 409 levle1_238.jpg B 381 | 687 levle3_3.jpg D 382 | 395 levle1_225.jpg C 383 | 87 levle0_178.jpg B 384 | 326 levle1_163.jpg B 385 | 307 levle1_145.jpg B 386 | 545 levle1_72.jpg B 387 | 454 levle1_279.jpg A 388 | 478 levle1_30.jpg C 389 | 289 levle1_129.jpg B 390 | 18 levle0_114.jpg C 391 | 555 levle1_82.jpg C 392 | 550 levle1_78.jpg C 393 | 354 levle1_189.jpg C 394 | 564 levle1_91.jpg C 395 | 24 levle0_12.jpg A 396 | 459 levle1_283.jpg A 397 | 394 levle1_224.jpg B 398 | 520 levle1_5.jpg B 399 | 468 levle1_291.jpg B 400 | 613 levle2_45.jpg C 401 | 267 levle1_109.jpg C 402 | 97 levle0_187.jpg A 403 | 294 levle1_133.jpg B 404 | 173 levle0_261.jpg B 405 | 103 levle0_193.jpg A 406 | 659 levle2_88.jpg C 407 | 675 levle3_19.jpg D 408 | 553 levle1_80.jpg D 409 | 411 levle1_24.jpg C 410 | 224 levle0_68.jpg C 411 | 657 levle2_86.jpg B 412 | 725 levle3_7.jpg C 413 | 714 levle3_56.jpg D 414 | 215 levle0_59.jpg A 415 | 641 levle2_70.jpg C 416 | 381 levle1_212.jpg B 417 | 291 levle1_130.jpg B 418 | 112 levle0_203.jpg B 419 | 27 levle0_122.jpg A 420 | 521 levle1_50.jpg B 421 | 404 levle1_233.jpg B 422 | 718 levle3_6.jpg D 423 | 48 levle0_142.jpg A 424 | 561 levle1_89.jpg B 425 | 599 levle2_32.jpg C 426 | 123 levle0_214.jpg B 427 | 95 levle0_185.jpg A 428 | 681 levle3_24.jpg D 429 | 505 levle1_36.jpg B 430 | 191 levle0_37.jpg A 431 | 312 levle1_150.jpg B 432 | 203 levle0_48.jpg A 433 | 379 levle1_210.jpg B 434 | 663 levle2_92.jpg C 435 | 716 levle3_58.jpg D 436 | 333 levle1_17.jpg C 437 | 167 levle0_256.jpg A 438 | 302 levle1_140.jpg B 439 | 8 levle0_105.jpg A 440 | 156 levle0_245.jpg A 441 | 428 levle1_255.jpg B 442 | 375 levle1_207.jpg B 443 | 517 levle1_47.jpg B 444 | 304 levle1_142.jpg B 445 | 558 levle1_85.jpg C 446 | 288 levle1_128.jpg B 447 | 479 levle1_300.jpg A 448 | 636 levle2_66.jpg C 449 | 660 levle2_89.jpg C 450 | 86 levle0_177.jpg B 451 | 406 levle1_235.jpg B 452 | 637 levle2_67.jpg B 453 | 574 levle2_1.jpg C 454 | 542 levle1_7.jpg C 455 | 541 levle1_69.jpg B 456 | 187 levle0_33.jpg B 457 | 512 levle1_42.jpg B 458 | 276 levle1_117.jpg B 459 | 353 levle1_188.jpg B 460 | 42 levle0_137.jpg A 461 | 678 levle3_21.jpg C 462 | 300 levle1_139.jpg B 463 | 664 levle3_0.jpg C 464 | 676 levle3_2.jpg D 465 | 228 levle0_72.jpg A 466 | 463 levle1_287.jpg B 467 | 608 levle2_40.jpg B 468 | 141 levle0_230.jpg A 469 | 694 levle3_38.jpg D 470 | 629 levle2_6.jpg C 471 | 174 levle0_263.jpg A 472 | 618 levle2_5.jpg C 473 | 226 levle0_7.jpg A 474 | 207 levle0_51.jpg A 475 | 134 levle0_224.jpg B 476 | 575 levle2_10.jpg C 477 | 723 levle3_64.jpg D 478 | 710 levle3_52.jpg D 479 | 259 levle1_101.jpg C 480 | 695 levle3_39.jpg D 481 | 99 levle0_189.jpg B 482 | 388 levle1_219.jpg B 483 | 217 levle0_60.jpg A 484 | 692 levle3_36.jpg C 485 | 368 levle1_200.jpg B 486 | 260 levle1_102.jpg C 487 | 356 levle1_190.jpg C 488 | 56 levle0_15.jpg A 489 | 680 levle3_23.jpg D 490 | 530 levle1_59.jpg B 491 | 71 levle0_163.jpg B 492 | 204 levle0_49.jpg B 493 | 391 levle1_221.jpg B 494 | 418 levle1_246.jpg B 495 | 434 levle1_260.jpg A 496 | 214 levle0_58.jpg A 497 | 7 levle0_104.jpg A 498 | 118 levle0_21.jpg A 499 | 373 levle1_205.jpg B 500 | 272 levle1_113.jpg B 501 | 213 levle0_57.jpg B 502 | 614 levle2_46.jpg C 503 | 565 levle1_92.jpg B 504 | 474 levle1_297.jpg B 505 | 315 levle1_153.jpg B 506 | 648 levle2_77.jpg C 507 | 212 levle0_56.jpg C 508 | 436 levle1_262.jpg B 509 | 682 levle3_25.jpg D 510 | 616 levle2_48.jpg C 511 | 186 levle0_32.jpg A 512 | 579 levle2_14.jpg C 513 | 196 levle0_41.jpg A 514 | 670 levle3_14.jpg C 515 | 709 levle3_51.jpg C 516 | 144 levle0_233.jpg A 517 | 488 levle1_309.jpg B 518 | 166 levle0_255.jpg A 519 | 292 levle1_131.jpg B 520 | 108 levle0_198.jpg A 521 | 47 levle0_141.jpg B 522 | 91 levle0_181.jpg A 523 | 296 levle1_135.jpg A 524 | 252 levle0_96.jpg A 525 | 624 levle2_55.jpg C 526 | 303 levle1_141.jpg B 527 | 119 levle0_210.jpg B 528 | 25 levle0_120.jpg A 529 | 490 levle1_310.jpg A 530 | 200 levle0_45.jpg B 531 | 726 levle3_8.jpg C 532 | 330 levle1_167.jpg B 533 | 243 levle0_87.jpg A 534 | 157 levle0_246.jpg B 535 | 535 levle1_63.jpg B 536 | 605 levle2_38.jpg C 537 | 336 levle1_172.jpg B 538 | 433 levle1_26.jpg C 539 | 589 levle2_23.jpg C 540 | 265 levle1_107.jpg C 541 | 351 levle1_186.jpg B 542 | 457 levle1_281.jpg B 543 | 671 levle3_15.jpg C 544 | 674 levle3_18.jpg D 545 | 469 levle1_292.jpg B 546 | 706 levle3_49.jpg C 547 | 496 levle1_316.jpg C 548 | 464 levle1_288.jpg B 549 | 111 levle0_202.jpg A 550 | 155 levle0_244.jpg A 551 | 94 levle0_184.jpg B 552 | 358 levle1_192.jpg C 553 | 51 levle0_145.jpg A 554 | 672 levle3_16.jpg D 555 | 548 levle1_76.jpg B 556 | 449 levle1_274.jpg B 557 | 2 levle0_10.jpg B 558 | 36 levle0_131.jpg B 559 | 425 levle1_252.jpg A 560 | 101 levle0_190.jpg B 561 | 451 levle1_276.jpg B 562 | 572 levle1_99.jpg B 563 | 169 levle0_258.jpg A 564 | 600 levle2_33.jpg C 565 | 397 levle1_227.jpg A 566 | 551 levle1_79.jpg C 567 | 644 levle2_73.jpg C 568 | 554 levle1_81.jpg B 569 | 707 levle3_5.jpg D 570 | 139 levle0_229.jpg A 571 | 410 levle1_239.jpg B 572 | 472 levle1_295.jpg B 573 | 713 levle3_55.jpg D 574 | 646 levle2_75.jpg C 575 | 64 levle0_157.jpg A 576 | 511 levle1_41.jpg B 577 | 724 levle3_65.jpg C 578 | 532 levle1_60.jpg C 579 | 278 levle1_119.jpg B 580 | 537 levle1_65.jpg A 581 | 247 levle0_90.jpg A 582 | 507 levle1_38.jpg B 583 | 399 levle1_229.jpg B 584 | 162 levle0_250.jpg A 585 | 686 levle3_29.jpg D 586 | 414 levle1_242.jpg C 587 | 458 levle1_282.jpg B 588 | 699 levle3_42.jpg C 589 | 81 levle0_172.jpg B 590 | 248 levle0_91.jpg A 591 | 327 levle1_164.jpg B 592 | 339 levle1_175.jpg B 593 | 44 levle0_139.jpg B 594 | 557 levle1_84.jpg C 595 | 5 levle0_102.jpg C 596 | 666 levle3_10.jpg D 597 | 445 levle1_270.jpg B 598 | 712 levle3_54.jpg C 599 | 355 levle1_19.jpg B 600 | 491 levle1_311.jpg B 601 | 180 levle0_269.jpg A 602 | 697 levle3_40.jpg D 603 | 168 levle0_257.jpg A 604 | 309 levle1_147.jpg A 605 | 466 levle1_29.jpg B 606 | 273 levle1_114.jpg C 607 | 122 levle0_213.jpg A 608 | 182 levle0_270.jpg A 609 | 534 levle1_62.jpg A 610 | 632 levle2_62.jpg C 611 | 146 levle0_235.jpg B 612 | 281 levle1_121.jpg A 613 | 251 levle0_95.jpg A 614 | 456 levle1_280.jpg B 615 | 424 levle1_251.jpg A 616 | 443 levle1_269.jpg B 617 | 357 levle1_191.jpg B 618 | 195 levle0_40.jpg A 619 | 170 levle0_259.jpg A 620 | 452 levle1_277.jpg B 621 | 98 levle0_188.jpg B 622 | 115 levle0_206.jpg A 623 | 655 levle2_84.jpg B 624 | 615 levle2_47.jpg C 625 | 383 levle1_214.jpg B 626 | 580 levle2_15.jpg D 627 | 393 levle1_223.jpg B 628 | 153 levle0_242.jpg A 629 | 82 levle0_173.jpg A 630 | 546 levle1_74.jpg B 631 | 73 levle0_165.jpg B 632 | 621 levle2_52.jpg B 633 | 308 levle1_146.jpg B 634 | 508 levle1_39.jpg A 635 | 32 levle0_127.jpg B 636 | 37 levle0_132.jpg A 637 | 244 levle0_88.jpg A 638 | 422 levle1_25.jpg B 639 | 229 levle0_73.jpg B 640 | 160 levle0_249.jpg A 641 | 513 levle1_43.jpg A 642 | 332 levle1_169.jpg A 643 | 598 levle2_31.jpg C 644 | 668 levle3_12.jpg D 645 | 66 levle0_159.jpg A 646 | 481 levle1_302.jpg C 647 | 446 levle1_271.jpg B 648 | 461 levle1_285.jpg B 649 | 562 levle1_9.jpg C 650 | 321 levle1_159.jpg B 651 | 700 levle3_43.jpg D 652 | 374 levle1_206.jpg A 653 | 549 levle1_77.jpg C 654 | 696 levle3_4.jpg D 655 | 199 levle0_44.jpg B 656 | 137 levle0_227.jpg A 657 | 241 levle0_85.jpg A 658 | 4 levle0_101.jpg A 659 | 596 levle2_3.jpg C 660 | 708 levle3_50.jpg D 661 | 384 levle1_215.jpg A 662 | 628 levle2_59.jpg B 663 | 450 levle1_275.jpg A 664 | 245 levle0_89.jpg A 665 | 698 levle3_41.jpg D 666 | 136 levle0_226.jpg A 667 | 371 levle1_203.jpg A 668 | 677 levle3_20.jpg D 669 | 310 levle1_149.jpg B 670 | 178 levle0_267.jpg A 671 | 467 levle1_290.jpg A 672 | 268 levle1_11.jpg B 673 | 691 levle3_34.jpg D 674 | 290 levle1_13.jpg C 675 | 431 levle1_258.jpg B 676 | 390 levle1_220.jpg B 677 | 363 levle1_197.jpg B 678 | 617 levle2_49.jpg C 679 | 142 levle0_231.jpg B 680 | 430 levle1_257.jpg C 681 | 45 levle0_14.jpg B 682 | 369 levle1_201.jpg B 683 | 255 levle0_99.jpg A 684 | 77 levle0_169.jpg A 685 | 335 levle1_171.jpg C 686 | 501 levle1_320.jpg B 687 | 533 levle1_61.jpg C 688 | 35 levle0_130.jpg A 689 | 164 levle0_252.jpg A 690 | 669 levle3_13.jpg D 691 | 284 levle1_124.jpg C 692 | 503 levle1_34.jpg C 693 | 473 levle1_296.jpg B 694 | 211 levle0_55.jpg B 695 | 15 levle0_111.jpg B 696 | 591 levle2_25.jpg D 697 | 494 levle1_314.jpg C 698 | 439 levle1_265.jpg C 699 | 33 levle0_128.jpg B 700 | 585 levle2_2.jpg C 701 | -------------------------------------------------------------------------------- /code/doctor-results/junior_a.txt: -------------------------------------------------------------------------------- 1 | 385 levle1_465.jpg B 2 | 52 levle0_323.jpg A 3 | 329 levle1_408.jpg A 4 | 583 levle2_124.jpg C 5 | 340 levle1_419.jpg A 6 | 217 levle0_508.jpg A 7 | 372 levle1_452.jpg B 8 | 208 levle0_497.jpg A 9 | 59 levle0_330.jpg A 10 | 225 levle0_516.jpg A 11 | 350 levle1_429.jpg B 12 | 671 levle3_115.jpg C 13 | 57 levle0_328.jpg A 14 | 705 levle3_74.jpg D 15 | 140 levle0_418.jpg A 16 | 124 levle0_401.jpg A 17 | 392 levle1_472.jpg B 18 | 569 levle2_110.jpg C 19 | 190 levle0_476.jpg A 20 | 459 levle1_540.jpg B 21 | 17 levle0_288.jpg A 22 | 382 levle1_462.jpg B 23 | 40 levle0_311.jpg A 24 | 318 levle1_397.jpg B 25 | 53 levle0_324.jpg A 26 | 143 levle0_421.jpg A 27 | 161 levle0_444.jpg A 28 | 686 levle3_130.jpg D 29 | 258 levle1_337.jpg A 30 | 527 levle1_609.jpg B 31 | 41 levle0_312.jpg A 32 | 500 levle1_581.jpg B 33 | 193 levle0_480.jpg A 34 | 419 levle1_500.jpg B 35 | 10 levle0_281.jpg A 36 | 79 levle0_354.jpg A 37 | 516 levle1_597.jpg B 38 | 552 levle1_634.jpg B 39 | 121 levle0_398.jpg A 40 | 387 levle1_467.jpg B 41 | 334 levle1_413.jpg A 42 | 726 levle3_95.jpg D 43 | 486 levle1_567.jpg B 44 | 131 levle0_409.jpg A 45 | 345 levle1_424.jpg B 46 | 607 levle2_149.jpg B 47 | 342 levle1_421.jpg B 48 | 319 levle1_398.jpg B 49 | 223 levle0_514.jpg A 50 | 100 levle0_377.jpg A 51 | 344 levle1_423.jpg B 52 | 484 levle1_565.jpg B 53 | 651 levle2_95.jpg C 54 | 31 levle0_302.jpg A 55 | 149 levle0_427.jpg A 56 | 694 levle3_142.jpg D 57 | 441 levle1_522.jpg A 58 | 341 levle1_420.jpg A 59 | 622 levle2_164.jpg C 60 | 510 levle1_591.jpg C 61 | 1 levle0_272.jpg B 62 | 722 levle3_91.jpg D 63 | 163 levle0_447.jpg B 64 | 110 levle0_387.jpg A 65 | 311 levle1_390.jpg A 66 | 257 levle1_336.jpg A 67 | 689 levle3_133.jpg D 68 | 657 levle3_101.jpg C 69 | 75 levle0_349.jpg A 70 | 712 levle3_81.jpg C 71 | 545 levle1_627.jpg B 72 | 68 levle0_340.jpg A 73 | 113 levle0_390.jpg A 74 | 487 levle1_568.jpg B 75 | 485 levle1_566.jpg B 76 | 646 levle2_188.jpg C 77 | 104 levle0_381.jpg A 78 | 62 levle0_334.jpg A 79 | 640 levle2_182.jpg C 80 | 620 levle2_162.jpg B 81 | 442 levle1_523.jpg A 82 | 320 levle1_399.jpg A 83 | 470 levle1_551.jpg A 84 | 505 levle1_586.jpg B 85 | 209 levle0_498.jpg A 86 | 152 levle0_430.jpg A 87 | 275 levle1_354.jpg A 88 | 279 levle1_358.jpg B 89 | 642 levle2_184.jpg B 90 | 69 levle0_341.jpg A 91 | 346 levle1_425.jpg A 92 | 703 levle3_72.jpg D 93 | 177 levle0_461.jpg A 94 | 553 levle1_635.jpg A 95 | 704 levle3_73.jpg D 96 | 22 levle0_293.jpg A 97 | 206 levle0_495.jpg A 98 | 720 levle3_89.jpg C 99 | 58 levle0_329.jpg A 100 | 277 levle1_356.jpg B 101 | 489 levle1_570.jpg B 102 | 128 levle0_405.jpg A 103 | 432 levle1_513.jpg A 104 | 447 levle1_528.jpg A 105 | 92 levle0_367.jpg A 106 | 605 levle2_147.jpg C 107 | 138 levle0_416.jpg A 108 | 72 levle0_345.jpg A 109 | 106 levle0_383.jpg A 110 | 61 levle0_332.jpg A 111 | 482 levle1_563.jpg B 112 | 514 levle1_595.jpg B 113 | 55 levle0_326.jpg A 114 | 250 levle1_329.jpg A 115 | 555 levle1_637.jpg B 116 | 263 levle1_342.jpg B 117 | 235 levle0_527.jpg A 118 | 663 levle3_107.jpg D 119 | 593 levle2_135.jpg C 120 | 715 levle3_84.jpg D 121 | 639 levle2_181.jpg C 122 | 246 levle1_325.jpg A 123 | 240 levle0_532.jpg A 124 | 135 levle0_413.jpg A 125 | 205 levle0_494.jpg A 126 | 674 levle3_118.jpg D 127 | 282 levle1_361.jpg B 128 | 145 levle0_423.jpg A 129 | 538 levle1_620.jpg A 130 | 331 levle1_410.jpg A 131 | 362 levle1_442.jpg B 132 | 574 levle2_115.jpg B 133 | 648 levle2_190.jpg C 134 | 407 levle1_488.jpg B 135 | 133 levle0_411.jpg A 136 | 616 levle2_158.jpg B 137 | 185 levle0_470.jpg A 138 | 70 levle0_342.jpg A 139 | 249 levle1_328.jpg A 140 | 483 levle1_564.jpg B 141 | 626 levle2_168.jpg C 142 | 151 levle0_429.jpg A 143 | 610 levle2_152.jpg C 144 | 11 levle0_282.jpg A 145 | 530 levle1_612.jpg B 146 | 317 levle1_396.jpg B 147 | 129 levle0_406.jpg A 148 | 670 levle3_114.jpg C 149 | 222 levle0_513.jpg A 150 | 650 levle2_94.jpg B 151 | 218 levle0_509.jpg A 152 | 453 levle1_534.jpg A 153 | 270 levle1_349.jpg A 154 | 592 levle2_134.jpg B 155 | 529 levle1_611.jpg B 156 | 233 levle0_524.jpg A 157 | 660 levle3_104.jpg D 158 | 172 levle0_456.jpg A 159 | 526 levle1_608.jpg B 160 | 76 levle0_350.jpg A 161 | 635 levle2_177.jpg C 162 | 29 levle0_300.jpg A 163 | 171 levle0_455.jpg A 164 | 608 levle2_150.jpg C 165 | 343 levle1_422.jpg B 166 | 512 levle1_593.jpg A 167 | 540 levle1_622.jpg B 168 | 618 levle2_160.jpg B 169 | 402 levle1_483.jpg A 170 | 266 levle1_345.jpg B 171 | 471 levle1_552.jpg B 172 | 188 levle0_474.jpg A 173 | 338 levle1_417.jpg A 174 | 210 levle0_499.jpg A 175 | 316 levle1_395.jpg B 176 | 165 levle0_449.jpg A 177 | 194 levle0_482.jpg A 178 | 578 levle2_119.jpg B 179 | 299 levle1_378.jpg A 180 | 201 levle0_489.jpg A 181 | 568 levle2_109.jpg B 182 | 624 levle2_166.jpg B 183 | 438 levle1_519.jpg B 184 | 130 levle0_407.jpg A 185 | 109 levle0_386.jpg A 186 | 132 levle0_410.jpg A 187 | 595 levle2_137.jpg B 188 | 612 levle2_154.jpg B 189 | 582 levle2_123.jpg B 190 | 293 levle1_372.jpg A 191 | 0 levle0_271.jpg A 192 | 237 levle0_529.jpg A 193 | 158 levle0_441.jpg A 194 | 659 levle3_103.jpg D 195 | 389 levle1_469.jpg B 196 | 684 levle3_128.jpg D 197 | 416 levle1_497.jpg B 198 | 541 levle1_623.jpg B 199 | 586 levle2_127.jpg C 200 | 498 levle1_579.jpg B 201 | 20 levle0_291.jpg A 202 | 519 levle1_600.jpg A 203 | 337 levle1_416.jpg A 204 | 3 levle0_274.jpg A 205 | 232 levle0_523.jpg A 206 | 23 levle0_294.jpg A 207 | 420 levle1_501.jpg B 208 | 264 levle1_343.jpg A 209 | 67 levle0_339.jpg A 210 | 386 levle1_466.jpg A 211 | 413 levle1_494.jpg A 212 | 602 levle2_144.jpg C 213 | 93 levle0_368.jpg A 214 | 636 levle2_178.jpg C 215 | 604 levle2_146.jpg C 216 | 408 levle1_489.jpg C 217 | 560 levle1_642.jpg B 218 | 672 levle3_116.jpg C 219 | 102 levle0_379.jpg A 220 | 283 levle1_362.jpg B 221 | 681 levle3_125.jpg D 222 | 85 levle0_360.jpg A 223 | 116 levle0_393.jpg A 224 | 301 levle1_380.jpg A 225 | 666 levle3_110.jpg D 226 | 702 levle3_71.jpg D 227 | 179 levle0_463.jpg A 228 | 287 levle1_366.jpg B 229 | 43 levle0_314.jpg A 230 | 690 levle3_136.jpg D 231 | 12 levle0_283.jpg A 232 | 230 levle0_521.jpg A 233 | 107 levle0_384.jpg A 234 | 314 levle1_393.jpg A 235 | 46 levle0_317.jpg A 236 | 254 levle1_333.jpg A 237 | 189 levle0_475.jpg A 238 | 426 levle1_507.jpg B 239 | 724 levle3_93.jpg D 240 | 525 levle1_607.jpg B 241 | 34 levle0_305.jpg A 242 | 504 levle1_585.jpg B 243 | 322 levle1_401.jpg B 244 | 280 levle1_359.jpg A 245 | 28 levle0_299.jpg A 246 | 14 levle0_285.jpg A 247 | 63 levle0_335.jpg A 248 | 728 levle3_97.jpg D 249 | 603 levle2_145.jpg B 250 | 611 levle2_153.jpg C 251 | 524 levle1_606.jpg C 252 | 676 levle3_120.jpg D 253 | 269 levle1_348.jpg B 254 | 126 levle0_403.jpg A 255 | 499 levle1_580.jpg B 256 | 305 levle1_384.jpg A 257 | 65 levle0_337.jpg A 258 | 105 levle0_382.jpg A 259 | 9 levle0_280.jpg A 260 | 564 levle2_105.jpg B 261 | 600 levle2_142.jpg C 262 | 409 levle1_490.jpg B 263 | 183 levle0_468.jpg A 264 | 644 levle2_186.jpg B 265 | 517 levle1_598.jpg B 266 | 427 levle1_508.jpg B 267 | 220 levle0_511.jpg A 268 | 597 levle2_139.jpg B 269 | 16 levle0_287.jpg A 270 | 349 levle1_428.jpg A 271 | 38 levle0_309.jpg A 272 | 13 levle0_284.jpg A 273 | 271 levle1_350.jpg A 274 | 285 levle1_364.jpg B 275 | 96 levle0_373.jpg A 276 | 716 levle3_85.jpg D 277 | 378 levle1_458.jpg B 278 | 147 levle0_425.jpg A 279 | 577 levle2_118.jpg B 280 | 520 levle1_601.jpg B 281 | 421 levle1_502.jpg B 282 | 347 levle1_426.jpg B 283 | 242 levle1_321.jpg B 284 | 396 levle1_477.jpg B 285 | 398 levle1_479.jpg B 286 | 117 levle0_394.jpg A 287 | 197 levle0_485.jpg A 288 | 6 levle0_277.jpg A 289 | 125 levle0_402.jpg B 290 | 561 levle2_100.jpg C 291 | 643 levle2_185.jpg C 292 | 417 levle1_498.jpg B 293 | 50 levle0_321.jpg A 294 | 634 levle2_176.jpg D 295 | 148 levle0_426.jpg A 296 | 352 levle1_431.jpg B 297 | 377 levle1_457.jpg A 298 | 54 levle0_325.jpg A 299 | 120 levle0_397.jpg A 300 | 403 levle1_484.jpg B 301 | 655 levle2_99.jpg B 302 | 590 levle2_131.jpg B 303 | 429 levle1_510.jpg B 304 | 680 levle3_124.jpg C 305 | 367 levle1_447.jpg B 306 | 437 levle1_518.jpg B 307 | 297 levle1_376.jpg C 308 | 348 levle1_427.jpg A 309 | 88 levle0_363.jpg A 310 | 19 levle0_290.jpg A 311 | 631 levle2_173.jpg B 312 | 239 levle0_531.jpg A 313 | 476 levle1_557.jpg B 314 | 448 levle1_529.jpg A 315 | 83 levle0_358.jpg A 316 | 641 levle2_183.jpg C 317 | 492 levle1_573.jpg B 318 | 401 levle1_482.jpg A 319 | 39 levle0_310.jpg A 320 | 360 levle1_440.jpg B 321 | 306 levle1_385.jpg A 322 | 202 levle0_491.jpg A 323 | 366 levle1_446.jpg B 324 | 154 levle0_436.jpg A 325 | 365 levle1_445.jpg A 326 | 359 levle1_439.jpg B 327 | 412 levle1_493.jpg B 328 | 325 levle1_404.jpg B 329 | 581 levle2_122.jpg C 330 | 90 levle0_365.jpg A 331 | 415 levle1_496.jpg B 332 | 515 levle1_596.jpg A 333 | 114 levle0_391.jpg A 334 | 159 levle0_442.jpg A 335 | 400 levle1_481.jpg B 336 | 26 levle0_297.jpg A 337 | 380 levle1_460.jpg B 338 | 192 levle0_478.jpg A 339 | 465 levle1_546.jpg B 340 | 184 levle0_469.jpg A 341 | 219 levle0_510.jpg A 342 | 435 levle1_516.jpg B 343 | 324 levle1_403.jpg A 344 | 495 levle1_576.jpg B 345 | 701 levle3_70.jpg D 346 | 21 levle0_292.jpg B 347 | 78 levle0_353.jpg A 348 | 328 levle1_407.jpg B 349 | 221 levle0_512.jpg A 350 | 49 levle0_320.jpg B 351 | 509 levle1_590.jpg C 352 | 198 levle0_486.jpg B 353 | 234 levle0_526.jpg A 354 | 262 levle1_341.jpg B 355 | 286 levle1_365.jpg B 356 | 175 levle0_459.jpg B 357 | 216 levle0_507.jpg A 358 | 181 levle0_466.jpg A 359 | 89 levle0_364.jpg A 360 | 638 levle2_180.jpg C 361 | 575 levle2_116.jpg C 362 | 477 levle1_558.jpg B 363 | 231 levle0_522.jpg A 364 | 454 levle1_535.jpg B 365 | 361 levle1_441.jpg B 366 | 227 levle0_518.jpg A 367 | 74 levle0_347.jpg A 368 | 30 levle0_301.jpg A 369 | 405 levle1_486.jpg B 370 | 295 levle1_374.jpg C 371 | 475 levle1_556.jpg C 372 | 478 levle1_559.jpg A 373 | 688 levle3_132.jpg D 374 | 493 levle1_574.jpg B 375 | 261 levle1_340.jpg B 376 | 274 levle1_353.jpg C 377 | 370 levle1_450.jpg B 378 | 723 levle3_92.jpg C 379 | 84 levle0_359.jpg A 380 | 589 levle2_130.jpg C 381 | 60 levle0_331.jpg A 382 | 80 levle0_355.jpg A 383 | 395 levle1_476.jpg B 384 | 87 levle0_362.jpg A 385 | 326 levle1_405.jpg B 386 | 307 levle1_386.jpg B 387 | 658 levle3_102.jpg D 388 | 455 levle1_536.jpg B 389 | 479 levle1_560.jpg A 390 | 289 levle1_368.jpg A 391 | 18 levle0_289.jpg B 392 | 556 levle1_638.jpg B 393 | 594 levle2_136.jpg C 394 | 354 levle1_433.jpg A 395 | 565 levle2_106.jpg C 396 | 24 levle0_295.jpg A 397 | 460 levle1_541.jpg B 398 | 394 levle1_475.jpg B 399 | 521 levle1_603.jpg B 400 | 567 levle2_108.jpg C 401 | 614 levle2_156.jpg C 402 | 267 levle1_346.jpg B 403 | 97 levle0_374.jpg A 404 | 294 levle1_373.jpg B 405 | 173 levle0_457.jpg A 406 | 103 levle0_380.jpg A 407 | 558 levle1_640.jpg C 408 | 462 levle1_543.jpg B 409 | 411 levle1_492.jpg B 410 | 224 levle0_515.jpg A 411 | 547 levle1_629.jpg A 412 | 440 levle1_521.jpg A 413 | 637 levle2_179.jpg C 414 | 215 levle0_506.jpg A 415 | 570 levle2_111.jpg C 416 | 381 levle1_461.jpg B 417 | 291 levle1_370.jpg B 418 | 112 levle0_389.jpg A 419 | 27 levle0_298.jpg A 420 | 522 levle1_604.jpg B 421 | 404 levle1_485.jpg B 422 | 719 levle3_88.jpg D 423 | 48 levle0_319.jpg A 424 | 696 levle3_144.jpg D 425 | 721 levle3_90.jpg C 426 | 123 levle0_400.jpg B 427 | 95 levle0_372.jpg A 428 | 682 levle3_126.jpg D 429 | 506 levle1_587.jpg B 430 | 191 levle0_477.jpg A 431 | 312 levle1_391.jpg B 432 | 203 levle0_492.jpg A 433 | 379 levle1_459.jpg A 434 | 664 levle3_108.jpg C 435 | 717 levle3_86.jpg D 436 | 167 levle0_451.jpg A 437 | 302 levle1_381.jpg B 438 | 8 levle0_279.jpg A 439 | 156 levle0_439.jpg A 440 | 428 levle1_509.jpg B 441 | 375 levle1_455.jpg B 442 | 518 levle1_599.jpg B 443 | 304 levle1_383.jpg A 444 | 559 levle1_641.jpg C 445 | 288 levle1_367.jpg B 446 | 480 levle1_561.jpg A 447 | 563 levle2_102.jpg B 448 | 661 levle3_105.jpg C 449 | 86 levle0_361.jpg A 450 | 406 levle1_487.jpg B 451 | 633 levle2_175.jpg C 452 | 497 levle1_578.jpg B 453 | 543 levle1_625.jpg B 454 | 542 levle1_624.jpg A 455 | 187 levle0_473.jpg A 456 | 571 levle2_112.jpg C 457 | 276 levle1_355.jpg A 458 | 353 levle1_432.jpg A 459 | 42 levle0_313.jpg A 460 | 679 levle3_123.jpg D 461 | 300 levle1_379.jpg A 462 | 665 levle3_109.jpg D 463 | 536 levle1_618.jpg B 464 | 228 levle0_519.jpg A 465 | 463 levle1_544.jpg A 466 | 609 levle2_151.jpg C 467 | 141 levle0_419.jpg A 468 | 695 levle3_143.jpg D 469 | 630 levle2_172.jpg C 470 | 174 levle0_458.jpg A 471 | 619 levle2_161.jpg B 472 | 226 levle0_517.jpg A 473 | 207 levle0_496.jpg A 474 | 134 levle0_412.jpg A 475 | 576 levle2_117.jpg B 476 | 502 levle1_583.jpg B 477 | 711 levle3_80.jpg C 478 | 259 levle1_338.jpg B 479 | 150 levle0_428.jpg A 480 | 627 levle2_169.jpg B 481 | 238 levle0_530.jpg A 482 | 544 levle1_626.jpg B 483 | 653 levle2_97.jpg B 484 | 678 levle3_122.jpg D 485 | 99 levle0_376.jpg A 486 | 388 levle1_468.jpg B 487 | 523 levle1_605.jpg B 488 | 693 levle3_141.jpg C 489 | 368 levle1_448.jpg B 490 | 260 levle1_339.jpg B 491 | 356 levle1_435.jpg B 492 | 56 levle0_327.jpg A 493 | 550 levle1_632.jpg A 494 | 531 levle1_613.jpg A 495 | 71 levle0_343.jpg A 496 | 204 levle0_493.jpg A 497 | 434 levle1_515.jpg B 498 | 214 levle0_505.jpg A 499 | 7 levle0_278.jpg A 500 | 118 levle0_395.jpg A 501 | 373 levle1_453.jpg B 502 | 272 levle1_351.jpg B 503 | 213 levle0_504.jpg A 504 | 652 levle2_96.jpg C 505 | 566 levle2_107.jpg C 506 | 474 levle1_555.jpg B 507 | 315 levle1_394.jpg B 508 | 649 levle2_93.jpg C 509 | 212 levle0_503.jpg A 510 | 436 levle1_517.jpg B 511 | 683 levle3_127.jpg D 512 | 706 levle3_75.jpg D 513 | 186 levle0_471.jpg A 514 | 654 levle2_98.jpg B 515 | 196 levle0_484.jpg A 516 | 599 levle2_141.jpg D 517 | 710 levle3_79.jpg D 518 | 144 levle0_422.jpg A 519 | 488 levle1_569.jpg B 520 | 166 levle0_450.jpg A 521 | 292 levle1_371.jpg A 522 | 108 levle0_385.jpg A 523 | 47 levle0_318.jpg A 524 | 91 levle0_366.jpg A 525 | 296 levle1_375.jpg B 526 | 252 levle1_331.jpg A 527 | 625 levle2_167.jpg C 528 | 303 levle1_382.jpg A 529 | 119 levle0_396.jpg A 530 | 25 levle0_296.jpg A 531 | 490 levle1_571.jpg B 532 | 200 levle0_488.jpg A 533 | 727 levle3_96.jpg D 534 | 330 levle1_409.jpg A 535 | 243 levle1_322.jpg A 536 | 157 levle0_440.jpg A 537 | 535 levle1_617.jpg B 538 | 606 levle2_148.jpg C 539 | 336 levle1_415.jpg A 540 | 433 levle1_514.jpg A 541 | 573 levle2_114.jpg B 542 | 265 levle1_344.jpg A 543 | 351 levle1_430.jpg B 544 | 457 levle1_538.jpg B 545 | 718 levle3_87.jpg C 546 | 675 levle3_119.jpg D 547 | 469 levle1_550.jpg B 548 | 707 levle3_76.jpg C 549 | 496 levle1_577.jpg B 550 | 464 levle1_545.jpg A 551 | 111 levle0_388.jpg A 552 | 155 levle0_438.jpg A 553 | 94 levle0_371.jpg A 554 | 358 levle1_437.jpg A 555 | 51 levle0_322.jpg A 556 | 673 levle3_117.jpg C 557 | 548 levle1_630.jpg A 558 | 449 levle1_530.jpg B 559 | 2 levle0_273.jpg A 560 | 36 levle0_307.jpg A 561 | 425 levle1_506.jpg A 562 | 101 levle0_378.jpg A 563 | 451 levle1_532.jpg A 564 | 572 levle2_113.jpg B 565 | 169 levle0_453.jpg A 566 | 601 levle2_143.jpg C 567 | 397 levle1_478.jpg B 568 | 551 levle1_633.jpg A 569 | 645 levle2_187.jpg B 570 | 554 levle1_636.jpg B 571 | 708 levle3_77.jpg C 572 | 139 levle0_417.jpg A 573 | 410 levle1_491.jpg B 574 | 472 levle1_553.jpg A 575 | 714 levle3_83.jpg D 576 | 647 levle2_189.jpg C 577 | 64 levle0_336.jpg A 578 | 511 levle1_592.jpg B 579 | 725 levle3_94.jpg D 580 | 532 levle1_614.jpg A 581 | 278 levle1_357.jpg B 582 | 537 levle1_619.jpg B 583 | 247 levle1_326.jpg B 584 | 507 levle1_588.jpg B 585 | 399 levle1_480.jpg B 586 | 162 levle0_446.jpg A 587 | 687 levle3_131.jpg C 588 | 414 levle1_495.jpg B 589 | 458 levle1_539.jpg B 590 | 700 levle3_68.jpg D 591 | 81 levle0_356.jpg A 592 | 248 levle1_327.jpg A 593 | 327 levle1_406.jpg B 594 | 339 levle1_418.jpg B 595 | 44 levle0_315.jpg A 596 | 557 levle1_639.jpg B 597 | 5 levle0_276.jpg A 598 | 667 levle3_111.jpg C 599 | 445 levle1_526.jpg A 600 | 713 levle3_82.jpg D 601 | 355 levle1_434.jpg B 602 | 491 levle1_572.jpg A 603 | 180 levle0_465.jpg A 604 | 698 levle3_66.jpg D 605 | 168 levle0_452.jpg A 606 | 309 levle1_388.jpg A 607 | 466 levle1_547.jpg A 608 | 273 levle1_352.jpg B 609 | 122 levle0_399.jpg A 610 | 182 levle0_467.jpg A 611 | 534 levle1_616.jpg A 612 | 632 levle2_174.jpg C 613 | 146 levle0_424.jpg A 614 | 281 levle1_360.jpg A 615 | 251 levle1_330.jpg A 616 | 456 levle1_537.jpg B 617 | 424 levle1_505.jpg B 618 | 443 levle1_524.jpg B 619 | 357 levle1_436.jpg A 620 | 195 levle0_483.jpg A 621 | 170 levle0_454.jpg A 622 | 452 levle1_533.jpg A 623 | 98 levle0_375.jpg A 624 | 115 levle0_392.jpg A 625 | 656 levle3_100.jpg D 626 | 615 levle2_157.jpg C 627 | 393 levle1_474.jpg B 628 | 153 levle0_432.jpg A 629 | 82 levle0_357.jpg A 630 | 546 levle1_628.jpg A 631 | 73 levle0_346.jpg A 632 | 621 levle2_163.jpg B 633 | 308 levle1_387.jpg A 634 | 508 levle1_589.jpg B 635 | 32 levle0_303.jpg A 636 | 37 levle0_308.jpg A 637 | 244 levle1_323.jpg A 638 | 422 levle1_503.jpg A 639 | 229 levle0_520.jpg A 640 | 160 levle0_443.jpg A 641 | 513 levle1_594.jpg B 642 | 332 levle1_411.jpg A 643 | 598 levle2_140.jpg C 644 | 668 levle3_112.jpg C 645 | 66 levle0_338.jpg A 646 | 481 levle1_562.jpg B 647 | 446 levle1_527.jpg B 648 | 461 levle1_542.jpg A 649 | 562 levle2_101.jpg B 650 | 321 levle1_400.jpg A 651 | 692 levle3_140.jpg D 652 | 374 levle1_454.jpg B 653 | 549 levle1_631.jpg A 654 | 697 levle3_145.jpg B 655 | 199 levle0_487.jpg A 656 | 137 levle0_415.jpg A 657 | 241 levle1_0.jpg A 658 | 4 levle0_275.jpg A 659 | 596 levle2_138.jpg B 660 | 709 levle3_78.jpg C 661 | 384 levle1_464.jpg C 662 | 628 levle2_170.jpg B 663 | 450 levle1_531.jpg B 664 | 245 levle1_324.jpg A 665 | 699 levle3_67.jpg D 666 | 136 levle0_414.jpg A 667 | 371 levle1_451.jpg B 668 | 677 levle3_121.jpg D 669 | 310 levle1_389.jpg B 670 | 178 levle0_462.jpg A 671 | 467 levle1_548.jpg A 672 | 268 levle1_347.jpg B 673 | 691 levle3_137.jpg D 674 | 290 levle1_369.jpg B 675 | 431 levle1_512.jpg A 676 | 390 levle1_470.jpg A 677 | 363 levle1_443.jpg B 678 | 617 levle2_159.jpg C 679 | 142 levle0_420.jpg A 680 | 430 levle1_511.jpg B 681 | 45 levle0_316.jpg A 682 | 369 levle1_449.jpg B 683 | 255 levle1_334.jpg A 684 | 77 levle0_351.jpg A 685 | 335 levle1_414.jpg A 686 | 501 levle1_582.jpg B 687 | 533 levle1_615.jpg B 688 | 35 levle0_306.jpg A 689 | 164 levle0_448.jpg B 690 | 669 levle3_113.jpg C 691 | 284 levle1_363.jpg A 692 | 503 levle1_584.jpg B 693 | 473 levle1_554.jpg B 694 | 211 levle0_501.jpg A 695 | 15 levle0_286.jpg A 696 | 591 levle2_132.jpg B 697 | 494 levle1_575.jpg C 698 | 439 levle1_520.jpg A 699 | 33 levle0_304.jpg A 700 | 585 levle2_126.jpg B 701 | -------------------------------------------------------------------------------- /code/doctor-results/general_a.txt: -------------------------------------------------------------------------------- 1 | 385 levle1_465.jpg B 2 | 52 levle0_323.jpg A 3 | 329 levle1_408.jpg B 4 | 583 levle2_124.jpg B 5 | 340 levle1_419.jpg B 6 | 217 levle0_508.jpg A 7 | 372 levle1_452.jpg B 8 | 584 levle2_125.jpg C 9 | 256 levle1_335.jpg B 10 | 298 levle1_377.jpg B 11 | 364 levle1_444.jpg A 12 | 208 levle0_497.jpg A 13 | 59 levle0_330.jpg A 14 | 225 levle0_516.jpg B 15 | 350 levle1_429.jpg A 16 | 671 levle3_115.jpg C 17 | 57 levle0_328.jpg B 18 | 705 levle3_74.jpg D 19 | 236 levle0_528.jpg A 20 | 140 levle0_418.jpg A 21 | 124 levle0_401.jpg A 22 | 392 levle1_472.jpg B 23 | 569 levle2_110.jpg C 24 | 127 levle0_404.jpg A 25 | 190 levle0_476.jpg A 26 | 579 levle2_120.jpg B 27 | 459 levle1_540.jpg C 28 | 17 levle0_288.jpg B 29 | 382 levle1_462.jpg B 30 | 40 levle0_311.jpg B 31 | 318 levle1_397.jpg B 32 | 53 levle0_324.jpg B 33 | 143 levle0_421.jpg A 34 | 161 levle0_444.jpg B 35 | 686 levle3_130.jpg D 36 | 258 levle1_337.jpg B 37 | 527 levle1_609.jpg C 38 | 41 levle0_312.jpg B 39 | 623 levle2_165.jpg C 40 | 500 levle1_581.jpg B 41 | 193 levle0_480.jpg A 42 | 419 levle1_500.jpg B 43 | 10 levle0_281.jpg A 44 | 376 levle1_456.jpg B 45 | 79 levle0_354.jpg B 46 | 516 levle1_597.jpg B 47 | 552 levle1_634.jpg B 48 | 121 levle0_398.jpg A 49 | 387 levle1_467.jpg B 50 | 334 levle1_413.jpg A 51 | 726 levle3_95.jpg D 52 | 486 levle1_567.jpg C 53 | 131 levle0_409.jpg A 54 | 345 levle1_424.jpg B 55 | 607 levle2_149.jpg C 56 | 342 levle1_421.jpg B 57 | 319 levle1_398.jpg B 58 | 223 levle0_514.jpg B 59 | 539 levle1_621.jpg A 60 | 100 levle0_377.jpg A 61 | 253 levle1_332.jpg A 62 | 344 levle1_423.jpg B 63 | 484 levle1_565.jpg B 64 | 651 levle2_95.jpg C 65 | 31 levle0_302.jpg B 66 | 149 levle0_427.jpg A 67 | 694 levle3_142.jpg D 68 | 441 levle1_522.jpg A 69 | 341 levle1_420.jpg A 70 | 622 levle2_164.jpg B 71 | 510 levle1_591.jpg B 72 | 1 levle0_272.jpg A 73 | 722 levle3_91.jpg D 74 | 163 levle0_447.jpg B 75 | 110 levle0_387.jpg A 76 | 311 levle1_390.jpg B 77 | 257 levle1_336.jpg A 78 | 689 levle3_133.jpg D 79 | 657 levle3_101.jpg D 80 | 75 levle0_349.jpg A 81 | 712 levle3_81.jpg D 82 | 545 levle1_627.jpg C 83 | 68 levle0_340.jpg A 84 | 113 levle0_390.jpg A 85 | 487 levle1_568.jpg B 86 | 485 levle1_566.jpg B 87 | 646 levle2_188.jpg D 88 | 104 levle0_381.jpg A 89 | 62 levle0_334.jpg A 90 | 640 levle2_182.jpg B 91 | 620 levle2_162.jpg B 92 | 442 levle1_523.jpg B 93 | 320 levle1_399.jpg A 94 | 470 levle1_551.jpg B 95 | 505 levle1_586.jpg A 96 | 209 levle0_498.jpg A 97 | 152 levle0_430.jpg A 98 | 275 levle1_354.jpg B 99 | 279 levle1_358.jpg B 100 | 588 levle2_129.jpg B 101 | 642 levle2_184.jpg B 102 | 69 levle0_341.jpg A 103 | 346 levle1_425.jpg A 104 | 703 levle3_72.jpg D 105 | 177 levle0_461.jpg A 106 | 553 levle1_635.jpg B 107 | 704 levle3_73.jpg C 108 | 22 levle0_293.jpg B 109 | 206 levle0_495.jpg A 110 | 720 levle3_89.jpg D 111 | 58 levle0_329.jpg A 112 | 277 levle1_356.jpg B 113 | 489 levle1_570.jpg B 114 | 128 levle0_405.jpg B 115 | 432 levle1_513.jpg A 116 | 447 levle1_528.jpg A 117 | 92 levle0_367.jpg A 118 | 605 levle2_147.jpg B 119 | 138 levle0_416.jpg A 120 | 72 levle0_345.jpg A 121 | 106 levle0_383.jpg A 122 | 61 levle0_332.jpg A 123 | 482 levle1_563.jpg B 124 | 514 levle1_595.jpg B 125 | 55 levle0_326.jpg A 126 | 250 levle1_329.jpg A 127 | 555 levle1_637.jpg C 128 | 263 levle1_342.jpg C 129 | 235 levle0_527.jpg B 130 | 663 levle3_107.jpg D 131 | 593 levle2_135.jpg C 132 | 715 levle3_84.jpg D 133 | 639 levle2_181.jpg D 134 | 246 levle1_325.jpg B 135 | 240 levle0_532.jpg B 136 | 135 levle0_413.jpg A 137 | 205 levle0_494.jpg A 138 | 674 levle3_118.jpg D 139 | 282 levle1_361.jpg B 140 | 662 levle3_106.jpg C 141 | 468 levle1_549.jpg A 142 | 145 levle0_423.jpg A 143 | 538 levle1_620.jpg A 144 | 331 levle1_410.jpg A 145 | 362 levle1_442.jpg C 146 | 574 levle2_115.jpg B 147 | 648 levle2_190.jpg C 148 | 407 levle1_488.jpg C 149 | 133 levle0_411.jpg B 150 | 616 levle2_158.jpg C 151 | 185 levle0_470.jpg B 152 | 70 levle0_342.jpg A 153 | 249 levle1_328.jpg A 154 | 483 levle1_564.jpg B 155 | 626 levle2_168.jpg C 156 | 151 levle0_429.jpg A 157 | 610 levle2_152.jpg C 158 | 11 levle0_282.jpg A 159 | 530 levle1_612.jpg B 160 | 317 levle1_396.jpg A 161 | 129 levle0_406.jpg A 162 | 670 levle3_114.jpg D 163 | 222 levle0_513.jpg B 164 | 650 levle2_94.jpg B 165 | 218 levle0_509.jpg A 166 | 453 levle1_534.jpg B 167 | 270 levle1_349.jpg B 168 | 592 levle2_134.jpg C 169 | 529 levle1_611.jpg C 170 | 233 levle0_524.jpg B 171 | 660 levle3_104.jpg D 172 | 172 levle0_456.jpg B 173 | 526 levle1_608.jpg B 174 | 76 levle0_350.jpg A 175 | 635 levle2_177.jpg C 176 | 29 levle0_300.jpg A 177 | 171 levle0_455.jpg A 178 | 608 levle2_150.jpg B 179 | 343 levle1_422.jpg B 180 | 512 levle1_593.jpg B 181 | 540 levle1_622.jpg B 182 | 618 levle2_160.jpg C 183 | 402 levle1_483.jpg B 184 | 266 levle1_345.jpg B 185 | 471 levle1_552.jpg B 186 | 188 levle0_474.jpg A 187 | 338 levle1_417.jpg A 188 | 210 levle0_499.jpg A 189 | 316 levle1_395.jpg B 190 | 165 levle0_449.jpg A 191 | 194 levle0_482.jpg A 192 | 578 levle2_119.jpg B 193 | 299 levle1_378.jpg A 194 | 201 levle0_489.jpg A 195 | 568 levle2_109.jpg C 196 | 624 levle2_166.jpg C 197 | 438 levle1_519.jpg B 198 | 130 levle0_407.jpg A 199 | 109 levle0_386.jpg A 200 | 132 levle0_410.jpg A 201 | 595 levle2_137.jpg C 202 | 612 levle2_154.jpg C 203 | 582 levle2_123.jpg C 204 | 293 levle1_372.jpg B 205 | 0 levle0_271.jpg B 206 | 237 levle0_529.jpg A 207 | 158 levle0_441.jpg B 208 | 629 levle2_171.jpg B 209 | 659 levle3_103.jpg D 210 | 389 levle1_469.jpg B 211 | 684 levle3_128.jpg D 212 | 416 levle1_497.jpg B 213 | 541 levle1_623.jpg B 214 | 586 levle2_127.jpg D 215 | 323 levle1_402.jpg A 216 | 498 levle1_579.jpg A 217 | 20 levle0_291.jpg A 218 | 519 levle1_600.jpg B 219 | 337 levle1_416.jpg A 220 | 3 levle0_274.jpg A 221 | 232 levle0_523.jpg A 222 | 23 levle0_294.jpg A 223 | 420 levle1_501.jpg A 224 | 264 levle1_343.jpg A 225 | 67 levle0_339.jpg A 226 | 386 levle1_466.jpg A 227 | 413 levle1_494.jpg A 228 | 602 levle2_144.jpg C 229 | 93 levle0_368.jpg A 230 | 636 levle2_178.jpg B 231 | 604 levle2_146.jpg B 232 | 408 levle1_489.jpg B 233 | 560 levle1_642.jpg B 234 | 672 levle3_116.jpg B 235 | 102 levle0_379.jpg A 236 | 283 levle1_362.jpg B 237 | 681 levle3_125.jpg D 238 | 85 levle0_360.jpg A 239 | 116 levle0_393.jpg A 240 | 301 levle1_380.jpg A 241 | 666 levle3_110.jpg D 242 | 702 levle3_71.jpg D 243 | 179 levle0_463.jpg A 244 | 287 levle1_366.jpg A 245 | 43 levle0_314.jpg A 246 | 690 levle3_136.jpg D 247 | 12 levle0_283.jpg A 248 | 230 levle0_521.jpg A 249 | 107 levle0_384.jpg A 250 | 314 levle1_393.jpg A 251 | 46 levle0_317.jpg A 252 | 254 levle1_333.jpg A 253 | 189 levle0_475.jpg A 254 | 426 levle1_507.jpg A 255 | 724 levle3_93.jpg D 256 | 525 levle1_607.jpg A 257 | 34 levle0_305.jpg A 258 | 504 levle1_585.jpg A 259 | 322 levle1_401.jpg A 260 | 280 levle1_359.jpg A 261 | 28 levle0_299.jpg A 262 | 14 levle0_285.jpg A 263 | 63 levle0_335.jpg A 264 | 728 levle3_97.jpg D 265 | 603 levle2_145.jpg B 266 | 611 levle2_153.jpg B 267 | 524 levle1_606.jpg B 268 | 676 levle3_120.jpg C 269 | 269 levle1_348.jpg B 270 | 126 levle0_403.jpg B 271 | 499 levle1_580.jpg A 272 | 305 levle1_384.jpg B 273 | 65 levle0_337.jpg A 274 | 105 levle0_382.jpg A 275 | 9 levle0_280.jpg A 276 | 564 levle2_105.jpg B 277 | 600 levle2_142.jpg B 278 | 409 levle1_490.jpg B 279 | 183 levle0_468.jpg A 280 | 644 levle2_186.jpg C 281 | 517 levle1_598.jpg B 282 | 427 levle1_508.jpg A 283 | 220 levle0_511.jpg A 284 | 597 levle2_139.jpg C 285 | 16 levle0_287.jpg A 286 | 349 levle1_428.jpg A 287 | 38 levle0_309.jpg A 288 | 13 levle0_284.jpg A 289 | 271 levle1_350.jpg A 290 | 285 levle1_364.jpg A 291 | 96 levle0_373.jpg A 292 | 716 levle3_85.jpg C 293 | 378 levle1_458.jpg B 294 | 147 levle0_425.jpg A 295 | 577 levle2_118.jpg B 296 | 520 levle1_601.jpg B 297 | 421 levle1_502.jpg A 298 | 347 levle1_426.jpg B 299 | 242 levle1_321.jpg A 300 | 396 levle1_477.jpg A 301 | 398 levle1_479.jpg B 302 | 117 levle0_394.jpg A 303 | 197 levle0_485.jpg A 304 | 444 levle1_525.jpg A 305 | 6 levle0_277.jpg A 306 | 313 levle1_392.jpg A 307 | 528 levle1_610.jpg B 308 | 125 levle0_402.jpg A 309 | 561 levle2_100.jpg B 310 | 643 levle2_185.jpg B 311 | 417 levle1_498.jpg A 312 | 50 levle0_321.jpg B 313 | 634 levle2_176.jpg C 314 | 148 levle0_426.jpg A 315 | 352 levle1_431.jpg C 316 | 377 levle1_457.jpg A 317 | 54 levle0_325.jpg A 318 | 120 levle0_397.jpg A 319 | 403 levle1_484.jpg A 320 | 655 levle2_99.jpg A 321 | 590 levle2_131.jpg B 322 | 429 levle1_510.jpg A 323 | 680 levle3_124.jpg C 324 | 367 levle1_447.jpg A 325 | 437 levle1_518.jpg A 326 | 297 levle1_376.jpg C 327 | 348 levle1_427.jpg A 328 | 88 levle0_363.jpg A 329 | 19 levle0_290.jpg A 330 | 631 levle2_173.jpg B 331 | 239 levle0_531.jpg A 332 | 476 levle1_557.jpg B 333 | 448 levle1_529.jpg A 334 | 83 levle0_358.jpg A 335 | 641 levle2_183.jpg C 336 | 492 levle1_573.jpg B 337 | 401 levle1_482.jpg A 338 | 39 levle0_310.jpg A 339 | 360 levle1_440.jpg B 340 | 306 levle1_385.jpg A 341 | 202 levle0_491.jpg A 342 | 366 levle1_446.jpg B 343 | 154 levle0_436.jpg A 344 | 365 levle1_445.jpg A 345 | 359 levle1_439.jpg C 346 | 412 levle1_493.jpg B 347 | 325 levle1_404.jpg B 348 | 581 levle2_122.jpg B 349 | 90 levle0_365.jpg A 350 | 415 levle1_496.jpg B 351 | 515 levle1_596.jpg A 352 | 114 levle0_391.jpg B 353 | 159 levle0_442.jpg A 354 | 400 levle1_481.jpg A 355 | 26 levle0_297.jpg A 356 | 380 levle1_460.jpg A 357 | 423 levle1_504.jpg A 358 | 192 levle0_478.jpg A 359 | 465 levle1_546.jpg B 360 | 184 levle0_469.jpg A 361 | 219 levle0_510.jpg A 362 | 435 levle1_516.jpg B 363 | 587 levle2_128.jpg A 364 | 324 levle1_403.jpg A 365 | 495 levle1_576.jpg B 366 | 701 levle3_70.jpg C 367 | 21 levle0_292.jpg A 368 | 78 levle0_353.jpg A 369 | 328 levle1_407.jpg A 370 | 221 levle0_512.jpg A 371 | 49 levle0_320.jpg B 372 | 509 levle1_590.jpg B 373 | 198 levle0_486.jpg A 374 | 234 levle0_526.jpg A 375 | 262 levle1_341.jpg B 376 | 286 levle1_365.jpg A 377 | 175 levle0_459.jpg A 378 | 216 levle0_507.jpg A 379 | 181 levle0_466.jpg A 380 | 89 levle0_364.jpg A 381 | 638 levle2_180.jpg B 382 | 575 levle2_116.jpg D 383 | 477 levle1_558.jpg C 384 | 231 levle0_522.jpg A 385 | 454 levle1_535.jpg B 386 | 685 levle3_129.jpg C 387 | 361 levle1_441.jpg B 388 | 227 levle0_518.jpg A 389 | 74 levle0_347.jpg A 390 | 30 levle0_301.jpg A 391 | 405 levle1_486.jpg A 392 | 295 levle1_374.jpg B 393 | 475 levle1_556.jpg B 394 | 478 levle1_559.jpg B 395 | 688 levle3_132.jpg C 396 | 493 levle1_574.jpg B 397 | 261 levle1_340.jpg B 398 | 274 levle1_353.jpg B 399 | 370 levle1_450.jpg B 400 | 723 levle3_92.jpg D 401 | 84 levle0_359.jpg A 402 | 176 levle0_460.jpg A 403 | 589 levle2_130.jpg B 404 | 60 levle0_331.jpg A 405 | 80 levle0_355.jpg A 406 | 395 levle1_476.jpg B 407 | 87 levle0_362.jpg A 408 | 326 levle1_405.jpg B 409 | 307 levle1_386.jpg A 410 | 658 levle3_102.jpg D 411 | 455 levle1_536.jpg A 412 | 479 levle1_560.jpg A 413 | 289 levle1_368.jpg A 414 | 18 levle0_289.jpg A 415 | 556 levle1_638.jpg B 416 | 594 levle2_136.jpg B 417 | 354 levle1_433.jpg A 418 | 565 levle2_106.jpg B 419 | 24 levle0_295.jpg A 420 | 460 levle1_541.jpg B 421 | 394 levle1_475.jpg A 422 | 521 levle1_603.jpg A 423 | 567 levle2_108.jpg C 424 | 614 levle2_156.jpg C 425 | 267 levle1_346.jpg B 426 | 97 levle0_374.jpg A 427 | 294 levle1_373.jpg A 428 | 173 levle0_457.jpg A 429 | 103 levle0_380.jpg A 430 | 558 levle1_640.jpg B 431 | 462 levle1_543.jpg B 432 | 613 levle2_155.jpg B 433 | 411 levle1_492.jpg B 434 | 224 levle0_515.jpg B 435 | 547 levle1_629.jpg B 436 | 440 levle1_521.jpg A 437 | 637 levle2_179.jpg B 438 | 215 levle0_506.jpg A 439 | 570 levle2_111.jpg C 440 | 381 levle1_461.jpg A 441 | 291 levle1_370.jpg A 442 | 112 levle0_389.jpg A 443 | 27 levle0_298.jpg A 444 | 522 levle1_604.jpg B 445 | 404 levle1_485.jpg A 446 | 719 levle3_88.jpg C 447 | 48 levle0_319.jpg A 448 | 696 levle3_144.jpg D 449 | 721 levle3_90.jpg C 450 | 123 levle0_400.jpg B 451 | 95 levle0_372.jpg A 452 | 682 levle3_126.jpg C 453 | 506 levle1_587.jpg A 454 | 191 levle0_477.jpg A 455 | 312 levle1_391.jpg B 456 | 203 levle0_492.jpg A 457 | 379 levle1_459.jpg A 458 | 664 levle3_108.jpg B 459 | 717 levle3_86.jpg C 460 | 333 levle1_412.jpg A 461 | 167 levle0_451.jpg A 462 | 302 levle1_381.jpg A 463 | 8 levle0_279.jpg A 464 | 156 levle0_439.jpg A 465 | 428 levle1_509.jpg A 466 | 375 levle1_455.jpg B 467 | 518 levle1_599.jpg B 468 | 304 levle1_383.jpg A 469 | 559 levle1_641.jpg C 470 | 288 levle1_367.jpg A 471 | 480 levle1_561.jpg A 472 | 563 levle2_102.jpg A 473 | 661 levle3_105.jpg C 474 | 86 levle0_361.jpg A 475 | 406 levle1_487.jpg B 476 | 633 levle2_175.jpg C 477 | 497 levle1_578.jpg B 478 | 543 levle1_625.jpg B 479 | 542 levle1_624.jpg B 480 | 187 levle0_473.jpg A 481 | 571 levle2_112.jpg C 482 | 276 levle1_355.jpg A 483 | 353 levle1_432.jpg A 484 | 42 levle0_313.jpg A 485 | 679 levle3_123.jpg D 486 | 300 levle1_379.jpg A 487 | 665 levle3_109.jpg D 488 | 536 levle1_618.jpg A 489 | 228 levle0_519.jpg A 490 | 463 levle1_544.jpg A 491 | 609 levle2_151.jpg B 492 | 141 levle0_419.jpg A 493 | 695 levle3_143.jpg D 494 | 630 levle2_172.jpg A 495 | 174 levle0_458.jpg A 496 | 619 levle2_161.jpg B 497 | 226 levle0_517.jpg A 498 | 207 levle0_496.jpg A 499 | 134 levle0_412.jpg A 500 | 576 levle2_117.jpg A 501 | 502 levle1_583.jpg A 502 | 711 levle3_80.jpg C 503 | 259 levle1_338.jpg A 504 | 150 levle0_428.jpg A 505 | 627 levle2_169.jpg B 506 | 238 levle0_530.jpg A 507 | 544 levle1_626.jpg A 508 | 653 levle2_97.jpg B 509 | 678 levle3_122.jpg B 510 | 99 levle0_376.jpg A 511 | 388 levle1_468.jpg A 512 | 523 levle1_605.jpg A 513 | 693 levle3_141.jpg C 514 | 368 levle1_448.jpg A 515 | 260 levle1_339.jpg A 516 | 356 levle1_435.jpg A 517 | 56 levle0_327.jpg A 518 | 550 levle1_632.jpg A 519 | 531 levle1_613.jpg A 520 | 71 levle0_343.jpg A 521 | 204 levle0_493.jpg A 522 | 391 levle1_471.jpg A 523 | 418 levle1_499.jpg A 524 | 434 levle1_515.jpg A 525 | 214 levle0_505.jpg A 526 | 7 levle0_278.jpg A 527 | 118 levle0_395.jpg A 528 | 373 levle1_453.jpg C 529 | 272 levle1_351.jpg A 530 | 213 levle0_504.jpg A 531 | 652 levle2_96.jpg C 532 | 566 levle2_107.jpg C 533 | 474 levle1_555.jpg A 534 | 315 levle1_394.jpg B 535 | 649 levle2_93.jpg B 536 | 212 levle0_503.jpg A 537 | 436 levle1_517.jpg A 538 | 683 levle3_127.jpg C 539 | 706 levle3_75.jpg D 540 | 186 levle0_471.jpg A 541 | 654 levle2_98.jpg B 542 | 196 levle0_484.jpg A 543 | 599 levle2_141.jpg C 544 | 710 levle3_79.jpg C 545 | 144 levle0_422.jpg A 546 | 488 levle1_569.jpg B 547 | 166 levle0_450.jpg A 548 | 292 levle1_371.jpg A 549 | 108 levle0_385.jpg A 550 | 47 levle0_318.jpg A 551 | 91 levle0_366.jpg A 552 | 296 levle1_375.jpg A 553 | 252 levle1_331.jpg A 554 | 625 levle2_167.jpg B 555 | 303 levle1_382.jpg A 556 | 119 levle0_396.jpg A 557 | 25 levle0_296.jpg A 558 | 490 levle1_571.jpg B 559 | 200 levle0_488.jpg A 560 | 727 levle3_96.jpg D 561 | 330 levle1_409.jpg A 562 | 243 levle1_322.jpg A 563 | 157 levle0_440.jpg A 564 | 535 levle1_617.jpg A 565 | 606 levle2_148.jpg B 566 | 336 levle1_415.jpg A 567 | 433 levle1_514.jpg A 568 | 573 levle2_114.jpg A 569 | 265 levle1_344.jpg A 570 | 351 levle1_430.jpg A 571 | 457 levle1_538.jpg A 572 | 718 levle3_87.jpg C 573 | 675 levle3_119.jpg C 574 | 469 levle1_550.jpg A 575 | 707 levle3_76.jpg C 576 | 496 levle1_577.jpg A 577 | 464 levle1_545.jpg A 578 | 111 levle0_388.jpg A 579 | 155 levle0_438.jpg A 580 | 94 levle0_371.jpg A 581 | 358 levle1_437.jpg A 582 | 708 levle3_77.jpg C 583 | 139 levle0_417.jpg A 584 | 410 levle1_491.jpg B 585 | 472 levle1_553.jpg B 586 | 714 levle3_83.jpg C 587 | 647 levle2_189.jpg C 588 | 64 levle0_336.jpg A 589 | 511 levle1_592.jpg B 590 | 725 levle3_94.jpg D 591 | 532 levle1_614.jpg A 592 | 278 levle1_357.jpg A 593 | 537 levle1_619.jpg A 594 | 247 levle1_326.jpg A 595 | 507 levle1_588.jpg B 596 | 399 levle1_480.jpg A 597 | 162 levle0_446.jpg A 598 | 687 levle3_131.jpg C 599 | 414 levle1_495.jpg A 600 | 458 levle1_539.jpg A 601 | 700 levle3_68.jpg C 602 | 81 levle0_356.jpg A 603 | 248 levle1_327.jpg A 604 | 327 levle1_406.jpg A 605 | 339 levle1_418.jpg A 606 | 44 levle0_315.jpg A 607 | 557 levle1_639.jpg A 608 | 5 levle0_276.jpg A 609 | 667 levle3_111.jpg B 610 | 273 levle1_352.jpg A 611 | 122 levle0_399.jpg A 612 | 182 levle0_467.jpg A 613 | 534 levle1_616.jpg A 614 | 632 levle2_174.jpg B 615 | 146 levle0_424.jpg A 616 | 281 levle1_360.jpg A 617 | 251 levle1_330.jpg A 618 | 456 levle1_537.jpg A 619 | 424 levle1_505.jpg A 620 | 443 levle1_524.jpg A 621 | 357 levle1_436.jpg A 622 | 195 levle0_483.jpg A 623 | 170 levle0_454.jpg A 624 | 615 levle2_157.jpg A 625 | 383 levle1_463.jpg A 626 | 580 levle2_121.jpg B 627 | 393 levle1_474.jpg B 628 | 153 levle0_432.jpg A 629 | 82 levle0_357.jpg A 630 | 546 levle1_628.jpg B 631 | 73 levle0_346.jpg A 632 | 621 levle2_163.jpg B 633 | 308 levle1_387.jpg A 634 | 508 levle1_589.jpg B 635 | 32 levle0_303.jpg A 636 | 37 levle0_308.jpg A 637 | 244 levle1_323.jpg A 638 | 422 levle1_503.jpg A 639 | 229 levle0_520.jpg A 640 | 160 levle0_443.jpg A 641 | 513 levle1_594.jpg A 642 | 332 levle1_411.jpg A 643 | 598 levle2_140.jpg C 644 | 668 levle3_112.jpg A 645 | 66 levle0_338.jpg A 646 | 481 levle1_562.jpg B 647 | 446 levle1_527.jpg B 648 | 461 levle1_542.jpg A 649 | 562 levle2_101.jpg B 650 | 321 levle1_400.jpg A 651 | 692 levle3_140.jpg D 652 | 374 levle1_454.jpg A 653 | 549 levle1_631.jpg A 654 | 697 levle3_145.jpg C 655 | 199 levle0_487.jpg A 656 | 137 levle0_415.jpg A 657 | 241 levle1_0.jpg A 658 | 4 levle0_275.jpg A 659 | 596 levle2_138.jpg A 660 | 709 levle3_78.jpg C 661 | 384 levle1_464.jpg A 662 | 628 levle2_170.jpg B 663 | 450 levle1_531.jpg A 664 | 245 levle1_324.jpg A 665 | 699 levle3_67.jpg D 666 | 136 levle0_414.jpg A 667 | 371 levle1_451.jpg B 668 | 677 levle3_121.jpg C 669 | 310 levle1_389.jpg B 670 | 178 levle0_462.jpg A 671 | 467 levle1_548.jpg A 672 | 268 levle1_347.jpg A 673 | 691 levle3_137.jpg D 674 | 290 levle1_369.jpg A 675 | 431 levle1_512.jpg A 676 | 390 levle1_470.jpg A 677 | 363 levle1_443.jpg B 678 | 617 levle2_159.jpg B 679 | 142 levle0_420.jpg A 680 | 430 levle1_511.jpg A 681 | 45 levle0_316.jpg A 682 | 369 levle1_449.jpg B 683 | 255 levle1_334.jpg A 684 | 77 levle0_351.jpg A 685 | 335 levle1_414.jpg A 686 | 501 levle1_582.jpg A 687 | 533 levle1_615.jpg B 688 | 35 levle0_306.jpg A 689 | 164 levle0_448.jpg A 690 | 669 levle3_113.jpg C 691 | 284 levle1_363.jpg A 692 | 503 levle1_584.jpg A 693 | 473 levle1_554.jpg B 694 | 211 levle0_501.jpg A 695 | 15 levle0_286.jpg A 696 | 591 levle2_132.jpg B 697 | 494 levle1_575.jpg A 698 | 439 levle1_520.jpg A 699 | 33 levle0_304.jpg A 700 | 585 levle2_126.jpg B 701 | -------------------------------------------------------------------------------- /code/doctor-results/expert_b.txt: -------------------------------------------------------------------------------- 1 | 240 levle0_83.jpg A 2 | 52 levle0_146.jpg A 3 | 442 levle1_268.jpg B 4 | 547 levle1_75.jpg B 5 | 201 levle0_46.jpg A 6 | 314 levle1_152.jpg B 7 | 256 levle1_1.jpg A 8 | 448 levle1_273.jpg A 9 | 500 levle1_32.jpg B 10 | 389 levle1_22.jpg C 11 | 720 levle3_61.jpg C 12 | 559 levle1_87.jpg B 13 | 59 levle0_152.jpg A 14 | 420 levle1_248.jpg C 15 | 349 levle1_184.jpg B 16 | 138 levle0_228.jpg A 17 | 57 levle0_150.jpg A 18 | 567 levle1_94.jpg B 19 | 235 levle0_79.jpg A 20 | 597 levle2_30.jpg C 21 | 124 levle0_215.jpg A 22 | 223 levle0_67.jpg B 23 | 350 levle1_185.jpg B 24 | 127 levle0_218.jpg A 25 | 529 levle1_58.jpg A 26 | 578 levle2_13.jpg C 27 | 717 levle3_59.jpg D 28 | 17 levle0_113.jpg A 29 | 639 levle2_69.jpg C 30 | 40 levle0_135.jpg B 31 | 317 levle1_155.jpg A 32 | 53 levle0_147.jpg A 33 | 145 levle0_234.jpg A 34 | 367 levle1_20.jpg C 35 | 685 levle3_28.jpg D 36 | 257 levle1_10.jpg C 37 | 233 levle0_77.jpg A 38 | 41 levle0_136.jpg A 39 | 622 levle2_53.jpg B 40 | 258 levle1_100.jpg B 41 | 161 levle0_25.jpg A 42 | 480 levle1_301.jpg A 43 | 10 levle0_107.jpg A 44 | 493 levle1_313.jpg B 45 | 79 levle0_170.jpg A 46 | 515 levle1_45.jpg A 47 | 502 levle1_33.jpg B 48 | 121 levle0_212.jpg A 49 | 250 levle0_94.jpg A 50 | 705 levle3_48.jpg D 51 | 225 levle0_69.jpg A 52 | 275 levle1_116.jpg B 53 | 131 levle0_221.jpg A 54 | 318 levle1_156.jpg B 55 | 194 levle0_4.jpg A 56 | 650 levle2_79.jpg B 57 | 638 levle2_68.jpg C 58 | 222 levle0_66.jpg A 59 | 185 levle0_31.jpg A 60 | 100 levle0_19.jpg A 61 | 593 levle2_27.jpg C 62 | 277 levle1_118.jpg C 63 | 140 levle0_23.jpg A 64 | 152 levle0_241.jpg A 65 | 31 levle0_126.jpg B 66 | 329 levle1_166.jpg A 67 | 135 levle0_225.jpg B 68 | 440 levle1_266.jpg B 69 | 340 levle1_176.jpg A 70 | 206 levle0_50.jpg A 71 | 387 levle1_218.jpg A 72 | 1 levle0_1.jpg A 73 | 210 levle0_54.jpg A 74 | 536 levle1_64.jpg A 75 | 110 levle0_20.jpg A 76 | 401 levle1_230.jpg A 77 | 721 levle3_62.jpg C 78 | 305 levle1_143.jpg B 79 | 656 levle2_85.jpg B 80 | 75 levle0_167.jpg A 81 | 711 levle3_53.jpg C 82 | 386 levle1_217.jpg B 83 | 68 levle0_160.jpg A 84 | 113 levle0_204.jpg A 85 | 435 levle1_261.jpg B 86 | 299 levle1_138.jpg A 87 | 380 levle1_211.jpg A 88 | 104 levle0_194.jpg B 89 | 62 levle0_155.jpg A 90 | 172 levle0_260.jpg C 91 | 287 levle1_127.jpg B 92 | 441 levle1_267.jpg B 93 | 319 levle1_157.jpg B 94 | 704 levle3_47.jpg C 95 | 237 levle0_80.jpg A 96 | 208 levle0_52.jpg A 97 | 341 levle1_177.jpg B 98 | 396 levle1_226.jpg B 99 | 606 levle2_39.jpg C 100 | 587 levle2_21.jpg D 101 | 378 levle1_21.jpg B 102 | 69 levle0_161.jpg A 103 | 348 levle1_183.jpg A 104 | 460 levle1_284.jpg A 105 | 623 levle2_54.jpg C 106 | 283 levle1_123.jpg B 107 | 177 levle0_266.jpg A 108 | 22 levle0_118.jpg A 109 | 571 levle1_98.jpg B 110 | 149 levle0_239.jpg A 111 | 58 levle0_151.jpg A 112 | 188 levle0_34.jpg A 113 | 569 levle1_96.jpg A 114 | 128 levle0_219.jpg A 115 | 693 levle3_37.jpg D 116 | 462 levle1_286.jpg B 117 | 92 levle0_182.jpg A 118 | 280 levle1_120.jpg B 119 | 538 levle1_66.jpg A 120 | 72 levle0_164.jpg A 121 | 106 levle0_196.jpg A 122 | 61 levle0_154.jpg A 123 | 352 levle1_187.jpg B 124 | 499 levle1_319.jpg B 125 | 55 levle0_149.jpg A 126 | 249 levle0_92.jpg A 127 | 595 levle2_29.jpg C 128 | 609 levle2_41.jpg C 129 | 372 levle1_204.jpg B 130 | 662 levle2_90.jpg C 131 | 311 levle1_15.jpg C 132 | 323 levle1_160.jpg B 133 | 143 levle0_232.jpg A 134 | 483 levle1_304.jpg B 135 | 619 levle2_50.jpg C 136 | 444 levle1_27.jpg B 137 | 362 levle1_196.jpg B 138 | 337 levle1_173.jpg B 139 | 647 levle2_76.jpg C 140 | 603 levle2_36.jpg C 141 | 485 levle1_306.jpg B 142 | 607 levle2_4.jpg C 143 | 688 levle3_30.jpg C 144 | 385 levle1_216.jpg B 145 | 573 levle2_0.jpg C 146 | 588 levle2_22.jpg C 147 | 345 levle1_180.jpg B 148 | 133 levle0_223.jpg A 149 | 471 levle1_294.jpg A 150 | 343 levle1_179.jpg B 151 | 70 levle0_162.jpg A 152 | 205 levle0_5.jpg B 153 | 482 levle1_303.jpg B 154 | 334 levle1_170.jpg B 155 | 151 levle0_240.jpg A 156 | 246 levle0_9.jpg A 157 | 11 levle0_108.jpg A 158 | 163 levle0_251.jpg A 159 | 316 levle1_154.jpg B 160 | 129 levle0_22.jpg A 161 | 331 levle1_168.jpg A 162 | 566 levle1_93.jpg A 163 | 649 levle2_78.jpg C 164 | 510 levle1_40.jpg C 165 | 190 levle0_36.jpg B 166 | 269 levle1_110.jpg B 167 | 524 levle1_53.jpg B 168 | 470 levle1_293.jpg A 169 | 232 levle0_76.jpg A 170 | 620 levle2_51.jpg C 171 | 498 levle1_318.jpg C 172 | 525 levle1_54.jpg B 173 | 76 levle0_168.jpg A 174 | 634 levle2_64.jpg B 175 | 29 levle0_124.jpg A 176 | 171 levle0_26.jpg A 177 | 627 levle2_58.jpg B 178 | 342 levle1_178.jpg B 179 | 612 levle2_44.jpg C 180 | 421 levle1_249.jpg B 181 | 489 levle1_31.jpg C 182 | 415 levle1_243.jpg C 183 | 528 levle1_57.jpg B 184 | 645 levle2_74.jpg B 185 | 477 levle1_3.jpg B 186 | 218 levle0_61.jpg A 187 | 209 levle0_53.jpg A 188 | 563 levle1_90.jpg A 189 | 165 levle0_253.jpg A 190 | 193 levle0_39.jpg A 191 | 577 levle2_12.jpg B 192 | 570 levle1_97.jpg A 193 | 320 levle1_158.jpg B 194 | 264 levle1_106.jpg A 195 | 487 levle1_308.jpg A 196 | 437 levle1_263.jpg C 197 | 130 levle0_220.jpg A 198 | 109 levle0_2.jpg A 199 | 132 levle0_222.jpg A 200 | 514 levle1_44.jpg A 201 | 611 levle2_43.jpg C 202 | 581 levle2_16.jpg C 203 | 465 levle1_289.jpg A 204 | 0 levle0_0.jpg A 205 | 236 levle0_8.jpg A 206 | 158 levle0_247.jpg B 207 | 689 levle3_31.jpg C 208 | 658 levle2_87.jpg B 209 | 509 levle1_4.jpg B 210 | 683 levle3_26.jpg C 211 | 673 levle3_17.jpg D 212 | 540 levle1_68.jpg C 213 | 727 levle3_9.jpg D 214 | 322 levle1_16.jpg C 215 | 497 levle1_317.jpg C 216 | 20 levle0_116.jpg A 217 | 518 levle1_48.jpg B 218 | 416 levle1_244.jpg A 219 | 254 levle0_98.jpg A 220 | 382 levle1_213.jpg B 221 | 23 levle0_119.jpg A 222 | 654 levle2_83.jpg C 223 | 263 levle1_105.jpg B 224 | 67 levle0_16.jpg A 225 | 701 levle3_44.jpg D 226 | 412 levle1_240.jpg C 227 | 601 levle2_34.jpg C 228 | 93 levle0_183.jpg B 229 | 635 levle2_65.jpg C 230 | 360 levle1_194.jpg C 231 | 338 levle1_174.jpg C 232 | 504 levle1_35.jpg C 233 | 667 levle3_11.jpg D 234 | 102 levle0_192.jpg A 235 | 282 levle1_122.jpg A 236 | 582 levle2_17.jpg B 237 | 85 levle0_176.jpg A 238 | 116 levle0_207.jpg A 239 | 484 levle1_305.jpg A 240 | 270 levle1_111.jpg A 241 | 344 levle1_18.jpg C 242 | 179 levle0_268.jpg B 243 | 594 levle2_28.jpg C 244 | 43 levle0_138.jpg A 245 | 556 levle1_83.jpg B 246 | 12 levle0_109.jpg A 247 | 230 levle0_74.jpg A 248 | 107 levle0_197.jpg A 249 | 313 levle1_151.jpg A 250 | 46 levle0_140.jpg A 251 | 253 levle0_97.jpg A 252 | 189 levle0_35.jpg B 253 | 293 levle1_132.jpg A 254 | 590 levle2_24.jpg C 255 | 3 levle0_100.jpg B 256 | 34 levle0_129.jpg A 257 | 266 levle1_108.jpg B 258 | 298 levle1_137.jpg C 259 | 279 levle1_12.jpg B 260 | 28 levle0_123.jpg A 261 | 14 levle0_110.jpg A 262 | 63 levle0_156.jpg A 263 | 584 levle2_19.jpg C 264 | 602 levle2_35.jpg B 265 | 398 levle1_228.jpg B 266 | 523 levle1_52.jpg B 267 | 301 levle1_14.jpg B 268 | 651 levle2_8.jpg B 269 | 126 levle0_217.jpg A 270 | 427 levle1_254.jpg A 271 | 531 levle1_6.jpg A 272 | 65 levle0_158.jpg A 273 | 105 levle0_195.jpg A 274 | 9 levle0_106.jpg A 275 | 405 levle1_234.jpg B 276 | 407 levle1_236.jpg B 277 | 408 levle1_237.jpg B 278 | 183 levle0_28.jpg A 279 | 417 levle1_245.jpg A 280 | 516 levle1_46.jpg B 281 | 426 levle1_253.jpg A 282 | 220 levle0_63.jpg A 283 | 429 levle1_256.jpg B 284 | 16 levle0_112.jpg A 285 | 586 levle2_20.jpg C 286 | 38 levle0_133.jpg A 287 | 13 levle0_11.jpg A 288 | 271 levle1_112.jpg C 289 | 285 levle1_125.jpg B 290 | 96 levle0_186.jpg A 291 | 715 levle3_57.jpg C 292 | 377 levle1_209.jpg A 293 | 147 levle0_236.jpg A 294 | 576 levle2_11.jpg C 295 | 519 levle1_49.jpg B 296 | 703 levle3_46.jpg D 297 | 346 levle1_181.jpg B 298 | 242 levle0_86.jpg B 299 | 643 levle2_72.jpg C 300 | 438 levle1_264.jpg B 301 | 117 levle0_209.jpg A 302 | 197 levle0_42.jpg A 303 | 403 levle1_232.jpg A 304 | 6 levle0_103.jpg A 305 | 506 levle1_37.jpg B 306 | 527 levle1_56.jpg C 307 | 125 levle0_216.jpg B 308 | 560 levle1_88.jpg B 309 | 423 levle1_250.jpg B 310 | 625 levle2_56.jpg C 311 | 50 levle0_144.jpg A 312 | 633 levle2_63.jpg B 313 | 148 levle0_238.jpg A 314 | 568 levle1_95.jpg A 315 | 376 levle1_208.jpg A 316 | 54 levle0_148.jpg A 317 | 120 levle0_211.jpg A 318 | 402 levle1_231.jpg A 319 | 392 levle1_222.jpg B 320 | 552 levle1_8.jpg C 321 | 544 levle1_71.jpg C 322 | 526 levle1_55.jpg B 323 | 366 levle1_2.jpg C 324 | 486 levle1_307.jpg A 325 | 297 levle1_136.jpg B 326 | 347 levle1_182.jpg B 327 | 88 levle0_179.jpg B 328 | 19 levle0_115.jpg B 329 | 630 levle2_60.jpg D 330 | 239 levle0_82.jpg A 331 | 475 levle1_298.jpg B 332 | 447 levle1_272.jpg B 333 | 83 levle0_174.jpg B 334 | 640 levle2_7.jpg C 335 | 592 levle2_26.jpg C 336 | 400 levle1_23.jpg C 337 | 39 levle0_134.jpg B 338 | 359 levle1_193.jpg C 339 | 306 levle1_144.jpg C 340 | 202 levle0_47.jpg A 341 | 365 levle1_199.jpg B 342 | 154 levle0_243.jpg A 343 | 364 levle1_198.jpg B 344 | 539 levle1_67.jpg B 345 | 702 levle3_45.jpg D 346 | 325 levle1_162.jpg B 347 | 653 levle2_82.jpg D 348 | 90 levle0_180.jpg A 349 | 665 levle3_1.jpg D 350 | 719 levle3_60.jpg D 351 | 114 levle0_205.jpg B 352 | 159 levle0_248.jpg B 353 | 610 levle2_42.jpg C 354 | 26 levle0_121.jpg A 355 | 455 levle1_28.jpg B 356 | 413 levle1_241.jpg B 357 | 192 levle0_38.jpg B 358 | 679 levle3_22.jpg C 359 | 184 levle0_3.jpg A 360 | 219 levle0_62.jpg A 361 | 522 levle1_51.jpg B 362 | 642 levle2_71.jpg C 363 | 324 levle1_161.jpg C 364 | 604 levle2_37.jpg C 365 | 583 levle2_18.jpg C 366 | 21 levle0_117.jpg B 367 | 78 levle0_17.jpg A 368 | 328 levle1_165.jpg B 369 | 221 levle0_64.jpg B 370 | 49 levle0_143.jpg A 371 | 661 levle2_9.jpg C 372 | 198 levle0_43.jpg B 373 | 234 levle0_78.jpg A 374 | 262 levle1_104.jpg C 375 | 286 levle1_126.jpg B 376 | 175 levle0_264.jpg B 377 | 216 levle0_6.jpg A 378 | 181 levle0_27.jpg A 379 | 89 levle0_18.jpg B 380 | 631 levle2_61.jpg C 381 | 495 levle1_315.jpg C 382 | 476 levle1_299.jpg B 383 | 231 levle0_75.jpg B 384 | 453 levle1_278.jpg A 385 | 684 levle3_27.jpg C 386 | 361 levle1_195.jpg B 387 | 227 levle0_70.jpg B 388 | 74 levle0_166.jpg A 389 | 30 levle0_125.jpg B 390 | 419 levle1_247.jpg B 391 | 295 levle1_134.jpg C 392 | 432 levle1_259.jpg B 393 | 409 levle1_238.jpg B 394 | 687 levle3_3.jpg C 395 | 492 levle1_312.jpg B 396 | 261 levle1_103.jpg C 397 | 274 levle1_115.jpg C 398 | 370 levle1_202.jpg B 399 | 722 levle3_63.jpg C 400 | 84 levle0_175.jpg B 401 | 176 levle0_265.jpg A 402 | 690 levle3_33.jpg D 403 | 60 levle0_153.jpg B 404 | 80 levle0_171.jpg A 405 | 395 levle1_225.jpg C 406 | 87 levle0_178.jpg B 407 | 326 levle1_163.jpg B 408 | 307 levle1_145.jpg B 409 | 545 levle1_72.jpg B 410 | 454 levle1_279.jpg A 411 | 478 levle1_30.jpg C 412 | 289 levle1_129.jpg B 413 | 18 levle0_114.jpg B 414 | 555 levle1_82.jpg B 415 | 550 levle1_78.jpg B 416 | 354 levle1_189.jpg B 417 | 564 levle1_91.jpg B 418 | 24 levle0_12.jpg A 419 | 459 levle1_283.jpg A 420 | 394 levle1_224.jpg B 421 | 520 levle1_5.jpg B 422 | 468 levle1_291.jpg B 423 | 613 levle2_45.jpg B 424 | 267 levle1_109.jpg C 425 | 97 levle0_187.jpg B 426 | 294 levle1_133.jpg B 427 | 173 levle0_261.jpg B 428 | 103 levle0_193.jpg B 429 | 659 levle2_88.jpg C 430 | 675 levle3_19.jpg C 431 | 553 levle1_80.jpg C 432 | 411 levle1_24.jpg C 433 | 224 levle0_68.jpg B 434 | 657 levle2_86.jpg B 435 | 725 levle3_7.jpg C 436 | 714 levle3_56.jpg D 437 | 215 levle0_59.jpg B 438 | 641 levle2_70.jpg C 439 | 381 levle1_212.jpg B 440 | 291 levle1_130.jpg B 441 | 112 levle0_203.jpg A 442 | 27 levle0_122.jpg A 443 | 521 levle1_50.jpg A 444 | 404 levle1_233.jpg A 445 | 718 levle3_6.jpg B 446 | 48 levle0_142.jpg A 447 | 561 levle1_89.jpg A 448 | 599 levle2_32.jpg C 449 | 123 levle0_214.jpg B 450 | 95 levle0_185.jpg B 451 | 681 levle3_24.jpg D 452 | 505 levle1_36.jpg B 453 | 191 levle0_37.jpg A 454 | 312 levle1_150.jpg B 455 | 203 levle0_48.jpg A 456 | 379 levle1_210.jpg B 457 | 663 levle2_92.jpg C 458 | 716 levle3_58.jpg D 459 | 333 levle1_17.jpg C 460 | 167 levle0_256.jpg A 461 | 302 levle1_140.jpg B 462 | 8 levle0_105.jpg A 463 | 156 levle0_245.jpg A 464 | 428 levle1_255.jpg B 465 | 375 levle1_207.jpg B 466 | 517 levle1_47.jpg B 467 | 304 levle1_142.jpg B 468 | 558 levle1_85.jpg B 469 | 288 levle1_128.jpg B 470 | 479 levle1_300.jpg B 471 | 636 levle2_66.jpg B 472 | 660 levle2_89.jpg C 473 | 86 levle0_177.jpg B 474 | 406 levle1_235.jpg B 475 | 637 levle2_67.jpg B 476 | 574 levle2_1.jpg C 477 | 542 levle1_7.jpg B 478 | 541 levle1_69.jpg B 479 | 187 levle0_33.jpg B 480 | 512 levle1_42.jpg B 481 | 276 levle1_117.jpg C 482 | 353 levle1_188.jpg B 483 | 42 levle0_137.jpg A 484 | 678 levle3_21.jpg C 485 | 300 levle1_139.jpg B 486 | 664 levle3_0.jpg C 487 | 676 levle3_2.jpg D 488 | 228 levle0_72.jpg A 489 | 463 levle1_287.jpg A 490 | 608 levle2_40.jpg B 491 | 141 levle0_230.jpg A 492 | 694 levle3_38.jpg C 493 | 629 levle2_6.jpg C 494 | 174 levle0_263.jpg A 495 | 618 levle2_5.jpg C 496 | 226 levle0_7.jpg B 497 | 207 levle0_51.jpg A 498 | 134 levle0_224.jpg A 499 | 575 levle2_10.jpg C 500 | 723 levle3_64.jpg C 501 | 710 levle3_52.jpg C 502 | 259 levle1_101.jpg B 503 | 150 levle0_24.jpg A 504 | 626 levle2_57.jpg C 505 | 238 levle0_81.jpg A 506 | 543 levle1_70.jpg B 507 | 652 levle2_81.jpg C 508 | 695 levle3_39.jpg D 509 | 99 levle0_189.jpg B 510 | 388 levle1_219.jpg B 511 | 217 levle0_60.jpg A 512 | 692 levle3_36.jpg B 513 | 368 levle1_200.jpg B 514 | 260 levle1_102.jpg B 515 | 356 levle1_190.jpg C 516 | 56 levle0_15.jpg A 517 | 680 levle3_23.jpg D 518 | 530 levle1_59.jpg B 519 | 71 levle0_163.jpg A 520 | 204 levle0_49.jpg A 521 | 391 levle1_221.jpg B 522 | 418 levle1_246.jpg B 523 | 434 levle1_260.jpg B 524 | 214 levle0_58.jpg A 525 | 7 levle0_104.jpg A 526 | 118 levle0_21.jpg A 527 | 373 levle1_205.jpg B 528 | 272 levle1_113.jpg B 529 | 213 levle0_57.jpg B 530 | 614 levle2_46.jpg C 531 | 565 levle1_92.jpg B 532 | 474 levle1_297.jpg B 533 | 315 levle1_153.jpg B 534 | 648 levle2_77.jpg C 535 | 212 levle0_56.jpg A 536 | 436 levle1_262.jpg B 537 | 682 levle3_25.jpg D 538 | 616 levle2_48.jpg C 539 | 186 levle0_32.jpg B 540 | 579 levle2_14.jpg C 541 | 196 levle0_41.jpg B 542 | 670 levle3_14.jpg C 543 | 709 levle3_51.jpg C 544 | 144 levle0_233.jpg B 545 | 488 levle1_309.jpg B 546 | 166 levle0_255.jpg A 547 | 292 levle1_131.jpg B 548 | 108 levle0_198.jpg B 549 | 47 levle0_141.jpg B 550 | 91 levle0_181.jpg A 551 | 296 levle1_135.jpg B 552 | 252 levle0_96.jpg A 553 | 624 levle2_55.jpg C 554 | 303 levle1_141.jpg B 555 | 119 levle0_210.jpg B 556 | 25 levle0_120.jpg B 557 | 490 levle1_310.jpg B 558 | 200 levle0_45.jpg B 559 | 726 levle3_8.jpg C 560 | 330 levle1_167.jpg C 561 | 243 levle0_87.jpg A 562 | 157 levle0_246.jpg B 563 | 535 levle1_63.jpg B 564 | 605 levle2_38.jpg B 565 | 336 levle1_172.jpg B 566 | 433 levle1_26.jpg B 567 | 589 levle2_23.jpg C 568 | 265 levle1_107.jpg B 569 | 351 levle1_186.jpg B 570 | 457 levle1_281.jpg B 571 | 671 levle3_15.jpg C 572 | 674 levle3_18.jpg C 573 | 469 levle1_292.jpg B 574 | 706 levle3_49.jpg D 575 | 496 levle1_316.jpg C 576 | 464 levle1_288.jpg C 577 | 111 levle0_202.jpg A 578 | 155 levle0_244.jpg A 579 | 94 levle0_184.jpg B 580 | 358 levle1_192.jpg C 581 | 51 levle0_145.jpg A 582 | 672 levle3_16.jpg D 583 | 548 levle1_76.jpg B 584 | 449 levle1_274.jpg B 585 | 2 levle0_10.jpg B 586 | 36 levle0_131.jpg B 587 | 425 levle1_252.jpg B 588 | 101 levle0_190.jpg B 589 | 451 levle1_276.jpg B 590 | 572 levle1_99.jpg C 591 | 169 levle0_258.jpg B 592 | 600 levle2_33.jpg C 593 | 397 levle1_227.jpg B 594 | 551 levle1_79.jpg B 595 | 644 levle2_73.jpg C 596 | 554 levle1_81.jpg C 597 | 707 levle3_5.jpg D 598 | 139 levle0_229.jpg B 599 | 410 levle1_239.jpg B 600 | 472 levle1_295.jpg B 601 | 713 levle3_55.jpg C 602 | 646 levle2_75.jpg C 603 | 64 levle0_157.jpg A 604 | 511 levle1_41.jpg B 605 | 724 levle3_65.jpg C 606 | 532 levle1_60.jpg A 607 | 278 levle1_119.jpg B 608 | 537 levle1_65.jpg B 609 | 247 levle0_90.jpg B 610 | 507 levle1_38.jpg B 611 | 399 levle1_229.jpg B 612 | 162 levle0_250.jpg A 613 | 686 levle3_29.jpg C 614 | 414 levle1_242.jpg A 615 | 458 levle1_282.jpg B 616 | 699 levle3_42.jpg C 617 | 81 levle0_172.jpg B 618 | 248 levle0_91.jpg A 619 | 327 levle1_164.jpg B 620 | 339 levle1_175.jpg B 621 | 44 levle0_139.jpg B 622 | 557 levle1_84.jpg C 623 | 5 levle0_102.jpg C 624 | 666 levle3_10.jpg C 625 | 445 levle1_270.jpg C 626 | 712 levle3_54.jpg C 627 | 355 levle1_19.jpg B 628 | 491 levle1_311.jpg B 629 | 180 levle0_269.jpg B 630 | 697 levle3_40.jpg D 631 | 168 levle0_257.jpg B 632 | 309 levle1_147.jpg B 633 | 466 levle1_29.jpg C 634 | 273 levle1_114.jpg C 635 | 122 levle0_213.jpg B 636 | 182 levle0_270.jpg A 637 | 534 levle1_62.jpg A 638 | 632 levle2_62.jpg B 639 | 146 levle0_235.jpg B 640 | 281 levle1_121.jpg B 641 | 251 levle0_95.jpg A 642 | 456 levle1_280.jpg B 643 | 424 levle1_251.jpg A 644 | 443 levle1_269.jpg B 645 | 357 levle1_191.jpg C 646 | 195 levle0_40.jpg B 647 | 170 levle0_259.jpg A 648 | 452 levle1_277.jpg C 649 | 98 levle0_188.jpg B 650 | 115 levle0_206.jpg B 651 | 655 levle2_84.jpg C 652 | 615 levle2_47.jpg C 653 | 383 levle1_214.jpg B 654 | 580 levle2_15.jpg C 655 | 393 levle1_223.jpg B 656 | 153 levle0_242.jpg B 657 | 82 levle0_173.jpg A 658 | 546 levle1_74.jpg B 659 | 73 levle0_165.jpg A 660 | 621 levle2_52.jpg C 661 | 308 levle1_146.jpg B 662 | 508 levle1_39.jpg B 663 | 32 levle0_127.jpg A 664 | 37 levle0_132.jpg A 665 | 244 levle0_88.jpg A 666 | 422 levle1_25.jpg B 667 | 229 levle0_73.jpg B 668 | 160 levle0_249.jpg B 669 | 513 levle1_43.jpg B 670 | 332 levle1_169.jpg B 671 | 598 levle2_31.jpg C 672 | 668 levle3_12.jpg C 673 | 66 levle0_159.jpg B 674 | 481 levle1_302.jpg C 675 | 446 levle1_271.jpg C 676 | 461 levle1_285.jpg C 677 | 562 levle1_9.jpg C 678 | 321 levle1_159.jpg C 679 | 700 levle3_43.jpg C 680 | 374 levle1_206.jpg B 681 | 549 levle1_77.jpg C 682 | 696 levle3_4.jpg D 683 | 199 levle0_44.jpg C 684 | 137 levle0_227.jpg A 685 | 241 levle0_85.jpg A 686 | 4 levle0_101.jpg A 687 | 596 levle2_3.jpg C 688 | 708 levle3_50.jpg C 689 | 384 levle1_215.jpg C 690 | 628 levle2_59.jpg D 691 | 450 levle1_275.jpg C 692 | 245 levle0_89.jpg B 693 | 698 levle3_41.jpg C 694 | 136 levle0_226.jpg A 695 | 371 levle1_203.jpg B 696 | 677 levle3_20.jpg C 697 | 310 levle1_149.jpg B 698 | 178 levle0_267.jpg B 699 | 467 levle1_290.jpg B 700 | 268 levle1_11.jpg B 701 | 691 levle3_34.jpg C 702 | 290 levle1_13.jpg B 703 | 431 levle1_258.jpg B 704 | 390 levle1_220.jpg B 705 | 363 levle1_197.jpg B 706 | 617 levle2_49.jpg C 707 | 142 levle0_231.jpg B 708 | 430 levle1_257.jpg B 709 | 45 levle0_14.jpg B 710 | 369 levle1_201.jpg B 711 | 255 levle0_99.jpg A 712 | 77 levle0_169.jpg A 713 | 335 levle1_171.jpg B 714 | 501 levle1_320.jpg B 715 | 533 levle1_61.jpg C 716 | 35 levle0_130.jpg A 717 | 164 levle0_252.jpg A 718 | 669 levle3_13.jpg C 719 | 284 levle1_124.jpg B 720 | 503 levle1_34.jpg C 721 | 473 levle1_296.jpg B 722 | 211 levle0_55.jpg B 723 | 15 levle0_111.jpg B 724 | 591 levle2_25.jpg C 725 | 494 levle1_314.jpg C 726 | 439 levle1_265.jpg C 727 | 33 levle0_128.jpg C 728 | 585 levle2_2.jpg C 729 | -------------------------------------------------------------------------------- /code/doctor-results/general_b.txt: -------------------------------------------------------------------------------- 1 | 240 levle0_83.jpg B 2 | 52 levle0_146.jpg A 3 | 442 levle1_268.jpg B 4 | 547 levle1_75.jpg B 5 | 201 levle0_46.jpg A 6 | 314 levle1_152.jpg B 7 | 256 levle1_1.jpg B 8 | 448 levle1_273.jpg B 9 | 500 levle1_32.jpg B 10 | 389 levle1_22.jpg C 11 | 720 levle3_61.jpg D 12 | 559 levle1_87.jpg B 13 | 59 levle0_152.jpg A 14 | 420 levle1_248.jpg B 15 | 349 levle1_184.jpg C 16 | 138 levle0_228.jpg A 17 | 57 levle0_150.jpg A 18 | 567 levle1_94.jpg C 19 | 235 levle0_79.jpg A 20 | 597 levle2_30.jpg D 21 | 124 levle0_215.jpg B 22 | 223 levle0_67.jpg B 23 | 350 levle1_185.jpg B 24 | 127 levle0_218.jpg A 25 | 529 levle1_58.jpg B 26 | 578 levle2_13.jpg D 27 | 717 levle3_59.jpg D 28 | 17 levle0_113.jpg A 29 | 639 levle2_69.jpg C 30 | 40 levle0_135.jpg A 31 | 317 levle1_155.jpg A 32 | 53 levle0_147.jpg A 33 | 145 levle0_234.jpg A 34 | 367 levle1_20.jpg C 35 | 685 levle3_28.jpg D 36 | 257 levle1_10.jpg C 37 | 233 levle0_77.jpg B 38 | 41 levle0_136.jpg A 39 | 622 levle2_53.jpg C 40 | 258 levle1_100.jpg B 41 | 161 levle0_25.jpg A 42 | 480 levle1_301.jpg B 43 | 10 levle0_107.jpg A 44 | 493 levle1_313.jpg B 45 | 79 levle0_170.jpg A 46 | 515 levle1_45.jpg B 47 | 502 levle1_33.jpg B 48 | 121 levle0_212.jpg B 49 | 250 levle0_94.jpg A 50 | 705 levle3_48.jpg D 51 | 225 levle0_69.jpg C 52 | 275 levle1_116.jpg B 53 | 131 levle0_221.jpg A 54 | 318 levle1_156.jpg B 55 | 194 levle0_4.jpg B 56 | 650 levle2_79.jpg B 57 | 638 levle2_68.jpg B 58 | 222 levle0_66.jpg B 59 | 185 levle0_31.jpg B 60 | 100 levle0_19.jpg B 61 | 593 levle2_27.jpg C 62 | 277 levle1_118.jpg B 63 | 140 levle0_23.jpg A 64 | 152 levle0_241.jpg A 65 | 31 levle0_126.jpg B 66 | 329 levle1_166.jpg B 67 | 135 levle0_225.jpg C 68 | 440 levle1_266.jpg B 69 | 340 levle1_176.jpg B 70 | 206 levle0_50.jpg B 71 | 387 levle1_218.jpg B 72 | 1 levle0_1.jpg A 73 | 210 levle0_54.jpg A 74 | 536 levle1_64.jpg B 75 | 110 levle0_20.jpg B 76 | 401 levle1_230.jpg B 77 | 721 levle3_62.jpg C 78 | 305 levle1_143.jpg B 79 | 656 levle2_85.jpg C 80 | 75 levle0_167.jpg B 81 | 711 levle3_53.jpg D 82 | 386 levle1_217.jpg C 83 | 68 levle0_160.jpg A 84 | 113 levle0_204.jpg A 85 | 435 levle1_261.jpg B 86 | 299 levle1_138.jpg B 87 | 380 levle1_211.jpg B 88 | 104 levle0_194.jpg B 89 | 62 levle0_155.jpg A 90 | 172 levle0_260.jpg B 91 | 287 levle1_127.jpg C 92 | 441 levle1_267.jpg B 93 | 319 levle1_157.jpg B 94 | 704 levle3_47.jpg D 95 | 237 levle0_80.jpg A 96 | 208 levle0_52.jpg A 97 | 341 levle1_177.jpg B 98 | 396 levle1_226.jpg C 99 | 606 levle2_39.jpg C 100 | 587 levle2_21.jpg D 101 | 378 levle1_21.jpg C 102 | 69 levle0_161.jpg B 103 | 348 levle1_183.jpg B 104 | 460 levle1_284.jpg B 105 | 623 levle2_54.jpg C 106 | 283 levle1_123.jpg B 107 | 177 levle0_266.jpg A 108 | 22 levle0_118.jpg A 109 | 571 levle1_98.jpg C 110 | 149 levle0_239.jpg B 111 | 58 levle0_151.jpg B 112 | 188 levle0_34.jpg B 113 | 569 levle1_96.jpg B 114 | 128 levle0_219.jpg A 115 | 693 levle3_37.jpg D 116 | 462 levle1_286.jpg A 117 | 92 levle0_182.jpg A 118 | 280 levle1_120.jpg B 119 | 538 levle1_66.jpg B 120 | 72 levle0_164.jpg A 121 | 106 levle0_196.jpg A 122 | 61 levle0_154.jpg A 123 | 352 levle1_187.jpg B 124 | 499 levle1_319.jpg A 125 | 55 levle0_149.jpg A 126 | 249 levle0_92.jpg A 127 | 595 levle2_29.jpg C 128 | 609 levle2_41.jpg C 129 | 372 levle1_204.jpg A 130 | 662 levle2_90.jpg C 131 | 311 levle1_15.jpg C 132 | 323 levle1_160.jpg B 133 | 143 levle0_232.jpg B 134 | 483 levle1_304.jpg B 135 | 619 levle2_50.jpg C 136 | 444 levle1_27.jpg B 137 | 362 levle1_196.jpg B 138 | 337 levle1_173.jpg B 139 | 647 levle2_76.jpg C 140 | 603 levle2_36.jpg C 141 | 485 levle1_306.jpg A 142 | 607 levle2_4.jpg C 143 | 688 levle3_30.jpg D 144 | 385 levle1_216.jpg B 145 | 573 levle2_0.jpg D 146 | 588 levle2_22.jpg D 147 | 345 levle1_180.jpg B 148 | 133 levle0_223.jpg A 149 | 471 levle1_294.jpg B 150 | 343 levle1_179.jpg B 151 | 70 levle0_162.jpg A 152 | 205 levle0_5.jpg B 153 | 482 levle1_303.jpg B 154 | 334 levle1_170.jpg A 155 | 151 levle0_240.jpg A 156 | 246 levle0_9.jpg A 157 | 11 levle0_108.jpg A 158 | 163 levle0_251.jpg A 159 | 316 levle1_154.jpg B 160 | 129 levle0_22.jpg A 161 | 331 levle1_168.jpg B 162 | 566 levle1_93.jpg C 163 | 649 levle2_78.jpg C 164 | 510 levle1_40.jpg C 165 | 190 levle0_36.jpg B 166 | 269 levle1_110.jpg B 167 | 524 levle1_53.jpg B 168 | 470 levle1_293.jpg B 169 | 232 levle0_76.jpg B 170 | 620 levle2_51.jpg C 171 | 498 levle1_318.jpg B 172 | 525 levle1_54.jpg B 173 | 76 levle0_168.jpg A 174 | 634 levle2_64.jpg C 175 | 29 levle0_124.jpg B 176 | 171 levle0_26.jpg A 177 | 627 levle2_58.jpg C 178 | 342 levle1_178.jpg C 179 | 612 levle2_44.jpg C 180 | 421 levle1_249.jpg B 181 | 489 levle1_31.jpg C 182 | 415 levle1_243.jpg C 183 | 528 levle1_57.jpg C 184 | 645 levle2_74.jpg C 185 | 477 levle1_3.jpg C 186 | 218 levle0_61.jpg B 187 | 209 levle0_53.jpg A 188 | 563 levle1_90.jpg C 189 | 165 levle0_253.jpg A 190 | 193 levle0_39.jpg B 191 | 577 levle2_12.jpg C 192 | 570 levle1_97.jpg B 193 | 320 levle1_158.jpg C 194 | 264 levle1_106.jpg B 195 | 487 levle1_308.jpg A 196 | 437 levle1_263.jpg C 197 | 130 levle0_220.jpg B 198 | 109 levle0_2.jpg A 199 | 132 levle0_222.jpg A 200 | 514 levle1_44.jpg B 201 | 611 levle2_43.jpg C 202 | 581 levle2_16.jpg C 203 | 465 levle1_289.jpg B 204 | 0 levle0_0.jpg A 205 | 236 levle0_8.jpg A 206 | 158 levle0_247.jpg A 207 | 689 levle3_31.jpg D 208 | 658 levle2_87.jpg C 209 | 509 levle1_4.jpg C 210 | 683 levle3_26.jpg C 211 | 673 levle3_17.jpg D 212 | 540 levle1_68.jpg B 213 | 727 levle3_9.jpg D 214 | 322 levle1_16.jpg C 215 | 497 levle1_317.jpg B 216 | 20 levle0_116.jpg A 217 | 518 levle1_48.jpg B 218 | 416 levle1_244.jpg B 219 | 254 levle0_98.jpg A 220 | 382 levle1_213.jpg B 221 | 23 levle0_119.jpg A 222 | 654 levle2_83.jpg C 223 | 263 levle1_105.jpg B 224 | 67 levle0_16.jpg B 225 | 701 levle3_44.jpg D 226 | 412 levle1_240.jpg C 227 | 601 levle2_34.jpg C 228 | 93 levle0_183.jpg B 229 | 635 levle2_65.jpg C 230 | 360 levle1_194.jpg B 231 | 338 levle1_174.jpg C 232 | 504 levle1_35.jpg C 233 | 667 levle3_11.jpg D 234 | 102 levle0_192.jpg A 235 | 282 levle1_122.jpg B 236 | 582 levle2_17.jpg C 237 | 85 levle0_176.jpg A 238 | 116 levle0_207.jpg A 239 | 484 levle1_305.jpg B 240 | 270 levle1_111.jpg B 241 | 344 levle1_18.jpg C 242 | 179 levle0_268.jpg B 243 | 594 levle2_28.jpg C 244 | 43 levle0_138.jpg A 245 | 556 levle1_83.jpg B 246 | 12 levle0_109.jpg A 247 | 230 levle0_74.jpg B 248 | 107 levle0_197.jpg A 249 | 313 levle1_151.jpg A 250 | 46 levle0_140.jpg A 251 | 253 levle0_97.jpg A 252 | 189 levle0_35.jpg B 253 | 293 levle1_132.jpg B 254 | 590 levle2_24.jpg C 255 | 3 levle0_100.jpg B 256 | 34 levle0_129.jpg A 257 | 266 levle1_108.jpg B 258 | 298 levle1_137.jpg B 259 | 279 levle1_12.jpg C 260 | 28 levle0_123.jpg A 261 | 14 levle0_110.jpg A 262 | 63 levle0_156.jpg A 263 | 584 levle2_19.jpg C 264 | 602 levle2_35.jpg C 265 | 398 levle1_228.jpg B 266 | 523 levle1_52.jpg B 267 | 301 levle1_14.jpg C 268 | 651 levle2_8.jpg C 269 | 126 levle0_217.jpg A 270 | 427 levle1_254.jpg A 271 | 531 levle1_6.jpg B 272 | 65 levle0_158.jpg A 273 | 105 levle0_195.jpg A 274 | 9 levle0_106.jpg A 275 | 405 levle1_234.jpg B 276 | 407 levle1_236.jpg B 277 | 408 levle1_237.jpg B 278 | 183 levle0_28.jpg A 279 | 417 levle1_245.jpg B 280 | 516 levle1_46.jpg B 281 | 426 levle1_253.jpg B 282 | 220 levle0_63.jpg B 283 | 429 levle1_256.jpg B 284 | 16 levle0_112.jpg B 285 | 586 levle2_20.jpg C 286 | 38 levle0_133.jpg A 287 | 13 levle0_11.jpg A 288 | 271 levle1_112.jpg B 289 | 285 levle1_125.jpg B 290 | 96 levle0_186.jpg B 291 | 715 levle3_57.jpg C 292 | 377 levle1_209.jpg B 293 | 147 levle0_236.jpg A 294 | 576 levle2_11.jpg D 295 | 519 levle1_49.jpg B 296 | 703 levle3_46.jpg D 297 | 346 levle1_181.jpg A 298 | 242 levle0_86.jpg A 299 | 643 levle2_72.jpg C 300 | 438 levle1_264.jpg B 301 | 117 levle0_209.jpg A 302 | 197 levle0_42.jpg A 303 | 403 levle1_232.jpg B 304 | 6 levle0_103.jpg A 305 | 506 levle1_37.jpg B 306 | 527 levle1_56.jpg C 307 | 125 levle0_216.jpg A 308 | 560 levle1_88.jpg B 309 | 423 levle1_250.jpg B 310 | 625 levle2_56.jpg C 311 | 50 levle0_144.jpg A 312 | 633 levle2_63.jpg C 313 | 148 levle0_238.jpg A 314 | 568 levle1_95.jpg C 315 | 376 levle1_208.jpg B 316 | 54 levle0_148.jpg A 317 | 120 levle0_211.jpg A 318 | 402 levle1_231.jpg A 319 | 392 levle1_222.jpg A 320 | 552 levle1_8.jpg C 321 | 544 levle1_71.jpg B 322 | 526 levle1_55.jpg B 323 | 366 levle1_2.jpg C 324 | 486 levle1_307.jpg A 325 | 297 levle1_136.jpg B 326 | 347 levle1_182.jpg B 327 | 88 levle0_179.jpg A 328 | 19 levle0_115.jpg A 329 | 630 levle2_60.jpg B 330 | 239 levle0_82.jpg A 331 | 475 levle1_298.jpg B 332 | 447 levle1_272.jpg B 333 | 83 levle0_174.jpg B 334 | 640 levle2_7.jpg C 335 | 592 levle2_26.jpg C 336 | 400 levle1_23.jpg C 337 | 39 levle0_134.jpg B 338 | 359 levle1_193.jpg C 339 | 306 levle1_144.jpg B 340 | 202 levle0_47.jpg A 341 | 365 levle1_199.jpg B 342 | 154 levle0_243.jpg A 343 | 364 levle1_198.jpg B 344 | 539 levle1_67.jpg B 345 | 702 levle3_45.jpg D 346 | 325 levle1_162.jpg B 347 | 653 levle2_82.jpg C 348 | 90 levle0_180.jpg B 349 | 665 levle3_1.jpg D 350 | 719 levle3_60.jpg D 351 | 114 levle0_205.jpg A 352 | 159 levle0_248.jpg A 353 | 610 levle2_42.jpg C 354 | 26 levle0_121.jpg A 355 | 455 levle1_28.jpg C 356 | 413 levle1_241.jpg B 357 | 192 levle0_38.jpg B 358 | 679 levle3_22.jpg C 359 | 184 levle0_3.jpg A 360 | 219 levle0_62.jpg B 361 | 522 levle1_51.jpg B 362 | 642 levle2_71.jpg C 363 | 324 levle1_161.jpg B 364 | 604 levle2_37.jpg C 365 | 583 levle2_18.jpg C 366 | 21 levle0_117.jpg A 367 | 78 levle0_17.jpg A 368 | 328 levle1_165.jpg B 369 | 221 levle0_64.jpg B 370 | 49 levle0_143.jpg A 371 | 661 levle2_9.jpg C 372 | 198 levle0_43.jpg A 373 | 234 levle0_78.jpg B 374 | 262 levle1_104.jpg B 375 | 286 levle1_126.jpg B 376 | 175 levle0_264.jpg B 377 | 216 levle0_6.jpg B 378 | 181 levle0_27.jpg A 379 | 89 levle0_18.jpg B 380 | 631 levle2_61.jpg B 381 | 495 levle1_315.jpg B 382 | 476 levle1_299.jpg B 383 | 231 levle0_75.jpg B 384 | 453 levle1_278.jpg B 385 | 684 levle3_27.jpg C 386 | 361 levle1_195.jpg B 387 | 227 levle0_70.jpg B 388 | 74 levle0_166.jpg A 389 | 30 levle0_125.jpg A 390 | 419 levle1_247.jpg B 391 | 295 levle1_134.jpg B 392 | 432 levle1_259.jpg B 393 | 409 levle1_238.jpg A 394 | 687 levle3_3.jpg C 395 | 492 levle1_312.jpg B 396 | 261 levle1_103.jpg B 397 | 274 levle1_115.jpg C 398 | 370 levle1_202.jpg B 399 | 722 levle3_63.jpg C 400 | 84 levle0_175.jpg A 401 | 176 levle0_265.jpg A 402 | 690 levle3_33.jpg D 403 | 60 levle0_153.jpg A 404 | 80 levle0_171.jpg A 405 | 395 levle1_225.jpg B 406 | 87 levle0_178.jpg B 407 | 326 levle1_163.jpg B 408 | 307 levle1_145.jpg B 409 | 545 levle1_72.jpg B 410 | 454 levle1_279.jpg A 411 | 478 levle1_30.jpg C 412 | 289 levle1_129.jpg B 413 | 18 levle0_114.jpg B 414 | 555 levle1_82.jpg B 415 | 550 levle1_78.jpg B 416 | 354 levle1_189.jpg C 417 | 564 levle1_91.jpg B 418 | 24 levle0_12.jpg A 419 | 459 levle1_283.jpg A 420 | 394 levle1_224.jpg B 421 | 520 levle1_5.jpg B 422 | 468 levle1_291.jpg B 423 | 613 levle2_45.jpg D 424 | 267 levle1_109.jpg B 425 | 97 levle0_187.jpg A 426 | 294 levle1_133.jpg B 427 | 173 levle0_261.jpg B 428 | 103 levle0_193.jpg B 429 | 659 levle2_88.jpg C 430 | 675 levle3_19.jpg C 431 | 553 levle1_80.jpg C 432 | 411 levle1_24.jpg B 433 | 224 levle0_68.jpg B 434 | 657 levle2_86.jpg B 435 | 725 levle3_7.jpg C 436 | 714 levle3_56.jpg D 437 | 215 levle0_59.jpg B 438 | 641 levle2_70.jpg C 439 | 381 levle1_212.jpg B 440 | 291 levle1_130.jpg B 441 | 112 levle0_203.jpg B 442 | 27 levle0_122.jpg A 443 | 521 levle1_50.jpg B 444 | 404 levle1_233.jpg B 445 | 718 levle3_6.jpg D 446 | 48 levle0_142.jpg B 447 | 561 levle1_89.jpg B 448 | 599 levle2_32.jpg C 449 | 123 levle0_214.jpg B 450 | 95 levle0_185.jpg B 451 | 681 levle3_24.jpg D 452 | 505 levle1_36.jpg B 453 | 191 levle0_37.jpg A 454 | 312 levle1_150.jpg B 455 | 203 levle0_48.jpg B 456 | 379 levle1_210.jpg B 457 | 663 levle2_92.jpg D 458 | 716 levle3_58.jpg D 459 | 333 levle1_17.jpg C 460 | 167 levle0_256.jpg A 461 | 302 levle1_140.jpg B 462 | 8 levle0_105.jpg A 463 | 156 levle0_245.jpg B 464 | 428 levle1_255.jpg B 465 | 375 levle1_207.jpg B 466 | 517 levle1_47.jpg B 467 | 304 levle1_142.jpg B 468 | 558 levle1_85.jpg C 469 | 288 levle1_128.jpg B 470 | 479 levle1_300.jpg B 471 | 636 levle2_66.jpg B 472 | 660 levle2_89.jpg C 473 | 86 levle0_177.jpg B 474 | 406 levle1_235.jpg B 475 | 637 levle2_67.jpg B 476 | 574 levle2_1.jpg C 477 | 542 levle1_7.jpg C 478 | 541 levle1_69.jpg B 479 | 187 levle0_33.jpg B 480 | 512 levle1_42.jpg B 481 | 276 levle1_117.jpg C 482 | 353 levle1_188.jpg B 483 | 42 levle0_137.jpg A 484 | 678 levle3_21.jpg C 485 | 300 levle1_139.jpg B 486 | 664 levle3_0.jpg D 487 | 676 levle3_2.jpg D 488 | 228 levle0_72.jpg A 489 | 463 levle1_287.jpg B 490 | 608 levle2_40.jpg B 491 | 141 levle0_230.jpg A 492 | 694 levle3_38.jpg D 493 | 629 levle2_6.jpg C 494 | 174 levle0_263.jpg A 495 | 618 levle2_5.jpg B 496 | 226 levle0_7.jpg B 497 | 207 levle0_51.jpg B 498 | 134 levle0_224.jpg A 499 | 575 levle2_10.jpg C 500 | 723 levle3_64.jpg D 501 | 710 levle3_52.jpg C 502 | 259 levle1_101.jpg B 503 | 150 levle0_24.jpg B 504 | 626 levle2_57.jpg C 505 | 238 levle0_81.jpg A 506 | 543 levle1_70.jpg C 507 | 652 levle2_81.jpg C 508 | 695 levle3_39.jpg C 509 | 99 levle0_189.jpg A 510 | 388 levle1_219.jpg B 511 | 217 levle0_60.jpg B 512 | 692 levle3_36.jpg C 513 | 368 levle1_200.jpg B 514 | 260 levle1_102.jpg B 515 | 356 levle1_190.jpg C 516 | 56 levle0_15.jpg A 517 | 680 levle3_23.jpg D 518 | 530 levle1_59.jpg B 519 | 71 levle0_163.jpg A 520 | 204 levle0_49.jpg B 521 | 391 levle1_221.jpg B 522 | 418 levle1_246.jpg B 523 | 434 levle1_260.jpg B 524 | 214 levle0_58.jpg B 525 | 7 levle0_104.jpg A 526 | 118 levle0_21.jpg B 527 | 373 levle1_205.jpg B 528 | 272 levle1_113.jpg B 529 | 213 levle0_57.jpg B 530 | 614 levle2_46.jpg C 531 | 565 levle1_92.jpg B 532 | 474 levle1_297.jpg C 533 | 315 levle1_153.jpg B 534 | 648 levle2_77.jpg C 535 | 212 levle0_56.jpg B 536 | 436 levle1_262.jpg B 537 | 682 levle3_25.jpg D 538 | 616 levle2_48.jpg C 539 | 186 levle0_32.jpg B 540 | 579 levle2_14.jpg C 541 | 196 levle0_41.jpg B 542 | 670 levle3_14.jpg C 543 | 709 levle3_51.jpg C 544 | 144 levle0_233.jpg A 545 | 488 levle1_309.jpg B 546 | 166 levle0_255.jpg A 547 | 292 levle1_131.jpg B 548 | 108 levle0_198.jpg B 549 | 47 levle0_141.jpg B 550 | 91 levle0_181.jpg A 551 | 296 levle1_135.jpg B 552 | 252 levle0_96.jpg A 553 | 624 levle2_55.jpg B 554 | 303 levle1_141.jpg B 555 | 119 levle0_210.jpg B 556 | 25 levle0_120.jpg B 557 | 490 levle1_310.jpg A 558 | 200 levle0_45.jpg A 559 | 726 levle3_8.jpg C 560 | 330 levle1_167.jpg B 561 | 243 levle0_87.jpg B 562 | 157 levle0_246.jpg A 563 | 535 levle1_63.jpg B 564 | 605 levle2_38.jpg C 565 | 336 levle1_172.jpg B 566 | 433 levle1_26.jpg B 567 | 589 levle2_23.jpg C 568 | 265 levle1_107.jpg A 569 | 351 levle1_186.jpg B 570 | 457 levle1_281.jpg B 571 | 671 levle3_15.jpg C 572 | 674 levle3_18.jpg D 573 | 469 levle1_292.jpg A 574 | 706 levle3_49.jpg C 575 | 496 levle1_316.jpg B 576 | 464 levle1_288.jpg B 577 | 111 levle0_202.jpg A 578 | 155 levle0_244.jpg A 579 | 94 levle0_184.jpg B 580 | 358 levle1_192.jpg C 581 | 51 levle0_145.jpg A 582 | 672 levle3_16.jpg D 583 | 548 levle1_76.jpg B 584 | 449 levle1_274.jpg B 585 | 2 levle0_10.jpg C 586 | 36 levle0_131.jpg B 587 | 425 levle1_252.jpg B 588 | 101 levle0_190.jpg A 589 | 451 levle1_276.jpg B 590 | 572 levle1_99.jpg B 591 | 169 levle0_258.jpg A 592 | 600 levle2_33.jpg C 593 | 397 levle1_227.jpg B 594 | 551 levle1_79.jpg B 595 | 644 levle2_73.jpg C 596 | 554 levle1_81.jpg B 597 | 707 levle3_5.jpg D 598 | 139 levle0_229.jpg A 599 | 410 levle1_239.jpg B 600 | 472 levle1_295.jpg B 601 | 713 levle3_55.jpg C 602 | 646 levle2_75.jpg C 603 | 64 levle0_157.jpg A 604 | 511 levle1_41.jpg B 605 | 724 levle3_65.jpg C 606 | 532 levle1_60.jpg C 607 | 278 levle1_119.jpg B 608 | 537 levle1_65.jpg B 609 | 247 levle0_90.jpg B 610 | 507 levle1_38.jpg B 611 | 399 levle1_229.jpg B 612 | 162 levle0_250.jpg A 613 | 686 levle3_29.jpg C 614 | 414 levle1_242.jpg B 615 | 458 levle1_282.jpg A 616 | 699 levle3_42.jpg D 617 | 81 levle0_172.jpg B 618 | 248 levle0_91.jpg A 619 | 327 levle1_164.jpg B 620 | 339 levle1_175.jpg B 621 | 44 levle0_139.jpg B 622 | 557 levle1_84.jpg C 623 | 5 levle0_102.jpg B 624 | 666 levle3_10.jpg C 625 | 445 levle1_270.jpg B 626 | 712 levle3_54.jpg C 627 | 355 levle1_19.jpg B 628 | 491 levle1_311.jpg B 629 | 180 levle0_269.jpg B 630 | 697 levle3_40.jpg D 631 | 168 levle0_257.jpg B 632 | 309 levle1_147.jpg B 633 | 466 levle1_29.jpg C 634 | 273 levle1_114.jpg C 635 | 122 levle0_213.jpg A 636 | 182 levle0_270.jpg A 637 | 534 levle1_62.jpg B 638 | 632 levle2_62.jpg C 639 | 146 levle0_235.jpg B 640 | 281 levle1_121.jpg B 641 | 251 levle0_95.jpg A 642 | 456 levle1_280.jpg B 643 | 424 levle1_251.jpg A 644 | 443 levle1_269.jpg B 645 | 357 levle1_191.jpg B 646 | 195 levle0_40.jpg A 647 | 170 levle0_259.jpg A 648 | 452 levle1_277.jpg B 649 | 98 levle0_188.jpg B 650 | 115 levle0_206.jpg A 651 | 655 levle2_84.jpg C 652 | 615 levle2_47.jpg C 653 | 383 levle1_214.jpg B 654 | 580 levle2_15.jpg C 655 | 393 levle1_223.jpg B 656 | 153 levle0_242.jpg A 657 | 82 levle0_173.jpg A 658 | 546 levle1_74.jpg B 659 | 73 levle0_165.jpg A 660 | 621 levle2_52.jpg C 661 | 308 levle1_146.jpg B 662 | 508 levle1_39.jpg B 663 | 32 levle0_127.jpg A 664 | 37 levle0_132.jpg A 665 | 244 levle0_88.jpg A 666 | 422 levle1_25.jpg B 667 | 229 levle0_73.jpg B 668 | 160 levle0_249.jpg A 669 | 513 levle1_43.jpg B 670 | 332 levle1_169.jpg B 671 | 598 levle2_31.jpg C 672 | 668 levle3_12.jpg D 673 | 66 levle0_159.jpg A 674 | 481 levle1_302.jpg B 675 | 446 levle1_271.jpg B 676 | 461 levle1_285.jpg B 677 | 562 levle1_9.jpg B 678 | 321 levle1_159.jpg B 679 | 700 levle3_43.jpg C 680 | 374 levle1_206.jpg B 681 | 549 levle1_77.jpg C 682 | 696 levle3_4.jpg C 683 | 199 levle0_44.jpg B 684 | 137 levle0_227.jpg A 685 | 241 levle0_85.jpg A 686 | 4 levle0_101.jpg A 687 | 596 levle2_3.jpg C 688 | 708 levle3_50.jpg C 689 | 384 levle1_215.jpg B 690 | 628 levle2_59.jpg B 691 | 450 levle1_275.jpg B 692 | 245 levle0_89.jpg A 693 | 698 levle3_41.jpg C 694 | 136 levle0_226.jpg B 695 | 371 levle1_203.jpg B 696 | 677 levle3_20.jpg D 697 | 310 levle1_149.jpg B 698 | 178 levle0_267.jpg A 699 | 467 levle1_290.jpg A 700 | 268 levle1_11.jpg B 701 | 691 levle3_34.jpg D 702 | 290 levle1_13.jpg C 703 | 431 levle1_258.jpg B 704 | 390 levle1_220.jpg B 705 | 363 levle1_197.jpg B 706 | 617 levle2_49.jpg C 707 | 142 levle0_231.jpg A 708 | 430 levle1_257.jpg C 709 | 45 levle0_14.jpg A 710 | 369 levle1_201.jpg B 711 | 255 levle0_99.jpg A 712 | 77 levle0_169.jpg B 713 | 335 levle1_171.jpg C 714 | 501 levle1_320.jpg B 715 | 533 levle1_61.jpg B 716 | 35 levle0_130.jpg A 717 | 164 levle0_252.jpg B 718 | 669 levle3_13.jpg D 719 | 284 levle1_124.jpg C 720 | 503 levle1_34.jpg C 721 | 473 levle1_296.jpg B 722 | 211 levle0_55.jpg B 723 | 15 levle0_111.jpg B 724 | 591 levle2_25.jpg C 725 | 494 levle1_314.jpg C 726 | 439 levle1_265.jpg B 727 | 33 levle0_128.jpg B 728 | 585 levle2_2.jpg C 729 | -------------------------------------------------------------------------------- /code/doctor-results/expert_a.txt: -------------------------------------------------------------------------------- 1 | 385 levle1_465.jpg B 2 | 52 levle0_323.jpg A 3 | 329 levle1_408.jpg A 4 | 583 levle2_124.jpg B 5 | 340 levle1_419.jpg B 6 | 217 levle0_508.jpg A 7 | 372 levle1_452.jpg A 8 | 584 levle2_125.jpg C 9 | 256 levle1_335.jpg B 10 | 298 levle1_377.jpg B 11 | 364 levle1_444.jpg A 12 | 208 levle0_497.jpg A 13 | 59 levle0_330.jpg A 14 | 225 levle0_516.jpg A 15 | 350 levle1_429.jpg A 16 | 671 levle3_115.jpg C 17 | 57 levle0_328.jpg A 18 | 705 levle3_74.jpg D 19 | 236 levle0_528.jpg A 20 | 140 levle0_418.jpg A 21 | 124 levle0_401.jpg A 22 | 392 levle1_472.jpg B 23 | 569 levle2_110.jpg C 24 | 127 levle0_404.jpg A 25 | 190 levle0_476.jpg A 26 | 579 levle2_120.jpg B 27 | 459 levle1_540.jpg B 28 | 17 levle0_288.jpg A 29 | 382 levle1_462.jpg A 30 | 40 levle0_311.jpg A 31 | 318 levle1_397.jpg B 32 | 53 levle0_324.jpg A 33 | 143 levle0_421.jpg A 34 | 161 levle0_444.jpg A 35 | 686 levle3_130.jpg D 36 | 258 levle1_337.jpg B 37 | 527 levle1_609.jpg B 38 | 41 levle0_312.jpg A 39 | 623 levle2_165.jpg A 40 | 500 levle1_581.jpg A 41 | 193 levle0_480.jpg A 42 | 419 levle1_500.jpg A 43 | 10 levle0_281.jpg A 44 | 376 levle1_456.jpg A 45 | 79 levle0_354.jpg A 46 | 516 levle1_597.jpg B 47 | 552 levle1_634.jpg A 48 | 121 levle0_398.jpg A 49 | 387 levle1_467.jpg B 50 | 334 levle1_413.jpg B 51 | 726 levle3_95.jpg D 52 | 486 levle1_567.jpg C 53 | 131 levle0_409.jpg A 54 | 345 levle1_424.jpg B 55 | 607 levle2_149.jpg B 56 | 342 levle1_421.jpg A 57 | 319 levle1_398.jpg B 58 | 223 levle0_514.jpg A 59 | 539 levle1_621.jpg A 60 | 100 levle0_377.jpg A 61 | 253 levle1_332.jpg A 62 | 344 levle1_423.jpg B 63 | 484 levle1_565.jpg B 64 | 651 levle2_95.jpg C 65 | 31 levle0_302.jpg A 66 | 149 levle0_427.jpg A 67 | 694 levle3_142.jpg D 68 | 441 levle1_522.jpg A 69 | 341 levle1_420.jpg A 70 | 622 levle2_164.jpg C 71 | 510 levle1_591.jpg B 72 | 1 levle0_272.jpg A 73 | 722 levle3_91.jpg D 74 | 163 levle0_447.jpg B 75 | 110 levle0_387.jpg A 76 | 311 levle1_390.jpg A 77 | 257 levle1_336.jpg A 78 | 689 levle3_133.jpg D 79 | 657 levle3_101.jpg D 80 | 75 levle0_349.jpg A 81 | 712 levle3_81.jpg C 82 | 545 levle1_627.jpg A 83 | 68 levle0_340.jpg A 84 | 113 levle0_390.jpg A 85 | 487 levle1_568.jpg A 86 | 485 levle1_566.jpg A 87 | 646 levle2_188.jpg C 88 | 104 levle0_381.jpg A 89 | 62 levle0_334.jpg A 90 | 640 levle2_182.jpg C 91 | 620 levle2_162.jpg B 92 | 442 levle1_523.jpg B 93 | 320 levle1_399.jpg A 94 | 470 levle1_551.jpg B 95 | 505 levle1_586.jpg B 96 | 209 levle0_498.jpg A 97 | 152 levle0_430.jpg A 98 | 275 levle1_354.jpg A 99 | 279 levle1_358.jpg B 100 | 588 levle2_129.jpg B 101 | 642 levle2_184.jpg B 102 | 69 levle0_341.jpg A 103 | 346 levle1_425.jpg A 104 | 703 levle3_72.jpg D 105 | 177 levle0_461.jpg A 106 | 553 levle1_635.jpg A 107 | 704 levle3_73.jpg D 108 | 22 levle0_293.jpg A 109 | 206 levle0_495.jpg A 110 | 720 levle3_89.jpg D 111 | 58 levle0_329.jpg A 112 | 277 levle1_356.jpg B 113 | 489 levle1_570.jpg B 114 | 128 levle0_405.jpg B 115 | 432 levle1_513.jpg A 116 | 447 levle1_528.jpg B 117 | 92 levle0_367.jpg A 118 | 605 levle2_147.jpg C 119 | 138 levle0_416.jpg A 120 | 72 levle0_345.jpg A 121 | 106 levle0_383.jpg A 122 | 61 levle0_332.jpg A 123 | 482 levle1_563.jpg B 124 | 514 levle1_595.jpg B 125 | 55 levle0_326.jpg A 126 | 250 levle1_329.jpg A 127 | 555 levle1_637.jpg B 128 | 263 levle1_342.jpg B 129 | 235 levle0_527.jpg B 130 | 663 levle3_107.jpg D 131 | 593 levle2_135.jpg C 132 | 715 levle3_84.jpg C 133 | 639 levle2_181.jpg C 134 | 246 levle1_325.jpg B 135 | 240 levle0_532.jpg A 136 | 135 levle0_413.jpg A 137 | 205 levle0_494.jpg A 138 | 674 levle3_118.jpg D 139 | 282 levle1_361.jpg B 140 | 662 levle3_106.jpg C 141 | 468 levle1_549.jpg B 142 | 145 levle0_423.jpg A 143 | 538 levle1_620.jpg A 144 | 331 levle1_410.jpg A 145 | 362 levle1_442.jpg B 146 | 574 levle2_115.jpg C 147 | 648 levle2_190.jpg C 148 | 407 levle1_488.jpg B 149 | 133 levle0_411.jpg B 150 | 616 levle2_158.jpg B 151 | 185 levle0_470.jpg A 152 | 70 levle0_342.jpg A 153 | 249 levle1_328.jpg A 154 | 483 levle1_564.jpg B 155 | 626 levle2_168.jpg C 156 | 151 levle0_429.jpg A 157 | 610 levle2_152.jpg B 158 | 11 levle0_282.jpg A 159 | 530 levle1_612.jpg B 160 | 317 levle1_396.jpg B 161 | 129 levle0_406.jpg A 162 | 670 levle3_114.jpg D 163 | 222 levle0_513.jpg A 164 | 650 levle2_94.jpg C 165 | 218 levle0_509.jpg A 166 | 453 levle1_534.jpg B 167 | 270 levle1_349.jpg B 168 | 592 levle2_134.jpg B 169 | 529 levle1_611.jpg B 170 | 233 levle0_524.jpg A 171 | 660 levle3_104.jpg D 172 | 172 levle0_456.jpg B 173 | 526 levle1_608.jpg B 174 | 76 levle0_350.jpg A 175 | 635 levle2_177.jpg C 176 | 29 levle0_300.jpg A 177 | 171 levle0_455.jpg C 178 | 608 levle2_150.jpg C 179 | 343 levle1_422.jpg C 180 | 512 levle1_593.jpg B 181 | 540 levle1_622.jpg A 182 | 618 levle2_160.jpg A 183 | 402 levle1_483.jpg B 184 | 266 levle1_345.jpg B 185 | 471 levle1_552.jpg B 186 | 188 levle0_474.jpg B 187 | 338 levle1_417.jpg B 188 | 210 levle0_499.jpg A 189 | 316 levle1_395.jpg B 190 | 165 levle0_449.jpg A 191 | 194 levle0_482.jpg A 192 | 578 levle2_119.jpg B 193 | 299 levle1_378.jpg B 194 | 201 levle0_489.jpg A 195 | 568 levle2_109.jpg C 196 | 624 levle2_166.jpg B 197 | 438 levle1_519.jpg A 198 | 130 levle0_407.jpg A 199 | 109 levle0_386.jpg A 200 | 132 levle0_410.jpg A 201 | 595 levle2_137.jpg B 202 | 612 levle2_154.jpg B 203 | 582 levle2_123.jpg B 204 | 293 levle1_372.jpg B 205 | 0 levle0_271.jpg A 206 | 237 levle0_529.jpg A 207 | 158 levle0_441.jpg A 208 | 629 levle2_171.jpg B 209 | 659 levle3_103.jpg D 210 | 389 levle1_469.jpg A 211 | 684 levle3_128.jpg C 212 | 416 levle1_497.jpg B 213 | 541 levle1_623.jpg B 214 | 586 levle2_127.jpg C 215 | 323 levle1_402.jpg A 216 | 498 levle1_579.jpg A 217 | 20 levle0_291.jpg A 218 | 519 levle1_600.jpg A 219 | 337 levle1_416.jpg A 220 | 3 levle0_274.jpg A 221 | 232 levle0_523.jpg A 222 | 23 levle0_294.jpg A 223 | 420 levle1_501.jpg A 224 | 264 levle1_343.jpg A 225 | 67 levle0_339.jpg A 226 | 386 levle1_466.jpg A 227 | 413 levle1_494.jpg A 228 | 602 levle2_144.jpg B 229 | 93 levle0_368.jpg A 230 | 636 levle2_178.jpg C 231 | 604 levle2_146.jpg B 232 | 408 levle1_489.jpg B 233 | 560 levle1_642.jpg B 234 | 672 levle3_116.jpg C 235 | 102 levle0_379.jpg A 236 | 283 levle1_362.jpg B 237 | 681 levle3_125.jpg D 238 | 85 levle0_360.jpg A 239 | 116 levle0_393.jpg A 240 | 301 levle1_380.jpg A 241 | 666 levle3_110.jpg C 242 | 702 levle3_71.jpg D 243 | 179 levle0_463.jpg B 244 | 287 levle1_366.jpg B 245 | 43 levle0_314.jpg A 246 | 690 levle3_136.jpg D 247 | 12 levle0_283.jpg A 248 | 230 levle0_521.jpg A 249 | 107 levle0_384.jpg A 250 | 314 levle1_393.jpg A 251 | 46 levle0_317.jpg A 252 | 254 levle1_333.jpg A 253 | 189 levle0_475.jpg A 254 | 426 levle1_507.jpg B 255 | 724 levle3_93.jpg D 256 | 525 levle1_607.jpg B 257 | 34 levle0_305.jpg A 258 | 504 levle1_585.jpg B 259 | 322 levle1_401.jpg A 260 | 280 levle1_359.jpg A 261 | 28 levle0_299.jpg A 262 | 14 levle0_285.jpg A 263 | 63 levle0_335.jpg A 264 | 728 levle3_97.jpg D 265 | 603 levle2_145.jpg B 266 | 611 levle2_153.jpg C 267 | 524 levle1_606.jpg C 268 | 676 levle3_120.jpg C 269 | 269 levle1_348.jpg B 270 | 126 levle0_403.jpg A 271 | 499 levle1_580.jpg A 272 | 305 levle1_384.jpg B 273 | 65 levle0_337.jpg A 274 | 105 levle0_382.jpg A 275 | 9 levle0_280.jpg A 276 | 564 levle2_105.jpg B 277 | 600 levle2_142.jpg B 278 | 409 levle1_490.jpg B 279 | 183 levle0_468.jpg A 280 | 644 levle2_186.jpg B 281 | 517 levle1_598.jpg B 282 | 427 levle1_508.jpg B 283 | 220 levle0_511.jpg A 284 | 597 levle2_139.jpg B 285 | 16 levle0_287.jpg A 286 | 349 levle1_428.jpg B 287 | 38 levle0_309.jpg A 288 | 13 levle0_284.jpg A 289 | 271 levle1_350.jpg A 290 | 285 levle1_364.jpg A 291 | 96 levle0_373.jpg A 292 | 716 levle3_85.jpg C 293 | 378 levle1_458.jpg B 294 | 147 levle0_425.jpg A 295 | 577 levle2_118.jpg B 296 | 520 levle1_601.jpg B 297 | 421 levle1_502.jpg A 298 | 347 levle1_426.jpg A 299 | 242 levle1_321.jpg A 300 | 396 levle1_477.jpg A 301 | 398 levle1_479.jpg A 302 | 117 levle0_394.jpg A 303 | 197 levle0_485.jpg A 304 | 444 levle1_525.jpg B 305 | 6 levle0_277.jpg A 306 | 313 levle1_392.jpg A 307 | 528 levle1_610.jpg A 308 | 125 levle0_402.jpg A 309 | 561 levle2_100.jpg C 310 | 643 levle2_185.jpg C 311 | 417 levle1_498.jpg B 312 | 50 levle0_321.jpg A 313 | 634 levle2_176.jpg D 314 | 148 levle0_426.jpg A 315 | 352 levle1_431.jpg B 316 | 377 levle1_457.jpg A 317 | 54 levle0_325.jpg A 318 | 120 levle0_397.jpg A 319 | 403 levle1_484.jpg A 320 | 655 levle2_99.jpg B 321 | 590 levle2_131.jpg B 322 | 429 levle1_510.jpg B 323 | 680 levle3_124.jpg C 324 | 367 levle1_447.jpg A 325 | 437 levle1_518.jpg A 326 | 297 levle1_376.jpg B 327 | 348 levle1_427.jpg B 328 | 88 levle0_363.jpg A 329 | 19 levle0_290.jpg A 330 | 631 levle2_173.jpg B 331 | 239 levle0_531.jpg B 332 | 476 levle1_557.jpg A 333 | 448 levle1_529.jpg A 334 | 83 levle0_358.jpg A 335 | 641 levle2_183.jpg C 336 | 492 levle1_573.jpg B 337 | 401 levle1_482.jpg B 338 | 39 levle0_310.jpg A 339 | 360 levle1_440.jpg A 340 | 306 levle1_385.jpg A 341 | 202 levle0_491.jpg A 342 | 366 levle1_446.jpg A 343 | 154 levle0_436.jpg A 344 | 365 levle1_445.jpg A 345 | 359 levle1_439.jpg B 346 | 412 levle1_493.jpg B 347 | 325 levle1_404.jpg B 348 | 581 levle2_122.jpg B 349 | 90 levle0_365.jpg B 350 | 415 levle1_496.jpg A 351 | 515 levle1_596.jpg A 352 | 114 levle0_391.jpg A 353 | 159 levle0_442.jpg A 354 | 400 levle1_481.jpg B 355 | 26 levle0_297.jpg A 356 | 380 levle1_460.jpg A 357 | 423 levle1_504.jpg A 358 | 192 levle0_478.jpg A 359 | 465 levle1_546.jpg B 360 | 184 levle0_469.jpg A 361 | 219 levle0_510.jpg A 362 | 435 levle1_516.jpg B 363 | 587 levle2_128.jpg B 364 | 324 levle1_403.jpg B 365 | 495 levle1_576.jpg B 366 | 701 levle3_70.jpg D 367 | 21 levle0_292.jpg B 368 | 78 levle0_353.jpg A 369 | 328 levle1_407.jpg B 370 | 221 levle0_512.jpg A 371 | 49 levle0_320.jpg B 372 | 509 levle1_590.jpg B 373 | 198 levle0_486.jpg A 374 | 234 levle0_526.jpg A 375 | 262 levle1_341.jpg B 376 | 286 levle1_365.jpg B 377 | 175 levle0_459.jpg B 378 | 216 levle0_507.jpg A 379 | 181 levle0_466.jpg A 380 | 89 levle0_364.jpg A 381 | 638 levle2_180.jpg C 382 | 575 levle2_116.jpg C 383 | 477 levle1_558.jpg A 384 | 231 levle0_522.jpg A 385 | 454 levle1_535.jpg A 386 | 685 levle3_129.jpg C 387 | 361 levle1_441.jpg B 388 | 227 levle0_518.jpg A 389 | 74 levle0_347.jpg A 390 | 30 levle0_301.jpg A 391 | 405 levle1_486.jpg A 392 | 295 levle1_374.jpg B 393 | 475 levle1_556.jpg A 394 | 478 levle1_559.jpg A 395 | 688 levle3_132.jpg D 396 | 493 levle1_574.jpg B 397 | 261 levle1_340.jpg B 398 | 274 levle1_353.jpg B 399 | 370 levle1_450.jpg B 400 | 723 levle3_92.jpg B 401 | 84 levle0_359.jpg B 402 | 176 levle0_460.jpg A 403 | 589 levle2_130.jpg B 404 | 60 levle0_331.jpg A 405 | 80 levle0_355.jpg A 406 | 395 levle1_476.jpg B 407 | 87 levle0_362.jpg A 408 | 326 levle1_405.jpg B 409 | 307 levle1_386.jpg B 410 | 658 levle3_102.jpg C 411 | 455 levle1_536.jpg A 412 | 479 levle1_560.jpg A 413 | 289 levle1_368.jpg A 414 | 18 levle0_289.jpg A 415 | 556 levle1_638.jpg A 416 | 594 levle2_136.jpg B 417 | 354 levle1_433.jpg A 418 | 565 levle2_106.jpg B 419 | 24 levle0_295.jpg A 420 | 460 levle1_541.jpg B 421 | 394 levle1_475.jpg B 422 | 521 levle1_603.jpg B 423 | 567 levle2_108.jpg C 424 | 614 levle2_156.jpg B 425 | 267 levle1_346.jpg B 426 | 97 levle0_374.jpg A 427 | 294 levle1_373.jpg B 428 | 173 levle0_457.jpg B 429 | 103 levle0_380.jpg A 430 | 558 levle1_640.jpg D 431 | 462 levle1_543.jpg B 432 | 613 levle2_155.jpg C 433 | 411 levle1_492.jpg C 434 | 224 levle0_515.jpg A 435 | 547 levle1_629.jpg B 436 | 440 levle1_521.jpg A 437 | 637 levle2_179.jpg D 438 | 215 levle0_506.jpg B 439 | 570 levle2_111.jpg C 440 | 381 levle1_461.jpg B 441 | 291 levle1_370.jpg B 442 | 112 levle0_389.jpg B 443 | 27 levle0_298.jpg A 444 | 522 levle1_604.jpg A 445 | 404 levle1_485.jpg B 446 | 719 levle3_88.jpg D 447 | 48 levle0_319.jpg A 448 | 696 levle3_144.jpg B 449 | 721 levle3_90.jpg D 450 | 123 levle0_400.jpg A 451 | 95 levle0_372.jpg A 452 | 682 levle3_126.jpg D 453 | 506 levle1_587.jpg B 454 | 191 levle0_477.jpg B 455 | 312 levle1_391.jpg B 456 | 203 levle0_492.jpg A 457 | 379 levle1_459.jpg A 458 | 664 levle3_108.jpg C 459 | 717 levle3_86.jpg C 460 | 333 levle1_412.jpg A 461 | 167 levle0_451.jpg A 462 | 302 levle1_381.jpg B 463 | 8 levle0_279.jpg A 464 | 156 levle0_439.jpg A 465 | 428 levle1_509.jpg B 466 | 375 levle1_455.jpg B 467 | 518 levle1_599.jpg B 468 | 304 levle1_383.jpg A 469 | 559 levle1_641.jpg C 470 | 288 levle1_367.jpg B 471 | 480 levle1_561.jpg A 472 | 563 levle2_102.jpg B 473 | 661 levle3_105.jpg D 474 | 86 levle0_361.jpg A 475 | 406 levle1_487.jpg B 476 | 633 levle2_175.jpg D 477 | 497 levle1_578.jpg B 478 | 543 levle1_625.jpg C 479 | 542 levle1_624.jpg B 480 | 187 levle0_473.jpg A 481 | 571 levle2_112.jpg D 482 | 276 levle1_355.jpg A 483 | 353 levle1_432.jpg B 484 | 42 levle0_313.jpg B 485 | 679 levle3_123.jpg D 486 | 300 levle1_379.jpg A 487 | 665 levle3_109.jpg D 488 | 536 levle1_618.jpg B 489 | 228 levle0_519.jpg A 490 | 463 levle1_544.jpg A 491 | 609 levle2_151.jpg B 492 | 141 levle0_419.jpg A 493 | 695 levle3_143.jpg D 494 | 630 levle2_172.jpg B 495 | 174 levle0_458.jpg A 496 | 619 levle2_161.jpg B 497 | 226 levle0_517.jpg A 498 | 207 levle0_496.jpg A 499 | 134 levle0_412.jpg A 500 | 576 levle2_117.jpg B 501 | 502 levle1_583.jpg B 502 | 711 levle3_80.jpg C 503 | 259 levle1_338.jpg A 504 | 150 levle0_428.jpg A 505 | 627 levle2_169.jpg D 506 | 238 levle0_530.jpg A 507 | 544 levle1_626.jpg B 508 | 653 levle2_97.jpg C 509 | 678 levle3_122.jpg D 510 | 99 levle0_376.jpg A 511 | 388 levle1_468.jpg A 512 | 523 levle1_605.jpg B 513 | 693 levle3_141.jpg D 514 | 368 levle1_448.jpg C 515 | 260 levle1_339.jpg B 516 | 356 levle1_435.jpg B 517 | 56 levle0_327.jpg A 518 | 550 levle1_632.jpg A 519 | 531 levle1_613.jpg B 520 | 71 levle0_343.jpg A 521 | 204 levle0_493.jpg A 522 | 391 levle1_471.jpg A 523 | 418 levle1_499.jpg A 524 | 434 levle1_515.jpg B 525 | 214 levle0_505.jpg A 526 | 7 levle0_278.jpg A 527 | 118 levle0_395.jpg A 528 | 373 levle1_453.jpg B 529 | 272 levle1_351.jpg B 530 | 213 levle0_504.jpg A 531 | 652 levle2_96.jpg C 532 | 566 levle2_107.jpg C 533 | 474 levle1_555.jpg B 534 | 315 levle1_394.jpg B 535 | 649 levle2_93.jpg B 536 | 212 levle0_503.jpg A 537 | 436 levle1_517.jpg A 538 | 683 levle3_127.jpg C 539 | 706 levle3_75.jpg D 540 | 186 levle0_471.jpg A 541 | 654 levle2_98.jpg A 542 | 196 levle0_484.jpg A 543 | 599 levle2_141.jpg C 544 | 710 levle3_79.jpg C 545 | 144 levle0_422.jpg A 546 | 488 levle1_569.jpg B 547 | 166 levle0_450.jpg A 548 | 292 levle1_371.jpg A 549 | 108 levle0_385.jpg A 550 | 47 levle0_318.jpg A 551 | 91 levle0_366.jpg A 552 | 296 levle1_375.jpg B 553 | 252 levle1_331.jpg A 554 | 625 levle2_167.jpg B 555 | 303 levle1_382.jpg A 556 | 119 levle0_396.jpg A 557 | 25 levle0_296.jpg A 558 | 490 levle1_571.jpg B 559 | 200 levle0_488.jpg A 560 | 727 levle3_96.jpg D 561 | 330 levle1_409.jpg B 562 | 243 levle1_322.jpg A 563 | 157 levle0_440.jpg A 564 | 535 levle1_617.jpg B 565 | 606 levle2_148.jpg C 566 | 336 levle1_415.jpg A 567 | 433 levle1_514.jpg B 568 | 573 levle2_114.jpg B 569 | 265 levle1_344.jpg A 570 | 351 levle1_430.jpg B 571 | 457 levle1_538.jpg B 572 | 718 levle3_87.jpg D 573 | 675 levle3_119.jpg D 574 | 469 levle1_550.jpg B 575 | 707 levle3_76.jpg D 576 | 496 levle1_577.jpg C 577 | 464 levle1_545.jpg B 578 | 111 levle0_388.jpg A 579 | 155 levle0_438.jpg A 580 | 94 levle0_371.jpg A 581 | 358 levle1_437.jpg A 582 | 51 levle0_322.jpg A 583 | 673 levle3_117.jpg D 584 | 548 levle1_630.jpg B 585 | 449 levle1_530.jpg B 586 | 2 levle0_273.jpg A 587 | 36 levle0_307.jpg A 588 | 425 levle1_506.jpg A 589 | 101 levle0_378.jpg A 590 | 451 levle1_532.jpg A 591 | 572 levle2_113.jpg C 592 | 169 levle0_453.jpg A 593 | 601 levle2_143.jpg B 594 | 397 levle1_478.jpg B 595 | 551 levle1_633.jpg B 596 | 645 levle2_187.jpg B 597 | 554 levle1_636.jpg B 598 | 708 levle3_77.jpg C 599 | 139 levle0_417.jpg A 600 | 410 levle1_491.jpg A 601 | 472 levle1_553.jpg B 602 | 714 levle3_83.jpg C 603 | 647 levle2_189.jpg B 604 | 64 levle0_336.jpg A 605 | 511 levle1_592.jpg B 606 | 725 levle3_94.jpg D 607 | 532 levle1_614.jpg A 608 | 278 levle1_357.jpg A 609 | 537 levle1_619.jpg B 610 | 247 levle1_326.jpg B 611 | 507 levle1_588.jpg B 612 | 399 levle1_480.jpg B 613 | 162 levle0_446.jpg A 614 | 687 levle3_131.jpg D 615 | 414 levle1_495.jpg B 616 | 458 levle1_539.jpg B 617 | 700 levle3_68.jpg D 618 | 81 levle0_356.jpg B 619 | 248 levle1_327.jpg B 620 | 327 levle1_406.jpg B 621 | 339 levle1_418.jpg B 622 | 44 levle0_315.jpg A 623 | 557 levle1_639.jpg B 624 | 5 levle0_276.jpg A 625 | 667 levle3_111.jpg C 626 | 445 levle1_526.jpg A 627 | 713 levle3_82.jpg B 628 | 355 levle1_434.jpg B 629 | 491 levle1_572.jpg A 630 | 180 levle0_465.jpg A 631 | 698 levle3_66.jpg D 632 | 168 levle0_452.jpg A 633 | 309 levle1_388.jpg A 634 | 466 levle1_547.jpg A 635 | 273 levle1_352.jpg A 636 | 122 levle0_399.jpg A 637 | 182 levle0_467.jpg A 638 | 534 levle1_616.jpg A 639 | 632 levle2_174.jpg B 640 | 146 levle0_424.jpg A 641 | 281 levle1_360.jpg A 642 | 251 levle1_330.jpg A 643 | 456 levle1_537.jpg B 644 | 424 levle1_505.jpg A 645 | 443 levle1_524.jpg A 646 | 357 levle1_436.jpg A 647 | 195 levle0_483.jpg A 648 | 170 levle0_454.jpg A 649 | 452 levle1_533.jpg B 650 | 98 levle0_375.jpg B 651 | 115 levle0_392.jpg B 652 | 656 levle3_100.jpg C 653 | 615 levle2_157.jpg B 654 | 383 levle1_463.jpg B 655 | 580 levle2_121.jpg C 656 | 393 levle1_474.jpg B 657 | 153 levle0_432.jpg A 658 | 82 levle0_357.jpg A 659 | 546 levle1_628.jpg B 660 | 73 levle0_346.jpg A 661 | 621 levle2_163.jpg B 662 | 308 levle1_387.jpg A 663 | 508 levle1_589.jpg B 664 | 32 levle0_303.jpg A 665 | 37 levle0_308.jpg A 666 | 244 levle1_323.jpg B 667 | 422 levle1_503.jpg B 668 | 229 levle0_520.jpg A 669 | 160 levle0_443.jpg A 670 | 513 levle1_594.jpg B 671 | 332 levle1_411.jpg A 672 | 598 levle2_140.jpg C 673 | 668 levle3_112.jpg B 674 | 66 levle0_338.jpg A 675 | 481 levle1_562.jpg B 676 | 446 levle1_527.jpg A 677 | 461 levle1_542.jpg B 678 | 562 levle2_101.jpg B 679 | 321 levle1_400.jpg B 680 | 692 levle3_140.jpg D 681 | 374 levle1_454.jpg B 682 | 549 levle1_631.jpg A 683 | 697 levle3_145.jpg C 684 | 199 levle0_487.jpg A 685 | 137 levle0_415.jpg A 686 | 241 levle1_0.jpg A 687 | 4 levle0_275.jpg A 688 | 596 levle2_138.jpg B 689 | 709 levle3_78.jpg B 690 | 384 levle1_464.jpg B 691 | 628 levle2_170.jpg B 692 | 450 levle1_531.jpg B 693 | 245 levle1_324.jpg B 694 | 699 levle3_67.jpg D 695 | 136 levle0_414.jpg B 696 | 371 levle1_451.jpg B 697 | 677 levle3_121.jpg D 698 | 310 levle1_389.jpg C 699 | 178 levle0_462.jpg B 700 | 467 levle1_548.jpg A 701 | 268 levle1_347.jpg B 702 | 691 levle3_137.jpg D 703 | 290 levle1_369.jpg B 704 | 431 levle1_512.jpg A 705 | 390 levle1_470.jpg B 706 | 363 levle1_443.jpg B 707 | 617 levle2_159.jpg B 708 | 142 levle0_420.jpg A 709 | 430 levle1_511.jpg A 710 | 45 levle0_316.jpg A 711 | 369 levle1_449.jpg C 712 | 255 levle1_334.jpg B 713 | 77 levle0_351.jpg A 714 | 335 levle1_414.jpg A 715 | 501 levle1_582.jpg B 716 | 533 levle1_615.jpg B 717 | 35 levle0_306.jpg A 718 | 164 levle0_448.jpg B 719 | 669 levle3_113.jpg D 720 | 284 levle1_363.jpg B 721 | 503 levle1_584.jpg B 722 | 473 levle1_554.jpg B 723 | 211 levle0_501.jpg B 724 | 15 levle0_286.jpg A 725 | 591 levle2_132.jpg B 726 | 494 levle1_575.jpg B 727 | 439 levle1_520.jpg A 728 | 33 levle0_304.jpg A 729 | 585 levle2_126.jpg D 730 | --------------------------------------------------------------------------------