Cómo diseñar un buen tipo de modelo de bolsa de palabras
Vea algunos modelos de bolsa de palabras que escribí en el pasado, como la práctica de Python de recuperación de imágenes de BoW y la recuperación de imágenes (CBIR). Tres mosqueteros BoF, VLAD, FV y la implementación de cpp de bolsa de palabras, estas cosas escritas son solo para ayudarlo a comprender las teorías relevantes del modelo de bolsa de palabras, o solo para ayudarlo a comprender las teorías relevantes del modelo de bolsa de palabras, o son solo verificación experimental, o más Para decirlo sin rodeos, son solo juguetes pequeños.
En mi lista de planes para 2016, hay un objetivo que se ha pospuesto desde 2015, que es escribir un modelo de bolsa de palabras orientado a los negocios. Con el éxito de la interfaz c de VLfeat, este objetivo se ha cumplido. convertirse Quizás, en los últimos seis meses, he estado prestando atención a qué bibliotecas son más adecuadas para escritura específica. Casualmente, durante este período comenzamos a reinventar la rueda nuevamente y logramos resultados iniciales, así que lo resumiré aquí. Antes de hablar sobre cómo diseñar un modelo de bolsa de palabras de tipo clase, hablemos primero de la selección de la biblioteca.
Elija la biblioteca adecuada
Al escribir específicamente un modelo de bolsa de palabras orientado a aplicaciones, probablemente seguirá los siguientes pasos: extracción de características SIFT, muestreo de características, agrupación, y construir un árbol KD, contar la frecuencia de palabras, calcular el peso de la frecuencia de palabras, calcular el histograma de frecuencia de palabras y guardar datos. Durante la implementación específica de estos ocho pasos, se diseñarán algunos problemas de selección de bibliotecas, que se analizarán en detalle a continuación.
1) ¿Qué biblioteca elegir para la extracción de funciones SIFT?
Existen muchas bibliotecas utilizadas para la extracción SIFT, y las más utilizadas son las siguientes:
Lowe's SIFT, el efecto es que solo proporciona archivos ejecutables binarios de SIFT, por lo que abandone
OpenSIFT de Robwhess, de código abierto, funciona bien, pero necesita depender de otras bibliotecas y ya no se actualizará, así que abandone
OpenSIFT de OpenCV; fuente, funciona bien, pero necesita otras bibliotecas dependientes ya no se actualizarán, así que abandone
SIFT de OpenCV es, por supuesto, el más conveniente de usar, tiene documentación completa y no depende de otros. bibliotecas, pero la implementación de SIFT no es muy buena, así que ríndete;
p>
SIFT en VLfeat, la implementación de SIFT es mejor. La desventaja es que la documentación de la interfaz C es. No es muy completo y hay relativamente poca información disponible en línea. Sin embargo, se puede hacer leyendo más código fuente en lenguaje C. Todavía se puede hacer y no es necesario depender de otras bibliotecas en esta biblioteca, por lo que es bueno elegir esta biblioteca para extraer SIFT. En la extracción real, elegí la función covdet para extraer SIFT, que es relativamente. Potente extractor de características de covariación.
El año pasado, básicamente descubrí las llamadas de la interfaz C de algunas funciones en VLfeat. Al leer la interfaz de la función covdet, convertí el código fuente escrito por matlab al lenguaje C y lo comparé con matlab. extraído. El resultado es completamente consistente con el resultado extraído después de convertirlo al lenguaje C.
2) Selección de la biblioteca de operaciones matriciales
Aunque la operación matricial no es necesaria, además de la matriz de OpenCV, es posible introducir otras bibliotecas de operaciones matriciales. La introducción de estas matrices lo hará. Aporta una gran comodidad a implementaciones posteriores, como agrupación en clústeres, construcción de árboles KD y estadísticas de frecuencia de palabras posteriores. Como biblioteca aritmética básica, en términos de selección de bibliotecas de matrices, las siguientes son las más utilizadas:
Al usarla, solo necesita incluir el archivo de encabezado en el proyecto. Variedad de plataformas, por ejemplo, se puede ejecutar en Android. Las operaciones de Matrix son relativamente fáciles de operar y las actualizaciones son relativamente rápidas. Sin embargo, la plataforma de desarrollo que aparece a continuación prefiero usar Armadillo. Esta biblioteca de matriz se basa en los hábitos de sintaxis de Matlabjie en el uso de la sintaxis, por lo que los desarrolladores que estén familiarizados con Matlab se sentirán muy cómodos al usar esta biblioteca, y el famoso MLPack se basa en ella. Además, su eficiencia de operación matricial también es muy alta. Al usarlo, solo necesita incluir el directorio del archivo de encabezado como Eigen para agregarlo a la última versión de la agrupación en clústeres de KMeans.
Por lo tanto, basándose en estas ventajas, la elección de la biblioteca de matrices es sin duda óptima al implementar el modelo de bolsa de palabras.
La elección de la biblioteca de matrices puede facilitar enormemente la escritura de nuestros programas, pero implicará la conversión de tipos de datos, como la conversión de datos almacenados en vectores STL a operaciones matriciales de Armadillo. Si los tipos de datos se convierten con frecuencia, esto. inevitablemente Reducirá la eficiencia del programa, por lo que al escribir el programa, se deben evitar en la medida de lo posible conversiones innecesarias.
3) Procesamiento paralelo multiproceso
Para admitir el procesamiento paralelo de la extracción de funciones SIFT del programa, la agrupación de KMeans, la frecuencia estadística de palabras y otros procesos, existen dos opciones para seleccionar una biblioteca de computación paralela Hay dos opciones, una es usar OpenMP y la otra es elegir MPI. OpenMP utiliza memoria compartida y se puede paralelizar con sólo pequeños ajustes al programa original. OpenMP usa memoria y solo necesita realizar pequeños ajustes en el programa original para lograr un procesamiento paralelo, y la sintaxis es fácil de leer y escribir. MPI requiere una reconstrucción sustancial del programa original para que el código escrito sea más legible. No es fuerte. Por lo tanto, al elegir una biblioteca de computación paralela multiproceso, es mejor elegir OpenMP.
Modelo de bolsa de diseño de tipo de clase
Finalmente, podemos hablar de la parte central. Esta parte es una pequeña idea del diseño de tipo de clase del modelo de bolsa del programa escrito por nosotros mismos. Primero, escribí mi propio tipo de clase de modelo de bolsa de palabras y diseñé dos clases, una es el tipo de clase de extracción de características SIFT y la otra es el tipo de clase de modelo de bolsa de palabras. Primero hablemos del tipo de clase de extracción de características SIFT:
class siftDesctor{
public:
siftDesctor(){};
std ::string imageName;
std::vector
std::vector