어떻게 MNIST에 대한 교육 모델의 숫자 인식을 개선하기 위해?

youngpanda :

나는와와 handprinted 여러 자리 인식을하고 있어요 Java사용하여, OpenCV전처리 및 분할 및 대한 라이브러리를 Keras인식 (0.98의 정확도) MNIST에 대한 교육 모델.

인식은 한 가지에서 떨어져 꽤 잘 작동하는 것 같다. 네트워크는 자주 사람 (숫자 "하나")를 인식하지 못합니다. 그런 일이 있다면 인해 분할의 전처리 / 잘못된 구현을 알아낼 수 없습니다, 또는 표준 MNIST에 대한 교육 네트워크는 숫자 1을 볼 수없는 경우에하는 내 테스트 케이스처럼 보인다.

여기에 문제가있는 자리 전처리 및 분할 후 어떻게 생겼는지입니다 :

여기에 이미지 설명을 입력해진다 여기에 이미지 설명을 입력과 같이 분류된다 4.

여기에 이미지 설명을 입력해진다 여기에 이미지 설명을 입력과 같이 분류된다 7.

여기에 이미지 설명을 입력해진다 여기에 이미지 설명을 입력과 같이 분류된다 4. 등등...

분할 프로세스를 개선하여 고정 될 수있는이 일이 있습니까? 또는 오히려 훈련 세트를 향상시켜?

편집 : 트레이닝 세트 (데이터 증가)를 강화하고자 이미 테스트입니다 확실히 도움은 올바른 전처리의 문제는 여전히 남아있다.

내 사전 그레이 스케일, 이진화, 반전 및 팽창으로 변환, 크기 조정으로 구성되어 있습니다. 여기 코드는 :

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);
}
youngpanda :

일부 연구와 실험 후, 나는 자신을 전처리 이미지가 문제가 아니라고 결론 (I 예를 들어 팽창 크기와 모양이 같은 변화 몇 가지 제안 매개 변수를했지만 그들은 결과에 중요하지 않았다)에왔다. 도움을 무슨 짓을하지만,이 다음과 같은 것들이 있었다 :

  1. F4F 눈치 @, 나는 실제 데이터와 내 자신의 데이터 세트를 수집 할 필요가 있었다. 이것은 이미 엄청난 도움을 주었다.

  2. 내 분할 전처리에 중요한 변경했습니다. 개별 윤곽을받은 후, 나는 처음에 맞게 이미지를 크기 정상화 20x20(그들은에 같이 픽셀 상자 MNIST). I가 중간에 박스를 중심 이후 28x28(이진 이미지 모두 치수를 가로 지르는 평균 값이다)의 질량 중심을 사용하여 이미지.

물론, 거기에 여전히 중복 또는 연결된 숫자 어려운 분할의 경우,하지만, 위의 변경 내 최초의 질문에 대한 답변과 내 분류 성능을 향상시켰다.

추천

출처http://43.154.161.224:23101/article/api/json?id=307650&siteId=1