আমি handprinted বহু অঙ্ক স্বীকৃতি উপর কাজ করছি Java
ব্যবহার OpenCV
প্রাক-প্রক্রিয়াকরণ ও সেগমেন্টেশন, এবং একটি জন্য লাইব্রেরী Keras
স্বীকৃতির জন্য মডেল (0.98 একটি সঠিকতা সঙ্গে) MNIST তালিম।
স্বীকৃতি মনে হয় এক জিনিস বাদে বেশ ভাল কাজ করে। নেটওয়ার্ক প্রায়শই এটিগুলি (সংখ্যা "একটি") সনাক্ত করতে ব্যর্থ হয়। বিভাগটি প্রিপ্রোসেসিং / ভুল প্রয়োগের কারণে এটি ঘটে কিনা তা আমি সনাক্ত করতে পারছি না, বা যদি মানক এমএনআইএসটিতে প্রশিক্ষিত কোনও নেটওয়ার্ক কেবল আমার পরীক্ষার কেসের মতো দেখতে প্রথম স্থানটি দেখেনি।
প্রিপ্রোসেসিং এবং বিভাগকরণের পরে সমস্যাযুক্ত অঙ্কগুলি দেখতে দেখতে এখানে:
হয় এবং হিসাবে শ্রেণীবদ্ধ করা হয় 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);
}