ноември 21, 2018

ПРИЗНАНИЕ НА СЛИКА СО НЕВРАТИ МРЕЖИ КАКО ДА

Source: http://neuroph.sourceforge.net/image_recognition.html

Нервните мрежи се една техника која може да се користи за препознавање на сликата. Овој туторијал ќе ви покаже како да се користи мулти слој перцептрон нервните мрежа за признавање на сликата. На Neuroph има изградено во знак на поддршка за признавање на сликата, како и специјализирани волшебникот за признавање обука слика нервните мрежи. Едноставен библиотека сликата признавање може да се најде во  org.neuroph.contrib.imgrec пакет, додека сликата признание функција за помошво Neuroph Studio кучињата наоѓа во [Главно Мени> Датотека> Нов> сликата признавање нервните мрежа] ([Main Menu > File > New > Image recognition neural network])

Овој туторијал ќе ви објасни следново:

1. Основен принцип како се користат мулти слој перцептронs за признавање на сликата (еден можен пристап е опишан овде)
2. Како да се обучуваат нервните мрежи за признавање на сликата со Neuroph Studio
3. Како да го користите нервните мрежи обучени за сликата признавање во вашите апликации

Ова упатство е за Neuroph v2.6.

1. Сликата признавање со мулти слој перцептрон

Секоја слика може да се претстави како две-димензионална низа, каде што секој елемент на таа низа ги содржи информациите за бојата за еден пиксел. (Слика 1)

Слика 1. Бои на сликата

Секоја боја може да биде претставена како комбинација од три основни компоненти на бојата: црвена, зелена и сина.

Слика 2. Систем на бои RGB

Значи, за да претставуваме некоја слика во RGB-систем можеме да користиме три дводимензионални низи, по една за секоја компонента на бојата, каде што секој елемент одговара на еден пиксел на слика.

int [][]  redValues
int [][]  greenValues
int [][]  blueValues

На пример, ако пиксел на локација [20, 10] има боја RGB[33, 66, 181] имаме

redValues[10][20] = 33;
greenValues[10][20] = 66;
blueValues[10][20] = 181;

Димензиите на секоја од овие низи се [СликатаВисина] [СликатаШирина]

Ние можеме да ги споиме овие три низи во една еднодимензионална низа, па ги содржи сите црвени вредности, потоа сите зелени и на крајот сите сини вредности. Тоа е како ние создаваме flattenedRgbValues[] низа.
Димензијата на оваа низа е [сликатаВисина * сликатаШирина * 3]

Сега можеме да ја користиме оваа еднодимензионална низа како влез за нервната мрежа и да ги обучиме нервните мрежи да ги препознаат или да ги класифицираат. Повеќеслојни перцептрони се тип на нервни мрежи погодни за овие задачи (слика 3).

Слика 3. Хранење на повеќеслоен персептрон со информации за бои од сликата. Секој влезен неврон одговара на една компонента во боја (RGB) на еден пиксел на одредена локација.

Секој излез неврон одговара на една слика или класа на слики. Значи, ако излезот на мрежата е [1, 0, 0], тоа значи дека влезот е препознаен како “слика А”.
Ние можеме да создадеме обуки за обука на нервните мрежи како збир на парови на влез (израмнување на RGB групи) и излезни вектори (каде што соодветниот неврон на слика е 1).
Мрежата може да се обучи со користење на алгоритам за учење во проширување на грбот. Во следниот дел ќе обезбедиме некои детали за нервните мрежи и алгоритмот за учење.

2. Обука нервна мрежа за сликата признавање со Neuroph Studio

Neuroph Studio обезбедува средина за создавање и обука на нервните мрежи, кои можат да бидат зачувани како готови за употреба на Java компоненти. Исто така, тоа обезбедува специјализирана алатка за препознавање на сликата за да се обучуваат нервните мрежи за признавање на сликата. Создавање и обука на нервните мрежа за сликата признавање се состои од следниве чекори:

  1. Се создаде проект Neuroph
  2. Креирај сликата признавање нервните мрежа
  3. Железничка мрежа
  4. Тест мрежа
  5. Зачувај и распореди мрежа

Чекор 1. За да креирате проект Neuroph, кликнете Датотека > Нов проект (File > New Project)

Изберете проект на Neuroph и кликнете Следно (Next).

Внесете име и локација на проектот, кликнете Заврши (Finish).

Ова ќе го создаде новиот проект на Neuroph.

Чекор 2. Потоа, за да создадете мрежа за препознавање слики, кликнете Датотека> Нова датотека (File > New File).

Изберете тип на датотека за препознавање слика и кликнете Следно (Next).

Следно, изберете слики што сакате да ги препознаете, со избирање на одделни датотеки со слики или со додавање на цела слика. Исто така, можете да го направите основното уредување на сликата како сечење и промена на големината, со едноставно отварање
уредувач на слики со копче за уредување.

Режим на боја – Можете да го користите препознавањето слики во режим на бои или во бинарен црно-бел режим. Бинарниот црн и бел режим претставува пиксел како [0, 1] и затоа користи помалку број на влезни неврони. За некои апликации (како на пример препознавање знаци на пример), бинарниот црно-бел режим може да биде оптимално решение.

Во следниот чекор изберете слика која не е препознаена, што ќе помогне да се избегне лажно препознавање. Обично овие се блокови од сите црвени, сите зелени и сите сини слики, но исто така и миг вклучуваат други.
Кога ќе ја тестирате вашата мрежа за препознавање слики, ќе дознаете што има смисла да се вклучи тука.

Потоа, внесете резолуција на обуката за поставување и резолуција за земање на слики и кликнете Следно (Next).

Обука за поставување на етикети – Бидејќи можете да креирате неколку сетови за обука додека експериментирате со мрежа, добра е практиката да ги означите.

Резолуција на земање на слики (ширина x висина) – Сите обезбедени слики ќе бидат намалени до оваа големина (ширина x висина). Скалирањето на сликите ќе ги направи помали, и ќе им биде полесно и побрзо да учат. Димензиите на сликата ја одредуваат големината на влезниот вектор и бројот на невроните во влезниот слој. (Ако добиете исклучоци од java купишта за некоја димензија, обидете се да ја зголемите големината на купите за JVM)

За почеток, можете да ги користите стандардните поставувања (20×20 резолуција и режим на бои), и само да ги обезбедите сликите.

 

Следното нешто што треба да се направи е да се создаде нервната мрежа.

За да ја креирате нервната мрежа, треба да го внесете следново:

Мрежна етикета – Етикетата за нервната мрежа, која е корисна кога креирате неколку нервни мрежи за истиот проблем и ги споредувате.
Функција за пренос – Ова поставување одредува која трансфер функција ќе ја користат невроните. Во повеќето случаи можете да ги оставите стандардните поставувања ‘Сигмоид’, но понекогаш користејќи ‘Tanh’ може да ви даде подобри резултати.
Скриени слоеви невронски броеви – Ова е најважниот амбиент кој го одредува бројот на скриени слоеви во мрежата и бројот на невроните во секој скриен слој. Скриени слоеви се слоеви помеѓу влезниот и излезниот слој. Трикот е да се има најмалиот можен број на слоеви и неврони кои можат успешно да го научат тренингот. Помал број на неврони – побрзо учење, подобра генерализација. Соодветен број на скриени неврони, исто така, зависи од бројот на влезни и излезни неврони, а најдобрата вредност може да се сфати со експериментирање. За почеток, пробајте 8×8 слики и еден скриен слој со 12 неврони, што е стандардно. Ако сакате да го зголемите бројот на неврони, само внесете го бројот, на пример, “12” неврони. Ако сакате да додадете повеќе од еден слој на неврони, внесете го бројот на неврони во секој слој одделен со празно место. На пример, ако внесете ’12 8 6′, ќе создаде три скриени слоеви со 12, 8 и 6 неврони.

Кликнете на копчето “Заврши” (Finish) за да ја креирате нервната мрежа. Откако ќе кликнете на копчето, ќе се отвори нов прозорец со креирана нервна мрежа.

Чекор 3. Мрежа за обука. За да ја обучите мрежата, одберете го обуката поставена од проектното дрво и кликнете на копчето “Дресира” (Train).

Ова ќе го отвори дијалогот за поставување параметри за учење. Користете го стандардното поставување за учење и само кликнете на копчето “Дресира” (Train).

Ова ќе започне со тренинг и отворен мрежен график за учење и итерација, за да можете да го надминете процесот на учење. Ако учењето се заглави (вкупната мрежна грешка не се намалува), можете да се обидете со различен број на неврони, слоеви или параметри за учење. За брзина на учење и интензитет, користете ги вредностите помеѓу [0, 1], и за грешката препорачана е мала вредност под 0.1. Некои правила на вредностите на палецот се 0.2 за брзина на учење и 0.7 за моментумот.

Чекор 4. Тест мрежа

Откако ќе имаат обучени мрежата може да се обиде како тоа функционира во тест панел. Кликнете на “Изберете Тест на слика” (Select Test Image) за да го поставите влезна слика за мрежата, и излез на мрежата ќе бидат прикажани како листа на сликата етикети и соодветните неврон излези. Признаените сликата одговара на невронот со највисоки резултати. Можете да го тестирате целиот сет на податоци со кликнување на копчето “Тест во собата целата податоци” (Test whole data set).

Чекор 5. Зачувај нервна мрежа

За да ја зачувате нервната мрежа како компонента на Java кликнете на [Главно мени> Датотека> Зачувај] ([Main menu > File > Save]) и користете ја .net мрежата. Мрежата ќе биде зачувана како серизиран објект MultiLayerPerceptron.

3. Користење Neuroph сликата признавање во вашите апликации

Тука е примерок код кој покажува како да се користи на нервната мрежа сликата признавање создадени и обучени со  Neuroph Studio. Можете да го извршите овој пример, само наведете точни имиња на датотеки за нервните мрежа и некои тест слика.

import org.neuroph.core.NeuralNetwork;
import org.neuroph.contrib.imgrec.ImageRecognitionPlugin;
import java.util.HashMap;
import java.io.File;
import java.io.IOException;

public class ImageRecognitionSample {

public static void main(String[] args) {
// load trained neural network saved with Neuroph Studio (наведете некоја постоечка датотека на невралната мрежа тука)
NeuralNetwork nnet = NeuralNetwork.load(“MyImageRecognition.nnet”); // load trained neural network saved with Neuroph Studio
// get the image recognition plugin from neural network
ImageRecognitionPlugin imageRecognition = (ImageRecognitionPlugin)nnet.getPlugin(ImageRecognitionPlugin.class); // get the image recognition plugin from neural network

try {
// image recognition is done here (наведете некоја постоечка датотека со слики)
HashMap<String, Double> output = imageRecognition.recognizeImage(new File(“someImage.jpg”));
System.out.println(output.toString());
} catch(IOException ioe) {
ioe.printStackTrace();
}
}
}

Актуелното препознавање на слики се врши само со еден метод повик од ImageRecognitionPlugin:

imageRecognition.recognizeImage(new File(“someImage.jpg”));

ImageRecognitionPlugin обезбедува едноставен интерфејс за препознавање слики за нервната мрежа. Можете да препознаете слики од различни извори како File, BufferedImage или URL. На пример:

imageRecognition.recognizeImage(new URL(“http://www.example.com/someImage.jpg”));

За повеќе детали, проверете ги часовите во пакетот org.neuroph.contrib.imgrec.

За да користите класи за препознавање слики, мора да додадете референца кон neuroph.jar во вашиот проект (проект со десен клик > Својства > Библиотеки > Додај JAR/папка ([right click project > Properties > Libraries > Add JAR/Folder])

ПРОБЛЕМИ

1. Cкала димензии на сликата се користи за обука на истите димензии за да се избегнат можните проблеми.
2. Со помош на ист начин и сликата димензии боја за обука и признавање. Ако бојата не е важно за вас да се користи црна и бела боја од обука е побрзо.
3. Ако се излезе на исклучоци меморија за поголеми слики се зголеми големината на JVM со -Xms и опции -Xmx.

ПОВЕЌЕ ИНФОРМАЦИИ

Неврални мрежи во обработка на слики http://www.egmont-petersen.nl/Journal-papers/Egmont-PR-Review2002.pdf
Многу други нервни мрежи и документи за обработка на слики http://www.egmont-petersen.nl/nn-review.html

Ви благодариме на Мајкл Егмонт-Петерсен (Michael Egmont-Petersen) за овој придонес.