2020中国华录杯·数据湖算法大赛—定向算法赛(吸烟打电话检测)baseline-tensorflow2.3-python3.6

文章目录

  • 1.赛事背景
    • 1.主办方
    • 2.赛事介绍
  • 2.baseline
    • 2.1 文件夹结构
    • 2.2 demo
      • 1. 01_train_test_split.py
      • 2. 02_tf2_mobilev2_classes.py
      • 3. 03_predict.py
    • 3.问题及改进
    • 4.修改记录

1.赛事背景

1.主办方

  1. 赛事链接
  2. 训练集
  3. 测试集
  4. 验证集

2.赛事介绍

1. 【赛题描述】行为规范,即指某些特定的场景会对人物的行为做出特定的限制,比如加油站禁止吸烟,驾驶员禁止打电话,博物馆禁止拍照等。随着计算机人工智能的发展,这些禁止行为或者不文明行为都可通过基于视频监控的行为检测算法进行监控、发现以及适当时给与警告。本赛题基于这些数据,要求选手设计基于计算机视觉的算法,识别出其中人物抽烟和打电话的行为,难点在于数据集中人物清晰度有限,而且人物的像素大小不一,请选手合理利用技巧,尝试不同的图像算法,提升抽烟打电话行为识别的准确度。2. 【赛题任务】初赛:选手可下载数据集的一部分,设计算法并完成模型训练,输出结果要求标出图片中人物的三种行为:抽烟,打电话,正常(即没有抽烟或者打电话的行人);复赛:选手可下载包含初赛数据集在内的全量数据,请选手利用增量数据优化初赛的算法,提升输出结果的准确性;较初赛不同的是,复赛数据集中有少量的既抽烟又打电话的人员图像,输出结构要求标出图片中人物的四种行为:抽烟,打电话,抽烟&打电话,正常。    决赛:参赛队伍现场答辩,确认最终获奖名单。

在这里插入图片描述

2.baseline

2.1 文件夹结构

  1. 1.初始文件结构

在这里插入图片描述

  1. 2.最终文件夹结构
    在这里插入图片描述

2.2 demo

1. 01_train_test_split.py

"""
https://blog.csdn.net/u010420283/article/details/90142480
将包含三个类别文件夹的训练集划分为训练集+验证集,比例自定(此处20%)
"""
# coding=utf-8
import os, random, shutildef moveFile(fileDir):pathDir = os.listdir(fileDir)  # 取图片的原始路径filenumber = len(pathDir)picknumber = int(filenumber * ratio)  # 按照rate比例从文件夹中取一定数量图片sample = random.sample(pathDir, picknumber)  # 随机选取picknumber数量的样本图片for name in sample:shutil.move(os.path.join(fileDir, name), os.path.join(tarDir, name))returnif __name__ == '__main__':ori_path = r'C:\Users\hjz\python-project\project\03_smoking_calling\data\train'  # 最开始train的文件夹路径split_Dir = r'C:\Users\hjz\python-project\project\03_smoking_calling\data\val'  # 移动到新的文件夹路径ratio = 0.2  # 抽取比例for firstPath in os.listdir(ori_path):fileDir = os.path.join(ori_path, firstPath)  # 原图片文件夹路径tarDir = os.path.join(split_Dir, firstPath)  # val下子文件夹名字if not os.path.exists(tarDir):  # 如果val下没有子文件夹,就创建os.makedirs(tarDir)moveFile(fileDir)  # 从每个子类别开始逐个划分

2. 02_tf2_mobilev2_classes.py

# 1.导入包
import matplotlib.pyplot as plt
import numpy as np
import os
import tensorflow as tffrom tensorflow.keras.preprocessing import image_dataset_from_directory# # 2.加载数据train_normal = r"C:\Users\hjz\python-project\project\03_smoking_calling\data\train\normal"
train_phone = r"C:\Users\hjz\python-project\project\03_smoking_calling\data\train\phone"
train_smoke = r"C:\Users\hjz\python-project\project\03_smoking_calling\data\train\smoke"train_dir = r"C:\Users\hjz\python-project\project\03_smoking_calling\data\train"val_dir = r"C:\Users\hjz\python-project\project\03_smoking_calling\data\val"#验证集用01_train_test_splict.py生成
val_normal = r"C:\Users\hjz\python-project\project\03_smoking_calling\data\val\normal"
val_phone = r"C:\Users\hjz\python-project\project\03_smoking_calling\data\val\phone"
val_smoke = r"C:\Users\hjz\python-project\project\03_smoking_calling\data\val\smoke"test_dir = r"C:\Users\hjz\python-project\project\03_smoking_calling\data\test"#测试集是需要我们预测结果train_normal_num = len(os.listdir(train_normal))
train_phone_num = len(os.listdir(train_phone))
train_smoke_num = len(os.listdir(train_smoke))val_normal_num = len(os.listdir(val_normal))
val_phone_num = len(os.listdir(val_phone))
val_smoke_num = len(os.listdir(val_smoke))train_all = train_normal_num + train_phone_num + train_smoke_num
val_all = val_normal_num + val_phone_num + val_smoke_numtest_num = len(os.listdir(test_dir))print("train normal number: ", train_normal_num)
print("train phone_num: ", train_phone_num)
print("train_smoke_num: ", train_smoke_num)
print("all train images: ", train_all)print("val normal number: ", val_normal_num)
print("val phone_num: ", val_phone_num)
print("val_smoke_num: ", val_smoke_num)
print("all val images: ", val_all)print("all test images: ", test_num)# 3.设置超参数
batch_size = 32
epochs = 500
height = 150
width = 150# 4. 数据预处理
# 图像数据预处理需要做以下工作:
#  从磁盘读入图像数据
#  解码图像内容并转成合适的格式
#  将其转换成浮点张量
#  将数值从0至255归一化到0至1之间的数值
# train_generator = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1.0 / 255)
# test_generator = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1.0 / 255)
#
# train_data_gen = train_generator.flow_from_directory(batch_size=batch_size,
#                                                      directory=train_dir,
#                                                      shuffle=True,
#                                                      target_size=(height, width),
#                                                      class_mode="categorical")
# test_data_gen = test_generator.flow_from_directory(batch_size=batch_size,
#                                                        directorst_dir,y=te
#                                                        target_size=(height,width),
#                                                    class_mode="categorical")
#
# # 5.数据图像可视化
#
# # sample_training_images, _ = next(train_data_gen)
# #
# # def plotImages(images_arr):
# #     fig, axes = plt.subplots(1, 5, figsize=(20, 20))
# #     axes = axes.flatten()
# #     for img, ax in zip(images_arr, axes):
# #         ax.imshow(img)
# #         ax.axis("off")
# #     plt.tight_layout()
# #     plt.show()
# #
# # plotImages(sample_training_images[:5])
#
#
#
# # 6. 模型构建
# model = tf.keras.Sequential([
#     tf.keras.layers.Conv2D(16, 3, padding="same", activation="relu", input_shape=(height, width, 3)),
#     tf.keras.layers.MaxPooling2D(),  # 默认池化核为2*2
#     tf.keras.layers.Conv2D(32, 3, padding="same", activation="relu"),
#     tf.keras.layers.MaxPooling2D(),
#     tf.keras.layers.Conv2D(64, 3, padding="same", activation="relu"),
#     tf.keras.layers.MaxPooling2D(),
#     tf.keras.layers.Flatten(),
#     tf.keras.layers.Dense(512, activation="relu"),
#     tf.keras.layers.Dense(3)#三分类
# ])
#
# model.compile(optimizer=tf.keras.optimizers.Adam(),
#               loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True),
#               metrics=['acc'])
#
# model.summary()
#
# # 7.训练模型
# history = model.fit_generator(train_data_gen,
#                              steps_per_epoch=train_all//batch_size,
#                              epochs=epochs,
#                              validation_data=test_data_gen,
#                              validation_steps=test_all//batch_size)# # 下面尝试数据增强和dropout:
# 8.数据增强
image_gen_train = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1. / 255,rotation_range=45,#旋转角度width_shift_range=.15,height_shift_range=.15,horizontal_flip=True,#水平翻转zoom_range=0.5 #放大操作)train_data_gen = image_gen_train.flow_from_directory(batch_size=batch_size,directory=train_dir,shuffle=True,target_size=(height, width),class_mode="categorical")#sparseimage_gen_val = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255)val_data_gen = image_gen_val.flow_from_directory(batch_size=batch_size,directory=val_dir,target_size=(height,width),class_mode="categorical")# 10. 模型中加入Dropout
model_new = tf.keras.Sequential([tf.keras.layers.Conv2D(16, 3, padding="same", activation="relu", input_shape=(height, width, 3)),tf.keras.layers.MaxPooling2D(),  # 默认池化核为2*2tf.keras.layers.Dropout(0.2),tf.keras.layers.Conv2D(32, 3, padding="same", activation="relu"),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Conv2D(64, 3, padding="same", activation="relu"),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Dropout(0.2),tf.keras.layers.Flatten(),tf.keras.layers.Dense(512, activation="relu"),tf.keras.layers.Dense(3,activation="softmax")# 3分类,得到softmax预测值类似【0.4,0.3,0.3】
])
#keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08)
model_new.compile(optimizer="adam",loss=tf.keras.losses.CategoricalCrossentropy(from_logits=False),#多分类损失metrics=["accuracy"])model_new.summary()callback = tf.keras.callbacks.EarlyStopping(monitor='val_accuracy', min_delta=0.0001,patience=5
)# 在文件名中包含 epoch (使用 `str.format`)
checkpoint_path = "saved_model/best.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)# 创建一个回调,每 5 个 epochs 保存模型的权重
cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path,verbose=1,save_weights_only=False,save_best_only=True)
# # 使用 `checkpoint_path` 格式保存权重
# model_new.save_weights(checkpoint_path.format(epoch=0))logdir = "./model"
tb_callback = tf.keras.callbacks.TensorBoard(log_dir=logdir), #log_dir将输出的日志保存在所要保存的路径中log_callback = tf.keras.callbacks.CSVLogger("training_log", separator=',', append=False
)
history_new = model_new.fit_generator(train_data_gen,steps_per_epoch=train_all//batch_size,epochs=epochs,validation_data=val_data_gen,validation_steps=val_all//batch_size,callbacks=[callback,cp_callback,tb_callback,log_callback])# # 11. 结果可视化
# accuracy = history_new.history["accuracy"]
# val_accuracy = history_new.history["val_accuracy"]
# loss = history_new.history["loss"]
# val_loss = history_new.history["val_loss"]
#
# epochs_range = range(epochs)
#
# plt.figure(figsize=(8, 8))
# plt.subplot(1, 2, 1)
# plt.plot(epochs_range, accuracy, label="Training Accuracy")
# plt.plot(epochs_range, val_accuracy, label="Validation Accuracy")
# plt.legend()
# plt.title("Training and Validation Accuracy")
#
# plt.subplot(1, 2, 2)
# plt.plot(epochs_range, loss, label="Training Loss")
# plt.plot(epochs_range, val_loss, label="Validation Loss")
# plt.legend()
# plt.title("Training and Validation Loss")
# plt.show()# 12 保存模型
# 12.1手动保存权重
# model_new.save_weights('./checkpoints/my_checkpoint')# 12.2保存整个模型
model_new.save('saved_model/model_2')
print("保存新模型成功!")
# new_model = tf.keras.models.load_model('saved_model/my_model')
# # 检查其架构
# new_model.summary()# 12.3 HDF5 格式
# '.h5' 扩展名指示应将模型保存到 HDF5。# model.save('my_model.h5')
train normal number:  1915
train phone_num:  1768
train_smoke_num:  1238
all train images:  4921
val normal number:  478
val phone_num:  442
val_smoke_num:  309
all val images:  1229
all test images:  1500
Found 4921 images belonging to 3 classes.
Found 1229 images belonging to 3 classes.
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 150, 150, 16)      448       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 75, 75, 16)        0         
_________________________________________________________________
dropout (Dropout)            (None, 75, 75, 16)        0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 75, 75, 32)        4640      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 37, 37, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 37, 37, 64)        18496     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 18, 18, 64)        0         
_________________________________________________________________
dropout_1 (Dropout)          (None, 18, 18, 64)        0         
_________________________________________________________________
flatten (Flatten)            (None, 20736)             0         
_________________________________________________________________
dense (Dense)                (None, 512)               10617344  
_________________________________________________________________
dense_1 (Dense)              (None, 3)                 1539      
=================================================================
Total params: 10,642,467
Trainable params: 10,642,467
Non-trainable params: 0
_________________________________________________________________
Epoch 1/1019/2460 [..............................] - ETA: 6:38 - loss: 1.6014 - accuracy: 0.3947
Epoch 5/5002460/2460 [==============================] - ETA: 0s - loss: 0.9556 - accuracy: 0.5471
Epoch 00005: saving model to saved_model\cp-0005.ckpt........
Process finished with exit code -1

3. 03_predict.py

""""
加载模型,预测,并生成json结果
"""
import cv2
import tensorflow as tf
import numpy as npfrom tensorflow import keras
import os
import json
from keras.preprocessing import imagemodel = tf.keras.models.load_model('saved_model/model_2')
# batch_size=2
height = 150
width = 150train_path = r"C:\Users\hjz\python-project\project\03_smoking_calling\02_tf2_somking_calling\data\train"
#
train_ds = tf.keras.preprocessing.image_dataset_from_directory(train_path,image_size=(height,width),)
class_names = train_ds.class_names
print(class_names)from tqdm import tqdm
submission = []test_base = './data/test'
test_data = []for img in os.listdir(test_base):pt = os.path.join(test_base, img)new_pt = os.path.join('./data/test/', img)test_data.append(new_pt)# print(new_pt)
print('test_num:', len(test_data))labels = sorted(os.listdir('./data/train'))
print(labels)for im_pt in tqdm(test_data):value = {"image_name": None, "category": None, "score": None}img = keras.preprocessing.image.load_img(im_pt, target_size=(height, width))img_array = keras.preprocessing.image.img_to_array(img)img_array = tf.expand_dims(img_array, 0)  # Create a batchpredictions = model.predict(img_array)score = predictions[0]value['category'] = class_names[np.argmax(score)]value['score'] = str(np.max(score))value['image_name'] = im_pt.split('/')[-1]submission.append(value)with open('result.json', 'w') as f:json.dump(submission, f)print('done')

在这里插入图片描述

3.问题及改进

 1. 模型太简单,需要换用resnet,efficientNet等网络2. 未调参

4.修改记录


1.修改标签名字以符合递交要求;
2.tf2.1不好找资料改为tf2.3(有官网资料)
3.预测分数大部分为1,改下编译时指标:model_new.compile(optimizer="adam",loss=tf.keras.losses.CategoricalCrossentropy(from_logits=False),#多分类损失metrics=["CategoricalAccuracy"])#accuracy,CategoricalAccuracy"
4.线上结果约为85%

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/48856.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

卷积神经网络实现表情识别

卷积神经网络实现表情识别 CNN人脸表情识别图片预处理原本效果处理后效果 图片数据集效果 CNN人脸识别创建模型归一化与数据增强创建网络 摄像头人脸识别图片识别 参考 CNN人脸表情识别 图片预处理 import dlib # 人脸识别的库dlib import numpy as np # 数据处理的库numpy…

Tensorflow 2.5 model.evaluate报错Invalid argument: required broadcastable shapes at loc(unknown)

Tensorflow 2.5使用model.evaluate进行模型评估时报错Invalid argument: required broadcastable shapes at loc unknown 1.软件环境⚙️2.问题描述🔍3.解决方法🐡4.结果预览🤔 ⚡插播一条老家自产的糖心苹果,多个品种&#xff0c…

推荐收藏!3.5万字图解 Pandas!

↓推荐关注↓ 大家好,在 Python 各个工具包中,最频繁使用的应该就是 Pandas 了。今天我以图解的方式给大家介绍 Pandas 中各种常用的操作,内容有点长,喜欢记得点赞、收藏、关注。 第一部分:Pandas 展示 请看下表: 它描…

ONLYOFFICE 文档 7.4 版本现已发布:新增绘图、雷达图、合并文档、另存为图片等功能

您现在可以使用我们最新版本的在线编辑器了,更新的功能包括:绘图、雷达图、合并文档、将某个对象或者整个文档/工作表保存为图片、更强大的编辑区域保护等等。继续阅读本文了解所有的更新。 在编辑器中绘图 尽情发挥创造力,使用画笔或荧光笔…

四十不惑-重头再来

四十不惑-重头再来 重装系统系统版本 卸载老毛桃自动安装的软件安装必备软件安装Docker DeskTop安装Docker Desktop后重启系统运行Power Shell切换环境重新运行PS DockerDesktop导入镜像启动DockeDesktop启动PS 新建容器搭建ChatGPT(pengzhile_pandora_latest_43f234c4e8a8)搭建…

大学生必备神器

大学生要掌握的办公软件因专业和工作需求而异,但是以下是一些普遍适用于大学生的办公软件,可以帮助提高学习和工作效率,今天就给大家推荐几款大学生常用的软件。 1.OneDrive 这是微软出品的云存储产品,与百度网盘有些类似&#…

北极九章CEO刘沂鑫:从自然语言一步直达数据洞察——数据驱动增长的新范式|量子位·视点分享回顾...

视点 发自 凹非寺量子位 | 公众号 QbitAI 今天,尽管人人都在谈论大数据,但数据实际价值和现有价值有巨大落差。 尽管企业采集和储存、计算数据的能力越来越强,但数据分析能力始终增长缓慢。据Forrester调研,约70%的企业数据从未被…

老胡的周刊(第089期)

老胡的信息周刊[1],记录这周我看到的有价值的信息,主要针对计算机领域,内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 🎯 项目 MOSS[2] 来自复旦大学的开源工具增强型会话语…

从网站流量指标开始,CSDN 如何洞察运营效果异动?丨评测来了

最近,CSDN组织了一次《人人都能简单上手的指标平台》开箱测评活动,邀请了三位嘉宾,分别是 Kyligence 联合创始人兼 CTO 李扬、CSDN 战略合作总监闫辉、CSDN 开发云 CTO 冯丙见。三位嘉宾根据真实的需求场景,详细评估了指标平台的最…

跟我看 Microsoft Build 2023

又是一年一度的 Microsoft Build 了,你有和我一样熬夜看了吗?如果没有,那么你就错过了一场精彩的技术盛宴。本次的 Microsoft Build ,有非常多的干货,围绕打造 Copilot 应用展开。我会将基于 Data AI 比较重要的内容列…

ChatGPT简介|人机交互的新时代|小智ai

ChatGPT丨小智ai丨chatgpt丨人工智能丨OpenAI丨聊天机器人丨AI语音助手丨GPT-3.5丨开源AI平台 导语:随着人工智能的迅猛发展,ChatGPT(Chat Generative Pre-trained Transformer)作为一种基于深度学习的自然语言处理模型&#xff0…

从春节后央行的首批罚单,看金融反欺诈反洗钱的复杂性

目录 个人信息保护的问题 征信管理的问题 反洗钱与反欺诈的问题 金融欺诈愈加复杂多变 金融机构如何增强反欺诈反洗钱 春节后,央行公示首批罚单。其中,厦门银行被中国人民银行福州中心支行给予警告,并没收违法所得767.17元,处…

2020微信对话截图生成器,各种截图一键制作!

前言 上次有朋友说想要个微商作图神器,找了几款觉得功能一般般,就没有发出来,今天又有朋友私信了,对比了这几款,选择中一款不错的给大家分享一下,软件是安卓版的,打开就是VIP,无需去登陆了,直接使用即可!嗯!拉下去看下详情介绍叭! // 软件…

呼唤正义的 AssangeDAO 众筹,会是一个骗局吗?

Jan. 2022, Sabrinafootprint.network Data Source: Footprint Analytics 目前 AssangeDAO 是JuiceBox 历史上最大的 DAO,超过了 ConstitutionDAO 的筹集。 AssangeDAO是在2021年12月10日由一群赛博朋克发起的。它累计募集了17,442.49 ETH ,所有资金都…

中国互联网众筹行业

近些年,中国互联网发展迅速,众筹这种起源于美国的新型互联网金融模式更是一直处于风口浪尖。在“大众创业、万众创新”的背景下,这种低门槛的融资模式也深受欢迎,加上阿里、京东、苏宁三大电商的巨头的相继入场,更令这…

海外众筹 | Kickstarter热门众筹项目汇总

筹集资金:$837,890(仍在筹集中) Backer数量:3,194 VELO推出了世界上第一款可在3种尺寸之间轻松切换的硬边可扩展行李箱,它可以转换为16英寸小型随身携带;22英寸中型托运行李;26英寸…

众筹平台网站

以下收录目前国内仍在正常运营的所有众筹网站: 追梦网 - 创意计划众筹平台 和点名时间一样,最早开始涉足众筹的国内网站。 觉 JUE.SO 也是有资历了,专注预售500年。 EMIE,亿觅创意网 这个网站转型了,似乎离众筹已经越来越远。 众筹…

python生成dat文件_基于Python的DTMF信号识别

前言 我这标题起得怎么这么像课程论文呢…… 啊,放心啦,这不是课程论文,这只是一个有趣(且值钱)的程序。 起因是这样的。我加了几个软件兼职群,前几天我发现其中有一个项目,是利用FFT识别信号啥的,报价700,性价比对于我来说我觉得挺高的了,看样子好像也不难,我就接了…

他是程序员出身,做了一款最遭人“恨”的App,挑战张小龙!

????????关注后回复 “进群” ,拉你进程序员交流群???????? 作者丨流水不争先 来源丨技术领导力(ID:jishulingdaoli) “嘀嘀,嘀嘀”,无论何时何地,打工人最怕听到的声音,就是钉钉的消息提示…

《周鸿祎自述:我的互联网方法论》---- 读书笔记

文章大纲 第一章 欢迎来到互联网时代第二章 互联网里的用户至上第三章 颠覆式创新第四章 免费时代第五章 体验为王第六章 互联网方法论附录 周鸿祎批注“遗失的乔布斯访谈” 周鸿祎个人简介: 周鸿祎这个人比较有争议,如果不是他,中国互联网的…