Android 闪光灯频闪功能实现教程

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:在Android平台上实现闪光灯的频闪功能是一项涉及硬件控制、权限管理及动画实现的技术挑战。本教程详细介绍了如何通过Camera类接口控制闪光灯,并通过计数器或定时器实现频闪次数设定。介绍了不同闪烁模式的实现逻辑,并强调了权限处理、错误处理和设备兼容性的重要性。教程还包括用户界面设计,确保应用的易用性和稳定性。 闪光灯频闪

1. Android闪光灯硬件控制

1.1 闪光灯硬件概述

Android设备中的闪光灯硬件是一种常见的可编程控制的LED灯,广泛用于拍照时提供额外的照明或作为信号灯。其控制机制通常涉及硬件与软件的深度配合。硬件本身通常是一个LED灯珠,并可能由专用的IC或处理器进行控制。然而,在软件层面上,开发者需要通过Android提供的API来实现闪光灯的开关、亮度调整等功能。

1.2 控制需求分析

在深入探讨如何控制闪光灯之前,了解控制需求是至关重要的。开发者需要考虑以下几个问题: - 在什么情况下需要使用闪光灯? - 需要支持哪些级别的控制(如开、关、调节亮度等)? - 应用是在哪些Android版本上运行,是否支持Camera2 API? - 是否需要考虑Android不同品牌和型号的设备之间的兼容性?

1.3 软件层面的控制

从软件角度看,控制Android设备上的闪光灯涉及到两个主要部分:一是获取相应的权限,二是使用合适的API进行操作。为了操作闪光灯,开发者需要向系统请求相机权限。在得到必要的权限后,可以利用Camera API或Camera2 API(取决于Android版本)来控制闪光灯。本章将详细讨论如何使用这些API来控制闪光灯硬件。

在后续章节中,我们将进一步探讨如何处理权限管理、设计多种闪烁模式、处理运行时权限请求、确保设备兼容性以及进行用户界面设计与交互。通过这些章节内容,开发者将掌握如何从零到一构建一个功能完善、用户体验优秀的闪光灯控制应用。

2. 权限管理与Camera API

2.1 闪光灯操作的权限要求

2.1.1 Android权限系统的概述

在Android系统中,权限管理是确保应用安全和保护用户隐私的关键机制。Android的权限系统可以分为安装时权限和运行时权限。

  • 安装时权限 :这是较早的Android版本采用的权限管理方式,在应用安装阶段请求用户授权。
  • 运行时权限 :从Android 6.0 (API级别23)开始引入,要求应用在运行时根据具体的操作请求必要的权限,给予用户更多控制。

权限可以细分为普通权限和危险权限。普通权限一般不会对用户隐私或设备操作安全造成威胁,而危险权限则有潜在的风险,需要用户明确授权。

2.1.2 闪光灯权限申请的必要性与方法

闪光灯作为硬件控制的一部分,属于危险权限的范畴,因为它的使用可能会影响用户的隐私和设备的安全。在Android 6.0及以上版本中,操作闪光灯需要用户明确授权。

权限申请流程
  1. 定义权限 :在应用的AndroidManifest.xml文件中声明需要使用的闪光灯权限。
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.flash" android:required="true" />
  1. 运行时请求权限 :在代码中动态请求用户授权。
if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.CAMERA)
        != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(thisActivity,
            new String[]{Manifest.permission.CAMERA},
            MY_PERMISSIONS_REQUEST_CAMERA);
}
  1. 处理权限请求结果 :覆盖 onRequestPermissionsResult() 方法来处理用户的授权结果。
@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_CAMERA: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // permission was granted, yay! Do the
                // flash operation.
            } else {
                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }
    }
}

用户授权结果分为 PERMISSION_GRANTED PERMISSION_DENIED 。如果权限被拒绝,应用应该通知用户为什么需要此权限,并提供相应的逻辑处理,如提示用户到设置中手动开启权限。

2.2 Camera API的使用基础

2.2.1 Camera API的结构与组件

Camera API是Android提供的用于访问设备相机硬件的接口,它可以控制相机的各种功能,包括闪光灯。Camera API主要包含以下几个组件:

  • Camera.Parameters :控制相机参数,如ISO、曝光时间、闪光灯模式等。
  • Camera.Size :表示预览和图片捕获的尺寸。
  • Camera.PreviewCallback :预览帧回调接口。
  • Camera.AutoFocusCallback :自动对焦回调接口。

通过Camera API,应用可以实现对相机硬件的精细控制,包括闪光灯的开关、模式设置等。

2.2.2 Camera API中闪光灯的控制接口

Camera API为闪光灯提供了几个关键接口,如 setFlashMode() torchMode 等。下面是控制闪光灯的代码示例:

Camera.Parameters params = camera.getParameters();
// 设置闪光灯模式为开启
params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
// 设置闪光灯模式为关闭
params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
// 应用新的参数
camera.setParameters(params);

控制闪光灯时,还需要处理相机的打开与关闭逻辑,确保在合适的时机调用 camera.open() camera.release() 方法。

2.3 实现闪光灯控制的高级技巧

2.3.1 Camera2 API的引入与对比

Camera2 API是Camera API的升级版,提供了更多的控制选项和更高的性能。Camera2 API引入了对焦、测光、白平衡等高级控制,但它的使用也更加复杂。

Camera2 API与Camera API的主要差异:

  • 更细粒度的控制 :Camera2 API支持更多的高级功能。
  • 异步处理 :Camera2 API的操作是异步的,需要通过回调来处理。
  • 相机的共享控制 :Camera2 API可以处理多个相机的并发请求。

在实现闪光灯控制时,如果选择Camera2 API,需要熟悉其复杂的异步处理逻辑和API结构。

2.3.2 闪光灯控制的兼容性处理

由于Android版本众多,不同设备的支持情况也不尽相同,因此在实现闪光灯控制时,需要考虑兼容性问题。对于不支持Camera2 API的设备,应用需要回退到Camera API进行处理。

以下是一个简单的兼容性检查和Camera API回退的示例:

CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
    String[] cameraIdList = manager.getCameraIdList();
    for (String cameraId : cameraIdList) {
        CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
        // 检查Camera2 API是否可用
        Integer level = characteristics.get(***_SUPPORTED_HARDWARE_LEVEL);
        if (level == ***_SUPPORTED_HARDWARE_LEVEL_FULL) {
            // 使用Camera2 API
        } else {
            // 回退到Camera API
        }
    }
} catch (CameraAccessException e) {
    e.printStackTrace();
}

兼容性处理不仅限于Camera API的选择,还应包括各种相机参数和控制逻辑的适配,确保应用在不同设备和Android版本上都能正常工作。

3. 计数器与定时器实现频闪

3.1 频闪原理与需求分析

3.1.1 频闪的基本概念和应用场合

频闪是指光线以一定的频率快速闪烁的现象。在摄影、舞台照明、安全指示和信号传输等领域,频闪效果被广泛应用。例如,在摄影领域,频闪灯用于捕捉高速运动物体的瞬间状态;在舞台照明中,频闪可以营造出节奏感和视觉冲击力;在安全领域,频闪灯则作为警告信号出现。

在Android设备中,通过软件控制闪光灯实现频闪效果,这不仅可以增加应用程序的趣味性,还能为用户提供独特的视觉体验。例如,开发一款音乐可视化应用程序,利用频闪效果来增强音乐节奏感,或者为一款安全类应用开发紧急信号提示功能。

3.1.2 频闪效果的设计与需求细化

为了实现频闪效果,首先需要确定频闪的频率、持续时间、光强以及触发方式。频率决定了闪烁的速度,通常可以通过用户设置或者预设不同频率来满足不同的需求。持续时间控制了闪光灯开启的时长,光强则根据使用场景的不同而有所不同。触发方式可以是手动、自动或者基于特定事件触发。

细化需求后,我们将考虑如何使用计数器和定时器来控制闪光灯的开启和关闭,从而实现精确的频闪效果。计数器用于记录和控制频闪的次数,而定时器则用于控制闪光灯的开关和间隔时间。接下来,我们将深入探讨计数器和定时器的实现和应用。

3.2 计数器的实现与应用

3.2.1 计数器在频闪中的作用

计数器在频闪应用中起到关键作用。通过计数器,我们可以控制闪光灯闪烁的次数,实现周期性的频闪效果。每次闪光后,计数器进行递增,当达到预设的频闪次数后,停止闪光。

为了实现这一功能,我们需要设计一个计数器类,它应当包含以下功能:

  • 初始化计数器值。
  • 计数器递增。
  • 判断是否达到预设的频闪次数。
  • 重置计数器,为下一次频闪做准备。

3.2.2 计数器的编码实现步骤

首先,我们可以创建一个简单的Java类来实现计数器的功能。

public class FlashCounter {
    private int count;
    private final int limit;

    public FlashCounter(int limit) {
        this.limit = limit;
        this.count = 0;
    }

    public void increment() {
        count++;
    }

    public boolean shouldStop() {
        return count >= limit;
    }

    public void reset() {
        count = 0;
    }
}

这个类中, limit 表示频闪的最大次数, count 为当前计数。 increment() 方法用于增加计数, shouldStop() 方法用于判断是否达到最大次数。当需要开始新的频闪时,调用 reset() 方法重置计数。

在实际应用中,计数器的实现可能会更复杂,涉及多线程控制和精确的时间管理。为了保持代码的简洁性,这里只给出了基础的实现。

3.3 定时器在频闪中的应用

3.3.1 定时器的使用方法和选择

在Android开发中, java.util.Timer java.util.TimerTask 类用于在后台线程中执行任务。然而,对于需要在指定时间间隔内重复执行任务的场景, java.util.Timer 可能会遇到精度问题,特别是在任务执行时间无法预测的情况下。

为了更准确地控制时间,Android 提供了 Handler Looper 机制,通过 Handler 我们可以安排 Runnable 对象在未来的某个时间点执行。这种机制比 java.util.Timer 更加适合用于需要精确时间控制的场景,如实现频闪功能。

3.3.2 定时器在频闪中的编程实践

使用 Handler 来实现定时器功能,可以创建一个 Handler 和一个 Runnable 来控制闪光灯的开启和关闭。

public class FlashTimer {
    private Handler handler;
    private Runnable flashRunnable;
    private boolean isFlashing;
    private int interval; // 闪烁间隔时间

    public FlashTimer(int interval) {
        this.interval = interval;
        handler = new Handler(Looper.getMainLooper());
        flashRunnable = new Runnable() {
            @Override
            public void run() {
                if (isFlashing) {
                    // 控制闪光灯
                    toggleFlashLight();
                    // 重新安排定时任务
                    handler.postDelayed(this, interval);
                }
            }
        };
    }

    public void startFlashing() {
        isFlashing = true;
        handler.post(flashRunnable);
    }

    public void stopFlashing() {
        isFlashing = false;
        handler.removeCallbacks(flashRunnable);
    }

    private void toggleFlashLight() {
        // 切换闪光灯状态的代码逻辑
    }
}

在上面的代码中, FlashTimer 类使用 Handler 来安排一个 Runnable Runnable 在每个间隔后重新安排自己,从而形成周期性的任务执行。通过 startFlashing() stopFlashing() 方法可以控制定时器的启动和停止。

结合计数器和定时器,我们可以实现一个具有精确控制的频闪功能。计数器控制频闪的总次数,而定时器控制频闪的频率和持续时间。通过这种配合,我们可以创建出丰富多彩的视觉效果,并为用户提供更加直观和动态的应用体验。

在此基础上,我们已经构建了实现频闪功能的基本框架。接下来的章节中,我们将进一步探讨如何实现多种闪烁模式的逻辑,并且支持用户自定义闪烁模式,以此来满足更加复杂的业务需求。

4. 多种闪烁模式的逻辑实现

4.1 模式设计与分类

4.1.1 闪烁模式的设计原则

在设计闪烁模式时,首先要考虑的是用户体验,这包括模式的响应速度、易用性以及是否符合用户的直觉操作。具体设计原则如下:

  • 直观性 : 模式切换应该简单明了,用户无需阅读大量说明即可理解。
  • 可预测性 : 模式的效果应符合用户的预期内,比如在低电量模式下,自动切换到更省电的闪烁模式。
  • 灵活性 : 提供足够的选项让用户根据需要自定义模式,满足不同场景下的需求。
  • 可靠性 : 确保模式在各种条件下都能稳定工作,包括不同的设备和运行环境。

4.1.2 常见的闪烁模式类型

不同场景下,对闪烁模式的要求不尽相同。以下是几种常见的模式类型:

  • 自动模式 : 根据环境光线强度或设备状态自动调整闪烁频率。
  • 节能模式 : 减少闪烁频率和亮度,延长电池使用时间。
  • 警告模式 : 在紧急情况下使用高频率和高亮度,引起用户注意。
  • 自定义模式 : 允许用户设置闪烁频率、亮度和持续时间,满足个性化需求。

4.2 逻辑编程实现

4.2.1 模式切换的控制逻辑

控制逻辑是确保模式切换流畅的关键。以下是模式切换的基本控制逻辑伪代码:

// 切换到指定的闪烁模式
void switchMode(String mode) {
    if (mode == null) {
        Log.e("FlashMode", "Mode is not specified.");
        return;
    }

    switch (mode.toLowerCase()) {
        case "auto":
            setAutoFlashMode();
            break;
        case "power_save":
            setPowerSaveMode();
            break;
        case "alert":
            setAlertMode();
            break;
        case "custom":
            setCustomMode();
            break;
        default:
            Log.e("FlashMode", "Unknown mode: " + mode);
            break;
    }
}

// 设置各种模式的具体参数和行为
void setAutoFlashMode() {
    // 根据环境和设备状态调整
}

void setPowerSaveMode() {
    // 降低闪烁频率和亮度
}

void setAlertMode() {
    // 提高频率和亮度
}

void setCustomMode() {
    // 从用户设置中获取自定义参数
}

4.2.2 代码实现与调试

代码实现是模式逻辑的直观体现。以自定义模式为例,用户可以设置以下参数:

  • 频率 : 用户自定义每秒闪烁的次数。
  • 亮度 : 用户选择合适的亮度级别。
  • 持续时间 : 用户指定闪烁模式的持续时间。

调试过程中,应确保每个模式的响应时间和稳定性都能满足预期。错误处理和日志记录对于发现和解决问题非常有帮助。

// 自定义模式的实现
void setCustomMode() {
    int frequency = getUserDefinedFrequency();
    int brightness = getUserDefinedBrightness();
    int duration = getUserDefinedDuration();

    // 应用用户定义的参数
    applyFlashParameters(frequency, brightness, duration);
    startTimerForDuration(duration);
}

// 应用自定义参数
void applyFlashParameters(int frequency, int brightness, int duration) {
    // 代码逻辑根据具体需求实现
}

// 启动计时器
void startTimerForDuration(int duration) {
    // 使用定时器来控制模式持续时间
}

4.3 用户自定义模式的支持

4.3.1 用户自定义模式的框架构建

为了支持用户自定义模式,需要构建一个灵活的框架,允许用户在应用程序内设置和保存他们喜欢的模式参数。这个框架应该包括:

  • 用户输入界面 : 一个简单易用的界面,允许用户输入自定义的频率、亮度和持续时间。
  • 保存和加载机制 : 确保用户设置的模式可以被保存并在下次使用时加载。
// 保存用户自定义的模式设置
void saveCustomModeParameters(int frequency, int brightness, int duration) {
    // 保存逻辑,例如使用SharedPreferences
}

// 加载用户自定义的模式设置
void loadCustomModeParameters() {
    // 加载逻辑,从保存的位置读取参数
}

4.3.2 自定义模式与系统模式的结合

最后,将用户自定义模式与系统预设的模式相结合,确保用户可以通过应用切换到他们之前定义的设置,同时也能快速切换到系统模式。

// 组合系统模式和用户自定义模式
void switchToMode(String mode) {
    if (mode.equals("custom")) {
        // 加载用户自定义模式
        CustomMode custom = loadCustomMode();
        applyFlashParameters(
            custom.frequency,
            custom.brightness,
            custom.duration
        );
    } else {
        // 切换到系统预设模式
        switchMode(mode);
    }
}

本章节详细介绍了如何在Android应用中实现多种闪烁模式的逻辑,并通过伪代码展示了模式切换、自定义模式支持等关键步骤。下一章将会探讨运行时权限请求处理,这是确保应用安全运行的重要步骤。

5. 运行时权限请求处理

5.1 运行时权限的概念与重要性

5.1.1 Android权限模型的演进

从Android 6.0(Marshmallow)开始,Android 引入了运行时权限的概念,这意味着应用在安装时不再自动获得权限,而是在运行时向用户请求所需权限。这一改变极大提升了用户对应用权限的控制能力,同时也加强了系统的安全性。

5.1.2 运行时权限的必要性和优势

运行时权限的必要性主要体现在: - 用户隐私保护:应用在运行时请求权限,用户对应用行为有明确的知晓和控制。 - 系统安全性增强:限制应用权限,可以防止恶意应用获取不应有的访问能力。 - 应用灵活性提升:应用可以根据需要,按需请求权限,而不是一股脑地请求所有权限。

5.2 权限请求流程的设计

5.2.1 设计合理的权限请求时机

合理的权限请求时机对于用户体验至关重要。请求权限的最好时机是在用户即将使用需要该权限的功能之前,而不是应用启动时。例如,在用户尝试使用闪光灯进行拍照时请求相机权限。

5.2.2 用户权限拒绝的处理策略

用户可能出于隐私保护的考虑拒绝权限请求,因此,应用应该: - 提供清晰的权限用途说明。 - 当权限被拒绝时,应用需能够优雅地处理权限缺失的情况。 - 给用户留有更改权限设置的选项。

5.3 权限请求的代码实现

5.3.1 权限请求的回调机制与逻辑

以下是一个简单的权限请求代码示例,展示了如何请求相机权限:

// 请求相机权限
private void requestCameraPermission() {
    if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
        // 权限未被授予,请求权限
        ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_CAMERA);
    } else {
        // 权限已被授予,执行相关操作
    }
}

// 处理权限请求结果
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_CAMERA: {
            // 如果请求被取消,则结果数组为空
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 权限被授予,可以执行相关操作
            } else {
                // 权限被拒绝,显示一个消息
            }
            return;
        }
    }
}

5.3.2 权限请求结果的应用集成

获取到权限请求结果后,需要根据用户的选择进行相应的应用集成。如果用户授权了所需的权限,那么可以继续执行原本需要该权限的操作;如果用户拒绝授权,则应用需要提供无权限情况下的备选流程或者通知用户权限的重要性。

在这个过程中,要确保应用的流程不会因为权限的缺失而崩溃。此外,应用可以使用 shouldShowRequestPermissionRationale 方法来决定是否需要向用户展示权限请求的额外解释,以提高用户同意的几率。

运行时权限请求是现代Android应用开发中不可或缺的一环。正确处理权限请求流程不仅能够提升用户体验,而且能够保障应用和用户的隐私安全。接下来,我们将继续探讨设备兼容性与错误处理,这是确保应用稳定运行的重要环节。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:在Android平台上实现闪光灯的频闪功能是一项涉及硬件控制、权限管理及动画实现的技术挑战。本教程详细介绍了如何通过Camera类接口控制闪光灯,并通过计数器或定时器实现频闪次数设定。介绍了不同闪烁模式的实现逻辑,并强调了权限处理、错误处理和设备兼容性的重要性。教程还包括用户界面设计,确保应用的易用性和稳定性。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

本项目是一个基于SSM(Spring+SpringMVC+MyBatis)后端框架与Vue.js前端框架开发的疫情居家办公系统。该系统旨在为居家办公的员工提供一个高效、便捷的工作环境,同时帮助企业更好地管理远程工作流程。项目包含了完整的数据库设计、前后端代码实现以及详细的文档说明,非常适合计算机相关专业的毕设学生和需要进行项目实战练习的Java学习者。 系统的核心功能包括用户管理、任务分配、进度跟踪、文件共享和在线沟通等。用户管理模块允许管理员创建和管理用户账户,分配不同的权限。任务分配模块使项目经理能够轻松地分配任务给团队成员,并设置截止日期。进度跟踪模块允许员工实时更新他们的工作状态,确保项目按计划进行。文件共享模块提供了一个安全的平台,让团队成员可以共享和协作处理文档。在线沟通模块则支持即时消息和视频会议,以增强团队之间的沟通效率。 技术栈方面,后端采用了Spring框架来管理业务逻辑,SpringMVC用于构建Web应用程序,MyBatis作为ORM框架简化数据库操作。前端则使用Vue.js来实现动态用户界面,搭配Vue Router进行页面导航,以及Vuex进行状态管理。数据库选用MySQL,确保数据的安全性和可靠性。 该项目不仅提供了一个完整的技术实现示例,还为开发者留下了扩展和改进的空间,可以根据实际需求添加新功能或优化现有功能
本项目是一个基于SSM(Spring+SpringMVC+MyBatis)后端框架与Vue.js前端框架开发的网上球鞋竞拍系统。该项目旨在为球鞋爱好者提供一个便捷、高效的在线竞拍平台,用户可以在此平台上浏览、搜索、竞拍心仪的球鞋,并参与到各种有趣的竞拍活动中。 系统的主要功能包括用户注册登录、球鞋信息展示、竞拍活动创建与管理、实时竞拍以及交易安全保障等。用户可以通过注册账号后,浏览平台上发布的各类球鞋信息,包括品牌、型号、颜色、尺码以及当前竞拍状态等。系统支持用户创建和管理自己的竞拍活动,设定竞拍规则和时间,同时提供实时竞拍功能,确保公平、透明的交易过程。 在技术实现上,后端采用SSM框架进行开发,Spring负责业务逻辑层,SpringMVC处理Web请求,MyBatis进行数据库操作,保证了系统的稳定性和扩展性。前端则使用Vue.js框架,结合Axios进行数据请求,实现了前后端分离,提高了开发效率和用户体验。 数据库设计方面,系统采用了MySQL数据库,存储用户信息、球鞋信息、竞拍活动等数据,确保数据的安全性和完整性。此外,项目还包含了详细的文档资料,包括需求分析、系统设计、数据库设计以及测试报告等,为项目的实施和维护提供了有力的支持。 该项目不仅适合作为计算机相关专业学生的毕业设计题目,也适合Java学习者进行实战练习,通过在此基础上进行功能扩展和改进,可以进一步提升编程技能和项目管理能力。
【使用教程】 一、环境配置 1、建议下载anaconda和pycharm 在anaconda中配置好环境,然后直接导入到pycharm中,在pycharm中运行项目 anaconda和pycharm安装及环境配置参考网上博客,有很多博主介绍 2、在anacodna中安装requirements.txt中的软件包 命令为:pip install -r requirements.txt 或者改成清华源后再执行以上命令,这样安装要快一些 软件包都安装成功后才算成功 3、安装好软件包后,把anaconda中对应的python导入到pycharm中即可(不难,参考网上博客) 二、环境配置好后,开始训练(也可以训练自己数据集) 1、数据集准备 需要准备yolo格式的目标检测数据集,如果不清楚yolo数据集格式,或者有其他数据训练需求,请看博主yolo格式各种数据集集合链接:https://blog.csdn.net/DeepLearning_/article/details/127276492 里面涵盖了上百种yolo数据集,且在不断更新,基本都是实际项目使用。来自于网上收集、实际场景采集制作等,自己使用labelimg标注工具标注的。数据集质量绝对有保证! 本项目所使用的数据集,见csdn该资源下载页面中的介绍栏,里面有对应的下载链接,下载后可直接使用。 2、数据准备好,开始修改配置文件 参考代码中data文件夹下的banana_ripe.yaml,可以自己新建一个不同名称的yaml文件 train:训练集的图片路径 val:验证集的图片路径 names: 0: very-ripe 类别1 1: immature 类别2 2: mid-ripe 类别3 格式按照banana_ripe.yaml照葫芦画瓢就行,不需要过多参考网上的 3、修改train_dual.py中的配置参数,开始训练模型 方式一: 修改点: a.--weights参数,填入'yolov9-s.pt',博主训练的是yolov9-s,根据自己需求可自定义 b.--cfg参数,填入 models/detect/yolov9-c.yaml c.--data参数,填入data/banana_ripe.yaml,可自定义自己的yaml路径 d.--hyp参数,填入hyp.scratch-high.yaml e.--epochs参数,填入100或者200都行,根据自己的数据集可改 f.--batch-size参数,根据自己的电脑性能(显存大小)自定义修改 g.--device参数,一张显卡的话,就填0。没显卡,使用cpu训练,就填cpu h.--close-mosaic参数,填入15 以上修改好,直接pycharm中运行train_dual.py开始训练 方式二: 命令行方式,在pycharm中的终端窗口输入如下命令,可根据自己情况修改参数 官方示例:python train_dual.py --workers 8 --device 0 --batch 16 --data data/coco.yaml --img 640 --cfg models/detect/yolov9-c.yaml --weights '' --name yolov9-c --hyp hyp.scratch-high.yaml --min-items 0 --epochs 500 --close-mosaic 15 训练完会在runs/train文件下生成对应的训练文件及模型,后续测试可以拿来用。 三、测试 1、训练完,测试 修改detect_dual.py中的参数 --weights,改成上面训练得到的best.pt对应的路径 --source,需要测试的数据图片存放的位置,代码中的test_imgs --conf-thres,置信度阈值,自定义修改 --iou-thres,iou阈值,自定义修改 其他默认即可 pycharm中运行detect_dual.py 在runs/detect文件夹下存放检测结果图片或者视频 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值