zhaipro / easy12306

使用机器学习算法完成对12306验证码的自动识别
Artistic License 2.0
2.89k stars 737 forks source link

如何完整地跑一遍代码 #22

Closed busyyang closed 4 years ago

busyyang commented 4 years ago

你好,我想学习学习楼主的实现过程,想要完整地跑一遍代码,现在我知道: 1 我需要先运行pretreatement.py, 得到data.npz数据集; 2 baidu.py通过baidu API识别标签的结果; 3 第三步我应该做什么?我看mlearn.py以及mlearn_for_image.py需要的.npz或者.npy文件,都不清楚如何生成。在google drive上倒是有,但是想知道如何生成的?

还有,下载图片的话,能下载多少,我下载了1800张左右时候,就开始大量有重复的文件了。

zhaipro commented 4 years ago

其实我扔掉了很多代码,因为它们很乱,我懒得整理。例如,统计百度的识别结果

你不清楚如何构造数据集,那你理解它们的含义吗?具体可以看一下我在维基中写的开发流程。

1800张就大量重复?我都是以万为单位来下载的。

busyyang commented 4 years ago

wiki我已经看了,大概了解思路。数据集的含义大致是理解的,但是我不太清楚,如何将图片的正确标签给他对应上的代码实现...... 具体实现,还没有细看,我先把验证码图片下载,并用百度OCR识别出来再继续吧,谢谢。 下载代码右跑了一会儿,现在有3700张左右,看下一晚上能下载多少。做个多进程去请求图片会不会要快一些。 另外,this is an amazing work. Thanks for sharing.

zhaipro commented 4 years ago

作为交换,我的问题是:

  1. 百度文字识别结果的正确率约为55%,感觉有点低,其原因是不是我剪切文字的区域有点偏?可以参照下图重新定义文字区域
busyyang commented 4 years ago

我觉得是的,wiki里面的图片,有的明显分割的位置偏了,没有把需要选择2类的分割开。

zhaipro commented 4 years ago

还有第5行第2列的锣,部首出界了,哈!

busyyang commented 4 years ago

接着上次的聊啊,我下载了8000多张验证码图片,现在我知道用pretreatement.py可以得到一个data.npz文件,包含了labels和img的phash值。然后我也用baidu.py进行了识别了,然后你将百度识别的前80种类的图片做了一个texts.npz文件了是吧?但是我看baidu.py识别时候,仅仅把识别的文字写到了text.log里面,并没有将源文件名对应起来,这样,后面你在做texts.npz时候,又去识别了一遍?还是,就通过os.listdir的顺序来对应文件与label的?

zhaipro commented 4 years ago

我是调用了百度,并做了统计之后才知道验证码一共只有80种,所以我在开发的过程中,不可能在调用百度识别的同时进行筛选。

回答你的问题,data.npz中文字数组的顺序与text.log的顺序是一一对应的。

zhaipro commented 4 years ago

我刻意保留了这个弯路,不知道大家怎么看。

busyyang commented 4 years ago

确实,只有在识别完成统计后才能知道有多少类。我之前没想明白你怎么把识别结果和识别图片一一对应的,既然可以通过顺序还完成。我之前想着,识别结果用字典来保存,key为文件名,value为识别结果,但是我好像是多虑了。另外,不知道是不是新的下载验证码图片的接口有问题,我都用IP代理开多线程下了,还是只下到8100多张,百度OCR识别正确只有4800张左右,导致了我80分类的正确标签都有问题......

zhaipro commented 4 years ago

嗨嗨,我统计百度的识别结果也有类似的问题(虽然我用了两万张),所以排序只是辅助,最后还是做了人工筛选。

busyyang commented 4 years ago

我好像找到为什么我只下到8100多张图片了,我之前用的https://kyfw.12306.cn/passport/captcha/captcha-image64都只有让选择一个类别的,而https://kyfw.12306.cn/passport/captcha/captcha-image就看到好多选择两个类别的了,这样组合起来,能得到的图片就多了。这样看来,并不是图片分割有问题,而是百度OCR识别,的确只有55%左右的准确率。

zhaipro commented 4 years ago

最近我服务端收到了4万张验证码,哈哈。

busyyang commented 4 years ago

能分享一下吗?可以的话,打包个网盘或者我留个邮箱给你吧

zhaipro commented 4 years ago

别急,后面还有很多脏活累活等着你呢。

busyyang commented 4 years ago

标签的文字识别差不多搞定了,我的图片主要是口哨识别不正确,其他类别问题不大。 现在开始搞图片那部分,由于不是图像处理背景的,我看你其实处理方式,是把相似图片处理成为相同的whash的做法是吗?运行category_images.py得到的是images.npz,这里面保存的是whash转化为uint64的值,print(f['images'])得到的是(10038,),但是训练网络时候captcha.npz是原图片(None,67,67,3)的数据维度,这个中间,是不是还用whash与原图片的对应,找到了原图片数据,然后和label一起保存到的captcha.npz的?

zhaipro commented 4 years ago

差不多,只是我开发时最终用的是phash。

busyyang commented 4 years ago

我自己生成的captcha.npz文件去训练网络,发现只有70%左右的准确率.......看来我下载的数据可能有些问题。

zhaipro commented 4 years ago

哈,完整跑通啦?!我至少投入了两个月的时间呢。

busyyang commented 4 years ago

为了回复,又reopen了,跑通是跑通了,其实,你的代码也就是生成captcha.npz的代码没有,实现了就能跑通。不过,我这准确率的确是不够高,感觉是个人工智障,不知道是不是实现有问题,但是没发现有什么问题(可能是数据集少的原因,我把图片按照分类保存下来,感觉我的统计学专家才初中毕业......)。我主要还是站在你两个月开发的基础上的。。。。。。再次感谢你的分享。让程序自己给数据打标签的想法十分巧妙。