Hay muchas formas de implementar la palabra reciente. Utilizo la fórmula de distancia de la geometría euclidiana.
La fórmula de la distancia entre dos puntos x (x1, y1) e y (x2, y2) en dos dimensiones es sqrt((x 1-x2)2 (y 1-y2)2).
Extendido a n dimensiones.
x(x1,x2,…,xn),y(y1,y2,…,yn)
sqrt [ ∑( x[i] - y[i] )^ 2 ] (i=1, 2, ..., n)
El algoritmo Knn calcula la distancia, es decir, la operación entre números. Las imágenes están en formato png y jpg, no números. y no puede participar directamente en la operación, por lo que necesitamos realizar la conversión.
Como se muestra en la imagen, hay un número 8. Lo primero que debo asegurar es que lo que hago en este paso es la transformación más simple, porque asumo que no hay residuos entre el fondo y el gráfico, y que todo el gráfico tiene un solo número (0-9). Si hay otras situaciones, como un color de fondo impuro u otras interferencias en la imagen, es necesario rediseñar la función de transformación.
El siguiente paso es la transformación más simple, cambiando la parte blanca de la imagen (fondo) a 0, y la parte con la imagen a 1. El tamaño convertido debe ser apropiado. Si es demasiado pequeño, afectará la precisión del reconocimiento. Si es demasiado grande, aumentará la cantidad de cálculo. Entonces utilicé 32 * 32 en el libro y el resultado convertido es como se muestra en la figura.
De esta forma, la imagen se convierte en un número calculable.
A continuación, necesitamos crear una biblioteca que contenga varios ejemplos de los números del 0 al 9 similares al que se muestra arriba. Debido a que necesitamos comparar las imágenes para ser reconocidas, seleccionamos los k objetos más cercanos y los objetos de comparación son nuestra biblioteca. Supongamos que hay diez números del 0 al 9 en la biblioteca, y cada número tiene 100 instancias representadas por 0 y 1, entonces tenemos un máximo de 1000 instancias.
El último paso es la comparación. Usando la fórmula de cálculo de distancia geométrica euclidiana mencionada al principio, primero debemos convertir esta matriz cuadrada de 32 * 32 en una representación de coordenadas de 1 * 1024 dimensiones. Luego, calcule la distancia entre la imagen que se va a reconocer y las 1000 muestras en la biblioteca, y seleccione las k muestras más cercanas. Por ejemplo, 50, la probabilidad del número resultante se divide por 50. Por ejemplo, si el número 8 aparece 40 de 50 veces, entonces la probabilidad de que el número a reconocer sea 8 es 40/50 = 80.
Comprensión personal:
Solo se puede reconocer un número y no se puede interferir con el fondo. Si desea reconocer varios números o el fondo está alterado, debe considerar el método específico para convertir la imagen a 01 según la situación específica.
El reconocimiento de números depende en gran medida de las imágenes de la biblioteca, y la apariencia de las imágenes de la biblioteca afecta seriamente el reconocimiento de imágenes (porque comparamos con las imágenes de la biblioteca para encontrar la k superior más cercana), por lo que el número (grosor, altura, gordura, etc.) son factores decisivos, y la posible apariencia de los números debe considerarse completamente al construir la base de datos.
La cantidad de cálculo es relativamente grande y las imágenes a reconocer deben calcularse una por una utilizando todos los ejemplos de la biblioteca. Si usa 32*32, ya tiene 1024 dimensiones. Si hay 1000 en la biblioteca, son 1000 cálculos entre vectores de 1024 dimensiones. La imagen es más clara y una biblioteca más rica sólo hace que los cálculos sean más complejos.
Para otros problemas numéricos que puedan calcular la distancia directamente, puedes usar la distancia euclidiana u otras fórmulas que puedan expresar la distancia. Para problemas no numéricos, se requiere una transformación adecuada y el método de transformación es muy importante. Creo que, en primer lugar, la información no debe perderse y, en segundo lugar, debe ser precisa y no vaga. Es necesario lograr una correspondencia uno a uno entre el antes y el después de la transformación de la imagen.
Materiales de referencia:
Aprendizaje automático en la práctica [EE. UU.] Peter Harrington People's Posts and Telecommunications Press
Código fuente de Python
Cantidad de importación
Importar sistema operativo
Importar imagen desde PIL
Importar heapq
Importar contador desde colección
def pictureconvert (nombre de archivo1, nombre de archivo2, tamaño = (32,32)):
#nombre de archivo1 imagen a reconocer, nombre de archivo2 imagen a reconocer se convierten en salida de archivo 01txt, el tamaño de imagen predeterminado es 32* 32.
archivo_imagen = Imagen.open(nombre de archivo 1)
archivo_imagen = archivo_imagen cambiar tamaño(tamaño)
ancho, alto = archivo_imagen.tamaño.
f1 = open(filename1,'r')
f2 =open(filename2,'w')
Para I en el rango (alto):
Para j (ancho) en el rango:
pixel = image_file.getpixel((j,I))
Pixel = pixel[ 0] pixel[1] píxel[2]
if(píxel == 0):
píxel = 0
elif(píxel ! = 765 y píxel ! = 0):
Píxeles = 1
# 0 representa negro (sin imagen), 255 representa blanco (con imagen).
# 0/255 = 0, 255/255 = 1
f2.write(str(pixel))
if(j == ancho-1 ):
f2.write('\n ')
f1.close()
f2.close()
Definición Vector de imagen (nombre de archivo):
#filename Convierte el archivo de texto 01 de la imagen a reconocer en un vector.
vector = numpy.zeros((1, 1024), numpy.int)
Utilice open(filename) como f:
Para el rango I(0.32 ):
linestr = f.readline()
Para j en el rango (0, 32):
vector[0, 32* i j] = int(linestr[j])
¿Regresión? Vector
def compare(filename1, filename2):
#compare lee el ID del repositorio directamente.
#filename1 directorio de la biblioteca de recursos, filename2 ruta del documento de texto de la imagen 01 que se reconocerá.
trainingfilelist = os.listdir(nombre de archivo 1)
m = len(lista de archivos de entrenamiento)
labelvector = []
Trainingmatrix = numpy.zeros((m, 1024), numpy.int8)
Para I en el rango (0, m):
filenamestr = lista de archivos de entrenamiento[I] p> p>
filestr = filenamestr.split(' . ')[0]
número de clase = int(filestr . split(' _ ')[0])
labelvector .append(número de clase)
matriz de entrenamiento[i, := img vector(nombre de archivo 1 '/' filenamestr)
textvector = imgvector(nombre de archivo 2)
distancia de resultado = numpy ceros((1, m))
Resultado = []
Para I en el rango (0, m):
Distancia de resultado[0, i] = numpy.vdot(vector de texto[0], matriz de entrenamiento[i])
índices de resultado = heapq .más grande(50, rango(0, len(distancia de resultado[0])) , resultdistance[0].shoot)
Para I en el índice de resultados:
result.append(labelvector[i])
número = contador(resultado) . El más común (1)
Print('Este número es', número[0][0], la probabilidad de 'es',' .2f'((número[0][1]/ len( Resultado))* 100))
def distinguible(nombre de archivo1, nombre de archivo2, nombre de archivo3, tamaño=(32, 32)):
# nombre de archivo1 png, jpg Espere el original ruta de la imagen, nombre de archivo2 la imagen original se convierte en 01 ruta de archivo de texto, ruta de la biblioteca de recursos nombre de archivo3.
convertir imagen(nombre de archivo1,nombre de archivo2,tamaño)
Comparar(nombre de archivo3,nombre de archivo2)
URL 1 = "/Usuarios/Wang/Escritorio/número . png "
URL 2 = "/Users/Wang/Desktop/number . txt "
biblioteca de capacitación = "/Users/Wang/Documentos/dígitos de capacitación "
Distinguir (url1, url2, biblioteca de formación)