Предыдущая статья — Распознавание образов на Python: Часть IX — базовое тестирование.
Теперь давайте попробуем визуализировать наши результаты. Мы рассмотрим еще несколько примеров, а затем поговорим о некоторых идеях для продвижения вперед.
Вот полный код нашей серии, модифицированный для использования в нем библиотеки matplotlib:
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import time
from collections import Counter
from matplotlib import style
style.use("ggplot")
def createExamples():
numberArrayExamples = open('numArEx.txt','a')
numbersWeHave = range(1,10)
for eachNum in numbersWeHave:
for furtherNum in numbersWeHave:
imgFilePath = 'images/numbers/'+str(eachNum)+'.'+str(furtherNum)+'.png'
ei = Image.open(imgFilePath)
eiar = np.array(ei)
eiarl = str(eiar.tolist())
lineToWrite = str(eachNum)+'::'+eiarl+'\n'
numberArrayExamples.write(lineToWrite)
def threshold(imageArray):
balanceAr = []
newAr = imageArray
for eachPart in imageArray:
for theParts in eachPart:
# for the reduce(lambda x, y: x + y, theParts[:3]) / len(theParts[:3])
# in Python 3, just use: from statistics import mean
# then do avgNum = mean(theParts[:3])
avgNum = reduce(lambda x, y: x + y, theParts[:3]) / len(theParts[:3])
balanceAr.append(avgNum)
balance = reduce(lambda x, y: x + y, balanceAr) / len(balanceAr)
for eachRow in newAr:
for eachPix in eachRow:
if reduce(lambda x, y: x + y, eachPix[:3]) / len(eachPix[:3]) > balance:
eachPix[0] = 255
eachPix[1] = 255
eachPix[2] = 255
eachPix[3] = 255
else:
eachPix[0] = 0
eachPix[1] = 0
eachPix[2] = 0
eachPix[3] = 255
return newAr
def whatNumIsThis(filePath):
matchedAr = []
loadExamps = open('numArEx.txt','r').read()
loadExamps = loadExamps.split('\n')
i = Image.open(filePath)
iar = np.array(i)
iarl = iar.tolist()
inQuestion = str(iarl)
for eachExample in loadExamps:
try:
splitEx = eachExample.split('::')
currentNum = splitEx[0]
currentAr = splitEx[1]
eachPixEx = currentAr.split('],')
eachPixInQ = inQuestion.split('],')
x = 0
while x < len(eachPixEx):
if eachPixEx[x] == eachPixInQ[x]:
matchedAr.append(int(currentNum))
x+=1
except Exception as e:
print(str(e))
x = Counter(matchedAr)
print(x)
graphX = []
graphY = []
ylimi = 0
for eachThing in x:
graphX.append(eachThing)
graphY.append(x[eachThing])
ylimi = x[eachThing]
fig = plt.figure()
ax1 = plt.subplot2grid((4,4),(0,0), rowspan=1, colspan=4)
ax2 = plt.subplot2grid((4,4),(1,0), rowspan=3,colspan=4)
ax1.imshow(iar)
ax2.bar(graphX,graphY,align='center')
plt.ylim(400)
xloc = plt.MaxNLocator(12)
ax2.xaxis.set_major_locator(xloc)
plt.show()
whatNumIsThis('images/test.png')


Советуем вам открыть какой-нибудь графический редактор, Paint например, или что-то в этом духе, создать в нем квадрат 8 Х 8, а внутри него нарисовать какую-нибудь цифру. Конечно, можно было бы взять ее из обучающей выборки, но это было бы методологически неправильно.
Нарисовав цифру, подвигайте ее в разные стороны.
Вы должны преуспеть, хотя очевидно, что может возникнуть и много проблем. До сих пор мы нормализовали изображения, размер которых был строго 8 Х 8. А так везти будет не всегда, и очевидно, что вам еще и придется менять размер. Толщина линий у нас также всегда была довольно стандартной.
Основная цель данной серии статей состоит в том, чтобы показать, что распознавание образов представляет собой весьма сложную задачу, но ее всегда можно разбить на подзадачи и таким образом решить при помощи простого и понятного кода. Надеемся, что вам все понравилось.
Перевод статьи «Testing, visualization, and moving forward».

Пингбэк: Распознавание образов на Python. Часть IX – базовое тестирование - pythonturbo