年龄性别预测3:Android实现年龄性别预测和识别(含源码,可实时预测)

年龄性别预测3:Android实现年龄性别预测和识别(含源码,可实时预测)

目录

年龄性别预测3:Android实现年龄性别预测和识别(含源码,可实时预测)

1.年龄性别预测和识别方法

2.人脸检测方法

3.年龄性别预测和识别模型训练

(1)年龄性别预测和识别模型训练

(2) 将Pytorch模型转换ONNX模型

(3) 将ONNX模型转换为TNN模型

4.年龄性别预测和识别模型Android部署

 (1) Android开发版本

(2) Android端上部署模型

(3) Android测试效果 

(4) 运行APP闪退:dlopen failed: library "libomp.so" not found

5.项目源码下载


本项目将实现年龄性别预测和识别,整套方案采用二阶段方法实现,即首先使用通用的人脸检测算法(Face Detection)定位人脸区域,裁剪人脸,再构建多任务模型,分别进行年龄预测(Age)和性别识别(Gender)。项目分为数据集说明,Pytorch模型训练和C++/Android部署等多个章节,本篇是项目《年龄性别预测》系列文章之Android实现年龄性别预测和识别;本篇主要分享将Python训练后的年龄性别预测和识别模型移植到Android平台。我们将开发一个简易的、可实时运行的年龄性别识别的Android Demo。项目将手把手教你将训练好的模型部署到Android平台中,包括如何转为ONNX,TNN模型,并移植到Android上进行部署,实现一个年龄性别识别的Android Demo APP 。APP在普通Android手机上可以达到实时的检测识别效果,CPU(4线程)约30ms左右,GPU约25ms左右 ,基本满足业务的性能需求。

先展示一下Android版本年龄性别识别Demo效果:https://download.csdn.net/download/guyuealian/88743711

项目基于深度学习Pytorch,构建了整套年龄性别预测和识别模型训练和测试框架;项目源码backbone模型支持的有resnet18,resnet50,以及轻量化模型mobilenet_v2等常见的深度学习模型,用户也可自定义模型进行训练;准确率还挺高的,采用轻量级mobilenet_v2模型的性别识别准确率0.9603左右,年龄预测MAE(平均绝对误差:)3.1935左右,CS5(预测年龄与真实年龄的绝对误差不过5年的准确率)0.8021左右,基本满足业务性能需求。

考虑到resnet18和resnet50模型计算量比较大,不合适部署到Android平台,本篇Android源码只部署mobilenet_v2模型实现年龄性别预测

 年龄性别预测和识别Android APP Demo体验:https://download.csdn.net/download/guyuealian/88743711

模型input size性别准确率年龄MAE年龄CS3年龄CS5

AE_mobilenet_v2

112×112

0.9603

3.1935

0.5969

0.8021

AE_resnet18

112×112

0.9606

3.1795

0.5956

0.8010

AE_resnet50

112×112

0.9609

3.2008

0.5900

0.8035

 【尊重原创,转载请注明出处】 https://blog.csdn.net/guyuealian/article/details/135556824 


 更多项目《年龄性别预测》和《面部表情识别》系列文章请参考:

  1. 面部表情识别1:表情识别数据集(含下载链接)
  2. 面部表情识别2:Pytorch实现表情识别(含表情识别数据集和训练代码)
  3. 面部表情识别3:Android实现表情识别(含源码,可实时检测)
  4. 面部表情识别4:C++实现表情识别(含源码,可实时检测)
  5. 年龄性别预测1:年龄性别数据集说明(含下载地址)
  6. 年龄性别预测2:Pytorch实现年龄性别预测和识别(含训练代码和数据)
  7. 年龄性别预测3:Android实现年龄性别预测和识别(含源码,可实时预测)
  8. 年龄性别预测4:C/C++实现年龄性别预测和识别(含源码,可实时预测)


1.年龄性别预测和识别方法

年龄性别预测和识别方法有多种实现方案,这里采用最常规的二阶段方法实现,即首先使用通用的人脸检测算法(Face Detection)定位人脸区域,裁剪人脸,再构建多任务模型,分别进行年龄预测(Age)和性别识别(Gender)。

  • 人脸检测:人脸检测算法已经有很多成熟开源项目了,本项目不作分析,可以参考使用MTCNN,DSFD,FaceBoxes,RFB等方法。
  • 性别识别:性别识别是一个简单二分类,训练使用交叉熵损失函数即可
  • 年龄预测:可以采用年龄分类方法,如SSR-Net模型,也可以结合回归的方法,如Label Distribution。就调研而言,基于Label Distribution的方法会比分类方法准确率会高一些。

下图本项目构建的年龄性别预测和识别模型,其中

  • Backbone:主杆网络,用于提取人脸图像特征,可以使用任意的骨干网络,如resnet18,resnet34,resnet50以及轻量化模型mobilenet_v2等
  • Gender-branch: 性别识别分支,用于对性别进行分类识别,损失函数使用交叉熵
  • Age-branch: 年龄预测分支,对年龄进行预测,损失函数可以使用交叉熵或者Label Distribution,项目设定最大周岁是70周岁,训练数据中年龄大于70的lalel,会重置为70。


2.人脸检测方法

本项目人脸检测训练代码请参考:https://github.com/Linzaer/Ultra-Light-Fast-Generic-Face-Detector-1MB 

这是一个基于SSD改进且轻量化后人脸检测模型,很轻巧,整个模型仅仅1.7M左右,在普通Android手机都可以实时检测。人脸检测方法在网上有一大堆现成的方法可以使用,如MTCNN,DSFD,FaceBoxes,完全可以不局限我这个方法。

​​

关于人脸检测的方法,可以参考我的另一篇博客:

行人检测和人脸检测和人脸关键点检测(C++/Android源码)


3.年龄性别预测和识别模型训练

(1)年龄性别预测和识别模型训练

本篇博文不含Python版本的模型以及相关训练代码,关于年龄性别预测和识别模型的训练方法,请参考本人另一篇博文《Pytorch实现年龄性别预测和识别(含训练代码和数据)》;

Python项目源码backbone模型支持的有resnet18,resnet50,以及轻量化模型mobilenet_v2等常见的深度学习模型,用户也可自定义模型进行训练;准确率还挺高的,采用轻量级mobilenet_v2模型的性别识别准确率0.9603左右,年龄预测MAE(平均绝对误差:)3.1935左右,CS5(预测年龄与真实年龄的绝对误差不过5年的准确率)0.8021左右,基本满足业务性能需求。

模型input size性别准确率年龄MAE年龄CS3年龄CS5

AE_mobilenet_v2

112×112

0.9603

3.1935

0.5969

0.8021

AE_resnet18

112×112

0.9606

3.1795

0.5956

0.8010

AE_resnet50

112×112

0.9609

3.2008

0.5900

0.8035

关于模型训练以及测试的建议:

  1. ​ 关于性别识别的问题:目前性别识别的准确率约96%,识别错误的主要有两种情况,(1)儿童性别容易误识别,特别是1~3岁左右的儿童,性别识别比较困难 (2) 长头发的男生或者短头发的女生的,也容易误识别;其他情况,正常穿着打扮的男士女生识别准确率可以达到99%左右。
  2. 关于年龄预测的问题:现有数据年龄部分不均匀,大部分人脸数据年龄分布在20-40岁之间的年轻人,而儿童和老年人的数据比较少;导致儿童和老年人年龄预测精准度比较差;另外,也是强烈建议的:采集同一个人不同年龄阶段的人脸数据加入模型训练,可以有效提升年龄预测的精准度。损失函数使用Label Distribution方法进行训练,也会比直接使用交叉熵损失函数效果要好。
  3. 当人脸存在遮挡时,如戴眼镜,戴口罩,头发遮挡,年龄预测的误差较大,建议实际使用过程中,尽量采集正脸,无遮挡的人脸图片进行测试
  4. 清洗数据集(最重要):尽管鄙人已经清洗一部分了,但还是建议你,训练前,再次清洗数据集,不然会影响模型的识别的准确率。
  5. 增加训练的样本数据: 建议根据自己的业务场景,采集相关数据,提高模型泛化能力
  6. 使用参数量更大的模型: 本教程使用的是mobilenet_v2模型,属于比较轻量级的分类模型,采用更大的模型(如resnet50),理论上其精度更高,但推理速度也较慢。
  7. 尝试不同数据增强的组合进行训练
  8. 增加数据增强: 已经支持: 随机裁剪,随机翻转,随机旋转,颜色变换等数据增强方式,可以尝试诸如mixup,CutMix等更复杂的数据增强方式
  9. 样本均衡: 原始数据年龄类别数据并不均衡,类别20-40岁的数据偏多,而老年人和小孩的数据偏少,这会导致训练的模型会偏向于样本数较多的类别。建议进行样本均衡处理。
  10. 调超参: 比如学习率调整策略,优化器(SGD,Adam等)
  11. 损失函数: 目前训练代码已经支持:交叉熵,LabelSmoothing,可以尝试FocalLoss等损失函数

(2) 将Pytorch模型转换ONNX模型

目前CNN模型有多种部署方式,可以采用TNN,MNN,NCNN,以及TensorRT等部署工具,鄙人采用TNN进行C/C++端上部署。部署流程可分为四步:训练模型->将模型转换ONNX模型->将ONNX模型转换为TNN模型->C/C++部署TNN模型。

训练好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 argparse
from demo import Predictor
from basetrainer.utils import log, setup_config
from basetrainer.utils.converter import pytorch2onnxdef get_parser():# 配置文件config_file = "../../configs/config.yaml"# 模型文件# model_file = "../../work_space/AE_mobilenet_v2_1.0_L1Loss_20240103_191147_2420/model/best_model_073_0.8107.pth"model_file = "../../work_space/AE_mobilenet_v2_1.0_L1Loss_20240105_181151_9813/model/best_model_082_0.8021.pth"parser = argparse.ArgumentParser(description="Inference Argument")parser.add_argument("-c", "--config_file", help="configs file", default=config_file, type=str)parser.add_argument("-m", "--model_file", help="model_file", default=model_file, type=str)parser.add_argument("--use_age_ld", help="use age label distribution", default=1, type=int)parser.add_argument("--device", help="cuda device id", default="cuda:0", type=str)return parserdef convert_torch_to_onnx(cfg):p = Predictor(cfg=cfg)model = p.modelw, h = cfg.input_sizeinput_shape = (1, 3, h, w)onnx_file = str(cfg.model_file).replace(".pth", ".onnx")pytorch2onnx.convert2onnx(model,input_shape=input_shape,input_names=['input'],output_names=['age', 'gender'],onnx_file=onnx_file,opset_version=9)if __name__ == "__main__":parser = get_parser()print(parser.parse_args())cfg = setup_config.parser_config(parser.parse_args(), cfg_updata=False)convert_torch_to_onnx(cfg)

(3) 将ONNX模型转换为TNN模型

目前CNN模型有多种部署方式,可以采用TNN,MNN,NCNN,以及TensorRT等部署工具,鄙人采用TNN进行C/C++端上部署

TNN转换工具:

  • (1)将ONNX模型转换为TNN模型,请参考TNN官方说明:TNN/onnx2tnn.md at master · Tencent/TNN · GitHub
  • (2)一键转换,懒人必备:一键转换 Caffe, ONNX, TensorFlow 到 NCNN, MNN, Tengine   (可能存在版本问题,这个工具转换的TNN模型可能不兼容,建议还是自己build源码进行转换,2022年9约25日测试可用)

​​​​

 模型转换成功后,会得到两个TNN模型,一个描述模型结构的*.tnnproto的文件,一个是模型参数*.tnnmodel文件;下载到本地,后面C++/Android端上部署,需要加载*.tnnproto和*.tnnmodel文件进行模型推理。


4.年龄性别预测和识别模型Android部署

 (1) Android开发版本

开发前,请对齐Android Studio 开发版本,避免版本差异导致编译的异常; Android SDK和NDK相关版本信息,请参考: 

  • Android Studio 4.1.1
  • JDK Java1.8(Jave 8) JAVA_VERSION="1.8.0_242"
  • CMake 3.18.1

 

(2) 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 图像(bitmap),ARGB_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.h"using 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 det_model_ = env->GetStringUTFChars(det_model, 0);std::string cls_model_ = env->GetStringUTFChars(cls_model, 0);string det_model_file = path_joint(parent, det_model_ + ".tnnmodel");string det_proto_file = path_joint(parent, det_model_ + ".tnnproto");string cls_model_file = path_joint(parent, cls_model_ + ".tnnmodel");string cls_proto_file = path_joint(parent, cls_model_ + ".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;
}

(3) Android测试效果 

Android Demo在普通手机CPU/GPU上可以达到实时检测和识别效果;CPU(4线程)约30ms左右,GPU约25ms左右 ,基本满足业务的性能需求。

  

(4) 运行APP闪退:dlopen failed: library "libomp.so" not found

参考解决方法:
解决dlopen failed: library “libomp.so“ not found


5.项目源码下载

Android项目源码下载地址:年龄性别预测3:Android实现年龄性别预测和识别(含源码,可实时预测)

整套Android项目源码内容包含:

  1. 提供Android版本的人脸检测模型
  2. 提供年龄性别预测和识别Android Demo项目源码,源码可用于二次开发
  3. Android Demo在普通手机CPU/GPU上可以实时检测,CPU约30ms,GPU约25ms左右
  4. Android Demo支持图片,视频,摄像头测试
  5. 所有依赖库都已经配置好,可直接build运行,若运行出现闪退,请参考dlopen failed: library “libomp.so“ not found 解决。

年龄性别预测和识别Android APP Demo体验:https://download.csdn.net/download/guyuealian/88743711

如果你需要年龄性别预测和识别的训练代码,请参考 《Pytorch实现年龄性别预测和识别(含训练代码和数据)》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/706117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Golang】Golang使用embed加载、打包静态资源文件

【Golang】Golang使用embed加载、打包静态资源文件 大家好 我是寸铁&#x1f44a; 总结了一篇Golang使用embed加载静态资源文件的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 事情是这样的&#xff1a;前不久&#xff0c;有同学问我,golang怎么把静态资源文件打包成一…

【Node.js】自动生成 API 文档

目录 1、直接使用swagger-ui-express 2、配合swagger-jsdoc 如何在Node.js项目中使用 Swagger 来自动生成 API接口文档&#xff0c;使用生成方式有很多种。本文基于swagger-jsdocswagger-ui-express快速实现 1、直接使用swagger-ui-express // 方便来浏览和测试api npm i sw…

GDPU Java 天码行空 1

&#x1f496; 配置环境 &#x1f468;‍&#x1f3eb; JDK17 配置教程 &#x1f338; CMD 查看本机 JDK 版本命令&#xff1a; java -version1. 输出 Hello World&#xff01; (1) 新建 Java 文件 文件名&#xff1a;HelloWorld.java 文件内容&#xff1a; public clas…

家政小程序有哪些功能 怎么制作

随着人们生活节奏的加快&#xff0c;家政服务变得越来越受到人们的青睐。为了提升家政服务的便捷性和高效性&#xff0c;家政小程序成为了越来越受欢迎的选择。下面具体介绍家政小程序有哪些功能&#xff0c;如何制作。 1. 展示家政服务 在小程序中&#xff0c;上传所有的家政…

C# OpenCvSharp DNN Yolov8-OBB 旋转目标检测

目录 效果 模型信息 项目 代码 下载 C# OpenCvSharp DNN Yolov8-OBB 旋转目标检测 效果 模型信息 Model Properties ------------------------- date&#xff1a;2024-02-26T08:38:44.171849 description&#xff1a;Ultralytics YOLOv8s-obb model trained on runs/DOT…

一周学会Django5 Python Web开发-Django5二进制文件下载响应

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计25条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

【Git教程】(三)提交详解 —— add、commit、status、stach命令的说明,提交散列值与历史,多次提交及忽略 ~

Git教程 提交详解 1️⃣ 访问权限与时间戳2️⃣ add命令与 commit 命令3️⃣ 提交散列值4️⃣ 提交历史5️⃣ 一种特别的提交查看方法6️⃣ 同一项目的多部不同历史6.1 部分输出&#xff1a;-n6.2 格式化输出&#xff1a;--format、--oneline6.3 统计修改信息&#xff1a;--st…

C++初阶 | [八] (下) vector 模拟实现

摘要&#xff1a;vector 模拟实现讲解&#xff08;附代码示例&#xff09;&#xff0c;隐藏的浅拷贝&#xff0c;迭代器失效 在进行 vector 的模拟实现之前&#xff0c;我们先粗略浏览一下 stl_vector.h 文件中的源码来确定模拟实现的大体框架。 这里提供一些粗略浏览源码的技巧…

go环境安装-基于vscode的Windows安装

1、vscode安装 官网链接&#xff1a;https://code.visualstudio.com/ 选择相应的版本&#xff0c;这里选择Windows下的 下载得到一个VSCodeUserSetUp-x64的可执行文件&#xff0c;双击执行&#xff0c;选择要安装的路径&#xff0c;下一步。 2、go语言安装 官网链接&#x…

【Unity自制手册】Unity—Camera相机跟随的方法大全

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

微信小程序的医院体检预约管理系统springboot+uniapp+python

本系统设计的目的是建立一个简化信息管理工作、便于操作的体检导引平台。共有以下四个模块&#xff1a; uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 语言&#xff1a;pythonjavanode.js…

Sentinel 动态规则扩展

一、规则 Sentinel 的理念是开发者只需要关注资源的定义&#xff0c;当资源定义成功后可以动态增加各种流控降级规则。Sentinel 提供两种方式修改规则&#xff1a; 通过 API 直接修改 (loadRules)通过 DataSource 适配不同数据源修改 手动通过 API 修改比较直观&#xff0c;…

主机字节序与网络字节序

大端序和小端序 大端序&#xff08;Big Endian&#xff09;和小端序&#xff08;Little Endian&#xff09;是两种计算机存储数据的方式。 大端序指的是将数据的高位字节存储在内存的低地址处&#xff0c;而将低位字节存储在内存的高地址处。这类似于我们阅读多位数时从左往右…

迁移学习 领域自适应

迁移学习 什么是迁移学习 迁移学习是机器学习领域用于标记数据难获取这一基础问题的重要手段&#xff0c; 将训练好的内容应用到新的任务上被称为迁移学习。 由于这个过程发生在两个领域间&#xff0c;已有的知识和数据也就是被迁移的对象被称为源域&#xff0c;被赋予经验…

防火墙的内容安全

目录 1. 内容安全 1.1 IAE引擎 DPI---深度包检测技术 DFI---深度流检测技术 结论(优缺点)&#xff1a; 1.2 入侵防御&#xff08;检测&#xff09;(IPS) IPS的优势: 入侵检测的方法: 入侵检测的流程 签名 查看预定义签名的内容 新建自定义签名 入侵防御的检测…

热闹元宵进行中,如何利用VR全景展示民宿品牌形象?

错峰出游闹元宵&#xff0c;元宵节恰逢周末&#xff0c;而且还是春节假期返工之后的首个休息日&#xff0c;不少人都想通过短途度假来缓解“节后综合征”。两位数的特价机票、打折的各种酒店让你实现“旅行自由”&#xff0c;那么如何知道特价酒店服务好不好呢&#xff1f;先别…

对于大前端开发来说,转鸿蒙开发究竟是福还是祸?

从铺天盖地的市场消息来看&#xff0c;华为即将面世的鸿蒙NEXT系统已经势不可挡了 想必大家都已经迫不及待地想要进行尝试。 估计大家都有着同样的疑问&#xff1a; 会不会是下一个风口&#xff1f;转鸿蒙应用开发难吗&#xff1f; 会不会是下一个风口&#xff1f; 自从鸿蒙…

江科大stm32 定时器 TIM输出比较--学习笔记

这几天遇到输出比较相关的问题&#xff0c;于是来学习下TIM输出比较部分知识点&#xff01; 输出比较简介 CNT是计数器的值&#xff0c;CCR寄存器是捕获/ 比较寄存器 简单的讲&#xff0c;输出比较就是用来输出PWM波形。 PWM简介 占空比&#xff1a;高电平占一个周期的比例。…

搜索算法(算法竞赛、蓝桥杯)--双向BFS字串变换

1、B站视频链接&#xff1a;B19 双向BFS 字串变换_哔哩哔哩_bilibili 题目链接&#xff1a;[NOIP2002 提高组] 字串变换 - 洛谷 #include <iostream> #include <queue> #include <unordered_map> using namespace std;const int N7; int n; string A,B,a[N]…

opencascade c#例程解析

1.编译 将msvc.bat文件拖入vs2022的x64 native tools&#xff0c;即可 2.about.xaml <Windowxmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"x:Class"IE_WPF_WinForms…