(5)融合cbam的two-stream项目搭建----flask应用搭建

1、预测函数

导入rgb和flow的CBAM模型,进行预测,将二者预测结果平均法求最终预测结果返回。

def predict_action(vid,frame_count):
    
    rgb_model_path = 'checkpoint/rgb_resnet152_cbam_model_best.pth.tar'
    flow_model_path = 'checkpoint/flow_resnet152_cbam_model_best.pth.tar'
    start_frame = 0
    num_categories = 101
    
    rgb_params = torch.load(rgb_model_path ,map_location='cpu')
    
    spatial_net = rgb_resnet_cbam.rgb_resnet152_cbam(pretrained=False, num_classes=101)
    spatial_net.load_state_dict({k.replace('module.',''):v for k,v in rgb_params['state_dict'].items()})
    spatial_net.eval()
    spatial_prediction = SpatialPrediction.VideoSpatialPrediction(vid,spatial_net,num_categories,start_frame,frame_count)
    avg_spatial_pred_fc8 = np.mean(spatial_prediction, axis=1)
    #找到每列中最大数即为预测结果

	flow_params = torch.load(flow_model_path ,map_location='cpu')
	temporal_net = flow_resnet_cbam.flow_resnet152_cbam(pretrained=False, num_classes=101)
    temporal_net.load_state_dict({k.replace('module.',''):v for k,v in flow_params['state_dict'].items()})
    temporal_net.eval()
    temporal_prediction = TemporalPrediction.VideoTemporalPrediction(vid,temporal_net,num_categories,start_frame,frame_count)
    avg_temporal_pred_fc8 = np.mean(temporal_prediction, axis=1)
    
    pred_index = np.argmax((avg_temporal_pred_fc8 + avg_spatial_pred_fc8)/2)
    print('prediction done!')
    return pred_index+1
2、index转action类别

按行读取classInd.txt文件,元组形式返回index:action

def find_classes(class_file):
    f = open(class_file, "r")
    class_ind = dict()
    val_list = f.readlines()
    for line in val_list:
        line_info = line.split(" ")
        cl = line_info[0]
        action = line_info[1]
        class_ind[cl] = action
    return class_ind
3、flask搭建

flk = Flask(name)构造一个flask实体,接收静态文件static下的index.html和templates下的js文件。设置上传视频保存路径,提取帧保存路径以及上传视频的格式限制。

URL与函数绑定,’/index’返回一个网页,将本地的index.html发送给浏览器显示网页
'/predict’实现帧提取,动作识别,并将识别结果返回给浏览器,使浏览器实现动态数据变换。

def config():
    #获取当前模块名,确定该模块的根目录,接收静态静态文件static和模板文件templates的目录
    flk = Flask(__name__)
    #session秘钥配置
    flk.config['SECRET_KEY'] = 'hard to guess'
    return flk
app = config()
print(app)
app.config['JSON_AS_ASCII'] = False
UPLOAD_VID_PATH = 'video/'
GENERATE_PIC_PATH = 'static/generated'
#设置允许上传图片的格式
ALLOWED_EXTENSIONS = set(['avi', 'mp4'])

def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS

#表示传递一个网站,“/index”是网站的主目录
#从服务器上获取页面返回给浏览器
@app.route('/index', methods=["GET"])
#index()是传输给route的函数,里面返回值index.html就是显示到网页上的内容
def index():
    #创建视图函数,将模板中的index.html渲染后返回
    return render_template('index.html')

#从服务器上获取信息后GET,更新URL上的内容POST
@app.route('/predict', methods=['GET', 'POST'])
def generate_pic():
    # 从前端获取客户端上传的图片并保存下来
    ##"pic"对应前端表单name属性
    f = request.files['video']
    if not (f and allowed_file(f.filename)):
        return "请检查上传的视频类型,仅限于avi,mp4"
    #将视频保存在UPLOAD_VID_PATH目录下
    update_path = os.path.join(UPLOAD_VID_PATH, f.filename)
    f.save(update_path)
    print('{}:{}{}{}'.format('Video',f.filename,' has saved to ',update_path))
    i = random.randint(1,6)
    doc = f.filename.split('.')[0]
    #获取视频双流
    frame_count = extract.extract_rgb(update_path,GENERATE_PIC_PATH,'img_','flow_x_','flow_y_')
    #获取视频的rgb帧和flow帧路径
    path = GENERATE_PIC_PATH+'/'+doc
    #two-steam预测结果
    pred_ind = predict_action(path,frame_count)
    class_to_ind = find_classes('datasets/ucf101_splits/classInd.txt')
    i = random.randint(1,frame_count)
    rgb = '{}/{}{:05d}{}'.format(path,'img_',i,'.jpg')
    flow_x = '{}/{}{:05d}{}'.format(path,'flow_x',i,'.jpg')
    flow_y = '{}/{}{:05d}{}'.format(path,'flow_y',i,'.jpg')
    result=dict()
    result['path'] = rgb
    result['prediction'] = class_to_ind[str(pred_ind)]
    if result is not None:
        return json.dumps(result)
    return json.dumps("NONE")


if __name__ == '__main__':
	#开启服务器功能,仅本机可以访问
    http_server = WSGIServer(('127.0.0.1', 8177), app)
    http_server.serve_forever()
    print('server served!')

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
抱歉,我无法提供完整的CBAM-CNN-LSTM股票预测的Python代码,因为这涉及到一个复杂的模型架构和数据处理步骤。不过,我可以向你解释一下这个模型的主要思想和步骤,帮助你理解如何实现它。 CBAM-CNN-LSTM模型是一种结合了卷积神经网络(CNN)、循环神经网络(LSTM)和通道与空间注意力机制(CBAM)的混合模型,用于股票预测。下面是一个简单的伪代码示例,展示了CBAM-CNN-LSTM模型的主要步骤: ```python # 导入必要的库 import numpy as np import pandas as pd from keras.models import Sequential from keras.layers import LSTM, Dense, Conv1D, MaxPooling1D, GlobalAveragePooling1D # 加载和准备数据 data = pd.read_csv('stock_data.csv') # 数据预处理步骤... # 构建CBAM-CNN-LSTM模型 model = Sequential() model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(timesteps, features))) model.add(MaxPooling1D(pool_size=2)) model.add(Conv1D(filters=128, kernel_size=3, activation='relu')) model.add(MaxPooling1D(pool_size=2)) model.add(GlobalAveragePooling1D()) model.add(LSTM(units=64)) model.add(Dense(units=1, activation='sigmoid')) # 编译和训练模型 model.compile(optimizer='adam', loss='mean_squared_error') model.fit(X_train, y_train, epochs=10, batch_size=32) # 使用模型进行预测 predictions = model.predict(X_test) # 评估模型性能 # ... ``` 这只是一个简单的示例,实际应用中可能需要更复杂的数据预处理、调参等步骤。你可以根据自己的需求和数据集进行相应的修改和调整。记得根据你的数据特性,进行适当的调整和优化,以便获得更好的预测结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秃头嘤嘤魔

感谢厚爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值