forked from dusty-nv/jetson-inference
-
Notifications
You must be signed in to change notification settings - Fork 0
/
imagenet-console.cpp
108 lines (79 loc) · 2.75 KB
/
imagenet-console.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/*
* http://github.com/dusty-nv/jetson-inference
*/
#include "imageNet.h"
#include "loadImage.h"
#include "cudaFont.h"
// main entry point
int main( int argc, char** argv )
{
printf("imagenet-console\n args (%i): ", argc);
for( int i=0; i < argc; i++ )
printf("%i [%s] ", i, argv[i]);
printf("\n\n");
// retrieve filename argument
if( argc < 2 )
{
printf("imagenet-console: input image filename required\n");
return 0;
}
const char* imgFilename = argv[1];
// create imageNet
imageNet* net = imageNet::Create(argc, argv);
if( !net )
{
printf("imagenet-console: failed to initialize imageNet\n");
return 0;
}
net->EnableProfiler();
// load image from file on disk
float* imgCPU = NULL;
float* imgCUDA = NULL;
int imgWidth = 0;
int imgHeight = 0;
if( !loadImageRGBA(imgFilename, (float4**)&imgCPU, (float4**)&imgCUDA, &imgWidth, &imgHeight) )
{
printf("failed to load image '%s'\n", imgFilename);
return 0;
}
float confidence = 0.0f;
// classify image
const int img_class = net->Classify(imgCUDA, imgWidth, imgHeight, &confidence);
if( img_class >= 0 )
{
printf("imagenet-console: '%s' -> %2.5f%% class #%i (%s)\n", imgFilename, confidence * 100.0f, img_class, net->GetClassDesc(img_class));
if( argc > 2 )
{
const char* outputFilename = argv[2];
// overlay the classification on the image
cudaFont* font = cudaFont::Create();
if( font != NULL )
{
char str[512];
sprintf(str, "%2.3f%% %s", confidence * 100.0f, net->GetClassDesc(img_class));
const int overlay_x = 10;
const int overlay_y = 10;
const int px_offset = overlay_y * imgWidth * 4 + overlay_x * 4;
// if the image has a white background, use black text (otherwise, white)
const float white_cutoff = 225.0f;
bool white_background = false;
if( imgCPU[px_offset] > white_cutoff && imgCPU[px_offset + 1] > white_cutoff && imgCPU[px_offset + 2] > white_cutoff )
white_background = true;
// overlay the text on the image
font->RenderOverlay((float4*)imgCUDA, (float4*)imgCUDA, imgWidth, imgHeight, (const char*)str, 10, 10,
white_background ? make_float4(0.0f, 0.0f, 0.0f, 255.0f) : make_float4(255.0f, 255.0f, 255.0f, 255.0f));
}
printf("imagenet-console: attempting to save output image to '%s'\n", outputFilename);
if( !saveImageRGBA(outputFilename, (float4*)imgCPU, imgWidth, imgHeight) )
printf("imagenet-console: failed to save output image to '%s'\n", outputFilename);
else
printf("imagenet-console: completed saving '%s'\n", outputFilename);
}
}
else
printf("imagenet-console: failed to classify '%s' (result=%i)\n", imgFilename, img_class);
printf("\nshutting down...\n");
CUDA(cudaFreeHost(imgCPU));
delete net;
return 0;
}