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

本文提出了一种利用目标检测算法解决视频帧黑、花屏分类问题的方案,尤其在数据量小、类间差异不明显的情况下,通过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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值