YOLOv3在YOLOv2的基础进行了一些改进,这些更改使其效果变得更好。 在320×320的图像上,YOLOv3运行速度达到了22.2毫秒,mAP为28.2。其与SSD一样准确,但速度快了三倍,具体效果如下图。本文对YOLO v3的改进点进行了总结,并实现了一个基于Keras的YOLOv3检测模型。

inference

环境

Python 3.6

Tensorflow-gpu 1.5.0

Keras 2.1.3

OpenCV 3.4

改进点

1.Darknet-53特征提取网络

不同于Darknet-19,YOLO v3中使用了一个53层的卷积网络,这个网络由残差单元叠加而成。根据作者的实验,在分类准确度上跟效率的平衡上,这个模型比ResNet-101、 ResNet-152和Darknet-19表现得更好。

Darknet-53

2.边界框预测

基本的坐标偏移公式与YOLO v2相同。

box

YOLO v3使用逻辑回归预测每个边界框的分数。 如果先验边界框与真实框的重叠度比之前的任何其他边界框都要好,则该值应该为1。 如果先验边界框不是最好的,但确实与真实对象的重叠超过某个阈值(这里是0.5),那么就忽略这次预测。YOLO v3只为每个真实对象分配一个边界框,如果先验边界框与真实对象不吻合,则不会产生坐标或类别预测损失,只会产生物体预测损失。

3.类别预测

为了实现多标签分类,模型不再使用softmax函数作为最终的分类器,而是使用logistic作为分类器,使用 binary cross-entropy作为损失函数。

4.多尺度预测

不同于之前的YOLO,YOLO v3从三种不同尺度的特征图谱上进行预测任务。

在Darknet-53得到的特征图的基础上,经过7个卷积得到第一个特征图谱,在这个特征图谱上做第一次预测。

然后从后向前获得倒数第3个卷积层的输出,进行一次卷积一次x2上采样,将上采样特征与第43个卷积特征连接,经过7个卷积得到第二个特征图谱,在这个特征图谱上做第二次预测。

然后从后向前获得倒数第3个卷积层的输出,进行一次卷积一次x2上采样,将上采样特征与第26个卷积特征连接,经过7个卷积得到第三个特征图谱,在这个特征图谱上做第三次预测。

每个预测任务得到的特征大小都为N ×N ×[3∗(4+1+80)] ,N为格子大小,3为每个格子得到的边界框数量, 4是边界框坐标数量,1是目标预测值,80是类别数量。

out

实验

实现了一个输入大小为(416, 416)的yolo v3检测模型,模型使用了coco训练的权值文件。

权值文件转换

参考了yad2k项目的转换方法,我们为其添加了几个新的层,用来将Darknet的网络结构和权值文件转换为keras 2的网络结构和权值文件。

执行下列命令转换

python yad2k.py cfg\yolo.cfg yolov3.weights data\yolo.h5

检测

demo.py文件提供了使用yolo v3进行检测的例子。图片检测结果输出到images\res文件夹。

"""Demo for use yolo v3

"""

import os

import time

import cv2

import numpy as np

from model.yolo_model import YOLO

def process_image(img):

"""Resize, reduce and expand image.

# Argument:

img: original image.

# Returns

image: ndarray(64, 64, 3), processed image.

"""

image = cv2.resize(img, (416, 416),

interpolation=cv2.INTER_CUBIC)

image = np.array(image, dtype='float32')

image /= 255.

image = np.expand_dims(image, axis=0)

return image

def get_classes(file):

"""Get classes name.

# Argument:

file: classes name for database.

# Returns

class_names: List, classes name.

"""

with open(file) as f:

class_names = f.readlines()

class_names = [c.strip() for c in class_names]

return class_names

def draw(image, boxes, scores, classes, all_classes):

"""Draw the boxes on the image.

# Argument:

image: original image.

boxes: ndarray, boxes of objects.

classes: ndarray, classes of objects.

scores: ndarray, scores of objects.

all_classes: all classes name.

"""

for box, score, cl in zip(boxes, scores, classes):

x, y, w, h = box

top = max(0, np.floor(x + 0.5).astype(int))

left = max(0, np.floor(y + 0.5).astype(int))

right = min(image.shape[1], np.floor(x + w + 0.5).astype(int))

bottom = min(image.shape[0], np.floor(y + h + 0.5).astype(int))

cv2.rectangle(image, (top, left), (right, bottom), (255, 0, 0), 2)

cv2.putText(image, '{0} {1:.2f}'.format(all_classes[cl], score),

(top, left - 6),

cv2.FONT_HERSHEY_SIMPLEX,

0.6, (0, 0, 255), 1,

cv2.LINE_AA)

print('class: {0}, score: {1:.2f}'.format(all_classes[cl], score))

print('box coordinate x,y,w,h: {0}'.format(box))

print()

def detect_image(image, yolo, all_classes):

"""Use yolo v3 to detect images.

# Argument:

image: original image.

yolo: YOLO, yolo model.

all_classes: all classes name.

# Returns:

image: processed image.

"""

pimage = process_image(image)

start = time.time()

boxes, classes, scores = yolo.predict(pimage, image.shape)

end = time.time()

print('time: {0:.2f}s'.format(end - start))

if boxes is not None:

draw(image, boxes, scores, classes, all_classes)

return image

def detect_vedio(video, yolo, all_classes):

"""Use yolo v3 to detect video.

# Argument:

video: video file.

yolo: YOLO, yolo model.

all_classes: all classes name.

"""

camera = cv2.VideoCapture(video)

cv2.namedWindow("detection", cv2.WINDOW_NORMAL)

while True:

res, frame = camera.read()

if not res:

break

image = detect_image(frame, yolo, all_classes)

cv2.imshow("detection", image)

if cv2.waitKey(110) & 0xff == 27:

break

camera.release()

if __name__ == '__main__':

yolo = YOLO(0.6, 0.5)

file = 'data/coco_classes.txt'

all_classes = get_classes(file)

# detect images in test floder.

for (root, dirs, files) in os.walk('images/test'):

if files:

for f in files:

print(f)

path = os.path.join(root, f)

image = cv2.imread(path)

image = detect_image(image, yolo, all_classes)

cv2.imwrite('images/res/' + f, image)

# detect vedio.

video = 'E:/video/car.flv'

detect_vedio(video, yolo, all_classes)

结果

运行python demo.py

dog.png

eagle.png

giraffe.png

horses.png

person.png

yolov3 python_Python 3 Keras YOLO v3解析与实现相关推荐

  1. ####Python 3 Keras YOLO v3解析与实现

    YOLOv3在YOLOv2的基础进行了一些改进,这些更改使其效果变得更好. 在320×320的图像上,YOLOv3运行速度达到了22.2毫秒,mAP为28.2.其与SSD一样准确,但速度快了三倍,具体 ...

  2. Python 3 Keras YOLO v3解析与实现

    YOLOv3在YOLOv2的基础进行了一些改进,这些更改使其效果变得更好.其与SSD一样准确,但速度快了三倍,具体效果如下图.本文对YOLO v3的改进点进行了总结,并实现了一个基于Keras的YOL ...

  3. YOLO v3解析与实现

    前言 又到了一年考试周,去年本来想实现深度学习目标检测,结果因为各种问题没有做,现在趁机会实现一下. YOLOv3在YOLOv2的基础进行了一些改进,这些更改使其效果变得更好. 在320×320的图像 ...

  4. YOLO系列:YOLO v3解析

    本文好多内容转载自 https://blog.csdn.net/leviopku/article/details/82660381 yolo_v3 提供替换backbone.要想性能牛叉,backbo ...

  5. YOLO v3详细解读

    <YOLOv3: An Incremental Improvement> Joseph Redmon Ali Farhadi University of Washington 发表时间:2 ...

  6. yolo系列之yolo v3【深度解析】——讲的挺好,原作者厉害的

    版权申明:转载和引用图片,都必须经过书面同意.获得留言同意即可 本文使用图片多为本人所画,需要高清图片可以留言联系我,先点赞后取图 这篇博文比较推荐的yolo v3代码是qwe的keras版本,复现比 ...

  7. yolo类检测算法解析——yolo v3

    原文:https://www.cnblogs.com/cvtoEyes/p/8608205.html yolo类检测算法解析--yolo v3 计算机视觉的发展史可谓很长了,它的分支很多,而且理论那是 ...

  8. TensorFlow + Keras 实战 YOLO v3 目标检测图文并茂教程

    作者 | fendouai 编辑 | 安可 [导读]:本文介绍了目标检测算法yolov3的keras实战.欢迎大家点击上方蓝字关注我们的公众号:深度学习与计算机视觉. YOLO 是一种非常流行的目标检 ...

  9. yolov3网络结构图_目标检测——YOLO V3简介及代码注释(附github代码——已跑通)...

    GitHub: liuyuemaicha/PyTorch-YOLOv3​github.com 注:该代码fork自eriklindernoren/PyTorch-YOLOv3,该代码相比master分 ...

最新文章

  1. IMX8QXP内部M4移植rt-thread
  2. VTK中导入并显示STL、3DS文件
  3. 银行对公业务结构图梳理
  4. 数据结构上机实践第七周项目4 - 队列数组
  5. (2) GoJS Node简介
  6. MembershipUserProvider For ScrewTurn 3.0
  7. 陕西2020行政区划调整_陕西省最新行政区划,厉害了大陕西
  8. 为什么华为,腾讯,阿里等大公司都有外包员工?
  9. pdf转图片在线转换免费
  10. iOS小技能: 自定义相机(基础知识储备)
  11. RFB-Net论文解读
  12. 网络安全先驱传奇大佬自杀了,他的一生足够拍成一部电影
  13. html th中加斜杠,css 模拟表格斜线
  14. 基于HarmonyOS分布式小游戏之你画我猜
  15. 中小企业营销兵法_小型企业创建营销计划的技巧
  16. ftp 登陆后读取目录列表失败
  17. iStat菜单入门指南:菜单栏项目未显示怎么解决
  18. 人脸信息被冒用贷款?手机银行的人脸识别风险分析
  19. cobol中的表(数组)
  20. diy 扫地机器人 滚刷_扫地机拆解:滚刷设计篇_iRobot Roomba 飓风版_家电小家电-中关村在线...

热门文章

  1. python处理netcdf_在python中高效读取netcdf变量
  2. 火狐浏览器打印网页不全_武汉社保网上下载打印流程
  3. cannot import name 'imresize' from 'scipy.misc'
  4. 吸尘车-真空吸尘车:真空吸尘车
  5. hdu 5036 Explosion bitset优化floyd
  6. RxJava 设计理念 观察者模式 Observable lambdas MD
  7. Bzoj 4548: 小奇的糖果(双向链表+排序+树状数组)
  8. 2016年第6本:简约至上--交互式设计四策略
  9. hdu 5444 Elven Postman(根据先序遍历和中序遍历求后序遍历)2015 ACM/ICPC Asia Regional Changchun Online...
  10. 分布式流媒体直播服务器系统 For Linux