yolo with recognition pattern learning and c++ opencv machine-learning neural-network pattern-recognition

c++ - with - Cómo buscar modelos de jugador en COD con OpenCV



pattern recognition opencv (4)

Estoy intentando crear un programa que pueda encontrar figuras humanas en el video del juego del deber. He compilado una lista de ~ 2200 imágenes separadas de este video que contienen una figura humana o no. Luego intenté entrenar una red neuronal para diferenciar los dos conjuntos de imágenes.

Luego, divido cada fotograma de video en un par de cientos de rectángulos y miro cada uno con mi ANN. Los rectángulos se superponen para intentar capturar figuras que se encuentran entre las rectas de la cuadrícula, pero esto no parece funcionar bien. Entonces tengo algunas preguntas:

  1. ¿Las redes neuronales son el camino a seguir? He leído que son muy rápidos en comparación con otros algoritmos de aprendizaje automático, y eventualmente planeo usar esto con video en tiempo real y la velocidad es muy importante.

  2. ¿Cuál es la mejor manera de buscar las figuras en el marco de la imagen para probar en la ANN? Siento que la forma en que lo hago no es muy buena. Definitivamente no es muy rápido o preciso. Toma alrededor de un segundo por cuadro de una imagen de 960 x 540 y tiene poca precisión.

  3. Otro problema que he tenido es la mejor forma de construir el vector de características para usar como entrada para la ANN. Actualmente, simplemente escalo todas las imágenes de entrada hasta 25 x 50 píxeles y creo un vector de características que contiene la intensidad de cada píxel. Este es un vector muy grande (1250 flotantes). ¿Cuáles son las mejores formas de construir un vector de características?

Para una explicación más detallada de lo que hago aquí: CodAI: Computer Vision

EDITAR: Me gustaría un poco más de detalle. Cuál es la mejor manera de calcular las características. Necesito poder reconocer una figura humana en muchas posiciones diferentes. ¿Necesito crear clasificadores separados para reconocer la diferencia entre vertical, agachado y propenso?


Las mejores características convencen a mejores algoritmos de aprendizaje. El principio básico en la selección de características es que las mejores características maximizan la varianza interclase y minimizan la varianza intraclase. En su caso, las características deben enfatizar la diferencia entre las imágenes que contienen una figura humana y las imágenes que no, y resta importancia a las diferencias entre las imágenes de la misma clase.

Por ejemplo, podría intentar encontrar el contorno de la figura humana y calcular las características en función del contorno. OpenCV ya tiene algunas funciones para calcular las características de los contornos: Moments , GetCentralMoment , NormalizedCentralMoment , etc. La pregunta entonces sería: ¿cómo segmentar las figuras humanas del fondo para que se pueda encontrar su contorno? Hay varias maneras de abordar este problema, como mediante el uso de la segmentación de textura.

Una vez que puede resolver el problema de segmentación y calcular las características razonables, la elección del algoritmo de aprendizaje no es tan importante. ¿Pero por qué no probar varios y ver qué funciona mejor? Eche un vistazo a la sección Aprendizaje automático en los documentos de OpenCV.


Este problema es demasiado difícil para una ANN normal.

Las RNA no son muy adecuadas para imágenes con muchas transformaciones espaciales (es decir, figuras humanas en diferentes posiciones). De hecho, necesitan aprender cada posición posible de forma independiente, ya que no pueden generalizar bien sobre las traducciones, rotaciones y escalas, etc. Incluso si lograron hacerlo funcionar, probablemente necesitarían miles de millones de imágenes de entrenamiento y años de entrenamiento.

Tu mejor opción es, probablemente, ir con:


No es muy claro para mí lo que estás tratando de lograr, pero parece que estás tratando de hacer un seguimiento de jugadores en tiempo real (o algo similar) usando el enfoque equivocado. El seguimiento humano es algo que uno esperaría que se hiciera a través del procesamiento digital de imágenes / video de imágenes de seres humanos reales .

Dependiendo de su propósito, el seguimiento de jugadores es algo que no debe hacerse a través del procesamiento de imágenes, ya que puede ser muy exigente con la CPU. El seguimiento de modelos de jugador dentro de un juego es una práctica generalmente utilizada para aplicaciones de trampas, y requiere uno para inyectar código en el proceso del juego, o ser el intermediario entre el motor del juego y el controlador de gráficos. Dado que el cliente del juego siempre sabe dónde están los otros jugadores (incluso si no puede verlos), se puede buscar en la memoria del proceso las coordenadas X, Y, Z de los jugadores o interceptar llamadas de gráficos que buscan la ubicación donde un jugador el modelo se representará en la pantalla (lo que puede ser un poco complicado, ya que requiere una comprensión básica de OpenGL / DirectX y habilidades de depuración).

No estoy seguro si está bien detallar tales técnicas en , pero diré que este tema ha sido ampliamente discutido en varios foros de ingeniería inversa / trampa como GameDeception .


  • Usar las intensidades crudas como el vector de características no va a funcionar 1 . Hay demasiada variación inducida por la iluminación, etc.
  • Una buena característica para mirar como un primer paso sería HOG. opencv 2.2 tiene una versión GPU (cuda) de un detector que es rápido.
  • Las redes neuronales tal vez no sean la mejor manera de hacerlo. Usualmente usarías un SVM o impulsarías como un clasificador 2 . No es que las redes neuronales no sean lo suficientemente poderosas, es que es difícil conseguir el entrenamiento / parámetros correctos. Demasiado a menudo te quedas atascado en los mínimos locales, etc.
  • Para figuras propensas / agachadas / de pie, definitivamente quieres diferentes clasificadores y emplearlos en un modelo mixto.
  • Usted pidió la "mejor manera": la detección humana no es, con mucho, un problema resuelto, por lo que nadie sabe cuál es la mejor manera. Las cosas mencionadas anteriormente funcionan bien.
  • Si quieres un buen resultado, definitivamente quieres explotar que tu objetivo es específico, por lo tanto, explota que estás tratando de detectar humanos en cumplimiento del deber. El rango de posiciones que debe verificar no es la imagen completa, las figuras estarán cerca del piso. Esto le permite acelerar la búsqueda y reducir las detecciones falsas. Si puede, reduzca los detalles en el renderizado; menos detalles significan menos variación, lo que significa un problema de aprendizaje más fácil.

Notas al pie:
1 Para los nitpickers: sin un clasificador altamente complejo.
2 También puede emplear una cascada de clasificadores potenciados para ganar velocidad sin revelar demasiado la tasa de detección.