? ? ? ? ?首先,我用的工程文件是https://github.com/dBeker/Faster-RCNN-TensorFlow-Python3.5里的windows下的代碼。這個(gè)代碼在windows我已經(jīng)調(diào)通過。過程中也是遇到windows下安裝pycocotools的難題,需要去下載一個(gè)windows下的安裝文件去安裝,我參考了 CSDN博主 行勝于言的博客:?windows 安裝 pycocotools 方法(windows10編譯 Pycocotools出錯(cuò)解決方案最新)
#####################################################################################################
下面這兩個(gè)鏈接里面是支持windows的
Clone of COCO API - Dataset @ http://cocodataset.org/ - with changes to support Windows build and python3
下面這個(gè)是原版鏈接 (在windows上安裝會出問題,在linux下應(yīng)該不會。我沒在linux下試過用這個(gè)安裝,因?yàn)槲颐菜浦苯訁⒖计渌鸆SND博客用pip3或者是apt等方法給安裝好了?)
COCO API - Dataset @ http://cocodataset.org/
之前的一種解決方案
windows10編譯 Pycocotools出錯(cuò)解決方案(不可取哦)
#####################################################################################################
好了下面進(jìn)入正題
【Linux_Faster_RCNN_TensorFlow_Python3_5_master 心路歷程(踩坑筆記)】
遇到的主要大問題如下:
-
一、【cython_bbox.cpython-35m-x86_64-linux-gnu.so和cython_bbox.so文件。導(dǎo)致程序運(yùn)行過程中找不到bbox。】
問題原因: windows下,用的是cython_bbox.cp35-win_amd64.pyd文件,而linux下需要重新make一下。
解決辦法: 這個(gè)需要在linux下,準(zhǔn)備好make文件放進(jìn)lib文件夾,在lib路徑make一下。具體步驟參見博客園 靜心得文章Faster-RCNN-TensorFlow-Python3.5 在Ubuntu16.04下的配置方法。
? ? ? ? 其中我還遇到了meke出錯(cuò)的問題,開始是說文件修改時(shí)間和linux系統(tǒng)時(shí)間不一致,這個(gè)用linux命令將linux時(shí)間給更新到最新的當(dāng)前時(shí)間就好。但是還是沒有解決,我索性直接搜到了好心人在網(wǎng)上的編譯好的cython_bbox.cpython-35m-x86_64-linux-gnu.so文件,拷貝進(jìn)了utils文件夾里參見基于tensorflow+python3.5環(huán)境實(shí)現(xiàn)Faster R-CNN 下載cython_bbox.cpython-35m-x86_64-linux-gnu.so? ? ? 后來我的make又好了,用ls發(fā)現(xiàn)自己也make好了一份,只不過直接在文件夾下看不到,需要用ls命令列出來,才能看到這個(gè)編譯中的文件——后綴名.so文件。
? ? ? ?總之,一般make好了,就會生成好cython_bbox.cpython-35m-x86_64-linux-gnu.so和cython_bbox.so文件,之后程序再去運(yùn)行就不會報(bào)沒有bbox的問題啦!
? ? ? ?如果還是有各種問題,那就還是要求助BING,谷歌,CSDN,stackoverflow等等網(wǎng)站了。。。
? ? ? ?博客園 靜心的文章,我也搬了過來,以做備份,內(nèi)容如下:
Faster-RCNN-TensorFlow-Python3.5 在Ubuntu16.04下的配置方法
目錄
- Faster-RCNN-TensorFlow-Python3.5 在Ubuntu16.04下的配置方法
- 安裝過程
- 1. 深度學(xué)習(xí)環(huán)境Tensorflow的安裝
- 2. 安裝python包
- 3. ?Go to ./data/coco/PythonAPI
- 4. git clone
- 5. 下載預(yù)訓(xùn)練模型
- 6. 自己數(shù)據(jù)集的制作
- 7. 替換成自己的數(shù)據(jù)
- 11. 開始訓(xùn)練
- 12. 跑demo.py
Faster-RCNN-TensorFlow-Python3.5 在Ubuntu16.04下的配置方法
安裝過程
1. 深度學(xué)習(xí)環(huán)境Tensorflow的安裝
參考這一篇博客:https://www.cnblogs.com/pprp/p/9463974.html
2. 安裝python包
cython, python-opencv, easydict,numpy
pip install Cython pip install opencv-python pip install matplotlib
opencv 的包下載安裝,安裝教程
ImportError: No module named 'PIL'
- solution:
easy_install PIL
?&?pip install image
ImportError: No module named 'scipy'
solution:
pip install numpy pip install scipy
ImportError: No module named 'lib.utils.cython_bbox'
git clone --recursive https://github.com/rbgirshick/fast-rcnn.git cd $FRCN_ROOT/lib make cp fast-rcnn/lib/utils/cython_bbox.cpython-35m-x86_64-linux-gnu.so Faster-RCNN-TensorFlow-Python3.5/lib/utils/
?
3. ?Go to ./data/coco/PythonAPI
? Run?
python setup.py build_ext --inplace
? Run?
python setup.py build_ext install
4. git clone
用git命令將這個(gè)庫下載到本地?Faster-RCNN-TensorFlow-Python3.5
git clone https://github.com/dBeker/Faster-RCNN-TensorFlow-Python3.5.git # 將cython_bbox.cpython-36m-x86_64-linux-gnu.so下載下來 wget https://github.com/pprp/DL/blob/master/cython_bbox.cpython-36m-x86_64-linux-gnu.so
把Faster-RCNN_TF 中的cython_bbox.xxx.so 復(fù)制到 lib/utils
cp cython_bbox.cpython-36m-x86_64-linux-gnu.so Faster-RCNN-TensorFlow-Python3.5/lib/utils
5. 下載預(yù)訓(xùn)練模型
Download pre-trained VGG16 from?here?and place it as "data\imagenet_weights\vgg16.ckpt"
wget http://download.tensorflow.org/models/vgg_16_2016_08_28.tar.gz unzip vgg* #重命名為vgg16.ckpt cp vgg* vgg16.ckpt #放到以下位置 mv vgg16.ckpt data\imagenet_weights\vgg16.ckpt
6. 自己數(shù)據(jù)集的制作
xml文件的制作需要labelImg軟件的幫助,這里提供在window下的exe包,打開即可使用
wget https://github.com/pprp/DL/blob/master/LabelIMG.zip
- 使用方法:
Ctrl + u 加載目錄中的所有圖像,鼠標(biāo)點(diǎn)擊Open dir同功能 Ctrl + r 更改默認(rèn)注釋目標(biāo)目錄(xml文件保存的地址) Ctrl + s 保存 Ctrl + d 復(fù)制當(dāng)前標(biāo)簽和矩形框 space 將當(dāng)前圖像標(biāo)記為已驗(yàn)證 w 創(chuàng)建一個(gè)矩形框 d 下一張圖片 a 上一張圖片 del 刪除選定的矩形框 Ctrl++ 放大 Ctrl-- 縮小 ↑→↓← 鍵盤箭頭移動選定的矩形框
數(shù)據(jù)的放置結(jié)構(gòu)(自己手動建立)
-data - VOCdevkit2007 - VOC2007 - Annotations (標(biāo)簽XML文件,用對應(yīng)的圖片處理工具人工生成的) - ImageSets (生成的方法是用sh或者M(jìn)ATLAB語言生成) - Main - test.txt - trian.txt - trainval.txt - val.txt - JPEGImages(原始文件)
Main中的四個(gè)txt文件的制作
詳見附件二,注意要修改路徑位置,最好是絕對路徑
xmlfilepath = 'Annotations' txtsavepath = 'ImageSets\Main'
7. 替換成自己的數(shù)據(jù)
將制作好的數(shù)據(jù)按照以上的目錄結(jié)構(gòu)進(jìn)行放置
用你的Annotations,ImagesSets和JPEGImages替換…\Faster-RCNN-TensorFlow-Python3.5\data\VOCdevkit2007\VOC2007中對應(yīng)文件夾
8. 將原始代碼修改為適配你自己的代碼
Pascal_VOC.py,修改自己的標(biāo)注的類別
self._classes = ('__background__', # always index 0 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor')
將這些類別替換成你自己的類別。
self.__classes=('__background__', '你的標(biāo)簽1','你的標(biāo)簽2',你的標(biāo)簽3','你的標(biāo)簽4')
demo.py, 修改為自己的標(biāo)注類別
CLASSES = ('__background__', 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor')
更改為:
CLASSES = ('__background__', '你的標(biāo)簽1','你的標(biāo)簽2',你的標(biāo)簽3','你的標(biāo)簽4')
demo.py 更改另外一處代碼:
net.create_architecture(sess, "TEST", 21,tag='default', anchor_scales=[8, 16, 32])
更改為:
net.create_architecture(sess, "TEST", 5,tag='default', anchor_scales=[8, 16, 32])
原本的代碼是有20類物體+背景,所以是21。 把類別數(shù)改為,你的類別+背景。如果是只檢測一類物體,那就改為2
9. 出現(xiàn)的問題
可能出現(xiàn)以下報(bào)錯(cuò):
m = cv2.imread(roidb[i][‘image’]) KeyError
解決:
將Faster-RCNN-TensorFlow-Python3.5-master\data\cache文件夾中之前生成的文件模型刪除。
因?yàn)闀约鹤x取cache中的文本,導(dǎo)致訓(xùn)練出現(xiàn)錯(cuò)誤。
10. 作出的其他調(diào)整
具體方案如下:
將demo.py中main函數(shù)中進(jìn)行如下修改:
# ----------------------- # demonet = args.demo_net # dataset = args.dataset # ----------------------- demonet = 'vgg16' dataset = 'pascal_voc' # -----------------------
demo.py中main函數(shù)中將im_names中的內(nèi)容替換成自己的測試圖片
im_names = ['IMG_1.jpg', 'IMG_40.jpg', 'IMG_23.jpg', 'IMG_127.jpg', 'IMG_134.jpg', 'IMG_185.jpg']
然后將Faster-RCNN-TensorFlow-Python3.5/data/demo中替換上相應(yīng)的圖片
將NETS,DATASETS進(jìn)行如下修改
NETS = {'vgg16': ('vgg16.ckpt',)}
DATASETS = {'pascal_voc': ('voc_2007_trainval',)}
可以運(yùn)行了python demo.py
11. 開始訓(xùn)練
python train.py
12. 跑demo.py
#如果可以直接跑,就直接跑 python demo.py
如果不能運(yùn)行demo.py,則進(jìn)行以下處理:
找到通過訓(xùn)練得到的訓(xùn)練結(jié)果:路徑為:/Faster-RCNN-TensorFlow-Python3.5/default/voc_2007_trainval/default內(nèi)容如下:
checkpoint vgg16.ckpt.data-00000-of-00001 vgg16.ckpt.index vgg16.ckpt.meta vgg16_faster_rcnn_iter_10000.ckpt.data-00000-of-00001 vgg16_faster_rcnn_iter_10000.ckpt.index vgg16_faster_rcnn_iter_10000.ckpt.meta vgg16_faster_rcnn_iter_10000.pkl vgg16_faster_rcnn_iter_15000.ckpt.data-00000-of-00001 vgg16_faster_rcnn_iter_15000.ckpt.index vgg16_faster_rcnn_iter_15000.ckpt.meta vgg16_faster_rcnn_iter_15000.pkl vgg16_faster_rcnn_iter_20000.ckpt.data-00000-of-00001 vgg16_faster_rcnn_iter_20000.ckpt.index vgg16_faster_rcnn_iter_20000.ckpt.meta vgg16_faster_rcnn_iter_20000.pkl vgg16_faster_rcnn_iter_25000.ckpt.data-00000-of-00001 vgg16_faster_rcnn_iter_25000.ckpt.index vgg16_faster_rcnn_iter_25000.ckpt.meta vgg16_faster_rcnn_iter_25000.pkl vgg16_faster_rcnn_iter_30000.ckpt.data-00000-of-00001 vgg16_faster_rcnn_iter_30000.ckpt.index vgg16_faster_rcnn_iter_30000.ckpt.meta vgg16_faster_rcnn_iter_30000.pkl vgg16_faster_rcnn_iter_35000.ckpt.data-00000-of-00001 vgg16_faster_rcnn_iter_35000.ckpt.index vgg16_faster_rcnn_iter_35000.ckpt.meta vgg16_faster_rcnn_iter_35000.pkl vgg16_faster_rcnn_iter_40000.ckpt.data-00000-of-00001 vgg16_faster_rcnn_iter_40000.ckpt.index vgg16_faster_rcnn_iter_40000.ckpt.meta vgg16_faster_rcnn_iter_40000.pkl vgg16_faster_rcnn_iter_5000.ckpt.data-00000-of-00001 vgg16_faster_rcnn_iter_5000.ckpt.index vgg16_faster_rcnn_iter_5000.ckpt.meta vgg16_faster_rcnn_iter_5000.pkl vgg16.pkl
將其中的
vgg16_faster_rcnn_iter_40000.ckpt.data-00000-of-00001 vgg16_faster_rcnn_iter_40000.ckpt.index vgg16_faster_rcnn_iter_40000.ckpt.meta vgg16_faster_rcnn_iter_40000.pkl
文件復(fù)制到以下路徑
/Faster-RCNN-TensorFlow-Python3.5/output/vgg16/voc_2007_trainval/default/
并重命名為:vgg16.ckpt.data-00000-of-00001 vgg16.ckpt.index vgg16.ckpt.meta vgg16.pkl
修改完成,再次運(yùn)行
python demo.py
附件代碼:
下面是適用于我本地環(huán)境的MATLAB代碼
%注意修改下面四個(gè)值 xmlfilepath='/home/pprp/github/Faster-RCNN-TensorFlow-Python3.5/data/VOC2007/Annotations'; txtsavepath='/home/pprp/github/Faster-RCNN-TensorFlow-Python3.5/data/VOC2007/ImageSets/Main'; trainval_percent=0.5; #trainval占整個(gè)數(shù)據(jù)集的百分比,剩下部分就是test所占百分比 train_percent=0.5; #train占trainval的百分比,剩下部分就是val所占百分比 xmlfile=dir(xmlfilepath); numOfxml=length(xmlfile)-2;#減去.和.. 總的數(shù)據(jù)集大小 trainval=sort(randperm(numOfxml,floor(numOfxml*trainval_percent))); test=sort(setdiff(1:numOfxml,trainval)); trainvalsize=length(trainval); #trainval的大小 train=sort(trainval(randperm(trainvalsize,floor(trainvalsize*train_percent)))); val=sort(setdiff(trainval,train)); ftrainval=fopen([txtsavepath 'trainval.txt'],'w'); ftest=fopen([txtsavepath 'test.txt'],'w'); ftrain=fopen([txtsavepath 'train.txt'],'w'); fval=fopen([txtsavepath 'val.txt'],'w'); for i=1:numOfxml if ismember(i,trainval) fprintf(ftrainval,'%s\n',xmlfile(i+2).name(1:end-4)); if ismember(i,train) fprintf(ftrain,'%s\n',xmlfile(i+2).name(1:end-4)); else fprintf(fval,'%s\n',xmlfile(i+2).name(1:end-4)); end else fprintf(ftest,'%s\n',xmlfile(i+2).name(1:end-4)); end end fclose(ftrainval); fclose(ftrain); fclose(fval); fclose(ftest);
Python代碼:
import os import random trainval_percent = 0.66 train_percent = 0.5 xmlfilepath = 'Annotations' txtsavepath = 'ImageSets\Main' total_xml = os.listdir(xmlfilepath) num=len(total_xml) list=range(num) tv=int(num*trainval_percent) tr=int(tv*train_percent) trainval= random.sample(list,tv) train=random.sample(trainval,tr) ftrainval = open('ImageSets/Main/trainval.txt', 'w') ftest = open('ImageSets/Main/test.txt', 'w') ftrain = open('ImageSets/Main/train.txt', 'w') fval = open('ImageSets/Main/val.txt', 'w') for i in list: name=total_xml[i][:-4]+'\n' if i in trainval: ftrainval.write(name) if i in train: ftrain.write(name) else: fval.write(name) else: ftest.write(name) ftrainval.close() ftrain.close() fval.close() ftest .close()
批量修改圖片名稱,以及XML名稱:
import os import glob import shutil # 目錄名稱,你要自己修改 _dir = "H:/mypic/" file_name = os.listdir(_dir) print(file_name) n=1 for file in file_name: pic_name = os.listdir(_dir+file) #print(pic_name) for pic in pic_name: if os.path.isdir(_dir+file+'/'+pic): xml_name=os.listdir(_dir+file+"/"+pic) for xml in xml_name: shutil.copy( _dir+file+'/'+pic+"/"+xml, 'G:/data/VOCdevkit2007/VOC2007/Annotations/') # print(pic) #修改個(gè)別XML名稱 # if xml == '1000010.xml': #print(dir + file + '/' + pic) # os.rename(_dir+file + '/' + pic + '/' + xml, _dir + file + '/' + pic + "/" + "100010.xml") # oldname = _dir+file+'/'+pic+"/"+xml # newname = _dir+file+'/'+pic+"/"+ str(n).zfill(6) + ".xml" #os.rename(oldname, newname) #n = n + 1 # print(oldname, '--->', newname) # zfill是一個(gè)自動補(bǔ)零的函數(shù) 6 就是一共六位 不足的補(bǔ)零 只有字符串才有這個(gè)函數(shù) 所以轉(zhuǎn)換了 # newname = _dir+str(xml_name.index(xml)+1).zfill(6)+".xml" """ #批量修改圖片的名稱 n=1 for file in file_name: pic_name = os.listdir(_dir+file) print(pic_name) for pic in pic_name: oldname = _dir+file+"/"+pic newname = _dir+file+"/" + str(n).zfill(6) + ".jpg" os.rename(oldname, newname) n = n + 1 print(oldname, '--->', newname) # zfill是一個(gè)自動補(bǔ)零的函數(shù) 6 就是一共六位 不足的補(bǔ)零 只有字符串才有這個(gè)函數(shù) 所以轉(zhuǎn)換了 # newname = _dir+str(xml_name.index(xml)+1).zfill(6)+".xml" """
修改對應(yīng)xml文件
import os import re _dir = "G:/Annotations/" xmlList = os.listdir(_dir) n = 1 for xml in xmlList: #f = open(_dir + xml, "r") f = open(_dir + xml, "r", encoding='utf-8') xmldata = f.read() xmldata = re.sub('\
(.*?)\ ', 'G:/data/VOCdevkit2007/VOC2007/JPEGImages/' + str(n).zfill(6) + '.jpg ', xmldata) f.close() f = open(_dir + xml, "w") f.write(xmldata) f.close() n += 1pascal_voc.py的一些解讀
def init(self, image_set, year,devkit_path=None) /*這個(gè)是初始化函數(shù),它對應(yīng)著的是pascal_voc的數(shù)據(jù)集訪問格式,其實(shí)我們將其接口修改的更簡單一點(diǎn)*/ def image_path_at(self, i) /*根據(jù)第i個(gè)圖像樣本返回其對應(yīng)的path,其調(diào)用了image_path_from_index(self, index)作為其具體實(shí)現(xiàn)*/ def image_path_from_index(self, index) //實(shí)現(xiàn)了 image_path的具體功能 def _load_image_set_index(self) //加載了樣本的list文件 def _get_default_path(self) //獲得數(shù)據(jù)集地址 def gt_roidb(self) //讀取并返回ground_truth(真實(shí)值,設(shè)定的一個(gè)正確的基準(zhǔn))的db def selective_search_roidb //讀取并返回ROI的db def _load_selective_search_roidb(self, gt_roidb) //加載預(yù)選框的文件 def selective_search_IJCV_roidb(self) //在這里調(diào)用讀取Ground_truth和ROI db并將db合并 def _load_selective_search_IJCV_roidb(self, gt_roidb) //這里是專門讀取作者在IJCV上用的dataset def _load_pascal_annotation(self, index) //這個(gè)函數(shù)是讀取gt的具體實(shí)現(xiàn) def _write_voc_results_file(self, all_boxes) //voc的檢測結(jié)果寫入到文件 def _do_matlab_eval(self, comp_id, output_dir='output') //根據(jù)matlab的evluation接口來做結(jié)果的分析 def evaluate_detections //其調(diào)用了_do_matlab_eval def competition_mode //設(shè)置competitoin_mode,加了一些噪點(diǎn)
reference
https://blog.csdn.net/jcli1_14/article/details/81458847
https://blog.csdn.net/hzhj2007/article/details/79399587
代碼改變世界
二、【UnrecognizedFlagError:Unknown command line flag 'f'】
這是在jupyter上運(yùn)行faster-rcnn遇到的錯(cuò)誤...在window上的pycharm下是不會報(bào)這個(gè)錯(cuò)的。由于我用的是超算服務(wù)器節(jié)點(diǎn)(有TeslaK40顯卡,不算很好,不過還湊合了)的linux,上面就只能用jupyter來運(yùn)行或者在命令行運(yùn)行。據(jù)查是jupyter不支持這樣用沒定義的flag???我在程序開頭寫了flag定義(FLAGS = tf.app.flags.FLAGS),也不行。
問題原因: 用到了ims_per_batch這個(gè)字符串,卻沒有在config.py中的FLAG里去定義它。
解決辦法: 在此程序開頭寫
tf.app.flags.DEFINE_string('f', '', 'ims_per_batch')
?
三、【AssertionError: Path does not exist: /WANGZAI/Faster_RCNN_TensorFlow_Python3_5_master/data/VOCdevkit2007/VOC2007/ImageSets/Main/trainval.txt 】
我用find -name?trainval.txt找到了這個(gè)路徑下是有的,但就是會報(bào)路徑不存在這個(gè)斷言,于是細(xì)心的再對一遍路徑發(fā)現(xiàn):我的文件夾名寫錯(cuò)了一個(gè),VOCdevkit2007寫成了VOCDevkit2007。實(shí)在無語,這個(gè)是我在windows上弄好的,沒問題不會報(bào)錯(cuò)的,到了linux+jupyter就報(bào)錯(cuò)。
解決辦法: 修改VOCDevkit2007為VOCdevkit2007即可。
?
最后總結(jié)一些Faster-RCNN訓(xùn)練過程中需要用到的參考網(wǎng)址,可能不全。
faster r-cnn(準(zhǔn)備階段)(RPN、Anchor、感受野、region proposal)
python3+Tensorflow+Faster R-CNN訓(xùn)練自己的數(shù)據(jù)
詳細(xì)的Faster R-CNN源碼解析之RPN源碼解析
Linux TensorFlow implementation of Faster R-CNN
博客園首頁新隨筆聯(lián)系訂閱管理 隨筆 - 305 文章 - 0 評論 - 12 Faster-RCNN-TensorFlow-Python3.5 在Ubuntu16.04下的配置方法
基于深度學(xué)習(xí)的目標(biāo)檢測技術(shù)演進(jìn):R-CNN、Fast R-CNN、Faster R-CNN
實(shí)例分割模型Mask R-CNN詳解:從R-CNN,F(xiàn)ast R-CNN,F(xiàn)aster R-CNN再到Mask R-CNN
基于tensorflow+python3.5環(huán)境實(shí)現(xiàn)Faster R-CNN 下載cython_bbox.cpython-35m-x86_64-linux-gnu.so
faster-rcnn tensorflow windows demo測試
faster-rcnn tensorflow windows demo運(yùn)行
Windows 下 TensorFlow 和 Faster rcnn 詳細(xì)安裝步驟(二)
dBeker Tensorflow Faster R-CNN for Windows by using Python 3.5
windows 安裝 pycocotools 方法(windows10編譯 Pycocotools出錯(cuò)解決方案最新)
Faster R-CNN / Mask R-CNN on COCO
?
2018-11-10
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
