8 votes

Est-il possible de faire fonctionner Kinect V2 dans un conteneur Docker ?

J'étudie la faisabilité d'un programme de gestuelle visuelle Kinect en C#. (quelque chose comme le projet Continuous Gesture Basics https://github.com/angelaHillier/ContinuousGestureBasics-WPF) à l'intérieur d'un Docker pour les conteneurs Windows.

  1. Est-ce que c'est théoriquement possible (exécuter C# Kinect dans un conteneur Docker pour Windows) ?

  2. Si la réponse à la question 1 est oui, voici quelques détails supplémentaires :

J'utilise l'image microsoft/dotnet-framework:4.7 comme base et mon fichier Docker initial ressemble à ceci :

FROM microsoft/dotnet-framework:4.7
ADD . /home/gesture
WORKDIR /home/gesture

Construire l'image :

$ docker build -t kinect .

Allumer le conteneur :

$ docker run -dit --name kinectContainer kinect

S'attacher à une session powershell pour faire le tour de la question :

$ docker exec -it kinectContainer powershell

Lorsque j'essaie d'exécuter mon application gestuelle à partir du conteneur Docker, j'obtiens l'erreur suivante (ce qui est normal puisqu'aucun SDK Kinect n'a été installé dans le conteneur) :

Unhandled Exception: System.BadImageFormatException: Could not load file or assembly 'Microsoft.Kinect, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependenc
ies. Reference assemblies should not be loaded for execution.  They can only be loaded in the Reflection-only loader context. (Exception from HRESULT: 0x80131058) ---> System.BadImageFormatExcep
tion: Cannot load a reference assembly for execution.                                           erable program. Check the spelling of the name, or if a path was included, verify that the path
   --- End of inner exception stack trace ---
   at GestureDetector.GestureDetectorApp..ctor()

À ce stade, la grande question est de savoir comment installer le Kinect v2 SDK [KinectSDK-v2.0_1409-Setup.exe] ou le Kinect v2 runtime [KinectRuntime-v2.0_1409-Setup.exe] dans le conteneur.

Les programmes d'installation sont assortis d'un CLUF et, d'après des personnes intelligentes de l'Université du Wisconsin Il existe une technique pour extraire les installateurs en utilisant le décompilateur dark.exe de Wix ( https://social.msdn.microsoft.com/Forums/en-US/a5b04520-e437-48e3-ba22-e2cdb46b4d62/silent-install-installation-instructions?forum=kinectsdk )

ex.

$ & 'C:\Program Files (x86)\WiX Toolset v3.11\bin\dark.exe' C:\installerwork\KinectRuntime-v2.0_1409-Setup.exe -x c:\installerwork\kinect_sdk_installersfiles

Le problème que j'ai rencontré lorsque je suis arrivé aux fichiers msi sous-jacents est qu'il n'y a pas d'option pour les exécuter silencieusement à l'aide de msiexec.

J'ai compris que l'installateur du runtime (Runtime installer (KinectRuntime-x64.msi) extrait du Kinect v2 SDK) effectue au moins les changements suivants dans le système de fichiers :

Crée un dossier "Kinect" dans C:\Windows\System32 et ajoute 3 fichiers au système 32 :

k4wcll.dll

kinect20.dll

microsoft._kinect.dll

Les trois derniers fichiers dans System32 devraient être les versions 64 bits (le programme d'installation semble avoir des versions x86 et x64 de ces trois fichiers).

Répliquer ces changements à la main ne mène pas au succès sur la machine hôte, et encore moins dans le conteneur.

Il n'est actuellement pas clair quels autres changements de registre/système se produisent avec l'installateur (et si oui ou non cela nous permettrait de franchir la ligne d'arrivée dans le conteneur Docker).

Des idées sur la façon de procéder à partir de là ?

1voto

Martin Barker Points 1325

En bref, non. docker sur Windows n'a pas la capacité de faire du hardware tunnel/map. sur Linux, il le fait via l'option --device= option

Comme @VonC l'a indiqué, vous devrez utiliser une VM Windows, que ce soit Hyper-V ou Virtual Box, puis vous pourrez fournir le matériel Kinect via la méthode du tunnel (périphérique d'ajout/connexion), sans quoi votre conteneur, qu'il s'agisse d'une VM ou non, n'aurait aucun moyen d'accéder au matériel de la machine hôte avec Windows.

0voto

VonC Points 414372

Une autre approche consisterait à essayer d'installer Kinetic dans une VM de serveur Windows, et de détecter les changements exacts apportés par cette installation.

Voir par exemple " Comment puis-je savoir quelles sont les modifications apportées par le programme d'installation d'un logiciel ? "et un outil comme ZSoft Uninstaller 2.5 .

Une fois que vous avez déterminé exactement quels fichiers/registres/variables sont impactés par le processus d'installation, vous pouvez les répliquer dans un fichier Docker.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X