vis.js入门_使用TensorBoard数据Vis的TensorFlow手术分类器入门

vis.js入门

深度学习中最具挑战性的部分是标签,这将在由两部分组成的系列文章的第1部分中看到, 了解如何使用TensorFlow对图像进行分类 。 正确的培训对于将来进行有效分类至关重要,而要进行工作培训,我们需要大量准确标记的数据。 在第一部分中,我通过下载3,000个预标记图像跳过了这一挑战。 然后,我向您展示了如何使用此标记数据来使用TensorFlow训练分类器。 在这一部分中,我们将训练一个新的数据集,并且我将介绍TensorBoard数据可视化工具套件,以使其更易于理解,调试和优化TensorFlow代码。

鉴于我在医疗技术公司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注释来确定要从.mp4视频文件中抓取哪些帧。 ffmpeg进行实际抓取。 我决定每秒最多抓取一帧,然后将视频秒总数除以四,得出10k秒(10k帧)。 在确定要isWithinSuturingSegment()哪几秒钟之后,我进行了一项快速测试,以查看特定的第二秒是在标注为缝合的线段之内还是之外isWithinSuturingSegment()下面的代码中的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分钟的时间,然后花了一个小时左右的时间对Inception进行重新培训,以使其能够以90%的精度识别缝合。 我用不是来自训练集的新数据进行了抽查,并正确识别了我尝试过的每一帧(平均置信度得分:88%,中值置信度得分:91%)。

这是我的抽查。 (警告:包含血液和胆量图像的链接。)

图片 不缝合分数 缝合分数
Not-Suturing-01.jpg 0.71053 0.28947
Not-Suturing-02.jpg 0.94890 0.05110
Not-Suturing-03.jpg 0.99825 0.00175
Suturing-01.jpg 0.08392 0.91608
Suturing-02.jpg 0.08851 0.91149
Suturing-03.jpg 0.18495 0.81505

如何使用TensorBoard

可视化内幕中发生的事情并与他人进行交流至少对于深度学习而言与在任何其他类型的软件中一样困难。 TensorBoard进行救援!

Retrain.py 部分的 Retrain.py自动生成TensorBoard用于生成表示再培训期间发生的情况的图形的文件。

要设置TensorBoard,请在运行retrain.py之后在容器内运行以下retrain.py



   
   
pip install tensorboard
tensorboard --logdir /tmp/retrain_logs

观看输出并在浏览器中打开打印的URL。



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

您会看到以下内容:

我希望这个能帮上忙; 如果没有,您至少要展示一些很酷的东西。 在重新训练过程中,我发现在“标量”选项卡下查看准确度如何提高,而随着执行更多的训练步骤则交叉熵降低则很有帮助。 这就是我们想要的。

学到更多

如果您想了解更多信息,请浏览以下资源:

  • 皮特·沃登(Pete Warden)出色的诗人TensorFlow是使用Inception进行迁移学习的不错的,完全实用的方法,但是其中的一些链接已断开。 本分步教程是最新的,并且分解很方便。
  • 有关更多代码和更深入的解释,请尝试在tensorflow.org上进行图像识别再培训教程。
  • 我学习时更喜欢阅读而不是观看,但是我发现视频在5分钟内构建TensorFlow图像分类器非常有用且完整。 如果您更喜欢一些无聊的东西,也许可以转向Josh Gordon的教程,例如教程。

这是我在编写本系列文章时使用的其他资源,也可能对您有所帮助:

如果您想就此话题进行聊天,请在Freenode IRC上的## tfadam话题频道浏览 。 您也可以给我发电子邮件或在下面发表评论。

没有Eva Monsen,Brian C.Lane,Rob Smith,Alex Simes,VM Brasseur,Bri Hatch和Opensource.com的编辑的大力反馈,本系列将永远不会发生。

翻译自: https://opensource.com/article/17/12/how-to-tensorboard

vis.js入门

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值