深度学习目标检测系列:一文弄懂YOLO算法附Python源码

丰富的线上&线下活动,深入探索云世界

做任务,得社区积分和周边

最真实的开发者用云体验

让每位学生受益于普惠算力

让创作激发创新

资深技术专家手把手带教

遇见技术追梦人

技术交流,直击现场

海量开发者使用工具、手册,免费下载

极速、全面、稳定、安全的开源镜像

开发手册、白皮书、案例集等实战精华

为开发者定制的Chrome浏览器插件

YOLO框架(YouOnlyLookOnce)与RCNN系列算法不一样,是以不同的方式处理对象检测。它将整个图像放在一个实例中,并预测这些框的边界框坐标和及所属类别概率。使用YOLO算法最大优的点是速度极快,每秒可处理45帧,也能够理解一般的对象表示。

在本节中,将介绍YOLO用于检测给定图像中的对象的处理步骤。

整个过程是不是很清晰,下面逐一详细介绍。首先需要将标记数据传递给模型以进行训练。假设已将图像划分为大小为3X3的网格,且总共只有3个类别,分别是行人(c1)、汽车(c2)和摩托车(c3)。因此,对于每个单元格,标签y将是一个八维向量:

假设从上面的例子中选择第一个网格:

如前所述,bx、by、bh和bw是相对于正在处理的网格单元计算而言的。下面通过一个例子来说明这一点。以包含汽车的右边网格为例:

这里有一些思考的问题——如何判断预测的边界框是否是一个好结果(或一个坏结果)?单元格之间的交叉点,计算实际边界框和预测的边界框的并集交集。假设汽车的实际和预测边界框如下所示:

如果IoU大于0.5,就可以说预测足够好。0.5是在这里采取的任意阈值,也可以根据具体问题进行更改。阈值越大,预测就越准确。还有一种技术可以显着提高YOLO的效果——非极大值抑制。对象检测算法最常见的问题之一是,它不是一次仅检测出一次对象,而可能获得多次检测结果。假设:

以上就是非极大值抑制的全部内容,总结一下关于非极大值抑制算法的要点:

在上述内容中,每个网格只能识别一个对象。但是如果单个网格中有多个对象呢?这就行需要了解AnchorBoxes的概念。假设将下图按照3X3网格划分:

在本节中,首先介绍如何训练YOLO模型,然后是新的图像进行预测。

训练模型时,输入数据是由图像及其相应的y标签构成。样例如下:

对于每个网格,模型将预测·3X3X16·大小的输出。该预测中的16个值将与训练标签的格式相同。前8个值将对应于AnchorBoxes1,其中第一个值将是该网络中对象的概率,2-5的值将是该对象的边界框坐标,最后三个值表明对象属于哪个类。以此类推。最后,非极大值抑制方法将应用于预测框以获得每个对象的单个预测结果。以下是YOLO算法遵循的确切维度和步骤:

本节中用于实现YOLO的代码来自AndrewNG的[GitHub存储库],需要下载此[zip文件],其中包含运行此代码所需的预训练权重。首先定义一些函数,这些函数将用来选择高于某个阈值的边界框,并对其应用非极大值抑制。首先,导入所需的库:

importosimportmatplotlib.pyplotaspltfrommatplotlib.pyplotimportimshowimportscipy.ioimportscipy.miscimportnumpyasnpimportpandasaspdimportPILimporttensorflowastffromskimage.transformimportresizefromkerasimportbackendasKfromkeras.layersimportInput,Lambda,Conv2Dfromkeras.modelsimportload_model,Modelfromyolo_utilsimportread_classes,read_anchors,generate_colors,preprocess_image,draw_boxes,scale_boxesfromyad2k.models.keras_yoloimportyolo_head,yolo_boxes_to_corners,preprocess_true_boxes,yolo_loss,yolo_body%matplotlibinline然后,实现基于概率和阈值过滤边界框的函数:

defyolo_filter_boxes(box_confidence,boxes,box_class_probs,threshold=.6):box_scores=box_confidence*box_class_probsbox_classes=K.argmax(box_scores,-1)box_class_scores=K.max(box_scores,-1)filtering_mask=box_class_scores>thresholdscores=tf.boolean_mask(box_class_scores,filtering_mask)boxes=tf.boolean_mask(boxes,filtering_mask)classes=tf.boolean_mask(box_classes,filtering_mask)returnscores,boxes,classes之后,实现计算IoU的函数:

defiou(box1,box2):xi1=max(box1[0],box2[0])yi1=max(box1[1],box2[1])xi2=min(box1[2],box2[2])yi2=min(box1[3],box2[3])inter_area=(yi2-yi1)*(xi2-xi1)box1_area=(box1[3]-box1[1])*(box1[2]-box1[0])box2_area=(box2[3]-box2[1])*(box2[2]-box2[0])union_area=box1_area+box2_area-inter_areaiou=inter_area/union_areareturniou然后,实现非极大值抑制的函数:

defyolo_non_max_suppression(scores,boxes,classes,max_boxes=10,iou_threshold=0.5):max_boxes_tensor=K.variable(max_boxes,dtype='int32')K.get_session().run(tf.variables_initializer([max_boxes_tensor]))nms_indices=tf.image.non_max_suppression(boxes,scores,max_boxes,iou_threshold)scores=K.gather(scores,nms_indices)boxes=K.gather(boxes,nms_indices)classes=K.gather(classes,nms_indices)returnscores,boxes,classes随机初始化下大小为(19,19,5,85)的输出向量:

yolo_outputs=(tf.random_normal([19,19,5,1],mean=1,stddev=4,seed=1),tf.random_normal([19,19,5,2],mean=1,stddev=4,seed=1),tf.random_normal([19,19,5,2],mean=1,stddev=4,seed=1),tf.random_normal([19,19,5,80],mean=1,stddev=4,seed=1))最后,实现一个将CNN的输出作为输入并返回被抑制的边界框的函数:

defyolo_eval(yolo_outputs,image_shape=(720.,1280.),max_boxes=10,score_threshold=.6,iou_threshold=.5):box_confidence,box_xy,box_wh,box_class_probs=yolo_outputsboxes=yolo_boxes_to_corners(box_xy,box_wh)scores,boxes,classes=yolo_filter_boxes(box_confidence,boxes,box_class_probs,threshold=score_threshold)boxes=scale_boxes(boxes,image_shape)scores,boxes,classes=yolo_non_max_suppression(scores,boxes,classes,max_boxes,iou_threshold)returnscores,boxes,classes使用yolo_eval函数对之前创建的随机输出向量进行预测:

scores,boxes,classes=yolo_eval(yolo_outputs)withtf.Session()astest_b:print("scores[2]="+str(scores[2].eval()))print("boxes[2]="+str(boxes[2].eval()))print("classes[2]="+str(classes[2].eval()))

sess=K.get_session()class_names=read_classes("model_data/coco_classes.txt")anchors=read_anchors("model_data/yolo_anchors.txt")yolo_model=load_model("model_data/yolo.h5")在加载类别信息和预训练模型之后,使用上面定义的函数来获取·yolo_outputs·。

yolo_outputs=yolo_head(yolo_model.output,anchors,len(class_names))之后,定义一个函数来预测边界框并在图像上标记边界框:

defpredict(sess,image_file):image,image_data=preprocess_image("images/"+image_file,model_image_size=(608,608))out_scores,out_boxes,out_classes=sess.run([scores,boxes,classes],feed_dict={yolo_model.input:image_data,K.learning_phase():0})print('Found{}boxesfor{}'.format(len(out_boxes),image_file))#Generatecolorsfordrawingboundingboxes.colors=generate_colors(class_names)#Drawboundingboxesontheimagefiledraw_boxes(image,out_scores,out_boxes,out_classes,class_names,colors)#Savethepredictedboundingboxontheimageimage.save(os.path.join("out",image_file),quality=90)#Displaytheresultsinthenotebookoutput_image=scipy.misc.imread(os.path.join("out",image_file))plt.figure(figsize=(12,12))imshow(output_image)returnout_scores,out_boxes,out_classes接下来,将使用预测函数读取图像并进行预测:

img=plt.imread('images/img.jpg')image_shape=float(img.shape[0]),float(img.shape[1])scores,boxes,classes=yolo_eval(yolo_outputs,image_shape)最后,输出预测结果:

out_scores,out_boxes,out_classes=predict(sess,"img.jpg")

THE END
1.2024新人教版小学信息科技五年级全一册上学期核心素养教案+配套第1课 生活处处有算法 第2课 算法认识与体验 第3课 游戏体验寻规律 第4课 算法应用在身边 第5课 数学运算讲方法 第6课 判断选择用分支 第7课 重复操作用循环 第8课 算法验证与实现 第9课 互传密信有诀窍 第10课 猜数游戏有https://mp.weixin.qq.com/s?__biz=MzI4MzcxMzcwOA==&mid=2247748755&idx=5&sn=d6a91870341140ae41596f7341a7c06b&chksm=ea82eb5897bc43372166795730e01142d6dde773f610f303895849255eaef8bd80213db33e40&scene=27
2.五分钟学算法青少年人工智能资源与创新平台五分钟学算法授课教师:王晓茹价格免费学习有效期 长期有效 免费加入 简介 学习目录简介 缜密的思维,形象的语言,妙绝的思路,再难的算法,也能信手拈来,娓娓道给你听! 王晓茹,博士,任教于北京邮电大学计算机学院,副教授、硕士生导师。曾在美国MIT(麻省理工学院)和美国PSU(波特兰州立大学)访问学习。现任中国人工智能https://yuanzhuo.bnu.edu.cn/goods/show/33
3.全网最全程序员学习网站汇总,还不赶快收藏地址: 五分钟学算法 简介:有少量非常不错的数据结构、算法相关的内容。 推荐指数:? 13、犬小哈教程网 地址: 犬小哈教程网 简介:少量哈士奇的技术问答漫画很有意思。 推荐指数:? 15、原创技术大联盟 地址: 原创技术大联盟 简介:优秀的技术博主实在太多了,列不完,也看不完,这里有一个导航页https://www.songma.com/news/txtlist_i66992v.html
4.五分钟学算法个人网站:https://www.cxyxiaowu.com 动态规划 1 概念 动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。在学习动态规划之前需要明确掌握几个重要 阅读全文 posted @ 2019-11-15 14:13 五分钟学算法 阅读(1429) 评论(5) 推荐(0) 编辑 https://www.cnblogs.com/fivestudy/
5.双非本科跨专业5面京东,8600小时后收到通知,流下喜悦泪水1、自我介绍 2、如何学习Java 3、遇到问题 4、了解面试的什么部门吗? 5、了解业务吗? 6、下载京东健康APP去了解了吗 7、一会儿会给你结果,去官网查就行了 (D)伴鱼 (一)一面: 算法题(没思路5分钟可以换题) 1、按奇偶排序数组II(给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。 对数组https://maimai.cn/article/detail?fid=1632778078&efid=DWfu7WeSgiHv2qWOUabF1g
6.MindSpore官网该能力兼容Ascend、GPU、CPU多平台,隐蔽不同环境适配的繁琐细节,让用户在打开IDE后一键运行AI算法。最快能在5分钟内体验用昇思MindSpore全场景AI框架学AI的乐趣,内测数据显示80%的AI零基础用户使用该功能可在20分钟内完成环境配置与算法运行。 7.2 沉浸式昇思MindSpore全场景AI框架生态知识智能搜索,用户零压力接入昇https://www.mindspore.cn/news/newschildren?id=967
7.每周文娱观察2017.2.17后者由清华大学和北京理工大学牵头,阿里云支撑实验室研发全生命周期大数据系统软件及其开源创新平台体系。在“工业大数据应用技术国家工程实验室”未来规划中,阿里云将负责云计算大数据基础平台,参与工业相关算法服务的建设和维护,同时支持航天科工资源整合,在工业测控技术方面开展研究及试点行业应用。http://www.leshanvc.com/cygc/23764.html
8.写给自己链接警告宋浩java5、Google Developers 七、小微型博客 1、美团技术团队 2、阮一峰的网络日志 3、Spring Boot中文导航 4、Spring Cloud中文导航 5、Web前端导航 6、Spring For All 7、廖雪峰的官方网站 8、bugstack 9、Java技术驿站 10、酷壳 11、床长人工智能教程 12、五分钟学算法 https://blog.csdn.net/m0_57434744/article/details/128572484
9.湖北工业大学2024年硕士研究生招生简章湖北工业大学创建于1952年,是一所以工学为主,经济学、法学、教育学、文学、理学、医学、管理学、艺术学、交叉学科等十大 学科门类协调发展的多科性大学,是湖北省“双一流”建设高校、国家“中西部高校基础能力建设工程”高校、全国毕业生就业典型经验 高校、全国深化创新创业教育改革示范高校、国家知识产权试点高校、国家https://hzmba.com/article/hubeigongyedaxue2024nianshuosh.html
10.算法数据结构体系学习班马士兵教育官网算法体系班https://www.mashibing.com/course/339
11.河北大学文学院2024年硕士研究生复试实施细则2. 拟定初试成绩与复试成绩加权比是7:3。总成绩具体算法为:总成绩=初试总成绩[总分500分的÷5;总分300分的÷3]×70%+复试成绩×30%。 3. 特殊类考生加分政策见研究生院复试录取办法。 五、录取程序 1. 以招生专业(方向)为单位,按一志愿考生总成绩排序,依据招生指标数确定拟录取考生名单。(复试考生总成绩相https://wxy.hbu.cn/info/1049/3121.htm
12.全栈金融工程师算法技术解构scikit-learn支持多种格式的数据,包括经典的iris数据,LibSVM格式数据等等。为了方便起见,推荐使用LibSVM格式的数据,详细见LibSVM的官网。 (8)Statsmodels Statsmodels是Python的统计建模和计量经济学工具包,包括一些描述统计、统计模型估计和推断。包括线性回归模型、一般线型模型、robust linear models、离散选择模型(logit)https://www.jianshu.com/p/6c3888c2e846
13.360WiFi官网5、良好的沟通和表达能力,具备快速的学习和研究能力 请发简历至haoyun@360.cn Android研发工程师 岗位职责: 1、负责360免费WiFi安卓客户端的研发 任职资格: 1. 扎实的计算机基础知识,丰富的实际代码编写经验 2. 良好的数据结构和算法基础 3、熟悉 Java/C++,Android SDK/NDK https://wifi.360.cn/help/joinus
14.开发者必备:基于Linux生态的十大AI开源框架盘OSCHINAMLlib 目前支持分类、回归、推荐、聚类、生存分析等多种机器学习算法。 官网:https://spark.apache.org/mllib/ 5. Apache Mahout:Hadoop 广泛采用的机器学习开源框架 Apache Mahout 同样也是一个 Apache 开源项目,与 MLlib 相对应,Mahout 是应用在 Hadoop 平台下的机器学习开源框架。 https://www.oschina.net/news/80995/top-ai-open-source-linux-ecosystem-framework
15.力扣(LeetCode)全球极客挚爱的技术成长平台零起步学算法 以非常通俗易懂的讲解,带领新手朋友们进入「算法与数据结构」学习的大门。 灵茶山艾府?10 个月前 分享丨【题单】图论算法(DFS/BFS/拓扑排序/最短路/最小生成树/二分图/基环树/欧拉路径) DFS 一路到底,BFS 由近及远。 DFS 基础 找连通块、判断是否有环等。部分题目做法不止一种。 1383 https://leetcode-cn.com/
16.吴师兄学算法的个人主页动态程序员的快乐往往就是这么朴素无华且枯燥!我,打开了LeetCode官网,打算随意的做几题,看到877号问题几百个字的描述我却使用一行代码仅仅11个字母就AC,哎,枯燥。想象 3 吴师兄学算法 CTO @全网同名:吴师兄学算法 · 5年前 LeetCode 第 287 号问题:寻找重复数,一道非常简单的数组遍历题,加上四个条件后感觉https://juejin.cn/user/4230576474426685
17.苹果团队首发文,揭露让iPhone支持深度学习算法面临的诸多挑战雷锋网消息,苹果 Vision 框架的发布,意味着开发者可以在 App 中使用深度学习算法和许多其他的计算机视觉技术。那么,支持这一创造性革新的背后,苹果团队面临了哪些挑战?日前,苹果在其官网发文,首次揭露了这些信息。详情如下,雷锋网编译整理: 苹果在 iOS 10 中开始使用深度学习技术。随着 Vision 框架的发布,开发者可以https://www.leiphone.com/category/industrynews/zCmFyITNzSt3dWuw.html
18.3分钟理财加拿大凤凰预测算法在线预测(2024排行榜徐高(中银证券首席经济学家):这次会议提到,适度增加中央预算内投资,并且提到以政府投资有效带动社会投资,这意味着我们将重点关注能够产生宏观的社会效益的投资,在物流、交通等方面的投资就是这样,它们可以通过系统性地带动全社会多领域的发展,来创造需求稳定增长。 https://m.dslyy.com/teeq77DtEsV01QUN1216.html