SlideShare uma empresa Scribd logo
1 de 27
Pág.
Pág.
Daniel Vieira
Pesquisador Científico
daniel.vieira@opencadd.eng.br
Visão Computacional com MATLAB
Pág.
Computer Vision com MATLAB
3
 Detecção de Objetos através de Features
 Criação de Imagens Panorâmicas
 Análise de Movimento por Fluxo Ótico
 Classificação por Bag of Features
Pág.
Detecção através de Features
4
Problema: encontrar um objeto
específico em uma imagem com
muitos objetos
y
x
Pág. 5
Detecção através de Features
featX=detectMSERFeatures(rgb2gray(x),...
'RegionAreaRange',[30 5000]);
featY=detectMSERFeatures(rgb2gray(y),'RegionAreaRange',[30 5000]);
descX=extractFeatures(rgb2gray(x),featX);
descY=extractFeatures(rgb2gray(y),featY);
matched=matchFeatures(descX,descY,'MatchThreshold',5,'MaxRatio',0.95, ‘Unique’,true);
Pág. 6
Detecção através de Features
[Tr,pointsX,pointsY]=estimateGeometricTransform(featX(matched(:,1)),featY(matched(:,2)),'affine’);
figure, showMatchedFeatures(x,y,pointsX,pointsY,'montage');
Pág. 7
Detecção através de Features
mask=ones(size(x,1),size(x,2));
ref=imref2d(size(y));
maskW=imwarp(mask,Tr,'OutputView',ref);
yBlend=repmat((maskW+0.6*(~maskW)),1,1,3).*im2double(y);
yBlend
Pág. 8
Imagens Panorâmicas
vid=vision.VideoFileReader('copan.mp4');
frame0=vid();
gray0=rgb2gray(frame0);
feat0=detectMSERFeatures(gray0,'RegionAreaRange',[1000 14000]);
desc0=extractFeatures(gray0,feat0);
m=1;
Tr=cell(0);
while ~isDone(vid)
frame1=vid();
gray1=rgb2gray(frame1);
feat1=detectMSERFeatures(gray1,'RegionAreaRange',[1000 14000]);
desc1=extractFeatures(gray1,feat1);
matched=matchFeatures(desc0,desc1,'Unique',true);
Tr{m}=estimateGeometricTransform(feat0(matched(:,1)),feat1(matched(:,2)),'affine','Confidence',99.9,'MaxNumTrials',2000);
frame0=frame1;
gray0=gray1;
feat0=feat1;
desc0=desc1;
m=m+1;
end
%Aplica correções nas Transformações...
...
%Usa Transformações corrigidas para dimensionar panorama...
...
[xLimit(k,:),yLimit(k,:)]=outputLimits(Tr{k},[1 Isize(2)],[1 Isize(1)]);
...
%Pré-aloca panorama, inicia referencial
panorama=zeros([height width 3]);
...
panoramaView=imref2d([height width],xLimits,yLimits);
Pág. 9
Imagens Panorâmicas
hBlender=vision.AlphaBlender('Operation','Binary Mask','MaskSource','Input port’);
reset(vid);
while ~isDone(vid)
frame=vid();
W=imwarp(frame,Tr{k},'OutputView', panoramaView);
Wmask=(imwarp(ones(size(frame)),Tr{k},'OutputView',panoramaView)==1);
panorama=hBlender(panorama,double(W),Wmask);
end
imshow(panorama,[])
Pág.
Fluxo Ótico
𝐼 𝑥 𝑢+ 𝐼 𝑦 𝑣+ 𝐼𝑡 = 0
(𝑢, 𝑣) → Fluxo Ótico (velocidades)
(𝐼 𝑥, 𝐼 𝑦, 𝐼𝑡) → Derivadas da imagem no espaço e no tempo
opticalFlowHS
Método de Horn-Schunck
opticalFlowLK
Método de Lucas-Kanade
opticalFlowLKDoG
opticalFlowFarneBack
Método de Farneback
• Assume que fluxo é suave sobre a
imagem inteira;
• Aplica filtros de Sobel para calcular as
derivadas espaciais, e filtro [-1 1] para a
derivada temporal;
• Resolve iterativamente para u e v de
forma a minimizar a equação de erro.
• Divide a imagem em seções e assume
velocidades constantes em cada uma;
• Aplica filtros [-1 8 0 -8 1]/12 para calcular
as derivadas espaciais, e filtro [-1 1] para
a temporal;
• Calcula u e v em cada seção por mínimos
quadrados.
• Variante do método de Lucas-Kanade que
utiliza filtros gaussianos e de derivadas de
gaussianas ao invés dos citados acima.
• Divide a imagem em seções e ajusta
polinômio quadrático sobre cada seção;
• Aplica translações sobre os polinômios
ajustados e, observando como os
polinômios se transformam, estima as
velocidades dos pontos da imagem;
• Baixo erro comparado a outros métodos
(Two-Frame Motion Estimation Based on
Polynomial Expansion).
Pág.
vid=vision.VideoFileReader('waves.mp4');
flow=opticalFlowFarneback(...);
frame=vid();
Q=estimateFlow(flow,rgb2gray(frame));
%jogar fora primeiro frame!
while ~isDone(vid)
frame=vid();
Q=estimateFlow(flow,rgb2gray(frame));
...
end
reset(flow)
Fluxo Ótico
opticalFlowLK
opticalFlowFarneback
opticalFlowHS
opticalFlowLKDoG
Q =
opticalFlow with properties:
Vx: [720×1280 single]
Vy: [720×1280 single]
Orientation: [720×1280 single]
Magnitude: [720×1280 single]
Pág.
Fluxo Ótico
opticalFlowFarneback
Pág.
Fluxo Ótico
Pág.
Pág. 15
Fluxo Ótico
opticalFlowLK
opticalFlowLKDoG
Pág.
Fluxo Ótico
Pág. 17
Problema: criar um classificador
de imagens de comidas
Classificação de Imagens por
Bag of Features
Fonte do dataset: grebvm2.epfl.ch/lin/food/Food-11.zip
Pág. 18
Dataset:
 1.16GB
 Mais de 16 mil imagens
 Pré-separadas em 11 categorias:
 Bread
 Dessert
 Diary
 Egg
 Fried
 Meat
 Pasta
 Rice
 Seafood
 Soup
 Veggies
Classificação de Imagens por
Bag of Features
Pág. 19
Algoritmo:
 Separação de imagens para treino e teste
 Extraçao de Features das Imagens de treino
 Qual algoritmo de detecção de features?
 Clustering das features, criando o “vocabulário visual”
 Qual o critério de corte das features a serem usadas?
 Quantas “palavras” (número de clusters)?
 Qual método de clustering? Kmeans, outro, quais parâmetros?
 Treino do classificador
 Qual algoritmo de classificação? KNN, Naive Bayes, SVM...?
 Avaliação do resultado (matriz de confusão)
Classificação de Imagens por
Bag of Features
Pág. 20
Classificação de Imagens por
Bag of Features
ds=imageDatastore('./foods2’,...
'IncludeSubfolders',true,...
'LabelSource','foldernames');
ds=shuffle(ds);
dsTrain=partition(ds,5,1);
dsTest=partition(ds,5,2);
istrained=false;
if ~istrained
Q=bagOfFeatures(dsTrain,'VocabularySize’,20000);
save('foodBag.mat','Q’);
classifier=trainImageCategoryClassifier(dsTrain,Q);
confmat=evaluate(classifier,dsTest);
save('foodModel.mat','classifier');
else
load('foodBag.mat’);
load('foodModel.mat');
end
~10 mil imagens
~2 mil imagens cada
Pág. 21
Classificação de Imagens por Bag of Features
𝑇 ≈ 12ℎ
Pág. 22
Classificação de Imagens por Bag of Features
bar(encode(Q,X),’hist’)
Visual Word
Frequency
predict(classifier,X)
Pág. 23
Classificação de Imagens por Bag of Features
Pág. 24
Classificação de Imagens por Bag of Features
Pág. 25
Classificação de Imagens por Bag of Features
Pág. 26
Classificação de Imagens por Bag of Features
Pág.
OBRIGADO!
DANIEL.VIEIRA@OPENCADD.ENG.BR
AV. BRIGADEIRO FARIA LIMA, 1931, CJ 152
JARDIM PAULISTANO
SÃO PAULO / SP

Mais conteúdo relacionado

Semelhante a Visão Computacional

CAP 375 - Aula 1 - Introdução - Eduardo Luz
CAP 375 - Aula 1 - Introdução - Eduardo LuzCAP 375 - Aula 1 - Introdução - Eduardo Luz
CAP 375 - Aula 1 - Introdução - Eduardo Luz
Eduardo Luz
 
Apresentação - CONTROLE ROBÓTICO REFERENCIADO POR SISTEMA DE VISÃO COMPUTACIO...
Apresentação - CONTROLE ROBÓTICO REFERENCIADO POR SISTEMA DE VISÃO COMPUTACIO...Apresentação - CONTROLE ROBÓTICO REFERENCIADO POR SISTEMA DE VISÃO COMPUTACIO...
Apresentação - CONTROLE ROBÓTICO REFERENCIADO POR SISTEMA DE VISÃO COMPUTACIO...
Hamilton Sena
 

Semelhante a Visão Computacional (12)

CAP 375 - Aula 1 - Introdução - Eduardo Luz
CAP 375 - Aula 1 - Introdução - Eduardo LuzCAP 375 - Aula 1 - Introdução - Eduardo Luz
CAP 375 - Aula 1 - Introdução - Eduardo Luz
 
Comp.e Progr.Aplicada ao Processo de Projeto, estudo uso Playground.pdf
Comp.e Progr.Aplicada ao Processo de Projeto, estudo uso Playground.pdfComp.e Progr.Aplicada ao Processo de Projeto, estudo uso Playground.pdf
Comp.e Progr.Aplicada ao Processo de Projeto, estudo uso Playground.pdf
 
Apresentação - CONTROLE ROBÓTICO REFERENCIADO POR SISTEMA DE VISÃO COMPUTACIO...
Apresentação - CONTROLE ROBÓTICO REFERENCIADO POR SISTEMA DE VISÃO COMPUTACIO...Apresentação - CONTROLE ROBÓTICO REFERENCIADO POR SISTEMA DE VISÃO COMPUTACIO...
Apresentação - CONTROLE ROBÓTICO REFERENCIADO POR SISTEMA DE VISÃO COMPUTACIO...
 
Introdução ao JavaFX
Introdução ao JavaFXIntrodução ao JavaFX
Introdução ao JavaFX
 
Como criar um mapa temático interativo com dados abertos e D3.js
Como criar um mapa temático interativo com dados abertos e D3.jsComo criar um mapa temático interativo com dados abertos e D3.js
Como criar um mapa temático interativo com dados abertos e D3.js
 
Aula05
Aula05Aula05
Aula05
 
MRO predict
MRO predictMRO predict
MRO predict
 
LambdaDay: Backbone.js
LambdaDay: Backbone.jsLambdaDay: Backbone.js
LambdaDay: Backbone.js
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
 
Operações com dados espaciais (Vetor) em R
Operações com dados espaciais (Vetor) em ROperações com dados espaciais (Vetor) em R
Operações com dados espaciais (Vetor) em R
 
Apresentação sobre MVVMC
Apresentação sobre MVVMCApresentação sobre MVVMC
Apresentação sobre MVVMC
 
Congresso TI 2015: Introducao ao Phonegap (Cordova)
Congresso TI 2015: Introducao ao Phonegap (Cordova)Congresso TI 2015: Introducao ao Phonegap (Cordova)
Congresso TI 2015: Introducao ao Phonegap (Cordova)
 

Mais de Opencadd Advanced Technology

Mais de Opencadd Advanced Technology (20)

Openday PUC-RIO - Indústria 4.0 e aplicação no segmento de ar condicionado
Openday PUC-RIO - Indústria 4.0 e aplicação no segmento de ar condicionadoOpenday PUC-RIO - Indústria 4.0 e aplicação no segmento de ar condicionado
Openday PUC-RIO - Indústria 4.0 e aplicação no segmento de ar condicionado
 
Openday PUC-RIO - Determinação da Trajetória ótima em pistas de corrida com r...
Openday PUC-RIO - Determinação da Trajetória ótima em pistas de corrida com r...Openday PUC-RIO - Determinação da Trajetória ótima em pistas de corrida com r...
Openday PUC-RIO - Determinação da Trajetória ótima em pistas de corrida com r...
 
Openday PUC-RIO - Detecção de Operação Anormal em Aero Geradores
Openday PUC-RIO - Detecção de Operação Anormal em Aero GeradoresOpenday PUC-RIO - Detecção de Operação Anormal em Aero Geradores
Openday PUC-RIO - Detecção de Operação Anormal em Aero Geradores
 
Openday PUC-RIO - Transmissão de dados pela luz visível
Openday PUC-RIO - Transmissão de dados pela luz visívelOpenday PUC-RIO - Transmissão de dados pela luz visível
Openday PUC-RIO - Transmissão de dados pela luz visível
 
Openday PUC-RIO - Engenharia de Requisitos
Openday PUC-RIO - Engenharia de RequisitosOpenday PUC-RIO - Engenharia de Requisitos
Openday PUC-RIO - Engenharia de Requisitos
 
Openday PUC-RIO - Ferramenta gráfica para modelagem e análise em Engenharia E...
Openday PUC-RIO - Ferramenta gráfica para modelagem e análise em Engenharia E...Openday PUC-RIO - Ferramenta gráfica para modelagem e análise em Engenharia E...
Openday PUC-RIO - Ferramenta gráfica para modelagem e análise em Engenharia E...
 
INOVADEF - Apresentação Brigadeiro Romão
INOVADEF - Apresentação Brigadeiro RomãoINOVADEF - Apresentação Brigadeiro Romão
INOVADEF - Apresentação Brigadeiro Romão
 
INOVADEF - Apresentação Marcelo Lopes
INOVADEF - Apresentação Marcelo LopesINOVADEF - Apresentação Marcelo Lopes
INOVADEF - Apresentação Marcelo Lopes
 
INOVADEF - Apresentação Sender Rocha
INOVADEF - Apresentação Sender RochaINOVADEF - Apresentação Sender Rocha
INOVADEF - Apresentação Sender Rocha
 
Apresentação Allyson Chiarini
Apresentação Allyson ChiariniApresentação Allyson Chiarini
Apresentação Allyson Chiarini
 
Apresentação Osvaldo Maia
Apresentação Osvaldo MaiaApresentação Osvaldo Maia
Apresentação Osvaldo Maia
 
Indústria 4.0 - Vantagens e Impactos para a sociedade. Fabiana Tarabal
Indústria 4.0 - Vantagens e Impactos para a sociedade. Fabiana TarabalIndústria 4.0 - Vantagens e Impactos para a sociedade. Fabiana Tarabal
Indústria 4.0 - Vantagens e Impactos para a sociedade. Fabiana Tarabal
 
Licenciamento math works
Licenciamento math worksLicenciamento math works
Licenciamento math works
 
Webinar Classificação Images com MATLAB
Webinar Classificação Images com MATLABWebinar Classificação Images com MATLAB
Webinar Classificação Images com MATLAB
 
Webinar Novidades da Release R2017b
Webinar Novidades da Release R2017bWebinar Novidades da Release R2017b
Webinar Novidades da Release R2017b
 
Desenvolvimento de software autônomo para determinação e controle de órbita e...
Desenvolvimento de software autônomo para determinação e controle de órbita e...Desenvolvimento de software autônomo para determinação e controle de órbita e...
Desenvolvimento de software autônomo para determinação e controle de órbita e...
 
Simulação e desenvolvimento de algoritmos de tempo real usando Matlab/Simulin...
Simulação e desenvolvimento de algoritmos de tempo real usando Matlab/Simulin...Simulação e desenvolvimento de algoritmos de tempo real usando Matlab/Simulin...
Simulação e desenvolvimento de algoritmos de tempo real usando Matlab/Simulin...
 
Breve histórico da engenharia de sistemas no Brasil e as Iniciativas atuais d...
Breve histórico da engenharia de sistemas no Brasil e as Iniciativas atuais d...Breve histórico da engenharia de sistemas no Brasil e as Iniciativas atuais d...
Breve histórico da engenharia de sistemas no Brasil e as Iniciativas atuais d...
 
Utilização da Engenharia de Requisitos: Onde, quando e como utilizar
Utilização da Engenharia de Requisitos: Onde, quando e como utilizarUtilização da Engenharia de Requisitos: Onde, quando e como utilizar
Utilização da Engenharia de Requisitos: Onde, quando e como utilizar
 
Webinar SDR
Webinar SDRWebinar SDR
Webinar SDR
 

Último

Apresentação Power Embedded - Descubra uma nova forma de compartilhar relatór...
Apresentação Power Embedded - Descubra uma nova forma de compartilhar relatór...Apresentação Power Embedded - Descubra uma nova forma de compartilhar relatór...
Apresentação Power Embedded - Descubra uma nova forma de compartilhar relatór...
Dirceu Resende
 

Último (7)

From_SEH_Overwrite_with_Egg_Hunter_to_Get_a_Shell_PT-BR.pdf
From_SEH_Overwrite_with_Egg_Hunter_to_Get_a_Shell_PT-BR.pdfFrom_SEH_Overwrite_with_Egg_Hunter_to_Get_a_Shell_PT-BR.pdf
From_SEH_Overwrite_with_Egg_Hunter_to_Get_a_Shell_PT-BR.pdf
 
EAD Curso - CIÊNCIA DE DADOS NA INDÚSTTRIA
EAD Curso - CIÊNCIA DE DADOS NA INDÚSTTRIAEAD Curso - CIÊNCIA DE DADOS NA INDÚSTTRIA
EAD Curso - CIÊNCIA DE DADOS NA INDÚSTTRIA
 
Apostila e caderno de exercicios de WORD
Apostila e caderno de exercicios de  WORDApostila e caderno de exercicios de  WORD
Apostila e caderno de exercicios de WORD
 
Apresentação Power Embedded - Descubra uma nova forma de compartilhar relatór...
Apresentação Power Embedded - Descubra uma nova forma de compartilhar relatór...Apresentação Power Embedded - Descubra uma nova forma de compartilhar relatór...
Apresentação Power Embedded - Descubra uma nova forma de compartilhar relatór...
 
Entrevistas, artigos, livros & citações de Paulo Pagliusi
Entrevistas, artigos, livros & citações de Paulo PagliusiEntrevistas, artigos, livros & citações de Paulo Pagliusi
Entrevistas, artigos, livros & citações de Paulo Pagliusi
 
[ServiceNow] Upgrade de versão - 2ª edição (Revisada, atualizada e ampliada)
[ServiceNow] Upgrade de versão - 2ª edição (Revisada, atualizada e ampliada)[ServiceNow] Upgrade de versão - 2ª edição (Revisada, atualizada e ampliada)
[ServiceNow] Upgrade de versão - 2ª edição (Revisada, atualizada e ampliada)
 
Palestras sobre Cibersegurança em Eventos - Paulo Pagliusi
Palestras sobre Cibersegurança em Eventos - Paulo PagliusiPalestras sobre Cibersegurança em Eventos - Paulo Pagliusi
Palestras sobre Cibersegurança em Eventos - Paulo Pagliusi
 

Visão Computacional

  • 3. Pág. Computer Vision com MATLAB 3  Detecção de Objetos através de Features  Criação de Imagens Panorâmicas  Análise de Movimento por Fluxo Ótico  Classificação por Bag of Features
  • 4. Pág. Detecção através de Features 4 Problema: encontrar um objeto específico em uma imagem com muitos objetos y x
  • 5. Pág. 5 Detecção através de Features featX=detectMSERFeatures(rgb2gray(x),... 'RegionAreaRange',[30 5000]); featY=detectMSERFeatures(rgb2gray(y),'RegionAreaRange',[30 5000]); descX=extractFeatures(rgb2gray(x),featX); descY=extractFeatures(rgb2gray(y),featY); matched=matchFeatures(descX,descY,'MatchThreshold',5,'MaxRatio',0.95, ‘Unique’,true);
  • 6. Pág. 6 Detecção através de Features [Tr,pointsX,pointsY]=estimateGeometricTransform(featX(matched(:,1)),featY(matched(:,2)),'affine’); figure, showMatchedFeatures(x,y,pointsX,pointsY,'montage');
  • 7. Pág. 7 Detecção através de Features mask=ones(size(x,1),size(x,2)); ref=imref2d(size(y)); maskW=imwarp(mask,Tr,'OutputView',ref); yBlend=repmat((maskW+0.6*(~maskW)),1,1,3).*im2double(y); yBlend
  • 8. Pág. 8 Imagens Panorâmicas vid=vision.VideoFileReader('copan.mp4'); frame0=vid(); gray0=rgb2gray(frame0); feat0=detectMSERFeatures(gray0,'RegionAreaRange',[1000 14000]); desc0=extractFeatures(gray0,feat0); m=1; Tr=cell(0); while ~isDone(vid) frame1=vid(); gray1=rgb2gray(frame1); feat1=detectMSERFeatures(gray1,'RegionAreaRange',[1000 14000]); desc1=extractFeatures(gray1,feat1); matched=matchFeatures(desc0,desc1,'Unique',true); Tr{m}=estimateGeometricTransform(feat0(matched(:,1)),feat1(matched(:,2)),'affine','Confidence',99.9,'MaxNumTrials',2000); frame0=frame1; gray0=gray1; feat0=feat1; desc0=desc1; m=m+1; end %Aplica correções nas Transformações... ... %Usa Transformações corrigidas para dimensionar panorama... ... [xLimit(k,:),yLimit(k,:)]=outputLimits(Tr{k},[1 Isize(2)],[1 Isize(1)]); ... %Pré-aloca panorama, inicia referencial panorama=zeros([height width 3]); ... panoramaView=imref2d([height width],xLimits,yLimits);
  • 9. Pág. 9 Imagens Panorâmicas hBlender=vision.AlphaBlender('Operation','Binary Mask','MaskSource','Input port’); reset(vid); while ~isDone(vid) frame=vid(); W=imwarp(frame,Tr{k},'OutputView', panoramaView); Wmask=(imwarp(ones(size(frame)),Tr{k},'OutputView',panoramaView)==1); panorama=hBlender(panorama,double(W),Wmask); end imshow(panorama,[])
  • 10. Pág. Fluxo Ótico 𝐼 𝑥 𝑢+ 𝐼 𝑦 𝑣+ 𝐼𝑡 = 0 (𝑢, 𝑣) → Fluxo Ótico (velocidades) (𝐼 𝑥, 𝐼 𝑦, 𝐼𝑡) → Derivadas da imagem no espaço e no tempo opticalFlowHS Método de Horn-Schunck opticalFlowLK Método de Lucas-Kanade opticalFlowLKDoG opticalFlowFarneBack Método de Farneback • Assume que fluxo é suave sobre a imagem inteira; • Aplica filtros de Sobel para calcular as derivadas espaciais, e filtro [-1 1] para a derivada temporal; • Resolve iterativamente para u e v de forma a minimizar a equação de erro. • Divide a imagem em seções e assume velocidades constantes em cada uma; • Aplica filtros [-1 8 0 -8 1]/12 para calcular as derivadas espaciais, e filtro [-1 1] para a temporal; • Calcula u e v em cada seção por mínimos quadrados. • Variante do método de Lucas-Kanade que utiliza filtros gaussianos e de derivadas de gaussianas ao invés dos citados acima. • Divide a imagem em seções e ajusta polinômio quadrático sobre cada seção; • Aplica translações sobre os polinômios ajustados e, observando como os polinômios se transformam, estima as velocidades dos pontos da imagem; • Baixo erro comparado a outros métodos (Two-Frame Motion Estimation Based on Polynomial Expansion).
  • 11. Pág. vid=vision.VideoFileReader('waves.mp4'); flow=opticalFlowFarneback(...); frame=vid(); Q=estimateFlow(flow,rgb2gray(frame)); %jogar fora primeiro frame! while ~isDone(vid) frame=vid(); Q=estimateFlow(flow,rgb2gray(frame)); ... end reset(flow) Fluxo Ótico opticalFlowLK opticalFlowFarneback opticalFlowHS opticalFlowLKDoG Q = opticalFlow with properties: Vx: [720×1280 single] Vy: [720×1280 single] Orientation: [720×1280 single] Magnitude: [720×1280 single]
  • 14. Pág.
  • 17. Pág. 17 Problema: criar um classificador de imagens de comidas Classificação de Imagens por Bag of Features Fonte do dataset: grebvm2.epfl.ch/lin/food/Food-11.zip
  • 18. Pág. 18 Dataset:  1.16GB  Mais de 16 mil imagens  Pré-separadas em 11 categorias:  Bread  Dessert  Diary  Egg  Fried  Meat  Pasta  Rice  Seafood  Soup  Veggies Classificação de Imagens por Bag of Features
  • 19. Pág. 19 Algoritmo:  Separação de imagens para treino e teste  Extraçao de Features das Imagens de treino  Qual algoritmo de detecção de features?  Clustering das features, criando o “vocabulário visual”  Qual o critério de corte das features a serem usadas?  Quantas “palavras” (número de clusters)?  Qual método de clustering? Kmeans, outro, quais parâmetros?  Treino do classificador  Qual algoritmo de classificação? KNN, Naive Bayes, SVM...?  Avaliação do resultado (matriz de confusão) Classificação de Imagens por Bag of Features
  • 20. Pág. 20 Classificação de Imagens por Bag of Features ds=imageDatastore('./foods2’,... 'IncludeSubfolders',true,... 'LabelSource','foldernames'); ds=shuffle(ds); dsTrain=partition(ds,5,1); dsTest=partition(ds,5,2); istrained=false; if ~istrained Q=bagOfFeatures(dsTrain,'VocabularySize’,20000); save('foodBag.mat','Q’); classifier=trainImageCategoryClassifier(dsTrain,Q); confmat=evaluate(classifier,dsTest); save('foodModel.mat','classifier'); else load('foodBag.mat’); load('foodModel.mat'); end ~10 mil imagens ~2 mil imagens cada
  • 21. Pág. 21 Classificação de Imagens por Bag of Features 𝑇 ≈ 12ℎ
  • 22. Pág. 22 Classificação de Imagens por Bag of Features bar(encode(Q,X),’hist’) Visual Word Frequency predict(classifier,X)
  • 23. Pág. 23 Classificação de Imagens por Bag of Features
  • 24. Pág. 24 Classificação de Imagens por Bag of Features
  • 25. Pág. 25 Classificação de Imagens por Bag of Features
  • 26. Pág. 26 Classificação de Imagens por Bag of Features
  • 27. Pág. OBRIGADO! DANIEL.VIEIRA@OPENCADD.ENG.BR AV. BRIGADEIRO FARIA LIMA, 1931, CJ 152 JARDIM PAULISTANO SÃO PAULO / SP

Notas do Editor

  1. Bom dia Pessoal, meu nome é Daniel Vieira, sou Pesquisador Científico daqui da Opencadd. Obrigada por estar conosco nesta manhã. Neste Webinar mostrarei para vocês algumas ferramentas de visão computacional para detecção de objetos, identificação de objetos e análise de movimento. Com o apoio neste webinar, aqui ao meu lado está o .... Caso vocês possuam dúvidas, peço que nos envie através do item “Questões” que aparece para vocês.
  2. No primeiro exemplo mostrarei uma forma simples de encontrar objetos conhecidos em uma imagem contendo muitos objetos. Como exemplo, imagine que quero que o algoritmo encontre o caderno da foto à esquerda numa imagem como a da foto direita. Note a diferença de ângulo e iluminação entre as duas fotos, e o acobertamento parcial do caderno na segunda.
  3. Um dos métodos mais simples para realizar esta tarefa é através de Feature Matching. Primeiro se aplica tanto no template quanto na imagem uma função de detecção de Features; aqui escolhi detectMSERFeatures - Maximally Stable Extremal Regions - que detecta regiões aproximadamente constantes na imagem e retorna aproximações elípticas de cada uma. Em seguida se transforma as features detectadas em descritores, e utiliza-se estes para dar match entre as features das duas imagens - através das funções extractFeatures e matchFeatures respectivamente. Notem que foram especificados alguns parâmetros para cada função, há um certo trabalho experimental até encontrar os parâmetros mais adequados para a tarefa.
  4. Com o match entre as features de cada imagem é possível estimar a transformação geométrica entre as duas imagens e ressaltar os pontos utilizados.
  5. Por fim podemos usar a transformação calculada para ressaltar o objeto na imagem, utilizando as funções imref2d para settar um referencial adequado e imwarp para aplicar a transformação. Este método é bastante simples e nem sempre suficientemente preciso
  6. A função vision.VideoFileReader cria um objeto leitor de vídeos. Percorre-se o vídeo inteiro até o final (verificado com o método isDone) e a cada frame se segue o mesmo procedimento do exemplo anterior: detecta features, extrai descritores, match features destre frame com o frame anterior, estima transformação geométrica. Ao final do vídeo, aplica-se correções que jular necessárias às transformações obtidas, utiliza-se o tamanho dos frames e as transformações obtidas para calcular o tamanho da imagem panorâmica final (outputLimits) e cria referencial (imref2d)...
  7. Por último, se percorre o vídeo novamente aplicando as transformações em cada frame (imwarp) e “colando” numa imagem de saída (objeto criado com vision.AlphaBlender).
  8. O fluxo ótico (u,v) é definido resolvendo esta equação, onde Ix e Iy são as derivadas da imagem nos sentidos dos eixos x e y, e It é a derivada no tempo (de um frame para outro). A solução exata não é computacionalmente eficiente, então há diversos métodos para isso. O MATLAB possui 4 funções que resolvem este problema por diferentes métodos. <explicar Horn-Schunck> <explicar Lucas-Kanade> <explicar Lucas-Kanade DoG> <explicar Farneback>
  9. Esta é a estrutura geral de como calcular o fluxo ótico no MATLAB. A função de cálculo de fluxo ótico escolhida cria um objeto que analisa cada frame do vídeo em comparação ao anterior utilizando o método estimateFlow. Cada função tem seus próprios parâmetros. Como o primeiro frame não tem anterior seu resultado deve ser desconsiderado (aplicando estimateFlow e descartando o resultado). A cada frame após o primeiro se aplica estimateFlow novamente, utilizando-se o resultado como precisar. O resultado de cada avaliação é dado em um objeto (Q) com as propriedades Vx e Vy (velocidades nos eixos x e y em todos os pontos do frame), Orientation e Magnitude (direção e comprimento do vetor velocidade em todos os pontos do frame).
  10. Aqui temos um exemplo de visualização do fluxo ótico obtido com o método Farneback em um dos frames do vídeo. Sobre cada ponto do frame foi plotada uma seta vermelha mostrando a direção e intensidade do fluxo, como vemos nesse zoom...
  11. Resultado obtido por outros métodos...
  12. Video do fluxo ótico no vídeo inteiro usando o método de Lucas-Kanade.
  13. No primeiro exemplo mostrei como detectar objetos específicos conhecidos; aqui mostrarei como identificar objetos entre muitas possibilidades, utilizando o algoritmo de Bag of Features.
  14. Sobre o dataset utilizado.
  15. Sobre o Algoritmo... Extração de Features: a função do MATLAB bagOfFeatures usa features tipo SURF (Speeded-Up Robust Features), que são pontos aproximadamente invariantes por transformações geométricas pequenas (e portanto bons pontos de referência). Clustering: a função utiliza as N features mais “fortes” de cada categoria de forma que N seja 80% do número de features da categoria com menor quantidade de features; em seguida aplica kmeans para criar o vocabulário visual; o usuário determina o número de “palavras” no vocabulário visual Classificador: o algoritmo padrão usado pela função do MATLAB é SVM (Support Vector Machine) Uma vantagem deste método é que ele se aplica mesmo que suas imagens não estejam com tamanho padronizado (diferente de outros métodos como Deep Learning). Uma desvantagem é que este método desconsidera a distribuição espacial das caracteristicas; ele apenas conta features e agrupa por similaridade, mas a informação de onde a feature está é perdida por isso o nome “Bag” of Features).
  16. A função imageDatastore cria um objeto armazenando uma lista com todas as imagens da pasta selecionada. A opção IncludeSubfolders permite incluir as imagens dentro as subpastas, e a opção LabelSource no modo foldernames significa que cada imagem receberá um label de acordo com o nome da subpasta em que está. Isso permite interpretar com facilidade o dataset, facilitando o treino do classificador depois. Os métodos shuffle e partition embaralham e separam o dataset, respectivamente. Aqui 1/5 foi usado para treinar o algoritmo e outro 1/5 para testar sua performance. As funções bagOfFeatures e trainCategoryClassifier criam o vocabulário visual e treinam o classificador respectivamente. Aqui a única opção customizada foi o número de palavras (20mil). Como o treino pode ser bastante demorado, foi colocada a condição istrained; se já estiver treinado é só escolher esta opção como true, e ao invés de treinar novamente o algoritmo meramente carrega o modelo pré-treinado de um arquivos .mat Por fim o método evaluate utiliza a partição de teste para avaliar o desempenho do algoritmo através da matriz de confusão.
  17. Durante o treino a função mostra as diversas etapas (é possível desativar essa visualização). O treino completo nessa configuração levou cerca de 12h.
  18. Aqui vemos um exemplo de uma das imagens do dataset representada em termos do vocabulário visual obtido.
  19. E por fim aqui o resultado final da avaliação de performance. Sendo 10 categorias um classificador totalmente incompetente acertaria 1/10 de cada categoria. Vemos que algumas categorias são notoriamente difíceis (Bread, Dessert, Egg), enquanto outras são mais fáceis (Diary, Pasta, Rice, Soup). Isso é entendido intuitivamente lembrando que algumas dessas categorias tem características muito bem definidas enquanto outras são muito genéricas. Por exemplo, toda imagem de “arroz” deve conter pequenos grãos alongados de cor clara, toda imagem de “sopa” deve conter uma região grande, arredondada de cor aproximadamente constante (prato cheio de liquido), quase toda imagem de “macarrão” deve conter quantidades grandes de “fios beges emaranhados”. Enquanto isso, não é fácil dizer que formas e cores definem uma “sobremesa” ou uma “fritura”, são categorias bastante variadas. Se treinarmos de novo usando apenas as categorias mais fáceis...
  20. Vemos que com um problema mais simples o algoritmo funciona muito melhor.
  21. Mais exemplos...
  22. Uma outra fonte dos erros do algoritmo é que este dataset é bastante complexo. Estas duas imagens por exemplo, ambas estão na categoria sopa. Mas a primeira contém também um pão, e foi classificada errada como arroz (possivelmente por causa dos “grãos” contidos”). A segunda é um ramen: uma sopa que contém macarrão, carne, e frutos do mar (e foi classificada como laticínio). Erros são esperados!