1. 安装必要的库
确保你已经安装了JPEG库、BLAS和LAPACK库。在Ubuntu或Debian系统上,可以使用以下命令安装:
sudo apt-get update
sudo apt-get install libjpeg-dev libblas-dev liblapack-dev
在CentOS或Fedora系统上,可以使用以下命令安装:
sudo yum install libjpeg-devel blas-devel lapack-devel
2. 确保dlib使用正确的库
dlib通常会自动检测系统上的JPEG、BLAS和LAPACK库。如果你已经安装了这些库,dlib应该能够自动找到并使用它们。
3. 重新编译dlib库
重新编译dlib库,并确保启用位置无关代码(PIC):
cd dlib
mkdir build
cd build
cmake .. -DDLIB_USE_CUDA=OFF -DUSE_AVX_INSTRUCTIONS=ON -DCMAKE_POSITION_INDEPENDENT_CODE=ON
cmake --build .
sudo make install
FaceRecognition.java
public class FaceRecognition {static {System.loadLibrary("dlib_face_recognition");}public native String extractFeatures(String imagePath);public static void main(String[] args) {if (args.length != 1) {System.out.println("Usage: java FaceRecognition <image_path>");return;}String imagePath = args[0];FaceRecognition fr = new FaceRecognition();String features = fr.extractFeatures(imagePath);System.out.println("Extracted features: \n" + features);}
}
dlib_face_recognition.cpp
include <jni.h>
#include <dlib/image_processing/frontal_face_detector.h>
#include <dlib/image_processing/render_face_detections.h>
#include <dlib/image_processing.h>
#include <dlib/image_io.h>
#include <dlib/dnn.h>
#include <sstream>
#include <string>
#include <vector>// 定义用于脸部识别的深度神经网络
template <template <int, template <typename> class, int, typename> class block, int N, template <typename> class BN, typename SUBNET>
using residual = dlib::add_prev1<block<N, BN, 1, dlib::tag1<SUBNET>>>;template <template <int, template <typename> class, int, typename> class block, int N, template <typename> class BN, typename SUBNET>
using residual_down = dlib::add_prev2<dlib::avg_pool<2, 2, 2, 2, dlib::skip1<dlib::tag2<block<N, BN, 2, dlib::tag1<SUBNET>>>>>>;template <int N, template <typename> class BN, int stride, typename SUBNET>
using block = BN<dlib::con<N, 3, 3, 1, 1, dlib::relu<dlib::affine<dlib::con<N, 3, 3, stride, stride, SUBNET>>>>>;template <int N, typename SUBNET> using res = dlib::relu<residual<block, N, dlib::bn_con, SUBNET>>;
template <int N, typename SUBNET> using ares = dlib::relu<residual<block, N, dlib::affine, SUBNET>>;
template <int N, typename SUBNET> using res_down = dlib::relu<residual_down<block, N, dlib::bn_con, SUBNET>>;
template <int N, typename SUBNET> using ares_down = dlib::relu<residual_down<block, N, dlib::affine, SUBNET>>;template <typename SUBNET> using alevel0 = ares_down<256, SUBNET>;
template <typename SUBNET> using alevel1 = ares<256, ares<256, ares_down<256, SUBNET>>>;
template <typename SUBNET> using alevel2 = ares<128, ares<128, ares_down<128, SUBNET>>>;
template <typename SUBNET> using alevel3 = ares<64, ares<64, ares<64, ares_down<64, SUBNET>>>>;
template <typename SUBNET> using alevel4 = ares<32, ares<32, ares<32, SUBNET>>>;
using anet_type = dlib::loss_metric<dlib::fc_no_bias<128, dlib::avg_pool_everything<alevel0<alevel1<alevel2<alevel3<alevel4<dlib::max_pool<3, 3, 2, 2, dlib::relu<dlib::affine<dlib::con<32, 7, 7, 2, 2,dlib::input_rgb_image_sized<150>>>>>>>>>>>>>;extern "C" JNIEXPORT jstring JNICALL Java_FaceRecognition_extractFeatures(JNIEnv *env, jobject obj, jstring imagePath) {const char *path = env->GetStringUTFChars(imagePath, 0);dlib::frontal_face_detector detector = dlib::get_frontal_face_detector();dlib::shape_predictor sp;dlib::deserialize("shape_predictor_68_face_landmarks.dat") >> sp;anet_type net;dlib::deserialize("dlib_face_recognition_resnet_model_v1.dat") >> net;dlib::matrix<dlib::rgb_pixel> img;dlib::load_image(img, path);std::vector<dlib::matrix<dlib::rgb_pixel>> faces;for (auto face : detector(img)) {auto shape = sp(img, face);dlib::matrix<dlib::rgb_pixel> face_chip;dlib::extract_image_chip(img, dlib::get_face_chip_details(shape,150,0.25), face_chip);faces.push_back(std::move(face_chip));}std::vector<dlib::matrix<float,0,1>> face_descriptors = net(faces);std::ostringstream oss;for (auto& descriptor : face_descriptors) {for (int i = 0; i < descriptor.size(); ++i) {oss << descriptor(i) << " ";}oss << "\n";}env->ReleaseStringUTFChars(imagePath, path);return env->NewStringUTF(oss.str().c_str());
}
4. 编译你的C++代码
g++ -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux -shared -o libdlib_face_recognition.so -fPIC dlib_face_recognition.cpp -ldlib -lpthread -lblas -llapack -ljpeg
5.编译Java代码并生成头文件
确保在编译Java代码时指定编码为UTF-8:
javac -encoding UTF-8 -h . FaceRecognition.java
6. 运行Java程序
java -Djava.library.path=. FaceRecognition 1.jpg