原题目:牛!Python 也可以完成图象姿势鉴别溺水个人行为了!
创作者 | 李秋键
责编 | Carol
封图 | CSDN 免费下载自视觉效果我国
大家都知道伴随着人力智能化智能化的发展趋势,人力智能化的落地式新项目也在越来越越来越越大,特别是在是测算机视觉效果层面。
最先图象归类是依据各有在图象信息内容中常体现的不一样特点,把不一样类型的总体目标区别起来的图象解决方式。
它是运用测算机对图象开展定量分析剖析,把图象或图象中的每一个像元或地区划入为多个个类型中的某一种,以替代人的视觉效果判读。
胡芦岛网站建设
这儿总体程序的步骤以下:
CNN互联网完成图象归类 依据归类結果可视性化輸出結果
最后輸出的程序实际效果以下图:
一、试验前的提前准备
最先大家应用的python版本号是3.6.5常用到的控制模块以下:
configparser :配备文档控制模块 读写能力配备文档
keras:用于训炼和启用神经系统互联网实体模型
素材图片提前准备
最先大家提前准备不一样的照片放进一个特殊文档夹下。照片分成三个类型,一个是溺水照片文档夹,一个是一切正常游水照片文档夹,另外一个是疑是溺水没法判断的照片文档夹。在这里里大家把它放进data文档夹下,
在其中疑是照片文档夹,以下图由此可见:
身体姿势鉴别构建
1、姿势配备文档设置:
在这里里以便充足的精密度和便捷启用,大家应用百度搜索出示的身体剖析插口。依照官方网的要求设置了配备文档。关键便是设置身体每个身体零件联接配备。
其相匹配的编码以下:
def draw_line(self, img):
# nose --- neck
cv2.line(img, (int(self.dic[ 'nose'][ 'x']), int(self.dic[ 'nose'][ 'y'])),
(int(self.dic[ 'neck'][ 'x']), int(self.dic[ 'neck'][ 'y'])), (0, 255, 0), 2)
# neck -- left_shoulder
cv2.line(img, (int(self.dic[ 'neck'][ 'x']), int(self.dic[ 'neck'][ 'y'])),
(int(self.dic[ 'left_shoulder'][ 'x']), int(self.dic[ 'left_shoulder'][ 'y'])), (0, 255, 0), 2)
# neck -- right_shoulder
cv2.line(img, (int(self.dic[ 'neck'][ 'x']), int(self.dic[ 'neck'][ 'y'])),
(int(self.dic[ 'right_shoulder'][ 'x']), int(self.dic[ 'right_shoulder'][ 'y'])), (0, 255, 0), 2)
# left _shoulder -- left_elbow
cv2.line(img, (int(self.dic[ 'left_shoulder'][ 'x']), int(self.dic[ 'left_shoulder'][ 'y'])),
(int(self.dic[ 'left_elbow'][ 'x']), int(self.dic[ 'left_elbow'][ 'y'])), (0, 255, 0), 2)
# left _elbow -- left_wrist
cv2.line(img, (int(self.dic[ 'left_elbow'][ 'x']), int(self.dic[ 'left_elbow'][ 'y'])),
(int(self.dic[ 'left_wrist'][ 'x']), int(self.dic[ 'left_wrist'][ 'y'])), (0, 255, 0), 2)
# right _shoulder -- right_elbow
cv2.line(img, (int(self.dic[ 'right_shoulder'][ 'x']), int(self.dic[ 'right_shoulder'][ 'y'])),
(int(self.dic[ 'right_elbow'][ 'x']), int(self.dic[ 'right_elbow'][ 'y'])), (0, 255, 0), 2)
# right _elbow -- right_wrist
cv2.line(img, (int(self.dic[ 'right_elbow'][ 'x']), int(self.dic[ 'right_elbow'][ 'y'])),
(int(self.dic[ 'right_wrist'][ 'x']), int(self.dic[ 'right_wrist'][ 'y'])), (0, 255, 0), 2)
# neck -- left_hip
cv2.line(img, (int(self.dic[ 'neck'][ 'x']), int(self.dic[ 'neck'][ 'y'])),
(int(self.dic[ 'left_hip'][ 'x']), int(self.dic[ 'left_hip'][ 'y'])), (0, 255, 0), 2)
# neck -- right_hip
cv2.line(img, (int(self.dic[ 'neck'][ 'x']), int(self.dic[ 'neck'][ 'y'])),
(int(self.dic[ 'right_hip'][ 'x']), int(self.dic[ 'right_hip'][ 'y'])), (0, 255, 0), 2)
# left _hip -- left_knee
cv2.line(img, (int(self.dic[ 'left_hip'][ 'x']), int(self.dic[ 'left_hip'][ 'y'])),
(int(self.dic[ 'left_knee'][ 'x']), int(self.dic[ 'left_knee'][ 'y'])), (0, 255, 0), 2)
# right _hip -- right_knee
cv2.line(img, (int(self.dic[ 'right_hip'][ 'x']), int(self.dic[ 'right_hip'][ 'y'])),
(int(self.dic[ 'right_knee'][ 'x']), int(self.dic[ 'right_knee'][ 'y'])), (0, 255, 0), 2)
# left _knee -- left_ankle
cv2.line(img, (int(self.dic[ 'left_knee'][ 'x']), int(self.dic[ 'left_knee'][ 'y'])),
(int(self.dic[ 'left_ankle'][ 'x']), int(self.dic[ 'left_ankle'][ 'y'])), (0, 255, 0), 2)
# right _knee -- right_ankle
cv2.line(img, (int(self.dic[ 'right_knee'][ 'x']), int(self.dic[ 'right_knee'][ 'y'])),
(int(self.dic[ 'right_ankle'][ 'x']), int(self.dic[ 'right_ankle'][ 'y'])), (0, 255, 0), 2)
在设定好基本的配备文档后,大家根据百度搜索申请办理的账户密匙这些启用插口就可以。这儿完成的实际效果以下:
相匹配编码以下:
classBaiDuAPI(object):
# 独特 结构涵数 原始化涵数
def__init__(self):
app_id = "20038443"
api_key = "LhtctcN7hf6VtkHHcUGwXKfw"
secret_key = "wzWACH345kE0FGhvA9CqWsiRwltf5wFE"
self.client = AipBodyAnalysis(app_id, api_key, secret_key)
""" 载入照片 """
defget_file_content(self, photoPath):
withopen(photoPath, 'rb') asfp:
returnfp.read
""" 主涵数 """
deffile_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 )
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. add(MaxPool2D(pool_size= 2,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. add(MaxPool2D(pool_size= 2, strides= 2))
model. add(Flatten) #数据信息平扁化
model. add(Dense( 128,activation= 'relu')) #搭建一个具备12八个神经系统元的全联接层
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提升器
modelpile(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, #检测集储放相对路径
target_size=(IMG_W,IMG_H), #检测集照片规格
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=test_generator, #检测集迭代更新器
validation_steps=len(test_generator) #检测集迭代更新是多少步
)
model.save( '{}.h5'.format(SAVE_PATH)) #储存实体模型
print( 'finish {} epochs!'.format(EPOCHS))
2、实体模型的启用:
编码以下:
# 加载实体模型
model = load_model( 'model_selector.h5')
label = np.array([ '一切正常', '疑是', '溺水'])
defimage_change(image):
image = image.resize(( 224, 224))
image = img_to_array(image)
image = image / 255
image = np.expand_dims(image, 0)
returnimage
classBaiDuAPI(object):
# 独特 结构涵数 原始化涵数
def__init__(self):
app_id = "20038443"
api_key = "LhtctcN7hf6VtkHHcUGwXKfw"
secret_key = "wzWACH345kE0FGhvA9CqWsiRwltf5wFE"
self.client = AipBodyAnalysis(app_id, api_key, secret_key)
""" 载入照片 """
defget_file_content(self, photoPath):
withopen(photoPath, 'rb') asfp:
returnfp.read
""" 主涵数 """
deffile_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 )
#预测分析2.jpg的結果
try:
image = load_img( "2.jpg")
#plt.imshow(image)
image = image_change(image)
baiduapi = BaiDuAPI
baiduapi.file_main( '2.jpg')
img=cv2.imread( "temp.jpg")
img_PIL = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
myfont = ImageFont.truetype( r'C:/Windows/Fonts/simfang.ttf', 40)
draw = ImageDraw.Draw(img_PIL)
draw.text(( 300, 10), label[model.predict_classes(image)][ 0], font=myfont, fill=( 200, 100, 0))
img_OpenCV = cv2.cvtColor(np.asarray(img_PIL), cv2.COLOR_RGB2BGR)
cv2.imshow( 'frame', img_OpenCV)
cv2.waitKey( 0)
except:
pass
#预测分析1.jpg的結果
try:
image = load_img( "1.jpg")
#plt.imshow(image)
image = image_change(image)
baiduapi = BaiDuAPI
baiduapi.file_main( '1.jpg')
img=cv2.imread( "temp.jpg")
img_PIL = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
myfont = ImageFont.truetype( r'C:/Windows/Fonts/simfang.ttf', 40)
draw = ImageDraw.Draw(img_PIL)
draw.text(( 300, 10), label[model.predict_classes(image)][ 0], font=myfont, fill=( 200, 100, 0))
img_OpenCV = cv2.cvtColor(np.asarray(img_PIL), cv2.COLOR_RGB2BGR)
cv2.imshow( 'frame', img_OpenCV)
cv2.waitKey( 0)
except:
pass
#预测分析3.jpg的結果
try:
image = load_img( "3.jpg")
#plt.imshow(image)
image = image_change(image)
baiduapi = BaiDuAPI
baiduapi.file_main( '3.jpg')
img=cv2.imread( "temp.jpg")
img_PIL = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
myfont = ImageFont.truetype( r'C:/Windows/Fonts/simfang.ttf', 40)
draw = ImageDraw.Draw(img_PIL)
draw.text(( 300, 10), label[model.predict_classes(image)][ 0], font=myfont, fill=( 200, 100, 0))
img_OpenCV = cv2.cvtColor(np.asarray(img_PIL), cv2.COLOR_RGB2BGR)
cv2.imshow( 'frame', img_OpenCV)
cv2.waitKey( 0)
except:
pass
最后运作程序結果以下:
源代码详细地址:
https://pan.baidu/s/1qMwPCTTyqDWPXoPj1XnKgA
获取码:us2k
创作者介绍:
李秋键,CSDNblog权威专家,CSDN达人课创作者。研究生在学于我国煤业高校,开发设计有taptap比赛得奖这些。回到凡科,查询大量
义务编写: