Ön işleme ve segmentasyon için kütüphane ve tanıma için MNIST (0.98 doğrulukla) ile eğitilmiş bir model Java
kullanarak , elle basılmış çok basamaklı tanıma üzerinde çalışıyorum.OpenCV
Keras
Tanıma, bir şey dışında oldukça iyi çalışıyor gibi görünüyor. Şebeke genellikle ağları tanımıyor ("bir numara"). Segmentasyonun önişleminden / yanlış uygulanmasından veya standart MNIST'de eğitilmiş bir ağın test vakalarıma benzeyen bir numara görmediğinden emin olamıyorum.
Önişleme ve segmentasyondan sonra sorunlu rakamlar şöyle görünür:
olur ve sınıflandırılır 4
. Ve bunun gibi...
Bu, segmentasyon sürecini iyileştirerek giderilebilecek bir şey mi? Ya da daha ziyade eğitim setini geliştirerek mi?
Düzenleme: Zaten test ediyorum eğitim seti (veri büyütme) geliştirmek kesinlikle yardımcı olacaktır, doğru önişleme sorunu hala devam etmektedir.
Önişlemim yeniden boyutlandırma, gri tonlamaya dönüştürme, binarizasyon, ters çevirme ve genişlemeden oluşur. İşte kod:
Mat resized = new Mat();
Imgproc.resize(image, resized, new Size(), 8, 8, Imgproc.INTER_CUBIC);
Mat grayscale = new Mat();
Imgproc.cvtColor(resized, grayscale, Imgproc.COLOR_BGR2GRAY);
Mat binImg = new Mat(grayscale.size(), CvType.CV_8U);
Imgproc.threshold(grayscale, binImg, 0, 255, Imgproc.THRESH_OTSU);
Mat inverted = new Mat();
Core.bitwise_not(binImg, inverted);
Mat dilated = new Mat(inverted.size(), CvType.CV_8U);
int dilation_size = 5;
Mat kernel = Imgproc.getStructuringElement(Imgproc.CV_SHAPE_CROSS, new Size(dilation_size, dilation_size));
Imgproc.dilate(inverted, dilated, kernel, new Point(-1,-1), 1);
Önceden işlenmiş görüntü daha sonra aşağıdaki gibi ayrı basamaklara bölünür:
List<Mat> digits = new ArrayList<>();
List<MatOfPoint> contours = new ArrayList<>();
Imgproc.findContours(preprocessed.clone(), contours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
// code to sort contours
// code to check that contour is a valid char
List rects = new ArrayList<>();
for (MatOfPoint contour : contours) {
Rect boundingBox = Imgproc.boundingRect(contour);
Rect rectCrop = new Rect(boundingBox.x, boundingBox.y, boundingBox.width, boundingBox.height);
rects.add(rectCrop);
}
for (int i = 0; i < rects.size(); i++) {
Rect x = (Rect) rects.get(i);
Mat digit = new Mat(preprocessed, x);
int border = 50;
Mat result = digit.clone();
Core.copyMakeBorder(result, result, border, border, border, border, Core.BORDER_CONSTANT, new Scalar(0, 0, 0));
Imgproc.resize(result, result, new Size(28, 28));
digits.add(result);
}