赛事背景
疫情给人们带来的影响体现在衣食住行的方方面面。在疫情防控中,需要减少非必要的聚集性活动,减少参加聚集性活动的人员。对于个人而言,尽量不前往人员聚集场所尤其是密闭式场所。
在本次比赛中我们需要参赛选手开发算法模型,对图中的人数进行识别。为了简化赛题难度我们只需要选手识别出人数即可,不需要预测行人位置。
比赛链接:https://challenge.xfyun.cn/topic/info?type=people-gather&option=ssgy
baseline链接:https://github.com/datawhalechina/competition-baseline/tree/master/competition/%E7%A7%91%E5%A4%A7%E8%AE%AF%E9%A3%9EAI%E5%BC%80%E5%8F%91%E8%80%85%E5%A4%A7%E8%B5%9B2022
赛事任务
对输入的图片进行识别,给出图片中包含多少个人。选手需要根据训练集构建模型对测试集的图片进行预测,按照测试集精度进行排名。
评审规则
赛题数据由训练集和测试集组成,需要选手对测试集进行预测。训练集给出了近1000张图片及图片上人数标签。
本次竞赛的评价标准采用回归任务指标,最高分为0。
基础思路
赛题是一个典型的回归任务,因此可以使用简单的CNN来完成回归训练。
步骤1:读取数据集
这里为了增加模型的稳定性,我们将标签进行了简单的缩放处理。
train_df = pd.read_csv('./input/人员聚集识别挑战赛数据集/train_label.csv')
train_df['path'] = './input/人员聚集识别挑战赛数据集/train/' + train_df['name']
train_df['count'] /= 100
步骤2:定义回归模型
定义CNN模型,这里使用预训练模型完成数值输出就可以。选手可以自行选择模型。
class XunFeiNet(nn.Module):
def __init__(self):
super(XunFeiNet, self).__init__()
model = models.resnet18(True)
model.avgpool = nn.AdaptiveAvgPool2d(1)
model.fc = nn.Linear(512, 1)
self.resnet = model
def forward(self, img):
out = self.resnet(img)
return out
步骤3:训练与验证
def train(train_loader, model, criterion, optimizer):
model.train()
train_loss = 0.0
for i, (input, target) in enumerate(train_loader):
input = input.cuda(non_blocking=True)
target = target.cuda(non_blocking=True)
# compute output
output = model(input)
loss = criterion(output[:, 0], target)
# compute gradient and do SGD step
optimizer.zero_grad()
loss.backward()
optimizer.step()
if i % 40 == 0:
print(loss.item())
train_loss += loss.item()
def validate(val_loader, model, criterion):
model.eval()
val_acc = 0.0
with torch.no_grad():
end = time.time()
for i, (input, target) in enumerate(val_loader):
input = input.cuda()
target = target.cuda()
# compute output
output = model(input)
loss = criterion(output, target)
val_acc += (output[:, 0] - target).abs().sum().item()
步骤4:测试集预测
test_loader = torch.utils.data.DataLoader(
XunFeiDataset(test_df['path'].values, [0] * test_df.shape[0],
A.Compose([
A.Resize(300, 300),
A.HorizontalFlip(p=0.5),
A.RandomContrast(p=0.5),
])
), batch_size=10, shuffle=False, num_workers=1, pin_memory=False
)
pred = None
for _ in range(5):
if pred is None:
pred = predict(test_loader, model, criterion)
else:
pred += predict(test_loader, model, criterion)
# 竞赛交流群 邀请函 #
添加Coggle小助手微信(ID : coggle666)
私聊小助手领取文章原始代码
每天Kaggle算法竞赛、干货资讯汇总
与 24000+来自竞赛爱好者一起交流~
文章转载自Coggle数据科学,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。