Cómo llamar a un caffemodel bien entrenadoPrimero, debe crear una clase NetOperator en la carpeta caffe/examples/myproject/net_operator y luego escribir una función principal para llamar a esta clase. Por ejemplo: copie y guarde en caffe/examples/myproject/net_operator.hpp, luego escriba un main.cpp en el mismo directorio, #incluya "net_operator.hpp" en la función principal, puede usar esta clase: constringnet_prototxt="" ; //Para el archivo prototxt de su red, use la ruta absoluta, la misma que aparece a continuación constringpre_trained_file=""; //Su archivo .caffemodel entrenado constringimg_path="" //La ruta de la imagen que desea probar conststringimg_path= ""; // La ruta de la imagen que desea probar // Crea un objeto NetOperator NetOperatornet_operator(net_prototxt, pre_trained_file); Blob*blob=net_operator.processImage(img_path); // El blob obtendrá la salida de la última capa; En cuanto a cómo se almacenan los datos en el blob, debe ir al sitio web oficial para verificar su definición. Después de escribir main.cpp, ingrese al directorio caffe y haga, luego compilará el archivo que escribió y generará un archivo. archivo ejecutable en consecuencia. Por ejemplo, como escribí anteriormente, después de make, generará un main.bin en la carpeta caffe/build/examples/myproject y podrá ejecutar este archivo. Debido a que el archivo ejecutable generado no está directamente en el directorio de códigos, le recomiendo que utilice una ruta absoluta al escribir la ruta.
Además, si desea obtener la salida de algo que no sea la última capa, debe modificar el valor de retorno de la función ProcessImage y obtener el blob que necesita a través de la variable miembro de NetOperator net_. Por ejemplo, hay un blob llamado. "label". Si desea obtener este blob, puede utilizar net_-gt; blob_by_name("label") para obtenerlo. Por supuesto, debe buscar boostshared_ptr en el tiposhared_ptrgt; El siguiente paso es el código que se publicará: # (constringamp; net_prototxt); NetOperator(constringamp;net_prototxt,constringamp.trained_file);~NetOperator(){}intbatch_size(){returnbatch_size_;}Blob*processImage(constringamp;img_path, boolis_color=true);Blob*processImages(constvectoramp;img_paths,boolis_color=true); private:voidcreateNet(conststringamp;net_prototxt); // lee la imagen y la almacena en la posición idx de las imágenes en el blobvoidreadImageToBlob(conststringamp;img_path,intidx=0,boolis_color=true);;shared_ptrrgt;net_cv :: Sizeinput_geometry_;intbatch_size_;intnum_channels_;Blob*input_blob _;TransformationParametertransform_param _;shared_ptrrgt;data_transformer_ ;Blobtransformed_data_;};NetOperator::NetOperator(conststringamp;net_prototxt){createNet(net_prototxt);}NetOperator::NetOperator(con ststringamp;net_prototxt, conststringamp;trained_file ){createNet(net_prototxt);net_-gt; CopyTrainedLayersFrom(trained_file); }voidNetOperator::createNet(conststringamp;net_prototxt){ #ifdefCPU_ONLYCaffe::set_mode(Caffe.:CPU); ; #endifnet_.reset(newNet(net_prototxt,TEST)); CHECK_EQ( net_-gt;num_inputs(), 1)num_outputs(), 1)*input_layer=net_-gt;input_blobs()[0];batch_size_=input_layer- gt;num();num_canal