前言:

关于这个比赛的介绍可以参考之前一篇文章,本节主要介绍的是模型部分。因为比赛比较冲忙只能测试InceptionResNetV2和DenseNet201的效果。比赛有点遗憾的是没有把所有的单独模型都尝试一边,比较一下效果,第二使用融合模型的时候效果不好,但是没有时间检查,第三没有尝试使用lgb或者catboost对得到的图像特征进行分类。

方案一: 使用InceptionResNetV2()在imagenet预训练好的权重,全连接层使用大小为1024和 1神经元进行分类。

import os
import numpy as np
from keras.applications import InceptionResNetV2, DenseNet201
from keras import regularizers
import keras
from sklearn.model_selection import train_test_split
from keras.models import Model
from keras.preprocessing import image
import warnings
warnings.filterwarnings('ignore')train_no_rec_path = '../A_model/my_all_train/00'
no_rec_path_list = os.listdir(train_no_rec_path)
len_no_rec = len(no_rec_path_list)
print('len_no_rec:', len_no_rec)train_rec_path = '../A_model/my_all_train/10'
rec_path_list = os.listdir(train_rec_path)
len_rec = len(rec_path_list)
print('len_rec:', len_rec)all_data_len = len_rec + len_no_rec
print('all_data_len:', all_data_len)img_size = 224
label = np.array([0] * len_no_rec + [1] * len_rec)
data = np.zeros((all_data_len, img_size, img_size, 3), dtype=np.uint8)bad_image = 0
print('读取不可回收的垃圾信息!!!!!!!!!')for i, name in enumerate(no_rec_path_list):img = image.load_img(os.path.join(train_no_rec_path, name), target_size=(img_size, img_size))if img is None:print('不可回收垃圾中%s不可读取' % (os.path.join(train_no_rec_path, name)))continuedata[i] = image.img_to_array(img)train_rec_path = '../Dataset/tianyi/all_train/10'
rec_path_list = os.listdir(train_rec_path)
for i, name in enumerate(rec_path_list):img = image.load_img(os.path.join(train_rec_path, name), target_size=(img_size, img_size))if img is None:print('可回收垃圾中%s不可读'%(os.path.join(train_rec_path, name)))continuedata[i + len_no_rec] = image.img_to_array(img)# 以下部分是模型的训练部分
X_train, X_val, y_train, y_val = train_test_split(data, label, shuffle=True, test_size=0.1, random_state=2019)
print('X_train, y_train:', X_train.shape, y_train.shape)
model_Dense = InceptionResNetV2(input_shape=(224, 224, 3), weights='imagenet', include_top=False)x = model_Dense.output
print('model_Dense.output的形状是:', x.shape)x = keras.layers.GlobalMaxPool2D()(x)
print('经过全局最大此话层之后的形状:', x.shape)
x = keras.layers.Dense(1024, kernel_regularizer=regularizers.l2(0.001), activation='relu')(x)
x = keras.layers.Dropout(0.2)(x)
y = keras.layers.Dense(1, activation='sigmoid')(x)model_1 = Model(inputs=model_Dense.input, outputs=y)
model_1.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
model_1.fit(x=X_train, y=y_train, batch_size=16, epochs=5, validation_data=(X_val, y_val), verbose=1000, shuffle=True)print('..............正在保存单个模型..................')
model_1.save('model/New_Try_Train_For_loadimage.h5')

方案二:

使用InceptionResNetV2和DenseNet201得到图像的中间特征,最后将两个特征进行拼接,放到全连接层进行分类。

# -*- coding: utf-8 -*-
# @Time    : 2019/8/13 21:34
# @Author  : YYLin
# @Email   : 854280599@qq.com
# @File    : ronghemoxing_for_new_dataset.py
# 本版本使用 InceptionResNetV2和DenseNet201两个模型进行融合
# 首先是使用预训练好的模型得到图像的隐层特征 然后将隐层特征进行拼接放到模型之中
# 该模型使用load_image()读取图像
import os, h5py
import numpy as np
from keras.layers import Lambda, Input
from keras.applications import InceptionResNetV2, DenseNet201
from keras import regularizers
import keras
from sklearn.model_selection import train_test_split
from keras.models import Model
from keras.preprocessing import image
import pandas as pd
import warnings
warnings.filterwarnings('ignore')# 读取不可回收的垃圾
train_no_rec_path = 'data/my_all_train/00'
no_rec_path_list = os.listdir(train_no_rec_path)
len_no_rec = len(no_rec_path_list)
print('len_no_rec:', len_no_rec)# 读取可回收的垃圾
train_rec_path = 'data/my_all_train/10'
rec_path_list = os.listdir(train_rec_path)
len_rec = len(rec_path_list)
print('len_rec:', len_rec)all_data_len = len_rec + len_no_rec
print('all_data_len:', all_data_len)img_size = 224
label = np.array([0] * len_no_rec + [1] * len_rec)
data = np.zeros((all_data_len, img_size, img_size, 3), dtype=np.uint8)# 数据的返回是0-255 没有将其转化成0-1之间
for i, name in enumerate(no_rec_path_list):img = image.load_img(os.path.join(train_no_rec_path, name), target_size=(img_size, img_size))if img is None:print('不可回收垃圾中%s不可读取' % (os.path.join(train_no_rec_path, name)))continuedata[i] = image.img_to_array(img)# 读取的是可回收的垃圾
for i, name in enumerate(rec_path_list):img = image.load_img(os.path.join(train_rec_path, name), target_size=(img_size, img_size))if img is None:print('可回收垃圾中%s不可读'%(os.path.join(train_rec_path, name)))continuedata[i + len_no_rec] = image.img_to_array(img)# 对于测试集中的图像信息 也是需要通过model.predict()得到最后的预测结果
test_path = 'data/Test_B/test'
file_list = os.listdir(test_path)
tests = []
for i, file in enumerate(file_list):img = image.load_img(os.path.join(test_path, file), target_size=(img_size, img_size))if img is None:print('可回收垃圾中%s不可读' % (os.path.join(train_rec_path, file)))continueimg = image.img_to_array(img)tests.append(img)
test = np.array(tests)# 开始定义自己的训练模型
def gener_fea(model, preprocess=None, name=''):x = Input((img_size, img_size, 3))if preprocess:x = Lambda(preprocess)(x)base_model = model(input_tensor=x, weights='imagenet', include_top=False, pooling='avg')train_fea = base_model.predict(data, batch_size=32)test_fea = base_model.predict(test, batch_size=32)# 如果文件不存在的话 则将数据写入到模型之中if os.path.exists("../A_model/%s.h5" % (name)):print("../A_model/%s.h5" % (name), '已存在,不执行写操作')else:with h5py.File("../A_model/%s.h5" % (name), 'w') as f:print('正在保存数据../A_model/%s' % (name))f.create_dataset('train', data=train_fea)f.create_dataset('test', data=test_fea)return train_fea, test_fea# 使用 DenseNet201 和 InceptionResNetV2 预测结果
Den_201_train, Den_201_test = gener_fea(DenseNet201,  name='DenseNet201')
print('DenseNet201:', Den_201_train.shape, Den_201_test.shape)
Incep_Res_train, Incep_Res_test = gener_fea(InceptionResNetV2,  name='InceptionResNetV2')
print('InceptionResNetV2:', Incep_Res_train.shape, Incep_Res_test.shape)train = np.concatenate((Den_201_train, Incep_Res_train), axis=1)
test_for_result = np.concatenate((Den_201_test, Incep_Res_test), axis=1)# 对数据集进行分裂 一部分作为训练集 一部分作为验证集
X_train, X_val, y_train, y_val = train_test_split(train, label, shuffle=True, test_size=0.2, random_state=2019)# 以下是模型的输入输出部分
inputs = Input((train.shape[1],))
x = inputs
x = keras.layers.Dense(1024, kernel_regularizer=regularizers.l2(0.001), activation='relu')(x)
x = keras.layers.Dropout(0.5)(x)
y = keras.layers.Dense(1, activation='sigmoid')(x)# 以下是模型的训练部分
model_fusion = Model(inputs=inputs, outputs=y, name='Fusion')
model_fusion.compile(loss='binary_crossentropy', optimizer='adadelta', metrics=['accuracy'])
model_fusion.summary()
model_fusion.fit(x=X_train, y=y_train, batch_size=32, epochs=50, validation_data=(X_val, y_val), verbose=1)
model_fusion.save('model/My_Multi_Model_for_B.h5')df_test = pd.read_csv('submission_sample_for_test_B.csv')
pred_sam = model_fusion.predict(test_for_result)df_sub = pd.concat([df_test['pic_id'], pd.Series(y)], axis=1)
df_sub.columns = ['pic_id', 'pred']
df_sub.to_csv('DenseNet201_InceptionResNetV2_baseline.csv', index=False)

“添翼杯”人工智能创新应用大赛垃圾分类之模型部分相关推荐

  1. “添翼杯”人工智能创新应用大赛之垃圾分类

    前言: 前一段时间参加了一个关于"添翼杯"人工智能创新应用大赛,题目要求是给你一张图像要你预测这个张图像属于可回收垃圾的概率,本质也就是一个图像二分类问题.简单记录一下比赛之中的经 ...

  2. 图像分类竞赛——添翼杯人工智能应用创新大赛——rank4解决方案

    添翼杯人工智能应用创新大赛--环保赛道 题目分析: 数据分布: 正.负样本比基本一致 图像长宽比分布在1-1.5 成绩: 初赛a榜:0.97989318 (排名:10) 初赛b榜:0.97814671 ...

  3. 华为云杯”2020人工智能创新应用大赛总结与分析

    华为云杯"2020人工智能创新应用大赛总结与分析 目录 赛题背景 数据简介与评判指标 数据分析 数据概览与初步分析 数据增强 模型设计与训练 基本结构 BackBone选取 Loss选取 优 ...

  4. “华为云杯”2019人工智能创新应用大赛(图像分类比赛)总结记录

    最近参加了"华为云杯"2019人工智能创新应用大赛,是一个图像分类的比赛,最终准确率0.972,大概排50多/732.但决赛取前20名,遗憾败北(第20名的准确率是0.982). ...

  5. 跬智信息(Kyligence)荣获浦东新区人工智能创新应用大赛一等奖

    近日,2022 浦东新区人工智能创新应用大赛圆满闭幕.经过层层筛选和考核,跬智信息(Kyligence)从 113 支团队中脱颖而出,参赛项目"Byzer 面向 Data+AI 的低代码开源 ...

  6. 华为云人工智能大赛·垃圾分类挑战杯

    建议去GitHub上看(已增加新的tricks和代码),所有代码以上传至github:garbage_classify 前言 本文介绍的分类方式可能比较繁琐,因为它是采用华为云比赛的提交模式进行的.简 ...

  7. 关于计算机科技创新的大赛举办时间,关于举办大余县2018年青少年科技创新大赛的通知...

    为贯彻落实<全民科学素质行动计划纲要>,培养广大中小学生的科技创新精神和实践能力,提高全县科技辅导员队伍的科学素质和辅导技能,推进我县科技教育事业蓬勃发展,经研究,决定联合举办大余县201 ...

  8. AI英特尔杯公开课:2019.06.27在线直播《研究生人工智能创新大赛—AI赋能,创新引领》课堂笔记和感悟(二)

    AI英特尔杯公开课:2019.06.27在线直播<研究生人工智能创新大赛-AI赋能,创新引领>课堂笔记和感悟(二) 导读      讲解总体不错,知识点比较基础,适合入门,各种主流框架都有 ...

  9. AI英特尔杯公开课:2019.06.27在线直播《研究生人工智能创新大赛—AI赋能,创新引领》课堂笔记和感悟(一)

    AI英特尔杯公开课:2019.06.27在线直播<研究生人工智能创新大赛-AI赋能,创新引领>课堂笔记和感悟(一) 导读      讲解总体不错,知识点比较基础,适合入门,各种主流框架都有 ...

最新文章

  1. BannerDemo【图片轮播图控件】
  2. linux 子网和广播地址异常
  3. Oracle数据库之事务
  4. 会话创建过程-创建Executor
  5. 程序员过关斩将-- 喷一喷坑爹的面向UI编程
  6. 已知一个掺杂了多个数字字符的中文名拼音,去掉所有数字字符之后,形式为“名”+空格+“姓”;并且名和姓的首字母大写,其他小写,要求输出姓名全拼,且全为小写。(后附详细样例说明)
  7. 散分,并如何判断时间段上有重叠冲突。
  8. Java注解的Retention和RetentionPolicy
  9. cocos2d-x之读取plist文件
  10. Java redis
  11. raspberry pi_如何进行Raspberry Pi聚会
  12. 深度学习——初识TensorFlow
  13. 此文已删除,为何删不掉?
  14. 一文读懂量化系统接入及相关平台
  15. 各大快递电子面单---Api接口(顺丰、快递鸟、菜鸟)
  16. 电子电路学习笔记(7)——LED发光二极管限流电阻计算
  17. 儿童吹泡泡水简单配方_吹泡泡溶液配方大集合吹泡泡溶液最佳配方
  18. rem移动端设计方案
  19. 免费使用chatgpt的网站集合:
  20. HTML链接CSS的三种方法

热门文章

  1. java程序两点之间最短路径算法_java 最短路径算法 如何实现有向 任意两点的最短路径...
  2. 漏电开关跳闸,把火线和零线对换就不跳了,这是什么原因?
  3. 机器学习实例--预测美国人口收入状况
  4. python实验四_实验四 · Python程序设计/20193117whm - Gitee.com
  5. 固定资产管理条码系统是什么
  6. Matlab机器人工具箱(3-4):五自由度机械臂(计算力矩控制方法与roblocks)
  7. 注意力模型直观理解(Attention Model Intuition)
  8. opencv-python给图片添加半透明mask
  9. 我的世界java海边种子_我的世界:超稀有种子推荐,开局海边别墅+村庄,这个地图我爱了...
  10. Oracle SQL 高版本相关