Språkidentifiering Bildanalys, projekt 3 hp

Relevanta dokument
Image processing of protein chips for diagnosis of prostate cancer

Beräkningsverktyg HT07

MATLAB. Python. Det finns flera andra program som liknar MATLAB. Sage, Octave, Maple och...

Språkigenkänning. en tillämpning av OCR system och klassificering. Projekt i Bildanalys. Anna Lindholm Eskil Jönsson

TSBB14 Laboration: Intro till Matlab 1D

Du skall naturligtvis visa körexempel med output där det behövs i din rapport!

MMA132: Laboration 1 Introduktion till MATLAB

Programmeringsuppgift Game of Life

Föreläsning 9-10 Innehåll

Tentamen TANA17 Matematiska beräkningar Provkod: DAT1 Godkänd: 9p av totalt 20p Hjälpmedel: MATLAB

Tentamen TANA17 Matematiska beräkningar Provkod: DAT1 Godkänd: 8p av totalt 20p Hjälpmedel: MATLAB

(a) Skriv en matlabsekvens som genererar en liknande figur som den ovan.

Medicinska Bilder, TSBB31. Lab: Mätvärden på Medicinska Bilder


Textsträngar från/till skärm eller fil

Introduktion till MATLAB, med utgångspunkt från Ada

Poisson Point Processes. Edvin Listo Zec Maja Fahlén

Lösningsförslag Tentamen i Beräkningsvetenskap I, 5.0 hp,

Kurskod: TAMS11 Provkod: TENB 28 August 2014, 08:00-12:00. English Version

Matriser och vektorer i Matlab

Medicinska Bilder, TSBB31. Lab3: Mätvärden på Medicinska Bilder

TANA17 Matematiska beräkningar med Matlab

Karlstads Universitet, Datavetenskap 1

Tentamen TANA17 Matematiska beräkningar Provkod: DAT1 Godkänd: 8p av totalt 20p Tid: 14:e januari klockan

Matematisk Modellering

Lösningar till tentamen i EIT070 Datorteknik

Numeriska metoder, grundkurs II. Dagens program. Hur skriver man en funktion? Administrativt. Hur var det man gjorde?

Medicinska Bilder, TSBB31. Lab: Mätvärden på Medicinska Bilder

Ett enkelt OCR-system

Matriser och linjära ekvationssystem

Digitala Projekt(EITF40) - Larm

Användarhandledning Version 1.2

En introduktion till MatLab

Uppgifter teknik HT17 (uppdaterad v. 40)

Sanningar om programmering

5. En metod som anropar sig själv a) får inte förekomma i Java-program b) kallas destruktiv c) kallas iterativ d) kallas rekursiv 6. Vilka värden har

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

3 Man kan derivera i Matlab genom att approximera derivator med differenskvoter. Funktionen cosinus deriveras för x-värdena på följande sätt.

Dagens program. Programmeringsteknik och Matlab. Administrativt. Viktiga datum. Kort introduktion till matlab. Övningsgrupp 2 (Sal Q22/E32)

Introduktion till MATLAB

Saker du ska kunna Föreläsning 13 & 14

Föreläsning 6: Introduktion av listor

TANA17 Matematiska beräkningar med Matlab

Sanningar om programmering

Datorarkitekturer med operativsystem ERIK LARSSON

Arrayer (vektorer) Murach s: kap Elektronikcentrum i Svängsta AB

Tentamen TAIU07 Matematiska beräkningar med MATLAB för MI

Kurslitteraturen. C-nivå Villkorssatser [kap 8] if & elif & else and & or Loopar [kap 9] for

Att lösa Sudoku. Metoden Solve (börjar nedtill på sid 3)

TAIU07 Matematiska beräkningar med Matlab

Instruktion för laboration 1

TAIU07 Matematiska beräkningar med Matlab

ATT RITA GRAFER MED KOMMANDOT "PLOT"

#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> unsigned char num;

Beräkningsvetenskap föreläsning 2

Projekt i programmering 1 (ver 2)... 2 Projektidé... 2 Planering... 2 Genomförande... 2 Testning och buggar... 3 Utvärdering... 3 Planering...

Simulering med ModelSim En kort introduktion

BE MATLAB. (Matrix Laboratory) matlab.ico. för SIGNALER SYSTEM

MMA132: Laboration 1 & 2 Introduktion till MATLAB

Konvexa höljet Laboration 6 GruDat, DD1344

Instruktion för laboration 1

Exempelsamling Assemblerprogrammering

Du kan söka hjälp efter innehåll eller efter namn

Datorlära 3 Octave Workspace ovh mijlö Skriva text på skärmen Värdesiffror Variabler och typer Strängar Makro Vektorer

Tentamen TAIU07 Matematiska beräkningar med MATLAB för MI

Platser för att skriva och testa kod online. Workshop om programmering i matematikkurser, version 0.7 senast sparat

TANA17 Matematiska beräkningar med Matlab

Kort om programmering i Matlab

KALKYLATOR LABORATION4. Laborationens syfte

TAIU07 Matematiska beräkningar med Matlab

Variabler. TANA81: Beräkningar med Matlab. Matriser. I Matlab skapas en variabel genom att man anger dess namn och ger den ett värde:

TAIU07 Matematiska beräkningar med Matlab

MATLAB the Matrix Laboratory. Introduktion till MATLAB. Martin Nilsson. Enkel användning: Variabler i MATLAB. utvecklat av MathWorks, Inc.

Support Manual HoistLocatel Electronic Locks

Mer om geometriska transformationer

Uppgift 1. Minimeringsproblemet löses med en Monte Carlo algoritm:

Exempel att testa. Stora problem och m-filer. Grundläggande programmering 4. Informationsteknologi. Informationsteknologi.

Transformationer i R 2 och R 3

Index. Vektorer och Elementvisa operationer. Summor och Medelvärden. Grafik i två eller tre dimensioner. Ytor. 20 januari 2016 Sida 1 / 26

Kodexempel från Programmering 2 Tobias Wrigstad, Ph.D.

Enklast att skriva variabelnamn utan ; innehåll och variabelnamn skrivs ut

Föreläsning 9: Turingmaskiner och oavgörbarhet. Turingmaskinen. Den maximalt förenklade modell för beräkning vi kommer använda är turingmaskinen.

TANA17 Matematiska beräkningar med Matlab

Praktisk vägledning för analys av kvalitetsfaktor Kontinuitet

Föreläsning REPETITION & EXTENTA

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

LABORATION 4 OBJEKTORIENTERAD PROGRAMMERING I C++ I

Matematisk Modellering. Redovisning projekt 2. Redovisning projekt 3. Matlabtenta. Matlabtenta. Matlabtenta. Matlabtenta. Föreläsning 4.

Lösningsförslag till tentamen i EDA011, lördagen den 16 december 2006

-Projekt- FMA170- Bildanalys

Föreläsning 2. Täcker material från lektion 1, 2, 3 och 4:

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Linjär algebra med tillämpningar, lab 1

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Exempelduggan. Luffarschack. Koda spel

Tentamen del 2 SF1511, , kl , Numeriska metoder och grundläggande programmering

Matematisk Modellering

Datorlära 6. Arbeta med strängar Inmatning med tangentbordet Bygga ett program med inmatning, funktioner, osv

F4. programmeringsteknik och Matlab

Klassdeklaration. Metoddeklaration. Parameteröverföring

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

Transkript:

2007-11-29 Språkidentifiering Bildanalys, projekt 3 hp Pia Haage, Sophia Holmström Handledare: Karl Åström

Språkidentifiering Bildanalys, projekt 3 hp Innehåll Inledning... 2 Metod... 2 Utförande... 2 Frågeställningar... 2 Arbetsgång... 3 Problem under arbetsgången... 7 Sammanfattning... 7 Bilaga Matlabkod... 8 lang_seg.m... 8 segment.m... 9 harris.m... 10 features.m... 11 train_classify.m... 12 huvudprogram.m... 12 benchmark.m... 12 my_classify.m... 13 1

Inledning Målet med projektet är att kunna klassificera olika texter efter det språk de är skrivna på. Vi kommer att utgå från sex stycken språk där vissa är inom samma språkfamilj. Vi har tänkt utveckla och använda oss av en metod där vi klassificerar texter genom att titta på histogram över utklippta textrutors klustertillhörigheter. Detta är inte en för oss känd metod och ett delsyfte i projektet är därför att undersöka om metoden kan vara lämplig för just språkklassificering. Vi kommer att använda algoritmen K-means för att klustra segment av bilden vilka vi tar fram genom en hörndetektor. Vi kommer att använda oss av beräkningsprogrammet Matlab för skapandet och utvärderingen av metoden. Metod En kortfattad punktlista över metoden vi använde oss av ses nedan. 1. Inläsning av inlärningsbilder till klassificeraren 2. Hittar 180 signifikanta hörnor i varje bild m.h.a. Harris hörndetektor. 3. Klipper ut n n rutor kring de signifikanta hörnen i varje bild, där n är den valda storleken på rutan, och kolonnstaplar dessa rutor i vektorer. 4. Lagrar vektorerna i en matris. 5. Klustrar rutorna till 100 kluster m.h.a. K-means. 6. Tar för varje språk fram ett histogram över klustertillhörigheten för rutorna i språkets textbild. 7. Lagrar histogrammen i en matris. 8. Tränar en klassificerare för användning av klassificeringsmetoden Nearest neighbour. 9. Läser in bilder för utvärdering och skapar histogramvektorer m.h.a. Harris och histogram. 10. Klassificerar bilderna m.h.a. Nearest neighbour och våra inlärningsbilders histogram. 11. Kör Benchmark för utvärdering av programmet. Utförande Frågeställningar Vid projektets start uppkom några frågeställningar som var tvungna att besvaras innan vi kunde börja. Dessa definierar och ramar in projektet och visar också på vad som är varierbart i metoden och kan modifieras för en eventuell förbättring. Vilka språk ska programmet kunna identifiera? Arabiska, engelska, finska, ryska, svenska och tyska. Vilken hörndetektor ska vi använda? Harris hörndetektor. Hur stora rutor ska klippas ut runt de signifikanta hörnen? 7 7 rutor. 2

Hur många olika kluster ska vi använda och hur många iterationer ska vi köra i K-means? 100 kluster och 50 iterationer. Vilken klassificeringsmetod ska vi använda? Nearest neighbour. Arbetsgång Vi började med att ta fram sex stycken lika stora bilder (1100 px 400 px) på de valda språken som skulle användas för att träna klassificeraren. Några språk var markant olika t.ex. arabiska och svenska och några språk var relativt lika t.ex. tyska och engelska. Detta för att testa hur väl metoden skulle fungera. Vi valde inte fler språk p.g.a. projektets storlek. En av inlärningsbilderna ses i figur 1. Figur 1 - Inlärningsbild för arabiska. Utifrån dessa inlärningsbilder skulle vårt program alltså kunna identifiera andra textbilder. Bilderna vi använde oss av skapade vi genom att ta screenshots av texter vi fann på Internet. Texterna vi hittade bearbetade vi först i Word för att normera teckenstorlek (14 pt) och typsnitt (Times New Roman). Detta är en av begränsningarna med vårt program, men också en förutsättning för att kunna göra en bra utvärdering av metoden. Utan normerade texter hade det varit svårt att dra slutsatser om varför metoden skulle fungera eller ej. Som hörndetektor valdes Harris hörndetektor som vi hämtade från Matlabs scriptsamling på Internet, http://www.mathworks.com/matlabcentral/. Denna modifierades något för att passa in i vårt program. 180 signifikanta hörnpunkter valdes för att vi ansåg detta var en lagom mängd punkter med hänsyn till bildstorleken. Hörnpunkter för en av språkbilderna ses i figur 2. 3

Figur 2 - Visar de signifikanta hörnen för en del av en inlärningsbild. Hörnen är inramade i gråa rutor. Hörnpunkterna representerades som koordinater i en vektor. Runt dessa punkter togs sedan 7 7-rutor ut och kolonnstaplades i vektorer. Meningen med rutorna är att olika språk ska ha olika signifikanta rutor. Ett exempel på en ruta ses i figur 3. Figur 3 - En utklippt 7 7-ruta. Alla rutvektorer för samtliga språk lagrades sedan i en matris, se figur 4. Figur 4 - Matris med kolonnstaplade rutor för alla språk 4

Vi ville nu klustra alla rutor m.h.a. K-means. Vi använde Matlabs inbyggda script för K-means. 100 klustercentra valdes för att rutor från samma bokstav idealt skulle hamna i samma kluster. Det gjordes även 50 iterationer av K-means för att minimera det lokala minimumet. Klustercentrumen för det bästa resultatet sparades. Histogram skapades sedan utifrån inlärningsbilderna. Histogrammen bestod av en vektor där t.ex. plats 1 representerar hur många rutor i ett visst språk som tillhör kluster 1. En principskiss för detta visas i figur 5. Figur 5 - Principskiss för skapandet av histogrammen. Ett histogram skapades för varje språk. Dessa ses i figur 6. Figur 6 - Histogram för varje inlärningsbild. I figur 6 ser man att t.ex. arabiska skiljer sig mycket från de latinska språken vilket borde göra arabiska lätt att identifiera. 5

Vi tränade sedan en klassificerare utifrån våra inlärningsbilders histogram. Det skapades en matris T utifrån matrisen X med alla histogram, d.v.s. featurevektorerna, och vektorn Y med siffror motsvarande de olika språken, se figur 7. Figur 7 - Träning av klassificeraren. Klassificeraren skulle använda sig av metoden Nearest neighbour, d.v.s. den jämför andra bilders histogram med matrisen med inlärningsbildernas featurevektorer. Vi testade nu vår metod med några olika bilder, även bilder med varierande storlek och typsnitt. Med samma metod som ovan skapade vi histogram som sedan klassificerades. I klassificeringen märkte vi att arabiska var lätt att identifiera medan de latinska språken ofta förväxlades. Detta var förväntat då arabiska har ett helt annat alfabet och de latinska språken är ganska lika varandra. Vi gjorde även en utvärdering (benchmark) på systemet, där hitrate innebär antal rätt klassificerade bilder genom totalt antal klassificerade bilder. Vi skickade här in två bilder från varje språk, totalt 12 bilder, som var normerade på samma sätt som inlärningsbilderna. Resultatet från utvärderingen ses i figur 8. Figur 8 - Hitrate blev cirka 67% för våra testbilder. Man kan dock ej dra så stora slutsatser av vårt resultat då vi hade få testbilder. Vi provade även att ändra rutstorleken för att se hur detta påverkade hitrate. Resultatet ses i tabell 1. Tabell 1 - Hitrate för olika rutstorlek. Rutstorlek Hitrate 5 5 50% 7 7 67% 9 9 53% 6

P.g.a. tidsbrist hann vi inte testa andra parametervariationer, men om tid funnits hade vi utvärderat följande: Antalet klustercentra Antalet signifikanta hörn Annan klassificeringsmetod Vi hade även velat titta på andra språk och utöka antalet testbilder. Problem under arbetsgången Det största problemet var att hitta textbilder över olika språk som alla hade samma typsnitt och storlek. Detta löste vi genom att kopiera texter från Internet till Word och där välja typsnitt och teckenstorlek. Vi hade även problem med K-means då det i varje iteration skapades tomma kluster. Vi använde då en inställning i K-means som skapade ett nytt kluster utifrån en av punkterna. Sammanfattning Vi har testat en metod för språkklassifikation som baseras på utklipp av textbilden runt signifikanta punkter. Dessa jämfördes med kluster från inlästa bilders textutklipp för att bestämma textens språk. Det är svårt att avgöra om metoden skulle fungera då det inte fanns tillräckligt med tid att testa den fullt ut. Den skulle eventuellt kunna användas för att identifiera olika språkgrupper då vår metod är bra på att identifiera språk med olika alfabet och skrivsätt. För identifiering inom en speciell språkgrupp tror vi att en annan metod bör användas, t.ex. OCR. 7

Bilaga Matlabkod lang_seg.m % Segmentera olika språkbilder och lagra i en matris (49,1080). Varje % kolumn är en kolonnstaplad 7*7 bild runt ett detekterat hörn. datadir = '../projektbilder/jpg'; rutarea = 49; allsegment = zeros(rutarea,(180*6)); bilder = {'a_learn','e_learn','f_learn','r_learn','s_learn','t_learn'}; k = 0; for i = 1:length(bilder) file = char(bilder(i)); fnamebild = [datadir filesep file '.jpg']; bild = imread(fnamebild); frame = rgb2gray(bild); utsegment = segment(frame); for j = 1:180 allsegment(:,k+j) = utsegment{j}; k = k+180; % Klustring av segmenten mha k-means: allsegment = allsegment'; IDX=0; C=0; min_sumd=inf; for i=1:50 [IDX2,C2,sumd2] = kmeans(allsegment,100,'emptyaction','singleton','display','final','replicat es',1); if sum(sumd2)<min_sumd min_sumd = sum(sumd2); IDX = IDX2; C = C2; save C C; save IDX IDX; save min_sumd min_sumd; % Skapar featurevektorer genom att göra ett histogram. X = zeros(6,100); for i = 1:6 8

file = char(bilder(i)); fnamebild = [datadir filesep file '.jpg']; bild = imread(fnamebild); frame = rgb2gray(bild); X(i,:) = features(frame,c); %Returnerar histogram Y = [1;2;3;4;5;6]; %Vilket språk X tillhör. 1=Arabiska, 2=Engelska, 3=Finska, 4=Ryska, 5=Svenska, 6=Tyska. T = train_classify(x,y); save T T; figure(2) subplot(2,3,1); plot(x(1,:)); title('arabiska'); subplot(2,3,2); plot(x(2,:)); title('engelska'); subplot(2,3,3); plot(x(3,:)); title('finska'); subplot(2,3,4); plot(x(4,:)); title('ryska'); subplot(2,3,5); plot(x(5,:)); title('svenska'); subplot(2,3,6); plot(x(6,:)); title('tyska'); segment.m function utsegment = segment(frame) [m,n] = size(frame); % Gör bilden svartvit for i = 1:m for j = 1:n if frame(i,j) > 180 frame(i,j) = 255; else frame(i,j) = 0; save frame frame PIP=Harris(frame); utsegment = cell(1,180); rutarea = 49; for i = 1:180 %Tar ut de 180 första punkterna för att garantera samma vektor längd. ruta = zeros(rutarea,1); index = 1; while index < rutarea + 1 for col = (PIP(i,2)-3):(PIP(i,2)+3) for row = (PIP(i,1)-3):(PIP(i,1)+3) ruta(index)=frame(row,col); index = index + 1; utsegment{i} = ruta; 9

harris.m % Harris detector % The code calculates % the Harris Feature Points(FP) % % When u execute the code, the test image file opened % and u have to select by the mouse the region where u % want to find the Harris points, % then the code will print out and display the feature % points in the selected region. % You can select the number of FPs by changing the variables % max_n & min_n % A. Ganoun function PIP=Harris(Imag) load frame; Imag = frame; I =double(frame); %**************************** % imshow(frame); % k = waitforbuttonpress; % point1 = get(gca,'currentpoint'); %button down detected % rectregion = rbbox; %%%return figure units % point2 = get(gca,'currentpoint');%%%%button up detected % point1 = point1(1,1:2); %%% extract col/row min and maxs % point2 = point2(1,1:2); % lowerleft = min(point1, point2); % upperright = max(point1, point2); % ymin = round(lowerleft(1)); %%% arrondissement aux nombrs les plus proches % ymax = round(upperright(1)); % xmin = round(lowerleft(2)); % xmax = round(upperright(2)); %*********************************** % Aj=6; [m,n] = size(frame); cmin=1; cmax=m; rmin=1; rmax=n; min_n=180;max_n=200; %%%%%%%%%%%%%%Intrest Points %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% sigma=2; Thrshold=20; r=6; disp=1; dx = [-1 0 1; -1 0 1; -1 0 1]; % The Mask dy = dx'; %%%%%% Ix = conv2(i(cmin:cmax,rmin:rmax), dx, 'same'); Iy = conv2(i(cmin:cmax,rmin:rmax), dy, 'same'); g = fspecial('gaussian',max(1,fix(6*sigma)), sigma); %%%%%% Gaussien Filter %%%%% Ix2 = conv2(ix.^2, g, 'same'); Iy2 = conv2(iy.^2, g, 'same'); 10

Ixy = conv2(ix.*iy, g,'same'); %%%%%%%%%%%%%% k = 0.04; R11 = (Ix2.*Iy2 - Ixy.^2) - k*(ix2 + Iy2).^2; R11=(1000/max(max(R11)))*R11; R=R11; ma=max(max(r)); sze = 2*r+1; MX = ordfilt2(r,sze^2,ones(sze)); R11 = (R==MX)&(R>Thrshold); count=sum(sum(r11(5:size(r11,1)-5,5:size(r11,2)-5))); loop=0; while (((count<min_n) (count>max_n))&(loop<30)) if count>max_n Thrshold=Thrshold*1.5; elseif count < min_n Thrshold=Thrshold*0.5; R11 = (R==MX)&(R>Thrshold); count=sum(sum(r11(5:size(r11,1)-5,5:size(r11,2)-5))); loop=loop+1; 5); R=R*0; R(5:size(R11,1)-5,5:size(R11,2)-5)=R11(5:size(R11,1)-5,5:size(R11,2)- [r1,c1] = find(r); PIP=[r1+cmin,c1+rmin];%% IP %keyboard; %%%%%%%%%%%%%%%%%%%% Display Size_PI=size(PIP,1); for r=1: Size_PI I(PIP(r,1)-2:PIP(r,1)+2,PIP(r,2)-2)=200; I(PIP(r,1)-2:PIP(r,1)+2,PIP(r,2)+2)=200; I(PIP(r,1)-2,PIP(r,2)-2:PIP(r,2)+2)=200; I(PIP(r,1)+2,PIP(r,2)-2:PIP(r,2)+2)=200; % imshow(uint8(i)) features.m function histo = features(im,centra); %Skickar med bild och klustercentra utsegment = segment(im); %Cell 1,180 med vektorer m längd 49,1 histo = zeros(1,100); 11

for i = 1:180 mindist = Inf; k = 0; for j = 1:100 if sum(abs(utsegment{i}'-centra(j,:))) < mindist klustercenter utsegment ligger närmast mindist = sum(abs(utsegment{i}'-centra(j,:))); k = j; histo(k) = histo(k) + 1; %Fyller ut histogrammet %Kollar vilket train_classify.m function T = train_classify(x,y) T = [X,Y]; huvudprogram.m datadir = '../projektbilder/jpg/test/'; myclassify = 'my_classify'; % Ange namnet på din ocr-rutin. load T; hitrate=benchmark(myclassify,datadir,t); disp(['using method ' myclassify ' on dataset ' datadir ' I obtained a hitrate of ' num2str(hitrate) '.']); benchmark.m function hitrate=benchmark(my_classify,datadir,t); thispath = pwd; eval(['cd ' datadir]); nbr_correct = 0; nbr_char = 0; a = dir; for ii=1:length(a); [path,name,ext,ver] = fileparts(a(ii).name); if strcmp(ext,'.jpg'), % Hittat en bild fname = name; fid = fopen([fname '.txt'],'r'); facit = fgetl(fid); fclose(fid); im = imread([fname ext]); 12

eval(['cd ' thispath]); guess = feval(my_classify,im,t); eval(['cd ' datadir]); thisres = guess(1:length(facit))==facit; nbr_correct = nbr_correct+sum(thisres); nbr_char = nbr_char + length(facit);,, hitrate = nbr_correct/nbr_char; cd(thispath); my_classify.m function my_classify=my_classify(im,t); rutarea = 49; allsegment = zeros(rutarea,180); % k = 0; utsegment = segment(im); for j = 1:180 allsegment(:,j) = utsegment{j}; % k = k+180; X_classify = zeros(1,100); load C; %Klustercentra X_classify(1,:) = features(im,c); %Returnerar histogram my_classify = classify(t,x_classify(1,:)); 13