【Keras+TensorFlow+Yolo3】教你如何识别影视剧模型

一、前言

小王在毕设之余疯狂追剧,最近痴迷于《权利的游戏》中龙母的美貌,太🉑了
在这里插入图片描述
当然,二丫 和 雪诺 的故事线也非常好看,我喜欢剧透,欢迎大家向我剧透。👀
在这里插入图片描述 在这里插入图片描述
当然了,小王也不能忘记毕设进度啦——好像是什么手语识别来着?

哈哈哈哈,用最近了解的yolo跑个模型测试一下下吧,嘻嘻,效果还不错!
在这里插入图片描述

咳咳,进入正题啦!

前面一篇文章算是打通了【yolo3识别】的任督二脉:
【Yolo3】一文掌握图像标注、训练、识别(Keras+TensorFlow-gpu)

梳理一下yolo3的知识点:

1.结构图

参考CNN流程:
在这里插入图片描述
yolov3流程:
输入图片->darknet53(三个不同尺度特征层)->yolo3解码(卷积+采样+结合)->(三个特征结果)
在这里插入图片描述
图片引用见logo

2.步骤

在这里插入图片描述
第一步:输入图片(调整为416x416尺寸的图片)

经过darknet53(5轮,23个残差块——对残差网络进行特征提取)
在这里插入图片描述
分别得到✅3个不同尺度特征层:13x13x102426x26x51252x52x256
其中13x13表示网格数、3表示3个先验框、后面表示类别数。

第二步:13x13的特征层经过5层卷积
在这里插入图片描述在这里插入图片描述
第三步:

  1. 再次进行3x3的卷积✅输出特征feat3 + 1x1卷积调整通道数
    其中(75分为4+1+20):

    • 4表示:偏移量x_offset、y_offset、height、width
    • 1表示:置信度
    • 25表示:对象类别数
  2. 13x13尺度: 卷积+上采样(步长为2,即把长宽变为1/2),再与16x16的特征层结合。
    在这里插入图片描述在这里插入图片描述
    同理:16x16 五次卷积 -》3x3卷积✅输出此层特征feat2 + 1x1卷积调整通道数
    16x16 卷积+上采样 -》
    同理:52x52 五次卷积 -》3x3卷积✅输出此层特征feat1 + 1x1卷积调整通道数
    在这里插入图片描述

相关函数:(结合源码注释消化,也可参考消化)

在这里插入图片描述

3.loss值

作用:判断模型标准
在这里插入图片描述
特别说明:

  1. 先验框的由来。先验框数值越大,适合检测大窗格13x13;对像素小,容易失真的图片来说,先验框数值越小检测越精准,适合检测小窗格52x52。

  2. loss函数的定义:
    存在的框:

    1. 编码后长宽与xy偏移量的差距
    2. 置信度与1的差值(loss =| 1- iou |)
    3. 种类预测结果与真实值的对比

    不存在框: 最大iou与0的差值 (loss =| iou - 0|)

    iou的概念补充:一般指代模型预测的 bbox 和 Groud Truth 之间的交并比。
    在这里插入图片描述
    左图为预测目标位置,右图为原始目标位置;交并比就是预测正确部分Area of overrap比上两个位置所占的全部面积Area of Union;iou越大,预测效果越好。

  3. 三个检测结果进行堆叠:

    • 左上和右下角进行标记
      在这里插入图片描述
    • 非极大抑制(去掉重叠的框,最多20个框)
      相同目标最近的几个框都满足要求,只显示最大的那个框。
      在这里插入图片描述

大概就是这些内容啦,接下来从源码入手!

二、手识别

本文是对手语数据集训练的一个记录,算是 tf2 - keras-yolo3 复现。

下面操作中包含了源码可训练,以及loss查看tensorboard的使用。

0.图片

(选做,用你自己的标注数据)
本次使用的数据集来自:牛津大学Arpit Mittal, Andrew Zisserman和 Phil Torr

综合的手图像数据集共有13050个手实例被注释。大于边界框固定区域(1500平方像素)的手部实例被认为“足够大”以进行检测,并用于评估。这给出了大约4170个高品质手实例。在收集数据时,对人的姿势或可见度没有任何限制,对环境也没有任何限制。在每幅图像中,都标注了人类可以清晰感知的所有手。注释由一个边界矩形组成,该矩形不必相对于手腕进行轴对齐。
在这里插入图片描述
资料下载:

我们用到的数据集为VOC格式:我们仅下载evaluation_code.tar.gz(13.8M)即可。
在这里插入图片描述

1.下载项目框架

参考:重磅!YOLOv3最全复现代码合集(含TensorFlow/PyTorch和Keras等)
我仅根据做出源码注释和修改:keras-tensorflow(https://github.com/qqwweee/keras-yolo3

  1. https://gitee.com/cungudafa/keras-yolo3

  2. 单独下载yolov3.weights 权重,放在项目根目录下

  3. 将 DarkNet 的.weights文件转换成 Keras 的.h5文件

    python convert.py -w yolov3.cfg yolov3.weights model_data/yolo_weights.h5
    

2.标签分类

  1. 将下载的数据集复制到项目路径下:
    在这里插入图片描述
    事实是数据集有400+图片,我训练起来太累了,容易过拟合,这里只用了009985-010028共40+张图片进行训练在这里插入图片描述
    开源数据集nb😁,不用手动找资源,再标注啦,嘻嘻嘻!支持开源~😁
    在这里插入图片描述 在这里插入图片描述 在这里插入图片描述
  2. voc标签格式:voc_annotation.py (后面我重构了一下项目结构,可能有出入)
    在这里插入图片描述
    会在ImageSets/Main目录下生成对应文件
    在这里插入图片描述
  3. yolo标签格式:yolo_annotation.py
    1. 修改classes为你训练的对象(我这里是hand)
      在这里插入图片描述
      查看标签:在VOCdevkit\VOC2007\Annotations\009985_hand.xml
      在这里插入图片描述
    2. 这里需要修改一下float格式
      b = (int(float(xmlbox.find('xmin').text)), int(float(xmlbox.find('ymin').text)),
                   int(float(xmlbox.find('xmax').text)), int(float(xmlbox.find('ymax').text)))
      
    3. 执行yolo_annotation.py,在model_data目录下生成yolo标签格式
      在这里插入图片描述
      现在我们就得到了model_data(标签)

3.训练

Keras2.3.1 + TensorFlow-gpu2.1.0 + cuda 10.0

涉及到的文件和函数目录
原始目录:tree_old目录
我重新整合了一下目录结构:tree目录

根目录
│
│  train.py             --- 模型训练    
│
├─data            		--- 参数配置
│  │  yolo_weights.h5	--- 权重文件
│  │  
│  ├─anchors
│  │      coco_anchors.txt	--- 先验参数
│  │      
│  ├─classes
│  │      coco.name
│  │      voc_classes.txt --- 标签样本名称
│  │      
│  └─dataset
│          test.txt
│          train.txt
│          val.txt
│      
└─core
   │  darknet53.py		--- 特征提取网络
   │  loss.py			--- 损失函数
   │  yolo3.py 			--- yolo网络
   └─  utils.py      	--- 图片加载工具类  

运行train.py 50轮和100轮

(之前我更新了一次keras,导致之前的修改被抹除了,这里修改一下:)
报错:在这里插入图片描述
参考:'Model’object has no attribute '_get_distribution_strategy’的一种解决方案


问题2:(运行到64轮时,VSCode崩掉了,这里接着之前的模型运行)
在这里插入图片描述
注释掉前50轮,直接model.load_weights('logs/ep064-loss16.422-val_loss20.496.h5')你觉得合适的版本,
再把 initial_epoch 改为当前的序号可以接着运行。在这里插入图片描述
这是绝招了!

最终我运行到100轮时,loss值为19.2
在这里插入图片描述

神经网络可视化分析:

  1. 读取运行时记录:(这里train和validation分别记录)
    在这里插入图片描述

  2. 在路径下打开控制台运行:

    tensorboard --logdir=logs\
    

    tensorboard 是 tensorflow安装时就附带安装的可视化工具🍳,别说你还没用过。
    在这里插入图片描述

  3. 打开浏览器查看:http://localhost:6006/
    在这里插入图片描述
    其中GRAPHS可以打印出我们的神经网络结构:(可以导出为png图片)
    在这里插入图片描述

4.测试

修改yolo.py的模型路径,socre和iou——是显示检测结果画框框的重要因素:

"score": 0.45, # 框置信度阈值,小于阈值的框被删除,需要的框较多,则调低阈值,需要的框较少,则调高阈值
"iou": 0.3, # 同类别框的IoU阈值,大于阈值的重叠框被删除,重叠物体较多,则调高阈值,重叠物体较少,则调低阈值

在这里插入图片描述
直接检测:predict.py

from keras.layers import Input
from yolo import YOLO,detect_video
from PIL import Image

def for_img(yolo):
    path = 'D:/myworkspace/dataset/test.jpg'
    try:
        image = Image.open(path)
    except:
        print('Open Error! Try again!')
    else:
        r_image = yolo.detect_image(image)
        r_image.show()
    yolo.close_session()


def for_video(yolo):
    detect_video(yolo, "D:/myworkspace/dataset/xuanya.mp4", "D:/myworkspace/dataset/xuanya_detect.mp4")


if __name__ == '__main__':
    _yolo = YOLO()

    for_img(_yolo)
    # for_video(_yolo)

yolo.py测试部分报错:
在这里插入图片描述
最终参考:tf2-keras-yolo3,可以直接对图片和视频进行检测。


因为模型是训练一次就好了,测试部分我单独提出封装到代码里:(后面在这基础上还要做手语识别,前途明朗~)
识别部分——代码下载链接

yolo_video.py:

import sys
import argparse
from yolo import YOLO, detect_video
from PIL import Image

def detect_img(yolo):
    while True:
        print("Press 'q' quit !")
        img = input('Input image filename:')
        if img.lower() == 'q':
            exit(0)
        try:
            image = Image.open(img)
        except:
            print('Open Error! Try again!')
            continue
        else:            
            r_image = yolo.detect_image(image)
            r_image.show()
    yolo.close_session()

FLAGS = None

if __name__ == '__main__':
    # class YOLO defines the default value, so suppress any default here
    parser = argparse.ArgumentParser(argument_default=argparse.SUPPRESS)
    '''
    Command line options
    '''
    parser.add_argument(
        '--model_path', type=str,
        help='path to model weight file, default ' + YOLO.get_defaults("model_path")
    )

    parser.add_argument(
        '--anchors_path', type=str,
        help='path to anchor definitions, default ' + YOLO.get_defaults("anchors_path")
    )

    parser.add_argument(
        '--classes_path', type=str,
        help='path to class definitions, default ' + YOLO.get_defaults("classes_path")
    )

    parser.add_argument(
        '--gpu_num', type=int,
        help='Number of GPU to use, default ' + str(YOLO.get_defaults("gpu_num"))
    )

    parser.add_argument(
        '--image', default=False, action="store_true",
        help='Image detection mode, will ignore all positional arguments'
    )
    '''
    Command line positional arguments -- for video detection mode
    '''
    parser.add_argument(
        "--input", nargs='?', type=str,required=False,default='./path2your_video',
        help = "Video input path"
    )

    parser.add_argument(
        "--output", nargs='?', type=str, default="",
        help = "[Optional] Video output path"
    )

    FLAGS = parser.parse_args()

    if FLAGS.image:
        """
        Image detection mode, disregard any remaining command line arguments
        """
        print("Image detection mode")
        if "input" in FLAGS:
            print(" Ignoring remaining command line arguments: " + FLAGS.input + "," + FLAGS.output)
        detect_img(YOLO(**vars(FLAGS)))
    elif "input" in FLAGS:
        detect_video(YOLO(**vars(FLAGS)), FLAGS.input, FLAGS.output)
    else:
        print("Must specify at least video_input_path.  See usage with --help.")

或者直接检测

# 图片检测
python yolo_video.py --image
再输入图片路径


# 视频检测
python yolo_video.py --input img\test.mp4

图片识别率都不错:
在这里插入图片描述
在这里插入图片描述

视频检测最高识别率为57%
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述 在这里插入图片描述
0.5秒检测一帧,正确率在70%左右

后面会用来检测我的手语:Python+Opencv2(三)保存视频关键帧

手语手势识别效果最高88%,非常nice!
在这里插入图片描述
yolo目标检测,比过拟合的模型和openpose粗略估计好很多yo~~
在这里插入图片描述 在这里插入图片描述

三、总结

40+张图片,跑的yolov3模型240M,检测效果比较满意啦。这里检测的是人手,如果把标注改为权游的龙,也是能检测出来的哦,just try it!

环境:【GPU】win10 (1050Ti)+anaconda3+python3.6+CUDA10.0+tensorflow-gpu2.1.0

仅对于yolov3模型来说,模型较大,如果转换成yolo-tiny甚至是yolo-nano会不会更方便移植。

生命不息,学习不止!😎


源码:

  1. 训练: https://gitee.com/cungudafa/keras-yolo3

  2. 识别部分:keras-yolo3-recognize

补充,识别部分函数调用图:
在这里插入图片描述

相关推荐
<p><span style="font-size: 24px; background-color: #e53333; color: #ffffff;"><strong>课程目标</strong></span></p> <p> </p> <p><span style="font-size: 18px;">从零开始掌握Premiere影视剪辑的基础知识,学会</span><span style="font-size: 18px; color: #e53333;"><span style="color: #e53333;"><strong>视频剪辑+影视特效+视频调色+字幕制作</strong></span></span></p> <p> </p> <p><span style="font-size: 24px; background-color: #e53333; color: #ffffff;">适用人群</span></p> <p> </p> <p><span style="font-size: 18px;">PR零基础小白,在校大学生,职场新人,想成为影视剪辑、影视后期、短视频制作、自媒体等高手的朋友。</span></p> <p> </p> <p><span style="font-size: 24px; background-color: #e53333; color: #ffffff;">课程简介</span></p> <p> </p> <p><span style="font-size: 18px;">课程以新版PR 2020讲解,可使用PR任意版本学习,绝大多数功能兼容旧版,但强烈建议使用新版本。</span></p> <p><span style="font-size: 18px;">【Adobe认证专家讲师精耕细作精品程,非学院派照本宣科软件操作程,以任务为导向,面向实际应用场景,每一章都能学会实打实的高手技能,讲解细致,小白也能轻松入门成大神!】</span></p> <p><span style="font-size: 18px;">课程好不好,看过就知道,前面的免费章节欢迎试看。</span></p> <p><span style="font-size: 18px;">本课程学习不需要任何PR基础,只需要电脑操作基础即可。兼容Windows和Mac操作系统,同时讲解两种系统下的快捷键操作,不用担心操作上的障碍问题。</span></p> <p> </p> <p><span style="font-size: 24px; background-color: #e53333; color: #ffffff;">课程特色</span></p> <p> </p> <p><span style="font-size: 18px;">1、以实际PR影视编辑与特效的流程为导向,绝大多数内容都是为了完成某个具体任务,而不是为了讲解某个软件操作而凑数。</span></p> <p><span style="font-size: 18px;">2、不同于国内多数程和书籍,每个知识点务求讲精、讲透,帮助你掌握PR的精髓,而非软件操作上的皮毛,让你真正学到PR的本质,一次学习,终身受用,少走弯路,节约生命。</span></p> <p><span style="font-size: 18px;">3、课程会随PR新版本的推出持续更新,不必担心有新功能却不知道怎么用。</span></p> <p><span style="font-size: 18px;">4、充足的练习题和作业题,让你在不断的练习和挑战中提升PR技能。</span></p> <div> <p> </p> <p><img src="https://img-bss.csdnimg.cn/202009230003497469.png" alt="" width="880" height="2635" /><img src="https://img-bss.csdnimg.cn/202009230004006917.png" alt="" width="880" height="2635" /><img src="https://img-bss.csdnimg.cn/202009230004102289.png" alt="" width="880" height="2635" /><img src="https://img-bss.csdnimg.cn/202009230004197845.png" alt="" width="880" height="1445" /></p> </div>
<p> <strong><span> </span></strong> </p> <p class="ql-long-16800510"> <span style="color:#333333;"><strong><span style="color:#333333;"> </span></strong></span> </p> <p class="ql-long-24357476"> <span style="color:#E53333;font-size:14px;">每天前100人再送5门编程课!</span> </p> <p class="ql-long-24357476"> <span style="color:#E53333;font-size:14px;">AI+5门300元课程+社群闭门分享会</span> </p> <p class="ql-long-24357476"> <span style="color:#E53333;font-size:14px;">源码开源下载:<a href="https://github.com/DjangoPeng/keras-101/tree/master/code_samples">https://github.com/DjangoPeng/keras-101/tree/master/code_samples</a></span> </p> <p> <br /> </p> <h3 class="ql-long-26664262"> <div class="ql-long-26664262"> <span style="font-size:14px;color:#337FE5;">【为什么学AI】</span> </div> </h3> <p class="ql-long-26664262"> <span style="font-size:14px;">归功于近年来大规模数据和硬件计算能力的大幅度提升,人工智能的概念近两年一直是市场追捧的对象。目前各大厂都争先恐后地布局AI,落地各类AI的的商业应用,也随之打响了一场激烈的人才争夺战。长远来看,越快将 AI 用于自己的工作中就能越早体会到AI带来的收益。</span> </p> <p> <br /> </p> <p> <br /> </p> <p> <strong><span style="font-size:14px;color:#337FE5;">【讲师介绍】</span></strong> </p> <p class="ql-long-16800510"> <span style="font-size:14px;">彭靖田 Google Developer Experts。</span> </p> <p class="ql-long-16800510"> <span style="font-size:14px;">曾为 TensorFlow Top级 的贡献者,著书《深入理解TensorFlow》,是国内第一本深度剖析 Google AI 框架的畅销书。</span> </p> <p class="ql-long-16800510"> <span style="font-size:14px;">曾从0到1深入参与了华为 2012 实验室深度学习平台和华为深度学习云服务的设计与研发工作。</span> </p> <p class="ql-long-16800510"> <br /> </p> <h3 class="ql-long-26664262"> <p> <span style="color:#337FE5;"><span style="font-size:14px;color:#337FE5;">【课程设计】</span></span> </p> </h3> <p class="ql-long-26664262"> <br /> </p> <p class="ql-long-26664262"> <span style="font-size:14px;">课程内容基于最新的Keras版本(你也可以使用 TensorFlow 2 的 tf.keras 模块),其中有大量独家解读、案例,以及不少讲师一线实战多年的方法论和深度思考。同时,在层次划分上,难易兼顾,循序渐进。既有核心的基础知识,也有高级的进阶操作,尽量做到“老少皆宜”。</span> </p> <p class="ql-long-26664262"> <br /> </p> <p class="ql-long-26664262"> <span style="font-size:14px;"><strong>课程分为基础篇、入门篇和实战篇:</strong></span> </p> <p class="ql-long-26664262"> <span style="font-size:14px;"><br /> </span> </p> <p class="ql-long-26664262"> <strong><span style="font-size:14px;">一、基础篇:</span></strong> </p> <p class="ql-long-26664262"> <span style="font-size:14px;">主要讲解人工智能发展史和深度学习脱颖而出的原由,以及神经网络的基础概念、理论实现、优化原理和计算方法。</span> </p> <p class="ql-long-26664262"> <span style="font-size:14px;"><br /> </span> </p> <p class="ql-long-26664262"> <strong><span style="font-size:14px;">二、入门篇:</span></strong> </p> <p class="ql-long-26664262"> <span style="font-size:14px;">主攻快速上手,通过7个小节让你从0到1实现环境搭建、模型优化,直接试水2个实战项目。同时,增强AI的理论学习,系统掌握机器学习3大分支、模型评估方法、数据预处理常用手段与过拟合问题的解决方案。</span> </p> <p class="ql-long-26664262"> <span style="font-size:14px;"><br /> </span> </p> <p class="ql-long-26664262"> <strong><span style="font-size:14px;">三、实战篇:</span></strong> </p> <p class="ql-long-26664262"> <span style="font-size:14px;">通过4个实战全面掌握深度学习理论与实现,涵盖目标检测、图像分类、可视化和可解释性学习、迁移学习、特征提取、数据增强等。带你综合运用前面所学的所有知识,逐渐熟练AI开发流程与技能。</span> </p> <p> <br /> </p> <p> <br /> </p> <p class="MsoNormal"> <br /> </p> <p> <img src="https://img-bss.csdn.net/202002271330419257.png" alt="" /> </p> <p> <span style="font-size:14px;">课程包含思维导图上的所有内容(价值199元)前500名立减100元,仅99元买完就能学!</span> </p>
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页