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 条评论
登录 后参与评论

相关文章

来自专栏智能算法

网页排序算法之PageRank

1. PageRank算法概述 PageRank,即网页排名,又称网页级别、Google左侧排名或佩奇排名。 是Google创始人拉里·佩奇和谢尔盖·布林于...

50290
来自专栏华章科技

机器学习和深度学习视频资料精选(附学习资料)

pandax视频教程 链接: https://pan.baidu.com/s/1pLqavVX 密码: fath python入门到精通 链接: http...

19330
来自专栏机器之心

教程 | 如何用TensorFlow在安卓设备上实现深度学习推断

41950
来自专栏Android开发实战

重磅实战:如何用TensorFlow在安卓设备上实现深度学习,附Demo和源码

对于个人和公司来说,存在许多状况是更希望在本地设备上做深度学习推断的:想象一下当你在旅行途中没有可靠的互联网链接时,或是要处理传输数据到云服务的隐私问题和延迟...

36830
来自专栏DHUtoBUAA

基于电子海图的水面无人艇全局路径规划

Research and Implementation of Global Path Planning for Unmanned Surface Vehicle...

40950
来自专栏新智元

【Science】破解密码“AlphaGo”诞生,训练Gan破解27%LinkedIn测试集密码

【新智元导读】一项新的研究旨在使用生成对抗网络(GAN) 来加快密码破解的速度。斯蒂文斯理工学院的研究人员用类似“AlphaGo”的方法,利用超过 4300 万...

34960
来自专栏机器之心

深度 | 基于TensorFlow打造强化学习API:TensorForce是怎样炼成的?

选自reinforce.io 机器之心编译 作者:Michael Schaarschmidt、Alexander Kuhnle、Kai Fricke 参与:Pa...

61090
来自专栏程序你好

深度学习框架机器学习的开源库TensorFlow

9110
来自专栏计算机视觉life

Facebook Surround360 学习笔记--(4)色彩/视差不一致问题

surround360的开源资料地址: 下载好代码和测试数据集,配置好环境,关于环境配置可以参考这篇博客,写的挺详细: 运行代码的说明可以参考这篇博客...

24650
来自专栏PaddlePaddle

【AI核心技术】课程八:卷积网络简介

UAI与PaddlePaddle联合推出的【AI核心技术掌握】系列课程持续更新中!

9830

扫码关注云+社区

领取腾讯云代金券