Added skeleton of fhog object detection example.

This commit is contained in:
Davis King 2014-01-01 19:12:06 -05:00
parent f3dc3c0e9e
commit 43ce7908b9
14 changed files with 302 additions and 0 deletions

View File

@ -33,6 +33,7 @@ add_example(custom_trainer_ex)
add_example(dir_nav_ex) add_example(dir_nav_ex)
add_example(empirical_kernel_map_ex) add_example(empirical_kernel_map_ex)
add_example(fhog_ex) add_example(fhog_ex)
add_example(fhog_object_detector_ex)
add_example(file_to_code_ex) add_example(file_to_code_ex)
add_example(graph_labeling_ex) add_example(graph_labeling_ex)
add_example(gui_api_ex) add_example(gui_api_ex)

BIN
examples/faces/2007_007763.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

BIN
examples/faces/2008_001009.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

BIN
examples/faces/2008_001322.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

BIN
examples/faces/2008_002079.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

BIN
examples/faces/2008_002470.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

BIN
examples/faces/2008_002506.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

BIN
examples/faces/2008_004176.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

BIN
examples/faces/2008_007676.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

BIN
examples/faces/2009_004587.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

View File

@ -0,0 +1,108 @@
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method='html' version='1.0' encoding='UTF-8' indent='yes' />
<!-- ************************************************************************* -->
<xsl:variable name="max_images_displayed">30</xsl:variable>
<!-- ************************************************************************* -->
<xsl:template match="/dataset">
<html>
<head>
<style type="text/css">
div#box{
position: absolute;
border-style:solid;
border-width:1px;
border-color:red;
}
div#circle{
position: absolute;
border-style:solid;
border-width:1px;
border-color:red;
border-radius:7px;
width:14px;
height: 14px;
}
div#label{
position: absolute;
color: red;
}
div#img{
position: relative;
margin-bottom:2em;
}
pre {
color: black;
margin: 1em 0.25in;
padding: 0.5em;
background: rgb(240,240,240);
border-top: black dotted 1px;
border-left: black dotted 1px;
border-right: black solid 2px;
border-bottom: black solid 2px;
}
</style>
</head>
<body>
Dataset name: <b><xsl:value-of select='/dataset/name'/></b> <br/>
Dataset comment: <pre><xsl:value-of select='/dataset/comment'/></pre> <br/>
Number of images: <xsl:value-of select="count(images/image)"/> <br/>
Number of boxes: <xsl:value-of select="count(images/image/box)"/> <br/>
<br/>
<hr/>
<!-- Show a warning if we aren't going to show all the images -->
<xsl:if test="count(images/image) &gt; $max_images_displayed">
<h2>Only displaying the first <xsl:value-of select="$max_images_displayed"/> images.</h2>
<hr/>
</xsl:if>
<xsl:for-each select="images/image">
<!-- Don't try to display too many images. It makes your browser hang -->
<xsl:if test="position() &lt;= $max_images_displayed">
<b><xsl:value-of select="@file"/></b> (Number of boxes: <xsl:value-of select="count(box)"/>)
<div id="img">
<img src="{@file}"/>
<xsl:for-each select="box">
<div id="box" style="top: {@top}px; left: {@left}px; width: {@width}px; height: {@height}px;"></div>
<!-- If there is a label then display it in the lower right corner. -->
<xsl:if test="label">
<div id="label" style="top: {@top+@height}px; left: {@left+@width}px;">
<xsl:value-of select="label"/>
</div>
</xsl:if>
<xsl:for-each select="part">
<div id="label" style="top: {@y+7}px; left: {@x}px;">
<xsl:value-of select="@name"/>
</div>
<div id="circle" style="top: {(@y)-7}px; left: {(@x)-7}px; "></div>
</xsl:for-each>
</xsl:for-each>
</div>
</xsl:if>
</xsl:for-each>
</body>
</html>
</xsl:template>
<!-- ************************************************************************* -->
</xsl:stylesheet>

View File

@ -0,0 +1,43 @@
<?xml version='1.0' encoding='ISO-8859-1'?>
<?xml-stylesheet type='text/xsl' href='image_metadata_stylesheet.xsl'?>
<dataset>
<name>imglab dataset</name>
<comment>Created by imglab tool.</comment>
<images>
<image file='2008_002470.jpg'>
<box top='181' left='274' width='52' height='53'/>
<box top='156' left='55' width='44' height='44'/>
<box top='166' left='146' width='37' height='37'/>
<box top='55' left='329' width='44' height='44'/>
<box top='74' left='233' width='44' height='44'/>
<box top='86' left='178' width='37' height='37'/>
</image>
<image file='2008_002506.jpg'>
<box top='78' left='329' width='109' height='109'/>
<box top='95' left='224' width='91' height='91'/>
<box top='65' left='125' width='90' height='91'/>
</image>
<image file='2008_004176.jpg'>
<box top='230' left='206' width='37' height='37'/>
<box top='118' left='162' width='37' height='37'/>
<box top='82' left='190' width='37' height='37'/>
<box top='78' left='326' width='37' height='37'/>
<box top='98' left='222' width='37' height='37'/>
<box top='86' left='110' width='37' height='37'/>
<box top='102' left='282' width='37' height='37'/>
</image>
<image file='2008_007676.jpg'>
<box top='62' left='226' width='37' height='37'/>
<box top='113' left='194' width='44' height='44'/>
<box top='130' left='262' width='37' height='37'/>
<box top='134' left='366' width='37' height='37'/>
<box top='122' left='314' width='37' height='37'/>
<box top='141' left='107' width='52' height='53'/>
<box top='84' left='137' width='44' height='44'/>
</image>
<image file='2009_004587.jpg'>
<box top='46' left='154' width='75' height='76'/>
<box top='280' left='266' width='63' height='63'/>
</image>
</images>
</dataset>

View File

@ -0,0 +1,34 @@
<?xml version='1.0' encoding='ISO-8859-1'?>
<?xml-stylesheet type='text/xsl' href='image_metadata_stylesheet.xsl'?>
<dataset>
<name>imglab dataset</name>
<comment>Created by imglab tool.</comment>
<images>
<image file='2007_007763.jpg'>
<box top='90' left='194' width='37' height='37'/>
<box top='114' left='158' width='37' height='37'/>
<box top='89' left='381' width='45' height='44'/>
<box top='198' left='94' width='37' height='37'/>
<box top='214' left='178' width='37' height='37'/>
<box top='86' left='294' width='37' height='37'/>
<box top='233' left='309' width='45' height='44'/>
</image>
<image file='2008_002079.jpg'>
<box top='166' left='406' width='37' height='37'/>
<box top='134' left='122' width='37' height='37'/>
<box top='138' left='346' width='37' height='37'/>
<box top='175' left='439' width='44' height='44'/>
<box top='134' left='62' width='37' height='37'/>
<box top='194' left='41' width='44' height='44'/>
</image>
<image file='2008_001009.jpg'>
<box top='79' left='145' width='76' height='76'/>
<box top='214' left='125' width='90' height='91'/>
</image>
<image file='2008_001322.jpg'>
<box top='162' left='104' width='76' height='76'/>
<box top='218' left='232' width='63' height='63'/>
<box top='155' left='344' width='90' height='90'/>
</image>
</images>
</dataset>

View File

@ -0,0 +1,116 @@
// The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt
/*
This is an example illustrating the use of the dlib tools for
detecting objects in images. In this example we will create
three simple images, each containing some white squares. We
will then use the sliding window classifier tools to learn to
detect these squares.
*/
#include <dlib/time_this.h>
#include <dlib/image_processing/frontal_face_detector.h>
#include <dlib/svm_threaded.h>
#include <dlib/gui_widgets.h>
#include <dlib/array.h>
#include <dlib/array2d.h>
#include <dlib/image_keypoint.h>
#include <dlib/image_processing.h>
#include <dlib/data_io.h>
#include <iostream>
#include <fstream>
using namespace std;
using namespace dlib;
// ----------------------------------------------------------------------------------------
int main()
{
/*
NOTES
- explain the concepts of ignore boxes
*/
try
{
dlib::array<array2d<unsigned char> > images, images_test;
std::vector<std::vector<rectangle> > object_locations, object_locations_test;
load_image_dataset(images, object_locations, "../faces/training.xml");
upsample_image_dataset<pyramid_down<2> >(images, object_locations);
load_image_dataset(images_test, object_locations_test, "../faces/testing.xml");
upsample_image_dataset<pyramid_down<2> >(images_test, object_locations_test);
add_image_left_right_flips(images, object_locations);
cout << "num training images: " << images.size() << endl;
cout << "num testing images: " << images_test.size() << endl;
typedef scan_fhog_pyramid<pyramid_down<6> > image_scanner_type;
image_scanner_type scanner;
scanner.set_detection_window_size(80, 80); // faces
//scanner.set_nuclear_norm_regularization_strength(1.0);
structural_object_detection_trainer<image_scanner_type> trainer(scanner);
trainer.set_num_threads(6); // Set this to the number of processing cores on your machine.
trainer.set_c(1);
//trainer.set_c(10);
trainer.be_verbose();
trainer.set_epsilon(0.01);
// TODO, talk about this option
//remove_unobtainable_rectangles(trainer, images, object_locations);
object_detector<image_scanner_type> detector = trainer.train(images, object_locations);
cout << "num filters 0.0: "<< num_separable_filters(detector) << endl;
cout << "training results 0.0: " << test_object_detection_function(detector, images, object_locations) << endl;
cout << "testing results 0.0: " << test_object_detection_function(detector, images_test, object_locations_test) << endl;
detector = threshold_filter_singular_values(detector,0.01);
cout << "num filters 0.01: "<< num_separable_filters(detector) << endl;
cout << "testing results 0.01: " << test_object_detection_function(detector, images_test, object_locations_test) << endl;
detector = threshold_filter_singular_values(detector,0.1);
cout << "num filters 0.1: "<< num_separable_filters(detector) << endl;
cout << "testing results 0.1: " << test_object_detection_function(detector, images_test, object_locations_test) << endl;
image_window win, hogwin(draw_fhog(detector));
for (unsigned long i = 0; i < images_test.size(); ++i)
{
std::vector<rectangle> dets;
TIME_THIS(
dets = detector(images_test[i]);
);
win.clear_overlay();
win.set_image(images_test[i]);
win.add_overlay(dets, rgb_pixel(255,0,0));
cin.get();
}
ofstream fout("face_detector.svm", ios::binary);
serialize(detector, fout);
}
catch (exception& e)
{
cout << "\nexception thrown!" << endl;
cout << e.what() << endl;
}
}
// ----------------------------------------------------------------------------------------