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](https://github.com/OlafenwaMoses/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

  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
FROM intersystemsdc/iris-community
 
USER root
 
ENV DEBIAN_FRONTEND noninteractive
 
# installation des bibliothèques requises ImageAI/OpenCV pour traiter les images et les vidéos
RUN apt-get -y update \
    && apt-get -y install apt-utils \
    && apt-get install -y build-essential unzip pkg-config \
        zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev \
        libssl-dev libreadline-dev libffi-dev wget \
    && apt-get install -y ffmpeg libsm6 libxext6  
 
# utiliser pip3 (le zpm de python) pour installer imageai et les dépendances d'imageai
RUN pip3 install --upgrade pip setuptools wheel
RUN pip3 install --target /usr/irissys/mgr/python tensorflow==2.4.0
RUN pip3 install --target /usr/irissys/mgr/python keras==2.4.3 numpy==1.19.3 pillow==8.1.1 scipy==1.4.1 h5py==2.10.0 matplotlib==3.3.2 opencv-python keras-resnet==0.2.0
RUN pip3 install --target /usr/irissys/mgr/python imageai --upgrade
 
USER root  
WORKDIR /opt/irisbuild
RUN chown ${ISC_PACKAGE_MGRUSER}:${ISC_PACKAGE_IRISGROUP} /opt/irisbuild
USER ${ISC_PACKAGE_MGRUSER}
 
WORKDIR /opt/irisbuild
COPY  python python
COPY input input
COPY output output
COPY models models
COPY  src src
COPY module.xml module.xml
COPY iris.script iris.script
 
# download the trained model used to detect objects and persons inside images
ADD https://github.com/OlafenwaMoses/ImageAI/releases/download/essentials-v5/resnet50_coco_best_v2.1.0.h5 models
 
USER root
RUN chmod -R 777 input
RUN chmod -R 777 output
RUN chmod -R 777 models
 
USER ${ISC_PACKAGE_MGRUSER}
 
RUN iris start IRIS \
    && iris session IRIS < iris.script \
    && iris stop IRIS quietly
### 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
Class dc.imageanalyzer.Detector
{
 
/// Détection des personnes et des objets dans les paramètres de l'image
ClassMethod GetImageFeatures(Image) [ Language = python ]
{
    # import imageai and json libs
    from imageai.Detection import ObjectDetection
    import json
   
    # instantiate imageai
    detector = ObjectDetection()
 
    # set retinanet as model to detect objects
    model_path = "/opt/irisbuild/models/resnet50_coco_best_v2.1.0.h5"
    # set folder to receive the image to be processed
    input_path = "/opt/irisbuild/input/" + Image
    # set folder to stores the results (visual tags inside image processed)
    output_path = "/opt/irisbuild/output/" + Image
 
    # instantiate retina model
    detector.setModelTypeAsRetinaNet()
   
    # set trained detection model - retina
    detector.setModelPath(model_path)
    # load the model
    detector.loadModel()
    # do the object image detection
    detection = detector.detectObjectsFromImage(input_image=input_path, output_image_path=output_path)
    # return json with the results of the processing
    # if vous voulez, vous pouvez voir l'image du résultat dans le dossier de sortie
    return json.dumps(detection)
}
 
/// Get JSON
ClassMethod GetJSON(pythonObj) [ Language = python ]
{
    import json
    return json.dumps(pythonObj)
}
 
/// Description
ClassMethod GetImageAI(Image) As %Status
{
    Set sc = $$$OK
    Write ..GetImageFeatures(Image)
    Return sc
}
 
}
### 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
Class dc.imageanalyzer.ImageAnalyzerRESTApp Extends %CSP.REST
{
 
Parameter CHARSET = "utf-8";
 
Parameter CONVERTINPUTSTREAM = 1;
 
Parameter CONTENTTYPE = "application/json";
 
Parameter Version = "1.0.0";
 
Parameter HandleCorsRequest = 1;
 
XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ]
{
<Routes>
 
<Route Url="/analyzeImage" Method="POST" Call="AnalyzeImage" />
 
</Routes>
}
 
// Detect objects inside an image
 
ClassMethod AnalyzeImage() As %Status
{
    Set tSC = $$$OK
   
    try {
        // Obtient le fichier à partir de la requête multipart
        Set source = %request.GetMimeData("file")
       
        // enregistrement du fichier dans le dossier d'entrée, pour être traité avec imageai
        Set destination=##class(%Stream.FileBinary).%New()
        Set destination.Filename="/opt/irisbuild/input/"_source.FileName
        set tSC=destination.CopyFrom(source) //reader open the file
        set result=destination.%Save()
       
        Set %response.ContentType = ..#CONTENTTYPEJSON
        Set %response.Headers("Access-Control-Allow-Origin")="*"
 
        //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
        Write ##class(dc.imageanalyzer.Detector).GetImageAI(source.FileName)
 
        Set tSC=$$$OK
   
    //Renvoie d'un message d'erreur à l'utilisateur
    } catch e {
        Set tSC=e.AsStatus()
        Set pOutput = tSC
    }
 
    Quit tSC
}



 
}
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 !