C-SATS工程副总裁教你如何用TensorFlow分类图像 part2

我们都知道,适当的训练对于将来有效的分类来说至关重要,为了训练工作,我们需要大量准确标记的数据。在第一部分中,我通过下载3000个预先标记的图像跳过了这个挑战。然后我向你展示了在TensorFlow中如何使用带标签的数据训练分类器。在这一部分,我们将使用新的数据集进行训练,并且我将介绍数据可视化工具TensorBoard,以便更好地理解,调试和优化我们的TensorFlow代码。

  • 第一部分:http://www.atyun.com/13211_c-sats工程副总裁教你如何用TensorFlow分类图像-part1.html

鉴于我在医疗技术公司C-SATS担任工程副总裁的工作,我希望建立一个与手术有关的分类器。缝合似乎会很不错。它立即投入使用,并且我知道如何识别它。如果机器能够看到缝合正在发生,它可以自动识别缝合手术过程的步骤(或阶段),例如吻合术。并且,因为外科缝线的针和线比较独特,甚至外行也能辨认出来。

我的目标是训练一台识别医学视频中缝合的机器。

我可以访问数十亿帧的手术视频,其中许多包含缝合。但是这样还会面临标记的问题。幸运的是,C-SATS拥有一批经验丰富的注释师,他们是做这件事的专家。我的源数据是JSON中的视频文件和注释。

注释样本如下:

[
    {
        "annotations": [
            {
                "endSeconds": 2115.215,
                "label": "suturing",
                "startSeconds": 2319.541
            },
            {
                "endSeconds": 2976.301,
                "label": "suturing",
                "startSeconds": 2528.884
            }
        ],
        "durationSeconds": 2975,
        "videoId": 5
    },
    {
        "annotations": [
        // ...etc...

我写了一个Python脚本来使用JSON注释来决定从视频文件中抓取哪些帧。ffmpeg做实际的抓取。我决定每秒最多抓取一帧,然后我将视频秒的总数除以四,得到10k秒(10k帧)。在找出要抓取的秒数之后,我进行了一个快速测试,看看缝合注释内是否有特定的秒(isWithinSuturingSegment())。下面是grab.py的代码

#!/usr/bin/python
 
# Grab frames from videos with ffmpeg. Use multiple cores.
# Minimum resolution is 1 second--this is a shortcut to get less frames.
 
# (C)2017 Adam Monsen. License: AGPL v3 or later.
 
import json
import subprocess
from multiprocessing import Pool
import os
 
frameList = []
 
def isWithinSuturingSegment(annotations, timepointSeconds):
    for annotation in annotations:
        startSeconds = annotation['startSeconds']
        endSeconds = annotation['endSeconds']
        if timepointSeconds > startSeconds and timepointSeconds < endSeconds:
            return True
    return False
 
with open('available-suturing-segments.json') as f:
    j = json.load(f)
 
    for video in j:
        videoId = video['videoId']
        videoDuration = video['durationSeconds']
 
        # generate many ffmpeg frame-grabbing commands
        start = 1
        stop = videoDuration
        step = 4 # Reduce to grab more frames
        for timepointSeconds in xrange(start, stop, step):
            inputFilename = '/home/adam/Downloads/suturing-videos/{}.mp4'.format
(videoId)
            outputFilename = '{}-{}.jpg'.format(video['videoId'], 
timepointSeconds)
            if isWithinSuturingSegment(video['annotations'], timepointSeconds):
                outputFilename = 'suturing/{}'.format(outputFilename)
            else:
                outputFilename = 'not-suturing/{}'.format(outputFilename)
            outputFilename = '/home/adam/local/{}'.format(outputFilename)
 
            commandString = 'ffmpeg -loglevel quiet -ss {} -i {} -frames:v 1 {}'.
format(
                timepointSeconds, inputFilename, outputFilename)
 
            frameList.append({
                'outputFilename': outputFilename,
                'commandString': commandString,
            })
 
def grabFrame(f):
    if os.path.isfile(f['outputFilename']):
        print 'already completed {}'.format(f['outputFilename'])
    else:
        print 'processing {}'.format(f['outputFilename'])
        subprocess.check_call(f['commandString'].split())
 
p = Pool(4) # for my 4-core laptop
p.map(grabFrame, frameList)

现在我们像上次那样,再次对这些模型进行再训练。

使用这个脚本来剪出10k帧用了大约10分钟,然后花费一个小时左右,进行再训练识别缝合达到90%的准确性。我使用了训练集之外的新数据进行了抽查,我试过的每一帧都被正确识别(平均置信度分数为88%,中位数置信度分数为91%)。

下面是我的抽查结果。

因图片血腥无法上传可访问网址查看(https://opensource.com/article/17/12/how-to-tensorboard)

如何使用TensorBoard

深度学习与任何其他类型的软件一样,很难可视化内部的原理和交互。幸好我们可以使用TensorBoard。

第一部分的Retrain.py自动生成文件TensorBoard以用于生成表示再训练期间发生了什么的图。

要安装TensorBoard,运行retrain.py后在容器中运行下面代码

pip install tensorboard
tensorboard --logdir /tmp/retrain_logs

如果看到下面的输出,就使用浏览器浏览器打开下方网址。

Starting TensorBoard 41 on port 6006
(You can navigate to http://172.17.0.2:6006)

你会看到这样的东西(点击下方视频链接):

  • http://imgcdn.atyun.com/2017/12/short-TensorBoard-screencast-1.mp4?_=1

我希望这个视频能够帮到你。在再训练时,我发现在“SCALARS”选项下可以看到,当我们执行更多的训练步骤时或交叉熵减少时准确性如何提高。这就是是我们想要了解的。

原文发布于微信公众号 - ATYUN订阅号(atyun_com)

原文发表时间:2017-12-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI研习社

终于!Supervise.ly 发布人像分割数据集啦(免费开源)

本文为雷锋字幕组编译的技术博客,原标题Releasing “Supervisely Person” dataset for teaching machines ...

812
来自专栏iOSDevLog

更快的iOS和macOS神经网络

因为神经网络本质上执行大量计算,所以它们在移动设备上尽可能高效地运行是很重要的。一个高效的模型能够在实时视频上获得实时结果 - 无需耗尽电池或使手机变热,就可以...

1072
来自专栏PHP技术

相似图片搜索的原理

上个月,Google把”相似图片搜索”正式放上了首页。 你可以用一张图片,搜索互联网上所有与它相似的图片。点击搜索框中照相机的图标。 ? 一个对话框会出现。 ?...

2765
来自专栏WOLFRAM

遛狗:神经网络 | 图像识别 | 地理位置

1313
来自专栏MelonTeam专栏

老司机用神经网络带您安全驾驶

0 概述 随着今年深度学习的热潮的来临,神经网络已经被应用在越来越多的应用中。而在印象中对于神经网络进行训练的往往需要借助大量的计算资源与数据。其实通过一定的...

2205
来自专栏大数据挖掘DT机器学习

【python分析】买彩票机选和守号哪个中奖概率高?

作者:Powerxing 厦门大学计算机系13级研究生 很多人有买彩票,不过就是瞎买买。早之前是随机买过一注,然后一直买这个号,不过断过一段时间没买,后来就一...

6927
来自专栏编程

安卓手机如何玩转动作手势检测?有TensorFlow就够了,附实用教程

? 原文来源:Lemberg Solutions Ltd 作者:Zahra Mahoor、Jack Felag、 Josh Bongard 编译:嗯~阿童木呀...

2087
来自专栏新工科课程建设探讨——以能源与动力工程专业为例

5.2 二维导热算例

本节算例使用actionScript编写,与javascript语法相近。主要阅读理解其算法,可以自己试着开发二维程序。

500
来自专栏PPV课数据科学社区

学习R语言,一篇文章让你从懵圈到入门

在实际工作中,每个数据科学项目各不相同,但基本都遵循一定的通用流程。具体如下: 数据科学工作流程 数据导入 数据整理 反复理解数据 数据可视化 数据转换 ...

3144
来自专栏CDA数据分析师

学习R语言,一篇文章让你从懵圈到入门

在实际工作中,每个数据科学项目各不相同,但基本都遵循一定的通用流程。具体如下: ? 数据科学工作流程: 1.数据导入 2.数据整理 3.反复理解数据 数据可视...

1906

扫描关注云+社区