Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
У цьому розділі завдання оптичного розпізнавання символів можна оцінити на основі розміру шаблонів низької роздільної здатності та кількості нейронів прихованого рівня. Ми закодували застосунок evalOCR.cpp, у якому використали файл тренувальних даних у форматі XML, згенерований програмою trainOCR.cpp. Файл OCR.xml зберігає тренувальні матриці розмірності 5x5, 10x10, 15x15 та 20x20 зі зменшеними шаблонами зображень.
Atronax
04.03.21 в 15:29
|
|
Mat classes; Mat trainingData; //Зчитуємо файл з тренувальними даними. FileStorage fs; fs.open("OCR.xml", FileStorage::READ); fs[data] >> trainingData; fs["classes"] >> classes;
Atronax
04.03.21 в 15:33
|
|
Код оцінки опрацьовує кожну зменшену матрицю особливої зони та отримує 100 випадкових рядів для тренування, а також інші, для тестування алгоритму та перевірки помилок. Перед тренуванням системи тестуємо кожен випадковий елемент на коректність відповіді. Якщо вона неправильна, додаємо одиницю до змінної, що позначає кількість помилок, а потім ділимо результат на кількість примірників. В результаті матимемо відношення похибки від 0 до 1 при тренуванні випадковими даними:
Atronax
04.03.21 в 15:48
|
|
float test(Mat samples, Mat classes) { float errors=0; for(int i=0; i<samples.rows; i++) { int result= ocr.classify(samples.row(i)); if(result!= classes.at<int>(i)) errors++; } return errors/samples.rows; }
Atronax
04.03.21 в 15:48
|
|
Застосунок повертає в командній стрічці вихідне відношення похибки для кожного розміру примірників. Для якісної оцінки маємо натренувати програми різними випадковими рядами; в результаті це дасть різні тестові значення похибок. Потім додамо їх та знайдемо середнє значення. Щоб виконати це завдання, створимо скрипт bash для автоматизації процесу:
Atronax
04.03.21 в 15:51
|
|
#!/bin/bash echo "#ITS \t 5 \t 10 \t 15 \t 20" > data.txt folder=$(pwd) for numNeurons in 10 20 30 40 50 60 70 80 90 100 120 150 200 500 do s5=0; s10=0; s15=0; s20=0; for j in {1..100}
Atronax
04.03.21 в 15:52
|
|
do echo $numNeurons $j a=$($folder/build/evalOCR $numNeurons TrainingDataF5) s5=$(echo "scale=4; $s5+$a" | bc -q 2>/dev/null) a=$($folder/build/evalOCR $numNeurons TrainingDataF10) s10=$(echo "scale=4; $s10+$a" | bc -q 2>/dev/null) a=$($folder/build/evalOCR $numNeurons TrainingDataF15) s15=$(echo "scale=4; $s15+$a" | bc -q 2>/dev/null) a=$($folder/build/evalOCR $numNeurons TrainingDataF20) s20=$(echo "scale=4; $s20+$a" | bc -q 2>/dev/null) done echo "$i \t $s5 \t $s10 \t $s15 \t $s20" echo "$i \t $s5 \t $s10 \t $s15 \t $s20" >> data.txt done
Atronax
04.03.21 в 15:52
|
|
Код формує файл data.txt, який зберігає всі результати кожного розміру та кількість прихованих нейронів відповідного рівня. Цей файл можна використати для побудови графіка за допомогою gnuplot. Результат можна бачити на наступному малюнку: Вочевидь, найнижчий рівень похибок складає 8 відсотків, для 20 нейронів у прихованому рівні та символів, що видобуваються з фрагментів зображень 10x10 пікселів.
Atronax
04.03.21 в 16:02
|
|
|
|
|
У цьому розділі ми дізналися, як працює програма автоматичного розпізнавання номерних знаків, а також приділили увагу двом важливим крокам: локалізації та розпізнаванню пластини. На першому етапі ми зрозуміли, як сегментувати зображення на фрагменти, які можуть мати пластину, а також як застосувати просту евристику та метод опорних векторів для класифікації фрагментів на номерні знаки та не знаки. На другому кроці ми навчилися сегментувати фрагменти з використанням алгоритму пошуку контурів, сформували вектор особливих зон для кожного символа та використали штучну нейронну мережу для класифікації кожної з них. Ми також зрозуміли, як оцінити алгоритм шляхом тренування з різними випадковими даними, а також як перевірити його для різних значень параметрів та особливих зон.
Atronax
04.03.21 в 16:12
|
|