Écrit par

Solution Architect at Zorgi
Article Lorenzo Scalese · Août 10, 2022 11m read

Détection d'objets à l'aide d'Embedded Python et IRIS

Depuis IRIS 2021.2, il est possible d'écrire des Méthodes de classe en utilisant le langage Python. J'ai utilisé cette nouvelle fonctionnalité pour détecter des personnes et des objets dans des images, en utilisant ImageAI. Le créateur d'ImageAI la définit comme suit : "Une bibliothèque python open-source construite pour permettre aux développeurs de créer des applications et des systèmes avec des capacités autonomes de Deep Learning et de vision par ordinateur en utilisant des lignes de code simples et peu nombreuses." Dans cet article, vous apprendrez comment appliquer la Vision par ordinateur de l'IA pour détecter des objets et des personnes à l'intérieur d'images.

Étapes de l'analyse des images à l'aide d'ImageAI

  1. Cliquez sur https://openexchange.intersystems.com/package/AI-Image-Object-Detector et sur le bouton Télécharger (Download) pour accéder au projet Git.
  2. Clone/git tire le référentiel dans n'importe quel répertoire local
$ git clone https://github.com/yurimarx/image-analyzer.git
  1. Ouvrez un terminal Docker dans ce répertoire et exécutez :
$ docker-compose build
  1. Lancez le conteneur IRIS :
$ docker-compose up -d
  1. Connectez-vous à votre Postman (ou autre client REST similaire) et configurez la requête conformément à cette image :

Request Image Analysis input

  • Méthode : POST
  • URL: http://localhost:52773/image-analyzer/analyzeImage
  • Corps : données du formulaire "form-data"
  • Clé : fichier (le nom du champ fichier doit être fichier) et type Fichier
  • Valeur : sélectionnez une image avec des personnes et/ou des objets sur votre ordinateur
  1. Cliquez sur "envoyer" (send) et obtenez une réponse avec les objets détectés comme suit :

Request Image Analysis output

Les coulisses - le code source

Le fichier Dockerfile

Il s'agit d'une étape d'importation. Pour utiliser les bibliothèques python, vous devez les installer au préalable, mais vous devez faire attention à les installer dans le dossier IRIS Python correct (/usr/irissys/mgr/python) :

 
Dockerfile
FROMintersystemsdc/iris-community
 
      <div>
        <span style="color: #c586c0;">USER</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">root</span>
      </div>  

      <div>
        <span style="color: #c586c0;">ENV</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">DEBIAN_FRONTEND</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">noninteractive</span>
      </div>  

      <div>
        <span style="color: #6a9955;"># installation des bibliothèques requises ImageAI/OpenCV pour traiter les images et les vidéos</span>
      </div>

      <div>
        <span style="color: #c586c0;">RUN</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">apt-get</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">-y</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">update</span><span style="color: #d4d4d4;"> </span><span style="color: #569cd6;">\</span>
      </div>

      <div>
        <span style="color: #d4d4d4;">    </span><span style="color: #9cdcfe;">&&</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">apt-get</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">-y</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">install</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">apt-utils</span><span style="color: #d4d4d4;"> </span><span style="color: #569cd6;">\</span>
      </div>

      <div>
        <span style="color: #d4d4d4;">    </span><span style="color: #9cdcfe;">&&</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">apt-get</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">install</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">-y</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">build-essential</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">unzip</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">pkg-config</span><span style="color: #d4d4d4;"> </span><span style="color: #569cd6;">\</span>
      </div>

      <div>
        <span style="color: #d4d4d4;">        </span><span style="color: #9cdcfe;">zlib1g-dev</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">libncurses5-dev</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">libgdbm-dev</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">libnss3-dev</span><span style="color: #d4d4d4;"> </span><span style="color: #569cd6;">\</span>
      </div>

      <div>
        <span style="color: #d4d4d4;">        </span><span style="color: #9cdcfe;">libssl-dev</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">libreadline-dev</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">libffi-dev</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">wget</span><span style="color: #d4d4d4;"> </span><span style="color: #569cd6;">\</span>
      </div>

      <div>
        <span style="color: #d4d4d4;">    </span><span style="color: #9cdcfe;">&&</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">apt-get</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">install</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">-y</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">ffmpeg</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">libsm6</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">libxext6</span><span style="color: #d4d4d4;">  </span>
      </div>  

      <div>
        <span style="color: #6a9955;"># utiliser pip3 (le zpm de python) pour installer imageai et les dépendances d'imageai</span>
      </div>

      <div>
        <span style="color: #c586c0;">RUN</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">pip3</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">install</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">--upgrade</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">pip</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">setuptools</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">wheel</span>
      </div>

      <div>
        <span style="color: #c586c0;">RUN</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">pip3</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">install</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">--target</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">/usr/irissys/mgr/python</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">tensorflow==2.4.0</span>
      </div>

      <div>
        <span style="color: #c586c0;">RUN</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">pip3</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">install</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">--target</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">/usr/irissys/mgr/python</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">keras==2.4.3</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">numpy==1.19.3</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">pillow==8.1.1</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">scipy==1.4.1</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">h5py==2.10.0</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">matplotlib==3.3.2</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">opencv-python</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">keras-resnet==0.2.0</span>
      </div>

      <div>
        <span style="color: #c586c0;">RUN</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">pip3</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">install</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">--target</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">/usr/irissys/mgr/python</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">imageai</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">--upgrade</span>
      </div>  

      <div>
        <span style="color: #c586c0;">USER</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">root</span><span style="color: #d4d4d4;">   </span>
      </div>

      <div>
        <span style="color: #c586c0;">WORKDIR</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">/opt/irisbuild</span>
      </div>

      <div>
        <span style="color: #c586c0;">RUN</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">chown</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">${ISC_PACKAGE_MGRUSER}</span><span style="color: #9cdcfe;">:</span><span style="color: #9cdcfe;">${ISC_PACKAGE_IRISGROUP}</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">/opt/irisbuild</span>
      </div>

      <div>
        <span style="color: #c586c0;">USER</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">${ISC_PACKAGE_MGRUSER}</span>
      </div>  

      <div>
        <span style="color: #c586c0;">WORKDIR</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">/opt/irisbuild</span>
      </div>

      <div>
        <span style="color: #c586c0;">COPY</span><span style="color: #d4d4d4;">  </span><span style="color: #9cdcfe;">python</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">python</span>
      </div>

      <div>
        <span style="color: #c586c0;">COPY</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">input</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">input</span>
      </div>

      <div>
        <span style="color: #c586c0;">COPY</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">output</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">output</span>
      </div>

      <div>
        <span style="color: #c586c0;">COPY</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">models</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">models</span>
      </div>

      <div>
        <span style="color: #c586c0;">COPY</span><span style="color: #d4d4d4;">  </span><span style="color: #9cdcfe;">src</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">src</span>
      </div>

      <div>
        <span style="color: #c586c0;">COPY</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">module.xml</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">module.xml</span>
      </div>

      <div>
        <span style="color: #c586c0;">COPY</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">iris.script</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">iris.script</span>
      </div>  

      <div>
        <span style="color: #6a9955;"># download the trained model used to detect objects and persons inside images</span>
      </div>

      <div>
        <span style="color: #c586c0;">ADD</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">https://github.com/OlafenwaMoses/ImageAI/releases/download/essentials-v5/resnet50_coco_best_v2.1.0.h5</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">models</span>
      </div>  

      <div>
        <span style="color: #c586c0;">USER</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">root</span>
      </div>

      <div>
        <span style="color: #c586c0;">RUN</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">chmod</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">-R</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">777</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">input</span>
      </div>

      <div>
        <span style="color: #c586c0;">RUN</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">chmod</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">-R</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">777</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">output</span>
      </div>

      <div>
        <span style="color: #c586c0;">RUN</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">chmod</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">-R</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">777</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">models</span>
      </div>  

      <div>
        <span style="color: #c586c0;">USER</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">${ISC_PACKAGE_MGRUSER}</span>
      </div>  

      <div>
        <span style="color: #c586c0;">RUN</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">iris</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">start</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">IRIS</span><span style="color: #d4d4d4;"> </span><span style="color: #569cd6;">\</span>
      </div>

      <div>
        <span style="color: #d4d4d4;">    </span><span style="color: #9cdcfe;">&&</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">iris</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">session</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">IRIS</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">&lt;</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">iris.script</span><span style="color: #d4d4d4;"> </span><span style="color: #569cd6;">\</span>
      </div>

      <div>
        <span style="color: #d4d4d4;">    </span><span style="color: #9cdcfe;">&&</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">iris</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">stop</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">IRIS</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">quietly</span>
      </div>
    </div>
  </div>
</div>
  • pip3 est l'outil python utilisé pour installer les bibliothèques python, comme imageai, opencv, tensorflow et autres.
  • le paramètre target a été utilisé pour installer les bibliothèques python là où IRIS en a besoin, le dossier /usr/irissys/mgr/python.
  • ImageAI utilise les bibliothèques python suivantes :
    • TensorFlow : " C'est une bibliothèque open source pour le calcul numérique et l'apprentissage automatique à grande échelle. TensorFlow regroupe un grand nombre de modèles et d'algorithmes d'apprentissage automatique et d'apprentissage profond (alias réseaux neuronaux) et les rend utiles grâce à une métaphore commune. Il utilise Python pour fournir une API frontale pratique permettant de créer des applications à l'aide du cadre, tout en exécutant ces applications dans un C++ haute performance" (source : https://www.infoworld.com/article/3278008/what-is-tensorflow-the-machine-learning-library-explained.html)
    • Keras: "Keras est une API d'apprentissage profond écrite en Python, fonctionnant au-dessus de la plateforme d'apprentissage automatique TensorFlow. Elle a été développée dans le but de permettre une expérimentation rapide. Il est essentiel de pouvoir passer de l'idée au résultat aussi rapidement que possible pour effectuer de bonnes recherches" (source: https://keras.io/about/)
    • OpenCV : "( Bibliothèque de vision par ordinateur à source ouverte, Open Source Computer Vision Library) est une bibliothèque logicielle de vision par ordinateur et d'apprentissage automatique à source ouverte. OpenCV a été construite pour fournir une infrastructure commune pour les applications de vision par ordinateur et pour accélérer l'utilisation de la perception par machine dans les produits commerciaux." (source: https://opencv.org/about/).
  • ImageAI est un cadre qui combine TensorFlow, Keras et OpenCV pour faciliter la formation et/ou l'utilisation des modèles d'apprentissage profond du marché :
    • Prédiction de l'image;
    • Détection d'objets;
    • Détection et suivi d'objets vidéo;
    • Video analysis;
    • Apprentissage de modèles personnalisés (imaginez, par exemple, l'apprentissage d'un modèle pour détecter le risque de chute d'un patient hors de son lit dans le service de soins intensifs d'un hôpital).
  • ImageAI travaille avec les 3 principaux modèles de vision par ordinateur utilisés sur le marché pour la détection d'objets :
    • RetinaNet(Dimension = 145 Mo, haute performance et précision, avec un temps de détection plus long)
    • YOLOv3(Dimension = 237 Mo, performance et précision modérées, avec un temps de détection modéré)
    • TinyYOLOv3(Dimension = 34 Mo, optimisé pour la vitesse et les performances modérées, avec un temps de détection rapide)
  • Dans le dossier d'entrée se trouvent les images à analyser ;
  • Dans le dossier de sortie se trouvent les résultats (images avec balises de résultats visuels) ;
  • Dans le dossier des modèles se trouvent les modèles formés qui seront utilisés avec l'imageai.
  • Cet échantillon utilise le modèle RetinaNet (restnet50)

Mise en œuvre de la version Embedded Python

L'implémentation du code source est simple, et en quelques lignes nous réalisons la détection d'objets ( grâce à ImageAI). Si tensorflow était utilisé directement avec OpenCV et Keras, beaucoup plus de lignes de code auraient été écrites. Consultez le code commenté :

 
Mise en œuvre d'ImageAI
///Détection d'objets et de personnes dans les images et les vidéos
  <div>
    <span style="color: #85a6ff;">Class</span><span style="color: #d4d4d4;"> </span><span style="color: #4ec9b0;">dc</span><span style="color: #4ec9b0;">.</span><span style="color: #4ec9b0;">imageanalyzer</span><span style="color: #4ec9b0;">.</span><span style="color: #4ec9b0;">Detector</span>
  </div>

  <div>
    <span style="color: #ffffff;">{</span>
  </div>  

  <div>
    <span style="color: #80bd66;">///</span><span style="color: #6a9955;"> </span><span style="color: #80bd66;">Détection des personnes et des objets dans les paramètres de l'image</span>
  </div>

  <div>
    <span style="color: #85a6ff;">ClassMethod</span><span style="color: #d4d4d4;"> </span><span style="color: #dcdcaa;">GetImageFeatures</span><span style="color: #ffffff;">(</span><span style="color: #ff75f4;">Image</span><span style="color: #ffffff;">)</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">[</span><span style="color: #d4d4d4;"> </span><span style="color: #85a6ff;">Language</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #d4b57c;">python</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">]</span>
  </div>

  <div>
    <span style="color: #ffffff;">{</span>
  </div>

  <div>
    <span style="color: #80bd66;">    # </span><span style="color: #80bd66;">import</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">imageai</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">and</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">json</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">libs</span>
  </div>

  <div>
    <span style="color: #85a6ff;">    </span><span style="color: #85a6ff;">from</span><span style="color: #ade2ff;"> </span><span style="color: #ade2ff;">imageai</span><span style="color: #ffffff;">.</span><span style="color: #ade2ff;">Detection</span><span style="color: #85a6ff;"> </span><span style="color: #85a6ff;">import</span><span style="color: #ade2ff;"> </span><span style="color: #ade2ff;">ObjectDetection</span>
  </div>

  <div>
    <span style="color: #85a6ff;">    </span><span style="color: #85a6ff;">import</span><span style="color: #ade2ff;"> </span><span style="color: #ade2ff;">json</span>
  </div>

  <div>
    <span style="color: #80bd66;">    </span>
  </div>

  <div>
    <span style="color: #80bd66;">    # </span><span style="color: #80bd66;">instantiate</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">imageai</span>
  </div>

  <div>
    <span style="color: #ade2ff;">    </span><span style="color: #ade2ff;">detector</span><span style="color: #ffffff;"> =</span><span style="color: #ade2ff;"> </span><span style="color: #ade2ff;">ObjectDetection</span><span style="color: #ffffff;">(</span><span style="color: #ffffff;">)</span>
  </div>  

  <div>
    <span style="color: #80bd66;">    # </span><span style="color: #80bd66;">set</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">retinanet</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">as</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">model</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">to</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">detect</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">objects</span>
  </div>

  <div>
    <span style="color: #ade2ff;">    </span><span style="color: #ade2ff;">model</span><span style="color: #ade2ff;">_</span><span style="color: #ade2ff;">path</span><span style="color: #ffffff;"> =</span><span style="color: #d4b57c;"> </span><span style="color: #d4b57c;">"/opt/irisbuild/models/resnet50_coco_best_v2.1.0.h5"</span>
  </div>

  <div>
    <span style="color: #80bd66;">    # </span><span style="color: #80bd66;">set</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">folder</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">to</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">receive</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">the</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">image</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">to</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">be</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">processed</span>
  </div>

  <div>
    <span style="color: #ade2ff;">    </span><span style="color: #ade2ff;">input</span><span style="color: #ade2ff;">_</span><span style="color: #ade2ff;">path</span><span style="color: #ffffff;"> =</span><span style="color: #d4b57c;"> </span><span style="color: #d4b57c;">"/opt/irisbuild/input/"</span><span style="color: #ffffff;"> +</span><span style="color: #ade2ff;"> </span><span style="color: #ade2ff;">Image</span>
  </div>

  <div>
    <span style="color: #80bd66;">    # </span><span style="color: #80bd66;">set</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">folder</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">to</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">stores</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">the</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">results</span><span style="color: #80bd66;"> (</span><span style="color: #80bd66;">visual</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">tags</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">inside</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">image</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">processed</span><span style="color: #80bd66;">)</span>
  </div>

  <div>
    <span style="color: #ade2ff;">    </span><span style="color: #ade2ff;">output</span><span style="color: #ade2ff;">_</span><span style="color: #ade2ff;">path</span><span style="color: #ffffff;"> =</span><span style="color: #d4b57c;"> </span><span style="color: #d4b57c;">"/opt/irisbuild/output/"</span><span style="color: #ffffff;"> +</span><span style="color: #ade2ff;"> </span><span style="color: #ade2ff;">Image</span>
  </div>  

  <div>
    <span style="color: #80bd66;">    # </span><span style="color: #80bd66;">instantiate</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">retina</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">model</span>
  </div>

  <div>
    <span style="color: #ade2ff;">    </span><span style="color: #ade2ff;">detector</span><span style="color: #ffffff;">.</span><span style="color: #ade2ff;">setModelTypeAsRetinaNet</span><span style="color: #ffffff;">(</span><span style="color: #ffffff;">)</span>
  </div>

  <div>
    <span style="color: #80bd66;">    </span>
  </div>

  <div>
    <span style="color: #80bd66;">    # </span><span style="color: #80bd66;">set</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">trained</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">detection</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">model</span><span style="color: #80bd66;"> - </span><span style="color: #80bd66;">retina</span>
  </div>

  <div>
    <span style="color: #ade2ff;">    </span><span style="color: #ade2ff;">detector</span><span style="color: #ffffff;">.</span><span style="color: #ade2ff;">setModelPath</span><span style="color: #ffffff;">(</span><span style="color: #ade2ff;">model</span><span style="color: #ade2ff;">_</span><span style="color: #ade2ff;">path</span><span style="color: #ffffff;">)</span>
  </div>

  <div>
    <span style="color: #80bd66;">    # </span><span style="color: #80bd66;">load</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">the</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">model</span>
  </div>

  <div>
    <span style="color: #ade2ff;">    </span><span style="color: #ade2ff;">detector</span><span style="color: #ffffff;">.</span><span style="color: #ade2ff;">loadModel</span><span style="color: #ffffff;">(</span><span style="color: #ffffff;">)</span>
  </div>

  <div>
    <span style="color: #80bd66;">    # </span><span style="color: #80bd66;">do</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">the</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">object</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">image</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">detection</span>
  </div>

  <div>
    <span style="color: #ade2ff;">    </span><span style="color: #ade2ff;">detection</span><span style="color: #ffffff;"> =</span><span style="color: #ade2ff;"> </span><span style="color: #ade2ff;">detector</span><span style="color: #ffffff;">.</span><span style="color: #ade2ff;">detectObjectsFromImage</span><span style="color: #ffffff;">(</span><span style="color: #ade2ff;">input</span><span style="color: #ade2ff;">_</span><span style="color: #ade2ff;">image</span><span style="color: #ffffff;">=</span><span style="color: #ade2ff;">input</span><span style="color: #ade2ff;">_</span><span style="color: #ade2ff;">path</span><span style="color: #ffffff;">,</span><span style="color: #ade2ff;"> </span><span style="color: #ade2ff;">output</span><span style="color: #ade2ff;">_</span><span style="color: #ade2ff;">image</span><span style="color: #ade2ff;">_</span><span style="color: #ade2ff;">path</span><span style="color: #ffffff;">=</span><span style="color: #ade2ff;">output</span><span style="color: #ade2ff;">_</span><span style="color: #ade2ff;">path</span><span style="color: #ffffff;">)</span>
  </div>

  <div>
    <span style="color: #80bd66;">    # </span><span style="color: #80bd66;">return</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">json</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">with</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">the</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">results</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">of</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">the</span><span style="color: #80bd66;"> </span><span style="color: #80bd66;">processing</span><span style="color: #80bd66;"> </span>
  </div>

  <div>
    <span style="color: #80bd66;">    </span><span style="color: #80bd66;"># if</span><span style="color: #80bd66;"> vous voulez, vous pouvez voir l'image du résultat dans le dossier de sortie</span>
  </div>

  <div>
    <span style="color: #85a6ff;">    </span><span style="color: #85a6ff;">return</span><span style="color: #ade2ff;"> </span><span style="color: #ade2ff;">json</span><span style="color: #ffffff;">.</span><span style="color: #ade2ff;">dumps</span><span style="color: #ffffff;">(</span><span style="color: #ade2ff;">detection</span><span style="color: #ffffff;">)</span>
  </div>

  <div>
    <span style="color: #ffffff;">}</span>
  </div>  

  <div>
    <span style="color: #80bd66;">///</span><span style="color: #6a9955;"> </span><span style="color: #80bd66;">Get JSON</span>
  </div>

  <div>
    <span style="color: #85a6ff;">ClassMethod</span><span style="color: #d4d4d4;"> </span><span style="color: #dcdcaa;">GetJSON</span><span style="color: #ffffff;">(</span><span style="color: #ff75f4;">pythonObj</span><span style="color: #ffffff;">)</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">[</span><span style="color: #d4d4d4;"> </span><span style="color: #85a6ff;">Language</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #d4b57c;">python</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">]</span>
  </div>

  <div>
    <span style="color: #ffffff;">{</span>
  </div>

  <div>
    <span style="color: #85a6ff;">    </span><span style="color: #85a6ff;">import</span><span style="color: #ade2ff;"> </span><span style="color: #ade2ff;">json</span>
  </div>

  <div>
    <span style="color: #85a6ff;">    </span><span style="color: #85a6ff;">return</span><span style="color: #ade2ff;"> </span><span style="color: #ade2ff;">json</span><span style="color: #ffffff;">.</span><span style="color: #ade2ff;">dumps</span><span style="color: #ffffff;">(</span><span style="color: #ade2ff;">pythonObj</span><span style="color: #ffffff;">)</span>
  </div>

  <div>
    <span style="color: #ffffff;">}</span>
  </div>  

  <div>
    <span style="color: #80bd66;">///</span><span style="color: #6a9955;"> </span><span style="color: #80bd66;">Description</span>
  </div>

  <div>
    <span style="color: #85a6ff;">ClassMethod</span><span style="color: #d4d4d4;"> </span><span style="color: #dcdcaa;">GetImageAI</span><span style="color: #ffffff;">(</span><span style="color: #ff75f4;">Image</span><span style="color: #ffffff;">)</span><span style="color: #d4d4d4;"> </span><span style="color: #85a6ff;">As</span><span style="color: #d4d4d4;"> </span><span style="color: #4ec9b0;">%Status</span>
  </div>

  <div>
    <span style="color: #ffffff;">{</span>
  </div>

  <div>
    <span style="color: #d4d4d4;">    </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">sc</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #dcdcaa;">$$$</span><span style="color: #dcdcaa;">OK</span>
  </div>

  <div>
    <span style="color: #d4d4d4;">    </span><span style="color: #ffffff;">Write</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">..</span><span style="color: #dcdcaa;">GetImageFeatures</span><span style="color: #ffffff;">(</span><span style="color: #ff75f4;">Image</span><span style="color: #ffffff;">)</span>
  </div>

  <div>
    <span style="color: #d4d4d4;">    </span><span style="color: #ffffff;">Return</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">sc</span>
  </div>

  <div>
    <span style="color: #ffffff;">}</span>
  </div>  

  <div>
    <span style="color: #ffffff;">}</span>
  </div>
</div>

L'API IRIS pour exposer la détection d'objets en tant que Microservice IRIS de détection d'objets

Il est très facile d'appeler la méthode de classe python, c'est similaire d'appeler n'importe quelle méthode de classe objectcript, voir :

 
Microservice IRIS pour la détection d'objets dans les images
Classdc.imageanalyzer.ImageAnalyzerRESTAppExtends%CSP.REST
  <div>
    <span style="color: #ffffff;">{</span>
  </div>  

  <div>
    <span style="color: #85a6ff;">Parameter</span><span style="color: #d4d4d4;"> </span><span style="color: #dcdcaa;">CHARSET</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #d4b57c;">"utf-8"</span><span style="color: #ffffff;">;</span>
  </div>  

  <div>
    <span style="color: #85a6ff;">Parameter</span><span style="color: #d4d4d4;"> </span><span style="color: #dcdcaa;">CONVERTINPUTSTREAM</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #d4b57c;">1</span><span style="color: #ffffff;">;</span>
  </div>  

  <div>
    <span style="color: #85a6ff;">Parameter</span><span style="color: #d4d4d4;"> </span><span style="color: #dcdcaa;">CONTENTTYPE</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #d4b57c;">"application/json"</span><span style="color: #ffffff;">;</span>
  </div>  

  <div>
    <span style="color: #85a6ff;">Parameter</span><span style="color: #d4d4d4;"> </span><span style="color: #dcdcaa;">Version</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #d4b57c;">"1.0.0"</span><span style="color: #ffffff;">;</span>
  </div>  

  <div>
    <span style="color: #85a6ff;">Parameter</span><span style="color: #d4d4d4;"> </span><span style="color: #dcdcaa;">HandleCorsRequest</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #d4b57c;">1</span><span style="color: #ffffff;">;</span>
  </div>  

  <div>
    <span style="color: #85a6ff;">XData</span><span style="color: #d4d4d4;"> </span><span style="color: #dcdcaa;">UrlMap</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">[</span><span style="color: #d4d4d4;"> </span><span style="color: #85a6ff;">XMLNamespace</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #d4b57c;">"http://www.intersystems.com/urlmap"</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">]</span>
  </div>

  <div>
    <span style="color: #ffffff;">{</span>
  </div>

  <div>
    <span style="color: #ffffff;">&lt;</span><span style="color: #85a6ff;">Routes</span><span style="color: #ffffff;">></span>
  </div>  

  <div>
    <span style="color: #80bd66;"><!--</span><span style="color: #6a9955;"> </span><span style="color: #80bd66;">Detect</span><span style="color: #6a9955;"> </span><span style="color: #80bd66;">objects</span><span style="color: #6a9955;"> </span><span style="color: #80bd66;">inside</span><span style="color: #6a9955;"> </span><span style="color: #80bd66;">an</span><span style="color: #6a9955;"> </span><span style="color: #80bd66;">image</span><span style="color: #6a9955;"> </span><span style="color: #80bd66;">--></span>
  </div>

  <div>
    <span style="color: #ffffff;">&lt;</span><span style="color: #85a6ff;">Route</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">Url</span><span style="color: #ffffff;">=</span><span style="color: #d4b57c;">"/analyzeImage"</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">Method</span><span style="color: #ffffff;">=</span><span style="color: #d4b57c;">"POST"</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">Call</span><span style="color: #ffffff;">=</span><span style="color: #d4b57c;">"AnalyzeImage"</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">/></span>
  </div>  

  <div>
    <span style="color: #ffffff;">&lt;/</span><span style="color: #85a6ff;">Routes</span><span style="color: #ffffff;">></span>
  </div>

  <div>
    <span style="color: #ffffff;">}</span>
  </div>  

  <div>
    <span style="color: #80bd66;">//</span><span style="color: #6a9955;"> </span><span style="color: #80bd66;">Detect objects inside an image</span>
  </div>  

  <div>
    <span style="color: #85a6ff;">ClassMethod</span><span style="color: #d4d4d4;"> </span><span style="color: #dcdcaa;">AnalyzeImage</span><span style="color: #ffffff;">()</span><span style="color: #d4d4d4;"> </span><span style="color: #85a6ff;">As</span><span style="color: #d4d4d4;"> </span><span style="color: #4ec9b0;">%Status</span>
  </div>

  <div>
    <span style="color: #ffffff;">{</span>
  </div>

  <div>
    <span style="color: #d4d4d4;">    </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">tSC</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #dcdcaa;">$$$</span><span style="color: #dcdcaa;">OK</span>
  </div>

  <div>
    <span style="color: #d4d4d4;">    </span>
  </div>

  <div>
    <span style="color: #d4d4d4;">    </span><span style="color: #ffffff;">try</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">{</span>
  </div>

  <div>
    <span style="color: #6a9955;">        </span><span style="color: #80bd66;">// Obtient le fichier à partir de la requête multipart</span>
  </div>

  <div>
    <span style="color: #d4d4d4;">        </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">source</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #64c9ff;">%request</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">GetMimeData</span><span style="color: #ffffff;">(</span><span style="color: #d4b57c;">"file"</span><span style="color: #ffffff;">)</span>
  </div>

  <div>
    <span style="color: #d4d4d4;">        </span>
  </div>

  <div>
    <span style="color: #6a9955;">        </span><span style="color: #80bd66;">// enregistrement du fichier dans le dossier d'entrée, pour être traité avec imageai</span>
  </div>

  <div>
    <span style="color: #d4d4d4;">        </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">destination</span><span style="color: #ffffff;">=</span><span style="color: #85a6ff;">##class</span><span style="color: #ffffff;">(</span><span style="color: #4ec9b0;">%Stream</span><span style="color: #4ec9b0;">.</span><span style="color: #4ec9b0;">FileBinary</span><span style="color: #ffffff;">)</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">%New</span><span style="color: #ffffff;">(</span><span style="color: #ffffff;">)</span>
  </div>

  <div>
    <span style="color: #d4d4d4;">        </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">destination</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">Filename</span><span style="color: #ffffff;">=</span><span style="color: #d4b57c;">"/opt/irisbuild/input/"</span><span style="color: #ffffff;">_</span><span style="color: #ade2ff;">source</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">FileName</span>
  </div>

  <div>
    <span style="color: #d4d4d4;">        </span><span style="color: #ffffff;">set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">tSC</span><span style="color: #ffffff;">=</span><span style="color: #ade2ff;">destination</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">CopyFrom</span><span style="color: #ffffff;">(</span><span style="color: #ade2ff;">source</span><span style="color: #ffffff;">)</span><span style="color: #6a9955;"> </span><span style="color: #80bd66;">//reader open the file</span>
  </div>

  <div>
    <span style="color: #d4d4d4;">        </span><span style="color: #ffffff;">set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">result</span><span style="color: #ffffff;">=</span><span style="color: #ade2ff;">destination</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">%Save</span><span style="color: #ffffff;">(</span><span style="color: #ffffff;">)</span>
  </div>

  <div>
    <span style="color: #d4d4d4;">        </span>
  </div>

  <div>
    <span style="color: #d4d4d4;">        </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #64c9ff;">%response</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">ContentType</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">..</span><span style="color: #dcdcaa;">#</span><span style="color: #dcdcaa;">CONTENTTYPEJSON</span>
  </div>

  <div>
    <span style="color: #d4d4d4;">        </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #64c9ff;">%response</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">Headers</span><span style="color: #ffffff;">(</span><span style="color: #d4b57c;">"Access-Control-Allow-Origin"</span><span style="color: #ffffff;">)</span><span style="color: #ffffff;">=</span><span style="color: #d4b57c;">"*"</span>
  </div>  

  <div>
    <span style="color: #6a9955;">        </span><span style="color: #80bd66;">//Appelle de la méthode de classe python intégrée pour détecter les objets et écrire les résultats en tant que contenu json</span>
  </div>

  <div>
    <span style="color: #d4d4d4;">        </span><span style="color: #ffffff;">Write</span><span style="color: #d4d4d4;"> </span><span style="color: #85a6ff;">##class</span><span style="color: #ffffff;">(</span><span style="color: #4ec9b0;">dc</span><span style="color: #4ec9b0;">.</span><span style="color: #4ec9b0;">imageanalyzer</span><span style="color: #4ec9b0;">.</span><span style="color: #4ec9b0;">Detector</span><span style="color: #ffffff;">)</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">GetImageAI</span><span style="color: #ffffff;">(</span><span style="color: #ade2ff;">source</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">FileName</span><span style="color: #ffffff;">)</span>
  </div>  

  <div>
    <span style="color: #d4d4d4;">        </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">tSC</span><span style="color: #ffffff;">=</span><span style="color: #dcdcaa;">$$$</span><span style="color: #dcdcaa;">OK</span>
  </div>

  <div>
    <span style="color: #d4d4d4;">    </span>
  </div>

  <div>
    <span style="color: #6a9955;">    </span><span style="color: #80bd66;">//Renvoie d'un message d'erreur à l'utilisateur</span>
  </div>

  <div>
    <span style="color: #d4d4d4;">    </span><span style="color: #ffffff;">}</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">catch</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">e</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">{</span>
  </div>

  <div>
    <span style="color: #d4d4d4;">        </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">tSC</span><span style="color: #ffffff;">=</span><span style="color: #ade2ff;">e</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">AsStatus</span><span style="color: #ffffff;">(</span><span style="color: #ffffff;">)</span>
  </div>

  <div>
    <span style="color: #d4d4d4;">        </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">pOutput</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">tSC</span>
  </div>

  <div>
    <span style="color: #d4d4d4;">    </span><span style="color: #ffffff;">}</span>
  </div>  

  <div>
    <span style="color: #d4d4d4;">    </span><span style="color: #ffffff;">Quit</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">tSC</span>
  </div>

  <div>
    <span style="color: #ffffff;">}</span>
  </div>

  <br /><br /><br /> 

  <div>
    <span style="color: #ffffff;">}</span>
  </div>
</div>

Vous pouvez faire beaucoup de choses avec Embedded Python et ImageAI. Pour en savoir plus sur ImageAI, consultez le site : https://github.com/OlafenwaMoses/ImageAI.

Cette application utilisant imageai participera au concours Python, si vous l'aimez, votez-la. Merci !