徐州市徐州市城乡建设局网站首页中国风网站配色方案
- 作者: 五速梦信息网
- 时间: 2026年04月20日 07:06
当前位置: 首页 > news >正文
徐州市徐州市城乡建设局网站首页,中国风网站配色方案,百度 wordpress,南宁市建设厅官方网站面部表情识别3#xff1a;Android实现表情识别(含源码#xff0c;可实时检测) 目录 面部表情识别3#xff1a;Android实现表情识别(含源码#xff0c;可实时检测) 1.面部表情识别方法 2.人脸检测方法 3.面部表情识别模型训练 4.面部表情识别模型Android部署 #x…面部表情识别3Android实现表情识别(含源码可实时检测) 目录 面部表情识别3Android实现表情识别(含源码可实时检测) 1.面部表情识别方法 2.人脸检测方法 3.面部表情识别模型训练 4.面部表情识别模型Android部署 1 将Pytorch模型转换ONNX模型 2 将ONNX模型转换为TNN模型 3 Android端上部署模型 4 Android测试效果 5 运行APP闪退dlopen failed: library libomp.so not found 5.项目源码下载 这是项目《面部表情识别》系列之《Android实现表情识别(含源码可实时检测)》主要分享将Python训练后的面部表情识别模型移植到Android平台。我们将开发一个简易的、可实时运行的面部表情识别的Android Demo。准确率还挺高的采用轻量级mobilenet_v2模型的面部表情识别准确率也可以高达94.72%左右基本满足业务性能需求。 项目将手把手教你将训练好的表情识别模型部署到Android平台中包括如何转为ONNXTNN模型并移植到Android上进行部署实现一个表情识别的Android Demo APP 。APP在普通Android手机上可以达到实时的检测识别效果CPU(4线程)约30ms左右GPU约25ms左右 基本满足业务的性能需求。 【尊重原创转载请注明出处】https://blog.csdn.net/guyuealian/article/details/129467015 先展示一下Android版本表情识别Demo效果 Android面部表情识别APP Demo体验https://download.csdn.net/download/guyuealian/87575425 或者链接: https://pan.baidu.com/s/16OOi-qCENP4WbIeSzO5e9g 提取码: cs5g 更多项目《面部表情识别》系列文章请参考 面部表情识别1表情识别数据集(含下载链接):面部表情识别2Pytorch实现表情识别(含表情识别数据集和训练代码)面部表情识别3Android实现表情识别(含源码可实时检测)面部表情识别4C实现表情识别(含源码可实时检测)1.面部表情识别方法 面部表情识别方法有多种实现方案这里采用最常规的方法基于人脸检测面部表情分类识别方法即先采用通用的人脸检测模型进行人脸检测然后裁剪人脸区域再训练一个面部表情分类器完成对面部表情识别 这样做的好处是可以利用现有的人脸检测模型而无需重新训练人脸检测模型可减少人工标注成本低而人脸数据相对而言比较容易采集分类模型可针对性进行优化。 2.人脸检测方法 本项目人脸检测训练代码请参考https://github.com/Linzaer/Ultra-Light-Fast-Generic-Face-Detector-1MB 这是一个基于SSD改进且轻量化后人脸检测模型很slim整个模型仅仅1.7M左右在普通Android手机都可以实时检测。人脸检测方法在网上有一大堆现成的方法可以使用完全可以不局限我这个方法。 关于人脸检测的方法可以参考我的另一篇博客 行人检测和人脸检测和人脸关键点检测C/Android源码 3.面部表情识别模型训练 关于面部表情识别模型的训练方法请参考本人另一篇博文《面部表情识别2Pytorch实现表情识别(含表情识别数据集和训练代码)》https://blog.csdn.net/guyuealian/article/details/129505205 4.面部表情识别模型Android部署 目前CNN模型有多种部署方式可以采用TNNMNN,NCNN以及TensorRT等部署工具鄙人采用TNN进行Android端上部署。部署流程可分为四步训练模型-将模型转换ONNX模型-将ONNX模型转换为TNN模型-Android端上部署TNN模型。 1 将Pytorch模型转换ONNX模型 训练好Pytorch模型后我们需要先将模型转换为ONNX模型以便后续模型部署。 原始项目提供转换脚本你只需要修改model_file为你模型路径即可 convert_torch_to_onnx.py实现将Pytorch模型转换ONNX模型的脚本python libs/convert/convert_torch_to_onnx.py This code is used to convert the pytorch model into an onnx format model.import sys import ossys.path.insert(0, os.getcwd()) import torch.onnx import onnx from classifier.models.build_models import get_models from basetrainer.utils import torch_toolsdef build_net(model_file, net_type, input_size, num_classes, width_mult1.0)::param model_file: 模型文件:param net_type: 模型名称:param input_size: 模型输入大小:param num_classes: 类别数:param width_mult::return:model get_models(net_type, input_size, num_classes, width_multwidth_mult, is_trainFalse, pretrainedFalse)state_dict torch_tools.load_state_dict(model_file)model.load_state_dict(state_dict)return modeldef convert2onnx(model_file, net_type, input_size, num_classes, width_mult1.0, devicecpu, onnx_typedefault):model build_net(model_file, net_type, input_size, num_classes, width_multwidth_mult)model model.to(device)model.eval()model_name os.path.basename(model_file)[:-len(.pth)] .onnxonnx_path os.path.join(os.path.dirname(model_file), model_name)# dummy_input torch.randn(1, 3, 240, 320).to(cuda)dummy_input torch.randn(1, 3, input_size[1], input_size[0]).to(device)# torch.onnx.export(model, dummy_input, onnx_path, verboseFalse,# input_names[input],output_names[scores, boxes])do_constant_folding Trueif onnx_type default:torch.onnx.export(model, dummy_input, onnx_path, verboseFalse, export_paramsTrue,do_constant_foldingdo_constant_folding,input_names[input],output_names[output])elif onnx_type det:torch.onnx.export(model,dummy_input,onnx_path,do_constant_foldingdo_constant_folding,export_paramsTrue,verboseFalse,input_names[input],output_names[scores, boxes, ldmks])elif onnx_type kp:torch.onnx.export(model,dummy_input,onnx_path,do_constant_foldingdo_constant_folding,export_paramsTrue,verboseFalse,input_names[input],output_names[output])onnx_model onnx.load(onnx_path)onnx.checker.check_model(onnx_model)print(onnx_path)if name main:net_type mobilenet_v2width_mult 1.0input_size [128, 128]num_classes 2model_file work_space/mobilenet_v2_1.0_CrossEntropyLoss/model/best_model_022_98.1848.pthconvert2onnx(model_file, net_type, input_size, num_classes, width_multwidth_mult)2 将ONNX模型转换为TNN模型 目前CNN模型有多种部署方式可以采用TNNMNN,NCNN以及TensorRT等部署工具鄙人采用TNN进行Android端上部署 TNN转换工具 1将ONNX模型转换为TNN模型请参考TNN官方说明TNN/onnx2tnn.md at master · Tencent/TNN · GitHub2一键转换懒人必备一键转换 Caffe, ONNX, TensorFlow 到 NCNN, MNN, Tengine (可能存在版本问题这个工具转换的TNN模型可能不兼容建议还是自己build源码进行转换2022年9约25日测试可用) 3 Android端上部署模型 项目实现了Android版本的面部表情识别Demo部署框架采用TNN支持多线程CPU和GPU加速推理在普通手机上可以实时处理。项目Android源码核心算法均采用C实现上层通过JNI接口调用. 如果你想在这个Android Demo部署你自己训练的分类模型你可将训练好的Pytorch模型转换ONNX 再转换成TNN模型然后把TNN模型代替你模型即可。 这是项目Android源码JNI接口 Java部分package com.cv.tnn.model;import android.graphics.Bitmap;public class Detector {static {System.loadLibrary(tnn_wrapper);}/**** 初始化检测模型* param det_model 检测模型不含后缀名* param cls_model 识别模型不含后缀名* param root模型文件的根目录放在assets文件夹下* param model_type模型类型* param num_thread开启线程数* param useGPU是否开启GPU进行加速/public static native void init(String det_model, String cls_model, String root, int model_type, int num_thread, boolean useGPU);/**** 返回检测和识别结果 param bitmap 图像bitmapARGB_8888格式* param score_thresh置信度阈值* param iou_thresh IOU阈值* return*/public static native FrameInfo[] detect(Bitmap bitmap, float score_thresh, float iou_thresh); } 这是Android项目源码JNI接口 C部分#include jni.h #include string #include fstream #include src/object_detection.h #include src/classification.h #include src/Types.h #include debug.h #include android_utils.h #include opencv2/opencv.hpp #include file_utils.husing namespace dl; using namespace vision;static ObjectDetection *detector nullptr; static Classification *classifier nullptr;JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) {return JNI_VERSION_1_6; }JNIEXPORT void JNI_OnUnload(JavaVM *vm, void *reserved) {}extern C JNIEXPORT void JNICALL Java_com_cv_tnn_model_Detector_init(JNIEnv *env,jclass clazz,jstring det_model,jstring cls_model,jstring root,jint model_type,jint num_thread,jboolean use_gpu) {if (detector ! nullptr) {delete detector;detector nullptr;}std::string parent env-GetStringUTFChars(root, 0);std::string detmodel env-GetStringUTFChars(det_model, 0);std::string clsmodel env-GetStringUTFChars(cls_model, 0);string det_model_file path_joint(parent, detmodel .tnnmodel);string det_proto_file path_joint(parent, detmodel .tnnproto);string cls_model_file path_joint(parent, clsmodel .tnnmodel);string cls_proto_file path_joint(parent, clsmodel .tnnproto);DeviceType device use_gpu ? GPU : CPU;LOGW(parent : %s, parent.c_str());LOGW(useGPU : %d, use_gpu);LOGW(device_type: %d, device);LOGW(model_type : %d, model_type);LOGW(num_thread : %d, num_thread);ObjectDetectionParam model_param FACE_MODEL;detector new ObjectDetection(det_model_file,det_proto_file,model_param,num_thread,device);//ClassificationParam ClassParam FACE_MASK_MODEL;ClassificationParam ClassParam EYEGLASSES_MODEL;classifier new Classification(cls_model_file,cls_proto_file,ClassParam,num_thread,device); }extern C JNIEXPORT jobjectArray JNICALL Java_com_cv_tnn_model_Detector_detect(JNIEnv *env, jclass clazz, jobject bitmap,jfloat score_thresh, jfloat iou_thresh) {cv::Mat bgr;BitmapToMatrix(env, bitmap, bgr);int src_h bgr.rows;int src_w bgr.cols;// 检测区域为整张图片的大小FrameInfo resultInfo;// 开始检测if (detector ! nullptr) {detector-detect(bgr, resultInfo, score_thresh, iou_thresh);} else {ObjectInfo objectInfo;objectInfo.x1 0;objectInfo.y1 0;objectInfo.x2 (float)src_w;objectInfo.y2 (float)src_h;objectInfo.label 0;resultInfo.info.push_back(objectInfo);}int nums resultInfo.info.size();LOGW(object nums: %d\n, nums);if (nums 0) {// 开始检测classifier-detect(bgr, resultInfo);// 可视化代码printf(sitting label:%d,score:%3.5f, resultInfo.label, resultInfo.score);//classifier-visualizeResult(bgr, resultInfo);}//cv::cvtColor(bgr, bgr, cv::COLOR_BGR2RGB);//MatrixToBitmap(env, bgr, dst_bitmap);auto BoxInfo env-FindClass(com/cv/tnn/model/FrameInfo);auto init_id env-GetMethodID(BoxInfo, init, ()V);auto box_id env-GetMethodID(BoxInfo, addBox, (FFFFIF)V);auto ky_id env-GetMethodID(BoxInfo, addKeyPoint, (FFF)V);jobjectArray ret env-NewObjectArray(resultInfo.info.size(), BoxInfo, nullptr);for (int i 0; i nums; i) {auto info resultInfo.info[i];env-PushLocalFrame(1);//jobject obj env-AllocObject(BoxInfo);jobject obj env-NewObject(BoxInfo, init_id);// set bbox//LOGW(rect:[%f,%f,%f%f] label:%d,score:%f \n, info.rect.x,info.rect.y, info.rect.w, info.rect.h, 0, 1.0f);env-CallVoidMethod(obj, box_id, info.x1, info.y1, info.x2 - info.x1, info.y2 - info.y1,info.category.label, info.category.score);// set keypointfor (const auto kps : info.landmarks) {//LOGW(point:[%f,%f] score:%f \n, lm.point.x, lm.point.y, lm.score);env-CallVoidMethod(obj, ky_id, (float) kps.x, (float) kps.y, 1.0f);}obj env-PopLocalFrame(obj);env-SetObjectArrayElement(ret, i, obj);}return ret; }4 Android测试效果 Android Demo在普通手机CPU/GPU上可以达到实时检测和识别效果CPU(4线程)约30ms左右GPU约25ms左右 基本满足业务的性能需求。 5 运行APP闪退dlopen failed: library libomp.so not found 参考解决方法解决dlopen failed: library “libomp.so“ not found_PKing666666的博客-CSDN博客_dlopen failed Android SDK和NDK相关版本信息请参考 5.项目源码下载 Android项目源码下载地址面部表情识别3Android实现表情识别(含源码可实时检测) 整套Android项目源码内容包含 提供Android版本的人脸检测模型提供面部表情识别Android Demo源码Android Demo在普通手机CPU/GPU上可以实时检测和识别,约30ms左右Android Demo支持图片视频摄像头测试所有依赖库都已经配置好可直接build运行若运行出现闪退请参考dlopen failed: library “libomp.so“ not found 解决。Android面部表情识别APP Demo体验https://download.csdn.net/download/guyuealian/87575425 或者链接: https://pan.baidu.com/s/16OOi-qCENP4WbIeSzO5e9g 提取码: cs5g 如果你需要面部表情识别的训练代码请参考《面部表情识别2Pytorch实现表情识别(含表情识别数据集和训练代码)》https://blog.csdn.net/guyuealian/article/details/129505205
- 上一篇: 徐州市建设工程质监站网站做二手房比较好的网站
- 下一篇: 徐州市中心做网站的公司招聘中铁建设门户网站
相关文章
-
徐州市建设工程质监站网站做二手房比较好的网站
徐州市建设工程质监站网站做二手房比较好的网站
- 技术栈
- 2026年04月20日
-
徐州如何选择网站建设企业培训视频
徐州如何选择网站建设企业培训视频
- 技术栈
- 2026年04月20日
-
徐州泉山建设局网站云主机网站的空间在哪
徐州泉山建设局网站云主机网站的空间在哪
- 技术栈
- 2026年04月20日
-
徐州市中心做网站的公司招聘中铁建设门户网站
徐州市中心做网站的公司招聘中铁建设门户网站
- 技术栈
- 2026年04月20日
-
徐州市住房建设局网站企业网站建设知识
徐州市住房建设局网站企业网站建设知识
- 技术栈
- 2026年04月20日
-
徐州手机网站推广公司哪家好wordpress栏目页只显示标题
徐州手机网站推广公司哪家好wordpress栏目页只显示标题
- 技术栈
- 2026年04月20日
