求助:int()参数类型错误排查与解决(TensorFlow1.8+OpenCV3.4.0)
问题分析与解决方案
嗨,我来帮你搞定这个错误~先给你拆解一下这个报错:
int() argument must be a string, a bytes-like object or a number, not 'NoneType'
这个错误的核心是:代码里有个地方试图把None(空值)转换成整数,但Python根本不允许这么干。结合你的代码和使用的TensorFlow 1.8、OpenCV 3.4.0环境,问题根源很明确——视频帧读取失败,导致frame变成了None,后续的模型计算环节把这个空值当成了需要处理的数值,进而触发了报错。
为什么会出现这个情况?
看你的代码,while循环里直接调用ret, frame = video.read(),但没有判断ret的状态:
- 当RTSP网络流卡顿、连接不稳定,或者视频源临时中断时,
video.read()会返回(False, None)——也就是读取失败,frame是空值。 - 之后你直接执行
np.expand_dims(frame, axis=0),把None包装成了数组,喂给TensorFlow模型后,模型内部的坐标计算、张量形状处理等操作尝试把这个None转成整数,就抛出了这个错误。
具体解决方案
给你几个针对性的修改步骤,按顺序来就行:
先检查帧读取状态,跳过无效帧
在读取帧之后立刻判断ret是否为True,如果读取失败就跳过当前循环,避免空值进入后续流程:while(True): try: ret, frame = video.read() # 新增:检查帧是否读取成功 if not ret: print("Failed to read frame, skipping this iteration...") continue # 后面的帧处理、模型推理代码保持不变 frame_expanded = np.expand_dims(frame, axis=0) (boxes, scores, classes, num) = sess.run(...) # ... 其余代码 ...添加RTSP重连机制(推荐)
因为你用的是RTSP流,很容易出现连接断开的情况,可以在读取失败时尝试重新初始化视频捕获对象:while(True): try: ret, frame = video.read() if not ret: print("Lost RTSP connection, trying to reconnect...") # 释放旧的连接 video.release() # 重新初始化VideoCapture video = cv2.VideoCapture('rtsp://10.10.10.10/h264.sdp?res=half&x0=0&y0=0&x1=1920&y1=1080&qp=20&ratelimit=10000&doublescan=0&ssn=16026') # 重新设置分辨率 video.set(3, 1280) video.set(4, 720) continue # 后续处理代码不变 # ...额外验证模型输入的有效性
为了保险起见,可以在把帧喂给模型前,再检查一下frame_expanded是否有效:frame_expanded = np.expand_dims(frame, axis=0) # 检查是否存在空值或无效数据 if frame_expanded is None or np.all(frame_expanded == 0): print("Invalid frame data, skipping detection...") continue # 再执行模型推理 (boxes, scores, classes, num) = sess.run(...)
额外调试小技巧
- 可以在读取失败时打印当前时间,方便排查是偶尔卡顿还是持续断开:
print(f"[{datetime.datetime.now()}] Failed to read frame")(记得先导入datetime模块) - 如果修改后还是偶尔报错,可以在
except块里打印更多错误详情,比如import traceback; traceback.print_exc(),这样能看到错误具体出在哪一行。
按照上面的方法修改后,应该就能解决这个NoneType转int的错误啦~
内容的提问来源于stack exchange,提问作者Anario
相关产品推荐
相关产品推荐

