전처리 및 세분화를 위해 라이브러리를 Java
사용 OpenCV
하고, Keras
MNIST (정확도 0.98)를 인식하도록 인식 된 모델을 사용하여 손자국 된 다중 숫자 인식 작업을 하고 있습니다.
인식은 한 가지 말고는 잘 작동하는 것 같습니다. 네트워크는 종종 하나를 인식하지 못합니다 (숫자 "1"). 전처리 / 잘못된 세그먼트 화 구현으로 인해 발생하는지 또는 표준 MNIST에서 훈련 된 네트워크가 내 테스트 사례처럼 보이는 숫자를 보지 못한 경우 알 수 없습니다.
전처리 및 세그먼트 화 후 문제가되는 숫자는 다음과 같습니다.
이것은 세분화 프로세스를 개선하여 해결할 수있는 것입니까? 아니면 오히려 훈련 세트를 향상시켜?
편집 : 훈련 세트 (데이터 기능 보강)를 향상시키는 것이 확실히 도움이 될 것입니다. 이미 테스트 중이지만 올바른 전처리 문제는 여전히 남아 있습니다.
내 전처리는 크기 조정, 그레이 스케일로 변환, 이진화, 반전 및 확장으로 구성됩니다. 코드는 다음과 같습니다.
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);
그런 다음 전처리 된 이미지는 다음과 같이 개별 숫자로 분할됩니다.
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);
}