摘要:本文講述的是MindSpore對籃球運動員目標的檢測應用,通過AI技術輔助對籃球賽場進行分析。
本文分享自華為雲社區《MindSpore大V博文系列:AI對籃球運動員目標的檢測》,原文作者:李銳鋒。
MindSpore作為一個端邊雲協同的開源的全場景AI框架,今年3月份開源以來,受到了發展中國家的廣泛關注和應用,歡迎大家參與開源貢獻,模型眾智合作,行業創新與應用,學術合作等,貢獻您在雲側,端側 (HiMindSpore應用程序),側向以及安全領域的應用案例。MindSpore與您在AI領域共同成長,讓AI使能千行百業,釋放出強大的性能。 MindSpore對籃球運動員目標的檢測應用,通過AI技術輔助對籃球賽場進行分析。
一、AI在籃球運動檢測方面的使用
想必大家對籃球運動都比較熟悉,在看球賽時,通過我們的肉眼看到的畫面,對賽場情況進行觀察,可以分析出一些有用的信息。現在隨着AI技術的迅速發展,通過深度學習算法也可以對籃球賽場上的畫面進行學習,然后對籃球運動員的數量、行為等提取一些有用的信息,比如:通過對球員衣服顏**分出各籃球隊的成員,也可以通過對球員的行為分析出球員正在執行什么動作以及賽場的比分等,如圖1所示為通過ModelArts平台完成推理后展示的球員信息。

圖1 深度學習推理出球員信息
那么怎么通過AI技術對籃球賽場進行分析呢,首先我們選擇AI架構是基於華為自研AI計算框架MindSpore。MindSpore提供全場景統一API,為全場景AI的模型開發、模型運行、模型部署提供端到端能力。同時,MindSpore采用端-邊-雲按需寫作分布式架構、微分原生編程新范式以及AI Native新執行模式,實現更好的資源效率、安全可信,同時降低行業AI開發門檻、釋放昇騰芯片算力,助力普惠AI。
選擇AI框架之后,我們這次選擇的網絡模型是基於MindSpore框架開發的yolov3_darknet53網絡模型。
如果你想要查看籃球運動員檢測的網絡代碼,可以訪問MindSpore社區的開源代碼,地址:https://github.com/mindspore-ai/mindspore-21-days-tutorials/tree/main/chapter4
在MindSpore開源社區也可以找到基於MindSpore框架的yolov3_darknet53網絡的源碼,使用的是coco2014數據集,參考鏈接:https ://gitee.com/mindspore/mindspore/tree/master/model_zoo/official/cv/yolov3_darknet53
以下是對該網絡模型及應用實現的詳細介紹。
二、yolo簡介
yolo(You only look once)是一種經典的單階段目標檢測算法,在16年提出了第一個版本yolov1,后面還提出了多個版本,yolov3就是第三個版本。
yolo這個算法,在不同版本均有改進之處,下面大致介紹下yolov算法的三種版本的區別和改進:
1、yolov1是將目標檢測作為回歸問題來解決,使用一個神經網絡直接從整個圖片中預測邊界框和類別概率,由於速度很快,所以可以做到實時目標檢測
2、yolov2比yolov1速度很快,並且更准,改進點比較多,如:使用了BatchNorm,讓網絡更容易擬合;使用了anchor,去除了yolov1中的全連接層;使用了維度聚類的方法及多尺度訓練等改進措施。
3、yolov3比yolov2精度會更高,不過速度會有點下降。yolov3的改進之處為:
1) 特征提取網絡采用了殘差結構,並且層數更多。
2) yolov3在3個尺度上進行檢測,依次檢測大、中、小目標。
三、yolov3網絡結構
yolov3使用的基礎網絡是用Darknet53, Darknet53是全卷積結構,如圖2所示,左邊為yolov2的Darknet19,右邊是yolov3使用的Darknet53。Darknet53去掉了所有的Maxpooling層,並增加了卷積層數。它總共有23個殘差模塊,經過5次下采樣,最后網絡輸出是網絡輸入的1/32。因為網絡加深的原因,yolov3網絡的運行速度比yolov2稍慢。
yolov3網絡結構中Conv2D block包含了5個卷積層,整個網絡結構相對簡單一些,同時,該網絡為單階段檢測方法,相對faster rcnn 要容易許多。

圖2 Darknet網絡結構
四、yolov3_darknet53在籃球運動檢測方面的實現
我們選擇的網絡模型正是上一節中介紹的yolov3_darknet53模型,數據集則是一段籃球比賽相關的數據集,使用的AI框架是華為推出的MindSpore深度學習框架。最后,使用MindSpore的API來執行網絡模型的訓練和推理工作。
1、數據准備
本次使用的數據是圖片數據,圖片可以是在球賽現場拍攝的圖片,也可以視頻中的圖片,我們這次使用的數據來源是網上下載籃球比賽相關的視頻。
視頻其實是有一幀一幀圖片連續播放實現的,所以,反過來我們從視頻中可以讀取一幀一幀的圖片,最后將圖片保存到相關目錄。由於視頻中每秒包含的視頻幀比較多,一些相鄰的圖片內容非常相似,看不出什么差異性,所以在獲取視頻幀時,適當插入時間間隔,按一定時間頻率截取視頻中的一張張圖片,這樣提取出來的圖片差異性比較大,很少有相同的圖片,這種數據的質量比較好。
生成好了數據后,還需要對數據進行標注,這個可以在華為雲的ModelArts平台上進行數據標注操作,最后將准備好的數據拷貝到相應的目錄當中,並且將數據集分成訓練數據和推理數據,供后續模型訓練和推理使用。
2、模型訓練腳本
本次模型的搭建主要是調用MindSpore的API接口,如:可以調用context.set_context()接口配置現在使用的環境,如果我們環境用的是升騰910芯片,並且采用圖模式進行訓練,則可以通過以下指令進行配置:
context.set_context(mode=context.GRAPH_MODE, device_target="Ascend")
本次模型訓練腳本,所用到的MindSpore相關接口如下所示:
import mindspore as ms import mindspore.nn as nn import mindspore.context as context from mindspore import Tensor from mindspore.nn.optim.momentum import Momentum from mindspore.train.callback import ModelCheckpoint, RunContext from mindspore.train.callback import _InternalCallbackParam, CheckpointConfig from mindspore.train.serialization import load_checkpoint, load_param_into_net
這些配置或接口的使用在MindSpore官網上的教程和API文檔都能找到詳細的說明,官網鏈接:https : //www.mindspore.cn/tutorial/training/zh-CN/master/index.htm
yolov3_darknet53網絡模型腳本的主要結構如下所示:

圖3 yolov3_darknet53網絡模型腳本結構
下面介紹下網絡結構中主要的一些腳本。
1) train.py:這是該網絡的訓練腳本,主要是配置環境參數、網絡調用、預訓練模型的調用、訓練數據集讀取、優化器配置、ckpt文件保存設置、模型訓練腳本等。在模型訓練時,需要配置一些訓練參數,這些參數可以在src目錄下的config.py文件中設置好,也可以在執行訓練命令時,將參數傳入給訓練模型,這個下面會有說明。以下是訓練腳本的部分代碼,分別是配置環境參數、網絡調用、數據集讀取、優化器配置等,僅供參考。
context.set_context(mode=context.GRAPH_MODE, enable_auto_mixed_precision=True, device_target="Ascend", save_graphs=False) network = YOLOV3DarkNet53(is_training=True) ds, data_size = create_yolo_dataset(image_dir=os.path.join(local_data_path, 'images'), anno_path=os.path.join(local_data_path, 'annotation.json'), is_training=True, batch_size=args.per_batch_size, max_epoch=args.epoch_size, device_num=args.group_size, rank=args.rank, config=config) opt = Momentum(params=get_param_groups(network), learning_rate=Tensor(lr), momentum=args.momentum, weight_decay=args.weight_decay, loss_scale=args.loss_scale)
2) eval.py:這是該網絡的推理模型,yolov3_darknet53網絡做推理時,也需要配置環境、網絡調用、推理數據集讀取、主要還需要使用網絡訓練時保存好的訓練模型、推理等,為了對推理過程的了解,需要打印一些推理過程中生成的一些日志信息。以下為實現推理過程的部分代碼,僅供參考。
context.set_context(mode=context.GRAPH_MODE, device_target="Ascend", save_graphs=False) network = YOLOV3DarkNet53(is_training=False) param_dict = load_checkpoint(local_ckpt_path) param_dict_new = {} for key, values in param_dict.items(): if key.startswith('moments.'): continue elif key.startswith('yolo_network.'): param_dict_new[key[13:]] = values else: param_dict_new[key] = values load_param_into_net(network, param_dict_new) detection = DetectionEngine(args) input_shape = Tensor(tuple(config.test_img_shape), ms.float32) for i, data in enumerate(ds.create_dict_iterator()): image = Tensor(data["image"]) image_shape = Tensor(data["image_shape"]) image_id = Tensor(data["img_id"]) prediction = network(image, input_shape) output_big, output_me, output_small = prediction output_big = output_big.asnumpy() output_me = output_me.asnumpy() output_small = output_small.asnumpy() image_id = image_id.asnumpy() image_shape = image_shape.asnumpy() detection.detect([output_small, output_me, output_big], args.per_batch_size, image_shape, image_id, config=config)
3) src目錄下主要是訓練腳本和推理腳本需要調用的一些模塊,如:yolo.py文件中主要的yolov3_darknet53網絡結構腳本、yolo_dataset.py文件是模型讀取並處理數據的腳本等。
4) scripts目錄下則是網絡模型訓練和推理運行時候的一些執行命令,整合到sh文件中,方面直接執行,如:訓練執行命令可以參考如下方式:
python train.py \ --data_dir=./dataset/coco2014 \ --pretrained_backbone=darknet53_backbone.ckpt \ --is_distributed=0 \ --lr=0.001 \ --loss_scale=1024 \ --weight_decay=0.016 \ --T_max=320 \ --max_epoch=320 \ --warmup_epochs=4 \ --training_shape=416 \ --lr_scheduler=cosine_annealing > log.txt 2>&1 &
3、模型推理
yolov3_darknet53網絡可以對批量數據進行推理,這里有一點需要注意,推理的數據和訓練的數據要分開,它們之間不要有相同的數據,否則影響到最后的推理精度。
在做模型推理時,有兩個參數對最后的結果影響比較大:
1) ignore_threshold:這個參數是設置最后推理結果的置信度,比如,最后對目標檢測出的目標置信度有大有小,置信度越大,說明推理的結果正確的概率越大,反之,則結果正確的概率越小。這時可以設置改置信度的大小,將小於該置信度的目標剔除,這對最后的結果展示效果會有較好幫助。
2) nms_thresh:該參數是設置檢測的目標框的重合度,當兩個框的重合度大於該參數時,則認為這兩個目標是同一個目標,只顯示一個框,反之,當兩個框的重合度小於該參數時,則兩個框都保留。 以上兩個參數的設置需要一些現場的經驗,根據現場實際情況進行調整。
五、總結與擴展
yolov3相比yolov2加深了網絡,並采用了3中尺度進行檢測,引入了更多的anchor,速度雖然有所下降,但是提升了精度,對檢測小目標來說,效果要更好。
yolov3可廣泛應用在圖像分類、圖像檢測等方面,如人員戴口罩檢測、特殊區域安全帽佩戴檢測等。總之,通過深度學習算法這種AI技術已深入到生活各個方面,減少人工的干預,提高人員的安全性,給生活帶來很大便利等。感興趣的童鞋盡快動手試試吧。
