(Hinzugefügt am 2014/09)
Ich schreibe auch einen Artikel darüber, wie man Katzenrassen mithilfe von Deep-Learning-Techniken identifiziert. Bitte beziehen Sie sich, wenn Sie interessiert sind.
(Chocolat-Kichijoji Chariko)
Katzen- und Bildverarbeitung Teil 1 - Sammeln von Materialien organisierte das Sammeln von Katzenbildern, aber hier verwenden wir die gesammelten Katzenbilder, um Katzen zu organisieren. Ich habe ein Lernmodell (Klassifikator) zur Erkennung erstellt.
Wenn Sie interessiert sind, werden die technischen Details auf dem Blog geschrieben. Die Modellverteilung wird später in diesem Eintrag erläutert.
Das Lernen erfolgt mit dem bekannten Boosting (eine der Lernmethoden des Ensembles). Für die Feature-Menge haben wir LBP-Feature verwendet, mit dem die Modellerstellung und -überprüfung schnell wiederholt werden kann. Darüber hinaus wurden mithilfe von Cloud Sourcing etwa 7.000 Anmerkungsdaten erfasst.
C++ Verwenden Sie es in C ++ wie folgt.
// 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;
}
##Kompilieren und ausführen
$ 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)
Es scheint, dass sich die Erkennungsgenauigkeit spürbar erhöht, wenn die Parameter zum Zeitpunkt der Erkennung lose angegeben werden (der Parameter minNeighbors ist auf einen kleinen Wert eingestellt). Natürlich nehmen die Anzahl der Fehlalarme zu, aber wenn Sie eine Verarbeitung hinzufügen, z. B. Fälle ausschließen, in denen der Erkennungsbereich kleiner als eine bestimmte Größe ist (unter Angabe des Parameters minSize), können Sie ihn wie einen bestimmten Grad an Genauigkeit aussehen lassen.
CascadeClassifier::detectMultiScale - docs.opencv.org
Python Einfach zu bedienen von 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)
Ich werde das Modell veröffentlichen, das ich dieses Mal gemacht habe. Eine Kaskadendatei (cascade.xml), die von OpenCV gelesen werden kann.
Da wir auf unserem Personal Server einen Stapelprozess ausführen, der das neue Hinzufügen von Lehrerdaten zur Datenbank erkennt und das Lernen ausführt, sollte dieser kontinuierlich und automatisch auf ein genaueres Modell aktualisiert werden.
Wenn jedoch keine Maßnahmen ergriffen werden, erreicht die Genauigkeit ein Plateau. Ich denke, dass der Algorithmus durch Hinzufügen verschiedener Vor- und Nachbearbeitungen verbessert wird.
Recommended Posts