tf 单个文字识别 data 数据输入

原文链接: tf 单个文字识别 data 数据输入

上一篇: tf data 使用生成器作为数据输入

下一篇: tf 文字识别 多个文字 data 数据流

15ea0fd94fb8d7a9d169ee6ddc39032ea57.jpg

识别结果相当好

show 9800 [0.96875, 0.16407159]
time 15.302184343338013
(32,) (32,)
['知' '粪' '源' '秆' '吐' '济' '佛' '溢' '埃' '凶' '破' '砸' '功' '佰' '秀' '爬' '惮' '尝'
 '辅' '掣' '潘' '匀' '黍' '旬' '统' '狠' '涛' '鄂' '橙' '缅' '庶' '究']
['知' '粪' '源' '杆' '吐' '济' '佛' '溢' '埃' '凶' '破' '砸' '功' '佰' '秀' '爬' '惮' '尝'
 '辅' '掣' '潘' '匀' '黍' '旬' '统' '狠' '涛' '鄂' '橙' '堰' '庶' '究']

必须加BN, 不然无法收敛!!!!!!!!!!!!!

使用sparse_softmax_cross_entropy_with_logits 作为损失函数时, 会自动进行softmax处理, 并且label比logits少一个维度

需要显示声明utf8, 不然有些汉字会报编码错误

为了能够绘制中文字体 , 需要中文字体库

注意字体的大小和验证码图片大小要合适

# encoding:utf-8
import tensorflow as tf
import numpy as np
from tensorflow.contrib import slim
from captcha.image import ImageCaptcha
from PIL import Image
import matplotlib.pyplot as plt
import time

TRAIN_STEP = 1000000
SHOW_STEP = 100
SAVE_STEP = 200
LR = 0.001
SAVE_PB_PATH = './pb'
TEXT = np.array(list(
    "贿枉呻音荒兼畦稼瘤盔拱巷毡围马吱缀农增宿吴彪鄂竿妒厘恼谴执谋言哆靡痔左捐帕局秉苏恩迸填遮混涕鲜诞磕琵瞧游峙甭嘎北形块自览忘蚜打供吮趁呕肥亚酱梗葛口吻套凭座夕抑匆槛贯拒恃斤合毯忙君酉幸出初支院溉俏艳嘲鸣识耿止余破谁翼咯病驳累穷衰肖框抡沪痊怪源翌竹昔痢瘩埋窿拎母晕迂阁魂瞻赵别国劳薄困龙粤侯沏荐畴招玻金半剪瓣海狱怨走码甫滁牺脖具拔毁逊品螟狞俺茅浴弃槐治倘棵烷砷衅扎狄嚎龋哀克没舱交缠狼蔚叮芳绦惟德矛仍买跌嘿坛暇椎汾瓦噪垢屋雾巫悠今瓮拢僻甘患彩祈感乌越佯灯票撒盅愿巩恐协虎祝胜参媳疆篆行醛碘典匪倪察查茫偶哑铂惯砌婿过贤衍淤赃赠剖靳舞闽话撑经缆卵娶修穴司蓑如玲札酵厩狙城耀终蔑包译潮署漳杖诵谷毫虱柿箔摘蛛烫笨瞥亮橡懊剐霓烬霖锄贾笺里挺耶鼻军佃新斑诊噬禹篓促噎涛檄吐逮侄弗陵羹渣纤萍绑款谓计沥久愈倔怎雏翟芦银揣寿艺瑚光馏废贪磷挖问兹孵氓陶鸳锑持臻床土肇铆垒努钳静泻磊羽矿孺咒榔蓖寇责店豪塘室猖捌归怠鳞邀由远郎蛀社殃扇画枷陷输页肄锯蒲娠夏略焕邹讹侨疫蹿错语胸砾领酶跨滥驱凰蜂坤江宾茎轴捎勺凑阮损力悉帽癌坚俗心掩吾伞痞卤陌琴兄陇妓眨名锁珠咏纵眶另敬昭界校朝券船痴赐岔怖肛兰令挪范邮惦怜黔驶麦算绥响活筷犁罐沟崩雁洛隅入耗惑躇稻簇及杉威踏尹针财欺机碧耕渐隧费蛔厕肺契盖骂挤牛告哪呜唬萌忆钥铀棉爪舶旷肮迈猿尼说佑赡秒方虫跪核补捆逞楚球梳型彦峰禄味学联鳃捂犬莆仑轰趣既涵儒偿躬旭部来迪傲鱼拆褒洪氖诣殊烈镣兴垛饺柠劝停傅掂貌毕枪缉故歹茂刃滇扣少裸秤刹堪术青凡雕态坷汽缎坝栋笆净煮手钨陛怒贞妇控蘸东氰按山暴逼卞慎苑煎帧望奥凛铬颓疽杂卖湍称佩封曰募妆韦掖雅揭冶叛位攫著隘咀厌弥隔汀蔗狰鞋步鸿裴狂往纪蝶额赫滋播赞人僚狐隙赢恳逃萎垦趾虏挫善卢髓突腰俞胳毙召涝琶嫌更各搬琐投托项营找铸缘跑叠俐婚挚祁浚销而窘沈南居紫柬拧屉排摧挨阜腾缮荔艰冒趟但姨误休筝撂委内嫁诡铺餐婉煽怂痰亦夷要惩童却衙茄溢媚愚状豁低搓夜淮舔荡曲移谢刊或浸作又尊痈附啼捶衡隋珊籽配熊桑贡恢撵肯差维柱哇廷恍薯殿桨危滩蠕殷镊林千肾美皋拄年沽骸雌鲤铁敌帚撬奢呼郭钟攀邢雄漂屯和锋棠织均刑烃钾看肠歇拙充弹龄冷暮甄掳段鸭实舀溃椒讫焦缨婴竟划玫冀丛寸篇褐栅膀航褥献留娇成拖媒酋驼酸沫辩赊烙脾什沾密炎每索壮蹦宪积甥辞翻祷傍敲宽稚韵溅熏匙栈慕吸剿肋者淆嗜澄电蓝摄尤蜀0胶慧政判浊坊途孽坟焙庐赶2害派垄验矫诲祭百搏逢迄圈卫吨蚀寺庭题牙嗣悍渠温簧凉练操靴梨沙萤珐搞抬戊短古湖调疙捷菌蜜潍崭瘴哭拯俭凿值詹佛辊理水恒专堵塞便声桅昆环蛇袋喷显华触有炒缓簿犊龟霄瀑芬纠岸通墙遍贵谱琉叫扑健顽涣裹边迎助丁欠掠购概批彝掌俘钠某浙很檬牢瑞章罕搭压疑散辨照谜代胡柑懦卷翁骋耪仇绷荷麓疮气台峪尚挽激老喧固绝窒祟汰需全食缝搁么失阂窑听葵汐奎硫阎铡瞅疵检忌邓帐棒吵盗逛传狈田叔恕婪奴廓侣煤纱聋旅跳庆草腿进访火寂六儿镶颤洗像桔径箱粥道搅饱厦虹上席汗即垫坯觉适寻酪镇雹袭菏遁剥臀堰曼八生浮舰首午戳棕尉碰考呀彤宝帝豆涟酞快莉癣拿池辰脉窍笑赴卸暂梯皿硅鞍得芒闪伴沧哩驯脆利跺官袜犀乾系驻精哎蔡裕较弊冤揪猜捞氯皇莽勉墅税肤总况类溯栗徘撞比吧将眷哦蛆爬辟户神并豫孜恶贬峻楼苞洼茶肌仰插泽你唁晃剩强钓俱洽侩邻鬃瞒且渊晨香咆夫癸账倚抱砒份抒外撕蒸己苦疯甚渗谎互倦房审售梦擦闲难赎孝园痹猪腹摈馒斯穆悸灾帘底铱早泞坏佰瞄当素萄展注伟灰默吉摊啦逻吹以坑鸯贩杯饮泰杭逐蹲境炼货凝沤奈洲涌哨逗裁甜敖柯捻脐抢屹日曾锥准姑漏仆习攒肩庚澎踢履动筐勘苯振贫桶物谰节墨莱潜九裙茸熔菇摩淑肆藤毋绳唆逸狠谚真诌乎翅咎壬战脱庇惰兵灵巍飞茧宁朋乍念接扶频柴句齿衷伺猾测钙罚反苗返定扯乙愉材尺晦鉴羞垣槽保阶稽窗饼睦分伎坐懈镜鸽滦颈随湿弟茨加勾喉钱糠蚁鲍蹈誓斡樊稠血捏可揉讯讼朵坪匝邪澈魄抓镭股衫存卉宵焰椰刺遗员制救仙签限栖饭际呆胞培歧纂舅蛋岂蜘荧预帛莫歌纹丰侮卓右漫谈楔斌蛾延主毖冬僵收霜推掐蝗炕洱顺闷震硼讶享取戍铣任赋单兢周碟月祖拌弱磋搔叨絮泼拳藩泣唯瓤诸浩喊锭速蛙蔷擂酬杠信丧秦被蔬疤融哺造鸵功溶讣霸仕御拼宜网体钒碱臃韭窃睫泡湾耸陨膛字卑京羔揩烁坦假吞偷丝孔隆文萝愧钎粱悔藕逆班则脑阵喇镑刮唐闻佐惜貉迢尸挂鲸一淬意原拷哉滤猩氧宠籍登斧兽艾二蝴眼钻篮咳韶避屿爆搜迫绅洋弯藐柒姻恭汤寞骏丈继纲掣菠铃瞳怔晒冲翠燥董辽奋泄郴旗鹿胎滞汹据遵幂梢馅最铲秩甸届柔乘泪满渝沁湃馋橇天仲膏旺姬谦吓钵绸弓福瘁近绘裔葫刽绢哟达氛殴戏爱趋峭汕跋舍尖明件抿区所秆巧辅趴蠢们娘衣箭足葱付亏表傀晶菱镍搀石闭贺奸驭产畜邵恿沮波悯挠菲洒白辉瓶蹋烹勒戈永薛靛干褂亿下锗挥片狸聪痉霞雍头身整率够档揍莲屈熄哗饶正坞呐脓诬糟睁歉追法唾闺慷点壤屁辑郊涎涪兆枯改拘腑屡礼堤独乡疲啥劲啊睹箕夺拟脊瑟臭皮逝锡躲豢街彼巾墓良酿窥沃芭芯匹堕5贸腐匿缅催酚剃夸求嘶尾想掏钡粳属拴溺嘛蚤技绍抖鞘起拽奇驮凶植扰摔苟许菊讳铜昼简囚雷宴绊常胰不祥旁庙命刨软擎惫烦睡唉漱泳旱蘑屏装炉您舷斟嗅条惮抵佬箍臼妄迭爸业僧驾挑汪刷侦夯膘淳秸饰朴谗蹭企悼英埠喝养债郑磨后顾舒瓜醋若始拍燃榜庶嘻叶岗抨竣釜办龚胯憋敦闹圃肘士帜撩扭盘含杰葡淘喻性央演憾碉渡黎徐肚嫂涩这楷撼冠狮塑云距疥峨扩链观儡氏棱掉府订吏荫川哼晴盆姥赏吃吊捉浦潭鸟竖规汲酮势恰息誉顷给详磅依峦宛泌晓团倡羌镁曙惧绚糖已目樟高紧疚妮忿艇阀矢贝提凌聂小地廊劫喂踊旨诫种嚼垮友斩迅虽谩盐诛猫烘饯蒜匈重彬星吕毛牌奉缩暖腻赂果矮乞雀腺抗竞钉乖蛊册炊脂蜡傣姜娥窟榆疗锚眉橘踞藻客齐五寒悲带晤翱俊耍措嘴门绰痘吝丑谍鸦绎啡秧姚承狡厉株巳肃烤圭柄磐娃究轧侍兑尔此伍颐抛咽须礁武双浅宣沿嚣败乓嚏姓扁根鹰珍叹杨戚彻冻词临攘炯送臂慰格皑旋炽济橱妻报笔旦家纺评蕊鸡胁博拇捅刚绿阻唤粒场舌诽酒沉硒溪械桥肉辕携骄蛮耙描滴郝役钢宏獭剂芥萧烛峡欢眺森榴蕴蜓仗获稿醉冯几侠勤雇廖用开析螺牧繁李施骆鲁咬氟谤宙蚊哥陡立朗魏辣辫膳塔汛怯器清牲鹃站轮横耻纯窖嵌傻蹄陋袖袁灼疼赌西牡番乱浑苹圆椭袱诀篡璃诗耳俯砧烯聚非透叭确缸胖替虾扦柏秀淫鼓消寅仿庄皆恋妈尿其张曹卒疏瞎岿澜砖结窜辆扫喜枢弧涡筛辱授圣线灌暗寡乃洞栽泛勃篙群然窝婶扬倾悄剁连摸侈河篱碑凋构扮现丘椅粟肪枝申栏翔莎遥优予豌勇季男瘪浇孕纷哲汇岛矩箩莹诺砰世惺盂辐纬匣欲晋丸邯染研诚绽虞柞咱约涅蟹蚌棘壕幌革囊释烩玄长号娄匠钧蛰秃至刁阔效幽饥姿埂仔黍矣般米妊辖宗亩翰橙等坡何猎茹锐杏碎娩哄热严炔敞卜抄鼎骨韩纽猴颖皂乏吁崖拥例哈还摹婆孰湛丫之运端灿幻序押瘦腥谭束违昌涯娱剔挡瘫咕琢中影翘驹兜喘安剑膊都嫩住惶贰惊料彭同墟普市芝桩四妖桌毅愤瞬论羡时渴恫荤捍列玩样侧嚷畔秘岁恨竭史转碗埃议厄涧纳完组侗的吗奠姆统到迷冉呵苛讥特犹钦胆茬罢顶度元捧曝择巡乐扔谬痪谊浆娟苔嫡泅知黄痛虚弄魁芹巨谐堑试州氨飘亲事租鹅披狭咸爷蛹郧康粹叉厢仟垃裤梁晚皖纶陀症讲卯赤菩贱导藉霹帖蜕秋梅桓受淌亡晰雨录寝潦僳标编守曳络鞠惹三泥溜囤惨楞丽芋帅无泊万锰醒杀虐亭澡梧冰港仁虑裳筋昨慈督津能雪覆个末前憎锤纫刘勿淄譬裂尘劈希再谆忱孤苇跟尝本欣址鼠符薪缚厂敛磁涨椿廉拓化氢她樱痕它免奖象渭撅吟罩笛幢嫉砂扒浓松敝奄凳铰解鬼圾遣共焉蔫伪架律思宋绵伊堆蝎残淖斜湘抉伶酗拜亢荚彰蒙盎与亨嘉劣糜慢耐污洁苍尽慨昂桃指锻绪煌妨酷挣写抚醇露毗绣枣征盯郸置欧酝超膨幼除颠潘俩相砍颇削邦弘硕挞疟诅愁焚药讨赘袒烟击宅伙诱陪放茵赔朔耘慌寓量啄岭罗书泵舵蚂喳熙仓霍摆才爹景漓怕邑襄贷碴稍零盏觅瞩饲壹遏红碾娜瘟馈刻咨向版致忠鸥玉颁侵乳卧抽空麻焊墒炙情孪绩瑶辙训柳丹棺戎芜盾蓉辜让掇铅肢镀伏涸沛禁拨惭靠潞爽就燕沼镐羊育凸野载炳创壳颜铭拉朱在匡警艘镰幅蜒党缔模筹枫篷偏馁去舟呢慑刀敢牵敏炸魔恤允删躺棍贮迟子斗旧于糯舜苫蕉蓟闸瑰伐省证程聘车管屑痒惋应锣侥伤滔吩戮期炬扛骡汝啪暑渍射帮芽担函锹胀棋畅富渺揖涂拾郡擞为伯狗坍醚骚村荆先筏倒色串嗽眯椽盒糕搪汁堂私见抠矗递脯昏酥驰敷印掷两磺顿膝吭离备颧屠啸呛睬黑擅稳悦忍了兔蓄阳褪饵灶怀叙鹤只脚嘱使砚介辛丙旬厅掀芍豺勋咋庸负淹疡赚惕踌监轩集仪综好噶呸阅质微益贴杜建幕未蜗钝琼袄韧死疹滚晾工库烂纸读蒂角琳眠捣探朽矽腊升医糙滑义掘多春争懒图第玖大寐腕脏些摇垂臣复锅蔼冕烧吼腆岳搐智谣澳级硝屎会灭直玛背漠氮平式殆蔽剧凯遂着膜撇擒崇撮徊占懂眩滨记赖睛映我弦遇折价锦忻也耽筒险策必割甩紊壁他蜻服啤绞嗡诈锈众课绒商鞭队陕握锌唱础唇誊厨盈轻志断戒斋淀锨易逾跃釉钩职赁佳塌憨濒砸疾邱践宫决是腮树舆丢穗鹏资做咙叁述吠戌襟广驴酣循掸退科殉举炭钮猛碳坠护迁井伦十孟蓬陆笼油枕蔓忽渤撤毒漆县蚕闯羚绕肝墩脸殖粕颂七数嗓寥拂关囱鄙拦衔基谅妙瓷徽务筑寄笋询歪冈颅励风域崔对赣遭煞颊父郁撰悬畸攻降储减回胚稀胺师躁熬饿禽蹬亥诉骑匀皱茁杆赛设示那坎答惠援妹急深辗泉枚启漾扼藏粘胃炮糊晌淡骗落岩辈臆斥祸孙扳奔汉盛忧戴咐瞪截矾发添恬该瓢液酌埔捡公讽键捕挟面拣熟容认罪迹爵燎奶颗碍姐涤层犯木切佣历靶滓穿庞沂贼乔檀俄灸夹粮防搽仅聊蕾淋徒嘘障蛤奏秽阐粉骤请粗腋荣王布卿选凤汞尧否异寨卡啃豹鹊沸腔宇桂氦叼因踪堡族梆烽隐粪待琅缄倍妥副谨变帆轨极拭币宰沦哮借歼太拐案鳖蝇挎盲崎赦诧阑花昧民棚畏衬教蝉甲缴陈路揽凹禾孩权似换骇喀括流冗间女续板掺啮隶缕抹窄柜乒阴桐阿搂浪厚拈萨润袍霉盼躯从渔榷凄候把宦钞挛闰弛伸阉稗细葬铝瘸榨挝悟菜踩视梭巴盟巢涉靖硬壶蒋轿呈肿碌咖栓估采缺牟馆引次处"
    # "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
))
TEXT_INDEX = list(range(len(TEXT)))
N_OUTPUTS = len(TEXT)
BATCH_SIZE = 32
TEXT_LENGTH = 1
IMAGE_WIDTH = 64 * TEXT_LENGTH
IMAGE_HEIGHT = 64
IMAGE_SHAPE = (IMAGE_WIDTH, IMAGE_HEIGHT, 3)

print("N_OUTPUTS", N_OUTPUTS)


def random_captcha_text(text_length=1):
    index = np.random.choice(TEXT_INDEX, text_length)
    text = TEXT[index]
    return text, index


def gen_single(random=True):
    while True:
        image = ImageCaptcha(width=IMAGE_WIDTH, height=IMAGE_HEIGHT, fonts=["ios10.ttf"])
        captcha_text, index = random_captcha_text(text_length=TEXT_LENGTH)
        if random:
            #  获得随机生成的验证码
            #  把验证码列表转为字符串
            captcha_text = ''.join(captcha_text)
            #  生成验证码
            captcha = image.generate(captcha_text)
            img = Image.open(captcha)
            img = np.array(img)
        else:
            captcha = image.create_captcha_image(captcha_text, (0, 0, 255), (255, 255, 255))
            img = np.array(captcha)
        yield img, index


def gen_batch(batch_size=BATCH_SIZE):
    images = []
    labels = []
    for _ in range(batch_size):
        image, label = gen_single()
        images.append(image)
        labels.append(label)
    return np.stack(images), np.stack(labels)


def parse(img, label):
    img = tf.cast(img, tf.float32)
    return pre(img), label


def pre(img):
    return img / 127.5 - 1


def post(img):
    img = (img + 1.) * 127.5
    return np.clip(img, 0, 255).astype(np.uint8)


# label (32,)
def label2text(label):
    labels = TEXT[label]
    return labels


def get_iterator():
    # 需要使用元组,使用列表表示shapes时会报无法hash化的错误
    data = tf.data.Dataset.from_generator(gen_single, (tf.uint8, tf.int64), (IMAGE_SHAPE, (TEXT_LENGTH,)))
    data = data.map(parse, num_parallel_calls=6).batch(BATCH_SIZE)
    # data = data.batch(BATCH_SIZE)
    data = data.prefetch(BATCH_SIZE)
    return data.make_initializable_iterator()


def get_block(in_x, num_outputs=32, kernel_size=1, stride=1):
    with slim.arg_scope(
            [
                slim.conv2d,
                slim.separable_conv2d

            ],
            activation_fn=tf.nn.leaky_relu
            # activation_fn=tf.nn.relu6
    ):
        #  inception
        net1 = slim.conv2d(in_x, num_outputs=num_outputs, kernel_size=1, stride=stride)
        net1 = slim.batch_norm(net1)
        net3 = slim.conv2d(in_x, num_outputs=num_outputs, kernel_size=3, stride=stride)
        net3 = slim.batch_norm(net3)
        net5 = slim.conv2d(in_x, num_outputs=num_outputs, kernel_size=5, stride=stride)
        net5 = slim.batch_norm(net5)
        net = tf.concat([net1, net3, net5], axis=3)
        net = slim.conv2d(net, num_outputs=num_outputs, kernel_size=1, stride=2)
        net = slim.batch_norm(net)
        # # net = slim.max_pool2d(net, 3)
        # net = slim.conv2d(net, num_outputs, kernel_size, 2)

        # res
        # net1 = slim.conv2d(in_x, num_outputs, kernel_size=3, stride=stride)
        # net2 = slim.conv2d(net1, num_outputs, kernel_size=3, stride=stride)
        # net3 = slim.conv2d(net2, num_outputs, kernel_size=3, stride=stride)
        # net = net3 + net1
        # net = slim.conv2d(net, num_outputs, kernel_size, 2)
        return net


def build_net(in_x):
    net = get_block(in_x, 128)
    print(net.shape)
    net = get_block(net, 128)
    print(net.shape)
    net = get_block(net, 256)
    print(net.shape)
    net = get_block(net, 256)
    print(net.shape)

    net = slim.flatten(net)
    net = slim.batch_norm(net)
    print(net.shape)
    with slim.arg_scope(
            [
                slim.conv2d,
                slim.fully_connected
            ],
            activation_fn=tf.nn.leaky_relu
            # activation_fn=tf.nn.relu6

    ):
        net = slim.fully_connected(net, 1024)
        net = slim.batch_norm(net)
        net = slim.fully_connected(net, 512)
        net = slim.batch_norm(net)
        net = slim.fully_connected(net, num_outputs=N_OUTPUTS)
    print('net', net.shape)
    return net


def train():
    iterator = get_iterator()
    images, labels = iterator.get_next()
    labels = tf.squeeze(labels, 1)
    net = build_net(images)
    print('labels,net', labels.shape, net.shape)
    loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels, logits=net))
    train_op = tf.train.AdamOptimizer(LR).minimize(loss)
    # train_op = tf.train.RMSPropOptimizer(LR).minimize(loss)
    output = tf.argmax(net, 1)
    prediction = tf.equal(output, labels)
    accuracy = tf.reduce_mean(tf.cast(prediction, tf.float32))

    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        sess.run(iterator.initializer)
        st = time.time()
        for step in range(1, 1 + TRAIN_STEP):
            sess.run(train_op)
            if not step % SHOW_STEP:
                print("show", step, sess.run([accuracy, loss]))
                ed = time.time()
                print('time', ed - st)  # 25s
                st = ed

                images_val, labels_val, prediction_val, output_val = sess.run(
                    [images, labels, prediction, output]
                )
                images_val = post(images_val)

                rows = [
                    np.concatenate(line, 1)
                    for line in np.array_split(images_val, 8)
                ]
                images_val = np.concatenate(rows, 0)
                print(labels_val.shape, prediction_val.shape)
                plt.imshow(images_val)
                plt.show()
                print(label2text(labels_val).flatten())
                print(label2text(output_val.flatten()))
            if not step % SAVE_STEP:
                print('save', step)


def show_image():
    iterator = get_iterator()
    batch = iterator.get_next()

    with tf.Session() as sess:
        sess.run(iterator.initializer)
        for _ in range(10):
            image, label = sess.run(batch)
            print(image.shape, label.shape)
            print(label2text(label))
            image = np.concatenate(image, 1)
            print(image.shape)
            image = post(image)
            plt.imshow(image)
            plt.show()


def main():
    train()


if __name__ == '__main__':
    main()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值