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的教程,例如本教程。
这是我在编写本系列文章时使用的其他资源,也可能对您有所帮助:
- 本系列中使用的原始和派生源代码
- 使用TensorFlow和Raspberry Pi的3个很棒的机器学习项目
- 使用TensorFlow创建一个简单的图像分类器
- 即用型TensorFlow示例
- TensorBoard演示和提示视频(来自TensorBoard:可视化学习 )
- 斯坦福大学的CS 20SI:用于深度学习研究的TensorFlow课程( 教学大纲和GitHub )
- 访问未暴露的容器端口
-
docker inspect tensorflow | grep --max-count=1 '\bIPAddress'
-
- 使用TensorFlow,Inception和Raspberry Pi第1 部分和第2 部分进行连续的在线视频分类
- 使用Inception网络进行多标签图像分类
- 递归神经网络的不合理有效性
- TensorFlow for Poets 2:面向移动设备进行优化 (及其GitHub存储库 )
如果您想就此话题进行聊天,请在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入门