本发明涉及图像识别技术领域,具体涉及一种基于自动化图像识别的动物错步行为分析方法。
背景技术:
创伤性脑损伤(traumaticbraininjury,tbi)是神经外科领域常见的急症之一,已成为全世界35岁以下青壮年人群第一位死亡和致残原因。目前,临床上尚无一种确切的药物对脑损伤肯定有效。为此,有必要实现与tbi相关的神经损伤程度的自动化、高通量的定量分析,并全面评估其对tbi后的神经保护作用,并对其潜在分子机制进行深入研究。
错步行为:指一种动物实验,把小鼠放在一张金属网格上,金属网格由四个支架支撑(类似桌子),网格下面是空的(金属网格相对于桌面),一旦小鼠的任意一只腿踏空,就表示错步。如果四只腿一直不踏空,就表示非错步。单位时间内,小鼠的错步率与其tbi损伤的严重度存在明显相关性,也可以研究潜在药物对动物tbi后的神经保护作用。
技术实现要素:
本发明要解决的技术问题是提供一种基于自动化图像识别的动物错步行为分析方法,通过机器学习、图像识别技术实现动物错步行为的自动化、高准确率的定量分析。
为解决上述技术问题,本发明的实施例提供一种基于自动化图像识别的动物错步行为分析方法,包括如下步骤:
(1)构建颅脑外伤小鼠
利用小鼠打击器制备标准化的小鼠中重度控制性皮层撞击模型,以模拟人类可重复性颅脑外伤;
(2)将步骤(1)中构建的颅脑外伤小鼠放置在网格板上,用录像机记录小鼠5min内的网格行走行为,录像结束后,生成一个视频文件,保存于录像机的sd卡内;
(3)把步骤(2)中得到的视频文件按照每秒十帧的频率输出若干张png格式的小鼠行为图片,并按照小鼠行为图片的名字与录像视频中时间的一一对应关系,为这些小鼠行为图片加上时间标签,如下所示:
out1.png,第一秒
out2.png,第一秒
…
out10.png,第一秒
out11.png,第二秒
out12.png,第二秒
…
out20.png,第二秒
以此类推;
(4)人工识别图片,包括如下步骤:
(4-1)视频回放,人工计数颅脑外伤小鼠左前肢和左后肢在网格板上行走的总步数,同时计数颅脑外伤小鼠左前肢和左后肢在网格板踏空的步数,利用式i计算错步率;
错步率=踏空率/总步数*100%式i;
(4-2)对每次踏空行为记录其始末时间点,精确到秒;
(4-2)按照步骤(3)的时间标签,若某一小鼠行为图片的时间标签落在某一次踏空行为的时间区间内,则把这一小鼠行为图片人工标记为踏空;反之,标记未不踏空;
(4-3)把标记为踏空的小鼠行为图片放入踏空文件夹,把其他小鼠行为图片放入非踏空文件夹,供后续的深度学习软件训练使用;
(5)通过机器学习程序构建小鼠踏空行为图片识别模型
把踏空文件夹和非踏空文件夹内的小鼠行为图片作为初始数据,输入机器学习模块的python训练程序,进行深度学习训练,建立小鼠踏空行为图片识别模型;
(6)基于机器学习模型的未知图像的行为识别
重复步骤(1)-(3),得到待识别小鼠行为图片,在步骤(5)建立的小鼠踏空行为图片识别模型的基础上,运行机器学习模块的python对比程序,输入待识别小鼠行为图片,根据与待识别小鼠行为图片一一对应的时间标签,由程序判断某一特定时刻颅脑外伤小鼠是否踏空,从而分析tbi条件下的小鼠网格行走行为。
其中,步骤(1)构建颅脑外伤小鼠的具体步骤为:
(1-1)密封罐内异氟醚诱导小鼠麻醉后,剪去其头顶部皮毛,俯卧位固定于kopf立体定位仪上,打开麻醉机,通过面罩持续麻醉(1.5-2%异氟醚/空气、呼吸频率65次/分钟、呼吸比1:1、潮气量3ml(毫升));
(1-2)碘伏皮肤消毒,沿头皮中线切开皮肤,用撑开器或止血钳固定头皮和筋膜,止血后用双氧水棉签分离骨膜,充分暴露颅顶骨,尤其前囟区域;
(1-3)与前囟平行,中线右侧旁开1.8mm处为中心,用牙科钻开一直径为3mm的骨窗(中心区域为额顶叶交界处的感觉运动混合皮层),充分暴露硬脑膜,并保持硬脑膜外形完整,注意止血;
(1-4)打开压缩空气推动撞击器,设定参数:撞击速度3.5m/s,撞击深度2.0mm,撞击停留时间150ms,然后撞击,及时止血;
(1-5)缝合头皮,置ivc鼠笼喂养;
(1-6)注意术后护理,将食物放入灭菌过的细胞培养皿,置于笼内,术后3天,每天早晚各注射一次糖盐水。
其中,步骤(2)中得到的视频文件格式为mp4格式。
其中,步骤(2)中所用网格板为不锈钢网格(wiregrid),每个网格为2cm*2cm的正方形小栅栏,不锈钢网格长40cm、宽40cm,距离地面50cm。
其中,步骤(3)中,将视频文件按照每秒十帧的频率输出png格式的小鼠行为图片的具体方法为:通过ffmpeg工具在基于ubuntu的pc平台实现,具体命令为ffmpeg–ivideo.mp4–fimage2–r10out%d.png,其中,video.mp4是最初录制的mp4格式的动物行为视频,最后生成的图片名为out1.png、out2.png、out3.png…。
其中,步骤(5)中,python训练程序的具体使用方法为:pythontrain_network.py--datasetimages--modelsanta_not_santa.model。
其中,步骤(6)中,python对比程序的具体使用方法为:pythontest_network.py--modelsanta_not_santa.model--imagesanta_01.png。
本发明的上述技术方案的有益效果如下:
传统的,tbi条件下动物网格行走行为,包括动物错步行为,是通过人工观察视频实现定量分析的,本发明可以实现这一分析过程的自动化,同时,在确保准确性的前提下,可以显著提高tbi条件下动物网格行走行为分析的效率,助力未来高通量地筛选潜在药物作用靶点,助力相关药物研发,可以对对tbi相关的神经损伤发挥保护作用,并高效地研究tbi相关的神经损伤机制以及潜在防治策略。
附图说明
图1为本发明的工作流程图;
图2为本发明使用的实验装置示意图;
图3为本发明中小鼠错步行为实验结果图。
附图标记说明:
1、小鼠;2、行为盒;3、录像机。
具体实施方式
为使本发明要解决的技术问题、技术方案和优点更加清楚,下面将结合附图及具体实施例进行详细描述。
本发明提供了一种基于自动化图像识别的动物错步行为分析方法,工作流程如图1所示,包括如下步骤:
(1)构建颅脑外伤小鼠
利用美国psi公司的tbi-0310小鼠打击器制备标准化的小鼠中重度控制性皮层撞击模型(controlledcorticalimpact,cci),以模拟人类可重复性颅脑外伤;
具体步骤包括:
(1-1)密封罐内异氟醚诱导c57bl/6j小鼠麻醉后,剪去其头顶部皮毛,俯卧位固定于kopf立体定位仪上,打开麻醉机,通过面罩持续麻醉(1.5-2%异氟醚/空气、呼吸频率65次/分钟、呼吸比1:1、潮气量3ml(毫升));
(1-2)碘伏皮肤消毒,沿头皮中线切开皮肤,用撑开器或止血钳固定头皮和筋膜,止血后用双氧水棉签分离骨膜,充分暴露颅顶骨,尤其前囟区域;
(1-3)与前囟平行,中线右侧旁开1.8mm处为中心,用牙科钻开一直径为3mm的骨窗(中心区域为额顶叶交界处的感觉运动混合皮层),充分暴露硬脑膜,并保持硬脑膜外形完整,注意止血;
(1-4)打开压缩空气推动撞击器,设定参数:撞击速度3.5m/s,撞击深度2.0mm,撞击停留时间150ms,然后撞击,及时止血;
(1-5)缝合头皮,置ivc鼠笼喂养;
(1-6)注意术后护理,将食物放入灭菌过的细胞培养皿,置于笼内,术后3天,每天早晚各注射一次糖盐水。
(2)将步骤(1)中构建的颅脑外伤小鼠放置在网格板上,用录像机记录小鼠5min内的网格行走行为,录像结束后,生成一个mp4格式的视频文件,保存于录像机的sd卡内;
如图2所示,网格板为不锈钢网格(wiregrid),不锈钢网格长40cm、宽40cm,距离地面50cm,其上的每个小网格为2cmx2cm的正方形小栅栏。
(3)把步骤(2)中得到的视频文件按照每秒十帧的频率输出若干张png格式的小鼠行为图片,将视频文件按照每秒十帧的频率输出png格式的图片的具体方法为:通过ffmpeg工具在基于ubuntu的pc平台实现,具体命令为ffmpeg–ivideo.mp4–fimage2–r10out%d.png,其中,video.mp4是最初录制的mp4格式的动物行为视频,最后生成的图片名为out1.png、out2.png、out3.png…;
按照小鼠行为图片的名字与录像视频中时间的一一对应关系,为这些小鼠行为图片加上时间标签,如下所示:
out1.png,第一秒
out2.png,第一秒
…
out10.png,第一秒
out11.png,第二秒
out12.png,第二秒
…
out20.png,第二秒
以此类推。
本步骤(3)中,将视频文件按照每秒十帧的频率输出png格式的小鼠行为图片的具体方法为:通过ffmpeg工具在基于ubuntu的pc平台实现,具体命令为ffmpeg–ivideo.mp4–fimage2–r10out%d.png,其中,video.mp4是最初录制的mp4格式的动物行为视频,最后生成的图片名为out1.png、out2.png、out3.png…。
(4)人工识别图片,包括如下步骤:
(4-1)视频回放,人工计数颅脑外伤小鼠左前肢和左后肢在网格板上行走的总步数,同时计数颅脑外伤小鼠左前肢和左后肢在网格板踏空的步数,利用式i计算错步率;
错步率=踏空率/总步数*100%式i;
(4-2)对每次踏空行为记录其始末时间点,精确到秒;
(4-2)按照步骤(3)的时间标签,若某一小鼠行为图片的时间标签落在某一次踏空行为的时间区间内,则把这一小鼠行为图片人工标记为踏空;反之,标记未不踏空;
(4-3)把标记为踏空的小鼠行为图片(如图3b所示)放入踏空文件夹,把其他小鼠行为图片(如图3a所示)放入非踏空文件夹,供后续的深度学习软件训练使用;
(5)通过机器学习程序构建小鼠踏空行为图片识别模型
把踏空文件夹和非踏空文件夹内的小鼠行为图片作为初始数据,输入机器学习模块的python训练程序(程序名为train_network.py),进行深度学习训练,建立小鼠踏空行为图片识别模型;
其中,python训练程序的具体使用方法为:pythontrain_network.py--datasetimages--modelsanta_not_santa.model。
train_network.py的源代码如下(以下划线标示):
#usage
#pythontrain_network.py--datasetimages--modelsanta_not_santa.model
#setthematplotlibbackendsofigurescanbesavedinthebackground
importmatplotlib
matplotlib.use("agg")
#importthenecessarypackages
fromkeras.preprocessing.imageimportimagedatagenerator
fromkeras.optimizersimportadam
fromsklearn.model_selectionimporttrain_test_split
fromkeras.preprocessing.imageimportimg_to_array
fromkeras.utilsimportto_categorical
frompyimagesearch.lenetimportlenet
fromimutilsimportpaths
importmatplotlib.pyplotasplt
importnumpyasnp
importargparse
importrandom
importcv2
importos
#constructtheargumentparseandparsethearguments
ap=argparse.argumentparser()
ap.add_argument("-d","--dataset",required=true,
help="pathtoinputdataset")
ap.add_argument("-m","--model",required=true,
help="pathtooutputmodel")
ap.add_argument("-p","--plot",type=str,default="plot.png",
help="pathtooutputloss/accuracyplot")
args=vars(ap.parse_args())
#initializethenumberofepochstotrainfor,initialearningrate,
#andbatchsize
epochs=25
init_lr=1e-3
bs=32
#initializethedataandlabels
print("[info]loadingimages...")
data=[]
labels=[]
#grabtheimagepathsandrandomlyshufflethem
imagepaths=sorted(list(paths.list_images(args["dataset"])))
random.seed(42)
random.shuffle(imagepaths)
#loopovertheinputimages
forimagepathinimagepaths:
#loadtheimage,pre-processit,andstoreitinthedatalist
image=cv2.imread(imagepath)
image=cv2.resize(image,(28,28))
image=img_to_array(image)
data.append(image)
#extracttheclasslabelfromtheimagepathandupdatethe
#labelslist
label=imagepath.split(os.path.sep)[-2]
label=1iflabel=="santa"else0
labels.append(label)
#scaletherawpixelintensitiestotherange[0,1]
data=np.array(data,dtype="float")/255.0
labels=np.array(labels)
#partitionthedataintotrainingandtestingsplitsusing75%of
#thedatafortrainingandtheremaining25%fortesting
(trainx,testx,trainy,testy)=train_test_split(data,
labels,test_size=0.25,random_state=42)
#convertthelabelsfromintegerstovectors
trainy=to_categorical(trainy,num_classes=2)
testy=to_categorical(testy,num_classes=2)
#constructtheimagegeneratorfordataaugmentation
aug=imagedatagenerator(rotation_range=30,width_shift_range=0.1,
height_shift_range=0.1,shear_range=0.2,zoom_range=0.2,
horizontal_flip=true,fill_mode="nearest")
#initializethemodel
print("[info]compilingmodel...")
model=lenet.build(width=28,height=28,depth=3,classes=2)
opt=adam(lr=init_lr,decay=init_lr/epochs)
model.compile(loss="binary_crossentropy",optimizer=opt,
metrics=["accuracy"])
#trainthenetwork
print("[info]trainingnetwork...")
h=model.fit_generator(aug.flow(trainx,trainy,batch_size=bs),validation_data=(testx,testy),steps_per_epoch=len(trainx)//bs,
epochs=epochs,verbose=1)
#savethemodeltodisk
print("[info]serializingnetwork...")
model.save(args["model"])
#plotthetraininglossandaccuracy
plt.style.use("ggplot")
plt.figure()
n=epochs
plt.plot(np.arange(0,n),h.history["loss"],label="train_loss")
plt.plot(np.arange(0,n),h.history["val_loss"],label="val_loss")
plt.plot(np.arange(0,n),h.history["acc"],label="train_acc")
plt.plot(np.arange(0,n),h.history["val_acc"],label="val_acc")
plt.title("traininglossandaccuracyonsanta/notsanta")
plt.xlabel("epoch#")
plt.ylabel("loss/accuracy")
plt.legend(loc="lowerleft")
plt.savefig(args["plot"])
。
(6)基于机器学习模型的未知图像的行为识别
重复步骤(1)-(3),得到待识别小鼠行为图片,在步骤(5)建立的小鼠踏空行为图片识别模型的基础上,运行机器学习模块的python对比程序(test_network.py),输入待识别小鼠行为图片,根据与待识别小鼠行为图片一一对应的时间标签,由程序判断某一特定时刻颅脑外伤小鼠是否踏空,从而分析tbi条件下的小鼠网格行走行为。
其中,python对比程序的具体使用方法为:pythontest_network.py--modelsanta_not_santa.model--imagesanta_01.png。
test_network.py的源代码如下(以下划线标示):
#usage
#pythontest_network.py--modelsanta_not_santa.model--imageimages/examples/santa_01.png
#importthenecessarypackages
fromkeras.preprocessing.imageimportimg_to_array
fromkeras.modelsimportload_model
importnumpyasnp
importargparse
importimutils
importcv2
#constructtheargumentparseandparsetheargumentsap=argparse.argumentparser()
ap.add_argument("-m","--model",required=true,
help="pathtotrainedmodelmodel")
ap.add_argument("-i","--image",required=true,
help="pathtoinputimage")
args=vars(ap.parse_args())
#loadtheimage
image=cv2.imread(args["image"])
orig=image.copy()
#pre-processtheimageforclassification
image=cv2.resize(image,(28,28))
image=image.astype("float")/255.0
image=img_to_array(image)
image=np.expand_dims(image,axis=0)
#loadthetrainedconvolutionalneuralnetwork
print("[info]loadingnetwork...")
model=load_model(args["model"])
#classifytheinputimage
(notsanta,santa)=model.predict(image)[0]
#buildthelabel
#label="santa"ifsanta>notsantaelse"notsanta"
#proba=santaifsanta>notsantaelsenotsanta
proba=santaifsanta>notsantaelsenotsanta
label="{}:{:.2f}%".format(label,proba*100)
print(label)
print(proba)
″′
#drawthelabelontheimage
output=imutils.resize(orig,width=400)
cv2.puttext(output,label,(10,25),cv2.font_hershey_simplex,
0.7,(0,255,0),2)
#showtheoutputimage
cv2.imshow("output",output)
cv2.waitkey(0)
″′
。
按照最初的录像总时间(以5min为例),总计3000张小鼠行为图片,按照上述图像识别模型,每张图片都被程序自动标记为踏空或不踏空,最后统计总的踏空的图片数目,即可以以自动化的方式定量描述小鼠的网格行走行为。
本发明是以小鼠作为实验对象,也可以使用其他动物。本发明的关键创新点在于建立一种基于自动化图像识别的tbi条件下动物网格行走行为分析方法,实现基于深度学习的图像识别技术引入神经生物学领域,特别是针对创伤性脑损伤的研究,整合目前已经公开、免费并且开源的软件,实现从人工观察视频分析动物网格行走行为的自动化,节省时间、人力、物力,助力未来高通量地筛选潜在药物作用靶点,助力相关药物研发,可以对tbi相关的神经损伤发挥保护作用,并高效地研究tbi相关的神经损伤机制以及潜在防治策略。
具体来说,本发明与目前的人工分析动物网格行走行为的方法的区别在于两个步骤:通过机器学习程序构建动物踏空行为图片识别模型和基于机器学习模型的未知图像识别。上述两个步骤是实现自动化(而非人工)分析tbi条件下动物网格行走行为的关键,也是本发明所述方法的主要创新点。同时,因为本发明采用最简单的基于机器学习的图像二分类技术,可以在确保总体准确性的前提下,实现高通量地筛选潜在药物作用靶点,助力相关药物研发,可以对tbi相关的神经损伤发挥保护作用,并高效地研究tbi相关的神经损伤机制以及潜在防治策略。
以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明所述原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。