1 Star 0 Fork 43

eddylapis/beauty

forked from 夜半饿得慌/beauty 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
predict_shap.py 66.45 KB
一键复制 编辑 原始数据 按行查看 历史
夜半饿得慌 提交于 2019-10-09 11:08 . fix explain bugs.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802
# %% coding=utf-8
import sys
import cv2
import shap
import dlib
import dill
import warnings
import numpy as np
import pandas as pd
from sklearn.externals import joblib
from skimage.feature import local_binary_pattern
from gen_report import gen_report
from shap.common import convert_to_link, Instance, Model, Data, DenseData, Link
"""
预测解释 shap
"""
#%%
predictor_path = "model/shape_predictor_68_face_landmarks.dat"
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(predictor_path)
model = joblib.load('model/beauty_1.pkl')
with open('model/explainer_1.pkl', 'rb') as f:
explainer = dill.load(f)
df_input = pd.read_csv('/data/face/df_input.csv', dtype=np.float64)
select_cols = ['Image', 'label', '0_10_x', '0_10_y', '0_11_x', '0_11_y', '0_12_x', '0_12_y', '0_13_x', '0_13_y',
'0_14_x', '0_14_y', '0_15_x', '0_15_y', '0_16_x', '0_16_y', '0_17_x', '0_17_y', '0_18_x', '0_18_y',
'0_19_x', '0_19_y', '0_1_x', '0_1_y', '0_20_x', '0_20_y', '0_21_x', '0_21_y', '0_22_x', '0_22_y',
'0_23_x', '0_23_y', '0_24_x', '0_24_y', '0_25_x', '0_25_y', '0_26_x', '0_26_y', '0_27_x', '0_27_y',
'0_28_x', '0_28_y', '0_29_x', '0_29_y', '0_2_x', '0_2_y', '0_30_x', '0_30_y', '0_31_x', '0_31_y',
'0_32_x', '0_32_y', '0_33_x', '0_33_y', '0_34_x', '0_34_y', '0_35_x', '0_35_y', '0_36_x', '0_36_y',
'0_37_x', '0_37_y', '0_38_x', '0_38_y', '0_39_x', '0_39_y', '0_3_x', '0_3_y', '0_40_x', '0_40_y',
'0_41_x', '0_41_y', '0_42_x', '0_42_y', '0_43_x', '0_43_y', '0_44_x', '0_44_y', '0_45_x', '0_45_y',
'0_46_x', '0_46_y', '0_47_x', '0_47_y', '0_48_x', '0_48_y', '0_49_x', '0_49_y', '0_4_x', '0_4_y',
'0_50_x', '0_50_y', '0_51_x', '0_51_y', '0_52_x', '0_52_y', '0_53_x', '0_53_y', '0_54_x', '0_54_y',
'0_55_x', '0_55_y', '0_56_x', '0_56_y', '0_57_x', '0_57_y', '0_58_x', '0_58_y', '0_59_x', '0_59_y',
'0_5_x', '0_5_y', '0_60_x', '0_60_y', '0_61_x', '0_61_y', '0_62_x', '0_62_y', '0_63_x', '0_63_y',
'0_64_x', '0_64_y', '0_65_x', '0_65_y', '0_66_x', '0_66_y', '0_67_x', '0_67_y', '0_6_x', '0_6_y',
'0_7_x', '0_7_y', '0_8_x', '0_8_y', '0_9_x', '0_9_y', '10_11_x', '10_11_y', '10_12_x', '10_12_y',
'10_13_x', '10_13_y', '10_14_x', '10_14_y', '10_15_x', '10_15_y', '10_16_x', '10_16_y', '10_17_x',
'10_17_y', '10_18_x', '10_18_y', '10_19_x', '10_19_y', '10_20_x', '10_20_y', '10_21_x', '10_21_y',
'10_22_x', '10_22_y', '10_23_x', '10_23_y', '10_24_x', '10_24_y', '10_25_x', '10_25_y', '10_26_x',
'10_26_y', '10_27_x', '10_27_y', '10_28_x', '10_28_y', '10_29_x', '10_29_y', '10_30_x', '10_30_y',
'10_31_x', '10_31_y', '10_32_x', '10_32_y', '10_33_x', '10_33_y', '10_34_x', '10_34_y', '10_35_x',
'10_35_y', '10_36_x', '10_36_y', '10_37_x', '10_37_y', '10_38_x', '10_38_y', '10_39_x', '10_39_y',
'10_40_x', '10_40_y', '10_41_x', '10_41_y', '10_42_x', '10_42_y', '10_43_x', '10_43_y', '10_44_x',
'10_44_y', '10_45_x', '10_45_y', '10_46_x', '10_46_y', '10_47_x', '10_47_y', '10_48_x', '10_48_y',
'10_49_x', '10_49_y', '10_50_x', '10_50_y', '10_51_x', '10_51_y', '10_52_x', '10_52_y', '10_53_x',
'10_53_y', '10_54_x', '10_54_y', '10_55_x', '10_55_y', '10_56_x', '10_56_y', '10_57_x', '10_57_y',
'10_58_x', '10_58_y', '10_59_x', '10_59_y', '10_60_x', '10_60_y', '10_61_x', '10_61_y', '10_62_x',
'10_62_y', '10_63_x', '10_63_y', '10_64_x', '10_64_y', '10_65_x', '10_65_y', '10_66_x', '10_66_y',
'10_67_x', '10_67_y', '11_12_x', '11_12_y', '11_13_x', '11_13_y', '11_14_x', '11_14_y', '11_15_x',
'11_15_y', '11_16_x', '11_16_y', '11_17_x', '11_17_y', '11_18_x', '11_18_y', '11_19_x', '11_19_y',
'11_20_x', '11_20_y', '11_21_x', '11_21_y', '11_22_x', '11_22_y', '11_23_x', '11_23_y', '11_24_x',
'11_24_y', '11_25_x', '11_25_y', '11_26_x', '11_26_y', '11_27_x', '11_27_y', '11_28_x', '11_28_y',
'11_29_x', '11_29_y', '11_30_x', '11_30_y', '11_31_x', '11_31_y', '11_32_x', '11_32_y', '11_33_x',
'11_33_y', '11_34_x', '11_34_y', '11_35_x', '11_35_y', '11_36_x', '11_36_y', '11_37_x', '11_37_y',
'11_38_x', '11_38_y', '11_39_x', '11_39_y', '11_40_x', '11_40_y', '11_41_x', '11_41_y', '11_42_x',
'11_42_y', '11_43_x', '11_43_y', '11_44_x', '11_44_y', '11_45_x', '11_45_y', '11_46_x', '11_46_y',
'11_47_x', '11_47_y', '11_48_x', '11_48_y', '11_49_x', '11_49_y', '11_50_x', '11_50_y', '11_51_x',
'11_51_y', '11_52_x', '11_52_y', '11_53_x', '11_53_y', '11_54_x', '11_54_y', '11_55_x', '11_55_y',
'11_56_x', '11_56_y', '11_57_x', '11_57_y', '11_58_x', '11_58_y', '11_59_x', '11_59_y', '11_60_x',
'11_60_y', '11_61_x', '11_61_y', '11_62_x', '11_62_y', '11_63_x', '11_63_y', '11_64_x', '11_64_y',
'11_65_x', '11_65_y', '11_66_x', '11_66_y', '11_67_x', '11_67_y', '12_13_x', '12_13_y', '12_14_x',
'12_14_y', '12_15_x', '12_15_y', '12_16_x', '12_16_y', '12_17_x', '12_17_y', '12_18_x', '12_18_y',
'12_19_x', '12_19_y', '12_20_x', '12_20_y', '12_21_x', '12_21_y', '12_22_x', '12_22_y', '12_23_x',
'12_23_y', '12_24_x', '12_24_y', '12_25_x', '12_25_y', '12_26_x', '12_26_y', '12_27_x', '12_27_y',
'12_28_x', '12_28_y', '12_29_x', '12_29_y', '12_30_x', '12_30_y', '12_31_x', '12_31_y', '12_32_x',
'12_32_y', '12_33_x', '12_33_y', '12_34_x', '12_34_y', '12_35_x', '12_35_y', '12_36_x', '12_36_y',
'12_37_x', '12_37_y', '12_38_x', '12_38_y', '12_39_x', '12_39_y', '12_40_x', '12_40_y', '12_41_x',
'12_41_y', '12_42_x', '12_42_y', '12_43_x', '12_43_y', '12_44_x', '12_44_y', '12_45_x', '12_45_y',
'12_46_x', '12_46_y', '12_47_x', '12_47_y', '12_48_x', '12_48_y', '12_49_x', '12_49_y', '12_50_x',
'12_50_y', '12_51_x', '12_51_y', '12_52_x', '12_52_y', '12_53_x', '12_53_y', '12_54_x', '12_54_y',
'12_55_x', '12_55_y', '12_56_x', '12_56_y', '12_57_x', '12_57_y', '12_58_x', '12_58_y', '12_59_x',
'12_59_y', '12_60_x', '12_60_y', '12_61_x', '12_61_y', '12_62_x', '12_62_y', '12_63_x', '12_63_y',
'12_64_x', '12_64_y', '12_65_x', '12_65_y', '12_66_x', '12_66_y', '12_67_x', '12_67_y', '13_14_x',
'13_14_y', '13_15_x', '13_15_y', '13_16_x', '13_16_y', '13_17_x', '13_17_y', '13_18_x', '13_18_y',
'13_19_x', '13_19_y', '13_20_x', '13_20_y', '13_21_x', '13_21_y', '13_22_x', '13_22_y', '13_23_x',
'13_23_y', '13_24_x', '13_24_y', '13_25_x', '13_25_y', '13_26_x', '13_26_y', '13_27_x', '13_27_y',
'13_28_x', '13_28_y', '13_29_x', '13_29_y', '13_30_x', '13_30_y', '13_31_x', '13_31_y', '13_32_x',
'13_32_y', '13_33_x', '13_33_y', '13_34_x', '13_34_y', '13_35_x', '13_35_y', '13_36_x', '13_36_y',
'13_37_x', '13_37_y', '13_38_x', '13_38_y', '13_39_x', '13_39_y', '13_40_x', '13_40_y', '13_41_x',
'13_41_y', '13_42_x', '13_42_y', '13_43_x', '13_43_y', '13_44_x', '13_44_y', '13_45_x', '13_45_y',
'13_46_x', '13_46_y', '13_47_x', '13_47_y', '13_48_x', '13_48_y', '13_49_x', '13_49_y', '13_50_x',
'13_50_y', '13_51_x', '13_51_y', '13_52_x', '13_52_y', '13_53_x', '13_53_y', '13_54_x', '13_54_y',
'13_55_x', '13_55_y', '13_56_x', '13_56_y', '13_57_x', '13_57_y', '13_58_x', '13_58_y', '13_59_x',
'13_59_y', '13_60_x', '13_60_y', '13_61_x', '13_61_y', '13_62_x', '13_62_y', '13_63_x', '13_63_y',
'13_64_x', '13_64_y', '13_65_x', '13_65_y', '13_66_x', '13_66_y', '13_67_x', '13_67_y', '14_15_x',
'14_15_y', '14_16_x', '14_16_y', '14_17_x', '14_17_y', '14_18_x', '14_18_y', '14_19_x', '14_19_y',
'14_20_x', '14_20_y', '14_21_x', '14_21_y', '14_22_x', '14_22_y', '14_23_x', '14_23_y', '14_24_x',
'14_24_y', '14_25_x', '14_25_y', '14_26_x', '14_26_y', '14_27_x', '14_27_y', '14_28_x', '14_28_y',
'14_29_x', '14_29_y', '14_30_x', '14_30_y', '14_31_x', '14_31_y', '14_32_x', '14_32_y', '14_33_x',
'14_33_y', '14_34_x', '14_34_y', '14_35_x', '14_35_y', '14_36_x', '14_36_y', '14_37_x', '14_37_y',
'14_38_x', '14_38_y', '14_39_x', '14_39_y', '14_40_x', '14_40_y', '14_41_x', '14_41_y', '14_42_x',
'14_42_y', '14_43_x', '14_43_y', '14_44_x', '14_44_y', '14_45_x', '14_45_y', '14_46_x', '14_46_y',
'14_47_x', '14_47_y', '14_48_x', '14_48_y', '14_49_x', '14_49_y', '14_50_x', '14_50_y', '14_51_x',
'14_51_y', '14_52_x', '14_52_y', '14_53_x', '14_53_y', '14_54_x', '14_54_y', '14_55_x', '14_55_y',
'14_56_x', '14_56_y', '14_57_x', '14_57_y', '14_58_x', '14_58_y', '14_59_x', '14_59_y', '14_60_x',
'14_60_y', '14_61_x', '14_61_y', '14_62_x', '14_62_y', '14_63_x', '14_63_y', '14_64_x', '14_64_y',
'14_65_x', '14_65_y', '14_66_x', '14_66_y', '14_67_x', '14_67_y', '15_16_x', '15_16_y', '15_17_x',
'15_17_y', '15_18_x', '15_18_y', '15_19_x', '15_19_y', '15_20_x', '15_20_y', '15_21_x', '15_21_y',
'15_22_x', '15_22_y', '15_23_x', '15_23_y', '15_24_x', '15_24_y', '15_25_x', '15_25_y', '15_26_x',
'15_26_y', '15_27_x', '15_27_y', '15_28_x', '15_28_y', '15_29_x', '15_29_y', '15_30_x', '15_30_y',
'15_31_x', '15_31_y', '15_32_x', '15_32_y', '15_33_x', '15_33_y', '15_34_x', '15_34_y', '15_35_x',
'15_35_y', '15_36_x', '15_36_y', '15_37_x', '15_37_y', '15_38_x', '15_38_y', '15_39_x', '15_39_y',
'15_40_x', '15_40_y', '15_41_x', '15_41_y', '15_42_x', '15_42_y', '15_43_x', '15_43_y', '15_44_x',
'15_44_y', '15_45_x', '15_45_y', '15_46_x', '15_46_y', '15_47_x', '15_47_y', '15_48_x', '15_48_y',
'15_49_x', '15_49_y', '15_50_x', '15_50_y', '15_51_x', '15_51_y', '15_52_x', '15_52_y', '15_53_x',
'15_53_y', '15_54_x', '15_54_y', '15_55_x', '15_55_y', '15_56_x', '15_56_y', '15_57_x', '15_57_y',
'15_58_x', '15_58_y', '15_59_x', '15_59_y', '15_60_x', '15_60_y', '15_61_x', '15_61_y', '15_62_x',
'15_62_y', '15_63_x', '15_63_y', '15_64_x', '15_64_y', '15_65_x', '15_65_y', '15_66_x', '15_66_y',
'15_67_x', '15_67_y', '16_17_x', '16_17_y', '16_18_x', '16_18_y', '16_19_x', '16_19_y', '16_20_x',
'16_20_y', '16_21_x', '16_21_y', '16_22_x', '16_22_y', '16_23_x', '16_23_y', '16_24_x', '16_24_y',
'16_25_x', '16_25_y', '16_26_x', '16_26_y', '16_27_x', '16_27_y', '16_28_x', '16_28_y', '16_29_x',
'16_29_y', '16_30_x', '16_30_y', '16_31_x', '16_31_y', '16_32_x', '16_32_y', '16_33_x', '16_33_y',
'16_34_x', '16_34_y', '16_35_x', '16_35_y', '16_36_x', '16_36_y', '16_37_x', '16_37_y', '16_38_x',
'16_38_y', '16_39_x', '16_39_y', '16_40_x', '16_40_y', '16_41_x', '16_41_y', '16_42_x', '16_42_y',
'16_43_x', '16_43_y', '16_44_x', '16_44_y', '16_45_x', '16_45_y', '16_46_x', '16_46_y', '16_47_x',
'16_47_y', '16_48_x', '16_48_y', '16_49_x', '16_49_y', '16_50_x', '16_50_y', '16_51_x', '16_51_y',
'16_52_x', '16_52_y', '16_53_x', '16_53_y', '16_54_x', '16_54_y', '16_55_x', '16_55_y', '16_56_x',
'16_56_y', '16_57_x', '16_57_y', '16_58_x', '16_58_y', '16_59_x', '16_59_y', '16_60_x', '16_60_y',
'16_61_x', '16_61_y', '16_62_x', '16_62_y', '16_63_x', '16_63_y', '16_64_x', '16_64_y', '16_65_x',
'16_65_y', '16_66_x', '16_66_y', '16_67_x', '16_67_y', '17_18_x', '17_18_y', '17_19_x', '17_19_y',
'17_20_x', '17_20_y', '17_21_x', '17_21_y', '17_22_x', '17_22_y', '17_23_x', '17_23_y', '17_24_x',
'17_24_y', '17_25_x', '17_25_y', '17_26_x', '17_26_y', '17_27_x', '17_27_y', '17_28_x', '17_28_y',
'17_29_x', '17_29_y', '17_30_x', '17_30_y', '17_31_x', '17_31_y', '17_32_x', '17_32_y', '17_33_x',
'17_33_y', '17_34_x', '17_34_y', '17_35_x', '17_35_y', '17_36_x', '17_36_y', '17_37_x', '17_37_y',
'17_38_x', '17_38_y', '17_39_x', '17_39_y', '17_40_x', '17_40_y', '17_41_x', '17_41_y', '17_42_x',
'17_42_y', '17_43_x', '17_43_y', '17_44_x', '17_44_y', '17_45_x', '17_45_y', '17_46_x', '17_46_y',
'17_47_x', '17_47_y', '17_48_x', '17_48_y', '17_49_x', '17_49_y', '17_50_x', '17_50_y', '17_51_x',
'17_51_y', '17_52_x', '17_52_y', '17_53_x', '17_53_y', '17_54_x', '17_54_y', '17_55_x', '17_55_y',
'17_56_x', '17_56_y', '17_57_x', '17_57_y', '17_58_x', '17_58_y', '17_59_x', '17_59_y', '17_60_x',
'17_60_y', '17_61_x', '17_61_y', '17_62_x', '17_62_y', '17_63_x', '17_63_y', '17_64_x', '17_64_y',
'17_65_x', '17_65_y', '17_66_x', '17_66_y', '17_67_x', '17_67_y', '18_19_x', '18_19_y', '18_20_x',
'18_20_y', '18_21_x', '18_21_y', '18_22_x', '18_22_y', '18_23_x', '18_23_y', '18_24_x', '18_24_y',
'18_25_x', '18_25_y', '18_26_x', '18_26_y', '18_27_x', '18_27_y', '18_28_x', '18_28_y', '18_29_x',
'18_29_y', '18_30_x', '18_30_y', '18_31_x', '18_31_y', '18_32_x', '18_32_y', '18_33_x', '18_33_y',
'18_34_x', '18_34_y', '18_35_x', '18_35_y', '18_36_x', '18_36_y', '18_37_x', '18_37_y', '18_38_x',
'18_38_y', '18_39_x', '18_39_y', '18_40_x', '18_40_y', '18_41_x', '18_41_y', '18_42_x', '18_42_y',
'18_43_x', '18_43_y', '18_44_x', '18_44_y', '18_45_x', '18_45_y', '18_46_x', '18_46_y', '18_47_x',
'18_47_y', '18_48_x', '18_48_y', '18_49_x', '18_49_y', '18_50_x', '18_50_y', '18_51_x', '18_51_y',
'18_52_x', '18_52_y', '18_53_x', '18_53_y', '18_54_x', '18_54_y', '18_55_x', '18_55_y', '18_56_x',
'18_56_y', '18_57_x', '18_57_y', '18_58_x', '18_58_y', '18_59_x', '18_59_y', '18_60_x', '18_60_y',
'18_61_x', '18_61_y', '18_62_x', '18_62_y', '18_63_x', '18_63_y', '18_64_x', '18_64_y', '18_65_x',
'18_65_y', '18_66_x', '18_66_y', '18_67_x', '18_67_y', '19_20_x', '19_20_y', '19_21_x', '19_21_y',
'19_22_x', '19_22_y', '19_23_x', '19_23_y', '19_24_x', '19_24_y', '19_25_x', '19_25_y', '19_26_x',
'19_26_y', '19_27_x', '19_27_y', '19_28_x', '19_28_y', '19_29_x', '19_29_y', '19_30_x', '19_30_y',
'19_31_x', '19_31_y', '19_32_x', '19_32_y', '19_33_x', '19_33_y', '19_34_x', '19_34_y', '19_35_x',
'19_35_y', '19_36_x', '19_36_y', '19_37_x', '19_37_y', '19_38_x', '19_38_y', '19_39_x', '19_39_y',
'19_40_x', '19_40_y', '19_41_x', '19_41_y', '19_42_x', '19_42_y', '19_43_x', '19_43_y', '19_44_x',
'19_44_y', '19_45_x', '19_45_y', '19_46_x', '19_46_y', '19_47_x', '19_47_y', '19_48_x', '19_48_y',
'19_49_x', '19_49_y', '19_50_x', '19_50_y', '19_51_x', '19_51_y', '19_52_x', '19_52_y', '19_53_x',
'19_53_y', '19_54_x', '19_54_y', '19_55_x', '19_55_y', '19_56_x', '19_56_y', '19_57_x', '19_57_y',
'19_58_x', '19_58_y', '19_59_x', '19_59_y', '19_60_x', '19_60_y', '19_61_x', '19_61_y', '19_62_x',
'19_62_y', '19_63_x', '19_63_y', '19_64_x', '19_64_y', '19_65_x', '19_65_y', '19_66_x', '19_66_y',
'19_67_x', '19_67_y', '1_10_x', '1_10_y', '1_11_x', '1_11_y', '1_12_x', '1_12_y', '1_13_x', '1_13_y',
'1_14_x', '1_14_y', '1_15_x', '1_15_y', '1_16_x', '1_16_y', '1_17_x', '1_17_y', '1_18_x', '1_18_y',
'1_19_x', '1_19_y', '1_20_x', '1_20_y', '1_21_x', '1_21_y', '1_22_x', '1_22_y', '1_23_x', '1_23_y',
'1_24_x', '1_24_y', '1_25_x', '1_25_y', '1_26_x', '1_26_y', '1_27_x', '1_27_y', '1_28_x', '1_28_y',
'1_29_x', '1_29_y', '1_2_x', '1_2_y', '1_30_x', '1_30_y', '1_31_x', '1_31_y', '1_32_x', '1_32_y',
'1_33_x', '1_33_y', '1_34_x', '1_34_y', '1_35_x', '1_35_y', '1_36_x', '1_36_y', '1_37_x', '1_37_y',
'1_38_x', '1_38_y', '1_39_x', '1_39_y', '1_3_x', '1_3_y', '1_40_x', '1_40_y', '1_41_x', '1_41_y',
'1_42_x', '1_42_y', '1_43_x', '1_43_y', '1_44_x', '1_44_y', '1_45_x', '1_45_y', '1_46_x', '1_46_y',
'1_47_x', '1_47_y', '1_48_x', '1_48_y', '1_49_x', '1_49_y', '1_4_x', '1_4_y', '1_50_x', '1_50_y',
'1_51_x', '1_51_y', '1_52_x', '1_52_y', '1_53_x', '1_53_y', '1_54_x', '1_54_y', '1_55_x', '1_55_y',
'1_56_x', '1_56_y', '1_57_x', '1_57_y', '1_58_x', '1_58_y', '1_59_x', '1_59_y', '1_5_x', '1_5_y',
'1_60_x', '1_60_y', '1_61_x', '1_61_y', '1_62_x', '1_62_y', '1_63_x', '1_63_y', '1_64_x', '1_64_y',
'1_65_x', '1_65_y', '1_66_x', '1_66_y', '1_67_x', '1_67_y', '1_6_x', '1_6_y', '1_7_x', '1_7_y', '1_8_x',
'1_8_y', '1_9_x', '1_9_y', '20_21_x', '20_21_y', '20_22_x', '20_22_y', '20_23_x', '20_23_y', '20_24_x',
'20_24_y', '20_25_x', '20_25_y', '20_26_x', '20_26_y', '20_27_x', '20_27_y', '20_28_x', '20_28_y',
'20_29_x', '20_29_y', '20_30_x', '20_30_y', '20_31_x', '20_31_y', '20_32_x', '20_32_y', '20_33_x',
'20_33_y', '20_34_x', '20_34_y', '20_35_x', '20_35_y', '20_36_x', '20_36_y', '20_37_x', '20_37_y',
'20_38_x', '20_38_y', '20_39_x', '20_39_y', '20_40_x', '20_40_y', '20_41_x', '20_41_y', '20_42_x',
'20_42_y', '20_43_x', '20_43_y', '20_44_x', '20_44_y', '20_45_x', '20_45_y', '20_46_x', '20_46_y',
'20_47_x', '20_47_y', '20_48_x', '20_48_y', '20_49_x', '20_49_y', '20_50_x', '20_50_y', '20_51_x',
'20_51_y', '20_52_x', '20_52_y', '20_53_x', '20_53_y', '20_54_x', '20_54_y', '20_55_x', '20_55_y',
'20_56_x', '20_56_y', '20_57_x', '20_57_y', '20_58_x', '20_58_y', '20_59_x', '20_59_y', '20_60_x',
'20_60_y', '20_61_x', '20_61_y', '20_62_x', '20_62_y', '20_63_x', '20_63_y', '20_64_x', '20_64_y',
'20_65_x', '20_65_y', '20_66_x', '20_66_y', '20_67_x', '20_67_y', '21_22_x', '21_22_y', '21_23_x',
'21_23_y', '21_24_x', '21_24_y', '21_25_x', '21_25_y', '21_26_x', '21_26_y', '21_27_x', '21_27_y',
'21_28_x', '21_28_y', '21_29_x', '21_29_y', '21_30_x', '21_30_y', '21_31_x', '21_31_y', '21_32_x',
'21_32_y', '21_33_x', '21_33_y', '21_34_x', '21_34_y', '21_35_x', '21_35_y', '21_36_x', '21_36_y',
'21_37_x', '21_37_y', '21_38_x', '21_38_y', '21_39_x', '21_39_y', '21_40_x', '21_40_y', '21_41_x',
'21_41_y', '21_42_x', '21_42_y', '21_43_x', '21_43_y', '21_44_x', '21_44_y', '21_45_x', '21_45_y',
'21_46_x', '21_46_y', '21_47_x', '21_47_y', '21_48_x', '21_48_y', '21_49_x', '21_49_y', '21_50_x',
'21_50_y', '21_51_x', '21_51_y', '21_52_x', '21_52_y', '21_53_x', '21_53_y', '21_54_x', '21_54_y',
'21_55_x', '21_55_y', '21_56_x', '21_56_y', '21_57_x', '21_57_y', '21_58_x', '21_58_y', '21_59_x',
'21_59_y', '21_60_x', '21_60_y', '21_61_x', '21_61_y', '21_62_x', '21_62_y', '21_63_x', '21_63_y',
'21_64_x', '21_64_y', '21_65_x', '21_65_y', '21_66_x', '21_66_y', '21_67_x', '21_67_y', '22_23_x',
'22_23_y', '22_24_x', '22_24_y', '22_25_x', '22_25_y', '22_26_x', '22_26_y', '22_27_x', '22_27_y',
'22_28_x', '22_28_y', '22_29_x', '22_29_y', '22_30_x', '22_30_y', '22_31_x', '22_31_y', '22_32_x',
'22_32_y', '22_33_x', '22_33_y', '22_34_x', '22_34_y', '22_35_x', '22_35_y', '22_36_x', '22_36_y',
'22_37_x', '22_37_y', '22_38_x', '22_38_y', '22_39_x', '22_39_y', '22_40_x', '22_40_y', '22_41_x',
'22_41_y', '22_42_x', '22_42_y', '22_43_x', '22_43_y', '22_44_x', '22_44_y', '22_45_x', '22_45_y',
'22_46_x', '22_46_y', '22_47_x', '22_47_y', '22_48_x', '22_48_y', '22_49_x', '22_49_y', '22_50_x',
'22_50_y', '22_51_x', '22_51_y', '22_52_x', '22_52_y', '22_53_x', '22_53_y', '22_54_x', '22_54_y',
'22_55_x', '22_55_y', '22_56_x', '22_56_y', '22_57_x', '22_57_y', '22_58_x', '22_58_y', '22_59_x',
'22_59_y', '22_60_x', '22_60_y', '22_61_x', '22_61_y', '22_62_x', '22_62_y', '22_63_x', '22_63_y',
'22_64_x', '22_64_y', '22_65_x', '22_65_y', '22_66_x', '22_66_y', '22_67_x', '22_67_y', '23_24_x',
'23_24_y', '23_25_x', '23_25_y', '23_26_x', '23_26_y', '23_27_x', '23_27_y', '23_28_x', '23_28_y',
'23_29_x', '23_29_y', '23_30_x', '23_30_y', '23_31_x', '23_31_y', '23_32_x', '23_32_y', '23_33_x',
'23_33_y', '23_34_x', '23_34_y', '23_35_x', '23_35_y', '23_36_x', '23_36_y', '23_37_x', '23_37_y',
'23_38_x', '23_38_y', '23_39_x', '23_39_y', '23_40_x', '23_40_y', '23_41_x', '23_41_y', '23_42_x',
'23_42_y', '23_43_x', '23_43_y', '23_44_x', '23_44_y', '23_45_x', '23_45_y', '23_46_x', '23_46_y',
'23_47_x', '23_47_y', '23_48_x', '23_48_y', '23_49_x', '23_49_y', '23_50_x', '23_50_y', '23_51_x',
'23_51_y', '23_52_x', '23_52_y', '23_53_x', '23_53_y', '23_54_x', '23_54_y', '23_55_x', '23_55_y',
'23_56_x', '23_56_y', '23_57_x', '23_57_y', '23_58_x', '23_58_y', '23_59_x', '23_59_y', '23_60_x',
'23_60_y', '23_61_x', '23_61_y', '23_62_x', '23_62_y', '23_63_x', '23_63_y', '23_64_x', '23_64_y',
'23_65_x', '23_65_y', '23_66_x', '23_66_y', '23_67_x', '23_67_y', '24_25_x', '24_25_y', '24_26_x',
'24_26_y', '24_27_x', '24_27_y', '24_28_x', '24_28_y', '24_29_x', '24_29_y', '24_30_x', '24_30_y',
'24_31_x', '24_31_y', '24_32_x', '24_32_y', '24_33_x', '24_33_y', '24_34_x', '24_34_y', '24_35_x',
'24_35_y', '24_36_x', '24_36_y', '24_37_x', '24_37_y', '24_38_x', '24_38_y', '24_39_x', '24_39_y',
'24_40_x', '24_40_y', '24_41_x', '24_41_y', '24_42_x', '24_42_y', '24_43_x', '24_43_y', '24_44_x',
'24_44_y', '24_45_x', '24_45_y', '24_46_x', '24_46_y', '24_47_x', '24_47_y', '24_48_x', '24_48_y',
'24_49_x', '24_49_y', '24_50_x', '24_50_y', '24_51_x', '24_51_y', '24_52_x', '24_52_y', '24_53_x',
'24_53_y', '24_54_x', '24_54_y', '24_55_x', '24_55_y', '24_56_x', '24_56_y', '24_57_x', '24_57_y',
'24_58_x', '24_58_y', '24_59_x', '24_59_y', '24_60_x', '24_60_y', '24_61_x', '24_61_y', '24_62_x',
'24_62_y', '24_63_x', '24_63_y', '24_64_x', '24_64_y', '24_65_x', '24_65_y', '24_66_x', '24_66_y',
'24_67_x', '24_67_y', '25_26_x', '25_26_y', '25_27_x', '25_27_y', '25_28_x', '25_28_y', '25_29_x',
'25_29_y', '25_30_x', '25_30_y', '25_31_x', '25_31_y', '25_32_x', '25_32_y', '25_33_x', '25_33_y',
'25_34_x', '25_34_y', '25_35_x', '25_35_y', '25_36_x', '25_36_y', '25_37_x', '25_37_y', '25_38_x',
'25_38_y', '25_39_x', '25_39_y', '25_40_x', '25_40_y', '25_41_x', '25_41_y', '25_42_x', '25_42_y',
'25_43_x', '25_43_y', '25_44_x', '25_44_y', '25_45_x', '25_45_y', '25_46_x', '25_46_y', '25_47_x',
'25_47_y', '25_48_x', '25_48_y', '25_49_x', '25_49_y', '25_50_x', '25_50_y', '25_51_x', '25_51_y',
'25_52_x', '25_52_y', '25_53_x', '25_53_y', '25_54_x', '25_54_y', '25_55_x', '25_55_y', '25_56_x',
'25_56_y', '25_57_x', '25_57_y', '25_58_x', '25_58_y', '25_59_x', '25_59_y', '25_60_x', '25_60_y',
'25_61_x', '25_61_y', '25_62_x', '25_62_y', '25_63_x', '25_63_y', '25_64_x', '25_64_y', '25_65_x',
'25_65_y', '25_66_x', '25_66_y', '25_67_x', '25_67_y', '26_27_x', '26_27_y', '26_28_x', '26_28_y',
'26_29_x', '26_29_y', '26_30_x', '26_30_y', '26_31_x', '26_31_y', '26_32_x', '26_32_y', '26_33_x',
'26_33_y', '26_34_x', '26_34_y', '26_35_x', '26_35_y', '26_36_x', '26_36_y', '26_37_x', '26_37_y',
'26_38_x', '26_38_y', '26_39_x', '26_39_y', '26_40_x', '26_40_y', '26_41_x', '26_41_y', '26_42_x',
'26_42_y', '26_43_x', '26_43_y', '26_44_x', '26_44_y', '26_45_x', '26_45_y', '26_46_x', '26_46_y',
'26_47_x', '26_47_y', '26_48_x', '26_48_y', '26_49_x', '26_49_y', '26_50_x', '26_50_y', '26_51_x',
'26_51_y', '26_52_x', '26_52_y', '26_53_x', '26_53_y', '26_54_x', '26_54_y', '26_55_x', '26_55_y',
'26_56_x', '26_56_y', '26_57_x', '26_57_y', '26_58_x', '26_58_y', '26_59_x', '26_59_y', '26_60_x',
'26_60_y', '26_61_x', '26_61_y', '26_62_x', '26_62_y', '26_63_x', '26_63_y', '26_64_x', '26_64_y',
'26_65_x', '26_65_y', '26_66_x', '26_66_y', '26_67_x', '26_67_y', '27_28_x', '27_28_y', '27_29_x',
'27_29_y', '27_30_x', '27_30_y', '27_31_x', '27_31_y', '27_32_x', '27_32_y', '27_33_x', '27_33_y',
'27_34_x', '27_34_y', '27_35_x', '27_35_y', '27_36_x', '27_36_y', '27_37_x', '27_37_y', '27_38_x',
'27_38_y', '27_39_x', '27_39_y', '27_40_x', '27_40_y', '27_41_x', '27_41_y', '27_42_x', '27_42_y',
'27_43_x', '27_43_y', '27_44_x', '27_44_y', '27_45_x', '27_45_y', '27_46_x', '27_46_y', '27_47_x',
'27_47_y', '27_48_x', '27_48_y', '27_49_x', '27_49_y', '27_50_x', '27_50_y', '27_51_x', '27_51_y',
'27_52_x', '27_52_y', '27_53_x', '27_53_y', '27_54_x', '27_54_y', '27_55_x', '27_55_y', '27_56_x',
'27_56_y', '27_57_x', '27_57_y', '27_58_x', '27_58_y', '27_59_x', '27_59_y', '27_60_x', '27_60_y',
'27_61_x', '27_61_y', '27_62_x', '27_62_y', '27_63_x', '27_63_y', '27_64_x', '27_64_y', '27_65_x',
'27_65_y', '27_66_x', '27_66_y', '27_67_x', '27_67_y', '28_29_x', '28_29_y', '28_30_x', '28_30_y',
'28_31_x', '28_31_y', '28_32_x', '28_32_y', '28_33_x', '28_33_y', '28_34_x', '28_34_y', '28_35_x',
'28_35_y', '28_36_x', '28_36_y', '28_37_x', '28_37_y', '28_38_x', '28_38_y', '28_39_x', '28_39_y',
'28_40_x', '28_40_y', '28_41_x', '28_41_y', '28_42_x', '28_42_y', '28_43_x', '28_43_y', '28_44_x',
'28_44_y', '28_45_x', '28_45_y', '28_46_x', '28_46_y', '28_47_x', '28_47_y', '28_48_x', '28_48_y',
'28_49_x', '28_49_y', '28_50_x', '28_50_y', '28_51_x', '28_51_y', '28_52_x', '28_52_y', '28_53_x',
'28_53_y', '28_54_x', '28_54_y', '28_55_x', '28_55_y', '28_56_x', '28_56_y', '28_57_x', '28_57_y',
'28_58_x', '28_58_y', '28_59_x', '28_59_y', '28_60_x', '28_60_y', '28_61_x', '28_61_y', '28_62_x',
'28_62_y', '28_63_x', '28_63_y', '28_64_x', '28_64_y', '28_65_x', '28_65_y', '28_66_x', '28_66_y',
'28_67_x', '28_67_y', '29_30_x', '29_30_y', '29_31_x', '29_31_y', '29_32_x', '29_32_y', '29_33_x',
'29_33_y', '29_34_x', '29_34_y', '29_35_x', '29_35_y', '29_36_x', '29_36_y', '29_37_x', '29_37_y',
'29_38_x', '29_38_y', '29_39_x', '29_39_y', '29_40_x', '29_40_y', '29_41_x', '29_41_y', '29_42_x',
'29_42_y', '29_43_x', '29_43_y', '29_44_x', '29_44_y', '29_45_x', '29_45_y', '29_46_x', '29_46_y',
'29_47_x', '29_47_y', '29_48_x', '29_48_y', '29_49_x', '29_49_y', '29_50_x', '29_50_y', '29_51_x',
'29_51_y', '29_52_x', '29_52_y', '29_53_x', '29_53_y', '29_54_x', '29_54_y', '29_55_x', '29_55_y',
'29_56_x', '29_56_y', '29_57_x', '29_57_y', '29_58_x', '29_58_y', '29_59_x', '29_59_y', '29_60_x',
'29_60_y', '29_61_x', '29_61_y', '29_62_x', '29_62_y', '29_63_x', '29_63_y', '29_64_x', '29_64_y',
'29_65_x', '29_65_y', '29_66_x', '29_66_y', '29_67_x', '29_67_y', '2_10_x', '2_10_y', '2_11_x', '2_11_y',
'2_12_x', '2_12_y', '2_13_x', '2_13_y', '2_14_x', '2_14_y', '2_15_x', '2_15_y', '2_16_x', '2_16_y',
'2_17_x', '2_17_y', '2_18_x', '2_18_y', '2_19_x', '2_19_y', '2_20_x', '2_20_y', '2_21_x', '2_21_y',
'2_22_x', '2_22_y', '2_23_x', '2_23_y', '2_24_x', '2_24_y', '2_25_x', '2_25_y', '2_26_x', '2_26_y',
'2_27_x', '2_27_y', '2_28_x', '2_28_y', '2_29_x', '2_29_y', '2_30_x', '2_30_y', '2_31_x', '2_31_y',
'2_32_x', '2_32_y', '2_33_x', '2_33_y', '2_34_x', '2_34_y', '2_35_x', '2_35_y', '2_36_x', '2_36_y',
'2_37_x', '2_37_y', '2_38_x', '2_38_y', '2_39_x', '2_39_y', '2_3_x', '2_3_y', '2_40_x', '2_40_y',
'2_41_x', '2_41_y', '2_42_x', '2_42_y', '2_43_x', '2_43_y', '2_44_x', '2_44_y', '2_45_x', '2_45_y',
'2_46_x', '2_46_y', '2_47_x', '2_47_y', '2_48_x', '2_48_y', '2_49_x', '2_49_y', '2_4_x', '2_4_y',
'2_50_x', '2_50_y', '2_51_x', '2_51_y', '2_52_x', '2_52_y', '2_53_x', '2_53_y', '2_54_x', '2_54_y',
'2_55_x', '2_55_y', '2_56_x', '2_56_y', '2_57_x', '2_57_y', '2_58_x', '2_58_y', '2_59_x', '2_59_y',
'2_5_x', '2_5_y', '2_60_x', '2_60_y', '2_61_x', '2_61_y', '2_62_x', '2_62_y', '2_63_x', '2_63_y',
'2_64_x', '2_64_y', '2_65_x', '2_65_y', '2_66_x', '2_66_y', '2_67_x', '2_67_y', '2_6_x', '2_6_y',
'2_7_x', '2_7_y', '2_8_x', '2_8_y', '2_9_x', '2_9_y', '30_31_x', '30_31_y', '30_32_x', '30_32_y',
'30_33_x', '30_33_y', '30_34_x', '30_34_y', '30_35_x', '30_35_y', '30_36_x', '30_36_y', '30_37_x',
'30_37_y', '30_38_x', '30_38_y', '30_39_x', '30_39_y', '30_40_x', '30_40_y', '30_41_x', '30_41_y',
'30_42_x', '30_42_y', '30_43_x', '30_43_y', '30_44_x', '30_44_y', '30_45_x', '30_45_y', '30_46_x',
'30_46_y', '30_47_x', '30_47_y', '30_48_x', '30_48_y', '30_49_x', '30_49_y', '30_50_x', '30_50_y',
'30_51_x', '30_51_y', '30_52_x', '30_52_y', '30_53_x', '30_53_y', '30_54_x', '30_54_y', '30_55_x',
'30_55_y', '30_56_x', '30_56_y', '30_57_x', '30_57_y', '30_58_x', '30_58_y', '30_59_x', '30_59_y',
'30_60_x', '30_60_y', '30_61_x', '30_61_y', '30_62_x', '30_62_y', '30_63_x', '30_63_y', '30_64_x',
'30_64_y', '30_65_x', '30_65_y', '30_66_x', '30_66_y', '30_67_x', '30_67_y', '31_32_x', '31_32_y',
'31_33_x', '31_33_y', '31_34_x', '31_34_y', '31_35_x', '31_35_y', '31_36_x', '31_36_y', '31_37_x',
'31_37_y', '31_38_x', '31_38_y', '31_39_x', '31_39_y', '31_40_x', '31_40_y', '31_41_x', '31_41_y',
'31_42_x', '31_42_y', '31_43_x', '31_43_y', '31_44_x', '31_44_y', '31_45_x', '31_45_y', '31_46_x',
'31_46_y', '31_47_x', '31_47_y', '31_48_x', '31_48_y', '31_49_x', '31_49_y', '31_50_x', '31_50_y',
'31_51_x', '31_51_y', '31_52_x', '31_52_y', '31_53_x', '31_53_y', '31_54_x', '31_54_y', '31_55_x',
'31_55_y', '31_56_x', '31_56_y', '31_57_x', '31_57_y', '31_58_x', '31_58_y', '31_59_x', '31_59_y',
'31_60_x', '31_60_y', '31_61_x', '31_61_y', '31_62_x', '31_62_y', '31_63_x', '31_63_y', '31_64_x',
'31_64_y', '31_65_x', '31_65_y', '31_66_x', '31_66_y', '31_67_x', '31_67_y', '32_33_x', '32_33_y',
'32_34_x', '32_34_y', '32_35_x', '32_35_y', '32_36_x', '32_36_y', '32_37_x', '32_37_y', '32_38_x',
'32_38_y', '32_39_x', '32_39_y', '32_40_x', '32_40_y', '32_41_x', '32_41_y', '32_42_x', '32_42_y',
'32_43_x', '32_43_y', '32_44_x', '32_44_y', '32_45_x', '32_45_y', '32_46_x', '32_46_y', '32_47_x',
'32_47_y', '32_48_x', '32_48_y', '32_49_x', '32_49_y', '32_50_x', '32_50_y', '32_51_x', '32_51_y',
'32_52_x', '32_52_y', '32_53_x', '32_53_y', '32_54_x', '32_54_y', '32_55_x', '32_55_y', '32_56_x',
'32_56_y', '32_57_x', '32_57_y', '32_58_x', '32_58_y', '32_59_x', '32_59_y', '32_60_x', '32_60_y',
'32_61_x', '32_61_y', '32_62_x', '32_62_y', '32_63_x', '32_63_y', '32_64_x', '32_64_y', '32_65_x',
'32_65_y', '32_66_x', '32_66_y', '32_67_x', '32_67_y', '33_34_x', '33_34_y', '33_35_x', '33_35_y',
'33_36_x', '33_36_y', '33_37_x', '33_37_y', '33_38_x', '33_38_y', '33_39_x', '33_39_y', '33_40_x',
'33_40_y', '33_41_x', '33_41_y', '33_42_x', '33_42_y', '33_43_x', '33_43_y', '33_44_x', '33_44_y',
'33_45_x', '33_45_y', '33_46_x', '33_46_y', '33_47_x', '33_47_y', '33_48_x', '33_48_y', '33_49_x',
'33_49_y', '33_50_x', '33_50_y', '33_51_x', '33_51_y', '33_52_x', '33_52_y', '33_53_x', '33_53_y',
'33_54_x', '33_54_y', '33_55_x', '33_55_y', '33_56_x', '33_56_y', '33_57_x', '33_57_y', '33_58_x',
'33_58_y', '33_59_x', '33_59_y', '33_60_x', '33_60_y', '33_61_x', '33_61_y', '33_62_x', '33_62_y',
'33_63_x', '33_63_y', '33_64_x', '33_64_y', '33_65_x', '33_65_y', '33_66_x', '33_66_y', '33_67_x',
'33_67_y', '34_35_x', '34_35_y', '34_36_x', '34_36_y', '34_37_x', '34_37_y', '34_38_x', '34_38_y',
'34_39_x', '34_39_y', '34_40_x', '34_40_y', '34_41_x', '34_41_y', '34_42_x', '34_42_y', '34_43_x',
'34_43_y', '34_44_x', '34_44_y', '34_45_x', '34_45_y', '34_46_x', '34_46_y', '34_47_x', '34_47_y',
'34_48_x', '34_48_y', '34_49_x', '34_49_y', '34_50_x', '34_50_y', '34_51_x', '34_51_y', '34_52_x',
'34_52_y', '34_53_x', '34_53_y', '34_54_x', '34_54_y', '34_55_x', '34_55_y', '34_56_x', '34_56_y',
'34_57_x', '34_57_y', '34_58_x', '34_58_y', '34_59_x', '34_59_y', '34_60_x', '34_60_y', '34_61_x',
'34_61_y', '34_62_x', '34_62_y', '34_63_x', '34_63_y', '34_64_x', '34_64_y', '34_65_x', '34_65_y',
'34_66_x', '34_66_y', '34_67_x', '34_67_y', '35_36_x', '35_36_y', '35_37_x', '35_37_y', '35_38_x',
'35_38_y', '35_39_x', '35_39_y', '35_40_x', '35_40_y', '35_41_x', '35_41_y', '35_42_x', '35_42_y',
'35_43_x', '35_43_y', '35_44_x', '35_44_y', '35_45_x', '35_45_y', '35_46_x', '35_46_y', '35_47_x',
'35_47_y', '35_48_x', '35_48_y', '35_49_x', '35_49_y', '35_50_x', '35_50_y', '35_51_x', '35_51_y',
'35_52_x', '35_52_y', '35_53_x', '35_53_y', '35_54_x', '35_54_y', '35_55_x', '35_55_y', '35_56_x',
'35_56_y', '35_57_x', '35_57_y', '35_58_x', '35_58_y', '35_59_x', '35_59_y', '35_60_x', '35_60_y',
'35_61_x', '35_61_y', '35_62_x', '35_62_y', '35_63_x', '35_63_y', '35_64_x', '35_64_y', '35_65_x',
'35_65_y', '35_66_x', '35_66_y', '35_67_x', '35_67_y', '36_37_x', '36_37_y', '36_38_x', '36_38_y',
'36_39_x', '36_39_y', '36_40_x', '36_40_y', '36_41_x', '36_41_y', '36_42_x', '36_42_y', '36_43_x',
'36_43_y', '36_44_x', '36_44_y', '36_45_x', '36_45_y', '36_46_x', '36_46_y', '36_47_x', '36_47_y',
'36_48_x', '36_48_y', '36_49_x', '36_49_y', '36_50_x', '36_50_y', '36_51_x', '36_51_y', '36_52_x',
'36_52_y', '36_53_x', '36_53_y', '36_54_x', '36_54_y', '36_55_x', '36_55_y', '36_56_x', '36_56_y',
'36_57_x', '36_57_y', '36_58_x', '36_58_y', '36_59_x', '36_59_y', '36_60_x', '36_60_y', '36_61_x',
'36_61_y', '36_62_x', '36_62_y', '36_63_x', '36_63_y', '36_64_x', '36_64_y', '36_65_x', '36_65_y',
'36_66_x', '36_66_y', '36_67_x', '36_67_y', '37_38_x', '37_38_y', '37_39_x', '37_39_y', '37_40_x',
'37_40_y', '37_41_x', '37_41_y', '37_42_x', '37_42_y', '37_43_x', '37_43_y', '37_44_x', '37_44_y',
'37_45_x', '37_45_y', '37_46_x', '37_46_y', '37_47_x', '37_47_y', '37_48_x', '37_48_y', '37_49_x',
'37_49_y', '37_50_x', '37_50_y', '37_51_x', '37_51_y', '37_52_x', '37_52_y', '37_53_x', '37_53_y',
'37_54_x', '37_54_y', '37_55_x', '37_55_y', '37_56_x', '37_56_y', '37_57_x', '37_57_y', '37_58_x',
'37_58_y', '37_59_x', '37_59_y', '37_60_x', '37_60_y', '37_61_x', '37_61_y', '37_62_x', '37_62_y',
'37_63_x', '37_63_y', '37_64_x', '37_64_y', '37_65_x', '37_65_y', '37_66_x', '37_66_y', '37_67_x',
'37_67_y', '38_39_x', '38_39_y', '38_40_x', '38_40_y', '38_41_x', '38_41_y', '38_42_x', '38_42_y',
'38_43_x', '38_43_y', '38_44_x', '38_44_y', '38_45_x', '38_45_y', '38_46_x', '38_46_y', '38_47_x',
'38_47_y', '38_48_x', '38_48_y', '38_49_x', '38_49_y', '38_50_x', '38_50_y', '38_51_x', '38_51_y',
'38_52_x', '38_52_y', '38_53_x', '38_53_y', '38_54_x', '38_54_y', '38_55_x', '38_55_y', '38_56_x',
'38_56_y', '38_57_x', '38_57_y', '38_58_x', '38_58_y', '38_59_x', '38_59_y', '38_60_x', '38_60_y',
'38_61_x', '38_61_y', '38_62_x', '38_62_y', '38_63_x', '38_63_y', '38_64_x', '38_64_y', '38_65_x',
'38_65_y', '38_66_x', '38_66_y', '38_67_x', '38_67_y', '39_40_x', '39_40_y', '39_41_x', '39_41_y',
'39_42_x', '39_42_y', '39_43_x', '39_43_y', '39_44_x', '39_44_y', '39_45_x', '39_45_y', '39_46_x',
'39_46_y', '39_47_x', '39_47_y', '39_48_x', '39_48_y', '39_49_x', '39_49_y', '39_50_x', '39_50_y',
'39_51_x', '39_51_y', '39_52_x', '39_52_y', '39_53_x', '39_53_y', '39_54_x', '39_54_y', '39_55_x',
'39_55_y', '39_56_x', '39_56_y', '39_57_x', '39_57_y', '39_58_x', '39_58_y', '39_59_x', '39_59_y',
'39_60_x', '39_60_y', '39_61_x', '39_61_y', '39_62_x', '39_62_y', '39_63_x', '39_63_y', '39_64_x',
'39_64_y', '39_65_x', '39_65_y', '39_66_x', '39_66_y', '39_67_x', '39_67_y', '3_10_x', '3_10_y',
'3_11_x', '3_11_y', '3_12_x', '3_12_y', '3_13_x', '3_13_y', '3_14_x', '3_14_y', '3_15_x', '3_15_y',
'3_16_x', '3_16_y', '3_17_x', '3_17_y', '3_18_x', '3_18_y', '3_19_x', '3_19_y', '3_20_x', '3_20_y',
'3_21_x', '3_21_y', '3_22_x', '3_22_y', '3_23_x', '3_23_y', '3_24_x', '3_24_y', '3_25_x', '3_25_y',
'3_26_x', '3_26_y', '3_27_x', '3_27_y', '3_28_x', '3_28_y', '3_29_x', '3_29_y', '3_30_x', '3_30_y',
'3_31_x', '3_31_y', '3_32_x', '3_32_y', '3_33_x', '3_33_y', '3_34_x', '3_34_y', '3_35_x', '3_35_y',
'3_36_x', '3_36_y', '3_37_x', '3_37_y', '3_38_x', '3_38_y', '3_39_x', '3_39_y', '3_40_x', '3_40_y',
'3_41_x', '3_41_y', '3_42_x', '3_42_y', '3_43_x', '3_43_y', '3_44_x', '3_44_y', '3_45_x', '3_45_y',
'3_46_x', '3_46_y', '3_47_x', '3_47_y', '3_48_x', '3_48_y', '3_49_x', '3_49_y', '3_4_x', '3_4_y',
'3_50_x', '3_50_y', '3_51_x', '3_51_y', '3_52_x', '3_52_y', '3_53_x', '3_53_y', '3_54_x', '3_54_y',
'3_55_x', '3_55_y', '3_56_x', '3_56_y', '3_57_x', '3_57_y', '3_58_x', '3_58_y', '3_59_x', '3_59_y',
'3_5_x', '3_5_y', '3_60_x', '3_60_y', '3_61_x', '3_61_y', '3_62_x', '3_62_y', '3_63_x', '3_63_y',
'3_64_x', '3_64_y', '3_65_x', '3_65_y', '3_66_x', '3_66_y', '3_67_x', '3_67_y', '3_6_x', '3_6_y',
'3_7_x', '3_7_y', '3_8_x', '3_8_y', '3_9_x', '3_9_y', '40_41_x', '40_41_y', '40_42_x', '40_42_y',
'40_43_x', '40_43_y', '40_44_x', '40_44_y', '40_45_x', '40_45_y', '40_46_x', '40_46_y', '40_47_x',
'40_47_y', '40_48_x', '40_48_y', '40_49_x', '40_49_y', '40_50_x', '40_50_y', '40_51_x', '40_51_y',
'40_52_x', '40_52_y', '40_53_x', '40_53_y', '40_54_x', '40_54_y', '40_55_x', '40_55_y', '40_56_x',
'40_56_y', '40_57_x', '40_57_y', '40_58_x', '40_58_y', '40_59_x', '40_59_y', '40_60_x', '40_60_y',
'40_61_x', '40_61_y', '40_62_x', '40_62_y', '40_63_x', '40_63_y', '40_64_x', '40_64_y', '40_65_x',
'40_65_y', '40_66_x', '40_66_y', '40_67_x', '40_67_y', '41_42_x', '41_42_y', '41_43_x', '41_43_y',
'41_44_x', '41_44_y', '41_45_x', '41_45_y', '41_46_x', '41_46_y', '41_47_x', '41_47_y', '41_48_x',
'41_48_y', '41_49_x', '41_49_y', '41_50_x', '41_50_y', '41_51_x', '41_51_y', '41_52_x', '41_52_y',
'41_53_x', '41_53_y', '41_54_x', '41_54_y', '41_55_x', '41_55_y', '41_56_x', '41_56_y', '41_57_x',
'41_57_y', '41_58_x', '41_58_y', '41_59_x', '41_59_y', '41_60_x', '41_60_y', '41_61_x', '41_61_y',
'41_62_x', '41_62_y', '41_63_x', '41_63_y', '41_64_x', '41_64_y', '41_65_x', '41_65_y', '41_66_x',
'41_66_y', '41_67_x', '41_67_y', '42_43_x', '42_43_y', '42_44_x', '42_44_y', '42_45_x', '42_45_y',
'42_46_x', '42_46_y', '42_47_x', '42_47_y', '42_48_x', '42_48_y', '42_49_x', '42_49_y', '42_50_x',
'42_50_y', '42_51_x', '42_51_y', '42_52_x', '42_52_y', '42_53_x', '42_53_y', '42_54_x', '42_54_y',
'42_55_x', '42_55_y', '42_56_x', '42_56_y', '42_57_x', '42_57_y', '42_58_x', '42_58_y', '42_59_x',
'42_59_y', '42_60_x', '42_60_y', '42_61_x', '42_61_y', '42_62_x', '42_62_y', '42_63_x', '42_63_y',
'42_64_x', '42_64_y', '42_65_x', '42_65_y', '42_66_x', '42_66_y', '42_67_x', '42_67_y', '43_44_x',
'43_44_y', '43_45_x', '43_45_y', '43_46_x', '43_46_y', '43_47_x', '43_47_y', '43_48_x', '43_48_y',
'43_49_x', '43_49_y', '43_50_x', '43_50_y', '43_51_x', '43_51_y', '43_52_x', '43_52_y', '43_53_x',
'43_53_y', '43_54_x', '43_54_y', '43_55_x', '43_55_y', '43_56_x', '43_56_y', '43_57_x', '43_57_y',
'43_58_x', '43_58_y', '43_59_x', '43_59_y', '43_60_x', '43_60_y', '43_61_x', '43_61_y', '43_62_x',
'43_62_y', '43_63_x', '43_63_y', '43_64_x', '43_64_y', '43_65_x', '43_65_y', '43_66_x', '43_66_y',
'43_67_x', '43_67_y', '44_45_x', '44_45_y', '44_46_x', '44_46_y', '44_47_x', '44_47_y', '44_48_x',
'44_48_y', '44_49_x', '44_49_y', '44_50_x', '44_50_y', '44_51_x', '44_51_y', '44_52_x', '44_52_y',
'44_53_x', '44_53_y', '44_54_x', '44_54_y', '44_55_x', '44_55_y', '44_56_x', '44_56_y', '44_57_x',
'44_57_y', '44_58_x', '44_58_y', '44_59_x', '44_59_y', '44_60_x', '44_60_y', '44_61_x', '44_61_y',
'44_62_x', '44_62_y', '44_63_x', '44_63_y', '44_64_x', '44_64_y', '44_65_x', '44_65_y', '44_66_x',
'44_66_y', '44_67_x', '44_67_y', '45_46_x', '45_46_y', '45_47_x', '45_47_y', '45_48_x', '45_48_y',
'45_49_x', '45_49_y', '45_50_x', '45_50_y', '45_51_x', '45_51_y', '45_52_x', '45_52_y', '45_53_x',
'45_53_y', '45_54_x', '45_54_y', '45_55_x', '45_55_y', '45_56_x', '45_56_y', '45_57_x', '45_57_y',
'45_58_x', '45_58_y', '45_59_x', '45_59_y', '45_60_x', '45_60_y', '45_61_x', '45_61_y', '45_62_x',
'45_62_y', '45_63_x', '45_63_y', '45_64_x', '45_64_y', '45_65_x', '45_65_y', '45_66_x', '45_66_y',
'45_67_x', '45_67_y', '46_47_x', '46_47_y', '46_48_x', '46_48_y', '46_49_x', '46_49_y', '46_50_x',
'46_50_y', '46_51_x', '46_51_y', '46_52_x', '46_52_y', '46_53_x', '46_53_y', '46_54_x', '46_54_y',
'46_55_x', '46_55_y', '46_56_x', '46_56_y', '46_57_x', '46_57_y', '46_58_x', '46_58_y', '46_59_x',
'46_59_y', '46_60_x', '46_60_y', '46_61_x', '46_61_y', '46_62_x', '46_62_y', '46_63_x', '46_63_y',
'46_64_x', '46_64_y', '46_65_x', '46_65_y', '46_66_x', '46_66_y', '46_67_x', '46_67_y', '47_48_x',
'47_48_y', '47_49_x', '47_49_y', '47_50_x', '47_50_y', '47_51_x', '47_51_y', '47_52_x', '47_52_y',
'47_53_x', '47_53_y', '47_54_x', '47_54_y', '47_55_x', '47_55_y', '47_56_x', '47_56_y', '47_57_x',
'47_57_y', '47_58_x', '47_58_y', '47_59_x', '47_59_y', '47_60_x', '47_60_y', '47_61_x', '47_61_y',
'47_62_x', '47_62_y', '47_63_x', '47_63_y', '47_64_x', '47_64_y', '47_65_x', '47_65_y', '47_66_x',
'47_66_y', '47_67_x', '47_67_y', '48_49_x', '48_49_y', '48_50_x', '48_50_y', '48_51_x', '48_51_y',
'48_52_x', '48_52_y', '48_53_x', '48_53_y', '48_54_x', '48_54_y', '48_55_x', '48_55_y', '48_56_x',
'48_56_y', '48_57_x', '48_57_y', '48_58_x', '48_58_y', '48_59_x', '48_59_y', '48_60_x', '48_60_y',
'48_61_x', '48_61_y', '48_62_x', '48_62_y', '48_63_x', '48_63_y', '48_64_x', '48_64_y', '48_65_x',
'48_65_y', '48_66_x', '48_66_y', '48_67_x', '48_67_y', '49_50_x', '49_50_y', '49_51_x', '49_51_y',
'49_52_x', '49_52_y', '49_53_x', '49_53_y', '49_54_x', '49_54_y', '49_55_x', '49_55_y', '49_56_x',
'49_56_y', '49_57_x', '49_57_y', '49_58_x', '49_58_y', '49_59_x', '49_59_y', '49_60_x', '49_60_y',
'49_61_x', '49_61_y', '49_62_x', '49_62_y', '49_63_x', '49_63_y', '49_64_x', '49_64_y', '49_65_x',
'49_65_y', '49_66_x', '49_66_y', '49_67_x', '49_67_y', '4_10_x', '4_10_y', '4_11_x', '4_11_y', '4_12_x',
'4_12_y', '4_13_x', '4_13_y', '4_14_x', '4_14_y', '4_15_x', '4_15_y', '4_16_x', '4_16_y', '4_17_x',
'4_17_y', '4_18_x', '4_18_y', '4_19_x', '4_19_y', '4_20_x', '4_20_y', '4_21_x', '4_21_y', '4_22_x',
'4_22_y', '4_23_x', '4_23_y', '4_24_x', '4_24_y', '4_25_x', '4_25_y', '4_26_x', '4_26_y', '4_27_x',
'4_27_y', '4_28_x', '4_28_y', '4_29_x', '4_29_y', '4_30_x', '4_30_y', '4_31_x', '4_31_y', '4_32_x',
'4_32_y', '4_33_x', '4_33_y', '4_34_x', '4_34_y', '4_35_x', '4_35_y', '4_36_x', '4_36_y', '4_37_x',
'4_37_y', '4_38_x', '4_38_y', '4_39_x', '4_39_y', '4_40_x', '4_40_y', '4_41_x', '4_41_y', '4_42_x',
'4_42_y', '4_43_x', '4_43_y', '4_44_x', '4_44_y', '4_45_x', '4_45_y', '4_46_x', '4_46_y', '4_47_x',
'4_47_y', '4_48_x', '4_48_y', '4_49_x', '4_49_y', '4_50_x', '4_50_y', '4_51_x', '4_51_y', '4_52_x',
'4_52_y', '4_53_x', '4_53_y', '4_54_x', '4_54_y', '4_55_x', '4_55_y', '4_56_x', '4_56_y', '4_57_x',
'4_57_y', '4_58_x', '4_58_y', '4_59_x', '4_59_y', '4_5_x', '4_5_y', '4_60_x', '4_60_y', '4_61_x',
'4_61_y', '4_62_x', '4_62_y', '4_63_x', '4_63_y', '4_64_x', '4_64_y', '4_65_x', '4_65_y', '4_66_x',
'4_66_y', '4_67_x', '4_67_y', '4_6_x', '4_6_y', '4_7_x', '4_7_y', '4_8_x', '4_8_y', '4_9_x', '4_9_y',
'50_51_x', '50_51_y', '50_52_x', '50_52_y', '50_53_x', '50_53_y', '50_54_x', '50_54_y', '50_55_x',
'50_55_y', '50_56_x', '50_56_y', '50_57_x', '50_57_y', '50_58_x', '50_58_y', '50_59_x', '50_59_y',
'50_60_x', '50_60_y', '50_61_x', '50_61_y', '50_62_x', '50_62_y', '50_63_x', '50_63_y', '50_64_x',
'50_64_y', '50_65_x', '50_65_y', '50_66_x', '50_66_y', '50_67_x', '50_67_y', '51_52_x', '51_52_y',
'51_53_x', '51_53_y', '51_54_x', '51_54_y', '51_55_x', '51_55_y', '51_56_x', '51_56_y', '51_57_x',
'51_57_y', '51_58_x', '51_58_y', '51_59_x', '51_59_y', '51_60_x', '51_60_y', '51_61_x', '51_61_y',
'51_62_x', '51_62_y', '51_63_x', '51_63_y', '51_64_x', '51_64_y', '51_65_x', '51_65_y', '51_66_x',
'51_66_y', '51_67_x', '51_67_y', '52_53_x', '52_53_y', '52_54_x', '52_54_y', '52_55_x', '52_55_y',
'52_56_x', '52_56_y', '52_57_x', '52_57_y', '52_58_x', '52_58_y', '52_59_x', '52_59_y', '52_60_x',
'52_60_y', '52_61_x', '52_61_y', '52_62_x', '52_62_y', '52_63_x', '52_63_y', '52_64_x', '52_64_y',
'52_65_x', '52_65_y', '52_66_x', '52_66_y', '52_67_x', '52_67_y', '53_54_x', '53_54_y', '53_55_x',
'53_55_y', '53_56_x', '53_56_y', '53_57_x', '53_57_y', '53_58_x', '53_58_y', '53_59_x', '53_59_y',
'53_60_x', '53_60_y', '53_61_x', '53_61_y', '53_62_x', '53_62_y', '53_63_x', '53_63_y', '53_64_x',
'53_64_y', '53_65_x', '53_65_y', '53_66_x', '53_66_y', '53_67_x', '53_67_y', '54_55_x', '54_55_y',
'54_56_x', '54_56_y', '54_57_x', '54_57_y', '54_58_x', '54_58_y', '54_59_x', '54_59_y', '54_60_x',
'54_60_y', '54_61_x', '54_61_y', '54_62_x', '54_62_y', '54_63_x', '54_63_y', '54_64_x', '54_64_y',
'54_65_x', '54_65_y', '54_66_x', '54_66_y', '54_67_x', '54_67_y', '55_56_x', '55_56_y', '55_57_x',
'55_57_y', '55_58_x', '55_58_y', '55_59_x', '55_59_y', '55_60_x', '55_60_y', '55_61_x', '55_61_y',
'55_62_x', '55_62_y', '55_63_x', '55_63_y', '55_64_x', '55_64_y', '55_65_x', '55_65_y', '55_66_x',
'55_66_y', '55_67_x', '55_67_y', '56_57_x', '56_57_y', '56_58_x', '56_58_y', '56_59_x', '56_59_y',
'56_60_x', '56_60_y', '56_61_x', '56_61_y', '56_62_x', '56_62_y', '56_63_x', '56_63_y', '56_64_x',
'56_64_y', '56_65_x', '56_65_y', '56_66_x', '56_66_y', '56_67_x', '56_67_y', '57_58_x', '57_58_y',
'57_59_x', '57_59_y', '57_60_x', '57_60_y', '57_61_x', '57_61_y', '57_62_x', '57_62_y', '57_63_x',
'57_63_y', '57_64_x', '57_64_y', '57_65_x', '57_65_y', '57_66_x', '57_66_y', '57_67_x', '57_67_y',
'58_59_x', '58_59_y', '58_60_x', '58_60_y', '58_61_x', '58_61_y', '58_62_x', '58_62_y', '58_63_x',
'58_63_y', '58_64_x', '58_64_y', '58_65_x', '58_65_y', '58_66_x', '58_66_y', '58_67_x', '58_67_y',
'59_60_x', '59_60_y', '59_61_x', '59_61_y', '59_62_x', '59_62_y', '59_63_x', '59_63_y', '59_64_x',
'59_64_y', '59_65_x', '59_65_y', '59_66_x', '59_66_y', '59_67_x', '59_67_y', '5_10_x', '5_10_y',
'5_11_x', '5_11_y', '5_12_x', '5_12_y', '5_13_x', '5_13_y', '5_14_x', '5_14_y', '5_15_x', '5_15_y',
'5_16_x', '5_16_y', '5_17_x', '5_17_y', '5_18_x', '5_18_y', '5_19_x', '5_19_y', '5_20_x', '5_20_y',
'5_21_x', '5_21_y', '5_22_x', '5_22_y', '5_23_x', '5_23_y', '5_24_x', '5_24_y', '5_25_x', '5_25_y',
'5_26_x', '5_26_y', '5_27_x', '5_27_y', '5_28_x', '5_28_y', '5_29_x', '5_29_y', '5_30_x', '5_30_y',
'5_31_x', '5_31_y', '5_32_x', '5_32_y', '5_33_x', '5_33_y', '5_34_x', '5_34_y', '5_35_x', '5_35_y',
'5_36_x', '5_36_y', '5_37_x', '5_37_y', '5_38_x', '5_38_y', '5_39_x', '5_39_y', '5_40_x', '5_40_y',
'5_41_x', '5_41_y', '5_42_x', '5_42_y', '5_43_x', '5_43_y', '5_44_x', '5_44_y', '5_45_x', '5_45_y',
'5_46_x', '5_46_y', '5_47_x', '5_47_y', '5_48_x', '5_48_y', '5_49_x', '5_49_y', '5_50_x', '5_50_y',
'5_51_x', '5_51_y', '5_52_x', '5_52_y', '5_53_x', '5_53_y', '5_54_x', '5_54_y', '5_55_x', '5_55_y',
'5_56_x', '5_56_y', '5_57_x', '5_57_y', '5_58_x', '5_58_y', '5_59_x', '5_59_y', '5_60_x', '5_60_y',
'5_61_x', '5_61_y', '5_62_x', '5_62_y', '5_63_x', '5_63_y', '5_64_x', '5_64_y', '5_65_x', '5_65_y',
'5_66_x', '5_66_y', '5_67_x', '5_67_y', '5_6_x', '5_6_y', '5_7_x', '5_7_y', '5_8_x', '5_8_y', '5_9_x',
'5_9_y', '60_61_x', '60_61_y', '60_62_x', '60_62_y', '60_63_x', '60_63_y', '60_64_x', '60_64_y',
'60_65_x', '60_65_y', '60_66_x', '60_66_y', '60_67_x', '60_67_y', '61_62_x', '61_62_y', '61_63_x',
'61_63_y', '61_64_x', '61_64_y', '61_65_x', '61_65_y', '61_66_x', '61_66_y', '61_67_x', '61_67_y',
'62_63_x', '62_63_y', '62_64_x', '62_64_y', '62_65_x', '62_65_y', '62_66_x', '62_66_y', '62_67_x',
'62_67_y', '63_64_x', '63_64_y', '63_65_x', '63_65_y', '63_66_x', '63_66_y', '63_67_x', '63_67_y',
'64_65_x', '64_65_y', '64_66_x', '64_66_y', '64_67_x', '64_67_y', '65_66_x', '65_66_y', '65_67_x',
'65_67_y', '66_67_x', '66_67_y', '6_10_x', '6_10_y', '6_11_x', '6_11_y', '6_12_x', '6_12_y', '6_13_x',
'6_13_y', '6_14_x', '6_14_y', '6_15_x', '6_15_y', '6_16_x', '6_16_y', '6_17_x', '6_17_y', '6_18_x',
'6_18_y', '6_19_x', '6_19_y', '6_20_x', '6_20_y', '6_21_x', '6_21_y', '6_22_x', '6_22_y', '6_23_x',
'6_23_y', '6_24_x', '6_24_y', '6_25_x', '6_25_y', '6_26_x', '6_26_y', '6_27_x', '6_27_y', '6_28_x',
'6_28_y', '6_29_x', '6_29_y', '6_30_x', '6_30_y', '6_31_x', '6_31_y', '6_32_x', '6_32_y', '6_33_x',
'6_33_y', '6_34_x', '6_34_y', '6_35_x', '6_35_y', '6_36_x', '6_36_y', '6_37_x', '6_37_y', '6_38_x',
'6_38_y', '6_39_x', '6_39_y', '6_40_x', '6_40_y', '6_41_x', '6_41_y', '6_42_x', '6_42_y', '6_43_x',
'6_43_y', '6_44_x', '6_44_y', '6_45_x', '6_45_y', '6_46_x', '6_46_y', '6_47_x', '6_47_y', '6_48_x',
'6_48_y', '6_49_x', '6_49_y', '6_50_x', '6_50_y', '6_51_x', '6_51_y', '6_52_x', '6_52_y', '6_53_x',
'6_53_y', '6_54_x', '6_54_y', '6_55_x', '6_55_y', '6_56_x', '6_56_y', '6_57_x', '6_57_y', '6_58_x',
'6_58_y', '6_59_x', '6_59_y', '6_60_x', '6_60_y', '6_61_x', '6_61_y', '6_62_x', '6_62_y', '6_63_x',
'6_63_y', '6_64_x', '6_64_y', '6_65_x', '6_65_y', '6_66_x', '6_66_y', '6_67_x', '6_67_y', '6_7_x',
'6_7_y', '6_8_x', '6_8_y', '6_9_x', '6_9_y', '7_10_x', '7_10_y', '7_11_x', '7_11_y', '7_12_x', '7_12_y',
'7_13_x', '7_13_y', '7_14_x', '7_14_y', '7_15_x', '7_15_y', '7_16_x', '7_16_y', '7_17_x', '7_17_y',
'7_18_x', '7_18_y', '7_19_x', '7_19_y', '7_20_x', '7_20_y', '7_21_x', '7_21_y', '7_22_x', '7_22_y',
'7_23_x', '7_23_y', '7_24_x', '7_24_y', '7_25_x', '7_25_y', '7_26_x', '7_26_y', '7_27_x', '7_27_y',
'7_28_x', '7_28_y', '7_29_x', '7_29_y', '7_30_x', '7_30_y', '7_31_x', '7_31_y', '7_32_x', '7_32_y',
'7_33_x', '7_33_y', '7_34_x', '7_34_y', '7_35_x', '7_35_y', '7_36_x', '7_36_y', '7_37_x', '7_37_y',
'7_38_x', '7_38_y', '7_39_x', '7_39_y', '7_40_x', '7_40_y', '7_41_x', '7_41_y', '7_42_x', '7_42_y',
'7_43_x', '7_43_y', '7_44_x', '7_44_y', '7_45_x', '7_45_y', '7_46_x', '7_46_y', '7_47_x', '7_47_y',
'7_48_x', '7_48_y', '7_49_x', '7_49_y', '7_50_x', '7_50_y', '7_51_x', '7_51_y', '7_52_x', '7_52_y',
'7_53_x', '7_53_y', '7_54_x', '7_54_y', '7_55_x', '7_55_y', '7_56_x', '7_56_y', '7_57_x', '7_57_y',
'7_58_x', '7_58_y', '7_59_x', '7_59_y', '7_60_x', '7_60_y', '7_61_x', '7_61_y', '7_62_x', '7_62_y',
'7_63_x', '7_63_y', '7_64_x', '7_64_y', '7_65_x', '7_65_y', '7_66_x', '7_66_y', '7_67_x', '7_67_y',
'7_8_x', '7_8_y', '7_9_x', '7_9_y', '8_10_x', '8_10_y', '8_11_x', '8_11_y', '8_12_x', '8_12_y', '8_13_x',
'8_13_y', '8_14_x', '8_14_y', '8_15_x', '8_15_y', '8_16_x', '8_16_y', '8_17_x', '8_17_y', '8_18_x',
'8_18_y', '8_19_x', '8_19_y', '8_20_x', '8_20_y', '8_21_x', '8_21_y', '8_22_x', '8_22_y', '8_23_x',
'8_23_y', '8_24_x', '8_24_y', '8_25_x', '8_25_y', '8_26_x', '8_26_y', '8_27_x', '8_27_y', '8_28_x',
'8_28_y', '8_29_x', '8_29_y', '8_30_x', '8_30_y', '8_31_x', '8_31_y', '8_32_x', '8_32_y', '8_33_x',
'8_33_y', '8_34_x', '8_34_y', '8_35_x', '8_35_y', '8_36_x', '8_36_y', '8_37_x', '8_37_y', '8_38_x',
'8_38_y', '8_39_x', '8_39_y', '8_40_x', '8_40_y', '8_41_x', '8_41_y', '8_42_x', '8_42_y', '8_43_x',
'8_43_y', '8_44_x', '8_44_y', '8_45_x', '8_45_y', '8_46_x', '8_46_y', '8_47_x', '8_47_y', '8_48_x',
'8_48_y', '8_49_x', '8_49_y', '8_50_x', '8_50_y', '8_51_x', '8_51_y', '8_52_x', '8_52_y', '8_53_x',
'8_53_y', '8_54_x', '8_54_y', '8_55_x', '8_55_y', '8_56_x', '8_56_y', '8_57_x', '8_57_y', '8_58_x',
'8_58_y', '8_59_x', '8_59_y', '8_60_x', '8_60_y', '8_61_x', '8_61_y', '8_62_x', '8_62_y', '8_63_x',
'8_63_y', '8_64_x', '8_64_y', '8_65_x', '8_65_y', '8_66_x', '8_66_y', '8_67_x', '8_67_y', '8_9_x',
'8_9_y', '9_10_x', '9_10_y', '9_11_x', '9_11_y', '9_12_x', '9_12_y', '9_13_x', '9_13_y', '9_14_x',
'9_14_y', '9_15_x', '9_15_y', '9_16_x', '9_16_y', '9_17_x', '9_17_y', '9_18_x', '9_18_y', '9_19_x',
'9_19_y', '9_20_x', '9_20_y', '9_21_x', '9_21_y', '9_22_x', '9_22_y', '9_23_x', '9_23_y', '9_24_x',
'9_24_y', '9_25_x', '9_25_y', '9_26_x', '9_26_y', '9_27_x', '9_27_y', '9_28_x', '9_28_y', '9_29_x',
'9_29_y', '9_30_x', '9_30_y', '9_31_x', '9_31_y', '9_32_x', '9_32_y', '9_33_x', '9_33_y', '9_34_x',
'9_34_y', '9_35_x', '9_35_y', '9_36_x', '9_36_y', '9_37_x', '9_37_y', '9_38_x', '9_38_y', '9_39_x',
'9_39_y', '9_40_x', '9_40_y', '9_41_x', '9_41_y', '9_42_x', '9_42_y', '9_43_x', '9_43_y', '9_44_x',
'9_44_y', '9_45_x', '9_45_y', '9_46_x', '9_46_y', '9_47_x', '9_47_y', '9_48_x', '9_48_y', '9_49_x',
'9_49_y', '9_50_x', '9_50_y', '9_51_x', '9_51_y', '9_52_x', '9_52_y', '9_53_x', '9_53_y', '9_54_x',
'9_54_y', '9_55_x', '9_55_y', '9_56_x', '9_56_y', '9_57_x', '9_57_y', '9_58_x', '9_58_y', '9_59_x',
'9_59_y', '9_60_x', '9_60_y', '9_61_x', '9_61_y', '9_62_x', '9_62_y', '9_63_x', '9_63_y', '9_64_x',
'9_64_y', '9_65_x', '9_65_y', '9_66_x', '9_66_y', '9_67_x', '9_67_y', 'skin_0', 'skin_1', 'skin_10',
'skin_11', 'skin_12', 'skin_13', 'skin_14', 'skin_15', 'skin_16', 'skin_17', 'skin_18', 'skin_19',
'skin_2', 'skin_20', 'skin_21', 'skin_22', 'skin_23', 'skin_24', 'skin_25', 'skin_3', 'skin_4', 'skin_5',
'skin_6', 'skin_7', 'skin_8', 'skin_9']
df_input = df_input[select_cols]
df_label = df_input['label'].values
df_input = df_input.drop(['Image', 'label'], axis=1)
feature_names = df_input.columns
df_input = df_input.values
#print(feature_names)
df_explain = pd.read_csv('model/explain.csv')
df_explain['key'] = df_explain['key'].astype(str)
# 生成lbph特征
def lbph_extract(img, d=None, eps=1e-7):
no_points = 24
radius = 8
d_top = d.top()
d_bottom = d.bottom()
d_left = d.left()
d_right = d.right()
cropped = img[d_top:d_bottom, d_left:d_right]
im_gray = cv2.cvtColor(cropped, cv2.COLOR_BGR2GRAY)
lbp = local_binary_pattern(im_gray, no_points, radius, method='uniform')
(histogram, _) = np.histogram(lbp.ravel(),
bins=np.arange(0, no_points + 3),
range=(0, no_points + 2))
# now we need to normalise the histogram so that the total sum=1
histogram = histogram.astype("float")
histogram /= (histogram.sum() + eps)
skin_hist = {}
for i, h in enumerate(histogram):
skin_hist['skin_' + str(i)] = h
return skin_hist
#%%
def prepare_input(img_path):
global select_cols
img = dlib.load_rgb_image(img_path)
dets = detector(img, 1)
df_image = None
for k, d in enumerate(dets):
# print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(k, d.left(), d.top(), d.right(), d.bottom()))
f_width = abs(d.right() - d.left())
f_height = abs(d.bottom() - d.top())
# print('width:' + str(f_width) + ', height:' + str(f_height))
# Get the landmarks/parts for the face in box d.
shape = predictor(img, d)
# print("Part 0: {}, Part 1: {} ...".format(shape.part(0), shape.part(1)))
face_shape = {}
for i in range(0, 67):
for j in range(i + 1, 68):
face_shape[str(i) + '_' + str(j) + '_x'] = abs(shape.part(i).x - shape.part(j).x) / f_width
face_shape[str(i) + '_' + str(j) + '_y'] = abs(shape.part(i).y - shape.part(j).y) / f_height
# print(str(i) + '_' + str(j))
# shape_size.append(face_shape)
skin_hists = lbph_extract(img, d)
face_shape.update(skin_hists)
face_shape = {k: v for k, v in face_shape.items() if k in select_cols}
df_image = pd.DataFrame.from_dict([face_shape])
break
#df_image = {k: v for k, v in df_image.items() if k in select_cols}
#print(df_image)
return df_image
class Explanation:
def __init__(self):
pass
class AdditiveExplanation(Explanation):
def __init__(self, base_value, out_value, effects, effects_var, instance, link, model, data):
self.base_value = base_value
self.out_value = out_value
self.effects = effects
self.effects_var = effects_var
assert isinstance(instance, Instance)
self.instance = instance
assert isinstance(link, Link)
self.link = link
assert isinstance(model, Model)
self.model = model
assert isinstance(data, Data)
self.data = data
def ensure_not_numpy(x):
if isinstance(x, bytes):
return x.decode()
elif isinstance(x, np.str):
return str(x)
elif isinstance(x, np.generic):
return float(x.item())
else:
return x
def force_df(base_value, shap_values, features=None, feature_names=None, out_names=None, link="identity",
plot_cmap="RdBu", matplotlib=False, show=True, figsize=(20, 3), ordering_keys=None,
ordering_keys_time_format=None,
text_rotation=0):
# auto unwrap the base_value
if type(base_value) == np.ndarray and len(base_value) == 1:
base_value = base_value[0]
if (type(base_value) == np.ndarray or type(base_value) == list):
if type(shap_values) != list or len(shap_values) != len(base_value):
raise Exception("In v0.20 force_plot now requires the base value as the first parameter! " \
"Try shap.force_plot(explainer.expected_value, shap_values) or " \
"for multi-output models try " \
"shap.force_plot(explainer.expected_value[0], shap_values[0]).")
assert not type(shap_values) == list, "The shap_values arg looks looks multi output, try shap_values[i]."
link = convert_to_link(link)
if type(shap_values) != np.ndarray:
return shap_values
# convert from a DataFrame or other types
if str(type(features)) == "<class 'pandas.core.frame.DataFrame'>":
if feature_names is None:
feature_names = list(features.columns)
features = features.values
elif str(type(features)) == "<class 'pandas.core.series.Series'>":
if feature_names is None:
feature_names = list(features.index)
features = features.values
elif isinstance(features, list):
if feature_names is None:
feature_names = features
features = None
elif features is not None and len(features.shape) == 1 and feature_names is None:
feature_names = features
features = None
if len(shap_values.shape) == 1:
shap_values = np.reshape(shap_values, (1, len(shap_values)))
if out_names is None:
out_names = ["output value"]
elif type(out_names) == str:
out_names = [out_names]
if shap_values.shape[0] == 1:
if feature_names is None:
feature_names = [shap.labels['FEATURE'] % str(i) for i in range(shap_values.shape[1])]
if features is None:
features = ["" for _ in range(len(feature_names))]
if type(features) == np.ndarray:
features = features.flatten()
# check that the shape of the shap_values and features match
if len(features) != shap_values.shape[1]:
msg = "Length of features is not equal to the length of shap_values!"
if len(features) == shap_values.shape[1] - 1:
msg += " You might be using an old format shap_values array with the base value " \
"as the last column. In this case just pass the array without the last column."
raise Exception(msg)
instance = Instance(np.zeros((1, len(feature_names))), features)
exps = AdditiveExplanation(
base_value,
np.sum(shap_values[0, :]) + base_value,
shap_values[0, :],
None,
instance,
link,
Model(None, out_names),
DenseData(np.zeros((1, len(feature_names))), list(feature_names))
)
else:
if matplotlib:
raise Exception("matplotlib = True is not yet supported for force plots with multiple samples!")
if shap_values.shape[0] > 3000:
warnings.warn("shap.force_plot is slow for many thousands of rows, try subsampling your data.")
exps = []
for i in range(shap_values.shape[0]):
if feature_names is None:
feature_names = [shap.labels['FEATURE'] % str(i) for i in range(shap_values.shape[1])]
if features is None:
display_features = ["" for i in range(len(feature_names))]
else:
display_features = features[i, :]
instance = Instance(np.ones((1, len(feature_names))), display_features)
e = AdditiveExplanation(
base_value,
np.sum(shap_values[i, :]) + base_value,
shap_values[i, :],
None,
instance,
link,
Model(None, out_names),
DenseData(np.ones((1, len(feature_names))), list(feature_names))
)
exps.append(e)
result_df = pd.DataFrame({'feature': exps.data.group_names, 'effect': ensure_not_numpy(exps.effects), 'value': exps.instance.group_display_values})
result_df = result_df[result_df['effect'] != 0].reset_index()
return result_df
def get_explain(x):
global df_explain
points = x.split('_')
if 'skin' in points:
exp = '皮肤'
else:
exp = ''
for p in points:
if p != 'x' and p != 'y':
try:
exp += df_explain[df_explain['key'] == p]['explain'].values[0]
except:
exp += ''
exp += '_'
if p == 'x':
exp += '宽'
elif p == 'y':
exp += '高'
return exp
def predict(im_path):
X_test = prepare_input(im_path)
Y_test = 0
if X_test is not None:
Y_test = model.predict(X_test)
return Y_test
def gen_report_file(im_path, name='t1'):
X_test = prepare_input(im_path)
Y_test = 0
if X_test is not None:
Y_test = model.predict(X_test)
params = []
print('beauty score:' + str(Y_test))
params.append(Y_test)
params.append(im_path)
shap_values = explainer.shap_values(X_test)
print('gen explain')
result = force_df(explainer.expected_value, shap_values[0, :], X_test)
result['explain'] = result['feature'].apply(get_explain)
try:
good_effect = result[result['effect'] > 0.01].sort_values('effect', ascending=False).reset_index()
except:
good_effect = None
try:
bad_effect = result[result['effect'] < 0.01].sort_values('effect').reset_index()
except:
bad_effect = None
if good_effect is not None:
good_str = str(good_effect['explain'].values[0:10])
params.append(good_str)
print('您的优势部位:' + good_str)
else:
params.append(None)
if bad_effect is not None:
bad_str = str(bad_effect['explain'].values[0:10])
params.append(bad_str)
print('您的欠缺部位:' + bad_str)
else:
params.append(None)
gen_report(name, params)
if __name__ == "__main__":
try:
test = sys.argv[1]
mode = sys.argv[2]
except:
test = "img/t1.jpg"
mode = 'shap'
X_test = prepare_input(test)
y_test = model.predict(X_test)
print('beauty score:' + str(y_test))
shap_values = explainer.shap_values(X_test)
print('gen explain')
result = force_df(explainer.expected_value, shap_values[0, :], X_test)
result['explain'] = result['feature'].apply(get_explain)
good_effect = result[result['effect'] > 0.01].sort_values('effect', ascending=False).reset_index()
bad_effect = result[result['effect'] < 0.01].sort_values('effect').reset_index()
try:
good = str(good_effect['explain'][0:10].values)
bad = str(bad_effect['explain'][0:10].values)
except Exception as e:
print(e)
good = ''
bad = ''
print('您的优势部位:' + good)
print('您的欠缺部位:' + bad)
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Python
1
https://gitee.com/eddylapis/beauty.git
git@gitee.com:eddylapis/beauty.git
eddylapis
beauty
beauty
master

搜索帮助