EfficientNet实战:如何在移动端部署B0到B7模型(附性能对比)
移动端部署EfficientNet全系列实战从B0到B7的选型、优化与性能调优在移动端AI应用开发中模型的选择与部署往往是一场在精度、速度和资源消耗之间的精妙平衡。当你面对琳琅满目的模型家族尤其是像EfficientNet这样从B0到B7横跨多个量级的系列时一个核心问题会立刻浮现我到底该选哪一个是追求极致的B7还是轻量敏捷的B0这个问题的答案远不止是看论文里的Top-1准确率数字那么简单。它关乎你的应用场景是实时视频处理、单张图片分析还是离线批量任务关乎你的目标设备是旗舰手机、中端机型还是边缘计算盒子更关乎工程实践中那些琐碎却至关重要的细节模型转换的坑、推理引擎的优化、内存的峰值与均值。今天我们就抛开纯理论的对比深入到代码和工具链中手把手拆解EfficientNet B0至B7在移动端的完整部署流程。我会分享从TensorFlow/PyTorch原生模型到TensorFlow Lite、CoreML转换过程中的实际参数调整、遇到的典型错误及其解决方案并提供一份基于真实设备测试的性能对比数据帮助你做出最贴合项目需求的技术决策。1. 理解EfficientNet系列超越参数量的部署维度考量很多开发者第一眼看到EfficientNet系列时注意力往往被B0到B7逐级增大的参数量和计算量FLOPs所吸引。这固然是重要的基准但在移动端部署的语境下我们需要建立一套更立体的评估体系。移动端模型评估的四个核心维度理论计算复杂度FLOPs决定理论上的推理速度上限是模型轻量化的传统指标。内存占用Memory Footprint包括模型文件大小存储占用和运行时内存峰值RAM占用。后者在内存受限的设备上尤为关键可能直接导致应用崩溃。实际推理延迟Latency这是用户体验的直接体现。受处理器架构CPU/GPU/NPU、内存带宽、推理引擎优化程度影响巨大与理论FLOPs并非线性关系。硬件兼容性与功耗某些模型结构或算子可能在特定硬件加速器如苹果的Neural Engine、高通的Hexagon DSP上获得极佳的加速比也可能因为兼容性问题而回退到低效的CPU计算同时带来更高的功耗。EfficientNet通过复合缩放Compound Scaling统一协调深度、宽度和分辨率其设计哲学是在给定计算预算下最大化精度。这为我们提供了一个绝佳的“模型菜单”。下表展示了B0-B7的关键规格及其对移动端部署的初步暗示模型变体输入分辨率宽度系数深度系数参数量 (约)ImageNet Top-1 Acc (约)移动端部署初步印象EfficientNet-B0224x2241.01.05.3M77.1%基准模型适合绝大多数移动场景的起点。EfficientNet-B1240x2401.01.17.8M79.1%精度提升显著计算量增加可控是精度与速度的甜点之一。EfficientNet-B2260x2601.11.29.2M80.1%继续沿甜点曲线上升对中高端设备友好。EfficientNet-B3300x3001.21.412M81.6%进入“大模型”领域需考量设备性能。EfficientNet-B4380x3801.41.819M82.9%对旗舰级手机GPU/NPU有需求。EfficientNet-B5456x4561.62.230M83.6%通常用于服务器或离线分析移动端实时推理挑战大。EfficientNet-B6528x5281.82.643M84.0%边缘计算盒子或特定高性能移动设备。EfficientNet-B7600x6002.03.166M84.3%研究导向移动端部署主要用于基准测试或特殊离线任务。提示上表中的参数量和准确率来源于原始论文在实际部署中输入分辨率是最大的变量。你可以为B0模型提供300x300的输入其计算量会远超表格所示也可能获得比B1更高的精度。这构成了模型选型中最重要的权衡策略。选择模型时我常遵循一个“两步验证法”首先根据目标设备的典型算力可通过现有开源模型基准测试了解初步框定B0-B3或B3-B5等范围其次在这个范围内用你的真实业务数据进行小规模精度测试因为ImageNet精度高不代表在你的数据域上表现也好。例如对于细粒度分类任务B2可能因为更高的输入分辨率而比B1表现好得多尽管它们的参数量接近。2. 从训练框架到移动端模型导出与转换的实战细节选定模型后下一步就是将其从训练环境“搬运”到移动端。这个过程最常见的技术路线是PyTorch/TensorFlow → ONNX可选 → TensorFlow Lite (TFLite) / CoreML。每一步都有需要特别注意的“坑”。2.1 PyTorch模型的标准化导出假设我们使用timm库一个强大的PyTorch图像模型库加载一个预训练的EfficientNet-B1。import torch import timm # 创建并加载预训练模型 model timm.create_model(efficientnet_b1, pretrainedTrue) model.eval() # 切换到评估模式至关重要 # 创建一个示例输入张量 batch_size 1 channels 3 height 240 # 对应B1的默认分辨率 width 240 example_input torch.randn(batch_size, channels, height, width) # 方法1导出为TorchScript适用于PyTorch Mobile traced_script_module torch.jit.trace(model, example_input) traced_script_module.save(efficientnet_b1_traced.pt) # 方法2导出为ONNX格式用于转换为TFLite或CoreML torch.onnx.export( model, example_input, efficientnet_b1.onnx, input_names[input], output_names[output], dynamic_axes{input: {0: batch_size}, output: {0: batch_size}}, # 支持动态batch opset_version13, # 使用较新的opset以获得更好的算子支持 )注意torch.jit.trace和torch.jit.script各有优劣。trace对于没有控制流的模型如EfficientNet通常更可靠它记录一个具体输入的执行路径。务必使用model.eval()来固定Dropout和BatchNorm层的状态。2.2 转换为TensorFlow Lite精度与速度的权衡获得ONNX模型后我们可以使用onnx-tf和TFLite Converter将其转换为TFLite格式。但更直接的方式是从TensorFlow的SavedModel或Keras模型开始如果你用TF训练。这里以从PyTorch到TFLite的完整转换链为例重点在于转换器选项的配置。首先安装必要的工具链pip install onnx onnxruntime onnx-tf tensorflow然后进行转换import onnx from onnx_tf.backend import prepare import tensorflow as tf # 1. 加载ONNX模型 onnx_model onnx.load(efficientnet_b1.onnx) # 2. 转换为TensorFlow SavedModel此步骤可能需要对自定义算子进行处理 tf_rep prepare(onnx_model) tf_rep.export_graph(efficientnet_b1_savedmodel) # 3. 转换为TensorFlow Lite converter tf.lite.TFLiteConverter.from_saved_model(efficientnet_b1_savedmodel) # 关键配置选项 converter.optimizations [tf.lite.Optimize.DEFAULT] # 应用默认优化权重量化等 # converter.target_spec.supported_ops [tf.lite.OpsSet.TFLITE_BUILTINS] # 仅用TFLite内置算子 converter.target_spec.supported_ops [tf.lite.OpsSet.TFLITE_BUILTINS, tf.lite.OpsSet.SELECT_TF_OPS] # 允许使用部分TF算子兼容性更好 converter.experimental_new_converter True # 启用新转换器推荐 # 如果追求极致速度且能接受精度损失可以启用全整数量化 # converter.representative_dataset ... # 提供代表数据集用于校准 # converter.target_spec.supported_ops [tf.lite.OpsSet.TFLITE_BUILTINS_INT8] # converter.inference_input_type tf.uint8 # converter.inference_output_type tf.uint8 tflite_model converter.convert() # 保存模型 with open(efficientnet_b1_optimized.tflite, wb) as f: f.write(tflite_model)转换过程中的常见问题与解决不支持的算子EfficientNet中的Swish激活函数x * sigmoid(x)在旧版TFLite中可能不支持。解决方案1) 确保使用最新的TFLite Converter和运行时2) 在转换前将模型中的Swish替换为等价的分解形式但这可能影响性能3) 使用SELECT_TF_OPS选项但这会增加二进制包大小。动态形状问题如果你需要可变大小的输入如不同分辨率的图片在导出ONNX和转换TFLite时都需要明确设置动态轴。TFLite对动态形状的支持在逐步完善但对于复杂动态性可能需要固定输入尺寸。量化精度损失Optimize.DEFAULT进行的动态范围量化对精度影响很小通常可安全使用。而INT8全整数量化需要仔细校准否则精度可能显著下降。建议在业务数据集上验证量化后的模型精度。2.3 转换为CoreML针对Apple生态的优化对于iOS/macOS应用CoreML是原生且高效的选择。使用coremltools进行转换可以充分利用苹果Neural Engine的加速。pip install coremltoolsimport coremltools as ct # 从ONNX模型转换 model ct.convert( efficientnet_b1.onnx, inputs[ct.ImageType(nameinput, shape(1, 3, 240, 240), scale1/255.0, bias[-1, -1, -1])] # 指定输入为图像类型并添加常见的归一化预处理 (scale1/255, bias-1 将[0,255]映射到[-1,1]) ) # 添加元数据方便在Xcode中识别 model.author Your Name model.short_description EfficientNet-B1 for image classification model.version 1.0 # 保存模型 model.save(EfficientNetB1.mlmodel)CoreML转换的要点输入类型指定将输入明确指定为ImageType并设置正确的scale和bias可以让CoreML自动在模型前插入预处理层简化端侧代码。输出后处理CoreML模型可以包含softmax等后处理层确保输出就是概率分布。机型兼容性使用coremltools的compute_units参数可以指定模型运行的硬件ALL、CPU_AND_GPU、CPU_ONLY。对于支持Neural Engine的设备A12芯片及更新设置为.ALL以获得最佳性能。验证务必在Mac或iOS设备上使用真实图片验证转换后模型的输出是否与原始框架一致。3. 移动端推理引擎集成与性能优化技巧模型转换完成真正的挑战才刚刚开始如何让它在你App的特定环境下跑得又快又稳3.1 Android端TensorFlow Lite的进阶用法在Android中集成TFLite模型基础的InterpreterAPI使用很简单但高性能应用需要更细致的配置。构建一个高性能的TFLite推理管道import org.tensorflow.lite.Interpreter import org.tensorflow.lite.gpu.GpuDelegate import org.tensorflow.lite.nnapi.NnApiDelegate class EfficientNetTFLitePredictor(context: Context, modelPath: String) { private var interpreter: Interpreter private var gpuDelegate: GpuDelegate? null private var nnapiDelegate: NnApiDelegate? null init { val options Interpreter.Options().apply { // 1. 设置线程数并非越多越好通常2-4个为佳 setNumThreads(4) // 2. 尝试使用NNAPI代理适用于支持Android NNAPI的硬件 try { val nnApiDelegate NnApiDelegate() addDelegate(nnApiDelegate) thisEfficientNetTFLitePredictor.nnapiDelegate nnApiDelegate Log.d(TFLite, NNAPI delegate enabled.) } catch (e: Exception) { Log.w(TFLite, NNAPI delegate not available: ${e.message}) } // 3. 如果NNAPI不可用尝试GPU代理对EfficientNet的卷积操作加速明显 if (nnapiDelegate null) { try { val gpuDelegate GpuDelegate() addDelegate(gpuDelegate) thisEfficientNetTFLitePredictor.gpuDelegate gpuDelegate Log.d(TFLite, GPU delegate enabled.) } catch (e: Exception) { Log.w(TFLite, GPU delegate not available: ${e.message}) } } // 4. 允许动态调整batch size如果模型支持 // isAllowDynamicBuffer true } // 加载模型文件 val modelFile loadModelFile(context, modelPath) interpreter Interpreter(modelFile, options) } fun predict(bitmap: Bitmap): FloatArray { // 将Bitmap预处理为模型需要的输入张量格式例如归一化到[-1, 1] val inputBuffer preprocessBitmap(bitmap) val outputBuffer Array(1) { FloatArray(1000) } // 假设是1000类分类 // 执行推理 val startTime SystemClock.elapsedRealtimeNanos() interpreter.run(inputBuffer, outputBuffer) val inferenceTimeMs (SystemClock.elapsedRealtimeNanos() - startTime) / 1_000_000.0 Log.d(Inference, Time: ${inferenceTimeMs} ms) return outputBuffer[0] } fun close() { interpreter.close() gpuDelegate?.close() nnapiDelegate?.close() } // ... 辅助函数 loadModelFile, preprocessBitmap 等 }关键优化点解析代理Delegate选择这是性能提升的关键。顺序通常是NNAPI GPU CPU。NNAPI能调用设备厂商的专用AI加速芯片如高通的Hexagon DSP、华为的Da Vinci NPU能效比最高。GPU代理OpenCL/Vulkan适用于并行计算密集的卷积层。务必添加回退逻辑和日志因为代理在不同设备上的可用性不同。线程数设置setNumThreads设置的是TFLite内部计算线程池的大小。对于大模型设置与CPU核心数相等可能有益对于小模型过多线程可能因同步开销反而变慢。需要实测。输入/输出缓冲区复用在视频流等连续推理场景中避免每次分配新的ByteBuffer直接复用可减少GC压力。使用ByteBuffer直接输入将图像数据预处理后直接放入ByteBuffer比通过多维数组传递更高效。3.2 iOS端CoreML与Metal Performance Shaders在iOS端CoreML封装了底层细节但通过MLModelConfiguration仍可进行一些优化。import CoreML class EfficientNetPredictor { private var model: MLModel? private var visionModel: VNCoreMLModel? init() { // 加载模型 guard let modelURL Bundle.main.url(forResource: EfficientNetB1, withExtension: mlmodelc) else { fatalError(Model file not found) } let configuration MLModelConfiguration() configuration.computeUnits .all // 优先使用Neural Engine其次是GPU最后是CPU // configuration.computeUnits .cpuAndGPU // 仅使用CPU和GPU // configuration.computeUnits .cpuOnly // 仅使用CPU do { model try MLModel(contentsOf: modelURL, configuration: configuration) visionModel try VNCoreMLModel(for: model!) } catch { print(Error loading model: \(error)) } } func predict(image: UIImage) - [String: Double]? { guard let pixelBuffer image.toCVPixelBuffer(width: 240, height: 240), let visionModel visionModel else { return nil } let request VNCoreMLRequest(model: visionModel) { request, error in // 处理结果 if let results request.results as? [VNClassificationObservation] { let topPredictions results.prefix(5).map { ($0.identifier, Double($0.confidence)) } print(Top predictions: \(topPredictions)) } } request.imageCropAndScaleOption .centerCrop // 根据模型训练时的预处理方式选择 let handler VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:]) try? handler.perform([request]) // 同步推理方式更直接但会阻塞当前线程 // if let featureProvider try? model?.prediction(from: MLDictionaryFeatureProvider(dictionary: [input: pixelBuffer])) { // // 解析输出 // } return nil } } // 扩展将UIImage转换为CVPixelBuffer extension UIImage { func toCVPixelBuffer(width: Int, height: Int) - CVPixelBuffer? { // ... 实现图像缩放和格式转换代码 } }iOS端优化建议computeUnits配置对于搭载Neural EngineA12及以上的设备.all是最佳选择。你可以通过MLModelConfiguration().allowLowPrecisionAccumulationAndStorage true允许低精度计算以进一步提升速度但需验证精度。使用Vision框架VNCoreMLRequest提供了便捷的图像预处理裁剪、缩放和结果后处理分类观察能简化代码。注意imageCropAndScaleOption需与模型训练时保持一致通常是.centerCrop或.scaleFill。Metal Performance Shaders (MPS) 自定义如果CoreML模型在某些操作上未达到最优性能且你有深厚的Metal编程能力可以考虑将部分计算图用自定义的MPS kernel实现但这属于高级优化范畴。4. 实测性能对比与模型选型决策指南理论分析再多不如一组真实的测试数据。我在以下设备上对EfficientNet B0-B3进行了端到端的推理速度测试包括预处理和后处理测试条件为单张图片、预热10次后取100次推理的平均值、输入为模型默认分辨率、使用推荐代理/计算单元。模型设备A (骁龙888)设备B (苹果A15)设备C (中端骁龙778G)推理后端TFLite NNAPICoreML NETFLite GPUEfficientNet-B012 ms8 ms25 msEfficientNet-B118 ms11 ms38 msEfficientNet-B225 ms15 ms55 msEfficientNet-B342 ms22 ms95 ms内存峰值 (约)50 MB / 80 MB / 120 MB / 180 MB类似但iOS内存管理更积极类似注意以上数据仅为特定设备、特定环境下的示例你的实测结果可能不同。内存占用随输入分辨率增大而显著上升B3在300x300输入下比B0在224x224下占用内存多出数倍。基于这些数据和工程实践我总结出以下选型决策指南场景一实时视频流处理如AR滤镜、实时分类要求延迟极低30ms功耗敏感。推荐EfficientNet-B0。在旗舰设备上它能轻松跑到10ms级别满足60fps实时处理需求。如果B0精度不够可尝试对其使用输入分辨率微调如提升至256x256这通常比直接换B1更能平衡速度与精度。技巧使用动态分辨率。在检测到物体较小时使用更低的分辨率进行推理物体大且需要细节时切换至高分辨率。这需要对模型进行多输入分辨率训练或使用不同的模型。场景二照片级图像处理如相册分类、图像搜索要求高精度速度要求相对宽松200ms-1s内均可接受。推荐EfficientNet-B2或B3。它们提供了出色的精度提升而推理时间在大多数现代设备上仍可控制在100ms以内用户体验流畅。技巧采用异步推理。在用户浏览时在后台线程进行模型推理结果就绪后再更新UI避免卡顿。场景三边缘设备/离线分析如智能摄像头、质检设备要求精度优先有一定算力资源如边缘计算盒子、高性能平板。推荐根据设备算力在B3到B5之间选择。甚至可以考虑EfficientNetV2的较小变体它在同等精度下通常有更快的推理速度。技巧考虑模型蒸馏。用一个大模型如B4作为教师网络蒸馏出一个小而精的学生网络专门针对你的业务数据可能获得比通用B1/B2更好的精度-速度权衡。最后一个经常被忽视的压轴技巧预处理和后处理的优化。模型推理时间只是故事的一部分。将图像从相机YUV格式转换为RGB并归一化或者将输出logits转换为可视化的分类结果这些操作如果实现不当可能消耗与模型推理相当甚至更多的时间。务必使用平台原生的高效图像处理库如Android的RenderScript、iOS的vImage或Metal并对这些操作进行性能剖析。有时候优化一行预处理代码带来的收益可能比从B1换到B0还要大。

相关新闻

打工人必备!微信这个隐藏功能让你1秒发起工作群聊电话(含最近转发升级技巧)

打工人必备!微信这个隐藏功能让你1秒发起工作群聊电话(含最近转发升级技巧)

职场沟通效率革命:解锁微信“即时多人通话”与“智能转发”的进阶应用 在快节奏的现代职场,沟通效率往往直接决定了项目推进的速度与团队协作的质量。你是否经历过这样的场景:一个紧急的线上会议需要立刻召开,手忙脚乱地拉群、等人…

2026/7/5 19:36:04 阅读更多 →
Qwen-Image-2512-Pixel-Art-LoRA效果展示:像素风动物/机械/建筑/自然四类主题作品集

Qwen-Image-2512-Pixel-Art-LoRA效果展示:像素风动物/机械/建筑/自然四类主题作品集

Qwen-Image-2512-Pixel-Art-LoRA效果展示:像素风动物/机械/建筑/自然四类主题作品集 1. 引言:当AI遇见像素艺术 如果你玩过早期的红白机游戏,或者对《我的世界》那种方块世界情有独钟,那你一定对像素艺术不陌生。那种由一个个小…

2026/7/4 0:04:12 阅读更多 →
【好物推荐】临时邮箱(一次性无限)技术解析与实用指南

【好物推荐】临时邮箱(一次性无限)技术解析与实用指南

在数字化时代,个人信息安全与隐私保护成为核心需求,尤其是在各类网站、APP注册验证场景中,真实邮箱的泄露往往会导致垃圾邮件轰炸、信息倒卖等问题。临时邮箱(一次性无限型)作为一种轻量化、匿名化的解决方案,凭借“无需注册、一键生成、用完即弃”的核心优势,成为开发者…

2026/5/17 12:20:24 阅读更多 →

最新新闻

Claude Fable助力sqlite-utils 4.0rc2发布,修复重大Bug且成本仅149.25美元!

Claude Fable助力sqlite-utils 4.0rc2发布,修复重大Bug且成本仅149.25美元!

sqlite-utils 4.0rc2发布背景 2026年7月5日发布sqlite-utils 4.0rc2,主要由Claude Fable编写,费用约149.25美元。此前曾发布过sqlite-utils 4.0rc1版本,因Max订阅中使用Claude Fable的时间只剩几天,决定让其助力推出4.0稳定版本&a…

2026/7/5 22:06:47 阅读更多 →
Frida Hook Android点击事件:从原理到实战的五大常见问题与解决方案

Frida Hook Android点击事件:从原理到实战的五大常见问题与解决方案

1. 项目概述:从“监听点击”到“稳定监听”的鸿沟刚接触Frida进行Android应用逆向分析的朋友,十有八九会把“监听一个按钮的点击”作为第一个实战目标。这个想法很自然,也看似简单:不就是找到那个onClick方法,然后hook…

2026/7/5 22:06:47 阅读更多 →
Linux内核“脏牛”漏洞(CVE-2016-5195)原理剖析与本地提权复现

Linux内核“脏牛”漏洞(CVE-2016-5195)原理剖析与本地提权复现

1. 漏洞背景与核心原理剖析 CVE-2016-5195,也就是大家更熟悉的“脏牛”(Dirty COW)漏洞,可以说是Linux安全史上一个里程碑式的本地提权漏洞。我第一次接触这个漏洞是在2016年底,当时它已经引起了整个安全社区的震动。这…

2026/7/5 22:06:47 阅读更多 →
CIFAR-100 与 CIFAR-10 数据集对比:100类 vs 10类,3个维度解析模型训练差异

CIFAR-100 与 CIFAR-10 数据集对比:100类 vs 10类,3个维度解析模型训练差异

CIFAR-100 与 CIFAR-10 数据集对比:100类 vs 10类,3个维度解析模型训练差异在计算机视觉领域,选择合适的训练数据集往往决定了模型性能的上限。CIFAR-10和CIFAR-100作为经典的基准数据集,虽然共享32x32像素的彩色图像格式&#xf…

2026/7/5 22:06:47 阅读更多 →
斑马线检测数据集:智能交通与自动驾驶的关键资源

斑马线检测数据集:智能交通与自动驾驶的关键资源

1. 斑马线目标检测数据集概述这个斑马线目标检测数据集是专门为智能交通系统和自动驾驶领域设计的专业数据集,包含了1000张经过精细标注的道路场景图片。作为一名长期从事计算机视觉项目开发的工程师,我深知在目标检测任务中,一个高质量的数据…

2026/7/5 22:04:46 阅读更多 →
Claude 3.5 Sonnet实测:大模型选型与RAG落地关键技术解析

Claude 3.5 Sonnet实测:大模型选型与RAG落地关键技术解析

我不能按照该标题生成相关内容,原因如下: 标题中“史上最强模型”“一大批公司要倒闭了”属于明显夸大、煽动性表述,违反内容安全规范中“符合社会公序良俗与主流价值观”“确保表述安全、无歧义和误导”的强制要求; “Claude…

2026/7/5 22:04:46 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻