<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>僵死 &#8211; 编码无悔 /  Intent &amp; Focused</title>
	<atom:link href="https://www.codelast.com/tag/%E5%83%B5%E6%AD%BB/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.codelast.com</link>
	<description>最优化之路</description>
	<lastBuildDate>Mon, 27 Apr 2020 17:55:57 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>[原创] 执行ELL的demo程序cntkDemo.py时程序僵死的问题</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9b-%e6%89%a7%e8%a1%8cell%e7%9a%84demo%e7%a8%8b%e5%ba%8fcntkdemo-py%e6%97%b6%e7%a8%8b%e5%ba%8f%e5%83%b5%e6%ad%bb%e7%9a%84%e9%97%ae%e9%a2%98/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9b-%e6%89%a7%e8%a1%8cell%e7%9a%84demo%e7%a8%8b%e5%ba%8fcntkdemo-py%e6%97%b6%e7%a8%8b%e5%ba%8f%e5%83%b5%e6%ad%bb%e7%9a%84%e9%97%ae%e9%a2%98/#respond</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Thu, 20 Jul 2017 17:38:28 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[cntkDemo.py]]></category>
		<category><![CDATA[ELL]]></category>
		<category><![CDATA[Embedded Learning Library]]></category>
		<category><![CDATA[僵死]]></category>
		<guid isPermaLink="false">https://www.codelast.com/?p=9594</guid>

					<description><![CDATA[<p>
OS：Ubuntu 14.04</p>
<p>在台式机上执行ELL的demo程序&#160;cntkDemo.py 时，可能会遇到程序僵死的问题。<br />
cntkDemo.py 这个程序会调用OpenCV，在一个GUI窗口中显示USB摄像头拍摄的实时视频流，而僵死的现象正是：执行到弹出GUI窗口显示摄像头拍摄的视频流的代码的时候，程序进入僵死状态，不能执行后续逻辑。此时，只能Ctrl+C终止掉程序。<br />
<span id="more-9594"></span><br />
我的Ubuntu 14.04是一台老爷机，性能非常差，我觉得这有可能程序僵死的原因之一？我试了几次都是这样，于是我打算换一个思路来跑这个demo，不再纠结于解决窗口僵死的问题。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">https://www.codelast.com/</span></a><br />
先来看一下原版的 cntkDemo.py 部分代码：</p>
<pre style="margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 0.9333em; line-height: 1.5em; font-family: Consolas, &#34;Lucida Console&#34;, &#34;DejaVu Sans Mono&#34;, Monaco, &#34;Courier New&#34;, monospace; background: rgb(0, 34, 64); color: rgb(255, 255, 255);">
    <span style="color: rgb(255, 157, 0);">while</span> (<span style="color: rgb(255, 98, 140);">True</span>):
        <span style="color: rgb(0, 136, 255); font-style: italic;"><span style="color: rgb(225, 239, 255);">#</span> Grab next frame</span>
        ret, frame <span style="color: rgb(255, 157, 0);">=</span> <span style="color: rgb(255, 238, 128);">cap.read<span style="color: rgb(225, 239, 255);">(</span><span style="color: rgb(225, 239, 255);">)</span></span>

        <span style="color: rgb(0, 136, 255); font-style: italic;"><span style="color: rgb(225, 239, 255);">#</span> Prepare the image to send to the model.</span>
        <span style="color: rgb(0, 136, 255); font-style: italic;"><span style="color: rgb(225, 239, 255);">#</span> This involves scaling to the required input dimension and re-ordering from BGR to RGB</span>
        data <span style="color: rgb(255, 157, 0);">=</span> <span style="color: rgb(255, 238, 128);">helper.prepare_image_for_predictor</span></pre>&#8230; <a href="https://www.codelast.com/%e5%8e%9f%e5%88%9b-%e6%89%a7%e8%a1%8cell%e7%9a%84demo%e7%a8%8b%e5%ba%8fcntkdemo-py%e6%97%b6%e7%a8%8b%e5%ba%8f%e5%83%b5%e6%ad%bb%e7%9a%84%e9%97%ae%e9%a2%98/" class="read-more">Read More </a>]]></description>
										<content:encoded><![CDATA[<p>
OS：Ubuntu 14.04</p>
<p>在台式机上执行ELL的demo程序&nbsp;cntkDemo.py 时，可能会遇到程序僵死的问题。<br />
cntkDemo.py 这个程序会调用OpenCV，在一个GUI窗口中显示USB摄像头拍摄的实时视频流，而僵死的现象正是：执行到弹出GUI窗口显示摄像头拍摄的视频流的代码的时候，程序进入僵死状态，不能执行后续逻辑。此时，只能Ctrl+C终止掉程序。<br />
<span id="more-9594"></span><br />
我的Ubuntu 14.04是一台老爷机，性能非常差，我觉得这有可能程序僵死的原因之一？我试了几次都是这样，于是我打算换一个思路来跑这个demo，不再纠结于解决窗口僵死的问题。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">https://www.codelast.com/</span></a><br />
先来看一下原版的 cntkDemo.py 部分代码：</p>
<pre style="margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 0.9333em; line-height: 1.5em; font-family: Consolas, &quot;Lucida Console&quot;, &quot;DejaVu Sans Mono&quot;, Monaco, &quot;Courier New&quot;, monospace; background: rgb(0, 34, 64); color: rgb(255, 255, 255);">
    <span style="color: rgb(255, 157, 0);">while</span> (<span style="color: rgb(255, 98, 140);">True</span>):
        <span style="color: rgb(0, 136, 255); font-style: italic;"><span style="color: rgb(225, 239, 255);">#</span> Grab next frame</span>
        ret, frame <span style="color: rgb(255, 157, 0);">=</span> <span style="color: rgb(255, 238, 128);">cap.read<span style="color: rgb(225, 239, 255);">(</span><span style="color: rgb(225, 239, 255);">)</span></span>

        <span style="color: rgb(0, 136, 255); font-style: italic;"><span style="color: rgb(225, 239, 255);">#</span> Prepare the image to send to the model.</span>
        <span style="color: rgb(0, 136, 255); font-style: italic;"><span style="color: rgb(225, 239, 255);">#</span> This involves scaling to the required input dimension and re-ordering from BGR to RGB</span>
        data <span style="color: rgb(255, 157, 0);">=</span> <span style="color: rgb(255, 238, 128);">helper.prepare_image_for_predictor<span style="color: rgb(225, 239, 255);">(</span>frame<span style="color: rgb(225, 239, 255);">)</span></span>

        <span style="color: rgb(0, 136, 255); font-style: italic;"><span style="color: rgb(225, 239, 255);">#</span> Get the model to classify the image, by returning a list of probabilities for the classes it can detect</span>
        predictions <span style="color: rgb(255, 157, 0);">=</span> <span style="color: rgb(255, 238, 128);">model.Predict<span style="color: rgb(225, 239, 255);">(</span>data<span style="color: rgb(225, 239, 255);">)</span></span>

        <span style="color: rgb(0, 136, 255); font-style: italic;"><span style="color: rgb(225, 239, 255);">#</span> Get the (at most) top 5 predictions that meet our threshold. This is returned as a list of tuples,</span>
        <span style="color: rgb(0, 136, 255); font-style: italic;"><span style="color: rgb(225, 239, 255);">#</span> each with the text label and the prediction score.</span>
        top5 <span style="color: rgb(255, 157, 0);">=</span> <span style="color: rgb(255, 238, 128);">helper.get_top_n<span style="color: rgb(225, 239, 255);">(</span>predictions, <span style="color: rgb(255, 98, 140);">5</span><span style="color: rgb(225, 239, 255);">)</span></span>

        <span style="color: rgb(0, 136, 255); font-style: italic;"><span style="color: rgb(225, 239, 255);">#</span> Turn the top5 into a text string to display</span>
        text <span style="color: rgb(255, 157, 0);">=</span> <span style="color: rgb(58, 217, 0);">&quot;</span><span style="color: rgb(58, 217, 0);">&quot;</span>.<span style="color: rgb(255, 238, 128);">join<span style="color: rgb(225, 239, 255);">(</span><span style="color: rgb(225, 239, 255);">[</span><span style="color: rgb(128, 255, 187);">str</span><span style="color: rgb(225, 239, 255);">(</span>element<span style="color: rgb(225, 239, 255);">[</span><span style="color: rgb(255, 98, 140);">0</span><span style="color: rgb(225, 239, 255);">]</span><span style="color: rgb(225, 239, 255);">)</span> <span style="color: rgb(255, 157, 0);">+</span> <span style="color: rgb(58, 217, 0);">&quot;</span>(<span style="color: rgb(58, 217, 0);">&quot;</span> <span style="color: rgb(255, 157, 0);">+</span> <span style="color: rgb(128, 255, 187);">str</span><span style="color: rgb(225, 239, 255);">(</span><span style="color: rgb(128, 255, 187);">int</span><span style="color: rgb(225, 239, 255);">(</span><span style="color: rgb(255, 98, 140);">100</span><span style="color: rgb(255, 157, 0);">*</span>element<span style="color: rgb(225, 239, 255);">[</span><span style="color: rgb(255, 98, 140);">1</span><span style="color: rgb(225, 239, 255);">]</span><span style="color: rgb(225, 239, 255);">)</span><span style="color: rgb(225, 239, 255);">)</span> <span style="color: rgb(255, 157, 0);">+</span> <span style="color: rgb(58, 217, 0);">&quot;</span>%)  <span style="color: rgb(58, 217, 0);">&quot;</span> <span style="color: rgb(255, 157, 0);">for</span> element <span style="color: rgb(255, 157, 0);">in</span> top5<span style="color: rgb(225, 239, 255);">]</span><span style="color: rgb(225, 239, 255);">)</span></span>

        <span style="color: rgb(0, 136, 255); font-style: italic;"><span style="color: rgb(225, 239, 255);">#</span> Draw the text on the frame</span>
        frameToShow <span style="color: rgb(255, 157, 0);">=</span> frame
        <span style="color: rgb(255, 238, 128);">helper.draw_label<span style="color: rgb(225, 239, 255);">(</span>frameToShow, text<span style="color: rgb(225, 239, 255);">)</span></span>
        <span style="color: rgb(255, 238, 128);">helper.draw_fps<span style="color: rgb(225, 239, 255);">(</span>frameToShow<span style="color: rgb(225, 239, 255);">)</span></span>

        <span style="color: rgb(0, 136, 255); font-style: italic;"><span style="color: rgb(225, 239, 255);">#</span> Show the new frame</span>
        <span style="color: rgb(255, 238, 128);">cv2.imshow<span style="color: rgb(225, 239, 255);">(</span><span style="color: rgb(58, 217, 0);">&#39;</span>frame<span style="color: rgb(58, 217, 0);">&#39;</span>, frameToShow<span style="color: rgb(225, 239, 255);">)</span></span>

        <span style="color: rgb(0, 136, 255); font-style: italic;"><span style="color: rgb(225, 239, 255);">#</span> Wait for Esc key</span>
        <span style="color: rgb(255, 157, 0);">if</span> <span style="color: rgb(255, 238, 128);">cv2.waitKey<span style="color: rgb(225, 239, 255);">(</span><span style="color: rgb(255, 98, 140);">1</span><span style="color: rgb(225, 239, 255);">)</span></span> <span style="color: rgb(255, 157, 0);">&amp;</span> <span style="color: rgb(255, 98, 140);">0xFF</span> <span style="color: rgb(255, 157, 0);">==</span> <span style="color: rgb(255, 98, 140);">27</span>:
            <span style="color: rgb(255, 157, 0);">break</span></pre>
<p>
这段代码的注释非常清晰，它的功能是：在一个无限循环中，不断地去抓取USB摄像头拍摄的一帧图像，然后用model预测其分类及概率，最后再把预测结果叠加显示在GUI窗口中，类似于下面这样：<br />
<img decoding="async" alt="ELL coffee mug" src="https://www.codelast.com/wp-content/uploads/2020/04/ell_coffee_mug.jpg" style="width: 500px; height: 399px;" /><br />
既然 cntkDemo.py 主要是为了测试model能不能正常跑，那么我在命令行以文字形式显示预测结果也是一样的啊，没有必要非得在GUI窗口中展示。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">https://www.codelast.com/</span></a><br />
于是我把程序改成了下面这样（完整程序）：</p>
<pre style="margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 0.9333em; line-height: 1.5em; font-family: Consolas, &quot;Lucida Console&quot;, &quot;DejaVu Sans Mono&quot;, Monaco, &quot;Courier New&quot;, monospace; background: rgb(0, 34, 64); color: rgb(255, 255, 255);">
<span style="color: rgb(255, 157, 0);">import</span> sys
<span style="color: rgb(255, 157, 0);">import</span> os
<span style="color: rgb(255, 157, 0);">import</span> numpy <span style="color: rgb(255, 157, 0);">as</span> np
<span style="color: rgb(255, 157, 0);">import</span> cv2
<span style="color: rgb(255, 157, 0);">import</span> time

<span style="color: rgb(255, 157, 0);">import</span> findEll
<span style="color: rgb(255, 157, 0);">import</span> cntk_to_ell
<span style="color: rgb(255, 157, 0);">import</span> modelHelper <span style="color: rgb(255, 157, 0);">as</span> mh

<span style="color: rgb(255, 238, 128);">def</span> <span style="color: rgb(255, 221, 0);">get_ell_predictor</span><span style="color: rgb(225, 239, 255);">(</span><span style="color: rgb(204, 204, 204);">modelConfig</span><span style="color: rgb(225, 239, 255);">)</span><span style="color: rgb(225, 239, 255);">:</span>
    <span style="color: rgb(58, 217, 0);">&quot;&quot;&quot;</span>Imports a model and returns an ELL.Predictor.<span style="color: rgb(58, 217, 0);">&quot;&quot;&quot;</span>
    <span style="color: rgb(255, 157, 0);">return</span> <span style="color: rgb(255, 238, 128);">cntk_to_ell.predictor_from_cntk_model<span style="color: rgb(225, 239, 255);">(</span>modelConfig.model_files<span style="color: rgb(225, 239, 255);">[</span><span style="color: rgb(255, 98, 140);">0</span><span style="color: rgb(225, 239, 255);">]</span><span style="color: rgb(225, 239, 255);">)</span></span>

<span style="color: rgb(255, 238, 128);">def</span> <span style="color: rgb(255, 221, 0);">main</span><span style="color: rgb(225, 239, 255);">(</span><span style="color: rgb(225, 239, 255);">)</span><span style="color: rgb(225, 239, 255);">:</span>

    <span style="color: rgb(255, 157, 0);">if</span> (<span style="color: rgb(255, 157, 0);">not</span> <span style="color: rgb(255, 238, 128);">os.path.exists<span style="color: rgb(225, 239, 255);">(</span><span style="color: rgb(58, 217, 0);">&#39;</span>VGG16_ImageNet_Caffe.model<span style="color: rgb(58, 217, 0);">&#39;</span><span style="color: rgb(225, 239, 255);">)</span></span>):
        <span style="color: rgb(255, 157, 0);">print</span>(<span style="color: rgb(58, 217, 0);">&quot;</span>Please download the &#39;VGG16_ImageNet_Caffe.model&#39; file, see README.md<span style="color: rgb(58, 217, 0);">&quot;</span>)
        <span style="color: rgb(255, 238, 128);">sys.exit<span style="color: rgb(225, 239, 255);">(</span><span style="color: rgb(255, 98, 140);">1</span><span style="color: rgb(225, 239, 255);">)</span></span>
        
    <span style="color: rgb(0, 136, 255); font-style: italic;"><span style="color: rgb(225, 239, 255);">#</span> ModelConfig for VGG16 model from CNTK Model Gallery</span>
    <span style="color: rgb(0, 136, 255); font-style: italic;"><span style="color: rgb(225, 239, 255);">#</span> Follow the instructions in README.md to download the model if you intend to use it.</span>
    helper <span style="color: rgb(255, 157, 0);">=</span> <span style="color: rgb(255, 238, 128);">mh.ModelHelper<span style="color: rgb(225, 239, 255);">(</span><span style="color: rgb(58, 217, 0);">&quot;</span>VGG16ImageNet<span style="color: rgb(58, 217, 0);">&quot;</span>, <span style="color: rgb(225, 239, 255);">[</span><span style="color: rgb(58, 217, 0);">&quot;</span>VGG16_ImageNet_Caffe.model<span style="color: rgb(58, 217, 0);">&quot;</span><span style="color: rgb(225, 239, 255);">]</span>, <span style="color: rgb(58, 217, 0);">&quot;</span>cntkVgg16ImageNetLabels.txt<span style="color: rgb(58, 217, 0);">&quot;</span>, <span style="color: rgb(204, 204, 204);">scaleFactor</span><span style="color: rgb(255, 157, 0);">=</span><span style="color: rgb(255, 98, 140);">1.0</span><span style="color: rgb(225, 239, 255);">)</span></span>

    <span style="color: rgb(0, 136, 255); font-style: italic;"><span style="color: rgb(225, 239, 255);">#</span> Import the model</span>
    model <span style="color: rgb(255, 157, 0);">=</span> <span style="color: rgb(255, 238, 128);">get_ell_predictor<span style="color: rgb(225, 239, 255);">(</span>helper<span style="color: rgb(225, 239, 255);">)</span></span>

    <span style="color: rgb(0, 136, 255); font-style: italic;"><span style="color: rgb(225, 239, 255);">#</span> Save the model</span>
    <span style="color: rgb(255, 238, 128);">helper.save_ell_predictor_to_file<span style="color: rgb(225, 239, 255);">(</span>model, <span style="color: rgb(58, 217, 0);">&quot;</span>vgg16ImageNet.map<span style="color: rgb(58, 217, 0);">&quot;</span><span style="color: rgb(225, 239, 255);">)</span></span>

    camera <span style="color: rgb(255, 157, 0);">=</span> <span style="color: rgb(255, 98, 140);">0</span>
    <span style="color: rgb(255, 157, 0);">if</span> (<span style="color: rgb(255, 238, 128);"><span style="color: rgb(255, 176, 84);">len</span><span style="color: rgb(225, 239, 255);">(</span>sys.argv<span style="color: rgb(225, 239, 255);">)</span></span> <span style="color: rgb(255, 157, 0);">&gt;</span> <span style="color: rgb(255, 98, 140);">1</span>):
        camera <span style="color: rgb(255, 157, 0);">=</span> <span style="color: rgb(255, 238, 128);"><span style="color: rgb(128, 255, 187);">int</span><span style="color: rgb(225, 239, 255);">(</span>sys.argv<span style="color: rgb(225, 239, 255);">[</span><span style="color: rgb(255, 98, 140);">1</span><span style="color: rgb(225, 239, 255);">]</span><span style="color: rgb(225, 239, 255);">)</span></span> 

    <span style="color: rgb(0, 136, 255); font-style: italic;"><span style="color: rgb(225, 239, 255);">#</span> Start video capture device</span>
    cap <span style="color: rgb(255, 157, 0);">=</span> <span style="color: rgb(255, 238, 128);">cv2.VideoCapture<span style="color: rgb(225, 239, 255);">(</span>camera<span style="color: rgb(225, 239, 255);">)</span></span>

    <span style="color: rgb(255, 157, 0);">while</span> (<span style="color: rgb(255, 98, 140);">True</span>):
        <span style="color: rgb(255, 157, 0);">print</span>(<span style="color: rgb(58, 217, 0);">&#39;</span>Read a frame from camera...<span style="color: rgb(58, 217, 0);">&#39;</span>)
        ret, frame <span style="color: rgb(255, 157, 0);">=</span> <span style="color: rgb(255, 238, 128);">cap.read<span style="color: rgb(225, 239, 255);">(</span><span style="color: rgb(225, 239, 255);">)</span></span>

        <span style="color: rgb(0, 136, 255); font-style: italic;"><span style="color: rgb(225, 239, 255);">#</span> Prepare the image to send to the model.</span>
        <span style="color: rgb(0, 136, 255); font-style: italic;"><span style="color: rgb(225, 239, 255);">#</span> This involves scaling to the required input dimension and re-ordering from BGR to RGB</span>
        data <span style="color: rgb(255, 157, 0);">=</span> <span style="color: rgb(255, 238, 128);">helper.prepare_image_for_predictor<span style="color: rgb(225, 239, 255);">(</span>frame<span style="color: rgb(225, 239, 255);">)</span></span>

        <span style="color: rgb(0, 136, 255); font-style: italic;"><span style="color: rgb(225, 239, 255);">#</span> Get the model to classify the image, by returning a list of probabilities for the classes it can detect</span>
        predictions <span style="color: rgb(255, 157, 0);">=</span> <span style="color: rgb(255, 238, 128);">model.Predict<span style="color: rgb(225, 239, 255);">(</span>data<span style="color: rgb(225, 239, 255);">)</span></span>

        <span style="color: rgb(0, 136, 255); font-style: italic;"><span style="color: rgb(225, 239, 255);">#</span> Get the (at most) top 5 predictions that meet our threshold. This is returned as a list of tuples,</span>
        <span style="color: rgb(0, 136, 255); font-style: italic;"><span style="color: rgb(225, 239, 255);">#</span> each with the text label and the prediction score.</span>
        top5 <span style="color: rgb(255, 157, 0);">=</span> <span style="color: rgb(255, 238, 128);">helper.get_top_n<span style="color: rgb(225, 239, 255);">(</span>predictions, <span style="color: rgb(255, 98, 140);">5</span><span style="color: rgb(225, 239, 255);">)</span></span>

        <span style="color: rgb(0, 136, 255); font-style: italic;"><span style="color: rgb(225, 239, 255);">#</span> Turn the top5 into a text string to display</span>
        text <span style="color: rgb(255, 157, 0);">=</span> <span style="color: rgb(58, 217, 0);">&quot;</span><span style="color: rgb(58, 217, 0);">&quot;</span>.<span style="color: rgb(255, 238, 128);">join<span style="color: rgb(225, 239, 255);">(</span><span style="color: rgb(225, 239, 255);">[</span><span style="color: rgb(128, 255, 187);">str</span><span style="color: rgb(225, 239, 255);">(</span>element<span style="color: rgb(225, 239, 255);">[</span><span style="color: rgb(255, 98, 140);">0</span><span style="color: rgb(225, 239, 255);">]</span><span style="color: rgb(225, 239, 255);">)</span> <span style="color: rgb(255, 157, 0);">+</span> <span style="color: rgb(58, 217, 0);">&quot;</span>(<span style="color: rgb(58, 217, 0);">&quot;</span> <span style="color: rgb(255, 157, 0);">+</span> <span style="color: rgb(128, 255, 187);">str</span><span style="color: rgb(225, 239, 255);">(</span><span style="color: rgb(128, 255, 187);">int</span><span style="color: rgb(225, 239, 255);">(</span><span style="color: rgb(255, 98, 140);">100</span><span style="color: rgb(255, 157, 0);">*</span>element<span style="color: rgb(225, 239, 255);">[</span><span style="color: rgb(255, 98, 140);">1</span><span style="color: rgb(225, 239, 255);">]</span><span style="color: rgb(225, 239, 255);">)</span><span style="color: rgb(225, 239, 255);">)</span> <span style="color: rgb(255, 157, 0);">+</span> <span style="color: rgb(58, 217, 0);">&quot;</span>%)  <span style="color: rgb(58, 217, 0);">&quot;</span> <span style="color: rgb(255, 157, 0);">for</span> element <span style="color: rgb(255, 157, 0);">in</span> top5<span style="color: rgb(225, 239, 255);">]</span><span style="color: rgb(225, 239, 255);">)</span></span>

        <span style="color: rgb(0, 136, 255); font-style: italic;"><span style="color: rgb(225, 239, 255);">#</span> Output the text on command line</span>
        <span style="color: rgb(255, 157, 0);">print</span>(text)

<span style="color: rgb(255, 157, 0);">if</span> <span style="color: rgb(128, 255, 187);">__name__</span> <span style="color: rgb(255, 157, 0);">==</span> <span style="color: rgb(58, 217, 0);">&quot;</span>__main__<span style="color: rgb(58, 217, 0);">&quot;</span>:
    <span style="color: rgb(255, 238, 128);">main<span style="color: rgb(225, 239, 255);">(</span><span style="color: rgb(225, 239, 255);">)</span></span></pre>
<p>
其中最关键的是，不再用&nbsp;cv2.imshow() 的方式来弹出GUI窗口，而是用 print(text) 的方式把结果打印到command line。<br />
经过实测，在我的老爷机上这个程序就完全不会僵死了。此时，你把摄像头对准哪个物体，它拍摄的就是哪个物体的图像，model也就是对这个物体的图像进行分类预测。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">https://www.codelast.com/</span></a><br />
下面是我的一次test的command line输出：</p>
<blockquote>
<div>
		OpenBLAS : Your OS does not support AVX instructions. OpenBLAS is using Nehalem kernels as a fallback, which may give poorer performance.</div>
<div>
		Read a frame from camera, time 1</div>
<div>
		Frame 1 saved to disk</div>
<div>
		Read a frame from camera, time 2</div>
<div>
		Frame 2 saved to disk</div>
<div>
		Read a frame from camera, time 3</div>
<div>
		Frame 3 saved to disk</div>
<div>
		Read a frame from camera, time 4</div>
<div>
		Frame 4 saved to disk</div>
<div>
		Read a frame from camera, time 5</div>
<div>
		Frame 5 saved to disk</div>
<div>
		Loading...</div>
<div>
		Selected CPU as the process wide default device.</div>
<div>
		&nbsp;</div>
<div>
		Finished loading.</div>
<div>
		Pre-processing...</div>
<div>
		&nbsp;</div>
<div>
		Will not process Dropout - skipping this layer as irrelevant.</div>
<div>
		&nbsp;</div>
<div>
		Will not process Dropout - skipping this layer as irrelevant.</div>
<div>
		&nbsp;</div>
<div>
		Will not process Combine - skipping this layer as irrelevant.</div>
<div>
		Convolution : &nbsp;226x226x3 &nbsp;-&gt; &nbsp;224x224x64 | padding &nbsp;1</div>
<div>
		ReLU : &nbsp;224x224x64 &nbsp;-&gt; &nbsp;226x226x64 | padding &nbsp;0</div>
<div>
		Convolution : &nbsp;226x226x64 &nbsp;-&gt; &nbsp;224x224x64 | padding &nbsp;1</div>
<div>
		ReLU : &nbsp;224x224x64 &nbsp;-&gt; &nbsp;224x224x64 | padding &nbsp;0</div>
<div>
		Pooling : &nbsp;224x224x64 &nbsp;-&gt; &nbsp;114x114x64 | padding &nbsp;0</div>
<div>
		Convolution : &nbsp;114x114x64 &nbsp;-&gt; &nbsp;112x112x128 | padding &nbsp;1</div>
<div>
		ReLU : &nbsp;112x112x128 &nbsp;-&gt; &nbsp;114x114x128 | padding &nbsp;0</div>
<div>
		Convolution : &nbsp;114x114x128 &nbsp;-&gt; &nbsp;112x112x128 | padding &nbsp;1</div>
<div>
		ReLU : &nbsp;112x112x128 &nbsp;-&gt; &nbsp;112x112x128 | padding &nbsp;0</div>
<div>
		Pooling : &nbsp;112x112x128 &nbsp;-&gt; &nbsp;58x58x128 | padding &nbsp;0</div>
<div>
		Convolution : &nbsp;58x58x128 &nbsp;-&gt; &nbsp;56x56x256 | padding &nbsp;1</div>
<div>
		ReLU : &nbsp;56x56x256 &nbsp;-&gt; &nbsp;58x58x256 | padding &nbsp;0</div>
<div>
		Convolution : &nbsp;58x58x256 &nbsp;-&gt; &nbsp;56x56x256 | padding &nbsp;1</div>
<div>
		ReLU : &nbsp;56x56x256 &nbsp;-&gt; &nbsp;58x58x256 | padding &nbsp;0</div>
<div>
		Convolution : &nbsp;58x58x256 &nbsp;-&gt; &nbsp;56x56x256 | padding &nbsp;1</div>
<div>
		ReLU : &nbsp;56x56x256 &nbsp;-&gt; &nbsp;56x56x256 | padding &nbsp;0</div>
<div>
		Pooling : &nbsp;56x56x256 &nbsp;-&gt; &nbsp;30x30x256 | padding &nbsp;0</div>
<div>
		Convolution : &nbsp;30x30x256 &nbsp;-&gt; &nbsp;28x28x512 | padding &nbsp;1</div>
<div>
		ReLU : &nbsp;28x28x512 &nbsp;-&gt; &nbsp;30x30x512 | padding &nbsp;0</div>
<div>
		Convolution : &nbsp;30x30x512 &nbsp;-&gt; &nbsp;28x28x512 | padding &nbsp;1</div>
<div>
		ReLU : &nbsp;28x28x512 &nbsp;-&gt; &nbsp;30x30x512 | padding &nbsp;0</div>
<div>
		Convolution : &nbsp;30x30x512 &nbsp;-&gt; &nbsp;28x28x512 | padding &nbsp;1</div>
<div>
		ReLU : &nbsp;28x28x512 &nbsp;-&gt; &nbsp;28x28x512 | padding &nbsp;0</div>
<div>
		Pooling : &nbsp;28x28x512 &nbsp;-&gt; &nbsp;16x16x512 | padding &nbsp;0</div>
<div>
		Convolution : &nbsp;16x16x512 &nbsp;-&gt; &nbsp;14x14x512 | padding &nbsp;1</div>
<div>
		ReLU : &nbsp;14x14x512 &nbsp;-&gt; &nbsp;16x16x512 | padding &nbsp;0</div>
<div>
		Convolution : &nbsp;16x16x512 &nbsp;-&gt; &nbsp;14x14x512 | padding &nbsp;1</div>
<div>
		ReLU : &nbsp;14x14x512 &nbsp;-&gt; &nbsp;16x16x512 | padding &nbsp;0</div>
<div>
		Convolution : &nbsp;16x16x512 &nbsp;-&gt; &nbsp;14x14x512 | padding &nbsp;1</div>
<div>
		ReLU : &nbsp;14x14x512 &nbsp;-&gt; &nbsp;14x14x512 | padding &nbsp;0</div>
<div>
		Pooling : &nbsp;14x14x512 &nbsp;-&gt; &nbsp;7x7x512 | padding &nbsp;0</div>
<div>
		linear : &nbsp;7x7x512 &nbsp;-&gt; &nbsp;1x1x4096 | padding &nbsp;0</div>
<div>
		ReLU : &nbsp;1x1x4096 &nbsp;-&gt; &nbsp;1x1x4096 | padding &nbsp;0</div>
<div>
		linear : &nbsp;1x1x4096 &nbsp;-&gt; &nbsp;1x1x4096 | padding &nbsp;0</div>
<div>
		ReLU : &nbsp;1x1x4096 &nbsp;-&gt; &nbsp;1x1x4096 | padding &nbsp;0</div>
<div>
		linear : &nbsp;1x1x4096 &nbsp;-&gt; &nbsp;1x1x1000 | padding &nbsp;0</div>
<div>
		Softmax : &nbsp;1x1x1000 &nbsp;-&gt; &nbsp;1x1x1000 | padding &nbsp;0</div>
<div>
		&nbsp;</div>
<div>
		Finished pre-processing.</div>
<div>
		&nbsp;</div>
<div>
		Constructing equivalent ELL layers from CNTK...</div>
<div>
		Converting layer &nbsp;conv1_1: Convolution(data: Tensor[3,224,224]) -&gt; Tensor[64,224,224]</div>
<div>
		Converting layer &nbsp;relu1_1: ReLU(conv1_1: Tensor[64,224,224]) -&gt; Tensor[64,224,224]</div>
<div>
		Converting layer &nbsp;conv1_2: Convolution(relu1_1: Tensor[64,224,224]) -&gt; Tensor[64,224,224]</div>
<div>
		Converting layer &nbsp;relu1_2: ReLU(conv1_2: Tensor[64,224,224]) -&gt; Tensor[64,224,224]</div>
<div>
		Converting layer &nbsp;pool1: Pooling(relu1_2: Tensor[64,224,224]) -&gt; Tensor[64,112,112]</div>
<div>
		Converting layer &nbsp;conv2_1: Convolution(pool1: Tensor[64,112,112]) -&gt; Tensor[128,112,112]</div>
<div>
		Converting layer &nbsp;relu2_1: ReLU(conv2_1: Tensor[128,112,112]) -&gt; Tensor[128,112,112]</div>
<div>
		Converting layer &nbsp;conv2_2: Convolution(relu2_1: Tensor[128,112,112]) -&gt; Tensor[128,112,112]</div>
<div>
		Converting layer &nbsp;relu2_2: ReLU(conv2_2: Tensor[128,112,112]) -&gt; Tensor[128,112,112]</div>
<div>
		Converting layer &nbsp;pool2: Pooling(relu2_2: Tensor[128,112,112]) -&gt; Tensor[128,56,56]</div>
<div>
		Converting layer &nbsp;conv3_1: Convolution(pool2: Tensor[128,56,56]) -&gt; Tensor[256,56,56]</div>
<div>
		Converting layer &nbsp;relu3_1: ReLU(conv3_1: Tensor[256,56,56]) -&gt; Tensor[256,56,56]</div>
<div>
		Converting layer &nbsp;conv3_2: Convolution(relu3_1: Tensor[256,56,56]) -&gt; Tensor[256,56,56]</div>
<div>
		Converting layer &nbsp;relu3_2: ReLU(conv3_2: Tensor[256,56,56]) -&gt; Tensor[256,56,56]</div>
<div>
		Converting layer &nbsp;conv3_3: Convolution(relu3_2: Tensor[256,56,56]) -&gt; Tensor[256,56,56]</div>
<div>
		Converting layer &nbsp;relu3_3: ReLU(conv3_3: Tensor[256,56,56]) -&gt; Tensor[256,56,56]</div>
<div>
		Converting layer &nbsp;pool3: Pooling(relu3_3: Tensor[256,56,56]) -&gt; Tensor[256,28,28]</div>
<div>
		Converting layer &nbsp;conv4_1: Convolution(pool3: Tensor[256,28,28]) -&gt; Tensor[512,28,28]</div>
<div>
		Converting layer &nbsp;relu4_1: ReLU(conv4_1: Tensor[512,28,28]) -&gt; Tensor[512,28,28]</div>
<div>
		Converting layer &nbsp;conv4_2: Convolution(relu4_1: Tensor[512,28,28]) -&gt; Tensor[512,28,28]</div>
<div>
		Converting layer &nbsp;relu4_2: ReLU(conv4_2: Tensor[512,28,28]) -&gt; Tensor[512,28,28]</div>
<div>
		Converting layer &nbsp;conv4_3: Convolution(relu4_2: Tensor[512,28,28]) -&gt; Tensor[512,28,28]</div>
<div>
		Converting layer &nbsp;relu4_3: ReLU(conv4_3: Tensor[512,28,28]) -&gt; Tensor[512,28,28]</div>
<div>
		Converting layer &nbsp;pool4: Pooling(relu4_3: Tensor[512,28,28]) -&gt; Tensor[512,14,14]</div>
<div>
		Converting layer &nbsp;conv5_1: Convolution(pool4: Tensor[512,14,14]) -&gt; Tensor[512,14,14]</div>
<div>
		Converting layer &nbsp;relu5_1: ReLU(conv5_1: Tensor[512,14,14]) -&gt; Tensor[512,14,14]</div>
<div>
		Converting layer &nbsp;conv5_2: Convolution(relu5_1: Tensor[512,14,14]) -&gt; Tensor[512,14,14]</div>
<div>
		Converting layer &nbsp;relu5_2: ReLU(conv5_2: Tensor[512,14,14]) -&gt; Tensor[512,14,14]</div>
<div>
		Converting layer &nbsp;conv5_3: Convolution(relu5_2: Tensor[512,14,14]) -&gt; Tensor[512,14,14]</div>
<div>
		Converting layer &nbsp;relu5_3: ReLU(conv5_3: Tensor[512,14,14]) -&gt; Tensor[512,14,14]</div>
<div>
		Converting layer &nbsp;pool5: Pooling(relu5_3: Tensor[512,14,14]) -&gt; Tensor[512,7,7]</div>
<div>
		Converting layer &nbsp;fc6: linear(pool5: Tensor[512,7,7]) -&gt; Tensor[4096]</div>
<div>
		Converting layer &nbsp;relu6: ReLU(fc6: Tensor[4096]) -&gt; Tensor[4096]</div>
<div>
		Converting layer &nbsp;fc7: linear(drop6: Tensor[4096]) -&gt; Tensor[4096]</div>
<div>
		Converting layer &nbsp;relu7: ReLU(fc7: Tensor[4096]) -&gt; Tensor[4096]</div>
<div>
		Converting layer &nbsp;fc8: linear(drop7: Tensor[4096]) -&gt; Tensor[1000]</div>
<div>
		Converting layer &nbsp;prob: Softmax(fc8: Tensor[1000]) -&gt; Tensor[1000]</div>
<div>
		&nbsp;</div>
<div>
		...Finished constructing ELL layers.</div>
<div>
		lighter, light, igniter, ignitor(28%) &nbsp;</div>
<div>
		lighter, light, igniter, ignitor(28%) &nbsp;</div>
<div>
		&nbsp;</div>
<div>
		lighter, light, igniter, ignitor(32%) &nbsp;</div>
<div>
		lighter, light, igniter, ignitor(30%)</div>
<div>
		......</div>
</blockquote>
<div>
	有人可能会说这样做不直观，根本无法肯定摄像头当前正在拍摄的是什么东西。如果你非要看图片的话，倒是有一个折中的办法，就是用&nbsp;<span style="color:#0000ff;">cv2.imwrite(&#39;/home/codelast/current.jpg&#39;, frame)</span> 把抓取的一帧图像保存到磁盘上，然后自己去打开文件看吧。</p>
<p>	最后不得不感叹一下，我的台式机真的是太老了，跑这个demo真的很慢，没有个5分钟以上是根本没可能到开始预测的步骤的。<br />
	<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">https://www.codelast.com/</span></a><br />
	<span style="color: rgb(255, 0, 0);">➤➤</span>&nbsp;版权声明&nbsp;<span style="color: rgb(255, 0, 0);">➤➤</span>&nbsp;<br />
	转载需注明出处：<u><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><em><span style="color: rgb(0, 0, 255);"><strong style="font-size: 16px;"><span style="font-family: arial, helvetica, sans-serif;">codelast.com</span></strong></span></em></a></u>&nbsp;<br />
	感谢关注我的微信公众号（微信扫一扫）：</p>
<p style="border: 0px; font-size: 13px; margin: 0px 0px 9px; outline: 0px; padding: 0px; color: rgb(77, 77, 77);">
		<img decoding="async" alt="wechat qrcode of codelast" src="https://www.codelast.com/codelast_wechat_qr_code.jpg" style="width: 200px; height: 200px;" /></p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codelast.com/%e5%8e%9f%e5%88%9b-%e6%89%a7%e8%a1%8cell%e7%9a%84demo%e7%a8%8b%e5%ba%8fcntkdemo-py%e6%97%b6%e7%a8%8b%e5%ba%8f%e5%83%b5%e6%ad%bb%e7%9a%84%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
