首页 文章 精选 留言 我的

精选列表

搜索[图像识别],共1798篇文章
优秀的个人博客,低调大师

批量图像识别的快速遍历技巧

👆对私有云感兴趣可以进入公众号回复“私有云”哦。 一、前言 最近,不少同学在Q群中频繁提出疑问:在日常UI测试过程中,如何快速准确地识别页面上的多个元素,或在日常测试中,如何高效地遍历目标图片列表,以确认画面中是否包含特定元素?在官方交流Q群2群的lincoln同学给出了不错的方法思路,我们也获得了他的授权,现在我们一起来学习一下这个小技巧吧~ 二、方法详解 lincoln同学提供了两个方法函数,其中一个是局部查找,一个是多重查找,我们就来看看他的一个函数逻辑是怎么样的吧。 代码逻辑的核心在于快速地识别目标图像。首先,将目标图像(最好是特征鲜明、尺寸小一些)列表输入 Multiple_exists() 函数。该函数通过循环执行截图操作,每0.2秒进行一次,以最小化循环识别时间。接着将设备屏幕截图和目标图像传递给 match_in_predict_area() 函数,进行裁剪和搜索。一旦找到匹配的图像,立即将坐标信息反馈给 Multiple_exists() 函数,并最终将图像编号和位置信息返回至主函数,供进一步使用。 可以看到当日常在跑游戏ui回归或APP回归的时候可以利用起来,当一个元素有多种ui表现形式或着需要判断多个元素的情况时,我们可以参考lincoln同学提供的方式,修改成自己想要的效果。 下面是lincoln同学的方法函数源码,大家可以参考一下: defmatch_in_predict_area(template, screen=None, rect=None):# 局部查找# logger = Gvar.loggerifscreenisNone:ifG.DEVICEisNone:raiseException("G.DEVICE is none.")screen = G.DEVICE.snapshot()# 截屏ifscreenisNone:raiseException("snapshot is none.")ifrectisNone:returntemplate.match_in(screen)# 如果没有指定区域,在整个屏幕中查找ifnotisinstance(rect, (list,tuple)):raiseException("to crop a image, rect should be a list")else:# logger.debug("找到目标%s"%template.filename)predict_screen = aircv.crop_image(screen, rect)# 图片裁切,根据指定区域裁剪屏幕focus_pos = template.match_in(predict_screen)# 在裁剪后的图片中查找模板ifnotfocus_pos:returnFalse# 如果没有找到匹配,返回Falseelse:returnfocus_pos[0]+rect[0], focus_pos[1]+rect[1]# 返回匹配位置,加上裁剪区域的偏移# end if# end defdefMultiple_exists(targets,area=None,threshold=0.80,rgb=False,inti=5):#多重查找# 根据设备方向确定宽度和高度if(G.DEVICE.display_info['orientation']%2):width = G.DEVICE.display_info['height']height = G.DEVICE.display_info['width']else:width = G.DEVICE.display_info['width']height = G.DEVICE.display_info['height']#end if# 尝试多次查找目标foriinrange(inti):#Gvar.logger.debug('第%d次查找%s'%(i,targets))# 获取全屏截图fullScreen = G.DEVICE.snapshot()# 遍历每个目标fortargetintargets:#print("查找目标 %s"%target)iftarget :# 在预测区域内匹配目标,如果有元素固定出现的位置范围,可以传入,更进一步的减少识别时间focus_pos = match_in_predict_area(Template('%d\%s.png'%(width, target),threshold=threshold, rgb=rgb),fullScreen, area)# 如果找到目标iffocus_pos:#Gvar.logger.debug("找到目标 %s"%target)ref = targets.index(target)returnref,focus_pos#endif#end for# 每次查找间隔0.2秒sleep(0.2)#end for# 如果所有尝试都失败,返回-1和(-1,-1)return-1,(-1,-1)#end def Multiple_exists 三、实际使用案例 通过上述所讲的逻辑以及方式,我们这边给大家提供一个小小的使用案例,通过识别游戏画面内的三个元素是否都存在,从而去判断是否进入到我们需要的游戏画面。 参考代码如下: # -*- encoding=utf8 -*-__author__ ="Airtest"importosfromairtest.core.apiimport*fromairtest.aircvimport*auto_setup(__file__)frompoco.drivers.android.uiautomationimportAndroidUiautomationPocopoco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)defMultiple_exists(targets, area=None, threshold=0.80, rgb=False, inti=5):# 定义一个函数,用于检测多个目标是否存在# 参数说明:# targets: 目标列表# area: 搜索区域,默认为None(全屏)# threshold: 匹配阈值,默认为0.80# rgb: 是否使用RGB匹配,默认为False# inti: 尝试次数,默认为5次#新增找到的图片位置信息列表matches = []# 根据设备方向确定屏幕宽高if(G.DEVICE.display_info['orientation'] %2):width = G.DEVICE.display_info['height']height = G.DEVICE.display_info['width']else:width = G.DEVICE.display_info['width']height = G.DEVICE.display_info['height']# 在指定的尝试次数内循环查找目标foriinrange(inti):# 获取当前屏幕截图fullScreen = G.DEVICE.snapshot()# 遍历所有目标fortargetintargets:iftarget:# 构建目标图片的完整路径template_path = os.path.join(str(width),f"{target}.png")print(f"Trying to load template:{template_path}")# 在指定区域内查找目标focus_pos = match_in_predict_area(Template(template_path, threshold=threshold, rgb=rgb), fullScreen, area)#若找到图片则将当前图片出现的位置传入列表中iffocus_pos:matches.append((targets.index(target), focus_pos))# 如果所有目标都找到,立即返回结果iflen(matches) ==len(targets):returnmatches# 如果未找到所有目标,等待0.2秒后继续下一次尝试sleep(0.2)# 返回找到的所有匹配结果returnmatchesdefmatch_in_predict_area(template, screen=None, rect=None):# 局部找图ifscreenisNone:ifG.DEVICEisNone:raiseException("G.DEVICE is none.")screen = G.DEVICE.snapshot()# 获取设备屏幕截图ifscreenisNone:raiseException("snapshot is none.")ifrectisNone:returntemplate.match_in(screen)# 如果没有指定区域,在整个屏幕中查找ifnotisinstance(rect, (list,tuple)):raiseException("to crop a image, rect should be a list")else:# logger.debug("找到目标%s"%template.filename)predict_screen = aircv.crop_image(screen, rect)# 裁剪指定区域的图片focus_pos = template.match_in(predict_screen)# 在裁剪后的图片中查找模板ifnotfocus_pos:returnFalse# 如果没有找到匹配,返回Falseelse:returnfocus_pos[0]+rect[0], focus_pos[1]+rect[1]# 返回匹配位置,加上裁剪区域的偏移if__name__ =="__main__":#打开游戏,去确认是否游戏开始界面的元素已就位start_app("com.netease.dyll")sleep(1.0)poco(text="确定").click()touch([0.5,0.5])sleep(0.2)# 定义目标图片的路径列表targets = [r"D:/demo/pics.air/tpl1724135823600",r"D:/demo/pics.air/tpl1724135830426",r"D:/demo/pics.air/tpl1724135836266"]# 调用multiple_exists函数,查找游戏开始界面的图片识别情况result = Multiple_exists(targets)# 打印查找结果foriinrange(len(result)):print("图片{}的位置是:{}".format(i+1,result[i]))# 判断是否已进入游戏开始界面iflen(result) ==len(targets) :print("确认已进入到游戏的开始界面") 四、总结 本周推文我们分享了来自官方交流Q群2群的lincoln同学的一个快速遍历找图的方法函数,这里再次感谢lincoln同学的分享,在函数内我们主要的一个减少识别时间的思路是通过截图当前设备画面,并进行裁切判断,从而避免整个设备屏幕范围内寻找元素。 如果大家有更多好用好玩的Airtest使用脚本,也欢迎大家给我们投稿,同时如果大家在使用Airtest过程中有一些其他新的使用方式或者遇到了问题,又或者有任何想要深入了解的知识点,欢迎在官方交流群(526033840)里告诉我们或者提交issue。 (猜你还想看 ) ▼ 【私有云场景案例分享①】高效的集群管理能力 录屏方法剖析,记录脚本跑测不再难 PaddleOCR‍模型的协作小技巧" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2" hasload="1" style="outline: 0px;color: var(--weui-LINK);cursor: default;"> Airtest封装的Tidevice接口有多好用(二) 本文分享自微信公众号 - AirtestProject(AirtestProject)。 如有侵权,请联系 support@oschina.cn 删除。 本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

Facebook 图像识别平台 Lumos 是什么?

大多数人懒得给照片加标签。如果你属于这一类(大概率事件),那么你一定知道搜索某张照片有多辛苦。 但这很有可能即将成为过去。 本周,Facebook 披露了其机器学习平台 Lumos 的更多信息: Lumos 将使用户们利用相片内容进行搜索,而不是图片名称或是标签。 Facebook 应用机器学习负责人 Joaquin Quiñonero Candela 解释说: “换句话说,搜索‘黑衬衫照片‘时,系统能识别出每张照片里是否有黑衬衫,并据此搜索;即便照片并没有被添加标签也没有关系。” Lumos 利用了计算机视觉技术来识别照片中的人、动物和一系列其他物体。但它远不止于此,而是更进一大步,能识别出照片中发生的“事”。所以在识别某相片中有某个人之外,它还能够判断该人是在行走、骑马、弹琴还是在做其他的事情。雷锋网按,Facebook 并没有提

优秀的个人博客,低调大师

基于计算机视觉的棋盘图像识别

点击上方“AI算法与图像处理”,选择加"星标"或“置顶” 重磅干货,第一时间送达 本期我们将一起学习如何使用计算机视觉技术识别棋子及其在棋盘上的位置 我们利用计算机视觉技术和卷积神经网络(CNN)为这个项目创建分类算法,并确定棋子在棋盘上的位置。最终的应用程序会保存整个图像并可视化的表现出来,同时输出棋盘的2D图像以查看结果。 (左)实时摄像机进给的帧和棋盘的(右)二维图像 01. 数据 我们对该项目的数据集有很高的要求,因为它最终会影响我们的实验结果。我们在网上能找到的国际象棋数据集是使用不同的国际象棋集、不同的摄影机拍摄得到的,这导致我们创建了自己的数据集。我使用国际象棋和摄像机(GoPro Hero6 Black以“第一人称视角”角度)生成了自定义数据集,这使我的模型更加精确。该数据集包含2406张图像,分为13类(请参阅下文)。总结:这花费了我们很多时间,但是这使得训练图像尽可能地接近在应用程序中使用时所看到的图像。 自定义数据集的细分 为了构建该数据集,我首先创建了capture_data.py,当单击S键时,该视频从视频流中获取一帧并将其保存。这个程序使我能够无缝地更改棋盘上的棋子并一遍又一遍地捕获棋盘的图像,直到我建立了大量不同的棋盘配置为止。接下来,我创建了create_data.py,以使用下一部分中讨论的检测技术将其裁剪为单独小块。最后,我通过将裁剪后的图像分成带标签的文件夹来对它们进行分类。 02. 棋盘检测 对于棋盘检测,我想做的事情比使用OpenCV函数findChessboardCorners复杂的多,但又不像CNN那样高级。使用低级和中级计算机视觉技术来查找棋盘的特征,然后将这些特征转换为外边界和64个独立正方形的坐标。该过程以Canny边缘检测和Hough变换生成的相交水平线、垂直线的交点为中心。层次聚类用于按距离对交叉点进行分组,并对各组取平均值以创建最终坐标(请参见下文)。 完整的棋盘检测过程 03. 棋盘分类 项目伊始,我们想使用Keras / TensorFlow创建CNN模型并对棋子进行分类。但是,在创建数据集之后,仅考虑CNN的大小,单靠CNN就无法获得想要的结果。为了克服这一障碍,我利用了ImageDataGenerator和transfer learning,它增加了我的数据并使用了其他预训练的模型作为基础。 创建CNN模型 为了使用GPU,我在云中创建并训练了CNN模型,从而大大减少了训练时间。快速提示:Google Colab是使用GPU快速入门的简便方法。为了提高数据的有效性,我使用了ImageDataGenerator来扩展原始图像并将模型暴露给不同版本的数据。ImageDataGenerator函数针对每个时期随机旋转,重新缩放和翻转(水平)训练数据,从本质上创建了更多数据。尽管还有更多的转换选项,但这些转换选项对该项目最有效。 from keras.preprocessing.image import ImageDataGeneratordatagen = ImageDataGenerator( rotation_range=5, rescale=1./255, horizontal_flip=True, fill_mode='nearest')test_datagen = ImageDataGenerator(rescale=1./255)train_gen = datagen.flow_from_directory( folder + '/train', target_size = image_size, batch_size = batch_size, class_mode = 'categorical', color_mode = 'rgb', shuffle=True)test_gen = test_datagen.flow_from_directory( folder + '/test', target_size = image_size, batch_size = batch_size, class_mode = 'categorical', color_mode = 'rgb', shuffle=False) 我们没有从头开始训练模型,而是通过利用预先训练的模型并添加了使用我的自定义数据集训练的顶层模型来实现转移学习。我遵循了典型的转移学习工作流程: 1.从先前训练的模型(VGG16)中获取图层。 from keras.applications.vgg16 import VGG16model = VGG16(weights='imagenet')model.summary() 2.冻结他们,以避免破坏他们在训练回合中包含的任何信息。 3.在冻结层的顶部添加了新的可训练层。 from keras.models import Sequentialfrom keras.layers import Dense, Conv2D, MaxPooling2D, Flattenfrom keras.models import Modelbase_model = VGG16(weights='imagenet', include_top=False, input_shape=(224,224,3)) # Freeze convolutional layers from VGG16for layer in base_model.layers: layer.trainable = False# Establish new fully connected blockx = base_model.outputx = Flatten()(x) x = Dense(500, activation='relu')(x) x = Dense(500, activation='relu')(x)predictions = Dense(13, activation='softmax')(x)# This is the model we will trainmodel = Model(inputs=base_model.input, outputs=predictions)model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['categorical_accuracy']) 4.在自定义数据集上训练新层。 epochs = 10history = model.fit( train_gen, epochs=epochs, verbose = 1, validation_data=test_gen)model.save_weights('model_VGG16.h5') 当我们使用VGG16或VGG19作为预训练模型创建模型时,由于验证精度更高,因此选择了使用VGG16的模型。另外,最佳epochs 是10。任何大于10的数均不会使验证准确性的提高,也不会增加训练与验证准确性之间的差异。总结:转移学习使我们可以充分利用深度学习在图像分类中的优势,而无需大型数据集。 04. 结果 为了更好地可视化验证准确性,我创建了模型预测的混淆矩阵。通过此图表,可以轻松评估模型的优缺点。优点:空-准确率为99%,召回率为100%;白棋和黑棋(WP和BP)-F1得分约为95%。劣势:白骑士(WN)-召回率高(98%),但准确性却很低(65%);白主教(WB)-召回率最低,为74%。 测试数据的混淆矩阵 05. 应用 该应用程序的目标是使用CNN模型并可视化每个步骤的性能。我们创建了cv_chess.py,它清楚地显示了步骤,并创建了cv_chess_functions.py,它显示了每个步骤的详细信息。此应用程序保存实时视频流中的原始帧,每个正方形的64个裁剪图像以及棋盘的最终2D图像。 print('Working...') # Save the frame to be analyzed cv2.imwrite('frame.jpeg', frame) # Low-level CV techniques (grayscale & blur) img, gray_blur = read_img('frame.jpeg') # Canny algorithm edges = canny_edge(gray_blur) # Hough Transform lines = hough_line(edges) # Separate the lines into vertical and horizontal lines h_lines, v_lines = h_v_lines(lines) # Find and cluster the intersecting intersection_points = line_intersections(h_lines, v_lines) points = cluster_points(intersection_points) # Final coordinates of the board points = augment_points(points) # Crop the squares of the board a organize into a sorted list x_list = write_crop_images(img, points, 0) img_filename_list = grab_cell_files() img_filename_list.sort(key=natural_keys) # Classify each square and output the board in Forsyth-Edwards Notation (FEN) fen = classify_cells(model, img_filename_list) # Create and save the board image from the FEN board = fen_to_image(fen) # Display the board in ASCII print(board)# Display and save the chessboard image board_image = cv2.imread('current_board.png') cv2.imshow('current board', board_image) print('Completed!') 代码链接:https://github.com/andrewleeunderwood/project_MYM 下载1:何恺明顶会分享在「AI算法与图像处理」公众号后台回复:何恺明,即可下载。总共有6份PDF,涉及 ResNet、Mask RCNN等经典工作的总结分析下载2:leetcode开源书在「AI算法与图像处理」公众号后台回复:leetcode,即可下载。每题都 runtime beats 100% 的开源好书,你值得拥有! 下载3 CVPR2020 在「AI算法与图像处理」公众号后台回复: CVPR2020 ,即可下载1467篇CVPR2020论文 个人微信(如果没有备注不拉群!) 请注明: 地区+学校/企业+研究方向+昵称 觉得不错就点亮在看吧 本文分享自微信公众号 - AI算法与图像处理(AI_study)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

android ocr 图像识别之tess-two试用

不需要任何so库,也兼容6.0以上版本 把tess-two添加到项目里,在app 的build.gradle里添加下面 dependencies { compile 'com.rmtheis:tess-two:7.0.0' } 1 2 3 然后从https://github.com/tesseract-ocr/tessdata/tree/3.04.00下载项目需要的训练语言数据,下载后复制,到assets/tessdata目录下,之后把它复制到SD卡。 /** * 初始化ocr识别需要用到的训练数据 */ private void initOcr() { datapath = getFilesDir() + "/tesseract/"; checkFile(new File(datapath + "tessdata/"), "chi_sim"); } 1 2 3 4 5 6 7 /** * @param dir * @param language chi_sim eng */ private void checkFile(File dir, String language) { //如果目前不存在则创建方面,然后在判断训练数据文件是否存在 if (!dir.exists() && dir.mkdirs()) { copyFiles(lag); } if (dir.exists()) { String datafilepath = datapath + "/tessdata/" + language + ".traineddata"; File datafile = new File(datafilepath); if (!datafile.exists()) { copyFiles(lag); } } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 /** 把训练数据放到手机内存 * @param language "chi_sim" ,"eng" */ private void copyFiles(String language) { try { String filepath = datapath + "/tessdata/" + language + ".traineddata"; AssetManager assetManager = getAssets(); InputStream instream = assetManager.open("tessdata/" + language + ".traineddata"); OutputStream outstream = new FileOutputStream(filepath); byte[] buffer = new byte[1024]; int read; while ((read = instream.read(buffer)) != -1) { outstream.write(buffer, 0, read); } outstream.flush(); outstream.close(); instream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 做完准备工作之后,待相机取到图片之后,调用doOcr方法即可获得识别结果,需要注意的是,该方法需要再子线程进行。 public void doOcr(Bitmap bitmap, String language) { TessBaseAPI baseApi = new TessBaseAPI(); baseApi.init(datapath, language); bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true); baseApi.setImage(bitmap); String resultTxt = baseApi.getUTF8Text(); baseApi.clear(); baseApi.end(); //get resultTxt to do something }

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册