Escrito por

Software Architect at Visum
Artigo Yuri Marx · Fev. 5, 2022 8m read

Detecção de Objetos com Embedded Python e IRIS

A partir do IRIS 2021.2 é possível escrever métodos de classe usando a linguagem Python. Usei esse novo recurso para detectar pessoas e objetos em imagens, usando o ImageAI (https://github.com/OlafenwaMoses/ImageAI). O criador do ImageAI o define como: "Uma biblioteca python de código aberto criada para permitir aos desenvolvedores criarem aplicativos e sistemas com recursos autônomos de Deep Learning e Visão Computacional usando poucas linhas de código". Neste artigo, você aprenderá como aplicar a ImageAI para detectar objetos e pessoas dentro de imagens.

Passos para analisar imagens usando o ImageAI

  1. Vá em https://openexchange.intersystems.com/package/AI-Image-Object-Detector e clique Download para ir ao Projeto Git
  2. Clone/git pull no repositório para qualquer pasta local
$ git clone https://github.com/yurimarx/image-analyzer.git
  1. Abra o terminal e vá no diretório onde o projeto foi criado e execute:
$ docker-compose build
  1. Execute o IRIS container:
$ docker-compose up -d 
  1. Vá no seu Postman (ou outros clientes REST) e configure a requisição de acordo com a imagem:

Request Image Analysis input

  1. Clique em enviar e obtenha uma resposta como esta:

Request Image Analysis output

Os bastidores - o código-fonte

O Dockerfile

Esse é um passo importante. Para usar as bibliotecas do python você precisa instalar isto antes, preste atenção do diretório correto do Python que o IRIS utiliza (/usr/irissys/mgr/python):

 

Dockerfile

FROMintersystemsdc/iris-community

 

USERroot

 

ENVDEBIAN_FRONTENDnoninteractive

 

# instala as bibliotecas requeridas do ImageAI/OpenCV para processar imagens e vídeos
RUNapt-get-yupdate\
    &&apt-get-yinstallapt-utils\
    &&apt-getinstall-ybuild-essentialunzippkg-config\
        zlib1g-devlibncurses5-devlibgdbm-devlibnss3-dev\
        libssl-devlibreadline-devlibffi-devwget\
    &&apt-getinstall-yffmpeglibsm6libxext6  

 

# use o pip3 (o zpm do python) para instalar o imageai e as dependências do imageai
RUNpip3install--upgradepipsetuptoolswheel
RUNpip3install--target/usr/irissys/mgr/pythontensorflow==2.4.0
RUNpip3install--target/usr/irissys/mgr/pythonkeras==2.4.3numpy==1.19.3pillow==8.1.1scipy==1.4.1h5py==2.10.0matplotlib==3.3.2opencv-pythonkeras-resnet==0.2.0
RUNpip3install--target/usr/irissys/mgr/pythonimageai--upgrade

 

USERroot  
WORKDIR/opt/irisbuild
RUNchown${ISC_PACKAGE_MGRUSER}:${ISC_PACKAGE_IRISGROUP}/opt/irisbuild
USER${ISC_PACKAGE_MGRUSER}

 

WORKDIR/opt/irisbuild
COPY  pythonpython
COPYinputinput
COPYoutputoutput
COPYmodelsmodels
COPY  srcsrc
COPYmodule.xmlmodule.xml
COPYiris.scriptiris.script

 

# realiza o download do modelo treinado para detectar pessoas e objetos na imagem

 

USERroot
RUNchmod-R777input
RUNchmod-R777output
RUNchmod-R777models

 

USER${ISC_PACKAGE_MGRUSER}

 

RUNirisstartIRIS\
    &&irissessionIRIS<iris.script\
    &&irisstopIRISquietly
  • pip3 é uma ferramenta do python para instalar novas bibliotecas, como o imageai, opencv, tensorflow e outras.
  • o parâmetro target é utilizado para instalar as bibliotecas do python onde o IRIS precisa, na pasta /usr/irissys/mgr/python.
  • O ImageAI utiliza as seguintes bibliotecas:
    • TensorFlow: "é uma biblioteca de código aberto para computação numérica e aprendizado de máquina em larga escala. O TensorFlow reúne uma série de modelos e algoritmos de aprendizado de máquina e aprendizado profundo (também conhecido como rede neural) e os torna úteis por meio de uma metáfora comum. Ele usa Python para fornecer uma API de front-end conveniente para criar aplicativos com a estrutura correta, enquanto executa esses aplicativos em C++ em alto desempenho" (fonte: https://www.infoworld.com/article/3278008/what-is-tensorflow-the -machine-learning-library-explained.html)
    • Keras: "Keras é uma API de aprendizado profundo escrita em Python, executada na plataforma de aprendizado de máquina TensorFlow. Ela foi desenvolvida com foco em permitir a experimentação rápida. Ser capaz de ir da ideia ao resultado o mais rápido possível é a chave para fazer boa pesquisa." (fonte: https://keras.io/about/)
    • OpenCV: "(Open Source Computer Vision Library) é uma biblioteca de software de visão computacional e aprendizado de máquina de código aberto. OpenCV foi construído para fornecer uma infraestrutura comum para aplicativos de visão computacional e acelerar o uso de percepção de máquina nos produtos comerciais" (fonte: https://opencv.org/about/).
  • O ImageAI é um framework que combina oTensorFlow, Keras e OpenCV para te permitir treinar e usar modelos de mercado de deep learning facilmente, visando:
    • Predição de imagens;
    • Detecção de Objetos;
    • Detecção de objetos em vídeo e o acompanhamento em tempo real do vídeo;
    • Análise de Vídeos;
    • Treinamento de modelos customizados (como o treinamento de um modelo para risco de queda em hospital, por exemplo).
  • O ImageAI trabalha com 3 modelos principais de Computação Visual para detecção de objetos:
    • RetinaNet(Tamanho = 145 mb, longo tempo de resposta, mas ótima acurácia)
    • YOLOv3(Tamanho = 237 mb, tempo de resposta e acurácia moderadas)
    • TinyYOLOv3(Tamanho = 34 mb, ótimo tempo de resposta e acurácia moderada)
  • A pasta input armazena as imagens a serem analisadas;
  • A pasta output armazena os resultados (imagens com as marcações);
  • A pasta models armazena os modelos treinados para utilização no imageai.
  • Este exemplo usa o modelo RetinaNet (restnet50)

Implementação do Embedded Python no IRIS

A implementação do código fonte é simples, e em poucas linhas fazemos a detecção de objetos (razão do uso do ImageAI). Se o tensorflow fosse usado diretamente com OpenCV e Keras, muito mais linhas de código teriam sido escritas. Veja o código comentado:

 

Implementação do ImageAI

///Detecção de pessoas e objetos em imagens e videos
Classdc.imageanalyzer.Detector
{

 

///Detecta dentro da imagem passada por parametro
ClassMethodGetImageFeatures(Image)[Language=python]
{
    # importa as libs doimageaiejson
    fromimageai.DetectionimportObjectDetection
    importjson
   
    # instancia oimageai
    detector =ObjectDetection()

 

    # seta oretinanetcomo modelo de deteccao
    model_path ="/opt/irisbuild/models/resnet50_coco_best_v2.1.0.h5"
    # seta apasta para receber a imagem a ser processada
    input_path ="/opt/irisbuild/input/" +Image
    # seta pastaque armazena os resultados (imagem processada com as tags)
    output_path ="/opt/irisbuild/output/" +Image

 

    # instancia o modeloretina
    detector.setModelTypeAsRetinaNet()
   
    # seta o modelo de detecção retina
    detector.setModelPath(model_path)
    # carrega o modelo
    detector.loadModel()
    # detecta os objetos e pessoas
    detection =detector.detectObjectsFromImage(input_image=input_path,output_image_path=output_path)
    # retorna ojson com os resultados
    # você pode ver a imagem processada no diretorio output
    returnjson.dumps(detection)
}

 

///Get JSON
ClassMethodGetJSON(pythonObj)[Language=python]
{
    importjson
    returnjson.dumps(pythonObj)
}

 

///Description
ClassMethodGetImageAI(Image)As%Status
{
    Setsc=$$$OK
    Write..GetImageFeatures(Image)
    Returnsc
}

 

}

A API do IRIS para export a detecção de Objetos como um Microsserviço do IRIS

É muito fácil chamar o classmethod python, é semelhante chamar qualquer classmethod objectscript, veja:

 

Microsserviço IRIS para detectar objetos dentro de imagens

Classdc.imageanalyzer.ImageAnalyzerRESTAppExtends%CSP.REST
{

 

ParameterCHARSET="utf-8";

 

ParameterCONVERTINPUTSTREAM=1;

 

ParameterCONTENTTYPE="application/json";

 

ParameterVersion="1.0.0";

 

ParameterHandleCorsRequest=1;

 

XDataUrlMap[XMLNamespace="http://www.intersystems.com/urlmap"]
{
<Routes>

 

<!--Detecta objetosdentro daimagem-->
<RouteUrl="/analyzeImage"Method="POST"Call="AnalyzeImage"/>

 

</Routes>
}

 

//Detecta objetos dentro da imagem

 

ClassMethodAnalyzeImage()As%Status
{
    SettSC=$$$OK
   
    try{
        // obtem o arquivo em requisicao multipart
        Setsource=%request.GetMimeData("file")
       
        // salva o arquivo para a pasta input, para ser processado pelo imageai
        Setdestination=##class(%Stream.FileBinary).%New()
        Setdestination.Filename="/opt/irisbuild/input/"_source.FileName
        settSC=destination.CopyFrom(source)//o reader abre o arquivo
        setresult=destination.%Save()
       
        Set%response.ContentType=..#CONTENTTYPEJSON
        Set%response.Headers("Access-Control-Allow-Origin")="*"

 

        //chama o classmethod do embedded python para detectar objetos e escrever os resultados como um objeto json
        Write##class(dc.imageanalyzer.Detector).GetImageAI(source.FileName)

 

        SettSC=$$$OK
   
    //retorna erro se houver
    }catche{
        SettSC=e.AsStatus()
        SetpOutput=tSC
    }

 

    QuittSC
}


 

}

Você pode fazer muitas coisas com Embedded Python e ImageAI. Saiba mais sobre ImageAI em: https://github.com/OlafenwaMoses/ImageAI.

Este aplicativo de exemplo usando imageai participará do concurso Python, se você gostou, vote nele. Obrigado!