一种基于目标检测实现黑花屏分类任务的方案

本文提出了一种利用目标检测算法解决视频帧黑、花屏分类问题的方案,尤其在数据量小、类间差异不明显的情况下,通过Yolov5模型相比于传统的ResNet分类,取得了更高的97%分类准确率。

视频帧的黑、花屏的检测是视频质量检测中比较重要的一部分,传统做法是由测试人员通过肉眼来判断视频中是否有黑、花屏的现象,这种方式不仅耗费人力且效率较低。为了进一步节省人力、提高效率,一种自动的检测方法是大家所期待的。目前,通过分类网络模型对视频帧进行分类来自动检测是否有黑、花屏是比较可行且高效的。然而,在项目过程中,视频帧数据的收集比较困难,数据量较少,部分花屏和正常屏之间差异不够明显,导致常用的分类算法难以满足项目对分类准确度的要求。因此本文尝试了一种利用目标检测算法实现分类的方式,帮助改善单纯的分类的算法效果不够理想的问题。

核心技术与架构图

一般分类任务的流程如下图,首先需要收集数据,构成数据集;并为每一类数据定义一个类型标签,例如:0、1、2;再选择一个合适的分类网络进行分类模型的训练,图像分类的网络有很多,常见的有VggNet, ResNet,DenseNet等;最后用训练好的模型对新的数据进行预测,输出新数据的类别。

900×116 38.7 KB

目标检测任务的流程不同于分类任务,其在定义类别标签的时候还需要对目标位置进行标注;目标检测的方法也有很多,例如Fast R-CNN, SSD,YOLO等;模型训练的中间过程也比分类模型要复杂,其输出一般为目标的位置、目标置信度以及分类结果。

900×120 46.2 KB

由于分类算法依赖于一定量的数据,在项目实践中,数据量较少或图像类间差异较小时,传统分类算法效果不一定能满足项目需求。这时,不妨考虑用目标检测的方式来做‘分类’。接下来以Yolov5为例来介绍如何将目标检测框架用于实现单纯的分类任务。

技术实现

除了分类之外,目标检测还可以从自然图像中的大量预定义类别中识别出目标实例的位置。大家可能会考虑目标检测模型用于分类是不是过于繁琐或者用目标检测框架来做单纯的分类对代码的修改比较复杂。这里,我们将用一种非常简单的方式直接在数据标注和输出内容上稍作修改就能实现单纯的分类了。接下来将介绍一下具体实现方法:

no.1

数据的标注

OBJECT_DICT = {"Normalscreen": 0, "Colorfulscreen": 1, "Blackscreen": 2}
def parse_
我调用检测花屏屏白屏,crash,anr方法,方法如下: def verify_screen(self,app_name): """ 二次检测屏幕异常,减少检测屏幕异常误报率 """ save_dir = "D:/problem/problemphoto/" os.makedirs(save_dir, exist_ok=True) temp_files = [] # 第一次检测 first_flower, first_black, first_white, first_temp = self.check_screen() if first_temp: temp_files.append(first_temp) if not (first_flower or first_black or first_white): self.clean_temp_files(temp_files) return False, False, False time.sleep(0.8) second_flower, second_black, second_white, second_temp = self.check_screen() if second_temp: temp_files.append(second_temp) # 最终判定:两次同类异常才保存 final_flower = first_flower and second_flower final_white = first_white and second_white final_black = first_black and second_black # 截图保存逻辑 if final_flower or final_black or final_white: timestamp = time.strftime("%Y%m%d_%H%M%S", time.localtime()) anomaly_types = [] if final_flower: anomaly_types.append("flower") if final_black: anomaly_types.append("black") if final_white: anomaly_types.append("white") filename = f"{app_name}_{timestamp}_{'_'.join(anomaly_types)}.png" # 保存二次检测的临时截图到目标目录 shutil.copy(second_temp, os.path.join(save_dir, filename)) self.log_error() # 清理所有临时文件(无论是否保存) self.clean_temp_files(temp_files) return final_flower, final_black, final_white 检测crash方法: def check_app_crash(self,app_name): """检测应用是否闪退""" try: current_activity = self.get_current_activity() home_activity = "com.huawei.android.launcher.unihome.UniHomeLauncher" if current_activity == home_activity: print(f"应用发生闪退!!!") self.scrennphoto_problem(app_name, problem_type="crash") self.log_error() return True else: return False except Exception as e: print(f"检测闪退时出错: {e}") return None 检测anr方法如下: def check_app_anr(self,app_name): """判断当前页面是否存在ANR问题""" anr_keywords = ["无响应。是否将其关闭?", "屡次停止运行"] try: has_anr_screen = False for keyword in anr_keywords: elements = self.driver.find_elements( by=AppiumBy.XPATH, value=f"//*[contains(@text, '{keyword}')]" ) if elements: has_anr_screen = True break if has_anr_screen: print(f"检测到ANR:日志存在ANR记录且屏幕显示无响应提示") self.scrennphoto_problem(app_name, problem_type="anr") self.log_error() return True else: return False except Exception as e: print(f"ANR检测异常:{str(e)}") return False 我想根据调用方法检测的结果,利用hytest框架断言,如果屏,白屏,crash,anr返回其中有一个是true,页面显示正常没有上述问题现象,断言失败,如果都是false,页面显示正常没有上述问题现象,断言成功,hytest框架断言格式如下: CHECK_POINT('页面均不会出现花闪、应用crash问题', check_result == False)
最新发布
10-18
<think>好的,我需要帮助用户根据他们的检测方法结果,使用hytest框架进行断言。用户的需求是,如果屏、白屏、花屏、crash或anr中任何一个返回True,那么断言失败;如果全部都是False,则断言成功。 首先,我需要理解用户提供的代码。用户有三个方法:verify_screen检测屏幕异常,返回三个布尔值(花屏屏、白屏);check_app_crash检测crash;check_app_anr检测anr。每个方法都返回布尔值,如果有问题则返回True。 用户希望将这些检测结果合并,如果其中任何一个检测结果为True,则断言失败,否则成功。用户给出的示例断言格式是CHECK_POINT('描述', check_result == False),所以需要将多个结果合并成一个布尔值。 接下来,我需要考虑如何将各个检测结果组合起来。例如,用户调用verify_screen得到三个结果,再加上crash和anr的结果,总共五个可能的问题。只要有一个为True,整体结果check_result就应为True,此时断言失败;否则断言成功。 因此,正确的做法是将所有检测结果用逻辑或连接,如果有任何一个为True,则check_result为True,断言失败。例如: check_result = (flower or black or white or crash or anr) 然后,使用CHECK_POINT('描述', check_result == False)来进行断言。 用户可能需要先调用各个方法获取结果。例如: flower, black, white = verify_screen(app_name) crash = check_app_crash(app_name) anr = check_app_anr(app_name) 然后合并这些结果: check_result = flower or black or white or crash or anr 最后进行断言。 需要注意的是,用户提供的verify_screen返回的是三个布尔值,而crash和anr方法返回的是单个布尔值。因此,合并时只要任何一个为True,整体结果就为True。 在示例回答中,应该给出如何整合这些结果的代码,并正确应用断言。同时,需要确保用户了解如何在hytest框架中正确使用CHECK_POINT,并处理可能的异常情况,比如方法返回None的情况,但根据用户提供的代码,crash方法可能返回None,但用户可能希望在这种情况下视为未检测到问题,或者需要处理异常情况。不过根据用户的问题描述,可能假设这些方法正确返回布尔值。 最后,生成相关问题,比如如何处理多个检测同时发生的情况,如何修改检测逻辑,如何优化断言信息等。</think>在 `hytest` 框架中,可以通过将所有检测结果合并为一个布尔值来实现断言逻辑。具体做法是:只要屏、白屏、花屏、Crash 或 ANR 中任意一项为 `True`,则整体检测结果为 `True`,表示页面存在异常,断言失败;如果全部为 `False`,则表示页面正常,断言成功。 --- ### ✅ 实现方式 ```python # 调用各个检测方法 flower, black, white = self.verify_screen(app_name) crash = self.check_app_crash(app_name) anr = self.check_app_anr(app_name) # 合并检测结果 check_result = flower or black or white or crash or anr # 使用 hytest 的 CHECK_POINT 进行断言 CHECK_POINT('页面均不会出现屏、白屏、花屏、应用crash或ANR问题', check_result == False) ``` --- ### ✅ 说明 - `verify_screen` 返回三个布尔值(花屏屏、白屏); - `check_app_crash` 返回是否发生 Crash(布尔值); - `check_app_anr` 返回是否发生 ANR(布尔值); - 使用逻辑或 `or` 合并所有结果,只要有一项为 `True`,`check_result` 就为 `True`; - 最终断言 `check_result == False`,即所有检测项都为 `False` 时,断言成功。 --- ### ✅ 示例输出 ```python # 示例输出(假设所有检测结果为 False) flower = False black = False white = False crash = False anr = False check_result = False CHECK_POINT('页面均不会出现屏、白屏、花屏、应用crash或ANR问题', check_result == False) # ✅ 断言成功 ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值