CSDN|牛!Python 也能实现图像姿态识别溺水行为了!( 二 )

2、姿态识别调用:
在设置好基本的配置文件后 , 我们通过百度申请的账号密匙等等调用接口即可 。 这里实现的效果如下:
CSDN|牛!Python 也能实现图像姿态识别溺水行为了!
本文插图
对应代码如下:
class BaiDuAPI(object): # 特殊 构造函数 初始化函数 def __init__(self): app_id ="20038443" api_key = "LhtctcN7hf6VtkHHcUGwXKfw" secret_key = "wzWACH340kE0FGhvA9CqWsiRwltf5wFE" self.client = AipBodyAnalysis(app_id, api_key, secret_key) """ 读取图片 """ def get_file_content(self, photoPath): with open(photoPath, 'rb') as fp: return fp.read """ 主函数 """ def file_main(self, photoPath): img = self.get_file_content('{}'.format(photoPath)) """ 调用人体关键点识别 """ # 此处只能对一个人进行关键点识别 # 也就是说一个图片如果有好多人的话,只能标出一个人的关节特征 # 此处可以做修改,即进行把一张图所有人的关节特征都表达出来 # ------ # print(self.client.bodyAnalysis(img)) result = self.client.bodyAnalysis(img)['person_info'][0]['body_parts'] jo = joint.Joint(result) jo.xunhun(photoPath) # print(result )
CNN识别模型的建立
1、神经网络的搭建:这里设定的CNN模型挺常见的模型相似 , 通过设定卷积核、步长、训练批次等等搭建网络 。
代码如下:
model = Sequential #创建一个神经网络对象#添加一个卷积层 , 传入固定宽高三通道的图片 , 以32种不同的卷积核构建32张特征图 , # 卷积核大小为3*3 , 构建特征图比例和原图相同 , 激活函数为relu函数 。 model.add(Conv2D(input_shape=(IMG_W,IMG_H,3),filters=32,kernel_size=3,padding='same',activation='relu'))#再次构建一个卷积层model.add(Conv2D(filters=32,kernel_size=3,padding='same',activation='relu'))#构建一个池化层 , 提取特征 , 池化层的池化窗口为2*2 , 步长为2 。 model.add(MaxPool2D(pool_size=2,strides=2))#继续构建卷积层和池化层 , 区别是卷积核数量为64 。 model.add(Conv2D(filters=64,kernel_size=3,padding='same',activation='relu'))model.add(Conv2D(filters=64,kernel_size=3,padding='same',activation='relu'))model.add2,strides=2))#继续构建卷积层和池化层 , 区别是卷积核数量为128 。 model.add(Conv2D(filters=128,kernel_size=3,padding='same',activation='relu'))model.add(Conv2D(filters=128,kernel_size=3,padding='same',activation='relu'))model.add2, strides=2))model.add(Flatten) #数据扁平化model.add(Dense(128,activation='relu')) #构建一个具有128个神经元的全连接层model.add(Dense(64,activation='relu')) #构建一个具有64个神经元的全连接层model.add(Dropout(DROPOUT_RATE)) #加入dropout , 防止过拟合 。 model.add(Dense(CLASS,activation='softmax')) #输出层 , 一共3个神经元 , 对应3个分类adam = Adam(lr=LEARNING_RATE) #创建Adam优化器model.compile(optimizer=adam,loss='categorical_crossentropy',metrics=['accuracy']) #使用交叉熵代价函数 , adam优化器优化模型 , 并提取准确率train_generator = train_datagen.flow_from_directory( #设置训练集迭代器 TRAIN_PATH, #训练集存放路径 target_size=(IMG_W,IMG_H), #训练集图片尺寸 batch_size=BATCH_SIZE #训练集批次 )test_generator = test_datagen.flow_from_directory( #设置测试集迭代器 TEST_PATH, #测试集存放路径#测试集图片尺寸 batch_size=BATCH_SIZE, #测试集批次 )print(train_generator.class_indices) #打印迭代器分类try: model = load_model('{}.h5'.format(SAVE_PATH)) #尝试读取训练好的模型 , 再次训练 print('model upload,start training!')except: print('not find model,start training') #如果没有训练过的模型 , 则从头开始训练model.fit_generator( #模型拟合 train_generator, #训练集迭代器 steps_per_epoch=len(train_generator), #每个周期需要迭代多少步 epochs=EPOCHS, #迭代周期 validation_data=http://news.hoteastday.com/a/test_generator, #测试集迭代器 validation_steps=len(test_generator) #测试集迭代多少步 )model.save('{}.h5'.format(SAVE_PATH)) #保存模型print('finish {} epochs!'.format(EPOCHS))


推荐阅读