识别《冰与火》第一部的英语卡片 Part 4

第四步:测试部分英语卡片识别,精确识别错误单词并跟新所有列表

在第三步中我们找到了所有需要精确识别的单词绝对路径列表listaccurate.pkl,并从sumwords.pkl, wordsroot.pkl删除了错误单词的信息。现在,我们把重新识别的正确单词加入sumwords, wordsroot列表中。

第三步最后运行后删除的错误单词和路径,然后重新识别。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
from aip import AipOcr
import os
import pickle
import sys

#百度图片识别得到每张图片的单词
def getwords(picroot):
APP_ID = '17896643'
API_KEY = 'V9MVA6nuN4h7nGPMaTWAGimE'
SECRET_KEY = 'OvTTuUWB1XXcWoh7kQ8OWDUAObvFReA5'
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
with open(picroot, 'rb') as fp:
image = fp.read()
wordsinfo = client.basicAccurate(image)
wordsineed = wordsinfo['words_result']
englishwords = wordsineed[0]['words']
return englishwords


#主程序
quantity = 0 #用于计算单词出现的次数

try:
with open('E:\ICE AND FIRE\listaccurate.pkl', 'rb') as f1:
listaccurate = pickle.load(f1) #导出需要精确识别的卡片绝对路径
except:
print('listaccurate.pkl文件不存在.')
sys.exit()

try:
with open('E:\ICE AND FIRE\sumwords.pkl', 'rb') as fa: #导出sumword的字典
sumwords = pickle.load(fa)
except:
print('sumwords.pkl文件不存在.')
sys.exit()

try:
with open('E:\ICE AND FIRE\wordsroot.pkl', 'rb') as fb: #导出wordsroot的字典
wordsroot = pickle.load(fb)
except:
print('wordsroot.pkl文件不存在.')
sys.exit()


for i in listaccurate:
print('需要精确识别的路径:%s' % i)
if i not in wordsroot: #如果这个单词的路径(字典的键)还没有被统计过,注意这个字典的键是路径,键值是单词
print('再次判断路径%s已经从wordsroot中删除, 并需要重新识别。' % i)
words = getwords(i) #找到单词
print('重新识别的单词为:%s' % words)
wordsroot[i] = words #再计入统计文件的字典
quantity += 1 #开始计算统计的单词的总个数
sumwords.setdefault(words, 0)#设置未出现的单词出现次数的初始值是0,如果已经出现过后面再赋值
sumwords[words] +=1 #不管是否出现过都增加一
if quantity%20 == 0: #为了防止网络中断等问题,只要统计到整二十的个数,就开始写入文件。
with open('E:\ICE AND FIRE\sumwords.pkl', 'wb') as f:
pickle.dump(sumwords, f)
with open('E:\ICE AND FIRE\wordsroot.pkl', 'wb') as f2:
pickle.dump(wordsroot, f2)

print('Finished')
listsort = sorted(sumwords.items(), key=lambda x:x[1], reverse=True) #把sumwords列表排序
listsorted = [i for i in listsort if i[1]>=1] #运用列表解析式找到出现过四次及以上次数的单词
print(listsorted)

运行结果:

可以看出我们重新识别的正确单词,并更新的列表。到此为止,我们已经做完了所有测试工作,然后我们需要正式运行这个程序了。

未完待续。。。。