[PYTHON] Détection de chat avec OpenCV (distribution de modèles)

(Ajouté le 2014/09)

J'écris également un article sur la façon d'identifier les races de chats à l'aide de techniques de Deep Learning. Veuillez vous référer si vous êtes intéressé.

Détection de chat avec OpenCV

detect_chocolat2.jpg (Chocolat-Kichijoji Chariko)

Cat and image processing part 1 - Collecting Materials a organisé comment collecter des images de chat, mais ici nous utilisons les images de chat collectées pour organiser les chats. J'ai créé un modèle d'apprentissage (classificateur) pour la détection.

Si vous êtes intéressé, les détails techniques sont écrits sur le blog. La distribution du modèle sera abordée plus loin dans cette entrée.

L'apprentissage se fait avec le Boosting familier (l'une des méthodes d'apprentissage d'ensemble). Pour la quantité de fonctionnalités, nous avons adopté la fonctionnalité LBP qui peut rapidement répéter la création et la vérification du modèle. En outre, environ 7 000 données d'annotation ont été collectées à l'aide de l'approvisionnement en nuage.

Comment utiliser

C++ À partir de C ++, utilisez-le comme suit.


// objdetect.cpp
#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/objdetect/objdetect.hpp>

int main(int argc, char** argv) {
  using namespace std;
  if(argc != 3) {
    cerr << "./objdetect [image file] [cascade file]" << endl;
    exit(-1);
  }
  cv::Mat src_img = cv::imread(argv[1], 1);
  if(src_img.empty()) {
    cerr << "cannot load image" << endl;
    exit(-1);
  }
  cv::Mat dst_img = src_img.clone();
  string cascade_file = string(argv[2]);
  cv::CascadeClassifier cascade;
  cascade.load(cascade_file);
  if(cascade.empty()) {
    cerr << "cannot load cascade file" << endl;
    exit(-1);
  }
  vector<cv::Rect> objects;
  cascade.detectMultiScale(src_img, objects, 1.1, 3);
  vector<cv::Rect>::const_iterator iter = objects.begin();
  cout << "count: " << objects.size() << endl;
  while(iter!=objects.end()) {
    cout << "(x, y, width, height) = (" << iter->x << ", " << iter->y << ", "
         << iter->width << ", " << iter->height << ")" << endl;
    cv::rectangle(dst_img,
                  cv::Rect(iter->x, iter->y, iter->width, iter->height),
                  cv::Scalar(0, 0, 255), 2);
    ++iter;
  }
  cv::imwrite("result.jpg ", dst_img);
  return 0;
}
##Compiler et exécuter
$ g++ -o objdetect objdetect.cpp -I/path/to/opencv/include -L/path/to/opencv/lib -lopencv_core -lopencv_highgui  -lopencv_objdetect
$ ./objdetect cat.jpg cascade.xml
count: 1
(x, y, width, height) = (278, 185, 65, 65)

Si vous spécifiez les paramètres au moment de la détection de manière lâche (définissez le paramètre minNeighbors sur une petite valeur), la précision de détection semble augmenter. Bien sûr, les faux positifs augmenteront, mais si vous ajoutez un traitement tel que l'exclusion des cas où la zone de détection est plus petite qu'une certaine taille (en spécifiant le paramètre minSize), vous pouvez lui donner un certain degré de précision.

CascadeClassifier::detectMultiScale - docs.opencv.org

Python Facile à utiliser depuis Python.

#!/usr/local/bin/python
# -*- coding: utf-8 -*-

import sys
import cv2 as cv

def detect(imagefilename, cascadefilename):
    srcimg = cv.imread(imagefilename)
    if srcimg is None:
        print('cannot load image')
        sys.exit(-1)
    dstimg = srcimg.copy()
    cascade = cv.CascadeClassifier(cascadefilename)
    if cascade.empty():
        print('cannnot load cascade file')
        sys.exit(-1)
    objects = cascade.detectMultiScale(srcimg, 1.1, 3)
    for (x, y, w, h) in objects:
        print(x, y, w, h)
        cv.rectangle(dstimg, (x, y), (x + w, y + h), (0, 0, 255), 2)
    return dstimg

if __name__ == '__main__':
    result = detect('cat.jpg', 'cascade.xml')
    cv.imwrite('result.jpg', result)

Distribution du modèle

Je publierai le modèle que j'ai réalisé cette fois. Un fichier en cascade (cascade.xml) qui peut être lu par OpenCV.

Étant donné que le processus par lots qui détecte le nouvel ajout de données d'enseignant à la base de données et exécute l'apprentissage s'exécute sur le serveur personnel, il doit être mis à jour en continu et automatiquement vers un modèle plus précis.

Cela dit, si aucune mesure n'est prise, la précision atteindra un plateau, donc je pense que l'algorithme sera amélioré en ajoutant divers pré-traitements et post-traitements.

detect_edo1.jpg detect_mimi1.jpg detect_cat-nerima1.jpg detect_5610691368_f59529e648_z.jpg detect_8854205418_cc97dbeaaa_z.jpg

Recommended Posts

Détection de chat avec OpenCV (distribution de modèles)
Essayez la détection des bords avec OpenCV
Détection des bords en temps réel avec OpenCV
Détection de visage avec Python + OpenCV
Détection de visage d'anime avec OpenCV
Détection des fonctionnalités OpenCV avec Google Colaboratory
Détection de visage avec Python + OpenCV (rotation invariante)
Hello World et détection de visage avec OpenCV 4.3 + Python
Redimensionner, mosaïque, détection de visage avec OpenCV, parfois tampon d'éléphant
Détecter le retour du chat avec OpenCV
Binarisation avec OpenCV / Python
Montage du modèle avec lmfit
Faire pivoter les sprites avec OpenCV
Régression avec un modèle linéaire
Augmentation des données avec openCV
[Résumé] Modèle de détection d'objets utilisant Transformer "Détection d'objets de bout en bout avec des transformateurs"
TopView facile avec OpenCV
Trébucher avec opencv3 de homebrew
Améliorez rapidement la précision de détection en spécifiant les paramètres avec la détection de visage openCV
"Traitement Apple" avec OpenCV3 + Python3
Édition d'image avec python OpenCV
Capture de caméra avec Python + OpenCV
3. Distribution normale avec un réseau neuronal!
Détection de caractéristiques à l'aide d'opencv (détection de coin)
Détection de visage avec Python + dlib
Binariser les données photo avec OpenCV
Chargement de la vidéo en boucle avec opencv
Calibrer le modèle avec PyCaret
Obtenez des fonctionnalités d'image avec OpenCV
Reconnaissance faciale / coupe avec OpenCV
Détection de falsification de la blockchain avec Python
Détection de visage avec Haar Cascades
Essayez OpenCV avec Google Colaboratory
Création d'un classificateur en cascade avec opencv
Utiliser OpenCV avec Python @Mac
Reconnaissance d'image avec Keras + OpenCV
Dessinez une illusion d'aquarelle avec détection des contours en Python3 et openCV3