1. Instalación
Actualmente solo se preocupa por una instalación de Linux, el contenido puede referirse al tutorial oficial
paso:
git clone https://github.com/Tencent/ncnn.git
cd ncnn
git submodule update --init
wget https://sdk.lunarg.com/sdk/download/1.2.154.0/linux/vulkansdk-linux-x86_64-1.2.154.0.tar.gz?Human= true -O vulkansdk-linux-x86_64-1.2.154.0.tar.gz
tar -xf vulkansdk-linux-x86_64-1.2.154.0.tar.gz
export VULKAN_SDK= $( pwd ) /1.2.154.0/x86_64
cd ncnn
mkdir -p build
cd build
cmake -DCMAKE_BUILD_TYPE= Release -DNCNN_VULKAN= ON -DNCNN_SYSTEM_GLSLANG= ON -DNCNN_BUILD_EXAMPLES= ON ..
make -j
Estos pasos son muy simples, hay algunos problemas con C ++, CMake
2. El primer ejemplo de squeezenet
Ejecutar: Después de una buena compilación, la /path/to/ncnn/examples
operación de directorio ../build/examples/squeezenet ../images/256-ncnn.png
puede ser.
La entrada del programa está en /path/to/ncnn/examples/squeezenet.cpp
, el código fuente es el siguiente
#include "net.h"
#include <algorithm>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <stdio.h>
#include <vector>
static int detect_squeezenet ( const cv:: Mat& bgr, std:: vector< float > & cls_scores)
{
ncnn:: Net squeezenet;
squeezenet. opt. use_vulkan_compute = true ;
squeezenet. load_param ( "squeezenet_v1.1.param" ) ;
squeezenet. load_model ( "squeezenet_v1.1.bin" ) ;
ncnn:: Mat in = ncnn:: Mat:: from_pixels_resize ( bgr. data, ncnn:: Mat:: PIXEL_BGR, bgr. cols, bgr. rows, 227 , 227 ) ;
const float mean_vals[ 3 ] = {
104.f , 117.f , 123.f } ;
in. substract_mean_normalize ( mean_vals, 0 ) ;
ncnn:: Extractor ex = squeezenet. create_extractor ( ) ;
ex. input ( "data" , in) ;
ncnn:: Mat out;
ex. extract ( "prob" , out) ;
cls_scores. resize ( out. w) ;
for ( int j = 0 ; j < out. w; j++ )
{
cls_scores[ j] = out[ j] ;
}
return 0 ;
}
static int print_topk ( const std:: vector< float > & cls_scores, int topk)
{
int size = cls_scores. size ( ) ;
std:: vector< std:: pair< float , int > > vec;
vec. resize ( size) ;
for ( int i = 0 ; i < size; i++ )
{
vec[ i] = std:: make_pair ( cls_scores[ i] , i) ;
}
std:: partial_sort ( vec. begin ( ) , vec. begin ( ) + topk, vec. end ( ) ,
std:: greater< std:: pair< float , int > > ( ) ) ;
for ( int i = 0 ; i < topk; i++ )
{
float score = vec[ i] . first;
int index = vec[ i] . second;
fprintf ( stderr , "%d = %f\n" , index, score) ;
}
return 0 ;
}
int main ( int argc, char * * argv)
{
if ( argc != 2 )
{
fprintf ( stderr , "Usage: %s [imagepath]\n" , argv[ 0 ] ) ;
return - 1 ;
}
const char * imagepath = argv[ 1 ] ;
cv:: Mat m = cv:: imread ( imagepath, 1 ) ;
if ( m. empty ( ) )
{
fprintf ( stderr , "cv::imread %s failed\n" , imagepath) ;
return - 1 ;
}
std:: vector< float > cls_scores;
detect_squeezenet ( m, cls_scores) ;
print_topk ( cls_scores, 3 ) ;
return 0 ;
}