使用resNet网络 进行图像分类(jupyter notebook)

  • 这学期做了三次的CV把他贴出来,

  • resNet网络的结构

import torch.nn as nn
import torch

class BasicBlock(nn.Module):
    expansion = 1
    def __init__(self, in_channel, out_channel, stride=1, downsample=None, **kwargs):
        super(BasicBlock, self).__init__()
        self.conv1 = nn.Conv2d(in_channels=in_channel, out_channels=out_channel,
                               kernel_size=3, stride=stride, padding=1, bias=False)
        self.bn1 = nn.BatchNorm2d(out_channel)
        self.relu = nn.ReLU()
        self.conv2 = nn.Conv2d(in_channels=out_channel, out_channels=out_channel,
                               kernel_size=3, stride=1, padding=1, bias=False)
        self.bn2 = nn.BatchNorm2d(out_channel)
        self.downsample = downsample
    def forward(self, x):
        identity = x
        if self.downsample is not None:
            identity = self.downsample(x)

        out = self.conv1(x)
        out = self.bn1(out)
        out = self.relu(out)

        out = self.conv2(out)
        out = self.bn2(out)

        out += identity
        out = self.relu(out)

        return out


class Bottleneck(nn.Module):
    """
    注意:原论文中,在虚线残差结构的主分支上,第一个1x1卷积层的步距是2,第二个3x3卷积层步距是1。
    但在pytorch官方实现过程中是第一个1x1卷积层的步距是1,第二个3x3卷积层步距是2,
    这么做的好处是能够在top1上提升大概0.5%的准确率。
    可参考Resnet v1.5 https://ngc.nvidia.com/catalog/model-scripts/nvidia:resnet_50_v1_5_for_pytorch
    """
    expansion = 4

    def __init__(self, in_channel, out_channel, stride=1, downsample=None,
                 groups=1, width_per_group=64):
        super(Bottleneck, self).__init__()

        width = int(out_channel * (width_per_group / 64.)) * groups

        self.conv1 = nn.Conv2d(in_channels=in_channel, out_channels=width,
                               kernel_size=1, stride=1, bias=False)  # squeeze channels
        self.bn1 = nn.BatchNorm2d(width)
        # -----------------------------------------
        self.conv2 = nn.Conv2d(in_channels=width, out_channels=width, groups=groups,
                               kernel_size=3, stride=stride, bias=False, padding=1)
        self.bn2 = nn.BatchNorm2d(width)
        # -----------------------------------------
        self.conv3 = nn.Conv2d(in_channels=width, out_channels=out_channel*self.expansion,
                               kernel_size=1, stride=1, bias=False)  # unsqueeze channels
        self.bn3 = nn.BatchNorm2d(out_channel*self.expansion)
        self.relu = nn.ReLU(inplace=True)
        self.downsample = downsample

    def forward(self, x):
        identity = x
        if self.downsample is not None:
            identity = self.downsample(x)

        out = self.conv1(x)
        out = self.bn1(out)
        out = self.relu(out)

        out = self.conv2(out)
        out = self.bn2(out)
        out = self.relu(out)

        out = self.conv3(out)
        out = self.bn3(out)

        out += identity
        out = self.relu(out)

        return out


class ResNet(nn.Module):

    def __init__(self,
                 block,
                 blocks_num,
                 num_classes=1000,
                 include_top=True,
                 groups=1,
                 width_per_group=64):
        super(ResNet, self).__init__()
        self.include_top = include_top
        self.in_channel = 64

        self.groups = groups
        self.width_per_group = width_per_group

        self.conv1 = nn.Conv2d(3, self.in_channel, kernel_size=7, stride=2,
                               padding=3, bias=False)
        self.bn1 = nn.BatchNorm2d(self.in_channel)
        self.relu = nn.ReLU(inplace=True)
        self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
        self.layer1 = self._make_layer(block, 64, blocks_num[0])
        self.layer2 = self._make_layer(block, 128, blocks_num[1], stride=2)
        self.layer3 = self._make_layer(block, 256, blocks_num[2], stride=2)
        self.layer4 = self._make_layer(block, 512, blocks_num[3], stride=2)
        if self.include_top:
            self.avgpool = nn.AdaptiveAvgPool2d((1, 1))  # output size = (1, 1)
            self.fc = nn.Linear(512 * block.expansion, num_classes)

        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')

    def _make_layer(self, block, channel, block_num, stride=1):
        downsample = None
        if stride != 1 or self.in_channel != channel * block.expansion:
            downsample = nn.Sequential(
                nn.Conv2d(self.in_channel, channel * block.expansion, kernel_size=1, stride=stride, bias=False),
                nn.BatchNorm2d(channel * block.expansion))

        layers = []
        layers.append(block(self.in_channel,
                            channel,
                            downsample=downsample,
                            stride=stride,
                            groups=self.groups,
                            width_per_group=self.width_per_group))
        self.in_channel = channel * block.expansion

        for _ in range(1, block_num):
            layers.append(block(self.in_channel,
                                channel,
                                groups=self.groups,
                                width_per_group=self.width_per_group))

        return nn.Sequential(*layers)

    def forward(self, x):
        x = self.conv1(x)
        x = self.bn1(x)
        x = self.relu(x)
        x = self.maxpool(x)

        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        x = self.layer4(x)

        if self.include_top:
            x = self.avgpool(x)
            x = torch.flatten(x, 1)
            x = self.fc(x)

        return x


def resnet34(num_classes=1000, include_top=True):
    # https://download.pytorch.org/models/resnet34-333f7ec4.pth
    return ResNet(BasicBlock, [3, 4, 6, 3], num_classes=num_classes, include_top=include_top)


def resnet50(num_classes=1000, include_top=True):
    # https://download.pytorch.org/models/resnet50-19c8e357.pth
    return ResNet(Bottleneck, [3, 4, 6, 3], num_classes=num_classes, include_top=include_top)


def resnet101(num_classes=1000, include_top=True):
    # https://download.pytorch.org/models/resnet101-5d3b4d8f.pth
    return ResNet(Bottleneck, [3, 4, 23, 3], num_classes=num_classes, include_top=include_top)


def resnext50_32x4d(num_classes=1000, include_top=True):
    # https://download.pytorch.org/models/resnext50_32x4d-7cdf4587.pth
    groups = 32
    width_per_group = 4
    return ResNet(Bottleneck, [3, 4, 6, 3],
                  num_classes=num_classes,
                  include_top=include_top,
                  groups=groups,
                  width_per_group=width_per_group)


def resnext101_32x8d(num_classes=1000, include_top=True):
    # https://download.pytorch.org/models/resnext101_32x8d-8ba56ff5.pth
    groups = 32
    width_per_group = 8
    return ResNet(Bottleneck, [3, 4, 23, 3],
                  num_classes=num_classes,
                  include_top=include_top,
                  groups=groups,
                  width_per_group=width_per_group)
  • 工具类,进行数据的划分
# 工具类
import os
import random
import shutil
from shutil import copy2


def data_set_split(src_data_folder, target_data_folder, train_scale=0.8, val_scale=0.1, test_scale=0.1):
    '''
    读取源数据文件夹,生成划分好的文件夹,分为trian、val、test三个文件夹进行
    :param src_data_folder: 源文件夹 E:/biye/gogogo/note_book/torch_note/data/utils_test/data_split/src_data
    :param target_data_folder: 目标文件夹 E:/biye/gogogo/note_book/torch_note/data/utils_test/data_split/target_data
    :param train_scale: 训练集比例
    :param val_scale: 验证集比例
    :param test_scale: 测试集比例
    :return:
    '''
    print("开始数据集划分")
    class_names = os.listdir(src_data_folder)
    # 在目标目录下创建文件夹
    split_names = ['train', 'val', 'test']
    for split_name in split_names:
        split_path = os.path.join(target_data_folder, split_name)
        if os.path.isdir(split_path):
            pass
        else:
            os.mkdir(split_path)
        # 然后在split_path的目录下创建类别文件夹
        for class_name in class_names:
            class_split_path = os.path.join(split_path, class_name)
            if os.path.isdir(class_split_path):
                pass
            else:
                os.mkdir(class_split_path)

    # 按照比例划分数据集,并进行数据图片的复制
    # 首先进行分类遍历
    for class_name in class_names:
        current_class_data_path = os.path.join(src_data_folder, class_name)
        current_all_data = os.listdir(current_class_data_path)
        current_data_length = len(current_all_data)
        current_data_index_list = list(range(current_data_length))
        random.shuffle(current_data_index_list)

        train_folder = os.path.join(os.path.join(target_data_folder, 'train'), class_name)
        val_folder = os.path.join(os.path.join(target_data_folder, 'val'), class_name)
        test_folder = os.path.join(os.path.join(target_data_folder, 'test'), class_name)
        train_stop_flag = current_data_length * train_scale
        val_stop_flag = current_data_length * (train_scale + val_scale)
        current_idx = 0
        train_num = 0
        val_num = 0
        test_num = 0
        for i in current_data_index_list:
            src_img_path = os.path.join(current_class_data_path, current_all_data[i])
            if current_idx <= train_stop_flag:
                copy2(src_img_path, train_folder)
                # print("{}复制到了{}".format(src_img_path, train_folder))
                train_num = train_num + 1
            elif (current_idx > train_stop_flag) and (current_idx <= val_stop_flag):
                copy2(src_img_path, val_folder)
                # print("{}复制到了{}".format(src_img_path, val_folder))
                val_num = val_num + 1
            else:
                copy2(src_img_path, test_folder)
                # print("{}复制到了{}".format(src_img_path, test_folder))
                test_num = test_num + 1

            current_idx = current_idx + 1

        print("*********************************{}*************************************".format(class_name))
        print(
            "{}类按照{}:{}:{}的比例划分完成,一共{}张图片".format(class_name, train_scale, val_scale, test_scale, current_data_length))
        print("训练集{}:{}张".format(train_folder, train_num))
        print("验证集{}:{}张".format(val_folder, val_num))
        print("测试集{}:{}张".format(test_folder, test_num))


if __name__ == '__main__':
    src_data_folder = "../input/jianghomework1/data/train"
    target_data_folder = "/kaggle/working"
    data_set_split(src_data_folder, target_data_folder)
  • 进行训练
import os
import json

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import transforms, datasets
from tqdm import tqdm

def main():
    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    print("using {} device.".format(device))
#     R_mean=  0.13128287041440617 G_mean=  0.15304898561393718 B_mean= 0.14544419562248562 stdR =  0.4799472429342831 stdG =  0.45038768037683824 stdB = 0.40085683947993256
    
    data_transform = {
        "train": transforms.Compose([transforms.RandomResizedCrop(224),
                                     transforms.RandomHorizontalFlip(),
                                     transforms.ToTensor(),
                                     transforms.Normalize([0.471, 0.448, 0.408],[0.234, 0.239, 0.242])]),
        "val": transforms.Compose([transforms.Resize(256),
                                   transforms.CenterCrop(224),
                                   transforms.ToTensor(),
                                   transforms.Normalize([0.471, 0.448, 0.408],[0.234, 0.239, 0.242])])}
    train_db = datasets.ImageFolder(root='./train', transform=data_transform["train"])
    train_num = len(train_db)
    print(train_num) # 16000
    
    
    batch_size = 108
    nw = min([os.cpu_count(), batch_size if batch_size > 1 else 0, 8])  # number of workers
    print('Using {} dataloader workers every process'.format(nw))    
    
    
    train_loader = torch.utils.data.DataLoader(train_db,
                                               batch_size=batch_size, shuffle=True,
                                               num_workers=nw)
    validate_dataset = datasets.ImageFolder(root='./val',transform=data_transform["val"])
    val_num = len(validate_dataset)
    validate_loader = torch.utils.data.DataLoader(validate_dataset,
                                                  batch_size=batch_size, shuffle=False,
                                                  num_workers=nw)

    print("using {} images for training, {} images for validation.".format(train_num,
                                                                           val_num))
   
    net = resnet101()
    model_weight_path = "../input/resnet50/resnet101-5d3b4d8f.pth"
    net.load_state_dict(torch.load(model_weight_path, map_location=device))
    #for param in net.parameters():
    #     param.requires_grad = False
    in_channel = net.fc.in_features
    net.fc = nn.Linear(in_channel, 80)
    net.to(device)

    # define loss function
    loss_function = nn.CrossEntropyLoss()

    # construct an optimizer
    params = [p for p in net.parameters() if p.requires_grad]
    optimizer = optim.Adam(params, lr=0.0001)

    epochs = 15
    
    
    best_acc = 0.0
    save_path = './resNet101.pth'
    train_steps = len(train_loader)
    for epoch in range(epochs):
        # train
        net.train()
        running_loss = 0.0
        train_bar = tqdm(train_loader)
        for step, data in enumerate(train_bar):
            images, labels = data
            optimizer.zero_grad()
            logits = net(images.to(device))
            loss = loss_function(logits, labels.to(device))
            loss.backward()
            optimizer.step()

            # print statistics
            running_loss += loss.item()
            train_bar.desc = "train epoch[{}/{}] loss:{:.3f}".format(epoch + 1,epochs,loss)
        # validate
        net.eval()
        acc = 0.0  # accumulate accurate number / epoch
        with torch.no_grad():
            val_bar = tqdm(validate_loader)
            for val_data in val_bar:
                val_images, val_labels = val_data
                outputs = net(val_images.to(device))
                # loss = loss_function(outputs, test_labels)
                predict_y = torch.max(outputs, dim=1)[1]
                # print(val_labels)
                # print(predict_y)
                acc += torch.eq(predict_y, val_labels.to(device)).sum().item()
                val_bar.desc = "valid epoch[{}/{}]".format(epoch + 1, epochs)
        val_accurate = acc / val_num
        print('[epoch %d] train_loss: %.3f  val_accuracy: %.3f' % (epoch + 1, running_loss / train_steps, val_accurate))

        if val_accurate > best_acc:
            best_acc = val_accurate
            torch.save(net.state_dict(), save_path)

    print('Finished Training')


if __name__ == '__main__':
    main()
  • 最后的预测
import os
import json

import torch
from PIL import Image
from torchvision import transforms
# ../input/jianghomework1/data/val/1015.jpg
# ../input/wangshi1/data/val
# ../input/wangshi1/data/val
# ../input/wangshi1/data/val
def getValueList(i):
    arr=[]
    for i in range(i * 1000,(i + 1) * 1000):
        # print(i)
        temp = '../input/jianghomework1/data/val/' + str(i) +'.jpg'
        arr.append(temp)
    return arr
        

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

data_transform = transforms.Compose(
    [transforms.Resize(256),
     transforms.CenterCrop(224),
     transforms.ToTensor(),
     transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])

# load image
model = resnet101(num_classes=80).to(device)
weights_path = "./resNet101.pth"
model.load_state_dict(torch.load(weights_path, map_location=device))

# prediction
model.eval()
LEN = 0


for i in range(10):
    img_path_list = getValueList(i)
    img_list = []
    for img_path in img_path_list:
        assert os.path.exists(img_path), "file: '{}' dose not exist.".format(img_path)
        img = Image.open(img_path)
        if img.mode == 'L':
            img = img.convert('RGB')
        img = data_transform(img)
        img_list.append(img)

    batch_img = torch.stack(img_list, dim=0)

    with torch.no_grad():
        # predict class
        output = model(batch_img.to(device)).cpu()
        # print(output[0])
        predict = torch.softmax(output, dim=1)
        # print(predict)
        probs, classes = torch.max(predict, dim=1)
        # print(probs)
        # print(classes)
        txt = ['61', '6', '42', '23', '37', '49', '18', '16', '11', '64', '7', '63', '30', '40', '71', '32', '3', '51', '24', '1', '50', '79', '9', '77', '76', '50', '67', '15', '36', '79', '5', '7', '76', '15', '9', '27', '50', '35', '31', '26', '55', '30', '63', '6', '58', '7', '24', '57', '8', '45', '34', '33', '5', '59', '79', '19', '45', '77', '23', '49', '68', '16', '73', '29', '61', '63', '60', '61', '67', '54', '49', '33', '71', '55', '52', '72', '56', '11', '19', '11', '2', '6', '15', '19', '40', '30', '37', '11', '62', '53', '29', '32', '63', '69', '31', '14', '64', '68', '63', '8', '7', '72', '79', '38', '41', '63', '14', '34', '47', '40', '56', '54', '64', '74', '2', '77', '51', '8', '59', '60', '45', '40', '52', '58', '72', '76', '48', '51', '44', '24', '11', '49', '56', '61', '21', '4', '34', '76', '32', '64', '4', '44', '12', '59', '64', '17', '7', '42', '49', '29', '16', '53', '65', '4', '14', '49', '52', '63', '44', '53', '75', '8', '22', '18', '22', '4', '57', '8', '33', '65', '13', '74', '44', '14', '41', '13', '37', '22', '68', '4', '41', '35', '42', '42', '14', '62', '61', '47', '0', '77', '35', '68', '75', '4', '38', '66', '12', '51', '34', '13', '5', '64', '22', '29', '57', '3', '25', '46', '9', '48', '25', '47', '57', '36', '59', '1', '27', '28', '6', '14', '0', '66', '21', '23', '34', '13', '60', '29', '40', '48', '19', '73', '9', '38', '60', '54', '21', '42', '15', '45', '34', '36', '75', '77', '64', '8', '10', '34', '69', '17', '26', '50', '41', '64', '19', '72', '19', '13', '17', '6', '30', '57', '58', '53', '66', '24', '54', '61', '46', '12', '64', '31', '22', '22', '32', '4', '30', '21', '20', '78', '49', '70', '32', '41', '43', '46', '18', '41', '40', '66', '11', '3', '12', '69', '62', '65', '19', '18', '35', '73', '63', '62', '78', '51', '32', '26', '10', '71', '43', '35', '53', '36', '3', '28', '41', '34', '22', '21', '18', '38', '57', '16', '15', '74', '43', '34', '59', '77', '27', '51', '63', '59', '79', '19', '31', '18', '26', '47', '71', '25', '76', '53', '20', '28', '23', '37', '1', '54', '9', '36', '21', '29', '27', '75', '50', '17', '46', '1', '4', '70', '5', '73', '2', '57', '15', '21', '49', '36', '57', '19', '1', '11', '18', '4', '30', '5', '62', '33', '22', '16', '13', '49', '34', '7', '58', '41', '45', '20', '4', '59', '18', '36', '72', '74', '39', '69', '58', '6', '67', '40', '17', '22', '72', '22', '17', '78', '16', '18', '16', '19', '63', '66', '23', '16', '25', '74', '4', '75', '10', '64', '34', '5', '33', '4', '24', '73', '29', '17', '6', '70', '53', '64', '66', '57', '49', '50', '6', '28', '78', '23', '48', '3', '4', '4', '54', '22', '17', '0', '25', '49', '63', '42', '46', '44', '48', '75', '19', '65', '15', '10', '14', '19', '50', '40', '32', '6', '59', '16', '37', '6', '9', '59', '37', '22', '56', '66', '11', '65', '76', '64', '69', '75', '78', '72', '36', '7', '76', '31', '53', '1', '63', '45', '57', '63', '0', '15', '67', '76', '31', '53', '7', '10', '20', '61', '22', '65', '60', '10', '59', '62', '1', '60', '36', '60', '17', '58', '40', '18', '23', '32', '35', '77', '51', '2', '62', '25', '55', '70', '77', '61', '0', '27', '13', '22', '32', '68', '47', '74', '42', '62', '61', '71', '14', '64', '56', '18', '22', '29', '40', '4', '35', '22', '3', '69', '10', '56', '20', '76', '68', '70', '33', '36', '56', '21', '74', '24', '21', '31', '63', '69', '9', '67', '53', '30', '24', '29', '10', '70', '62', '21', '75', '11', '4', '61', '67', '61', '53', '36', '24', '2', '30', '0', '54', '59', '66', '52', '21', '22', '61', '77', '33', '37', '20', '51', '43', '58', '57', '48', '28', '23', '59', '0', '22', '3', '41', '57', '0', '17', '69', '29', '43', '22', '47', '46', '2', '10', '70', '6', '36', '58', '57', '20', '50', '71', '45', '21', '65', '14', '58', '36', '0', '50', '77', '50', '8', '35', '41', '14', '29', '59', '51', '3', '16', '20', '79', '9', '7', '5', '67', '48', '71', '32', '23', '67', '50', '46', '43', '32', '13', '27', '35', '26', '15', '65', '25', '32', '42', '67', '31', '21', '62', '36', '30', '60', '0', '10', '40', '41', '7', '57', '76', '31', '28', '74', '75', '4', '68', '39', '45', '10', '38', '32', '57', '10', '19', '41', '70', '66', '22', '48', '36', '44', '58', '20', '46', '52', '0', '21', '32', '41', '5', '69', '52', '8', '67', '71', '29', '50', '57', '58', '35', '16', '74', '57', '63', '33', '25', '54', '12', '60', '27', '31', '7', '2', '48', '35', '48', '49', '29', '35', '72', '1', '4', '51', '67', '37', '53', '10', '24', '37', '4', '79', '62', '2', '6', '59', '8', '32', '17', '27', '52', '65', '16', '49', '38', '62', '29', '33', '22', '60', '76', '31', '3', '41', '37', '43', '36', '56', '26', '31', '53', '42', '29', '57', '70', '59', '57', '77', '47', '7', '31', '35', '31', '31', '46', '1', '78', '73', '0', '23', '60', '0', '31', '72', '27', '33', '13', '61', '77', '23', '64', '57', '72', '3', '52', '45', '53', '70', '44', '15', '36', '39', '47', '73', '8', '36', '71', '22', '43', '58', '43', '11', '42', '64', '1', '63', '46', '17', '48', '12', '75', '20', '14', '47', '60', '78', '22', '21', '41', '34', '21', '11', '4', '38', '51', '0', '34', '21', '62', '62', '51', '72', '23', '13', '65', '48', '21', '63', '11', '79', '13', '30', '19', '28', '5', '36', '52', '36', '64', '34', '7', '2', '73', '8', '12', '37', '29', '70', '62', '74', '12', '8', '38', '43', '45', '13', '23', '10', '16', '11', '22', '49', '30', '60', '44', '52', '33', '47', '3', '57', '43', '64', '75', '40', '4', '34', '40', '63', '9', '2', '73', '48', '49', '34', '7', '59', '50', '63', '11', '59', '49', '61', '14', '15', '61', '19', '67', '41', '69', '70', '79', '11', '3', '35', '46', '13', '33', '78', '60', '13', '19', '39', '9', '67', '28', '23', '16', '55', '60', '64', '41', '48', '10', '12', '48', '59', '65', '65', '59', '26', '77', '67', '28', '19', '51', '43', '52', '50', '38', '61', '64', '1', '35', '72', '16', '9', '38', '54', '70', '38', '62', '32', '43', '64', '10', '35', '1', '46', '57', '69', '61', '72', '21', '45', '36', '8', '39', '20', '12', '77', '46', '32', '28', '8', '67', '60', '15', '4', '36', '22', '50', '38', '21', '58', '25', '8', '29', '67', '42', '76', '49', '38', '59', '40', '36', '71', '45', '35', '52', '33', '51', '68', '37', '78', '58', '79', '50', '48', '34', '46', '25', '6', '45', '55', '73', '30', '28', '52', '33', '78', '44', '34', '51', '38', '79', '6', '34', '10', '41', '59', '74', '35', '18', '52', '39', '4', '78', '13', '56', '63', '21', '54', '24', '77', '48', '14', '36', '61', '63', '54', '69', '48', '39', '69', '4', '71', '7', '31', '10', '76', '65', '31', '59', '74', '6', '71', '18', '19', '39', '13', '58', '24', '60', '3', '21', '27', '58', '72', '12', '62', '62', '35', '64', '7', '48', '48', '72', '73', '69', '28', '37', '32', '12', '74', '17', '39', '9', '4', '6', '18', '9', '70', '16', '26', '12', '17', '69', '62', '28', '45', '53', '30', '19', '71', '49', '4', '25', '63', '34', '25', '53', '3', '26', '76', '77', '25', '1', '8', '6', '27', '34', '76', '64', '72', '5', '53', '71', '62', '4', '33', '3', '54', '42', '41', '0', '37', '0', '40', '62', '42', '70', '20', '13', '55', '51', '79', '5', '16', '63', '3', '30', '66', '19', '66', '31', '12', '39', '23', '19', '7', '30', '74', '36', '54', '2', '33', '45', '23', '11', '1', '28', '76', '26', '4', '48', '20', '75', '27', '2', '61', '10', '9', '7', '60', '57', '21', '41', '10', '29', '68', '41', '30', '59', '49', '12', '51', '67', '35', '7', '11', '57', '16', '17', '10', '10', '11', '45', '4', '9', '18', '49', '0', '36', '23', '6', '52', '28', '36', '64', '77', '46', '54', '59', '63', '75', '17', '35', '1', '64', '44', '51', '16', '42', '0', '40', '39', '42', '74', '51', '3', '48', '21', '35', '33', '1', '50', '13', '48', '20', '72', '42', '11', '13', '23', '69', '6', '52', '53', '60', '19', '17', '47', '34', '5', '48', '29', '61', '33', '12', '6', '51', '73', '61', '22', '4', '57', '7', '4', '45', '79', '70', '61', '7', '34', '20', '16', '31', '39', '9', '13', '27', '36', '9', '48', '23', '55', '60', '33', '23', '1', '26', '5', '3', '60', '26', '46', '15', '2', '47', '32', '9', '70', '67', '12', '67', '56', '46', '7', '74', '26', '28', '68', '40', '63', '26', '62', '65', '31', '5', '78', '79', '42', '62', '64', '20', '55', '0', '29', '47', '26', '69', '70', '47', '16', '7', '26', '12', '14', '20', '63', '58', '61', '38', '15', '8', '58', '27', '53', '37', '79', '12', '49', '64', '44', '76', '30', '13', '50', '13', '71', '3', '67', '74', '58', '79', '53', '46', '43', '66', '26', '19', '77', '35', '58', '21', '39', '26', '62', '55', '16', '15', '21', '34', '74', '57', '71', '78', '69', '11', '76', '15', '5', '26', '22', '37', '9', '34', '34', '44', '31', '68', '69', '64', '4', '72', '49', '33', '69', '35', '11', '78', '66', '22', '76', '73', '27', '21', '62', '72', '53', '54', '10', '3', '37', '38', '5', '7', '25', '25', '50', '17', '14', '23', '73', '38', '35', '60', '8', '65', '65', '66', '30', '55', '17', '47', '52', '45', '22', '61', '36', '49', '71', '76', '19', '28', '2', '20', '50', '34', '58', '35', '58', '16', '77', '59', '0', '10', '68', '59', '74', '19', '56', '1', '77', '78', '65', '67', '39', '33', '65', '15', '60', '29', '72', '11', '49', '1', '37', '78', '12', '32', '71', '54', '77', '64', '26', '14', '8', '51', '70', '0', '61', '17', '8', '57', '35', '27', '55', '6', '63', '41', '67', '26', '17', '0', '13', '79', '32', '3', '62', '12', '28', '48', '75', '45', '30', '71', '60', '46', '47', '37', '66', '26', '64', '20', '45', '13', '14', '46', '16', '3', '51', '53', '6', '3', '3', '57', '23', '20', '8', '25', '23', '79', '50', '30', '73', '66', '68', '34', '70', '2', '79', '30', '29', '75', '64', '46', '16', '67', '71', '25', '20', '33', '57', '23', '42', '33', '46', '3', '78', '52', '53', '59', '66', '16', '58', '35', '62', '34', '15', '32', '14', '73', '33', '70', '29', '51', '47', '69', '32', '59', '11', '52', '27', '64', '44', '43', '4', '18', '48', '20', '2', '1', '46', '43', '39', '65', '9', '54', '27', '31', '30', '38', '39', '35', '57', '29', '56', '63', '6', '69', '32', '64', '62', '75', '16', '26', '1', '40', '70', '63', '1', '78', '56', '25', '15', '73', '79', '28', '40', '75', '66', '78', '51', '71', '43', '57', '6', '31', '34', '35', '75', '21', '79', '43', '44', '56', '44', '47', '25', '50', '5', '38', '0', '41', '56', '6', '6', '45', '65', '63', '43', '71', '25', '12', '27', '26', '18', '29', '69', '14', '73', '14', '33', '12', '72', '70', '62', '47', '59', '17', '13', '35', '51', '37', '36', '30', '43', '5', '57', '32', '10', '71', '69', '61', '61', '25', '64', '51', '55', '63', '62', '70', '17', '50', '49', '76', '74', '35', '51', '20', '49', '45', '79', '55', '10', '45', '42', '9', '50', '23', '36', '5', '40', '13', '70', '7', '22', '8', '29', '32', '43', '61', '23', '2', '49', '47', '45', '65', '79', '19', '42', '64', '66', '26', '42', '58', '74', '60', '51', '68', '59', '20', '15', '38', '77', '10', '49', '41', '54', '18', '52', '16', '48', '47', '71', '21', '20', '53', '17', '76', '60', '1', '59', '8', '44', '29', '58', '13', '32', '47', '3', '31', '74', '44', '50', '53', '73', '60', '66', '42', '62', '6', '24', '77', '18', '36', '54', '40', '22', '57', '42', '10', '4', '51', '0', '27', '56', '66', '74', '10', '65', '25', '46', '4', '78', '26', '62', '59', '69', '26', '13', '8', '7', '42', '7', '0', '78', '27', '12', '78', '46', '12', '29', '45', '78', '24', '3', '36', '56', '75', '19', '27', '45', '71', '6', '73', '60', '7', '14', '41', '9', '29', '57', '34', '26', '49', '70', '16', '50', '36', '12', '54', '67', '0', '54', '43', '3', '24', '70', '4', '29', '65', '10', '30', '55', '62', '78', '66', '38', '64', '75', '19', '21', '45', '60', '75', '53', '28', '72', '67', '40', '74', '67', '59', '61', '40', '11', '25', '29', '20', '66', '23', '40', '22', '48', '71', '24', '47', '61', '73', '58', '9', '48', '65', '63', '6', '50', '70', '73', '10', '28', '13', '42', '46', '52', '77', '61', '4', '58', '48', '38', '27', '29', '55', '49', '24', '68', '51', '33', '42', '15', '21', '39', '77', '19', '27', '30', '54', '29', '42', '10', '47', '11', '68', '22', '75', '10', '48', '45', '10', '79', '31', '1', '55', '60', '67', '3', '39', '4', '16', '71', '31', '20', '28', '73', '19', '52', '78', '50', '79', '24', '20', '47', '40', '6', '9', '72', '58', '2', '50', '6', '27', '68', '73', '36', '26', '61', '14', '33', '14', '18', '74', '8', '38', '77', '59', '64', '0', '8', '54', '18', '38', '3', '35', '2', '60', '73', '59', '27', '19', '70', '16', '22', '57', '64', '62', '5', '71', '61', '68', '15', '14', '28', '60', '71', '47', '37', '59', '59', '40', '47', '23', '22', '4', '30', '19', '20', '35', '32', '72', '56', '62', '73', '14', '42', '53', '44', '69', '71', '73', '27', '3', '70', '45', '5', '15', '17', '3', '71', '27', '16', '55', '37', '8', '48', '9', '43', '70', '6', '75', '36', '55', '74', '41', '53', '58', '63', '4', '16', '24', '11', '58', '29', '4', '66', '48', '60', '18', '27', '11', '47', '28', '29', '77', '15', '47', '50', '22', '6', '23', '8', '8', '13', '44', '47', '30', '65', '2', '51', '64', '61', '57', '28', '27', '23', '52', '17', '66', '39', '5', '71', '2', '29', '43', '16', '13', '13', '19', '22', '66', '70', '28', '42', '26', '72', '43', '68', '32', '14', '61', '7', '8', '42', '14', '65', '48', '54', '43', '47', '60', '28', '36', '20', '14', '46', '42', '6', '11', '8', '14', '58', '62', '44', '16', '50', '44', '58', '74', '78', '54', '27', '58', '33', '25', '44', '71', '9', '6', '46', '3', '23', '37', '69', '38', '37', '73', '60', '52', '44', '37', '74', '75', '63', '18', '18', '77', '71', '29', '69', '18', '56', '37', '58', '11', '22', '6', '50', '18', '0', '48', '22', '70', '55', '30', '68', '37', '43', '16', '48', '78', '47', '68', '51', '14', '32', '70', '23', '17', '51', '17', '31', '42', '9', '34', '39', '3', '75', '48', '15', '36', '28', '1', '69', '11', '51', '46', '79', '62', '3', '63', '19', '50', '43', '49', '62', '26', '74', '46', '35', '51', '39', '19', '59', '25', '57', '15', '42', '40', '5', '71', '50', '61', '52', '23', '55', '77', '17', '33', '36', '2', '74', '68', '32', '75', '2', '5', '50', '22', '16', '77', '67', '42', '26', '52', '33', '1', '58', '22', '49', '9', '44', '10', '28', '30', '42', '23', '39', '61', '72', '7', '41', '52', '57', '3', '6', '59', '17', '27', '33', '75', '29', '50', '67', '29', '41', '51', '34', '52', '37', '35', '77', '12', '59', '50', '63', '11', '68', '30', '74', '50', '10', '53', '44', '62', '62', '67', '44', '57', '72', '22', '41', '32', '71', '78', '5', '41', '20', '59', '18', '66', '62', '69', '22', '67', '40', '37', '67', '2', '5', '79', '2', '58', '40', '20', '26', '74', '77', '13', '43', '24', '62', '9', '37', '12', '8', '66', '78', '32', '13', '36', '42', '49', '2', '25', '71', '39', '57', '1', '68', '65', '69', '10', '68', '71', '45', '55', '73', '69', '35', '75', '58', '10', '76', '57', '56', '42', '75', '43', '33', '3', '77', '38', '5', '26', '41', '20', '0', '45', '73', '36', '6', '43', '79', '38', '11', '78', '78', '66', '48', '38', '70', '24', '27', '7', '51', '52', '55', '25', '18', '39', '76', '58', '51', '48', '13', '62', '37', '28', '13', '70', '26', '47', '57', '65', '75', '19', '16', '0', '38', '58', '74', '59', '69', '37', '10', '43', '23', '68', '17', '51', '56', '25', '24', '42', '17', '28', '42', '66', '24', '13', '16', '5', '24', '8', '74', '56', '25', '13', '13', '66', '29', '49', '0', '38', '66', '56', '2', '29', '7', '21', '57', '8', '32', '31', '66', '15', '14', '14', '66', '45', '76', '22', '28', '61', '77', '60', '75', '0', '27', '55', '20', '60', '30', '33', '1', '72', '17', '16', '13', '23', '33', '52', '61', '70', '30', '18', '44', '37', '12', '44', '30', '63', '74', '24', '45', '29', '33', '38', '66', '15', '23', '19', '7', '32', '31', '20', '24', '53', '45', '78', '78', '60', '39', '71', '44', '27', '21', '3', '65', '4', '44', '53', '70', '63', '35', '69', '39', '26', '68', '4', '75', '8', '39', '38', '49', '2', '77', '49', '35', '29', '34', '57', '57', '9', '71', '75', '56', '24', '40', '34', '76', '35', '39', '28', '64', '68', '33', '54', '76', '69', '73', '21', '63', '16', '7', '36', '45', '2', '62', '10', '69', '67', '48', '56', '70', '14', '22', '54', '26', '18', '26', '0', '73', '42', '51', '15', '2', '21', '53', '15', '62', '54', '51', '42', '52', '60', '44', '77', '50', '13', '26', '30', '76', '33', '28', '56', '69', '16', '3', '73', '47', '13', '50', '13', '46', '73', '6', '8', '31', '49', '24', '68', '2', '30', '21', '2', '61', '40', '9', '48', '72', '11', '53', '36', '20', '16', '55', '0', '42', '10', '55', '17', '18', '38', '38', '28', '59', '61', '27', '68', '36', '74', '40', '34', '72', '79', '78', '55', '17', '41', '69', '39', '30', '41', '63', '68', '55', '69', '55', '59', '29', '55', '65', '66', '61', '14', '55', '72', '8', '41', '29', '17', '70', '17', '25', '16', '24', '60', '24', '77', '16', '17', '13', '73', '72', '69', '18', '26', '34', '66', '5', '31', '35', '5', '39', '2', '9', '42', '44', '32', '67', '14', '34', '50', '54', '17', '77', '55', '36', '78', '69', '28', '56', '46', '30', '18', '71', '37', '63', '52', '27', '46', '46', '24', '2', '49', '58', '38', '78', '72', '23', '14', '35', '39', '44', '71', '34', '37', '61', '71', '68', '24', '8', '11', '38', '69', '17', '22', '67', '38', '13', '39', '63', '73', '58', '34', '46', '36', '37', '78', '23', '46', '28', '71', '22', '56', '8', '49', '75', '34', '3', '65', '56', '18', '9', '60', '55', '27', '33', '53', '58', '54', '17', '70', '63', '31', '65', '0', '27', '35', '9', '8', '27', '7', '11', '48', '20', '28', '44', '40', '52', '53', '64', '62', '18', '32', '47', '4', '77', '27', '10', '79', '65', '42', '1', '24', '2', '29', '67', '10', '53', '64', '31', '41', '70', '7', '22', '44', '22', '71', '36', '29', '58', '29', '25', '58', '22', '57', '67', '77', '57', '66', '49', '56', '52', '28', '57', '35', '40', '8', '19', '61', '7', '33', '70', '77', '17', '24', '6', '5', '12', '78', '21', '27', '68', '29', '18', '74', '66', '23', '64', '64', '7', '72', '17', '3', '35', '40', '7', '41', '24', '60', '59', '2', '19', '33', '75', '27', '36', '55', '33', '70', '15', '53', '18', '77', '54', '38', '52', '58', '0', '27', '0', '33', '12', '76', '61', '1', '25', '42', '54', '79', '28', '45', '47', '14', '77', '41', '57', '66', '54', '2', '51', '33', '69', '52', '40', '30', '59', '30', '70', '33', '77', '13', '8', '67', '68', '52', '23', '3', '8', '61', '42', '63', '75', '47', '5', '30', '15', '13', '47', '73', '23', '28', '76', '29', '71', '59', '59', '74', '1', '79', '50', '60', '41', '30', '34', '22', '3', '49', '25', '26', '13', '5', '79', '65', '15', '44', '38', '12', '23', '73', '9', '74', '7', '45', '60', '66', '50', '26', '78', '37', '60', '64', '71', '20', '8', '19', '39', '72', '0', '13', '4', '36', '29', '52', '50', '2', '20', '5', '39', '12', '32', '61', '3', '18', '39', '40', '33', '1', '14', '38', '59', '67', '79', '63', '27', '55', '66', '56', '72', '52', '6', '56', '41', '1', '34', '44', '4', '35', '11', '1', '18', '54', '25', '50', '8', '76', '7', '3', '48', '17', '34', '61', '33', '17', '28', '54', '3', '74', '3', '21', '19', '64', '45', '10', '19', '70', '74', '17', '42', '74', '37', '4', '76', '27', '39', '31', '33', '68', '48', '13', '23', '17', '44', '31', '73', '66', '45', '1', '59', '9', '74', '2', '6', '16', '60', '63', '56', '29', '76', '50', '70', '6', '39', '41', '46', '9', '8', '63', '31', '4', '35', '77', '70', '53', '3', '42', '29', '37', '26', '6', '52', '73', '66', '24', '46', '63', '21', '24', '66', '79', '57', '51', '10', '11', '45', '63', '32', '28', '45', '59', '28', '69', '55', '25', '12', '70', '16', '29', '33', '41', '48', '5', '31', '39', '37', '48', '73', '53', '14', '53', '65', '61', '52', '79', '40', '75', '46', '51', '50', '8', '27', '34', '57', '63', '3', '59', '37', '52', '22', '20', '35', '16', '6', '57', '28', '60', '36', '3', '44', '45', '47', '75', '28', '41', '39', '2', '50', '70', '13', '62', '1', '32', '27', '52', '8', '5', '35', '40', '12', '78', '33', '26', '37', '6', '62', '71', '59', '61', '67', '11', '51', '56', '6', '9', '66', '8', '16', '50', '54', '31', '66', '51', '42', '7', '59', '54', '45', '79', '54', '50', '43', '16', '25', '35', '74', '60', '64', '13', '4', '50', '11', '58', '40', '26', '36', '65', '46', '66', '2', '12', '17', '11', '36', '45', '14', '39', '9', '72', '58', '34', '0', '1', '8', '3', '35', '36', '29', '42', '0', '78', '60', '56', '22', '17', '28', '11', '79', '58', '25', '76', '70', '34', '59', '49', '17', '0', '9', '49', '66', '56', '48', '19', '54', '38', '46', '48', '0', '3', '47', '40', '61', '78', '28', '38', '48', '79', '35', '29', '19', '0', '34', '72', '24', '42', '44', '20', '34', '18', '5', '25', '14', '31', '42', '63', '47', '29', '18', '21', '68', '13', '56', '74', '33', '41', '7', '38', '31', '79', '19', '29', '25', '34', '34', '78', '58', '37', '21', '25', '45', '5', '43', '58', '40', '57', '54', '23', '73', '35', '65', '24', '25', '13', '18', '69', '28', '67', '46', '33', '41', '1', '33', '31', '50', '61', '58', '49', '59', '15', '50', '67', '74', '53', '36', '54', '46', '76', '37', '48', '11', '45', '60', '54', '69', '62', '26', '28', '8', '3', '20', '24', '74', '19', '65', '32', '44', '28', '0', '27', '59', '52', '15', '69', '38', '58', '15', '57', '17', '34', '52', '18', '27', '71', '1', '76', '24', '36', '30', '64', '15', '65', '66', '23', '5', '8', '51', '14', '60', '22', '30', '58', '66', '65', '20', '53', '78', '66', '14', '61', '79', '53', '65', '9', '28', '73', '4', '13', '71', '21', '77', '44', '67', '64', '51', '36', '31', '28', '72', '46', '37', '9', '42', '26', '49', '18', '73', '7', '17', '29', '26', '44', '63', '69', '72', '36', '46', '42', '6', '67', '69', '30', '53', '21', '64', '11', '6', '69', '65', '37', '67', '74', '56', '76', '51', '22', '26', '19', '23', '52', '43', '42', '66', '61', '77', '4', '43', '35', '50', '68', '67', '60', '74', '70', '69', '42', '67', '72', '2', '7', '13', '26', '11', '44', '64', '2', '45', '66', '7', '19', '40', '53', '52', '27', '52', '2', '43', '52', '30', '60', '33', '27', '76', '77', '27', '44', '51', '52', '50', '17', '32', '0', '20', '11', '15', '44', '11', '76', '71', '42', '14', '50', '41', '64', '72', '61', '15', '59', '75', '40', '46', '75', '52', '23', '39', '47', '58', '55', '33', '35', '46', '26', '3', '26', '69', '42', '59', '38', '69', '6', '52', '70', '2', '29', '16', '7', '60', '57', '62', '48', '27', '31', '37', '13', '30', '60', '50', '5', '28', '50', '9', '0', '40', '26', '54', '71', '26', '53', '49', '19', '28', '73', '7', '3', '19', '36', '35', '57', '39', '11', '36', '69', '49', '0', '69', '11', '0', '26', '43', '29', '16', '29', '35', '79', '78', '33', '53', '54', '53', '7', '9', '65', '2', '22', '23', '20', '24', '3', '71', '22', '31', '55', '0', '21', '18', '40', '38', '2', '63', '47', '31', '63', '47', '11', '33', '29', '0', '11', '61', '4', '64', '52', '53', '75', '48', '58', '76', '59', '14', '63', '1', '10', '5', '15', '44', '1', '68', '14', '20', '10', '79', '59', '77', '43', '14', '46', '25', '76', '48', '65', '68', '0', '33', '45', '64', '13', '3', '54', '20', '74', '51', '71', '4', '29', '54', '65', '25', '20', '14', '22', '64', '56', '24', '54', '41', '25', '47', '50', '2', '48', '49', '27', '49', '68', '78', '44', '63', '70', '30', '36', '63', '58', '19', '13', '63', '69', '2', '5', '15', '4', '29', '64', '4', '6', '39', '46', '17', '3', '31', '42', '16', '79', '18', '6', '66', '1', '52', '16', '22', '55', '46', '68', '46', '15', '18', '38', '29', '12', '49', '1', '27', '10', '73', '66', '20', '57', '33', '40', '56', '22', '48', '57', '66', '3', '16', '25', '3', '56', '76', '17', '79', '34', '40', '17', '63', '71', '15', '4', '3', '56', '74', '22', '67', '18', '27', '60', '7', '72', '54', '79', '65', '61', '7', '55', '37', '31', '1', '30', '62', '17', '19', '72', '11', '76', '72', '3', '73', '79', '14', '5', '29', '72', '29', '7', '71', '61', '68', '18', '25', '38', '71', '62', '5', '39', '32', '53', '67', '21', '4', '35', '28', '77', '36', '49', '24', '73', '49', '78', '70', '17', '12', '72', '18', '11', '55', '48', '2', '6', '33', '16', '76', '46', '44', '45', '1', '52', '18', '12', '27', '59', '10', '68', '37', '72', '17', '49', '73', '55', '3', '27', '5', '41', '40', '7', '54', '79', '71', '40', '27', '17', '29', '68', '27', '5', '44', '14', '44', '66', '58', '62', '42', '41', '35', '7', '56', '70', '57', '65', '68', '66', '79', '38', '12', '76', '55', '56', '45', '33', '79', '55', '57', '57', '12', '50', '15', '17', '19', '54', '78', '51', '34', '12', '10', '37', '29', '75', '50', '66', '18', '79', '47', '20', '76', '5', '47', '3', '49', '38', '43', '43', '40', '66', '1', '55', '48', '18', '49', '7', '62', '71', '24', '36', '39', '38', '6', '65', '20', '53', '4', '27', '35', '53', '43', '23', '55', '3', '44', '4', '51', '58', '18', '36', '55', '10', '6', '28', '63', '25', '70', '3', '7', '15', '64', '39', '33', '29', '60', '39', '30', '5', '22', '74', '8', '51', '3', '72', '12', '53', '76', '46', '46', '33', '69', '17', '21', '9', '40', '17', '22', '72', '26', '2', '59', '8', '30', '7', '51', '71', '38', '49', '1', '24', '45', '34', '26', '23', '58', '30', '73', '20', '59', '16', '12', '69', '35', '51', '62', '39', '11', '31', '66', '0', '58', '36', '38', '56', '33', '72', '6', '79', '23', '47', '64', '55', '22', '9', '52', '65', '77', '72', '5', '0', '4', '21', '77', '59', '26', '52', '18', '15', '27', '31', '58', '78', '31', '11', '10', '45', '21', '49', '37', '12', '12', '18', '40', '33', '3', '23', '20', '77', '50', '9', '2', '60', '49', '6', '76', '26', '59', '67', '68', '24', '4', '56', '77', '25', '76', '18', '33', '31', '79', '38', '71', '40', '47', '28', '19', '62', '18', '68', '47', '8', '31', '6', '25', '37', '39', '45', '18', '53', '57', '35', '73', '23', '59', '27', '10', '79', '39', '19', '41', '12', '36', '74', '11', '54', '29', '48', '73', '41', '48', '51', '19', '4', '67', '26', '14', '79', '11', '74', '38', '36', '36', '12', '62', '72', '12', '20', '31', '29', '79', '75', '1', '75', '11', '74', '0', '23', '1', '65', '30', '28', '29', '32', '31', '39', '18', '63', '73', '58', '35', '45', '67', '61', '30', '11', '48', '33', '54', '49', '17', '78', '34', '39', '67', '35', '30', '63', '25', '75', '22', '37', '65', '53', '8', '49', '77', '67', '46', '54', '19', '42', '9', '44', '57', '25', '43', '74', '66', '69', '51', '0', '11', '79', '48', '37', '1', '31', '54', '37', '43', '18', '2', '34', '23', '5', '50', '15', '42', '48', '34', '25', '53', '8', '52', '6', '24', '73', '3', '15', '66', '15', '9', '25', '28', '33', '58', '64', '68', '20', '9', '64', '64', '53', '36', '25', '14', '49', '76', '79', '69', '19', '73', '0', '51', '63', '67', '28', '77', '53', '74', '5', '65', '61', '34', '42', '63', '35', '23', '10', '37', '53', '36', '46', '23', '42', '19', '6', '75', '24', '47', '18', '50', '16', '54', '62', '76', '57', '17', '47', '68', '79', '47', '9', '52', '50', '22', '13', '8', '58', '77', '16', '39', '18', '41', '71', '31', '21', '65', '1', '16', '51', '15', '3', '71', '78', '23', '42', '21', '56', '58', '44', '32', '8', '13', '79', '66', '6', '43', '1', '43', '17', '4', '21', '23', '17', '17', '30', '54', '11', '61', '41', '56', '34', '5', '9', '62', '11', '11', '62', '40', '25', '59', '78', '1', '23', '6', '33', '60', '8', '46', '41', '14', '12', '28', '71', '43', '24', '15', '76', '57', '45', '35', '64', '31', '70', '68', '69', '47', '49', '19', '38', '31', '62', '54', '43', '0', '0', '72', '60', '68', '32', '68', '48', '60', '32', '53', '42', '18', '54', '76', '59', '45', '38', '73', '57', '32', '53', '30', '2', '23', '68', '0', '54', '58', '42', '7', '41', '25', '62', '33', '29', '64', '76', '10', '2', '27', '53', '31', '52', '51', '43', '72', '32', '58', '23', '75', '25', '0', '3', '37', '70', '79', '78', '36', '44', '0', '26', '15', '45', '49', '8', '2', '38', '23', '4', '13', '59', '24', '76', '54', '15', '40', '26', '48', '7', '9', '55', '38', '61', '50', '44', '42', '66', '59', '38', '48', '58', '29', '4', '35', '28', '71', '26', '26', '65', '66', '43', '58', '50', '26', '12', '23', '7', '40', '26', '14', '42', '20', '49', '45', '20', '17', '67', '27', '6', '75', '3', '22', '15', '32', '46', '76', '6', '20', '14', '27', '32', '44', '33', '34', '3', '1', '14', '19', '1', '54', '72', '79', '12', '61', '26', '1', '15', '77', '24', '7', '47', '57', '23', '70', '33', '1', '12', '65', '63', '0', '50', '4', '51', '70', '50', '73', '72', '51', '59', '35', '18', '12', '1', '13', '17', '62', '2', '76', '73', '18', '11', '62', '71', '37', '78', '73', '38', '61', '29', '34', '3', '44', '60', '28', '72', '7', '26', '37', '77', '17', '18', '31', '75', '51', '21', '21', '25', '27', '65', '14', '73', '42', '17', '5', '67', '33', '19', '37', '46', '17', '22', '31', '69', '78', '61', '36', '30', '12', '57', '5', '67', '36', '63', '51', '15', '67', '9', '72', '62', '43', '47', '17', '19', '38', '73', '23', '79', '44', '60', '60', '69', '30', '54', '30', '33', '30', '67', '57', '4', '13', '39', '9', '47', '19', '30', '31', '50', '19', '31', '20', '18', '23', '7', '41', '65', '11', '3', '55', '6', '48', '8', '11', '4', '3', '23', '4', '69', '9', '29', '32', '72', '5', '55', '9', '60', '68', '4', '17', '76', '9', '23', '63', '31', '33', '1', '66', '39', '11', '2', '67', '29', '16', '14', '28', '1', '40', '48', '79', '35', '36', '40', '8', '7', '67', '17', '69', '78', '70', '13', '20', '78', '41', '43', '20', '43', '22', '59', '40', '6', '7', '47', '39', '65', '1', '1', '33', '57', '8', '57', '33', '68', '21', '52', '45', '61', '23', '25', '41', '69', '59', '79', '78', '21', '77', '52', '35', '4', '77', '67', '36', '50', '51', '21', '14', '69', '1', '52', '41', '0', '12', '15', '66', '28', '30', '14', '76', '34', '18', '55', '26', '77', '60', '30', '51', '16', '26', '9', '68', '51', '78', '24', '62', '63', '6', '63', '30', '45', '45', '3', '66', '25', '38', '23', '24', '52', '36', '63', '27', '3', '51', '62', '16', '7', '66', '40', '38', '14', '78', '37', '23', '47', '30', '16', '25', '76', '6', '71', '7', '16', '22', '8', '71', '8', '2', '47', '17', '54', '9', '19', '51', '19', '72', '38', '9', '69', '48', '7', '62', '67', '24', '3', '36', '77', '70', '63', '78', '17', '20', '35', '70', '60', '5', '16', '53', '78', '20', '78', '27', '32', '12', '1', '64', '15', '59', '3', '7', '60', '56', '3', '14', '60', '41', '57', '17', '55', '73', '14', '0', '51', '51', '76', '19', '68', '63', '72', '46', '6', '76', '40', '67', '40', '54', '72', '30', '2', '52', '77', '43', '74', '6', '74', '64', '42', '4', '36', '39', '38', '50', '19', '26', '43', '63', '79', '30', '22', '77', '26', '16', '6', '30', '41', '56', '16', '23', '21', '60', '0', '76', '31', '55', '47', '61', '31', '64', '28', '54', '76', '42', '49', '34', '10', '30', '61', '0', '19', '31', '63', '32', '59', '64', '20', '6', '46', '14', '1', '44', '67', '56', '17', '60', '54', '53', '55', '51', '18', '78', '79', '52', '57', '44', '21', '74', '72', '59', '64', '66', '73', '34', '31', '26', '15', '68', '47', '51', '21', '11', '2', '34', '77', '43', '47', '34', '39', '44', '63', '9', '24', '16', '59', '16', '53', '25', '62', '13', '30', '25', '7', '33', '37', '9', '72', '25', '48', '64', '52', '25', '72', '47', '15', '12', '43', '44', '65', '2', '44', '62', '16', '44', '10', '42', '60', '37', '55', '17', '75', '32', '27', '16', '44', '23', '56', '22', '22', '78', '26', '62', '0', '76', '55', '27', '30', '53', '78', '26', '57', '9', '54', '2', '46', '73', '44', '24', '9', '69', '74', '72', '76', '10', '21', '20', '35', '8', '46', '11', '51', '77', '60', '50', '11', '10', '16', '2', '73', '25', '1', '40', '76', '2', '55', '38', '5', '70', '2', '52', '77', '27', '29', '23', '47', '35', '58', '27', '73', '32', '68', '48', '57', '64', '37', '73', '39', '52', '42', '44', '58', '37', '9', '57', '3', '29', '78', '73', '39', '8', '52', '72', '65', '51', '38', '37', '53', '40', '25', '5', '56', '64', '19', '49', '55', '77', '65', '12', '63', '38', '30', '56', '68', '62', '49', '22', '64', '55', '67', '74', '66', '14', '67', '54', '70', '7', '15', '47', '27', '39', '70', '6', '24', '66', '24', '32', '37', '52', '29', '58', '18', '22', '76', '17', '70', '20', '29', '73', '62', '75', '29', '26', '78', '28', '61', '23', '21', '0', '28', '0', '44', '53', '4', '45', '5', '57', '33', '40', '37', '33', '63', '14', '8', '40', '56', '26', '45', '29', '44', '25', '21', '31', '63', '71', '12', '16', '28', '38', '25', '41', '47', '50', '36', '38', '5', '47', '69', '51', '42', '5', '68', '52', '27', '40', '21', '13', '13', '63', '18', '11', '73', '5', '29', '1', '71', '55', '32', '72', '27', '44', '60', '79', '43', '62', '54', '64', '53', '47', '59', '24', '11', '5', '50', '68', '35', '36', '56', '55', '50', '55', '57', '56', '73', '47', '17', '12', '51', '70', '78', '50', '24', '29', '73', '62', '46', '15', '35', '75', '47', '0', '24', '56', '13', '22', '62', '56', '52', '25', '15', '63', '0', '68', '20', '1', '6', '76', '4', '23', '69', '43', '1', '24', '47', '0', '47', '76', '16', '35', '43', '6', '56', '66', '27', '24', '4', '7', '52', '60', '39', '21', '63', '67', '16', '62', '18', '33', '53', '48', '61', '19', '57', '26', '7', '38', '63', '63', '74', '67', '15', '41', '69', '65', '35', '30', '16', '10', '3', '68', '33', '46', '12', '45', '22', '47', '58', '12', '41', '18', '48', '17', '51', '9', '51', '8', '17', '29', '73', '73', '43', '7', '26', '64', '20', '45', '12', '30', '69', '43', '11', '76', '72', '54', '64', '59', '31', '71', '57', '62', '0', '50', '39', '52', '54', '9', '29', '36', '73', '61', '29', '56', '77', '0', '59', '30', '36', '60', '11', '67', '51', '12', '31', '72', '47', '50', '27', '78', '34', '17', '60', '46', '36', '74', '79', '17', '51', '25', '59', '1', '16', '62', '27', '0', '37', '60', '10', '40', '51', '15', '62', '48', '32', '38', '36', '53', '79', '30', '57', '77', '21', '3', '14', '36', '55', '32', '49', '2', '20', '68', '46', '56', '21', '37', '74', '27', '14', '75', '62', '65', '41', '5', '13', '42', '7', '43', '4', '2', '40', '41', '21', '75', '29', '8', '32', '64', '29', '51', '12', '13', '47', '24', '14', '2', '50', '54', '17', '24', '39', '52', '33', '31', '51', '77', '37', '29', '62', '77', '5', '47', '53', '77', '17', '55', '7', '35', '13', '58', '40', '28', '64', '22', '59', '9', '33', '45', '4', '74', '62', '42', '66', '25', '20', '36', '16', '8', '55', '48', '38', '43', '59', '2', '79', '71', '5', '61', '40', '48', '34', '59', '67', '31', '8', '27', '43', '48', '9', '54', '15', '48', '55', '38', '63', '28', '72', '78', '49', '70', '62', '48', '16', '27', '28', '47', '71', '50', '13', '26', '31', '70', '55', '73', '6', '45', '25', '1', '78', '68', '24', '64', '38', '65', '44', '48', '76', '73', '32', '42', '18', '48', '51', '45', '20', '37', '40', '4', '74', '5', '41', '74', '62', '4', '34', '49', '9', '22', '74', '20', '8', '5', '16', '28', '24', '31', '11', '8', '17', '67', '15', '77', '52', '42', '40', '26', '58', '8', '74', '23', '22', '15', '3', '59', '6', '4', '68', '75', '31', '4', '12', '4', '74', '2', '40', '30', '51', '11', '18', '79', '20', '50', '62', '61', '5', '26', '49', '32', '45', '78', '55', '60', '53', '67', '1', '46', '28', '74', '18', '76', '27', '6', '7', '65', '67', '19', '62', '28', '28', '72', '55', '71', '73', '78', '37', '25', '45', '31', '62', '39', '10', '34', '72', '19', '79', '9', '69', '1', '19', '71', '29', '71', '69', '71', '46', '75', '48', '62', '9', '31', '33', '23', '24', '59', '67', '76', '55', '20', '72', '70', '57', '33', '63', '54', '6', '64', '53', '51', '8', '4', '37', '29', '63', '67', '23', '75', '26', '77', '10', '50', '53', '59', '70', '71', '36', '3', '78', '32', '62', '28', '26', '69', '60', '50', '13', '70', '4', '47', '33', '47', '14', '54', '30', '2', '38', '38', '61', '38', '79', '65', '3', '47', '72', '43', '9', '38', '76', '56', '9', '39', '29', '18', '75', '20', '12', '76', '4', '78', '68', '19', '55', '64', '57', '34', '19', '43', '43', '31', '47', '52', '22', '13', '50', '52', '36', '30', '58', '20', '31', '7', '62', '78', '27', '15', '26', '9', '41', '48', '74', '58', '14', '10', '46', '56', '66', '10', '58', '6', '5', '69', '30', '62', '58', '43', '59', '77', '65', '9', '12', '72', '74', '73', '37', '41', '71', '38', '75', '32', '45', '14', '10', '48', '41', '55', '11', '62', '48', '55', '20', '61', '22', '41', '17', '41', '26', '74', '48', '53', '14', '6', '8', '65', '49', '27', '46', '66', '56', '15', '26', '60', '49', '17', '72', '20', '1', '6', '52', '55', '56', '47', '32', '42', '56', '6', '77', '27', '24', '75', '41', '9', '33', '42', '10', '78', '25', '28', '76', '27', '43', '49', '74', '36', '30', '43', '70', '50', '61', '41', '6', '73', '67', '52', '13', '43', '18', '36', '48', '41', '54', '74', '3', '61', '73', '15', '33', '34', '5', '39', '79', '49', '7', '5', '31', '8', '15', '78', '56', '39', '70', '15', '17', '16', '34', '30', '50', '7', '22', '65', '62', '18', '19', '74', '40', '79', '45', '17', '67', '24', '45', '60', '14', '35', '27', '50', '20', '58', '28', '6', '37', '43', '27', '34', '72', '7', '42', '65', '50', '31', '41', '64', '20', '62', '37', '5', '48', '37', '53', '48', '41', '62', '2', '21', '41', '65', '21', '48', '56', '5', '18', '68', '24', '72', '65', '50', '73', '75', '53', '41', '25', '31', '19', '68', '63', '76', '18', '10', '46', '58', '59', '16', '37', '28', '55', '0', '65', '16', '37', '3', '75', '2', '44', '49', '1', '58', '5', '43', '14', '42', '40', '61', '77', '50', '29', '44', '78', '14', '16', '16', '53', '48', '27', '21', '69', '40', '45', '46', '16', '38', '68', '17', '41', '63', '19', '60', '76', '35', '63', '46', '65', '35', '16', '37', '65', '40', '33', '46', '64', '44', '53', '37', '73', '15', '79', '2', '32', '35', '37', '1', '53', '13', '8', '4', '36', '37', '35', '76', '51', '2', '11', '61', '58', '0', '61', '1', '29', '77', '29', '53', '8', '22', '18', '31', '22', '50', '49', '78', '79', '77', '1', '16', '28', '3', '62', '61', '3', '29', '5', '5', '79', '76', '38', '65', '48', '31', '49', '26', '1', '25', '55', '5', '79', '47', '44', '9', '62', '4', '8', '33', '13', '56', '39', '72', '46', '15', '28', '30', '62', '73', '72', '61', '10', '26', '66', '62', '72', '31', '61', '3', '17', '28', '0', '78', '26', '79', '19', '25', '65', '40', '38', '54', '42', '68', '30', '12', '35', '28', '71', '24', '62', '69', '52', '42', '20', '43', '71', '38', '43', '6', '30', '46', '20', '40', '34', '75', '26', '3', '44', '10', '30', '11', '17', '59', '73', '4', '57', '0', '30', '42', '31', '31', '14', '66', '44', '23', '77', '32', '60', '1', '9', '4', '66', '65', '77', '60', '15', '36', '68', '22', '33', '52', '58', '4', '59', '67', '21', '11', '21', '78', '67', '73', '29', '52', '8', '64', '13', '68', '78', '27', '15', '62', '56', '65', '8', '39', '57', '2', '13', '5', '21', '29', '30', '41', '35', '41', '33', '9', '70', '25', '38', '79', '61', '72', '37', '49', '30', '74', '40', '64', '24', '4', '44', '6', '10', '78', '8', '29', '12', '54', '16', '54', '75', '43', '65', '27', '47', '71', '79', '58', '76', '7', '49', '17', '78', '56', '44', '12', '79', '64', '4', '29', '1', '45', '70', '17', '37', '79', '77', '59', '59', '18', '57', '73', '11', '76', '55', '29', '65', '15', '15', '11', '27', '35', '10', '39', '25', '13', '66', '74', '77', '30', '12', '1', '34', '13', '17', '29', '70', '4', '25', '60', '32', '12', '73', '14', '15', '68', '41', '30', '9', '70', '17', '33', '36', '44', '21', '57', '31', '33', '22', '14', '60', '16', '14', '22', '63', '29', '58', '12', '13', '3', '60', '42', '47', '14', '75', '16', '9', '63', '77', '15', '4', '11', '55', '73', '31', '17', '29', '32', '22', '44', '26', '69', '77', '40', '48', '78', '24', '24', '4', '11', '27', '46', '43', '34', '33', '17', '71', '14', '29', '0', '39', '52', '10', '10', '29', '61', '33', '30', '37', '63', '72', '49', '1', '25', '58', '36', '52', '77', '62', '57', '31', '35', '77', '66', '10', '46', '24', '43', '22', '36', '18', '8', '75', '51', '66', '79', '32', '77', '19', '79', '63', '50', '67', '73', '43', '23', '19', '42', '62', '25', '9', '57', '61', '54', '62', '2', '13', '26', '47', '32', '34', '54', '49', '26', '56', '6', '64', '49', '10', '18', '74', '2', '42', '53', '38', '39', '36', '24', '30', '30', '54', '0', '36', '34', '68', '35', '28', '18', '61', '17', '9', '1', '29', '3', '48', '29', '17', '70', '9', '12', '2', '71', '49', '18', '4', '5', '53', '18', '56', '25', '77', '46', '24', '45', '75', '18', '17', '66', '67', '14', '46', '48', '75', '59', '15', '73', '47', '57', '48', '36', '23', '6', '79', '6', '7', '18', '69', '0', '2', '53', '61', '0', '12', '7', '43', '66', '11', '53', '12', '17', '4', '3', '2', '61', '53', '4', '67', '52', '59', '21', '45', '27', '15', '13', '13', '69', '72', '6', '37', '53', '66', '31', '25', '38', '39', '18', '18', '18', '18', '11', '49', '23', '14', '35', '59', '49', '67', '67', '29', '13', '26', '22', '77', '24', '64', '60', '72', '68', '71', '14', '58', '61', '20', '16', '0', '45', '38', '57', '24', '24', '3', '78', '72', '44', '23', '0', '35', '18', '53', '49', '70', '60', '59', '70', '60', '65', '51', '58', '13', '55', '24', '53', '4', '4', '26', '7', '52', '48', '22', '41', '29', '9', '52', '10', '40', '56', '76', '40', '20', '23', '3', '44', '8', '25', '24', '60', '47', '32', '60', '73', '66', '45', '13', '60', '36', '6', '0', '59', '52', '21', '4', '45', '19', '41', '79', '62', '14', '30', '24', '65', '65', '15', '36', '15', '44', '74', '9', '78', '72', '18', '60', '57', '34', '25', '5', '67', '24', '35', '25', '17', '7', '65', '74', '68', '41', '12', '7', '21', '66', '63', '6', '52', '34', '45', '13', '38', '7', '34', '25', '10', '41', '21', '69', '50', '2', '72', '9', '73', '5', '14', '69', '18', '72', '13', '11', '3', '17', '79', '41', '2', '30', '61', '32', '53', '62', '59', '38', '49', '60', '78', '5', '16', '75', '7', '74', '36', '48', '12', '58', '61', '46', '18', '42', '77', '40', '48', '42', '66', '42', '50', '40', '43', '21', '60', '31', '77', '4', '22', '39', '42', '16', '14', '20', '61', '20', '74', '79', '45', '59', '31', '25', '55', '50', '1', '71', '55', '26', '18', '69', '20', '37', '59', '47', '15', '9', '14', '61', '1', '54', '20', '77', '48', '48', '54', '5', '10', '61', '15', '10', '9', '74', '0', '0', '39', '11', '13', '12', '39', '41', '65', '13', '52', '48', '41', '48', '16', '25', '25', '76', '43', '45', '4', '39', '37', '24', '26', '19', '57', '7', '61', '16', '14', '40', '45', '26', '54', '66', '25', '10', '4', '56', '3', '63', '34', '69', '70', '33', '0', '32', '53', '16', '59', '20', '64', '77', '64', '18', '38', '15', '26', '47', '70', '1', '0', '75', '20', '46', '41', '24', '67', '25', '3', '78', '34', '33', '19', '58', '72', '31', '20', '26', '2', '35', '55', '8', '0', '8', '9', '1', '22', '42', '54', '48', '22', '38', '28', '56', '79', '64', '10', '40', '34', '46', '20', '15', '34', '47', '41', '52', '2', '65', '35', '22', '60', '35', '56', '10', '59', '0', '47', '31', '41', '3', '54', '45', '29', '9', '41', '72', '63', '17', '6', '0', '52', '23', '30', '15', '22', '26', '69', '33', '77', '32', '31', '43', '50', '40', '57', '22', '56', '32', '36', '0', '49', '62', '52', '52', '74', '51', '21', '52', '38', '53', '66', '54', '74', '4', '5', '10', '39', '66', '10', '77', '1', '11', '25', '67', '56', '77', '79', '0', '78', '59', '9', '64', '22', '36', '37', '44', '11', '5', '22', '62', '55', '24', '52', '17', '18', '21', '4', '69', '16', '40', '17', '51', '38', '9', '11', '65', '18', '62', '16', '76', '52', '60', '74', '52', '50', '68', '55', '68', '71', '46', '60', '47', '49', '61', '40', '32', '55', '6', '77', '21', '28', '1', '45', '68', '68', '62', '24', '3', '71', '16', '23', '65', '43', '61', '56', '20', '28', '64', '25', '44', '69', '74', '6', '14', '71', '14', '37', '39', '64', '71', '58', '5', '54', '0', '28', '8', '15', '64', '28', '11', '50', '79', '27', '6', '22', '1', '63', '62', '40', '51', '49', '26', '47', '42', '76', '30', '69', '76', '54', '52', '46', '20', '74', '71', '29', '15', '54', '58', '43', '10', '53', '48', '18', '72', '2', '79', '79', '53', '67', '62', '37', '70', '75', '29', '58', '9', '76', '33', '9', '56', '60', '11', '41', '17', '23', '52', '76', '42', '42', '71', '44', '49', '19', '32', '6', '56', '29', '72', '71', '60', '46', '26', '5', '24', '68', '60', '23', '1', '75', '32', '53', '2', '57', '39', '32', '36', '44', '19', '53', '69', '5', '55', '24', '61', '1', '73', '68', '43', '42', '55', '12', '20', '7', '33', '73', '14', '54', '52', '3', '63', '75', '64', '30', '37', '60', '79', '75', '64', '5', '25', '46', '24', '39', '7', '32', '46', '11', '16', '61', '24', '61', '26', '73', '39', '3', '45', '64', '48', '33', '44', '61', '47', '58', '39', '76', '36', '8', '47', '18', '5', '50', '42', '8', '12', '66', '25', '38', '63', '68', '26', '19', '75', '33', '69', '30', '30', '72', '21', '2', '70', '70', '9', '78', '56', '39', '49', '52', '17', '39', '0', '8', '44', '17', '59', '61', '65', '6', '11', '35', '19', '66', '9', '14', '54', '78', '21', '16', '35', '10', '57', '9', '44', '33', '58', '72', '2', '67', '21', '12', '41', '3', '4', '38', '45', '22', '79', '71', '6', '58', '53', '45', '48', '28', '54', '55', '17', '12', '28', '25', '3', '12', '29', '79', '12', '36', '56', '36', '52', '4', '17', '19', '61', '30', '22', '14', '32', '64', '60', '48', '76', '36', '34', '61', '47', '3', '1', '41', '68', '27', '69', '76', '56', '25', '61', '18', '78', '67', '61', '39', '56', '17', '54', '74', '37', '51', '59', '35', '44', '41', '36', '78', '33', '36', '13', '44', '69', '49', '60', '14', '17', '20', '14', '4', '29', '7', '49', '70', '64', '32', '44', '67', '70', '37', '11', '37', '50', '32', '67', '20', '39', '12', '64', '10', '32', '78', '21', '36', '38', '62', '23', '44', '25', '65', '37', '5', '15', '12', '11', '58', '21', '49', '60', '53', '67', '67', '52', '47', '43', '56', '70', '52', '49', '10', '14', '75', '10', '4', '62', '3', '65', '46', '39', '59', '69', '42', '79', '8', '74', '63', '65', '76', '1', '19', '55', '70', '5', '26', '8', '26', '54', '74', '70', '6', '40', '24', '2', '79', '10', '47', '23', '41', '16', '60', '17', '24', '54', '23', '62', '34', '25', '45', '58', '66', '31', '46', '76', '59', '42', '29', '21', '8', '34', '16', '49', '50', '47', '25', '76', '33', '50', '6', '23', '47', '75', '77', '55', '40', '4', '28', '13', '28', '55', '14', '22', '56', '76', '64', '8', '19', '23', '46', '19', '6', '13', '2', '58', '61', '58', '51', '7', '29', '23', '68', '71', '19', '6', '20', '42', '74', '63', '45', '31', '7', '78', '41', '33', '73', '54', '69', '66', '12', '32', '41', '61', '54', '40', '22', '15', '77', '41', '4', '70', '61', '0', '77', '57', '65', '57', '77', '49', '68', '58', '72', '36', '69', '46', '49', '23', '34', '68', '39', '13', '64', '19', '23', '6', '74', '66', '52', '73', '14', '6', '71', '58', '1', '57', '4', '31', '59', '12', '79', '29', '79', '71', '36', '21', '43', '5', '37', '51', '9', '78', '76', '67', '42', '47', '73', '15', '32', '78', '62', '45', '39', '23', '55', '31', '56', '11', '65', '37', '58', '15', '33', '47', '79', '66', '76', '72', '49', '64', '64', '16', '22', '1', '5', '43', '26', '53', '72', '2', '27', '41', '26', '22', '51', '15', '43', '21', '9', '43', '5', '7', '50', '58', '7', '10', '28', '76', '68', '72', '27', '33', '39', '35', '8', '34', '51', '20', '6', '74', '3', '12', '37', '33', '27', '19', '17', '58', '54', '32', '56', '56', '52', '50', '4', '17', '12', '10', '20', '54', '26', '68', '5', '40', '28', '56', '3', '17', '76', '27', '13', '35', '54', '31', '34', '14', '12', '2', '17', '61', '16', '39', '35', '5', '53', '34', '3', '48', '42', '69', '60', '6', '40', '16', '65', '43', '18', '71', '69', '9', '44', '22', '47', '28', '48', '75', '16', '14', '5', '73', '22', '45', '71', '40', '27', '63', '13', '41', '17', '49', '79', '29', '48', '69', '76', '11', '32', '63', '21', '75', '57', '78', '6', '74', '6', '23', '74', '25', '21', '11', '69', '50', '17', '71', '54', '77', '60', '46', '20', '77', '25', '66', '53', '32', '59', '23', '41', '62', '52', '47', '50', '63', '0', '7', '70', '57', '26', '38', '25', '18', '42', '38', '43', '43', '38', '68', '79', '59', '70', '21', '65', '74', '9', '37', '56', '78', '55', '11', '0', '41', '35', '30', '38', '40', '59', '22', '61', '0', '28', '13', '31', '2', '49', '30', '19', '35', '71', '15', '20', '43', '30', '48', '13', '17', '22', '54', '70', '60', '69', '25', '7', '40', '13', '7', '10', '14', '75', '30', '50', '26', '1', '0', '66', '58', '32', '73', '49', '51', '69', '13', '49', '48', '25', '1', '38', '66', '36', '58', '36', '21', '67', '57', '75', '2', '73', '57', '16', '13', '68', '51', '6', '29', '52', '48', '41', '60', '48', '32', '28', '16', '42', '40', '19', '7', '48', '11', '38', '13', '70', '73', '74', '45', '41', '74', '56', '32', '9', '2', '64', '8', '37', '26', '65', '73', '36', '44', '19', '31', '48', '44', '68', '35', '27', '54', '32', '24', '53', '37', '38', '19', '10', '52', '38', '39', '68', '54', '62', '46', '78', '19', '11', '42', '75', '22', '26', '43', '53', '60', '64', '3', '63', '78', '28', '16', '9', '59', '2', '2', '78', '22', '37', '36', '16', '29', '70', '12', '62', '7', '5', '19', '40', '24', '77', '48', '63', '16', '5', '1', '74', '66', '68', '60', '2', '5', '8', '48', '3', '65', '46', '19', '34', '8', '39', '70', '9', '60', '35', '34', '73', '43', '14', '73', '8', '6', '61', '60', '54', '70', '31', '56', '43', '14', '27', '66', '66', '77', '36', '56', '65', '75', '17', '2', '27', '56', '38', '42', '58', '74', '13', '13', '48', '46', '79', '24', '63', '45', '34', '74', '4', '6', '5', '23', '19', '34', '38', '44', '7', '55', '39', '51', '42', '60', '33', '14', '13', '44', '32', '67', '68', '28', '40', '38', '21', '23', '38', '77', '54', '36', '57', '50', '60', '12', '5', '11', '4', '50', '25', '67', '78', '51', '33', '69', '74', '18', '15', '17', '36', '13', '55', '15', '65', '29', '58', '79', '18', '49', '39', '26', '56', '19', '72', '74', '68', '11', '69', '65', '77', '6', '56', '47', '20', '69', '34', '44', '66', '46', '19', '76', '9', '54', '55', '32', '21', '32', '56', '65', '2', '72', '8', '66', '17', '78', '20', '30', '33', '37', '1', '26', '70', '18', '65', '45', '59', '73', '72', '12', '9', '73', '10', '18', '43', '55', '21', '15', '69', '66', '70', '47', '65', '8', '70', '51', '68', '26', '33', '65', '34', '45', '50', '5', '71', '41', '13', '11', '7', '20', '66', '6', '65', '72', '40', '36', '49', '63', '76', '34', '72', '40', '8', '34', '57', '67', '60', '28', '2', '34', '60', '16', '36', '65', '46', '70', '45', '32', '79', '19', '64', '20', '45', '43', '64', '53', '3', '3', '18', '29', '45', '6', '74', '13', '18', '36', '12', '42', '6', '33', '20', '67', '71', '73', '31', '49', '45', '38', '69', '43', '26', '17', '27', '75', '3', '42', '57', '31', '51', '29', '33', '9', '19', '57', '9', '52', '4', '22', '60', '60', '5', '34', '63', '55', '25', '53', '18', '65', '52', '15', '28', '46', '38', '6', '41', '44', '6', '8', '51', '49', '6', '22', '36', '65', '22', '35', '10', '63', '72', '1', '53', '37', '2', '24', '55', '76', '69', '43', '34', '54', '71', '52', '53', '16', '7', '30', '55', '79', '43', '71', '64', '38', '13', '3', '69', '67', '41', '45', '9', '3', '18', '12', '21', '69', '39', '24', '53', '66', '47', '71', '36', '65', '44', '40', '67', '37', '62', '34', '1', '55', '23', '31', '41', '58', '52', '77', '48', '32', '40', '71', '4', '24', '56', '73', '45', '33', '27', '15', '41', '13', '65', '4', '2', '59', '29', '60', '36', '46', '5', '44', '46', '49', '7', '73', '24', '22', '65', '46', '37', '14', '58', '12', '39', '48', '59', '33', '12', '48', '53', '39', '14', '34', '35', '59', '51', '28', '68', '15', '32', '69', '58', '55', '68', '36', '12', '58', '46', '73', '10', '23', '41', '39', '57', '6', '52', '73', '43', '46', '68', '61', '56', '12', '19', '4', '69', '32', '75', '4', '10', '17', '50', '46', '35', '33', '8', '47', '51', '44', '40', '10', '28', '19', '5', '30', '0', '79', '46', '45', '16', '3', '30', '65', '27', '2', '73', '68', '45', '18', '67', '58', '21', '62', '14', '57', '55', '77', '74', '58', '61', '18', '39', '48', '4', '44', '14', '10', '12', '24', '33', '30', '33', '63', '8', '2', '12', '6', '7', '40', '41', '9', '10', '51', '51', '32', '57', '35', '59', '71', '32', '57', '17', '17', '21', '33', '47', '25', '29', '50', '52', '51', '47', '10', '51', '69', '27', '37', '63', '47', '68', '77', '14', '27', '29', '22', '45', '43', '59', '64', '18', '22', '41', '17', '64', '57', '71', '19', '22', '31', '58', '78', '51', '38', '74', '8', '17', '26', '68', '36', '39', '1', '16', '32', '17', '25', '24', '24', '52', '32', '39', '50', '7', '26', '10', '15', '52', '13', '70', '69', '58', '32', '31', '76', '69', '65', '33', '65', '19', '40', '66', '68', '76', '78', '29', '77', '79', '38', '36', '51', '65', '64', '14', '60', '12', '59', '44', '25', '10', '65', '9', '64', '38', '20', '56', '68', '34', '23', '39', '14', '25', '3', '55', '5', '61', '79', '5', '63', '67', '36', '47', '45', '18', '71', '25', '35', '12', '43', '48', '52', '52', '76', '11', '27', '4', '32', '7', '70', '13', '69', '58', '42', '62', '6', '72', '75', '73', '11', '35', '35', '75', '65', '59', '38', '53', '79', '13', '24', '18', '13', '42', '61', '47', '64', '35', '67', '14', '63', '37', '74', '42', '75', '66', '47', '67', '59', '75', '58', '29', '58', '53', '71', '54', '8', '7', '44', '43', '26', '52', '52', '26', '4', '59', '15', '12', '10', '79', '13', '44', '12', '18', '24', '3', '71', '50', '52', '27', '1', '34', '12', '29', '5', '30', '58', '11', '21', '55', '53', '7', '1', '56', '35', '1', '61', '4', '69', '53', '1', '35', '26', '27', '27', '42', '70', '54', '59', '77', '62', '55', '44', '43', '38', '9', '8', '39', '33', '30', '72', '66', '36', '50', '15', '28', '70', '2', '0', '7', '79', '64', '47', '48', '68', '8', '76', '8', '72', '73', '69', '29', '3', '53', '0', '49', '5', '63', '35', '51', '17', '42', '13', '68', '77', '38', '10', '57', '16', '59', '47', '43', '67', '44', '5', '2', '41', '24', '21', '33', '39', '64', '68', '49', '69', '52', '39', '26', '6', '41', '8', '30', '58', '47', '77', '55', '33', '49', '41', '17', '27', '10', '2', '73', '13', '48', '61', '16', '16', '19', '12', '15', '7', '20', '12', '51', '62', '75', '75', '31', '6', '61', '57', '70', '75', '23', '38', '48', '37', '20', '24', '9', '75', '53', '17', '49', '27', '39', '7', '6', '64', '77', '68', '21', '11', '77', '36', '34', '58', '53', '23', '32', '73', '21', '16', '41', '57', '72', '42', '29', '33', '53', '48', '39', '49', '31', '17', '76', '59', '74', '49', '8', '23', '66', '26', '47', '74', '59', '22', '33', '36', '53', '50', '38', '55', '47', '47', '52', '12', '41', '25', '33', '43', '7', '68', '58', '35', '54', '50', '73', '41', '36', '50', '62', '24', '40', '25', '4', '66', '1', '45', '6', '48', '54', '34', '7', '59', '76', '20', '21', '38', '32', '40', '34', '17', '46', '18', '34', '36', '74', '40', '50', '75', '62', '65', '49', '18', '65', '56', '22', '55', '30', '75', '21', '71', '25', '41', '55', '2', '47', '57', '65', '10', '64', '73', '44', '4', '20', '74', '34', '8', '12', '16', '46', '59', '17', '16', '4', '12', '46', '50', '46', '43', '45', '10', '28', '11', '59', '51', '77', '56', '45', '73', '39', '3', '11', '8', '2', '39', '12', '31', '67', '11', '27', '44', '71', '44', '75', '4', '75', '40', '79', '75', '65', '34', '5', '75', '23', '72', '58', '14', '28', '4', '46', '1', '59', '8', '10', '34', '63', '43', '9', '16', '67', '41', '11', '51', '13', '77', '24', '70', '67', '77', '43', '67', '72', '13', '53', '23', '68', '57', '53', '79', '69', '43', '74', '54', '75', '10', '12', '37', '44', '56', '21', '55', '2', '65', '40', '4', '24', '79', '42', '38', '1', '68', '40', '54', '21', '34', '22', '60', '58', '31', '38', '8', '75', '64', '30', '23', '37', '3', '63', '53', '5', '2', '67', '36', '7', '66', '45', '3', '65', '35', '16', '4', '49', '67', '8', '30', '22', '48', '9', '22', '23', '54', '14', '51', '56', '5', '27', '54', '51', '32', '74', '59', '16', '74', '38', '2', '2', '77', '61', '40', '63', '73', '75', '76', '32', '67', '76', '43', '55', '65', '55', '54', '1', '30', '57', '47', '2', '2', '72', '29', '25', '45', '67', '0', '54', '44', '27', '19', '68', '73', '26', '28', '51', '18', '35', '73', '20', '34', '8', '32', '57', '30', '57', '8', '21', '41', '36', '61', '56', '34', '17', '44', '70', '64', '12', '39', '17', '69', '23', '56', '49', '19', '18', '23', '65', '3', '39', '8', '59', '67', '68', '42', '67', '39', '31', '49', '63', '49', '32', '9', '8', '9', '53', '72', '3', '58', '56', '27', '71', '46', '71', '75', '30', '4', '20', '53', '21', '20', '37', '32', '41', '64', '75', '34', '51', '57', '35', '68', '44', '78', '54', '58', '59', '25', '20', '32', '41', '37', '77', '78', '37', '1', '79', '49', '21', '75', '56', '77', '40', '44', '42', '55', '34', '7', '5', '13', '41', '20', '3', '34', '26', '35', '49', '22', '44', '23', '25', '9', '11', '60', '70', '14', '68', '57', '41', '61', '61', '24', '71', '53', '46', '68', '38', '51', '43', '9', '31', '33', '17', '73', '71', '12', '63', '61', '13', '16', '76', '52', '69', '13', '48', '58', '67', '79', '63', '76', '78', '78', '69', '53', '76', '46', '22', '35', '58', '25', '31', '53', '71', '0', '22', '59', '23', '35', '47', '38', '42', '24', '70', '48', '77', '74', '69', '28', '4', '78', '71', '15', '34', '76', '40', '1', '37', '30', '48', '53', '79', '37', '48', '78', '47', '61', '78', '6', '33', '17', '65', '18', '71', '25', '27', '2', '9', '22', '54', '48', '77', '46', '3', '31', '63', '19', '44', '55', '38', '10', '58', '3', '6', '64', '77', '49', '68', '45', '25', '29', '41', '9', '5', '53', '48', '9', '48', '5', '58', '78', '70', '74', '73', '16', '42', '51', '66', '66', '21', '31', '69', '19', '8', '69', '18', '65', '62', '21', '30', '73', '43', '76', '2', '10', '66', '45', '28', '75', '63', '34', '39', '9', '67', '56', '46', '67', '41', '20', '27', '5', '4', '51', '3', '17', '48', '33', '32', '15', '71', '76', '77', '69', '11', '35', '60', '42', '43', '66', '44', '26', '78', '69', '9', '36', '66', '25', '73', '38', '73', '43', '76', '39', '37', '45', '43', '77', '18', '8', '62', '48', '3', '13', '61', '3', '62', '59', '74', '68', '22', '27', '45', '78', '48', '77', '36', '79', '62', '52', '24', '62', '56', '39', '51', '62', '9', '0', '40', '49', '21', '64', '30', '57', '45', '6', '52', '77', '38', '28', '35', '49', '14', '68', '36', '74', '52', '53', '36', '34', '12', '69', '19', '75', '41', '55', '39', '70', '36', '49', '27', '42', '51', '56', '5', '28', '19', '11', '7', '0', '22', '42', '9', '71', '18', '21', '6', '17', '18', '43', '61', '71', '65', '20', '70', '46', '7', '39', '26', '76', '22', '55', '67', '26', '47', '30', '65', '60', '25', '51', '13', '26', '55', '9', '33', '76', '8', '60', '40', '41', '11', '66', '28', '4', '37', '6', '28', '51', '10', '9', '58', '42', '20', '35', '76', '20', '14', '45', '25', '33', '49', '63', '13', '69', '15', '57', '54', '24', '16', '36', '38', '57', '68', '57', '22', '77', '61', '5', '62', '61', '76', '44', '64', '45', '50', '73', '5', '60', '79', '39', '20']
        dict = ['0','1','10','11','12','13','14','15','16','17','18','19','2','20','21','22','23','24','25','26','27','28','29','3','30','31','32','33','34','35','36','37','38','39','4','40','41','42','43','44','45','46','47','48','49','5','50','51','52','53','54','55','56','57','58','59','6','60','61','62','63','64','65','66','67','68','69','7','70','71','72','73','74','75','76','77','78','79','8','9']
        file = open("./96TESTA751.txt","a")
        for idx, (pro, cla) in enumerate(zip(probs, classes)):
            if txt[int(img_path_list[idx].split("/")[5].split(".")[0])] == dict[cla]:
                LEN = LEN + 1
            file.write(img_path_list[idx].split("/")[5]+" "+ dict[cla] +"\n")    
            print(img_path_list[idx].split("/")[5]+" "+ dict[cla] +"\n",end="")    
            # print("image: {}   class: {}  prob: {:.3}".format(img_path_list[idx],dict[cla],pro.numpy()))
        # print(LEN) 
        file.close()
print(LEN)        
  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值