tensorflow object_dection API错误处理

本文针对Ubuntu环境下安装和配置TensorFlow对象检测API过程中遇到的问题提供了解决方案,包括如何正确编译Protocol Buffers并解决PIL库引起的导入错误。

Ubuntu下使用tensorflow object-detection API

https://github.com/tensorflow/models/tree/master/object_detection

https://github.com/tensorflow/models/issues/1834

https://stackoverflow.com/questions/25340698/importerror-cannot-import-name-imaging


错误1

当运行“ protoc object_detection/protos/*.proto --python_out=.",
出现
object_detection/protos/anchor_generator.proto:11:3: Expected "required", "optio nal", or "repeated".

解决办法

You need to download protoc version 3.3 (already compiled). Used protoc inside bin directory to run this command like this:
tensorflow$ mkdir protoc_3.3
tensorflow$ cd protoc_3.3
tensorflow/protoc_3.3$ wget wget https://github.com/google/protobuf/releases/download/v3.3.0/protoc-3.3.0-linux-x86_64.zip
tensorflow/protoc_3.3$ chmod 775 protoc-3.3.0-linux-x86_64.zip
tensorflow/protoc_3.3$ unzip protoc-3.3.0-linux-x86_64.zip
tensorflow/protoc_3.3$ cd ../models/
tensorflow/protoc_3.3$ /home/jy/tensorflow/protoc_3.3/bin/protoc object_detection/protos/*.proto --python_out=.


错误2  

from PIL import Image
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python3/dist-packages/PIL/Image.py", line 61, in <module>
ImportError: cannot import name _imaging
在/usr/local/lib/python2.7/dist-packages/ 目录下删除 "PIL"和 Pillow .egg 重新安装 Pillow.

如果还不行

apt-get install python-imaging

<think>我们想要在函数中保存上一次的rx值,以便与当前的rx值进行比较或其他操作。 由于函数调用结束后局部变量会被销毁,因此需要将上一次的rx值保存在静态变量中。 我们可以使用静态局部变量来保存上一次的rx值,这样每次函数调用时,该变量不会重新初始化,而是保留上次的值。 修改思路: 1. 定义一个静态局部变量(比如prev_rx)来保存上一次的rx值。 2. 在每次调用函数时,首先读取上一次保存的prev_rx(用于后续比较或处理)。 3. 然后计算当前的rx值(即代码中的rx = poe_recovery_rx_tx_dection();)。 4. 在函数返回之前,将当前的rx值保存到prev_rx中,以便下一次使用。 5. 注意:我们可能需要在第一次调用时对prev_rx进行初始化(比如初始化为一个特定值,表示还没有上一次的值)。 但是,注意代码中有一个条件:只有时间秒数是10的倍数时才计算rx。因此,我们可能希望只在计算了rx之后才更新prev_rx,并且只有在有上一次的值时才进行比较。 具体修改如下: </think>要实现循环保存当前`rx`值和上一次的`rx`值,建议使用静态变量存储历史值,同时优化时间判断逻辑。以下是推荐实现方案: ```c int update_poeRecovery_RX_state(void) { static int previous_rx = -1; // 静态变量保存上一次的rx值(初始-1表示无效) static struct timespec last_ts = {0}; // 保存上一次触发时间 struct timespec current_ts; clock_gettime(CLOCK_MONOTONIC, &current_ts); // 精确计算时间间隔(秒级) if ((current_ts.tv_sec - last_ts.tv_sec) >= 10) { last_ts = current_ts; // 更新触发时间戳 printf("[%s] 系统运行时间: %ld 秒 %ld 纳秒\n", __FUNCTION__, current_ts.tv_sec, current_ts.tv_nsec); // 保存当前值前先备份旧值 int current_rx = poe_recovery_rx_tx_dection(); // 历史值有效时才使用(首次运行previous_rx=-1跳过) if(previous_rx != -1) { // 此处添加新旧值比较/处理逻辑 printf("当前值:%d, 上次值:%d\n", current_rx, previous_rx); } // 更新历史值 previous_rx = current_rx; } return ERR_NO_ERROR; } ``` ### 关键设计说明: 1. **静态变量存储** `static int previous_rx` 持久化保存上次值,函数退出时不销毁 2. **精确时间间隔控制** 使用`last_ts`记录上次触发时间,避免`%`运算可能导致的漏检(如从9→10秒时) 3. **安全初始化** 初始值`previous_rx=-1`标识首次无历史数据,避免误用无效值 4. **值更新顺序** 先备份当前值到临时变量`current_rx`,处理完历史数据后再更新`previous_rx` 5. **纳秒级时间戳** 完整保留`tv_nsec`字段,需要更高精度时可扩展纳秒级判断
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值