[PYTHON] Exécutez YOLO v3 sur AWS

Objectif

Exécutez YOLO sur AWS. ** Je ne connais pas grand-chose à AWS, veuillez donc le voir comme un exemple de solution. ** **

Ce qui a été utilisé

[YOLO] https://github.com/ptxyasu/keras-yolo3 [AWS] EC2 https://aws.amazon.com/jp/ec2/

couler

  1. Créez un environnement sur AWS
  2. Installation des données requise pour AWS
  3. Exécutez yolo

À propos d'AWS EC2

Cette fois, j'ai choisi l'AMI Ubuntu 16.04 pour correspondre à l'environnement de développement. Le type d'instance est t2.micro, qui est une trame libre.

Problème 1 Pénurie de volume

Lorsque je crée l'environnement et que je tente de cloner keras-yolo3, une erreur se produit: il n'y a pas de volume.

Solution 1 Changer le volume d'EBS

Modifiez petit à petit la taille du volume de 8 Go. ** Notez que vous ne pouvez le changer que toutes les 6 heures environ. Cependant, sachez que plus vous augmentez, plus vous serez facturé! !! ** ** En conséquence, il a été porté à 20 Gio.

Problème 2 Mémoire insuffisante (probablement)

Même si je vérifie la déclaration d'erreur, je n'obtiens pas beaucoup d'informations.

Solution 2 Modifier le type d'instance

J'ai senti qu'un processeur virtuel de t2.micro et 1 Go de mémoire étaient les problèmes. J'ai donc changé le type d'instance de t2.micro à t3a.2xlarge. À ce propos, il aurait peut-être été bon de passer à t2.large ou t2.xlarge. ** Veuillez noter que le prix sera très élevé! ** **

Problème 3 Erreur lors de l'exécution de yolo

Si vous lisez l'instruction d'erreur, ce qui suit est probablement le problème. Je pense qu'il n'y a pas de police dans AWS.

yolo_video.py


font = ImageFont.truetype(font='font/FiraMono-Medium.otf',
                    size=np.floor(8e-3 * image.size[1] + 0.5).astype('int32'))

Solution 3 Modifications du programme

Cette fois, il suffit d'obtenir le nom de la classe et ses coordonnées à la place de l'image détectée, de sorte que la partie liée à la représentation peut être supprimée.

yolo_video.py



def detect_image(self, image):
        start = timer()

        if self.model_image_size != (None, None):
            assert self.model_image_size[0]%32 == 0, 'Multiples of 32 required'
            assert self.model_image_size[1]%32 == 0, 'Multiples of 32 required'
            boxed_image = letterbox_image(image, tuple(reversed(self.model_image_size)))
        else:
            new_image_size = (image.width - (image.width % 32),
                              image.height - (image.height % 32))
            boxed_image = letterbox_image(image, new_image_size)
        image_data = np.array(boxed_image, dtype='float32')

        print(image_data.shape)
        image_data /= 255.
        image_data = np.expand_dims(image_data, 0)  # Add batch dimension.

        out_boxes, out_scores, out_classes = self.sess.run(
            [self.boxes, self.scores, self.classes],
            feed_dict={
                self.yolo_model.input: image_data,
                self.input_image_shape: [image.size[1], image.size[0]],
                K.learning_phase(): 0
            })

        print('Found {} boxes for {}'.format(len(out_boxes), 'img'))

        for i, c in reversed(list(enumerate(out_classes))):
            predicted_class = self.class_names[c]
            box = out_boxes[i]
            score = out_scores[i]

            predicted_value = self.get_concentration(predicted_class)
            value = max(value,predicted_value)

            label = '{} {:.2f}'.format(predicted_class,score)

            top, left, bottom, right = box
            top = max(0, np.floor(top + 0.5).astype('int32'))
            left = max(0, np.floor(left + 0.5).astype('int32'))
            bottom = min(image.size[1], np.floor(bottom + 0.5).astype('int32'))
            right = min(image.size[0], np.floor(right + 0.5).astype('int32'))
            print(label, (left, top), (right, bottom))

            if top - label_size[1] >= 0:
                text_origin = np.array([left, top - label_size[1]])
            else:
                text_origin = np.array([left, top + 1])

            # My kingdom for a good redistributable image drawing library.

        end = timer()
        print(end - start)
        return image

    def close_session(self):
        self.sess.close()

Problème 4 Objet non détecté

En utilisant la méthode précédente, nous avons pu exécuter yolo. Cependant, il devient "Trouvé 0 cases pour img" et l'objet n'est pas reconnu ...

Solution 4

Une erreur dans le modèle d'apprentissage placé sur le serveur? → Il n'y a pas de problème avec le modèle Autorisation d'ouvrir des images et des programmes? → Pas de changement même si l'autorisation est donnée L'environnement de développement est composé de plusieurs GPU, alors qu'AWS a plusieurs processeurs → Il semble qu'il ne soit pas lié à l'origine, mais cela peut avoir un léger effet (vérification requise)

résultat

Il a été exécuté, mais aucun objet n'a été détecté. L'instance a été supprimée car les frais ont augmenté d'environ 5 000 yens en raison de l'expansion du volume et du changement de type d'instance.

Nous y travaillerons à nouveau après avoir clarifié la cause de l'échec et considéré le type d'instance optimal. Si vous avez une idée de l'erreur, veuillez commenter! S'il vous plaît.

Recommended Posts

Exécutez YOLO v3 sur AWS v2
Exécutez YOLO v3 sur AWS
Exécutez Python selon la planification sur AWS Lambda
Exécutez TensorFlow sur une instance GPU sur AWS
Jupyter sur AWS
[Python] Exécutez Headless Chrome sur AWS Lambda
YOLO avec Chainer
Exécutez régulièrement des programmes Python sur AWS Lambda
J'ai essayé d'exécuter YOLO v3 avec Google Colab
Exécutez Django sur PythonAnywhere
Exécutez mysqlclient sur Lambda
Construction de l'environnement YOLO v4 ①
Exécutez OpenMVG sur Mac
Exécutez la version GPU tensorflow sur une instance ponctuelle d'AWS EC2
Exécutez Jupyter sur Ubuntu sous Windows
Exécutez Openpose sur Python (Windows)
Exécutez AWS IoT Device SDK for Python sur Raspberry Pi
Exécutez Tensorflow 2.x sur Python 3.7
Exécutez le CGI de Python sur CORESERVER
Exécutez la commande unix sur python
Exécutez IPython Notebook sur Docker
Exécutez Circuit Python sur Seeeduino XIAO
Exécutez Jupyter Notebook sous Windows
Exécutez OpenVino sur macOS Catalina
Exécutez une application Java qui réside sur AWS EC2 en tant que démon
Création d'un environnement pour exécuter ChainerMN sur une instance de GPU AWS
Exécutez MuJoCo sur WSL (2) (également GUI)
Installez et exécutez Dropbox sur Ubuntu 20.04
Préparation à l'exécution de Flask sur EC2
Exécutez Tensorflow avec la prise en charge native de Windows
Exécutez l'image Docker de TensorFlow sur Python3
Comment exécuter matplotlib sur heroku
Exécutez SwitchBot avec Bleak sur Windows 10
Exécutez Matplotlib sur un conteneur Docker
Exécutez headless-chrome sur une image basée sur Debian
Exécutez et consultez AWS Kinesis Firehose
Exécutez XGBoost sur Bash sur Ubuntu sous Windows
Exécutez TensorFlow2 sur le serveur VPS
[Note] Exécutez Django sur Amazon Linux 2
Exécutez Yocto sur Ubuntu en utilisant QEMU.
Exécutez Sesame sur le PaSoRi de Sony (RCS370)
Exécutez régulièrement Python sur Heroku Scheduler
Exécutez cron sur Amazon Linux (défini sur Linux)
J'ai essayé la détection d'objets avec YOLO v3 (TensorFlow 2.0) sur un processeur Windows!
Le module ne peut pas être importé en Python sur EC2 exécuté à partir d'AWS Lambda