文章目录
1运行机器
显卡:2080ti×1
系统:ubuntu 20.04
cpu:Intel® Core™ i7-10700KF CPU @ 3.80GHz
2前期准备
1安装显卡驱动
2安装cuda
3安装cudnn
4安装vscode
5安装anaconda
6安装git
3下载数据
https://tianchi.aliyun.com/competition/entrance/531795/information
1这里数据麾下在一个csv文件,里面是下载地址
file,size,link
mchar_train.zip,345.91MB,http://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531795/mchar_train.zip
mchar_train.json,3.16MB,http://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531795/mchar_train.json
mchar_val.zip,200.16MB,http://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531795/mchar_val.zip
mchar_val.json,1.03MB,http://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531795/mchar_val.json
mchar_test_a.zip,370.6MB,http://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531795/mchar_test_a.zip
mchar_sample_submit_A.csv,507.83KB,http://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531795/mchar_sample_submit_A.csv
2利用python将文件下载
import pandas as pd
import os
from urllib.request import urlretrieve
class download(object):
def __init__(self):
super(download, self).__init__()
def start(self):
root=os.getcwd()
data=pd.read_csv(root+"/steet_character_detector/data/mchar_data_list_0515.csv")
for i in range(data.shape[0]):
url=data.iloc[i,2]
print(url)
local=url.split("/")[-1]
local=root+"/steet_character_detector/data/"+local
try:
urlretrieve(url, local,self.callbackfunc) #
except Exception as e:
print ("Exception")
def callbackfunc(self,blocknum, blocksize, totalsize):
'''回调函数
@blocknum: 已经下载的数据块
@blocksize: 数据块的大小
@totalsize: 远程文件的大小
'''
print ("blocknum ",blocknum,"blocksize ",blocksize,"totalsize ",totalsize)
percent = 100.0 * blocknum * blocksize / totalsize
if percent > 100:
percent = 100
print ("%.2f%%" % percent," ",blocknum *blocksize," ",totalsize)
root=os.getcwd()
data=pd.read_csv(root+"/steet_character_detector/data/mchar_data_list_0515.csv")
print(data.head())
if __name__ == '__main__':
d = download()
d.start()
4环境搭建
1anaconda新建环境
conda create -n street_yolov5 python=3.8
conda activate street_yolov5
2下载yolov5
git clone https://github.com/ultralytics/yolov5
3根据requirement.txt安装python包
pip install -requirement.txt
5处理数据
这里要处理数据满足yolov5训练的条件
5.1教程训练coco128(可跳过)
可以先尝试一下yolov5教程中的coco128训练,这是选取了coco数据集中的前128张图像
在程序里
python train.py --img 320 --batch 16 --epochs 3 --data coco128.yaml --weights yolov5s.pt --cache
训练完后 先查看coco128.yaml,这里要改数据集的位置和nc识别类的数量,names类中的名字
训练中的参数可以看tutorial.ipynb
最后训练的权重文件保存在
Results saved to runs/train/exp3
这里可以发现数据集都是两个文件一个文件放图片,一个文件放txt文件,包括定位框和标签
5.2创建yaml文件
直接对着coco128进行修改
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ./datasets/tianchi # dataset root dir
train: images/train # train images (relative to 'path') 128 images
val: images/val # val images (relative to 'path') 128 images
test: # test images (optional)
# Classes
nc: 10 # number of classes
names: ['0','1','2','3','4','5','6','7','8','9'] # class names
5.3 查看coco128label格式(可跳过)
5.4数据集创建
cd code/yolov5/
创建train文件夹
mkdir datasets/tianchi
mkdir datasets/tianchi/images/
创建label文件夹
mkdir datasets/tianchi/labels/
mkdir datasets/tianchi/labels/train
mkdir datasets/tianchi/labels/val
将图片数据考入文件夹中
cp -r ../../data/mchar_test_a/mchar_test_a/ datasets/tianchi/images/
cp -r ../../data/mchar_train/mchar_train/ datasets/tianchi/images/train
cp -r ../../data/mchar_val/mchar_val/ datasets/tianchi/images/val
5.5数据集处理并训练
处理tianchi街景字符编码识别数据集为yolov5格式数据集并训练
6 test数据的测试
先试验一张的效果
python detect.py --weights runs/train/exp6/weights/best.pt --img 320 --conf 0.25 --source datasets/tianchi/images/test/000000.png
将所有的test图像都进行测试,并输出结果文本
python detect.py --weights runs/train/exp6/weights/best.pt --img 320 --conf 0.25 --source datasets/tianchi/images/test/ --save-txt
输出结果进行提交
import pandas as pd
import glob
import os
def takeSecond(elem):
return elem[1]
label_path=glob.glob('runs/detect/exp8/labels/*.txt')
label_path.sort()
df_submit = pd.read_csv('../../data/mchar_sample_submit_A.csv')
df_submit.set_index('file_name')
for x in label_path:
text=open(x,'r')
result_list=[]
for line in text.readlines():
result_list.append((line.split(' ')[0],line.split(' ')[1]))
result_list.sort(key=takeSecond)
result=''
for j in result_list:
result+=j[0]
label_path=x.split('/')[-1].split('.')[0]+'.png'
df_submit.loc[df_submit.file_name==label_path,'file_code']=result
text.close()
df_submit.to_csv('submit.csv', index=None)
准确率92%,还没出排名,看了一下大概长期赛50多名